ZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmEuY3BwIGIvY2FtZXJhL0NhbWVyYS5jcHAKaW5kZXggMzBlZTdjNC4uN2VmYzZkNyAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYS5jcHAKQEAgLTkxLDE2ICs5MSwzNSBAQAogCiBDYW1lcmE6On5DYW1lcmEoKQogewotICAgIGRpc2Nvbm5lY3QoKTsKKyAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGNhbGwgZGlzY29ubmVjdCgpIGhlcmUgYmVjYXVzZSBpZiB0aGUgQ2FtZXJhU2VydmljZQorICAgIC8vIHRoaW5rcyB3ZSBhcmUgdGhlIG93bmVyIG9mIHRoZSBoYXJkd2FyZSwgaXQgd2lsbCBob2xkIGEgKHN0cm9uZykKKyAgICAvLyByZWZlcmVuY2UgdG8gdXMsIGFuZCB3ZSBjYW4ndCBwb3NzaWJseSBiZSBoZXJlLiBXZSBhbHNvIGRvbid0IHdhbnQgdG8KKyAgICAvLyBjYWxsIGRpc2Nvbm5lY3QoKSBoZXJlIGlmIHdlIGFyZSBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIG1lZGlhc2VydmVyLAorICAgIC8vIGJlY2F1c2Ugd2UgbWF5IGJlIGludm9rZWQgYnkgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpjb25uZWN0KCkgYW5kIHdpbGwKKyAgICAvLyBkZWFkbG9jayBpZiB3ZSBjYWxsIGFueSBtZXRob2Qgb2YgSUNhbWVyYSBoZXJlLgogfQogCi1zcDxDYW1lcmE+IENhbWVyYTo6Y29ubmVjdCgpCitpbnQzMl90IENhbWVyYTo6Z2V0TnVtYmVyT2ZDYW1lcmFzKCkKK3sKKyAgICBjb25zdCBzcDxJQ2FtZXJhU2VydmljZT4mIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gY3MtPmdldE51bWJlck9mQ2FtZXJhcygpOworfQorCitzdGF0dXNfdCBDYW1lcmE6OmdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSB7CisgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gMCkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIGNzLT5nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCBjYW1lcmFJbmZvKTsKK30KKworc3A8Q2FtZXJhPiBDYW1lcmE6OmNvbm5lY3QoaW50IGNhbWVyYUlkKQogewogICAgIExPR1YoImNvbm5lY3QiKTsKICAgICBzcDxDYW1lcmE+IGMgPSBuZXcgQ2FtZXJhKCk7CiAgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2U+JiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKICAgICBpZiAoY3MgIT0gMCkgewotICAgICAgICBjLT5tQ2FtZXJhID0gY3MtPmNvbm5lY3QoYyk7CisgICAgICAgIGMtPm1DYW1lcmEgPSBjcy0+Y29ubmVjdChjLCBjYW1lcmFJZCk7CiAgICAgfQogICAgIGlmIChjLT5tQ2FtZXJhICE9IDApIHsKICAgICAgICAgYy0+bUNhbWVyYS0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgoYyk7CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKaW5kZXggNjVmZDdhYy4uMzYyZDllZSAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcApAQCAtMzAsNiArMzAsOCBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRk9STUFUU1tdID0gInByZXZpZXctZm9ybWF0LXZhbHVlcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9QUkVWSUVXX0ZSQU1FX1JBVEVbXSA9ICJwcmV2aWV3LWZyYW1lLXJhdGUiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlJBTUVfUkFURVNbXSA9ICJwcmV2aWV3LWZyYW1lLXJhdGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BSRVZJRVdfRlBTX1JBTkdFW10gPSAicHJldmlldy1mcHMtcmFuZ2UiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlBTX1JBTkdFW10gPSAicHJldmlldy1mcHMtcmFuZ2UtdmFsdWVzIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BJQ1RVUkVfU0laRVtdID0gInBpY3R1cmUtc2l6ZSI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFU1tdID0gInBpY3R1cmUtc2l6ZS12YWx1ZXMiOwogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUElDVFVSRV9GT1JNQVRbXSA9ICJwaWN0dXJlLWZvcm1hdCI7CkBAIC02OSw4ICs3MSwxMSBAQAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfWk9PTV9SQVRJT1NbXSA9ICJ6b29tLXJhdGlvcyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9aT09NX1NVUFBPUlRFRFtdID0gInpvb20tc3VwcG9ydGVkIjsKIGNvbnN0IGNoYXIgQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NNT09USF9aT09NX1NVUFBPUlRFRFtdID0gInNtb290aC16b29tLXN1cHBvcnRlZCI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19ESVNUQU5DRVNbXSA9ICJmb2N1cy1kaXN0YW5jZXMiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVklERU9fRlJBTUVfRk9STUFUW10gPSAidmlkZW8tZnJhbWUtZm9ybWF0IjsKIAogY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFW10gPSAidHJ1ZSI7Citjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX0RJU1RBTkNFX0lORklOSVRZW10gPSAiSW5maW5pdHkiOwogCiAvLyBWYWx1ZXMgZm9yIHdoaXRlIGJhbGFuY2Ugc2V0dGluZ3MuCiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OldISVRFX0JBTEFOQ0VfQVVUT1tdID0gImF1dG8iOwpAQCAtMTM3LDYgKzE0Miw3IEBACiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfTUFDUk9bXSA9ICJtYWNybyI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfRklYRURbXSA9ICJmaXhlZCI7CiBjb25zdCBjaGFyIENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfRURPRltdID0gImVkb2YiOworY29uc3QgY2hhciBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0NPTlRJTlVPVVNbXSA9ICJjb250aW51b3VzIjsKIAogQ2FtZXJhUGFyYW1ldGVyczo6Q2FtZXJhUGFyYW1ldGVycygpCiAgICAgICAgICAgICAgICAgOiBtTWFwKCkKQEAgLTI1OCwyNCArMjY0LDU3IEBACiAgICAgbU1hcC5yZW1vdmVJdGVtKFN0cmluZzgoa2V5KSk7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2Vfc2l6ZShjb25zdCBjaGFyICpzdHIsIGludCAmd2lkdGgsIGludCAmaGVpZ2h0KQorLy8gUGFyc2Ugc3RyaW5nIGxpa2UgIjY0MHg0ODAiIG9yICIxMDAwMCwyMDAwMCIKK3N0YXRpYyBpbnQgcGFyc2VfcGFpcihjb25zdCBjaGFyICpzdHIsIGludCAqZmlyc3QsIGludCAqc2Vjb25kLCBjaGFyIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIgPSBOVUxMKQogewotICAgIC8vIEZpbmQgdGhlIHdpZHRoLgorICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludGVnZXIuCiAgICAgY2hhciAqZW5kOwogICAgIGludCB3ID0gKGludClzdHJ0b2woc3RyLCAmZW5kLCAxMCk7Ci0gICAgLy8gSWYgYW4gJ3gnIGRvZXMgbm90IGltbWVkaWF0ZWx5IGZvbGxvdywgZ2l2ZSB1cC4KLSAgICBpZiAoKmVuZCAhPSAneCcpCisgICAgLy8gSWYgYSBkZWxpbWV0ZXIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93LCBnaXZlIHVwLgorICAgIGlmICgqZW5kICE9IGRlbGltKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIGRlbGltZXRlciAoJWMpIGluIHN0cj0lcyIsIGRlbGltLCBzdHIpOwogICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gICAgLy8gRmluZCB0aGUgaGVpZ2h0LCBpbW1lZGlhdGVseSBhZnRlciB0aGUgJ3gnLgotICAgIGludCBoID0gKGludClzdHJ0b2woZW5kKzEsIDAsIDEwKTsKKyAgICAvLyBGaW5kIHRoZSBzZWNvbmQgaW50ZWdlciwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRlbGltZXRlci4KKyAgICBpbnQgaCA9IChpbnQpc3RydG9sKGVuZCsxLCAmZW5kLCAxMCk7CiAKLSAgICB3aWR0aCA9IHc7Ci0gICAgaGVpZ2h0ID0gaDsKKyAgICAqZmlyc3QgPSB3OworICAgICpzZWNvbmQgPSBoOworCisgICAgaWYgKGVuZHB0cikgeworICAgICAgICAqZW5kcHRyID0gZW5kOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBwYXJzZVNpemVzTGlzdChjb25zdCBjaGFyICpzaXplc1N0ciwgVmVjdG9yPFNpemU+ICZzaXplcykKK3sKKyAgICBpZiAoc2l6ZXNTdHIgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2hhciAqc2l6ZVN0YXJ0UHRyID0gKGNoYXIgKilzaXplc1N0cjsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpbnQgc3VjY2VzcyA9IHBhcnNlX3BhaXIoc2l6ZVN0YXJ0UHRyLCAmd2lkdGgsICZoZWlnaHQsICd4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplU3RhcnRQdHIpOworICAgICAgICBpZiAoc3VjY2VzcyA9PSAtMSB8fCAoKnNpemVTdGFydFB0ciAhPSAnLCcgJiYgKnNpemVTdGFydFB0ciAhPSAnXDAnKSkgeworICAgICAgICAgICAgTE9HRSgiUGljdHVyZSBzaXplcyBzdHJpbmcgXCIlc1wiIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyLiIsIHNpemVzU3RyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplcy5wdXNoKFNpemUod2lkdGgsIGhlaWdodCkpOworCisgICAgICAgIGlmICgqc2l6ZVN0YXJ0UHRyID09ICdcMCcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplU3RhcnRQdHIrKzsKKyAgICB9Cit9CisKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIGNoYXIgc3RyWzMyXTsKQEAgLTI4NSwxOSArMzI0LDE3IEBACiAKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UHJldmlld1NpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0CiB7Ci0gICAgKndpZHRoID0gLTE7Ci0gICAgKmhlaWdodCA9IC0xOwotCisgICAgKndpZHRoID0gKmhlaWdodCA9IC0xOwogICAgIC8vIEdldCB0aGUgY3VycmVudCBzdHJpbmcsIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGxlYXZlIHRoZSAtMXgtMQogICAgIGNvbnN0IGNoYXIgKnAgPSBnZXQoS0VZX1BSRVZJRVdfU0laRSk7Ci0gICAgaWYgKHAgPT0gMCkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChwID09IDApICByZXR1cm47CisgICAgcGFyc2VfcGFpcihwLCB3aWR0aCwgaGVpZ2h0LCAneCcpOworfQogCi0gICAgaW50IHcsIGg7Ci0gICAgaWYgKHBhcnNlX3NpemUocCwgdywgaCkgPT0gMCkgewotICAgICAgICAqd2lkdGggPSB3OwotICAgICAgICAqaGVpZ2h0ID0gaDsKLSAgICB9Cit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmdldFN1cHBvcnRlZFByZXZpZXdTaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdAoreworICAgIGNvbnN0IGNoYXIgKnByZXZpZXdTaXplc1N0ciA9IGdldChLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMpOworICAgIHBhcnNlU2l6ZXNMaXN0KHByZXZpZXdTaXplc1N0ciwgc2l6ZXMpOwogfQogCiB2b2lkIENhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdGcmFtZVJhdGUoaW50IGZwcykKQEAgLTMxMCw2ICszNDcsMTQgQEAKICAgICByZXR1cm4gZ2V0SW50KEtFWV9QUkVWSUVXX0ZSQU1FX1JBVEUpOwogfQogCit2b2lkIENhbWVyYVBhcmFtZXRlcnM6OmdldFByZXZpZXdGcHNSYW5nZShpbnQgKm1pbl9mcHMsIGludCAqbWF4X2ZwcykgY29uc3QKK3sKKyAgICAqbWluX2ZwcyA9ICptYXhfZnBzID0gLTE7CisgICAgY29uc3QgY2hhciAqcCA9IGdldChLRVlfUFJFVklFV19GUFNfUkFOR0UpOworICAgIGlmIChwID09IDApIHJldHVybjsKKyAgICBwYXJzZV9wYWlyKHAsIG1pbl9mcHMsIG1heF9mcHMsICcsJyk7Cit9CisKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld0Zvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpCiB7CiAgICAgc2V0KEtFWV9QUkVWSUVXX0ZPUk1BVCwgZm9ybWF0KTsKQEAgLTMyOSwxOSArMzc0LDE3IEBACiAKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UGljdHVyZVNpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0CiB7Ci0gICAgKndpZHRoID0gLTE7Ci0gICAgKmhlaWdodCA9IC0xOwotCisgICAgKndpZHRoID0gKmhlaWdodCA9IC0xOwogICAgIC8vIEdldCB0aGUgY3VycmVudCBzdHJpbmcsIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGxlYXZlIHRoZSAtMXgtMQogICAgIGNvbnN0IGNoYXIgKnAgPSBnZXQoS0VZX1BJQ1RVUkVfU0laRSk7Ci0gICAgaWYgKHAgPT0gMCkKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChwID09IDApIHJldHVybjsKKyAgICBwYXJzZV9wYWlyKHAsIHdpZHRoLCBoZWlnaHQsICd4Jyk7Cit9CiAKLSAgICBpbnQgdywgaDsKLSAgICBpZiAocGFyc2Vfc2l6ZShwLCB3LCBoKSA9PSAwKSB7Ci0gICAgICAgICp3aWR0aCA9IHc7Ci0gICAgICAgICpoZWlnaHQgPSBoOwotICAgIH0KK3ZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0U3VwcG9ydGVkUGljdHVyZVNpemVzKFZlY3RvcjxTaXplPiAmc2l6ZXMpIGNvbnN0Cit7CisgICAgY29uc3QgY2hhciAqcGljdHVyZVNpemVzU3RyID0gZ2V0KEtFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFUyk7CisgICAgcGFyc2VTaXplc0xpc3QocGljdHVyZVNpemVzU3RyLCBzaXplcyk7CiB9CiAKIHZvaWQgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UGljdHVyZUZvcm1hdChjb25zdCBjaGFyICpmb3JtYXQpCmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCA0NmI1NDc4Li44NWYxYTI5IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTM0LDEyICszNCwzNCBAQAogICAgIHsKICAgICB9CiAKKyAgICAvLyBnZXQgbnVtYmVyIG9mIGNhbWVyYXMgYXZhaWxhYmxlCisgICAgdmlydHVhbCBpbnQzMl90IGdldE51bWJlck9mQ2FtZXJhcygpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuQ2FtZXJhU2VydmljZTo6R0VUX05VTUJFUl9PRl9DQU1FUkFTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgLy8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgY2FtZXJhCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNhbWVyYVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkdFVF9DQU1FUkFfSU5GTywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgY2FtZXJhSW5mby0+ZmFjaW5nID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGNhbWVyYUluZm8tPm9yaWVudGF0aW9uID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICAvLyBjb25uZWN0IHRvIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCBzcDxJQ2FtZXJhPiBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQpCisgICAgdmlydHVhbCBzcDxJQ2FtZXJhPiBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjYW1lcmFJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KQEAgLTUzLDEwICs3NSwyNSBAQAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBHRVRfTlVNQkVSX09GX0NBTUVSQVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0TnVtYmVyT2ZDYW1lcmFzKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9DQU1FUkFfSU5GTzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBDYW1lcmFJbmZvIGNhbWVyYUluZm87CisgICAgICAgICAgICBtZW1zZXQoJmNhbWVyYUluZm8sIDAsIHNpemVvZihjYW1lcmFJbmZvKSk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRDYW1lcmFJbmZvKGRhdGEucmVhZEludDMyKCksICZjYW1lcmFJbmZvKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNhbWVyYUluZm8uZmFjaW5nKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNhbWVyYUluZm8ub3JpZW50YXRpb24pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDT05ORUNUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGNhbWVyYUNsaWVudCA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFDbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYSA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50KTsKKyAgICAgICAgICAgIHNwPElDYW1lcmE+IGNhbWVyYSA9IGNvbm5lY3QoY2FtZXJhQ2xpZW50LCBkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjYW1lcmEtPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDM0NjQ4YjUuLjlhOTcyODQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTEsNSArMSwzIEBACi1pZmVxICgkKEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVCksdHJ1ZSkKLQogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtOSwxMSArNywxMiBAQAogCVNpbmVTb3VyY2UuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlcgorCWxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAJJChKTklfSF9JTkNMVURFKSBcCiAJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAJJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlCiAKIExPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgpAQCAtNzEsNSArNzAsMyBAQAogTE9DQUxfTU9EVUxFOj0gYXVkaW9sb29wCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IDg0NWM4NTQuLmM0MjQyODEgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTMyLDkgKzMyLDE1IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCitzdGF0aWMgY29uc3QgaW50MzJfdCBrRnJhbWVyYXRlID0gMjQ7ICAvLyBmcHMKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtJRnJhbWVzSW50ZXJ2YWxTZWMgPSAxOworc3RhdGljIGNvbnN0IGludDMyX3Qga1ZpZGVvQml0UmF0ZSA9IDUxMiAqIDEwMjQ7CitzdGF0aWMgY29uc3QgaW50MzJfdCBrQXVkaW9CaXRSYXRlID0gMTIyMDA7CitzdGF0aWMgY29uc3QgaW50MzJfdCBrQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtEdXJhdGlvblVzID0gMTAwMDAwMDBMTDsgIC8vIDEwIHNlY29uZHMKKwogI2lmIDEKIGNsYXNzIER1bW15U291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRnJhbWVyYXRlID0gMjQ7ICAvLyBmcHMKIAogcHVibGljOgogICAgIER1bW15U291cmNlKGludCB3aWR0aCwgaW50IGhlaWdodCkKQEAgLTE0Nyw3ICsxNTMsNyBAQAogICAgIE9NWENsaWVudCBjbGllbnQ7CiAgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgT0spOwogCi0jaWYgMQorI2lmIDAKICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gY3JlYXRlU291cmNlKGFyZ3ZbMV0pOwogCiAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CkBAIC0xNjUsMTYgKzE3MSwyMyBAQAogICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKICAgICBDSEVDSyhzdWNjZXNzKTsKICNlbHNlCi0gICAgaW50IHdpZHRoID0gODAwOworICAgIGludCB3aWR0aCA9IDcyMDsKICAgICBpbnQgaGVpZ2h0ID0gNDgwOwogICAgIHNwPE1lZGlhU291cmNlPiBkZWNvZGVyID0gbmV3IER1bW15U291cmNlKHdpZHRoLCBoZWlnaHQpOwogI2VuZGlmCiAKICAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgLy8gZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAvLyBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwga0ZyYW1lcmF0ZSk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBrVmlkZW9CaXRSYXRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIGhlaWdodCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsIGtJRnJhbWVzSW50ZXJ2YWxTZWMpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGtDb2xvckZvcm1hdCk7CiAKICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9CiAgICAgICAgIE9NWENvZGVjOjpDcmVhdGUoCkBAIC0xODMsOCArMTk2LDEwIEBACiAjaWYgMQogICAgIHNwPE1QRUc0V3JpdGVyPiB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoIi9zZGNhcmQvb3V0cHV0Lm1wNCIpOwogICAgIHdyaXRlci0+YWRkU291cmNlKGVuY29kZXIpOworICAgIHdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKGtEdXJhdGlvblVzKTsKICAgICB3cml0ZXItPnN0YXJ0KCk7CiAgICAgd2hpbGUgKCF3cml0ZXItPnJlYWNoZWRFT1MoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi4iKTsKICAgICAgICAgdXNsZWVwKDEwMDAwMCk7CiAgICAgfQogICAgIHdyaXRlci0+c3RvcCgpOwpAQCAtMTkzLDYgKzIwOCw4IEBACiAKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwogICAgIHdoaWxlIChlbmNvZGVyLT5yZWFkKCZidWZmZXIpID09IE9LKSB7CisgICAgICAgIHByaW50ZigiLiIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgaW50MzJfdCBpc1N5bmM7CiAgICAgICAgIGlmICghYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykpIHsKICAgICAgICAgICAgIGlzU3luYyA9IGZhbHNlOwpAQCAtMjA4LDExICsyMjUsMTQgQEAKICAgICBlbmNvZGVyLT5zdG9wKCk7CiAjZW5kaWYKIAorICAgIHByaW50ZigiJFxuIik7CiAgICAgY2xpZW50LmRpc2Nvbm5lY3QoKTsKICNlbmRpZgogCiAjaWYgMAogICAgIENhbWVyYVNvdXJjZSAqc291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGUoKTsKKyAgICBzb3VyY2UtPnN0YXJ0KCk7CisKICAgICBwcmludGYoInNvdXJjZSA9ICVwXG4iLCBzb3VyY2UpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewpAQCAtMjI3LDYgKzI0Nyw4IEBACiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgfQogCisgICAgc291cmNlLT5zdG9wKCk7CisKICAgICBkZWxldGUgc291cmNlOwogICAgIHNvdXJjZSA9IE5VTEw7CiAjZW5kaWYKQEAgLTI2Miw2ICsyODQsNyBAQAogICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrU2FtcGxlUmF0ZSk7CiAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwga051bUNoYW5uZWxzKTsKICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCA4MTkyKTsKKyAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwga0F1ZGlvQml0UmF0ZSk7CiAKICAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9CiAgICAgICAgIE9NWENvZGVjOjpDcmVhdGUoY2xpZW50LmludGVyZmFjZSgpLCBlbmNNZXRhLCB0cnVlLCBhdWRpb1NvdXJjZSk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCmluZGV4IGI4MzhmMzIuLjRhMWQyN2IgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwCkBAIC0yNSwxMyArMjUsMTQgQEAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlICJpbmNsdWRlL0FSVFNQQ29udHJvbGxlci5oIgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgpAQCAtMzksNiArNDAsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyBsb25nIGdOdW1SZXBldGl0aW9uczsKQEAgLTQ2LDYgKzUwLDggQEAKIHN0YXRpYyBsb25nIGdSZXByb2R1Y2VCdWc7ICAvLyBpZiBub3QgLTEuCiBzdGF0aWMgYm9vbCBnUHJlZmVyU29mdHdhcmVDb2RlYzsKIHN0YXRpYyBib29sIGdQbGF5YmFja0F1ZGlvOworc3RhdGljIGJvb2wgZ1dyaXRlTVA0Oworc3RhdGljIFN0cmluZzggZ1dyaXRlTVA0RmlsZW5hbWU7CiAKIHN0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkgewogICAgIHN0cnVjdCB0aW1ldmFsIHR2OwpAQCAtODUsNiArOTEsNyBAQAogICAgIGlmIChnUGxheWJhY2tBdWRpbykgewogICAgICAgICBBdWRpb1BsYXllciAqcGxheWVyID0gbmV3IEF1ZGlvUGxheWVyKE5VTEwpOwogICAgICAgICBwbGF5ZXItPnNldFNvdXJjZShyYXdTb3VyY2UpOworICAgICAgICByYXdTb3VyY2UuY2xlYXIoKTsKIAogICAgICAgICBwbGF5ZXItPnN0YXJ0KHRydWUgLyogc291cmNlQWxyZWFkeVN0YXJ0ZWQgKi8pOwogCkBAIC05NSw2ICsxMDIsOCBAQAogCiAgICAgICAgIGRlbGV0ZSBwbGF5ZXI7CiAgICAgICAgIHBsYXllciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAoZ1JlcHJvZHVjZUJ1ZyA+PSAzICYmIGdSZXByb2R1Y2VCdWcgPD0gNSkgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSk7CkBAIC0yNTYsNiArMjY1LDc3IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCB3cml0ZVNvdXJjZVRvTVA0KGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgc3A8TVBFRzRXcml0ZXI+IHdyaXRlciA9CisgICAgICAgIG5ldyBNUEVHNFdyaXRlcihnV3JpdGVNUDRGaWxlbmFtZS5zdHJpbmcoKSk7CisKKyAgICBDSEVDS19FUSh3cml0ZXItPmFkZFNvdXJjZShzb3VyY2UpLCBPSyk7CisKKyAgICBzcDxNZXRhRGF0YT4gcGFyYW1zID0gbmV3IE1ldGFEYXRhOworICAgIENIRUNLX0VRKHdyaXRlci0+c3RhcnQoKSwgT0spOworCisgICAgd2hpbGUgKCF3cml0ZXItPnJlYWNoZWRFT1MoKSkgeworICAgICAgICB1c2xlZXAoMTAwMDAwKTsKKyAgICB9CisgICAgd3JpdGVyLT5zdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZvcm1TZWVrVGVzdChjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgeworICAgIENIRUNLX0VRKE9LLCBzb3VyY2UtPnN0YXJ0KCkpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIENIRUNLKHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSk7CisKKyAgICBmb3IgKGludDY0X3Qgc2Vla1RpbWVVcyA9IDA7IHNlZWtUaW1lVXMgPD0gZHVyYXRpb25VczsKKyAgICAgICAgICAgIHNlZWtUaW1lVXMgKz0gNjAwMDBsbCkgeworICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKKyAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCisgICAgICAgICAgICAgICAgc2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworCisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgZXJyID0gc291cmNlLT5yZWFkKCZidWZmZXIsICZvcHRpb25zKTsKKworICAgICAgICAgICAgb3B0aW9ucy5jbGVhclNlZWtUbygpOworCisgICAgICAgICAgICBpZiAoZXJyID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXIgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICAgICAgICAgIHByaW50ZigiJWxsZFx0JWxsZFx0JWxsZFxuIiwgc2Vla1RpbWVVcywgdGltZVVzLCBzZWVrVGltZVVzIC0gdGltZVVzKTsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLX0VRKE9LLCBzb3VyY2UtPnN0b3AoKSk7Cit9CisKIHN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXNcbiIsIG1lKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaChlbHApXG4iKTsKQEAgLTI2OCw2ICszNDgsOCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC10KGh1bWJuYWlsKSBleHRyYWN0IHZpZGVvIHRodW1ibmFpbCBvciBhbGJ1bSBhcnRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1zKG9mdHdhcmUpIHByZWZlciBzb2Z0d2FyZSBjb2RlY1xuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLW8gcGxheWJhY2sgYXVkaW9cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC13KHJpdGUpIGZpbGVuYW1lICh3cml0ZSB0byAubXA0IGZpbGUpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtayBzZWVrIHRlc3RcbiIpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKQEAgLTI3NywxNCArMzU5LDE5IEBACiAgICAgYm9vbCBsaXN0Q29tcG9uZW50cyA9IGZhbHNlOwogICAgIGJvb2wgZHVtcFByb2ZpbGVzID0gZmFsc2U7CiAgICAgYm9vbCBleHRyYWN0VGh1bWJuYWlsID0gZmFsc2U7CisgICAgYm9vbCBzZWVrVGVzdCA9IGZhbHNlOwogICAgIGdOdW1SZXBldGl0aW9ucyA9IDE7CiAgICAgZ01heE51bUZyYW1lcyA9IDA7CiAgICAgZ1JlcHJvZHVjZUJ1ZyA9IC0xOwogICAgIGdQcmVmZXJTb2Z0d2FyZUNvZGVjID0gZmFsc2U7CiAgICAgZ1BsYXliYWNrQXVkaW8gPSBmYWxzZTsKKyAgICBnV3JpdGVNUDQgPSBmYWxzZTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxBUlRTUENvbnRyb2xsZXI+IHJ0c3BDb250cm9sbGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFuOmxtOmI6cHRzbyIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhbjpsbTpiOnB0c293OmsiKSkgPj0gMCkgewogICAgICAgICBzd2l0Y2ggKHJlcykgewogICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgICB7CkBAIC0zMjAsNiArNDA3LDEzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGNhc2UgJ3cnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdXcml0ZU1QNCA9IHRydWU7CisgICAgICAgICAgICAgICAgZ1dyaXRlTVA0RmlsZW5hbWUuc2V0VG8ob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZHVtcFByb2ZpbGVzID0gdHJ1ZTsKQEAgLTM0NCw2ICs0MzgsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAnayc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2Vla1Rlc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTQ3OSwxOSArNTc5LDEwIEBACiAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjOyArK2spIHsKICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2tdOwogCi0gICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2U7Ci0gICAgICAgIGlmICghc3RybmNhc2VjbXAoImh0dHA6Ly8iLCBmaWxlbmFtZSwgNykpIHsKLSAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgSFRUUERhdGFTb3VyY2UoZmlsZW5hbWUpOwotICAgICAgICAgICAgaWYgKCgoSFRUUERhdGFTb3VyY2UgKilkYXRhU291cmNlLmdldCgpKS0+Y29ubmVjdCgpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgdG8gY29ubmVjdCB0byBIVFRQIHNlcnZlci5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgQ2FjaGluZ0RhdGFTb3VyY2UoZGF0YVNvdXJjZSwgMzIgKiAxMDI0LCAyMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkYXRhU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZmlsZW5hbWUpOwotICAgICAgICB9CisgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKGZpbGVuYW1lKTsKIAotICAgICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIGlmICgoc3RybmNhc2VjbXAoZmlsZW5hbWUsICJzaW5lOiIsIDUpCisgICAgICAgICAgICAgICAgJiYgc3RybmNhc2VjbXAoZmlsZW5hbWUsICJydHNwOi8vIiwgNykpICYmIGRhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlLlxuIik7CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgfQpAQCAtNTE2LDEwICs2MDcsMjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lZGlhU291cmNlID0gbmV3IFNpbmVTb3VyY2Uoc2FtcGxlUmF0ZSwgMSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlKTsKLSAgICAgICAgICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBleHRyYWN0b3IuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzcDxNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOworCisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJydHNwOi8vIiwgZmlsZW5hbWUsIDcpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgICAgICAgICBsb29wZXItPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnRzcENvbnRyb2xsZXIgPSBuZXcgQVJUU1BDb250cm9sbGVyKGxvb3Blcik7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcnRzcENvbnRyb2xsZXItPmNvbm5lY3QoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgY29ubmVjdCB0byBydHNwIHNlcnZlci5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXh0cmFjdG9yID0gcnRzcENvbnRyb2xsZXIuZ2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoZGF0YVNvdXJjZSk7CisgICAgICAgICAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGNyZWF0ZSBleHRyYWN0b3IuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2l6ZV90IG51bVRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKQEAgLTU2Miw3ICs2NzEsMjAgQEAKICAgICAgICAgICAgIG1lZGlhU291cmNlID0gZXh0cmFjdG9yLT5nZXRUcmFjayhpKTsKICAgICAgICAgfQogCi0gICAgICAgIHBsYXlTb3VyY2UoJmNsaWVudCwgbWVkaWFTb3VyY2UpOworICAgICAgICBpZiAoZ1dyaXRlTVA0KSB7CisgICAgICAgICAgICB3cml0ZVNvdXJjZVRvTVA0KG1lZGlhU291cmNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZWVrVGVzdCkgeworICAgICAgICAgICAgcGVyZm9ybVNlZWtUZXN0KG1lZGlhU291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBsYXlTb3VyY2UoJmNsaWVudCwgbWVkaWFTb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ0c3BDb250cm9sbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJ0c3BDb250cm9sbGVyLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBydHNwQ29udHJvbGxlci5jbGVhcigpOworCisgICAgICAgICAgICBzbGVlcCgzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNsaWVudC5kaXNjb25uZWN0KCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCmluZGV4IDU3OTY4ZTMuLjk2NDcwMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC05Miw2ICs5MiwzMiBAQAogICAgIENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRCA9IDEwMAogfTsKIAorZW51bSB7CisgICAgQ0FNRVJBX0ZBQ0lOR19CQUNLID0gMCwKKyAgICBDQU1FUkFfRkFDSU5HX0ZST05UID0gMSAvKiBUaGUgY2FtZXJhIGZhY2VzIHRvIHRoZSB1c2VyICovCit9OworCitzdHJ1Y3QgQ2FtZXJhSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0aW9uIHRoYXQgdGhlIGNhbWVyYSBmYWNlcyB0by4gSXQgc2hvdWxkIGJlCisgICAgICogQ0FNRVJBX0ZBQ0lOR19CQUNLIG9yIENBTUVSQV9GQUNJTkdfRlJPTlQuCisgICAgICovCisgICAgaW50IGZhY2luZzsKKworICAgIC8qKgorICAgICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgY2FtZXJhIGltYWdlLiBUaGUgdmFsdWUgaXMgdGhlIGFuZ2xlIHRoYXQgdGhlCisgICAgICogY2FtZXJhIGltYWdlIG5lZWRzIHRvIGJlIHJvdGF0ZWQgY2xvY2t3aXNlIHNvIGl0IHNob3dzIGNvcnJlY3RseSBvbgorICAgICAqIHRoZSBkaXNwbGF5IGluIGl0cyBuYXR1cmFsIG9yaWVudGF0aW9uLiBJdCBzaG91bGQgYmUgMCwgOTAsIDE4MCwgb3IgMjcwLgorICAgICAqCisgICAgICogRm9yIGV4YW1wbGUsIHN1cHBvc2UgYSBkZXZpY2UgaGFzIGEgbmF0dXJhbGx5IHRhbGwgc2NyZWVuLCBidXQgdGhlIGNhbWVyYQorICAgICAqIHNlbnNvciBpcyBtb3VudGVkIGluIGxhbmRzY2FwZS4gSWYgdGhlIHRvcCBzaWRlIG9mIHRoZSBjYW1lcmEgc2Vuc29yIGlzCisgICAgICogYWxpZ25lZCB3aXRoIHRoZSByaWdodCBlZGdlIG9mIHRoZSBkaXNwbGF5IGluIG5hdHVyYWwgb3JpZW50YXRpb24sIHRoZQorICAgICAqIHZhbHVlIHNob3VsZCBiZSA5MC4KKyAgICAgKi8KKyAgICBpbnQgb3JpZW50YXRpb247Cit9OworCiBjbGFzcyBJQ2FtZXJhU2VydmljZTsKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBTdXJmYWNlOwpAQCAtMTEyLDcgKzEzOCwxMCBAQAogcHVibGljOgogICAgICAgICAgICAgLy8gY29uc3RydWN0IGEgY2FtZXJhIGNsaWVudCBmcm9tIGFuIGV4aXN0aW5nIHJlbW90ZQogICAgIHN0YXRpYyAgc3A8Q2FtZXJhPiAgY3JlYXRlKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEpOwotICAgIHN0YXRpYyAgc3A8Q2FtZXJhPiAgY29ubmVjdCgpOworICAgIHN0YXRpYyAgaW50MzJfdCAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgc3RhdGljICBzdGF0dXNfdCAgICBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pOworICAgIHN0YXRpYyAgc3A8Q2FtZXJhPiAgY29ubmVjdChpbnQgY2FtZXJhSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfkNhbWVyYSgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgaW5pdCgpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCBkODc3Yzc0Li42YTY2ZTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKQEAgLTIxMyw4ICsyMTMsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCA9IDA7CiB9OwogCi0vKiogZmFjdG9yeSBmdW5jdGlvbiB0byBpbnN0YW50aWF0ZSBhIGNhbWVyYSBoYXJkd2FyZSBvYmplY3QgKi8KLWV4dGVybiAiQyIgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IG9wZW5DYW1lcmFIYXJkd2FyZSgpOworLyoqCisgKiBUaGUgZnVuY3Rpb25zIG5lZWQgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGNhbWVyYSBIQUwuCisgKgorICogSWYgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgcmV0dXJucyBOLCB0aGUgdmFsaWQgY2FtZXJhSWQgZm9yIGdldENhbWVyYUluZm8oKQorICogYW5kIG9wZW5DYW1lcmFIYXJkd2FyZSgpIGlzIDAgdG8gTi0xLgorICovCitleHRlcm4gIkMiIGludCBIQUxfZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CitleHRlcm4gIkMiIHZvaWQgSEFMX2dldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLCBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CisvKiBIQUwgc2hvdWxkIHJldHVybiBOVUxMIGlmIGl0IGZhaWxzIHRvIG9wZW4gY2FtZXJhIGhhcmR3YXJlLiAqLworZXh0ZXJuICJDIiBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gSEFMX29wZW5DYW1lcmFIYXJkd2FyZShpbnQgY2FtZXJhSWQpOwogCiB9OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IDVlYTgzYTUuLjdjNTM3MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTIyLDYgKzIyLDIxIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IFNpemUgeworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworCisgICAgU2l6ZSgpIHsKKyAgICAgICAgd2lkdGggPSAwOworICAgICAgICBoZWlnaHQgPSAwOworICAgIH0KKworICAgIFNpemUoaW50IHcsIGludCBoKSB7CisgICAgICAgIHdpZHRoID0gdzsKKyAgICAgICAgaGVpZ2h0ID0gaDsKKyAgICB9Cit9OworCiBjbGFzcyBDYW1lcmFQYXJhbWV0ZXJzCiB7CiBwdWJsaWM6CkBAIC00MywxMiArNTgsMTUgQEAKIAogICAgIHZvaWQgc2V0UHJldmlld1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2b2lkIGdldFByZXZpZXdTaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSBjb25zdDsKKyAgICB2b2lkIGdldFN1cHBvcnRlZFByZXZpZXdTaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdDsKICAgICB2b2lkIHNldFByZXZpZXdGcmFtZVJhdGUoaW50IGZwcyk7CiAgICAgaW50IGdldFByZXZpZXdGcmFtZVJhdGUoKSBjb25zdDsKKyAgICB2b2lkIGdldFByZXZpZXdGcHNSYW5nZShpbnQgKm1pbl9mcHMsIGludCAqbWF4X2ZwcykgY29uc3Q7CiAgICAgdm9pZCBzZXRQcmV2aWV3Rm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCk7CiAgICAgY29uc3QgY2hhciAqZ2V0UHJldmlld0Zvcm1hdCgpIGNvbnN0OwogICAgIHZvaWQgc2V0UGljdHVyZVNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2b2lkIGdldFBpY3R1cmVTaXplKGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSBjb25zdDsKKyAgICB2b2lkIGdldFN1cHBvcnRlZFBpY3R1cmVTaXplcyhWZWN0b3I8U2l6ZT4gJnNpemVzKSBjb25zdDsKICAgICB2b2lkIHNldFBpY3R1cmVGb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KTsKICAgICBjb25zdCBjaGFyICpnZXRQaWN0dXJlRm9ybWF0KCkgY29uc3Q7CiAKQEAgLTY1LDEzICs4MywyOSBAQAogICAgIC8vIFN1cHBvcnRlZCBwcmV2aWV3IGZyYW1lIHNpemVzIGluIHBpeGVscy4KICAgICAvLyBFeGFtcGxlIHZhbHVlOiAiODAweDYwMCw0ODB4MzIwIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfUFJFVklFV19TSVpFU1tdOwotICAgIC8vIFRoZSBpbWFnZSBmb3JtYXQgZm9yIHByZXZpZXcgZnJhbWVzLgorICAgIC8vIFRoZSBjdXJyZW50IG1pbmltdW0gYW5kIG1heGltdW0gcHJldmlldyBmcHMuIFRoaXMgY29udHJvbHMgdGhlIHJhdGUgb2YKKyAgICAvLyBwcmV2aWV3IGZyYW1lcyByZWNlaXZlZCAoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKS4gVGhlIG1pbmltdW0gYW5kCisgICAgLy8gbWF4aW11bSBmcHMgbXVzdCBiZSBvbmUgb2YgdGhlIGVsZW1lbnRzIGZyb20KKyAgICAvLyBLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlBTX1JBTkdFIHBhcmFtZXRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMTA1MDAsMjY2MjMiCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1BSRVZJRVdfRlBTX1JBTkdFW107CisgICAgLy8gVGhlIHN1cHBvcnRlZCBwcmV2aWV3IGZwcyAoZnJhbWUtcGVyLXNlY29uZCkgcmFuZ2VzLiBFYWNoIHJhbmdlIGNvbnRhaW5zCisgICAgLy8gYSBtaW5pbXVtIGZwcyBhbmQgbWF4aW11bSBmcHMuIElmIG1pbmltdW0gZnBzIGVxdWFscyB0byBtYXhpbXVtIGZwcywgdGhlCisgICAgLy8gY2FtZXJhIG91dHB1dHMgZnJhbWVzIGluIGZpeGVkIGZyYW1lIHJhdGUuIElmIG5vdCwgdGhlIGNhbWVyYSBvdXRwdXRzCisgICAgLy8gZnJhbWVzIGluIGF1dG8gZnJhbWUgcmF0ZS4gVGhlIGFjdHVhbCBmcmFtZSByYXRlIGZsdWN0dWF0ZXMgYmV0d2VlbiB0aGUKKyAgICAvLyBtaW5pbXVtIGFuZCB0aGUgbWF4aW11bS4gVGhlIGxpc3QgaGFzIGF0IGxlYXN0IG9uZSBlbGVtZW50LiBUaGUgbGlzdCBpcworICAgIC8vIHNvcnRlZCBmcm9tIHNtYWxsIHRvIGxhcmdlIChmaXJzdCBieSBtYXhpbXVtIGZwcyBhbmQgdGhlbiBtaW5pbXVtIGZwcykuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIigxMDUwMCwyNjYyMyksKDE1MDAwLDI2NjIzKSwoMzAwMDAsMzAwMDApIgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfUFJFVklFV19GUFNfUkFOR0VbXTsKKyAgICAvLyBUaGUgaW1hZ2UgZm9ybWF0IGZvciBwcmV2aWV3IGZyYW1lcy4gU2VlIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSBpbgorICAgIC8vIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaC4KICAgICAvLyBFeGFtcGxlIHZhbHVlOiAieXV2NDIwc3AiIG9yIFBJWEVMX0ZPUk1BVF9YWFggY29uc3RhbnRzLiBSZWFkL3dyaXRlLgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9QUkVWSUVXX0ZPUk1BVFtdOwogICAgIC8vIFN1cHBvcnRlZCBpbWFnZSBmb3JtYXRzIGZvciBwcmV2aWV3IGZyYW1lcy4KICAgICAvLyBFeGFtcGxlIHZhbHVlOiAieXV2NDIwc3AseXV2NDIyaS15dXl2Ii4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfUFJFVklFV19GT1JNQVRTW107Ci0gICAgLy8gTnVtYmVyIG9mIHByZXZpZXcgZnJhbWVzIHBlciBzZWNvbmQuCisgICAgLy8gTnVtYmVyIG9mIHByZXZpZXcgZnJhbWVzIHBlciBzZWNvbmQuIFRoaXMgaXMgdGhlIHRhcmdldCBmcmFtZSByYXRlLiBUaGUKKyAgICAvLyBhY3R1YWwgZnJhbWUgcmF0ZSBkZXBlbmRzIG9uIHRoZSBkcml2ZXIuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjE1Ii4gUmVhZC93cml0ZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUFJFVklFV19GUkFNRV9SQVRFW107CiAgICAgLy8gU3VwcG9ydGVkIG51bWJlciBvZiBwcmV2aWV3IGZyYW1lcyBwZXIgc2Vjb25kLgpAQCAtODMsNyArMTE3LDggQEAKICAgICAvLyBTdXBwb3J0ZWQgZGltZW5zaW9ucyBmb3IgY2FwdHVyZWQgcGljdHVyZXMgaW4gcGl4ZWxzLgogICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIyMDQ4eDE1MzYsMTAyNHg3NjgiLiBSZWFkIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTW107Ci0gICAgLy8gVGhlIGltYWdlIGZvcm1hdCBmb3IgY2FwdHVyZWQgcGljdHVyZXMuCisgICAgLy8gVGhlIGltYWdlIGZvcm1hdCBmb3IgY2FwdHVyZWQgcGljdHVyZXMuIFNlZSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UKKyAgICAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmguCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogImpwZWciIG9yIFBJWEVMX0ZPUk1BVF9YWFggY29uc3RhbnRzLiBSZWFkL3dyaXRlLgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9QSUNUVVJFX0ZPUk1BVFtdOwogICAgIC8vIFN1cHBvcnRlZCBpbWFnZSBmb3JtYXRzIGZvciBjYXB0dXJlZCBwaWN0dXJlcy4KQEAgLTExOSwxNCArMTU0LDE3IEBACiAgICAgLy8gc2hvdWxkIG5vdCBzZXQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjAiIG9yICI5MCIgb3IgIjE4MCIgb3IgIjI3MCIuIFdyaXRlIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1JPVEFUSU9OW107Ci0gICAgLy8gR1BTIGxhdGl0dWRlIGNvb3JkaW5hdGUuIFRoaXMgd2lsbCBiZSBzdG9yZWQgaW4gSlBFRyBFWElGIGhlYWRlci4KLSAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjUuMDMyMTQ2Ii4gV3JpdGUgb25seS4KKyAgICAvLyBHUFMgbGF0aXR1ZGUgY29vcmRpbmF0ZS4gR1BTTGF0aXR1ZGUgYW5kIEdQU0xhdGl0dWRlUmVmIHdpbGwgYmUgc3RvcmVkIGluCisgICAgLy8gSlBFRyBFWElGIGhlYWRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjUuMDMyMTQ2IiBvciAiLTMzLjQ2MjgwOSIuIFdyaXRlIG9ubHkuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0dQU19MQVRJVFVERVtdOwotICAgIC8vIEdQUyBsb25naXR1ZGUgY29vcmRpbmF0ZS4gVGhpcyB3aWxsIGJlIHN0b3JlZCBpbiBKUEVHIEVYSUYgaGVhZGVyLgotICAgIC8vIEV4YW1wbGUgdmFsdWU6ICIxMjEuNTY0NDQ4Ii4gV3JpdGUgb25seS4KKyAgICAvLyBHUFMgbG9uZ2l0dWRlIGNvb3JkaW5hdGUuIEdQU0xvbmdpdHVkZSBhbmQgR1BTTG9uZ2l0dWRlUmVmIHdpbGwgYmUgc3RvcmVkCisgICAgLy8gaW4gSlBFRyBFWElGIGhlYWRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMTIxLjU2NDQ0OCIgb3IgIi03MC42NjAyODYiLiBXcml0ZSBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9HUFNfTE9OR0lUVURFW107Ci0gICAgLy8gR1BTIGFsdGl0dWRlLiBUaGlzIHdpbGwgYmUgc3RvcmVkIGluIEpQRUcgRVhJRiBoZWFkZXIuCi0gICAgLy8gRXhhbXBsZSB2YWx1ZTogIjIxLjAiLiBXcml0ZSBvbmx5LgorICAgIC8vIEdQUyBhbHRpdHVkZS4gR1BTQWx0aXR1ZGUgYW5kIEdQU0FsdGl0dWRlUmVmIHdpbGwgYmUgc3RvcmVkIGluIEpQRUcgRVhJRgorICAgIC8vIGhlYWRlci4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMjEuMCIgb3IgIi01Ii4gV3JpdGUgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfR1BTX0FMVElUVURFW107CiAgICAgLy8gR1BTIHRpbWVzdGFtcCAoVVRDIGluIHNlY29uZHMgc2luY2UgSmFudWFyeSAxLCAxOTcwKS4gVGhpcyBzaG91bGQgYmUKICAgICAvLyBzdG9yZWQgaW4gSlBFRyBFWElGIGhlYWRlci4KQEAgLTE2NSwxMCArMjAzLDkgQEAKICAgICAvLyBTdXBwb3J0ZWQgZmxhc2ggbW9kZXMuCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogImF1dG8sb24sb2ZmIi4gUmVhZCBvbmx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfRkxBU0hfTU9ERVNbXTsKLSAgICAvLyBDdXJyZW50IGZvY3VzIG1vZGUuIElmIHRoZSBjYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWZvY3VzLCB0aGUgdmFsdWUKLSAgICAvLyBzaG91bGQgYmUgRk9DVVNfTU9ERV9GSVhFRC4gSWYgdGhlIGZvY3VzIG1vZGUgaXMgbm90IEZPQ1VTX01PREVfRklYRUQgb3IKLSAgICAvLyBvciBGT0NVU19NT0RFX0lORklOSVRZLCBhcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwKLSAgICAvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5hdXRvRm9jdXMgdG8gc3RhcnQgdGhlIGZvY3VzLgorICAgIC8vIEN1cnJlbnQgZm9jdXMgbW9kZS4gVGhpcyB3aWxsIG5vdCBiZSBlbXB0eS4gQXBwbGljYXRpb25zIHNob3VsZCBjYWxsCisgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIHRvIHN0YXJ0IHRoZSBmb2N1cyBpZiBmb2N1cyBtb2RlIGlzCisgICAgLy8gRk9DVVNfTU9ERV9BVVRPIG9yIEZPQ1VTX01PREVfTUFDUk8uCiAgICAgLy8gRXhhbXBsZSB2YWx1ZTogImF1dG8iIG9yIEZPQ1VTX01PREVfWFhYIGNvbnN0YW50cy4gUmVhZC93cml0ZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfRk9DVVNfTU9ERVtdOwogICAgIC8vIFN1cHBvcnRlZCBmb2N1cyBtb2Rlcy4KQEAgLTIyMSw5ICsyNTgsNDAgQEAKICAgICAvLyBFeGFtcGxlIHZhbHVlOiAidHJ1ZSIuIFJlYWQgb25seS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU01PT1RIX1pPT01fU1VQUE9SVEVEW107CiAKKyAgICAvLyBUaGUgZGlzdGFuY2VzIChpbiBtZXRlcnMpIGZyb20gdGhlIGNhbWVyYSB0byB3aGVyZSBhbiBvYmplY3QgYXBwZWFycyB0bworICAgIC8vIGJlIGluIGZvY3VzLiBUaGUgb2JqZWN0IGlzIHNoYXJwZXN0IGF0IHRoZSBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlLiBUaGUKKyAgICAvLyBkZXB0aCBvZiBmaWVsZCBpcyB0aGUgZmFyIGZvY3VzIGRpc3RhbmNlIG1pbnVzIG5lYXIgZm9jdXMgZGlzdGFuY2UuCisgICAgLy8KKyAgICAvLyBGb2N1cyBkaXN0YW5jZXMgbWF5IGNoYW5nZSBhZnRlciBzdGFydGluZyBhdXRvIGZvY3VzLCBjYW5jZWxpbmcgYXV0bworICAgIC8vIGZvY3VzLCBvciBzdGFydGluZyB0aGUgcHJldmlldy4gQXBwbGljYXRpb25zIGNhbiByZWFkIHRoaXMgYW55dGltZSB0byBnZXQKKyAgICAvLyB0aGUgbGF0ZXN0IGZvY3VzIGRpc3RhbmNlcy4gSWYgdGhlIGZvY3VzIG1vZGUgaXMgRk9DVVNfTU9ERV9DT05USU5VT1VTLAorICAgIC8vIGZvY3VzIGRpc3RhbmNlcyBtYXkgY2hhbmdlIGZyb20gdGltZSB0byB0aW1lLgorICAgIC8vCisgICAgLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBlc3RpbWF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY2FtZXJhIGFuZCB0aGUKKyAgICAvLyBzdWJqZWN0LiBBZnRlciBhdXRvZm9jdXMsIHRoZSBzdWJqZWN0IGRpc3RhbmNlIG1heSBiZSB3aXRoaW4gbmVhciBhbmQgZmFyCisgICAgLy8gZm9jdXMgZGlzdGFuY2UuIEhvd2V2ZXIsIHRoZSBwcmVjaXNpb24gZGVwZW5kcyBvbiB0aGUgY2FtZXJhIGhhcmR3YXJlLAorICAgIC8vIGF1dG9mb2N1cyBhbGdvcml0aG0sIHRoZSBmb2N1cyBhcmVhLCBhbmQgdGhlIHNjZW5lLiBUaGUgZXJyb3IgY2FuIGJlCisgICAgLy8gbGFyZ2UgYW5kIGl0IHNob3VsZCBiZSBvbmx5IHVzZWQgYXMgYSByZWZlcmVuY2UuCisgICAgLy8KKyAgICAvLyBGYXIgZm9jdXMgZGlzdGFuY2UgPiBvcHRpbWFsIGZvY3VzIGRpc3RhbmNlID4gbmVhciBmb2N1cyBkaXN0YW5jZS4gSWYKKyAgICAvLyB0aGUgZmFyIGZvY3VzIGRpc3RhbmNlIGlzIGluZmluaXR5LCB0aGUgdmFsdWUgc2hvdWxkIGJlICJJbmZpbml0eSIgKGNhc2UKKyAgICAvLyBzZW5zaXRpdmUpLiBUaGUgZm9ybWF0IGlzIHRocmVlIGZsb2F0IHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiBUaGUKKyAgICAvLyBmaXJzdCBpcyBuZWFyIGZvY3VzIGRpc3RhbmNlLiBUaGUgc2Vjb25kIGlzIG9wdGltYWwgZm9jdXMgZGlzdGFuY2UuIFRoZQorICAgIC8vIHRoaXJkIGlzIGZhciBmb2N1cyBkaXN0YW5jZS4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiMC45NSwxLjksSW5maW5pdHkiIG9yICIwLjA0OSwwLjA1LDAuMDUxIi4gUmVhZCBvbmx5LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9GT0NVU19ESVNUQU5DRVNbXTsKKworICAgIC8vIFRoZSBpbWFnZSBmb3JtYXQgZm9yIHZpZGVvIGZyYW1lcy4gU2VlIENBTUVSQV9NU0dfVklERU9fRlJBTUUgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmguCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogInl1djQyMHNwIiBvciBQSVhFTF9GT1JNQVRfWFhYIGNvbnN0YW50cy4gUmVhZCBvbmx5LgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9WSURFT19GUkFNRV9GT1JNQVRbXTsKKwogICAgIC8vIFZhbHVlIGZvciBLRVlfWk9PTV9TVVBQT1JURUQgb3IgS0VZX1NNT09USF9aT09NX1NVUFBPUlRFRC4KICAgICBzdGF0aWMgY29uc3QgY2hhciBUUlVFW107CiAKKyAgICAvLyBWYWx1ZSBmb3IgS0VZX0ZPQ1VTX0RJU1RBTkNFUy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19ESVNUQU5DRV9JTkZJTklUWVtdOworCiAgICAgLy8gVmFsdWVzIGZvciB3aGl0ZSBiYWxhbmNlIHNldHRpbmdzLgogICAgIHN0YXRpYyBjb25zdCBjaGFyIFdISVRFX0JBTEFOQ0VfQVVUT1tdOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIFdISVRFX0JBTEFOQ0VfSU5DQU5ERVNDRU5UW107CkBAIC0yOTQsMTEgKzM2MiwxNCBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9KUEVHW107CiAKICAgICAvLyBWYWx1ZXMgZm9yIGZvY3VzIG1vZGUgc2V0dGluZ3MuCi0gICAgLy8gQXV0by1mb2N1cyBtb2RlLgorICAgIC8vIEF1dG8tZm9jdXMgbW9kZS4gQXBwbGljYXRpb25zIHNob3VsZCBjYWxsCisgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIHRvIHN0YXJ0IHRoZSBmb2N1cyBpbiB0aGlzIG1vZGUuCiAgICAgc3RhdGljIGNvbnN0IGNoYXIgRk9DVVNfTU9ERV9BVVRPW107CiAgICAgLy8gRm9jdXMgaXMgc2V0IGF0IGluZmluaXR5LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBjYWxsCiAgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIGluIHRoaXMgbW9kZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX0lORklOSVRZW107CisgICAgLy8gTWFjcm8gKGNsb3NlLXVwKSBmb2N1cyBtb2RlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwKKyAgICAvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5hdXRvRm9jdXMgdG8gc3RhcnQgdGhlIGZvY3VzIGluIHRoaXMgbW9kZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX01BQ1JPW107CiAgICAgLy8gRm9jdXMgaXMgZml4ZWQuIFRoZSBjYW1lcmEgaXMgYWx3YXlzIGluIHRoaXMgbW9kZSBpZiB0aGUgZm9jdXMgaXMgbm90CiAgICAgLy8gYWRqdXN0YWJsZS4gSWYgdGhlIGNhbWVyYSBoYXMgYXV0by1mb2N1cywgdGhpcyBtb2RlIGNhbiBmaXggdGhlCkBAIC0zMDksNiArMzgwLDEyIEBACiAgICAgLy8gY29udGludW91c2x5LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBjYWxsCiAgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIGluIHRoaXMgbW9kZS4KICAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX0VET0ZbXTsKKyAgICAvLyBDb250aW51b3VzIGF1dG8gZm9jdXMgbW9kZS4gVGhlIGNhbWVyYSBjb250aW51b3VzbHkgdHJpZXMgdG8gZm9jdXMuIFRoaXMKKyAgICAvLyBpcyBpZGVhbCBmb3Igc2hvb3RpbmcgdmlkZW8gb3Igc2hvb3RpbmcgcGhvdG8gb2YgbW92aW5nIG9iamVjdC4gQXV0bworICAgIC8vIGZvY3VzIHN0YXJ0cyB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgc2V0LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBjYWxsCisgICAgLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuYXV0b0ZvY3VzIGluIHRoaXMgbW9kZS4gIFRvIHN0b3AgY29udGludW91cworICAgIC8vIGZvY3VzLCBhcHBsaWNhdGlvbnMgc2hvdWxkIGNoYW5nZSB0aGUgZm9jdXMgbW9kZSB0byBvdGhlciBtb2Rlcy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX0NPTlRJTlVPVVNbXTsKIAogcHJpdmF0ZToKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCxTdHJpbmc4PiAgICBtTWFwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaCBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKaW5kZXggODJiMTI4My4uN2Q3MGMxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCkBAIC0zMCwxMyArMzAsMTkgQEAKIHsKIHB1YmxpYzoKICAgICBlbnVtIHsKLSAgICAgICAgQ09OTkVDVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgICAgIEdFVF9OVU1CRVJfT0ZfQ0FNRVJBUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgICAgIEdFVF9DQU1FUkFfSU5GTywKKyAgICAgICAgQ09OTkVDVAogICAgIH07CiAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENhbWVyYVNlcnZpY2UpOwogCi0gICAgdmlydHVhbCBzcDxJQ2FtZXJhPiAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50KSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKKyAgICB2aXJ0dWFsIHNwPElDYW1lcmE+ICAgICBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTY3ZWZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0wLDAgKzEsNDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPRUZGRUNUX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT0VGRkVDVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvSUVmZmVjdENsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgZWZmZWN0X3BhcmFtX2NibGtfdDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBBdWRpb0VmZmVjdCA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisKKyAgICAvKgorICAgICAqICBTdGF0aWMgbWV0aG9kcyBmb3IgZWZmZWN0IGxpYnJhcmllcyBtYW5hZ2VtZW50LgorICAgICAqLworCisgICAgLyoKKyAgICAgKiAgIExvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBwYXRoIGlzIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgorICAgICAqICAgVGhpcyBtdXN0IGJlIHRoZSBmdWxsIHBhdGggb2YgYSBkeW5hbWljIGxpYnJhcnkgKC5zbykgaW1wbGVtZW50aW5nIG9uZSBvcgorICAgICAqICAgbW9yZSBlZmZlY3QgZW5naW5lcyBhbmQgZXhwb3NpbmcgdGhlIGVmZmVjdCBsaWJyYXJ5IGludGVyZmFjZSBkZXNjcmliZWQgaW4KKyAgICAgKiAgIEVmZmVjdEFwaS5oLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZSBvbiB0aGUgbGlicmFyeSBmb3IgdXNlIGJ5CisgICAgICogICBmdXJ0aGVyIGNhbGwgdG8gdW5sb2FkRWZmZWN0TGlicmFyeSgpIHRvIHVubG9hZCB0aGUgbGlicmFyeS4KKyAgICAgKgorICAgICAqICAgUGFyYW1ldGVyczoKKyAgICAgKiAgICAgICAgICBsaWJQYXRoOiAgICBmdWxsIHBhdGggb2YgdGhlIGR5bmFtaWMgbGlicmFyeSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgKiAgICAgICAgICBoYW5kbGU6ICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgbGlicmFyeSBoYW5kbGUKKyAgICAgKgorICAgICAqICAgUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICAgICAgTk9fRVJST1IgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNvbmZpZ3VyZSBhdWRpbworICAgICAqICAgICAgICAgIE5PX0lOSVQgICAgIGVmZmVjdCBmYWN0b3J5IG5vdCBpbml0aWFsaXplZCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgY291bGQgbm90IGJlIGxvYWRlZCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3QgaW1wbGVtZW50IHJlcXVpcmVkIGZ1bmN0aW9ucworICAgICAqICAgICAgICAgIEJBRF9WQUxVRSAgIGludmFsaWQgbGliUGF0aCBzdHJpbmcgb3IgaGFuZGxlCisgICAgICoKKyAgICAgKiAgIFJldHVybmVkIHZhbHVlOgorICAgICAqICAgICAgICAgICpoYW5kbGUgdXBkYXRlZCB3aXRoIGxpYnJhcnkgaGFuZGxlCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKKworICAgIC8qCisgICAgICogICBVbmxvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBoYW5kbGUgaXMgZ2l2ZW4gYXMgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiAgIFBhcmFtZXRlcnM6CisgICAgICogICAgICAgICAgaGFuZGxlOiBsaWJyYXJ5IGhhbmRsZQorICAgICAqCisgICAgICogICBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgICAgICBOT19FUlJPUiAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2Ugb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gY29uZmlndXJlIGF1ZGlvCisgICAgICogICAgICAgICAgTk9fSU5JVCAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkCisgICAgICogICAgICAgICAgQkFEX1ZBTFVFICAgaW52YWxpZCBoYW5kbGUKKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKTsKKworICAgIC8qCisgICAgICogIFN0YXRpYyBtZXRob2RzIGZvciBlZmZlY3RzIGVudW1lcmF0aW9uLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWZmZWN0cyBhdmFpbGFibGUuIFRoaXMgbWV0aG9kIHRvZ2V0aGVyCisgICAgICogd2l0aCBxdWVyeUVmZmVjdCgpIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzOgorICAgICAqIFRoZSBlbnVtZXJhdGlvbiBzZXF1ZW5jZSBpczoKKyAgICAgKiAgICAgIHF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtX2VmZmVjdHMpOworICAgICAqICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lZmZlY3RzOyBpKyspCisgICAgICogICAgICAgICAgcXVlcnlFZmZlY3QoaSwuLi4pOworICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIG51bUVmZmVjdHM6ICAgIGFkZHJlc3Mgd2hlcmUgdGhlIG51bWJlciBvZiBlZmZlY3RzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgTk9fSU5JVCAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorICAgICAqICAgICAgQkFEX1ZBTFVFICBpbnZhbGlkIG51bUVmZmVjdHMgcG9pbnRlcgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICpudW1FZmZlY3RzOiAgICAgdXBkYXRlZCB3aXRoIG51bWJlciBvZiBlZmZlY3RzIGF2YWlsYWJsZQorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpOworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIGFuIGVmZmVjdCBkZXNjcmlwdG9yIGR1cmluZyBlZmZlY3QKKyAgICAgKiBlbnVtZXJhdGlvbi4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpbmRleDogICAgICBpbmRleCBvZiB0aGUgcXVlcmllZCBlZmZlY3QuCisgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBkZXNjcmlwdG9yIHBvaW50ZXIgb3IgaW5kZXgKKyAgICAgKiAgICAgIElOVkFMSURfT1BFUkFUSU9OICBlZmZlY3QgbGlzdCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGV4ZWN1dGlvbiBvZiBxdWVyeU51bWJlckVmZmVjdHMoKQorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICpkZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIHV1aWQ6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHV1aWQuCisgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB1dWlkIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAgICAgKiAgICAgIE5BTUVfTk9UX0ZPVU5EICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlCisgICAgICogICAqZGVzY3JpcHRvciB1cGRhdGVkIHdpdGggZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICp1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworCisgICAgLyoKKyAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgorICAgICAqLworICAgIGVudW0gZXZlbnRfdHlwZSB7CisgICAgICAgIEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQgPSAwLAorICAgICAgICBFVkVOVF9FTkFCTEVfU1RBVFVTX0NIQU5HRUQgPSAxLAorICAgICAgICBFVkVOVF9QQVJBTUVURVJfQ0hBTkdFRCA9IDIsCisgICAgICAgIEVWRU5UX0VSUk9SID0gMworICAgIH07CisKKyAgICAvKiBDYWxsYmFjayBmdW5jdGlvbiBub3RpZnlpbmcgY2xpZW50IGFwcGxpY2F0aW9uIG9mIGEgY2hhbmdlIGluIGVmZmVjdCBlbmdpbmUgc3RhdGUgb3IKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIEFuIGVmZmVjdCBlbmdpbmUgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGFwcGxpY2F0aW9ucyBidXQgb25seSBvbmUgaGFzIHRoZSBjb250cm9sCisgICAgICogb2YgdGhlIGVuZ2luZSBhY3Rpdml0eSBhbmQgY29uZmlndXJhdGlvbiBhdCBhIHRpbWUuCisgICAgICogVGhlIEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQgZXZlbnQgaXMgcmVjZWl2ZWQgd2hlbiBhbiBhcHBsaWNhdGlvbiBsb3NlcyBvcgorICAgICAqIHJldHJpZXZlcyB0aGUgY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZS4gTG9zcyBvZiBjb250cm9sIGhhcHBlbnMKKyAgICAgKiBpZiBhbm90aGVyIGFwcGxpY2F0aW9uIHJlcXVlc3RzIHRoZSB1c2Ugb2YgdGhlIGVuZ2luZSBieSBjcmVhdGluZyBhbiBBdWRpb0VmZmVjdCBmb3IKKyAgICAgKiB0aGUgc2FtZSBlZmZlY3QgdHlwZSBidXQgd2l0aCBhIGhpZ2hlciBwcmlvcml0eS4gQ29udHJvbCBpcyByZXR1cm5lZCB3aGVuIHRoZQorICAgICAqIGFwcGxpY2F0aW9uIGhhdmluZyB0aGUgY29udHJvbCBkZWxldGVzIGl0cyBBdWRpb0VmZmVjdCBvYmplY3QuCisgICAgICogVGhlIEVWRU5UX0VOQUJMRV9TVEFUVVNfQ0hBTkdFRCBldmVudCBpcyByZWNlaXZlZCBieSBhbGwgYXBwbGljYXRpb25zIG5vdCBoYXZpbmcgdGhlCisgICAgICogY29udHJvbCBvZiB0aGUgZWZmZWN0IGVuZ2luZSB3aGVuIHRoZSBlZmZlY3QgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgKiBUaGUgRVZFTlRfUEFSQU1FVEVSX0NIQU5HRUQgZXZlbnQgaXMgcmVjZWl2ZWQgYnkgYWxsIGFwcGxpY2F0aW9ucyBub3QgaGF2aW5nIHRoZQorICAgICAqIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hlbiBhbiBlZmZlY3QgcGFyYW1ldGVyIGlzIGNoYW5nZWQuCisgICAgICogVGhlIEVWRU5UX0VSUk9SIGV2ZW50IGlzIHJlY2VpdmVkIHdoZW4gdGhlIG1lZGlhIHNlcnZlciBwcm9jZXNzIGRpZXMuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqCisgICAgICogZXZlbnQ6ICAgdHlwZSBvZiBldmVudCBub3RpZmllZCAoc2VlIGVudW0gQXVkaW9FZmZlY3Q6OmV2ZW50X3R5cGUpLgorICAgICAqIHVzZXI6ICAgIFBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KKyAgICAgKiBpbmZvOiAgICBQb2ludGVyIHRvIG9wdGlvbmFsIHBhcmFtZXRlciBhY2NvcmRpbmcgdG8gZXZlbnQgdHlwZToKKyAgICAgKiAgLSBFVkVOVF9DT05UUk9MX1NUQVRVU19DSEFOR0VEOiAgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGNvbnRyb2wgaXMgZ3JhbnRlZCAodHJ1ZSkKKyAgICAgKiAgb3Igc3RvbGVuIChmYWxzZSkuCisgICAgICogIC0gRVZFTlRfRU5BQkxFX1NUQVRVU19DSEFOR0VEOiBib29sZWFuIGluZGljYXRpbmcgaWYgZWZmZWN0IGlzIG5vdyBlbmFibGVkICh0cnVlKQorICAgICAqICBvciBkaXNhYmxlZCAoZmFsc2UpLgorICAgICAqICAtIEVWRU5UX1BBUkFNRVRFUl9DSEFOR0VEOiBwb2ludGVyIHRvIGEgZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlLgorICAgICAqICAtIEVWRU5UX0VSUk9SOiAgc3RhdHVzX3QgaW5kaWNhdGluZyB0aGUgZXJyb3IgKERFQURfT0JKRUNUIHdoZW4gbWVkaWEgc2VydmVyIGRpZXMpLgorICAgICAqLworCisgICAgdHlwZWRlZiB2b2lkICgqZWZmZWN0X2NhbGxiYWNrX3QpKGludDMyX3QgZXZlbnQsIHZvaWQqIHVzZXIsIHZvaWQgKmluZm8pOworCisKKyAgICAvKiBDb25zdHJ1Y3Rvci4KKyAgICAgKiBBdWRpb0VmZmVjdCBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgYW5kIGNvbnRyb2xsaW5nIGFuIGVmZmVjdCBlbmdpbmUgZnJvbQorICAgICAqIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzLiBDcmVhdGluZyBhbiBBdWRpb0VmZmVjdCBvYmplY3Qgd2lsbCBjcmVhdGUgdGhlIGVmZmVjdCBlbmdpbmUKKyAgICAgKiBpbiB0aGUgQXVkaW9GbGluZ2VyIGlmIG5vIGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZXhpc3RzLiBJZiBvbmUgZXhpc3RzLCB0aGlzIGVuZ2luZQorICAgICAqIHdpbGwgYmUgdXNlZC4gVGhlIGFwcGxpY2F0aW9uIGNyZWF0aW5nIHRoZSBBdWRpb0VmZmVjdCBvYmplY3QgKG9yIGEgZGVyaXZlZCBjbGFzcyBsaWtlCisgICAgICogUmV2ZXJiIGZvciBpbnN0YW5jZSkgd2lsbCBlaXRoZXIgcmVjZWl2ZSBjb250cm9sIG9mIHRoZSBlZmZlY3QgZW5naW5lIG9yIG5vdCwgZGVwZW5kaW5nCisgICAgICogb24gdGhlIHByaW9yaXR5IHBhcmFtZXRlci4gSWYgcHJpb3JpdHkgaXMgaGlnaGVyIHRoYW4gdGhlIHByaW9yaXR5IHVzZWQgYnkgdGhlIGN1cnJlbnQKKyAgICAgKiBlZmZlY3QgZW5naW5lIG93bmVyLCB0aGUgY29udHJvbCB3aWxsIGJlIHRyYW5zZmVyZWQgdG8gdGhlIG5ldyBhcHBsaWNhdGlvbi4gT3RoZXJ3aXNlCisgICAgICogY29udHJvbCB3aWxsIHJlbWFpbiB0byB0aGUgcHJldmlvdXMgYXBwbGljYXRpb24uIEluIHRoaXMgY2FzZSwgdGhlIG5ldyBhcHBsaWNhdGlvbiB3aWxsIGJlCisgICAgICogbm90aWZpZWQgb2YgY2hhbmdlcyBpbiBlZmZlY3QgZW5naW5lIHN0YXRlIG9yIGNvbnRyb2wgb3duZXJzaGlwIGJ5IHRoZSBlZmZlY3QgY2FsbGJhY2suCisgICAgICogQWZ0ZXIgY3JlYXRpbmcgdGhlIEF1ZGlvRWZmZWN0LCB0aGUgYXBwbGljYXRpb24gbXVzdCBjYWxsIHRoZSBpbml0Q2hlY2soKSBtZXRob2QgYW5kCisgICAgICogY2hlY2sgdGhlIGNyZWF0aW9uIHN0YXR1cyBiZWZvcmUgdHJ5aW5nIHRvIGNvbnRyb2wgdGhlIGVmZmVjdCBlbmdpbmUgKHNlZSBpbml0Q2hlY2soKSkuCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyB0byBiZSBhcHBsaWVkIHRvIGFuIEF1ZGlvVHJhY2sgb3IgTWVkaWFQbGF5ZXIgb25seSB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBtdXN0IHNwZWNpZnkgdGhlIGF1ZGlvIHNlc3Npb24gSUQgY29ycmVzcG9uZGluZyB0byB0aGlzIHBsYXllci4KKyAgICAgKi8KKworICAgIC8qIFNpbXBsZSBDb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBBdWRpb0VmZmVjdCgpOworCisKKyAgICAvKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiB0eXBlOiAgdHlwZSBvZiBlZmZlY3QgY3JlYXRlZDogY2FuIGJlIG51bGwgaWYgdXVpZCBpcyBzcGVjaWZpZWQuIFRoaXMgY29ycmVzcG9uZHMgdG8KKyAgICAgKiAgICAgICAgdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QuCisgICAgICogdXVpZDogIFV1aWQgb2YgZWZmZWN0IGNyZWF0ZWQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLiBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8KKyAgICAgKiAgICAgICAgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgorICAgICAqIHByaW9yaXR5OiAgICByZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICogICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZSB2YWx1ZXMKKyAgICAgKiAgICAgIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogY2JmOiAgICAgICAgIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgZWZmZWN0X2NhbGxiYWNrX3QpCisgICAgICogdXNlcjogICAgICAgIHBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KKyAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLiBJZiAwLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCisgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gSWYgbm90IDAsIHRoZSBlZmZlY3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBwbGF5ZXJzCisgICAgICogICAgICAoQXVkaW9UcmFjayBvciBNZWRpYVBMYXllcikgd2l0aGluIHRoZSBzYW1lIGF1ZGlvIHNlc3Npb24uCisgICAgICogb3V0cHV0OiAgSEFMIGF1ZGlvIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBlZmZlY3QgbXVzdCBiZSBhdHRhY2hlZC4gTGVhdmUgYXQgMCBmb3IKKyAgICAgKiAgICAgIGF1dG9tYXRpYyBvdXRwdXQgc2VsZWN0aW9uIGJ5IEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKworICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IDAsCisgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gMCwKKyAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMAorICAgICAgICAgICAgICAgICAgKTsKKworICAgIC8qIENvbnN0cnVjdG9yLgorICAgICAqICAgICAgU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncworICAgICAqLworICAgIEF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gMCwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IDAsCisgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCisgICAgICogVGhlIGVmZmVjdCBlbmdpbmUgaXMgYWxzbyBkZXN0cm95ZWQgaWYgdGhpcyBBdWRpb0VmZmVjdCB3YXMgdGhlIGxhc3QgY29udHJvbGxpbmcKKyAgICAgKiB0aGUgZW5naW5lLgorICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgfkF1ZGlvRWZmZWN0KCk7CisKKyAgICAvKiBJbml0aWFsaXplIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9FZmZlY3QuCisgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAqICAtIE5PX0VSUk9SIG9yIEFMUkVBRFlfRVhJU1RTOiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCisgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9FZmZlY3QgaXMgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlcgorICAgICogIC0gTk9fSU5JVDogYXVkaW8gZmxpbmdlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKKyAgICAqICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9FZmZlY3QuIFRoaXMgbXVzdCBiZSBjaGVja2VkCisgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb0VmZmVjdCBBUEkuCisgICAgICogaW5pdENoZWNrKCkgY2FuIHJldHVybjoKKyAgICAgKiAgLSBOT19FUlJPUjogICAgdGhlIGVmZmVjdCBlbmdpbmUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW5kIHRoZSBhcHBsaWNhdGlvbiBoYXMgY29udHJvbC4KKyAgICAgKiAgLSBBTFJFQURZX0VYSVNUUzogdGhlIGVmZmVjdCBlbmdpbmUgaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYnV0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAorICAgICAqICAgICAgICAgICAgICBoYXZlIGNvbnRyb2wuCisgICAgICogIC0gTk9fSU5JVDogICAgIHRoZSBlZmZlY3QgY3JlYXRpb24gZmFpbGVkLgorICAgICAqCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKKworCisgICAgLyogUmV0dXJucyB0aGUgdW5pcXVlIGVmZmVjdCBJZCBmb3IgdGhlIGNvbnRyb2xsZWQgZWZmZWN0IGVuZ2luZS4gVGhpcyBJRCBpcyB1bmlxdWUKKyAgICAgKiBzeXN0ZW0gd2lkZSBhbmQgaXMgdXNlZCBmb3IgaW5zdGFuY2UgaW4gdGhlIGNhc2Ugb2YgYXV4aWxpYXJ5IGVmZmVjdHMgdG8gYXR0YWNoCisgICAgICogdGhlIGVmZmVjdCB0byBhbiBBdWRpb1RyYWNrIG9yIE1lZGlhUGxheWVyLgorICAgICAqCisgICAgICovCisgICAgICAgICAgICBpbnQzMl90ICAgICBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgLyogUmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlZmZlY3QgKHNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGluIEVmZmVjdEFwaS5oKS4KKyAgICAgKi8KKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvcigpIGNvbnN0OworCisgICAgLyogUmV0dXJucyBlZmZlY3QgY29udHJvbCBwcmlvcml0eSBvZiB0aGlzIEF1ZGlvRWZmZWN0IG9iamVjdC4KKyAgICAgKi8KKyAgICAgICAgICAgIGludDMyX3QgICAgIHByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gbVByaW9yaXR5OyB9CisKKworICAgIC8qIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICBlbmFibGVkOiByZXF1ZXN0ZWQgZW5hYmxlIHN0YXRlLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUgb3IgdGhlCisgICAgICogIGVmZmVjdCBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0ZWQgc3RhdGUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICBib29sICAgICAgICBnZXRFbmFibGVkKCkgY29uc3Q7CisKKyAgICAvKiBTZXRzIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIHBhcmFtOiAgcG9pbnRlciB0byBlZmZlY3RfcGFyYW1fdCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgYW5kIGl0cyB2YWx1ZSAoU2VlIEVmZmVjdEFwaS5oKS4KKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciBpZGVudGlmaWVyIG9yIHZhbHVlLgorICAgICAqICAtIERFQURfT0JKRUNUOiB0aGUgZWZmZWN0IGVuZ2luZSBoYXMgYmVlbiBkZWxldGVkLgorICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSk7CisKKyAgICAvKiBQcmVwYXJlIGEgbmV3IHBhcmFtZXRlciB2YWx1ZSB0aGF0IHdpbGwgYmUgc2V0IGJ5IG5leHQgY2FsbCB0bworICAgICAqIHNldFBhcmFtZXRlckNvbW1pdCgpLiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzZXQgbXVsdGlwbGUgcGFyYW1ldGVycworICAgICAqIGluIGEgc3luY2hyb25vdXMgbWFubmVyIG9yIHRvIGF2b2lkIG11bHRpcGxlIGJpbmRlciBjYWxscyBmb3IgZWFjaAorICAgICAqIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBwYXJhbTogIHBvaW50ZXIgdG8gZWZmZWN0X3BhcmFtX3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgIGFuZCBpdHMgdmFsdWUgKFNlZSBFZmZlY3RBcGkuaCkuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgICogIC0gTk9fTUVNT1JZOiBubyBtb3JlIHNwYWNlIGF2YWlsYWJsZSBpbiBzaGFyZWQgbWVtb3J5IHVzZWQgZm9yIGRlZmVycmVkIHBhcmFtZXRlcgorICAgICAqICBzZXR0aW5nLgorICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyRGVmZXJyZWQoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKTsKKworICAgICAvKiBDb21taXQgYWxsIHBhcmFtZXRlciB2YWx1ZXMgcHJldmlvdXNseSBwcmVwYXJlZCBieSBzZXRQYXJhbWV0ZXJEZWZlcnJlZCgpLgorICAgICAgKgorICAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAgKiAgICAgbm9uZQorICAgICAgKgorICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogTm8gbmV3IHBhcmFtZXRlciB2YWx1ZXMgcmVhZHkgZm9yIGNvbW1pdC4KKyAgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlciBpZGVudGlmaWVyIG9yIHZhbHVlOiB0aGVyZSBpcyBubyBpbmRpY2F0aW9uCisgICAgICAqICAgICBhcyB0byB3aGljaCBvZiB0aGUgcGFyYW1ldGVycyBjYXVzZWQgdGhpcyBlcnJvci4KKyAgICAgICogIC0gREVBRF9PQkpFQ1Q6IHRoZSBlZmZlY3QgZW5naW5lIGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190ICAgc2V0UGFyYW1ldGVyQ29tbWl0KCk7CisKKyAgICAvKiBHZXRzIGEgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIHBhcmFtOiAgcG9pbnRlciB0byBlZmZlY3RfcGFyYW1fdCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSAoU2VlIEVmZmVjdEFwaS5oKS4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAtIE5PX0VSUk9SOiBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogdGhlIEF1ZGlvRWZmZWN0IHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLgorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIgaWRlbnRpZmllci4KKyAgICAgKiAgLSBERUFEX09CSkVDVDogdGhlIGVmZmVjdCBlbmdpbmUgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICAgKi8KKyAgICAgdmlydHVhbCBzdGF0dXNfdCAgIGdldFBhcmFtZXRlcihlZmZlY3RfcGFyYW1fdCAqcGFyYW0pOworCisgICAgIC8qIFNlbmRzIGEgY29tbWFuZCBhbmQgcmVjZWl2ZXMgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCisgICAgICAqICAgICBTZWUgRWZmZWN0QXBpLmggZm9yIGRldGFpbHMgb24gZWZmZWN0IGNvbW1hbmQoKSBmdW5jdGlvbiwgdmFsaWQgY29tbWFuZCBjb2RlcworICAgICAgKiAgICAgYW5kIGZvcm1hdHMuCisgICAgICAqLworICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSk7CisKKworICAgICAvKgorICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9ucy4KKyAgICAgICovCisKKyAgICAgLyogQ29udmVydHMgdGhlIHN0cmluZyBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGVmZmVjdF91dWlkX3QKKyAgICAgICogcG9pbnRlZCB0byBieSBzZWNvbmQgYXJndW1lbnQKKyAgICAgICovCisgICAgIHN0YXRpYyBzdGF0dXNfdCBzdHJpbmdUb0d1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICpndWlkKTsKKyAgICAgLyogQ29udmVydHMgdGhlIGVmZmVjdF91dWlkX3QgcG9pbnRlZCB0byBieSBmaXJzdCBhcmd1bWVudCB0byB0aGUKKyAgICAgICogc3RyaW5nIHBhc3NlZCBhcyBzZWNvbmQgYXJndW1lbnQKKyAgICAgICovCisgICAgIHN0YXRpYyBzdGF0dXNfdCBndWlkVG9TdHJpbmcoY29uc3QgZWZmZWN0X3V1aWRfdCAqZ3VpZCwgY2hhciAqc3RyLCBzaXplX3QgbWF4TGVuKTsKKworcHJvdGVjdGVkOgorICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICBtRW5hYmxlZDsgICAgICAgICAgIC8vIGVuYWJsZSBzdGF0ZQorICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOyAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5OyAgICAgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKKyAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsgICAgICAgICAgICAvLyBlZmZlY3Qgc3RhdHVzCisgICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgY2hhbmdlcyBub3RpZmljYXRpb25zCisgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsgICAgICAgICAgLy8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yOyAgICAgICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkOyAgICAgICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAorCitwcml2YXRlOgorCisgICAgIC8vIEltcGxlbWVudHMgdGhlIElFZmZlY3RDbGllbnQgaW50ZXJmYWNlCisgICAgY2xhc3MgRWZmZWN0Q2xpZW50IDogcHVibGljIGFuZHJvaWQ6OkJuRWZmZWN0Q2xpZW50LCAgcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgeworICAgIHB1YmxpYzoKKworICAgICAgICBFZmZlY3RDbGllbnQoQXVkaW9FZmZlY3QgKmVmZmVjdCkgOiBtRWZmZWN0KGVmZmVjdCl7fQorCisgICAgICAgIC8vIElFZmZlY3RDbGllbnQKKyAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpIHsKKyAgICAgICAgICAgIG1FZmZlY3QtPmNvbnRyb2xTdGF0dXNDaGFuZ2VkKGNvbnRyb2xHcmFudGVkKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICAgICAgICAgIG1FZmZlY3QtPmVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICAgICAgICAgIG1FZmZlY3QtPmNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHttRWZmZWN0LT5iaW5kZXJEaWVkKCk7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgQXVkaW9FZmZlY3QgKm1FZmZlY3Q7CisgICAgfTsKKworCisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdENsaWVudDsKKworICAgIC8vIElFZmZlY3RDbGllbnQKKyAgICB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpOworICAgIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpOworICAgIHZvaWQgY29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgdm9pZCBiaW5kZXJEaWVkKCk7CisKKworICAgIHNwPElFZmZlY3Q+ICAgICAgICAgICAgIG1JRWZmZWN0OyAgICAgICAgICAgLy8gSUVmZmVjdCBiaW5kZXIgaW50ZXJmYWNlCisgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCisgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZworICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKK307CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9FRkZFQ1RfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDkyYmMxMjYuLjM4ZTNkNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTEwMCw2ICsxMDAsMTkgQEAKIAogICAgIHR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7CiAKKyAgICAvKiBSZXR1cm5zIHRoZSBtaW5pbXVtIGZyYW1lIGNvdW50IHJlcXVpcmVkIGZvciB0aGUgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZgorICAgICAqIGFuIEF1ZGlvUmVjb3JkIG9iamVjdC4KKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBzZXJ2ZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCisgICAgICogIC0gQkFEX1ZBTFVFOiB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uCisgICAgICovCisKKyAgICAgc3RhdGljIHN0YXR1c190IGdldE1pbkZyYW1lQ291bnQoaW50KiBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50KTsKKwogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1JlY29yZC4gTm8gY29ubmVjdGlvbiB3aXRoCiAgICAgICogQXVkaW9GbGluZ2VyIHRha2VzIHBsYWNlLgogICAgICAqLwpAQCAtMTQyLDcgKzE1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CiAKIAogICAgIC8qIFRlcm1pbmF0ZXMgdGhlIEF1ZGlvUmVjb3JkIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KQEAgLTE2OCw3ICsxODIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm90aWZpY2F0aW9uRnJhbWVzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CiAKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtMjcwLDYgKzI4NSwxNiBAQAogICAgICAqLwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0SW5wdXQoKTsKIAorICAgIC8qIHJldHVybnMgdGhlIGF1ZGlvIHNlc3Npb24gSUQgYXNzb2NpYXRlZCB0byB0aGlzIEF1ZGlvUmVjb3JkLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgbm9uZS4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlOgorICAgICAqICBBdWRpb1JlY29yZCBzZXNzaW9uIElELgorICAgICAqLworICAgICAgICAgICAgaW50ICAgIGdldFNlc3Npb25JZCgpOworCiAgICAgLyogb2J0YWlucyBhIGJ1ZmZlciBvZiAiZnJhbWVDb3VudCIgZnJhbWVzLiBUaGUgYnVmZmVyIG11c3QgYmUKICAgICAgKiBmaWxsZWQgZW50aXJlbHkuIElmIHRoZSB0cmFjayBpcyBzdG9wcGVkLCBvYnRhaW5CdWZmZXIoKSByZXR1cm5zCiAgICAgICogU1RPUFBFRCBpbnN0ZWFkIG9mIE5PX0VSUk9SIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGJ1ZmZlcnMgYXZhaWxsYWJsZSwKQEAgLTM1Niw2ICszODEsNyBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtQ2hhbm5lbHM7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbUlucHV0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IGQwY2NjNTAuLjlmZDkwNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTE2OCw2ICsxNjgsMTUgQEAKICAgICAgICAgVFhfRElTQUJMRSAgICA9IDAKICAgICB9OwogCisgICAgLy8gc3BlY2lhbCBhdWRpbyBzZXNzaW9uIHZhbHVlcworICAgIGVudW0gYXVkaW9fc2Vzc2lvbnMgeworICAgICAgICBTRVNTSU9OX09VVFBVVF9TVEFHRSA9IC0xLCAvLyBzZXNzaW9uIGZvciBlZmZlY3RzIGF0dGFjaGVkIHRvIGEgcGFydGljdWxhciBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAwKQorICAgICAgICBTRVNTSU9OX09VVFBVVF9NSVggPSAwLCAgICAvLyBzZXNzaW9uIGZvciBlZmZlY3RzIGFwcGxpZWQgdG8gb3V0cHV0IG1peC4gVGhlc2UgZWZmZWN0cyBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgbW92ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgdG8gYW5vdGhlciBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh2YWx1ZSBtdXN0IGJlIDApCisgICAgfTsKKwogICAgIC8qIFRoZXNlIGFyZSBzdGF0aWMgbWV0aG9kcyB0byBjb250cm9sIHRoZSBzeXN0ZW0td2lkZSBBdWRpb0ZsaW5nZXIKICAgICAgKiBvbmx5IHByaXZpbGVnZWQgcHJvY2Vzc2VzIGNhbiBoYXZlIGFjY2VzcyB0byB0aGVtCiAgICAgICovCkBAIC0yMzQsNiArMjQzLDggQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywgaW50IHN0cmVhbSA9IERFRkFVTFQpOwogCiAgICAgc3RhdGljIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKTsKKworICAgIHN0YXRpYyBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKTsKICAgICAvLwogICAgIC8vIEF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UKICAgICAvLwpAQCAtMzUxLDggKzM2MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IEZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gQ0hBTk5FTF9PVVRfU1RFUkVPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbGFncyBmbGFncyA9IE9VVFBVVF9GTEFHX0lORElSRUNUKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uID0gMCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGludCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCkBAIC0zNjgsNiArMzgzLDE2IEBACiAgICAgc3RhdGljIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtX3R5cGUgc3RyZWFtLCBpbnQgKmluZGV4KTsKIAorICAgIHN0YXRpYyB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1fdHlwZSBzdHJlYW0pOworCisgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisKICAgICBzdGF0aWMgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCAxNGIzMGFlLi40NDc1ZDRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtMTAyLDYgKzEwMiwxNyBAQAogCiAgICAgdHlwZWRlZiB2b2lkICgqY2FsbGJhY2tfdCkoaW50IGV2ZW50LCB2b2lkKiB1c2VyLCB2b2lkICppbmZvKTsKIAorICAgIC8qIFJldHVybnMgdGhlIG1pbmltdW0gZnJhbWUgY291bnQgcmVxdWlyZWQgZm9yIHRoZSBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mCisgICAgICogYW4gQXVkaW9UcmFjayBvYmplY3QuCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCisgICAgICogIC0gTk9fSU5JVDogYXVkaW8gc2VydmVyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAorICAgICAqLworCisgICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5GcmFtZUNvdW50KGludCogZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbVR5cGUgICAgICA9LTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAwKTsKKwogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrLiBObyBjb25uZWN0aW9uIHdpdGgKICAgICAgKiBBdWRpb0ZsaW5nZXIgdGFrZXMgcGxhY2UuCiAgICAgICovCkBAIC0xMzgsNyArMTQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzICAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmICAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDApOwogCiAgICAgLyogQ3JlYXRlcyBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLiBXaXRoIHRoaXMgY29uc3RydWN0b3IsCiAgICAgICogVGhlIFBDTSBkYXRhIHRvIGJlIHJlbmRlcmVkIGJ5IEF1ZGlvVHJhY2sgaXMgcGFzc2VkIGluIGEgc2hhcmVkIG1lbW9yeSBidWZmZXIKQEAgLTE1Nyw3ICsxNjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja190IGNiZiAgICAgID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgICAgICAgICAgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1RyYWNrIGFuZCB1bnJlZ2lzdGVycyBpdCBmcm9tIEF1ZGlvRmxpbmdlci4KICAgICAgKiBBbHNvIGRlc3Ryb3lzIGFsbCByZXNvdXJjZXMgYXNzb3RpYXRlZCB3aXRoIHRoZSBBdWRpb1RyYWNrLgpAQCAtMTgyLDcgKzE5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IDApOwogCiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb1RyYWNrLiBUaGlzIG11c3QgYmUgY2hlY2tlZApAQCAtMjM5LDEwICsyNTMsMTcgQEAKIAogCiAgICAgLyogc2V0IHZvbHVtZSBmb3IgdGhpcyB0cmFjaywgbW9zdGx5IHVzZWQgZm9yIGdhbWVzJyBzb3VuZCBlZmZlY3RzCisgICAgICogbGVmdCBhbmQgcmlnaHQgdm9sdW1lcy4gTGV2ZWxzIG11c3QgYmUgPD0gMS4wLgogICAgICAqLwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBnZXRWb2x1bWUoZmxvYXQqIGxlZnQsIGZsb2F0KiByaWdodCk7CiAKKyAgICAvKiBzZXQgdGhlIHNlbmQgbGV2ZWwgZm9yIHRoaXMgdHJhY2suIEFuIGF1eGlsaWFyeSBlZmZlY3Qgc2hvdWxkIGJlIGF0dGFjaGVkCisgICAgICogdG8gdGhlIHRyYWNrIHdpdGggYXR0YWNoRWZmZWN0KCkuIExldmVsIG11c3QgYmUgPD0gMS4wLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGdldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCogbGV2ZWwpOworCiAgICAgLyogc2V0IHNhbXBsZSByYXRlIGZvciB0aGlzIHRyYWNrLCBtb3N0bHkgdXNlZCBmb3IgZ2FtZXMnIHNvdW5kIGVmZmVjdHMKICAgICAgKi8KICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFNhbXBsZVJhdGUoaW50IHNhbXBsZVJhdGUpOwpAQCAtMzQwLDYgKzM2MSwzMSBAQAogICAgICAqLwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgICAgZ2V0T3V0cHV0KCk7CiAKKyAgICAvKiByZXR1cm5zIHRoZSB1bmlxdWUgSUQgYXNzb2NpYXRlZCB0byB0aGlzIHRyYWNrLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgbm9uZS4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHZhbHVlOgorICAgICAqICBBdWRpb1RyYWNrIElELgorICAgICAqLworICAgICAgICAgICAgaW50ICAgIGdldFNlc3Npb25JZCgpOworCisKKyAgICAvKiBBdHRhY2ggdHJhY2sgYXV4aWxpYXJ5IG91dHB1dCB0byBzcGVjaWZpZWQgZWZmZWN0LiBVc2VkIGVmZmVjdElkID0gMAorICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICoKKyAgICAgKiBlZmZlY3RJZDogIGVmZmVjdElkIG9idGFpbmVkIGZyb20gQXVkaW9FZmZlY3Q6OmlkKCkuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogdGhlIGVmZmVjdCBpcyBub3QgYW4gYXV4aWxpYXJ5IGVmZmVjdC4KKyAgICAgKiAgLSBCQURfVkFMVUU6IFRoZSBzcGVjaWZpZWQgZWZmZWN0IElEIGlzIGludmFsaWQKKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOworCiAgICAgLyogb2J0YWlucyBhIGJ1ZmZlciBvZiAiZnJhbWVDb3VudCIgZnJhbWVzLiBUaGUgYnVmZmVyIG11c3QgYmUKICAgICAgKiBmaWxsZWQgZW50aXJlbHkuIElmIHRoZSB0cmFjayBpcyBzdG9wcGVkLCBvYnRhaW5CdWZmZXIoKSByZXR1cm5zCiAgICAgICogU1RPUFBFRCBpbnN0ZWFkIG9mIE5PX0VSUk9SIGFzIGxvbmcgYXMgdGhlcmUgYXJlIGJ1ZmZlcnMgYXZhaWxsYWJsZSwKQEAgLTM5OCwxMyArNDQ0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VGcmFtZUNvdW50KTsKIAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOwogCiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVZvbHVtZVsyXTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogCiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7CkBAIC00MjAsNyArNDY4LDggQEAKIAogICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcTsgLy8gcmVxdWVzdGVkIG51bWJlciBvZiBmcmFtZXMgYmV0d2VlbiBlYWNoIG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3Q7IC8vIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGJldHdlZW4gZWFjaCBub3RpZmljYXRpb24gY2FsbGJhY2sKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtU2hhcmVkQnVmZmVyOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1Mb29wQ291bnQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lczsKQEAgLTQyOSw2ICs0NzgsOCBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1OZXdQb3NpdGlvbjsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtVXBkYXRlUGVyaW9kOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1GbGFnczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOworICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmYjQzYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKQEAgLTAsMCArMSw3OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUQVBJX0hfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoZSBlZmZlY3QgY29udHJvbCBpbnRlcmZhY2UgaXMgZXhwb3NlZCBieSBlYWNoIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24uIEl0IGNvbnNpc3RzIG9mCisvLyBhIHNldCBvZiBmdW5jdGlvbnMgY29udHJvbGxpbmcgdGhlIGNvbmZpZ3VyYXRpb24sIGFjdGl2YXRpb24gYW5kIHByb2Nlc3Mgb2YgdGhlIGVuZ2luZS4KKy8vIFRoZSBmdW5jdGlvbnMgYXJlIGdyb3VwZWQgaW4gYSBzdHJ1Y3R1cmUgb2YgdHlwZSBlZmZlY3RfaW50ZXJmYWNlX3M6CisvLyAgICBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIHsKKy8vICAgICAgICBlZmZlY3RfcHJvY2Vzc190IHByb2Nlc3M7CisvLyAgICAgICAgZWZmZWN0X2NvbW1hbmRfdCBjb21tYW5kOworLy8gICAgfTsKKworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3Q6IEVmZmVjdCBjb250cm9sIGludGVyZmFjZSBoYW5kbGUuCisvLyBUaGUgZWZmZWN0X2ludGVyZmFjZV90IHNlcnZlcyB0d28gcHVycG9zZXMgcmVnYXJkaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZWZmZWN0IGVuZ2luZToKKy8vIC0gMSBpdCBpcyB0aGUgYWRkcmVzcyBvZiBhIHBvaW50ZXIgdG8gYW4gZWZmZWN0X2ludGVyZmFjZV9zIHN0cnVjdHVyZSB3aGVyZSB0aGUgZnVuY3Rpb25zCisvLyBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGZvciBhIHBhcnRpY3VsYXIgZWZmZWN0IGFyZSBsb2NhdGVkLgorLy8gLSAyIGl0IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBlZmZlY3QgaW5zdGFuY2UuCisvLyBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gaW4gdGhlIGVmZmVjdCBsaWJyYXJ5IHdvdWxkIGRlZmluZSBhIHN0cnVjdHVyZSBhcyBmb2xsb3dzOgorLy8gc3RydWN0IGVmZmVjdF9tb2R1bGVfcyB7CisvLyAgICAgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKKy8vICAgICAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworLy8gICAgICAgIGVmZmVjdF9jb250ZXh0X3QgY29udGV4dDsKKy8vIH0KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFZmZlY3RDcmVhdGUoKSBmdW5jdGlvbiB3b3VsZCB0aGVuIGFsbG9jYXRlIGEgc3RydWN0dXJlIG9mIHRoaXMKKy8vIHR5cGUgYW5kIHJldHVybiBpdHMgYWRkcmVzcyBhcyBlZmZlY3RfaW50ZXJmYWNlX3QKK3R5cGVkZWYgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKmVmZmVjdF9pbnRlcmZhY2VfdDsKKworCisvLyBFZmZlY3QgQVBJIHZlcnNpb24gMS4wCisjZGVmaW5lIEVGRkVDVF9BUElfVkVSU0lPTiAweDAxMDAgLy8gRm9ybWF0IDB4TU1tbSBNTTogTWFqb3IgdmVyc2lvbiwgbW06IG1pbm9yIHZlcnNpb24KKworLy8gTWF4aW11bSBsZW5ndGggb2YgY2hhcmFjdGVyIHN0cmluZ3MgaW4gc3RydWN0dXJlcyBkZWZpbmVzIGJ5IHRoaXMgQVBJLgorI2RlZmluZSBFRkZFQ1RfU1RSSU5HX0xFTl9NQVggNjQKKworLy8KKy8vLS0tIEVmZmVjdCBkZXNjcmlwdG9yIHN0cnVjdHVyZSBlZmZlY3RfZGVzY3JpcHRvcl90CisvLworCisvLyBVbmlxdWUgZWZmZWN0IElEIChjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGZvbGxvd2luZyBzaXRlOgorLy8gIGh0dHA6Ly93d3cuaXR1LmludC9JVFUtVC9hc24xL3V1aWQuaHRtbCkKKy8vIFRoaXMgZm9ybWF0IGlzIHVzZWQgZm9yIGJvdGggInR5cGUiIGFuZCAidXVpZCIgZmllbGRzIG9mIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisvLyAtIFdoZW4gdXNlZCBmb3IgZWZmZWN0IHR5cGUgYW5kIHRoZSBlbmdpbmUgaXMgaW1wbGVtZW50aW5nIGFuZCBlZmZlY3QgY29ycmVzcG9uZGluZyB0byBhIHN0YW5kYXJkCisvLyBPcGVuU0wgRVMgaW50ZXJmYWNlLCB0aGlzIElEIG11c3QgYmUgdGhlIG9uZSBkZWZpbmVkIGluIE9wZW5TTEVTX0lJRC5oIGZvciB0aGF0IGludGVyZmFjZS4KKy8vIC0gV2hlbiB1c2VkIGFzIHV1aWQsIGl0IHNob3VsZCBiZSBhIHVuaXF1ZSBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uCit0eXBlZGVmIHN0cnVjdCBlZmZlY3RfdXVpZF9zIHsKKyAgICB1aW50MzJfdCB0aW1lTG93OworICAgIHVpbnQxNl90IHRpbWVNaWQ7CisgICAgdWludDE2X3QgdGltZUhpQW5kVmVyc2lvbjsKKyAgICB1aW50MTZfdCBjbG9ja1NlcTsKKyAgICB1aW50OF90IG5vZGVbNl07Cit9IGVmZmVjdF91dWlkX3Q7CisKKy8vIE5VTEwgVVVJRCBkZWZpbml0aW9uIChtYXRjaGVzIFNMX0lJRF9OVUxMXykKKyNkZWZpbmUgRUZGRUNUX1VVSURfSU5JVElBTElaRVIgeyAweGVjNzE3OGVjLCAweGU1ZTEsIDB4NDQzMiwgMHhhM2Y0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDQ2LCAweDU3LCAweGU2LCAweDc5LCAweDUyLCAweDEwIH0gfQorc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgRUZGRUNUX1VVSURfTlVMTF8gPSBFRkZFQ1RfVVVJRF9JTklUSUFMSVpFUjsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBFRkZFQ1RfVVVJRF9OVUxMID0gJkVGRkVDVF9VVUlEX05VTExfOworY29uc3QgY2hhciAqIGNvbnN0IEVGRkVDVF9VVUlEX05VTExfU1RSID0gImVjNzE3OGVjLWU1ZTEtNDQzMi1hM2Y0LTQ2NTdlNjc5NTIxMCI7CisKKy8vIFRoZSBlZmZlY3QgZGVzY3JpcHRvciBjb250YWlucyBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZmFjaWxpdGF0ZSB0aGUgZW51bWVyYXRpb24gb2YgdGhlIGVmZmVjdAorLy8gZW5naW5lcyBwcmVzZW50IGluIGEgbGlicmFyeS4KK3R5cGVkZWYgc3RydWN0IGVmZmVjdF9kZXNjcmlwdG9yX3MgeworICAgIGVmZmVjdF91dWlkX3QgdHlwZTsgICAgIC8vIFVVSUQgb2YgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7ICAgICAvLyBVVUlEIGZvciB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24KKyAgICB1aW50MTZfdCBhcGlWZXJzaW9uOyAgICAvLyBWZXJzaW9uIG9mIHRoZSBlZmZlY3QgQVBJIGltcGxlbWVudGVkOiBtYXRjaGVzIEVGRkVDVF9BUElfVkVSU0lPTgorICAgIHVpbnQzMl90IGZsYWdzOyAgICAgICAgIC8vIGVmZmVjdCBlbmdpbmUgY2FwYWJpbGl0aWVzL3JlcXVpcmVtZW50cyBmbGFncyAoc2VlIGJlbG93KQorICAgIHVpbnQxNl90IGNwdUxvYWQ7ICAgICAgIC8vIENQVSBsb2FkIGluZGljYXRpb24gKHNlZSBiZWxvdykKKyAgICB1aW50MTZfdCBtZW1vcnlVc2FnZTsgICAvLyBEYXRhIE1lbW9yeSB1c2FnZSAoc2VlIGJlbG93KQorICAgIGNoYXIgICAgbmFtZVtFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBuYW1lCisgICAgY2hhciAgICBpbXBsZW1lbnRvcltFRkZFQ1RfU1RSSU5HX0xFTl9NQVhdOyAgICAvLyBodW1hbiByZWFkYWJsZSBlZmZlY3QgaW1wbGVtZW50b3IgbmFtZQorfSBlZmZlY3RfZGVzY3JpcHRvcl90OworCisvLyBDUFUgbG9hZCBhbmQgbWVtb3J5IHVzYWdlIGluZGljYXRpb246IGVhY2ggZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3QgcHJvdmlkZSBhbiBpbmRpY2F0aW9uIG9mCisvLyBpdHMgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UgZm9yIHRoZSBhdWRpbyBlZmZlY3QgZnJhbWV3b3JrIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgZWZmZWN0cworLy8gaW5zdGFudGlhdGVkIGF0IGEgZ2l2ZW4gdGltZSBvbiBhIGdpdmVuIHBsYXRmb3JtLgorLy8gVGhlIENQVSBsb2FkIGlzIGV4cHJlc3NlZCBpbiAwLjEgTUlQUyB1bml0cyBhcyBlc3RpbWF0ZWQgb24gYW4gQVJNOUUgY29yZSAoQVJNdjVURSkgd2l0aCAwIFdTLgorLy8gVGhlIG1lbW9yeSB1c2FnZSBpcyBleHByZXNzZWQgaW4gS0IgYW5kIGluY2x1ZGVzIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeQorCisvLyBEZWZpbml0aW9ucyBmb3IgZmxhZ3MgZmllbGQgb2YgZWZmZWN0IGRlc2NyaXB0b3IuCisvLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHwgZGVzY3JpcHRpb24gICAgICAgICAgICAgICB8IGJpdHMgICAgICB8IHZhbHVlcworLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IGNvbm5lY3Rpb24gbW9kZSAgICAgICAgICAgfCAwLi4xICAgICAgfCAwIGluc2VydDogYWZ0ZXIgdHJhY2sgcHJvY2VzcworLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgYXV4aWxpYXJ5OiBjb25uZWN0IHRvIHRyYWNrIGF1eGlsaWFyeQorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICBvdXRwdXQgYW5kIHVzZSBzZW5kIGxldmVsCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMiByZXBsYWNlOiByZXBsYWNlcyB0cmFjayBwcm9jZXNzIGZ1bmN0aW9uOworLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgbXVzdCBpbXBsZW1lbnQgU1JDLCB2b2x1bWUgYW5kIG1vbm8gdG8gc3RlcmVvLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcmVzZXJ2ZWQKKy8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgfCBpbnNlcnRpb24gcHJlZmVyZW5jZSAgICAgIHwgMi4uNCAgICAgIHwgMCBub25lCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBmaXJzdCBvZiB0aGUgY2hhaW4KKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIGxhc3Qgb2YgdGhlIGNoYWluCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyBleGNsdXNpdmUgKG9ubHkgZWZmZWN0IGluIHRoZSBpbnNlcnQgY2hhaW4pCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgNC4uNyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IFZvbHVtZSBtYW5hZ2VtZW50ICAgICAgICAgfCA1Li42ICAgICAgfCAwIG5vbmUKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIGltcGxlbWVudHMgdm9sdW1lIGNvbnRyb2wKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAyIHJlcXVpcmVzIHZvbHVtZSBpbmRpY2F0aW9uCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IERldmljZSBpbmRpY2F0aW9uICAgICAgICAgfCA3Li44ICAgICAgfCAwIG5vbmUKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIHJlcXVpcmVzIGRldmljZSB1cGRhdGVzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IFNhbXBsZSBpbnB1dCBtb2RlICAgICAgICAgfCA5Li4xMCAgICAgfCAwIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfQ09ORklHVVJFCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kIHRvIHJlcXVlc3QgaW5wdXQuCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgYm90aDogYm90aCBpbnB1dCBtb2RlcyBhcmUgc3VwcG9ydGVkCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICB8IFNhbXBsZSBvdXRwdXQgbW9kZSAgICAgICAgfCAxMS4uMTIgICAgfCAwIGRpcmVjdDogcHJvY2VzcygpIGZ1bmN0aW9uIG9yIEVGRkVDVF9DTURfQ09ORklHVVJFCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb21tYW5kIG11c3Qgc3BlY2lmeSBhIGJ1ZmZlciBkZXNjcmlwdG9yCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMSBwcm92aWRlcjogcHJvY2VzcygpIGZ1bmN0aW9uIHVzZXMgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJQcm92aWRlciBpbmRpY2F0ZWQgYnkgdGhlCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kIHRvIHJlcXVlc3Qgb3V0cHV0CisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBidWZmZXJzLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgYm90aDogYm90aCBvdXRwdXQgbW9kZXMgYXJlIHN1cHBvcnRlZAorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDMgcmVzZXJ2ZWQKKy8vICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgfCBIYXJkd2FyZSBhY2NlbGVyYXRpb24gICAgIHwgMTMuLjE1ICAgIHwgMCBObyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAxIG5vbiB0dW5uZWxlZCBodyBhY2NlbGVyYXRpb246IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24KKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHJlYWRzIHRoZSBzYW1wbGVzLCBzZW5kIHRoZW0gdG8gSFcgYWNjZWxlcmF0ZWQKKy8vICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIGVmZmVjdCBwcm9jZXNzb3IsIHJlYWRzIGJhY2sgdGhlIHByb2Nlc3NlZCBzYW1wbGVzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBhbmQgcmV0dXJucyB0aGVtIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDIgdHVubmVsZWQgaHcgYWNjZWxlcmF0aW9uOiB0aGUgcHJvY2VzcygpIGZ1bmN0aW9uIGlzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB0cmFuc3BhcmVudC4gVGhlIGVmZmVjdCBpbnRlcmZhY2UgaXMgb25seSB1c2VkIHRvCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBjb250cm9sIHRoZSBlZmZlY3QgZW5naW5lLiBUaGlzIG1vZGUgaXMgcmVsZXZhbnQgZm9yCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICBnbG9iYWwgZWZmZWN0cyBhY3R1YWxseSBhcHBsaWVkIGJ5IHRoZSBhdWRpbworLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgaGFyZHdhcmUgb24gdGhlIG91dHB1dCBzdHJlYW0uCisvLyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIHwgQXVkaW8gTW9kZSBpbmRpY2F0aW9uICAgICB8IDE2Li4xNyAgICB8IDAgbm9uZQorLy8gIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8IDEgcmVxdWlyZXMgYXVkaW8gbW9kZSB1cGRhdGVzCisvLyAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgMi4uMyByZXNlcnZlZAorLy8gICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW5zZXJ0IG1vZGUKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFICAgICAgICAweDAwMDAwMDAyCisKKy8vIEluc2VydCBwcmVmZXJlbmNlCisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLICAgICAgICAgMHgwMDAwMDAxQworI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFICAgIDB4MDAwMDAwMEMKKworCisvLyBWb2x1bWUgY29udHJvbAorI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSyAgICAgICAgIDB4MDAwMDAwNjAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORSAgICAgICAgIDB4MDAwMDAwMDAKKworLy8gRGV2aWNlIGluZGljYXRpb24KKyNkZWZpbmUgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0sgICAgICAgICAweDAwMDAwMTgwCisjZGVmaW5lIEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFRkZFQ1RfRkxBR19ERVZJQ0VfTk9ORSAgICAgICAgIDB4MDAwMDAwMDAKKworLy8gU2FtcGxlIGlucHV0IG1vZGVzCisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX01BU0sgICAgICAgICAgMHgwMDAwMDYwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19JTlBVVF9ESVJFQ1QgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVIgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEVGRkVDVF9GTEFHX0lOUFVUX0JPVEggICAgICAgICAgMHgwMDAwMDQwMAorCisvLyBTYW1wbGUgb3V0cHV0IG1vZGVzCisjZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9NQVNLICAgICAgICAgIDB4MDAwMDE4MDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19PVVRQVVRfUFJPVklERVIgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEVGRkVDVF9GTEFHX09VVFBVVF9CT1RIICAgICAgICAgIDB4MDAwMDEwMDAKKworLy8gSGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1vZGUKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfSFdfQUNDX01BU0sgICAgICAgICAgMHgwMDAwNjAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19IV19BQ0NfU0lNUExFICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwgICAgICAgIDB4MDAwMDQwMDAKKworLy8gQXVkaW8gbW9kZSBpbmRpY2F0aW9uCisjZGVmaW5lIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSyAgICAgIDB4MDAwMTgwMDAKKyNkZWZpbmUgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX05PTkUgICAgICAweDAwMDAwMDAwCisKKy8vIEZvcndhcmQgZGVmaW5pdGlvbiBvZiB0eXBlIGF1ZGlvX2J1ZmZlcl90Cit0eXBlZGVmIHN0cnVjdCBhdWRpb19idWZmZXJfcyBhdWRpb19idWZmZXJfdDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgcHJvY2VzcworLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBFZmZlY3QgcHJvY2VzcyBmdW5jdGlvbi4gVGFrZXMgaW5wdXQgc2FtcGxlcyBhcyBzcGVjaWZpZWQKKy8vICAgICAgICAgIChjb3VudCBhbmQgbG9jYXRpb24pIGluIGlucHV0IGJ1ZmZlciBkZXNjcmlwdG9yIGFuZCBvdXRwdXQgcHJvY2Vzc2VkCisvLyAgICAgICAgICBzYW1wbGVzIGFzIHNwZWNpZmllZCBpbiBvdXRwdXQgYnVmZmVyIGRlc2NyaXB0b3IuIElmIHRoZSBidWZmZXIgZGVzY3JpcHRvcgorLy8gICAgICAgICAgaXMgbm90IHNwZWNpZmllZCB0aGUgZnVuY3Rpb24gbXVzdCB1c2UgZWl0aGVyIHRoZSBidWZmZXIgb3IgdGhlCisvLyAgICAgICAgICBidWZmZXIgcHJvdmlkZXIgZnVuY3Rpb24gaW5zdGFsbGVkIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgorLy8gICAgICAgICAgVGhlIGVmZmVjdCBmcmFtZXdvcmsgd2lsbCBjYWxsIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gYWZ0ZXIgdGhlIEVGRkVDVF9DTURfRU5BQkxFCisvLyAgICAgICAgICBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCB1bnRpbCB0aGUgRUZGRUNUX0NNRF9ESVNBQkxFIGlzIHJlY2VpdmVkLiBXaGVuIHRoZSBlbmdpbmUKKy8vICAgICAgICAgIHJlY2VpdmVzIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgY29tbWFuZCBpdCBzaG91bGQgdHVybiBvZmYgdGhlIGVmZmVjdCBncmFjZWZ1bGx5CisvLyAgICAgICAgICBhbmQgd2hlbiBkb25lIGluZGljYXRlIHRoYXQgaXQgaXMgT0sgdG8gc3RvcCBjYWxsaW5nIHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gYnkKKy8vICAgICAgICAgIHJldHVybmluZyB0aGUgLUVOT0RBVEEgc3RhdHVzLgorLy8KKy8vICAgIE5PVEU6IHRoZSBwcm9jZXNzKCkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlICJyZWFsLXRpbWUgc2FmZSIgdGhhdCBpcworLy8gICAgICBpdCBzaG91bGQgbm90IHBlcmZvcm0gYmxvY2tpbmcgY2FsbHM6IG1hbGxvYy9mcmVlLCBzbGVlcCwgcmVhZC93cml0ZS9vcGVuL2Nsb3NlLAorLy8gICAgICBwdGhyZWFkX2NvbmRfd2FpdC9wdGhyZWFkX211dGV4X2xvY2suLi4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdDogaGFuZGxlIHRvIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRoaXMgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBpcyBjYWxsZWQgb24uCisvLyAgICAgICAgICBpbkJ1ZmZlcjogICBidWZmZXIgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHdoZXJlIHRvIHJlYWQgc2FtcGxlcyB0byBwcm9jZXNzLgorLy8gICAgICAgICAgICAgIElmIE5VTEwsIHVzZSB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZC4KKy8vCisvLyAgICAgICAgICBpbkJ1ZmZlcjogICBidWZmZXIgZGVzY3JpcHRvciBpbmRpY2F0aW5nIHdoZXJlIHRvIHdyaXRlIHByb2Nlc3NlZCBzYW1wbGVzLgorLy8gICAgICAgICAgICAgIElmIE5VTEwsIHVzZSB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYnkgRUZGRUNUX0NNRF9DT05GSUdVUkUgY29tbWFuZC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREFUQSB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCB0aGUgZGlzYWJsZSBwaGFzZSBhbmQgdGhlIGZyYW1ld29yaworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIHN0b3AgY2FsbGluZyBwcm9jZXNzKCkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBpbnB1dC9vdXRwdXQgYnVmZmVyIGRlc2NyaXB0aW9uCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X3Byb2Nlc3NfdCkoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgY29tbWFuZAorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdDogaGFuZGxlIHRvIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRoaXMgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICBpcyBjYWxsZWQgb24uCisvLyAgICAgICAgICBjbWRDb2RlOiAgICBjb21tYW5kIGNvZGU6IHRoZSBjb21tYW5kIGNhbiBiZSBhIHN0YW5kYXJkaXplZCBjb21tYW5kIGRlZmluZWQgaW4KKy8vICAgICAgICAgICAgICBlZmZlY3RfY29tbWFuZF9lIChzZWUgYmVsb3cpIG9yIGEgcHJvcHJpZXRhcnkgY29tbWFuZC4KKy8vICAgICAgICAgIGNtZFNpemU6ICAgIHNpemUgb2YgY29tbWFuZCBpbiBieXRlcworLy8gICAgICAgICAgcENtZERhdGE6ICAgcG9pbnRlciB0byBjb21tYW5kIGRhdGEKKy8vICAgICAgICAgIHBSZXBseURhdGE6IHBvaW50ZXIgdG8gcmVwbHkgZGF0YQorLy8KKy8vICAgIElucHV0L091dHB1dDoKKy8vICAgICAgICAgIHJlcGx5U2l6ZTogbWF4aW11bSBzaXplIG9mIHJlcGx5IGRhdGEgYXMgaW5wdXQKKy8vICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCBzaXplIG9mIHJlcGx5IGRhdGEgYXMgb3V0cHV0CisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgICAgcmV0dXJuZWQgdmFsdWU6IDAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBjb21tYW5kL3JlcGx5IHNpemUgb3IgZm9ybWF0IGFjY29yZGluZyB0byBjb21tYW5kIGNvZGUKKy8vICAgICAgICAgICAgICBUaGUgcmV0dXJuIGNvZGUgc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gaW5kaWNhdGUgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgdGhpcworLy8gICAgICAgICAgICAgIEFQSSBzcGVjaWZpY2F0aW9uLiBTdGF0dXMgcmVsYXRlZCB0byB0aGUgZXhlY3V0aW9uIG9mIGEgcGFydGljdWxhciBjb21tYW5kIHNob3VsZCBiZQorLy8gICAgICAgICAgICAgIGluZGljYXRlZCBhcyBwYXJ0IG9mIHRoZSByZXBseSBmaWVsZC4KKy8vCisvLyAgICAgICAgICAqcFJlcGx5RGF0YSB1cGRhdGVkIHdpdGggY29tbWFuZCByZXNwb25zZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIGludDMyX3QgKCplZmZlY3RfY29tbWFuZF90KShlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisKKworLy8gRWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlIGRlZmluaXRpb24KK3N0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgeworICAgIGVmZmVjdF9wcm9jZXNzX3QgcHJvY2VzczsKKyAgICBlZmZlY3RfY29tbWFuZF90IGNvbW1hbmQ7Cit9OworCisKKy8vCisvLy0tLSBTdGFuZGFyZGl6ZWQgY29tbWFuZCBjb2RlcyBmb3IgY29tbWFuZCgpIGZ1bmN0aW9uCisvLworZW51bSBlZmZlY3RfY29tbWFuZF9lIHsKKyAgIEVGRkVDVF9DTURfSU5JVCwgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgZWZmZWN0IGVuZ2luZQorICAgRUZGRUNUX0NNRF9DT05GSUdVUkUsICAgICAgICAgICAgLy8gY29uZmlndXJlIGVmZmVjdCBlbmdpbmUgKHNlZSBlZmZlY3RfY29uZmlnX3QpCisgICBFRkZFQ1RfQ01EX1JFU0VULCAgICAgICAgICAgICAgICAvLyByZXNldCBlZmZlY3QgZW5naW5lCisgICBFRkZFQ1RfQ01EX0VOQUJMRSwgICAgICAgICAgICAgICAvLyBlbmFibGUgZWZmZWN0IHByb2Nlc3MKKyAgIEVGRkVDVF9DTURfRElTQUJMRSwgICAgICAgICAgICAgIC8vIGRpc2FibGUgZWZmZWN0IHByb2Nlc3MKKyAgIEVGRkVDVF9DTURfU0VUX1BBUkFNLCAgICAgICAgICAgIC8vIHNldCBwYXJhbWV0ZXIgaW1tZWRpYXRlbHkgKHNlZSBlZmZlY3RfcGFyYW1fdCkKKyAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVELCAgIC8vIHNldCBwYXJhbWV0ZXIgZGVmZXJyZWQKKyAgIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwgICAgIC8vIGNvbW1pdCBwcmV2aW91cyBzZXQgcGFyYW1ldGVyIGRlZmVycmVkCisgICBFRkZFQ1RfQ01EX0dFVF9QQVJBTSwgICAgICAgICAgICAvLyBnZXQgcGFyYW1ldGVyCisgICBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UsICAgICAgICAgICAvLyBzZXQgYXVkaW8gZGV2aWNlIChzZWUgYXVkaW9fZGV2aWNlX2UpCisgICBFRkZFQ1RfQ01EX1NFVF9WT0xVTUUsICAgICAgICAgICAvLyBzZXQgdm9sdW1lCisgICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLCAgICAgICAvLyBzZXQgdGhlIGF1ZGlvIG1vZGUgKG5vcm1hbCwgcmluZywgLi4uKQorICAgRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSA9IDB4MTAwMDAgLy8gZmlyc3QgcHJvcHJpZXRhcnkgY29tbWFuZCBjb2RlCit9OworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0lOSVQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIEluaXRpYWxpemUgZWZmZWN0IGVuZ2luZTogQWxsIGNvbmZpZ3VyYXRpb25zIHJldHVybiB0byBkZWZhdWx0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiAwCisvLyAgZGF0YTogTi9BCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogc2l6ZW9mKGludCkKKy8vICBkYXRhOiBzdGF0dXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfQ09ORklHVVJFCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBBcHBseSBuZXcgYXVkaW8gcGFyYW1ldGVycyBjb25maWd1cmF0aW9ucyBmb3IgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQorLy8gIGRhdGE6IGVmZmVjdF9jb25maWdfdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZihpbnQpCisvLyAgZGF0YTogc3RhdHVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX1JFU0VUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBSZXNldCB0aGUgZWZmZWN0IGVuZ2luZS4gS2VlcCBjb25maWd1cmF0aW9uIGJ1dCByZXNldHMgc3RhdGUgYW5kIGJ1ZmZlciBjb250ZW50CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiAwCisvLyAgZGF0YTogTi9BCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9FTkFCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIEVuYWJsZSB0aGUgcHJvY2Vzcy4gQ2FsbGVkIGJ5IHRoZSBmcmFtZXdvcmsgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIHByb2Nlc3MoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29tbWFuZCBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZihpbnQpCisvLyAgZGF0YTogc3RhdHVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0RJU0FCTEUKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIERpc2FibGUgdGhlIHByb2Nlc3MuIENhbGxlZCBieSB0aGUgZnJhbWV3b3JrIGFmdGVyIHRoZSBsYXN0IGNhbGwgdG8gcHJvY2VzcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiAwCisvLyAgZGF0YTogTi9BCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogc2l6ZW9mKGludCkKKy8vICBkYXRhOiBzdGF0dXMKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1BBUkFNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBTZXQgYSBwYXJhbWV0ZXIgYW5kIGFwcGx5IGl0IGltbWVkaWF0ZWx5CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKKy8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJlcGx5IGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoaW50KQorLy8gIGRhdGE6IHN0YXR1cworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRlc2NyaXB0aW9uOgorLy8gIFNldCBhIHBhcmFtZXRlciBidXQgYXBwbHkgaXQgb25seSB3aGVuIHJlY2VpdmluZyBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQgY29tbWFuZAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29tbWFuZCBmb3JtYXQ6CisvLyAgc2l6ZTogc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemUgb2YgcGFyYW0gYW5kIHZhbHVlCisvLyAgZGF0YTogZWZmZWN0X3BhcmFtX3QgKyBwYXJhbSArIHZhbHVlLiBTZWUgZWZmZWN0X3BhcmFtX3QgZGVmaW5pdGlvbiBiZWxvdyBmb3IgdmFsdWUgb2Zmc2V0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBkZXNjcmlwdGlvbjoKKy8vICBBcHBseSBhbGwgcHJldmlvdXNseSByZWNlaXZlZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRCBjb21tYW5kcworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY29tbWFuZCBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZihpbnQpCisvLyAgZGF0YTogc3RhdHVzCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBjb21tYW5kOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgR2V0IGEgcGFyYW1ldGVyIHZhbHVlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbQorLy8gIGRhdGE6IGVmZmVjdF9wYXJhbV90ICsgcGFyYW0KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHJlcGx5IGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZSBvZiBwYXJhbSBhbmQgdmFsdWUKKy8vICBkYXRhOiBlZmZlY3RfcGFyYW1fdCArIHBhcmFtICsgdmFsdWUuIFNlZSBlZmZlY3RfcGFyYW1fdCBkZWZpbml0aW9uIGJlbG93IGZvciB2YWx1ZSBvZmZzZXQKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX0RFVklDRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgU2V0IHRoZSByZW5kZXJpbmcgZGV2aWNlIHRoZSBhdWRpbyBvdXRwdXQgcGF0aCBpcyBjb25uZWN0ZWQgdG8uIFNlZSBhdWRpb19kZXZpY2VfZSBmb3IgZGV2aWNlCisvLyAgdmFsdWVzLgorLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCBmbGFnIGluIGl0cyBkZXNjcmlwdG9yIHRvIHJlY2VpdmUgdGhpcworLy8gIGNvbW1hbmQgd2hlbiB0aGUgZGV2aWNlIGNoYW5nZXMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbW1hbmQgZm9ybWF0OgorLy8gIHNpemU6IHNpemVvZih1aW50MzJfdCkKKy8vICBkYXRhOiBhdWRpb19kZXZpY2VfZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IDAKKy8vICBkYXRhOiBOL0EKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIGNvbW1hbmQ6IEVGRkVDVF9DTURfU0VUX1ZPTFVNRQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgU2V0IGFuZCBnZXQgdm9sdW1lLiBVc2VkIGJ5IGF1ZGlvIGZyYW1ld29yayB0byBkZWxlZ2F0ZSB2b2x1bWUgY29udHJvbCB0byBlZmZlY3QgZW5naW5lLgorLy8gIFRoZSBlZmZlY3QgaW1wbGVtZW50YXRpb24gbXVzdCBzZXQgRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCBvciBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBmbGFnIGluCisvLyAgaXRzIGRlc2NyaXB0b3IgdG8gcmVjZWl2ZSB0aGlzIGNvbW1hbmQgYmVmb3JlIGV2ZXJ5IGNhbGwgdG8gcHJvY2VzcygpIGZ1bmN0aW9uCisvLyAgSWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgZmxhZyBpcyBzZXQgaW4gdGhlIGVmZmVjdCBkZXNjcmlwdG9yLCB0aGUgZWZmZWN0IGVuZ2luZSBtdXN0IHJldHVybgorLy8gIHRoZSB2b2x1bWUgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBiZWZvcmUgdGhlIGVmZmVjdCBpcyBwcm9jZXNzZWQuIFRoZSBvdmVyYWxsIHZvbHVtZSAodGhlIHZvbHVtZQorLy8gIGFjdHVhbGx5IGFwcGxpZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUgbXVsdGlwbGllZCBieSB0aGUgcmV0dXJuZWQgdmFsdWUpIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUKKy8vICBpbmRpY2F0ZWQgaW4gdGhlIGNvbW1hbmQuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBuICogc2l6ZW9mKHVpbnQzMl90KQorLy8gIGRhdGE6IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgorLy8gICAgICA4LjI0IGZpeGVkIHBvaW50IGZvcm1hdAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVwbHkgZm9ybWF0OgorLy8gIHNpemU6IG4gKiBzaXplb2YodWludDMyX3QpIC8gMAorLy8gIGRhdGE6IC0gaWYgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgaXMgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgorLy8gICAgICAgICAgICAgIHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsIGRlZmluZWQgaW4gZWZmZWN0X2NvbmZpZ190IGZvciBvdXRwdXQgYnVmZmVyIGV4cHJlc3NlZCBpbgorLy8gICAgICAgICAgICAgIDguMjQgZml4ZWQgcG9pbnQgZm9ybWF0CisvLyAgICAgICAgLSBpZiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBpcyBub3Qgc2V0IGluIGVmZmVjdCBkZXNjcmlwdG9yOgorLy8gICAgICAgICAgICAgIE4vQQorLy8gIEl0IGlzIGxlZ2FsIHRvIHJlY2VpdmUgYSBudWxsIHBvaW50ZXIgYXMgcFJlcGx5RGF0YSBpbiB3aGljaCBjYXNlIHRoZSBlZmZlY3QgZnJhbWV3b3JrIGhhcworLy8gIGRlbGVnYXRlZCB2b2x1bWUgY29udHJvbCB0byBhbm90aGVyIGVmZmVjdAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgU2V0IHRoZSBhdWRpbyBtb2RlLiBUaGUgZWZmZWN0IGltcGxlbWVudGF0aW9uIG11c3Qgc2V0IEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EIGZsYWcgaW4gaXRzCisvLyAgZGVzY3JpcHRvciB0byByZWNlaXZlIHRoaXMgY29tbWFuZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb21tYW5kIGZvcm1hdDoKKy8vICBzaXplOiBzaXplb2YodWludDMyX3QpCisvLyAgZGF0YTogYXVkaW9fbW9kZV9lCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZXBseSBmb3JtYXQ6CisvLyAgc2l6ZTogMAorLy8gIGRhdGE6IE4vQQorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gY29tbWFuZDogRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZGVzY3JpcHRpb246CisvLyAgQWxsIHByb3ByaWV0YXJ5IGVmZmVjdCBjb21tYW5kcyBtdXN0IHVzZSBjb21tYW5kIGNvZGVzIGFib3ZlIHRoaXMgdmFsdWUuIFRoZSBzaXplIGFuZCBmb3JtYXQgb2YKKy8vICBjb21tYW5kIGFuZCByZXNwb25zZSBmaWVsZHMgaXMgZnJlZSBpbiB0aGlzIGNhc2UKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyBBdWRpbyBidWZmZXIgZGVzY3JpcHRvciB1c2VkIGJ5IHByb2Nlc3MoKSwgYnVmZmVyUHJvdmlkZXIoKSBmdW5jdGlvbnMgYW5kIGJ1ZmZlcl9jb25maWdfdAorLy8gc3RydWN0dXJlLiBNdWx0aS1jaGFubmVsIGF1ZGlvIGlzIGFsd2F5cyBpbnRlcmxlYXZlZC4gVGhlIGNoYW5uZWwgb3JkZXIgaXMgZnJvbSBMU0IgdG8gTVNCIHdpdGgKKy8vIHJlZ2FyZCB0byB0aGUgY2hhbm5lbCBtYXNrIGRlZmluaXRpb24gaW4gYXVkaW9fY2hhbm5lbHNfZSBlLmcgOgorLy8gU3RlcmVvOiBsZWZ0LCByaWdodAorLy8gNSBwb2ludCAxOiBmcm9udCBsZWZ0LCBmcm9udCByaWdodCwgZnJvbnQgY2VudGVyLCBsb3cgZnJlcXVlbmN5LCBiYWNrIGxlZnQsIGJhY2sgcmlnaHQKKy8vIFRoZSBidWZmZXIgc2l6ZSBpcyBleHByZXNzZWQgaW4gZnJhbWUgY291bnQsIGEgZnJhbWUgYmVpbmcgY29tcG9zZWQgb2Ygc2FtcGxlcyBmb3IgYWxsCisvLyBjaGFubmVscyBhdCBhIGdpdmVuIHRpbWUuIEZyYW1lIHNpemUgZm9yIHVuc3BlY2lmaWVkIGZvcm1hdCAoQVVESU9fRk9STUFUX09USEVSKSBpcyA4IGJpdCBieQorLy8gZGVmaW5pdGlvbgorc3RydWN0IGF1ZGlvX2J1ZmZlcl9zIHsKKyAgICBzaXplX3QgICBmcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBidWZmZXIKKyAgICB1bmlvbiB7CisgICAgICAgIHZvaWQqICAgICAgIHJhdzsgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHN0YXJ0IG9mIGJ1ZmZlcgorICAgICAgICBpbnQzMl90KiAgICBzMzI7ICAgICAgICAvLyBwb2ludGVyIHRvIHNpZ25lZCAzMiBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKKyAgICAgICAgaW50MTZfdCogICAgczE2OyAgICAgICAgLy8gcG9pbnRlciB0byBzaWduZWQgMTYgYml0IGRhdGEgYXQgc3RhcnQgb2YgYnVmZmVyCisgICAgICAgIHVpbnQ4X3QqICAgIHU4OyAgICAgICAgIC8vIHBvaW50ZXIgdG8gdW5zaWduZWQgOCBiaXQgZGF0YSBhdCBzdGFydCBvZiBidWZmZXIKKyAgICB9OworfTsKKworLy8gVGhlIGJ1ZmZlcl9wcm92aWRlcl9zIHN0cnVjdHVyZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZAorLy8gYnkgdGhlIGVmZmVjdCBlbmdpbmUgcHJvY2VzcygpIGZ1bmN0aW9uIHRvIHF1ZXJ5IGFuZCByZWxlYXNlIGlucHV0CisvLyBvciBvdXRwdXQgYXVkaW8gYnVmZmVyLgorLy8gVGhlIGdldEJ1ZmZlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZXRyaWV2ZSBhIGJ1ZmZlciB3aGVyZSBkYXRhCisvLyBzaG91bGQgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYnkgcHJvY2VzcygpIGZ1bmN0aW9uLgorLy8gVGhlIHJlbGVhc2VCdWZmZXIoKSBmdW5jdGlvbiBNVVNUIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgcmV0cmlldmVkCisvLyB3aXRoIGdldEJ1ZmZlcigpIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KKy8vIFRoZSBwcm9jZXNzIGZ1bmN0aW9uIHNob3VsZCB1c2UgdGhlIGJ1ZmZlciBwcm92aWRlciBtZWNoYW5pc20gdG8gcmV0cmlldmUKKy8vIGlucHV0IG9yIG91dHB1dCBidWZmZXIgaWYgdGhlIGluQnVmZmVyIG9yIG91dEJ1ZmZlciBwYXNzZWQgYXMgYXJndW1lbnQgaXMgTlVMTAorLy8gYW5kIHRoZSBidWZmZXIgY29uZmlndXJhdGlvbiAoYnVmZmVyX2NvbmZpZ190KSBnaXZlbiBieSB0aGUgRUZGRUNUX0NNRF9DT05GSUdVUkUKKy8vIGNvbW1hbmQgZGlkIG5vdCBzcGVjaWZ5IGFuIGF1ZGlvIGJ1ZmZlci4KKwordHlwZWRlZiBpbnQzMl90ICgqIGJ1ZmZlcl9mdW5jdGlvbl90KSh2b2lkICpjb29raWUsIGF1ZGlvX2J1ZmZlcl90ICpidWZmZXIpOworCit0eXBlZGVmIHN0cnVjdCBidWZmZXJfcHJvdmlkZXJfcyB7CisgICAgYnVmZmVyX2Z1bmN0aW9uX3QgZ2V0QnVmZmVyOyAgICAgICAvLyByZXRyaWV2ZSBuZXh0IGJ1ZmZlcgorICAgIGJ1ZmZlcl9mdW5jdGlvbl90IHJlbGVhc2VCdWZmZXI7ICAgLy8gcmVsZWFzZSB1c2VkIGJ1ZmZlcgorICAgIHZvaWQgICAgICAgKmNvb2tpZTsgICAgICAgICAgICAgICAgLy8gZm9yIHVzZSBieSBjbGllbnQgb2YgYnVmZmVyIHByb3ZpZGVyIGZ1bmN0aW9ucworfSBidWZmZXJfcHJvdmlkZXJfdDsKKworCisvLyBUaGUgYnVmZmVyX2NvbmZpZ19zIHN0cnVjdHVyZSBzcGVjaWZpZXMgdGhlIGlucHV0IG9yIG91dHB1dCBhdWRpbyBmb3JtYXQKKy8vIHRvIGJlIHVzZWQgYnkgdGhlIGVmZmVjdCBlbmdpbmUuIEl0IGlzIHBhcnQgb2YgdGhlIGVmZmVjdF9jb25maWdfdAorLy8gc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIGNvbmZpZ3VyYXRpb25zIGFuZCBpcworLy8gcGFzc2VkIGJ5IHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kLgordHlwZWRlZiBzdHJ1Y3QgYnVmZmVyX2NvbmZpZ19zIHsKKyAgICBhdWRpb19idWZmZXJfdCAgYnVmZmVyOyAgICAgLy8gYnVmZmVyIGZvciB1c2UgYnkgcHJvY2VzcygpIGZ1bmN0aW9uIGlmIG5vdCBwYXNzZWQgZXhwbGljaXRseQorICAgIHVpbnQzMl90ICAgc2FtcGxpbmdSYXRlOyAgICAvLyBzYW1wbGluZyByYXRlCisgICAgdWludDMyX3QgICBjaGFubmVsczsgICAgICAgIC8vIGNoYW5uZWwgbWFzayAoc2VlIGF1ZGlvX2NoYW5uZWxzX2UpCisgICAgYnVmZmVyX3Byb3ZpZGVyX3QgYnVmZmVyUHJvdmlkZXI7ICAgLy8gYnVmZmVyIHByb3ZpZGVyCisgICAgdWludDhfdCAgICBmb3JtYXQ7ICAgICAgICAgIC8vIEF1ZGlvIGZvcm1hdCAgKHNlZSBhdWRpb19mb3JtYXRfZSkKKyAgICB1aW50OF90ICAgIGFjY2Vzc01vZGU7ICAgICAgLy8gcmVhZC93cml0ZSBvciBhY2N1bXVsYXRlIGluIGJ1ZmZlciAoZWZmZWN0X2J1ZmZlcl9hY2Nlc3NfZSkKKyAgICB1aW50MTZfdCAgIG1hc2s7ICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHdoaWNoIG9mIHRoZSBhYm92ZSBmaWVsZHMgaXMgdmFsaWQKK30gYnVmZmVyX2NvbmZpZ190OworCisvLyBTYW1wbGUgZm9ybWF0CitlbnVtIGF1ZGlvX2Zvcm1hdF9lIHsKKyAgICBTQU1QTEVfRk9STUFUX1BDTV9TMTUsICAgLy8gUENNIHNpZ25lZCAxNiBiaXRzCisgICAgU0FNUExFX0ZPUk1BVF9QQ01fVTgsICAgIC8vIFBDTSB1bnNpZ25lZCA4IGJpdHMKKyAgICBTQU1QTEVfRk9STUFUX1BDTV9TN18yNCwgLy8gUENNIHNpZ25lZCA3LjI0IGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uCisgICAgU0FNUExFX0ZPUk1BVF9PVEhFUiAgICAgIC8vIG90aGVyIGZvcm1hdCAoZS5nLiBjb21wcmVzc2VkKQorfTsKKworLy8gQ2hhbm5lbCBtYXNrCitlbnVtIGF1ZGlvX2NoYW5uZWxzX2UgeworICAgIENIQU5ORUxfRlJPTlRfTEVGVCA9IDB4MSwgICAgICAgICAgICAgICAgICAgLy8gZnJvbnQgbGVmdCBjaGFubmVsCisgICAgQ0hBTk5FTF9GUk9OVF9SSUdIVCA9IDB4MiwgICAgICAgICAgICAgICAgICAvLyBmcm9udCByaWdodCBjaGFubmVsCisgICAgQ0hBTk5FTF9GUk9OVF9DRU5URVIgPSAweDQsICAgICAgICAgICAgICAgIC8vIGZyb250IGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9MT1dfRlJFUVVFTkNZID0gMHg4LCAgICAgICAgICAgICAgIC8vIGxvdyBmcmVxdWVuY3kgY2hhbm5lbAorICAgIENIQU5ORUxfQkFDS19MRUZUID0gMHgxMCwgICAgICAgICAgICAgICAgICAgLy8gYmFjayBsZWZ0IGNoYW5uZWwKKyAgICBDSEFOTkVMX0JBQ0tfUklHSFQgPSAweDIwLCAgICAgICAgICAgICAgICAgIC8vIGJhY2sgcmlnaHQgY2hhbm5lbAorICAgIENIQU5ORUxfRlJPTlRfTEVGVF9PRl9DRU5URVIgPSAweDQwLCAgICAgICAvLyBmcm9udCBsZWZ0IG9mIGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwLCAgICAgIC8vIGZyb250IHJpZ2h0IG9mIGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9CQUNLX0NFTlRFUiA9IDB4MTAwLCAgICAgICAgICAgICAgICAvLyBiYWNrIGNlbnRlciBjaGFubmVsCisgICAgQ0hBTk5FTF9NT05PID0gQ0hBTk5FTF9GUk9OVF9MRUZULAorICAgIENIQU5ORUxfU1RFUkVPID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQpLAorICAgIENIQU5ORUxfUVVBRCA9IChDSEFOTkVMX0ZST05UX0xFRlQgfCBDSEFOTkVMX0ZST05UX1JJR0hUIHwKKyAgICAgICAgICAgIENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUKSwKKyAgICBDSEFOTkVMX1NVUlJPVU5EID0gKENIQU5ORUxfRlJPTlRfTEVGVCB8IENIQU5ORUxfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgQ0hBTk5FTF9GUk9OVF9DRU5URVIgfCBDSEFOTkVMX0JBQ0tfQ0VOVEVSKSwKKyAgICBDSEFOTkVMXzVQT0lOVDEgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8IENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUKSwKKyAgICBDSEFOTkVMXzdQT0lOVDEgPSAoQ0hBTk5FTF9GUk9OVF9MRUZUIHwgQ0hBTk5FTF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICBDSEFOTkVMX0ZST05UX0NFTlRFUiB8IENIQU5ORUxfTE9XX0ZSRVFVRU5DWSB8IENIQU5ORUxfQkFDS19MRUZUIHwgQ0hBTk5FTF9CQUNLX1JJR0hUIHwKKyAgICAgICAgICAgIENIQU5ORUxfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBDSEFOTkVMX0ZST05UX1JJR0hUX09GX0NFTlRFUiksCit9OworCisvLyBSZW5kZXIgZGV2aWNlCitlbnVtIGF1ZGlvX2RldmljZV9lIHsKKyAgICBERVZJQ0VfRUFSUElFQ0UgPSAweDEsICAgICAgICAgICAgICAgICAgICAgIC8vIGVhcnBpZWNlCisgICAgREVWSUNFX1NQRUFLRVIgPSAweDIsICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVha2VyCisgICAgREVWSUNFX1dJUkVEX0hFQURTRVQgPSAweDQsICAgICAgICAgICAgICAgICAvLyB3aXJlZCBoZWFkc2V0LCB3aXRoIG1pY3JvcGhvbmUKKyAgICBERVZJQ0VfV0lSRURfSEVBRFBIT05FID0gMHg4LCAgICAgICAgICAgICAgIC8vIHdpcmVkIGhlYWRwaG9uZSwgd2l0aG91dCBtaWNyb3Bob25lCisgICAgREVWSUNFX0JMVUVUT09USF9TQ08gPSAweDEwLCAgICAgICAgICAgICAgICAvLyBnZW5lcmljIGJsdWV0b290aCBTQ08KKyAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19IRUFEU0VUID0gMHgyMCwgICAgICAgIC8vIGJsdWV0b290aCBTQ08gaGVhZHNldAorICAgIERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCA9IDB4NDAsICAgICAgICAgLy8gYmx1ZXRvb3RoIFNDTyBjYXIga2l0CisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQID0gMHg4MCwgICAgICAgICAgICAgICAvLyBnZW5lcmljIGJsdWV0b290aCBBMkRQCisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMCwgICAvLyBibHVldG9vdGggQTJEUCBoZWFkcGhvbmVzCisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMCwgICAgICAvLyBibHVldG9vdGggQTJEUCBzcGVha2VycworICAgIERFVklDRV9BVVhfRElHSVRBTCA9IDB4NDAwLCAgICAgICAgICAgICAgICAgLy8gZGlnaXRhbCBvdXRwdXQKKyAgICBERVZJQ0VfRVhURVJOQUxfU1BFQUtFUiA9IDB4ODAwICAgICAgICAgICAgIC8vIGV4dGVybmFsIHNwZWFrZXIgKHN0ZXJlbyBhbmQgSGlnaCBxdWFsaXR5KQorfTsKKworLy8gQXVkaW8gbW9kZQorZW51bSBhdWRpb19tb2RlX2UgeworICAgIEFVRElPX01PREVfTk9STUFMLCAgICAgIC8vIHBob25lIGlkbGUKKyAgICBBVURJT19NT0RFX1JJTkdUT05FLCAgICAvLyBwaG9uZSByaW5naW5nCisgICAgQVVESU9fTU9ERV9JTl9DQUxMICAgICAgLy8gcGhvbmUgY2FsbCBjb25uZWN0ZWQKK307CisKKy8vIFZhbHVlcyBmb3IgImFjY2Vzc01vZGUiIGZpZWxkIG9mIGJ1ZmZlcl9jb25maWdfdDoKKy8vICAgb3ZlcndyaXRlLCByZWFkIG9ubHksIGFjY3VtdWxhdGUgKHJlYWQvbW9kaWZ5L3dyaXRlKQorZW51bSBlZmZlY3RfYnVmZmVyX2FjY2Vzc19lIHsKKyAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSwKKyAgICBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFELAorICAgIEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUKKworfTsKKworLy8gVmFsdWVzIGZvciBiaXQgZmllbGQgIm1hc2siIGluIGJ1ZmZlcl9jb25maWdfdC4gSWYgYSBiaXQgaXMgc2V0LCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZAorLy8gaW4gYnVmZmVyX2NvbmZpZ190IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZXhlY3V0aW5nIHRoZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBjb21tYW5kCisjZGVmaW5lIEVGRkVDVF9DT05GSUdfQlVGRkVSICAgIDB4MDAwMSAgLy8gYnVmZmVyIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisjZGVmaW5lIEVGRkVDVF9DT05GSUdfU01QX1JBVEUgIDB4MDAwMiAgLy8gc2FtcGxpbmdSYXRlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisjZGVmaW5lIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgIDB4MDAwNCAgLy8gY2hhbm5lbHMgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyNkZWZpbmUgRUZGRUNUX0NPTkZJR19GT1JNQVQgICAgMHgwMDA4ICAvLyBmb3JtYXQgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyNkZWZpbmUgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERSAgMHgwMDEwICAvLyBhY2Nlc3NNb2RlIGZpZWxkIG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisjZGVmaW5lIEVGRkVDVF9DT05GSUdfUFJPVklERVIgIDB4MDAyMCAgLy8gYnVmZmVyUHJvdmlkZXIgZmllbGQgbXVzdCBiZSB0YWtlbiBpbnRvIGFjY291bnQKKyNkZWZpbmUgRUZGRUNUX0NPTkZJR19BTEwgKEVGRkVDVF9DT05GSUdfQlVGRkVSIHwgRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfQUNDX01PREUgfCBFRkZFQ1RfQ09ORklHX1BST1ZJREVSKQorCisKKy8vIGVmZmVjdF9jb25maWdfcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfQ09ORklHVVJFCisvLyBjb21tYW5kIHRvIGNvbmZpZ3VyZSBhdWRpbyBwYXJhbWV0ZXJzIGFuZCBidWZmZXJzIGZvciBlZmZlY3QgZW5naW5lIGlucHV0IGFuZCBvdXRwdXQuCit0eXBlZGVmIHN0cnVjdCBlZmZlY3RfY29uZmlnX3MgeworICAgIGJ1ZmZlcl9jb25maWdfdCAgIGlucHV0Q2ZnOworICAgIGJ1ZmZlcl9jb25maWdfdCAgIG91dHB1dENmZzs7Cit9IGVmZmVjdF9jb25maWdfdDsKKworCisvLyBlZmZlY3RfcGFyYW1fcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgdGhlIHBDbWREYXRhIGFyZ3VtZW50IG9mIEVGRkVDVF9DTURfU0VUX1BBUkFNCisvLyBjb21tYW5kIGFuZCBwQ21kRGF0YSBhbmQgcFJlcGx5RGF0YSBvZiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBjb21tYW5kLgorLy8gcHNpemUgYW5kIHZzaXplIHJlcHJlc2VudCB0aGUgYWN0dWFsIHNpemUgb2YgcGFyYW1ldGVyIGFuZCB2YWx1ZS4KKy8vCisvLyBOT1RFOiB0aGUgc3RhcnQgb2YgdmFsdWUgZmllbGQgaW5zaWRlIHRoZSBkYXRhIGZpZWxkIGlzIGFsd2F5cyBvbiBhIDMyIGJpdCBib3VuZGFyeToKKy8vCisvLyAgKy0tLS0tLS0tLS0tKworLy8gIHwgc3RhdHVzICAgIHwgc2l6ZW9mKGludCkKKy8vICArLS0tLS0tLS0tLS0rCisvLyAgfCBwc2l6ZSAgICAgfCBzaXplb2YoaW50KQorLy8gICstLS0tLS0tLS0tLSsKKy8vICB8IHZzaXplICAgICB8IHNpemVvZihpbnQpCisvLyAgKy0tLS0tLS0tLS0tKworLy8gIHwgICAgICAgICAgIHwgICB8ICAgICAgICAgICB8CisvLyAgfiBwYXJhbWV0ZXIgfiAgID4gcHNpemUgICAgIHwKKy8vICB8ICAgICAgICAgICB8ICAgfCAgICAgICAgICAgPiAgKChwc2l6ZSAtIDEpL3NpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KQorLy8gICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgICB8CisvLyAgfCBwYWRkaW5nICAgfCAgICAgICAgICAgICAgIHwKKy8vICArLS0tLS0tLS0tLS0rCisvLyAgfCAgICAgICAgICAgfCAgIHwKKy8vICB+IHZhbHVlICAgICB+ICAgPiB2c2l6ZQorLy8gIHwgICAgICAgICAgIHwgICB8CisvLyAgKy0tLS0tLS0tLS0tKworCit0eXBlZGVmIHN0cnVjdCBlZmZlY3RfcGFyYW1fcyB7CisgICAgaW50MzJfdCAgICAgc3RhdHVzOyAgICAgLy8gVHJhbnNhY3Rpb24gc3RhdHVzICh1bnVzZWQgZm9yIGNvbW1hbmQsIHVzZWQgZm9yIHJlcGx5KQorICAgIHVpbnQzMl90ICAgIHBzaXplOyAgICAgIC8vIFBhcmFtZXRlciBzaXplCisgICAgdWludDMyX3QgICAgdnNpemU7ICAgICAgLy8gVmFsdWUgc2l6ZQorICAgIGNoYXIgICAgICAgIGRhdGFbXTsgICAgIC8vIFN0YXJ0IG9mIFBhcmFtZXRlciArIFZhbHVlIGRhdGEKK30gZWZmZWN0X3BhcmFtX3Q7CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgbGlicmFyeSBpbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gQW4gZWZmZWN0IGxpYnJhcnkgaXMgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGFuZCBleHBvc2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMKKy8vIHRvIGVuYWJsZSBlZmZlY3QgZW51bWVyYXRpb24gYW5kIGluc3RhbnRpYXRpb24uIFRoZSBuYW1lIG9mIHRoZXNlIGZ1bmN0aW9ucyBtdXN0IGJlIGFzCisvLyBzcGVjaWZpZWQgaGVyZSBhcyB0aGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGdldCB0aGUgZnVuY3Rpb24gYWRkcmVzcyB3aXRoIGRsc3ltKCk6CisvLworLy8gLSBlZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzOworLy8gLSBlZmZlY3RfUXVlcnlFZmZlY3RfdCBFZmZlY3RRdWVyeUVmZmVjdDsKKy8vIC0gZWZmZWN0X0NyZWF0ZUVmZmVjdF90IEVmZmVjdENyZWF0ZTsKKy8vIC0gZWZmZWN0X1JlbGVhc2VFZmZlY3RfdCBFZmZlY3RSZWxlYXNlOworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cworLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgZXhwb3NlZCBieSB0aGUKKy8vICAgICAgICAgIGxpYnJhcnkuIEVhY2ggZWZmZWN0IG11c3QgaGF2ZSBhIHVuaXF1ZSBlZmZlY3QgdXVpZCAoc2VlCisvLyAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KS4gVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5RWZmZWN0KCkKKy8vICAgICAgICAgIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzIHByZXNlbnQgaW4gdGhlIGxpYnJhcnkuCisvLworLy8gICAgSW5wdXQvT3V0cHV0OgorLy8gICAgICAgICAgcE51bUVmZmVjdHM6ICAgIGFkZHJlc3Mgd2hlcmUgdGhlIG51bWJlciBvZiBlZmZlY3RzIHNob3VsZCBiZSByZXR1cm5lZC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcE51bUVmZmVjdHMKKy8vICAgICAgICAqcE51bUVmZmVjdHM6ICAgICB1cGRhdGVkIHdpdGggbnVtYmVyIG9mIGVmZmVjdHMgaW4gbGlicmFyeQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIGludDMyX3QgKCplZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QpKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0CisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIFJldHVybnMgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGVmZmVjdCBlbmdpbmUgd2hpY2ggaW5kZXggaXMKKy8vICAgICAgICAgIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgorLy8gICAgICAgICAgU2VlIGVmZmVjdF9kZXNjcmlwdG9yX3QgZm9yIGRldGFpbHMgb24gZWZmZWN0IGRlc2NyaXB0b3JzLgorLy8gICAgICAgICAgVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbAorLy8gICAgICAgICAgZWZmZWN0cyBwcmVzZW50IGluIHRoZSBsaWJyYXJ5LiBUaGUgZW51bWVyYXRpb24gc2VxdWVuY2UgaXM6CisvLyAgICAgICAgICAgICAgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCZudW1fZWZmZWN0cyk7CisvLyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9lZmZlY3RzOyBpKyspCisvLyAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5RWZmZWN0KGksLi4uKTsKKy8vCisvLyAgICBJbnB1dC9PdXRwdXQ6CisvLyAgICAgICAgICBpbmRleDogICAgICAgICAgaW5kZXggb2YgdGhlIGVmZmVjdAorLy8gICAgICAgICAgcERlc2NyaXB0b3I6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcERlc2NyaXB0b3Igb3IgaW5kZXgKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PU1lTICAgICBlZmZlY3QgbGlzdCBoYXMgY2hhbmdlZCBzaW5jZSBsYXN0IGV4ZWN1dGlvbiBvZgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gbW9yZSBlZmZlY3QgYXZhaWxhYmxlCisvLyAgICAgICAgKnBEZXNjcmlwdG9yOiAgICAgdXBkYXRlZCB3aXRoIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordHlwZWRlZiBpbnQzMl90ICgqZWZmZWN0X1F1ZXJ5RWZmZWN0X3QpKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHJldHVybnMgYW4KKy8vICAgICAgICAgIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBvbiB0aGlzIGVuZ2luZS4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlCisvLyAgICAgICAgICByZXNvdXJjZXMgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZWZmZWN0IGVuZ2luZSBhbmQgcmV0dXJuCisvLyAgICAgICAgICBhIGhhbmRsZSBvbiB0aGUgZWZmZWN0IGNvbnRyb2wgaW50ZXJmYWNlLgorLy8KKy8vICAgIElucHV0OgorLy8gICAgICAgICAgdXVpZDogICAgcG9pbnRlciB0byB0aGUgZWZmZWN0IHV1aWQuCisvLyAgICAgICAgICBzZXNzaW9uSWQ6ICBhdWRpbyBzZXNzaW9uIHRvIHdoaWNoIHRoaXMgZWZmZWN0IGluc3RhbmNlIHdpbGwgYmUgYXR0YWNoZWQuIEFsbCBlZmZlY3RzCisvLyAgICAgICAgICAgICAgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgYXJlIGNvbm5lY3RlZCBpbiBzZXJpZXMgYW5kIHByb2Nlc3MgdGhlIHNhbWUgc2lnbmFsCisvLyAgICAgICAgICAgICAgc3RyZWFtLiBLbm93aW5nIHRoYXQgdHdvIGVmZmVjdHMgYXJlIHBhcnQgb2YgdGhlIHNhbWUgZWZmZWN0IGNoYWluIGNhbiBoZWxwIHRoZQorLy8gICAgICAgICAgICAgIGxpYnJhcnkgaW1wbGVtZW50IHNvbWUga2luZCBvZiBvcHRpbWl6YXRpb25zLgorLy8gICAgICAgICAgaW9JZDogICBpZGVudGlmaWVzIHRoZSBvdXRwdXQgb3IgaW5wdXQgc3RyZWFtIHRoaXMgZWZmZWN0IGlzIGRpcmVjdGVkIHRvIGF0IGF1ZGlvIEhBTC4KKy8vICAgICAgICAgICAgICBGb3IgZnV0dXJlIHVzZSBlc3BlY2lhbGx5IHdpdGggdHVubmVsZWQgSFcgYWNjZWxlcmF0ZWQgZWZmZWN0cworLy8KKy8vICAgIElucHV0L091dHB1dDoKKy8vICAgICAgICAgIHBJbnRlcmZhY2U6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgaW50ZXJmYWNlLgorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBwRWZmZWN0VXVpZCBvciBwSW50ZXJmYWNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0VOVCAgICAgbm8gZWZmZWN0IHdpdGggdGhpcyB1dWlkIGZvdW5kCisvLyAgICAgICAgKnBJbnRlcmZhY2U6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBpbnRlcmZhY2UgaGFuZGxlLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit0eXBlZGVmIGludDMyX3QgKCplZmZlY3RfQ3JlYXRlRWZmZWN0X3QpKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdFJlbGVhc2UKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgUmVsZWFzZXMgdGhlIGVmZmVjdCBlbmdpbmUgd2hvc2UgaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgorLy8gICAgICAgICAgQWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBlZmZlY3QgYXJlCisvLyAgICAgICAgICByZWxlYXNlZC4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlIG9uIHRoZSBlZmZlY3QgaW50ZXJmYWNlIHRvIGJlIHJlbGVhc2VkLgorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBpbnRlcmZhY2UgaGFuZGxlCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3R5cGVkZWYgaW50MzJfdCAoKmVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpOworCisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmOGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QmFzc0Jvb3N0QXBpLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNMX0VTX0hfCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfQkFTU0JPT1NUXyA9IHsgMHgwNjM0ZjIyMCwgMHhkZGQ0LCAweDExZGIsIDB4YTBmYywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfQkFTU0JPT1NUID0gJlNMX0lJRF9CQVNTQk9PU1RfOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKKy8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBCYXNzQm9vc3QgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVELAorICAgIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSAorfSB0X2Jhc3Nib29zdF9wYXJhbXM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RCQVNTQk9PU1RBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmggYi9pbmNsdWRlL21lZGlhL0VmZmVjdEVudmlyb25tZW50YWxSZXZlcmJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFjY2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RFTlZJUk9OTUVOVEFMUkVWRVJCQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU0xfRVNfSF8KK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXyA9IHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDYsIDB4ODMsIDB4OWUgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCID0gJlNMX0lJRF9FTlZJUk9OTUVOVEFMUkVWRVJCXzsKKyNlbmRpZiAvL09QRU5TTF9FU19IXworCisvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgZW52aXJvbm1lbnRhbCByZXZlcmIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvLyBQYXJhbWV0ZXJzIGJlbG93IGFyZSBhcyBkZWZpbmVkIGluIE9wZW5TTCBFUyBzcGVjaWZpY2F0aW9uIGZvciBlbnZpcm9ubWVudGFsIHJldmVyYiBpbnRlcmZhY2UKKyAgICBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCwgICAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC00MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSwgICAgICAgICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDEwMCB0byAyMDAwMAorICAgIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgICAgICAgIC8vIGluIHBlcm1pbGxlcywgICAgcmFuZ2UgMTAwIHRvIDEwMDAKKyAgICBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVksICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDAgdG8gNjUKKyAgICBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMLCAgICAgICAgICAvLyBpbiBtaWxsaWJlbHMsICAgIHJhbmdlIC02MDAwIHRvIDAKKyAgICBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZLCAgICAgICAgICAvLyBpbiBtaWxsaXNlY29uZHMsIHJhbmdlIDAgdG8gNjUKKyAgICBSRVZFUkJfUEFSQU1fRElGRlVTSU9OLCAgICAgICAgICAgICAvLyBpbiBwZXJtaWxsZXMsICAgIHJhbmdlIDAgdG8gMTAwMAorICAgIFJFVkVSQl9QQVJBTV9ERU5TSVRZLCAgICAgICAgICAgICAgIC8vIGluIHBlcm1pbGxlcywgICAgcmFuZ2UgMCB0byAxMDAwCisgICAgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMsCisgICAgUkVWRVJCX1BBUkFNX0JZUEFTUworfSB0X2Vudl9yZXZlcmJfcGFyYW1zOworCisvL3RfcmV2ZXJiX3NldHRpbmdzIGlzIGVxdWFsIHRvIFNMRW52aXJvbm1lbnRhbFJldmVyYlNldHRpbmdzIGRlZmluZWQgaW4gT3BlblNMIEVTIHNwZWNpZmljYXRpb24uCit0eXBlZGVmIHN0cnVjdCBzX3JldmVyYl9zZXR0aW5ncyB7CisgICAgaW50MTZfdCAgICAgcm9vbUxldmVsOworICAgIGludDE2X3QgICAgIHJvb21IRkxldmVsOworICAgIHVpbnQzMl90ICAgIGRlY2F5VGltZTsKKyAgICBpbnQxNl90ICAgICBkZWNheUhGUmF0aW87CisgICAgaW50MTZfdCAgICAgcmVmbGVjdGlvbnNMZXZlbDsKKyAgICB1aW50MzJfdCAgICByZWZsZWN0aW9uc0RlbGF5OworICAgIGludDE2X3QgICAgIHJldmVyYkxldmVsOworICAgIHVpbnQzMl90ICAgIHJldmVyYkRlbGF5OworICAgIGludDE2X3QgICAgIGRpZmZ1c2lvbjsKKyAgICBpbnQxNl90ICAgICBkZW5zaXR5OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB0X3JldmVyYl9zZXR0aW5nczsKKworCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNURU5WSVJPTk1FTlRBTFJFVkVSQkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkyZWEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVEVRVUFMSVpFUkFQSV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVEVRVUFMSVpFUkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZm5kZWYgT1BFTlNMX0VTX0hfCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfRVFVQUxJWkVSXyA9IHsgMHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfRVFVQUxJWkVSID0gJlNMX0lJRF9FUVVBTElaRVJfOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXJzIGZvciBFcXVhbGl6ZXIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBFUV9QQVJBTV9OVU1fQkFORFMsICAgICAgICAgICAgIC8vIEdldHMgdGhlIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZHMgdGhhdCB0aGUgZXF1YWxpemVyIHN1cHBvcnRzLgorICAgIEVRX1BBUkFNX0xFVkVMX1JBTkdFLCAgICAgICAgICAgLy8gUmV0dXJucyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBiYW5kIGxldmVscyBzdXBwb3J0ZWQuCisgICAgRVFfUEFSQU1fQkFORF9MRVZFTCwgICAgICAgICAgICAvLyBHZXRzL1NldHMgdGhlIGdhaW4gc2V0IGZvciB0aGUgZ2l2ZW4gZXF1YWxpemVyIGJhbmQuCisgICAgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEsICAgICAgICAgICAvLyBHZXRzIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBnaXZlbiBiYW5kLgorICAgIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSwgICAgICAgLy8gR2V0cyB0aGUgZnJlcXVlbmN5IHJhbmdlIG9mIHRoZSBnaXZlbiBmcmVxdWVuY3kgYmFuZC4KKyAgICBFUV9QQVJBTV9HRVRfQkFORCwgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGJhbmQgdGhhdCBoYXMgdGhlIG1vc3QgZWZmZWN0IG9uIHRoZSBnaXZlbiBmcmVxdWVuY3kuCisgICAgRVFfUEFSQU1fQ1VSX1BSRVNFVCwgICAgICAgICAgICAvLyBHZXRzL1NldHMgdGhlIGN1cnJlbnQgcHJlc2V0LgorICAgIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUywgICAgLy8gR2V0cyB0aGUgdG90YWwgbnVtYmVyIG9mIHByZXNldHMgdGhlIGVxdWFsaXplciBzdXBwb3J0cy4KKyAgICBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUsICAgICAgIC8vIEdldHMgdGhlIHByZXNldCBuYW1lIGJhc2VkIG9uIHRoZSBpbmRleC4KKyAgICBFUV9QQVJBTV9QUk9QRVJUSUVTICAgICAgICAgICAgIC8vIEdldHMvU2V0cyBhbGwgcGFyYW1ldGVycyBhdCBhIHRpbWUuCit9IHRfZXF1YWxpemVyX3BhcmFtczsKKworLy90X2VxdWFsaXplcl9zZXR0aW5ncyBncm91cHMgYWxsIGN1cnJlbnQgZXF1YWxpemVyIHNldHRpbmcgZm9yIGJhY2t1cCBhbmQgcmVzdG9yZS4KK3R5cGVkZWYgc3RydWN0IHNfZXF1YWxpemVyX3NldHRpbmdzIHsKKyAgICB1aW50MTZfdCBjdXJQcmVzZXQ7CisgICAgdWludDE2X3QgbnVtQmFuZHM7CisgICAgdWludDE2X3QgYmFuZExldmVsc1tdOworfSB0X2VxdWFsaXplcl9zZXR0aW5nczsKKworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVEVRVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2YwOTRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RQcmVzZXRSZXZlcmJBcGkuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFBSRVNFVFJFVkVSQkFQSV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFBSRVNFVFJFVkVSQkFQSV9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU0xfRVNfSF8KK3N0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9QUkVTRVRSRVZFUkJfID0geyAweDQ3MzgyZDYwLCAweGRkZDgsIDB4MTFkYiwgMHhiZjNhLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OworY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9QUkVTRVRSRVZFUkIgPSAmU0xfSUlEX1BSRVNFVFJFVkVSQl87CisjZW5kaWYgLy9PUEVOU0xfRVNfSF8KKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIHByZXNldCByZXZlcmIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBSRVZFUkJfUEFSQU1fUFJFU0VUCit9IHRfcHJlc2V0X3JldmVyYl9wYXJhbXM7CisKKwordHlwZWRlZiBlbnVtCit7CisgICAgUkVWRVJCX1BSRVNFVF9OT05FLAorICAgIFJFVkVSQl9QUkVTRVRfU01BTExST09NLAorICAgIFJFVkVSQl9QUkVTRVRfTUVESVVNUk9PTSwKKyAgICBSRVZFUkJfUFJFU0VUX0xBUkdFUk9PTSwKKyAgICBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwsCisgICAgUkVWRVJCX1BSRVNFVF9MQVJHRUhBTEwsCisgICAgUkVWRVJCX1BSRVNFVF9QTEFURSwKKyAgICBSRVZFUkJfUFJFU0VUX0xBU1QgPSBSRVZFUkJfUFJFU0VUX1BMQVRFCit9IHRfcmV2ZXJiX3ByZXNldHM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RQUkVTRVRSRVZFUkJBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDUxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpcnR1YWxpemVyQXBpLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFZJUlRVQUxJWkVSQVBJX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TTF9FU19IXworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZJUlRVQUxJWkVSXyA9IHsgMHgzN2NjMmMwMCwgMHhkZGRkLCAweDExZGIsIDB4ODU3NywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfVklSVFVBTElaRVIgPSAmU0xfSUlEX1ZJUlRVQUxJWkVSXzsKKyNlbmRpZiAvL09QRU5TTF9FU19IXworCisvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgdmlydHVhbGl6ZXIgZWZmZWN0ICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQsCisgICAgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEgKK30gdF92aXJ0dWFsaXplcl9wYXJhbXM7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RWSVJUVUFMSVpFUkFQSV9IXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjFhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdFZpc3VhbGl6ZXJBcGkuaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFZJU1VBTElaRVJBUElfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RBcGkuaD4KKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TTF9FU19IXworc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZJU1VBTElaQVRJT05fID0KKyAgICB7IDB4ZTQ2YjI2YTAsIDB4ZGRkZCwgMHgxMWRiLCAweDhhZmQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH07Citjb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3QgU0xfSUlEX1ZJU1VBTElaQVRJT04gPSAmU0xfSUlEX1ZJU1VBTElaQVRJT05fOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKKyNkZWZpbmUgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYIDEwMjQgIC8vIG1heGltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKyNkZWZpbmUgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOIDEyOCAgIC8vIG1pbmltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXJzIGZvciBWaXN1YWxpemVyIGVmZmVjdCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgVklTVV9QQVJBTV9DQVBUVVJFX1NJWkUsICAgICAgICAvLyBTZXRzIHRoZSBudW1iZXIgUENNIHNhbXBsZXMgaW4gdGhlIGNhcHR1cmUuCit9IHRfdmlzdWFsaXplcl9wYXJhbXM7CisKKy8qIGNvbW1hbmRzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBWSVNVX0NNRF9DQVBUVVJFID0gRUZGRUNUX0NNRF9GSVJTVF9QUk9QUklFVEFSWSwgLy8gR2V0cyB0aGUgbGF0ZXN0IFBDTSBjYXB0dXJlLgorfXRfdmlzdWFsaXplcl9jbWRzOworCisvLyBWSVNVX0NNRF9DQVBUVVJFIHJldHJpZXZlcyB0aGUgbGF0ZXN0IFBDTSBzbmFwc2hvdCBjYXB0dXJlZCBieSB0aGUgdmlzdWFsaXplciBlbmdpbmUuCisvLyBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBzcGVjaWZpZWQgYnkgVklTVV9QQVJBTV9DQVBUVVJFX1NJWkUKKy8vIGluIDggYml0IHVuc2lnbmVkIGZvcm1hdCAoMCA9IDB4ODApCisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RWSVNVQUxJWkVSQVBJX0hfKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQxYTE0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFNGQUNUT1JZQVBJX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0QXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgZmFjdG9yeSBpbnRlcmZhY2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KKy8vICAgICAgICAgIEVhY2ggZWZmZWN0IG11c3QgaGF2ZSBhIGRpZmZlcmVudCBlZmZlY3QgdXVpZCAoc2VlCisvLyAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90KS4gVGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEVmZmVjdFF1ZXJ5RWZmZWN0KCkKKy8vICAgICAgICAgIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBlZmZlY3RzIHByZXNlbnQgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCisvLyAgICAgICAgICBFYWNoIHRpbWUgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgaXMgY2FsbGVkLCB0aGUgZmFjdG9yeSBtdXN0CisvLyAgICAgICAgICByZXNldCB0aGUgaW5kZXggb2YgdGhlIGVmZmVjdCBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IG5leHQgY2FsbCB0bworLy8gICAgICAgICAgRWZmZWN0UXVlcnlFZmZlY3QoKSB0byByZXN0YXJ0IGVudW1lcmF0aW9uIGZyb20gdGhlIGJlZ2lubmluZy4KKy8vCisvLyAgICBJbnB1dC9PdXRwdXQ6CisvLyAgICAgICAgICBwTnVtRWZmZWN0czogICAgYWRkcmVzcyB3aGVyZSB0aGUgbnVtYmVyIG9mIGVmZmVjdHMgc2hvdWxkIGJlIHJldHVybmVkLgorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBmYWN0b3J5IGZhaWxlZCB0byBpbml0aWFsaXplCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBwTnVtRWZmZWN0cworLy8gICAgICAgICpwTnVtRWZmZWN0czogICAgIHVwZGF0ZWQgd2l0aCBudW1iZXIgb2YgZWZmZWN0cyBpbiBmYWN0b3J5CisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2ludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UXVlcnlFZmZlY3QKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KKy8vICAgICAgICAgIFNlZSBlZmZlY3RfZGVzY3JpcHRvcl90IGZvciBhIGRldGFpbHMgb24gZWZmZWN0IGRlc2NyaXB0b3IuCisvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHRvZ2V0aGVyIHdpdGggRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkgaXMgdXNlZCB0byBlbnVtZXJhdGUgYWxsCisvLyAgICAgICAgICBlZmZlY3RzIHByZXNlbnQgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuIFRoZSBlbnVtZXJhdGlvbiBzZXF1ZW5jZSBpczoKKy8vICAgICAgICAgICAgICBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bV9lZmZlY3RzKTsKKy8vICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2VmZmVjdHM7IGkrKykKKy8vICAgICAgICAgICAgICAgICAgRWZmZWN0UXVlcnlFZmZlY3QoaSwuLi4pOworLy8KKy8vICAgIElucHV0L091dHB1dDoKKy8vICAgICAgICAgIHBEZXNjcmlwdG9yOiAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgZWZmZWN0IGRlc2NyaXB0b3IuCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9FTlQgICAgIG5vIG1vcmUgZWZmZWN0IGF2YWlsYWJsZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGZhY3RvcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBEZXNjcmlwdG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT1NZUyAgICAgZWZmZWN0IGxpc3QgaGFzIGNoYW5nZWQgc2luY2UgbGFzdCBleGVjdXRpb24gb2YgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKKy8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgRWZmZWN0UXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIHJldHVybnMgYW4KKy8vICAgICAgICAgIGVmZmVjdCBjb250cm9sIGludGVyZmFjZSBvbiB0aGlzIGVuZ2luZS4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgdGhlCisvLyAgICAgICAgICByZXNvdXJjZXMgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZWZmZWN0IGVuZ2luZSBhbmQgcmV0dXJuCisvLyAgICAgICAgICBhIGhhbmRsZXIgb24gdGhlIGVmZmVjdCBjb250cm9sIGludGVyZmFjZS4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIHBFZmZlY3RVdWlkOiAgICBwb2ludGVyIHRvIHRoZSBlZmZlY3QgdXVpZC4KKy8vICAgICAgICAgIHNlc3Npb25JZDogIGF1ZGlvIHNlc3Npb24gdG8gd2hpY2ggdGhpcyBlZmZlY3QgaW5zdGFuY2Ugd2lsbCBiZSBhdHRhY2hlZC4gQWxsIGVmZmVjdHMgY3JlYXRlZAorLy8gICAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCBhcmUgY29ubmVjdGVkIGluIHNlcmllcyBhbmQgcHJvY2VzcyB0aGUgc2FtZSBzaWduYWwgc3RyZWFtLgorLy8gICAgICAgICAgICAgIEtub3dpbmcgdGhhdCB0d28gZWZmZWN0cyBhcmUgcGFydCBvZiB0aGUgc2FtZSBlZmZlY3QgY2hhaW4gY2FuIGhlbHAgdGhlIGxpYnJhcnkgaW1wbGVtZW50CisvLyAgICAgICAgICAgICAgc29tZSBraW5kIG9mIG9wdGltaXphdGlvbnMuCisvLyAgICAgICAgICBpb0lkOiAgIGlkZW50aWZpZXMgdGhlIG91dHB1dCBvciBpbnB1dCBzdHJlYW0gdGhpcyBlZmZlY3QgaXMgZGlyZWN0ZWQgdG8gYXQgYXVkaW8gSEFMLiBGb3IgZnV0dXJlCisvLyAgICAgICAgICAgICAgdXNlIGVzcGVjaWFsbHkgd2l0aCB0dW5uZWxlZCBIVyBhY2NlbGVyYXRlZCBlZmZlY3RzCisvLworLy8gICAgSW5wdXQvT3V0cHV0OgorLy8gICAgICAgICAgcEludGVyZmFjZTogICAgYWRkcmVzcyB3aGVyZSB0byByZXR1cm4gdGhlIGVmZmVjdCBpbnRlcmZhY2UuCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGZhY3RvcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBFZmZlY3RVdWlkIG9yIHBJbnRlcmZhY2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKy8vICAgICAgICAqcEludGVyZmFjZTogICAgIHVwZGF0ZWQgd2l0aCB0aGUgZWZmZWN0IGludGVyZmFjZS4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgZWZmZWN0X2ludGVyZmFjZV90ICpwSW50ZXJmYWNlKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UmVsZWFzZQorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgICBSZWxlYXNlcyB0aGUgZWZmZWN0IGVuZ2luZSB3aG9zZSBoYW5kbGVyIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgorLy8gICAgICAgICAgQWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgdG8gdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIG9mIHRoZSBlZmZlY3QgYXJlCisvLyAgICAgICAgICByZWxlYXNlZC4KKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIGludGVyZmFjZTogICAgaGFuZGxlciBvbiB0aGUgZWZmZWN0IGludGVyZmFjZSB0byBiZSByZWxlYXNlZC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZmFjdG9yeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZXIKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdExvYWRMaWJyYXJ5CisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIExvYWRzIHRoZSBlZmZlY3QgbGlicmFyeSB3aGljaCBwYXRoIGlzIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50LgorLy8gICAgICAgICAgVGhpcyBtdXN0IGJlIHRoZSBmdWxsIHBhdGggb2YgYSBkeW5hbWljIGxpYnJhcnkgKC5zbykgaW1wbGVtZW50aW5nIG9uZSBvcgorLy8gICAgICAgICAgbW9yZSBlZmZlY3QgZW5naW5lcyBhbmQgZXhwb3NpbmcgdGhlIGVmZmVjdCBsaWJyYXJ5IGludGVyZmFjZSBkZXNjcmliZWQgaW4KKy8vICAgICAgICAgIEVmZmVjdEFwaS5oLiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIGhhbmRsZSBvbiB0aGUgbGlicmFyeSBmb3IgdXNlZCBieQorLy8gICAgICAgICAgZnVydGhlciBjYWxsIHRvIEVmZmVjdFVubG9hZExpYnJhcnkoKSB0byB1bmxvYWQgdGhlIGxpYnJhcnkuCisvLworLy8gICAgSW5wdXQ6CisvLyAgICAgICAgICBsaWJQYXRoOiAgICBmdWxsIHBhdGggb2YgdGhlIGR5bmFtaWMgbGlicmFyeSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbS4KKy8vCisvLyAgICAgICAgICBoYW5kbGU6ICAgICBhZGRyZXNzIHdoZXJlIHRvIHJldHVybiB0aGUgbGlicmFyeSBoYW5kbGUKKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZWZmZWN0IGZhY3Rvcnkgbm90IGluaXRpYWxpemVkIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBpbXBsZW1lbnQgcmVxdWlyZWQgZnVuY3Rpb25zCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVJTlZBTCAgICAgaW52YWxpZCBsaWJQYXRoIHN0cmluZyBvciBoYW5kbGUKKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdExvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0VW5sb2FkTGlicmFyeQorLy8KKy8vICAgIERlc2NyaXB0aW9uOiAgVW5sb2FkcyB0aGUgZWZmZWN0IGxpYnJhcnkgd2hpY2ggaGFuZGxlIGlzIGdpdmVuIGFzIGFyZ3VtZW50LgorLy8KKy8vICAgIElucHV0OgorLy8gICAgICAgICAgaGFuZGxlOiBsaWJyYXJ5IGhhbmRsZQorLy8KKy8vICAgIE91dHB1dDoKKy8vICAgICAgICByZXR1cm5lZCB2YWx1ZTogICAgMCAgICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWICAgICBlZmZlY3QgZmFjdG9yeSBub3QgaW5pdGlhbGl6ZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBpbnZhbGlkIGhhbmRsZQorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgRWZmZWN0VW5sb2FkTGlicmFyeShpbnQgaGFuZGxlKTsKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgRnVuY3Rpb246ICAgICAgIEVmZmVjdEdldERlc2NyaXB0b3IKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgUmV0dXJucyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZWZmZWN0IHdoaWNoIHV1aWQgaXMgcG9pbnRlZAorLy8gICAgICAgICAgdG8gYnkgZmlyc3QgYXJndW1lbnQuCisvLworLy8gICAgSW5wdXQ6CisvLyAgICAgICAgICBwRWZmZWN0VXVpZDogICAgcG9pbnRlciB0byB0aGUgZWZmZWN0IHV1aWQuCisvLworLy8gICAgSW5wdXQvT3V0cHV0OgorLy8gICAgICAgICAgcERlc2NyaXB0b3I6ICAgIGFkZHJlc3Mgd2hlcmUgdG8gcmV0dXJuIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgICAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLUVOT0RFViAgICAgZmFjdG9yeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FSU5WQUwgICAgIGludmFsaWQgcEVmZmVjdFV1aWQgb3IgcERlc2NyaXB0b3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKy8vICAgICAgICAqcERlc2NyaXB0b3I6ICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgorLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICAgIEZ1bmN0aW9uOiAgICAgICBFZmZlY3RJc051bGxVdWlkCisvLworLy8gICAgRGVzY3JpcHRpb246ICAgIEhlbHBlciBmdW5jdGlvbiB0byBjb21wYXJlIGVmZmVjdCB1dWlkIHRvIEVGRkVDVF9VVUlEX05VTEwKKy8vCisvLyAgICBJbnB1dDoKKy8vICAgICAgICAgIHBFZmZlY3RVdWlkOiBwb2ludGVyIHRvIGVmZmVjdCB1dWlkIHRvIGNvbXBhcmUgdG8gRUZGRUNUX1VVSURfTlVMTC4KKy8vCisvLyAgICBPdXRwdXQ6CisvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgaWYgdXVpZCBpcyBkaWZmZXJlbnQgZnJvbSBFRkZFQ1RfVVVJRF9OVUxMLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAxIGlmIHV1aWQgaXMgZXF1YWwgdG8gRUZGRUNUX1VVSURfTlVMTC4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworaW50IEVmZmVjdElzTnVsbFV1aWQoZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQpOworCisjaWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUU0ZBQ1RPUllBUElfSF8qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAppbmRleCBjMTQ3NjMyLi43MGU1MDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApAQCAtMjcsNiArMjcsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1RyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUmVjb3JkLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Q2xpZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01MSw2ICs1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgPSAwOwogCiAgICAgdmlydHVhbCBzcDxJQXVkaW9SZWNvcmQ+IG9wZW5SZWNvcmQoCkBAIC02MSw2ICs2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpID0gMDsKIAogICAgIC8qIHF1ZXJ5IHRoZSBhdWRpbyBoYXJkd2FyZSBzdGF0ZS4gVGhpcyBzdGF0ZSBuZXZlciBjaGFuZ2VzLApAQCAtMTM0LDYgKzEzOSwzMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcywgaW50IG91dHB1dCkgPSAwOwogCiAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgIGdldElucHV0RnJhbWVzTG9zdChpbnQgaW9IYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsb2FkRWZmZWN0TGlicmFyeShjb25zdCBjaGFyICpsaWJQYXRoLCBpbnQgKmhhbmRsZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCB1bmxvYWRFZmZlY3RMaWJyYXJ5KGludCBoYW5kbGUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVVUlELCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgPSAwOworCisgICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QocGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGludCBzcmNPdXRwdXQsIGludCBkc3RPdXRwdXQpID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA0ODA0YmJkLi40OWVlZTU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtNTMsOCArNTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6Rk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0KGludCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCkBAIC02OSw2ICs3MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCBpbmRleCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50ICppbmRleCkgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkgPSAwOworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKaW5kZXggZGU2NDI2YS4uNDdkNTMwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApAQCAtNjIsNiArNjIsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBhdXNlKCkgPSAwOwogCisgICAgLyogQXR0YWNoIHRyYWNrIGF1eGlsaWFyeSBvdXRwdXQgdG8gc3BlY2lmaWVkIGVmZmVjdC4gVXNlIGVmZmVjdElkID0gMAorICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKKwogICAgIC8qIGdldCB0aGlzIHRyYWNrcyBjb250cm9sIGJsb2NrICovCiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOyAgICAKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvSUVmZmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDQ4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lFRkZFQ1RfSAorI2RlZmluZSBBTkRST0lEX0lFRkZFQ1RfSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSUVmZmVjdDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEVmZmVjdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZSgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzYWJsZSgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBSZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOworCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkVmZmVjdDogcHVibGljIEJuSW50ZXJmYWNlPElFZmZlY3Q+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JRUZGRUNUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUVmZmVjdENsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JRWZmZWN0Q2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3OGM5OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSUVmZmVjdENsaWVudC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJRWZmZWN0Q2xpZW50OiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0Q2xpZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCbkVmZmVjdENsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JRUZGRUNUQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCmluZGV4IDI2MTk2OTEuLmFmOWE3ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaApAQCAtNDgsNiArNDgsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN1c3BlbmQoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgcmVzdW1lKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKIAogICAgIC8vIEludm9rZSBhIGdlbmVyaWMgbWV0aG9kIG9uIHRoZSBwbGF5ZXIgYnkgdXNpbmcgb3BhcXVlIHBhcmNlbHMKICAgICAvLyBmb3IgdGhlIHJlcXVlc3QgYW5kIHJlcGx5LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAzMWMwOTkxLi45NDE2Y2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNDAsMTUgKzQwLDE0IEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiAgY3JlYXRlTWVkaWFSZWNvcmRlcihwaWRfdCBwaWQpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcihwaWRfdCBwaWQpID0gMDsKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCkgPSAwOwotICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+IGNyZWF0ZShwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgaW50IGF1ZGlvU2Vzc2lvbklkID0gMCkgPSAwOworICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IGF1ZGlvU2Vzc2lvbklkKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICBkZWNvZGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCkgPSAwOwogICAgIHZpcnR1YWwgc3A8SU9NWD4gICAgICAgICAgICBnZXRPTVgoKSA9IDA7Ci0KLSAgICAvLyBUYWtlIGEgcGVlayBhdCBjdXJyZW50bHkgcGxheWluZyBhdWRpbywgZm9yIHZpc3VhbGl6YXRpb24gcHVycG9zZXMuCi0gICAgLy8gVGhpcyByZXR1cm5zIGEgYnVmZmVyIG9mIDE2IGJpdCBtb25vIFBDTSBkYXRhLCBvciBOVUxMIGlmIG5vIHZpc3VhbGl6YXRpb24gYnVmZmVyIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIHNub29wKCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDczYmYyZWUuLjU0YWRjYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogY2xhc3MgSVN1cmZhY2U7CiBjbGFzcyBJQ2FtZXJhOwotY2xhc3MgSU1lZGlhUGxheWVyQ2xpZW50OworY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ7CiAKIGNsYXNzIElNZWRpYVJlY29yZGVyOiBwdWJsaWMgSUludGVyZmFjZQogewpAQCAtNDMsNyArNDMsNyBAQAogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpID0gMDsKICAgICB2aXJ0dWFsCXN0YXR1c190CQlzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lcikgPSAwOwogICAgIHZpcnR1YWwJc3RhdHVzX3QJCXByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJZ2V0TWF4QW1wbGl0dWRlKGludCogbWF4KSA9IDA7CiAgICAgdmlydHVhbAlzdGF0dXNfdAkJc3RhcnQoKSA9IDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1OGVmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lNRURJQVJFQ09SREVSQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9JTUVESUFSRUNPUkRFUkNMSUVOVF9ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lZGlhUmVjb3JkZXJDbGllbnQ6IHB1YmxpYyBJSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyQ2xpZW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuTWVkaWFSZWNvcmRlckNsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyQ2xpZW50PgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSU1FRElBUkVDT1JERVJDTElFTlRfSAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggOWU2MDZkOS4uMzY2Mjk4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMzksNyArMzksNiBAQAogZW51bSBwbGF5ZXJfdHlwZSB7CiAgICAgUFZfUExBWUVSID0gMSwKICAgICBTT05JVk9YX1BMQVlFUiA9IDIsCi0gICAgVk9SQklTX1BMQVlFUiA9IDMsCiAgICAgU1RBR0VGUklHSFRfUExBWUVSID0gNCwKICAgICAvLyBUZXN0IHBsYXllcnMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIHRoZSAndGVzdCcgYW5kICdlbmcnIGJ1aWxkcy4KICAgICAvLyBUaGUgc2hhcmVkIGxpYnJhcnkgd2l0aCB0aGUgdGVzdCBwbGF5ZXIgaXMgcGFzc2VkIHBhc3NlZCBhcyBhbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAppbmRleCBhNGVlYTJhLi5jM2NkMzYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApAQCAtNDgsOCArNDgsOCBAQAogICAgIHN0YXRpYyBNZWRpYVByb2ZpbGVzKiBnZXRJbnN0YW5jZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwYXJhbSBuYW1lIGF0IHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLAotICAgICAqIG9yIC0xIGlmIGVycm9yLgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW0gbmFtZSBmb3IgdGhlIGdpdmVuIGNhbWVyYSBhdAorICAgICAqIHRoZSBnaXZlbiBxdWFsaXR5IGxldmVsLCBvciAtMSBpZiBlcnJvci4KICAgICAgKgogICAgICAqIFN1cHBvcnRlZCBwYXJhbSBuYW1lIGFyZToKICAgICAgKiBkdXJhdGlvbiAtIHRoZSByZWNvcmRpbmcgZHVyYXRpb24uCkBAIC02NCw3ICs2NCw4IEBACiAgICAgICogYXVkLmh6IC0gYXVkaW8gc2FtcGxlIHJhdGUKICAgICAgKiBhdWQuY2ggLSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKICAgICAgKi8KLSAgICBpbnQgZ2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpIGNvbnN0OworICAgIGludCBnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZSBmb3JtYXRzIHN1cHBvcnRlZC4KQEAgLTEyNCwxMiArMTI1LDcgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW1hZ2UgZW5jb2RpbmcgcXVhbGl0eSBsZXZlbHMgc3VwcG9ydGVkLgogICAgICAqLwotICAgIFZlY3RvcjxpbnQ+IGdldEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgd2UgY2FuIHVzZSBmb3IgZGVjb2RpbmcgYSBKUEVHIGZpbGUuCi0gICAgICovCi0gICAgaW50IGdldEltYWdlRGVjb2RpbmdNYXhNZW1vcnkoKSBjb25zdDsKKyAgICBWZWN0b3I8aW50PiBnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIE1lZGlhUHJvZmlsZXMmIG9wZXJhdG9yPShjb25zdCBNZWRpYVByb2ZpbGVzJik7ICAvLyBEb24ndCBjYWxsIG1lCkBAIC0xNzEsNyArMTY3LDggQEAKIAogICAgIHN0cnVjdCBDYW1jb3JkZXJQcm9maWxlIHsKICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSgpCi0gICAgICAgICAgICA6IG1GaWxlRm9ybWF0KE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKSwKKyAgICAgICAgICAgIDogbUNhbWVyYUlkKDApLAorICAgICAgICAgICAgICBtRmlsZUZvcm1hdChPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCksCiAgICAgICAgICAgICAgIG1RdWFsaXR5KENBTUNPUkRFUl9RVUFMSVRZX0hJR0gpLAogICAgICAgICAgICAgICBtRHVyYXRpb24oMCksCiAgICAgICAgICAgICAgIG1WaWRlb0NvZGVjKDApLApAQCAtMTgyLDYgKzE3OSw3IEBACiAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvQ29kZWM7CiAgICAgICAgIH0KIAorICAgICAgICBpbnQgbUNhbWVyYUlkOwogICAgICAgICBvdXRwdXRfZm9ybWF0IG1GaWxlRm9ybWF0OwogICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBtUXVhbGl0eTsKICAgICAgICAgaW50IG1EdXJhdGlvbjsKQEAgLTI0OSw2ICsyNDcsMTEgQEAKICAgICAgICAgaW50IHRhZzsKICAgICB9OwogCisgICAgc3RydWN0IEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzIHsKKyAgICAgICAgaW50IG1DYW1lcmFJZDsKKyAgICAgICAgVmVjdG9yPGludD4gbUxldmVsczsKKyAgICB9OworCiAgICAgLy8gRGVidWcKICAgICBzdGF0aWMgdm9pZCBsb2dWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmIGNvZGVjKTsKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0NvZGVjKGNvbnN0IEF1ZGlvQ29kZWMmIGNvZGVjKTsKQEAgLTI2Nyw5ICsyNzAsMTEgQEAKICAgICBzdGF0aWMgVmlkZW9EZWNvZGVyQ2FwKiBjcmVhdGVWaWRlb0RlY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwogICAgIHN0YXRpYyBWaWRlb0VuY29kZXJDYXAqIGNyZWF0ZVZpZGVvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7CiAgICAgc3RhdGljIEF1ZGlvRW5jb2RlckNhcCogY3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSogY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIGludCBnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgaW50IGdldEltYWdlRGVjb2RpbmdNYXhNZW1vcnkoY29uc3QgY2hhciAqKmF0dHMpOworICAgIHN0YXRpYyBDYW1jb3JkZXJQcm9maWxlKiBjcmVhdGVDYW1jb3JkZXJQcm9maWxlKGludCBjYW1lcmFJZCwgY29uc3QgY2hhciAqKmF0dHMpOworICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhSWQoY29uc3QgY2hhciAqKmF0dHMpOworCisgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMqIGZpbmRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0OworICAgIHZvaWQgYWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzKTsKIAogICAgIC8vIEN1c3RvbWl6ZWQgZWxlbWVudCB0YWcgaGFuZGxlciBmb3IgcGFyc2luZyB0aGUgeG1sIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBzdGF0aWMgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cyk7CkBAIC0zMDMsNiArMzA4LDcgQEAKICAgICBzdGF0aWMgYm9vbCBzSXNJbml0aWFsaXplZDsKICAgICBzdGF0aWMgTWVkaWFQcm9maWxlcyAqc0luc3RhbmNlOwogICAgIHN0YXRpYyBNdXRleCBzTG9jazsKKyAgICBpbnQgbUN1cnJlbnRDYW1lcmFJZDsKIAogICAgIFZlY3RvcjxDYW1jb3JkZXJQcm9maWxlKj4gbUNhbWNvcmRlclByb2ZpbGVzOwogICAgIFZlY3RvcjxBdWRpb0VuY29kZXJDYXAqPiAgbUF1ZGlvRW5jb2RlcnM7CkBAIC0zMTAsOCArMzE2LDcgQEAKICAgICBWZWN0b3I8QXVkaW9EZWNvZGVyQ2FwKj4gIG1BdWRpb0RlY29kZXJzOwogICAgIFZlY3RvcjxWaWRlb0RlY29kZXJDYXAqPiAgbVZpZGVvRGVjb2RlcnM7CiAgICAgVmVjdG9yPG91dHB1dF9mb3JtYXQ+ICAgICBtRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzOwotICAgIFZlY3RvcjxpbnQ+ICAgICAgICAgICAgICAgbUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgbUltYWdlRGVjb2RpbmdNYXhNZW1vcnk7CisgICAgVmVjdG9yPEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzICo+ICBtSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHM7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IDViNzg3YTcuLjVlOWUzNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTQxLDEzICs0MSwxNCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgbGlzdGVuZXIpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgPSAwOwogCiBwcml2YXRlOgogICAgIE1lZGlhUmVjb3JkZXJCYXNlKGNvbnN0IE1lZGlhUmVjb3JkZXJCYXNlICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvUFZNZWRpYVJlY29yZGVyLmgKaW5kZXggMmExMjk4YS4uYzA5MWMzOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9QVk1lZGlhUmVjb3JkZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL1BWTWVkaWFSZWNvcmRlci5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaWZuZGVmIEFORFJPSURfUFZNRURJQVJFQ09SREVSX0gKICNkZWZpbmUgQU5EUk9JRF9QVk1FRElBUkVDT1JERVJfSAogCi0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC00NSwxMyArNDUsMTQgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBkb1N0b3AoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oIGIvaW5jbHVkZS9tZWRpYS9WaXN1YWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NDZjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorICogVGhlIFZpc3VhbGl6ZXIgY2xhc3MgZW5hYmxlcyBhcHBsaWNhdGlvbiB0byByZXRyaWV2ZSBwYXJ0IG9mIHRoZSBjdXJyZW50bHkgcGxheWluZyBhdWRpbyBmb3IKKyAqIHZpc3VhbGl6YXRpb24gcHVycG9zZS4gSXQgaXMgbm90IGFuIGF1ZGlvIHJlY29yZGluZyBpbnRlcmZhY2UgYW5kIG9ubHkgcmV0dXJucyBwYXJ0aWFsIGFuZCBsb3cKKyAqIHF1YWxpdHkgYXVkaW8gY29udGVudC4gSG93ZXZlciwgdG8gcHJvdGVjdCBwcml2YWN5IG9mIGNlcnRhaW4gYXVkaW8gZGF0YSAoZS5nIHZvaWNlIG1haWwpIHRoZSB1c2UKKyAqIG9mIHRoZSB2aXN1YWxpemVyIHJlcXVpcmVzIHRoZSBwZXJtaXNzaW9uIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8uCisgKiBUaGUgYXVkaW8gc2Vzc2lvbiBJRCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluZGljYXRlcyB3aGljaCBhdWRpbyBjb250ZW50IHNob3VsZCBiZQorICogdmlzdWFsaXplZDoKKyAqIC0gSWYgdGhlIHNlc3Npb24gaXMgMCwgdGhlIGF1ZGlvIG91dHB1dCBtaXggaXMgdmlzdWFsaXplZAorICogLSBJZiB0aGUgc2Vzc2lvbiBpcyBub3QgMCwgdGhlIGF1ZGlvIGZyb20gYSBwYXJ0aWN1bGFyIE1lZGlhUGxheWVyIG9yIEF1ZGlvVHJhY2sKKyAqICAgdXNpbmcgdGhpcyBhdWRpbyBzZXNzaW9uIGlzIHZpc3VhbGl6ZWQKKyAqIFR3byB0eXBlcyBvZiByZXByZXNlbnRhdGlvbiBvZiBhdWRpbyBjb250ZW50IGNhbiBiZSBjYXB0dXJlZDoKKyAqIC0gV2F2ZWZvcm0gZGF0YTogY29uc2VjdXRpdmUgOC1iaXQgKHVuc2lnbmVkKSBtb25vIHNhbXBsZXMgYnkgdXNpbmcgdGhlIGdldFdhdmVGb3JtKCkgbWV0aG9kCisgKiAtIEZyZXF1ZW5jeSBkYXRhOiA4LWJpdCBtYWduaXR1ZGUgRkZUIGJ5IHVzaW5nIHRoZSBnZXRGZnQoKSBtZXRob2QKKyAqCisgKiBUaGUgbGVuZ3RoIG9mIHRoZSBjYXB0dXJlIGNhbiBiZSByZXRyaWV2ZWQgb3Igc3BlY2lmaWVkIGJ5IGNhbGxpbmcgcmVzcGVjdGl2ZWx5CisgKiBnZXRDYXB0dXJlU2l6ZSgpIGFuZCBzZXRDYXB0dXJlU2l6ZSgpIG1ldGhvZHMuIE5vdGUgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgRkZUCisgKiBpcyBoYWxmIG9mIHRoZSBzcGVjaWZpZWQgY2FwdHVyZSBzaXplIGJ1dCBib3RoIHNpZGVzIG9mIHRoZSBzcGVjdHJ1bSBhcmUgcmV0dXJuZWQgeWllbGRpbmcgaW4gYQorICogbnVtYmVyIG9mIGJ5dGVzIGVxdWFsIHRvIHRoZSBjYXB0dXJlIHNpemUuIFRoZSBjYXB0dXJlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgaW4gdGhlIHJhbmdlCisgKiByZXR1cm5lZCBieSBnZXRNaW5DYXB0dXJlU2l6ZSgpIGFuZCBnZXRNYXhDYXB0dXJlU2l6ZSgpLgorICogSW4gYWRkaXRpb24gdG8gdGhlIHBvbGxpbmcgY2FwdHVyZSBtb2RlLCBhIGNhbGxiYWNrIG1vZGUgaXMgYWxzbyBhdmFpbGFibGUgYnkgaW5zdGFsbGluZyBhCisgKiBjYWxsYmFjayBmdW5jdGlvbiBieSB1c2Ugb2YgdGhlIHNldENhcHR1cmVDYWxsQmFjaygpIG1ldGhvZC4gVGhlIHJhdGUgYXQgd2hpY2ggdGhlIGNhbGxiYWNrCisgKiBpcyBjYWxsZWQgYXMgd2VsbCBhcyB0aGUgdHlwZSBvZiBkYXRhIHJldHVybmVkIGlzIHNwZWNpZmllZC4KKyAqIEJlZm9yZSBjYXB0dXJpbmcgZGF0YSwgdGhlIFZpc3VhbGl6ZXIgbXVzdCBiZSBlbmFibGVkIGJ5IGNhbGxpbmcgdGhlIHNldEVuYWJsZWQoKSBtZXRob2QuCisgKiBXaGVuIGRhdGEgY2FwdHVyZSBpcyBub3QgbmVlZGVkIGFueSBtb3JlLCB0aGUgVmlzdWFsaXplciBzaG91bGQgYmUgZGlzYWJsZWQuCisgKi8KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVmlzdWFsaXplcjogcHVibGljIEF1ZGlvRWZmZWN0IHsKK3B1YmxpYzoKKworICAgIGVudW0gY2FsbGJhY2tfZmxhZ3MgeworICAgICAgICBDQVBUVVJFX1dBVkVGT1JNID0gMHgwMDAwMDAwMSwgIC8vIGNhcHR1cmUgY2FsbGJhY2sgcmV0dXJucyBhIFBDTSB3YXZlIGZvcm0KKyAgICAgICAgQ0FQVFVSRV9GRlQgPSAweDAwMDAwMDAyLCAgICAgICAvLyBhcHR1cmUgY2FsbGJhY2sgcmV0dXJucyBhIGZyZXF1ZW5jeSByZXByZXNlbnRhdGlvbgorICAgICAgICBDQVBUVVJFX0NBTExfSkFWQSA9IDB4MDAwMDAwMDQgIC8vIHRoZSBjYWxsYmFjayB0aHJlYWQgY2FuIGNhbGwgamF2YQorICAgIH07CisKKworICAgIC8qIENvbnN0cnVjdG9yLgorICAgICAqIFNlZSBBdWRpb0VmZmVjdCBjb25zdHJ1Y3RvciBmb3IgZGV0YWlscyBvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsaXplcihpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgflZpc3VhbGl6ZXIoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgLy8gbWF4aW11bSBjYXB0dXJlIHNpemUgaW4gc2FtcGxlcworICAgIHN0YXRpYyB1aW50MzJfdCBnZXRNYXhDYXB0dXJlU2l6ZSgpIHsgcmV0dXJuIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWDsgfQorICAgIC8vIG1pbmltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKKyAgICBzdGF0aWMgdWludDMyX3QgZ2V0TWluQ2FwdHVyZVNpemUoKSB7IHJldHVybiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NSU47IH0KKyAgICAvLyBtYXhpbXVtIGNhcHR1cmUgcmF0ZSBpbiBtaWxsaWhlcnR6CisgICAgc3RhdGljIHVpbnQzMl90IGdldE1heENhcHR1cmVSYXRlKCkgeyByZXR1cm4gQ0FQVFVSRV9SQVRFX01BWDsgfQorCisgICAgLy8gY2FsbGJhY2sgdXNlZCB0byByZXR1cm4gcGVyaW9kaWMgUENNIG9yIEZGVCBjYXB0dXJlcyB0byB0aGUgYXBwbGljYXRpb24uIEVpdGhlciBvbmUgb3IgYm90aAorICAgIC8vIHR5cGVzIG9mIGRhdGEgYXJlIHJldHVybmVkIChQQ00gYW5kIEZGVCkgYWNjb3JkaW5nIHRvIGZsYWdzIGluZGljYXRlZCB3aGVuIGluc3RhbGxpbmcgdGhlCisgICAgLy8gY2FsbGJhY2suIFdoZW4gYSB0eXBlIG9mIGRhdGEgaXMgbm90IHByZXNlbnQsIHRoZSBjb3JyZXNwb25kaW5nIHNpemUgKHdhdmVmb3JtU2l6ZSBvcgorICAgIC8vIGZmdFNpemUpIGlzIDAuCisgICAgdHlwZWRlZiB2b2lkICgqY2FwdHVyZV9jYmtfdCkodm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdhdmVmb3JtU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKndhdmVmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmZ0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmZmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5ncmF0ZSk7CisKKyAgICAvLyBpbnN0YWxsIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSBwZXJpb2RpYyBjYXB0dXJlcy4gVGhlIGNhcHR1cmUgcmF0ZSBpcyBzcGVjaWZpZWQgaW4gbWlsbGlIZXJ0egorICAgIC8vIGFuZCB0aGUgY2FwdHVyZSBmb3JtYXQgaXMgYWNjb3JkaW5nIHRvIGZsYWdzICAoc2VlIGNhbGxiYWNrX2ZsYWdzKS4KKyAgICBzdGF0dXNfdCBzZXRDYXB0dXJlQ2FsbEJhY2soY2FwdHVyZV9jYmtfdCBjYmssIHZvaWQqIHVzZXIsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCByYXRlKTsKKworICAgIC8vIHNldCB0aGUgY2FwdHVyZSBzaXplIGNhcHR1cmUgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGluIHRoZSByYW5nZQorICAgIC8vIFtWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVguIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01JTl0KKyAgICAvLyBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSB2aXN1YWxpemVyIGlzIG5vdCBlbmFibGVkCisgICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZVNpemUodWludDMyX3Qgc2l6ZSk7CisgICAgdWludDMyX3QgZ2V0Q2FwdHVyZVNpemUoKSB7IHJldHVybiBtQ2FwdHVyZVNpemU7IH0KKworICAgIC8vIHJldHVybnMgdGhlIGNhcHR1cmUgcmF0ZSBpbmRpY2F0ZWQgd2hlbiBpbnN0YWxsaW5nIHRoZSBjYWxsYmFjaworICAgIHVpbnQzMl90IGdldENhcHR1cmVSYXRlKCkgeyByZXR1cm4gbUNhcHR1cmVSYXRlOyB9CisKKyAgICAvLyByZXR1cm5zIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBhdWRpbyBiZWluZyBjYXB0dXJlZAorICAgIHVpbnQzMl90IGdldFNhbXBsaW5nUmF0ZSgpIHsgcmV0dXJuIG1TYW1wbGVSYXRlOyB9CisKKyAgICAvLyByZXR1cm4gYSBjYXB0dXJlIGluIFBDTSA4IGJpdCB1bnNpZ25lZCBmb3JtYXQuIFRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIGlzIGVxdWFsIHRvCisgICAgLy8gZ2V0Q2FwdHVyZVNpemUoKQorICAgIHN0YXR1c190IGdldFdhdmVGb3JtKHVpbnQ4X3QgKndhdmVmb3JtKTsKKworICAgIC8vIHJldHVybiBhIGNhcHR1cmUgaW4gRkZUIDggYml0IHNpZ25lZCBmb3JtYXQuIFRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIGlzIGVxdWFsIHRvCisgICAgLy8gZ2V0Q2FwdHVyZVNpemUoKSBidXQgdGhlIGxlbmd0aCBvZiB0aGUgRkZUIGlzIGhhbGYgb2YgdGhlIHNpemUgKGJvdGggcGFydHMgb2YgdGhlIHNwZWN0cnVtCisgICAgLy8gYXJlIHJldHVybmVkCisgICAgc3RhdHVzX3QgZ2V0RmZ0KHVpbnQ4X3QgKmZmdCk7CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgQ0FQVFVSRV9SQVRFX01BWCA9IDIwMDAwOworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBDQVBUVVJFX1JBVEVfREVGID0gMTAwMDA7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IENBUFRVUkVfU0laRV9ERUYgPSBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVg7CisKKyAgICAvKiBpbnRlcm5hbCBjbGFzcyB0byBoYW5kbGUgdGhlIGNhbGxiYWNrICovCisgICAgY2xhc3MgQ2FwdHVyZVRocmVhZCA6IHB1YmxpYyBUaHJlYWQKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBDYXB0dXJlVGhyZWFkKFZpc3VhbGl6ZXImIHJlY2VpdmVyLCB1aW50MzJfdCBjYXB0dXJlUmF0ZSwgYm9vbCBiQ2FuQ2FsbEphdmEgPSBmYWxzZSk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgVmlzdWFsaXplcjsKKyAgICAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKKyAgICAgICAgVmlzdWFsaXplciYgbVJlY2VpdmVyOworICAgICAgICBNdXRleCAgICAgICBtTG9jazsKKyAgICAgICAgdWludDMyX3QgbVNsZWVwVGltZVVzOworICAgIH07CisKKyAgICBzdGF0dXNfdCBkb0ZmdCh1aW50OF90ICpmZnQsIHVpbnQ4X3QgKndhdmVmb3JtKTsKKyAgICB2b2lkIHBlcmlvZGljQ2FwdHVyZSgpOworICAgIHVpbnQzMl90IGluaXRDYXB0dXJlU2l6ZSgpOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgdWludDMyX3QgbUNhcHR1cmVSYXRlOworICAgIHVpbnQzMl90IG1DYXB0dXJlU2l6ZTsKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBjYXB0dXJlX2Nia190IG1DYXB0dXJlQ2FsbEJhY2s7CisgICAgdm9pZCAqbUNhcHR1cmVDYmtVc2VyOworICAgIHNwPENhcHR1cmVUaHJlYWQ+IG1DYXB0dXJlVGhyZWFkOworICAgIHVpbnQzMl90IG1DYXB0dXJlRmxhZ3M7Cit9OworCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDdmYWQxYjcuLjIwNzE5MWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTkzLDYgKzkzLDExIEBACiAgICAgLy8gVGhlIHZpZGVvIGlzIHRvbyBjb21wbGV4IGZvciB0aGUgZGVjb2RlcjogaXQgY2FuJ3QgZGVjb2RlIGZyYW1lcyBmYXN0CiAgICAgLy8gZW5vdWdoLiBQb3NzaWJseSBvbmx5IHRoZSBhdWRpbyBwbGF5cyBmaW5lIGF0IHRoaXMgc3RhZ2UuCiAgICAgTUVESUFfSU5GT19WSURFT19UUkFDS19MQUdHSU5HID0gNzAwLAorICAgIC8vIE1lZGlhUGxheWVyIGlzIHRlbXBvcmFyaWx5IHBhdXNpbmcgcGxheWJhY2sgaW50ZXJuYWxseSBpbiBvcmRlciB0bworICAgIC8vIGJ1ZmZlciBtb3JlIGRhdGEuCisgICAgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQgPSA3MDEsCisgICAgLy8gTWVkaWFQbGF5ZXIgaXMgcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgZmlsbGluZyBidWZmZXJzLgorICAgIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCA9IDcwMiwKICAgICAvLyA4eHgKICAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAogICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCkBAIC0xNjEsMTIgKzE2NiwxNSBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpOwogICAgIHN0YXRpYyAgc3A8SU1lbW9yeT4gICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7CiAgICAgc3RhdGljICBzcDxJTWVtb3J5PiAgICAgZGVjb2RlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCB1aW50MzJfdCAqcFNhbXBsZVJhdGUsIGludCogcE51bUNoYW5uZWxzLCBpbnQqIHBGb3JtYXQpOwotICAgIHN0YXRpYyAgaW50ICAgICAgICAgICAgIHNub29wKHNob3J0ICpkYXRhLCBpbnQgbGVuLCBpbnQga2luZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdXNwZW5kKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVzdW1lKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TZXNzaW9uSWQoaW50IHNlc3Npb25JZCk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ2V0QXVkaW9TZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwogcHJpdmF0ZToKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhcl9sKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2Vla1RvX2woaW50IG1zZWMpOwpAQCAtMTkzLDYgKzIwMSw4IEBACiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggOWVhNmM3Yi4uMjkxYjE4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC03Myw2ICs3Myw5IEBACiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURJRiA9IDUsCiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyA9IDYsCiAKKyAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KKyAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LAorCiAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiB9OwogCkBAIC0xMzUsNyArMTM4LDEwIEBACiBlbnVtIG1lZGlhX3JlY29yZGVyX2luZm9fdHlwZSB7CiAgICAgTUVESUFfUkVDT1JERVJfSU5GT19VTktOT1dOICAgICAgICAgICAgICAgICAgID0gMSwKICAgICBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9EVVJBVElPTl9SRUFDSEVEICAgICAgPSA4MDAsCi0gICAgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCAgICAgID0gODAxCisgICAgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCAgICAgID0gODAxLAorICAgIE1FRElBX1JFQ09SREVSX0lORk9fQ09NUExFVElPTl9TVEFUVVMgICAgICAgICA9IDgwMiwKKyAgICBNRURJQV9SRUNPUkRFUl9JTkZPX1BST0dSRVNTX0ZSQU1FX1NUQVRVUyAgICAgPSA4MDMsCisgICAgTUVESUFfUkVDT1JERVJfSU5GT19QUk9HUkVTU19USU1FX1NUQVRVUyAgICAgID0gODA0LAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQ2LDcgKzE1Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpID0gMDsKIH07CiAKLWNsYXNzIE1lZGlhUmVjb3JkZXIgOiBwdWJsaWMgQm5NZWRpYVBsYXllckNsaWVudCwKK2NsYXNzIE1lZGlhUmVjb3JkZXIgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyQ2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElNZWRpYURlYXRoTm90aWZpZXIKIHsKIHB1YmxpYzoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oCmluZGV4IDM3MjkwOWEuLmFhOTY1ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaApAQCAtMjYsNiArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CitzdHJ1Y3QgTWV0YURhdGE7CiAKIHN0cnVjdCBBTVJXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogICAgIEFNUldyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSk7CkBAIC0zNSwyNSArMzYsMzAgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUldyaXRlcigpOwogCiBwcml2YXRlOgotICAgIE11dGV4IG1Mb2NrOwotCiAgICAgRklMRSAqbUZpbGU7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1TdGFydGVkOworICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZDsKKyAgICB2b2xhdGlsZSBib29sIG1SZXN1bWVkOwogICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7Ci0gICAgYm9vbCBtUmVhY2hlZEVPUzsKKyAgICB2b2xhdGlsZSBib29sIG1SZWFjaGVkRU9TOwogICAgIHB0aHJlYWRfdCBtVGhyZWFkOworICAgIGludDY0X3QgbUVzdGltYXRlZFNpemVCeXRlczsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWREdXJhdGlvblVzOwogCiAgICAgc3RhdGljIHZvaWQgKlRocmVhZFdyYXBwZXIodm9pZCAqKTsKLSAgICB2b2lkIHRocmVhZEZ1bmMoKTsKKyAgICBzdGF0dXNfdCB0aHJlYWRGdW5jKCk7CisgICAgYm9vbCBleGNlZWRzRmlsZVNpemVMaW1pdCgpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCk7CiAKICAgICBBTVJXcml0ZXIoY29uc3QgQU1SV3JpdGVyICYpOwogICAgIEFNUldyaXRlciAmb3BlcmF0b3I9KGNvbnN0IEFNUldyaXRlciAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaAppbmRleCA5YWY1ODcxLi45YTA5NTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCkBAIC04Niw2ICs4NiwxMCBAQAogCiAgICAgYm9vbCBtU3RhcnRlZDsKIAorICAgIGJvb2wgbUlzRmlyc3RCdWZmZXI7CisgICAgc3RhdHVzX3QgbUZpcnN0QnVmZmVyUmVzdWx0OworICAgIE1lZGlhQnVmZmVyICptRmlyc3RCdWZmZXI7CisKICAgICBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKIAogICAgIHN0YXRpYyB2b2lkIEF1ZGlvQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICp1c2VyLCB2b2lkICppbmZvKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAppbmRleCBlYjAwMTQwLi5hNWNlYzc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCkBAIC0zOSw2ICszOSw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKKyAgICAvLyBSZXR1cm5zIHRoZSBtYXhpbXVtIGFtcGxpdHVkZSBzaW5jZSBsYXN0IGNhbGwuCisgICAgaW50MTZfdCBnZXRNYXhBbXBsaXR1ZGUoKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCkBAIC00NiwxMyArNDksNDEgQEAKICAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIGVudW0geyBrTWF4QnVmZmVyU2l6ZSA9IDgxOTIgfTsKKyAgICBlbnVtIHsKKyAgICAgICAga01heEJ1ZmZlclNpemUgPSAyMDQ4LAorCisgICAgICAgIC8vIEFmdGVyIHRoZSBpbml0aWFsIG11dGUsIHdlIHJhaXNlIHRoZSB2b2x1bWUgbGluZWFybHkKKyAgICAgICAgLy8gb3ZlciBrQXV0b1JhbXBEdXJhdGlvblVzLgorICAgICAgICBrQXV0b1JhbXBEdXJhdGlvblVzID0gMzAwMDAwLAorCisgICAgICAgIC8vIFRoaXMgaXMgdGhlIGluaXRpYWwgbXV0ZSBkdXJhdGlvbiB0byBzdXBwcmVzcworICAgICAgICAvLyB0aGUgdmlkZW8gcmVjb3JkaW5nIHNpZ25hbCB0b25lCisgICAgICAgIGtBdXRvUmFtcFN0YXJ0VXMgPSA3MDAwMDAsCisgICAgICB9OwogCiAgICAgQXVkaW9SZWNvcmQgKm1SZWNvcmQ7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOworCisgICAgYm9vbCBtQ29sbGVjdFN0YXRzOworICAgIGJvb2wgbVRyYWNrTWF4QW1wbGl0dWRlOworICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOworICAgIGludDE2X3QgbU1heEFtcGxpdHVkZTsKKyAgICBpbnQ2NF90IG1QcmV2U2FtcGxlVGltZVVzOworICAgIGludDY0X3QgbVRvdGFsTG9zdEZyYW1lczsKKyAgICBpbnQ2NF90IG1QcmV2TG9zdEJ5dGVzOworICAgIGludDY0X3QgbUluaXRpYWxSZWFkVGltZVVzOworCiAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCisgICAgdm9pZCB0cmFja01heEFtcGxpdHVkZShpbnQxNl90ICpkYXRhLCBpbnQgblNhbXBsZXMpOworCisgICAgLy8gVGhpcyBpcyB1c2VkIHRvIHJhaXNlIHRoZSB2b2x1bWUgZnJvbSBtdXRlIHRvIHRoZQorICAgIC8vIGFjdHVhbCBsZXZlbCBsaW5lYXJseS4KKyAgICB2b2lkIHJhbXBWb2x1bWUoCisgICAgICAgIGludDMyX3Qgc3RhcnRGcmFtZSwgaW50MzJfdCByYW1wRHVyYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQ4X3QgKmRhdGEsICAgc2l6ZV90IGJ5dGVzKTsKKwogICAgIEF1ZGlvU291cmNlKGNvbnN0IEF1ZGlvU291cmNlICYpOwogICAgIEF1ZGlvU291cmNlICZvcGVyYXRvcj0oY29uc3QgQXVkaW9Tb3VyY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQ1MGU1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FjaGluZ0RhdGFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIENBQ0hJTkdfREFUQVNPVVJDRV9IXwotCi0jZGVmaW5lIENBQ0hJTkdfREFUQVNPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIENhY2hpbmdEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgewotcHVibGljOgotICAgIENhY2hpbmdEYXRhU291cmNlKAotICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHBhZ2VTaXplLCBpbnQgbnVtUGFnZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmX3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Q2FjaGluZ0RhdGFTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUGFnZSB7Ci0gICAgICAgIFBhZ2UgKm1QcmV2LCAqbU5leHQ7Ci0gICAgICAgIG9mZl90IG1PZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBtTGVuZ3RoOwotICAgICAgICB2b2lkICptRGF0YTsKLSAgICB9OwotCi0gICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKLSAgICB2b2lkICptRGF0YTsKLSAgICBzaXplX3QgbVBhZ2VTaXplOwotICAgIFBhZ2UgKm1GaXJzdCwgKm1MYXN0OwotCi0gICAgUGFnZSAqYWxsb2NhdGVfcGFnZSgpOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBDYWNoaW5nRGF0YVNvdXJjZShjb25zdCBDYWNoaW5nRGF0YVNvdXJjZSAmKTsKLSAgICBDYWNoaW5nRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhY2hpbmdEYXRhU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDQUNISU5HX0RBVEFTT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IGVhNDM1ZGUuLjMxOTJkMDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjgsMTggKzI4LDE1IEBACiAKIGNsYXNzIElDYW1lcmE7CiBjbGFzcyBJTWVtb3J5OwotY2xhc3MgSVN1cmZhY2U7CiBjbGFzcyBDYW1lcmE7CiAKLWNsYXNzIENhbWVyYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CitjbGFzcyBDYW1lcmFTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgQ2FtZXJhU291cmNlICpDcmVhdGUoKTsKLSAgICBzdGF0aWMgQ2FtZXJhU291cmNlICpDcmVhdGVGcm9tSUNhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiAmaWNhbWVyYSk7CisgICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlRnJvbUNhbWVyYShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlKCk7CiAKLSAgICB2b2lkIHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKIApAQCAtNDgsMjUgKzQ1LDM5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIqIGJ1ZmZlcik7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNvdXJjZUxpc3RlbmVyOwogCiAgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOwotICAgIHNwPElTdXJmYWNlPiBtUHJldmlld1N1cmZhY2U7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOwogCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKLSAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lczsKKyAgICBDb25kaXRpb24gbUZyYW1lQ29tcGxldGVDb25kaXRpb247CisgICAgTGlzdDxzcDxJTWVtb3J5PiA+IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBMaXN0PHNwPElNZW1vcnk+ID4gbUZyYW1lc0JlaW5nRW5jb2RlZDsKICAgICBMaXN0PGludDY0X3Q+IG1GcmFtZVRpbWVzOwogCi0gICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVVczsKICAgICBpbnQ2NF90IG1GaXJzdEZyYW1lVGltZVVzOwotICAgIGludDMyX3QgbU51bUZyYW1lczsKKyAgICBpbnQ2NF90IG1MYXN0RnJhbWVUaW1lc3RhbXBVczsKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNFbmNvZGVkOworICAgIGludDMyX3QgbU51bUZyYW1lc0Ryb3BwZWQ7CisgICAgaW50MzJfdCBtTnVtR2xpdGNoZXM7CisgICAgaW50NjRfdCBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVczsKKyAgICBib29sIG1Db2xsZWN0U3RhdHM7CiAgICAgYm9vbCBtU3RhcnRlZDsKIAogICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxDYW1lcmE+ICZjYW1lcmEpOwogCi0gICAgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7CisgICAgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKKworICAgIHZvaWQgcmVsZWFzZVF1ZXVlZEZyYW1lcygpOworICAgIHZvaWQgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSk7CiAKICAgICBDYW1lcmFTb3VyY2UoY29uc3QgQ2FtZXJhU291cmNlICYpOwogICAgIENhbWVyYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVNvdXJjZSAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCAxZTM0MWI5Li5iYzNmNDY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC01OCw2ICs1OCwxMSBAQAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywgc2l6ZV90IHNyY1NraXAsCiAgICAgICAgICAgICB2b2lkICpkc3RCaXRzLCBzaXplX3QgZHN0U2tpcCk7CiAKKyAgICB2b2lkIGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKAorICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjQml0cywgc2l6ZV90IHNyY1NraXAsCisgICAgICAgICAgICB2b2lkICpkc3RCaXRzLCBzaXplX3QgZHN0U2tpcCk7CisKICAgICBDb2xvckNvbnZlcnRlcihjb25zdCBDb2xvckNvbnZlcnRlciAmKTsKICAgICBDb2xvckNvbnZlcnRlciAmb3BlcmF0b3I9KGNvbnN0IENvbG9yQ29udmVydGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKaW5kZXggNmY3ZGMzOC4uOWQyY2ZmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTI4LDYgKzI4LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBTdHJpbmc4OwogCiBjbGFzcyBEYXRhU291cmNlIDogcHVibGljIFJlZkJhc2UgewpAQCAtNTksMTAgKzYwLDE0IEBACiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLSAgICBib29sIHNuaWZmKFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisgICAgYm9vbCBzbmlmZihTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHNwPEFNZXNzYWdlPiAqbWV0YSk7CiAKKyAgICAvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluICJtZXRhIiB3aXRoIGFuIEFNZXNzYWdlIGNvbnRhaW5pbmcKKyAgICAvLyBhIGRpY3Rpb25hcnkgb2YgdmFsdWVzIHRoYXQgaGVscHMgdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUKKyAgICAvLyBpdHMgc3RhdGUgd2l0aG91dCBkdXBsaWNhdGluZyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLgogICAgIHR5cGVkZWYgYm9vbCAoKlNuaWZmZXJGdW5jKSgKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwKKyAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKm1ldGEpOwogCiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmZXJGdW5jIGZ1bmMpOwogICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDBiZWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEhUVFBfREFUQVNPVVJDRV9IXwotCi0jZGVmaW5lIEhUVFBfREFUQVNPVVJDRV9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSFRUUFN0cmVhbTsKLQotY2xhc3MgSFRUUERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgSFRUUERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7Ci0KLSAgICBIVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0KCk7Ci0gICAgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5IVFRQRGF0YVNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrQnVmZmVyU2l6ZSA9IDY0ICogMTAyNCwKLQotICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBzb2NrZXQtcmVhZCBlcnJvciB3ZSdsbCB0cnkgcmVjb25uZWN0aW5nCi0gICAgICAgIC8vIGFuZCByZXN0YXJ0aW5nIHRoZSByZWFkIGZvciBhdCBtb3N0IHRoaXMgbWFueSB0aW1lcy4KLSAgICAgICAga01heE51bVJldHJpZXMgPSAzLAotICAgIH07Ci0KLSAgICBlbnVtIFN0YXRlIHsKLSAgICAgICAgRElTQ09OTkVDVEVELAotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQKLSAgICB9OwotCi0gICAgU3RhdGUgbVN0YXRlOwotICAgIG11dGFibGUgTXV0ZXggbVN0YXRlTG9jazsKLQotICAgIFN0cmluZzggbUhlYWRlcnM7Ci0KLSAgICBTdHJpbmc4IG1TdGFydGluZ0hvc3Q7Ci0gICAgU3RyaW5nOCBtU3RhcnRpbmdQYXRoOwotICAgIGludCBtU3RhcnRpbmdQb3J0OwotCi0gICAgSFRUUFN0cmVhbSAqbUh0dHA7Ci0KLSAgICB2b2lkICptQnVmZmVyOwotICAgIHNpemVfdCBtQnVmZmVyTGVuZ3RoOwotICAgIG9mZl90IG1CdWZmZXJPZmZzZXQ7Ci0KLSAgICBib29sIG1Db250ZW50TGVuZ3RoVmFsaWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIG1Db250ZW50TGVuZ3RoOwotCi0gICAgaW50MzJfdCBtTnVtUmV0cmllc0xlZnQ7Ci0KLSAgICB2b2lkIGluaXQoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwotCi0gICAgc3NpemVfdCBzZW5kUmFuZ2VSZXF1ZXN0KHNpemVfdCBvZmZzZXQpOwotICAgIHZvaWQgaW5pdEhlYWRlcnMoY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKm92ZXJyaWRlcyk7Ci0KLSAgICBzdGF0dXNfdCBjb25uZWN0V2l0aFJlZGlyZWN0c0FuZFJhbmdlKG9mZl90IHJhbmdlU3RhcnQpOwotICAgIHZvaWQgYXBwbHlUaW1lb3V0UmVzcG9uc2UoKTsKLQotICAgIEhUVFBEYXRhU291cmNlKGNvbnN0IEhUVFBEYXRhU291cmNlICYpOwotICAgIEhUVFBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgSFRUUERhdGFTb3VyY2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEhUVFBfREFUQVNPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKaW5kZXggNmI5M2YxOS4uNzBiZDhlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaApAQCAtMzYsOSArMzYsMTEgQEAKICAgICBNUEVHNFdyaXRlcihpbnQgZmQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbSA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICB2b2lkIGJlZ2luQm94KGNvbnN0IGNoYXIgKmZvdXJjYyk7CiAgICAgdm9pZCB3cml0ZUludDgoaW50OF90IHgpOwpAQCAtNDksNiArNTEsOSBAQAogICAgIHZvaWQgd3JpdGVGb3VyY2MoY29uc3QgY2hhciAqZm91cmNjKTsKICAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2b2lkIGVuZEJveCgpOworICAgIHVpbnQzMl90IGludGVybGVhdmVEdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1JbnRlcmxlYXZlRHVyYXRpb25VczsgfQorICAgIHN0YXR1c190IHNldEludGVybGVhdmVEdXJhdGlvbih1aW50MzJfdCBkdXJhdGlvbik7CisgICAgaW50MzJfdCBnZXRUaW1lU2NhbGUoKSBjb25zdCB7IHJldHVybiBtVGltZVNjYWxlOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUEVHNFdyaXRlcigpOwpAQCAtNTcsMTYgKzYyLDk2IEBACiAgICAgY2xhc3MgVHJhY2s7CiAKICAgICBGSUxFICptRmlsZTsKKyAgICBib29sIG1Vc2U0Qnl0ZU5hbExlbmd0aDsKKyAgICBib29sIG1Vc2UzMkJpdE9mZnNldDsKKyAgICBib29sIG1QYXVzZWQ7CisgICAgYm9vbCBtU3RhcnRlZDsKICAgICBvZmZfdCBtT2Zmc2V0OwogICAgIG9mZl90IG1NZGF0T2Zmc2V0OworICAgIHVpbnQ4X3QgKm1Nb292Qm94QnVmZmVyOworICAgIG9mZl90IG1Nb292Qm94QnVmZmVyT2Zmc2V0OworICAgIGJvb2wgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeTsKKyAgICBvZmZfdCBtRnJlZUJveE9mZnNldDsKKyAgICBib29sIG1TdHJlYW1hYmxlRmlsZTsKKyAgICBvZmZfdCBtRXN0aW1hdGVkTW9vdkJveFNpemU7CisgICAgdWludDMyX3QgbUludGVybGVhdmVEdXJhdGlvblVzOworICAgIGludDMyX3QgbVRpbWVTY2FsZTsKKyAgICBpbnQ2NF90IG1TdGFydFRpbWVzdGFtcFVzOworCiAgICAgTXV0ZXggbUxvY2s7CiAKICAgICBMaXN0PFRyYWNrICo+IG1UcmFja3M7CiAKICAgICBMaXN0PG9mZl90PiBtQm94ZXM7CiAKLSAgICBvZmZfdCBhZGRTYW1wbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7Ci0gICAgb2ZmX3QgYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBzZXRTdGFydFRpbWVzdGFtcFVzKGludDY0X3QgdGltZVVzKTsKKyAgICBpbnQ2NF90IGdldFN0YXJ0VGltZXN0YW1wVXMoKTsgIC8vIE5vdCBjb25zdAorICAgIHN0YXR1c190IHN0YXJ0VHJhY2tzKE1ldGFEYXRhICpwYXJhbXMpOworICAgIHNpemVfdCBudW1UcmFja3MoKTsKKyAgICBpbnQ2NF90IGVzdGltYXRlTW9vdkJveFNpemUoaW50MzJfdCBiaXRSYXRlKTsKKworICAgIHN0cnVjdCBDaHVuayB7CisgICAgICAgIFRyYWNrICAgICAgICAgICAgICAgKm1UcmFjazsgICAgICAgIC8vIE93bmVyCisgICAgICAgIGludDY0X3QgICAgICAgICAgICAgbVRpbWVTdGFtcFVzOyAgIC8vIFRpbWVzdGFtcCBvZiB0aGUgMXN0IHNhbXBsZQorICAgICAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1TYW1wbGVzOyAgICAgICAvLyBTYW1wbGUgZGF0YQorCisgICAgICAgIC8vIENvbnZlbmllbnQgY29uc3RydWN0b3IKKyAgICAgICAgQ2h1bmsoVHJhY2sgKnRyYWNrLCBpbnQ2NF90IHRpbWVVcywgTGlzdDxNZWRpYUJ1ZmZlciAqPiBzYW1wbGVzKQorICAgICAgICAgICAgOiBtVHJhY2sodHJhY2spLCBtVGltZVN0YW1wVXModGltZVVzKSwgbVNhbXBsZXMoc2FtcGxlcykgeworICAgICAgICB9CisKKyAgICB9OworICAgIHN0cnVjdCBDaHVua0luZm8geworICAgICAgICBUcmFjayAgICAgICAgICAgICAgICptVHJhY2s7ICAgICAgICAvLyBPd25lcgorICAgICAgICBMaXN0PENodW5rPiAgICAgICAgIG1DaHVua3M7ICAgICAgICAvLyBSZW1haW5pbmcgY2h1bmtzIHRvIGJlIHdyaXR0ZW4KKyAgICB9OworCisgICAgYm9vbCAgICAgICAgICAgIG1Jc0ZpcnN0Q2h1bms7CisgICAgdm9sYXRpbGUgYm9vbCAgIG1Eb25lOyAgICAgICAgICAgICAgICAgIC8vIFdyaXRlciB0aHJlYWQgaXMgZG9uZT8KKyAgICBwdGhyZWFkX3QgICAgICAgbVRocmVhZDsgICAgICAgICAgICAgICAgLy8gVGhyZWFkIGlkIGZvciB0aGUgd3JpdGVyCisgICAgTGlzdDxDaHVua0luZm8+IG1DaHVua0luZm9zOyAgICAgICAgICAgIC8vIENodW5rIGluZm9zCisgICAgQ29uZGl0aW9uICAgICAgIG1DaHVua1JlYWR5Q29uZGl0aW9uOyAgIC8vIFNpZ25hbCB0aGF0IGNodW5rcyBhcmUgYXZhaWxhYmxlCisKKyAgICAvLyBXcml0ZXIgdGhyZWFkIGhhbmRsaW5nCisgICAgc3RhdHVzX3Qgc3RhcnRXcml0ZXJUaHJlYWQoKTsKKyAgICB2b2lkIHN0b3BXcml0ZXJUaHJlYWQoKTsKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICptZSk7CisgICAgdm9pZCB0aHJlYWRGdW5jKCk7CisKKyAgICAvLyBCdWZmZXIgYSBzaW5nbGUgY2h1bmsgdG8gYmUgd3JpdHRlbiBvdXQgbGF0ZXIuCisgICAgdm9pZCBidWZmZXJDaHVuayhjb25zdCBDaHVuayYgY2h1bmspOworCisgICAgLy8gV3JpdGUgYWxsIGJ1ZmZlcmVkIGNodW5rcyBmcm9tIGFsbCB0cmFja3MKKyAgICB2b2lkIHdyaXRlQ2h1bmtzKCk7CisKKyAgICAvLyBXcml0ZSBhIGNodW5rIGlmIHRoZXJlIGlzIG9uZQorICAgIHN0YXR1c190IHdyaXRlT25lQ2h1bmsoKTsKKworICAgIC8vIFdyaXRlIHRoZSBmaXJzdCBjaHVuayBmcm9tIHRoZSBnaXZlbiBDaHVua0luZm8uCisgICAgdm9pZCB3cml0ZUZpcnN0Q2h1bmsoQ2h1bmtJbmZvKiBpbmZvKTsKKworICAgIC8vIEFkanVzdCBvdGhlciB0cmFjayBtZWRpYSBjbG9jayAocHJlc3VtYWJseSB3YWxsIGNsb2NrKQorICAgIC8vIGJhc2VkIG9uIGF1ZGlvIHRyYWNrIG1lZGlhIGNsb2NrIHdpdGggdGhlIGRyaWZ0IHRpbWUuCisgICAgaW50NjRfdCBtRHJpZnRUaW1lVXM7CisgICAgdm9pZCBzZXREcmlmdFRpbWVVcyhpbnQ2NF90IGRyaWZ0VGltZVVzKTsKKyAgICBpbnQ2NF90IGdldERyaWZ0VGltZVVzKCk7CisKKyAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgbmFsIGxlbmd0aCBpcyA0IGJ5dGVzIG9yIDIgYnl0ZXMKKyAgICAvLyBPbmx5IG1ha2VzIHNlbnNlIGZvciBILjI2NC9BVkMKKyAgICBib29sIHVzZU5hbExlbmd0aEZvdXIoKTsKKworICAgIHZvaWQgbG9jaygpOworICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICAvLyBBY3F1aXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhlc2UgbWV0aG9kcworICAgIG9mZl90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIG9mZl90IGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICBpbmxpbmUgc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVtYiwgRklMRSogc3RyZWFtKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCk7CisgICAgYm9vbCB1c2UzMkJpdEZpbGVPZmZzZXQoKSBjb25zdDsKKyAgICBib29sIGV4Y2VlZHNGaWxlRHVyYXRpb25MaW1pdCgpOworICAgIHZvaWQgdHJhY2tQcm9ncmVzc1N0YXR1cyhjb25zdCBUcmFjayogdHJhY2ssIGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIgPSBPSyk7CiAKICAgICBNUEVHNFdyaXRlcihjb25zdCBNUEVHNFdyaXRlciAmKTsKICAgICBNUEVHNFdyaXRlciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0V3JpdGVyICYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmgKaW5kZXggMjA3MTk1YS4uOTJjZTA2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHOwogCitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlBYOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOwpAQCAtMzMsMTEgKzM0LDE1IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVc7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0c7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKaW5kZXggOTZkNTdlNy4uZGFmYzYyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjEsMjggKzYyLDU2IEBACiAgICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCiAgICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCiAgICAgc3RydWN0IFJlYWRPcHRpb25zIHsKKyAgICAgICAgZW51bSBTZWVrTW9kZSB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICB9OworCiAgICAgICAgIFJlYWRPcHRpb25zKCk7CiAKICAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgogICAgICAgICB2b2lkIHJlc2V0KCk7CiAKLSAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzKTsKKyAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOwogICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMpIGNvbnN0OworICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3Q7CisKKyAgICAgICAgLy8gT3B0aW9uIGFsbG93cyBlbmNvZGVyIHRvIHNraXAgc29tZSBmcmFtZXMgdW50aWwgdGhlIHNwZWNpZmllZAorICAgICAgICAvLyB0aW1lIHN0YW1wLgorICAgICAgICAvLyBUbyBwcmV2ZW50IGZyb20gYmVpbmcgYWJ1c2VkLCB3aGVuIHRoZSBza2lwRnJhbWUgdGltZXN0YW1wIGlzCisgICAgICAgIC8vIGZvdW5kIHRvIGJlIG1vcmUgdGhhbiAxIHNlY29uZCBsYXRlciB0aGFuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCwKKyAgICAgICAgLy8gYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBmcm9tIHJlYWQoKS4KKyAgICAgICAgdm9pZCBjbGVhclNraXBGcmFtZSgpOworICAgICAgICBib29sIGdldFNraXBGcmFtZShpbnQ2NF90ICp0aW1lVXMpIGNvbnN0OworICAgICAgICB2b2lkIHNldFNraXBGcmFtZShpbnQ2NF90IHRpbWVVcyk7CiAKICAgICAgICAgdm9pZCBzZXRMYXRlQnkoaW50NjRfdCBsYXRlbmVzc191cyk7CiAgICAgICAgIGludDY0X3QgZ2V0TGF0ZUJ5KCkgY29uc3Q7CiAKICAgICBwcml2YXRlOgogICAgICAgICBlbnVtIE9wdGlvbnMgeworICAgICAgICAgICAgLy8gQml0IG1hcAogICAgICAgICAgICAga1NlZWtUb19PcHRpb24gICAgICA9IDEsCisgICAgICAgICAgICBrU2tpcEZyYW1lX09wdGlvbiAgID0gMiwKICAgICAgICAgfTsKIAogICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKICAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOwogICAgICAgICBpbnQ2NF90IG1MYXRlbmVzc1VzOworCisgICAgICAgIGludDY0X3QgbVNraXBGcmFtZVVudGlsVGltZVVzOwogICAgIH07CiAKKyAgICAvLyBDYXVzZXMgdGhpcyBzb3VyY2UgdG8gc3VzcGVuZCBwdWxsaW5nIGRhdGEgZnJvbSBpdHMgdXBzdHJlYW0gc291cmNlCisgICAgLy8gdW50aWwgYSBzdWJzZXF1ZW50IHJlYWQtd2l0aC1zZWVrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgYnkKKyAgICAvLyBPTVhDb2RlYy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFTb3VyY2UoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCmluZGV4IGI4MjMyYzYuLjVjYzhkY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKQEAgLTE5LDIyICsxOSw0NiBAQAogI2RlZmluZSBNRURJQV9XUklURVJfSF8KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYVNvdXJjZTsKK3N0cnVjdCBNZXRhRGF0YTsKIAogc3RydWN0IE1lZGlhV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIE1lZGlhV3JpdGVyKCkge30KKyAgICBNZWRpYVdyaXRlcigpCisgICAgICAgIDogbU1heEZpbGVTaXplTGltaXRCeXRlcygwKSwKKyAgICAgICAgICBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcygwKSB7CisgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXhGaWxlU2l6ZShpbnQ2NF90IGJ5dGVzKSB7IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPSBieXRlczsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRNYXhGaWxlRHVyYXRpb24oaW50NjRfdCBkdXJhdGlvblVzKSB7IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzID0gZHVyYXRpb25VczsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhV3JpdGVyKCkge30KKyAgICBpbnQ2NF90IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXM7CisgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKKyAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwogCisgICAgdm9pZCBub3RpZnkoaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyKSB7CisgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnkobXNnLCBleHQxLCBleHQyKTsKKyAgICAgICAgfQorICAgIH0KIHByaXZhdGU6CiAgICAgTWVkaWFXcml0ZXIoY29uc3QgTWVkaWFXcml0ZXIgJik7CiAgICAgTWVkaWFXcml0ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYVdyaXRlciAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaAppbmRleCBkYzJiZDUwLi4xNTk0ZTMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCkBAIC0zMCwxMCArMzAsMTMgQEAKIC8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgogZW51bSB7CiAgICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywKLSAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsCi0gICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLAotICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywKKyAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90CisgICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdAorICAgIGtLZXlJRnJhbWVzSW50ZXJ2YWwgICA9ICdpZml2JywgIC8vIGludDMyX3QKKyAgICBrS2V5U3RyaWRlICAgICAgICAgICAgPSAnc3RyZCcsICAvLyBpbnQzMl90CisgICAga0tleVNsaWNlSGVpZ2h0ICAgICAgID0gJ3NsaHQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDaGFubmVsQ291bnQgICAgICA9ICcjY2huJywgIC8vIGludDMyX3QKKyAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhbHNvIHZpZGVvIGZyYW1lIHJhdGUpCiAgICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQogICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCiAgICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKQEAgLTQzLDYgKzQ2LDEwIEBACiAgICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKICAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQogICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlOVFBUaW1lICAgICAgICAgICA9ICdudHBUJywgIC8vIHVpbnQ2NF90IChudHAtdGltZXN0YW1wKQorICAgIGtLZXlUYXJnZXRUaW1lICAgICAgICA9ICd0YXJUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEcmlmdFRpbWUgICAgICAgICA9ICdkZnRUJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlBbmNob3JUaW1lICAgICAgICA9ICdhbmNUJywgIC8vIGludDY0X3QgKHVzZWNzKQogICAgIGtLZXlEdXJhdGlvbiAgICAgICAgICA9ICdkdXJhJywgIC8vIGludDY0X3QgKHVzZWNzKQogICAgIGtLZXlDb2xvckZvcm1hdCAgICAgICA9ICdjb2xmJywKICAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCkBAIC02NSw2ICs3MiwyOSBAQAogICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKICAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCiAgICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZworICAgIGtLZXlUaW1lU2NhbGUgICAgICAgICA9ICd0bXNsJywgIC8vIGludDMyX3QKKworICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCisgICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKKworICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKKyAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCisKKyAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKKyAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCisgICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KKyAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQorICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKKworICAgIGtLZXlOb3RSZWFsVGltZSAgICAgICA9ICdudHJ0JywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBPZ2cgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGxvb3BpbmcuLi4KKyAgICBrS2V5QXV0b0xvb3AgICAgICAgICAgPSAnYXV0TCcsICAvLyBib29sIChpbnQzMl90KQogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmgKaW5kZXggMWQ3NmExYS4uODc1YmM1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaApAQCAtMjcsNiArMjcsNyBAQAogCiBjbGFzcyBNZW1vcnlEZWFsZXI7CiBzdHJ1Y3QgT01YQ29kZWNPYnNlcnZlcjsKK3N0cnVjdCBDb2RlY1Byb2ZpbGVMZXZlbDsKIAogc3RydWN0IE9NWENvZGVjIDogcHVibGljIE1lZGlhU291cmNlLAogICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgewpAQCAtNTIsNiArNTMsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCiAgICAgdm9pZCBvbl9tZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOwogCiAgICAgLy8gZnJvbSBNZWRpYUJ1ZmZlck9ic2VydmVyCkBAIC05OCw2ICsxMDEsOCBAQAogICAgICAgICBrRGVjb2RlckxpZXNBYm91dE51bWJlck9mQ2hhbm5lbHMgICAgID0gMjU2LAogICAgICAgICBrSW5wdXRCdWZmZXJTaXplc0FyZUJvZ3VzICAgICAgICAgICAgID0gNTEyLAogICAgICAgICBrU3VwcG9ydHNNdWx0aXBsZUZyYW1lc1BlcklucHV0QnVmZmVyID0gMTAyNCwKKyAgICAgICAga0F2b2lkTWVtY29weUlucHV0UmVjb3JkaW5nRnJhbWVzICAgICA9IDIwNDgsCisgICAgICAgIGtSZXF1aXJlc0xhcmdlckVuY29kZXJPdXRwdXRCdWZmZXIgICAgPSA0MDk2LAogICAgIH07CiAKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CkBAIC0xMzcsMTIgKzE0MiwxNyBAQAogICAgIGJvb2wgbU5vTW9yZU91dHB1dERhdGE7CiAgICAgYm9vbCBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQ7CiAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbVNlZWtNb2RlOworICAgIGludDY0X3QgbVRhcmdldFRpbWVVczsKKyAgICBpbnQ2NF90IG1Ta2lwVGltZVVzOwogCiAgICAgTWVkaWFCdWZmZXIgKm1MZWZ0T3ZlckJ1ZmZlcjsKIAogICAgIE11dGV4IG1Mb2NrOwogICAgIENvbmRpdGlvbiBtQXN5bmNDb21wbGV0aW9uOwogCisgICAgYm9vbCBtUGF1c2VkOworCiAgICAgLy8gQSBsaXN0IG9mIGluZGljZXMgaW50byBtUG9ydFN0YXR1c1trUG9ydEluZGV4T3V0cHV0XSBmaWxsZWQgd2l0aCBkYXRhLgogICAgIExpc3Q8c2l6ZV90PiBtRmlsbGVkQnVmZmVyczsKICAgICBDb25kaXRpb24gbUJ1ZmZlckZpbGxlZDsKQEAgLTE1Niw4ICsxNjYsOCBAQAogCiAgICAgdm9pZCBzZXRDb21wb25lbnRSb2xlKCk7CiAKLSAgICB2b2lkIHNldEFNUkZvcm1hdChib29sIGlzV0FNUik7Ci0gICAgdm9pZCBzZXRBQUNGb3JtYXQoaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICB2b2lkIHNldEFNUkZvcm1hdChib29sIGlzV0FNUiwgaW50MzJfdCBiaXRSYXRlKTsKKyAgICB2b2lkIHNldEFBQ0Zvcm1hdChpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgYml0UmF0ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCkBAIC0xNjUsMTAgKzE3NSwyNCBAQAogICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQpOwogCiAgICAgdm9pZCBzZXRWaWRlb0lucHV0Rm9ybWF0KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgT01YX1UzMiB3aWR0aCwgT01YX1UzMiBoZWlnaHQpOworICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAotICAgIHN0YXR1c190IHNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycygpOwotICAgIHN0YXR1c190IHNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoKTsKKyAgICBzdGF0dXNfdCBzZXR1cEJpdFJhdGUoaW50MzJfdCBiaXRSYXRlKTsKKyAgICBzdGF0dXNfdCBzZXR1cEVycm9yQ29ycmVjdGlvblBhcmFtZXRlcnMoKTsKKyAgICBzdGF0dXNfdCBzZXR1cEgyNjNFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOworICAgIHN0YXR1c190IHNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpOworICAgIHN0YXR1c190IHNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICBzdGF0dXNfdCBmaW5kVGFyZ2V0Q29sb3JGb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIE9NWF9DT0xPUl9GT1JNQVRUWVBFICpjb2xvckZvcm1hdCk7CisKKyAgICBzdGF0dXNfdCBpc0NvbG9yRm9ybWF0U3VwcG9ydGVkKAorICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsIGludCBwb3J0SW5kZXgpOworCisgICAgLy8gSWYgcHJvZmlsZS9sZXZlbCBpcyBzZXQgaW4gdGhlIG1ldGEgZGF0YSwgaXRzIHZhbHVlIGluIHRoZSBtZXRhCisgICAgLy8gZGF0YSB3aWxsIGJlIHVzZWQ7IG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLgorICAgIHN0YXR1c190IGdldFZpZGVvUHJvZmlsZUxldmVsKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwKKyAgICAgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsJiBkZWZhdWx0UHJvZmlsZUxldmVsLAorICAgICAgICAgICAgQ29kZWNQcm9maWxlTGV2ZWwmIHByb2ZpbGVMZXZlbCk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb091dHB1dEZvcm1hdCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQXRvbWl6ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQXRvbWl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjNhNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfQVRPTUlaRVJfSF8KKworI2RlZmluZSBBX0FUT01JWkVSX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQXRvbWl6ZXIgeworICAgIHN0YXRpYyBjb25zdCBjaGFyICpBdG9taXplKGNvbnN0IGNoYXIgKm5hbWUpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBBQXRvbWl6ZXIgZ0F0b21pemVyOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgVmVjdG9yPExpc3Q8QVN0cmluZz4gPiBtQXRvbXM7CisKKyAgICBBQXRvbWl6ZXIoKTsKKworICAgIGNvbnN0IGNoYXIgKmF0b21pemUoY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBzdGF0aWMgdWludDMyX3QgSGFzaChjb25zdCBjaGFyICpzKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFBdG9taXplcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfQVRPTUlaRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjZWVhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfQkFTRV9IXworCisjZGVmaW5lIEFfQkFTRV9IXworCisjZGVmaW5lIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKG5hbWUpIFwKKyAgICBuYW1lKGNvbnN0IG5hbWUgJik7IFwKKyAgICBuYW1lICZvcGVyYXRvcj0oY29uc3QgbmFtZSAmKQorCisjZW5kaWYgIC8vIEFfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzNTIxMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9CSVRfUkVBREVSX0hfCisKKyNkZWZpbmUgQV9CSVRfUkVBREVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJpdFJlYWRlciB7CisgICAgQUJpdFJlYWRlcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB1aW50MzJfdCBnZXRCaXRzKHNpemVfdCBuKTsKKyAgICB2b2lkIHNraXBCaXRzKHNpemVfdCBuKTsKKworICAgIHNpemVfdCBudW1CaXRzTGVmdCgpIGNvbnN0OworCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKworICAgIHVpbnQzMl90IG1SZXNlcnZvaXI7ICAvLyBsZWZ0LWFsaWduZWQgYml0cworICAgIHNpemVfdCBtTnVtQml0c0xlZnQ7CisKKyAgICB2b2lkIGZpbGxSZXNlcnZvaXIoKTsKKyAgICB2b2lkIHB1dEJpdHModWludDMyX3QgeCwgc2l6ZV90IG4pOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUJpdFJlYWRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfQklUX1JFQURFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmMGFlZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9CVUZGRVJfSF8KKworI2RlZmluZSBBX0JVRkZFUl9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEFCdWZmZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQUJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpOworICAgIEFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IGNhcGFjaXR5KTsKKworICAgIHZvaWQgc2V0RmFyZXdlbGxNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiBtc2cpOworCisgICAgdWludDhfdCAqYmFzZSgpIHsgcmV0dXJuICh1aW50OF90ICopbURhdGE7IH0KKyAgICB1aW50OF90ICpkYXRhKCkgeyByZXR1cm4gKHVpbnQ4X3QgKiltRGF0YSArIG1SYW5nZU9mZnNldDsgfQorICAgIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1DYXBhY2l0eTsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVJhbmdlTGVuZ3RoOyB9CisgICAgc2l6ZV90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1SYW5nZU9mZnNldDsgfQorCisgICAgdm9pZCBzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIHNldEludDMyRGF0YShpbnQzMl90IGRhdGEpIHsgbUludDMyRGF0YSA9IGRhdGE7IH0KKyAgICBpbnQzMl90IGludDMyRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1JbnQzMkRhdGE7IH0KKworICAgIHNwPEFNZXNzYWdlPiBtZXRhKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQnVmZmVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1GYXJld2VsbDsKKyAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbUNhcGFjaXR5OworICAgIHNpemVfdCBtUmFuZ2VPZmZzZXQ7CisgICAgc2l6ZV90IG1SYW5nZUxlbmd0aDsKKworICAgIGludDMyX3QgbUludDMyRGF0YTsKKworICAgIGJvb2wgbU93bnNEYXRhOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUJ1ZmZlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5ODZhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9ERUJVR19IXworCisjZGVmaW5lIEFfREVCVUdfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0gTG9nVHlwZSB7CisgICAgVkVSQk9TRSwKKyAgICBJTkZPLAorICAgIFdBUk5JTkcsCisgICAgRVJST1IsCisgICAgRkFUQUwsCit9OworCitzdHJ1Y3QgTG9nZ2VyIHsKKyAgICBMb2dnZXIoTG9nVHlwZSB0eXBlKTsKKyAgICB2aXJ0dWFsIH5Mb2dnZXIoKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IExvZ2dlciAmb3BlcmF0b3I8PChjb25zdCBUICZ4KSB7CisgICAgICAgIG1NZXNzYWdlLmFwcGVuZCh4KTsKKworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcml2YXRlOgorICAgIGFuZHJvaWQ6OkFTdHJpbmcgbU1lc3NhZ2U7CisgICAgTG9nVHlwZSBtTG9nVHlwZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvZ2dlcik7Cit9OworCitjb25zdCBjaGFyICpMZWFmTmFtZShjb25zdCBjaGFyICpzKTsKKworI3VuZGVmIExPRworI2RlZmluZSBMT0codHlwZSkgICAgTG9nZ2VyKHR5cGUpIDw8IExlYWZOYW1lKF9fRklMRV9fKSA8PCAiOiIgPDwgX19MSU5FX18gPDwgIiAiCisKKyNkZWZpbmUgQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkNIRUNLKCIgI2NvbmRpdGlvbiAiKSBmYWlsZWQuIjsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoZmFsc2UpCisKKyNkZWZpbmUgTUFLRV9DT01QQVJBVE9SKHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTxjbGFzcyBBLCBjbGFzcyBCPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU3RyaW5nIENvbXBhcmVfIyNzdWZmaXgoY29uc3QgQSAmYSwgY29uc3QgQiAmYikgeyAgICAgIFwKKyAgICAgICAgQVN0cmluZyByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEoYSBvcCBiKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoIiB2cy4gIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK01BS0VfQ09NUEFSQVRPUihFUSw9PSkKK01BS0VfQ09NUEFSQVRPUihORSwhPSkKK01BS0VfQ09NUEFSQVRPUihMRSw8PSkKK01BS0VfQ09NUEFSQVRPUihHRSw+PSkKK01BS0VfQ09NUEFSQVRPUihMVCw8KQorTUFLRV9DT01QQVJBVE9SKEdULD4pCisKKyNkZWZpbmUgQ0hFQ0tfT1AoeCx5LHN1ZmZpeCxvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVN0cmluZyBfX19yZXMgPSBDb21wYXJlXyMjc3VmZml4KHgsIHkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFfX19yZXMuZW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkNIRUNLXyIgI3N1ZmZpeCAiKCIgI3ggIiwiICN5ICIpIGZhaWxlZDogIiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgX19fcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKKworI2RlZmluZSBDSEVDS19FUSh4LHkpICAgQ0hFQ0tfT1AoeCx5LEVRLD09KQorI2RlZmluZSBDSEVDS19ORSh4LHkpICAgQ0hFQ0tfT1AoeCx5LE5FLCE9KQorI2RlZmluZSBDSEVDS19MRSh4LHkpICAgQ0hFQ0tfT1AoeCx5LExFLDw9KQorI2RlZmluZSBDSEVDS19MVCh4LHkpICAgQ0hFQ0tfT1AoeCx5LExULDwpCisjZGVmaW5lIENIRUNLX0dFKHgseSkgICBDSEVDS19PUCh4LHksR0UsPj0pCisjZGVmaW5lIENIRUNLX0dUKHgseSkgICBDSEVDS19PUCh4LHksR1QsPikKKworI2RlZmluZSBUUkVTUEFTUygpICAgICAgTE9HKEZBVEFMKSA8PCAiU2hvdWxkIG5vdCBiZSBoZXJlLiIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX0RFQlVHX0hfCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwOGI1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfSEFORExFUl9IXworCisjZGVmaW5lIEFfSEFORExFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEFIYW5kbGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEFIYW5kbGVyKCkKKyAgICAgICAgOiBtSUQoMCkgeworICAgIH0KKworICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSUQ7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbG9vcGVyKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IEFMb29wZXJSb3N0ZXI7CisKKyAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIG1JRDsKKworICAgIHZvaWQgc2V0SUQoQUxvb3Blcjo6aGFuZGxlcl9pZCBpZCkgeworICAgICAgICBtSUQgPSBpZDsKKyAgICB9CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBSGFuZGxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTc4NjZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBBX0hBTkRMRVJfUkVGTEVDVE9SX0hfCisKKyNkZWZpbmUgQV9IQU5ETEVSX1JFRkxFQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdHJ1Y3QgQUhhbmRsZXJSZWZsZWN0b3IgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIEFIYW5kbGVyUmVmbGVjdG9yKFQgKnRhcmdldCkKKyAgICAgICAgOiBtVGFyZ2V0KHRhcmdldCkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBzcDxUPiB0YXJnZXQgPSBtVGFyZ2V0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRhcmdldCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YXJnZXQtPm9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8VD4gbVRhcmdldDsKKworICAgIEFIYW5kbGVyUmVmbGVjdG9yKGNvbnN0IEFIYW5kbGVyUmVmbGVjdG9yPFQ+ICYpOworICAgIEFIYW5kbGVyUmVmbGVjdG9yPFQ+ICZvcGVyYXRvcj0oY29uc3QgQUhhbmRsZXJSZWZsZWN0b3I8VD4gJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfSEFORExFUl9SRUZMRUNUT1JfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTBjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTE9PUEVSX0hfCisKKyNkZWZpbmUgQV9MT09QRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBSGFuZGxlcjsKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEFMb29wZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgdHlwZWRlZiBpbnQzMl90IGV2ZW50X2lkOworICAgIHR5cGVkZWYgaW50MzJfdCBoYW5kbGVyX2lkOworCisgICAgQUxvb3BlcigpOworCisgICAgLy8gVGFrZXMgZWZmZWN0IGluIGEgc3Vic2VxdWVudCBjYWxsIHRvIHN0YXJ0KCkuCisgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgaGFuZGxlcl9pZCByZWdpc3RlckhhbmRsZXIoY29uc3Qgc3A8QUhhbmRsZXI+ICZoYW5kbGVyKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJIYW5kbGVyKGhhbmRsZXJfaWQgaGFuZGxlcklEKTsKKworICAgIHN0YXR1c190IHN0YXJ0KAorICAgICAgICAgICAgYm9vbCBydW5PbkNhbGxpbmdUaHJlYWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGJvb2wgY2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBQUklPUklUWV9ERUZBVUxUCisgICAgICAgICAgICApOworCisgICAgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgc3RhdGljIGludDY0X3QgR2V0Tm93VXMoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFMb29wZXIoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IEFMb29wZXJSb3N0ZXI7CisKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBpbnQ2NF90IG1XaGVuVXM7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtTWVzc2FnZTsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1RdWV1ZUNoYW5nZWRDb25kaXRpb247CisKKyAgICBBU3RyaW5nIG1OYW1lOworCisgICAgTGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisKKyAgICBzdHJ1Y3QgTG9vcGVyVGhyZWFkOworICAgIHNwPExvb3BlclRocmVhZD4gbVRocmVhZDsKKyAgICBib29sIG1SdW5uaW5nTG9jYWxseTsKKworICAgIHZvaWQgcG9zdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKTsKKyAgICBib29sIGxvb3AoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFMb29wZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX0xPT1BFUl9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiZDRlZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9MT09QRVJfUk9TVEVSX0hfCisKKyNkZWZpbmUgQV9MT09QRVJfUk9TVEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTG9vcGVyUm9zdGVyIHsKKyAgICBBTG9vcGVyUm9zdGVyKCk7CisKKyAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIHJlZ2lzdGVySGFuZGxlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+IGxvb3BlciwgY29uc3Qgc3A8QUhhbmRsZXI+ICZoYW5kbGVyKTsKKworICAgIHZvaWQgdW5yZWdpc3RlckhhbmRsZXIoQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQpOworCisgICAgdm9pZCBwb3N0TWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzID0gMCk7CisgICAgdm9pZCBkZWxpdmVyTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBzcDxBTG9vcGVyPiBmaW5kTG9vcGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSGFuZGxlckluZm8geworICAgICAgICB3cDxBTG9vcGVyPiBtTG9vcGVyOworICAgICAgICB3cDxBSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgfTsKKworICAgIE11dGV4IG1Mb2NrOworICAgIEtleWVkVmVjdG9yPEFMb29wZXI6OmhhbmRsZXJfaWQsIEhhbmRsZXJJbmZvPiBtSGFuZGxlcnM7CisgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBtTmV4dEhhbmRsZXJJRDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFMb29wZXJSb3N0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX0xPT1BFUl9ST1NURVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3NGNiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01FU1NBR0VfSF8KKworI2RlZmluZSBBX01FU1NBR0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQVN0cmluZzsKKworc3RydWN0IEFNZXNzYWdlIDogcHVibGljIFJlZkJhc2UgeworICAgIEFNZXNzYWdlKHVpbnQzMl90IHdoYXQgPSAwLCBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCA9IDApOworCisgICAgdm9pZCBzZXRXaGF0KHVpbnQzMl90IHdoYXQpOworICAgIHVpbnQzMl90IHdoYXQoKSBjb25zdDsKKworICAgIHZvaWQgc2V0VGFyZ2V0KEFMb29wZXI6OmhhbmRsZXJfaWQgdGFyZ2V0KTsKKyAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIHRhcmdldCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90IHZhbHVlKTsKKyAgICB2b2lkIHNldEludDY0KGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgc2V0U2l6ZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdmFsdWUpOworICAgIHZvaWQgc2V0RmxvYXQoY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgdmFsdWUpOworICAgIHZvaWQgc2V0RG91YmxlKGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBzZXRQb2ludGVyKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlKTsKKyAgICB2b2lkIHNldFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzLCBzc2l6ZV90IGxlbiA9IC0xKTsKKyAgICB2b2lkIHNldE9iamVjdChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxSZWZCYXNlPiAmb2JqKTsKKyAgICB2b2lkIHNldE1lc3NhZ2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvYmopOworCisgICAgYm9vbCBmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEludDY0KGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRTaXplKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEZsb2F0KGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICp2YWx1ZSkgY29uc3Q7CisgICAgYm9vbCBmaW5kRG91YmxlKGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZFBvaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZE9iamVjdChjb25zdCBjaGFyICpuYW1lLCBzcDxSZWZCYXNlPiAqb2JqKSBjb25zdDsKKyAgICBib29sIGZpbmRNZXNzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPEFNZXNzYWdlPiAqb2JqKSBjb25zdDsKKworICAgIHZvaWQgcG9zdChpbnQ2NF90IGRlbGF5VXMgPSAwKTsKKworICAgIHNwPEFNZXNzYWdlPiBkdXAoKSBjb25zdDsKKworICAgIEFTdHJpbmcgZGVidWdTdHJpbmcoaW50MzJfdCBpbmRlbnQgPSAwKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZXNzYWdlKCk7CisKK3ByaXZhdGU6CisgICAgZW51bSBUeXBlIHsKKyAgICAgICAga1R5cGVJbnQzMiwKKyAgICAgICAga1R5cGVJbnQ2NCwKKyAgICAgICAga1R5cGVTaXplLAorICAgICAgICBrVHlwZUZsb2F0LAorICAgICAgICBrVHlwZURvdWJsZSwKKyAgICAgICAga1R5cGVQb2ludGVyLAorICAgICAgICBrVHlwZVN0cmluZywKKyAgICAgICAga1R5cGVPYmplY3QsCisgICAgICAgIGtUeXBlTWVzc2FnZSwKKyAgICB9OworCisgICAgdWludDMyX3QgbVdoYXQ7CisgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBtVGFyZ2V0OworCisgICAgc3RydWN0IEl0ZW0geworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVZhbHVlOworICAgICAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKyAgICAgICAgICAgIHZvaWQgKnB0clZhbHVlOworICAgICAgICAgICAgUmVmQmFzZSAqcmVmVmFsdWU7CisgICAgICAgICAgICBBU3RyaW5nICpzdHJpbmdWYWx1ZTsKKyAgICAgICAgfSB1OworICAgICAgICBjb25zdCBjaGFyICptTmFtZTsKKyAgICAgICAgVHlwZSBtVHlwZTsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1JdGVtcyA9IDE2CisgICAgfTsKKyAgICBJdGVtIG1JdGVtc1trTWF4TnVtSXRlbXNdOworICAgIHNpemVfdCBtTnVtSXRlbXM7CisKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgSXRlbSAqYWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpOworICAgIHZvaWQgZnJlZUl0ZW0oSXRlbSAqaXRlbSk7CisgICAgY29uc3QgSXRlbSAqZmluZEl0ZW0oY29uc3QgY2hhciAqbmFtZSwgVHlwZSB0eXBlKSBjb25zdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZXNzYWdlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWFkZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1NUUklOR19IXworCisjZGVmaW5lIEFfU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQVN0cmluZyB7CisgICAgQVN0cmluZygpOworICAgIEFTdHJpbmcoY29uc3QgY2hhciAqcyk7CisgICAgQVN0cmluZyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgQVN0cmluZyhjb25zdCBBU3RyaW5nICZmcm9tKTsKKyAgICBBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBuKTsKKyAgICB+QVN0cmluZygpOworCisgICAgQVN0cmluZyAmb3BlcmF0b3I9KGNvbnN0IEFTdHJpbmcgJmZyb20pOworICAgIHZvaWQgc2V0VG8oY29uc3QgY2hhciAqcyk7CisgICAgdm9pZCBzZXRUbyhjb25zdCBjaGFyICpzLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBzZXRUbyhjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgbik7CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICAgIGNvbnN0IGNoYXIgKmNfc3RyKCkgY29uc3Q7CisKKyAgICBib29sIGVtcHR5KCkgY29uc3Q7CisKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9pZCB0cmltKCk7CisgICAgdm9pZCBlcmFzZShzaXplX3Qgc3RhcnQsIHNpemVfdCBuKTsKKworICAgIHZvaWQgYXBwZW5kKGNoYXIgYykgeyBhcHBlbmQoJmMsIDEpOyB9CisgICAgdm9pZCBhcHBlbmQoY29uc3QgY2hhciAqcyk7CisgICAgdm9pZCBhcHBlbmQoY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemUpOworICAgIHZvaWQgYXBwZW5kKGNvbnN0IEFTdHJpbmcgJmZyb20pOworICAgIHZvaWQgYXBwZW5kKGNvbnN0IEFTdHJpbmcgJmZyb20sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBuKTsKKyAgICB2b2lkIGFwcGVuZChpbnQgeCk7CisgICAgdm9pZCBhcHBlbmQodW5zaWduZWQgeCk7CisgICAgdm9pZCBhcHBlbmQobG9uZyB4KTsKKyAgICB2b2lkIGFwcGVuZCh1bnNpZ25lZCBsb25nIHgpOworICAgIHZvaWQgYXBwZW5kKGxvbmcgbG9uZyB4KTsKKyAgICB2b2lkIGFwcGVuZCh1bnNpZ25lZCBsb25nIGxvbmcgeCk7CisgICAgdm9pZCBhcHBlbmQoZmxvYXQgeCk7CisgICAgdm9pZCBhcHBlbmQoZG91YmxlIHgpOworICAgIHZvaWQgYXBwZW5kKHZvaWQgKngpOworCisgICAgdm9pZCBpbnNlcnQoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IGluc2VydGlvblBvcyk7CisgICAgdm9pZCBpbnNlcnQoY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IHNpemUsIHNpemVfdCBpbnNlcnRpb25Qb3MpOworCisgICAgc3NpemVfdCBmaW5kKGNvbnN0IGNoYXIgKnN1YnN0cmluZywgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3Q7CisKKyAgICBzaXplX3QgaGFzaCgpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OworCisgICAgaW50IGNvbXBhcmUoY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCBzdGFydHNXaXRoKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3Q7CisKKyAgICB2b2lkIHRvbG93ZXIoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa0VtcHR5U3RyaW5nOworCisgICAgY2hhciAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworICAgIHNpemVfdCBtQWxsb2NTaXplOworCisgICAgdm9pZCBtYWtlTXV0YWJsZSgpOworfTsKKworQVN0cmluZyBTdHJpbmdQcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfU1RSSU5HX0hfCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQwYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEJBU0VfNjRfSF8KKworI2RlZmluZSBCQVNFXzY0X0hfCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQVN0cmluZzsKKworc3A8QUJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IEFTdHJpbmcgJnMpOwordm9pZCBlbmNvZGVCYXNlNjQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQkFTRV82NF9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwODNhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSEVYRFVNUF9IXworCisjZGVmaW5lIEhFWERVTVBfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhFWERVTVBfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9SRUFETUUgYi9pbmNsdWRlL3ByaXZhdGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNDE0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3ByaXZhdGUvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorVGhpcyBmb2xkZXIgY29udGFpbnMgcHJpdmF0ZSBpbmNsdWRlIGZpbGVzLgorCitUaGVzZSBpbmNsdWRlIGZpbGVzIGFyZSBwYXJ0IG9mIHRoZSBwcml2YXRlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YKK3ZhcmlvdXMgZnJhbWV3b3JrIGNvbXBvbmVudHMuICBVc2UgYXQgeW91ciBwZXJpbC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhOTlhNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUQ0JBU0VTSEFSRURfSAorI2RlZmluZSBBTkRST0lEX0VGRkVDVENCQVNFU0hBUkVEX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU2l6ZSBvZiBidWZmZXIgdXNlZCB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGJldHdlZW4gYXBwbGljYXRpb24gYW5kIG1lZGlhc2VydmVyIHByb2Nlc3Nlcy4KKyNkZWZpbmUgRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFIDEwMjQKKworCisvLyBTaGFyZWQgbWVtb3J5IGFyZWEgdXNlZCB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGJldHdlZW4gYXBwbGljYXRpb24gYW5kIG1lZGlhc2VydmVyCisvLyBwcm9jZXNzLgorc3RydWN0IGVmZmVjdF9wYXJhbV9jYmxrX3QKK3sKKyAgICAgICAgICAgICAgICBNdXRleCAgICAgICBsb2NrOworICAgIHZvbGF0aWxlICAgIHVpbnQzMl90ICAgIGNsaWVudEluZGV4OyAgICAvLyBDdXJyZW50IHJlYWQvd3JpdGUgaW5kZXggZm9yIGFwcGxpY2F0aW9uCisgICAgdm9sYXRpbGUgICAgdWludDMyX3QgICAgc2VydmVySW5kZXg7ICAgIC8vIEN1cnJlbnQgcmVhZC93cml0ZSBpbmRleCBmb3IgbWVkaWFzZXJ2ZXIKKyAgICAgICAgICAgICAgICB1aW50OF90KiAgICBidWZmZXI7ICAgICAgICAgLy8gc3RhcnQgb2YgcGFyYW1ldGVyIGJ1ZmZlcgorCisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX2NibGtfdCgpCisgICAgICAgICAgICAgICAgICAgIDogbG9jayhNdXRleDo6U0hBUkVEKSwgY2xpZW50SW5kZXgoMCksIHNlcnZlckluZGV4KDApIHt9Cit9OworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfRUZGRUNUQ0JBU0VTSEFSRURfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggOGUyZGIyMC4uMTUxMGY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC0zMiw2ICszMiwxOCBAQAogI2RlZmluZSBNQVhfUlVOX1RJTUVPVVRfTVMgICAgICAxMDAwCiAjZGVmaW5lIFdBSVRfUEVSSU9EX01TICAgICAgICAgIDEwCiAKKyNkZWZpbmUgQ0JMS19VTkRFUlJVTl9NU0sgICAgICAgMHgwMDAxCisjZGVmaW5lIENCTEtfVU5ERVJSVU5fT04gICAgICAgIDB4MDAwMSAgLy8gdW5kZXJydW4gKG91dCkgb3Igb3ZlcnJydW4gKGluKSBpbmRpY2F0aW9uCisjZGVmaW5lIENCTEtfVU5ERVJSVU5fT0ZGICAgICAgIDB4MDAwMCAgLy8gbm8gdW5kZXJydW4KKyNkZWZpbmUgQ0JMS19ESVJFQ1RJT05fTVNLICAgICAgMHgwMDAyCisjZGVmaW5lIENCTEtfRElSRUNUSU9OX09VVCAgICAgIDB4MDAwMiAgLy8gdGhpcyBjYmxrIGlzIGZvciBhbiBBdWRpb1RyYWNrCisjZGVmaW5lIENCTEtfRElSRUNUSU9OX0lOICAgICAgIDB4MDAwMCAgLy8gdGhpcyBjYmxrIGlzIGZvciBhbiBBdWRpb1JlY29yZAorI2RlZmluZSBDQkxLX0ZPUkNFUkVBRFlfTVNLICAgICAweDAwMDQKKyNkZWZpbmUgQ0JMS19GT1JDRVJFQURZX09OICAgICAgMHgwMDA0ICAvLyB0cmFjayBpcyBjb25zaWRlcmVkIHJlYWR5IGltbWVkaWF0ZWx5IGJ5IEF1ZGlvRmxpbmdlcgorI2RlZmluZSBDQkxLX0ZPUkNFUkVBRFlfT0ZGICAgICAweDAwMDAgIC8vIHRyYWNrIGlzIHJlYWR5IHdoZW4gYnVmZmVyIGZ1bGwKKyNkZWZpbmUgQ0JMS19JTlZBTElEX01TSyAgICAgICAgMHgwMDA4CisjZGVmaW5lIENCTEtfSU5WQUxJRF9PTiAgICAgICAgIDB4MDAwOCAgLy8gdHJhY2sgYnVmZmVyIGlzIGludmFsaWRhdGVkIGJ5IEF1ZGlvRmxpbmdlcjogbXVzdCBiZSByZS1jcmVhdGVkCisjZGVmaW5lIENCTEtfSU5WQUxJRF9PRkYgICAgICAgIDB4MDAwMAogCiBzdHJ1Y3QgYXVkaW9fdHJhY2tfY2Jsa190CiB7CkBAIC00NCwxMiArNTYsMTIgQEAKICAgICB2b2xhdGlsZSAgICB1aW50MzJfdCAgICBzZXJ2ZXI7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgdXNlckJhc2U7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgc2VydmVyQmFzZTsKLSAgICB2b2lkKiAgICAgICBidWZmZXJzOwotICAgIHVpbnQzMl90ICAgIGZyYW1lQ291bnQ7Ci0gICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeQotICAgIHVpbnQzMl90ICAgIGxvb3BTdGFydDsKLSAgICB1aW50MzJfdCAgICBsb29wRW5kOwotICAgIGludCAgICAgICAgIGxvb3BDb3VudDsKKyAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBidWZmZXJzOworICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbGluZSBib3VuZGFyeQorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGxvb3BTdGFydDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBsb29wRW5kOworICAgICAgICAgICAgICAgIGludCAgICAgICAgIGxvb3BDb3VudDsKICAgICB2b2xhdGlsZSAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHZvbHVtZVsyXTsKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgdm9sdW1lTFI7CkBAIC01OCwxNSArNzAsMTcgQEAKICAgICAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpb190cmFja19jYmxrX3Q6OmZyYW1lU2l6ZSBpcyBub3QgZXF1YWwgdG8gQXVkaW9UcmFjazo6ZnJhbWVTaXplKCkgZm9yCiAgICAgICAgICAgICAgICAgLy8gOCBiaXQgUENNIGRhdGE6IGluIHRoaXMgY2FzZSwgIG1DYmxrLT5mcmFtZVNpemUgaXMgYmFzZWQgb24gYSBzYW1wbGUgc2l6ZSBvZgogICAgICAgICAgICAgICAgIC8vIDE2IGJpdCBiZWNhdXNlIGRhdGEgaXMgY29udmVydGVkIHRvIDE2IGJpdCBiZWZvcmUgYmVpbmcgc3RvcmVkIGluIGJ1ZmZlcgotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICBjaGFubmVsczsKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICBmbG93Q29udHJvbEZsYWc7IC8vIHVuZGVycnVuIChvdXQpIG9yIG92ZXJycnVuIChpbikgaW5kaWNhdGlvbgotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIG91dDsgICAgICAgIC8vIG91dCBlcXVhbHMgMSBmb3IgQXVkaW9UcmFjayBhbmQgMCBmb3IgQXVkaW9SZWNvcmQKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICBmb3JjZVJlYWR5OworCisgICAgICAgICAgICAgICAgdWludDhfdCAgICAgZnJhbWVTaXplOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBmbGFnczsKKwogICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIGJ1ZmZlclRpbWVvdXRNczsgLy8gTWF4aW11bSBjdW11bGF0ZWQgdGltZW91dCBiZWZvcmUgcmVzdGFydGluZyBhdWRpb2ZsaW5nZXIKICAgICAgICAgICAgICAgICB1aW50MTZfdCAgICB3YWl0VGltZU1zOyAgICAgIC8vIEN1bXVsYXRlZCB3YWl0IHRpbWUKLSAgICAgICAgICAgICAgICAvLyBDYWNoZSBsaW5lIGJvdW5kYXJ5ICgzMiBieXRlcykKIAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIHNlbmRMZXZlbDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICByZXNlcnZlZDsKKyAgICAgICAgICAgICAgICAvLyBDYWNoZSBsaW5lIGJvdW5kYXJ5ICgzMiBieXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QoKTsKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBzdGVwVXNlcih1aW50MzJfdCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGVwU2VydmVyKHVpbnQzMl90IGZyYW1lQ291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL3N1cmZhY2VmbGluZ2VyL1NoYXJlZEJ1ZmZlclN0YWNrLmggYi9pbmNsdWRlL3ByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaAppbmRleCA5YjVhMWUwLi5kNjg5NjY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvc3VyZmFjZWZsaW5nZXIvU2hhcmVkQnVmZmVyU3RhY2suaApAQCAtNDMsMjQgKzQzLDkgQEAKICAqIHVubGVzcyB0aGV5IGFyZSBpbiB1c2UgYnkgdGhlIHNlcnZlciwgd2hpY2ggaXMgb25seSB0aGUgY2FzZSBmb3IgdGhlIGxhc3QgCiAgKiBkZXF1ZXVlLWFibGUgYnVmZmVyLiBXaGVuIHRoZXNlIHZhcmlvdXMgY29uZGl0aW9ucyBhcmUgbm90IG1ldCwgdGhlIGNhbGxlcgogICogd2FpdHMgdW50aWwgdGhlIGNvbmRpdGlvbiBpcyBtZXQuCi0gKgotICogCi0gKiBDQVZFQVRTOgotICogCi0gKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGVyZSBhcmUgc2V2ZXJhbCBsaW1pdGF0aW9uczoKLSAqIC0gYnVmZmVycyBtdXN0IGJlIGxvY2tlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGV5J3ZlIGJlZW4gZGVxdWV1ZWQKLSAqIC0gYnVmZmVycyBtdXN0IGJlIGVucXVldWVkIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkndmUgYmVlbiBsb2NrZWQKLSAqIC0gZGVxdWV1ZSgpIGlzIG5vdCByZWVudHJhbnQKLSAqIC0gbm8gZXJyb3IgY2hlY2tzIGFyZSBkb25lIG9uIHRoZSBjb25kaXRpb24gYWJvdmUKICAqIAogICovCiAKLS8vIFdoZW4gY2hhbmdpbmcgdGhlc2UgdmFsdWVzLCB0aGUgQ09NUElMRV9USU1FX0FTU0VSVCBhdCB0aGUgZW5kIG9mIHRoaXMKLS8vIGZpbGUgbmVlZCB0byBiZSB1cGRhdGVkLgotY29uc3QgdW5zaWduZWQgaW50IE5VTV9MQVlFUlNfTUFYICA9IDMxOwotY29uc3QgdW5zaWduZWQgaW50IE5VTV9CVUZGRVJfTUFYICA9IDQ7Ci1jb25zdCB1bnNpZ25lZCBpbnQgTlVNX0RJU1BMQVlfTUFYID0gNDsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBSZWdpb247CkBAIC02OSw3ICs1NCw2IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gc2hvdWxkIGJlIDEyOCBieXRlcyAoMzIgbG9uZ3MpCiBjbGFzcyBTaGFyZWRCdWZmZXJTdGFjawogewogICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRDbGllbnQ7CkBAIC03OCwyMiArNjIsNDQgQEAKICAgICBmcmllbmQgY2xhc3MgU2hhcmVkQnVmZmVyU2VydmVyOwogCiBwdWJsaWM6Ci0gICAgc3RydWN0IEZsYXRSZWdpb24geyAvLyAxMiBieXRlcwotICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9SRUNUX01BWCA9IDE7Ci0gICAgICAgIHVpbnQzMl90ICAgIGNvdW50OwotICAgICAgICB1aW50MTZfdCAgICByZWN0c1s0Kk5VTV9SRUNUX01BWF07Ci0gICAgfTsKLSAgICAKKyAgICAvLyBXaGVuIGNoYW5naW5nIHRoZXNlIHZhbHVlcywgdGhlIENPTVBJTEVfVElNRV9BU1NFUlQgYXQgdGhlIGVuZCBvZiB0aGlzCisgICAgLy8gZmlsZSBuZWVkIHRvIGJlIHVwZGF0ZWQuCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBOVU1fTEFZRVJTX01BWCAgPSAzMTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9CVUZGRVJfTUFYICA9IDE2OworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgTlVNX0JVRkZFUl9NSU4gID0gMjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZX01BWCA9IDQ7CisKICAgICBzdHJ1Y3QgU3RhdGlzdGljcyB7IC8vIDQgbG9uZ3MKICAgICAgICAgdHlwZWRlZiBpbnQzMl90IHVzZWNzX3Q7CiAgICAgICAgIHVzZWNzX3QgIHRvdGFsVGltZTsKICAgICAgICAgdXNlY3NfdCAgcmVzZXJ2ZWRbM107CiAgICAgfTsKKworICAgIHN0cnVjdCBTbWFsbFJlY3QgeworICAgICAgICB1aW50MTZfdCBsLCB0LCByLCBiOworICAgIH07CisKKyAgICBzdHJ1Y3QgRmxhdFJlZ2lvbiB7IC8vIDUyIGJ5dGVzID0gNCAqICgxICsgMipOKQorICAgICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IE5VTV9SRUNUX01BWCA9IDU7CisgICAgICAgIHVpbnQzMl90ICAgIGNvdW50OworICAgICAgICBTbWFsbFJlY3QgICByZWN0c1tOVU1fUkVDVF9NQVhdOworICAgIH07CisgICAgCisgICAgc3RydWN0IEJ1ZmZlckRhdGEgeworICAgICAgICBGbGF0UmVnaW9uIGRpcnR5UmVnaW9uOworICAgICAgICBTbWFsbFJlY3QgIGNyb3A7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmb3JtOworICAgICAgICB1aW50OF90IHJlc2VydmVkWzNdOworICAgIH07CiAgICAgCiAgICAgU2hhcmVkQnVmZmVyU3RhY2soKTsKICAgICB2b2lkIGluaXQoaW50MzJfdCBpZGVudGl0eSk7CiAgICAgc3RhdHVzX3Qgc2V0RGlydHlSZWdpb24oaW50IGJ1ZmZlciwgY29uc3QgUmVnaW9uJiByZWcpOworICAgIHN0YXR1c190IHNldENyb3AoaW50IGJ1ZmZlciwgY29uc3QgUmVjdCYgcmVnKTsKKyAgICBzdGF0dXNfdCBzZXRUcmFuc2Zvcm0oaW50IGJ1ZmZlciwgdWludDhfdCB0cmFuc2Zvcm0pOwogICAgIFJlZ2lvbiBnZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyKSBjb25zdDsKKyAgICBSZWN0IGdldENyb3AoaW50IGJ1ZmZlcikgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0VHJhbnNmb3JtKGludCBidWZmZXIpIGNvbnN0OwogCiAgICAgLy8gdGhlc2UgYXR0cmlidXRlcyBhcmUgcGFydCBvZiB0aGUgY29uZGl0aW9ucy91cGRhdGVzCiAgICAgdm9sYXRpbGUgaW50MzJfdCBoZWFkOyAgICAgIC8vIHNlcnZlcidzIGN1cnJlbnQgZnJvbnQgYnVmZmVyCkBAIC0xMDQsMjQgKzExMCwyNSBAQAogCiAgICAgLy8gbm90IHBhcnQgb2YgdGhlIGNvbmRpdGlvbnMKICAgICB2b2xhdGlsZSBpbnQzMl90IHJlYWxsb2NNYXNrOworICAgIHZvbGF0aWxlIGludDhfdCBpbmRleFtOVU1fQlVGRkVSX01BWF07CiAKICAgICBpbnQzMl90ICAgICBpZGVudGl0eTsgICAgICAgLy8gc3VyZmFjZSdzIGlkZW50aXR5IChjb25zdCkKLSAgICBpbnQzMl90ICAgICByZXNlcnZlZDMyWzldOworICAgIGludDMyX3QgICAgIHRva2VuOyAgICAgICAgICAvLyBzdXJmYWNlJ3MgdG9rZW4gKGZvciBkZWJ1Z2dpbmcpCisgICAgaW50MzJfdCAgICAgcmVzZXJ2ZWQzMlsxXTsKICAgICBTdGF0aXN0aWNzICBzdGF0czsKLSAgICBGbGF0UmVnaW9uICBkaXJ0eVJlZ2lvbltOVU1fQlVGRkVSX01BWF07ICAgIC8vIDEyKjQ9NDggYnl0ZXMKKyAgICBpbnQzMl90ICAgICByZXNlcnZlZDsKKyAgICBCdWZmZXJEYXRhICBidWZmZXJzW05VTV9CVUZGRVJfTUFYXTsgICAgIC8vIDEwMjQgYnl0ZXMKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLy8gNCBLQiBtYXgKKy8vIDMyIEtCIG1heAogY2xhc3MgU2hhcmVkQ2xpZW50CiB7CiBwdWJsaWM6CiAgICAgU2hhcmVkQ2xpZW50KCk7CiAgICAgflNoYXJlZENsaWVudCgpOwotCiAgICAgc3RhdHVzX3QgdmFsaWRhdGUoc2l6ZV90IHRva2VuKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRJZGVudGl0eShzaXplX3QgdG9rZW4pIGNvbnN0OwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJCYXNlOwpAQCAtMTMxLDcgKzEzOCw3IEBACiAgICAgLy8gRklYTUU6IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgbG9jay1sZXNzIHByaW1pdGl2ZQogICAgIE11dGV4IGxvY2s7CiAgICAgQ29uZGl0aW9uIGN2OwotICAgIFNoYXJlZEJ1ZmZlclN0YWNrIHN1cmZhY2VzWyBOVU1fTEFZRVJTX01BWCBdOworICAgIFNoYXJlZEJ1ZmZlclN0YWNrIHN1cmZhY2VzWyBTaGFyZWRCdWZmZXJTdGFjazo6TlVNX0xBWUVSU19NQVggXTsKIH07CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTEzOSwxOCArMTQ2LDE2IEBACiBjbGFzcyBTaGFyZWRCdWZmZXJCYXNlCiB7CiBwdWJsaWM6Ci0gICAgU2hhcmVkQnVmZmVyQmFzZShTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsIGludCBudW0sCisgICAgU2hhcmVkQnVmZmVyQmFzZShTaGFyZWRDbGllbnQqIHNoYXJlZENsaWVudCwgaW50IHN1cmZhY2UsCiAgICAgICAgICAgICBpbnQzMl90IGlkZW50aXR5KTsKICAgICB+U2hhcmVkQnVmZmVyQmFzZSgpOwotICAgIHVpbnQzMl90IGdldElkZW50aXR5KCk7CiAgICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEZyb250QnVmZmVyKCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRJZGVudGl0eSgpIGNvbnN0OwogICAgIFN0cmluZzggZHVtcChjaGFyIGNvbnN0KiBwcmVmaXgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgU2hhcmVkQ2xpZW50KiBjb25zdCBtU2hhcmVkQ2xpZW50OwogICAgIFNoYXJlZEJ1ZmZlclN0YWNrKiBjb25zdCBtU2hhcmVkU3RhY2s7Ci0gICAgY29uc3QgaW50IG1OdW1CdWZmZXJzOwogICAgIGNvbnN0IGludCBtSWRlbnRpdHk7CiAKICAgICBmcmllbmQgc3RydWN0IFVwZGF0ZTsKQEAgLTE2MCw2MSArMTY1LDIyIEBACiAgICAgICAgIFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjazsKICAgICAgICAgaW5saW5lIENvbmRpdGlvbkJhc2UoU2hhcmVkQnVmZmVyQmFzZSogc2JjKSAKICAgICAgICAgICAgIDogc3RhY2soKnNiYy0+bVNoYXJlZFN0YWNrKSB7IH0KKyAgICAgICAgdmlydHVhbCB+Q29uZGl0aW9uQmFzZSgpIHsgfTsKKyAgICAgICAgdmlydHVhbCBib29sIG9wZXJhdG9yKCkoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0ID0gMDsKICAgICB9OworICAgIHN0YXR1c190IHdhaXRGb3JDb25kaXRpb24oY29uc3QgQ29uZGl0aW9uQmFzZSYgY29uZGl0aW9uKTsKIAogICAgIHN0cnVjdCBVcGRhdGVCYXNlIHsKICAgICAgICAgU2hhcmVkQnVmZmVyU3RhY2smIHN0YWNrOwogICAgICAgICBpbmxpbmUgVXBkYXRlQmFzZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIpIAogICAgICAgICAgICAgOiBzdGFjaygqc2JiLT5tU2hhcmVkU3RhY2spIHsgfQogICAgIH07Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCB3YWl0Rm9yQ29uZGl0aW9uKFQgY29uZGl0aW9uKTsKLQogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIHN0YXR1c190IHVwZGF0ZUNvbmRpdGlvbihUIHVwZGF0ZSk7CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXR1c190IFNoYXJlZEJ1ZmZlckJhc2U6OndhaXRGb3JDb25kaXRpb24oVCBjb25kaXRpb24pIAotewotICAgIGNvbnN0IFNoYXJlZEJ1ZmZlclN0YWNrJiBzdGFjayggKm1TaGFyZWRTdGFjayApOwotICAgIFNoYXJlZENsaWVudCYgY2xpZW50KCAqbVNoYXJlZENsaWVudCApOwotICAgIGNvbnN0IG5zZWNzX3QgVElNRU9VVCA9IHMybnMoMSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGNsaWVudC5sb2NrKTsKLSAgICB3aGlsZSAoKGNvbmRpdGlvbigpPT1mYWxzZSkgJiYKLSAgICAgICAgICAgIChzdGFjay5pZGVudGl0eSA9PSBtSWRlbnRpdHkpICYmCi0gICAgICAgICAgICAoc3RhY2suc3RhdHVzID09IE5PX0VSUk9SKSkKLSAgICB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGNsaWVudC5jdi53YWl0UmVsYXRpdmUoY2xpZW50LmxvY2ssIFRJTUVPVVQpOwotICAgICAgICAKLSAgICAgICAgLy8gaGFuZGxlIGVycm9ycyBhbmQgdGltZW91dHMKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKGVyciAhPSBOT19FUlJPUikpIHsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR0UoIndhaXRGb3JDb25kaXRpb24oJXMpIHRpbWVkIG91dCAoaWRlbnRpdHk9JWQpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGNvbmRpdGlvbiBpcyB0cnVlISBXZSByZWNvdmVyZWQgYnV0IGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGRuJ3QgaGFwcGVuLiIgLCBUOjpuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5pZGVudGl0eSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExPR1coIndhaXRGb3JDb25kaXRpb24oJXMpIHRpbWVkIG91dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiKGlkZW50aXR5PSVkLCBzdGF0dXM9JWQpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ1BVIG1heSBiZSBwZWdnZWQuIHRyeWluZyBhZ2Fpbi4iLCBUOjpuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5pZGVudGl0eSwgc3RhY2suc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR0UoIndhaXRGb3JDb25kaXRpb24oJXMpIGVycm9yICglcykgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFQ6Om5hbWUoKSwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChzdGFjay5pZGVudGl0eSAhPSBtSWRlbnRpdHkpID8gc3RhdHVzX3QoQkFEX0lOREVYKSA6IHN0YWNrLnN0YXR1czsKLX0KLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0YXR1c190IFNoYXJlZEJ1ZmZlckJhc2U6OnVwZGF0ZUNvbmRpdGlvbihUIHVwZGF0ZSkgewogICAgIFNoYXJlZENsaWVudCYgY2xpZW50KCAqbVNoYXJlZENsaWVudCApOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChjbGllbnQubG9jayk7CkBAIC0yMzgsMTkgKzIwNCwzMiBAQAogICAgIHN0YXR1c190IHF1ZXVlKGludCBidWYpOwogICAgIGJvb2wgbmVlZE5ld0J1ZmZlcihpbnQgYnVmZmVyKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyLCBjb25zdCBSZWdpb24mIHJlZyk7Ci0gICAgCisgICAgc3RhdHVzX3Qgc2V0Q3JvcChpbnQgYnVmZmVyLCBjb25zdCBSZWN0JiByZWcpOworICAgIHN0YXR1c190IHNldFRyYW5zZm9ybShpbnQgYnVmZmVyLCB1aW50MzJfdCB0cmFuc2Zvcm0pOworCisgICAgY2xhc3MgU2V0QnVmZmVyQ291bnRDYWxsYmFjayB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBTaGFyZWRCdWZmZXJDbGllbnQ7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlcmF0b3IoKShpbnQgYnVmZmVyQ291bnQpIGNvbnN0ID0gMDsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgflNldEJ1ZmZlckNvdW50Q2FsbGJhY2soKSB7IH0KKyAgICB9OworICAgIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCwgY29uc3QgU2V0QnVmZmVyQ291bnRDYWxsYmFjayYgaXBjKTsKKwogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IENvbmRpdGlvbjsKICAgICBmcmllbmQgc3RydWN0IERlcXVldWVDb25kaXRpb247CiAgICAgZnJpZW5kIHN0cnVjdCBMb2NrQ29uZGl0aW9uOwotICAgIAotICAgIGludDMyX3QgY29tcHV0ZVRhaWwoKSBjb25zdDsKIAogICAgIHN0cnVjdCBRdWV1ZVVwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKICAgICAgICAgaW5saW5lIFF1ZXVlVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYik7CiAgICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKICAgICB9OwogCisgICAgc3RydWN0IERlcXVldWVVcGRhdGUgOiBwdWJsaWMgVXBkYXRlQmFzZSB7CisgICAgICAgIGlubGluZSBEZXF1ZXVlVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYik7CisgICAgICAgIGlubGluZSBzc2l6ZV90IG9wZXJhdG9yKCkoKTsKKyAgICB9OworCiAgICAgc3RydWN0IFVuZG9EZXF1ZXVlVXBkYXRlIDogcHVibGljIFVwZGF0ZUJhc2UgewogICAgICAgICBpbmxpbmUgVW5kb0RlcXVldWVVcGRhdGUoU2hhcmVkQnVmZmVyQmFzZSogc2JiKTsKICAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwpAQCAtMjYwLDI1ICsyMzksMzQgQEAKIAogICAgIHN0cnVjdCBEZXF1ZXVlQ29uZGl0aW9uIDogcHVibGljIENvbmRpdGlvbkJhc2UgewogICAgICAgICBpbmxpbmUgRGVxdWV1ZUNvbmRpdGlvbihTaGFyZWRCdWZmZXJDbGllbnQqIHNiYyk7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKTsKLSAgICAgICAgc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBuYW1lKCkgeyByZXR1cm4gIkRlcXVldWVDb25kaXRpb24iOyB9CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoKSBjb25zdDsKKyAgICAgICAgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdCB7IHJldHVybiAiRGVxdWV1ZUNvbmRpdGlvbiI7IH0KICAgICB9OwogCiAgICAgc3RydWN0IExvY2tDb25kaXRpb24gOiBwdWJsaWMgQ29uZGl0aW9uQmFzZSB7CiAgICAgICAgIGludCBidWY7CiAgICAgICAgIGlubGluZSBMb2NrQ29uZGl0aW9uKFNoYXJlZEJ1ZmZlckNsaWVudCogc2JjLCBpbnQgYnVmKTsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpOwotICAgICAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAiTG9ja0NvbmRpdGlvbiI7IH0KKyAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpIGNvbnN0OworICAgICAgICBpbmxpbmUgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsgcmV0dXJuICJMb2NrQ29uZGl0aW9uIjsgfQogICAgIH07CiAKKyAgICBpbnQzMl90IGNvbXB1dGVUYWlsKCkgY29uc3Q7CisKKyAgICBtdXRhYmxlIFJXTG9jayBtTG9jazsKKyAgICBpbnQgbU51bUJ1ZmZlcnM7CisKICAgICBpbnQzMl90IHRhaWw7CisgICAgaW50MzJfdCB1bmRvRGVxdWV1ZVRhaWw7CisgICAgaW50MzJfdCBxdWV1ZWRfaGVhZDsKICAgICAvLyBzdGF0aXN0aWNzLi4uCi0gICAgbnNlY3NfdCBtRGVxdWV1ZVRpbWVbTlVNX0JVRkZFUl9NQVhdOworICAgIG5zZWNzX3QgbURlcXVldWVUaW1lW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fQlVGRkVSX01BWF07CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIFNoYXJlZEJ1ZmZlclNlcnZlciA6IHB1YmxpYyBTaGFyZWRCdWZmZXJCYXNlCitjbGFzcyBTaGFyZWRCdWZmZXJTZXJ2ZXIKKyAgICA6IHB1YmxpYyBTaGFyZWRCdWZmZXJCYXNlLAorICAgICAgcHVibGljIExpZ2h0UmVmQmFzZTxTaGFyZWRCdWZmZXJTZXJ2ZXI+CiB7CiBwdWJsaWM6CiAgICAgU2hhcmVkQnVmZmVyU2VydmVyKFNoYXJlZENsaWVudCogc2hhcmVkQ2xpZW50LCBpbnQgc3VyZmFjZSwgaW50IG51bSwKQEAgLTI4NywxNiArMjc1LDc1IEBACiAgICAgc3NpemVfdCByZXRpcmVBbmRMb2NrKCk7CiAgICAgc3RhdHVzX3QgdW5sb2NrKGludCBidWZmZXIpOwogICAgIHZvaWQgc2V0U3RhdHVzKHN0YXR1c190IHN0YXR1cyk7Ci0gICAgc3RhdHVzX3QgcmVhbGxvY2F0ZSgpOwotICAgIHN0YXR1c190IGFzc2VydFJlYWxsb2NhdGUoaW50IGJ1ZmZlcik7CisgICAgc3RhdHVzX3QgcmVhbGxvY2F0ZUFsbCgpOworICAgIHN0YXR1c190IHJlYWxsb2NhdGVBbGxFeGNlcHQoaW50IGJ1ZmZlcik7CiAgICAgaW50MzJfdCBnZXRRdWV1ZWRDb3VudCgpIGNvbnN0OwotICAgIAogICAgIFJlZ2lvbiBnZXREaXJ0eVJlZ2lvbihpbnQgYnVmZmVyKSBjb25zdDsKKyAgICBSZWN0IGdldENyb3AoaW50IGJ1ZmZlcikgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0VHJhbnNmb3JtKGludCBidWZmZXIpIGNvbnN0OworCisgICAgc3RhdHVzX3QgcmVzaXplKGludCBuZXdOdW1CdWZmZXJzKTsKIAogICAgIFNoYXJlZEJ1ZmZlclN0YWNrOjpTdGF0aXN0aWNzIGdldFN0YXRzKCkgY29uc3Q7CiAgICAgCiAKIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIExpZ2h0UmVmQmFzZTxTaGFyZWRCdWZmZXJTZXJ2ZXI+OworICAgIH5TaGFyZWRCdWZmZXJTZXJ2ZXIoKTsKKworICAgIC8qCisgICAgICogQnVmZmVyTGlzdCBpcyBiYXNpY2FsbHkgYSBmaXhlZC1jYXBhY2l0eSBzb3J0ZWQtdmVjdG9yIG9mCisgICAgICogdW5zaWduZWQgNS1iaXRzIGludHMgdXNpbmcgYSAzMi1iaXRzIGludCBhcyBzdG9yYWdlLgorICAgICAqIGl0IGhhcyBlZmZpY2llbnQgaXRlcmF0b3JzIHRvIGZpbmQgaXRlbXMgaW4gdGhlIGxpc3QgYW5kIG5vdCBpbiB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBjbGFzcyBCdWZmZXJMaXN0IHsKKyAgICAgICAgc2l6ZV90IG1DYXBhY2l0eTsKKyAgICAgICAgdWludDMyX3QgbUxpc3Q7CisgICAgcHVibGljOgorICAgICAgICBCdWZmZXJMaXN0KHNpemVfdCBjID0gU2hhcmVkQnVmZmVyU3RhY2s6Ok5VTV9CVUZGRVJfTUFYKQorICAgICAgICAgICAgOiBtQ2FwYWNpdHkoYyksIG1MaXN0KDApIHsgfQorICAgICAgICBzdGF0dXNfdCBhZGQoaW50IHZhbHVlKTsKKyAgICAgICAgc3RhdHVzX3QgcmVtb3ZlKGludCB2YWx1ZSk7CisgICAgICAgIHVpbnQzMl90IGdldE1hc2soKSBjb25zdCB7IHJldHVybiBtTGlzdDsgfQorCisgICAgICAgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yIHsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBCdWZmZXJMaXN0OworICAgICAgICAgICAgdWludDMyX3QgbWFzaywgY3VycjsKKyAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yKHVpbnQzMl90IG1hc2spIDoKKyAgICAgICAgICAgICAgICBtYXNrKG1hc2spLCBjdXJyKF9fYnVpbHRpbl9jbHoobWFzaykpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFzayA9PSByaHMubWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBjb25zdF9pdGVyYXRvciYgcmhzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hc2sgIT0gcmhzLm1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmxpbmUgaW50IG9wZXJhdG9yICooKSBjb25zdCB7IHJldHVybiBjdXJyOyB9CisgICAgICAgICAgICBpbmxpbmUgY29uc3QgY29uc3RfaXRlcmF0b3ImIG9wZXJhdG9yICsrKCkgeworICAgICAgICAgICAgICAgIG1hc2sgJj0gfigxPDwoMzEtY3VycikpOworICAgICAgICAgICAgICAgIGN1cnIgPSBfX2J1aWx0aW5fY2x6KG1hc2spOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IobUxpc3QpOworICAgICAgICB9CisgICAgICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigwKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZnJlZV9iZWdpbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1hc2sgPSAoMSA8PCAoMzItbUNhcGFjaXR5KSkgLSAxOworICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCB+KG1MaXN0IHwgbWFzaykgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyB0aGlzIHByb3RlY3RzIG1OdW1CdWZmZXJzIGFuZCBtQnVmZmVyTGlzdAorICAgIG11dGFibGUgUldMb2NrIG1Mb2NrOworICAgIGludCBtTnVtQnVmZmVyczsKKyAgICBCdWZmZXJMaXN0IG1CdWZmZXJMaXN0OworCiAgICAgc3RydWN0IFVubG9ja1VwZGF0ZSA6IHB1YmxpYyBVcGRhdGVCYXNlIHsKICAgICAgICAgY29uc3QgaW50IGxvY2tlZEJ1ZmZlcjsKICAgICAgICAgaW5saW5lIFVubG9ja1VwZGF0ZShTaGFyZWRCdWZmZXJCYXNlKiBzYmIsIGludCBsb2NrZWRCdWZmZXIpOwpAQCAtMzE0LDEzICszNjEsNiBAQAogICAgICAgICBpbmxpbmUgU3RhdHVzVXBkYXRlKFNoYXJlZEJ1ZmZlckJhc2UqIHNiYiwgc3RhdHVzX3Qgc3RhdHVzKTsKICAgICAgICAgaW5saW5lIHNzaXplX3Qgb3BlcmF0b3IoKSgpOwogICAgIH07Ci0KLSAgICBzdHJ1Y3QgUmVhbGxvY2F0ZUNvbmRpdGlvbiA6IHB1YmxpYyBDb25kaXRpb25CYXNlIHsKLSAgICAgICAgaW50IGJ1ZjsKLSAgICAgICAgaW5saW5lIFJlYWxsb2NhdGVDb25kaXRpb24oU2hhcmVkQnVmZmVyQmFzZSogc2JiLCBpbnQgYnVmKTsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKSgpOwotICAgICAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAiUmVhbGxvY2F0ZUNvbmRpdGlvbiI7IH0KLSAgICB9OwogfTsKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zNDQsMTMgKzM4NCwxMiBAQAogICAgIHVpbnQ4X3QgICAgICAgICBjb25uZWN0ZWQ7CiAgICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkWzNdOwogICAgIHVpbnQzMl90ICAgICAgICBwYWRbN107Ci0gICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW05VTV9ESVNQTEFZX01BWF07CisgICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW1NoYXJlZEJ1ZmZlclN0YWNrOjpOVU1fRElTUExBWV9NQVhdOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKFNoYXJlZENsaWVudCkgPD0gNDA5NikKLUNPTVBJTEVfVElNRV9BU1NFUlQoc2l6ZW9mKFNoYXJlZEJ1ZmZlclN0YWNrKSA9PSAxMjgpCitDT01QSUxFX1RJTUVfQVNTRVJUKHNpemVvZihTaGFyZWRDbGllbnQpIDw9IDMyNzY4KQogQ09NUElMRV9USU1FX0FTU0VSVChzaXplb2Yoc3VyZmFjZV9mbGluZ2VyX2NibGtfdCkgPD0gNDA5NikKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZjU4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI1IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBFZmZlY3QgZmFjdG9yeSBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCUVmZmVjdHNGYWN0b3J5LmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzCisKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKQorTE9DQUxfTU9EVUxFOj0gbGliZWZmZWN0cworCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlhNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmMKQEAgLTAsMCArMSw2NDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdHNGYWN0b3J5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnkuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisKK3N0YXRpYyBsaXN0X2VsZW1fdCAqZ0VmZmVjdExpc3Q7IC8vIGxpc3Qgb2YgZWZmZWN0X2VudHJ5X3Q6IGFsbCBjdXJyZW50bHkgY3JlYXRlZCBlZmZlY3RzCitzdGF0aWMgbGlzdF9lbGVtX3QgKmdMaWJyYXJ5TGlzdDsgLy8gbGlzdCBvZiBsaWJfZW50cnlfdDogYWxsIGN1cnJlbnRseSBsb2FkZWQgbGlicmFyaWVzCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdMaWJMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsgLy8gY29udHJvbHMgYWNjZXNzIHRvIGdMaWJyYXJ5TGlzdAorc3RhdGljIHVpbnQzMl90IGdOdW1FZmZlY3RzOyAgICAgICAgIC8vIHRvdGFsIG51bWJlciBudW1iZXIgb2YgZWZmZWN0cworc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyTGliOyAgICAvLyBjdXJyZW50IGxpYnJhcnkgaW4gZW51bWVyYXRpb24gcHJvY2Vzcworc3RhdGljIGxpc3RfZWxlbV90ICpnQ3VyRWZmZWN0OyAvLyBjdXJyZW50IGVmZmVjdCBpbiBlbnVtZXJhdGlvbiBwcm9jZXNzCitzdGF0aWMgdWludDMyX3QgZ0N1ckVmZmVjdElkeDsgICAgICAgLy8gY3VycmVudCBlZmZlY3QgaW5kZXggaW4gZW51bWVyYXRpb24gcHJvY2VzcworCitjb25zdCBjaGFyICogY29uc3QgZ0VmZmVjdExpYlBhdGggPSAiL3N5c3RlbS9saWIvc291bmRmeCI7IC8vIHBhdGggdG8gYnVpbHQtaW4gZWZmZWN0IGxpYnJhcmllcworc3RhdGljIGludCBnSW5pdERvbmU7IC8vIHRydWUgaXMgZ2xvYmFsIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIHByZWZvcm1lZAorc3RhdGljIGludCBnTmV4dExpYklkOyAvLyB1c2VkIGJ5IGxvYWRMaWJyYXJ5KCkgdG8gYWxsb2NhdGUgdW5pcXVlIGxpYnJhcnkgaGFuZGxlcworc3RhdGljIGludCBnQ2FuUXVlcnlFZmZlY3Q7IC8vIGluZGljYXRlcyB0aGF0IGNhbGwgdG8gRWZmZWN0UXVlcnlFZmZlY3QoKSBpcyB2YWxpZCwgaS5lLiB0aGF0IHRoZSBsaXN0IG9mIGVmZmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIG5vdCBtb2RpZmllZCBzaW5jZSBsYXN0IGNhbGwgdG8gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKCkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMgcHJvdG90eXBlcworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IGluaXQoKTsKK3N0YXRpYyBpbnQgbG9hZExpYnJhcnkoY29uc3QgY2hhciAqbGliUGF0aCwgaW50ICpoYW5kbGUpOworc3RhdGljIGludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpOworc3RhdGljIHZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpOworc3RhdGljIHVpbnQzMl90IHVwZGF0ZU51bUVmZmVjdHMoKTsKK3N0YXRpYyBpbnQgZmluZEVmZmVjdChlZmZlY3RfdXVpZF90ICp1dWlkLCBsaWJfZW50cnlfdCAqKmxpYiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOworc3RhdGljIHZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBFZmZlY3RfUHJvY2VzcyhlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZWZmZWN0X2VudHJ5X3QgKmZ4ID0gKGVmZmVjdF9lbnRyeV90ICopc2VsZjsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBpZiAoZngtPmxpYiA9PSBOVUxMKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgICAgIHJldHVybiAtRVBJUEU7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKworICAgIHJldCA9ICgqZngtPnN1Ykl0ZmUpLT5wcm9jZXNzKGZ4LT5zdWJJdGZlLCBpbkJ1ZmZlciwgb3V0QnVmZmVyKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdF9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCit7CisgICAgaW50IHJldCA9IGluaXQoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBlZmZlY3RfZW50cnlfdCAqZnggPSAoZWZmZWN0X2VudHJ5X3QgKilzZWxmOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGlmIChmeC0+bGliID09IE5VTEwpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICAgICAgcmV0dXJuIC1FUElQRTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworCisgICAgcmV0ID0gKCpmeC0+c3ViSXRmZSktPmNvbW1hbmQoZngtPnN1Ykl0ZmUsIGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmeC0+bGliLT5sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdJbnRlcmZhY2UgPSB7CisgICAgICAgIEVmZmVjdF9Qcm9jZXNzLAorICAgICAgICBFZmZlY3RfQ29tbWFuZAorfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBFZmZlY3QgRmFjdG9yeSBJbnRlcmZhY2UgZnVuY3Rpb25zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHBOdW1FZmZlY3RzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgKnBOdW1FZmZlY3RzID0gZ051bUVmZmVjdHM7CisgICAgZ0NhblF1ZXJ5RWZmZWN0ID0gMTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworICAgIExPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpOiAlZCIsICpwTnVtRWZmZWN0cyk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBpbnQgcmV0ID0gaW5pdCgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8CisgICAgICAgIGluZGV4ID49IGdOdW1FZmZlY3RzKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoZ0NhblF1ZXJ5RWZmZWN0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgcmV0ID0gLUVOT0VOVDsKKyAgICBpZiAoaW5kZXggPCBnQ3VyRWZmZWN0SWR4KSB7CisgICAgICAgIHJlc2V0RWZmZWN0RW51bWVyYXRpb24oKTsKKyAgICB9CisgICAgd2hpbGUgKGdDdXJMaWIpIHsKKyAgICAgICAgaWYgKGdDdXJFZmZlY3QpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBnQ3VyRWZmZWN0SWR4KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnQ3VyRWZmZWN0LT5vYmplY3QsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ0N1ckVmZmVjdCA9IGdDdXJFZmZlY3QtPm5leHQ7CisgICAgICAgICAgICAgICAgZ0N1ckVmZmVjdElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ0N1ckxpYiA9IGdDdXJMaWItPm5leHQ7CisgICAgICAgICAgICBnQ3VyRWZmZWN0ID0gKChsaWJfZW50cnlfdCAqKWdDdXJMaWItPm9iamVjdCktPmVmZmVjdHM7CisgICAgICAgIH0KKyAgICB9CisKKyNpZiAoTE9HX05ERUJVRyA9PSAwKQorICAgIGNoYXIgc3RyWzI1Nl07CisgICAgZHVtcEVmZmVjdERlc2NyaXB0b3IocERlc2NyaXB0b3IsIHN0ciwgMjU2KTsKKyAgICBMT0dWKCJFZmZlY3RRdWVyeUVmZmVjdCgpIGRlc2M6JXMiLCBzdHIpOworI2VuZGlmCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICp1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKK3sKKyAgICBsaWJfZW50cnlfdCAqbCA9IE5VTEw7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IE5VTEw7CisKKyAgICBpbnQgcmV0ID0gaW5pdCgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnTGliTG9jayk7CisgICAgcmV0ID0gZmluZEVmZmVjdCh1dWlkLCAmbCwgJmQpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGQsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpCit7CisgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CisgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOworICAgIGVmZmVjdF9pbnRlcmZhY2VfdCBpdGZlOworICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByZXQ7CisKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHBJbnRlcmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBMT0dWKCJFZmZlY3RDcmVhdGUoKSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgIHV1aWQtPnRpbWVMb3csIHV1aWQtPnRpbWVNaWQsIHV1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwgdXVpZC0+bm9kZVswXSwgdXVpZC0+bm9kZVsxXSx1dWlkLT5ub2RlWzJdLAorICAgICAgICAgICAgdXVpZC0+bm9kZVszXSx1dWlkLT5ub2RlWzRdLHV1aWQtPm5vZGVbNV0pOworCisgICAgcmV0ID0gaW5pdCgpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgaW5pdCBlcnJvcjogJWQiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworCisgICAgcmV0ID0gZmluZEVmZmVjdCh1dWlkLCAmbCwgJmQpOworICAgIGlmIChyZXQgPCAwKXsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIC8vIGNyZWF0ZSBlZmZlY3QgaW4gbGlicmFyeQorICAgIHJldCA9IGwtPmNyZWF0ZUZ4KHV1aWQsIHNlc3Npb25JZCwgaW9JZCwgJml0ZmUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBMT0dXKCJFZmZlY3RDcmVhdGUoKSBsaWJyYXJ5ICVzOiBjb3VsZCBub3QgY3JlYXRlIGZ4ICVzLCBlcnJvciAlZCIsIGwtPnBhdGgsIGQtPm5hbWUsIHJldCk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvLyBhZGQgZW50cnkgdG8gZWZmZWN0IGxpc3QKKyAgICBmeCA9IChlZmZlY3RfZW50cnlfdCAqKW1hbGxvYyhzaXplb2YoZWZmZWN0X2VudHJ5X3QpKTsKKyAgICBmeC0+c3ViSXRmZSA9IGl0ZmU7CisgICAgZngtPml0ZmUgPSAoc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqKSZnSW50ZXJmYWNlOworICAgIGZ4LT5saWIgPSBsOworCisgICAgZSA9IChsaXN0X2VsZW1fdCAqKW1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5vYmplY3QgPSBmeDsKKyAgICBlLT5uZXh0ID0gZ0VmZmVjdExpc3Q7CisgICAgZ0VmZmVjdExpc3QgPSBlOworCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KWZ4OworCisgICAgTE9HVigiRWZmZWN0Q3JlYXRlKCkgY3JlYXRlZCBlbnRyeSAlcCB3aXRoIHN1YiBpdGZlICVwIGluIGxpYnJhcnkgJXMiLCAqcEludGVyZmFjZSwgaXRmZSwgbC0+cGF0aCk7CisKK2V4aXQ6CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdMaWJMb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQoreworICAgIGVmZmVjdF9lbnRyeV90ICpmeDsKKyAgICBsaXN0X2VsZW1fdCAqZTE7CisgICAgbGlzdF9lbGVtX3QgKmUyOworCisgICAgaW50IHJldCA9IGluaXQoKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIHJlbW92ZSBlZmZlY3QgZnJvbSBlZmZlY3QgbGlzdAorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworICAgIGUxID0gZ0VmZmVjdExpc3Q7CisgICAgZTIgPSBOVUxMOworICAgIHdoaWxlIChlMSkgeworICAgICAgICBpZiAoZTEtPm9iamVjdCA9PSBpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgIGlmIChlMikgeworICAgICAgICAgICAgICAgIGUyLT5uZXh0ID0gZTEtPm5leHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdFZmZlY3RMaXN0ID0gZTEtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmeCA9IChlZmZlY3RfZW50cnlfdCAqKWUxLT5vYmplY3Q7CisgICAgICAgICAgICBmcmVlKGUxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGUyID0gZTE7CisgICAgICAgIGUxID0gZTEtPm5leHQ7CisgICAgfQorICAgIGlmIChlMSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IC1FTk9FTlQ7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICAvLyByZWxlYXNlIGVmZmVjdCBpbiBsaWJyYXJ5CisgICAgaWYgKGZ4LT5saWIgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJFZmZlY3RSZWxlYXNlKCkgZnggJXAgbGlicmFyeSBhbHJlYWR5IHVubG9hZGVkIiwgaW50ZXJmYWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmZ4LT5saWItPmxvY2spOworICAgICAgICBmeC0+bGliLT5yZWxlYXNlRngoZngtPnN1Ykl0ZmUpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZngtPmxpYi0+bG9jayk7CisgICAgfQorICAgIGZyZWUoZngpOworCitleGl0OgorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IEVmZmVjdExvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGxpYlBhdGggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXQgPSBsb2FkTGlicmFyeShsaWJQYXRoLCBoYW5kbGUpOworICAgIHVwZGF0ZU51bUVmZmVjdHMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgRWZmZWN0VW5sb2FkTGlicmFyeShpbnQgaGFuZGxlKQoreworICAgIGludCByZXQgPSBpbml0KCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB1bmxvYWRMaWJyYXJ5KGhhbmRsZSk7CisgICAgdXBkYXRlTnVtRWZmZWN0cygpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBFZmZlY3RJc051bGxVdWlkKGVmZmVjdF91dWlkX3QgKnV1aWQpCit7CisgICAgaWYgKG1lbWNtcCh1dWlkLCBFRkZFQ1RfVVVJRF9OVUxMLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBMb2NhbCBmdW5jdGlvbnMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaW50IGluaXQoKSB7CisgICAgc3RydWN0IGRpcmVudCAqZW50OworICAgIERJUiAqZGlyID0gTlVMTDsKKyAgICBjaGFyIGxpYnBhdGhbUEFUSF9NQVhdOworICAgIGludCBoZGw7CisKKyAgICBpZiAoZ0luaXREb25lKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZ0xpYkxvY2ssIE5VTEwpOworCisgICAgLy8gbG9hZCBidWlsdC1pbiBsaWJyYXJpZXMKKyAgICBkaXIgPSBvcGVuZGlyKGdFZmZlY3RMaWJQYXRoKTsKKyAgICBpZiAoZGlyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHdoaWxlICgoZW50ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgIExPR1YoImluaXQoKSByZWFkaW5nIGZpbGUgJXMiLCBlbnQtPmRfbmFtZSk7CisgICAgICAgIGlmICgoc3RybGVuKGVudC0+ZF9uYW1lKSA8IDMpIHx8CisgICAgICAgICAgICBzdHJuY21wKGVudC0+ZF9uYW1lLCAibGliIiwgMykgIT0gMCB8fAorICAgICAgICAgICAgc3RybmNtcChlbnQtPmRfbmFtZSArIHN0cmxlbihlbnQtPmRfbmFtZSkgLSAzLCAiLnNvIiwgMykgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGxpYnBhdGgsIGdFZmZlY3RMaWJQYXRoKTsKKyAgICAgICAgc3RyY2F0KGxpYnBhdGgsICIvIik7CisgICAgICAgIHN0cmNhdChsaWJwYXRoLCBlbnQtPmRfbmFtZSk7CisgICAgICAgIGlmIChsb2FkTGlicmFyeShsaWJwYXRoLCAmaGRsKSA8IDApIHsKKyAgICAgICAgICAgIExPR1coImluaXQoKSBmYWlsZWQgdG8gbG9hZCBsaWJyYXJ5ICVzIixsaWJwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZWRpcihkaXIpOworICAgIHVwZGF0ZU51bUVmZmVjdHMoKTsKKyAgICBnSW5pdERvbmUgPSAxOworICAgIExPR1YoImluaXQoKSBkb25lIik7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGxvYWRMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoreworICAgIHZvaWQgKmhkbDsKKyAgICBlZmZlY3RfUXVlcnlOdW1iZXJFZmZlY3RzX3QgcXVlcnlOdW1GeDsKKyAgICBlZmZlY3RfUXVlcnlFZmZlY3RfdCBxdWVyeUZ4OworICAgIGVmZmVjdF9DcmVhdGVFZmZlY3RfdCBjcmVhdGVGeDsKKyAgICBlZmZlY3RfUmVsZWFzZUVmZmVjdF90IHJlbGVhc2VGeDsKKyAgICB1aW50MzJfdCBudW1GeDsKKyAgICB1aW50MzJfdCBmeDsKKyAgICBpbnQgcmV0OworICAgIGxpc3RfZWxlbV90ICplLCAqZGVzY0hlYWQgPSBOVUxMOworICAgIGxpYl9lbnRyeV90ICpsOworCisgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgICpoYW5kbGUgPSAwOworCisgICAgaGRsID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XKTsKKyAgICBpZiAoaGRsID09IDApIHsKKyAgICAgICAgTE9HVygiY291bGQgb3BlbiBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZnVuY3Rpb25zIGF2YWlsYWJpbGl0eQorICAgIHF1ZXJ5TnVtRnggPSAoZWZmZWN0X1F1ZXJ5TnVtYmVyRWZmZWN0c190KWRsc3ltKGhkbCwgIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIpOworICAgIGlmIChxdWVyeU51bUZ4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcXVlcnlGeCA9IChlZmZlY3RfUXVlcnlFZmZlY3RfdClkbHN5bShoZGwsICJFZmZlY3RRdWVyeUVmZmVjdCIpOworICAgIGlmIChxdWVyeUZ4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RRdWVyeUVmZmVjdCBmcm9tIGxpYiAlcyIsIGxpYlBhdGgpOworICAgICAgICByZXQgPSAtRU5PREVWOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBjcmVhdGVGeCA9IChlZmZlY3RfQ3JlYXRlRWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0Q3JlYXRlIik7CisgICAgaWYgKGNyZWF0ZUZ4ID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGdldCBFZmZlY3RDcmVhdGUgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmVsZWFzZUZ4ID0gKGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QpZGxzeW0oaGRsLCAiRWZmZWN0UmVsZWFzZSIpOworICAgIGlmIChyZWxlYXNlRnggPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJjb3VsZCBub3QgZ2V0IEVmZmVjdFJlbGVhc2UgZnJvbSBsaWIgJXMiLCBsaWJQYXRoKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBsb2FkIGVmZmVjdCBkZXNjcmlwdG9ycworICAgIHJldCA9IHF1ZXJ5TnVtRngoJm51bUZ4KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZm9yIChmeCA9IDA7IGZ4IDwgbnVtRng7IGZ4KyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZCA9IG1hbGxvYyhzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICBpZiAoZCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBxdWVyeUZ4KGZ4LCBkKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisjaWYgKExPR19OREVCVUc9PTApCisgICAgICAgICAgICBjaGFyIHNbMjU2XTsKKyAgICAgICAgICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIDI1Nik7CisgICAgICAgICAgICBMT0dWKCJsb2FkTGlicmFyeSgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChkLT5hcGlWZXJzaW9uICE9IEVGRkVDVF9BUElfVkVSU0lPTikgeworICAgICAgICAgICAgICAgIExPR1coIkJhZCBBUEkgdmVyc2lvbiAlMDR4IG9uIGxpYiAlcyIsIGQtPmFwaVZlcnNpb24sIGxpYlBhdGgpOworICAgICAgICAgICAgICAgIGZyZWUoZCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlID0gbWFsbG9jKHNpemVvZihsaXN0X2VsZW1fdCkpOworICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZyZWUoZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZS0+b2JqZWN0ID0gZDsKKyAgICAgICAgICAgIGUtPm5leHQgPSBkZXNjSGVhZDsKKyAgICAgICAgICAgIGRlc2NIZWFkID0gZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1coIkVycm9yIHF1ZXJ5aW5nIGVmZmVjdCAjICVkIG9uIGxpYiAlcyIsIGZ4LCBsaWJQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0xpYkxvY2spOworCisgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAorICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CisgICAgbC0+aWQgPSArK2dOZXh0TGliSWQ7CisgICAgbC0+aGFuZGxlID0gaGRsOworICAgIHN0cm5jcHkobC0+cGF0aCwgbGliUGF0aCwgUEFUSF9NQVgpOworICAgIGwtPmNyZWF0ZUZ4ID0gY3JlYXRlRng7CisgICAgbC0+cmVsZWFzZUZ4ID0gcmVsZWFzZUZ4OworICAgIGwtPmVmZmVjdHMgPSBkZXNjSGVhZDsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmwtPmxvY2ssIE5VTEwpOworCisgICAgZSA9IG1hbGxvYyhzaXplb2YobGlzdF9lbGVtX3QpKTsKKyAgICBlLT5uZXh0ID0gZ0xpYnJhcnlMaXN0OworICAgIGUtPm9iamVjdCA9IGw7CisgICAgZ0xpYnJhcnlMaXN0ID0gZTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOworICAgIExPR1YoImxvYWRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAiLCBsKTsKKworICAgICpoYW5kbGUgPSBsLT5pZDsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBMT0dXKCJsb2FkTGlicmFyeSgpIGVycm9yOiAlZCBvbiBsaWI6ICVzIiwgcmV0LCBsaWJQYXRoKTsKKyAgICB3aGlsZSAoZGVzY0hlYWQpIHsKKyAgICAgICAgZnJlZShkZXNjSGVhZC0+b2JqZWN0KTsKKyAgICAgICAgZSA9IGRlc2NIZWFkLT5uZXh0OworICAgICAgICBmcmVlKGRlc2NIZWFkKTsKKyAgICAgICAgZGVzY0hlYWQgPSBlOzsKKyAgICB9CisgICAgZGxjbG9zZShoZGwpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCB1bmxvYWRMaWJyYXJ5KGludCBoYW5kbGUpCit7CisgICAgdm9pZCAqaGRsOworICAgIGludCByZXQ7CisgICAgbGlzdF9lbGVtX3QgKmVsMSwgKmVsMjsKKyAgICBsaWJfZW50cnlfdCAqbDsKKyAgICBlZmZlY3RfZW50cnlfdCAqZng7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKKyAgICBlbDEgPSBnTGlicmFyeUxpc3Q7CisgICAgZWwyID0gTlVMTDsKKyAgICB3aGlsZSAoZWwxKSB7CisgICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillbDEtPm9iamVjdDsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBsLT5pZCkgeworICAgICAgICAgICAgaWYgKGVsMikgeworICAgICAgICAgICAgICAgIGVsMi0+bmV4dCA9IGVsMS0+bmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ0xpYnJhcnlMaXN0ID0gZWwxLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShlbDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWwyID0gZWwxOworICAgICAgICBlbDEgPSBlbDEtPm5leHQ7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnTGliTG9jayk7CisgICAgaWYgKGVsMSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIC8vIGNsZWFyIGVmZmVjdCBkZXNjcmlwdG9yIGxpc3QKKyAgICBlbDEgPSBsLT5lZmZlY3RzOworICAgIHdoaWxlIChlbDEpIHsKKyAgICAgICAgZnJlZShlbDEtPm9iamVjdCk7CisgICAgICAgIGVsMiA9IGVsMS0+bmV4dDsKKyAgICAgICAgZnJlZShlbDEpOworICAgICAgICBlbDEgPSBlbDI7CisgICAgfQorCisgICAgLy8gZGlzYWJsZSBhbGwgZWZmZWN0cyBmcm9tIHRoaXMgbGlicmFyeQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbC0+bG9jayk7CisKKyAgICBlbDEgPSBnRWZmZWN0TGlzdDsKKyAgICB3aGlsZSAoZWwxKSB7CisgICAgICAgIGZ4ID0gKGVmZmVjdF9lbnRyeV90ICopZWwxLT5vYmplY3Q7CisgICAgICAgIGlmIChmeC0+bGliID09IGwpIHsKKyAgICAgICAgICAgIGZ4LT5saWIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsMSA9IGVsMS0+bmV4dDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmwtPmxvY2spOworCisgICAgZGxjbG9zZShsLT5oYW5kbGUpOworICAgIGZyZWUobCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVzZXRFZmZlY3RFbnVtZXJhdGlvbigpCit7CisgICAgZ0N1ckxpYiA9IGdMaWJyYXJ5TGlzdDsKKyAgICBnQ3VyRWZmZWN0ID0gTlVMTDsKKyAgICBpZiAoZ0N1ckxpYikgeworICAgICAgICBnQ3VyRWZmZWN0ID0gKChsaWJfZW50cnlfdCAqKWdDdXJMaWItPm9iamVjdCktPmVmZmVjdHM7CisgICAgfQorICAgIGdDdXJFZmZlY3RJZHggPSAwOworfQorCit1aW50MzJfdCB1cGRhdGVOdW1FZmZlY3RzKCkgeworICAgIGxpc3RfZWxlbV90ICplOworICAgIHVpbnQzMl90IGNudCA9IDA7CisKKyAgICByZXNldEVmZmVjdEVudW1lcmF0aW9uKCk7CisKKyAgICBlID0gZ0xpYnJhcnlMaXN0OworICAgIHdoaWxlIChlKSB7CisgICAgICAgIGxpYl9lbnRyeV90ICpsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgd2hpbGUgKGVmeCkgeworICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICBlZnggPSBlZngtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgfQorICAgIGdOdW1FZmZlY3RzID0gY250OworICAgIGdDYW5RdWVyeUVmZmVjdCA9IDA7CisgICAgcmV0dXJuIGNudDsKK30KKworaW50IGZpbmRFZmZlY3QoZWZmZWN0X3V1aWRfdCAqdXVpZCwgbGliX2VudHJ5X3QgKipsaWIsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKipkZXNjKQoreworICAgIGxpc3RfZWxlbV90ICplID0gZ0xpYnJhcnlMaXN0OworICAgIGxpYl9lbnRyeV90ICpsID0gTlVMTDsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkID0gTlVMTDsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKGUgJiYgIWZvdW5kKSB7CisgICAgICAgIGwgPSAobGliX2VudHJ5X3QgKillLT5vYmplY3Q7CisgICAgICAgIGxpc3RfZWxlbV90ICplZnggPSBsLT5lZmZlY3RzOworICAgICAgICB3aGlsZSAoZWZ4KSB7CisgICAgICAgICAgICBkID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QgKillZngtPm9iamVjdDsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoJmQtPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBMT0dWKCJmaW5kRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOworICAgICAgICByZXQgPSAtRU5PRU5UOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoImZpbmRFZmZlY3QoKSBmb3VuZCBlZmZlY3Q6ICVzIGluIGxpYiAlcyIsIGQtPm5hbWUsIGwtPnBhdGgpOworICAgICAgICAqbGliID0gbDsKKyAgICAgICAgKmRlc2MgPSBkOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKSB7CisgICAgY2hhciBzWzI1Nl07CisKKyAgICBzbnByaW50ZihzdHIsIGxlbiwgIlxuRWZmZWN0IERlc2NyaXB0b3IgJXA6XG4iLCBkZXNjKTsKKyAgICBzcHJpbnRmKHMsICItIFVVSUQ6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgZGVzYy0+dXVpZC50aW1lTG93LCBkZXNjLT51dWlkLnRpbWVNaWQsIGRlc2MtPnV1aWQudGltZUhpQW5kVmVyc2lvbiwKKyAgICAgICAgICAgIGRlc2MtPnV1aWQuY2xvY2tTZXEsIGRlc2MtPnV1aWQubm9kZVswXSwgZGVzYy0+dXVpZC5ub2RlWzFdLGRlc2MtPnV1aWQubm9kZVsyXSwKKyAgICAgICAgICAgIGRlc2MtPnV1aWQubm9kZVszXSxkZXNjLT51dWlkLm5vZGVbNF0sZGVzYy0+dXVpZC5ub2RlWzVdKTsKKyAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKKyAgICBzcHJpbnRmKHMsICItIFRZUEU6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgICAgIGRlc2MtPnR5cGUudGltZUxvdywgZGVzYy0+dHlwZS50aW1lTWlkLCBkZXNjLT50eXBlLnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICAgICAgZGVzYy0+dHlwZS5jbG9ja1NlcSwgZGVzYy0+dHlwZS5ub2RlWzBdLCBkZXNjLT50eXBlLm5vZGVbMV0sZGVzYy0+dHlwZS5ub2RlWzJdLAorICAgICAgICAgICAgICAgIGRlc2MtPnR5cGUubm9kZVszXSxkZXNjLT50eXBlLm5vZGVbNF0sZGVzYy0+dHlwZS5ub2RlWzVdKTsKKyAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKKyAgICBzcHJpbnRmKHMsICItIGFwaVZlcnNpb246ICUwNFhcbi0gZmxhZ3M6ICUwOFhcbiIsCisgICAgICAgICAgICBkZXNjLT5hcGlWZXJzaW9uLCBkZXNjLT5mbGFncyk7CisgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CisgICAgc3ByaW50ZihzLCAiLSBuYW1lOiAlc1xuIiwgZGVzYy0+bmFtZSk7CisgICAgc3RybmNhdChzdHIsIHMsIGxlbik7CisgICAgc3ByaW50ZihzLCAiLSBpbXBsZW1lbnRvcjogJXNcbiIsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjU0M2NhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWV9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFNGQUNUT1JZX0hfCisKKyNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisKKworI2lmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBsaXN0X2VsZW1fcyB7CisgICAgdm9pZCAqb2JqZWN0OworICAgIHN0cnVjdCBsaXN0X2VsZW1fcyAqbmV4dDsKK30gbGlzdF9lbGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IGxpYl9lbnRyeV9zIHsKKyAgICBjaGFyIHBhdGhbUEFUSF9NQVhdOworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBpbnQgaWQ7CisgICAgZWZmZWN0X0NyZWF0ZUVmZmVjdF90IGNyZWF0ZUZ4OworICAgIGVmZmVjdF9SZWxlYXNlRWZmZWN0X3QgcmVsZWFzZUZ4OworICAgIGxpc3RfZWxlbV90ICplZmZlY3RzOyAvL2xpc3Qgb2YgZWZmZWN0X2Rlc2NyaXB0b3JfdAorICAgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOworfSBsaWJfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZWZmZWN0X2VudHJ5X3MgeworICAgIHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2ludGVyZmFjZV90IHN1Ykl0ZmU7CisgICAgbGliX2VudHJ5X3QgKmxpYjsKK30gZWZmZWN0X2VudHJ5X3Q7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKworI2VuZGlmIC8qQU5EUk9JRF9FRkZFQ1RTRkFDVE9SWV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMzQ3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE3OSBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMgTXVzaWMgYnVuZGxlCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIFwKKyAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5jIFwKKyAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYyBcCisgICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgXAorICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIFwKKyAgICBCYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgXAorICAgIEJhc3Mvc3JjL0xWREJFX0luaXQuYyBcCisgICAgQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIFwKKyAgICBCYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBcCisgICAgQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMgXAorICAgIEJ1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBcCisgICAgQnVuZGxlL3NyYy9MVk1fSW5pdC5jIFwKKyAgICBCdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMgXAorICAgIEJ1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIFwKKyAgICBCdW5kbGUvc3JjL0xWTV9Db250cm9sLmMgXAorICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYyBcCisgICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyBcCisgICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIFwKKyAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBcCisgICAgRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIFwKKyAgICBFcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBcCisgICAgRXEvc3JjL0xWRVFOQl9Jbml0LmMgXAorICAgIEVxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIFwKKyAgICBFcS9zcmMvTFZFUU5CX1RhYmxlcy5jIFwKKyAgICBDb21tb24vc3JjL0luc3RBbGxvYy5jIFwKKyAgICBDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYyBcCisgICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgXAorICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIFwKKyAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBcCisgICAgQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuYyBcCisgICAgQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAorICAgIENvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYyBcCisgICAgQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jIFwKKyAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMgXAorICAgIENvbW1vbi9zcmMvQWJzXzMyLmMgXAorICAgIENvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jIFwKKyAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKKyAgICBDb21tb24vc3JjL211bHQzc18xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgXAorICAgIENvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBcCisgICAgQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgXAorICAgIENvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMgXAorICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jIFwKKyAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fVGltZXIuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jCisKK0xPQ0FMX01PRFVMRTo9IGxpYm11c2ljYnVuZGxlCisKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTE9DQUxfUEFUSCkvRXEvbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0VxL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9CYXNzL2xpYiBcCisgICAgJChMT0NBTF9QQVRIKS9CYXNzL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMgXAorICAgICQoTE9DQUxfUEFUSCkvQnVuZGxlL2xpYiBcCisgICAgJChMT0NBTF9QQVRIKS9CdW5kbGUvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL1NwZWN0cnVtQW5hbHl6ZXIvbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL1NwZWN0cnVtQW5hbHl6ZXIvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9TdGVyZW9XaWRlbmluZy9saWIKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIFJldmVyYiBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyBcCisgICAgUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jIFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMgXAorICAgIFJldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBcCisgICAgUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBcCisgICAgUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIFwKKyAgICBSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIFwKKyAgICBDb21tb24vc3JjL0Fic18zMi5jIFwKKyAgICBDb21tb24vc3JjL0luc3RBbGxvYy5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIFwKKyAgICBDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIFwKKyAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKKyAgICBDb21tb24vc3JjL011bHQzc18zMngxNi5jIFwKKyAgICBDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgXAorICAgIENvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIFwKKyAgICBDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgXAorICAgIENvbW1vbi9zcmMvQ29weV8xNi5jIFwKKyAgICBDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIFwKKyAgICBDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYyBcCisgICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIFwKKyAgICBDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgXAorICAgIENvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBcCisgICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIFwKKyAgICBDb21tb24vc3JjL0xWTV9GT19IUEYuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMgXAorICAgIENvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jIFwKKyAgICBDb21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIFwKKyAgICBDb21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBcCisgICAgQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmMgXAorICAgIENvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgXAorICAgIENvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgXAorICAgIENvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jCisKK0xPQ0FMX01PRFVMRTo9IGxpYnJldmVyYgorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKExPQ0FMX1BBVEgpL1JldmVyYi9saWIgXAorICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiL3NyYyBcCisgICAgJChMT0NBTF9QQVRIKS9Db21tb24vbGliIFwKKyAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9zcmMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjg5NzdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3MvbGliL0xWREJFLmgKQEAgLTAsMCArMSw0NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgICAgICAgKi8KKy8qICBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyLiBBbGwgb3RoZXIgdHlwZXMsIHN0cnVjdHVyZXMgYW5kICAgICAgICAgICAqLworLyogIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb3RlOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIGFsZ29yaXRobSBjYW4gZXhlY3V0ZSBlaXRoZXIgd2l0aCBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb3Igd2l0aCAgICovCisvKiAgICBhIGNvbW1vbiBidWZmZXIsIGkuZS4gdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGluLXBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vdGU6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGFsZ29yaXRobSBhbHdheXMgcHJvY2Vzc2VzIGRhdGEgYXMgc3RlcmVvIGlucHV0LiBNb25vKi8KKy8qICBmb3JtYXQgZGF0YSBpcyBub3Qgc3VwcG9ydGVkLiBUaGUgZGF0YSBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgQnl0ZSBPZmZzZXQgICAgICAgICBTdGVyZW8gSW5wdXQgICAgICAgICBNb25vLUluLVN0ZXJlbyBJbnB1dCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICA9PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzEgICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzEgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMyICAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICA2ICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMyICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ubyBmb3JtYXQgZGF0YSBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgY2FsbGluZyByb3V0aW5lIG11c3QgY29udmVydCBhIE1vbm8gc3RyZWFtICAgKi8KKy8qICAgIGluIHRvIE1vbm8tSW4tU3RlcmVvIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0xWREJFX0hfXworI2RlZmluZSBfX0xWREJFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lIExWREJFX05SX01FTU9SWV9SRUdJT05TICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBCYXNzIEVuaGFuY2VtZW50IGVmZmVjdCBsZXZlbCAqLworI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDNEQiAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFZmZlY3QgZGVmaW5lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzA2REIgICAgICAgICAgICA2CisjZGVmaW5lIExWREJFX0VGRkVDVF8wOURCICAgICAgICAgICAgOQorI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTJEQiAgICAgICAgICAgIDEyCisjZGVmaW5lIExWREJFX0VGRkVDVF8xNURCICAgICAgICAgICAgMTUKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAgICAqTFZEQkVfSGFuZGxlX3Q7CisKKworLyogT3BlcmF0aW5nIG1vZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkRCRV9PRkYgICAgICA9IDAsCisgICAgTFZEQkVfT04gICAgICAgPSAxLAorICAgIExWREJFX01PREVfTUFYID0gTFZNX01BWElOVF8zMgorfSBMVkRCRV9Nb2RlX2VuOworCisKKy8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWREJFX0hQRl9PRkYgPSAwLAorICAgIExWREJFX0hQRl9PTiAgPSAxLAorICAgIExWREJFX0hQRl9NQVggPSBMVk1fTUFYSU5UXzMyCit9IExWREJFX0ZpbHRlclNlbGVjdF9lbjsKKworCisvKiBWb2x1bWUgY29udHJvbCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfVk9MVU1FX09GRiA9IDAsCisgICAgTFZEQkVfVk9MVU1FX09OICA9IDEsCisgICAgTFZEQkVfVk9MVU1FX01BWCA9IExWTV9NQVhJTlRfMzIKK30gTFZEQkVfVm9sdW1lX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfUEVSU0lTVEVOVCAgICAgID0gMCwKKyAgICBMVkRCRV9QRVJTSVNURU5UX0RBVEEgPSAxLAorICAgIExWREJFX1BFUlNJU1RFTlRfQ09FRiA9IDIsCisgICAgTFZEQkVfU0NSQVRDSCAgICAgICAgID0gMywKKyAgICBMVkRCRV9NRU1PUllfTUFYICAgICAgPSBMVk1fTUFYSU5UXzMyCisKK30gTFZEQkVfTWVtb3J5VHlwZXNfZW47CisKKworLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZEQkVfQUxJR05NRU5URVJST1IgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICBMVkRCRV9OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZEQkVfU0laRUVSUk9SICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29ycmVjdCBzdHJ1Y3R1cmUgc2l6ZSAqLworICAgIExWREJFX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgorfSBMVkRCRV9SZXR1cm5TdGF0dXNfZW47CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExpbmtlZCBlbnVtZXJhdGVkIHR5cGUgYW5kIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSByZXF1aXJlZCBjYXBhYmlsaXRpZXMgYXQgICAgICAgICAgKi8KKy8qICBpbml0aWFsaXNhdGlvbiwgdGhlc2UgYXJlIGFkZGVkIHRvZ2V0aGVyIHRvIGdpdmUgdGhlIGNhcGFiaWxpdHkgd29yZC4gVGhlICAgICAgICAgICAqLworLyogIGVudW1lcmF0ZWQgdHlwZSBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgbW9kZSB0aHJvdWdoIGEgY29udHJvbCBmdW5jdGlvbiBhdCBydW4gdGltZS4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgY2FwYWJpbGl0eSBkZWZpbml0aW9uIGlzIHJlbGF0ZWQgdG8gdGhlIGVudW1lcmF0ZWQgdHlwZSB2YWx1ZSBieSB0aGUgZXF1YXRpb246ICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBDYXBhYmlsaXR5X3ZhbHVlID0gMl5FbnVtZXJhdGVkX3ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZvciBleGFtcGxlLCBhIG1vZHVsZSBjb3VsZCBiZSBjb25maWd1cmQgYXQgaW5pdGlhbGlzYXRpb24gdG8gc3VwcG9ydCB0d28gc2FtcGxlICAgICovCisvKiAgcmF0ZXMgb25seSBieSBjYWxsaW5nIHRoZSBpbml0IGZ1bmN0aW9uIHdpdGggdGhlIHZhbHVlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgPSBMVkRCRV9DQVBfMzIwMDAgKyBMVkNTX0RCRV80NDEwMDsgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgYW5kIGF0IHJ1biB0aW1lIGl0IHdvdWxkIGJlIHBhc3NlZCB0aGUgdmFsdWUgTFZEQkVfRlNfMzIwMDAgdGhyb3VnaCB0aGUgY29udHJvbCAgICAgKi8KKy8qICBmdW5jdGlvbiB0byBzZWxlY3Qgb3BlcmF0aW9uIGF0IDMya0h6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNTVIeiAgICAgICAxCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNjZIeiAgICAgICAyCisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfNzhIeiAgICAgICA0CisjZGVmaW5lIExWREJFX0NBUF9DRU5UUkVfOTBIeiAgICAgICA4CisKK3R5cGVkZWYgZW51bQoreworICAgIExWREJFX0NFTlRSRV81NUhaID0gMCwKKyAgICBMVkRCRV9DRU5UUkVfNjZIWiA9IDEsCisgICAgTFZEQkVfQ0VOVFJFXzc4SFogPSAyLAorICAgIExWREJFX0NFTlRSRV85MEhaID0gMywKKyAgICBMVkRCRV9DRU5UUkVfTUFYICA9IExWTV9NQVhJTlRfMzIKK30gTFZEQkVfQ2VudHJlRnJlcV9lbjsKKworCisvKgorICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKKyAqLworI2RlZmluZSBMVkRCRV9DQVBfRlNfODAwMCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIExWREJFX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzEyMDAwICAgICAgICAgICAgICAgNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTYwMDAgICAgICAgICAgICAgICA4CisjZGVmaW5lIExWREJFX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIExWREJFX0NBUF9GU18yNDAwMCAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0CisjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAorI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZEQkVfRlNfODAwMCAgPSAwLAorICAgIExWREJFX0ZTXzExMDI1ID0gMSwKKyAgICBMVkRCRV9GU18xMjAwMCA9IDIsCisgICAgTFZEQkVfRlNfMTYwMDAgPSAzLAorICAgIExWREJFX0ZTXzIyMDUwID0gNCwKKyAgICBMVkRCRV9GU18yNDAwMCA9IDUsCisgICAgTFZEQkVfRlNfMzIwMDAgPSA2LAorICAgIExWREJFX0ZTXzQ0MTAwID0gNywKKyAgICBMVkRCRV9GU180ODAwMCA9IDgsCisgICAgTFZEQkVfRlNfTUFYICAgPSBMVk1fTUFYSU5UXzMyCit9IExWREJFX0ZzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIEFsaWdubWVudDsgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gYWxpZ25tZW50IGluIGJ5dGVzICovCisgICAgTFZEQkVfTWVtb3J5VHlwZXNfZW4gICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWREJFX01lbW9yeVJlZ2lvbl90OworCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZEQkVfTWVtb3J5UmVnaW9uX3QgICAgUmVnaW9uW0xWREJFX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVkRCRV9NZW1UYWJfdDsKKworCisvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWREJFX01vZGVfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7CisgICAgTFZEQkVfRnNfZW4gICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsKKyAgICBMVkRCRV9DZW50cmVGcmVxX2VuICAgICBDZW50cmVGcmVxdWVuY3k7CisgICAgTFZEQkVfRmlsdGVyU2VsZWN0X2VuICAgSFBGU2VsZWN0OworICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKKworfSBMVkRCRV9QYXJhbXNfdDsKKworCisvKiBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSBjYXBhYmlsaXRpZXMgKi8KKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIENlbnRyZUZyZXF1ZW5jeTsgICAgICAgICAgLyogQ2VudHJlIGZyZXF1ZW5jeSBjYXBhYmlsaXRpZXMgKi8KKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGluIHNhbXBsZSBwYWlycyAqLworfSBMVkRCRV9DYXBhYmlsaXRpZXNfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCisvKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCisvKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAqLworLyogICAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAqLworLyogICAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICovCisvKiAgICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICAgIExWREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9BTElHTk1FTlRFUlJPUiAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAqLworLyogICAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCisvKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXF1ZXN0IHRoZSBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgKi8KKy8qICAgIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0Q2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUmVxdWVzdCB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGNhcGFiaWxpdGllcy4gVGhlIGluaXRpYWwgY2FwYWJpbGl0aWVzIGFyZSAgICovCisvKiAgcmV0dXJuZWQgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdGl5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkRCRV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycy4gQ2hhbmdpbmcgdGhlIHBhcmFtZXRlcnMgd2hpbGUgdGhlICAqLworLyogIG1vZHVsZSBpcyBwcm9jZXNzaW5nIHNpZ25hbHMgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBzaWRlIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZW5lcmFsIHBhcmFtZXRlcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT3BlcmF0aW5nTW9kZTogICAgICBDaGFuZ2luZyB0aGUgbW9kZSBvZiBvcGVyYXRpb24gbWF5IGNhdXNlIGEgY2hhbmdlIGluIHZvbHVtZSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGxldmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FtcGxlUmF0ZTogICAgICAgICBDaGFuZ2luZyB0aGUgc2FtcGxlIHJhdGUgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcy4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVmZmVjdExldmVsOiAgICAgICAgQ2hhbmdpbmcgdGhlIGVmZmVjdCBsZXZlbCBzZXR0aW5nIHdpbGwgaGF2ZSBubyBzaWRlIGVmZmVjdHMgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDZW50cmVGcmVxdWVuY3k6ICAgIENoYW5naW5nIHRoZSBjZW50cmUgZnJlcXVlbmN5IG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSFBGU2VsZWN0OiAgICAgICAgICBTZWxlY3RpbmcvZGUtc2VsZWN0aW5nIHRoZSBoaWdoIHBhc3MgZmlsdGVyIG1heSBjYXVzZSBwb3BzIGFuZCAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIGNsaWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lZEIgICAgICAgICAgICBDaGFuZ2luZyB0aGUgdm9sdW1lIHNldHRpbmcgd2lsbCBoYXZlIG5vIHNpZGUgZWZmZWN0cyAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExWREJFX1RPT01BTllTQU1QTEVTICAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgTnVtU2FtcGxlcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fTFZEQkVfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNzg2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWREJFX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkRCRV9DT0VGRlNfSF9fCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZEQkVfU0NBTEVTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIaWdoIFBhc3MgRmlsdGVyIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyOTU1NjMyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU4ODQ5ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDU5MTEyNjU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTE3Njk4ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDI5NTU2MzI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTg4NDkgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIwODE5ODYzNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzkwMDEgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTAxODM5MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0MDgwNyAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzODIxMDgzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY2OTA5ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDc2NDIxNjYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTMzODE4ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDM4MjEwODMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjY5MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTk5NTA3MTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTU3MzIgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjcyMzg0NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1NjY5MCAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MDA3OTk0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY4NjUwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDgwMTU5ODg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTM3MzAwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQwMDc5OTQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Njg2NTAgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDM4MTE3MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTkzMjcgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzA5NDA0NzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MDEzOCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0NTM4MTk4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTczNTg4ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDkwNzYzOTc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ3MTc2ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ1MzgxOTg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzM1ODggKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTQ3Mjc3OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Njk0OTQgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDE0NzgxNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2OTk1MiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0OTc2NjUyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc3NjcxICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk5NTMzMDQ2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU1MzQzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ5NzY2NTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzc2NzEgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjM3MTQzODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Nzc4NjMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTAyMzI3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3ODEwNSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDcxMTA1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc4NTUxICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTAxNDIyMTAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU3MTAyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUwNzExMDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzg1NTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjU2NDU0OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Nzk2NjIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTIxMjM1MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTg2NiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzM4NTc1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMDQyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA2NzcxNTE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYyMDg0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMzg1NzU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEwNDIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzExMDQ3OTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODQ3NDYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTc0ODY5NDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NDg2MSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1NTU5MjQ5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzMDk3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTExMTg0OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY2MTk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDU1NTkyNDk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODMwOTcgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzU1OTg2NTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODg5MzEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjE5MjIyNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4ODk5MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1NjA2NzI3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzNTM5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTEyMTM0NTUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY3MDc5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDU2MDY3Mjc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODM1MzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzY1NjQyOTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODk4MzEgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjI4Nzc3MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4OTg4MiAqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMyOTMyNzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MzAxNiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMjA0NjU4NjU0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkwNjAzMiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMTAyMzI5MzI3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzMDE2ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDY4ODk2ODYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI2ODEwICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgOTk3OTMxMTEwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MjkzOTYgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzM2MjQyMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MjYzOCAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA2NzI0ODQ1NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyNTI3NSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzMzYyNDIyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyNjM4ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDkwNDQ4MDAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ2ODgxICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDE4MTgyMzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDgyNTYgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzU4NTc2NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDcxOCAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA3MTcxNTMyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyOTQzNSAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTg1NzY2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0NzE4ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk1MDgwMzMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUxMTk2ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDIyNTg3MTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTIzNTkgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIxOTc1MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MDYyMiAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA4NDM5NTA1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0MTI0NCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MjE5NzUyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcwNjIyICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA4MTc3OTEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYzMzk0ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDM1MTQyNjkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQwNTIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDc0NDUxNDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NTUwOSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA5NDg5MDI4OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MTAxOSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NzQ0NTE0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc1NTA5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTE4OTYxMDI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTczNDM2ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ1NTkzMTAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzM3ODQgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYxNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjU2MyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjA5NzE1MjM0OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MzEyNSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NjE3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2NTYzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTIxMjc4MjU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc1NTk0ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ3ODUyMzc5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzU4ODkgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTE3ODAxMTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTU0NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwMzU2MDIzNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1OTA5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MTc4MDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTQ3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI3ODI5MTg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgxNjk1ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU0MjY1NjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODE4NjEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ0MjQ3MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjAxMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwODg0OTQ0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NDAxOSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDQyNDcyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyMDEwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMzMjIxNzIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg2NzE4ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU5NTczOTkzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODY4MDUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ5OTM4NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjU0MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjEwOTk4NzcwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NTA3OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDk5Mzg1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyNTQwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM0MzgwNDc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg3Nzk3ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYwNzE4MTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODc4NzEgKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAxMDE2NTA0MjAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDY2OTMgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgLTIwMzMwMDg0MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS44OTMzODcgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTY1MDQyMDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NjY5MyAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjA1NDYyMzM5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkxMzUxNyAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDk4NDczMzg1MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTE3MTA1ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDI4NjQzNzQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTc5OTkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNTcyODc0ODIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MTU5OTggKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjg2NDM3NDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1Nzk5OSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA4MDA4Mzc2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzNzIyOSAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAwODM5MzkwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTM5MTQwICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDMxMjcxMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjA0NDYgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNjI1NDIxMzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MjA4OTIgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzEyNzEwNjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MDQ0NiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA4NTU1NzA0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0MjMyNiAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAxMzU1MTYyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQzOTQ0ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDM4NzM0NjI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjczOTcgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNzc0NjkyNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzQ3OTQgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzg3MzQ2MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NzM5NyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEwMTAzMzM4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1Njc0MCAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAyODI3NTIyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU3NjU2ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ0OTE4NTg0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzMxNTYgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwODk4MzcxNjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDYzMTMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDQ5MTg1ODQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MzE1NiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExMzc3NTg1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2ODYwNyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MDU1NTAwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY5MDkyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ2MjUyMTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzQzOTggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTI1MDQzMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDg3OTcgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDYyNTIxNjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NDM5OCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjExNjUxNDIyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MTE1NyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MzIxMjcxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxNTY4ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUwMDMxMzAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzc5MTggKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDAwNjI2MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTU4MzYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTAwMzEzMDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NzkxOCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNDI1NTkwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3ODM2NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDc2MjYzOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc4NTk5ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMTUyMjU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODA4MjQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDYzMDQ1MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjE2NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMxNTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MDgyNCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMDYyODc0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NDMwMyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NzAxODE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg0NDI1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzODI0MDg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODE0NTAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDc2NDgxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjI5MDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTM4MjQwODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTQ1MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMTk5ODE1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NTU3OCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1ODM2NzIwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg1NjgxICovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLworI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwOTc2MDA1MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQwNDEyICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDE5NTIwMTA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuODgwODI1ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDA5NzYwMDUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDA0MTIgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIwNDAzNTcxMzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MDAyMzEgKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICA5NzE3MTExMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkwNDk3NyAqLworI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAyMzY4NzIxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzMzgzICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDQ3Mzc0NDM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTA2NzY2ICovCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDIzNjg3MjE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTMzODMgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNjk3MjIzOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Mjc1NzkgKi8KKyNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICA5OTg2OTk2MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzMDExMSAqLworI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjcwNDc1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU2MTkzICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDUzNDA5NTA4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTEyMzg3ICovCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NzA0NzU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTYxOTMgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNzYwMzU5OTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzM0NTkgKi8KKyNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDQ1OTU5MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzNTYwMyAqLworI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTI4MzIyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0MTgzICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDcwNTY2NDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI4MzY1ICovCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDM1MjgzMjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQxODMgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwOTM4ODk4MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTAwODcgKi8KKyNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjE0NTMzMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MTMwMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MjM5ODExNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcwODA5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDg0Nzk2MjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQxNjE4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQyMzk4MTE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzA4MDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMDg1OTEwNTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjM3NzggKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzU1NDExODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDQyMyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0MzkzMzMwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcyMjM5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDg3ODY2NjA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ0NDc3ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQzOTMzMzAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzIyMzkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTE3NTA0OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjY3MjEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzg1OTM2MDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NzI2NiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODI4NTM5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2MjkyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMDk2NTcwNzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUyNTg0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4Mjg1MzkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzYyOTIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjA2ODI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzUwNDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDcyNzEyOTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NTM0NyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MTg4MTMzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NjQxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTAzNzYyNjYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU5MjgyICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUxODgxMzMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk2NDEgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjgwMzU4MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODE4ODggKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ0Njg1MzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjA1MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MjY1NTYxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgwMzYyICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA1MzExMjM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYwNzI0ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUyNjU1NjE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODAzNjIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjk2MTU4NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODMzNTkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTYwMjE0OTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzQ5NyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk4NzUyNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwOTE5NyAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC05ODc1MjQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA5MTk3ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMTI1NTE5ODMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc5NTQ1ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDUzNzYyNjI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEzOTMgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxODM5NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjY5MSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTgzOTUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2NjkxICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMxOTAxNjU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg1NDg4ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU5MjA3NTQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODY0NjQgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDY2MDM4NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjE1MCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC02NjAzODcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2MTUwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMzMjM4MDkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg2NzMzICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYwMzgxMTQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODc1NTcgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5NjA1OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDYyMCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00OTYwNTkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0NjIwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM2OTQ5MDUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkwMTg5ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYzNzA1NzYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA2NTMgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MDQxMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzM1NyAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNjA0MTMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzMzU3ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM5OTI5MDg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkyOTY0ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY2NDUwMDk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTMyMDkgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMTIyMDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzA4NSAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzEyMjA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzMDg1ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQwNTYwNjA2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkzNTUyICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY3MDQwNzAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTM3NTkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0ODYwOTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMjMxNSAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNDg2MDkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAyMzE1ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQyMzI4OTYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk1MTk5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY4NzEyMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUzMTYgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MDUxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMTY4MSAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xODA1MTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAxNjgxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQzNzY1NzcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk2NTM3ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDcwMDg5NzcwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTY1OTkgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2ODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMTU0NSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjU4Njg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAxNTQ1ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTQ0MDcyMjkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTk2ODIzICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDcwMzg2MDM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTY4NzUgKi8KKworIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNTgwMTg5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTI2NDggKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMzU4MDE4OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxMjY0OCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAtMjExNzE2MTE3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MTc2MCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTA0NjI2Njk0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc0NDEyICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ODg4NTU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDkyMDkgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtOTg4ODU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwOTIwOSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNTk3MjczOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3OTk2NiAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzczNTY5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMzY4ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkxOTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDg0NjggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtOTA5MTk1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwODQ2OCAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEyNzgxODAwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MTY4NSAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NTM0NzM1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgyODY5ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODMzNTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDYzNjQgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNjgzMzUyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNjM2NCAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzMjk0MTczOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NjQ1NyAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1OTkxNjUxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg3MTI0ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OTY3MzA5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQ2MjYgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNDk2NzMwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDYyNiAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNzA1NjAwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MDI4OCAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MzY5MjE3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNjQxICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTY1NDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQyNTIgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNDU2NTQ0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDI1MiAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjEzNzkyNzg0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MTEwMCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NDUwNTIwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkxMzk4ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNDI3NzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDMxOTIgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMzQyNzc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzE5MiAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0MDM2OTAwNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MzM3NCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NjgwNjkyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkzNTQxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDg5NDY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDIzMTggKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjQ4OTQ2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMjMxOCAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0MjM1MjM0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NTIyMSAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2ODcwNTI0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1MzA5ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjg3NjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDIxMzEgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjI4NzYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMjEzMSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAtMjE0Mjc3NTQzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NTYxNSAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2OTExMzU4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1NjkwICovCisKKyAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTk0MTE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE4NTcyICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk5NDExODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTg1NzIgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgLTIxMDMxODY3NDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTg3NDUgKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzMzOTc2NDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MjQyNyAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxNDU0MzkzNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDEzNTQ1ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTQ1NDM5MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTM1NDUgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTU5NjY2MzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzA2NDcgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDQzMTcxMzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MjU5NiAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxMzM3Njk5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDEyNDU4ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTMzNzY5OTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTI0NTggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMTg2NTE3MDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzMxNDggKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDY2NzgwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NDc5NSAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NDIyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA5MzczICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwNjQyMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDkzNzMgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMjYxMjQzNDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODAxMDggKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMzODAzMDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTAzNyAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMyMTc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2ODE5ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTczMjE3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDY4MTkgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzIxNDM3NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODU3MTQgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTg5Mjg3MDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NjIwNCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjczMDY0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2MjY4ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTY3MzA2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDYyNjggKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzM0MjE2MDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODY5MDQgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjAxMjQ2NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NzMxOCAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA1NTk2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0NzA5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTUwNTU5NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDQ3MDkgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzcwMDM5NzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTAyNDAgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjM1MTI4MDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDQ3MyAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzY3MzUxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzNDIxICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2NzM1MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDM0MjEgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxMzk5MTkzOTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTI5NTUgKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjYzMDk3MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MzA3OCAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM3NTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzMTQ0ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzNzU5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDMxNDQgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIxNDA1NDE5MDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTM1MzUgKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjY5MTE2NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MzYzOSAqLworCisgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ0Mzg1NDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAyMjc2MCAqLworI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTI0NDM4NTQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDIyNzYwICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMDkyODAxMzQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ5MDczICovCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0Mjk4NzU3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTM5NTMgKi8KKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4NDQzODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxNjYxOSAqLworI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTE3ODQ0Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDE2NjE5ICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTA4NjA0OTIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYzNzkxICovCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDM3NjM5Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjYzNzcgKi8KKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTY0MTY3MDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxNTI4OSAqLworI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTE2NDE2NzA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDE1Mjg5ICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTExOTIyOTM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY2ODgyICovCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQwNTI4MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjkwNjcgKi8KKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIzNTk4ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMTUxMSAqLworI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzU5ODgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDExNTExICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTIxMTUyMTYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc1NDc3ICovCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NzM1ODE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzY3MTEgKi8KKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5OTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwODM3OSAqLworI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC04OTk3MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA4Mzc5ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTI4NTgwNzYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgyMzk1ICovCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU1NTM5MTEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODMwNDcgKi8KKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDgyNzE4MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNzcwNCAqLworI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC04MjcxODE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA3NzA0ICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTMwMTU3MDEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgzODYzICovCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU3MDA2NjIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODQ0MTQgKi8KKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyMTU5MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNTc4OSAqLworI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC02MjE1OTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1Nzg5ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM0NTc0NTIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg3OTc3ICovCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYxMTY2MDMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODgyODggKi8KKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1MTc2NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDIwNyAqLworI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00NTE3NjUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0MjA3ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM4MTY3OTI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkxMzI0ICovCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY0NjAxODk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTE0ODggKi8KKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxNTIwMjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzg2NyAqLworI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC00MTUyMDI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzODY3ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yMTM4OTM1MDAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkyMDM4ICovCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY1MzQxNjIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTIxNzcgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgdGltZSBjb25zdGFudHMgYW5kIGdhaW4gc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQUdDIFRpbWUgY29uc3RhbnRzICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3NTcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44NDEzOTUgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg5MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg4MjIyMyAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTIwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODkxMjUxICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMDU3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MTcyNzYgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA3NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzOTI2NyAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDkzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ0MDYxICovCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxMzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTc3NDUgKi8KKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE3NTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2OTE1OCAqLworI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTgzOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcxNjI4ICovCisjZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwNDIgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAzMCAqLworI2RlZmluZSBBR0NfREVDQVlfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDI4ICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMjEgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAxNSAqLworI2RlZmluZSBBR0NfREVDQVlfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDE0ICovCisjZGVmaW5lIEFHQ19ERUNBWV9GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMTAgKi8KKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwOCAqLworI2RlZmluZSBBR0NfREVDQVlfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDA3ICovCisKKy8qIEFHQyBHYWluIHNldHRpbmdzICovCisjZGVmaW5lIEFHQ19HQUlOX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19HQUlOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19UQVJHRVRMRVZFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMTcwMzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTAwMDAwZEIgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTA3Mzk3MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMjUzOCAqLworI2RlZmluZSBBR0NfR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU3MDA2MDcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODQ4OTMgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI3NTQwNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEyMjAxOCAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwODkxNzc4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzc4Mjc5ICovCisjZGVmaW5lIEFHQ19HQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY5NTA0NzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNTg5MjUgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjcxNjM2OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTI2MiAqLworI2RlZmluZSBBR0NfR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDczOTcwNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyNTM4ICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMyNTE2Njc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yMzg3MjEgKi8KKyNkZWZpbmUgQUdDX0dBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcwMDYwNzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NDg5MyAqLworI2RlZmluZSBBR0NfSFBGR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwNTg0MzkyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTExODg2ICovCisjZGVmaW5lIEFHQ19HQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4OTE3Nzg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43NzgyNzkgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODgxMTg0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjgxODM4MyAqLworI2RlZmluZSBBR0NfR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2NzE2MzY5MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1MjYyICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgwNDMxOTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4xNjIyNzggKi8KKyNkZWZpbmUgQUdDX0dBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzI1MTY2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjIzODcyMSAqLworI2RlZmluZSBBR0NfSFBGR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4NDAwOTQ4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuNTQ4MTM0ICovCisjZGVmaW5lIEFHQ19HQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA1ODQzOTI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS41MTE4ODYgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAyMjUzNDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjk4MTA3MiAqLworI2RlZmluZSBBR0NfR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4ODExODQ1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuODE4MzgzICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTMwNjIxNjgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy40NjY4MzYgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODA0MzE5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjE2MjI3OCAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3NjkyODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCisjZGVmaW5lIEFHQ19HQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjg0MDA5NDgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi41NDgxMzQgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNDEwODgwNDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjYyMzQxMyAqLworI2RlZmluZSBBR0NfR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDIyNTM0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuOTgxMDcyICovCisjZGVmaW5lIEFHQ19IUEZHQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI1Mjc3NzY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS4zMDk1NzMgKi8KKyNkZWZpbmUgQUdDX0dBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MzA2MjE2ODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLworI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYzMTk0MjAzOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDYuMDc5NDU4ICovCisjZGVmaW5lIEFHQ19HQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDc2OTI4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC4wMTE4NzIgKi8KKyNkZWZpbmUgQUdDX0hQRkdBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4NjM4MjMxNjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA2Ljk0MzI4MiAqLworI2RlZmluZSBBR0NfR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI0MTA4ODA0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNjIzNDEzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBWb2x1bWUgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFZvbHVtZSBjb250cm9sIGdhaW4gKi8KKyNkZWZpbmUgVk9MVU1FX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKyNkZWZpbmUgVk9MVU1FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBJbiBkQnMgKi8KKworLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU4ODkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAyNDY5MCAqLworI2RlZmluZSBWT0xfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODg1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE3OTc3ICovCisjZGVmaW5lIFZPTF9UQ19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MzMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTY1MjkgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMwMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMjQyMiAqLworI2RlZmluZSBWT0xfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQ2OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA5MDI5ICovCisjZGVmaW5lIFZPTF9UQ19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDgyOTkgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1MzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjIzMSAqLworI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0NTI1ICovCisjZGVmaW5lIFZPTF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQxNTggKi8KKyNkZWZpbmUgTUlYX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkzNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLworI2RlZmluZSBNSVhfVENfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDIzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTIyNTQ4ICovCisjZGVmaW5lIE1JWF9UQ19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Mjg0MTUgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NTM4NyAqLworI2RlZmluZSBNSVhfVENfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTQ1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU5ODA0ICovCisjZGVmaW5lIE1JWF9UQ19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI5NTYgKi8KKyNkZWZpbmUgTUlYX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE4NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTk3MyAqLworI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCisjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMmE4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIgorI2luY2x1ZGUgIkxWREJFX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUmVxdWVzdCB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgICAgICovCisvKiAgcmV0dXJuZWQgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldFBhcmFtZXRlcnMoTFZEQkVfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0Q2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogRHluYW1pYyBCYXNzIEVuaG5hY2VtZW50IGNhcGFiaWxpdGllcy4gVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzIGFyZSAqLworLyogcmV0dXJuZWQgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKKworICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldEZpbHRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBjbGVhcnMgdGhlIGRhdGEgaGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHRhYmxlIG9mZnNldHMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2IE9mZnNldCA9IChMVk1fVUlOVDE2KSgoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlICsgKExWTV9VSU5UMTYpKHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSAqICgxK0xWREJFX0ZTXzQ4MDAwKSkpOworCisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBoaWdoIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCisgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9DMzJfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfQzMyX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworCit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldEFHQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBBR0MgZ2FpbiBsZXZlbCBhbmQgYXR0YWNrIGFuZCBkZWNheSB0aW1lcyBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIC8qCisgICAgICogR2V0IHRoZSBhdHRhY2sgYW5kIGRlY2F5IHRpbWUgY29uc3RhbnRzCisgICAgICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0F0dGFjayA9IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBBdHRhY2sgbXVsdGlwbGllciAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19EZWNheSAgPSBMVkRCRV9BR0NfREVDQVlfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAgLyogRGVjYXkgbXVsdGlwbGVyICovCisKKworICAgIC8qCisgICAgICogR2V0IHRoZSBib29zdCBnYWluCisgICAgICovCisgICAgaWYgKHBQYXJhbXMtPkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgLyogSGlnaCBwYXNzIGZpbHRlciBvbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KKyAgICB9CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW5TaGlmdCA9IEFHQ19HQUlOX1NISUZUOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19UYXJnZXQgPSBBR0NfVEFSR0VUTEVWRUw7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldFZvbHVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb252ZXJ0cyB0aGUgaW5wdXQgdm9sdW1lIGRlbWFuZCBmcm9tIGRCcyB0byBsaW5lYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIHZvbHVtZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERCRSAgICAgICAgIFZvbCBDb250cm9sICAgICAgICAgICBWb2x1bWUgc2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICA9PT0gICAgICAgICA9PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICAgICAgSGVhZHJvb21kQiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgVm9sdW1lZEIrSGVhZHJvb21kQiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgICAgICBIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT24gICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBWb2x1bWVkQitIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIExWREJFX1NldFZvbHVtZShMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCisgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLworCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGlmIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAocFBhcmFtcy0+Vm9sdW1lQ29udHJvbCA9PSBMVkRCRV9WT0xVTUVfT04pCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCisgICAgICAgICAqLworICAgICAgICBpZiAgKHBQYXJhbXMtPlZvbHVtZWRCID4gVk9MVU1FX01BWCkKKyAgICAgICAgeworICAgICAgICAgICAgVm9sdW1lID0gVk9MVU1FX01BWDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZvbHVtZWRCOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCisgICAgICovCisgICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoNiArIFZvbHVtZSAlIDYpOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCisKKworICAgIC8qCisgICAgICogV2hlbiBEQkUgaXMgZW5hYmxlZCB1c2UgQUdDIHZvbHVtZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9ICgoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSA8PCAxNik7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID4+IGRCU2hpZnRzOworCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVNoaWZ0ID0gVk9MVU1FX1NISUZUKzE7CisKKyAgICAvKgorICAgICAqIFdoZW4gREJFIGlzIGRpc2FibGVkIHVzZSB0aGUgYnlwYXNzIHZvbHVtZSBjb250cm9sCisgICAgICovCisgICAgaWYoZEJTaGlmdHMgPiAwKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLCgoKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pID4+IGRCU2hpZnRzKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwoTFZNX0lOVDMyKUxWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgfQorCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZEQkVfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMuIENoYW5naW5nIHRoZSBwYXJhbWV0ZXJzIHdoaWxlIHRoZSAgKi8KKy8qICBtb2R1bGUgaXMgcHJvY2Vzc2luZyBzaWduYWxzIG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgc2lkZSBlZmZlY3RzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2VuZXJhbCBwYXJhbWV0ZXJzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE9wZXJhdGluZ01vZGU6ICAgICAgQ2hhbmdpbmcgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uIG1heSBjYXVzZSBhIGNoYW5nZSBpbiB2b2x1bWUgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCBvciBjYXVzZSBwb3BzIGFuZCBjbGlja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZVJhdGU6ICAgICAgICAgQ2hhbmdpbmcgdGhlIHNhbXBsZSByYXRlIG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MuICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFZmZlY3RMZXZlbDogICAgICAgIENoYW5naW5nIHRoZSBlZmZlY3QgbGV2ZWwgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcyAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2VudHJlRnJlcXVlbmN5OiAgICBDaGFuZ2luZyB0aGUgY2VudHJlIGZyZXF1ZW5jeSBtYXkgY2F1c2UgcG9wcyBhbmQgY2xpY2tzICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhQRlNlbGVjdDogICAgICAgICAgU2VsZWN0aW5nL2RlLXNlbGVjdGluZyB0aGUgaGlnaCBwYXNzIGZpbHRlciBtYXkgY2F1c2UgcG9wcyBhbmQgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBjbGlja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvbHVtZWRCICAgICAgICAgICAgQ2hhbmdpbmcgdGhlIHZvbHVtZSBzZXR0aW5nIHdpbGwgaGF2ZSBubyBzaWRlIGVmZmVjdHMgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0NvbnRyb2woTFZEQkVfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3Rfc3QgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgIT0gcFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5KSkKKyAgICB7CisgICAgICAgIExWREJFX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBBR0MgaXMgdGhlIGVmZmVjdCBsZXZlbCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgIT0gcFBhcmFtcy0+RWZmZWN0TGV2ZWwpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgIT0gcFBhcmFtcy0+SFBGU2VsZWN0KSkKKyAgICB7CisgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworCisKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBWb2x1bWUgaWYgdGhlIHZvbHVtZSBkZW1hbmQgaGFzIGNoYW5nZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICE9IHBQYXJhbXMtPlZvbHVtZWRCKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAhPSBwUGFyYW1zLT5IZWFkcm9vbWRCKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAhPSBwUGFyYW1zLT5Wb2x1bWVDb250cm9sKSkKKyAgICB7CisgICAgICAgIExWREJFX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCk7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYpOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09OKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMHgwMDAwN0ZGRik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKworCisgICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYzA3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkRCRS5oIgorI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAqLworLyogICAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAqLworLyogICAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAqLworLyogICAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfTWVtb3J5KExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVk1fVUlOVDMyICAgICAgICAgIFNjcmF0Y2hTaXplOworICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0luc3RhbmNlX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLkFsaWdubWVudCAgICA9IExWREJFX0lOU1RBTkNFX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGF0YSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9EYXRhX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29lZiBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgID0gTFZEQkVfU0NSQVRDSF9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWREJFX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAqLworLyogICAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICovCisvKiAgICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICovCisvKiAgICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgKi8KKy8qICAgIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAqLworLyogICAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX0FMSUdOTUVOVEVSUk9SICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IG9uIGluY29ycmVjdCBhbGlnbm1lbnQgICAgICAgICAgICovCisvKiAgICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gICAgIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgKi8KKy8qICAgICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgMi4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOworICAgIExWTWl4ZXIzXzFTdF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOworICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICBNaXhHYWluOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3M7CisgICAgfQorICAgIHBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyBhbmQgaW5jb3JyZWN0bHkgYWxpZ25lZCBkYXRhCisgICAgICovCisgICAgZm9yIChpPTA7IGk8TFZEQkVfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfTlVMTEFERFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgJSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5BbGlnbm1lbnQpIT0wKXsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfQUxJR05NRU5URVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKKworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICAgPSAgICBMVkRCRV9DRU5UUkVfNTVIWjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICAgICA9ICAgIDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAgICAgICAgPSAgICAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAgICAgICAgID0gICAgTFZEQkVfSFBGX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICA9ICAgIExWREJFX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICA9ICAgIExWREJFX0ZTXzgwMDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAgICAgPSAgICBMVkRCRV9WT0xVTUVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICAgICAgICAgID0gICAgMDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgcG9pbnRlciB0byBkYXRhIGFuZCBjb2VmIG1lbW9yeQorICAgICAqLworICAgIHBJbnN0YW5jZS0+cERhdGEgPSBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgcEluc3RhbmNlLT5wQ29lZiA9IHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciB0YXBzIGFuZCBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCisgICAgICovCisgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBiYXNzIGJvb3N0IHNldHRpbmcgKi8KKworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSB2b2x1bWUKKyAgICAgKi8KKyAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBWb2x1bWUgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZSA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLworCisgICAgcE1peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZTsKKyAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sTWl4R2FpbixNaXhHYWluKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgbWl4ZXIgcHJvY2VzcyBwYXRoICovCisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDA7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGNsaWNrcyBtaW5pbWlzYXRpb24gQnlwYXNzTWl4ZXIKKyAgICAgKi8KKworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAorICAgICAqLworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MDsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwwLDApOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQyxwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCisgICAgICovCisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLDB4MDAwMDdGRkYsMHgwMDAwN0ZGRik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMzlkM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSGVhZGVyIGZpbGUgZm9yIHRoZSBwcml2YXRlIGxheWVyIGludGVyZmFjZSBvZiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZEQkVfUFJJVkFURV9IX18KKyNkZWZpbmUgX19MVkRCRV9QUklWQVRFX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWREJFLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisjaW5jbHVkZSAiQUdDLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSAgICBMVkRCRV9JTlZBTElEICAgICAgICAgICAgMHhGRkZGICAgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisKKy8qIE1lbW9yeSAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAxICAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAyICAgICAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IHJlZ2lvbiAqLworI2RlZmluZSBMVkRCRV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgIC8qIE9mZnNldCB0byBkYXRhIHNjcmF0Y2ggbWVtb3J5IHJlZ2lvbiAqLworCisjZGVmaW5lIExWREJFX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLworI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGRhdGEgKi8KKyNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBjb2VmICovCisjZGVmaW5lIExWREJFX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCisKKyNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgNiAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisKKyNkZWZpbmUgTFZEQkVfTUlYRVJfVEMgICAgICAgICAgICAgICAgICAgNSAgICAgICAvKiBNaXhlciB0aW1lICAqLworI2RlZmluZSBMVkRCRV9CWVBBU1NfTUlYRVJfVEMgICAgICAgICAgICAxMDAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGF0YSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KKyAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAgQUdDSW5zdGFuY2U7ICAgICAgICAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBMVk1peGVyM18xU3Rfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLworICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworCit9IExWREJFX0RhdGFfdDsKKworLyogQ29lZnMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgIEhQRkluc3RhbmNlOyAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICBCUEZJbnN0YW5jZTsgICAgICAgIC8qIEJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KKworfSBMVkRCRV9Db2VmX3Q7CisKKy8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLworICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLworCisgICAgLyogRGF0YSBhbmQgY29lZmZpY2llbnQgcG9pbnRlcnMgKi8KKyAgICBMVkRCRV9EYXRhX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgTFZEQkVfQ29lZl90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCit9IExWREJFX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyk7CisKKwordm9pZCAgICBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAqcFBhcmFtcyk7CisKKwordm9pZCAgICBMVkRCRV9TZXRGaWx0ZXJzKExWREJFX0luc3RhbmNlX3QgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDc5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkFHQy5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0YSBjYW4gYmUgcHJvY2Vzc2VkIGluIHR3byBmb3JtYXRzLCBzdGVyZW8gb3IgbW9uby1pbi1zdGVyZW8uIERhdGEgaW4gbW9ubyAgICAgICAgICAgICovCisvKiAgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IHRoZSBtb25vIHN0cmVhbSB0byAgICAgICAgICAgICovCisvKiAgbW9uby1pbi1zdGVyZW8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgIF9fX19fX19fICAgICAgICAgICovCisvKiAgICAgIHwgICAgICAgIHwgICAgX19fX18gICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgICB8ICAgfCAgICAgICAgfCAgICAgICAgICovCisvKiAgICAgIHwgMTYtYml0IHwgICB8ICAgICB8ICB8ICAgIF9fX19fX19fICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgfCAzMi1iaXQgfCAgICAgICAgICovCisvKiAtKy0tPnwgICB0byAgIHwtLT58IEhQRiB8LS18ICAgfCAgICAgICAgfCAgICBfX19fXyAgICB8IEFHQyBNaXhlciB8LS0+fCAgIHRvICAgfC0tfCAgICAgICovCisvKiAgfCAgIHwgMzItYml0IHwgICB8X19fX198ICB8ICAgfCBTdGVyZW8gfCAgIHwgICAgIHwgICB8ICAgICAgICAgICB8ICAgfCAxNi1iaXQgfCAgfCAgICAgICovCisvKiAgfCAgIHxfX19fX19fX3wgICAgICAgICAgICB8LS0+fCAgIHRvICAgfC0tPnwgQlBGIHwtLT58ICAgICAgICAgICB8ICAgfF9fX19fX19ffCAgMCAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgTW9ubyAgfCAgIHxfX19fX3wgICB8X19fX19fX19fX198ICAgICAgICAgICAgICAgIFwtLT4gICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fICAgICAgICAgICAgICAgICAgMCAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICovCisvKiAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IFZvbHVtZSAgfC0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbnRyb2wgfCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyAgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBtdXN0IGJlIDMyLWJpdCBmb3JtYXQuIFRoZSBpbnB1dCBpcyBzY2FsZWQgYnkgYSBzaGlmdCAgICAgICovCisvKiAgICAgd2hlbiBjb252ZXJ0aW5nIGZyb20gMTYtYml0IGZvcm1hdCwgdGhpcyBzY2FsaW5nIGFsbG93cyBmb3IgaW50ZXJuYWwgaGVhZHJvb20gaW4gdGhlICovCisvKiAgICAgYmFzcyBlbmhhbmNlbWVudCBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIHRoZSBjb252ZXJzdGlvbiB0byAzMi1iaXQgaXMgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCAgICovCisvKiAgICAgdGhlIGhlYWRyb29tIGxvc3MuIFRoaXMgaGVhZHJvb20gbG9zcyBpcyBjb21wZW5zYXRlZCBpbiB0aGUgdm9sdW1lIGNvbnRyb2wgc28gdGhlICAgICovCisvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDMyICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICpwTW9ubzsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwSW5wdXQgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKworCisgICAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikoJnBTY3JhdGNoW051bVNhbXBsZXNdKTsKKworICAgIC8qIFNjcmF0Y2ggZm9yIE1vbm8gcGF0aCBzdGFydHMgYXQgb2Zmc2V0IG9mIDIqTnVtU2FtcGxlcyAzMi1iaXQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KKyAgICBwTW9ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICZwU2NyYXRjaFsyKk51bVNhbXBsZXNdOworCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWREJFX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8CisgICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgMTYtYml0IHNhbXBsZXMgdG8gMzItYml0IGFuZCBzY2FsZQorICAgICAgICAgKiAoRm9yIGEgMTYtYml0IGltcGxlbWVudGF0aW9uIGFwcGx5IGhlYWRyb29tIGxvc3MgaGVyZSkKKyAgICAgICAgICovCisgICAgICAgIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxNi1iaXQgZGF0YSAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9TQ0FMRVNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQorICAgICAgICB7CisgICAgICAgICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLCAgICAgICAgICAgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGUgdGhlIG1vbm8gc3RyZWFtCisgICAgICAgICAqLworICAgICAgICBGcm9tMmlUb01vbm9fMzIocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBNb25vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgICAgIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcE1vbm8sICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBNb25vLCAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICAgICAqLworICAgICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAgICAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCAzMi1iaXQgc2FtcGxlcyB0byAxNi1iaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAqIChOb3QgcmVxdWlyZWQgZm9yIDE2LWJpdCBpbXBsZW1lbmF0aW9ucykKKyAgICAgICAgICovCisgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAzMi1iaXQgZGF0YSAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwgICAgICAgICAgICAvKiBEZXN0LiAxNi1iaXQgZGF0YSAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpLCAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfU0NBTEVTSElGVCk7ICAgICAgICAgICAgICAgIC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLworCisgICAgfQorCisgICAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpfHwKKyAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKKyAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgICAgICovCisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCisKKyAgICB9CisKKyAgICAvKgorICAgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgICAqLworICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQyMjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCisgKi8KK2NvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0geworICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAge0hQRl9GczgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzODAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzODAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTEwMjVfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMTAyNV9GYzU1X0ExLAorICAgICBIUEZfRnMxMTAyNV9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTEwMjVfRmM1NV9CMiwKKyAgICAgLUhQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxMjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczEyMDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczEyMDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxMjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTIwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMjIwNTBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyMjA1MF9GYzU1X0ExLAorICAgICBIUEZfRnMyMjA1MF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMjIwNTBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMyNDAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczI0MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczI0MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMyNDAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMjQwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczMyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzNDQxMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0NDEwMF9GYzU1X0ExLAorICAgICBIUEZfRnM0NDEwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzNDQxMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnM0ODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtIUEZfRnM4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczgwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczgwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczExMDI1X0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTEwMjVfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTEwMjVfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczExMDI1X0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxMTAyNV9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxMjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxNjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE2MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczE2MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxNjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczIyMDUwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjIwNTBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMjIwNTBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczIyMDUwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMyMjA1MF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMjQwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyNDAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMyNDAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMjQwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMzMjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczMyMDAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczMyMDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMzMjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczQ0MTAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDQxMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzNDQxMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM0NDEwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzNDgwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0ODAwMF9GYzY2X0ExLAorICAgICBIUEZfRnM0ODAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjNzhfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM3OF9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjNzhfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM3OF9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKKworICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAge0hQRl9GczgwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczgwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzODAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzODAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTEwMjVfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxMTAyNV9GYzkwX0ExLAorICAgICBIUEZfRnMxMTAyNV9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTEwMjVfRmM5MF9CMiwKKyAgICAgLUhQRl9GczExMDI1X0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxMjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczEyMDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczEyMDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxMjAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTIwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczE2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTYwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTYwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczE2MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMjIwNTBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMyMjA1MF9GYzkwX0ExLAorICAgICBIUEZfRnMyMjA1MF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMjIwNTBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczIyMDUwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMyNDAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczI0MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczI0MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMyNDAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMjQwMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczMyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMzIwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMzIwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczMyMDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzNDQxMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM0NDEwMF9GYzkwX0ExLAorICAgICBIUEZfRnM0NDEwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzNDQxMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczQ0MTAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnM0ODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczQ4MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMX19OworCisvKgorICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQorICovCitjb25zdCBCUF9DMzJfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM5MF9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX19OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQUdDIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KK2NvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfQVRUQUNLX1RhYmxlW10gPSB7CisgICAgQUdDX0FUVEFDS19GczgwMDAsCisgICAgQUdDX0FUVEFDS19GczExMDI1LAorICAgIEFHQ19BVFRBQ0tfRnMxMjAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzMTYwMDAsCisgICAgQUdDX0FUVEFDS19GczIyMDUwLAorICAgIEFHQ19BVFRBQ0tfRnMyNDAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzMzIwMDAsCisgICAgQUdDX0FUVEFDS19GczQ0MTAwLAorICAgIEFHQ19BVFRBQ0tfRnM0ODAwMH07CisKKy8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7CisgICAgQUdDX0RFQ0FZX0ZzODAwMCwKKyAgICBBR0NfREVDQVlfRnMxMTAyNSwKKyAgICBBR0NfREVDQVlfRnMxMjAwMCwKKyAgICBBR0NfREVDQVlfRnMxNjAwMCwKKyAgICBBR0NfREVDQVlfRnMyMjA1MCwKKyAgICBBR0NfREVDQVlfRnMyNDAwMCwKKyAgICBBR0NfREVDQVlfRnMzMjAwMCwKKyAgICBBR0NfREVDQVlfRnM0NDEwMCwKKyAgICBBR0NfREVDQVlfRnM0ODAwMH07CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitjb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKKyAgICBBR0NfR0FJTl8wZEIsCisgICAgQUdDX0dBSU5fMWRCLAorICAgIEFHQ19HQUlOXzJkQiwKKyAgICBBR0NfR0FJTl8zZEIsCisgICAgQUdDX0dBSU5fNGRCLAorICAgIEFHQ19HQUlOXzVkQiwKKyAgICBBR0NfR0FJTl82ZEIsCisgICAgQUdDX0dBSU5fN2RCLAorICAgIEFHQ19HQUlOXzhkQiwKKyAgICBBR0NfR0FJTl85ZEIsCisgICAgQUdDX0dBSU5fMTBkQiwKKyAgICBBR0NfR0FJTl8xMWRCLAorICAgIEFHQ19HQUlOXzEyZEIsCisgICAgQUdDX0dBSU5fMTNkQiwKKyAgICBBR0NfR0FJTl8xNGRCLAorICAgIEFHQ19HQUlOXzE1ZEJ9OworCisvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisgICAgQUdDX0hQRkdBSU5fMGRCLAorICAgIEFHQ19IUEZHQUlOXzFkQiwKKyAgICBBR0NfSFBGR0FJTl8yZEIsCisgICAgQUdDX0hQRkdBSU5fM2RCLAorICAgIEFHQ19IUEZHQUlOXzRkQiwKKyAgICBBR0NfSFBGR0FJTl81ZEIsCisgICAgQUdDX0hQRkdBSU5fNmRCLAorICAgIEFHQ19IUEZHQUlOXzdkQiwKKyAgICBBR0NfSFBGR0FJTl84ZEIsCisgICAgQUdDX0hQRkdBSU5fOWRCLAorICAgIEFHQ19IUEZHQUlOXzEwZEIsCisgICAgQUdDX0hQRkdBSU5fMTFkQiwKKyAgICBBR0NfSFBGR0FJTl8xMmRCLAorICAgIEFHQ19IUEZHQUlOXzEzZEIsCisgICAgQUdDX0hQRkdBSU5fMTRkQiwKKyAgICBBR0NfSFBGR0FJTl8xNWRCfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KK2NvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdID0geworICAgIDB4NDAwMCwgICAgICAgICAgICAgLyogLTZkQiAqLworICAgIDB4NDdGQiwgICAgICAgICAgICAgLyogLTVkQiAqLworICAgIDB4NTBDMywgICAgICAgICAgICAgLyogLTRkQiAqLworICAgIDB4NUE5RSwgICAgICAgICAgICAgLyogLTNkQiAqLworICAgIDB4NjVBRCwgICAgICAgICAgICAgLyogLTJkQiAqLworICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLworICAgIDB4N0ZGRn07ICAgICAgICAgICAgLyogIDBkQiAqLworCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworICAgIFZPTF9UQ19GczgwMDAsCisgICAgVk9MX1RDX0ZzMTEwMjUsCisgICAgVk9MX1RDX0ZzMTIwMDAsCisgICAgVk9MX1RDX0ZzMTYwMDAsCisgICAgVk9MX1RDX0ZzMjIwNTAsCisgICAgVk9MX1RDX0ZzMjQwMDAsCisgICAgVk9MX1RDX0ZzMzIwMDAsCisgICAgVk9MX1RDX0ZzNDQxMDAsCisgICAgVk9MX1RDX0ZzNDgwMDB9OworCitjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CisgICAgTUlYX1RDX0ZzODAwMCwKKyAgICBNSVhfVENfRnMxMTAyNSwKKyAgICBNSVhfVENfRnMxMjAwMCwKKyAgICBNSVhfVENfRnMxNjAwMCwKKyAgICBNSVhfVENfRnMyMjA1MCwKKyAgICBNSVhfVENfRnMyNDAwMCwKKyAgICBNSVhfVENfRnMzMjAwMCwKKyAgICBNSVhfVENfRnM0NDEwMCwKKyAgICBNSVhfVENfRnM0ODAwMH07CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NmU2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19MVkJERV9UQUJMRVNfSF9fCisjZGVmaW5lIF9fTFZCREVfVEFCTEVTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBCUV9DMzJfQ29lZnNfdCBMVkRCRV9IUEZfVGFibGVbXTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IEJQX0MzMl9Db2Vmc190IExWREJFX0JQRl9UYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFHQyBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXTsKKworLyogRGVjYXkgdGltZSAoc2lnbmFsIHRvbyBzbWFsbCkgKi8KK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW107CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRoIHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitleHRlcm4gY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdOworCitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRDVGFibGVbXTsKKworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9NaXhlclRDVGFibGVbXTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fTFZCREVfVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYyYTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTAsMCArMSw2MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBhcHBsaWNhdGlvbiBsYXllciBpbnRlcmZhY2Ugb2YgQ29uY2VydCBTb3VuZCwgQmFzcyBFbmhhbmNlbWVudCwgKi8KKy8qICBFcXVhbGl6ZXIsIFBvd2VyIFNwZWN0cnVtIEFuYWx5emVyLCBUcmViYmxlIEVuaGFuY2VtZW50IGFuZCB2b2x1bWUgbWFuYWdlbWVudCAgICAgICAqLworLyogIGJ1bmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGNhbGxpbmcgbGF5ZXIuIEFsbCBvdGhlciB0eXBlcywgc3RydWN0dXJlcyBhbmQgICAgICAgICAgICovCisvKiAgZnVuY3Rpb25zIGFyZSBwcml2YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGFsZ29yaXRobSBjYW4gZXhlY3V0ZSBlaXRoZXIgd2l0aCBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb3Igd2l0aCAgICAgKi8KKy8qICBhIGNvbW1vbiBidWZmZXIsIGkuZS4gdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGluLXBsYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGU6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaHJlZSBkYXRhIGZvcm1hdHMgYXJlIHN1cHBvcnQgU3RlcmVvLE1vbm8tSW4tU3RlcmVvIGFuZCBNb25vLiBUaGUgZGF0YSBpcyAgICAgICAgICAqLworLyogIGludGVybGVhdmVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXRlIE9mZnNldCAgICAgICAgIFN0ZXJlbyBJbnB1dCAgICAgICAgIE1vbm8tSW4tU3RlcmVvIElucHV0ICAgICAgIE1vbm8gSW5wdXQgICAgICAqLworLyogID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PT0gICAgID09PT09PT09PT09PT09ICAgICovCisvKiAgICAgIDAgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMSAgICAgICAgICBNb25vIFNhbXBsZSAjMSAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgKi8KKy8qICAgICAgMiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMSAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAqLworLyogICAgICA0ICAgICAgICAgICAgICAgTGVmdCBTYW1wbGUgIzIgICAgICAgICAgTW9ubyBTYW1wbGUgIzIgICAgICAgIE1vbm8gU2FtcGxlICMzICAgICovCisvKiAgICAgIDYgICAgICAgICAgICAgICBSaWdodCBTYW1wbGUgIzIgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgTW9ubyBTYW1wbGUgIzQgICAgKi8KKy8qICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAqLworLyogICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX0hfXworI2RlZmluZSBfX0xWTV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUqLworI2RlZmluZSBMVk1fTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBDb25jZXJ0IFNvdW5kIGVmZmVjdCBsZXZlbCBwcmVzZXRzICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfTk9ORSAgICAgICAgICAgICAgICAgICAgMCAgICAgLyogMCUgZWZmZWN0LCBtaW5pbXVtIHZhbHVlICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfTE9XICAgICAgICAgICAgICAgICAxNjM4NCAgICAgLyogNTAlIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQ1NfRUZGRUNUX01FRCAgICAgICAgICAgICAgICAgMjQ1NzYgICAgIC8qIDc1JSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9ISUdIICAgICAgICAgICAgICAgIDMyNzY3ICAgICAvKiAxMDAlIGVmZmVjdCwgbWF4aW11bSB2YWx1ZSAqLworCisvKiBUcmVibGUgZW5oYW5jZW1lbnQgKi8KKyNkZWZpbmUgTFZNX1RFX0xPV19NSVBTICAgICAgICAgICAgICAgICAgIDMyNzY3CisKKy8qIEJhc3MgZW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KKyNkZWZpbmUgTFZNX0JFXzBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwZEIgYm9vc3QsIG5vIGVmZmVjdCAqLworI2RlZmluZSBMVk1fQkVfM0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgIC8qICszZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAvKiArNmRCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV85REIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgLyogKzlkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfMTJEQiAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgIC8qICsxMmRCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV8xNURCICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAgICAgLyogKzE1ZEIgYm9vc3QgKi8KKworLyogTi1CYW5kIEVxdWFsaXplciAqLworI2RlZmluZSBMVk1fRVFfTkJBTkRTICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlcXVhbGl6ZXIgKi8KKworLyogSGVhZHJvb20gbWFuYWdlbWVudCAqLworI2RlZmluZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAgICAgICAgICAgICAgIDUKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5zdGFuY2UgaGFuZGxlICovCit0eXBlZGVmIHZvaWQgKkxWTV9IYW5kbGVfdDsKKworCisvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVk1fQUxJR05NRU5URVJST1IgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZNX05VTExBRERSRVNTICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgID0gNCwgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgTFZNX1dST05HQVVESU9USU1FICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgLyogV3JvbmcgdGltZSB2YWx1ZSBmb3IgYXVkaW8gdGltZSovCisgICAgTFZNX0FMR09SSVRITURJU0FCTEVEICA9IDYsICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIGlzIGRpc2FibGVkKi8KKyAgICBMVk1fQUxHT1JJVEhNUFNBICAgICAgID0gNywgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gUFNBIHJldHVybnMgYW4gZXJyb3IgKi8KKyAgICBMVk1fUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX1JldHVyblN0YXR1c19lbjsKKworCisvKiBCdWZmZXIgTWFuYWdlbWVudCBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fTUFOQUdFRF9CVUZGRVJTICAgPSAwLAorICAgIExWTV9VTk1BTkFHRURfQlVGRkVSUyA9IDEsCisgICAgTFZNX0JVRkZFUlNfRFVNTVkgICAgID0gTFZNX01BWEVOVU0KK30gTFZNX0J1ZmZlck1vZGVfZW47CisKKy8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0hFQURQSE9ORVMgICAgICAgICAgICAgPSAwLAorICAgIExWTV9FWF9IRUFEUEhPTkVTICAgICAgICAgID0gMSwKKyAgICBMVk1fU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit9IExWTV9PdXRwdXREZXZpY2VUeXBlX2VuOworCisvKiBWaXJ0dWFsaXplciBtb2RlIHNlbGVjdGlvbiovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fQ09OQ0VSVFNPVU5EICAgICAgID0gMCwKKyAgICBMVk1fVklSVFVBTElaRVJUWVBFX0RVTU1ZICAgPSBMVk1fTUFYRU5VTQorfSBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuOworCisvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fRVFOQl9PRkYgICA9IDAsCisgICAgTFZNX0VRTkJfT04gICAgPSAxLAorICAgIExWTV9FUU5CX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX0VRTkJfTW9kZV9lbjsKKworLyogQmFzcyBFbmhhbmNlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0JFX09GRiAgID0gMCwKKyAgICBMVk1fQkVfT04gICAgPSAxLAorICAgIExWTV9CRV9EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9CRV9Nb2RlX2VuOworCisvKiBCYXNzIEVuaGFuY2VtZW50IGNlbnRyZSBmcmVxdWVuY3kgc2VsZWN0aW9uIGNvbnRyb2wgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CRV9DRU5UUkVfNTVIeiAgPSAwLAorICAgIExWTV9CRV9DRU5UUkVfNjZIeiAgPSAxLAorICAgIExWTV9CRV9DRU5UUkVfNzhIeiAgPSAyLAorICAgIExWTV9CRV9DRU5UUkVfOTBIeiAgPSAzLAorICAgIExWTV9CRV9DRU5UUkVfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fQkVfQ2VudHJlRnJlcV9lbjsKKworLyogQmFzcyBFbmhhbmNlbWVudCBIUEYgc2VsZWN0aW9uIGNvbnRyb2wgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CRV9IUEZfT0ZGICAgPSAwLAorICAgIExWTV9CRV9IUEZfT04gICAgPSAxLAorICAgIExWTV9CRV9IUEZfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fQkVfRmlsdGVyU2VsZWN0X2VuOworCisvKiBWb2x1bWUgQ29udHJvbCBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1ZDX09GRiAgID0gMCwKKyAgICBMVk1fVkNfT04gICAgPSAxLAorICAgIExWTV9WQ19EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9WQ19Nb2RlX2VuOworCisvKiBUcmVibGUgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWTV9URV9PRkYgICA9IDAsCisgICAgTFZNX1RFX09OICAgID0gMSwKKyAgICBMVk1fVEVfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fVEVfTW9kZV9lbjsKKworLyogSGVhZHJvb20gbWFuYWdlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX0hFQURST09NX09GRiAgID0gMCwKKyAgICBMVk1fSEVBRFJPT01fT04gICAgPSAxLAorICAgIExWTV9IZWFkcm9vbV9EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWTV9IZWFkcm9vbV9Nb2RlX2VuOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fUFNBX1NQRUVEX1NMT1csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgc2xvdyBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfTUVESVVNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVhayBkZWNheWluZyBhdCBtZWRpdW0gc3BlZWQgKi8KKyAgICBMVk1fUFNBX1NQRUVEX0ZBU1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgZmFzdCBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fUFNBX0RlY2F5U3BlZWRfZW47CisKK3R5cGVkZWYgZW51bQoreworICAgIExWTV9QU0FfT0ZGICAgPSAwLAorICAgIExWTV9QU0FfT04gICAgPSAxLAorICAgIExWTV9QU0FfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVk1fUFNBX01vZGVfZW47CisKKy8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgICpwVmVyc2lvbk51bWJlcjsgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBmb3JtYXQgWC5ZWS5aWiAqLworICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFBsYXRmb3JtOyAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBsaWJyYXJ5IHBsYXRmb3JtIHR5cGUgKi8KK30gTFZNX1ZlcnNpb25JbmZvX3N0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWTV9NZW1UYWJfdDsKKworLyogTi1CYW5kIGVxdWFsaXNlciBiYW5kIGRlZmluaXRpb24gKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgIC8qIEJhbmQgZ2FpbiBpbiBkQiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGcmVxdWVuY3k7ICAgICAgICAgICAgICAvKiBCYW5kIGNlbnRyZSBmcmVxdWVuY3kgaW4gSHogKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgLyogQmFuZCBxdWFsaXR5IGZhY3RvciAoeDEwMCkgKi8KK30gTFZNX0VRTkJfQmFuZERlZl90OworCisKKy8qIEhlYWRyb29tIGJhbmQgZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGltaXRfTG93OyAgICAgICAgICAgICAgLyogTG93IGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMaW1pdF9IaWdoOyAgICAgICAgICAgICAvKiBIaWdoIGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBIZWFkcm9vbV9PZmZzZXQ7ICAgICAgICAvKiBIZWFkcm9vbSA9IGJpZ2dlc3QgYmFuZCBnYWluIC0gSGVhZHJvb21fT2Zmc2V0ICovCit9IExWTV9IZWFkcm9vbUJhbmREZWZfdDsKKworCisvKiBDb250cm9sIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIEJ1bmRsZSBvcGVyYXRpbmcgbW9kZSBPbi9CeXBhc3MgKi8KKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fRm9ybWF0X2VuICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogSW5wdXQgZGF0YSBmb3JtYXQgKi8KKyAgICBMVk1fT3V0cHV0RGV2aWNlVHlwZV9lbiAgICAgU3BlYWtlclR5cGU7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSB0eXBlICovCisKKyAgICAvKiBDb25jZXJ0IFNvdW5kIFZpcnR1YWxpemVyIHBhcmFtZXRlcnMqLworICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBWaXJ0dWFsaXplck9wZXJhdGluZ01vZGU7IC8qIFZpcnR1YWxpemVyIG9wZXJhdGluZyBtb2RlIE9uL09mZiAqLworICAgIExWTV9WaXJ0dWFsaXplclR5cGVfZW4gICAgICBWaXJ0dWFsaXplclR5cGU7ICAgICAgICAgIC8qIFZpcnR1YWxpemVyIHR5cGU6IENvbmNlcnRTb3VuZCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBWaXJ0dWFsaXplclJldmVyYkxldmVsOyAgIC8qIFZpcnR1YWxpemVyIHJldmVyYiBsZXZlbCBpbiAlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIENTX0VmZmVjdExldmVsOyAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCBlZmZlY3QgbGV2ZWwgKi8KKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIExWTV9FUU5CX01vZGVfZW4gICAgICAgICAgICBFUU5CX09wZXJhdGluZ01vZGU7ICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEVRTkJfTkJhbmRzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICAgICAqcEVRTkJfQmFuZERlZmluaXRpb247ICAvKiBQb2ludGVyIHRvIGVxdWFsaXNlciBkZWZpbml0aW9ucyAqLworCisgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgTFZNX0JFX01vZGVfZW4gICAgICAgICAgICAgIEJFX09wZXJhdGluZ01vZGU7ICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgQkVfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KKyAgICBMVk1fQkVfQ2VudHJlRnJlcV9lbiAgICAgICAgQkVfQ2VudHJlRnJlcTsgICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0JFX0ZpbHRlclNlbGVjdF9lbiAgICAgIEJFX0hQRjsgICAgICAgICAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgaGlnaCBwYXNzIGZpbHRlciBzZWxlY3RvciAqLworCisgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBWQ19FZmZlY3RMZXZlbDsgICAgICAgICAvKiBWb2x1bWUgQ29udHJvbCBzZXR0aW5nIGluIGRCcyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBWQ19CYWxhbmNlOyAgICAgICAgICAgICAvKiBMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiAoLTk2IHRvIDk2IGRCKSwgLXZlIHZhbHVlcyByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgY2hhbm5lbCB3aGlsZSArdmUgdmFsdWUgcmVkdWNlcyBMZWZ0IGNoYW5uZWwqLworCisgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fVEVfTW9kZV9lbiAgICAgICAgICAgICAgVEVfT3BlcmF0aW5nTW9kZTsgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IE9uL09mZiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBURV9FZmZlY3RMZXZlbDsgICAgICAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgZ2FpbiBkQnMgKi8KKworICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIHBhcmFtZXRlcnMgQ29udHJvbCAqLworICAgIExWTV9QU0FfTW9kZV9lbiAgICAgICAgICAgICBQU0FfRW5hYmxlOworICAgIExWTV9QU0FfRGVjYXlTcGVlZF9lbiAgICAgICBQU0FfUGVha0RlY2F5UmF0ZTsgICAgICAvKiBQZWFrIHZhbHVlIGRlY2F5IHJhdGUqLworCit9IExWTV9Db250cm9sUGFyYW1zX3Q7CisKKworLyogSW5zdGFuY2UgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX0J1ZmZlck1vZGVfZW4gICAgICAgICAgIEJ1ZmZlck1vZGU7ICAgICAgICAgICAgIC8qIEJ1ZmZlciBtYW5hZ2VtZW50IG1vZGUgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBwcm9jZXNzaW5nIGJsb2NrIHNpemUgKi8KKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRVFOQl9OdW1CYW5kczsgICAgICAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZXF1YWxpc2VyIGJhbmRzICovCisKKyAgICAvKiBQU0EgKi8KKyAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0luY2x1ZGVkOyAgICAgICAgICAgIC8qIENvbnRyb2xzIHRoZSBpbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgUFNBOiBPTi9PRkYgKi8KK30gTFZNX0luc3RQYXJhbXNfdDsKKworLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9IZWFkcm9vbV9Nb2RlX2VuICAgICAgICBIZWFkcm9vbV9PcGVyYXRpbmdNb2RlOyAvKiBIZWFkcm9vbSBDb250cm9sIE9uL09mZiAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICAgICAqcEhlYWRyb29tRGVmaW5pdGlvbjsgICAvKiBQb2ludGVyIHRvIGhlYWRyb29tIGJhbmRzIGRlZmluaXRpb24gKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTkhlYWRyb29tQmFuZHM7ICAgICAgICAgLyogTnVtYmVyIG9mIGhlYWRyb29tIGJhbmRzICovCisKK30gTFZNX0hlYWRyb29tUGFyYW1zX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0VmVyc2lvbkluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpYnJhcnkncyB2ZXJzaW9uLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwVmVyc2lvbiAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHZlcnNpb24gaW5mbyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIHdoZW4gcFZlcnNpb24gaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0VmVyc2lvbkluZm8oTFZNX1ZlcnNpb25JbmZvX3N0ICAqcFZlcnNpb24pOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgICBXaGVuIGFueSBvZiB0aGUgSW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICpwSW5zdFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVybmFsIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIGJ1bmRsZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIEluc3RhbmNlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAgICAgKi8KKy8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgd2hlbiBhbnkgb2YgaEluc3RhbmNlIG9yIHBQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBMaWZlVmliZXMgbW9kdWxlIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlLCBwUGFyYW1zIG9yIGFueSBjb250cm9sIHBvaW50ZXJzIGFyZSBOVUxMICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIExpZmVWaWJlcyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgICAgICBBdWRpbyBUaW1lIG9mIHRoZSBjdXJyZW50IGlucHV0IGRhdGEgaW4gbWlsbGktc2Vjb25kcyAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9JTlZBTElETlVNU0FNUExFUyAgV2hlbiB0aGUgTnVtU2FtcGxlcyBpcyBub3QgYSB2YWxpZWQgbXVsdGlwbGUgaW4gdW5tYW5hZ2VkICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fQUxJR05NRU5URVJST1IgICAgIFdoZW4gZWl0aGVyIHRoZSBpbnB1dCBvdXIgb3V0cHV0IGJ1ZmZlcnMgYXJlIG5vdCAzMi1iaXQgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBpbiB1bm1hbmFnZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBOdW1iZXIgb2Ygc2FtcGxlcyBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBNT05PICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIE1PTk9JTlNURVJFTyAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGUgcGFpcnMgaW4gdGhlIGJsb2NrICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgU1RFUkVPICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZSBwYWlycyBpbiB0aGUgYmxvY2sgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBhdXRvbWF0aWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBIZWFkcm9vbVBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBhdXRvbWF0aWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAob3V0cHV0KSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBoSW5zdGFuY2Ugb3IgcEhlYWRyb29tUGFyYW1zIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBTcGVjdHJhbCBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIEF1ZGlvIHRpbWUgICAgICAgICAqLworLyogZm9yIGRpc3BsYXkgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRQZWFrcyAgICAgICAgICAgUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJyZW50cyBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgKi8KKy8qICBwUGFzdFBlYWtzICAgICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHBhc3QgcGVha3MgYXJlIHRvIGJlIHNhdmVkICAgICAgICAqLworLyogIHBDZW50cmVGcmVxcyAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgY2VudHJlIGZyZXF1ZW5jeSBvZiBlYWNoIGJhbmQgaXMgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgc2F2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgICAgICBBdWRpbyB0aW1lIGF0IHdoaWNoIHRoZSBzcGVjdHJhbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1dST05HQVVESU9USU1FICAgICAgRmFpbHVyZSBkdWUgdG8gYXVkaW8gdGltZSBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bSggTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwQ3VycmVudFBlYWtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IG91dHB1dCB2b2x1bWUgd2l0aG91dCBhbnkgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBDb250cm9sIFBhcmFtZXRlcnMsIG9ubHkgdm9sdW1lIHZhbHVlIGlzIHVzZWQgaGVyZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fSF9fICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I3ZjBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBTcGVjdHJhbCBpbmZvcm1hdGlvbiBhdCBhIGdpdmVuIEF1ZGlvIHRpbWUgICAgICAgICAqLworLyogZm9yIGRpc3BsYXkgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRQZWFrcyAgICAgICAgICAgUG9pbnRlciB0byBsb2NhdGlvbiB3aGVyZSBjdXJyZW50cyBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgKi8KKy8qICBwUGFzdFBlYWtzICAgICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIHBhc3QgcGVha3MgYXJlIHRvIGJlIHNhdmVkICAgICAgICAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgICAgIEF1ZGlvIHRpbWUgYXQgd2hpY2ggdGhlIHNwZWN0cmFsIGluZm9ybWF0aW9uIGlzIG5lZWRlZCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgSWYgYW55IG9mIGlucHV0IGFkZHJlc3NlcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fV1JPTkdBVURJT1RJTUUgICAgICBGYWlsdXJlIGR1ZSB0byBhdWRpbyB0aW1lIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFNwZWN0cnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFBhc3RQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICAqcEluc3RhbmNlICAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAqaFBTQUluc3RhbmNlOworICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgTFZQU0FfU3RhdHVzOworCisKKyAgICBpZihwSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qSWYgUFNBIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGUgdGltZSBvZiBpbnN0YW5jZSBjcmVhdGlvbiwgcmV0dXJuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcqLworICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQhPUxWTV9QU0FfT04pCisgICAgeworICAgICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CisgICAgfQorCisgICAgaFBTQUluc3RhbmNlID0gcEluc3RhbmNlLT5oUFNBSW5zdGFuY2U7CisKKyAgICBpZigocEN1cnJlbnRQZWFrcyA9PSBMVk1fTlVMTCkgfHwKKyAgICAgICAgKHBQYXN0UGVha3MgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKiBJZiBQU0EgbW9kdWxlIGlzIGRpc2FibGVkLCBkbyBub3RoaW5nICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZT09TFZNX1BTQV9PRkYpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX0FMR09SSVRITURJU0FCTEVEOworICAgIH0KKworICAgIExWUFNBX1N0YXR1cyA9IExWUFNBX0dldFNwZWN0cnVtKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZQU0FfVGltZSkgKEF1ZGlvVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBQYXN0UGVha3MgKTsKKworICAgIGlmKExWUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICB7CisgICAgICAgIGlmKExWUFNBX1N0YXR1cyA9PSBMVlBTQV9FUlJPUl9XUk9OR1RJTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX1dST05HQVVESU9USU1FOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IG91dHB1dCB2b2x1bWUgd2l0aG91dCBhbnkgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBDb250cm9sIFBhcmFtZXRlcnMsIG9ubHkgdm9sdW1lIHZhbHVlIGlzIHVzZWQgaGVyZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBFcnJvcjsKKworICAgIC8qQXBwbHkgbmV3IGNvbnRyb2xzKi8KKyAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgcEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9IExWTV9UUlVFOworICAgIHJldHVybiBFcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKQEAgLTAsMCArMSw4NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IGFsbG93aW5nIHRoZSB1c2VyIHRvIHByb3ZpZGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9uICAgKi8KKy8qICBhbnkgYWxpZ25tZW50IGFuZCB3aXRoIGFueSBudW1iZXIgb2Ygc2FtcGxlcy4gVGhlIGFsaWdubWVudCBpcyBjb3JyZWN0ZWQgd2l0aGluICAgICAqLworLyogIHRoZSBidWZmZXIgbWFuYWdlbWVudCBhbmQgdGhlIHNhbXBsZXMgYXJlIGdyb3VwZWQgaW4gdG8gYmxvY2tzIG9mIHRoZSBjb3JyZWN0IHNpemUgICovCisvKiAgYmVmb3JlIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBwcm9jZXNzZWQgdGhpcyBjYWxsICovCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHNjcmF0Y2ggYnVmZmVyICovCisgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0YXJ0OworICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0yOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICB9CisgICAgcFN0YXJ0ID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMgbnVtYmVyIHJlYWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCAqLworCisKKyAgICAvKgorICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBkZWxheSBidWZmZXIgYXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSAmJgorICAgICAgICAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKnBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIHBEZXN0ICs9IE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVzdCBvZiB0aGUgc2FtcGxlcyBmb3IgdGhpcyBjYWxsIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID4gMCkKKyAgICB7CisgICAgICAgIENvcHlfMTYocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCArIE51bVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlcyB0byBvdXRwdXQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICAqIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50IGFuZCBpbnB1dCBwb2ludGVyCisgICAgICovCisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgICAgICAvKiBVcGRhdGUgdGhlIGNvdW50IG9mIHNhbXBsZXMgKi8KKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgID0gcFN0YXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworCisKKyAgICAvKgorICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCisgICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCAgICArPSBOdW1DaGFubmVscypTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlfMTYocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzKk51bVNhbXBsZXMpKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZGVsYXkgc2FtcGxlIGNvdW50CisgICAgICAgICAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAgICAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlIHBhaXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBTYW1wbGVzIHVzZWQgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgbW9kZSBpcyBzZWxlY3RlZCBieSB0aGUgdXNlciBjb2RlIGFuZCBkaXNhYmxlcyB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgd2l0aCB0aGUgKi8KKy8qICBleGNlcHRpb24gb2YgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSBwcm9jZXNzaW5nLiBUaGUgdXNlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSAgICAgICAqLworLyogIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgYW5kIGFsc28gdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gICovCisvKiAgICBwcm9jZXNzIGlzIGEgY29ycmVjdCBtdWx0aXBsZSBvZiBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFRvUHJvY2VzcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBkYXRhIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwUHJvY2Vzc2VkICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICovCisvKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRJbihMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAgICAgICAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIG9uIGZpcnN0IGNhbGwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKnBUb1Byb2Nlc3M7ICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgSS9PIHBvaW50ZXJzICovCisgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICAgPSAqcFByb2Nlc3NlZDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHByb2Nlc3MgcG9pbnRlcnMKKyAgICAgKi8KKyAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKKyAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck9wdGltaXNlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9wdGltaXNlZCBidWZmZXIgbWFuYWdlbWVudCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGRhdGEgaXMgb3V0cGxhY2UgcHJvY2Vzc2luZywgICAqLworLyogICAgdGhlIG91dHB1dCBkYXRhIGlzIDMyLWJpdCBhbGlnbmVkIGFuZCB0aGVyZSBhcmUgc3VmZmljaWVudCBzYW1wbGVzIHRvIGFsbG93IHNvbWUgICovCisvKiAgICBwcm9jZXNzaW5nIGRpcmVjdGx5IGluIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIHNhdmVzIG9uZSBkYXRhIGNvcHkgcGVyIHNhbXBsZSAgICAgKi8KKy8qICAgIGNvbXBhcmVkIHdpdGggdGhlIHVub3B0aW1zZWQgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcEluRGF0YSAgICAgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyT3B0aW1pc2VkSW4oTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAqKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXIgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIExWTV9JTlQxNiAgICAgICAgKnBEZXN0OworICAgIExWTV9JTlQxNiAgICAgICAgU2FtcGxlQ291bnQ7CisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICAgTnVtRnJhbWVzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBmb3IgdGhpcyBibG9jaworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOworICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgICAgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKKyAgICAgICAgcERlc3QgPSAqcFByb2Nlc3NlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc3RhcnQgb2YgdGhlIG91dHB1dCBidWZmZXIgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGFscmVhZHkgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBudW1iciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICB9CisgICAgICAgICpwVG9Qcm9jZXNzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBhZGRyZXNzIHRvIHN0YXJ0IHByb2Nlc3NpbmcgKi8KKyAgICAgICAgKnBQcm9jZXNzZWQgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAodW5wcm9jZXNzZWQpIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKnBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENhbGN1bGF0ZSBob3cgbWFueSBpbnB1dCBzYW1wbGVzIHRvIHByb2Nlc3MgYW5kIGNvcHkKKyAgICAgICAgICovCisgICAgICAgIE51bVNhbXBsZXMgICAgPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpOyAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKE51bVNhbXBsZXMgPj0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgTnVtRnJhbWVzICAgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgU2FtcGxlQ291bnQgICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICpwTnVtU2FtcGxlcyAgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gU2FtcGxlQ291bnQpOyAvKiBVcGRhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICBTYW1wbGVDb3VudCAgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7ICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb3B5IGZyb20gdGhlIGlucHV0ICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB1cGRhdGUgY291bnRzIGFuZCBwb2ludGVycworICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3QgKyAoMiAqIFNhbXBsZUNvdW50KTsgICAgICAvKiBVcGRhdGUgdGhlIG91dHB1dCBwb2ludGVyICovCisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgLyogU2FtcGxlcyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2Vjb25kIG9yIHN1YnNlcXVlbnQgY2FsbCBpbiBvcHRpbWlzZWQgbW9kZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA+PSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTW9yZSBzYW1wbGVzIGNhbiBiZSBwcm9jZXNzZWQgZGlyZWN0bHkgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFkZHJlc3MgdG8gc3RhcnQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQ7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgdGhhdCB3aWxsIGZpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKE51bVNhbXBsZXMgPj0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE51bUZyYW1lcyAgICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICAgICBTYW1wbGVDb3VudCAgID0gKExWTV9JTlQxNikoTnVtRnJhbWVzIDw8IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyAgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgaW5wdXQgYnVmZmVyIGFuZCB1cGRhdGUgY291bnRzIGFuZCBwb2ludGVycworICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOyAgIC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgLSBTYW1wbGVDb3VudCk7ICAgICAgICAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgcmVtYWluaW5nIHNhbXBsZXMgY2FuIG5vdCBiZSBwcm9jZXNzZWQgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7ICAgICAgICAgICAgICAgICAgICAvKiBJbmRpY2F0ZSB0aGlzIGlzIHRoZSBsYXN0IGJvY2sgdG8gcHJvY2VzcyAqLworICAgICAgICAgICAgKnBUb1Byb2Nlc3MgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGFkZHJlc3MgdG8gc3RhcnQgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgKnBQcm9jZXNzZWQgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBub3cgaW5wbGFjZSAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgICAgICAvKiBOdW1iZXIgbGVmdCB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIE51bUZyYW1lcyAgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgdXBkYXRlIGNvdW50cyBhbmQgcG9pbnRlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7IC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIG1hbmFnZXMgdGhlIGRhdGEgaW5wdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFjY2VwdHMgZGF0YSBpbiAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQ29waWVzIHRoZSBkYXRhIHRvIDMyLWJpdCBhbGlnbmVkIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBDb252ZXJ0cyBNb25vIGlucHV0cyB0byBNb25vLWluLVN0ZXJlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIEFjY2VwdHMgYW55IG51bWJlciBvZiBzYW1wbGVzIGFzIGlucHV0LCBleGNlcHQgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQnJlYWtzIHRoZSBpbnB1dCBzYW1wbGUgc3RyZWFtIGluIHRvIGJsb2NrcyBvZiB0aGUgY29uZmlndXJlZCBmcmFtZSBzaXplIG9yICovCisvKiAgICAgICAgICBtdWx0aXBsZXMgb2YgdGhlIGZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIExpbWl0cyB0aGUgcHJvY2Vzc2luZyBibG9jayBzaXplIHRvIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gV29ya3Mgd2l0aCBpbnBsYWNlIG9yIG91dHBsYWNlIHByb2Nlc3NpbmcgYXV0b21hdGljYWxseSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUbyBtYW5hZ2UgdGhlIGRhdGEgdGhlIGZ1bmN0aW9uIGhhcyBhIG51bWJlciBvZiBvcGVyYXRpbmcgc3RhdGVzOiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVENBTEwgICAgICAgIC0gVGhlIGZpcnN0IGNhbGwgZm9yIHRoaXMgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyAgICAgICAgICovCisvKiAgICAgICAgTFZNX01BWEJMT0NLQ0FMTCAgICAtIFRoZSBjdXJyZW50IGJsb2NrIGlzIHRoZSBtYXhpbXVtIHNpemUuIE9ubHkgdXNlZCBmb3IgdGhlICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBibG9ja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fTEFTVENBTEwgICAgICAgIC0gVGhlIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCBzYW1wbGVzICAgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIGlzIG5vdCBhICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBmdW5jdGlvbiBhbmQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkICAgICovCisvKiAgZnJvbSB0aGUgaW5wdXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgaXMgc3RvcmVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgICovCisvKiAgdGhlIGZpcnN0IHRpbWUuIFRoZSB2YWx1ZSBpcyBvdmVyd3JpdHRlbiBieSB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgdG8gYmUgcHJvY2Vzc2VkICAgKi8KKy8qICBpbiBlYWNoIGNhbGwgc28gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NpbmcgYmxvY2tzIGNhbiBiZSBjb250cm9sbGVkLiBUaGUgbnVtYmVyIG9mICAqLworLyogICAgc2FtcGxlcyBhY3R1YWxseSBwcm9jZXNzZWQgZm9yIGVhY2ggYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyBpcyBhbHdheXMgYSBtdWx0aXBsZSBvZiovCisvKiAgdGhlIGZyYW1lIHNpemUgc28gZm9yIGFueSBwYXJ0aWN1bGFyIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgdGhlIGFjdHVhbCBudW1iZXIgb2YgICAgKi8KKy8qICBwcm9jZXNzZWQgc2FtcGxlcyBtYXkgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcywgc29tZXRpbWUgaXQgd2lsbCBiZSAgICAqLworLyogIHNvbWV0aW1lcyBsZXNzLiBUaGUgYXZlcmFnZSBpcyB0aGUgc2FtZSBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgbmV2ZXIgbW9yZSB0aGFuIHRoZSAgICovCisvKiAgZnJhbWUgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IG91dHB1dC4gVGhpcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBtYW5hZ2VkIGlucHV0ICAgICAqLworLyogIHJvdXRpbmUgYW5kIGVuc3VyZXMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHNhbXBsZXMgYXJlIGFsd2F5cyBvdXRwdXQgdG8gdGhlIG91dHB1dCAgICovCisvKiAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBPdXREYXRhICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0lOVDE2ICAgICAgICpwRGVzdDsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKworICAgIC8qCisgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jaworICAgICAgKi8KKyAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8CisgICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCisgICAgeworICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KKyAgICB9CisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCisKKworICAgIC8qCisgICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bworICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcERlc3QgKz0gMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCArPSAyKk51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOyAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV8xNihwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7ICAgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCisgICAgICovCisgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgeworICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBibG9jayBzaXplICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdW5tYW5hZ2VkIGlucHV0IHJvdXRpbmUgYW5kIHVwZGF0ZXMgdGhlIG51bWJlciAgICovCisvKiAgICBvZiBzYW1wbGVzIGxlZnQgdG8gYmUgcHJvY2Vzc2VkICAgIGFuZCBhZGp1c3RzIHRoZSBidWZmZXIgcG9pbnRlcnMuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7CisKKworICAgIC8qCisgICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KKworICAgIC8qCisgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc2VkIGlucHV0IHJvdXRpbmUgYW5kIGNvcGllcyB0aGUgbGFzdCBmZXcgICovCisvKiAgcHJvY2Vzc2VkIGFuZCB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnVmZmVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZE91dChMVk1fSGFuZGxlX3QgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90ICAgICAgICAqcEJ1ZmZlciAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgYmxvY2sgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICAgKnBTcmMgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBpbnB1dCBkZWxheSBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MpKTsgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gMDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlsbCB0aGUgbGFzdCBlbXB0eSBzcGFjZXMgaW4gdGhlIG91dHB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpKTsgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpOworICAgICAgICAgICAgcFNyYyArPSAyICogcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzY3JhdGNoIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTYXZlIGFueSByZW1haW5pbmcgcHJvY2Vzc2VkIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGlmICgqcE51bVNhbXBsZXMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMioqcE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZGF0YSBvdXRwdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBPdXRwdXQgZGF0YSB0byAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIFJlYWRzIGRhdGEgZnJvbSAzMi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gUmVhZHMgZGF0YSBvbmx5IGluIGJsb2NrcyBvZiBmcmFtZSBzaXplIG9yIG11bHRpcGxlcyBvZiBmcmFtZSBzaXplICAgICAgICAgICovCisvKiAgICAgICAgLSBXcml0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgYXMgdGhlIExWTV9CdWZmZXJJbiBmdW5jdGlvbiByZWFkcyAgICAgICAgKi8KKy8qICAgICAgICAtIFdvcmtzIHdpdGggaW5wbGFjZSBvciBvdXRwbGFjZSBwcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVG8gbWFuYWdlIHRoZSBkYXRhIHRoZSBmdW5jdGlvbiBoYXMgYSBudW1iZXIgb2Ygb3BlcmF0aW5nIHN0YXRlczogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fRklSU1RDQUxMICAgICAgICAtIFRoZSBmaXJzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSBpcyBub3QgYSAgICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgaEluc3RhbmNlICAgICAgICAtIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwT3V0RGF0YSAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3OGRiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWTV9DT0VGRlNfSF9fCisjZGVmaW5lIF9fTFZNX0NPRUZGU19IX18KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhpZ2ggUGFzcyBTaGVsdmluZyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjQyOTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY4NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNDQ5MiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE0MjkyNSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM1ODU4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTE4OTUzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk4MzAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wOTIwNTUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NjcyOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA2MTg3NiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE2OTA3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI4MDEzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42NTA3NzAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1MDAyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMzExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDUxOTkgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDI2MzY4ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNjY1NjUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDUwMzQwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTA1MzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA3NzIzOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzY3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDE3NDM1ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM1MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMDc0MTcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2NjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0NzYxNSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NjI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTQxMjc5ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1Nzc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODE0NzcgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjk0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA4OTg0OSAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjYwMzUyICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2NDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMTEyMTUgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4MTcxOCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NDMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTM1MTg3ICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMDU2OTAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworCisKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjQwMDBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMTA2MjggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNzU3OCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA4NTgwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzc3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTQyNDA2ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDU3OTQzICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Njg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzAyNjMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjY2ODcgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk3MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYwMTUxOSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDgzODMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzNjU4OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDc3MzMgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3NTkzOCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE1MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDYwNTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE4MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM2MDg5OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIzMjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzA4NzggKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4NTcyNyAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMyMzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wOTg3MzYgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMzU4NCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MjYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI5OTkyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NTc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NDQ4NDEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTQwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE2NTA2MiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc5OTExICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDQ0MTEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxOTI2MCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC00MDgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI0NTc2ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODIzNzQgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDg5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0OTQwNCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzA3MjAyICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgLTU4MDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNzcyNjEgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjMzNTA1OSAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUyNTY3NyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAzMDIyNyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk1OTMgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTIxMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNjQxNDIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTU4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTk3NjQ2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTAyMTk2ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0MDM0MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NDg5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNTUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42ODgyNTAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYzMTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xOTI3OTkgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzQyMDAyICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04MDc5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjQ2NTUxICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQwMjEwOSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTA0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE1Mzc5NSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Mjg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MzYwMjQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODc3MTEgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTUzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc0MDc4ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03Mzk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI1NzY0ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MTY3NzQgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3OTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjg0NjEgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg1MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU2NDY4MSAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjM2OCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDI2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE4NDMzICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMTI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzcwMTIwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDAxNzggKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwNjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTU3MjYgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3NDA5MyAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODE4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0OTY0MiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyMTQ3ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDI3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjg3Njk1ICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0NDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMjI5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NTI5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzM2MzMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYxMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODY2MzQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDMxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjIwMDE2ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03NjM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMzMDE3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3MjA1OSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTM0MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI4NTA2MCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOTM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MzA0NTIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTEyNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDM0NTMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjA4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzk1OTcwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzNDAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4OTcxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQzNTc3NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzkyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0MTgxNSAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NjM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NzcxMTMgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkyNzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yODMxNTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzE1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTIzNDk2ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEwNzk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzI5NTM3ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4ODU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzU1MzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI1MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zODE1ODAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzMzkzMiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDQxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQzOTk3MyAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjkyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjk5NDUwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTE2NTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTA1NDkxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNjk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODczOTkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk1MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTAxODkgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzE3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQyODczOCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDg2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMzMTUyOCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC03MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTU2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc1MTIxICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzc3OTEyICovCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcxNzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMzc3NyAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTYwNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE3MTA4MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzY3NzkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTQwODUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjI1MDI5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NTk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjYyMzM1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIyNTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3OTE2NyAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDM3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjQ3MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MjQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43Mzk5MTAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNzcyMTUgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjQ3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODA4MDY1ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE0NTk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ1MzcwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ1MjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MzMxOCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODU3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2MTU0MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OTM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODYzMjEgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDQ1NDMgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM0NTcxICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgLTExNTYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzUyNzkzICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODg3MDggKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTMzMzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MDY5MzAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0OTQ1MiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTMyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQ2NzY3NCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzUxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzE3NjA3ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTE3NTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTM1ODI5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTc5ODIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTAwNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDY4NzcgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAtODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MDk4NCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTQ2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0OTg4MCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIC04NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDg5MjM0ICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTEzMDQ2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzk4MTMwICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgLTg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjU2NGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpAQCAtMCwwICsxLDEwMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgV2hlbiBoSW5zdGFuY2UsIHBQYXJhbXMgb3IgYW55IGNvbnRyb2wgcG9pbnRlcnMgYXJlIE5VTEwgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICBXaGVuIGFueSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworCisgICAgaWYgKChwUGFyYW1zID09IExWTV9OVUxMKSB8fCAoaEluc3RhbmNlID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcyA9ICpwUGFyYW1zOworCisgICAgaWYoCisgICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKSkgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAorICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwUGFyYW1zLT5DU19FZmZlY3RMZXZlbCA8IExWTV9DU19NSU5fRUZGRUNUX0xFVkVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBOLUJhbmQgRXF1YWxpemVyCisgICAgICovCisgICAgaWYocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qIERlZmluaXRpb24gcG9pbnRlciAqLworICAgIGlmICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpICYmCisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV0gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmczsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgICAgICAgICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09GRikgJiYgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8CisgICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKyAgICAvKiBCYW5kIHBhcmFtZXRlcnMqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5IDwgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSkgIHx8CisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA+IExWTV9FUU5CX01BWF9CQU5EX0ZSRVEpKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSAgfHwKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgID4gTFZNX0VRTkJfTUFYX0JBTkRfR0FJTikpIHx8CisgICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSAgICAgfHwKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID4gTFZNX0VRTkJfTUFYX1FGQUNUT1IpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoKChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PRkYpICYmIChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PTikpICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCApKXx8CisgICAgICAgICgocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzU1SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNjZIeikgICAgICAgICAgICYmCisgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNzhIeikgJiYgKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV85MEh6KSkgICAgICAgICAgIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT0ZGKSAmJiAocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT04pKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA8IExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgKSB8fCAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiBMVk1fVkNfTUFYX0VGRkVDVExFVkVMICkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisgICAgaWYoKHBQYXJhbXMtPlZDX0JhbGFuY2UgPCBMVk1fVkNfQkFMQU5DRV9NSU4gKSB8fCAocFBhcmFtcy0+VkNfQmFsYW5jZSA+IExWTV9WQ19CQUxBTkNFX01BWCApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQU0EgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKCAocFBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPiBMVlBTQV9TUEVFRF9ISUdIKSB8fAorICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisKKyAgICAvKgorICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKKyAgICAqCisgICAgKiBQcm90ZWN0IHRoZSBjb3B5IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBmcm9tIGludGVycnVwdHMgdG8gYXZvaWQgcG9zc2libGUgcHJvYmxlbXMKKyAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCisgICAgKiB0aGFuIG9uY2UgYmVmb3JlIGEgY2FsbCB0byB0aGUgcHJvY2VzcyBmdW5jdGlvbi4gSWYgdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW50ZXJydXB0cworICAgICogdGhlIGNvcHkgdG8gTmV3UGFyYW1zIHRoZW4gb25lIGZyYW1lIG1heSBoYXZlIG1peGVkIHBhcmFtZXRlcnMsIHNvbWUgb2xkIGFuZCBzb21lIG5ldy4KKyAgICAqLworICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMaWZlVmliZXMgbW9kdWxlIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICB3aGVuIGFueSBvZiBoSW5zdGFuY2Ugb3IgcFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgcG9pbnRlcgorICAgICAqLworICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5OZXdQYXJhbXM7CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kcyAhPSAwKQorICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzW2ldID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmc1tpXTsKKyAgICAgICAgfQorICAgICAgICBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnM7CisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRUcmVibGVCb29zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEVuYWJsZSB0aGUgdHJlYmxlIGJvb3N0IHdoZW4gdGhlIHNldHRpbmdzIGFyZSBhcHByb3ByaWF0ZSwgaS5lLiBub24temVybyBnYWluICAgICAgICovCisvKiAgYW5kIHRoZSBzYW1wbGUgcmF0ZSBpcyBoaWdoIGVub3VnaCBmb3IgdGhlIGVmZmVjdCB0byBiZSBoZWFyZC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZNX1NldFRyZWJsZUJvb3N0KExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgIExWTV9UcmVibGVCb29zdENvZWZzW107CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsID0gMDsKKworICAgIC8qCisgICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYgKChwUGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgPj0gVHJlYmxlQm9vc3RNaW5SYXRlKSAmJgorICAgICAgICAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlRFX0VmZmVjdExldmVsID4gMCkpCisgICAgeworICAgICAgICBpZigocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgorICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUyl8fAorICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9FWF9IRUFEUEhPTkVTKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSBwUGFyYW1zLT5URV9FZmZlY3RMZXZlbDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOworICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBMb2FkQ29uc3RfMTYoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsICAvKiBEZXN0aW5hdGlvbi5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzYWJsZSB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVk1fU2V0Vm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29udmVydHMgdGhlIGlucHV0IHZvbHVtZSBkZW1hbmQgZnJvbSBkQnMgdG8gbGluZWFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLworICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KKworICAgIC8qCisgICAgICogTGltaXQgdGhlIGdhaW4gdG8gdGhlIG1heGltdW0gYWxsb3dlZAorICAgICAqLworICAgICBpZiAgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gMCkKKyAgICAgeworICAgICAgICAgVm9sdW1lID0gMDsKKyAgICAgfQorICAgICBlbHNlCisgICAgIHsKKyAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZDX0VmZmVjdExldmVsOworICAgICB9CisKKyAgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLworICAgICBpZihWb2x1bWUgPiAtNjApICAvKiBMaW1pdCB2b2x1bWUgbG9zcyB0byBQU0EgTGltaXRzKi8KKyAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNikoLVZvbHVtZSk7LyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KKyAgICAgZWxzZQorICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldD0oTFZNX0lOVDE2KTYwOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lID0gMDsKKworICAgIC8qCisgICAgICogU2V0IHZvbHVtZSBjb250cm9sIGFuZCBBVkwgdm9sdW1lcyBhY2NvcmRpbmcgdG8gaGVhZHJvb20gYW5kIHZvbHVtZSB1c2VyIHNldHRpbmcKKyAgICAgKi8KKyAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQorICAgIHsKKyAgICAgICAgLyogRGVmYXVsdCBTaXR1YXRpb24gd2l0aCBubyBBVkwgYW5kIG5vIFJTICovCisgICAgICAgIGlmKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikKKyAgICAgICAgeworICAgICAgICAgICAgaWYoVm9sdW1lID4gLXBJbnN0YW5jZS0+SGVhZHJvb20pCisgICAgICAgICAgICAgICAgVm9sdW1lID0gKExWTV9JTlQxNiktcEluc3RhbmNlLT5IZWFkcm9vbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQWN0aXZhdGUgdm9sdW1lIGNvbnRyb2wgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgICA9IExWTV9UUlVFOworICAgIGlmIChWb2x1bWUgIT0gMCkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSBWb2x1bWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBnYWluIGFuZCBzaGlmdHMKKyAgICAgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSgoLVZvbHVtZSkgJSA2KTsgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKGRCU2hpZnRzID09IDApCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9JTlQzMilMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKT4+ZEJTaGlmdHMpKTsKKyAgICB9CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOworICAgIGlmKHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZNX1NldEhlYWRyb29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZpbmQgc3VpdGFibGUgaGVhZHJvb20gYmFzZWQgb24gRVEgc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0SGVhZHJvb20oTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSU5UMTYgICBpaSwgamo7CisgICAgTFZNX0lOVDE2ICAgSGVhZHJvb20gPSAwOworICAgIExWTV9JTlQxNiAgIE1heEdhaW4gPSAwOworCisKKyAgICBpZiAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pICYmIChwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPT0gTFZNX0hFQURST09NX09OKSkKKyAgICB7CisgICAgICAgIC8qIEZpbmQgdHlwaWNhbCBoZWFkcm9vbSB2YWx1ZSAqLworICAgICAgICBmb3IoamogPSAwOyBqaiA8IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1heEdhaW4gPSAwOworICAgICAgICAgICAgZm9yKCBpaSA9IDA7IGlpIDwgcFBhcmFtcy0+RVFOQl9OQmFuZHM7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPj0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9Mb3cpICYmCisgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPD0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5MaW1pdF9IaWdoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluID4gTWF4R2FpbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTWF4R2FpbiA9IHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZigoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KSA+IEhlYWRyb29tKXsKKyAgICAgICAgICAgICAgICBIZWFkcm9vbSA9IChMVk1fSU5UMTYpKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXR1cmF0ZSAqLworICAgICAgICBpZihIZWFkcm9vbSA8IDApCisgICAgICAgICAgICBIZWFkcm9vbSA9IDA7CisgICAgfQorICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAoTFZNX1VJTlQxNilIZWFkcm9vbSA7CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BcHBseU5ld1NldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGxpZXMgY2hhbmdlcyB0byBwYXJhbWV0cmVzLiBUaGlzIGZ1bmN0aW9uIG1ha2VzIG5vIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgICAgICAgICovCisvKiAgZWFjaCBtb2R1bGUgbmVlZHMgZm9yIGluaXRpYWxpc2F0aW9uIGFuZCBoZW5jZSBwYXNzZXMgYWxsIHBhcmFtZXRlcnMgdG8gYWxsIHRoZSAgICAgKi8KKy8qICB0aGUgbW9kdWxlcyBpbiB0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCAgIGhJbnN0YW5jZSkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgIExvY2FsUGFyYW1zOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgQ291bnQgPSA1OworCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGJ1dCBtYWtlIHN1cmUgdGhleSBkaWRuJ3QgY2hhbmdlIHdoaWxlIGNvcHlpbmcKKyAgICAgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICAgICAgTG9jYWxQYXJhbXMgPSBwSW5zdGFuY2UtPk5ld1BhcmFtczsKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXM7CisgICAgICAgIENvdW50LS07CisgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAgICAgIChDb3VudCA+IDApKTsKKworICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLworICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCisgICAgeworICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMocEluc3RhbmNlKTsKKyAgICAgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAhPSBMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IExvY2FsUGFyYW1zLlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoZWFkcm9vbSBpZiByZXF1aXJlZAorICAgICAqLworICAgICAgICBMVk1fU2V0SGVhZHJvb20ocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgdm9sdW1lIGlmIHJlcXVpcmVkCisgICAgICovCisgICAgeworICAgICAgICBMVk1fU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisgICAgLyogQXBwbHkgYmFsYW5jZSBjaGFuZ2VzKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5WQ19CYWxhbmNlICE9IExvY2FsUGFyYW1zLlZDX0JhbGFuY2UpCisgICAgeworICAgICAgICAvKiBDb25maWd1cmUgTWl4ZXIgbW9kdWxlIGZvciBncmFkdWFsIGNoYW5nZXMgdG8gdm9sdW1lKi8KKyAgICAgICAgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisgICAgICAgICAgICAvKiBEcm9wIGluIHJpZ2h0IGNoYW5uZWwgdm9sdW1lKi8KKyAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KShMb2NhbFBhcmFtcy5WQ19CYWxhbmNlPDw0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+MCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKKyAgICAgICAgICAgIC8qIERyb3AgaW4gbGVmdCBjaGFubmVsIHZvbHVtZSovCisgICAgICAgICAgICBUYXJnZXQgPSBkQl90b19MaW4zMigoTFZNX0lOVDE2KSgoLUxvY2FsUGFyYW1zLlZDX0JhbGFuY2UpPDw0KSk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7CisgICAgICAgICAgICAvKiBObyBkcm9wKi8KKyAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBiYXNzIGVuaGFuY2VtZW50CisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gICAgICAgREJFX1N0YXR1czsKKyAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAgICAgIERCRV9QYXJhbXM7CisgICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgICAgICAqaERCRUluc3RhbmNlID0gcEluc3RhbmNlLT5oREJFSW5zdGFuY2U7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gKExWREJFX01vZGVfZW4pTG9jYWxQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZTsKKyAgICAgICAgfQorICAgICAgICBEQkVfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZEQkVfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgREJFX1BhcmFtcy5FZmZlY3RMZXZlbCAgICAgID0gTG9jYWxQYXJhbXMuQkVfRWZmZWN0TGV2ZWw7CisgICAgICAgIERCRV9QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICA9IChMVkRCRV9DZW50cmVGcmVxX2VuKUxvY2FsUGFyYW1zLkJFX0NlbnRyZUZyZXE7CisgICAgICAgIERCRV9QYXJhbXMuSFBGU2VsZWN0ICAgICAgICA9IChMVkRCRV9GaWx0ZXJTZWxlY3RfZW4pTG9jYWxQYXJhbXMuQkVfSFBGOworICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIERCRV9TdGF0dXMgPSBMVkRCRV9Db250cm9sKGhEQkVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9QYXJhbXMpOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKERCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKURCRV9TdGF0dXMpOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5EQkVfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIE4tQmFuZCBFcXVhbGlzZXIKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gICAgICBFUU5CX1N0YXR1czsKKyAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgIEVRTkJfUGFyYW1zOworICAgICAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICAgKmhFUU5CSW5zdGFuY2UgPSBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2U7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworCisgICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSAoTFZFUU5CX01vZGVfZW4pTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgRVFOQl9QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICA9IChMVkVRTkJfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgRVFOQl9QYXJhbXMuTkJhbmRzICAgICAgICAgICA9IExvY2FsUGFyYW1zLkVRTkJfTkJhbmRzOworICAgICAgICBFUU5CX1BhcmFtcy5wQmFuZERlZmluaXRpb24gID0gKExWRVFOQl9CYW5kRGVmX3QgKilMb2NhbFBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAgICAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgorICAgICAgICAgICAgKExvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgRVFOQl9TdGF0dXMgPSBMVkVRTkJfQ29udHJvbChoRVFOQkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX1BhcmFtcyk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgY29uY2VydCBzb3VuZAorICAgICAqLworICAgIHsKKyAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIENTX1N0YXR1czsKKyAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAgICAgICAgIENTX1BhcmFtczsKKyAgICAgICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgICAgICpoQ1NJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aENTSW5zdGFuY2U7CisgICAgICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBDb21wcmVzc29yTW9kZT1MVk1fTU9ERV9PTjsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBpZigoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19FWF9IRUFEUEhPTkVTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLworICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19NT05PSU5TVEVSRU87ICAgICAgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KKyAgICAgICAgfQorICAgICAgICBDU19QYXJhbXMuU2FtcGxlUmF0ZSAgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOworICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOworICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCisgICAgICAgICAqLworICAgICAgICBpZiAoKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmCisgICAgICAgICAgICAoTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBDU19QYXJhbXMuQ29tcHJlc3Nvck1vZGU9Q29tcHJlc3Nvck1vZGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgQ1NfU3RhdHVzID0gTFZDU19Db250cm9sKGhDU0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX1BhcmFtcyk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUNTX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBQb3dlciBTcGVjdHJ1bSBBbmFseXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIFBTQV9TdGF0dXM7CisgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICBQU0FfUGFyYW1zOworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKmhQU0FJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgUFNBX1BhcmFtcy5GcyA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CisgICAgICAgIFBTQV9QYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IChMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuKUxvY2FsUGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKKyAgICAgICAgICovCisgICAgICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Db250cm9sKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAmUFNBX1BhcmFtcyk7CisKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IG5ldyBzZXR0aW5ncworICAgICAgICAgICAgICovCisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoKExWUFNBX0luc3RhbmNlUHJfdCopaFBTQUluc3RhbmNlKTsKKyAgICAgICAgICAgIGlmKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMgYW5kIGNsZWFyIHRoZSBmbGFnCisgICAgICovCisgICAgcEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICBMb2NhbFBhcmFtczsKKworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRIZWFkcm9vbVBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIGF1dG9tYXRpdWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEhlYWRyb29tUGFyYW1zICAgICAgICAgUG9pbnRlciB0byBoZWFkcm9vbSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1N1Y2Nlc3MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgICAqcEhlYWRyb29tUGFyYW1zKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpLCBOQmFuZHM7CisKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYgKChwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzICE9IDApICYmIChwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qIENvbnNpZGVyIG9ubHkgdGhlIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTIGZpcnN0IGJhbmRzKi8KKyAgICBpZiAocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA+IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTKQorICAgIHsKKyAgICAgICAgTkJhbmRzID0gTFZNX0hFQURST09NX01BWF9OQkFORFM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE5CYW5kcyA9IHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHM7CisgICAgfQorICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSBOQmFuZHM7CisKKyAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgTkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnNbaWldID0gcEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uW2lpXTsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKKyAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBwSGVhZHJvb21QYXJhbXMtPkhlYWRyb29tX09wZXJhdGluZ01vZGU7CisgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9UUlVFOworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBhdXRvbWF0aWMgaGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAob3V0cHV0KSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBoSW5zdGFuY2Ugb3IgcEhlYWRyb29tUGFyYW1zIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgKnBIZWFkcm9vbVBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpaTsKKworICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSGVhZHJvb21QYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPSBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzOworCisKKyAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzW2lpXSA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzW2lpXTsKKyAgICB9CisKKworICAgIHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzOworICAgIHBIZWFkcm9vbVBhcmFtcy0+SGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZTsKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BbGdvQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBCdW5kbGVIYW5kbGUgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcERhdGEgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBjYWxsYmFja0lkICAgICAgICAgICAgICBJRCBvZiB0aGUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworCisgICAgKHZvaWQpIHBEYXRhOworCisgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweEZGMDApeworICAgICAgICBjYXNlIEFMR09SSVRITV9DU19JRDoKKyAgICAgICAgICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHgwMEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTFZDU19FVkVOVF9BTEdPRkY6CisgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMR09SSVRITV9FUU5CX0lEOgorICAgICAgICAgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweDAwRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRVZFTlRfQUxHT0ZGOgorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1ZDQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlIFZvbHVtZSBjb250cm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEJ1bmRsZUhhbmRsZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwR2VuZXJhbFB1cnBvc2UgICAgICAgICBQb2ludGVyIHRvIHRoZSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrUGFyYW0gICAgICAgICAgIElEIG9mIHRoZSBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyICAgIExWTV9WQ0NhbGxCYWNrKHZvaWQqICAgcEJ1bmRsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgIENhbGxCYWNrUGFyYW0pCit7CisgICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKXBCdW5kbGVIYW5kbGU7CisgICAgTFZNX0lOVDMyICAgIFRhcmdldDsKKworICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CisgICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CisKKyAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKKyAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLworICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKKworICAgIGlmKFRhcmdldCA9PSAweDdGRkYpCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDM3MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtMCwwICsxLDk5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLworLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMzIgICAgICAgICAgQWxnU2NyYXRjaFNpemU7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCisgICAgeworICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KKyAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICovCisgICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKKyAgICB9CisgICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLworCisgICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKKyAgICB7CisgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKKyAgICB9CisKKyAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCisgICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qCisgICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCisgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBhbGdvcml0aG0gYW5kIGJ1bmRsZSBzY3JhdGNoIHJlcXVpcmVtZW50cworICAgICAqLworICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgICAgICAgLyogU2NyYXRjaCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0NvZWZzX3QpKTsKKworICAgIC8qCisgICAgICogTi1CYW5kIEVxdWFsaXplciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBMb2NhbCBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCAgICAgIC8qIFVzZXIgc3RvcmFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKworICAgIC8qCisgICAgICogQ29uY2VydCBTb3VuZCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsKKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgICA9IEludGVybmFsQmxvY2tTaXplOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZDU19NZW1vcnkoTFZNX05VTEwsCisgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RydWN0dXJlcworICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgaWYgKENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICBEQkVfTWVtVGFiOworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCisKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworICAgICAgICBpZiAoREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7CisKKyAgICB9CisKKworICAgIC8qCisgICAgICogTi1CYW5kIGVxdWFsaXNlciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgIC8qIEZvciBOLUJhbmQgRXF1YWxpc2VyICovCisgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgIEVRTkJfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZFUU5CX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7CisgICAgICAgIGlmIChFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCisgICAgICovCisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisKKworICAgIC8qCisgICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOworICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7CisgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7CisgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOworCisgICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisKKyAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7CisKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCisgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisKKyAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisKKyAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQorICAgIHsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7CisgICAgfQorCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKKyAgICB7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOworICAgIH0KKworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKKyAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCisgICAgeworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcGhJbnN0YW5jZSwgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGFyZSBOVUxMKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICpwSW5zdFBhcmFtcykKK3sKKworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIFN0YXR1cyA9IExWTV9TVUNDRVNTOworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplOworCisKKyAgICAvKgorICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KKyAgICAgKi8KKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCisgICAgICovCisgICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBpZiAoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUgIT0gMCkgJiYKKyAgICAgICAgICAgIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9OVUxMQUREUkVTUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYoIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fTUFOQUdFRF9CVUZGRVJTKSAmJiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKSApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICAqLworICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAqLworICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOworICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSwgcGFyYW1ldGVycyBhbmQgY2FwYWJpbGl0aWVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICA9ICpwTWVtb3J5VGFibGU7CisgICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zICAgICA9ICpwSW5zdFBhcmFtczsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhbmQgaW5pdGlhbHNlIHRoZSBidWZmZXIgbWFuYWdlbWVudAorICAgICAqLworICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplKSAmIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qIE1heGltdW0gSW50ZXJuYWwgQmxhY2sgU2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKi8KKyAgICBpZihJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpCisgICAgeworICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkU7CisgICAgfQorICAgIHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX0lOVDE2KUludGVybmFsQmxvY2tTaXplOworCisKKyAgICAvKgorICAgICAqIENvbW1vbiBzZXR0aW5ncyBmb3IgbWFuYWdlZCBhbmQgdW5tYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlZCBidWZmZXJzIHJlcXVpcmVkCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgLyogU2NyYXRjaCAxIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOworCisgICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheVNhbXBsZXMgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOyAvKiBTZXQgdGhlIG51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7ICAgICAgICAgICAgIC8qIFNldCB0aGUgc3RhdGUgcmVhZHkgZm9yIHRoZSBmaXJzdCBjYWxsICovCisgICAgfQorCisKKyAgICAvKgorICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworCisgICAgLyoKKyAgICAgKiBTZXQgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhbGxCYWNrID0gTFZNX0FsZ29DYWxsQmFjazsKKworCisgICAgLyoKKyAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgorICAgICAqLworICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKworCisgICAgLyoKKyAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBURV9UYXBzICA9IChMVk1fVEVfRGF0YV90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9EYXRhX3QpKTsKKworICAgIHBJbnN0YW5jZS0+cFRFX1N0YXRlID0gKExWTV9URV9Db2Vmc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkpOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlRFX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSB2b2x1bWUgY29udHJvbCBhbmQgaW5pdGlhbGlzZSBDdXJyZW50IHRvIFRhcmdldAorICAgICAqLworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisKKyAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLDApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyAgICB9CisKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworCisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0FWTEZpeGVkVm9sdW1lICAgICAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7CisKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIC8qCisgICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworCisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgeworICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgIExWQ1NfU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgPSAxMDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWQ1NfU3RhdHVzID0gTFZDU19NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX0NhcGFiaWxpdGllcyk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICZwSW5zdGFuY2UtPkNTX0luc3RhbmNlOworICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAgICAgKi8KKyAgICAgICAgaENTSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfSW5pdCgmaENTSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZDU19TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhDU0luc3RhbmNlID0gaENTSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgREJFX01lbVRhYjsgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICBEQkVfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuICAgTFZEQkVfU3RhdHVzOyAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxICAgID0gTFZNX0JFX0NFTlRSRV81NUh6OworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgID0gMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfSFBGICAgICAgICAgICA9IExWTV9CRV9IUEZfT0ZGOworCisgICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX01lbW9yeShMVk1fTlVMTCwgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyAgICAgICAgPSAmcEluc3RhbmNlLT5EQkVfSW5zdGFuY2U7CisgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQorICAgICAgICAgKi8KKyAgICAgICAgaERCRUluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfU3RhdHVzID0gTFZEQkVfSW5pdCgmaERCRUluc3RhbmNlLCAgICAgICAgICAgIC8qIEluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7CisgICAgICAgIGlmIChMVkRCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7CisgICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICB9CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgRVFOQl9DYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgIExWRVFOQl9TdGF0dXM7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgID0gTFZNX0VRTkJfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gTFZNX05VTEw7CisgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKKyAgICAgICAgICovCisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLkNhbGxCYWNrICAgICAgICA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSAgPSAodm9pZCopcEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7CisgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAgICAgICAgICovCisgICAgICAgIGhFUU5CSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfSW5pdCgmaEVRTkJJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBpZiAoTFZFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCisgICAgICovCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSkpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisKKyAgICAgICAgLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzIGluaXRpYWxpc2F0aW9uICovCisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfSGlnaCAgICAgICAgID0gNDk5OTsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCAgICAgICAgID0gMjQwMDA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisKKyAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9MDsKKyAgICB9CisKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQorICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOworICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90IEZpbHRlcnNQYXJhbXNbOV07CisKKyAgICAgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gKExWTV9VSU5UMTYpIDUwMDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuTWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAyMDQ4OworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSAmRmlsdGVyc1BhcmFtc1swXTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5DZW50ZXJGcmVxdWVuY3kgICAgPSAoTFZNX1VJTlQxNikgMTAwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAxMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KKyAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisKKyAgICAgICAgICAgIC8qIEZhc3QgRGF0YSAqLworICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisKKworICAgICAgICAgICAgLyogRmFzdCBDb2VmICovCisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9JTlQxNikpOworCisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7CisKKworICAgICAgICAgICAgLypJbml0aWFsaXNlIFBTQSBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuRnMgPSBMVk1fRlNfNDgwMDA7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgID0gTFZQU0FfU1BFRURfTUVESVVNOworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0luaXQgKCZoUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9NZW1UYWIpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IGhQU0FJbnN0YW5jZTsgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlID0gTFZNX05VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSAgID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgPSBMVk1fUFNBX09GRjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIGluaXRpYWwgcGFyYW1ldGVycyB0byB0aGUgbmV3IHBhcmFtZXRlcnMgZm9yIGNvcnJlY3QgcmVhZGJhY2sgb2YKKyAgICAgKiB0aGUgc2V0dGluZ3MuCisgICAgICovCisgICAgcEluc3RhbmNlLT5OZXdQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKKworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgY29uZmlndXJhdGlvbiBudW1iZXIKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgPSAweDAwMDAwMDAwOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fQ1NfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX0VRTkJfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX0RCRV9NQVNLOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fVkNfTUFTSzsKKyAgICBwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgKz0gTFZNX1BTQV9NQVNLOworCisgICAgaWYoKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgICYgTFZNX0NTX01BU0spIT0wKSAgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fREJFX01BU0spIT0wKSB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9FUU5CX01BU0spIT0wKXx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1RFX01BU0spIT0wKSAgfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVkNfTUFTSykhPTApKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgICAgPSAxOworICAgIH0KKworICAgIHJldHVybihTdGF0dXMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcm5hbCBhdWRpbyBidWZmZXJzIG9mIHRoZSBidW5kbGUuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpCit7CisgICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsgLyogUG9pbnRlciB0byBJbnN0YW5jZSAqLworCisKKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwpeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qIFNhdmUgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KKyAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKKworICAgIC8qICBSZXRyaWV2ZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBtZW10YWIgKi8KKyAgICBMVk1fR2V0TWVtb3J5VGFibGUoaEluc3RhbmNlLCAmTWVtVGFiLCAgTFZNX05VTEwpOworCisgICAgLyogIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBJbnN0UGFyYW1zID0gcEluc3RhbmNlLT5JbnN0UGFyYW1zOworCisgICAgLyogIENhbGwgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSB0byByZS1pbml0aWFsaXNlIHRoZSBidW5kbGUgKi8KKyAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoICZoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSwgJlBhcmFtcyk7CisKKyAgICAvKiBEQyByZW1vdmFsIGZpbHRlciAqLworICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKKworCisgICAgcmV0dXJuIExWTV9TVUNDRVNTOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxY2Y0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgY29uY2VydCBzb3VuZCBidW5kbGUgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZNX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTS5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGlmZVZpYmVzICovCisjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWZlVmliZXMgY29tbW9uICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ19NaXhlci5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgbGlicmFyeSAqLworI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uY2VydCBTb3VuZCAqLworI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50ICovCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyICovCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBQYXJhbWV0cmljIFNwZWN0cnVtIEFuYWx5emVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgTFZNX0lOVkFMSUQgICAgICAgICAgICAgICAgICAgICAweEZGRkYgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZNX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgICAgLyogMzItYml0IGZvciBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIExWTV9GSVJTVENBTEwgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZpcnN0IGNhbGwgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fTUFYQkxPQ0tDQUxMICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgY2FsbHMgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fTEFTVENBTEwgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBMYXN0IGNhbGwgdG8gdGhlIGJ1ZmZlciAqLworI2RlZmluZSBMVk1fRklSU1RMQVNUQ0FMTCAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaW5nbGUgY2FsbCBmb3Igc21hbGwgbnVtYmVyIG9mIHNhbXBsZXMgKi8KKworLyogQmxvY2sgU2l6ZSAqLworI2RlZmluZSBMVk1fTUlOX01BWEJMT0NLU0laRSAgICAgICAgICAgIDE2ICAgICAgICAvKiBNaW5pbXVtIE1heEJsb2NrU2l6ZSBMaW1pdCovCisjZGVmaW5lIExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgICAgODE5MSAgICAgIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBNYW5hZ2VkIEJ1ZmZlciBNb2RlKi8KKyNkZWZpbmUgTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICA0MDk2ICAgICAgLyogTWF4aW11bSBNYXhCbG9ja1N6aWUgTGltaXQgZm9yIFVubWFuYWdlZCBCdWZmZXIgTW9kZSAqLworCisjZGVmaW5lIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgODEyOCAgICAgIC8qIE1heGltdW0gbXVsdGlwbGUgb2YgNjQgIGJlbG93IDgxOTEqLworCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgMTYgICAgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCAgICAgICAgIDQgICAgICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgICAgICAgICAgMHhGRkYwICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCisKKyNkZWZpbmUgTFZNX1BTQV9EWU5BTUlDUkFOR0UgICAgICAgICAgICA2MCAgICAgICAgLyogU3BlY3RyYWwgRHluYW1pYyByYW5nZTogdXNlZCBmb3Igb2Zmc2V0aW5nIG91dHB1dCovCisjZGVmaW5lIExWTV9QU0FfQkFSSEVJR0hUICAgICAgICAgICAgICAgMTI3ICAgICAgIC8qIFNwZWN0cmFsIEJhciBIZWlnaHQqLworCisjZGVmaW5lIExWTV9URV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVEUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9URV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qVEUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgLTk2ICAgICAgIC8qVkMgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9WQ19NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qVkMgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qQkUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworCisjZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0ZSRVEgICAgICAgICAgMjAgICAgICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSAgICAgICAgICAyNDAwMCAgICAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9HQUlOICAgICAgICAgIC0xNSAgICAgICAvKkVRTkIgTWluaW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9CQU5EX0dBSU4gICAgICAgICAgMTUgICAgICAgIC8qRVFOQiBNYXhpbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX1FGQUNUT1IgICAgICAgICAgICAyNSAgICAgICAgLypFUU5CIE1pbmltdW0gUSBGYWN0b3IqLworI2RlZmluZSBMVk1fRVFOQl9NQVhfUUZBQ1RPUiAgICAgICAgICAgIDEyMDAgICAgICAvKkVRTkIgTWF4aW11bSBRIEZhY3RvciovCisjZGVmaW5lIExWTV9FUU5CX01JTl9MUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNaW5pbXVtIExvdyBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fSFBGX0ZSRVEgICAgICAgICAgIDIwICAgICAgICAvKkVRTkIgTWluaW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01BWF9IUEZfRlJFUSAgICAgICAgICAgMTAwMCAgICAgIC8qRVFOQiBNYXhpbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKworI2RlZmluZSBMVk1fQ1NfTUlOX0VGRkVDVF9MRVZFTCAgICAgICAgIDAgICAgICAgICAvKkNTIE1pbmltdW0gRWZmZWN0IExldmVsKi8KKyNkZWZpbmUgTFZNX0NTX01BWF9SRVZFUkJfTEVWRUwgICAgICAgICAxMDAgICAgICAgLypDUyBNYXhpbXVtIFJldmVyYiBMZXZlbCovCisjZGVmaW5lIExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMIDEwMCAgICAgIC8qVml0cnVhbGl6ZXIgTWF4aW11bSBSZXZlcmIgTGV2ZWwqLworCisjZGVmaW5lIExWTV9WQ19NSVhFUl9USU1FICAgICAgICAgICAgICAxMDAgICAgICAgLypWQyBtaXhlciB0aW1lKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUFYICAgICAgICAgICAgIDk2ICAgICAgICAvKlZDIGJhbGFuY2UgbWF4IHZhbHVlKi8KKyNkZWZpbmUgTFZNX1ZDX0JBTEFOQ0VfTUlOICAgICAgICAgICAgIC05NiAgICAgICAvKlZDIGJhbGFuY2UgbWluIHZhbHVlKi8KKworLyogQWxnb3JpdGhtIG1hc2tzICovCisjZGVmaW5lIExWTV9DU19NQVNLICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMVk1fRVFOQl9NQVNLICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTFZNX0RCRV9NQVNLICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIExWTV9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTFZNX1RFX01BU0sgICAgICAgICAgICAgICAgICAgICAzMgorI2RlZmluZSBMVk1fUFNBX01BU0sgICAgICAgICAgICAgICAgICAgIDIwNDgKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgIC8qIEJ5dGUgYWxpZ25tZW50ICovCisgICAgTFZNX01lbW9yeVR5cGVzX2VuICAgICAgVHlwZTsgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLworfSBMVk1fSW50TWVtb3J5UmVnaW9uX3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSW50TWVtb3J5UmVnaW9uX3QgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVk1fSW50TWVtVGFiX3Q7CisKKworLyogQnVmZmVyIE1hbmFnZW1lbnQgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAvKiBCdW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJ1ZmZlclN0YXRlOyAgICAgICAgLyogQnVmZmVyIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbNipNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyKk1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBPdXRwdXQgYnVmZmVyIGRlbGF5IGxpbmUgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBsZWZ0IGFuZCByaWdodCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb091dHB1dDsgICAgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCit9IExWTV9CdWZmZXJfdDsKKworCisvKiBGaWx0ZXIgdGFwcyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCit9IExWTV9URV9EYXRhX3Q7CisKKworLyogQ29lZmZpY2llbnRzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFRyZWJsZUJvb3N0X1N0YXRlOyAgLyogU3RhdGUgZm9yIHRoZSB0cmVibGUgYm9vc3QgZmlsdGVyICovCit9IExWTV9URV9Db2Vmc190OworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKworICAgIC8qIFByaXZhdGUgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIENvbnRyb2xQZW5kaW5nOyAgICAgLyogQ29udHJvbCBmbGFnIHRvIGluZGljYXRlIHVwZGF0ZSBwZW5kaW5nICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgTmV3UGFyYW1zOyAgICAgICAgICAvKiBOZXcgY29udHJvbCBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisKKyAgICAvKiBCdWZmZXIgY29udHJvbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOyAgLyogTWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplICovCisgICAgTFZNX0J1ZmZlcl90ICAgICAgICAgICAgKnBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzOyAgIC8qIElucHV0IHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBJbnB1dFNhbXBsZXM7ICAgICAvKiBFeHRlcm5hbCBpbnB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwT3V0cHV0U2FtcGxlczsgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisKKyAgICAvKiBDb25maWd1cmF0aW9uIG51bWJlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25OdW1iZXI7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQmxpY2tTaXplTXVsdGlwbGU7CisKKyAgICAvKiBEQyByZW1vdmFsICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLworCisgICAgLyogQ29uY2VydCBTb3VuZCAqLworICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgIGhDU0luc3RhbmNlOyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICBDU19JbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBDU19BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworCisgICAgLyogRXF1YWxpemVyICovCisgICAgTFZFUU5CX0hhbmRsZV90ICAgICAgICAgaEVRTkJJbnN0YW5jZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICAgIEVRTkJfSW5zdGFuY2U7ICAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgICpwRVFOQl9CYW5kRGVmczsgICAgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKnBFUU5CX1VzZXJEZWZzOyAgICAvKiBMb2NhbCBzdG9yYWdlIGZvciB0aGUgdXNlcidzIGRlZmluaXRpb25zICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRVFOQl9BY3RpdmU7ICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKworICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLworICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWREJFX0luc3RhbmNlX3QgICAgICAgIERCRV9JbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKworICAgIC8qIFZvbHVtZSBDb250cm9sICovCisgICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCisgICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgVkNfQmFsYW5jZU1peDsgICAgICAvKiBWQyBiYWxhbmNlIG1peGVyICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfVm9sdW1lZEI7ICAgICAgICAvKiBHYWluIGluIGRCICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQWN0aXZlOyAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWQ19BVkxGaXhlZFZvbHVtZTsgIC8qIEFWTCBmaXhlZCB2b2x1bWUgKi8KKworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCAqLworICAgIExWTV9URV9EYXRhX3QgICAgICAgICAgICpwVEVfVGFwczsgICAgICAgICAgLyogVHJlYmxlIGJvb3N0IFRhcHMgKi8KKyAgICBMVk1fVEVfQ29lZnNfdCAgICAgICAgICAqcFRFX1N0YXRlOyAgICAgICAgIC8qIFN0YXRlIGZvciB0aGUgdHJlYmxlIGJvb3N0IGZpbHRlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFRFX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisKKyAgICAvKiBIZWFkcm9vbSAqLworICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgIE5ld0hlYWRyb29tUGFyYW1zOyAgIC8qIE5ldyBoZWFkcm9vbSBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7ICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICpwSGVhZHJvb21fQmFuZERlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIG5ldyBkZWZpbml0aW9ucyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgICpwSGVhZHJvb21fVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBIZWFkcm9vbTsgICAgICAgICAgICAvKiBWYWx1ZSBvZiB0aGUgY3VycmVudCBoZWFkcm9vbSAqLworCisgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgKi8KKyAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICBoUFNBSW5zdGFuY2U7ICAgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgIFBTQV9JbnN0YW5jZTsgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5zdGFuY2UgKi8KKyAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICBQU0FfSW5pdFBhcmFtczsgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQU0FfQ29udHJvbFBhcmFtczsgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFBTQV9HYWluT2Zmc2V0OyAgICAgLyogVG9uZSBjb250cm9sIGZsYWcgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCisKK30gTFZNX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSk7CisKK3ZvaWQgICAgTFZNX1NldFRyZWJsZUJvb3N0KCBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKK3ZvaWQgICAgTFZNX1NldFZvbHVtZSggIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOworCitMVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSk7CisKK3ZvaWQgICAgTFZNX1NldEhlYWRyb29tKCAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKK3ZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKKwordm9pZCAgICBMVk1fQnVmZmVyT3V0KCAgTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKTsKKworTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBjYWxsYmFja0lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fUFJJVkFURV9IX18gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MjcxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9Db2VmZnMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTGlmZVZpYmVzIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgICAgIEF1ZGlvIFRpbWUgb2YgdGhlIGN1cnJlbnQgaW5wdXQgYnVmZmVyIGluIG1zICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX0lOVkFMSUROVU1TQU1QTEVTICBXaGVuIHRoZSBOdW1TYW1wbGVzIGlzIG5vdCBhIHZhbGllZCBtdWx0aXBsZSBpbiB1bm1hbmFnZWQgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9BTElHTk1FTlRFUlJPUiAgICAgV2hlbiBlaXRoZXIgdGhlIGlucHV0IG91ciBvdXRwdXQgYnVmZmVycyBhcmUgbm90IDMyLWJpdCAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkIGluIHVubWFuYWdlZCBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgIFdoZW4gb25lIG9mIGhJbnN0YW5jZSwgcEluRGF0YSBvciBwT3V0RGF0YSBpcyBOVUxMICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgorICAgICAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBhIGdvb2QgbXVsdGlwbGUgKHVubWFuYWdlZCBtb2RlIG9ubHkpCisgICAgICAgICAqLworICAgICAgICBpZigoTnVtU2FtcGxlcyAlIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIGlmKCgoKExWTV9VSU5UMzIpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKExWTV9VSU5UMzIpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9BTElHTk1FTlRFUlJPUik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKKworICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogQ29udmVydCBmcm9tIE1vbm8gaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKKyAgICB7CisgICAgICAgIE1vbm9UbzJJXzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7CisgICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyB0aGUgZGF0YSB3aXRoIG1hbmFnZWQgYnVmZmVycworICAgICAqLworICAgIHdoaWxlIChTYW1wbGVDb3VudCAhPSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGZyYW1lIHByb2Nlc3NpbmcKKyAgICAgICAgICovCisgICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAmcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICZwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPbmx5IHByb2Nlc3MgZGF0YSB3aGVuIFNhbXBsZUNvdW50IGlzIG5vbmUgemVybywgYSB6ZXJvIGNvdW50IGNhbiBvY2N1ciB3aGVuCisgICAgICAgICAqIHRoZSBCdWZmZXJJbiByb3V0aW5lIGlzIHdvcmtpbmcgaW4gbWFuYWdlZCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5DU19BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKHZvaWQpTFZDU19Qcm9jZXNzKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UsICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIE4tQmFuZCBlcXVhbGlzZXIgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyhwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UsICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOworICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQnlwYXNzIG1vZGUgb3IgZXZlcnl0aGluZyBvZmYsIHNvIGNvcHkgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5XzE2KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBcHBseSB0cmVibGUgYm9vc3QgaWYgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSYmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikgKFNhbXBsZUNvdW50KSk7CisKKyAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikgKFNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEQyByZW1vdmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7CisKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOworCisgICAgfQorCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTRmOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fQ29lZmZzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJlYmxlIEJvb3N0IEZpbHRlciBDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGT19DMTZfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMl9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluM19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNl9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluN19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjdfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTBfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEyX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTNfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE1X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfU2hpZnR9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluM19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjVfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNl9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjhfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjExX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEyX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE0X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE1X1NoaWZ0fSwKKworICAgICAgICAgICAgICAgICAgICAvKiAzMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluM19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW40X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW43X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMF9CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xM19CMSwKKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xNV9TaGlmdH0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4zX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNF9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW42X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluN19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjhfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW45X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTBfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTJfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTNfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTVfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfU2hpZnR9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4yX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluM19CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW41X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNl9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjEsCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19TaGlmdH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW44X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfU2hpZnR9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOV9CMSwKKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEyX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X1NoaWZ0fSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxLAorICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X1NoaWZ0fX07CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW10gPSB7CisgICAgMHg3RkZGLCAgICAgICAgICAgICAvKiAgMGRCICovCisgICAgMHg3MjE1LCAgICAgICAgICAgICAvKiAtMWRCICovCisgICAgMHg2NUFELCAgICAgICAgICAgICAvKiAtMmRCICovCisgICAgMHg1QTlFLCAgICAgICAgICAgICAvKiAtM2RCICovCisgICAgMHg1MEMzLCAgICAgICAgICAgICAvKiAtNGRCICovCisgICAgMHg0N0ZCLCAgICAgICAgICAgICAvKiAtNWRCICovCisgICAgMHg0MDAwfTsgICAgICAgICAgICAvKiAtNmRCICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvbHVtZSBtaXhlciB0aW1lIGNvbnN0YW50cyAoMTAwbXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWTV9NSVhfVENfRnM4MDAwICAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTEwMjUgICAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxNjAwMCAgICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMjIwNTAgICAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzNDQxMDAgICAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCisKKworY29uc3QgTFZNX0lOVDE2IExWTV9NaXhlclRDVGFibGVbXSA9IHsKKyAgICBMVk1fTUlYX1RDX0ZzODAwMCwKKyAgICBMVk1fTUlYX1RDX0ZzMTEwMjUsCisgICAgTFZNX01JWF9UQ19GczEyMDAwLAorICAgIExWTV9NSVhfVENfRnMxNjAwMCwKKyAgICBMVk1fTUlYX1RDX0ZzMjIwNTAsCisgICAgTFZNX01JWF9UQ19GczI0MDAwLAorICAgIExWTV9NSVhfVENfRnMzMjAwMCwKKyAgICBMVk1fTUlYX1RDX0ZzNDQxMDAsCisgICAgTFZNX01JWF9UQ19GczQ4MDAwfTsKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjAxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWTV9UQUJMRVNfSF9fCisjZGVmaW5lIF9fTFZNX1RBQkxFU19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRyZWJsZSBCb29zdCBGaWx0ZXIgQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgIExWTV9UcmVibGVCb29zdENvZWZzW107CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWTV9NaXhlclRDVGFibGVbXTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19MVk1fVEFCTEVTX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MGQ2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BR0NfSF9fCisjZGVmaW5lIF9fQUdDX0hfXworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBR0NfR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9JTlQzMiAgQUdDX01heEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fSU5UMzIgIFZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0lOVDMyICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0lOVDMyICBBR0NfVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0lOVDE2ICBBR0NfQXR0YWNrOyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLworICAgIExWTV9JTlQxNiAgQUdDX0RlY2F5OyAgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLworICAgIExWTV9JTlQxNiAgQUdDX0dhaW5TaGlmdDsgICAgICAgICAgICAgICAgICAgLyogVGhlIGdhaW4gc2hpZnQgKi8KKyAgICBMVk1fSU5UMTYgIFZvbHVtZVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8qIFZvbHVtZSBzaGlmdCBzY2FsaW5nICovCisgICAgTFZNX0lOVDE2ICBWb2x1bWVUQzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KKworfSBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNlbmRpZiAgLyogX19BR0NfSF9fICovCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjN2ZiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0wLDAgKzEsMzMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CSVFVQURfSF8KKyNkZWZpbmUgX0JJUVVBRF9IXworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOworCit9IEJpcXVhZF9JbnN0YW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKiBCaXF1YWQgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiBBMjsgICAvKiAgYTIgICovCisgICAgTFZNX0lOVDE2IEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KK30gQlFfQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMjsgICAvKiAgYTIgICovCisgICAgTFZNX0lOVDMyICBBMTsgICAvKiAgYTEgICovCisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCit9IEJRX0MzMl9Db2Vmc190OworCisvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2IEExOyAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMTsgICAvKiAtYjEhICovCit9IEZPX0MxNl9Db2Vmc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgQTE7ICAgLyogIGExICAqLworICAgIExWTV9JTlQzMiAgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQzMiAgQjE7ICAgLyogLWIxISAqLworfSBGT19DMzJfQ29lZnNfdDsKKworLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgd2l0aCBTaGlmdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgQTE7ICAgIC8qICBhMSAgKi8KKyAgICBMVk1fSU5UMTYgQTA7ICAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMTYgQjE7ICAgIC8qIC1iMSEgKi8KKyAgICBMVk1fSU5UMTYgU2hpZnQ7IC8qIFNoaWZ0ICovCit9IEZPX0MxNl9MU2h4X0NvZWZzX3Q7CisKKy8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLworICAgIExWTV9JTlQxNiBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KK30gQlBfQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCit9IEJQX0MzMl9Db2Vmc190OworCisvKioqIFBlYWtpbmcgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDE2IEEwOyAgIC8qICBhMCAgKi8KKyAgICBMVk1fSU5UMTYgQjI7ICAgLyogLWIyISAqLworICAgIExWTV9JTlQxNiBCMTsgICAvKiAtYjEhICovCisgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KK30gUEtfQzE2X0NvZWZzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCisgICAgTFZNX0lOVDMyICBCMjsgICAvKiAtYjIhICovCisgICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCisgICAgTFZNX0lOVDE2ICBHOyAgIC8qIEdhaW4gKi8KK30gUEtfQzMyX0NvZWZzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIFRBUFMgVFlQRSBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogVHlwZXMgdXNlZCBmb3IgZmlyc3Qgb3JkZXIgYW5kIHNoZWx2aW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMSoyKSBdOyAgLyogT25lIGNoYW5uZWwsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCit9IEJpcXVhZF8xSV9PcmRlcjFfVGFwc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWyAoMioyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdDsKKworCisvKioqIFR5cGVzIHVzZWQgZm9yIGJpcXVhZCwgYmFuZCBwYXNzIGFuZCBwZWFraW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KK30gQmlxdWFkXzFJX09yZGVyMl9UYXBzX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworfSBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdDsKKworLyogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gc2F0aXNmeSBRQUMgcnVsZXM6IE5hbWUgc2hvdWxkIGJlIFVuaXF1ZSB3aXRoaW5nIDE2IGNoYXJhY3RlcnMqLworI2RlZmluZSBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCisjZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICAgICAgIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQklRVUFEIEZJTFRFUlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKwordm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CisKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKworLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBGSVJTVCBPUkRFUiBGSUxURVJTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfTFNoeF9Db2Vmc190ICAgICAqcENvZWYpOworCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKworLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOworCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCQU5EIFBBU1MgRklMVEVSUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisKKy8qKiogMzIgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisKKy8qKiogMzIgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCit2b2lkIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKKwordm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBEQyBSRU1PVkFMIEZJTFRFUlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKKwordm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8qKiBfQklRVUFEX0hfICoqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiOGFhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9DT01QX0xJTV9ICisjZGVmaW5lIF9DT01QX0xJTV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCAvKiBDb21wcmVzc29yIHN0YXRlICovCit7CisgICAgLyogTm9ybWFsaXNlciAqLworICAgIExWTV9JTlQxNiAgIE5vcm1fQXR0YWNrOyAgICAgICAgLyogQXR0YWNrIHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIE5vcm1fRGVjYXk7ICAgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCBvZiB0aGUgTm9ybWFsaXNlciBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDMyICAgTm9ybUludDsgICAgICAgICAgICAvKiBOb3JtYWxpc2VyIGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLworICAgIExWTV9JTlQxNiAgIFNoaWZ0OyAgICAgICAgICAgICAgLyogU2hpZnQgZ2FpbiAqLworICAgIExWTV9JTlQxNiAgIFRocmVzaG9sZDsgICAgICAgICAgLyogVGFyZ2V0IHRocmVzaG9sZCAqLworCisgICAgLyogQ29tcHJlc3NvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfQXR0ZW47ICAgICAgICAgLyogQXR0ZW51YXRpb24gYXBwbGllZCBiZWZvcmUgc29mdCBrbmVlIGNvbXByZXNzb3IgKi8KKyAgICBMVk1fSU5UMTYgICBDb21wX0F0dGFja19TOyAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBzbG93IGludGVncmF0b3IgKi8KKyAgICBMVk1fSU5UMTYgICBDb21wX0RlY2F5X1M7ICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2Ygc2xvdyB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfQXR0YWNrX0Y7ICAgICAgLyogQXR0YWNrIHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiAgIENvbXBfRGVjYXlfRjsgICAgICAgLyogRGVjYXkgdGltZSBjb25zdGFudCBvZiBmYXN0IHRoZSBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2ICAgU29mdENsaXBHYWluOyAgICAgICAvKiBTb2Z0IGNsaXAgZ2FpbiBjb250cm9sICovCisgICAgTFZNX0lOVDMyICAgQ29tcEludFNsb3c7ICAgICAgICAvKiBDb21wcmVzc29yIHNsb3cgaW50ZWdyYXRvciBjdXJyZW50IHZhbHVlICovCisgICAgTFZNX0lOVDMyICAgQ29tcEludEZhc3Q7ICAgICAgICAvKiBDb21wcmVzc29yIGZhc3QgaW50ZWdyYXRvciBjdXJyZW50IHZhbHVlICovCisKKworfSBDb21wTGltX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwU3RlckJmSW4sCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZPdXQsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTcwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GSUxURVJfSF8KKyNkZWZpbmUgX0ZJTFRFUl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklORVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGSUxURVJfTE9TUyAgICAgMzI3MzAgICAgICAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgIFgpOworCitMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoICAgTFZNX0lOVDMyICBYKTsKKworTFZNX0lOVDMyIExWTV9GT19MUEYoICAgIExWTV9JTlQzMiAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpOworCitMVk1fSU5UMzIgTFZNX0ZPX0hQRiggICAgTFZNX0lOVDMyICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcyk7CisKK0xWTV9JTlQzMiAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICBGYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qKiBfRklMVEVSX0hfICoqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTU0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSU5TVEFMTE9DX0hfXworI2RlZmluZSBfX0lOU1RBTExPQ19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qICBUeXBlIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFRvdGFsU2l6ZTsgICAgICAvKiAgQWNjdW11bGF0aXZlIHRvdGFsIG1lbW9yeSBzaXplICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgcE5leHRNZW1iZXI7ICAgIC8qICBQb2ludGVyIHRvIHRoZSBuZXh0IGluc3RhbmNlIG1lbWJlciB0byBiZSBhbGxvY2F0ZWQgKi8KK30gICBJTlNUX0FMTE9DOworCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXQoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFN0YXJ0QWRkciAtIEJhc2UgYWRkcmVzcyBvZiB0aGUgaW5zdGFuY2UgbWVtb3J5CisgKiAgUmV0dXJucyAgICAgOiBFcnJvciBjb2RlCisgKiAgRGVzY3JpcHRpb24gOiBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgZGlzdHJpYnV0aW9uIGFuZCBtZW1vcnkgc2l6ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgKnBtcywgdm9pZCAqU3RhcnRBZGRyICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19BZGRNZW1iZXIoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFNpemUgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV3IGFkZGVkIG1lbWJlcgorICogIFJldHVybnMgICAgIDogQSBwb2ludGVyIHRvIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgRGVzY3JpcHRpb24gOiBBbGxvY2F0ZXMgc3BhY2UgZm9yIGEgbmV3IG1lbWJlciBpbiB0aGUgaW5zdGFuY2UgbWVtb3J5IGFuZCByZXR1cm5zCisgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gdGhpcyBuZXcgbWVtYmVyLiAgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYWxsIG1lbWJlcnMgd2lsbAorICAgICAgICAgICAgICAgICAgYmUgMzIgYml0IGFsbGlnbmVkLgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkKiBJbnN0QWxsb2NfQWRkTWVtYmVyKCBJTlNUX0FMTE9DICpwbXMsIExWTV9VSU5UMzIgU2l6ZSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCisgKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcyk7CisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cik7CisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSk7CisKK3ZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlKTsKKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAqcG1zKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fSkJTX0lOU1RBTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNjZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCB3aXRoaW4gdGhlIGJ1bmRsZSBhbmQgaXRzIGFsZ29yaXRobXMuICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZmlsZXMgaW5jbHVkZXMgYWxsIGRlZmluaXRpb25zLCB0eXBlcywgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcHJvdG90eXBlcy4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX19MVk1fQ09NTU9OX0hfXworI2RlZmluZSBfX0xWTV9DT01NT05fSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBbGdvcml0aG0gaWRlbnRpZmljYXRpb24gKi8KKyNkZWZpbmUgQUxHT1JJVEhNX05PTkVfSUQgICAgICAweDAwMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0NTX0lEICAgICAgICAweDAxMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0VRTkJfSUQgICAgICAweDAyMDAKKyNkZWZpbmUgQUxHT1JJVEhNX0RCRV9JRCAgICAgICAweDAzMDAKKyNkZWZpbmUgQUxHT1JJVEhNX1ZDX0lEICAgICAgICAweDA1MDAKKyNkZWZpbmUgQUxHT1JJVEhNX1RFX0lEICAgICAgICAweDA2MDAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVk1fQ09NTU9OX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMTNhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTFZNX01BQ1JPU19IXworI2RlZmluZSBfTFZNX01BQ1JPU19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpCisgICAgICAgIEMgPSAoQSAqIEIpID4+IFNoaWZ0UgorCisgICAgICAgIEEsIEIgYW5kIEMgYXJlIGFsbCAzMiBiaXQgU0lHTkVEIG51bWJlcnMgYW5kIFNoaWZ0UiBjYW4gdmFyeSBmcm9tIDAgdG8gNjQKKworICAgICAgICBUaGUgdXNlciBoYXMgdG8gdGFrZSBjYXJlIHRoYXQgQyBkb2VzIG5vdCBvdmVyZmxvdy4gIFRoZSByZXN1bHQgaW4gY2FzZQorICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBNVUwzMngzMklOVE8zMgorI2RlZmluZSBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAorICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDMySU5UTzMyX3RlbXAsTVVMMzJ4MzJJTlRPMzJfdGVtcDIsTVVMMzJ4MzJJTlRPMzJfbWFzayxNVUwzMngzMklOVE8zMl9ISCxNVUwzMngzMklOVE8zMl9ITCxNVUwzMngzMklOVE8zMl9MSCxNVUwzMngzMklOVE8zMl9MTDtcCisgICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XAorICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9tYXNrPTB4MDAwMEZGRkY7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gKChMVk1fSU5UMzIpKChMVk1fSU5UMTYpKChBKT4+MTYpKSooKExWTV9JTlQxNikoKEIpPj4xNikpICk7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ITD0gKChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEEpPj4xNikpKSA7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9MSD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEIpPj4xNikpKTtcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPSAoTFZNX0lOVDMyKSgoQSkmTVVMMzJ4MzJJTlRPMzJfbWFzaykqKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spO1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcD0gKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEwmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEgmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMPj4xNikmTVVMMzJ4MzJJTlRPMzJfbWFzayk7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gTVVMMzJ4MzJJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEw+PjE2KSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSD4+MTYpKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXA+PjE2KTtcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPU1VTDMyeDMySU5UTzMyX0xMKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMPDwxNikrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEg8PDE2KTtcCisgICAgICAgIGlmKHNoaWZ0VmFsdWU8MzIpXAorICAgICAgICB7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9ISD1NVUwzMngzMklOVE8zMl9ISDw8KDMyLXNoaWZ0VmFsdWUpO1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzaz0oKExWTV9JTlQzMikxPDwoMzItc2hpZnRWYWx1ZSkpLTE7XAorICAgICAgICBNVUwzMngzMklOVE8zMl9MTD0oTVVMMzJ4MzJJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpJk1VTDMyeDMySU5UTzMyX21hc2s7XAorICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMj1NVUwzMngzMklOVE8zMl9ISHxNVUwzMngzMklOVE8zMl9MTDtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2VcCisgICAgICAge1wKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDI9KExWTV9JTlQzMilNVUwzMngzMklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMzIpO1wKKyAgICAgICB9XAorICAgICAgIChDKSA9IE1VTDMyeDMySU5UTzMyX3RlbXAyO1wKKyAgICAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIE1VTDMyeDE2SU5UTzMyKEEsQixDLFNoaWZ0UikKKyAgICAgICAgQyA9IChBICogQikgPj4gU2hpZnRSCisKKyAgICAgICAgQSBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLiAgQiBpcyBhIDE2IGJpdCBTSUdORUQgbnVtYmVyLgorICAgICAgICBTaGlmdFIgY2FuIHZhcnkgZnJvbSAwIHRvIDQ4CisKKyAgICAgICAgVGhlIHVzZXIgaGFzIHRvIHRha2UgY2FyZSB0aGF0IEMgZG9lcyBub3Qgb3ZlcmZsb3cuICBUaGUgcmVzdWx0IGluIGNhc2UKKyAgICAgICAgb2Ygb3ZlcmZsb3cgaXMgdW5kZWZpbmVkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgTVVMMzJ4MTZJTlRPMzIKKyNkZWZpbmUgTVVMMzJ4MTZJTlRPMzIoQSxCLEMsU2hpZnRSKSAgIFwKKyAgICAgICAge0xWTV9JTlQzMiBNVUwzMngxNklOVE8zMl9tYXNrLE1VTDMyeDE2SU5UTzMyX0hILE1VTDMyeDE2SU5UTzMyX0xMO1wKKyAgICAgICAgIExWTV9JTlQzMiAgc2hpZnRWYWx1ZTtcCisgICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX21hc2s9MHgwMDAwRkZGRjtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPSAoKExWTV9JTlQzMikoQikqKChMVk1fSU5UMTYpKChBKT4+MTYpKSk7XAorICAgICAgICBNVUwzMngxNklOVE8zMl9MTD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngxNklOVE8zMl9tYXNrKSooQikpO1wKKyAgICAgICAgaWYoc2hpZnRWYWx1ZTwxNilcCisgICAgICAgIHtcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIPShMVk1fSU5UMzIpKChMVk1fVUlOVDMyKU1VTDMyeDE2SU5UTzMyX0hIPDwoMTYtc2hpZnRWYWx1ZSkpO1wKKyAgICAgICAgKEMpPU1VTDMyeDE2SU5UTzMyX0hIKyhMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMPj5zaGlmdFZhbHVlKTtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2UgaWYoc2hpZnRWYWx1ZTwzMikge1wKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9KExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KSk7XAorICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpO1wKKyAgICAgICAgfVwKKyAgICAgICAgZWxzZSB7XAorICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KTt9XAorICAgICAgICB9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEFERDJfU0FUXzMyeDMyKEEsQixDKQorICAgICAgICBDID0gU0FUKEEgKyBCKQorCisgICAgICAgIEEsQiBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEFERDJfU0FUXzMyeDMyCisjZGVmaW5lIEFERDJfU0FUXzMyeDMyKEEsQixDKSAgIFwKKyAgICAgICAgeyhDKT0oQSkrKEIpO1wKKyAgICAgICAgIGlmICgoKChDKSBeIChBKSkgJiAoKEMpIF4gKEIpKSkgPj4gMzEpXAorICAgICAgICAgICAge1wKKyAgICAgICAgICAgICAgICBpZigoQSk8MClcCisgICAgICAgICAgICAgICAgICAgIChDKT0weDgwMDAwMDAwbDtcCisgICAgICAgICAgICAgICAgZWxzZVwKKyAgICAgICAgICAgICAgICAgICAgKEMpPTB4N0ZGRkZGRkZsO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgIH0KKyNlbmRpZgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTFZNX01BQ1JPU19IXyAqLworCisvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlMjg4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVk1fVElNRVJfSF9fCisjZGVmaW5lIF9fTFZNX1RJTUVSX0hfXworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGVhZGVyIGZpbGUgZm9yIHRoZSBMVk1fVGltZXIgbGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmN0aW9uYWxpdHk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIHRpbWVyIHdpbGwgY291bnQgZG93biBhIG51bWJlciBvZiBtcywgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzYW1wbGVzIGl0ICAgICAgICAgKi8KKy8qICBzZWVzIGFuZCB0aGUgY3VyZW50IHNhbXBsaW5nIHJhdGUuICBXaGVuIHRoZSB0aW1lciBleHBpcmVzLCBhIHJlZ2lzdGVyZWQgICAgICAgICAgICAqLworLyogIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIG1heGltYWwgbnVtYmVyIG9mIHNhbXBsZXNzIHRoYXQgY2FuIGJlIGNhbGxlZCBieSB0aGUgdGltZXIgaXMgMl4zMiwgd2hpY2ggICAgICAgKi8KKy8qICBjb3JyZXNwb25kcyB0byAyNC44IGhvdXJzIGF0IGEgc2FtcGxpbmcgcmF0ZSBvZiA0OCBrSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSB0aW1lciBjdXJyZW50bHkgZG9lcyBub3Qgc3Vwb3J0IGNoYW5nZXMgaW4gc2FtcGxpbmcgcmF0ZSB3aGlsZSB0aW1pbmcuICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKKworfSBMVk1fVGltZXJfSW5zdGFuY2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgIFNhbXBsaW5nUmF0ZTsKKyAgICBMVk1fSU5UMTYgIFRpbWVJbk1zOworICAgIExWTV9JTlQzMiAgQ2FsbEJhY2tQYXJhbTsKKyAgICB2b2lkICAgICAgICpwQ2FsbEJhY2tQYXJhbXM7CisgICAgdm9pZCAgICAgICAqcENhbGxiYWNrSW5zdGFuY2U7CisgICAgdm9pZCAgICAgICAoKnBDYWxsQmFjaykodm9pZCosdm9pZCosTFZNX0lOVDMyKTsKKworfSBMVk1fVGltZXJfUGFyYW1zX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEZVTkNUSU9OIFBST1RPVFlQRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fVGltZXJfSW5pdCAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zICAgICApOworCisKK3ZvaWQgTFZNX1RpbWVyICAgICAgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVORCBPRiBIRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBfX0xWTV9USU1FUl9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2NTVkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGRlZmluaW5nIHRoZSBzdGFuZGFyZCBMaWZlVmliZXMgdHlwZXMgZm9yIHVzZSBpbiB0aGUgYXBwbGljYXRpb24gbGF5ZXIgICovCisvKiAgaW50ZXJmYWNlIG9mIGFsbCBMaWZlVmliZXMgbW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZNX1RZUEVTX0gKKyNkZWZpbmUgTFZNX1RZUEVTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZNX05VTEwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiBOVUxMIHBvaW50ZXIgKi8KKworI2RlZmluZSBMVk1fVFJVRSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW5zICovCisjZGVmaW5lIExWTV9GQUxTRSAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBMVk1fTUFYSU5UXzggICAgICAgICAgICAxMjcgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcG9zaXRpdmUgaW50ZWdlciBzaXplICovCisjZGVmaW5lIExWTV9NQVhJTlRfMTYgICAgICAgICAgIDMyNzY3CisjZGVmaW5lIExWTV9NQVhJTlRfMzIgICAgICAgICAgIDIxNDc0ODM2NDcKKyNkZWZpbmUgTFZNX01BWEVOVU0gICAgICAgICAgICAgMjE0NzQ4MzY0NworCisjZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLICAgICAgIDB4RkYwMCAgICAgICAgICAgICAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsaW5nIG1vZHVsZSBJRCBmcm9tIGNhbGxiYWNrSWQgKi8KKyNkZWZpbmUgTFZNX0VWRU5USURfTUFTSyAgICAgICAgMHgwMEZGICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGV2ZW50IGZyb20gY2FsbGJhY2tJZCAqLworCisvKiBNZW1vcnkgdGFibGUqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgICAgMCAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgICAgMSAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICAgIDIgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgY29lZmZpY2llbnQgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUICAgICAgICAgICAgMyAgIC8qIE9mZnNldCB0byB0ZW1wb3JhcnkgbWVtb3J5IHJlZ2lvbiAqLworCisjZGVmaW5lIExWTV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgICA0ICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCisKKy8qIE1lbW9yeSBwYXJ0aXRpb24gdHlwZSAqLworI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIDFzdCBtZW1vcnkgcGFydGl0aW9uICovCisjZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMSAgICAgIDEgICAgICAgICAgICAgICAgICAgLyogMm5kIG1lbW9yeSBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04yICAgICAgMiAgICAgICAgICAgICAgICAgICAvKiAzcmQgbWVtb3J5IHBhcnRpdGlvbiAqLworI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjMgICAgICAzICAgICAgICAgICAgICAgICAgIC8qIDR0aCBtZW1vcnkgcGFydGl0aW9uICovCisKKy8qIFVzZSB0eXBlICovCisjZGVmaW5lIExWTV9NRU1fUEVSU0lTVEVOVCAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogUGVyc2lzdGVudCBtZW1vcnkgdHlwZSAqLworI2RlZmluZSBMVk1fTUVNX1NDUkFUQ0ggICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIFNjcmF0Y2ggIG1lbW9yeSB0eXBlICovCisKKy8qIEFjY2VzcyB0eXBlICovCisjZGVmaW5lIExWTV9NRU1fSU5URVJOQUwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgKGZhc3QpIGFjY2VzcyBtZW1vcnkgKi8KKyNkZWZpbmUgTFZNX01FTV9FWFRFUk5BTCAgICAgICAgOCAgICAgICAgICAgICAgICAgICAvKiBFeHRlcm5hbCAoc2xvdykgYWNjZXNzIG1lbW9yeSAqLworCisvKiBQbGF0Zm9ybSBzcGVjaWZpYyAqLworI2RlZmluZSBMVk1fUEVSU0lTVEVOVCAgICAgICAgICBMVk1fTUVNX1BBUlRJVElPTjArTFZNX01FTV9QRVJTSVNURU5UK0xWTV9NRU1fSU5URVJOQUwKKyNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfREFUQSAgICAgTFZNX01FTV9QQVJUSVRJT04xK0xWTV9NRU1fUEVSU0lTVEVOVCtMVk1fTUVNX0lOVEVSTkFMCisjZGVmaW5lIExWTV9QRVJTSVNURU5UX0NPRUYgICAgIExWTV9NRU1fUEFSVElUSU9OMitMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTAorI2RlZmluZSBMVk1fU0NSQVRDSCAgICAgICAgICAgICBMVk1fTUVNX1BBUlRJVElPTjMrTFZNX01FTV9TQ1JBVENIK0xWTV9NRU1fSU5URVJOQUwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCYXNpYyB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiAgICAgY2hhciAgICAgICAgICAgICAgICBMVk1fQ0hBUjsgICAgICAgICAgIC8qIEFTQ0lJIGNoYXJhY3RlciAqLworCit0eXBlZGVmICAgICBjaGFyICAgICAgICAgICAgICAgIExWTV9JTlQ4OyAgICAgICAgICAgLyogU2lnbmVkIDgtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgTFZNX1VJTlQ4OyAgICAgICAgICAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCisKK3R5cGVkZWYgICAgIHNob3J0ICAgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLworCit0eXBlZGVmICAgICBsb25nICAgICAgICAgICAgICAgIExWTV9JTlQzMjsgICAgICAgICAgLyogU2lnbmVkIDMyLWJpdCB3b3JkICovCit0eXBlZGVmICAgICB1bnNpZ25lZCBsb25nICAgICAgIExWTV9VSU5UMzI7ICAgICAgICAgLyogVW5zaWduZWQgMzItYml0IHdvcmQgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0YW5kYXJkIEVudW1lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPcGVyYXRpbmcgbW9kZSAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX01PREVfT0ZGICAgID0gMCwKKyAgICBMVk1fTU9ERV9PTiAgICAgPSAxLAorICAgIExWTV9NT0RFX0RVTU1ZICA9IExWTV9NQVhFTlVNCit9IExWTV9Nb2RlX2VuOworCisKKy8qIEZvcm1hdCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCisgICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCisgICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCisgICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCit9IExWTV9Gb3JtYXRfZW47CisKKworLyogTFZNIHNhbXBsaW5nIHJhdGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVk1fRlNfODAwMCAgPSAwLAorICAgIExWTV9GU18xMTAyNSA9IDEsCisgICAgTFZNX0ZTXzEyMDAwID0gMiwKKyAgICBMVk1fRlNfMTYwMDAgPSAzLAorICAgIExWTV9GU18yMjA1MCA9IDQsCisgICAgTFZNX0ZTXzI0MDAwID0gNSwKKyAgICBMVk1fRlNfMzIwMDAgPSA2LAorICAgIExWTV9GU180NDEwMCA9IDcsCisgICAgTFZNX0ZTXzQ4MDAwID0gOCwKKyAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCisgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KK30gTFZNX0ZzX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSwKKyAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBLAorICAgIExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYsCisgICAgTFZNX1RFTVBPUkFSWV9GQVNUICAgICAgICAgID0gTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCwKKyAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSAgICAgICAgPSBMVk1fTUFYRU5VTQorfSBMVk1fTWVtb3J5VHlwZXNfZW47CisKKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLworICAgIExWTV9NZW1vcnlUeXBlc19lbiAgICAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWTV9NZW1vcnlSZWdpb25fc3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fTWVtb3J5UmVnaW9uX3N0ICAgICAgICAgUmVnaW9uW0xWTV9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KK30gTFZNX01lbW9yeVRhYmxlX3N0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RhbmRhcmQgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIExWTV9JTlQzMiAoKkxWTV9DYWxsYmFjaykodm9pZCAgICAgICAgICAqcENhbGxiYWNrRGF0YSwgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGRhdGEgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLCAgIC8qIEdlbmVyYWwgcHVycG9zZSBwb2ludGVyIChlLmcuIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgbmVlZGVkIGluIHRoZSBjYWxsYmFjaykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIEdlbmVyYWxQdXJwb3NlICk7ICAgLyogR2VuZXJhbCBwdXJwb3NlIHZhcmlhYmxlIChlLmcuIHRvIGJlIHVzZWQgYXMgY2FsbGJhY2sgSUQpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFbmQgb2YgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBMVk1fVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZWIwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NSVhFUl9IX18KKyNkZWZpbmUgX19NSVhFUl9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0lOVDMyICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmFsdWUuICBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0lOVDMyICAgQ3VycmVudDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHZhbHVlLiAgU2V0IGJ5IHRoZSBtaXhlciBmdW5jdGlvbi4gKi8KKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDsgICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTWl4XzFTdF9DbGxfdDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgICBBbHBoYTE7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0MTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50MTsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7CisgICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7CisgICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7CisgICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazE7CisKKyAgICBMVk1fSU5UMzIgICBBbHBoYTI7ICAgICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fSU5UMzIgICBUYXJnZXQyOworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQyOworICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMjsKKyAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMjsKKyAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKKworfSBNaXhfMlN0X0NsbF90OworCisKKy8qKiogR2VuZXJhbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fVUlOVDMyIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpOworCisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLyogX19NSVhFUl9IX18gKi8KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNjI3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1NDQUxBUkFSSVRITUVUSUNfSF9fCisjZGVmaW5lIF9fU0NBTEFSQVJJVEhNRVRJQ19IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qICBFeHRlcm4gZnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qIEFic29sdXRlIHZhbHVlIGluY2x1ZGluZyB0aGUgY29ybmVyIGNhc2UgZm9yIHRoZSBleHRyZW1lIG5lZ2F0aXZlIHZhbHVlICovCitMVk1fSU5UMzIgICBBYnNfMzIoTFZNX0lOVDMyICAgICBpbnB1dCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTmFtZSAgICAgICAgOiBkQl90b19MaW4zMigpCisgKiAgSW5wdXQgICAgICAgOiBTaWduZWQgMTYtYml0IGludGVnZXIKKyAqICAgICAgICAgICAgICAgICAgTVNCICgxNikgPSBzaWduIGJpdAorICogICAgICAgICAgICAgICAgICAoMTUtPjA1KSA9IGludGVnZXIgcGFydAorICogICAgICAgICAgICAgICAgICAoMDQtPjAxKSA9IGRlY2ltYWwgcGFydAorICogIE91dHB1dCAgICAgIDogU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgIE1TQiAoMzIpID0gc2lnbiBiaXQKKyAqICAgICAgICAgICAgICAgICAgKDMxLT4xNikgPSBpbnRlZ2VyIHBhcnQKKyAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKKyAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiBkQl90b19MaW4zMihMVk1fSU5UMTYgIGRiX2ZpeCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogX19TQ0FMQVJBUklUSE1FVElDX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc5MWJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9WRUNUT1JfQVJJVEhNRVRJQ19IXworI2RlZmluZSBfVkVDVE9SX0FSSVRITUVUSUNfSF8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBWQVJJT1VTIEZVTkNUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTG9hZENvbnN0XzE2KCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgTG9hZENvbnN0XzMyKCAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgQ29weV8xNiggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBub3RlOiBJbiBNdWx0M3NfMTZ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCisgKiAgICAgICBvdmVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBGb3IgZXhhbXBsZSB3aGVuICpzcmMgPSAweDgwMDAsIHZhbCA9ICoweDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBUaGUgZnVuY3Rpb24gZ2l2ZXMgdGhlIG91dHB1dCBhcyAweDgwMDAgaW5zdGVhZCBvZiAweDdmZmYgICAgICAgICAgICAgICAqCisgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNdWx0M3NfMTZ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG5vdGU6IEluIE11bHQzc18zMngxNigpIHNhdHVyYXRpb24gb2YgcmVzdWx0IGlzIG5vdCB0YWtlbiBjYXJlIHdoZW4gICAgICAgICAgICoKKyAqICAgICAgIG92ZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgIEZvciBleGFtcGxlIHdoZW4gKnNyYyA9IDB4ODAwMDAwMCwgdmFsID0gKjB4ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgIFRoZSBmdW5jdGlvbiBnaXZlcyB0aGUgb3V0cHV0IGFzIDB4ODAwMDAwMCBpbnN0ZWFkIG9mIDB4N2ZmZmZmZmYgICAgICAgICoKKyAqICAgICAgIFRoaXMgaXMgdGhlIG9ubHkgZXh0cmVtZSBjb25kaXRpb24gd2hpY2ggaXMgZ2l2aW5nIHVuZXhwZWN0ZWQgcmVzdWx0ICAgICoKKyAqICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvIFZlY3Rvcl9Bcml0aG1ldGljLmRvYyBpbiAvZG9jIGZvbGRlciAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE11bHQzc18zMngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIERlbGF5TWl4XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIERlbGF5V3JpdGVfMzIoICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgQWRkMl9TYXRfMTZ4MTYoICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIEFkZDJfU2F0XzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIE1hYzNzX1NhdF8xNngxNiggICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBNYWMzc19TYXRfMzJ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIFNISUZUIEZVTkNUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKCAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIFNoaWZ0X1NhdF92MzJ4djMyICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBBVURJTyBGT1JNQVQgQ09OVkVSU0lPTiBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1vbm9UbzJJXzE2KCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOworCit2b2lkIE1vbm9UbzJJXzMyKCAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKwordm9pZCBNU1RvMmlfU2F0XzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworCit2b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisKK3ZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisKK3ZvaWQgSm9pblRvMmlfMzJ4MzIoICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7CisKK3ZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCAgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgIC8qIF9WRUNUT1JfQVJJVEhNRVRJQ19IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwYjUxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQUdDLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEFwcGx5IEFHQyBhbmQgbWl4IHNpZ25hbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdFNyYyAgIC0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgX19fX19fICAgICAgIF98XyAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHwgICAgICB8ICAgICB8ICAgfCAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm9TcmMgLS0+fCBBR0MgIHwtLS0tPnwgKyB8LS0tLS0+fCBWb2x1bWUgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0+ICAgICovCisvKiAgICAgICAgICAgICB8IEdhaW4gfCAgICAgfF9fX3wgICAgICB8IEdhaW4gICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgIHxfX19fX198ICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgL3xcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX18gICAgIF9fX19fX19fICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgQUdDIEdhaW4gfDwtLXwgUGVhayAgIHw8LS18ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGUgICB8ICAgfCBEZXRlY3QgfCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wgICB8X19fX19fX198ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdGVyZW9JbiAgICAgICAgICAgICAgIFN0ZXJlbyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1vbm9JbiAgICAgICAgICAgICAgICAgTW9ubyBiYW5kIHBhc3Mgc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RlcmVvT3V0ICAgICAgICAgICAgICBTdGVyZW8gZGVzdGluYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KK3sKKworICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fSU5UMzIgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLworICAgIExWTV9JTlQzMiAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLworICAgIExWTV9JTlQzMiAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0lOVDMyICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgSGlnaFdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHdvcmQgaW4gaW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAqLworICAgIExWTV9JTlQzMiAgICAgICBMb3dXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyB3b3JkIGluIGludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9JTlQxNiAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworCisKKyAgICAvKgorICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX0lOVDMyICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0lOVDMyICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fSU5UMTYgICAgICBBR0NfR2FpblNoaWZ0ID0gcEluc3RhbmNlLT5BR0NfR2FpblNoaWZ0OyAgICAvKiBHZXQgdGhlIEFHQyBzaGlmdCAqLworICAgIExWTV9JTlQxNiAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICBMVk1fSU5UMTYgICAgICBBR0NfRGVjYXkgICAgID0gcEluc3RhbmNlLT5BR0NfRGVjYXk7ICAgICAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fSU5UMzIgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9JTlQzMiAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9JTlQzMiAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9JTlQxNiAgICAgIFZvbF9TaGlmdCAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVNoaWZ0OyAgICAgIC8qIFZvbHVtZSBzaGlmdCBzY2FsaW5nICovCisgICAgTFZNX0lOVDE2ICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisKKyAgICAvKgorICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCisgICAgICovCisgICAgZm9yIChpPTA7aTxOdW1TYW1wbGVzO2krKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggc2FtcGxlICovCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgc2hvcnQgc2NhbGVycworICAgICAgICAgKi8KKyAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0lOVDE2KShBR0NfR2FpbiA+PiAxNik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IEFHQyBnYWluICovCisgICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9JTlQxNikoVm9sX0N1cnJlbnQgPj4gMTYpOyAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCB2b2x1bWUgZ2FpbiAqLworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIEhpZ2hXb3JkID0gKEFHQ19NdWx0ICogKE1vbm8gPj4gMTYpKTsgICAgICAgICAgICAgICAgICAgLyogc2lnbmVkIGxvbmcgKE1vbm8pIGJ5IHVuc2lnbmVkIHNob3J0IChBR0NfTXVsdCkgbXVsdGlwbHkgKi8KKyAgICAgICAgTG93V29yZCA9IChBR0NfTXVsdCAqIChNb25vICYgMHhmZmZmKSk7CisgICAgICAgIE1vbm8gPSAoSGlnaFdvcmQgKyAoTG93V29yZCA+PiAxNikpIDw8IChBR0NfR2FpblNoaWZ0KTsKKyAgICAgICAgTGVmdCAgKz0gTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCisgICAgICAgIFJpZ2h0ICs9IE1vbm87CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgSGlnaFdvcmQgPSAoVm9sX011bHQgKiAoTGVmdCA+PiAxNikpOyAgICAgICAgICAgICAgICAgICAvKiBzaWduZWQgbG9uZyAoTGVmdCkgYnkgdW5zaWduZWQgc2hvcnQgKFZvbF9NdWx0KSBtdWx0aXBseSAqLworICAgICAgICBMb3dXb3JkID0gKFZvbF9NdWx0ICogKExlZnQgJiAweGZmZmYpKTsKKyAgICAgICAgTGVmdCA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgKFZvbF9TaGlmdCk7CisgICAgICAgIEhpZ2hXb3JkID0gKFZvbF9NdWx0ICogKFJpZ2h0ID4+IDE2KSk7ICAgICAgICAgICAgICAgICAgLyogc2lnbmVkIGxvbmcgKFJpZ2h0KSBieSB1bnNpZ25lZCBzaG9ydCAoVm9sX011bHQpIG11bHRpcGx5ICovCisgICAgICAgIExvd1dvcmQgPSAoVm9sX011bHQgKiAoUmlnaHQgJiAweGZmZmYpKTsKKyAgICAgICAgUmlnaHQgPSAoSGlnaFdvcmQgKyAoTG93V29yZCA+PiAxNikpIDw8IChWb2xfU2hpZnQpOworICAgICAgICAqcERzdCsrID0gTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KKyAgICAgICAgKnBEc3QrKyA9IFJpZ2h0OworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgQWJzUGVhayA9IChBYnNfMzIoTGVmdCk+QWJzXzMyKFJpZ2h0KSkgPyBBYnNfMzIoTGVmdCkgOiBBYnNfMzIoUmlnaHQpOyAgLyogR2V0IHRoZSBhYnNvbHV0ZSBwZWFrICovCisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEhpZ2hXb3JkID0gKEFHQ19BdHRhY2sgKiAoQUdDX0dhaW4gPj4gMTYpKTsgICAgICAgICAvKiBzaWduZWQgbG9uZyAoQUdDX0dhaW4pIGJ5IHVuc2lnbmVkIHNob3J0IChBR0NfQXR0YWNrKSBtdWx0aXBseSAqLworICAgICAgICAgICAgTG93V29yZCA9IChBR0NfQXR0YWNrICogKEFHQ19HYWluICYgMHhmZmZmKSk7CisgICAgICAgICAgICBBR0NfR2FpbiA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5IDw8IERFQ0FZX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5IDw8IERFQ0FZX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gVm9sX1RDICogKChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpID4+IFZPTF9UQ19TSElGVCk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKKworICAgIHJldHVybjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI4YjgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisjaW5jbHVkZSAgICAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogQWJzXzMyKCkKKyAqICBJbnB1dCAgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogIE91dHB1dCAgICAgIDoKKyAqICBSZXR1cm5zICAgICA6IEFic29sdXRlIHZhbHVlCisgKiAgRGVzY3JpcHRpb24gOiBBYnNvbHV0ZSB2YWx1ZSB3aXRoIG1heGltdW0gbmVnYXRpdmUgdmFsdWUgY29ybmVyIGNhc2UKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyICAgIEFic18zMihMVk1fSU5UMzIgICAgaW5wdXQpCit7CisgICAgaWYoaW5wdXQgPCAgMCkKKyAgICB7CisgICAgICAgIGlmIChpbnB1dCA9PSAoTFZNX0lOVDMyKSgweDgwMDAwMDAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb3JuZXIgY2FzZSwgc28gc2V0IHRvIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlICovCisgICAgICAgICAgICBpbnB1dD0oTFZNX0lOVDMyKSAweDdmZmZmZmZmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLworICAgICAgICAgICAgaW5wdXQgPSAoTFZNX0lOVDMyKSgtaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3OGZlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQUREMl9TQVRfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFkZDJfU2F0XzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpICpzcmMpICsgKChMVk1fSU5UMzIpICpkc3QpOworICAgICAgICBzcmMrKzsKKworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMzU3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBBREQyX1NBVF8zMlgzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQWRkMl9TYXRfMzJ4MzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDMyIGEsYixjOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGE9KnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgYj0qZHN0OworICAgICAgICBjPWErYjsKKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGE8MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAqZHN0ID0gYzsKKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM1NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorCisKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgKFExNCkgKiAoeChuKUwgKFEwKSAtIHgobi0yKUwgKFEwKSApICkgIGluIFExNAorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogKCgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApICkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE0KTsgLy8geW5MIGluIFEwCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MTRhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzOworCisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXBDb2VmLT5CMjsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CisgIH0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MDUzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlBfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFhNDJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisKKworICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9IChBMCAoUTMwKSAqICh4KG4pTCAoUTApIC0geChuLTIpTCAoUTApICkgPj4xNCkgIGluIFExNgorICAgICAgICAgICAgdGVtcGw9IChMVk1fSU5UMzIpICpwRGF0YUluLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0sdGVtcGwseW5MLDE0KQorCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAoUTMwKSAqIHkobi0yKUwgKFExNikgKSA+PjMwKSBpbiBRMTYKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgKFEzMCkgKiB5KG4tMSlMIChRMTYpICkgPj4zMCkgaW4gUTE2CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNikoeW5MPj4xNik7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgzMzIxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQmFuZCBwYXNzIGZpbHRlciAoQklRVUFEKSAgICAgICAgICAgICAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIFRoZSBjb2VmZmljaWVudHMgYXJlIG1vZGlmaWVkIGluIHRoZSBpbml0KCkgZnVuY3Rpb24gc3VjaCB0aGF0IGxvd2VyICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBoYWxmIHdvcmQgaXMgcmlnaHQgc2hpZnRlZCBieSBvbmUgYW5kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBsb3dlciAgICAgICAgICAgICovCisvKiAgICAgICAgd29yZCBpcyBtYWRlIHRvIGJlIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFJlYXNvbjogRm9yIE1JUFMgZWZmY2llbmN5LHdlIGFyZSB1c2luZyBEU1AgMzIqMTYgbXVsdGlwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBpbnN0cnVjdGlvbi4gQnV0IHdlIGhhdmUgMzIqMzIgbXVsdGlwbGljYXRpb24uIFRoaXMgY2FuIGJlIHJlYWxpemVkIGJ5IHR3byAzMioxNiAgICAqLworLyogICAgICAgbXVsdGlwbGljYXRpb24uIEJ1dCAxNnRoIGJpdCBpbiB0aGUgMzIgYml0IHdvcmQgaXMgbm90IGEgc2lnbiBiaXQuIFNvIHRoaXMgaXMgZG9uZSAgKi8KKy8qICAgICAgIGJ5IHB1dHRpbmcgMTZ0aCBiaXQgdG8gemVybyBhbmQgbG9zc2luZyBvbmUgYml0IHByZWNpc2lvbiBieSBkaXZpc2lvbiBvZiBsb3dlciAgICAgICovCisvKiAgICAgICBoYWxmIHdvcmQgYnkgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9ICBwQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gIHBDb2VmLT5CMTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2E2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlBfMUlfRDE2RjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDljMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPSAoQTAgKFEzMCkgKiAoeChuKUwgKFEwKSAtIHgobi0yKUwgKFEwKSApID4+MzApICBpbiBRMAorICAgICAgICAgICAgdGVtcGw9KCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHRlbXBsLHluTCwzMCkKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgKFEzMCkgKiB5KG4tMilMIChRMCkgKSA+PjMwKSBpbiBRMAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApID4+MzApIGluIFEwCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NzkxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MxY2UyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfCisjZGVmaW5lIF9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qX0JQXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAyX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmOGM2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyIChRMTUpICogeChuLTIpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAoUTE1KSAqIHgobilMIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgKFExNSkgKiB5KG4tMilMIChRMCkgKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzNdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5MKz0gKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICB5bkw9eW5MPj4xNTsgLy8geW5MIGluIFEwIGZvcm1hdAorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMGMxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOWM2OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX0JRXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0JRXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNmNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgKFExNCkgKiB4KG4tMilMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgKFExNCkgKiB4KG4tMSlMIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTQpICogeChuKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoICgtQjIgKFExNCkgKiB5KG4tMilMIChRMTYpICk+PjE2KSBpbiBRMTQKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIxIChRMTQpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE0CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw8PDI7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMTYKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpKHluTD4+MTQpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorCisgICAgICAgIH0KKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWExMGYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKl9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZiZTRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgIExWTV9JTlQxNiB0ZW1wOworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOworCisgIHRlbXA9cENvZWYtPkEyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzJlNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD1BMiAoUTE0KSAqIHgobi0yKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAoUTE0KSAqIHgobi0xKUwgKFEwKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNCkgKiB4KG4pTCAoUTApIGluIFExNAorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICggLUIyIChRMTQpICogeShuLTIpTCAoUTApICkgaW4gUTE0CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07CisKKyAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgKFExNCkgKiB5KG4tMSlMIChRMCkgKSBpbiBRMTQKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworICAgICAgICAgICAgeW5MPXluTD4+MTQ7IC8vIHluTCBpbiBRMCBmb3JtYXQKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyIChRMTQpICogeChuLTIpUiAoUTApIGluIFExNAorICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgKFExNCkgKiB4KG4tMSlSIChRMCkgaW4gUTE0CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8vIHluUis9QTAgKFExNCkgKiB4KG4pUiAoUTApIGluIFExNAorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyIChRMTQpICogeShuLTIpUiAoUTApICkgaW4gUTE0CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgKFExNCkgKiB5KG4tMSlSIChRMCkgKSBpbiBRMTQKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworICAgICAgICAgICAgeW5SPXluUj4+MTQ7IC8vIHluTCBpbiBRMCBmb3JtYXQKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUiBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwCisKKworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTYzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgKFExNSkgKiB4KG4tMilMIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTEgKFExNSkgKiB4KG4tMSlMIChRMCkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAoUTE1KSAqIHkobi0yKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxIChRMTUpICogeShuLTEpTCAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKyAgICAgICAgICAgIHluTD15bkw+PjE1OyAvLyB5bkwgaW4gUTAgZm9ybWF0CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAoUTE1KSAqIHgobi0yKVIgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5blIrPUExIChRMTUpICogeChuLTEpUiAoUTApIGluIFExNQorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5blIrPUEwIChRMTUpICogeChuKVIgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAoUTE1KSAqIHkobi0yKVIgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxIChRMTUpICogeShuLTEpUiAoUTApICkgaW4gUTE1CisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKyAgICAgICAgICAgIHluUj15blI+PjE1OyAvLyB5bkwgaW4gUTAgZm9ybWF0CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIgaW4gUTAKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMAorCisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGFjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDE2IHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDJjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfQlFfMklfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICovCisgIExWTV9JTlQxNiAgICAgY29lZnNbNV07ICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGNjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExMyBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAoUTEzKSAqIHgobi0yKUwgKFEwKSBpbiBRMTMqLworICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExIChRMTMpICogeChuLTEpTCAoUTApIGluIFExMyovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwIChRMTMpICogeChuKUwgKFEwKSBpbiBRMTMqLworICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAoUTEzKSAqIHkobi0yKUwgKFExNikgKT4+MTYpIGluIFExMyAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAoUTEzKSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExMyAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKFExMykgKiB4KG4tMilSIChRMCkgaW4gUTEzKi8KKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExIChRMTMpICogeChuLTEpUiAoUTApIGluIFExMyovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgKFExMykgKiB4KG4pUiAoUTApIGluIFExMyovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyIChRMTMpICogeShuLTIpUiAoUTE2KSApPj4xNikgaW4gUTEzKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgKFExMykgKiB5KG4tMSlSIChRMTYpICk+PjE2KSBpbiBRMTMgKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHRlbXBsLDE2KQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SPDwzOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgaW4gUTE2Ki8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw8PDM7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluTD4+MTMpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluUj4+MTMpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmUyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgeW5MLHluUix0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyIChRMTQpICogeChuLTIpTCAoUTApIGluIFExNCovCisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgKFExNCkgKiB4KG4tMSlMIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTAgKFExNCkgKiB4KG4pTCAoUTApIGluIFExNCovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyIChRMTQpICogeShuLTIpTCAoUTE2KSApPj4xNikgaW4gUTE0ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxIChRMTQpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE0ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj1BMiAoUTE0KSAqIHgobi0yKVIgKFEwKSBpbiBRMTQqLworICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9QTEgKFExNCkgKiB4KG4tMSlSIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMCAoUTE0KSAqIHgobilSIChRMCkgaW4gUTE0Ki8KKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgKFExNCkgKiB5KG4tMilSIChRMTYpICk+PjE2KSBpbiBRMTQqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAoUTE0KSAqIHkobi0xKVIgKFExNikgKT4+MTYpIGluIFExNCAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI8PDI7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMIGluIFExNiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5MPj4xNCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5SPj4xNCk7IC8qIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NDFlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAoUTE1KSAqIHgobi0yKUwgKFEwKSBpbiBRMTUqLworICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKiB5bkwrPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNSovCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUqLworICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAoUTE1KSAqIHkobi0yKUwgKFExNikgKT4+MTYpIGluIFExNSAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAoUTE1KSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExNSAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgKFExNSkgKiB4KG4tMilSIChRMCkgaW4gUTE1Ki8KKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExIChRMTUpICogeChuLTEpUiAoUTApIGluIFExNSovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgKFExNSkgKiB4KG4pUiAoUTApIGluIFExNSovCisgICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyIChRMTUpICogeShuLTIpUiAoUTE2KSApPj4xNikgaW4gUTE1ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9KCAoLUIxIChRMTUpICogeShuLTEpUiAoUTE2KSApPj4xNikgaW4gUTE1ICovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SPDwxOyAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MTsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTE2Ki8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5blI+PjE1KTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwY2Y2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qIF9CUV8ySV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5MWVlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgIExWTV9JTlQxNiB0ZW1wOworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOworCisgIHRlbXA9cENvZWYtPkEyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIyOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDgyMTJlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisKKworICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx5blIsdGVtcGwsdGVtcGQ7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoIEEyIChRMzApICogeChuLTIpTCAoUTApICkgPj4zMCBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx5bkwsMzApCisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTEgKFEzMCkgKiB4KG4tMSlMIChRMCkgKSA+PiAzMCBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTAgKFEzMCkgKiB4KG4pTCAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1syXSwqcERhdGFJbix0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyIChRMzApICogeShuLTIpTCAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1szXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoLUIxIChRMzApICogeShuLTEpTCAoUTApICkgPj4gMzAgaW4gUTAgKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoIEEyIChRMzApICogeChuLTIpUiAoUTApICkgPj4gMzAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10seW5SLDMwKQorCisgICAgICAgICAgICAvKiB5blIrPSAoIEExIChRMzApICogeChuLTEpUiAoUTApICkgPj4gMzAgIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCBBMCAoUTMwKSAqIHgobilSIChRMCkgKSA+PiAzMCBpbiBRMCovCisgICAgICAgICAgICB0ZW1wZD0qKHBEYXRhSW4rMSk7CisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBkLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMiAoUTMwKSAqIHkobi0yKVIgKFEwKSApID4+IDMwIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHRlbXBsLDMwKQorICAgICAgICAgICAgeW5SKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAoUTMwKSAqIHkobi0xKVIgKFEwKSApID4+IDMwIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09KExWTV9JTlQzMil5blI7IC8qIFVwZGF0ZSB5KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT0oTFZNX0lOVDMyKXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMzIpeW5MOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMzIpeW5SOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwOWY3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDMyIHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7CisKKyAgdGVtcD1wQ29lZi0+QTI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QTA7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjI7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKKyAgdGVtcD1wQ29lZi0+QjE7CisgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2FmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXworI2RlZmluZSBfQlFfMklfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db21wTGltX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEyMWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfQ09NUF9MSU1fUFJJVkFURV8KKyNkZWZpbmUgX0NPTVBfTElNX1BSSVZBVEVfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbXBMaW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGU180OEsgICAgICA0ODAwMAorCisjZGVmaW5lIElOVEVHRVJfMTYgIDB4RkZGRiAvKiAgIDY1NTM1Ki8KKyNkZWZpbmUgSU5URUdFUl8xNSAgMHg3RkZGIC8qICAgMzI3NjcqLworCisjZGVmaW5lIEdBSU5fNkRCICAgIDEKKyNkZWZpbmUgR0FJTl8xMkRCICAgMgorI2RlZmluZSBHQUlOXzE4REIgICAzCisjZGVmaW5lIEdBSU5fMjREQiAgIDQKKworI2VuZGlmIC8qICNpZm5kZWYgX0NPTVBfTElNX1BSSVZBVEVfICovCisKKy8qKiogRW5kIG9mIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0MDRhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBDT1BZXzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3B5XzE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKHNyYyA+IGRzdCkKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjICs9IG4gLSAxOworICAgICAgICBkc3QgKz0gbiAtIDE7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgICAgIGRzdC0tOworICAgICAgICAgICAgc3JjLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjY5ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYSEFSRF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgVGVtcDEsVGVtcDIsVGVtcDM7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworCisgICAgQ3VycmVudDFTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudDEgPj4gMTYpOworICAgIEN1cnJlbnQyU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQyID4+IDE2KTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDE9KnNyYzErKzsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudDFTaG9ydCxUZW1wMywxNSkKKyAgICAgICAgVGVtcDI9KnNyYzIrKzsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDIsQ3VycmVudDJTaG9ydCxUZW1wMSwxNSkKKyAgICAgICAgVGVtcDI9KFRlbXAxPj4xKSsoVGVtcDM+PjEpOworICAgICAgICBpZiAoVGVtcDIgPiAweDNGRkZGRkZGKQorICAgICAgICAgICAgVGVtcDIgPSAweDdGRkZGRkZGOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0gMHg0MDAwMDAwMCkKKyAgICAgICAgICAgIFRlbXAyID0gIDB4ODAwMDAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyPShUZW1wMjw8MSk7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MWYwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgICBUZW1wMSxUZW1wMixUZW1wMzsKKyAgICBMVk1fSU5UMTYgICAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0lOVDMyICAgIEN1cnJlbnRUaW1lc0FscGhhOworICAgIExWTV9JTlQxNiAgICAgaWksamo7CisgICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0OworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIE1VTDMyeDMySU5UTzMyKCgweDdGRkZGRkZGLXBJbnN0YW5jZS0+QWxwaGEpLHBJbnN0YW5jZS0+VGFyZ2V0LFRhcmdldFRpbWVzT25lTWluQWxwaGEsMzEpOyAvKiBRMzEgKiBRMCBpbiBRMCAqLworICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpeworICAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPTI7IC8qIENlaWwqLworICAgIH0KKworICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpOyAgICAgICAvKiBRMCAqIFEzMSBpbiBRMCAqLworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7ICAgICAgICAgICAgICAgIC8qIFEwICsgUTAgaW50byBRMCovCisgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAxPSpzcmMrKzsKKyAgICAgICAgVGVtcDI9KmRzdDsKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAzLDE1KQorICAgICAgICBUZW1wMT0oVGVtcDI+PjEpKyhUZW1wMz4+MSk7CisKKyAgICAgICAgaWYgKFRlbXAxID4gMHgzRkZGRkZGRikKKyAgICAgICAgICAgIFRlbXAxID0gMHg3RkZGRkZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtIDB4NDAwMDAwMDApCisgICAgICAgICAgICBUZW1wMSA9ICAweDgwMDAwMDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBUZW1wMT0oVGVtcDE8PDEpOworICAgICAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpOyAgICAgICAvKiBRMCAqIFEzMSBpbiBRMCAqLworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7ICAgICAgICAgICAgICAgIC8qIFEwICsgUTAgaW50byBRMCovCisgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKKyAgICAgICAgVGVtcDE9KnNyYysrOworICAgICAgICBUZW1wMj0qZHN0OworICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDMsMTUpCisgICAgICAgIFRlbXAxPShUZW1wMj4+MSkrKFRlbXAzPj4xKTsKKworICAgICAgICBpZiAoVGVtcDEgPiAweDNGRkZGRkZGKQorICAgICAgICAgICAgVGVtcDEgPSAweDdGRkZGRkZGOworICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0gMHg0MDAwMDAwMCkKKyAgICAgICAgICAgIFRlbXAxID0gIDB4ODAwMDAwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAxPShUZW1wMTw8MSk7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5YzMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIExWTV9JTlQzMiAgVGVtcDEsVGVtcDI7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fSU5UMzIgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0lOVDMyICBDdXJyZW50VGltZXNBbHBoYTsKKyAgICBMVk1fSU5UMTYgQ3VycmVudFNob3J0OworICAgIExWTV9JTlQxNiBpaTsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBNVUwzMngzMklOVE8zMigoMHg3RkZGRkZGRi1wSW5zdGFuY2UtPkFscGhhKSxwSW5zdGFuY2UtPlRhcmdldCxUYXJnZXRUaW1lc09uZU1pbkFscGhhLDMxKSAvKiBRMzEgKiBRMzEgaW4gUTMxICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkKKyAgICB7CisgICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9MjsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3AhPTApCisgICAgeworICAgICAgICBNVUwzMngzMklOVE8zMihwSW5zdGFuY2UtPkN1cnJlbnQscEluc3RhbmNlLT5BbHBoYSxDdXJyZW50VGltZXNBbHBoYSwzMSkgIC8qIFEzMSAqIFEzMSBpbiBRMzEgKi8KKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOyAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAxPSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEluc3RhbmNlLT5DdXJyZW50LHBJbnN0YW5jZS0+QWxwaGEsQ3VycmVudFRpbWVzQWxwaGEsMzEpICAvKiBRMzEgKiBRMzEgaW4gUTMxICovCisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5DdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudFNob3J0LFRlbXAyLDE1KQorICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmYTE4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBMZWZ0REMsUmlnaHREQzsKKyAgICAgICAgTFZNX0lOVDMyIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTGVmdERDICA9ICAgcEJpcXVhZFN0YXRlLT5MZWZ0REM7CisgICAgICAgIFJpZ2h0REMgPSAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQzsKKyAgICAgICAgZm9yKGo9TnJTYW1wbGVzLTE7aj49MDtqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmPSoocERhdGFJbisrKS0oTGVmdERDPj4xNik7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDMyNzY3KSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IDMyNzY3OyB9CisgICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTMyNzY4KSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0zMjc2ODsgfQorICAgICAgICAgICAgKihwRGF0YU91dCsrKT0oTFZNX0lOVDE2KURpZmY7CisgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRDE2X1NURVA7IH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIExlZnREQyArPSBEQ19EMTZfU1RFUDsgfQorCisKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICBEaWZmPSoocERhdGFJbisrKS0oUmlnaHREQz4+MTYpOworICAgICAgICAgICAgaWYgKERpZmYgPiAzMjc2NykgeworICAgICAgICAgICAgICAgIERpZmYgPSAzMjc2NzsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0zMjc2OCkgeworICAgICAgICAgICAgICAgIERpZmYgPSAtMzI3Njg7IH0KKyAgICAgICAgICAgICoocERhdGFPdXQrKyk9KExWTV9JTlQxNilEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19EMTZfU1RFUDsgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyArPSBEQ19EMTZfU1RFUDsgfQorCisgICAgICAgIH0KKyAgICAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgPSAgIExlZnREQzsKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgPSAgIFJpZ2h0REM7CisKKworICAgIH0KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGE4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKwordm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCit7CisgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwOworICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWE0ZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworI2RlZmluZSBEQ19EMTZfU1RFUCAgICAgMHgyMDA7CisKKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLworICBMVk1fSU5UMzIgIFJpZ2h0REM7ICAgIC8qIFJpZ2h0REMgICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjBkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlBbGxQYXNzXzMyeDMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IERlbGF5T2Zmc2V0LCAgICAgICAgICAgICAgIC8qIFNpbXBsZSBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwQWxsUGFzc09mZnNldCwgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mICBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgQWxsUGFzc09mZnNldCA9ICpwQWxsUGFzc09mZnNldDsKKyAgICBMVk1fSU5UMzIgICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICAgYSxiLGM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKworICAgICAgICBNVUwzMngxNklOVE8zMihkZWxheVtBbGxQYXNzT2Zmc2V0XSwgY29lZmYsIHRlbXAsIDE1KQorICAgICAgICBhID0gdGVtcDsKKyAgICAgICAgYiA9IGRlbGF5W0RlbGF5T2Zmc2V0XTsKKyAgICAgICAgRGVsYXlPZmZzZXQrKzsKKworICAgICAgICBjID0gYSArIGI7CisgICAgICAgIGlmICgoKChjIF4gYSkgJiAoYyBeIGIpKSA+PiAzMSkgIT0gMCkgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRmw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmRzdCA9IGM7CisgICAgICAgIGRzdCsrOworCisKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoYywgLWNvZWZmLCB0ZW1wLCAxNSkKKyAgICAgICAgYSA9IHRlbXA7CisgICAgICAgIGIgPSBkZWxheVtBbGxQYXNzT2Zmc2V0XTsKKyAgICAgICAgYyA9IGEgKyBiOworICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpIT0wKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYoYSA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWxheVtBbGxQYXNzT2Zmc2V0XSA9IGM7CisgICAgICAgIEFsbFBhc3NPZmZzZXQrKzsKKworICAgICAgICAvKiBNYWtlIHRoZSBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKERlbGF5T2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGF5T2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBbGxQYXNzT2Zmc2V0ID49IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFsbFBhc3NPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcEFsbFBhc3NPZmZzZXQgPSBBbGxQYXNzT2Zmc2V0OworCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzMTgyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0lOVDE2ICAgdGVtcDsKKworICAgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgKyAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQzMikoKExWTV9JTlQzMikoKmRzdCkgLSAoTFZNX0lOVDMyKWRlbGF5W09mZnNldF0pID4+IDEpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheVdyaXRlXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheVdyaXRlXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5Y2RkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBEZWxheU1peF8xNngxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRGVsYXlXcml0ZV8zMihjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuKSAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKExWTV9JTlQxNikqcE9mZnNldDsKKworICAgIGZvciAoaT0wOyBpPG47IGkrKykKKyAgICB7CisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCisgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCisgICAgKnBPZmZzZXQgPSAoTFZNX1VJTlQxNilPZmZzZXQ7CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTc3MzYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYwpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQorICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUKKyAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQorICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisKKyAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLy8geW5MIGluIFEwIGZvcm1hdAorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYyNTJjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMTYgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgIHBJbnN0YW5jZTsKKyAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgICAgIHBUYXBzOworCisgIHRlbXA9cENvZWYtPkExOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7CisgIHRlbXA9cENvZWYtPkEwOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7CisgIHRlbXA9cENvZWYtPkIxOworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTZjYTgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyKiAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQxNiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0ZPXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWQ1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICB5bkwsdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiAgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExIChRMzEpICogeChuLTEpTCAoUTApID4+MzEgaW4gUTAKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdLHluTCwzMSkKKworICAgICAgICAgICAgLy8geW5MKz1BMCAoUTMxKSAqIHgobilMIChRMCkgPj4gMzEgaW4gUTAKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sKnBEYXRhSW4sdGVtcGwsMzEpCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTMxKSAqIHkobi0xKUwgKFEwKSApID4+IDMxIGluIFEwCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSx0ZW1wbCwzMSkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMzIpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAorICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZlNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgTFZNX0lOVDMyIHRlbXA7CisgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpICBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9JTlQzMiAqKSAgICBwVGFwczsKKworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhZDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKworLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLworLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KK3sKKyAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9RmlsdGVyX1N0YXRlOworCit0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOworCisjZW5kaWYgLyogX0ZPXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg4MDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FTU1VNUFRJT05TOgorQ09FRlMtCitwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5TaGlmdCAgICBpcyBTaGlmdCB2YWx1ZQorREVMQVlTLQorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTMwIGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDMyICAgVGVtcDsKKyAgICAgICAgTFZNX0lOVDMyICAgTmVnU2F0VmFsdWU7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBTaGlmdDsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIE5lZ1NhdFZhbHVlID0gTFZNX01BWElOVF8xNiArMTsKKyAgICAgICAgTmVnU2F0VmFsdWUgPSAtTmVnU2F0VmFsdWU7CisKKyAgICAgICAgU2hpZnQgPSBwQmlxdWFkU3RhdGUtPlNoaWZ0OworCisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLy8geW5MID1BMSAoUTE1KSAqIHgobi0xKUwgKFExNSkgaW4gUTMwCisgICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICAvLyB5blIgPUExIChRMTUpICogeChuLTEpUiAoUTE1KSBpbiBRMzAKKyAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworCisgICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFExNSkgaW4gUTMwCisgICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIC8vIHluUis9QTAgKFExNSkgKiB4KG4pTCAoUTE1KSBpbiBRMzAKKyAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKihwRGF0YUluKzEpKTsKKworCisgICAgICAgICAgICAvLyB5bkwgKz0gICgtQjEgKFExNSkgKiB5KG4tMSlMIChRMzApICkgaW4gUTMwCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxUZW1wLDE1KTsKKyAgICAgICAgICAgIHluTCArPVRlbXA7CisgICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgKFExNSkgKiB5KG4tMSlSIChRMzApICkgaW4gUTMwCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxUZW1wLDE1KTsKKyAgICAgICAgICAgIHluUiArPVRlbXA7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTMwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMTUKKworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXluUjsgLy8gVXBkYXRlIHkobi0xKVIgaW4gUTMwCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMTUKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKkFwcGx5IHNoaWZ0OiBJbnN0ZWFkIG9mIGxlZnQgc2hpZnQgb24gMTYtYml0IHJlc3VsdCwgcmlnaHQgc2hpZnQgb2YgKDE1LXNoaWZ0KSBpcyBhcHBsaWVkCisgICAgICAgICAgICAgIGZvciBiZXR0ZXIgU05SKi8KKyAgICAgICAgICAgIHluTCA9IHluTD4+KDE1LVNoaWZ0KTsKKyAgICAgICAgICAgIHluUiA9IHluUj4+KDE1LVNoaWZ0KTsKKworICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgIGlmKHluTCA+IExWTV9NQVhJTlRfMTYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeW5MID0gTFZNX01BWElOVF8xNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoeW5SID4gTFZNX01BWElOVF8xNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5blIgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsKKyAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5SOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5YzMyYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0xTaHhfQ29lZnNfdCAgICAgICAgKnBDb2VmKQoreworICBMVk1fSU5UMTYgdGVtcDsKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICB0ZW1wPXBDb2VmLT5BMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOworICB0ZW1wPXBDb2VmLT5BMDsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOworICB0ZW1wPXBDb2VmLT5CMTsKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOworCisgIHRlbXA9cENvZWYtPlNoaWZ0OworICBwQmlxdWFkU3RhdGUtPlNoaWZ0ID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NDA3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgICAgICpwRGVsYXlzOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMTYgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgIExWTV9JTlQxNiAgICAgU2hpZnQ7ICAgICAgICAgIC8qIFNoaWZ0IHZhbHVlKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzMmRmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZJTFRFUlNfSAorI2RlZmluZSBGSUxURVJTX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSwgQTIsIEIxIGFuZCBCMiBjb2VmZmljaWVudHMKKyAqLworLyogU2luZ2xlIHByZWNpc2lvbiAoMTYtYml0KSBCaXF1YWQgc2VjdGlvbiBjb2VmZmljaWVudHMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgICAgIExWTV9JTlQxNiAgIEEwOworICAgICAgICBMVk1fSU5UMTYgICBBMTsKKyAgICAgICAgTFZNX0lOVDE2ICAgQTI7CisgICAgICAgIExWTV9JTlQxNiAgIEIxOworICAgICAgICBMVk1fSU5UMTYgICBCMjsKKyAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CisKKworLyoKKyAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEgYW5kIEIxIGNvZWZmaWNpZW50cworICovCisvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgTFZNX0lOVDE2ICAgQTA7CisgICAgICAgIExWTV9JTlQxNiAgIEExOworICAgICAgICBMVk1fSU5UMTYgICBCMTsKKyAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Cit9IEJpcXVhZEEwMUIxQ29lZnNTUF90OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIEZJTFRFUlNfSCAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3NWU4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiAgRnJvbTJpVG9NU18xNngxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRnJvbTJpVG9NU18xNngxNiggY29uc3QgTFZNX0lOVDE2ICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQzMiB0ZW1wMSxsZWZ0LHJpZ2h0OworICAgIExWTV9JTlQxNiBpaTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGxlZnQgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIHJpZ2h0ID0gKExWTV9JTlQzMikqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQrcmlnaHQpPj4xOworICAgICAgICAqZHN0TSA9IChMVk1fSU5UMTYpdGVtcDE7CisgICAgICAgIGRzdE0rKzsKKworICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KKyAgICAgICAgdGVtcDEgPSAgKGxlZnQtcmlnaHQpPj4xOworICAgICAgICAqZHN0UyA9IChMVk1fSU5UMTYpdGVtcDE7CisgICAgICAgIGRzdFMrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRnJvbTJpVG9Nb25vXzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGcm9tMmlUb01vbm9fMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgVGVtcDsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0gKExWTV9JTlQzMikqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICAqZHN0ICA9IChMVk1fSU5UMTYpKFRlbXAgPj4xKTsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiMjkyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIFRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7CisgICAgICAgIHNyYysrOworCisgICAgICAgICpkc3QgPSBUZW1wOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFkZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19Jbml0KCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICBTdGFydEFkZHIgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIGluc3RhbmNlIG1lbW9yeQorICogIFJldHVybnMgICAgIDogRXJyb3IgY29kZQorICogIERlc2NyaXB0aW9uIDogSW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlIGRpc3RyaWJ1dGlvbiBhbmQgbWVtb3J5IHNpemUgY2FsY3VsYXRpb24gZnVuY3Rpb24KKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdCggSU5TVF9BTExPQyAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKlN0YXJ0QWRkciApCit7CisgICAgcG1zLT5Ub3RhbFNpemUgPSAzOworICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7LyogVGhpcyBjb2RlIHdpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gYWRkcmVzcyBzcGFjZSBpcyBtb3JlIHRoYW4gMzItYml0cyovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19BZGRNZW1iZXIoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFNpemUgLSBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmV3IGFkZGVkIG1lbWJlcgorICogIFJldHVybnMgICAgIDogQSBwb2ludGVyIHRvIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgRGVzY3JpcHRpb24gOiBBbGxvY2F0ZXMgc3BhY2UgZm9yIGEgbmV3IG1lbWJlciBpbiB0aGUgaW5zdGFuY2UgbWVtb3J5IGFuZCByZXR1cm5zCisgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gdGhpcyBuZXcgbWVtYmVyLiAgVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYWxsIG1lbWJlcnMgd2lsbAorICAgICAgICAgICAgICAgICAgYmUgMzIgYml0IGFsbGlnbmVkLgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXIoIElOU1RfQUxMT0MgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICBTaXplICkKK3sKKyAgICB2b2lkICpOZXdNZW1iZXJBZGRyZXNzOyAvKiBWYXJpYWJsZSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlICovCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9ICh2b2lkKilwbXMtPnBOZXh0TWVtYmVyOworCisgICAgU2l6ZSA9ICgoU2l6ZSArIDMpICYgMHhGRkZGRkZGQyk7IC8qIENlaWwgdGhlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBmb3VyICovCisKKyAgICBwbXMtPlRvdGFsU2l6ZSArPSBTaXplOworICAgIHBtcy0+cE5leHRNZW1iZXIgKz0gU2l6ZTsKKworICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKKyAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCisgKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcykKK3sKKyAgICBpZiAocG1zLT5Ub3RhbFNpemUgPiAzKQorICAgIHsKKyAgICAgICAgcmV0dXJuKHBtcy0+VG90YWxTaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBObyBtZW1vcnkgYWRkZWQgKi8KKyAgICB9Cit9CisKKwordm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUpCit7CisgICAgTFZNX1VJTlQzMiBTdGFydEFkZHI7CisKKyAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1swXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKworCisgICAgU3RhcnRBZGRyID0gKExWTV9VSU5UMzIpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoTFZNX1VJTlQzMikoKChMVk1fVUlOVDMyKVN0YXJ0QWRkciArIDMpICYgMHhGRkZGRkZGQyk7CisKKworICAgIFN0YXJ0QWRkciA9IChMVk1fVUlOVDMyKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKExWTV9VSU5UMzIpKCgoTFZNX1VJTlQzMilTdGFydEFkZHIgKyAzKSAmIDB4RkZGRkZGRkMpOworCisKKyAgICBTdGFydEFkZHIgPSAoTFZNX1VJTlQzMilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1szXS5wTmV4dE1lbWJlciA9IChMVk1fVUlOVDMyKSgoKExWTV9VSU5UMzIpU3RhcnRBZGRyICsgMykgJiAweEZGRkZGRkZDKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXRBbGxfTlVMTCgpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byBhcnJheSBvZiBmb3VyIElOU1RfQUxMT0MgaW5zdGFuY2VzCisgKiAgUmV0dXJucyAgICAgOiBOb3RoaW5nCisgKiAgRGVzY3JpcHRpb24gOiBUaGlzIGZ1bmN0aW9uIHJlc2VydmVzIFNpemUgb2YgMyBieXRlcyBmb3IgYWxsIG1lbW9yeSByZWdpb25zIGFuZAorICogICAgICAgICAgICAgICAgaW50aWFsaXplcyBwTmV4dE1lbWJlciBmb3IgYWxsIHJlZ2lvbnMgdG8gMAorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsX05VTEwoIElOU1RfQUxMT0MgICpwbXMpCit7CisgICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gMDsKKworCisgICAgcG1zWzFdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gMDsKKworICAgIHBtc1syXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1syXS5wTmV4dE1lbWJlciA9IDA7CisKKyAgICBwbXNbM10uVG90YWxTaXplID0gMzsKKyAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAwOworCit9CisKKwordm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICAgU2l6ZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAqcE1lbW9yeVRhYmxlKQoreworICAgIHZvaWQgKk5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KKworICAgIC8qIGNvdmVyaXR5W3JldHVybmVkX3BvaW50ZXJdIElnbm9yZSBjb3Zlcml0eSB3YXJuaW5nIHRoYXQgcHRyIGlzIG5vdCB1c2VkICovCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX1NMT1dfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgTmV3TWVtYmVyQWRkcmVzcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdLCBTaXplW0xWTV9URU1QT1JBUllfRkFTVF0pOworCisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgICAgICAgICAgPSBMVk1fVEVNUE9SQVJZX0ZBU1Q7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgICAgICAgICA9IExWTV9OVUxMOworCisgICAgcmV0dXJuKE5ld01lbWJlckFkZHJlc3MpOworfQorCisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cikKK3sKKyAgICBwdHJbMF0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwdHJbMV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwdHJbMl0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKKyAgICBwdHJbM10gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSwgU2l6ZVtMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKKworICAgIHJldHVybiAocHRyWzBdKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwOWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIElOVDE2TFNISUZUVE9JTlQzMl8xNlgzMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKGNvbnN0IExWTV9JTlQxNiAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgIHNoaWZ0ICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmMgKz0gbi0xOworICAgIGRzdCArPSBuLTE7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSAoICgoTFZNX0lOVDMyKSpzcmMpIDw8IHNoaWZ0KTsKKyAgICAgICAgc3JjLS07CisgICAgICAgIGRzdC0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5OTgwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBJTlQzMlJTSElGVFRPSU5UMTZfU0FUXzMyWDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBJbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2KGNvbnN0IExWTV9JTlQzMiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2hpZnQgKQoreworICAgIExWTV9JTlQzMiB0ZW1wOworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICpzcmMgPj4gc2hpZnQ7CisgICAgICAgIHNyYysrOworCisgICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7CisgICAgICAgIH0KKworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5MzhiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSm9pblRvMmlfMzJ4MzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEpvaW5UbzJpXzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmNMICs9IG4tMTsKKyAgICBzcmNSICs9IG4tMTsKKyAgICBkc3QgICs9ICgoMipuKS0xKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmNSOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjUi0tOworCisgICAgICAgICpkc3QgPSAqc3JjTDsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY0wtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzOWI5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKK3sKKyAgICBMVk1fSU5UMzIgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKworICAgIEN1cnJlbnQxU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UxLT5DdXJyZW50ID4+IDE2KTsKKyAgICBDdXJyZW50MlNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMi0+Q3VycmVudCA+PiAxNik7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudDFTaG9ydCk+PjE1OworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0lOVDE2KVRlbXA7CisKKyAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50MlNob3J0KT4+MTU7CisgICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgKmRzdCsrID0gLSAweDgwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICB9CisKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhZjc0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDb3JlX01JWEhBUkRfMlNUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMzIgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OworICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKworICAgIEN1cnJlbnQxU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UxLT5DdXJyZW50ID4+IDE2KTsKKyAgICBDdXJyZW50MlNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMi0+Q3VycmVudCA+PiAxNik7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIFRlbXAgPSAoKChMVk1fSU5UMzIpKihzcmMxKyspICogKExWTV9JTlQzMilDdXJyZW50MVNob3J0KT4+MTUpICsKKyAgICAgICAgICAgICAgICgoKExWTV9JTlQzMikqKHNyYzIrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnQyU2hvcnQpPj4xNSk7CisgICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKKyAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgKmRzdCsrID0gLSAweDgwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWEwOTUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQxNiAgIEN1cnJlbnRTaG9ydDsKKyAgICBMVk1fSU5UMzIgICBpaSxqajsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9JTlQzMiAgIERlbHRhPXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0lOVDMyICAgQ3VycmVudD1wSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0PXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9JTlQzMiAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudDxUYXJnZXQpeworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50LERlbHRhLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNleworICAgICAgICBpZiAoT3V0TG9vcCl7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqIT0wIDsgamotLSl7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSpkc3QpICsgKCgoTFZNX0lOVDMyKSooc3JjKyspICogQ3VycmVudFNob3J0KT4+MTUpOyAgICAgIC8qIFExNSArIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtIDB4ODAwMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWVjNDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0TDsKKyAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnRSOworICAgIExWTV9JTlQzMiAgIGlpOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlTD0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZVI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKyAgICBMVk1fSU5UMzIgICBEZWx0YUw9cEluc3RhbmNlTC0+RGVsdGE7CisgICAgTFZNX0lOVDMyICAgQ3VycmVudEw9cEluc3RhbmNlTC0+Q3VycmVudDsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXRMPXBJbnN0YW5jZUwtPlRhcmdldDsKKworICAgIExWTV9JTlQzMiAgIERlbHRhUj1wSW5zdGFuY2VSLT5EZWx0YTsKKyAgICBMVk1fSU5UMzIgICBDdXJyZW50Uj1wSW5zdGFuY2VSLT5DdXJyZW50OworICAgIExWTV9JTlQzMiAgIFRhcmdldFI9cEluc3RhbmNlUi0+VGFyZ2V0OworCisgICAgTFZNX0lOVDMyICAgVGVtcDsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBpZiAoT3V0TG9vcCkKKyAgICB7CisgICAgICAgIGlmKEN1cnJlbnRMPFRhcmdldEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRMLERlbHRhTCxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50TD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UjxUYXJnZXRSKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50UixEZWx0YVIsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgQ3VycmVudFI9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisKKyAgICAgICAgQ3VycmVudFNob3J0TCA9IChMVk1fSU5UMTYpKEN1cnJlbnRMPj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKyAgICAgICAgQ3VycmVudFNob3J0UiA9IChMVk1fSU5UMTYpKEN1cnJlbnRSPj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCoyOyBpaSAhPSAwOyBpaS09MikKKyAgICAgICAgeworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wKjI7IGlpICE9IDA7IGlpLT0yKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEw8VGFyZ2V0TCkKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudEwsRGVsdGFMLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KKyAgICAgICAgICAgIEN1cnJlbnRMPVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSPFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRSLERlbHRhUixUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50Uj1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKworICAgICAgICBDdXJyZW50U2hvcnRMID0gKExWTV9JTlQxNikoQ3VycmVudEw+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworICAgICAgICBDdXJyZW50U2hvcnRSID0gKExWTV9JTlQxNikoQ3VycmVudFI+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLworCisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7CisgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7CisgICAgfQorICAgIHBJbnN0YW5jZUwtPkN1cnJlbnQ9Q3VycmVudEw7CisgICAgcEluc3RhbmNlUi0+Q3VycmVudD1DdXJyZW50UjsKKworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhOWNhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnQ7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fSU5UMzIgICBEZWx0YT1wSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQ9cEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9JTlQzMiAgIFRhcmdldD1wSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fSU5UMzIgICBUZW1wOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCisgICAgICAgICAgICBDdXJyZW50PVRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KKworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOyAgICAvKiBRMTUqUTE1Pj4xNSBpbnRvIFExNSAqLworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCisKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1MmRkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fSU5UMzIgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZihuPD0wKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDB4N0ZGRkZGRkYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgaWYocEluc3RhbmNlLT5TaGlmdCE9MCl7CisgICAgICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlLT5TaGlmdCxzcmMsc3JjLG4pOworICAgICAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNikgPT0gMHg3RkZGKXsKKyAgICAgICAgICAgICAgICBpZihwSW5zdGFuY2UtPlNoaWZ0IT0wKQorICAgICAgICAgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxzcmMsbik7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfMTZ4MTYoIHNyYywgZHN0LCBuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApCisgICAgICAgICAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLHNyYyxuKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfMTZ4MTYoc3JjLChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNiksZHN0LG4pOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0M2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCl8fChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UxLT5EZWx0YSA9PSAweDdGRkZGRkZGKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UxLT5UYXJnZXQ+PjE2OyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0LCBubyBpbnRlZ2VyIHBhcnQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEFic18zMihwSW5zdGFuY2UxLT5DdXJyZW50LXBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlMS0+VGFyZ2V0Pj4xNjsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCwgbm8gaW50ZWdlciBwYXJ0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZTItPkRlbHRhID09IDB4N0ZGRkZGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTItPlRhcmdldD4+MTY7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQsIG5vIGludGVnZXIgcGFydAorICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZTItPkN1cnJlbnQtcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UyLT5UYXJnZXQ+PjE2OyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0LCBubyBpbnRlZ2VyIHBhcnQKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpCisgICAgeworICAgICAgICBpZiAoKChwSW5zdGFuY2UxLT5UYXJnZXQ+PjE2KSA9PSAweDdGRkYpJiYoKHBJbnN0YW5jZTItPlRhcmdldD4+MTYpID09IDB4N0ZGRikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfMTYoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzXzMyKHBJbnN0YW5jZTEtPkN1cnJlbnQtcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UxLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UxLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSxUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzXzMyKHBJbnN0YW5jZTItPkN1cnJlbnQtcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UyLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UyLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSxUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spICggcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBHZW5lcmFsUHVycG9zZSxwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGNhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZNaXhlcjNfTUlYU09GVF8xU1RfRDE2QzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYobjw9MCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQorICAgIHsKKyAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAweDdGRkZGRkZGKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic18zMihwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApeworICAgICAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLGRzdCxuKTsKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIGRzdCwgZHN0LCBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0XzE2KDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYocEluc3RhbmNlLT5TaGlmdCE9MCl7CisgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxkc3Qsbik7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNikgIT0gMHg3RkZGKQorICAgICAgICAgICAgICAgIE11bHQzc18xNngxNiggZHN0LCAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlRhcmdldD4+MTYpLCBkc3QsIG4gKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSAhPSAweDdGRkYpCisgICAgICAgICAgICAgICAgTXVsdDNzXzE2eDE2KCBzcmMsIChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNiksIGRzdCwgbiApOworICAgICAgICAgICAgZWxzZSBpZihzcmMhPWRzdCkKKyAgICAgICAgICAgICAgICBDb3B5XzE2KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKEFic18zMihwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAorICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MDcwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKK3sKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkmJihwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkmJihwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKXsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwgbik7CisgICAgfQorICAgIGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3Rfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggKExWTWl4ZXIzXzFTdF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICBIQVJEIE1JWElORworICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZihwSW5zdGFuY2UyLT5TaGlmdCE9MCkKKyAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZTItPlNoaWZ0LHNyYzIsc3JjMixuKTsKKyAgICAgICAgaWYocEluc3RhbmNlMS0+U2hpZnQhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZTEtPlNoaWZ0LHNyYzEsZHN0LG4pOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgZHN0LCBzcmMyLCBkc3QsIG4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwYzc4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZDX01JWEVSX0hfXworI2RlZmluZSBfX0xWQ19NSVhFUl9IX18KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExWTWl4ZXIzX3N0IHN0cnVjdHVyZSBzdG9yZXMgSW5zdGFuY2UgcGFyYW1ldGVycyBmb3Igb25lIGF1ZGlvIHN0cmVhbSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fSU5UMzIgICAgICAgUHJpdmF0ZVBhcmFtc1s0XTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgQXVkaW8gU3RyZWFtICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrU2V0OyAgICAgICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCisgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCisgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK30gTFZNaXhlcjNfc3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK30gTFZNaXhlcjNfMVN0X3N0OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTWl4ZXIzX3N0ICAgICBNaXhlclN0cmVhbVsyXTsgICAgLyogSW5zdGFuY2UgUGFyYW1zIGZvciB0d28gQXVkaW8gU3RyZWFtcyAqLworfSBMVk1peGVyM18yU3Rfc3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzNdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHRocmVlIEF1ZGlvIFN0cmVhbXMgKi8KK30gTFZNaXhlcjNfM1N0X3N0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoSElHSCBMRVZFTCBGVU5DVElPTlMpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRnVuY3Rpb24gbmFtZXMgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gZmlyc3QgMTYgY2hhcmFjdGVycyAgKi8KKyNkZWZpbmUgICAgTFZNaXhlcjNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCAgIExWTWl4ZXIzXzFTdF9EMTZDMzFfU0FUX01peFNvZnQKKyNkZWZpbmUgICAgTFZNaXhlcjNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQgICAgIExWTWl4ZXIzX0QxNkMzMV9TQVRfTWl4SW5Tb2Z0CisjZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfMlN0X0QxNkMzMV9TQVQgICBMVk1peGVyM18yU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisjZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfM1N0X0QxNkMzMV9TQVQgICBMVk1peGVyM18zU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisKKworLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyB0aW1lIGNvbnN0YW50IGNhbGN1bGF0aW9uIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIG1peGVyIHdpbGwgYmUgY2FsbGVkIHdpdGggICovCisvKiBsYXJnZSBibG9jayBzaXplcy4gV2hlbiB0aGUgYmxvY2sgc2l6ZSBpcyBzbWFsbCwgZXNwZWNpYWxseSBpZiBsZXNzIHRoYW4gNCwgICAgKi8KKy8qIHRoZW4gdGhlIGNhbGN1bGF0aW9uIHdpbGwgZ2l2ZSBhbiBpbmNvcnJlY3QgdmFsdWUgZm9yIGFscGhhLCBzZWUgdGhlIG1peGVyICAgICAqLworLyogZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2Fpbik7CisKK0xWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19zdCAqcFN0cmVhbSk7CisKK0xWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOworCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKTsKKwordm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7CisKK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworCisvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOworCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgYXBwbHlpbmcgZGlmZmVyZW50IGdhaW5zIHRvIExlZnQgYW5kIHJpZ2h0IGNoZW5uYWxzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE1peGVyU3RyZWFtWzBdIGFwcGxpZXMgdG8gTGVmdCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWl4ZXJTdHJlYW1bMV0gYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLy8jaWZuZGVmIF9fTFZDX01JWEVSX0hfXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFlMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTWl4ZXIzX0dldEN1cnJlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0lOVDMyICAgICAgIEN1cnJlbnRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgQ3VycmVudEdhaW49cEluc3RhbmNlLT5DdXJyZW50Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0CisgICAgcmV0dXJuIEN1cnJlbnRHYWluOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMmY4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfR2V0VGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUYXJnZXRHYWluICAgICAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9JTlQzMiAgICAgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisKKyAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKKworICAgIHJldHVybiBUYXJnZXRHYWluOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5ZTdiMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGludGlhbGl6YXRpb24gZnVuY3Rpb24gaW50aWFsaXplcyB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAgICAgICAgICovCisvKiAgcGFyYW10ZXJzIGZvciBhIGdpdmVuIEF1ZGlvIFN0cmVhbSBiYXNlZCBvbiBUYXJnZXRHYWluIGFuZCAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhY2x1bGF0ZXMgdGhlICJTaGlmdCIgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0IG9mIFRhcmdldEdhaW4gYW5kIGZyYWN0aW9uYWwgZ2FpbiB2YWx1ZXMgIlRhcmdldCIgYW5kICAqLworLyogICJDdXJyZW50IiBiYXNlZCBvbiBtYXhpbXVtKFRhcmdldEdhaW4sQ3VycmVudEdhaW4pICAgICAgICAgICAgICAgICAgKi8KKy8qICBFLmcuIEN1cnJlbnRHYWluPTEuOSBhbmQgVGFyZ2V0R2Fpbj0yLjUgdGhlbiBiYXNlZCBvbiAgICAgICAgICAgICAgICovCisvKiAgTWF4R2FpbiBvZiAyLjUsIFNoaWZ0ID0gMiwgQ3VycmVudD0xLjkvND0wLjQ3NSwgVGFyZ2V0PTIuNS80PTAuNjI1ICAqLworLyogIFRoZXJlZm9yZSBpbnRlZ2VyIGdhaW4gb2YgNCBpcyBwcm92aWRlZCBieSBMZWZ0IFNoaWZ0IG9mIDIgYW5kICAgICAgKi8KKy8qICBmcmFjdGlvbiBnYWluIGlzIHByb3ZpZGVkIHRocm91Z2ggQ3VycmVudD0wLjQ3NSBhbmQgVGFyZ2V0PTAuNjI1ICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgIC0gcHRyIHRvIEluc3RhbmNlIFBhcmFtZXRlciBTdHJ1Y3R1cmUgTFZNaXhlcjNfc3QgZm9yIGFuKi8KKy8qICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKQoreworICAgIExWTV9JTlQxNiAgICAgICBTaGlmdD0wOworICAgIExWTV9JTlQzMiAgICAgICBNYXhHYWluPVRhcmdldEdhaW47ICAgICAgICAgLy8gTWF4R2FpbiBpcyBpbiBRMTYuMTUgZm9ybWF0CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZihDdXJyZW50R2Fpbj5NYXhHYWluKQorICAgICAgICBNYXhHYWluPUN1cnJlbnRHYWluOyAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2Fpbj1tYXgoQ3VycmVudEdhaW4sVGFyZ2V0R2FpbikKKworICAgIE1heEdhaW49TWF4R2Fpbj4+MTU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpbiBRMzEuMCBmb3JtYXQgaS5lIEludGVnZXIgcGFydCBvbmx5CisgICAgd2hpbGUoTWF4R2Fpbj4wKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQgcmVxdWlyZWQgdG8gcHJvdmlkZSBpbnRlZ2VyIGdhaW4KKyAgICAgICAgU2hpZnQrKzsKKyAgICAgICAgTWF4R2Fpbj1NYXhHYWluPj4xOworICAgIH0KKyAgICBwSW5zdGFuY2UtPlRhcmdldD1UYXJnZXRHYWluPDwoMTYtU2hpZnQpOyAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKKyAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTRlMDVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXworI2RlZmluZSBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qIEluc3RhbmNlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgLyogMzIgYml0IG51bWJlciBzcGVjaWZ5aW5nIGZyYWN0aW9uYWwgdmFsdWUgb2YgVGFyZ2V0IEdhaW4gKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQ7ICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyBmcmFjdGlvbmFsIHZhbHVkZSBvZiBDdXJyZW50IEdhaW4gKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0OyAgICAgICAgICAgICAgICAgIC8qIExlZnQgU2hpZnQgZm9yIEludGVnZXIgcGFydCBvZiBHYWluICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBEZWx0YTsgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgbnVtYmVyIHNwZWNpZnlpbmcgdGhlIGZyYWN0aW9uYWwgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLworfSBNaXhfUHJpdmF0ZV9zdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExWQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCAgICBMVkNvcmVfSW5Tb2Z0X0QzMkMzMV9TQVQKKyNkZWZpbmUgTFZDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEgIExWQ29yZV9Tb2Z0XzFTdF9EMzJDMzFfV1JBCisjZGVmaW5lIExWQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUICBMVkNvcmVfSGFyZF8yU3RfRDMyQzMxX1NBVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgICpwSW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogcHRySW5zdGFuY2UxIGFwcGxpZXMgdG8gTGVmdCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBwdHJJbnN0YW5jZTEgYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KKworCisKKy8qKiogMzIgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYgLy8jaWZuZGVmIF9fTFZDX01JWEVSX1BSSVZBVEVfSF9fCisKKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZhNTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTWl4ZXIzX1NldFRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBwcml2YXRlIGluc3RhbmNlIHBhcmFtZXRlcnM6IFNoaWZ0LFRhcmdldCwqLworLyogIEN1cnJlbnQgZm9yIGEgZ2l2ZW4gQXVkaW8gU3RyZWFtIGJhc2VkIG9uIG5ldyB2YWx1ZSBvZiBUYXJnZXRHYWluICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYWNsdWxhdGVzIHRoZSAiU2hpZnQiIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhlICAgICAgICAqLworLyogIGludGVnZXIgcGFydCBvZiBUYXJnZXRHYWluIGFuZCBmcmFjdGlvbmFsIGdhaW4gdmFsdWVzICJUYXJnZXQiIGFuZCAgKi8KKy8qICAiQ3VycmVudCIgYmFzZWQgb24gbWF4aW11bShUYXJnZXRHYWluLEN1cnJlbnRHYWluKSAgICAgICAgICAgICAgICAgICovCisvKiAgRS5nLiBDdXJyZW50R2Fpbj0xLjkgYW5kIFRhcmdldEdhaW49Mi41IHRoZW4gYmFzZWQgb24gICAgICAgICAgICAgICAqLworLyogIE1heEdhaW4gb2YgMi41LCBTaGlmdCA9IDIsIEN1cnJlbnQ9MS45LzQ9MC40NzUsIFRhcmdldD0yLjUvND0wLjYyNSAgKi8KKy8qICBUaGVyZWZvcmUgaW50ZWdlciBnYWluIG9mIDQgaXMgcHJvdmlkZWQgYnkgTGVmdCBTaGlmdCBvZiAyIGFuZCAgICAgICovCisvKiAgZnJhY3Rpb24gZ2FpbiBpcyBwcm92aWRlZCB0aHJvdWdoIEN1cnJlbnQ9MC40NzUgYW5kIFRhcmdldD0wLjYyNSAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAgICAgLSBwdHIgdG8gSW5zdGFuY2UgUGFyYW1ldGVyIFN0cnVjdHVyZSBMVk1peGVyM19zdCAgICovCisvKiAgICAgICAgICAgICAgICAgICAgZm9yIGFuIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRhcmdldEdhaW4gICAgICAtIFRhcmdldEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4pCit7CisgICAgTFZNX0lOVDMyICAgICAgIFNoaWZ0PTA7CisgICAgTFZNX0lOVDMyICAgICAgIEN1cnJlbnRHYWluOworICAgIExWTV9JTlQzMiAgICAgICBNYXhHYWluPVRhcmdldEdhaW47ICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpcyBpbiBRMTYuMTUgZm9ybWF0CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBDdXJyZW50R2Fpbj1wSW5zdGFuY2UtPkN1cnJlbnQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIEN1cnJlbnRHYWluIGluIFExNi4xNSBmb3JtYXQKKyAgICBpZihDdXJyZW50R2Fpbj5NYXhHYWluKQorICAgICAgICBNYXhHYWluPUN1cnJlbnRHYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2Fpbj1tYXgoQ3VycmVudEdhaW4sVGFyZ2V0R2FpbikKKworICAgIE1heEdhaW49TWF4R2Fpbj4+MTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4R2FpbiBpbiBRMzEuMCBmb3JtYXQgaS5lIEludGVnZXIgcGFydCBvbmx5CisgICAgd2hpbGUoTWF4R2Fpbj4wKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQgcmVxdWlyZWQgdG8gcHJvdmlkZSBpbnRlZ2VyIGdhaW4KKyAgICAgICAgU2hpZnQrKzsKKyAgICAgICAgTWF4R2Fpbj1NYXhHYWluPj4xOworICAgIH0KKyAgICBwSW5zdGFuY2UtPlRhcmdldD1UYXJnZXRHYWluPDwoMTYtU2hpZnQpOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmcmFjdGlvbmFsIGdhaW4gVGFyZ2V0CisgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnRHYWluPDwoMTYtU2hpZnQpOyAgICAgICAgICAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIEN1cnJlbnQKKyAgICBwSW5zdGFuY2UtPlNoaWZ0PVNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBTaGlmdAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWM4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCisvKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KKy8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCisvKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCisvKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDMyICAgRGVsdGFUYWJsZVs5XT17MTA3Mzc0MTgyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NzkxMzIzODksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE1ODI3ODgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNjg3MDkxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzODk1NjYxOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU3OTEzOTQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2ODQzNTQ1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ3ODMwOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4OTU2OTcxfTsKKyAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIExWTV9JTlQzMiAgIERlbHRhPURlbHRhVGFibGVbRnNdOworICAgIERlbHRhPURlbHRhPj4oTnVtQ2hhbm5lbHMtMSk7CisKKyAgICBpZihUY19taWxsaXNlYz09MCkKKyAgICAgICAgRGVsdGE9MHg3RkZGRkZGRjsKKyAgICBlbHNlCisgICAgICAgIERlbHRhPURlbHRhL1RjX21pbGxpc2VjOworCisgICAgaWYoRGVsdGE9PTApCisgICAgICAgIERlbHRhPTE7ICAgICAgICAgICAgICAgIC8vIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YQorCisgICAgcEluc3RhbmNlLT5EZWx0YT1EZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpIGluIFEgMC4zMSBmb3JtYXQKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUzMDRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCisvKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KKy8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCisvKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCisvKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQoreworICAgIExWTV9JTlQzMiAgIERlbHRhVGFibGVbOV09ezEwNzM3NDE4MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzc5MTMyMzg5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNTgyNzg4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzY4NzA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5NTY2MTk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1NzkxMzk0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjg0MzU0NTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NzgzMDk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODk1Njk3MX07CisgICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fSU5UMzIgICBEZWx0YT1EZWx0YVRhYmxlW0ZzXTsKKworICAgIExWTV9JTlQzMiAgIEN1cnJlbnQ7CisgICAgTFZNX0lOVDMyICAgVGFyZ2V0OworCisgICAgRGVsdGE9RGVsdGE+PihOdW1DaGFubmVscy0xKTsKKworICAgIC8qICBHZXQgZ2FpbiB2YWx1ZXMgICovCisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCBwU3RyZWFtICk7CisgICAgVGFyZ2V0ID0gTFZDX01peGVyX0dldFRhcmdldCggcFN0cmVhbSApOworCisgICAgaWYgKEN1cnJlbnQgIT0gVGFyZ2V0KQorICAgIHsKKyAgICAgICAgVGNfbWlsbGlzZWMgPSBUY19taWxsaXNlYyAqIDMyNzY3IC8gKEN1cnJlbnQgLSBUYXJnZXQpOworICAgICAgICBpZiAoVGNfbWlsbGlzZWM8MCkgVGNfbWlsbGlzZWMgPSAtVGNfbWlsbGlzZWM7CisKKyAgICAgICAgaWYoVGNfbWlsbGlzZWM9PTApCisgICAgICAgICAgICBEZWx0YT0weDdGRkZGRkZGOworICAgICAgICBlbHNlCisgICAgICAgICAgICBEZWx0YT1EZWx0YS9UY19taWxsaXNlYzsKKworICAgICAgICBpZihEZWx0YT09MCkKKyAgICAgICAgICAgIERlbHRhPTE7ICAgICAgICAgICAgLy8gSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERlbHRhID0xOyAgICAgICAgICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkKKyAgICB9CisKKworICAgIHBJbnN0YW5jZS0+RGVsdGE9RGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSBpbiBRIDAuMzEgZm9ybWF0Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4ZmU0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuYwpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29lZmZpY2llbnQgb2YgZmlyc3Qgb3JkZXIgbG93IHBhc3MgICAgICovCisvKiAgICBmaWx0ZXIuIEl0IHVzZXMgdGhlIGVxdWF0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEIxICAgID0gKHRhbih3LzIpIC0gMSApICAvICAodGFuKHcvMikgKyAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMCAgICA9ICgxIC0gQjEpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTEgICAgPSBBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgQjEgaXMgdGhlbiBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlIHcgYnkgYSAgICAqLworLyogICAgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgYSA5dGggb3JkZXIgcG9seW5vbWlhbC4gSXQgdXNlcyB0aGUgICAgICAgKi8KKy8qICAgIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb2VmZmljaWVudCAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTAgICAgICAgICAgICAgLTgzODg1NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExICAgICAgICAgICAgIDMzNTQ3NzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMiAgICAgICAgICAgICAtNjY4MTY3OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTMgICAgICAgICAgICAgMTczMzc1MzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE0ICAgICAgICAgICAgIC0zODg0Mzc1NzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNSAgICAgICAgICAgICA3NTI5NzUzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTYgICAgICAgICAgICAgLTExMDMwMTY2NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE3ICAgICAgICAgICAgIDExMjE4NDg1NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOCAgICAgICAgICAgICAtNjg4MDc4MTU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCisvKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLworLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9GT19IUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAtODM4ODU3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNTQ3NzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2ODE2NzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzc1MzA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM4ODQzNzU3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1Mjk3NTM4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTAzMDE2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyMTg0ODU2NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODgwNzgxNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ2Njk1NzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoICAgICAgICAgICAoTFZNX1VJTlQxNik5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyk7CisgICAgcENvZWZmcy0+QjE9LVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZPVk+PjE7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFk9WS0weDQwMDAwMDAwOyAgICAgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KKyAgICBNVUwzMngxNklOVE8zMihZLCBGSUxURVJfTE9TUyAscENvZWZmcy0+QTAgLDE1KSAgICAgLyogQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdyovCisgICAgcENvZWZmcy0+QTE9LXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWM5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29lZmZpY2llbnQgb2YgZmlyc3Qgb3JkZXIgbG93IHBhc3MgICAgICovCisvKiAgICBmaWx0ZXIuIEl0IHVzZXMgdGhlIGVxdWF0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEIxICAgID0gKHRhbih3LzIpIC0gMSApICAvICAodGFuKHcvMikgKyAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMCAgICA9ICgxICsgQjEpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTEgICAgPSBBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgQjEgaXMgdGhlbiBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlIHcgYnkgYSAgICAqLworLyogICAgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgYSA5dGggb3JkZXIgcG9seW5vbWlhbC4gSXQgdXNlcyB0aGUgICAgICAgKi8KKy8qICAgIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb2VmZmljaWVudCAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTAgICAgICAgICAgICAgLTgzODg1NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExICAgICAgICAgICAgIDMzNTQ3NzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMiAgICAgICAgICAgICAtNjY4MTY3OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTMgICAgICAgICAgICAgMTczMzc1MzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE0ICAgICAgICAgICAgIC0zODg0Mzc1NzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNSAgICAgICAgICAgICA3NTI5NzUzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTYgICAgICAgICAgICAgLTExMDMwMTY2NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE3ICAgICAgICAgICAgIDExMjE4NDg1NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOCAgICAgICAgICAgICAtNjg4MDc4MTU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCisvKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLworLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCit7CisgICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAtODM4ODU3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNTQ3NzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2ODE2NzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzc1MzA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM4ODQzNzU3MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1Mjk3NTM4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTAzMDE2NjYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyMTg0ODU2NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODgwNzgxNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ2Njk1NzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4fTsKKyAgICBZPUxWTV9Qb2x5bm9taWFsKCAgICAgICAgICAgKExWTV9VSU5UMTYpOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOworICAgIHBDb2VmZnMtPkIxPS1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41CisgICAgWT1ZPj4xOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZPVkrMHg0MDAwMDAwMDsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCisgICAgTVVMMzJ4MTZJTlRPMzIoWSwgRklMVEVSX0xPU1MgLHBDb2VmZnMtPkEwICwxNSkgICAgLy8gQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdworICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOworICAgIHJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjliM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYwpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlZmluZXMgYW5kIFRhYmxlcyBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVlZETF8yUGlCeV84MDAwICAgICAgICAxNzI3MTA4ODI2ICAvKiBJbiBRNDEgZm9ybWF0ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1ICAgICAgIDEyNTMyMzA4OTQgIC8qIEluIFE0MSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfMTIwMDAgICAgICAgMTE1MTQwNTg4NCAgLyogSW4gUTQxIGZvcm1hdCAqLworCisjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQxICAgIDEyICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDhrSHosIDExLjAyNWtIeiBhbmQgMTJrSHogaS5lLiAxMj00MS0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMiAgICAxMyAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAxNmtIeiwgMjIuMDUwa0h6IGFuZCAyNGtIeiBpLmUuIDEzPTQyLTI5ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQzICAgIDE0ICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDMya0h6LCA0NC4xa0h6IGFuZCA0OGtIeiBpLmUuIDE0PTQzLTI5ICovCisKK2NvbnN0IExWTV9JTlQzMiAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDAgLCAvKiA4a0h6IGluIFE0MSwgMTZrSHogaW4gUTQyLCAzMmtIeiBpbiBRNDMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjUsICAvKiAxMTAyNSBIeiBpbiBRNDEsIDIyMDUwSHogaW4gUTQyLCA0NDEwMCBIeiBpbiBRNDMqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMH07IC8qIDEya0h6IGluIFE0MSwgMjRrSHogaW4gUTQyLCA0OGtIeiBpbiBRNDMgKi8KKworCitjb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW109e0xWVkRMXzJQaUJ5RnNfU0hJRlQxICwgICAgICAgICAvKiA4a0h6LCAxMTAyNUh6LCAxMmtIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUMiwgICAgICAgICAgLyogMTZrSHosIDIyMDUwSHosIDI0a0h6Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDN9OyAgICAgICAgIC8qIDMya0h6LCA0NDEwMEh6LCA0OGtIeiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSB2YWx1ZSBvZiB3IHVzaW5nIEZjIGFuZCBGcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1VJTlQxNiAgICAgICAgICBGYyAgICAgVGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogUTE2LjAgZm9ybWF0ICAgICAqLworLyogIExWTV9Gc19lbiAgICAgICAgICAgRnMgICAgIFRoZSBTYW1wbGVSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHc9MipwaSpGYy9GcyBpbiBRMi4yOSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKK3sKKyAgICBMVk1fSU5UMzIgICB3OworICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRmMsTFZWRExfMlBpT25Gc1RhYmxlW0ZzJTNdLHcsTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbRnMvM10pCisgICAgcmV0dXJuIHc7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ2ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTWl4ZXIgbGlicmFyeSB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBDb2VmZmljaWVudHMgYW5kIHRhYmxlIHZhbHVlcyBmb3IgdGhlIG1peGVyIGxpYnJhcnksIGdlbmVyYXRlZCBieSB0aGUgTWF0bGFiICAgICAqLworLyogU2NyaXB0OiBNaXhlcl9HZW5lcmF0ZUNvZWZmcy5tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZNX01JWEVSX0ZJTFRFUl9DT0VGRlNfSF9fCisjZGVmaW5lIF9fTFZNX01JWEVSX0ZJTFRFUl9DT0VGRlNfSF9fCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBBbHBoYSBUaW1lIENvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQWxwaGFfVGFibGVTaXplICAgICAgICAgICAgICAgICAgICAgICAgNTAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHRhYmxlIGVudGlyZXMgKi8KKyNkZWZpbmUgQUxQSEFfMCAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0ODA3NjkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk5ICovCisjZGVmaW5lIEFMUEhBXzEgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDc5NTc3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OCAqLworI2RlZmluZSBBTFBIQV8yICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3Nzg5MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTcgKi8KKyNkZWZpbmUgQUxQSEFfMyAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NzU1MTAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk2ICovCisjZGVmaW5lIEFMUEhBXzQgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDcyMTQxICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NSAqLworI2RlZmluZSBBTFBIQV81ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ2NzM3NyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTIgKi8KKyNkZWZpbmUgQUxQSEFfNiAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NjA2NDIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTg5ICovCisjZGVmaW5lIEFMUEhBXzcgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDUxMTE4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4NSAqLworI2RlZmluZSBBTFBIQV84ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQzNzY1MSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NzkgKi8KKyNkZWZpbmUgQUxQSEFfOSAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0MTg2MDggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTcwICovCisjZGVmaW5lIEFMUEhBXzEwICAgICAgICAgICAgICAgICAgICAgICAyMTQ3MzkxNjgzICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk1NyAqLworI2RlZmluZSBBTFBIQV8xMSAgICAgICAgICAgICAgICAgICAgICAgMjE0NzM1MzYxMSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5MzkgKi8KKyNkZWZpbmUgQUxQSEFfMTIgICAgICAgICAgICAgICAgICAgICAgIDIxNDcyOTk3NzkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTE0ICovCisjZGVmaW5lIEFMUEhBXzEzICAgICAgICAgICAgICAgICAgICAgICAyMTQ3MjIzNjYyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTg3OSAqLworI2RlZmluZSBBTFBIQV8xNCAgICAgICAgICAgICAgICAgICAgICAgMjE0NzExNjAzNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4MjkgKi8KKyNkZWZpbmUgQUxQSEFfMTUgICAgICAgICAgICAgICAgICAgICAgIDIxNDY5NjM4NjUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NzU4ICovCisjZGVmaW5lIEFMUEhBXzE2ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2NzQ4NzEyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTY1OCAqLworI2RlZmluZSBBTFBIQV8xNyAgICAgICAgICAgICAgICAgICAgICAgMjE0NjQ0NDUyMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk1MTYgKi8KKyNkZWZpbmUgQUxQSEFfMTggICAgICAgICAgICAgICAgICAgICAgIDIxNDYwMTQ0NzIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5MzE2ICovCisjZGVmaW5lIEFMUEhBXzE5ICAgICAgICAgICAgICAgICAgICAgICAyMTQ1NDA2NTI3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTAzMyAqLworI2RlZmluZSBBTFBIQV8yMCAgICAgICAgICAgICAgICAgICAgICAgMjE0NDU0NzE4OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTg2MzMgKi8KKyNkZWZpbmUgQUxQSEFfMjEgICAgICAgICAgICAgICAgICAgICAgIDIxNDMzMzI2NjkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4MDY3ICovCisjZGVmaW5lIEFMUEhBXzIyICAgICAgICAgICAgICAgICAgICAgICAyMTQxNjE2NTE0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NzI2OCAqLworI2RlZmluZSBBTFBIQV8yMyAgICAgICAgICAgICAgICAgICAgICAgMjEzOTE5MjIxNSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTYxMzkgKi8KKyNkZWZpbmUgQUxQSEFfMjQgICAgICAgICAgICAgICAgICAgICAgIDIxMzU3Njg5MzkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk0NTQ1ICovCisjZGVmaW5lIEFMUEhBXzI1ICAgICAgICAgICAgICAgICAgICAgICAyMTMwOTM3Nzc0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5MjI5NSAqLworI2RlZmluZSBBTFBIQV8yNiAgICAgICAgICAgICAgICAgICAgICAgMjEyNDEyNTE1MyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45ODkxMjMgKi8KKyNkZWZpbmUgQUxQSEFfMjcgICAgICAgICAgICAgICAgICAgICAgIDIxMTQ1MjkyNjMgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg0NjU0ICovCisjZGVmaW5lIEFMUEhBXzI4ICAgICAgICAgICAgICAgICAgICAgICAyMTAxMDM0NjEyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk3ODM3MCAqLworI2RlZmluZSBBTFBIQV8yOSAgICAgICAgICAgICAgICAgICAgICAgMjA4MjEwMDAzMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45Njk1NTMgKi8KKyNkZWZpbmUgQUxQSEFfMzAgICAgICAgICAgICAgICAgICAgICAgIDIwNTU2MTczOTggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTU3MjIxICovCisjZGVmaW5lIEFMUEhBXzMxICAgICAgICAgICAgICAgICAgICAgICAyMDE4NzQ0ODI0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk0MDA1MSAqLworI2RlZmluZSBBTFBIQV8zMiAgICAgICAgICAgICAgICAgICAgICAgMTk2NzczMzAxNSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45MTYyOTcgKi8KKyNkZWZpbmUgQUxQSEFfMzMgICAgICAgICAgICAgICAgICAgICAgIDE4OTc3OTQ1ODcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuODgzNzI5ICovCisjZGVmaW5lIEFMUEhBXzM0ICAgICAgICAgICAgICAgICAgICAgICAxODAzMTIzMjM0ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjgzOTY0NSAqLworI2RlZmluZSBBTFBIQV8zNSAgICAgICAgICAgICAgICAgICAgICAgMTY3NzI2MjIyMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC43ODEwMzYgKi8KKyNkZWZpbmUgQUxQSEFfMzYgICAgICAgICAgICAgICAgICAgICAgIDE1MTQxNDI2NzUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzA1MDc4ICovCisjZGVmaW5lIEFMUEhBXzM3ICAgICAgICAgICAgICAgICAgICAgICAxMzEwMTk3ODc1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjYxMDEwOCAqLworI2RlZmluZSBBTFBIQV8zOCAgICAgICAgICAgICAgICAgICAgICAgMTA2NzgxMzQ4MCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC40OTcyMzkgKi8KKyNkZWZpbmUgQUxQSEFfMzkgICAgICAgICAgICAgICAgICAgICAgICA3OTk2MDEzNzEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMzcyMzQzICovCisjZGVmaW5lIEFMUEhBXzQwICAgICAgICAgICAgICAgICAgICAgICAgNTMxMTgzMDQ5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjI0NzM1MSAqLworI2RlZmluZSBBTFBIQV80MSAgICAgICAgICAgICAgICAgICAgICAgIDI5NzkwNDAwNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4xMzg3MjIgKi8KKyNkZWZpbmUgQUxQSEFfNDIgICAgICAgICAgICAgICAgICAgICAgICAxMzE0OTk3NjggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDYxMjM0ICovCisjZGVmaW5lIEFMUEhBXzQzICAgICAgICAgICAgICAgICAgICAgICAgIDQxMzc1MjgyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAxOTI2NyAqLworI2RlZmluZSBBTFBIQV80NCAgICAgICAgICAgICAgICAgICAgICAgICAgODA2NTg5OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDM3NTYgKi8KKyNkZWZpbmUgQUxQSEFfNDUgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTkwNzYgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMzcyICovCisjZGVmaW5lIEFMUEhBXzQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMzk4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAxNCAqLworI2RlZmluZSBBTFBIQV80NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUxQSEFfNDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFMUEhBXzQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworI2RlZmluZSBBTFBIQV81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDlkOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIk1peGVyLmgiCisjaW5jbHVkZSAiTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1fTWl4X0dldFRpbWVDb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IHVzaW5nIHRoZSBmb2xsb3dpbmcgKi8KKy8qICBlcXVhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBBbHBoYSA9IGV4cChsbigwLjEpLyAodGMgKiBVcGRhdGUgKyAxLjApKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCB0aGUgZm9sbG93IGZpcnN0IG9yZGVyIGZpbHRlciwgY2FsbGVkIGF0IGEgICovCisvKiAgcmF0ZSBvZiBVcGRhdGUgdGltZXMgYSBzZWNvbmQuIHRjIGlzIHRoZSByZXF1aXJlZCB0aW1lIGNvbnN0YW50IGluICAqLworLyogIHVuaXRzIG9mIDEwMHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBPdXRwdXQobikgPSBBbHBoYSAqIE91dHB1dChuLTEpICsgKDEgLSBBbHBoYSkgKiBUYXJnZXQobikgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGUgYmxvY2sgc2l6ZSBpcyBsYXJnZSwgaS5lLiB0aGUgdXBkYXRlIHJhdGUgICovCisvKiAgaXMgYXBwcm94aW1hdGVseSBhIGZpeGVkLCBhbmQgY29ycmVjdCBmYWN0b3Igb2YgdGhlIHZhbHVlIG9mIEZzICAgICAqLworLyogIGdpdmVuIGluIHRoZSBjYWxsLiBUaGlzIGlzIGVzcGVjaWFsbHkgbm90IHRydWUgd2hlbiB0aGUgYmxvY2sgc2l6ZSAgKi8KKy8qICBpcyB2ZXJ5IHNtYWxsLCBzZWUgdGhlIG1peGVyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgaW5wdXQgICAgKi8KKy8qICB2YWx1ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIE51bUNoYW5uZWxzIGlzIGxpbWl0ZWQgdG8gdGhlIHZhbHVlcyAxIChNb25vKSBhbmQgMiAoU3RlcmVvKSAgICAgKi8KKy8qICAyLiBUaGUgcHJvZHVjdCB0YyAqIEZzIGlzIGxpbWl0ZWQgYXBwcm94aW1hdGVseSB0byB0aGUgcmFuZ2UgICAgICAgICovCisvKiAgICAgIDggPCAodGMgKiBGcykgPCAyXjM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdGMgICAgICAgICAgICAgIC0gdGhlIHRpbWUgY29uc3RhbnQgaW4gMTAwdXMgc3RlcHMsIGkuZS4gMTAgPSAxbXMgICAqLworLyogIEZzICAgICAgICAgICAgICAtIHRoZSBmaWx0ZXIgdXBkYXRlIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1DaGFubmVscyAgICAgLSBOdW1iZXIgb2YgY2hhbm5lbHMgMT1Nb25vLCAyPVN0ZXJlbyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBbHBoYSAgIC0gdGhlIGZpbHRlciBjb2VmZmljaWVudCBRMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKQoreworCisgICAgTFZNX1VJTlQzMiAgUHJvZHVjdDsKKyAgICBMVk1fSU5UMTYgICBJbnRlcnBvbGF0ZTsKKyAgICBMVk1fVUlOVDE2ICBTaGlmdDsKKyAgICBMVk1fSU5UMzIgICBEaWZmOworICAgIExWTV9VSU5UMzIgIFRhYmxlW10gPSB7QUxQSEFfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV83LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzUwfTsKKworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG9mIHRoZSB0aW1lIGNvbnN0YW50IGFuZCB0aGUgc2FtcGxlIHJhdGUgKi8KKyAgICBQcm9kdWN0ID0gKCh0YyA+PiAxNikgKiAoTFZNX1VJTlQzMilGcykgPDwgMTM7ICAvKiBTdGVyZW8gdmFsdWUgKi8KKyAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7CisKKyAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLworICAgIH0KKworICAgIC8qIE5vcm1hbGl6ZSB0byBnZXQgdGhlIHRhYmxlIGluZGV4IGFuZCBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLworICAgIGZvciAoU2hpZnQ9MDsgU2hpZnQ8KChBbHBoYV9UYWJsZVNpemUtMSkvMik7IFNoaWZ0KyspCisgICAgeworICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA8PCAxOworICAgIH0KKyAgICBTaGlmdCA9IChMVk1fVUlOVDE2KSgoU2hpZnQgPDwgMSkpOworCisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCk9PTApCisgICAgeworICAgICAgICBTaGlmdCsrOworICAgIH0KKworICAgIEludGVycG9sYXRlID0gKExWTV9JTlQxNikoKFByb2R1Y3QgPj4gMTUpICYgMHgwMDAwN0ZGRik7CisKKyAgICBEaWZmID0gKExWTV9JTlQzMikoVGFibGVbU2hpZnRdIC0gVGFibGVbU2hpZnQrMV0pOworICAgIE1VTDMyeDE2SU5UTzMyKERpZmYsSW50ZXJwb2xhdGUsRGlmZiwxNSkKKyAgICAgICAgUHJvZHVjdCA9IFRhYmxlW1NoaWZ0KzFdICsgKExWTV9VSU5UMzIpRGlmZjsKKworICAgIHJldHVybiBQcm9kdWN0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkN2RiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1fUG9seW5vbWlhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHBvbHlub21pYWwgZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyCFLi4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9JTlQzMiBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2ICAgIE4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpwQ29lZmZpY2llbnRzLCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICBYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE4gICAgICAgICAgICAgICAgaXMgdGhlIHBvbHlub21pYWwgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ29lZmZpY2llbnRzICAgIGlzIHRoZSBwdHIgdG8gcG9seW5vbWlhbCBjb2VmZmljaWVudHMgQTAsQTEuLiBpbiBRLjMxICovCisvKiAgWCAgICAgICAgICAgICAgICBpcyB0aGUgaW5wdXQgdmFyaWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSByZXN1bHQgb2YgdGhlIHBvbHlub21pYWwgZXhwYW5zaW9uIGluIFExLjMxIGZvcm1hdCAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgIFgpCit7CisgICAgTFZNX0lOVDMyIGk7CisgICAgTFZNX0lOVDMyIFksQSxYVGVtcCxUZW1wLHNpZ247CisKKyAgICBZPSpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KKyAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICBpZigoTFZNX1VJTlQzMilYPT0weDgwMDAwMDAwKQorICAgIHsKKyAgICAgICAgVGVtcD0tMTsKKyAgICAgICAgc2lnbj1UZW1wOworICAgICAgICBmb3IoaT0xO2k8PU47aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBZKz0oKCpwQ29lZmZpY2llbnRzKSpzaWduKTsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKyAgICAgICAgICAgIHNpZ24qPVRlbXA7CisgICAgICAgIH0KKworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFhUZW1wPVg7CisgICAgICAgIGZvcihpPU4tMTtpPj0wO2ktLSkKKyAgICAgICAgeworICAgICAgICAgICAgQT0qcENvZWZmaWNpZW50czsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoQSxYVGVtcCxUZW1wLDMxKQorICAgICAgICAgICAgWSs9VGVtcDsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoWFRlbXAsWCxUZW1wLDMxKQorICAgICAgICAgICAgWFRlbXA9VGVtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBBPSpwQ29lZmZpY2llbnRzOworICAgIHBDb2VmZmljaWVudHMrKzsKKworICAgIGlmKEE8MCkKKyAgICB7CisgICAgICAgIEE9QWJzXzMyKEEpOworICAgICAgICBZPVk+PkE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFkgPSBZPDxBOworICAgIH0KKyAgICByZXR1cm4gWTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhMTA3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9Qb3dlcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyAxMFggdXNpbmcgYW4gMTF0aCBvcmRlciBwb2x5bm9taWFsLiBJdCB1c2VzICAqLworLyogICB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIDMyLWJpdCBpbnRlZ2VyIHBvbHlub21pYWwgY29lZmZpY2llbnRzOiAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENvZWZmaWNpZW50ICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMCAgICAgICAgICAgICA2NzEwMjU0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEgICAgICAgICAgICAgMzA5MDMyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEyICAgICAgICAgICAgIDcxMjA5NjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMyAgICAgICAgICAgICAxMDkyNzk3MzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTQgICAgICAgICAgICAgMTI1MTYyNTEzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE1ICAgICAgICAgICAgIDExNTQ2NDk0NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNiAgICAgICAgICAgICA5MTU2NTQ4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTcgICAgICAgICAgICAgNTk3ODgzNjgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE4ICAgICAgICAgICAgIDI4NDM3ODIzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOSAgICAgICAgICAgICAxNTAyNjIwOTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEwICAgICAgICAgICAgMTI0ODk0NDcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsghS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBYICAgICAgICAgICAgICAgaXMgdGhlIGlucHV0IHZhcmlhYmxlIGluIFEyLjMwIGZvcm1hdCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlIHJlc3VsdCBvZiB0aGUgMTB4IGV4cGFuc2lvbiBpbiBROC4yNCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitMVk1fSU5UMzIgTFZNX1Bvd2VyMTAoTFZNX0lOVDMyICAgICBYKQoreworICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgMTY3NzU2MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzcyNTgyNDksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzgwMjQwMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzMxOTkzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTI5MDYyODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODg2NjIzNjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjg5MTM3MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDk0NzA5MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwOTQ1NTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzc1NjU1MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEyMjM2MTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2MTkzMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIFgpOworICAgIHJldHVybiBZOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTVmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTkNMVURFIEZJTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVGltZXIuaCIKKyNpbmNsdWRlICJMVk1fVGltZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBUSU1FUiBGVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX1RpbWVyICAgICAgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICBCbG9ja1NpemUgKXsKKworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7CisKKyAgICBpZiAocEluc3RhbmNlUHItPlRpbWVyQXJtZWQpeworICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyAtPSBCbG9ja1NpemU7CisgICAgICAgIGlmIChwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyA8PSAwKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMDsKKyAgICAgICAgICAgICgqcEluc3RhbmNlUHItPnBDYWxsQmFjaykgKCBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSApOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFTkQgT0YgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM1Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTkNMVURFIEZJTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVGltZXIuaCIKKyNpbmNsdWRlICJMVk1fVGltZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9uZU92ZXJUaG91c2FuZEluUTI0IDE2Nzc3CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIElOSVQgRlVOQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fVGltZXJfSW5pdCAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zICAgICApeworCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqcEluc3RhbmNlUHI7CisgICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqKXBJbnN0YW5jZTsKKworICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtICAgICA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyAgID0gcFBhcmFtcy0+cENhbGxCYWNrUGFyYW1zOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbGJhY2tJbnN0YW5jZSA9IHBQYXJhbXMtPnBDYWxsYmFja0luc3RhbmNlOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2sgICAgICAgICA9IHBQYXJhbXMtPnBDYWxsQmFjazsKKyAgICBwSW5zdGFuY2VQci0+VGltZXJBcm1lZCAgICAgICAgPSAxOworCisgICAgTVVMMzJ4MTZJTlRPMzIocFBhcmFtcy0+U2FtcGxpbmdSYXRlLE9uZU92ZXJUaG91c2FuZEluUTI0LHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLDE2KTsgIC8qIChRMCAqIFEyNCkgPj4xNiBpbnRvIFE4Ki8KKyAgICBNVUwzMngxNklOVE8zMihwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyxwUGFyYW1zLT5UaW1lSW5NcyxwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyw4KTsgIC8qIChROCAqIFEwKSA+PjggaW50byBRMCovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEVORCBPRiBGSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDk0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTFZNX1RJTUVSX1BSSVZBVEVfSAorI2RlZmluZSBMVk1fVElNRVJfUFJJVkFURV9ICisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiAgUmVtYWluaW5nVGltZUluU2FtcGxlczsKKyAgICBMVk1fSU5UMzIgIENhbGxCYWNrUGFyYW07CisgICAgTFZNX0lOVDMyICAqcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQgICpwQ2FsbGJhY2tJbnN0YW5jZTsKKyAgICB2b2lkICAoKnBDYWxsQmFjaykodm9pZCosdm9pZCosTFZNX0lOVDMyKTsKKyAgICBMVk1fSU5UMTYgVGltZXJBcm1lZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb29sZWFuLCB0cnVlIGJldHdlZW4gaW5pdCBhbmQgY2FsbGJhY2sgKi8KKworfSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBFTkQgT0YgSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODhjYTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTG9hZENvbnN0XzE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMb2FkQ29uc3RfMTYoY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9IHZhbDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZTU5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8zMi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTG9hZENvbnN0XzMyKGNvbnN0IExWTV9JTlQzMiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgICpkc3QgPSB2YWw7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyOTdlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiAgTVNUTzJJX1NBVF8xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTVNUbzJpX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYgICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgKnNyY1MsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0lOVDMyIHRlbXAsbVZhbCxzVmFsOworICAgIExWTV9JTlQxNiBpaTsKKworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBtVmFsPShMVk1fSU5UMzIpKnNyY007CisgICAgICAgIHNyY00rKzsKKworICAgICAgICBzVmFsPShMVk1fSU5UMzIpKnNyY1M7CisgICAgICAgIHNyY1MrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCArIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCAtIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwNGFlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJWNyZWF0ZWRfYnk6ICAgIHNyYSAlIChDTS9TKQorICAgICAlbmFtZTogICAgICAgICAgTWFjM3NfU2F0XzE2eDE2LmMgJSAoQ00vUykKKyAgICAgJXZlcnNpb246ICAgICAgIDEgJSAoQ00vUykKKyAgICAgJWRhdGVfY3JlYXRlZDogIEZyaSBOb3YgMTMgMTI6MDc6MTMgMjAwOSAlIChDTS9TKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1hYzNTXzE2WDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNYWMzc19TYXRfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBzcmN2YWw7CisgICAgTFZNX0lOVDMyIFRlbXAsZEluVmFsOworCisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbD0qc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBUZW1wID0gKHNyY3ZhbCAqdmFsKT4+MTU7CisKKyAgICAgICAgZEluVmFsICA9IChMVk1fSU5UMzIpKmRzdDsKKworICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKKworICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOworICAgICAgICB9CisKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4ZjM2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNQUMzU18xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWFjM3NfU2F0XzMyeDE2KCAgY29uc3QgTFZNX0lOVDMyICpzcmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCisgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIHNyY3ZhbCx0ZW1wLCBkSW5WYWwsIGRPdXRWYWw7CisKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgc3JjdmFsPSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKKworICAgICAgICAgICAgZEluVmFsICA9ICpkc3Q7CisgICAgICAgIGRPdXRWYWwgPSB0ZW1wICsgZEluVmFsOworCisKKyAgICAgICAgaWYgKCgoKGRPdXRWYWwgXiB0ZW1wKSAmIChkT3V0VmFsIF4gZEluVmFsKSkgPj4gMzEpIT0wKSAgICAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYodGVtcDwwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg4MDAwMDAwMGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZE91dFZhbD0weDdGRkZGRkZGbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICpkc3QgPSBkT3V0VmFsOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjMjZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNSVhJTlNPRlRfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX3QgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIG4pCit7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPFBPSU5UX1pFUk9fT05FX0RCKSYmCisgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREIpKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSA9PSAweDdGRkYpCisgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIoIHNyYywgZHN0LCBuICk7CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBjb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcworICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UscEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhODhiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisKKyAgICBpZihuPD0wKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCBwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0XzMyKDAsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpID09IDB4N0ZGRil7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYqKXNyYywgKExWTV9JTlQxNiopZHN0LCAoTFZNX0lOVDE2KShuICogMikpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE11bHQzc18zMngxNiggc3JjLCAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KSwgZHN0LCBuICk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UscEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMGEwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKworICAgIGlmKG48PTApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKKyAgICB7CisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoIChNaXhfMVN0X0NsbF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCggKHZvaWQgKikgJnBJbnN0YW5jZS0+QWxwaGEyLCAgICAgLyogQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAodm9pZCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCisgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAoTWl4XzFTdF9DbGxfdCopIHBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDcwNzNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NSVhFUl9QUklWQVRFX0hfXworI2RlZmluZSBfX01JWEVSX1BSSVZBVEVfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk1peGVyLmgiCisKKyNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZiAvLyNpZm5kZWYgX19NSVhFUl9QUklWQVRFX0hfXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ3OThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNb25vVG8ySV8xNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIHNyYyArPSAobi0xKTsKKyAgICBkc3QgKz0gKChuKjIpLTEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmMtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA5ZWMwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTW9ub1RvMklfMzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1vbm9UbzJJXzMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIHNyYyArPSAobi0xKTsKKyAgICBkc3QgKz0gKChuKjIpLTEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmMtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRjNTBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0ZVTkNUSU9OIE1VTFQzU18xNlgxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTXVsdDNzXzMyeDE2KCBjb25zdCBMVk1fSU5UMzIgKnNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCisgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgc3JjdmFsLHRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHNyY3ZhbD0qc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICBNVUwzMngxNklOVE8zMihzcmN2YWwsdmFsLHRlbXAsMTUpCisKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzM0M2NkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkNvbXBMaW1fcHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vbi1saW5lYXIgY29tcHJlc3Npb24gYnkgY29tcGFuZGluZy4gVGhlIGZ1bmN0aW9uIHdvcmtzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSAgICAgICovCisvKiAgYmFzaXMgYnkgaW5jcmVhc2luZyB0aGUgbGV2ZWwgbmVhciB0aGUgemVybyBjcm9zc2luZy4gVGhpcyBnaXZlcyBhIHR0cmFkZS1vZmYgICAgICAgKi8KKy8qICBiZXR3ZWVuIFRIRCBhbmQgY29tcHJlc3Npb24uIEl0IHVzZXMgdGhlIGVxdWF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgT3V0cHV0ID0gSW5wdXQgKyBLICogKElucHV0IC0gSW5wdXReMikgICAgICAgIGlmIElucHV0ID4gIDAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgPSBJbnB1dCArIEsgKiAoSW5wdXQgKyBJbnB1dF4yKSAgICAgIGlmIElucHV0IDw9IDAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgSyBjb250cm9scyB0aGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGFuZCBhcyBhIHNpZGUgZWZmZWN0IHRoZSBhbW91bnQgKi8KKy8qICBkaXN0b3J0aW9uIGludHJvZHVjZWQuIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgc2lnbmFsIGRlcGVuZGVudCBhbmQgdGhlIHZhbHVlcyAqLworLyogIGdpdmVuIGJlbG93IGFyZSBhcHByb3hpbWF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBHYWluIChmcmFjdGlvbmFsKSAgR2FpbiAoaW50ZWdlcikgICAgQ29tcHJlc3Npb24gICAgICAgICAgUGstUGsgVEhEICAgICAgICAgICAqLworLyogICAgICAgICAgICAxLjAgICAgICAgICAgICAgICAgIDMyNzY3ICAgICAgICAgICAgKzZkQiAgICAgICAgICAgIDE2ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuNzggICAgICAgICAgICAgICAgMjU1NTkgICAgICAgICAgICArNWRCICAgICAgICAgICAgMTlkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC42ICAgICAgICAgICAgICAgICAxOTY2MSAgICAgICAgICAgICs0ZEIgICAgICAgICAgICAyMWRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjQxICAgICAgICAgICAgICAgIDEzNDM1ICAgICAgICAgICAgKzNkQiAgICAgICAgICAgIDI0ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuMjYgICAgICAgICAgICAgICAgIDg1MjAgICAgICAgICAgICArMmRCICAgICAgICAgICAgMjhkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC4xMiAgICAgICAgICAgICAgICAgMzkzMiAgICAgICAgICAgICsxZEIgICAgICAgICAgICAzNGRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgKzBkQiAgICAgICAgICAgIDk4ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgR2FpbiAgICAgICAgICAgIC0gICAgY29tcHJlc3Npb24gY29udHJvbCBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwRGF0YUluICAgICAgICAgLSAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBEYXRhT3V0ICAgICAgICAtICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQmxvY2tMZW5ndGggICAgIC0gICAgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCit7CisKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgIFRlbXA7CisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMKKyAgICAgKi8KKyAgICBmb3IoU2FtcGxlTm8gPSAwOyBTYW1wbGVObzxCbG9ja0xlbmd0aDsgU2FtcGxlTm8rKykKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKKyAgICAgICAgICovCisgICAgICAgIFNhbXBsZSA9ICpwRGF0YUluOworICAgICAgICBwRGF0YUluKys7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgorICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCisgICAgICAgICAqIGdhaW4gZmFjdG9yCisgICAgICAgICAqLworICAgICAgICBpZiAoKExWTV9JTlQzMilTYW1wbGUgIT0gLTMyNzY4KQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wID0gKExWTV9JTlQxNikoKFNhbXBsZSAqIFNhbXBsZSkgPj4gMTUpOworICAgICAgICAgICAgaWYoU2FtcGxlID4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChMVk1fSU5UMTYpKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgPj4gMTUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpID4+IDE1KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOworICAgICAgICBwRGF0YU91dCsrOworCisKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjMTUyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgR2FpbiwgaW4gUTExIGZvcm1hdAorCisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyIHluTCx5blIseW5MTyx5blJPLHRlbXBsOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKEEwIChRMTQpICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjE0KSAgaW4gUTAqLworICAgICAgICAgICAgdGVtcGw9KCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluTCwxNCkKKworICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSA+PjE0KSBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSx0ZW1wbCwxNCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxIChRMTQpICogeShuLTEpTCAoUTApICkgPj4xNCkgaW4gUTAgKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBsLDE0KQorICAgICAgICAgICAgeW5MKz10ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MTz0gKChHYWluIChRMTEpICogeW5MIChRMCkpPj4xMSkgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoeW5MLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10seW5MTywxMSkKKworICAgICAgICAgICAgLyogeW5MTz0oIHluTE8oUTApICsgeChuKUwgKFEwKSApIGluIFEwKi8KKyAgICAgICAgICAgIHluTE8rPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9IChBMCAoUTE0KSAqICh4KG4pUiAoUTApIC0geChuLTIpUiAoUTApICkgPj4xNCkgICBpbiBRMCovCisgICAgICAgICAgICB0ZW1wbD0oKihwRGF0YUluKzEpKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluUiwxNCkKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgKFExNCkgKiB5KG4tMilSIChRMCkgKSA+PjE0KSAgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMTQpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAoUTE0KSAqIHkobi0xKVIgKFEwKSApID4+MTQpICBpbiBRMCAqLworICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0sdGVtcGwsMTQpCisgICAgICAgICAgICB5blIrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gKFExMSkgKiB5blIgKFEwKSk+PjExKSBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngxNklOVE8zMih5blIscEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx5blJPLDExKQorCisgICAgICAgICAgICAvKiB5blJPPSggeW5STyhRMCkgKyB4KG4pUiAoUTApICkgaW4gUTAqLworICAgICAgICAgICAgeW5STys9ICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjsgLyogVXBkYXRlIHkobi0xKVIgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0PXluTE87IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQ9eW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YTU3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIEdhaW4sIGluIFExMSBmb3JtYXQKKworCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5bkw9IChBMCAoUTMwKSAqICh4KG4pTCAoUTApIC0geChuLTIpTCAoUTApICkgPj4zMCkgIGluIFEwKi8KKyAgICAgICAgICAgIHRlbXBsPSgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIodGVtcGwscEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx5bkwsMzApCisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIyIChRMzApICogeShuLTIpTCAoUTApICkgPj4zMCkgaW4gUTAqLworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMzApCisgICAgICAgICAgICB5bkwrPXRlbXBsOworCisgICAgICAgICAgICAvKiB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFEwKSApID4+MzApIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluTCs9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTE89ICgoR2FpbiAoUTExKSAqIHluTCAoUTApKT4+MTEpIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHluTCxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHluTE8sMTEpCisgICAgICAgICAgICAvKiB5bkxPPSggeW5MTyhRMCkgKyB4KG4pTCAoUTApICkgaW4gUTAqLworICAgICAgICAgICAgeW5MTys9ICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluUj0gKEEwIChRMzApICogKHgobilSIChRMCkgLSB4KG4tMilSIChRMCkgKSA+PjMwKSAgIGluIFEwKi8KKyAgICAgICAgICAgIHRlbXBsPSgqKHBEYXRhSW4rMSkpLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHRlbXBsLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0seW5SLDMwKQorCisgICAgICAgICAgICAvKiB5blIrPSAoKC1CMiAoUTMwKSAqIHkobi0yKVIgKFEwKSApID4+MzApICBpbiBRMCovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10scEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIxIChRMzApICogeShuLTEpUiAoUTApICkgPj4zMCkgIGluIFEwICovCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSx0ZW1wbCwzMCkKKyAgICAgICAgICAgIHluUis9dGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluUk89ICgoR2FpbiAoUTExKSAqIHluUiAoUTApKT4+MTEpIGluIFEwKi8KKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHluUixwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHluUk8sMTEpCisKKyAgICAgICAgICAgIC8qIHluUk89KCB5blJPKFEwKSArIHgobilSIChRMCkgKSBpbiBRMCovCisgICAgICAgICAgICB5blJPKz0gKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09eW5SOyAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09eW5MOyAvKiBVcGRhdGUgeShuLTEpTCBpbiBRMCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgaW4gUTAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSIGluIFEwKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQ9eW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dD15blJPOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDYxNDJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKwordm9pZCAgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOworICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7CisKKyAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmOWM3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisjZGVmaW5lIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfCisKKy8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KKy8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCit7CisgIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLworICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworfUZpbHRlcl9TdGF0ZTsKKwordHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKKworI2VuZGlmIC8qIF9QS18ySV9EMzJGMzJDTExHU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmNjRlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuYwpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCit2b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7CisgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwczsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXBDb2VmLT5BMDsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXBDb2VmLT5CMjsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXBDb2VmLT5CMTsKKworICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXBDb2VmLT5HOworCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjA1MGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1BLXzJJX0QzMkYzMkNTU0dTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKyNkZWZpbmUgX1BLXzJJX0QzMkYzMkNTU0dTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KKworCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCisvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCit0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXworeworICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KK31GaWx0ZXJfU3RhdGU7CisKK3R5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisKKyNlbmRpZiAvKiBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2MzI3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YxNnh2MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFNoaWZ0X1NhdF92MTZ4djE2IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQoreworICAgIExWTV9JTlQzMiAgIHRlbXA7CisgICAgTFZNX0lOVDMyICAgaWk7CisgICAgTFZNX0lOVDE2ICAgUlNoaWZ0OworICAgIGlmKHZhbD4wKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgdGVtcCA9IHRlbXAgPDwgdmFsOworCisgICAgICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCsrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYodmFsPDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KSgqc3JjID4+IFJTaGlmdCk7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KHNyYyxkc3Qsbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDEzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBTaGlmdF9TYXRfdjMyeHYzMiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQzMiAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKK3sKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CisKKyAgICBpZih2YWw+MCkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBhLGI7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGE9KnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBiPShhPDx2YWwpOworCisgICAgICAgICAgICBpZiggKGI+PnZhbCkgIT0gYSApIC8qIGlmIG92ZXJmbG93IG9jY3VyZWQsIHJpZ2h0IHNoaWZ0IHdpbGwgc2hvdyBkaWZmZXJlbmNlKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihhPDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiPTB4N0ZGRkZGRkZsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmRzdCA9IGI7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbDwwKQorICAgIHsKKyAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICgqc3JjID4+IFJTaGlmdCk7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKHNyYyE9ZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilzcmMsKExWTV9JTlQxNiAqKWRzdCwoTFZNX0lOVDE2KShuPDwxKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDM0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAlY3JlYXRlZF9ieTogICAgc3JhICUgKENNL1MpKi8KKy8qICAgICAlbmFtZTogICAgICAgICAgZEJfdG9fTGluMzIuYyAlIChDTS9TKSovCisvKiAgICAgJXZlcnNpb246ICAgICAgIDIgJSAoQ00vUykqLworLyogICAgICVkYXRlX2NyZWF0ZWQ6ICBXZWQgSnVuIDE4IDExOjI3OjQ2IDIwMDggJSAoQ00vUykqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworLyogIEluY2x1ZGUgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQorICogIElucHV0ICAgICAgIDogU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgIE1TQiAoMTYpID0gc2lnbiBiaXQKKyAqICAgICAgICAgICAgICAgICAgKDE1LT4wNSkgPSBpbnRlZ2VyIHBhcnQKKyAqICAgICAgICAgICAgICAgICAgKDA0LT4wMSkgPSBkZWNpbWFsIHBhcnQKKyAqICBPdXRwdXQgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICBNU0IgKDMyKSA9IHNpZ24gYml0CisgKiAgICAgICAgICAgICAgICAgICgzMS0+MTYpID0gaW50ZWdlciBwYXJ0CisgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CisgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgUmVtYXJrcyAgICAgOiAgTWFrZXMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgY29udmVyc2lvbiBieSBjb3VudGluZyB0aGUgbnVtYmVyCisgKiAgICAgICAgICAgICAgICAgb2YgNmRCIHN0ZXBzIGZvciB1c2UgYXMgc2hpZnRzIGFuZCB0aGVuIGludGVycG9sYXRlcyB3aXRoIGEgcmVtYWluZGVyCisgKiAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogICAgICAgICAgICAgICAgIENvcnJlY3Rpb24gPSAoUmVtYWluZGVyIC8gMS41MDI5KSAtIChSZW1haW5kZXJeMiAvIDYpCisgKgorICogICAgICAgICAgICAgICAgIFRoZSB0d28gY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgZnJvbSAweDQwMDAwMDAwIGluIDk2IHN0ZXBzIGFuZCBjYWxjdWxhdGVkCisgKiAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAqCisgKiAgICAgICAgICAgICAgICAgRklSU1RfQ09FRiAgPSAweDgwMDAwMDAwIC8gKDk2ICogMS41MDI5KQorICogICAgICAgICAgICAgICAgIFNFQ09ORF9DT0VGID0gMHg4MDAwMDAwMCAvICg5Nl4yICogNikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1VSX09WRVJfU0lYICAgIDIxODQ2ICAgICAgICAgICAgICAgICAgLyogKDQgLyA2KSAqIDJeMTUgKi8KKyNkZWZpbmUgU0lYX0RCICAgICAgICAgICA5NiAgICAgICAgICAgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCisjZGVmaW5lIEZJUlNUX0NPRUZfTkVHICAgMTQ4ODQzMDUKKyNkZWZpbmUgRklSU1RfQ09FRl9QT1MgICA3NDQyMTUyICAgICAgICAgICAgICAgIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLworI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CisjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCisKK0xWTV9JTlQzMiAgIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgICBkYl9maXgpCit7CisgICAgTFZNX0lOVDMyIExpbl92YWxfMzI7CisgICAgTFZNX0lOVDE2IFNoaWZ0OworICAgIExWTV9JTlQzMiBSZW1haW47CisKKworICAgIC8qCisgICAgICogQ2hlY2sgc2lnbiBvZiB0aGUgaW5wdXQKKyAgICAgKi8KKyAgICBpZiAoZGJfZml4PDApCisgICAgeworICAgICAgICBpZiAoZGJfZml4ID4gLU1BWF9WQUxVRSkKKyAgICAgICAgeworICAgICAgICAgICAgU2hpZnQgID0gKExWTV9JTlQxNikoKCgoTFZNX1VJTlQzMikoLWRiX2ZpeCkgPj4gNCkgKiBGT1VSX09WRVJfU0lYKSA+PiAxNyk7ICAgICAgICAvKiBOdW1iZXIgb2YgNmRCIHN0ZXBzIGluIFExMS40IGZvcm1hdCAqLworICAgICAgICAgICAgUmVtYWluID0gLWRiX2ZpeCAtIChTaGlmdCAqIFNJWF9EQik7CisgICAgICAgICAgICBSZW1haW4gPSAoMHg3RkZGRkZGRiAtIChSZW1haW4gKiBGSVJTVF9DT0VGX05FRykpICsgKFJlbWFpbiAqIFJlbWFpbiAqIFNFQ09ORF9DT0VGKTsKKyAgICAgICAgICAgIExpbl92YWxfMzIgPSAoTFZNX0lOVDMyKSgoTFZNX1VJTlQzMilSZW1haW4gPj4gKDE2ICsgU2hpZnQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExpbl92YWxfMzIgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChkYl9maXggPCBNQVhfVkFMVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoaWZ0ICA9IChMVk1fSU5UMTYpKCgoKExWTV9VSU5UMzIpZGJfZml4ID4+IDQpICogRk9VUl9PVkVSX1NJWCkgPj4gMTcpOyAgICAgICAgLyogTnVtYmVyIG9mIDZkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQgKi8KKyAgICAgICAgICAgIFJlbWFpbiA9IGRiX2ZpeCAtIChTaGlmdCAqIFNJWF9EQik7CisgICAgICAgICAgICBSZW1haW4gPSAweDNGRkZGRkZGICsgKFJlbWFpbiAqIEZJUlNUX0NPRUZfUE9TKSArIChSZW1haW4gKiBSZW1haW4gKiBTRUNPTkRfQ09FRik7CisgICAgICAgICAgICBMaW5fdmFsXzMyID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpUmVtYWluID4+ICgxNSAtIFNoaWZ0KSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMaW5fdmFsXzMyID0gMHg3RkZGRkZGRjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcmV0dXJuIExpbl92YWxfMzI7ICAvKiBmb3JtYXQgMS4xNi4xNSAqLworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTI1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNVUxUM1NfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE11bHQzc18xNngxNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCisgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCisgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0lOVDMyIHRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgqc3JjKSAqIChMVk1fSU5UMzIpdmFsOworICAgICAgICBzcmMrKzsKKworICAgICAgICAqZHN0ID0gKExWTV9JTlQxNikodGVtcCA+PiAxNSk7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZhYWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMCwwICsxLDQ3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiB0aGUgTi1CYW5kIGVxdWFsaXNlci4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICBwcm90b3R5cGVzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsaW5nIGxheWVyLiBBbGwgb3RoZXIgdHlwZXMsIHN0cnVjdHVyZXMgYW5kICAgICAgICAgICAqLworLyogIGZ1bmN0aW9ucyBhcmUgcHJpdmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZTogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA9PT09PT09ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBhbGdvcml0aG0gY2FuIGV4ZWN1dGUgZWl0aGVyIHdpdGggc2VwYXJhdGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9yIHdpdGggICAgICovCisvKiAgYSBjb21tb24gYnVmZmVyLCBpLmUuIHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBpbi1wbGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHdvIGRhdGEgZm9ybWF0cyBhcmUgc3VwcG9ydCBTdGVyZW8gYW5kIE1vbm8tSW4tU3RlcmVvLiBUaGUgZGF0YSBpcyBpbnRlcmxlYXZlZCBhcyAgKi8KKy8qICBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEJ5dGUgT2Zmc2V0ICAgICAgICAgU3RlcmVvIElucHV0ICAgICAgICAgTW9uby1Jbi1TdGVyZW8gSW5wdXQgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgPT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMxICAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMxICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMiAgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMiAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm8gZm9ybWF0IGRhdGEgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgYSBNb25vIHN0cmVhbSAgICovCisvKiAgaW4gdG8gTW9uby1Jbi1TdGVyZW8gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpbiB0aGUgZmlsdGVyIGJhbmQgZGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgYXMgZm9sbG93czogICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluICAgICAgICBpcyBpbiBpbnRlZ2VyIGRCLCByYW5nZSAtMTVkQiB0byArMTVkQiBpbmNsdXNpdmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZyZXF1ZW5jeSAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5IGluIEh6LCByYW5nZSBEQyB0byBOeXF1aXN0ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgUUZhY3RvciAgICAgaXMgdGhlIFEgbXVsdGlwbGllZCBieSAxMDAsIHJhbmdlIDAuMjUgKDI1KSB0byAxMiAoMTIwMCkgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiA9IDcgICAgICAgICAgICA3ZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcmVxdWVuY3kgPSAyNDY3ICAgIENlbnRyZSBmcmVxdWVuY3kgPSAyLjQ2N2tIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIFFGYWN0b3IgPSAxMDg5ICAgICAgUSA9IDEwLjg5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBlcXVhbGlzZXIgZmlsdGVycyBhcmUgcGFzc2VkIGFzIGEgcG9pbnRlciB0byBhbmQgYXJyYXkgb2YgZmlsdGVyIGJhbmQgICAgICAgICAgICovCisvKiAgZGVmaW5pdGlvbnMgc3RydWN0dXJlcy4gVGhlcmUgbXVzdCBiZSBvbmUgZmlsdGVyIGRlZmluaXRpb24gZm9yIGVhY2ggYmFuZC4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBfX0xWRVFOQl9IX18KKyNkZWZpbmUgX19MVkVRTkJfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUgKi8KKyNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRSAgICAgICAgICAwICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAgMSAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgIDIgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KKyNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgICAzICAgLyogT2Zmc2V0IHRvIGRhdGEgc2NyYXRjaCBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisvKiBDYWxsYmFjayBldmVudHMgKi8KKyNkZWZpbmUgTFZFUU5CX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwICAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCisjZGVmaW5lIExWRVFOQl9FVkVOVF9BTEdPRkYgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAvKiBFUU5CIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqTFZFUU5CX0hhbmRsZV90OworCisKKy8qIE9wZXJhdGluZyBtb2RlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX0JZUEFTUyAgID0gMCwKKyAgICBMVkVRTkJfT04gICAgICAgPSAxLAorICAgIExWRVFOQl9NT0RFX01BWCA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX01vZGVfZW47CisKKworLyogRmlsdGVyIG1vZGUgY29udHJvbCAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX0ZJTFRFUl9PRkYgICA9IDAsCisgICAgTFZFUU5CX0ZJTFRFUl9PTiAgICA9IDEsCisgICAgTFZFUU5CX0ZJTFRFUl9EVU1NWSA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX0ZpbHRlck1vZGVfZW47CisKKworLyogTWVtb3J5IFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkVRTkJfUEVSU0lTVEVOVCAgICAgID0gMCwKKyAgICBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBID0gMSwKKyAgICBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGID0gMiwKKyAgICBMVkVRTkJfU0NSQVRDSCAgICAgICAgID0gMywKKyAgICBMVkVRTkJfTUVNT1JZX01BWCAgICAgID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfTWVtb3J5VHlwZXNfZW47CisKKworLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX1NVQ0NFU1MgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KKyAgICBMVkVRTkJfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZFUU5CX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTGlua2VkIGVudW1lcmF0ZWQgdHlwZSBhbmQgY2FwYWJpbGl0eSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBjYXBhYmlsaXR5IGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0aWVzIGF0ICAgICAgICAgICovCisvKiAgaW5pdGlhbGlzYXRpb24sIHRoZXNlIGFyZSBhZGRlZCB0b2dldGhlciB0byBnaXZlIHRoZSBjYXBhYmlsaXR5IHdvcmQuIFRoZSAgICAgICAgICAgKi8KKy8qICBlbnVtZXJhdGVkIHR5cGUgaXMgdXNlZCB0byBzZWxlY3QgdGhlIG1vZGUgdGhyb3VnaCBhIGNvbnRyb2wgZnVuY3Rpb24gYXQgcnVuIHRpbWUuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGNhcGFiaWxpdHkgZGVmaW5pdGlvbiBpcyByZWxhdGVkIHRvIHRoZSBlbnVtZXJhdGVkIHR5cGUgdmFsdWUgYnkgdGhlIGVxdWF0aW9uOiAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgQ2FwYWJpbGl0eV92YWx1ZSA9IDJeRW51bWVyYXRlZF92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGb3IgZXhhbXBsZSwgYSBtb2R1bGUgY291bGQgYmUgY29uZmlndXJkIGF0IGluaXRpYWxpc2F0aW9uIHRvIHN1cHBvcnQgdHdvIHNhbXBsZSAgICAqLworLyogIHJhdGVzIG9ubHkgYnkgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbiB3aXRoIHRoZSB2YWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENhcGFiaWxpdGllcy5TYW1wbGVSYXRlID0gTFZFUU5CX0NBUF8zMjAwMCArIExWRVFOQl9DQVBfNDQxMDA7ICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGFuZCBhdCBydW4gdGltZSBpdCB3b3VsZCBiZSBwYXNzZWQgdGhlIHZhbHVlIExWRVFOQl9GU18zMjAwMCB0aHJvdWdoIHRoZSBjb250cm9sICAgICovCisvKiAgZnVuY3Rpb24gdG8gc2VsZWN0IG9wZXJhdGlvbiBhdCAzMmtIeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTdXBwb3J0ZWQgc291cmNlIGRhdGEgZm9ybWF0cworICovCisjZGVmaW5lIExWRVFOQl9DQVBfU1RFUkVPICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTyAgICAgICAgICAgIDIKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX1NURVJFTyAgICAgICA9IDAsCisgICAgTFZFUU5CX01PTk9JTlNURVJFTyA9IDEsCisgICAgTFZFUU5CX1NPVVJDRV9NQVggICA9IExWTV9NQVhJTlRfMzIKK30gTFZFUU5CX1NvdXJjZUZvcm1hdF9lbjsKKworCisvKgorICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKKyAqLworI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzgwMDAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgICAyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTIwMDAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE2MDAwICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzI0MDAwICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZFUU5CX0ZTXzgwMDAgID0gMCwKKyAgICBMVkVRTkJfRlNfMTEwMjUgPSAxLAorICAgIExWRVFOQl9GU18xMjAwMCA9IDIsCisgICAgTFZFUU5CX0ZTXzE2MDAwID0gMywKKyAgICBMVkVRTkJfRlNfMjIwNTAgPSA0LAorICAgIExWRVFOQl9GU18yNDAwMCA9IDUsCisgICAgTFZFUU5CX0ZTXzMyMDAwID0gNiwKKyAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAorICAgIExWRVFOQl9GU180ODAwMCA9IDgsCisgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfRnNfZW47CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgICAgICAvKiBSZWdpb24gYWxpZ25tZW50IGluIGJ5dGVzICovCisgICAgTFZFUU5CX01lbW9yeVR5cGVzX2VuICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KK30gTFZFUU5CX01lbW9yeVJlZ2lvbl90OworCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZFUU5CX01lbW9yeVJlZ2lvbl90ICAgICAgIFJlZ2lvbltMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWRVFOQl9NZW1UYWJfdDsKKworCisvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAvKiBCYW5kIGdhaW4gaW4gZEIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRnJlcXVlbmN5OyAgICAgICAgICAgICAgLyogQmFuZCBjZW50cmUgZnJlcXVlbmN5IGluIEh6ICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKi8KK30gTFZFUU5CX0JhbmREZWZfdDsKKworCisvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIExWRVFOQl9Nb2RlX2VuICAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlOworICAgIExWRVFOQl9Gc19lbiAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOworICAgIExWRVFOQl9Tb3VyY2VGb3JtYXRfZW4gICAgICBTb3VyY2VGb3JtYXQ7CisKKyAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KKworfSBMVkVRTkJfUGFyYW1zX3Q7CisKKworLyogQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCYW5kczsKKworICAgIC8qIENhbGxiYWNrIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICAgICAgQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogQnVuZGxlIGNhbGxiYWNrICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQnVuZGxlSW5zdGFuY2U7ICAgICAgIC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KKworfSBMVkVRTkJfQ2FwYWJpbGl0aWVzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBhbnkgb2YgcE1lbW9yeVRhYmxlIGFuZCBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgYWRkcmVzcyAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX01lbW9yeShMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsbGlzZXIgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLworLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLworLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCisvKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KKy8qICBMVkVRTkJfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBlcXVhbGlzZXIgbW9kdWxlIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBlcXVhbGlzZXIgbW9kdWxlIGNhcGFiaWxpdGllcy4gVGhlIGNhcGFiaWxpdGllcyBzZXQgaXMgcmV0dXJuZWQgICAgICAgICAqLworLyogIHZpYSB0aGUgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgaEluc3RhbmNlIG9yIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBlcXVhbGlzZXIgbW9kdWxlIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIEluc3RhbmNlIG9yIHBQYXJhbXMgIGlzIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgTlVMTCBhZGRyZXNzIGZvciB0aGUgZXF1YWxpc2VyIGZpbHRlciBkZWZpbml0aW9ucyBhbmQgdGhlICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgYmFuZHMgaXMgbm9uLXplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfQ29udHJvbChMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIExpZmVWaWJlcyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGhJbnN0YW5jZSwgcEluRGF0YSBvciBwT3V0RGF0YSBhcmUgTlVMTCAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9BTElHTk1FTlRFUlJPUiAgIFdoZW4gcEluRGF0YSBvciBwT3V0RGF0YSBhcmUgbm90IDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1RPT01BTllTQU1QTEVTICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAgICAgLyogX19MVkVRTkJfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGRlZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuYwpAQCAtMCwwICsxLDI5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkVRTkJfRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgICAgZm9yIGEgcGVha2luZyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyRGVmaW5pdGlvbiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRyAgPSAxMF4oR2FpbmRCLzIwKSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEQgID0gMSAgICAgICAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxIC8gKDEgKyBHKSAgICAgICAgaWYgR2FpbmRCIDwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIEQgKiB0MCkgLyAoMlEgKyBEICogdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluZEIgICAgICBpcyB0aGUgZ2FpbiBpbiBkQnMsIHJhbmdlIC0xNWRCIHRvICsxNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLworLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCisvKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KKy8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KKy8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLworLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9HYWluVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RQQ29zQ29lZltdOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOworICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OworICAgIExWTV9VSU5UMTYgICAgICAgICAgUUZhY3RvciAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvcjsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBEOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOworICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ29zRXJyOworICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgICAgKi8KKyAgICBUMCA9IChMVk1fSU5UMzIpRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIGlmIChHYWluID49IDApCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbisxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOSkgKyAoRHQwID4+IDIpOworICAgIEIyX051bSA9IChEdDAgPj4gMykgLSAoKExWTV9JTlQzMilRRmFjdG9yIDw8IDE4KTsKKyAgICBCMiA9IChCMl9OdW0gLyAoQjJfRGVuID4+IDE2KSkgPDwgMTU7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgorICAgICAqCisgICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAorICAgICAqLworICAgIFQwID0gKFQwID4+IDYpICogMHg3ZjUzOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENvc0VyciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDU7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVkVRTkJfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDb3NFcnIgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ29zRXJyID0gQ29zRXJyIDw8IChMVkVRTkJfRFBDb3NDb2VmWzBdKTsgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cworICAgICAqLworICAgIEIxID0gKDB4NDAwMDAwMDAgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKi8KKyAgICBBMCA9ICgoQjEgPj4gMTYpICogKENvc0VyciA+PiAxMCkpID4+IDY7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIvMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMi8yKSAqICgxIC0gY29zZXJyKHQwKSkgICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKKyAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbisxNV07CisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENhbGN1bGF0ZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyAgICBmb3IgYSBwZWFraW5nIGZpbHRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJEZWZpbml0aW9uICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHICA9IDEwXihHYWluZEIvMjApIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxICAgICAgICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEICA9IDEgLyAoMSArIEcpICAgICAgICBpZiBHYWluZEIgPCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gRCAqIHQwKSAvICgyUSArIEQgKiB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW5kQiAgICAgIGlzIHRoZSBnYWluIGluIGRCcywgcmFuZ2UgLTE1ZEIgdG8gKzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIE55cXVpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCisvKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0dhaW5UYWJsZVtdOworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfQ29zQ29lZltdOworCisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW4gICAgICAgID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBRRmFjdG9yICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yOworCisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgIFQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgRDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEEwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjE7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIER0MDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSAoTFZNX0lOVDMyKUZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBpZiAoR2FpbiA+PSAwKQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4rMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9IEQgKiAoVDAgPj4gMTApOworICAgIEIyX0RlbiA9ICgoTFZNX0lOVDMyKVFGYWN0b3IgPDwgMTkpICsgKER0MCA+PiAyKTsKKyAgICBCMl9OdW0gPSAoRHQwID4+IDMpIC0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOCk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVkVRTkJfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVkVRTkJfQ29zQ29lZlswXSs2KTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisKKyAgICBCMSA9ICgoMHg0MDAwMDAwMCAtIEIyKSA+PiAxNikgKiAoQ09TX1QwID4+IDE2KTsgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKiBjb3ModDApICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyLzIpICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSAoTFZNX0lOVDE2KShBMD4+MTYpOworICAgIHBDb2VmZmljaWVudHMtPkIxID0gKExWTV9JTlQxNikoQjE+PjE1KTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IChMVk1fSU5UMTYpKEIyPj4xNik7CisgICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4rMTVdOworCisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDcxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIF9fTFZFUU5CX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkVRTkJfQ09FRkZTX0hfXworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR2FpbiB0YWJsZSBmb3IgKDEwXihHYWluLzIwKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWRVFOQl9HQUlOU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjg0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODIyMTcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNjM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODAwNDc0ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzc2MTI4ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzQ4ODExICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzE4MTYyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNDAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjgzNzcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjQ1MTg3ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjAxODkzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzdfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTUzMzE2ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDk4ODEzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtODk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDM3NjU5ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzY5MDQzICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjkyMDU0ICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA1NjcyICovCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTA4NzQ5ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEyMjAxOCAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjU4OTI1ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTI1MzggKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NDg5MyAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzc4Mjc5ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDM4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUyNjIgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjIzODcyMSAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTExODg2ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS44MTgzODMgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjE2MjI3OCAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuNTQ4MTM0ICovCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MTA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi45ODEwNzIgKi8KKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjQ2NjgzNiAqLworI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODIxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NDY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC42MjM0MTMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkVRTkJfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjM1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNzg1ICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA1NzAgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDUyNCAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMzkzICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAyODUgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDI2MiAqLworI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWRVFOQl8xMDBEU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS42MjM0MTMgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjAxMTg3MiAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNDY2ODM2ICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy45ODEwNzIgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjU0ODEzNCAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuMTYyMjc4ICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi44MTgzODMgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjUxMTg4NiAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMjM4NzIxICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS45OTUyNjIgKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjc3ODI3OSAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTg0ODkzICovCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS40MTI1MzggKi8KKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI1ODkyNSAqLworI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMTIyMDE4ICovCisjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKi8KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU3ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jCkBAIC0wLDAgKzEsNDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZFUU5CLmgiCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgTi1CYW5kIGVxdWFsaXNlciBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkIHZpYSAgKi8KKy8qICB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIE4tQmFuZCBlcXVhbGlzZXIgY2FwYWJpbGl0aWVzLiBUaGUgY3VycmVudCBjYXBhYmlsaXRpZXMgYXJlIHJldHVybmVkICAgICovCisvKiAgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgaEluc3RhbmNlIG9yIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcENhcGFiaWxpdGllcyA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9TZXRGaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgdHlwZSBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdm9pZCAgICAgICAgICAgICAgICBOb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVG8gc2VsZWN0IHRoZSBiaXF1YWQgdHlwZSB0aGUgZm9sbG93IHJ1bGVzIGFyZSBhcHBsaWVkOiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZmMgPD0gZnMvMTEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBTaW5nbGUgcHJlY2lzaW9uICAgIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgICAgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCisKKworICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOworCisgICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb247ICAgICAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoZmMgPDwgMTUpIDw9IChMT1dfRlJFUSAqIGZzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoKGZjIDw8IDE1KSA8PSAoSElHSF9GUkVRICogZnMpKSAmJiAoUUZhY3RvciA+IDMwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX0RvdWJsZVByZWNpc2lvbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZm9yIG91dCBvZiByYW5nZSBmcmVxdWVuY2llcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKGZjID4gKGZzID4+IDEpKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX091dE9mUmFuZ2U7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9uIHRvIHBlcnNpc3RhbnQgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0gPSBwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV07CisKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSB0eXBlIHRvIHNlbGVjdCBzaW5nbGUgb3IgZG91YmxlICAgICAqLworLyogIHByZWNpc2lvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgQmlxdWFkVHlwZTsgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZSAqLworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzIGZvciBlYWNoIGJhbmQgYnkgdGhlIGluaXQgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHM7IGkrKykKKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgYmFuZCB0eXBlIGZvciBjb3JyZWN0IGluaXRpYWxpc2F0aW9uIG1ldGhvZCBhbmQgcmVjYWxjdWxhdGUgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgKi8KKyAgICAgICAgQmlxdWFkVHlwZSA9IHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV07CisgICAgICAgIHN3aXRjaCAgKEJpcXVhZFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEVRTkJfVGFwc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb246CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBFUU5CX1RhcHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDbGVhcnMgdGhlIGZpbHRlciBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworICAgIExWTV9JTlQxNiAgICAgICAqcFRhcEFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVRhcHM7CisKKworICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQxNiAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwczsKKyAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpL3NpemVvZihMVk1fSU5UMTYpKTsKKworICAgIGlmIChOdW1UYXBzICE9IDApCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBOVUxMIGFkZHJlc3MgZm9yIHRoZSBlcXVhbGlzZXIgZmlsdGVyIGRlZmluaXRpb25zIGFuZCB0aGUgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBiYW5kcyBpcyBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgYkNoYW5nZSAgICA9IExWTV9GQUxTRTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBpID0gMDsKKyAgICBMVkVRTkJfTW9kZV9lbiAgICAgICBPcGVyYXRpbmdNb2RlU2F2ZSA7CisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBpZigocFBhcmFtcy0+TkJhbmRzICE9MCkgJiYgKHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbj09TFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICAvKiBTZXQgdGhlIGFscGhhIGZhY3RvciBvZiB0aGUgbWl4ZXIgKi8KKyAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICB9CisKKworICAgIGlmKCAocEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgICAgIT0gIHBQYXJhbXMtPk5CYW5kcyAgICAgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAhPSAgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAgICkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgICE9ICBwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgIT0gIHBQYXJhbXMtPlNhbXBsZVJhdGUgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAhPSAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICAgICkpCisgICAgeworCisgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICAgICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluICAgICAgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgaWYoYkNoYW5nZSl7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIGNsZWFyIHRoZSBoaXN0b3J5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7ICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSAqLworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzZXQgdGhlIGZpbHRlcnMgZXhjZXB0IGlmIHRoZSBhbGdvIGlzIHN3aXRjaGVkIG9mZgorICAgICAgICAgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkVRTkJfQllQQVNTKXsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBhcyBhbGwgcGFyYW1ldGVycyBjb3VsZCBoYXZlIGNoYW5nZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgIH0KKworICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWTV9NQVhJTlRfMTYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7CisKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOworCisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYpOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKworICAgICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrIGZ1bmN0aW9uIG9mIHRoZSBtaXhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSkKK3sKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2sgID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2s7CisKKyAgICAodm9pZCkgcEdlbmVyYWxQdXJwb3NlOworCisgICAgIC8qCisgICAgICAqIFNlbmQgYW4gQUxHT0ZGIGV2ZW50IGlmIHRoZSBPTi0+T0ZGIHN3aXRjaCB0cmFuc2l0aW9uIGlzIGZpbmlzaGVkCisgICAgICAqLworICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAweDAwMDAwMDAwKSAmJgorICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CisgICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCl7CisgICAgICAgICAgICBDYWxsQmFjayhwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsIExWTV9OVUxMLCBBTEdPUklUSE1fRVFOQl9JRHxMVkVRTkJfRVZFTlRfQUxHT0ZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogIEV4aXQgdHJhbnNpdGlvbiBzdGF0ZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CisKKyAgICByZXR1cm4gMTsKK30KKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNlNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFueSBvZiBwTWVtb3J5VGFibGUgYW5kIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCBhZGRyZXNzICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfTWVtb3J5KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisKKworICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCisgICAgICovCisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0lOU1RBTkNFX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0YW50IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7ICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOyAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0RBVEFfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGFudCBjb2VmZmljaWVudCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWRVFOQl9DT0VGX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLworLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLworLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCisvKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KKy8qICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICAgICovCisvKiAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2U7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBNZW1TaXplOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW07CisgICAgTFZNX0lOVDMyICAgICAgICAgICBpOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycworICAgICAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocENhcGFiaWxpdGllcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycworICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZFUU5CX05VTExBRERSRVNTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKi8KKworICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAqcGhJbnN0YW5jZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCBzaXplb2YoTFZFUU5CX0luc3RhbmNlX3QpKTsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7CisKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgYW5kCisgICAgICogc2V0IHRoZSBzdHJ1Y3R1cmUgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlICAgICAgID0gKnBNZW1vcnlUYWJsZTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgY29lZmZpY2llbnQgbWVtb3J5CisgICAgICovCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOworCisgICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKworCisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGRhdGEgbWVtb3J5CisgICAgICovCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworCisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOworICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwcyA9IChCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSk7CisgICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICA9IChMVkVRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSk7CisgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9IChMVkVRTkJfQmlxdWFkVHlwZV9lbiAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworCisKKyAgICAvKgorICAgICAqIEludGVybmFsbHkgbWFwLCBzdHJ1Y3R1cmUgYW5kIGFsbGlnbiBzY3JhdGNoIG1lbW9yeQorICAgICAqLworICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9JTlQxNiAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0lOVDE2KSk7CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyAgICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5wQmFuZERlZmluaXRpb24gPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgPSBMVkVRTkJfU1RFUkVPOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIHR5cGVzICovCisgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgZmlsdGVyIGhpc3RvcnkgKi8KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgYnlwYXNzIHZhcmlhYmxlcworICAgICAqLworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSAodm9pZCopcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2s7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gTFZNX05VTEw7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwwLExWTV9NQVhJTlRfMTYpOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fRlNfODAwMCwyKTsKKworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICA9IExWTV9GQUxTRTsKKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY5ODBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZFUU5CX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fTFZFUU5CX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZFUU5CLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSBMVkVRTkJfSU5WQUxJRCAgICAgICAgICAgICAgMHhGRkZGICAgICAgICAgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisKKy8qIE1lbW9yeSAqLworI2RlZmluZSBMVkVRTkJfSU5TVEFOQ0VfQUxJR04gICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBpbnN0YW5jZSBzdHJ1Y3R1cmVzICovCisjZGVmaW5lIExWRVFOQl9EQVRBX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgTFZFUU5CX0NPRUZfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWRVFOQl9TQ1JBVENIX0FMSUdOICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLworCisjZGVmaW5lIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMgICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBUQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uID0gMCwKKyAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uID0gMSwKKyAgICBMVkVRTkJfT3V0T2ZSYW5nZSAgICAgID0gMiwKKyAgICBMVkVRTkJfQklRVUFEVFlQRV9NQVggID0gTFZNX01BWElOVF8zMgorfSBMVkVRTkJfQmlxdWFkVHlwZV9lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCisgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCisKKyAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworCisgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICAgICAgICpwRVFOQl9UYXBzOyAgICAgICAgLyogRXF1YWxpc2VyIFRhcHMgKi8KKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgICAgICpwRVFOQl9GaWx0ZXJTdGF0ZTsgLyogU3RhdGUgZm9yIGVhY2ggZmlsdGVyIGJhbmQgKi8KKworICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLworICAgIExWRVFOQl9CYW5kRGVmX3QgICAgICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbnM7ICAvKiBGaWx0ZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgICAgICAgICAgKnBCaXF1YWRUeXBlOyAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCisKKyAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KKyAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICAgIEJ5cGFzc01peGVyOyAgICAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHVzZWQgaW4gdHJhbnNpdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCisKK30gTFZFUU5CX0luc3RhbmNlX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworCit2b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSk7CisKK3ZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAqcEluc3RhbmNlKTsKKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7CisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOworCitMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLCBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfX0xWRVFOQl9QUklWQVRFX0hfXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYzc0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQi5oIgorI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgU0hJRlQgICAgICAgMTMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGFyZSBOVUxMICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SICAgV2hlbiBwSW5EYXRhIG9yIHBPdXREYXRhIGFyZSBub3QgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfVE9PTUFOWVNBTVBMRVMgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAqcFNjcmF0Y2g7CisKKworICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkICovCisgICAgaWYgKCgoKExWTV9JTlQzMilwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgoTFZNX0lOVDMyKXBPdXREYXRhICUgNCkgIT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOworICAgIH0KKworICAgIHBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworCisgICAgLyoKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSAxNi1iaXQgdG8gMzItYml0CisgICAgICAgICAqLworICAgICAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldOworCisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KKworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKKworICAgICAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgICAgIGVsc2V7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAvKiBTY2FsaW5nIHNoaWZ0ICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTW9kZSBpcyBPRkYgc28gY29weSB0aGUgZGF0YSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5XzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJlMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfQ29lZmZzLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKKyAqIGZyZXF1ZW5jeQorICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciAyICogUGkgLyBGcworICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwfTsgICAgLyogNDhrUy9zICovCisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKworCisvKgorICogRCB0YWJsZSBmb3IgMTAwIC8gKEdhaW4gKyAxKQorICovCitjb25zdCBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3MoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMgKyBhNCp4XjQgKyBhNSp4XjUpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKKyAqICsxLjAgdG8gLTEuMAorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiAwLjAgdG8gMC4wMDc4ODUyOTg2CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQorICogdGhlIGVxdWF0aW9uOgorICoKKyAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9EUENvc0NvZWZbXSA9IHsxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzODAwMCAgICAzMjU4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMTAyNSAgIDMyNjMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczEyMDAwICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAgICAzMjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyMjA1MCAgIDMyNzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczI0MDAwICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAgICAzMjcyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0NDEwMCAgIDMyNzM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ4MDAwICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworCisKK2NvbnN0IExWTV9JTlQxNiBMVkVRTkJfTWl4ZXJUQ1RhYmxlW10gPSB7CisgICAgTFZFUU5CX01JWF9UQ19GczgwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczExMDI1LAorICAgIExWRVFOQl9NSVhfVENfRnMxMjAwMCwKKyAgICBMVkVRTkJfTUlYX1RDX0ZzMTYwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczIyMDUwLAorICAgIExWRVFOQl9NSVhfVENfRnMyNDAwMCwKKyAgICBMVkVRTkJfTUlYX1RDX0ZzMzIwMDAsCisgICAgTFZFUU5CX01JWF9UQ19GczQ0MTAwLAorICAgIExWRVFOQl9NSVhfVENfRnM0ODAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUzMzY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaApAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiB0aGUgTFZSRVYgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzICAgICAgKi8KKy8qICByZXF1aXJlZCBieSB0aGUgY2FsbGluZyBsYXllci4gQWxsIG90aGVyIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgYXJlICAgICAgICAqLworLyogIHByaXZhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZSRVZfSF9fCisjZGVmaW5lIF9fTFZSRVZfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsICovCisjZGVmaW5lIExWUkVWX0JMT0NLU0laRV9NVUxUSVBMRSAgICAgICAgICAgICAgICAxICAgICAgIC8qIFByb2Nlc3NpbmcgYmxvY2sgc2l6ZSBtdWx0aXBsZSAqLworI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAvKiBNYXhpbXVtIGRlY2F5IHRpbWUgaXMgNzAwMG1zICovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lIExWUkVWX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICA0ICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJbnN0YW5jZSBoYW5kbGUgKi8KK3R5cGVkZWYgdm9pZCAqTFZSRVZfSGFuZGxlX3Q7CisKKworLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWUkVWX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWUkVWX05VTExBRERSRVNTICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWUkVWX09VVE9GUkFOR0UgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVlJFVl9JTlZBTElETlVNU0FNUExFUyAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIExWUkVWX1JFVFVSTlNUQVRVU19EVU1NWSA9IExWTV9NQVhFTlVNCit9IExWUkVWX1JldHVyblN0YXR1c19lbjsKKworCisvKiBSZXZlcmIgZGVsYXkgbGluZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIExWUkVWX0RFTEFZTElORVNfMSAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmUgZGVsYXkgbGluZSAqLworICAgIExWUkVWX0RFTEFZTElORVNfMiAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUd28gZGVsYXkgbGluZXMgKi8KKyAgICBMVlJFVl9ERUxBWUxJTkVTXzQgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm91ciBkZWxheSBsaW5lcyAqLworICAgIExWUkVWX0RFTEFZTElORVNfRFVNTVkgPSBMVk1fTUFYRU5VTQorfSBMVlJFVl9OdW1EZWxheUxpbmVzX2VuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgUmVnaW9uW0xWUkVWX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLworfSBMVlJFVl9NZW1vcnlUYWJsZV9zdDsKKworCisvKiBDb250cm9sIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIE9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX0Zvcm1hdF9lbiAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLworCisgICAgLyogUGFyYW1ldGVycyBmb3IgUkVWICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExldmVsOyAgICAgICAgICAgICAgICAgIC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTFBGOyAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBIUEY7ICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBUNjA7ICAgICAgICAgICAgICAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEZW5zaXR5OyAgICAgICAgICAgICAgICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEYW1waW5nOyAgICAgICAgICAgICAgICAvKiBEYW1waW5nICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFJvb21TaXplOyAgICAgICAgICAgICAgIC8qIFNpbXVsYXRlZCByb29tIHNpemUsIDEgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gc2l6ZSAqLworCit9IExWUkVWX0NvbnRyb2xQYXJhbXNfc3Q7CisKKworLyogSW5zdGFuY2UgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCisKKyAgICAvKiBSZXZlcmIgKi8KKyAgICBMVk1fRm9ybWF0X2VuICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0cyB0byBzdXBwb3J0ICovCisgICAgTFZSRVZfTnVtRGVsYXlMaW5lc19lbiAgICAgIE51bURlbGF5czsgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZGVsYXkgbGluZXMsIDEsIDIgb3IgNCAqLworCit9IExWUkVWX0luc3RhbmNlUGFyYW1zX3N0OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfR2V0TWVtb3J5VGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIG9idGFpbiB0aGUgTFZSRVYgbW9kdWxlIG1lbW9yeSByZXF1aXJlbWVudHMgdG8gc3VwcG9ydCAgICAgKi8KKy8qICBtZW1vcnkgYWxsb2NhdGlvbi4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byByZXR1cm4gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcHJvdmlkZWQgICAqLworLyogIGR1cmluZyBtZW1vcnkgYWxsb2NhdGlvbiB0byBzdXBwb3J0IGZyZWVpbmcgb2YgbWVtb3J5IHdoZW4gdGhlIExWUkVWIG1vZHVsZSBpcyBubyAgICovCisvKiAgbG9uZ2VyIHJlcXVpcmVkLiBJdCBpcyBjYWxsZWQgaW4gdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhbGxvY2F0ZWQgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGhJbnN0YW5jZSA9IE5VTEwgdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgKi8KKy8qICB3aWxsIGJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlaW5nIG1lbW9yeSwgaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlIHRoZSAgICAgKi8KKy8qICBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgICAgICAgICAgICAqLworLyogIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcE1lbW9yeVRhYmxlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiByZXF1ZXN0aW5nIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHBJbnN0YW5jZVBhcmFtcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRNZW1vcnlUYWJsZShMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAqcEluc3RhbmNlUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBMVlJFViBtb2R1bGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgICAgICovCisvKiAgaW5zdGFuY2UgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byBpbnZhbGlkIHZhbHVlcywgdGhlICAgKi8KKy8qICBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgc2V0IG9mIHZhbGlkIGNvbnRyb2wgICAgICAqLworLyogIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgbWVtb3J5IGFsbG9jYXRpb24gbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgYXBwbGljYXRpb24gYnkgZmlsbGluZyBpbiB0aGUgbWVtb3J5ICAqLworLyogIHJlZ2lvbiBiYXNlIGFkZHJlc3NlcyBpbiB0aGUgbWVtb3J5IHRhYmxlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcGhJbnN0YW5jZSBvciBwTWVtb3J5VGFibGUgb3IgcEluc3RhbmNlUGFyYW1zIGlzIE5VTEwgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBvbmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcyk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlhYX0dldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMVlJFViBtb2R1bGUgY29udHJvbCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU1VDQ0VTUyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwQ29udHJvbFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBMVlJFViBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTmV3UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBOZXdQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbGVhciB0aGUgaW50ZXJuYWwgYXVkaW8gYnVmZmVycyBvZiB0aGUgbW9kdWxlLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICBJbnN0YW5jZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgIGhJbnN0YW5jZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTFZSRVYgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX0lOVkFMSUROVU1TQU1QTEVTIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgICAgIC8qIF9fTFZSRVZfSF9fICovCisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyZWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYwpAQCAtMCwwICsxLDY0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbGllcyB0aGUgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFByaXZhdGUgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcHJpdmF0ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBQcml2YXRlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKQoreworCisgICAgTFZNX01vZGVfZW4gIE9wZXJhdGluZ01vZGU7CisgICAgTFZNX0lOVDMyICAgIE51bWJlck9mRGVsYXlMaW5lczsKKworCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLworICAgIGlmKHBQcml2YXRlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOworICAgIH0KKworICAgIE9wZXJhdGluZ01vZGUgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGU7CisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBoaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0MzMl9Db2Vmc190ICBDb2VmZnM7CisKKyAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9GT19IUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywgJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgJkNvZWZmcyk7CisgICAgICAgIExvYWRDb25zdF8zMigwLAorICAgICAgICAgICAgKHZvaWQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfVGFwc190KS9zaXplb2YoTFZNX0lOVDMyKSk7CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMzIgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0MzMl9Db2Vmc190ICBDb2VmZnM7CisKKworICAgICAgICBDb2VmZnMuQTAgPSAweDdGRkZGRkZGOworICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEbyBub3QgYXBwbHkgZmlsdGVyIGlmIHcgPTIqcGkqZmMvZnMgPj0gMi45CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKE9tZWdhPD1MVlJFVl8yXzlfSU5RMjkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwKKyAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QpL3NpemVvZihMVk1fSU5UMzIpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCisgICAgICovCisgICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCisgICAgeworICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcworICAgICAgICAgKiAwJSAgIC0tIDEwbXMKKyAgICAgICAgICogNTAlICAtLSA2NW1zCisgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKKyAgICAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkvMTApOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIFQgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIHRoZSBhbGwgcGFzcyBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9VSU5UMzIgIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiAgIEFQRGVsYXlTaXplOworICAgICAgICBMVk1fSU5UMzIgICBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fVUlOVDMyICBEZWxheUxlbmd0aFNhbXBsZXMgPSAoTFZNX1VJTlQzMikoRnMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zKTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0lOVDE2ICAgU2NhbGVUYWJsZVtdICA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBMVlJFVl9NQVhfVDJfREVMQVksIExWUkVWX01BWF9UM19ERUxBWX07CisgICAgICAgIExWTV9JTlQxNiAgIE1heEFQX0RlbGF5W10gPSB7TFZSRVZfTUFYX0FQMF9ERUxBWSwgTFZSRVZfTUFYX0FQMV9ERUxBWSwgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAqLworICAgICAgICBmb3IgKGk9MDsgaTxOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMzIgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICBMVk1fSU5UMzIgVGVtcDI7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KKworICAgICAgICAgICAgICAgIFRlbXAyPShMVk1fSU5UMzIpRGVsYXlMZW5ndGhTYW1wbGVzOworICAgICAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAyLCBTY2FsZVRhYmxlW2ldLCBUZW1wMSwgMTUpCisgICAgICAgICAgICAgICAgVGVtcD0oTFZNX1VJTlQzMilUZW1wMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKKworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBUZW1wICAgICAgICAgICAgICAgICAgPSAoTWF4VF9EZWxheVtpXSAtIE1heEFQX0RlbGF5W2ldKSAqIEZzIC8gNDgwMDA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+RGVsYXlfQVBbaV0gPSBwUHJpdmF0ZS0+VFtpXSAtIFRlbXA7CisKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgdGFwIHNlbGVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byB0YXAgQiAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQiB0byB0YXAgQSAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbWF4aW11bSBibG9jayBzaXplIHRvIHRoZSBzbWFsbGVzdCBkZWxheSBzaXplCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gICA9IFRlbXA7CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTGltaXQgdGhlIG1heGltdW0gYmxvY2sgbGVuZ3RoCisgICAgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuPXBQcml2YXRlLT5NYXhCbGtMZW4tMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLworICAgICAgICBpZihwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IChMVk1fSU5UMzIpcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9JTlQzMiAgICAgICBUZW1wOworICAgICAgICBMVk1fSU5UMzIgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0MzMl9Db2Vmc190ICBDb2VmZnM7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBpOworICAgICAgICBMVk1fSU5UMTYgICAgICAgRGFtcGluZyAgICAgID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKKyAgICAgICAgTFZNX0lOVDMyICAgICAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBlYWNoIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpPTA7IGk8TnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoU2NhbGVUYWJsZVtpXSwgRGFtcGluZywgVGVtcCwgMTUpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IERhbXBpbmc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihUZW1wIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKChMVk1fVUlOVDE2KVRlbXAsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZmZzLkEwID0gMHg3RkYwMDAwMDsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICAgICAgICAgIENvZWZmcy5CMSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2ldLCAmcFByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzW2ldLCAmQ29lZmZzKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgQWxsLXBhc3MgZmlsdGVyIG1peGVyIHRpbWUgY29uc3RhbnRzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0lOVDMyICAgQWxwaGEgICAgPSAoTFZNX0lOVDMyKUxWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOworICAgICAgICBMVk1fSU5UMzIgICBBbHBoYVRhcCA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOworCisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGZlZWQgYmFjayBnYWluCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgICAgICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKworICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBHWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCisKKyAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgR1szXSA9IDA7CisgICAgICAgICAgICBHWzJdID0gMDsKKyAgICAgICAgICAgIEdbMV0gPSAwOworICAgICAgICAgICAgR1swXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMzIgICBUZW1wMTsKKyAgICAgICAgICAgIExWTV9JTlQzMiAgIFRlbXAyOworICAgICAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgICAgIExWTV9JTlQxNiAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaT0wOyBpPE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRlbXAxID0gKDMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zICogU2NhbGVUYWJsZVtpXSkgLyBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDsKKyAgICAgICAgICAgICAgICBpZihUZW1wMSA+PSAoNCA8PCAxNSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZigoVGVtcDEgPj0gKDIgPDwgMTUpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAyID0gTFZNX1Bvd2VyMTAoLShUZW1wMSA8PCAxNCkpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgPDwgMTQpKTsKKyAgICAgICAgICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoVGVtcDEsVGVtcDIsVGVtcDEsMjQpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSA8PCAxNSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHW2ldID0gVGVtcDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgIFRlbXBHOworICAgICAgICAgICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxPTkVfT1ZFUl9TUVJUX1RXTyxUZW1wRywxNSkKKyAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTw8NzsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV08PDc7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdPDw3OworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTw8NzsKKyAgICB9CisKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiBJbmRleD0wOworICAgICAgICBMVk1fSU5UMzIgaT0wOworICAgICAgICBMVk1fSU5UMzIgR2Fpbj0wOworICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0lOVDMyIFQ2MDsKKyAgICAgICAgTFZNX0lOVDMyIENvZWZzWzVdOworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU9PTApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvb21TaXplPTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSb29tU2l6ZT0oTFZNX0lOVDMyKXBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDwxMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IDEwMCAqIExWUkVWX1Q2MF9TQ0FMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFQ2MCA9IHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbmVhcmVzdCByb29tIHNpemUgaW4gdGFibGUgKi8KKyAgICAgICAgZm9yKGk9MDtpPDI0O2krKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoUm9vbVNpemU8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4PWk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGlmKFJvb21TaXplPT1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGFrZSB0YWJsZSB2YWx1ZXMgaWYgdGhlIHJvb20gc2l6ZSBpcyBpbiB0YWJsZSAqLworICAgICAgICAgICAgZm9yKGk9MTtpPDU7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV09TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XT0wOworICAgICAgICAgICAgR2Fpbj1MVk1fUG9seW5vbWlhbCgzLENvZWZzLFQ2MCk7ICAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiBiZXR3ZWVuIG5lYXJlc3Qgcm9vbSBzaXplcyAqLworCisgICAgICAgICAgICBMVk1fSU5UMzIgR2FpbjEsR2FpbjI7CisgICAgICAgICAgICBMVk1fSU5UMzIgVG90X0Rpc3QsRGlzdDsKKworICAgICAgICAgICAgVG90X0Rpc3Q9TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0tTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKyAgICAgICAgICAgIERpc3Q9Um9vbVNpemUtTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKworCisgICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3IgZmlyc3QgKi8KKyAgICAgICAgICAgIGZvcihpPTE7aTw1O2krKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdPUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XT0wOworCisgICAgICAgICAgICBHYWluMT1MVk1fUG9seW5vbWlhbCgzLENvZWZzLFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIHNlY29uZCAqLworICAgICAgICAgICAgZm9yKGk9MTtpPDU7aSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV09TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XT0wOworCisgICAgICAgICAgICBHYWluMj1MVk1fUG9seW5vbWlhbCgzLENvZWZzLFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogTGluZWFyIEludGVycG9sYXRlIHRoZSBnYWluICovCisgICAgICAgICAgICBHYWluID0gR2FpbjErICgoKEdhaW4yLUdhaW4xKSpEaXN0KS8oVG90X0Rpc3QpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnZlcnNlIG9mIGdhaW46IFEuMTUKKyAgICAgICAgICogR2FpbiBpcyBtb3N0bHkgYWJvdmUgb25lIGV4Y2VwdCBmZXcgY2FzZXMsIHRha2Ugb25seSBnYWlucyBhYm92ZSAxCisgICAgICAgICAqLworICAgICAgICBpZihHYWluIDwgMTY3NzcyMTZMKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbj0gMzI3Njc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2Fpbj0oTFZNX0lOVDE2KShMVk1fTUFYSU5UXzMyLyhHYWluPj44KSk7CisgICAgICAgIH0KKworCisgICAgICAgIEluZGV4PSgoMzI3NjcqMTAwKS8oMTAwK3BQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwpKTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW49KExWTV9JTlQxNikoKHBQcml2YXRlLT5HYWluKkluZGV4KT4+MTUpOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IHBQcml2YXRlLT5HYWluKkluZGV4OworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fSU5UMzIgICBiID0gcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CisKKyAgICAgICAgZm9yIChpPTA7aTw0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICA9IGI7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgPSBiOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgICB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIE1PTk8gZm9ybWF0ICovCisgICAgICAgIExWTV9JTlQzMiAgICBBbHBoYTsKKworICAgICAgICBBbHBoYSA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9GRUVEQkFDS01JWEVSX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5BbHBoYT1BbHBoYTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uQWxwaGE9QWxwaGE7CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLkFscGhhPUFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5BbHBoYT1BbHBoYTsKKworICAgICAgICBOdW1DaGFubmVscyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMSA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9CWVBBU1NNSVhFUl9UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuQWxwaGEgICAgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0YXJnZXRzCisgICAgICovCisgICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAmJgorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSkKKyAgICB7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKChMVk1fSU5UMzIpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKiAzMjc2NykvMTAwKTw8MTY7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUpCisgICAgeworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKChMVk1fSU5UMzIpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKiAzMjc2NykvMTAwKTw8MTY7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMHgwM0ZGRkZGRjsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qCisgICAgICogSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCB0byBiZWdpbiBpbW1lZGlhdGUgcGxheWJhY2sgb2YgdGhlIGVmZmVjdAorICAgICAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDE7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycworICAgICAqLworICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zID0gcFByaXZhdGUtPk5ld1BhcmFtczsKKyAgICBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gT3BlcmF0aW5nTW9kZTsKKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgZmxhZworICAgICAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPSBMVk1fRkFMU0U7CisgICAgfQorCisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnRyb2xzIHRoZSBPbiB0byBPZmYgb3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQcml2YXRlICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHByaXZhdGUgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwUHJpdmF0ZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrICh2b2lkICpwQ2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBHZW5lcmFsUHVycG9zZSApCit7CisKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopcENhbGxiYWNrRGF0YTsKKworCisgICAgLyoKKyAgICAgKiBBdm9pZCBidWlsZCB3YXJuaW5ncworICAgICAqLworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKKyAgICAodm9pZClHZW5lcmFsUHVycG9zZTsKKworCisgICAgLyoKKyAgICAgKiBUdXJuIG9mZgorICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9UUlVFOworICAgIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKChMVlJFVl9IYW5kbGVfdClwQ2FsbGJhY2tEYXRhKTsKKworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjFlODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVybmFsIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIG1vZHVsZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgSW5zdGFuY2UgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKExWUkVWX0hhbmRsZV90ICBoSW5zdGFuY2UpCit7CisKKyAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCisgICAgICovCisKKworICAgIExvYWRDb25zdF8zMigwLAorICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgIDIpOworICAgIExvYWRDb25zdF8zMigwLAorICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgIDIpOworCisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QyX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworCisgICAgfQorCisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICB9CisKKyAgICBpZigoTFZNX1VJTlQxNilwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID49IExWUkVWX0RFTEFZTElORVNfMSkKKyAgICB7CisgICAgICAgIExvYWRDb25zdF8zMigwLCAoTFZNX0lOVDMyICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7CisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlZTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMVlJFViBtb2R1bGUgY29udHJvbCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwQ29udHJvbFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpCit7CisKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBDb250cm9sUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgKnBDb250cm9sUGFyYW1zID0gcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtczsKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhNTEzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIExWUkVWIG1vZHVsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCAgICAgKi8KKy8qICBpbnN0YW5jZSBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsICAgICAgICAqLworLyogIGluYWN0aXZlIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcGhJbnN0YW5jZSBvciBwTWVtb3J5VGFibGUgb3IgcEluc3RhbmNlUGFyYW1zIGlzIE5VTEwgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBvbmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcykKK3sKKworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgICAqcExWUkVWX1ByaXZhdGU7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGFsbCBpbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQorICAgICAqLworICAgIC8qIENoZWNrIGZvciBhIG5vbi16ZXJvIGJsb2NrIHNpemUgKi8KKyAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLworICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSYmCisgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpJiYKKyAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyk7CisgICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyk7CisKKyAgICAvKgorICAgICAqIFplcm8gYWxsIG1lbW9yeSByZWdpb25zCisgICAgICovCisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisgICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgfQorICAgIHBMVlJFVl9Qcml2YXRlICAgICAgICAgICAgICA9KExWUkVWX0luc3RhbmNlX3N0ICopKnBoSW5zdGFuY2U7CisgICAgcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICB9CisgICAgZWxzZSBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDBfREVMQVk7CisgICAgfQorCisgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGRhdGEsIGNvZWZmaWNpZW50IGFuZCB0ZW1wb3JhcnkgbWVtb3J5IHBvaW50ZXJzCisgICAgICovCisgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAsKExWTV9JTlQxNilMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICwoTFZNX0lOVDE2KUxWUkVWX01BWF9UMl9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgLChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAsKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgfQorCisgICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgLyogQWxsLXBhc3MgZGVsYXkgYnVmZmVyIGFkZHJlc3NlcyBhbmQgc2l6ZXMgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFswXSAgICAgICAgID0gTFZSRVZfTUFYX1QwX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5UWzFdICAgICAgICAgPSBMVlJFVl9NQVhfVDFfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPlRbMl0gICAgICAgICA9IExWUkVWX01BWF9UMl9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFszXSAgICAgICAgID0gTFZSRVZfTUFYX1QzX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOyAgICAgICAvKiBTZWxlY3Qgc21vb3RoaW5nIEEgdG8gQiAqLworCisKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cEZhc3RDb2VmICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCAyICogc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlIGZvciBlbmQgbWl4ICovCisgICAgTG9hZENvbnN0XzMyKDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUqMikpOworCisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcyA9ICpwSW5zdGFuY2VQYXJhbXM7CisKKworICAgIC8qCisgICAgICogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIGludmFsaWQKKyAgICAgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlICAgID0gTFZNX0ZTX0lOVkFMSUQ7CisgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX0RVTU1ZOworICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU09VUkNFX0RVTU1ZOworCisgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICAgICAgID0gTFZNX1RSVUU7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworCisgICAgLyoKKyAgICAgKiBTZXQgbWl4ZXIgcGFyYW1ldGVycworICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiAgICAgID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMiAgICA9IHBMVlJFVl9Qcml2YXRlOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UyICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazIgICAgICAgICAgPSBCeXBhc3NNaXhlcl9DYWxsYmFjazsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgICAgICAgICAgICA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgICAgICAgICAgICAgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMSAgICAgID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMSAgICA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UxICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazEgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQxICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgICAgICAgICAgICA9IDB4MDAwMDAwMDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworCisgICAgcExWUkVWX1ByaXZhdGUtPlJvb21TaXplSW5tcyAgICAgICAgICAgICAgICAgICAgPSAxMDA7ICAvLyAxMDAgbXNlYworCisKKyAgICAvKgorICAgICAqICBTZXQgdGhlIG91dHB1dCBnYWluIG1peGVyIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAweDAzZmZmZmZmOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMHgwM2ZmZmZmZjsKKworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cE9mZnNldEFbaV0gPSBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV07CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QltpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKKyAgICAgICAgLyogRGVsYXkgdGFwIHNlbGVjdGlvbiBtaXhlciAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsYmFja0hhbmRsZTIgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wR2VuZXJhbFB1cnBvc2UyID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMiAgICAgICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MiAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTEgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxiYWNrSGFuZGxlMSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBHZW5lcmFsUHVycG9zZTEgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DdXJyZW50ICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICAvKiBGZWVkYmFjayBtaXhlciAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBDYWxsQmFjayAgICAgICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1NldCAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICAgICAgICA9IDA7CisgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gbWl4ZXIgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ2FsbGJhY2tQYXJhbSAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsYmFja0hhbmRsZSAgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbEJhY2sgICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrU2V0ICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkN1cnJlbnQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5UYXJnZXQgICAgICAgICAgID0gMDsKKyAgICB9CisgICAgLyogRGVsYXkgdGFwIGluZGV4ICovCisgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzBdID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbMF0gPSBMVlJFVl9NQVhfQVAwX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVsxXSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzFdID0gTFZSRVZfTUFYX0FQMV9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QV9EZWxheVNpemVbMl0gPSBMVlJFVl9NQVhfQVAyX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5CX0RlbGF5U2l6ZVsyXSA9IExWUkVWX01BWF9BUDJfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzNdID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbM10gPSBMVlJFVl9NQVhfQVAzX0RFTEFZOworCisKKyAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycygqcGhJbnN0YW5jZSk7CisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTI0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYWxsb2NhdGVkICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGFkZHJlc3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwTWVtb3J5VGFibGUgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHJlcXVlc3RpbmcgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgcEluc3RhbmNlUGFyYW1zICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldE1lbW9yeVRhYmxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICpwSW5zdGFuY2VQYXJhbXMpCit7CisKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBTbG93RGF0YTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0RGF0YTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0Q29lZjsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBUZW1wb3Jhcnk7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCisgICAgaWYgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlUGFyYW1zICE9IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIHNvIGNoZWNrIHRoZSBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBDaGVjayBmb3IgYSBub24temVybyBibG9jayBzaXplICovCisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLworICAgICAgICBpZiAoKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMSkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpICYmCisgICAgICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdENvZWYsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCAodm9pZCAqKUxWTV9OVUxMKTsKKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgZm9yIG51bGwgcG9pbnRlcnMKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMgPT0gTFZNX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNlbGVjdCB0aGUgbWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplCisgICAgICAgICAqLworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU18yKQorICAgICAgICB7CisgICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAxX0RFTEFZOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKE1heEJsb2NrU2l6ZT5wSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgICAgICB9CisKKworICAgICAgICAvKgorICAgICAgICAgKiBTbG93IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTbG93RGF0YSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7CisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgeworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICB9CisKKyAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgICAgICB7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGNvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdENvZWYpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFRlbXBvcmFyeSBmYXN0IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIqc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCisKKyAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlRlbXBvcmFyeSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworCisKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlCisgICAgICAgICAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlOworICAgIH0KKworCisgICAgcmV0dXJuKExWUkVWX1NVQ0NFU1MpOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZmE0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVlJFVl9QUklWQVRFX0hfXworI2RlZmluZSBfX0xWUkVWX1BSSVZBVEVfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWLmgiCisjaW5jbHVkZSAiTFZSRVZfVGFibGVzLmgiCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIk1peGVyLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmFsICovCisjZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgICAgMjMxNzAgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAxNzE3OTg2OSAgICAgICAgICAgLyogMC44ICogMl4zMSAqLworI2RlZmluZSBMVlJFVl9IRUFEUk9PTSAgICAgICAgICAgICAgICAgICA4MTkyICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAxNTgzNzY5MTkwTCAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgICAgIDB4NUE4MiAgICAgICAgICAgLyogLTNkQiBpbiBRMTUgZm9ybWF0ICovCisKKy8qIEludGVuYWwgY29uc3RhbnRzICovCisjZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMF9vbl80ICAgICAgICAgIDMyNzY4CisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgICAgICAgICAgNDMxMjUKKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCAgICAgICAgICA1Njc1NQorI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfM19vbl80ICAgICAgICAgIDc0Njk0CisjZGVmaW5lIExWUkVWX1Q2MF9TQ0FMRSAgICAgICAgICAgICAgICAzMDY3NzQgICAgICAgICAgIC8qKDMyNzY3LzcwMDApPDwxNiAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgIDMyNzY3ICAgICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgICAyNDg5OCAgICAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAgMTg5MTkgICAgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLworI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgIDE0Mzc1ICAgICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMjUyNyAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDJfREVMQVkgICAgICAgICAgICAgICAzMzI2ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMV9ERUxBWSAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgNTc2MCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAzX0RFTEFZICAgICAgICAgICAgICAxNjg1ICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDJfREVMQVkgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMjkxOCAgICAgICAgICAgLyogKCg0ODAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAzODQwICAgICAgICAgICAvKiAoKDQ4MDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX0JZUEFTU01JWEVSX1RDICAgICAgICAgICAgIDEwMDAgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50Ki8KKyNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQyAgICAgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIHRpbWUgY29uc3RhbnQgKi8KKyNkZWZpbmUgTFZSRVZfQUxMUEFTU19UQVBfVEMgICAgICAgICAgICAgMTAwMDAgICAgICAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciBkZWx5IHRhcCBjaGFuZ2UgKi8KKyNkZWZpbmUgTFZSRVZfRkVFREJBQ0tNSVhFUl9UQyAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogRmVlZGJhY2sgbWl4ZXIgdGltZSBjb25zdGFudCovCisjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgICAgICAgICAgICAgIDUgICAgICAgICAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KKworLyogUGFyYW1ldGVyIGxpbWl0cyAqLworI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgICA5ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCisjZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgICAgICAgICAgICAgICA1MCAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGxpbWl0cyAqLworI2RlZmluZSBMVlJFVl9NQVhfTFBGX0NPUk5FUiAgICAgICAgICAgIDIzOTk5CisjZGVmaW5lIExWUkVWX01JTl9IUEZfQ09STkVSICAgICAgICAgICAgICAgMjAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWxyZXIgbGltaXRzICovCisjZGVmaW5lIExWUkVWX01BWF9IUEZfQ09STkVSICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1Q2MCAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAgICAgLyogTWF4aW11bSBUNjAgdGltZSBpbiBtcyAqLworI2RlZmluZSBMVlJFVl9NQVhfREVOU0lUWSAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBNYXhpbXVtIGRlbnNpdHksIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0RBTVBJTkcgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gcm9vbSBzaXplLCAxMDAlICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKworICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IEhQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBMUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIHRhcHMgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBSZXZMUFRhcHNbNF07ICAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgdGFwcyAqLworCit9IExWUkVWX0Zhc3REYXRhX3N0OworCisKKy8qIEZhc3QgY29lZmZpY2llbnQgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgSFBDb2VmczsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCisgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgTFBDb2VmczsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZMUENvZWZzWzRdOyAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgY29lZmZpY2llbnRzICovCisKK30gTFZSRVZfRmFzdENvZWZfc3Q7CisKKworLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBHZW5lcmFsICovCisgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgIE1lbW9yeVRhYmxlOyAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBDdXJyZW50UGFyYW1zOyAgICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gKi8KKyAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiQ29udHJvbFBlbmRpbmc7ICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBuZXcgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWl4IGxldmVsIGlzIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFJvb21TaXplSW5tczsgICAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZm9yIGludGVybmFsIHByb2Nlc3NpbmcgKi8KKworICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCisgICAgTFZSRVZfRmFzdERhdGFfc3QgICAgICAgKnBGYXN0RGF0YTsgICAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwU2NyYXRjaERlbGF5TGluZVs0XTsgICAgICAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgICAgLyogUmV2ZXJiIGJsb2NrIGlucHV0IHNhdmUgZm9yIGRyeS93ZXQgbWl4aW5nKi8KKworICAgIC8qIEZlZWRiYWNrIG1hdHJpeCAqLworICAgIE1peF8xU3RfQ2xsX3QgICAgICAgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgICAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXByZXNzaW9uIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCisKKyAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBEZWxheV9BUFs0XTsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBvdGhlcndpc2UgQiB0byBBICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwT2Zmc2V0QVs0XTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLworICAgIE1peF8yU3RfQ2xsX3QgICAgICAgICAgIE1peGVyX0FQVGFwc1s0XTsgICAgICAgICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLworICAgIE1peF8xU3RfQ2xsX3QgICAgICAgICAgIE1peGVyX1NHRmVlZGJhY2tbNF07ICAgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF90ICAgICAgICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgICAgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLworCisgICAgLyogT3V0cHV0IGdhaW4gKi8KKyAgICBNaXhfMlN0X0NsbF90ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgICAgLyogRHJ5L3dldCBtaXhlciAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCisgICAgTWl4XzFTdF9DbGxfdCAgICAgICAgICAgR2Fpbk1peGVyOyAgICAgICAgICAgICAgICAgIC8qIEdhaW4gc21vb3RoaW5nICovCisKK30gTFZSRVZfSW5zdGFuY2Vfc3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyhMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKTsKKwordm9pZCAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICAgICAgICAgICAqcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBQcml2YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKKworTFZNX0lOVDMyICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sodm9pZCAgICAgICAqcENhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgR2VuZXJhbFB1cnBvc2UgKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qKiBfX0xWUkVWX1BSSVZBVEVfSF9fICoqLworCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2E4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMVlJFViBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICBOdW1TYW1wbGVzKQoreworICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKKyAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcElucHV0ICA9IChMVk1fSU5UMzIgKilwSW5EYXRhOworICAgTFZNX0lOVDMyICAgICAgICAgICAgICpwT3V0cHV0ID0gcE91dERhdGE7CisgICBMVk1fSU5UMzIgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcywgUmVtYWluaW5nU2FtcGxlczsKKyAgIExWTV9JTlQzMiAgICAgICAgICAgICBmb3JtYXQgPSAxOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucworICAgICAqLworCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBuZXcgY29udHJvbHMgc2V0dGluZ3MgaWYgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZihwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgZXJyb3JDb2RlOworCisgICAgICAgIC8qCisgICAgICAgICAqIENsZWFyIHRoZSBwZW5kaW5nIGZsYWcgYW5kIHVwZGF0ZSB0aGUgY29udHJvbCBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKworICAgICAgICBlcnJvckNvZGUgPSBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChwTFZSRVZfUHJpdmF0ZSk7CisKKyAgICAgICAgaWYoZXJyb3JDb2RlICE9IExWUkVWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyYXAgdGhlIGNhc2Ugd2hlcmUgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8uCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgT0ZGIGNvcHkgYW5kIHJlZm9ybWF0IHRoZSBkYXRhIGFzIG5lY2Vzc2FyeQorICAgICAqLworICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKKyAgICB7CisgICAgICAgIGlmKHBJbnB1dCAhPSBwT3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgY29udmVydCB0byBzdGVyZW8gaXMgcmVxdWlyZWQKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZihwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8peworICAgICAgICAgICAgICAgIE1vbm9UbzJJXzMyKHBJbnB1dCwgcE91dHB1dCwgTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAyKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworICAgIH0KKworICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDMyKU51bVNhbXBsZXM7CisKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgZm9ybWF0ID0gMjsKKyAgICB9CisKKyAgICB3aGlsZSAoUmVtYWluaW5nU2FtcGxlcyE9MCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3MgdGhlIGRhdGEKKyAgICAgICAgICovCisKKyAgICAgICAgaWYoUmVtYWluaW5nU2FtcGxlcyA+ICBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gIHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW47CisgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gKExWTV9JTlQxNikoUmVtYWluaW5nU2FtcGxlcyAtIFNhbXBsZXNUb1Byb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcyA9IFJlbWFpbmluZ1NhbXBsZXM7CisgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIFJldmVyYkJsb2NrKHBJbnB1dCwgcE91dHB1dCwgcExWUkVWX1ByaXZhdGUsIChMVk1fVUlOVDE2KVNhbXBsZXNUb1Byb2Nlc3MpOworCisgICAgICAgIHBJbnB1dCAgPSAoTFZNX0lOVDMyICopKHBJbnB1dCArKFNhbXBsZXNUb1Byb2Nlc3MqZm9ybWF0KSk7CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOyAgICAgIC8vIEFsd2F5cyBzdGVyZW8gb3V0cHV0CisgICAgfQorCisgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMVlJFViBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBSZXZlcmJCbG9jayhMVk1fSU5UMzIgKnBJbnB1dCwgTFZNX0lOVDMyICpwT3V0cHV0LCBMVlJFVl9JbnN0YW5jZV9zdCAqcFByaXZhdGUsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKK3sKKyAgICBMVk1fSU5UMTYgICBqLCBzaXplOworICAgIExWTV9JTlQzMiAgICpwRGVsYXlMaW5lOworICAgIExWTV9JTlQzMiAgICpwRGVsYXlMaW5lSW5wdXQgPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0lOVDMyICAgKnBTY3JhdGNoID0gcFByaXZhdGUtPnBTY3JhdGNoOworICAgIExWTV9JTlQzMiAgICpwSW47CisgICAgTFZNX0lOVDMyICAgKnBUZW1wID0gcFByaXZhdGUtPnBJbnB1dFNhdmU7CisgICAgTFZNX0lOVDMyICAgTnVtYmVyT2ZEZWxheUxpbmVzOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEFsbCBjYWxjdWxhdGlvbnMgd2lsbCBnbyBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBwVGVtcCwgdGhpcyB3aWxsICAgICoKKyAgICAgKiB0aGVuIGJlIG1peGVkIHdpdGggdGhlIG9yaWdpbmFsIGlucHV0IHRvIGNyZWF0ZSB0aGUgZmluYWwgb3V0cHV0LiAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFdoZW4gSU5QTEFDRSBwcm9jZXNzaW5nIGlzIHNlbGVjdGVkIHRoaXMgbXVzdCBiZSBhIHRlbXBvcmFyeSBidWZmZXIgYW5kICAgICoKKyAgICAgKiBoZW5jZSB0aGlzIGlzIHRoZSB3b3JzdCBjYXNlLCBzbyBmb3Igc2ltcGxpY2l0eSB0aGlzIHdpbGwgQUxXQVlTIGJlIHNvICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW50b3VjaGVkIHVudGlsIHRoZSBvdXRwdXQgb2YgdGhlIG1peGVyIGlmICAgICoKKyAgICAgKiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqIFRoZSB0ZW1wIGJ1ZmZlciB3aWxsIGFsd2F5cyBiZSBOdW1TYW1wbGVzIGluIHNpemUgcmVnYXJkbGVzcyBvZiBNT05PIG9yICAgICoKKyAgICAgKiBTVEVSRU8gaW5wdXQuIEluIHRoZSBjYXNlIG9mIHN0ZXJlbyBpbnB1dCBhbGwgcHJvY2Vzc2luZyBpcyBkb25lIGluIE1PTk8gICAqCisgICAgICogYW5kIHRoZSBmaW5hbCBvdXRwdXQgaXMgY29udmVydGVkIHRvIFNURVJFTyBhZnRlciB0aGUgbWl4ZXIgICAgICAgICAgICAgICAgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCApCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OworICAgIH0KKyAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yICkKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgcEluID0gcElucHV0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgorICAgICAgICAgKi8KKworICAgICAgICBGcm9tMmlUb01vbm9fMzIoIHBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIHBJbiA9IHBUZW1wOworICAgIH0KKworICAgIE11bHQzc18zMngxNihwSW4sCisgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTFZSRVZfSEVBRFJPT00sCisgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgLyoKKyAgICAgKiAgSGlnaCBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIC8qCisgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgLyoKKyAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKKyAgICAgKi8KKworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKyAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCisgICAgICAgICAqLworICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIHRvIHRoZSBBUCBkZWxheSBpbiB0aGUgcHJvY2VzcyAqLworICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKikmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBQcml2YXRlLT5UW2pdLU51bVNhbXBsZXMpIDw8IDEpKTsgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgICAgICAvKiBBcHBseSB0aGUgc21vb3RoZWQgZmVlZGJhY2sgYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBkZWxheSBsaW5lICovCisgICAgICAgIE1hYzNzX1NhdF8zMngxNigmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgLTB4N2ZmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0tTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBBcHBseSBzbW9vdGhlZCBmZWVkZm9yd2FyZCBzYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0tTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgb3V0cHV0ICovCisgICAgICAgIE1hYzNzX1NhdF8zMngxNigmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIEZlZWRiYWNrIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5GZWVkYmFja01peGVyW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgQXBwbHkgcm90YXRpb24gbWF0cml4IGFuZCBkZWxheSBzYW1wbGVzCisgICAgICovCisgICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCisgICAgeworCisgICAgICAgIENvcHlfMTYoIChMVk1fSU5UMTYqKShwVGVtcCksCisgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKShwRGVsYXlMaW5lSW5wdXQpLAorICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoKGopCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICBERVNUSU5BVElPTiovCisgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0XzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAgRGVsYXkgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdLU51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSkpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKworICAgIH0KKworCisgICAgLyoKKyAgICAgKiAgQ3JlYXRlIHN0ZXJlbyBvdXRwdXQKKyAgICAgKi8KKyAgICBzd2l0Y2gocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cykKKyAgICB7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU180OgorICAgICAgICAgICAgIEFkZDJfU2F0XzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgSm9pblRvMmlfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMjoKKworICAgICAgICAgICAgIENvcHlfMTYoIChMVk1fSU5UMTYqKXBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsKKworICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMHg4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgICAgICAgICAgIEpvaW5UbzJpXzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18xOgorICAgICAgICAgICAgTW9ub1RvMklfMzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKworICAgIC8qCisgICAgICogIERyeS93ZXQgbWl4ZXIKKyAgICAgKi8KKworICAgIHNpemUgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpOworICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICAvKiBBcHBseSBHYWluKi8KKworICAgIFNoaWZ0X1NhdF92MzJ4djMyIChMVlJFVl9PVVRQVVRHQUlOX1NISUZULAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5HYWluTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgcmV0dXJuOworfQorCisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODk1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExWUkVWIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBOZXdQYXJhbXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBoSW5zdGFuY2Ugb3IgcE5ld1BhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9PVVRPRlJBTkdFICAgICAgICBXaGVuIGFueSBvZiB0aGUgbmV3IHBhcmFtZXRlcnMgaXMgb3V0IG9mIHJhbmdlICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcE5ld1BhcmFtcykKK3sKKworICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKKyAgICAgKi8KKyAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKKyAgICAgICAgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKKyAgICB9CisKKworICAgIGlmIChwTmV3UGFyYW1zLT5MZXZlbCA+IExWUkVWX01BWF9MRVZFTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIGlmICgocE5ld1BhcmFtcy0+TFBGIDwgTFZSRVZfTUlOX0xQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5MUEYgPiBMVlJFVl9NQVhfTFBGX0NPUk5FUikpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICBpZiAoKHBOZXdQYXJhbXMtPkhQRiA8IExWUkVWX01JTl9IUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+SFBGID4gTFZSRVZfTUFYX0hQRl9DT1JORVIpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgaWYgKHBOZXdQYXJhbXMtPlQ2MCA+IExWUkVWX01BWF9UNjApCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICBpZiAocE5ld1BhcmFtcy0+RGVuc2l0eSA+IExWUkVWX01BWF9ERU5TSVRZKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgaWYgKHBOZXdQYXJhbXMtPkRhbXBpbmcgPiBMVlJFVl9NQVhfREFNUElORykKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIGlmIChwTmV3UGFyYW1zLT5Sb29tU2l6ZSA+IExWUkVWX01BWF9ST09NU0laRSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworCisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGFuZCBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhleSBhcmUgYXZhaWxhYmxlCisgICAgICovCisgICAgcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtcyAgICAgICA9ICpwTmV3UGFyYW1zOworICAgIHBMVlJFVl9Qcml2YXRlLT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworfQorCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTZkNDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KK2NvbnN0IExWTV9VSU5UMTYgTFZNX0ZzVGFibGVbXSA9IHsKKyAgICA4MDAwICwKKyAgICAxMTAyNSwKKyAgICAxMjAwMCwKKyAgICAxNjAwMCwKKyAgICAyMjA1MCwKKyAgICAyNDAwMCwKKyAgICAzMjAwMCwKKyAgICA0NDEwMCwKKyAgICA0ODAwMAorfTsKKworLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCitMVk1fVUlOVDE2IExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCl7CisgICAgaWYgKEZzSW5kZXggPiBMVk1fRlNfNDgwMDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7Cit9CisKKy8qIEluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RhbnQgaW5wdXQgYW5kIG91dCBwdXQgc2lnbmFsIHN0cmVuZ3RocworICAgb3V0cHV0IGdhaW4vYXR0ZW51YXRpb24gaXMgYXBwbGllZC4gVGhpcyBnYWluIGRlcGVuZHMgb24gVDYwIGFuZCBSb29tcworICAgc2l6ZSBwYXJhbWV0ZXJzLiBUaGVzZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyBhcmUgY2FsY3VsYXRlZCBleHBlcmltZW50YWxseS4KKyAgIEZpcnN0IHZhbHVlIGluIHRoZSB0YWJsZSBpcyByb29tIHNpemUKKyAgIHNlY29uZCB2YWx1ZSBpcyAgQTAKKyAgIHRoaXJkIHZhbHVlIGlzICAgQTEKKyAgIGZvdXJ0aCB2YWx1ZSBpcyAgQTIKKyAgIGZpZnRoIHZhbHVlIGlzICAgQTMKKyAgIHNpeHRoIHZhbHVlIGlzICAgQTQKKworICAgICBzaGlmdCB2YWx1ZSAgaXMgdG8gYmUgYWRkZWQgYXJyYXkgKHRvIHVzZSBMVk1fUG9seW5vbWlhbCBmdW5jdGlvbikKKworICBUaGUgZ2FpbiBpcyBjYWxjdWxhdGVkIHVzaW5nIHZhcmlhYmxlIHg9KFQ2MCozMjc2Ny83MDAwKSozMjc2ODsKKworICAgZmlyc3QgdmFsdWVzIGlzIHVzZWQgdG8gZ2V0IHBvbHlub21pYWwgc2V0IGZvciBnaXZlbiByb29tIHNpemUsCisgICBGb3Igcm9vbSBzaXplcyB3aGljaCBhcmUgbm90IGluIHRoZSB0YWJsZSwgbGluZWFyIGludGVycG9sYXRpb24gY2FuIGJlIHVzZWQuCisKKyAgKi8KKworLyogTm9ybWFsaXppbmcgb3V0cHV0IGluY2x1ZGluZyBSZXZlcmIgTGV2ZWwgcGFydCAob25seSBzaGlmdCB1cCkqLworY29uc3QgTFZNX0lOVDMyIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdPXt7MSwxNzU0NzQzNCwxMjg4Njc0MzQsLTEyMDk4ODg5Niw1MDc2MTIyOCx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxODI1Njg2OSwxNzI2NjY5MDIsLTE5MzE2OTI5Miw4ODM0NTc0NCx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MywxNjU5MTMxMSwxMzkyNTAxNTEsLTE0OTY2NzIzNCw2Njc3MDA1OSx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwxNzM3OTk3NywxNzA4MzUxMzEsLTE3MzU3OTMyMSw3NjI3ODE2Myx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NSwxODk2MzUxMiwyMTAzNjQ5MzQsLTIyODYyMzUxOSwxMDM0MzUwMjIsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYsMTc3OTYzMTgsMTM1NzU2NDE3LC0xNDQwODQwNTMsNjQzMjc2OTgsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsMTc0NTQ2OTUsMTc0NTkzMjE0LC0xODc1MTMwNjQsODUxNDY1ODIsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgsMTcyMjkyNTcsMTQwNzE1NTcwLC0xNDU3OTA1ODgsNjUzNjE3NDAsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezksMTcwMDA1NDcsMTYzMTk1OTQ2LC0xNzY3MzM5NjksNzk1NjIxMzAsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLDE2NzExNjk5LDE0MjQ3NjMwNCwtMTMzMzM5ODg3LDU4MzY2NTQ3LH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMywxODEwODQxOSwxNDkyMjM2OTcsLTE2MTc2MjAyMCw3NDM5NzU4OSx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTUsMTY2ODIwNDMsMTI0ODQ0ODg0LC0xMzQyODQ0ODcsNjAwODIxODAsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE3LDE2NjI3MzQ2LDEyMDkzNjQzMCwtMTIxNzY2Njc0LDUzMTQ2NDIxLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMCwxNzMzODMyNSwxMjU0MzI2OTQsLTEyNjYxNjk4Myw1NjUzNDIzNyx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MjUsMTY0ODkxNDYsOTkyMTgyMTcsLTk0NTk3NDY3LDQwNjE2NTA2LH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMCwxNTU4MjM3Myw4NDQ3OTA0MywtNzUzNjUwMDYsMzA5NTIzNDgsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQwLDE2MDAwNjY5LDg0ODk2NjExLC03NTAzMTEyNywzMDY5NjMwNix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NTAsMTUwODcwNTQsNzE2OTUwMzEsLTU5MzQ5MjY4LDIzMjc5NjY5LH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2MCwxNTgzMDcxNCw2ODY3Mjk3MSwtNTgyMTEyMDEsMjM2NzExNTgsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwLDE1NTM2MDYxLDY2NjU3OTcyLC01NTkwMTQzNywyMjU2MDE1Myx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzUsMTUwMTMxNDUsNDgxNzk5MTcsLTI0MTM4MzU0LDUyMzIwNzQsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgwLDE1Njg4NzM4LDUwMTk1MDM2LC0zNDIwNjc2MCwxMTUxNTc5Mix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OTAsMTYwMDMzMjIsNDgzMjM2NjEsLTM1NjA3Mzc4LDEzMTUzODcyLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMTU5NTUyMjMsNDg1NTgyMDEsLTMzNzA2ODY1LDExNzE1NzkyLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5OTNiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBfTFZSRVZfVEFCTEVTX0hfCisjZGVmaW5lIF9MVlJFVl9UQUJMRVNfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gY29uc3QgICAgTFZNX1VJTlQxNiAgTFZNX0ZzVGFibGVbXTsKK2V4dGVybiAgICAgICAgICBMVk1fVUlOVDE2ICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOworZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8qKiBfTFZSRVZfVEFCTEVTX0hfICoqLworCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc1Y2IyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0xWUFNBX0hfCisjZGVmaW5lIF9MVlBTQV9IXworCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ09OU1RBTlRTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSB0YWJsZSovCisjZGVmaW5lICAgICBMVlBTQV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgIDQgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRZUEVTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTWVtb3J5IFR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9QRVJTSVNURU5UICAgICAgPSBMVk1fUEVSU0lTVEVOVCwKKyAgICBMVlBTQV9QRVJTSVNURU5UX0RBVEEgPSBMVk1fUEVSU0lTVEVOVF9EQVRBLAorICAgIExWUFNBX1BFUlNJU1RFTlRfQ09FRiA9IExWTV9QRVJTSVNURU5UX0NPRUYsCisgICAgTFZQU0FfU0NSQVRDSCAgICAgICAgID0gTFZNX1NDUkFUQ0gsCisgICAgTFZQU0FfTUVNT1JZX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9NZW1vcnlUeXBlc19lbjsKKworLyogTGV2ZWwgZGV0ZWN0aW9uIHNwZWVkIGNvbnRyb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZQU0FfU1BFRURfTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVkaXVtIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9TUEVFRF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuOworCisvKiBGaWx0ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIENlbnRlckZyZXF1ZW5jeTsgICAgICAgICAgICAgLyogQ2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgYmFuZC1wYXNzIGZpbHRlciAoaW4gSHopICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgIC8qIFF1YWxpdHkgZmFjdG9yIG9mIHRoZSBmaWx0ZXIgICAgICAgICAgICAgKGluIDEvMTAwKSAgICAgICAgICAgICAgICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgUG9zdEdhaW47ICAgICAgICAgICAgICAgICAgICAvKiBQb3N0Z2FpbiB0byBhcHBseSBhZnRlciB0aGUgZmlsdGVyaW5nICAgIChpbiBkQiBRMTYuMCkgICAgICAgICAgICAqLworCit9IExWUFNBX0ZpbHRlclBhcmFtX3Q7CisKKy8qIExWUFNBIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247ICAvKiBTcGVjdHJhbCBkYXRhIGJ1ZmZlciBkdXJhdGlvbiBpbiB0aW1lIChtcyBpbiBRMTYuMCkgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgLyogTWF4aW11bSBleHBlY3RlZCBpbnB1dCBibG9jayBzaXplIChpbiBzYW1wbGVzKSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBuQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgU0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAvKiBQb2ludHMgdG8gbkJhbmRzIGZpbHRlciBwYXJhbSBzdHJ1Y3R1cmVzIGZvciBmaWx0ZXJzIHNldHRpbmdzICAgICAqLworCit9IExWUFNBX0luaXRQYXJhbXNfdCwgKnBMVlBTQV9Jbml0UGFyYW1zX3Q7CisKKy8qIExWUFNBIGNvbnRyb2wgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICBGczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbiAgTGV2ZWxEZXRlY3Rpb25TcGVlZDsgICAgICAgICAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCit9IExWUFNBX0NvbnRyb2xQYXJhbXNfdCwgKnBMVlBTQV9Db250cm9sUGFyYW1zX3Q7CisKKy8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfTWVtb3J5VHlwZXNfZW4gICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gTFZQU0FfTWVtb3J5UmVnaW9uX3Q7CisKKy8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZQU0FfTWVtb3J5UmVnaW9uX3QgICAgICAgUmVnaW9uW0xWUFNBX05SX01FTU9SWV9SRUdJT05TXTsvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9NZW1UYWJfdDsKKworLyogQXVkaW8gdGltZSB0eXBlICovCit0eXBlZGVmIExWTV9JTlQzMiBMVlBTQV9UaW1lOworCisvKiBNb2R1bGUgaW5zdGFuY2UgSGFuZGxlICovCit0eXBlZGVmIHZvaWQgKnBMVlBTQV9IYW5kbGVfdDsKKworLyogTFZQU0EgcmV0dXJuIGNvZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9PSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBmdW5jdGlvbiByYW4gd2l0aG91dCBhbnkgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIHBhcmFtZXRlciBpcyBpbmNvcnJlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0VSUk9SX1dST05HVElNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQW4gaW5jb3JyZWN0IEF1ZGlvVGltZSBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgcG9pbnRlciBoYXMgYSBOVUxMIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfUkVUVVJOX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBMVlBTQV9SRVRVUk47CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTlMgUFJPVE9UWVBFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluaXRQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGl6ZXMgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5pdFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfSW5pdCAgICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAgKnBJbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgICpwQ29udHJvbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9scyB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE5ld1BhcmFtcyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBuZXcgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcHJvY2VzcyBjYWxjdWxhdGVzIHRoZSBsZXZlbHMgb2YgdGhlIGZyZXF1ZW5jeSBiYW5kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGZpcnN0IGlucHV0IHNhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgQXVkaW9UaW1lICAgICAgICAgICAgICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgVGltZSB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogQ3VycmVudCBsZXZlbCB2YWx1ZXMgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGVha1ZhbHVlcyAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IFBlYWsgbGV2ZWwgdmFsdWVzIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICpwUGFyYW1zICAgICAgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBpbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAqcFBhcmFtcyAgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9MVlBTQV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYwpAQCAtMCwwICsxLDcwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIlZlY3RvckFyaXRobWV0aWMuaCIKKworI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOworCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpOworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHaXZlIHNvbWUgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyB0byB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTmV3UGFyYW1zICAgICAgICAgICBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgbmV3IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApCit7CisKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmKHBOZXdQYXJhbXMtPkZzID49IExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorICAgIGlmKHBOZXdQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgfQorCisgICAgcExWUFNBX0luc3QtPk5ld1BhcmFtcyA9ICpwTmV3UGFyYW1zOworICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdldCB0aGUgY3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjb250cm9sIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zICAgICAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAqcFBhcmFtcyApCit7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisKKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIHBQYXJhbXMtPkZzICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GczsKKyAgICBwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZDsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICpwUGFyYW1zICkKK3sKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgcFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKKyAgICBwUGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplOworICAgIHBQYXJhbXMtPm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIHBQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXM7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYW5kIGNoYW5nZXMgZmlsdGVycycgY29lZmZpY2llbnRzIGlmICAgICAgICAgICAgICAgKi8KKy8qICBzb21lIGNvbnRyb2wgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCkKK3sKKyAgICBMVk1fVUlOVDE2IGlpOworICAgIExWTV9VSU5UMTYgRnJlcTsKKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CisKKworICAgIGlmKHBJbnN0ID09IDApCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIFBhcmFtcyA9IHBJbnN0LT5OZXdQYXJhbXM7CisKKyAgICAvKiBNb2RpZmllcyBmaWx0ZXJzIHR5cGVzIGFuZCBjb2VmZmljaWVudHMsIGNsZWFyIHRoZSB0YXBzIGFuZAorICAgICAgIHJlLWluaXRpYWxpemVzIHBhcmFtZXRlcnMgaWYgc2FtcGxlIGZyZXF1ZW5jeSBoYXMgY2hhbmdlZCAgICAqLworICAgIGlmKFBhcmFtcy5GcyAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcykKKyAgICB7CisgICAgICAgIHBJbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gUGFyYW1zLkZzOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNlbnRlciBmcmVxZXVuY2llcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgICAgICBGcmVxID0gKExWTV9VSU5UMTYpICgoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10+PjEpIC8gKHBJbnN0LT5uQmFuZHMgKyAxKSk7CisgICAgICAgIGZvcihpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpLTFdLkNlbnRlckZyZXF1ZW5jeSA9IChMVk1fVUlOVDE2KSAoRnJlcSAqIGlpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsZXZhbnQgZmlsdGVycy4gSWYgdGhlIGNlbnRlciBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlciBpcworICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgbnlxdWlzdCBmcmVxdWVuY3ksIHRoZW4gdGhlIGZpbHRlciBpcyBub3QgcmVsZXZhbnQgYW5kIGRvZXNuJ3QKKyAgICAgICAgICAgbmVlZCB0byBiZSB1c2VkICovCisgICAgICAgIGZvcihpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpLTFdLkNlbnRlckZyZXF1ZW5jeSA8IChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXT4+MSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3QtPm5SZWxldmFudEZpbHRlcnMgPSBpaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0KTsKKyAgICAgICAgcEluc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gKExWTV9VSU5UMTYpTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbUGFyYW1zLkZzXTsKKyAgICAgICAgcEluc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IDA7CisgICAgICAgIHBJbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3IgPSBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbUGFyYW1zLkZzXTsKKyAgICAgICAgcEluc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gMDsKKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCAocEluc3QtPm5CYW5kcyAqIHBJbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0W2lpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkKQorICAgICAgICB7CisgICAgICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcEluc3QtPkN1cnJlbnRQYXJhbXMgPSBwSW5zdC0+TmV3UGFyYW1zOworCisgICAgcmV0dXJuIChMVlBTQV9PSyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBmaWx0ZXIgdHlwZSBiYXNlZCBvbiB0aGUgQlBGaWx0ZXJUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb25pdGVyIHRvIGNvbnJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVG8gc2VsZWN0IHRoZSBiaXF1YWQgdHlwZSB0aGUgZm9sbG93IHJ1bGVzIGFyZSBhcHBsaWVkOiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZmMgPD0gZnMvMTEwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZzLzExMCA8IGZjIDwgZnMvODUpICYgKFE+MykgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBTaW5nbGUgcHJlY2lzaW9uICAgIG90aGVyd2lzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKK3sKKworICAgIGV4dGVybiBMVk1fVUlOVDE2ICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgZmlsdGVyIHNldHRpbmdzCisgICAgICAgICAqLworICAgICAgICBmYyA9IChMVk1fVUlOVDMyKXBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0uQ2VudGVyRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9KExWTV9JTlQxNikgcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOyAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKChMT1dfRlJFUSAqIGZzKSA8IChmYyA8PCAxNSkpICYmICgoZmMgPDwgMTUpIDwgKEhJR0hfRlJFUSAqIGZzKSkgJiYgKFFGYWN0b3IgPiAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgYmFuZCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMuIFRoaXMgdXNlcyB0aGUgdHlwZSB0byBzZWxlY3QgICAgICAgICAgICAqLworLyogIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQYXJhbXMgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBpaTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgorICAgICAqLworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoICAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTZXRzIHRoZSBxdWFzaSBwZWFrIGZpbHRlcnMgY29lZmZpY2llbnRzLiBUaGlzIHVzZXMgdGhlIGNob3NlbiAgICAgICAgICAgICAgICAgICovCisvKiAgTGV2ZWxEZXRlY3Rpb25TcGVlZCBmcm9tIHRoZSBjb250cm9sIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFBhcmFtcyAgICAgICAgICAgICAgQ29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQoreworICAgIExWTV9VSU5UMTYgICAgIGlpOworICAgIExWTV9Gc19lbiAgICAgIEZzID0gcFBhcmFtcy0+RnM7CisgICAgUVBEX0MzMl9Db2VmcyAgKnBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW107CisKKworICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworCisKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKKyAgICB7CisgICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsY3VsYXRlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzIGZvciBhIGJhbmQgcGFzcyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyUGFyYW1zICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdDAgPSAyICogUGkgKiBGYyAvIEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIHQwKSAvICgyUSArIHQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGYyAgICAgICAgICBpcyB0aGUgY2VudHJlIGZyZXF1ZW5jeSwgREMgdG8gTnlxdWlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZzICAgICAgICAgIGlzIHRoZSBzYW1wbGUgZnJlcXVlbmN5LCA4MDAwIHRvIDQ4MDAwIGluIGRlc2NyZXRlIHN0ZXBzICAgICAgICAgICAgKi8KKy8qICAgICAgUSAgICAgICAgICAgaXMgdGhlIFEgZmFjdG9yLCAwLjI1IHRvIDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gVGhpcyBmdW5jdGlvbiBpcyBlbnRpcmVseSBiYXNlZCBvbiB0aGUgTFZFUU5CX1NpbmdsZVByZWNDb2VmcyBmdW5jdGlvbiAgICAgICAgICAgKi8KKy8qICAgICBvZiB0aGUgbiBiYW5kcyBlcXVhbGl6ZXIgKExWRVFOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVlBTQV9Db3NDb2VmW107CisKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBEOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOworICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQ09TX1QwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOworICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIFFGYWN0b3IgICAgID0gcEZpbHRlclBhcmFtcy0+UUZhY3RvcjsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gKExWTV9JTlQzMilGcmVxdWVuY3kgKiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKExWTV9JTlQzMikoKChMVk1fVUlOVDMyKVFGYWN0b3IgPDwgMTkpICsgKExWTV9VSU5UMzIpKER0MCA+PiAyKSk7CisgICAgQjJfTnVtID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpKER0MCA+PiAzKSAtICgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE4KSk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLworICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOworICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaT0xOyBpPDc7IGkrKykKKyAgICB7CisgICAgICAgIGNvZWYgPSBMVlBTQV9Db3NDb2VmW2ldOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICB9CisgICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVlBTQV9Db3NDb2VmWzBdKzYpOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCisKKworICAgIEIxID0gKCgweDQwMDAwMDAwIC0gQjIpID4+IDE2KSAqIChDT1NfVDAgPj4gMTYpOyAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICovCisgICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKworICAgIC8qCisgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwQ29lZmZpY2llbnRzLT5BMCA9IChMVk1fSU5UMTYpKEEwPj4xNik7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSAoTFZNX0lOVDE2KShCMT4+MTUpOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gKExWTV9JTlQxNikoQjI+PjE2KTsKKworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgZm9yIGEgYmFuZCBwYXNzIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJQYXJhbXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gdDApIC8gKDJRICsgdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLworLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCisvKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KKy8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KKy8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLworLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA0LiBUaGlzIGZ1bmN0aW9uIGlzIGVudGlyZWx5IGJhc2VkIG9uIHRoZSBMVkVRTkJfRG91YmxlUHJlY0NvZWZzIGZ1bmN0aW9uICAgICAgICAgICAqLworLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAqcENvZWZmaWNpZW50cykKK3sKKworICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZQU0FfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWUFNBX0RQQ29zQ29lZltdOworCisgICAgLyoKKyAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCisgICAgICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICBUMDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIEQ7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBBMDsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIEIxOworICAgIExWTV9JTlQzMiAgICAgICAgICAgQjI7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBEdDA7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMl9EZW47CisgICAgTFZNX0lOVDMyICAgICAgICAgICBCMl9OdW07CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDb3NFcnI7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBjb2VmOworICAgIExWTV9JTlQzMiAgICAgICAgICAgZmFjdG9yOworICAgIExWTV9JTlQxNiAgICAgICAgICAgdDA7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCisgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIFFGYWN0b3IgICAgID0gcEZpbHRlclBhcmFtcy0+UUZhY3RvcjsKKworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gKExWTV9JTlQzMilGcmVxdWVuY3kgKiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gRCAqIChUMCA+PiAxMCk7CisgICAgQjJfRGVuID0gKExWTV9JTlQzMikoKChMVk1fVUlOVDMyKVFGYWN0b3IgPDwgMTkpICsgKExWTV9VSU5UMzIpKER0MCA+PiAyKSk7CisgICAgQjJfTnVtID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpKER0MCA+PiAzKSAtICgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE4KSk7CisgICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBlcnJvciBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3NFcnIgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDQKKyAgICAgKi8KKyAgICBUMCA9IChUMCA+PiA2KSAqIDB4N2Y1MzsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KKyAgICB0MCA9IChMVk1fSU5UMTYpKFQwID4+IDE2KTsKKyAgICBmYWN0b3IgPSAweDdmZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDb3NFcnIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KKyAgICBmb3IgKGk9MTsgaTw1OyBpKyspCisgICAgeworICAgICAgICBjb2VmID0gTFZQU0FfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ29zRXJyICs9IChmYWN0b3IgKiBjb2VmKSA+PiA1OyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KKyAgICAgICAgZmFjdG9yID0gKGZhY3RvciAqIHQwKSA+PiAxNTsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENvc0VyciA9IENvc0VyciA8PCAoTFZQU0FfRFBDb3NDb2VmWzBdKTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIxIGFuZCBBMCBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBCMSA9ICgweDQwMDAwMDAwIC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLworICAgIEEwID0gKChCMSA+PiAxNikgKiAoQ29zRXJyID4+IDEwKSkgPj4gNjsgICAgLyogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yICgwLjUgLSBiMikgKiBjb3NlcnIodDApICovCisgICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAqLworICAgIEEwID0gKDB4NDAwMDAwMDAgKyBCMikgPj4gMTsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLworCisgICAgLyoKKyAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQorICAgICAqLworICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKKyAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOworCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2xlYXJzIHRoZSBmaWx0ZXJzJyBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpCit7CisgICAgTFZNX0lOVDggICAgICAgKnBUYXBBZGRyZXNzOworICAgIExWTV9VSU5UMzIgICAgICAgaTsKKworICAgIC8qIEJhbmQgUGFzcyBmaWx0ZXJzIHRhcHMgKi8KKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wQlBfVGFwczsKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworICAgIH0KKworICAgIC8qIFF1YXNpLXBlYWsgZmlsdGVycyB0YXBzICovCisgICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cFFQRF9UYXBzOworICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCk7IGkrKykKKyAgICB7CisgICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2E0YmMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYwpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRQYXJhbXMgICAgICAgICAgSW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9sUGFyYW1zICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICBNZW1vcnkgdGFibGUgdGhhdCBjb250YWlucyBtZW1vcnkgYXJlYXMgZGVmaW5pdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgKQoreworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgICAqcExWUFNBX0luc3Q7CisgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIGVycm9yQ29kZSAgICAgICA9IExWUFNBX09LOworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBpaTsKKyAgICBleHRlcm4gTFZNX0lOVDE2ICAgICAgICAgICAgTFZQU0FfR2FpblRhYmxlW107CisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7CisKKyAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KKyAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOworICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOworCisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID4gTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUpICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA+IExWUFNBX05CQU5EU01BWCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKyAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCisgICAgeworICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPCBMVlBTQV9NSU5QT1NUR0FJTikgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgICAgfQorICAgIH0KKworCisgICAgLypJbnN0X0FsbG9jIGluc3RhbmNlcyBpbml0aWFsaXphdGlvbiAqLworICAgIEluc3RBbGxvY19Jbml0KCAmSW5zdGFuY2UgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJlNjcmF0Y2ggICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkRhdGEgICAgICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCAmQ29lZiAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7CisKKworICAgIC8qIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisgICAgfQorICAgIHBMVlBTQV9JbnN0ID0oTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKKworCisgICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGZvciAoaWkgPSAwOyBpaSA8IExWUFNBX05SX01FTU9SWV9SRUdJT05TOyBpaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25baWldID0gcE1lbW9yeVRhYmxlLT5SZWdpb25baWldOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBtb2R1bGUncyBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCisgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICBwTFZQU0FfSW5zdC0+bkJhbmRzID0gcEluaXRQYXJhbXMtPm5CYW5kczsKKyAgICBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUgPSBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemU7CisgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gTFZNX0ZTX0RVTU1ZOworICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgPSBMVlBTQV9TUEVFRF9EVU1NWTsKKworICAgIHsgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzICovCisgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7CisgICAgICAgIExWTV9JTlQzMiBCTDsKKworICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorCisgICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKKyAgICB9CisKKyAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aCArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggPSBCdWZmZXJMZW5ndGg7CisgICAgfQorCisKKyAgICAvKiBBc3NpZ24gdGhlIHBvaW50ZXJzICovCisKKyAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAgICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQxNikgKTsKKyAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKKyAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKKworICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKworICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICk7CisgICAgcExWUFNBX0luc3QtPnBRUERfVGFwcyAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KSApOworCisKKyAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0gPSBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldOworICAgIH0KKworICAgIC8qIFNldCBQb3N0IGZpbHRlcnMgZ2FpbnMqLworICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9KExWTV9VSU5UMTYpIExWUFNBX0dhaW5UYWJsZVtwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICsgMTVdOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CisKKworICAgIC8qIEluaXRpYWxpemUgY29udHJvbCBkZXBlbmRhbnQgaW50ZXJuYWwgcGFyYW1ldGVycyAqLworICAgIGVycm9yQ29kZSA9IExWUFNBX0NvbnRyb2wgKCpwaEluc3RhbmNlLCBwQ29udHJvbFBhcmFtcyk7CisKKyAgICBpZihlcnJvckNvZGUhPTApCisgICAgeworICAgICAgICByZXR1cm4gZXJyb3JDb2RlOworICAgIH0KKworICAgIGVycm9yQ29kZSA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKHBMVlBTQV9JbnN0KTsKKworICAgIGlmKGVycm9yQ29kZSE9MCkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgfQorCisgICAgcmV0dXJuKGVycm9yQ29kZSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg0YjEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KKy8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLworLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLworLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKQoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgaWk7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdWZmZXJMZW5ndGg7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworCisKKyAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBMVk1fTlVMTCk7CisgICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgTFZNX05VTEwpOworICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIExWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBMVk1fTlVMTCk7CisKKworICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKworICAgICAgICAvKiBDaGVjayBpbml0IHBhcmFtZXRlciAqLworICAgICAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKKyAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8CisgICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQorICAgICAgICAgKi8KKworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKKworICAgICAgICB7CisgICAgICAgICAgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzIGFzIE1VTDMyeDMySU5UTzMyIHdvcmtzIG9uIExWTV9JTlQzMiBvbmx5Ki8KKyAgICAgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICAgICAgTFZNX0lOVDMyIElSVEk9KExWTV9JTlQzMilMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52OworICAgICAgICAgICAgTFZNX0lOVDMyIEJMOworCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICAgICAgQnVmZmVyTGVuZ3RoPShMVk1fVUlOVDMyKUJMOworICAgICAgICB9CisKKworICAgICAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBCdWZmZXJMZW5ndGgrKzsKKyAgICAgICAgfQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pICk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZJbnN0YW5jZSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0lOVDE2KSApOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0ZW50IGNvZWZmaWNpZW50cyBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhiZWRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTFZQU0FfUFJJVkFURV9IXworI2RlZmluZSBfTFZQU0FfUFJJVkFURV9IXworCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBDT05TVEFOVCBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1lbW9yeSAqLworI2RlZmluZSBMVlBTQV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9DT0VGX0FMSUdOICAgICAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9EQVRBX0FMSUdOICAgICAgICAgICAgICAgICA0ICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9JTlNUQU5DRSAgICAgICAgIDAgICAgICAvKiBPZmZzZXQgdG8gaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgIDEgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudHMgIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICovCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEEgIDIgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCB0YXBzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgIDMgICAgICAvKiBPZmZzZXQgdG8gc2NyYXRjaCAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTiAgICAgICAgICA0MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSAgICAgICAgICA1MDAwICAgLyogTWF4aW11bSBsZW5ndGggaW4gbW9ubyBzYW1wbGVzIG9mIHRoZSBibG9jayB0byBwcm9jZXNzICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9OQkFORFNNSU4gICAgICAgICAgICAgICAgICAxICAgICAgLyogTWluaW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9OQkFORFNNQVggICAgICAgICAgICAgICAgICAzMCAgICAgLyogTWF4aW11bSBudW1iZXIgb2YgZnJlcXVlbmN5IGJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhDRU5URVJGUkVRICAgICAgICAgICAgICAyMDAwMCAgLyogTWF4aW11bSBwb3NzaWJsZSBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NSU5QT1NUR0FJTiAgICAgICAgICAgICAgICAtMTUgICAgLyogTWluaW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhQT1NUR0FJTiAgICAgICAgICAgICAgICAxNSAgICAgLyogTWF4aW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NSU5RRkFDVE9SICAgICAgICAgICAgICAgICAyNSAgICAgLyogTWluaW11bSBwb3NzaWJsZSBRIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhRRkFDVE9SICAgICAgICAgICAgICAgICAxMjAwICAgLyogTWF4aW11bSBwb3NzaWJsZSBRIGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IgICAgICAgIDB4NDExMSAvKiBEZWNheSBmYWN0b3IgZm9yIHRoZSBtYXhpbXVtIHZhbHVlcyBjYWxjdWxhdGlvbiAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWExFVkVMREVDQVlTSElGVCAgICAgICAgIDE0ICAgICAvKiBEZWNheSBzaGlmdCBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgICovCisKKyNkZWZpbmUgTFZQU0FfTUFYVU5TSUdORURDSEFSICAgICAgICAgICAgMHhGRgorCisjZGVmaW5lIExWUFNBX0ZzSW52ZXJ0U2hpZnQgICAgICAgICAgICAgIDMxCisjZGVmaW5lIExWUFNBX0dBSU5TSElGVCAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIExWUFNBX0ZSRVFTSElGVCAgICAgICAgICAgICAgICAgIDI1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBUWVBFUyBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSAgICAgICAweDAwMTQgICAgLyogMjAgbXMgKDUwSHopIGluIFExNi4wICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiAgICAweDA2NjYgICAgLyogMS8yMG1zIGxlZnQgc2hpZnRlZCBieSAxNSAgKi8KKyNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0ICAxNQorCisKKy8qIFByZWNpc2lvbiBvZiB0aGUgZmlsdGVyICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXIsICAgIC8qIFNpbXBsZSBwcmVjaXNpb24gKi8KKyAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXIgICAgIC8qIERvdWJsZSBwcmVjaXNpb24gKi8KK30gTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW47CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaW5jYXRpbmcgYSBjaGFuZ2Ugb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5CYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgQ3VycmVudFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IGNvbnRyb2wgcGFyYW1ldGVycyBnaXZlbiBieSB0aGUgdXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgTWVtb3J5VGFibGU7CisKKyAgICBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqcEJQRmlsdGVyc1ByZWNpc2lvbjsgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGZpbHRlciBwcmVjaXNpb24gZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgKi8KKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAqcEJQX0luc3RhbmNlczsgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgKi8KKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAgICAqcEJQX1RhcHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJhbmQgcGFzcyBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgKi8KKyAgICBRUERfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgKi8KKyAgICBRUERfVGFwc190ICAgICAgICAgICAgICAgICAqcFFQRF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAqcFBvc3RHYWluczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHBvc3QtZmlsdGVyIGdhaW5zIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgKi8KKworICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICAgICpwRmlsdGVyc1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSBmaWx0ZXJzIHBhcmFtZXRlcnMgZnJvbSB0aGUgaW5wdXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgblNhbXBsZXNCdWZmZXJVcGRhdGU7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbWFrZSAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OyAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIGtub3cgd2hlbiB0byBwdXQgYSBuZXcgdmFsdWUgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgblJlbGV2YW50RmlsdGVyczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHJlbGV2ZW50IGZpbHRlcnMgZGVwZW5kaW5nIG9uIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgYmFuZHMgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTG9jYWxTYW1wbGVzQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEb3duU2FtcGxpbmdGYWN0b3I7ICAgICAgICAgICAgICAgICAvKiBEb3duIHNhbXBsaW5nIGZhY3RvciBkZXBlbmRpbmcgb24gdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEb3duU2FtcGxpbmdDb3VudDsgICAgICAgICAgICAgICAgICAvKiBDb3VudGVyIHVzZWQgZm9yIHRoZSBkb3duc2FtcGxpbmcgaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOyAgICAgICAgIC8qIExlbmd0aCBvZiB0aGUgYnVmZmVyIGluIHRpbWUgKG1zKSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsgICAgICAgICAgIC8qIFN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7ICAgIC8qIEN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHdyaXR0aW5nIHBvaW50ZXIgb2YgdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfVGltZSAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTsgICAgICAgIC8qIEF1ZGlvVGltZSBhdCB3aGljaCB0aGUgbGFzdCB2YWx1ZSBzYXZlIG9jY3VyZWQgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzcGVjdHJ1bSBkYXRhIHZhbHVlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gY29udGFpbiAocGVyIGJhbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24vMjBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICAqcFByZXZpb3VzUGVha3M7ICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRzIHRvIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIHByZXZpb3VzIHBlYWsgdmFsdWUgb2YgdGhlIGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24uIFRob3NlIHZhbHVlcyBhcmUgZGVjcmVtZW50ZWQgYWZ0ZXIgZWFjaCBjYWxsIHRvIHRoZSBHZXRTcGVjdHJ1bSBmdW5jdGlvbiAgICAgICAgICAqLworCit9TFZQU0FfSW5zdGFuY2VQcl90LCAqcExWUFNBX0luc3RhbmNlUHJfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTlMgUFJPVE9UWVBFCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYW5kIGNoYW5nZXMgZmlsdGVycycgY29lZmZpY2llbnRzIGlmICAgICAgICAgICAgICAgKi8KKy8qICBzb21lIGNvbnRyb2wgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTFZQU0FfUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI5ZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICAgICJWZWN0b3JBcml0aG1ldGljLmgiCisKKyNkZWZpbmUgTFZNX01JTklOVF8zMiAgIDB4ODAwMDAwMDAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcHJvY2VzcyBhcHBsaWVzIGJhbmQgcGFzcyBmaWx0ZXJzIHRvIHRoZSBzaWduYWwuIEVhY2ggb3V0cHV0ICAgICAgICAgICAgICAgICovCisvKiAgZmVlZHMgYSBxdWFzaSBwZWFrIGZpbHRlciBmb3IgbGV2ZWwgZGV0ZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBMVlBTQV9JbnB1dFNhbXBsZXMgUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbnB1dEJsb2NrU2l6ZSAgICAgIE51bWJlciBvZiBtb25vIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICBQbGF5YmFjayB0aW1lIG9mIHRoZSBpbnB1dCBzYW1wbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKKworeworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpaTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmM7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwV3JpdGVfU2F2ZTsgICAgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzICAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENIRUNLIFBBUkFNRVRFUlMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisgICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBTY3JhdGNoID0gKExWTV9JTlQxNiopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKKyAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQUk9DRVNTIFNBTVBMRVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFB1dCBzYW1wbGVzIGluIHJhbmdlIFstMC41OzAuNVsgZm9yIEJQIGZpbHRlcnMgKHNlZSBCaXF1YWRzIGRvY3VtZW50YXRpb24pICovCisgICAgQ29weV8xNiggcExWUFNBX0lucHV0U2FtcGxlcyxwU2NyYXRjaCwoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKyAgICBTaGlmdF9TYXRfdjE2eHYxNigtMSxwU2NyYXRjaCxwU2NyYXRjaCwoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICggcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKKyAgICB7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKChBdWRpb1RpbWUgKyAoTFZNX0lOVDMyKSgoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCoxMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWUFNBX1NhbXBsZVJhdGVJbnZUYWJbcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCkKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKKyAgICB9CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdldHMgdGhlIGxldmVscyB2YWx1ZXMgYXQgYSBjZXJ0YWluIHBvaW50IGluIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgUmV0cmlldmUgdGhlIHZhbHVlcyBhdCB0aGlzIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gbGV2ZWxzJyB2YWx1ZXMgICAgICAgKi8KKy8qICBwTWF4VmFsdWVzICAgICAgICAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIG1heCBsZXZlbHMnIHZhbHVlcyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApCisKK3sKKworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBTdGF0dXNEZWx0YSwgaWk7CisgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBSZWFkOworCisgICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMIHx8IHBDdXJyZW50VmFsdWVzID09IExWTV9OVUxMIHx8IHBQZWFrVmFsdWVzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIHBsYWNlIHdoZXJlIHRvIGxvb2sgaW4gdGhlIHN0YXR1cyBidWZmZXIgKi8KKyAgICBpZihHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8PSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSksTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludixTdGF0dXNEZWx0YSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpOworICAgICAgICBpZigoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGlzIHBhcnQgaGFuZGxlcyB0aGUgd3JhcCBhcm91bmQgKi8KKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICBpZigoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSkgIT0gKChMVk1fSU5UMzIpKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGxldmVsIGlzIG5vdCB0b28gIm9sZCIgKHNlZSAyLjEwIGluIExWUFNBX0Rlc2lnbk5vdGVzLmRvYykqLworICAgIGlmKAorICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgorICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTwwKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+MCkpJiYKKyAgICAgICAgICgoKExWTV9JTlQzMikoLUdldFNwZWN0cnVtQXVkaW9UaW1lICsgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPkxWTV9NQVhJTlRfMzIpKXx8CisKKyAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCisgICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPj0wKSl8fAorICAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpfHwKKyAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKSYmCisgICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPExWTV9NQVhJTlRfMzIpKSkpfHwKKworICAgICAgICAoU3RhdHVzRGVsdGEgPiAoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpIHx8CisgICAgICAgICghU3RhdHVzRGVsdGEpKQorICAgIHsKKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gID0gMDsKKyAgICAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSAgICAgID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oTFZQU0FfT0spOworICAgIH0KKyAgICAvKiBTZXQgdGhlIHJlYWRpbmcgcG9pbnRlciAqLworICAgIGlmKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkKKyAgICB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgKyAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIC0gU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIH0KKworCisgICAgLyogUmVhZCB0aGUgc3RhdHVzIGJ1ZmZlciBhbmQgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KKyAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCisgICAgeworICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gPSBwUmVhZFtpaV07CisgICAgICAgIGlmKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPD0gcFJlYWRbaWldKQorICAgICAgICB7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gcFJlYWRbaWldOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMzIgdGVtcDsKKyAgICAgICAgICAgIC8qUmUtY29tcHV0ZSBtYXggdmFsdWVzIGZvciBkZWNheSAqLworICAgICAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pOworICAgICAgICAgICAgdGVtcCA9ICgodGVtcCAqIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IpPj5MVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQpOworICAgICAgICAgICAgLyogSWYgdGhlIGdhaW4gaGFzIG5vIGVmZmVjdCwgImhlbHAiIHRoZSB2YWx1ZSB0byBpbmNyZWFzZSAqLworICAgICAgICAgICAgaWYodGVtcCA9PSAoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+IExWUFNBX01BWFVOU0lHTkVEQ0hBUikgPyBMVlBTQV9NQVhVTlNJR05FRENIQVIgOiB0ZW1wOworICAgICAgICAgICAgLyogU3RvcmUgbmV3IG1heCBsZXZlbCAqLworICAgICAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9ICAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV07CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZiZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0xWUFNBX1FQRF9IXworI2RlZmluZSBfTFZQU0FfUVBEX0hfCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KKyAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTFZNX0lOVDMyIEtQOyAgICAvKnNob3VsZCBzdG9yZSBhMCovCisgICAgTFZNX0lOVDMyIEtNOyAgICAvKnNob3VsZCBzdG9yZSBiMiovCisKK30gUVBEX0MzMl9Db2VmcywgKlBRUERfQzMyX0NvZWZzOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQzMiBTdG9yYWdlWzFdOworCit9IFFQRF9UYXBzX3QsICpwUVBEX1RhcHNfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgZG93bnNhbXBsaW5nLCBwb3N0IGdhaW4sIHF1YXNpIHBlYWsgZmlsdGVyaW5nIGFuZCB3cml0ZSB0aGUgbGV2ZWxzIHZhbHVlcyAqLworLyogIGluIHRoZSBidWZmZXIgZXZlcnkgMjAgbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpemUgYSBxdWFzaSBwZWFrIGZpbHRlciBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyB0YXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyJ3MgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlMGE4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGl6ZSBhIHF1YXNpIHBlYWsgZmlsdGVyIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFFQRF9TdGF0ZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlcidzIHRhcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfSW5pdCAoICAgcFFQRF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICkKK3sKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gcENvZWYtPktQOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9IHBDb2VmLT5LTTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxOTdjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXcml0ZSBhIGxldmVsIHZhbHVlIGluIHRoZSBidWZmZXIgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYmFuZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIExWUFNBIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcHBXcml0ZSAgICAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxOdW1iZXIgICAgICAgICAgTnVtYmVyIG9mIHRoZSBiYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBpbiAgICAgICAgICAgKi8KKy8qICBWYWx1ZSAgICAgICAgICAgICAgIFZhbHVlIHRvIHdyaXRlIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICoqcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVmFsdWUgICApOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgZG93bnNhbXBsaW5nLCBwb3N0IGdhaW4sIHF1YXNpIHBlYWsgZmlsdGVyaW5nIGFuZCB3cml0ZSB0aGUgbGV2ZWxzIHZhbHVlcyAqLworLyogIGluIHRoZSBidWZmZXIgZXZlcnkgMjAgbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKK3sKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBRUERfU3RhdGVfdCAqcFFQRFN0YXRlID0gIChRUERfU3RhdGVfdCopJnBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlc1tCYW5kSW5kZXhdOworCisgICAgLyogUG9pbnRlciB0byB0YXBzICovCisgICAgTFZNX0lOVDMyKiBwRGVsYXkgID0gcFFQRFN0YXRlLT5wRGVsYXk7CisKKyAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KKyAgICBMVk1fSU5UMzIgICBYMDsKKyAgICBMVk1fSU5UMzIgICB0ZW1wLHRlbXAyOworICAgIExWTV9JTlQzMiAgIGFjY3U7CisgICAgTFZNX0lOVDE2ICAgWGcwOworICAgIExWTV9JTlQxNiAgIEQwOworICAgIExWTV9JTlQxNiAgIFYwID0gKExWTV9JTlQxNikoKnBEZWxheSk7CisKKyAgICAvKiBGaWx0ZXIncyBjb2VmICovCisgICAgTFZNX0lOVDMyICAgS3AgPSBwUVBEU3RhdGUtPkNvZWZzWzBdOworICAgIExWTV9JTlQzMiAgIEttID0gcFFQRFN0YXRlLT5Db2Vmc1sxXTsKKworICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKKworICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBJTklUSUFMSVpBVElPTgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29ycmVjdCB0aGUgcG9pbnRlciB0byB0YWtlIHRoZSBmaXJzdCBkb3duIHNhbXBsZWQgc2lnbmFsIHNhbXBsZSAqLworICAgIHBJblNhbXBzICs9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudDsKKyAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKKworICAgIHdoaWxlIChpaSA+IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBwb3N0IGdhaW4gKi8KKyAgICAgICAgWDAgPSAoKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdKSA+PiAoTFZQU0FfR0FJTlNISUZULTEpOyAvKiAtIDEgdG8gY29tcGVuc2F0ZSBzY2FsaW5nIGluIHByb2Nlc3MgZnVuY3Rpb24qLworICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCisgICAgICAgIGlmKFgwIDwgMCkKKyAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPiAweDdGRkYpCisgICAgICAgICAgICBYZzAgPSAweDdGRkY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFhnMCA9IChMVk1fSU5UMTYpKFgwKTsKKworCisgICAgICAgIC8qIFF1YXNpIHBlYWsgZmlsdGVyIGNhbGN1bGF0aW9uICovCisgICAgICAgIEQwICA9IChMVk1fSU5UMTYpKFhnMCAtIFYwKTsKKworICAgICAgICB0ZW1wMiA9IChMVk1fSU5UMzIpRDA7CisgICAgICAgIE1VTDMyeDMySU5UTzMyKHRlbXAyLEtwLGFjY3UsMzEpOworCisgICAgICAgIEQwICAgID0gKExWTV9JTlQxNikoRDA+PjEpOworICAgICAgICBpZiAoRDAgPCAwKXsKKyAgICAgICAgICAgIEQwID0gKExWTV9JTlQxNikoLUQwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXAyID0gKExWTV9JTlQzMilEMDsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKExWTV9JTlQzMilEMCxLbSx0ZW1wLDMxKTsKKyAgICAgICAgYWNjdSArPXRlbXAgKyBYZzA7CisKKyAgICAgICAgaWYgKGFjY3UgPiAweDdGRkYpCisgICAgICAgICAgICBhY2N1ID0gMHg3RkZGOworICAgICAgICBlbHNlIGlmKGFjY3UgPCAwKQorICAgICAgICAgICAgYWNjdSA9IDB4MDAwMDsKKworICAgICAgICBWMCA9IChMVk1fSU5UMTYpYWNjdTsKKworICAgICAgICBpZigoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrKCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYwKTsKKyAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCAtPSBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGU7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgPSAoTFZNX1VJTlQxNikobnVtU2FtcGxlcyAtIGlpKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQrPURvd25TYW1wbGluZ0ZhY3RvcjsKKworICAgICAgICBpaSA9IChMVk1fSU5UMTYpKGlpLURvd25TYW1wbGluZ0ZhY3Rvcik7CisKKyAgICB9CisKKyAgICAvKiBTdG9yZSBsYXN0IHRhcHMgaW4gbWVtb3J5ICovCisgICAgKnBEZWxheSA9IChMVk1fSU5UMzIpKFYwKTsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0byB0aGUgZnVuY3Rpb24gYWZ0ZXIgbGFzdCBiYW5kIHByb2Nlc3NpbmcsCisgICAgICAgdXBkYXRlIHRoZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmKEJhbmRJbmRleCA9PSAocExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnMtMSkpCisgICAgeworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKKyAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKKyAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCisgICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdyaXRlIGEgbGV2ZWwgdmFsdWUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyIGluIHRoZSBjb3JyZXNwb25kaW5nIGJhbmQuICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBMVlBTQV9JbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFZQU0EgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwcFdyaXRlICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsbE51bWJlciAgICAgICAgICBOdW1iZXIgb2YgdGhlIGJhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGluICAgICAgICAgICAqLworLyogIFZhbHVlICAgICAgICAgICAgICAgVmFsdWUgdG8gd3JpdGUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICkKK3sKKyAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOworCisKKyAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLworICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlPj43KTsKKyAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQorICAgIHsKKyAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKKyAgICB9CisKKyAgICAqcHBXcml0ZSA9IHBXcml0ZTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhNWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWUFNBLmgiCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAorICogZnJlcXVlbmN5CisgKi8KK2NvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdID0geyAgIDgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OyAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGUgcmF0ZSBpbnZlcnNlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAorICogZnJlcXVlbmN5CisgKi8KK2NvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdID0geyAgICAyNjg0MzUsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ3ODMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4OTU3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzNDIxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NzM5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTQ3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NzEwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOX07ICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgKiBkdXJpbmcgMjBtcworICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW10gID0geyAgIDE2MCwgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERvd24gc2FtcGxpbmcgZmFjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgZG93biBzYW1wbGluZyBmYWN0b3IKKyAqLworY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSAgPSB7ICAgICA1LCAgICAgICAgICAgICAgICAgICAgLyogODAwMCAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgICAgICAgICAgICAgICAgICAgLyogMTEwMjUgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogMTIwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgLyogMTYwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgICAgICAgICAgICAgICAgICAgLyogMjIwNTAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMn07ICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDI2MzU0LCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTEyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NTY5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTU2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Nzg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyfTsgICAgLyogNDhrUy9zICovCisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW10gPSB7ICAgMzY0LCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4LCAgICAgICAgIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU3Nn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3MoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMgKyBhNCp4XjQgKyBhNSp4XjUpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKKyAqICsxLjAgdG8gLTEuMAorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiAwLjAgdG8gMC4wMDc4ODUyOTg2CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQorICogdGhlIGVxdWF0aW9uOgorICoKKyAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0RQQ29zQ29lZltdID0geyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MENFRkQyQiwweDAwQ0I5QjE3fSwgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEQyNDJFNywweDAwQ0VEMTFEfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwQ0VGRDJCLDB4MDBDQjlCMTd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEUxMzczOSwweDAwREQ3Q0QzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRDk0QkFGLDB4MDBENUI3RTd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEUxMzczOSwweDAwREQ3Q0QzfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sICAvKiA0OGtTL3MgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NTg3NTEzRCwweDA1NUMyMkNGfSwgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NTlEMjk2NywweDA1NzBGMDA3fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1ODc1MTNELDB4MDU1QzIyQ0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1Q0MxMDE4LDB4MDU5RDhGNjl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NUUyRUZBQywweDA1QjM0RDc5fSwgIC8qIDQ4a1MvcyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEExMTVFQTdBLDB4MUNEQjNGNUN9LCAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEExODQ3NUYwLDB4MUQyQzgzQTJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTExNUVBN0EsMHgxQ0RCM0Y1Q30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTI2RkY2QkQsMHgxREQ4MTUzMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEzNzVCMkM2LDB4MUU5NDNCQkN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMkUxRTk1MCwweDFFMkE1MzJFfX07IC8qIDQ4a1MvcyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNjIyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaApAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIZWFkZXIgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uIGxheWVyIGludGVyZmFjZSBvZiBDb25jZXJ0IFNvdW5kIGFuZCBDb25jZXJ0ICAgICAgICAqLworLyogIFNvdW5kIEVYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGVzIGluY2x1ZGVzIGFsbCBkZWZpbml0aW9ucywgdHlwZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGNhbGxpbmcgbGF5ZXIuIEFsbCBvdGhlciB0eXBlcywgc3RydWN0dXJlcyBhbmQgICAgICAgICAgICovCisvKiAgZnVuY3Rpb25zIGFyZSBwcml2YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGFsZ29yaXRobSBjYW4gZXhlY3V0ZSBlaXRoZXIgd2l0aCBzZXBhcmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb3Igd2l0aCAgICAgKi8KKy8qICBhIGNvbW1vbiBidWZmZXIsIGkuZS4gdGhlIGRhdGEgaXMgcHJvY2Vzc2VkIGluLXBsYWNlLiBJZiB0aGUgYnVmZmVycyBhcmUgdGhlICAgICAgICAqLworLyogIHNhbWUgdGhlbiB0aGUgTUlQcyB3aWxsIGJlIHNsaWdodGx5IGhpZ2hlciBhbmQgYW4gZXh0cmEgc3RlcmVvIHNjcmF0Y2ggYnVmZmVyIGlzICAgICovCisvKiAgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogID09PT09PT0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHdvIGRhdGEgZm9ybWF0cyBhcmUgc3VwcG9ydCBTdGVyZW8gYW5kIE1vbm8tSW4tU3RlcmVvLiBUaGUgZGF0YSBpcyBpbnRlcmxlYXZlZCBhcyAgKi8KKy8qICBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEJ5dGUgT2Zmc2V0ICAgICAgICAgU3RlcmVvIElucHV0ICAgICAgICAgTW9uby1Jbi1TdGVyZW8gSW5wdXQgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgPT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT0gICAgICAgICA9PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIExlZnQgU2FtcGxlICMxICAgICAgICAgIE1vbm8gU2FtcGxlICMxICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgUmlnaHQgU2FtcGxlICMxICAgICAgICAgTW9ubyBTYW1wbGUgIzEgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICBMZWZ0IFNhbXBsZSAjMiAgICAgICAgICBNb25vIFNhbXBsZSAjMiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAgICAgIFJpZ2h0IFNhbXBsZSAjMiAgICAgICAgIE1vbm8gU2FtcGxlICMyICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vbm8gZm9ybWF0IGRhdGEgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgYSBNb25vIHN0cmVhbSAgICovCisvKiAgaW4gdG8gTW9uby1Jbi1TdGVyZW8gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgTFZDU19ICisjZGVmaW5lIExWQ1NfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9Db21tb24uaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZW1vcnkgdGFibGUgKi8KKyNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgICAgMCAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgICAgMSAgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGICAgIDIgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgICAgMyAgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZDU19OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KKworLyogRWZmZWN0IExldmVsICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX0xPVyAgICAgICAgICAgICAgICAgICAgMTYzODQgICAgLyogRWZmZWN0IHNjYWxpbmcgNTAlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX01FRElVTSAgICAgICAgICAgICAgICAgMjQ1NzYgICAgLyogRWZmZWN0IHNjYWxpbmcgNzUlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX0hJR0ggICAgICAgICAgICAgICAgICAgMzI3NjcgICAgLyogRWZmZWN0IFNjYWxpbmcgMTAwJSAqLworCisvKiBDYWxsYmFjayBldmVudHMgKi8KKyNkZWZpbmUgTFZDU19FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLworI2RlZmluZSBMVkNTX0VWRU5UX0FMR09GRiAgICAgICAgICAgICAgICAgMHgwMDAxICAgIC8qIENTIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluc3RhbmNlIGhhbmRsZSAqLwordHlwZWRlZiB2b2lkICpMVkNTX0hhbmRsZV90OworCisKKy8qIE9wZXJhdGluZyBtb2RlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19PRkYgPSAwLAorICAgIExWQ1NfT04gID0gMTUsCisgICAgTFZDU19NQVggPSBMVk1fTUFYRU5VTQorfSBMVkNTX01vZGVzX2VuOworCisKKy8qIE1lbW9yeSBUeXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19TQ1JBVENIICAgICAgICA9IDAsCisgICAgTFZDU19EQVRBICAgICAgICAgICA9IDEsCisgICAgTFZDU19DT0VGRklDSUVOVCAgICA9IDIsCisgICAgTFZDU19QRVJTSVNURU5UICAgICA9IDMsCisgICAgTFZDU19NRU1PUllUWVBFX01BWCA9IExWTV9NQVhFTlVNCit9IExWQ1NfTWVtb3J5VHlwZXNfZW47CisKKworLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVkNTX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZDU19OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkNTX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KKyAgICBMVkNTX0lOVkFMSURCVUZGRVIgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGJ1ZmZlciBwcm9jZXNzaW5nIHJlcXVlc3QgKi8KKyAgICBMVkNTX1NUQVRVU01BWCAgICAgID0gTFZNX01BWEVOVU0KK30gTFZDU19SZXR1cm5TdGF0dXNfZW47CisKKworLyoKKyAqIFNvdXJjZSBkYXRhIGZvcm1hdHMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19TVEVSRU8gICAgICAgPSAwLAorICAgIExWQ1NfTU9OT0lOU1RFUkVPID0gMSwKKyAgICBMVkNTX1NPVVJDRU1BWCAgICA9IExWTV9NQVhFTlVNCit9IExWQ1NfU291cmNlRm9ybWF0X2VuOworCisKKy8qCisgKiBTdXBwb3J0ZWQgb3V0cHV0IGRldmljZXMKKyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19IRUFEUEhPTkVTICAgICAgICAgICAgID0gMCwKKyAgICBMVkNTX0VYX0hFQURQSE9ORVMgICAgICAgICAgPSAxLAorICAgIExWQ1NfU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit9IExWQ1NfU3BlYWtlclR5cGVfZW47CisKKy8qCisgKiBTcGVha2VyIENvZWZmaWNpZW50cyBUYWJsZQorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIHZvaWQgICAgKnBUYWJsZTE7CisgICAgdm9pZCAgICAqcFRhYmxlMjsKKyAgICB2b2lkICAgICpwVGFibGUzOworICAgIHZvaWQgICAgKnBUYWJsZTQ7CisgICAgdm9pZCAgICAqcFRhYmxlNTsKKyAgICB2b2lkICAgICpwVGFibGU2OworICAgIHZvaWQgICAgKnBUYWJsZTc7CisgICAgdm9pZCAgICAqcFRhYmxlODsKK30gTFZDU19DU01TX0NvZWZfVGFibGVzX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCisgICAgTFZDU19NZW1vcnlUeXBlc19lbiAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCit9IExWQ1NfTWVtb3J5UmVnaW9uX3Q7CisKKworLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBMVkNTX01lbW9yeVJlZ2lvbl90IFJlZ2lvbltMVkNTX05SX01FTU9SWV9SRUdJT05TXTsgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCit9IExWQ1NfTWVtVGFiX3Q7CisKKworLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWQ1NfTW9kZXNfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7ICAgICAgICAgIC8qIEFsZ29yaXRobSBtb2RlICovCisgICAgTFZDU19TcGVha2VyVHlwZV9lbiAgICAgU3BlYWtlclR5cGU7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSB0eXBlICovCisgICAgTFZDU19Tb3VyY2VGb3JtYXRfZW4gICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCisgICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgQ29tcHJlc3Nvck1vZGU7ICAgICAgICAgLyogTm9uLUxpbmVhciBDb21wcmVzc29yIE1vZGUgKi8KKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KK30gTFZDU19QYXJhbXNfdDsKKworCisvKiBDb25jZXJ0IFNvdW5kIENhcGFiaWxpdHkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KKworICAgIC8qIENhbGxiYWNrIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsgICAgICAgICAgICAgICAvKiBCdW5kbGUgY2FsbGJhY2sgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJ1bmRsZUluc3RhbmNlOyAgICAgICAvKiBCdW5kbGUgaW5zdGFuY2UgaGFuZGxlICovCisKK30gTFZDU19DYXBhYmlsaXRpZXNfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KKy8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLCBvZiB0aGVzZSBvbmx5IHRoZSBidWZmZXIgcHJvY2Vzc2luZyBzZXR0aW5nIGlzICAgICAqLworLyogIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gdGhlIG1lbW9yeSBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gICAgICAqLworLyogIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlICAgICAgICAgICAgICAqLworLyogIGNhcGFiaWxpdGllcyBhcmUgaWdub3JlZCBhbmQgdGhlIG1lbW9yeSB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX01lbW9yeShMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCisvKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KKy8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KKy8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCisvKiAgTFZDU19NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19BbGlnbm1lbnRFcnJvciAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KKy8qICBMVkNTX051bGxBZGRyZXNzICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLworLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkNTX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgICAgICovCisvKiAgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlLiBUaGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdHdvICAgICAgKi8KKy8qICB2YXJpYW50cyBvZiB0aGUgYWxnb3JpdGhtLCBvbmUgZm9yIGhlYWRwaG9uZXMgYW5kIG9uZSBmb3IgbW9iaWxlIHNwZWFrZXJzLiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfVG9vTWFueVNhbXBsZXMgICAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIExWQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDhjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKCAgIExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQnlwYXNzTWl4SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpc2VzIHRoZSBieXBhc3MgbWl4ZXIgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIG92ZXJhbGwgZ2FpbiBvZiB0aGUgcHJvY2Vzc2VkIHBhdGggaXMgc2V0IGJ5IHRoZSBnYWlucyBpbiB0aGUgaW5kaXZpZHVhbCAgICAqLworLyogIHByb2Nlc3NpbmcgYmxvY2tzIGFuZCBieSB0aGUgZWZmZWN0IGxldmVsIGdhaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIHVucHJvY2Vzc2VkIHBhdGggbXVzdCBoYXZlIG1hdGNoaW5nIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aCB0byBlbnN1cmUgICAqLworLyogIGFzIHRoZXkgYXJlIG1peGVkIHRvZ2V0aGVyIHRoZSBjb3JyZWN0IGVmZmVjdCBpcyBhY2hpZXZlZCwgdGhpcyBpcyB0aGUgdmFsdWUgICAgKi8KKy8qICBVbnByb2NMb3NzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBvdmVyYWxsIGdhaW4gaXMgY29ycmVjdGVkIGJ5IGEgY29tYmluYXRpb24gb2YgYSBzaGlmdCB3aXRoIHNhdHVyYXRpb24gYW5kIGEgKi8KKy8qICBsaW5lYXIgc2NhbGVyLCBsb3NzLiBUaGUgbG9zcyBlbnN1cmVzIHRoZSBzdW0gaW4gdGhlIG1peGVyIGRvZXMgbm90IHNhdHVyYXRlICAgICovCisvKiAgYW5kIGFsc28gY29ycmVjdHMgZm9yIGFueSBleGNlc3MgZ2FpbiBpbiB0aGUgc2hpZnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICA9IChMVkNTX0J5cGFzc01peF90ICopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OworICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGU7CisgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50OworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgdHJhbnNpdGlvbiBnYWluCisgICAgICovCisgICAgaWYgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pICYmCisgICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpCisgICAgICAgICYmIChwSW5zdGFuY2UtPk1TVGFyZ2V0MSAhPSAweDdGRkYpIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9mZi0+b24gdHJhbnN0aW9uICovCisgICAgICAgICkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSBwUGFyYW1zLT5FZmZlY3RMZXZlbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2VsZWN0IG5vIGVmZmVjdCBsZXZlbCAqLworICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gMDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGdhaW4gdGFibGUgb2Zmc2V0CisgICAgICovCisgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKSk7CisgICAgcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAorICAgICAqLworICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKKworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0PTE7CisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKKyAgICAgKi8KKyAgICBHYWluID0gKExWTV9VSU5UMzIpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDB4N0ZGRiAtIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKKyAgICBHYWluID0gKExWTV9VSU5UMzIpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiAoR2FpbiA+PiAxNSk7CisgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CisgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gaEluc3RhbmNlOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTE7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZDU19NaXhlckNhbGxiYWNrOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgb3V0cHV0IGdhaW4gc2hpZnQKKyAgICAgKi8KKyAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uU2hpZnQ7CisKKworICAgIC8qCisgICAgICogQ29ycmVjdCBnYWluIGZvciB0aGUgZWZmZWN0IGxldmVsCisgICAgICovCisgICAgeworCisgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbkNvcnJlY3Q7CisgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjE7CisgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgR2FpbjI7CisKKyAgICAgICAgR2FpbjEgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgIEdhaW4yID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgICAgICAvKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKQorICAgICAgICB7CisgICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9JTlQxNikoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fSU5UMzIpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKiAoTFZNX0lOVDMyKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pID4+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fSU5UMzIpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICogKExWTV9JTlQzMilwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSA+PiAxNSkgKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uIGFuZCBzaGlmdCwgbm90ZSB0aGUgcmVzdWx0IGlzIGluIFEzLjEzIGZvcm1hdAorICAgICAgICAgKi8KKyAgICAgICAgR2FpbjEgPSAoR2FpbjEgKiBHYWluQ29ycmVjdCkgPDwgNDsKKyAgICAgICAgR2FpbjIgPSAoR2FpbjIgKiBHYWluQ29ycmVjdCkgPDwgNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEdhaW4xID0gR2FpbjEgPDwgMTY7CisgICAgICAgICAgICBHYWluMiA9IEdhaW4yIDw8IDE2OworICAgICAgICB9CisKKworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZ2FpbiB2YWx1ZXMKKyAgICAgICAgICovCisgICAgICAgIHBDb25maWctPk91dHB1dF9TaGlmdCA9IHBDb25maWctPk91dHB1dF9TaGlmdDsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sR2FpbjE+PjE2KTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sR2FpbjI+PjE2KTsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0J5cGFzc01peGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBcHBseSBCeXBhc3MgTWl4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgbWl4ZXMgdGhlIHByb2Nlc3NlZCBhbmQgdW5wcm9jZXNzZWQgZGF0YSBzdHJlYW1zIHRvZ2V0aGVyIHRvIGNvcnJlY3QgdGhlICAgKi8KKy8qICBvdmVyYWxsIHN5c3RlbSBnYWluIGFuZCBhbGxvdyBwcm9ncmVzc2l2ZSBjb250cm9sIG9mIHRoZSBDb25jZXJ0IFNvdW5kIGVmZmVjdC4gICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGJ5cGFzcyBtaXhlciBpcyBlbmFibGVkIHRoZSBvdXRwdXQgaXMgdGhlIHByb2Nlc3NlZCBzaWduYWwgb25seSBhbmQgICAgKi8KKy8qICB3aXRob3V0IGdhaW4gY29ycmVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFByb2Nlc3NlZCAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBVbnByb2Nlc3NlZCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHVucHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgICAgID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgICAgICAgPSAoTFZDU19CeXBhc3NNaXhfdCAqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGJ5cGFzcyBtaXhlciBpcyBlbmFibGVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19CWVBBU1NNSVhTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgYnlwYXNzIG1peAorICAgICAgICAgKi8KKyAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSBwVW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgb3V0cHV0IGdhaW4gY29ycmVjdGlvbiBzaGlmdAorICAgICAgICAgKi8KKyAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcENvbmZpZy0+T3V0cHV0X1NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19NaXhlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgQ2FsbGJhY2tQYXJhbSkKK3sKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOworCisgICAgLyoKKyAgICAgKiBPZmYgdHJhbnNpdGlvbiBoYXMgY29tcGxldGVkIGluIEhlYWRwaG9uZSBtb2RlCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24pICAgICAmJgorICAgICAgICAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMHgwMDAwKSYmICAvKiB0aGlzIGluZGljYXRlcyBhbiBvbi0+b2ZmIHRyYW5zaXRpb24gKi8KKyAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpCisgICAgeworICAgICAgICAvKiBTZXQgb3BlcmF0aW5nIG1vZGUgdG8gT0ZGICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKKworICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KKyAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKworICAgICAgICAvKiBTaWduYWwgdG8gdGhlIGJ1bmRsZSAqLworICAgICAgICBpZigoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKSAhPSBMVk1fTlVMTCl7CisgICAgICAgICAgICAoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKShwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTEdPUklUSE1fQ1NfSUQgfCBMVkNTX0VWRU5UX0FMR09GRikpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDEpICYmCisgICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpKXsKKworICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KKyAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWVmNzBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVkNTX0JZUEFTU01JWF9IX18KKyNkZWZpbmUgX19MVkNTX0JZUEFTU01JWF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEJ5cGFzcyBtaXhlciBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgLyogTWl4ZXIgc2V0dGluZ3MgKi8KKyAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPdXRwdXRfU2hpZnQ7ICAgICAgICAgICAgICAgLyogQ29ycmVjdGluZyBnYWluIG91dHB1dCBzaGlmdCAqLworCit9IExWQ1NfQnlwYXNzTWl4X3Q7CisKKworLyogT3V0cHV0IGdhaW4gdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBPdXRwdXQgZ2FpbiBzZXR0aW5ncywgR2FpbiA9IChMb3NzLzMyNzY4KSAqIDJeU2hpZnQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KK30gR2Fpbl90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAqcFBhcmFtcyk7CisKKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqdW5Qcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBCWVBBU1NNSVhfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ZDQxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkNTX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgKi8KKy8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIGVycjsKKyAgICBMVkNTX01vZGVzX2VuICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOworCisgICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlID0gTFZDU19TYW1wbGVSYXRlVGFibGVbcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgcmV2ZXJiIGxldmVsIGhhcyBjaGFuZ2VkCisgICAgICovCisgICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCisgICAgeworICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSxwUGFyYW1zKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIGhhcyBjaGFuZ2VkIHRoZW4gcGVyZm9ybSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24KKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBPdXRwdXQgZGV2aWNlCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPk91dHB1dERldmljZSA9IExWQ1NfSEVBRFBIT05FOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgdm9sdW1lIGNvcnJlY3Rpb24gcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCisgICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKKworICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKKworICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworCisgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwwLDApOworCisKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOworICAgICAgICAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBMVk1fTUFYSU5UXzE2KTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX1VJTlQzMilwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluID4+IDE1KTsKKyAgICAgICAgICAgIEdhaW49R2Fpbj4+MTU7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbiBhbmQgc2hpZnQsIG5vdGUgdGhlIHJlc3VsdCBpcyBpbiBRMy4xMyBmb3JtYXQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgR2FpbiA9IChHYWluICogcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4pID4+MTI7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwwLEdhaW4pOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKworICAgICAgICB9CisKKworICAgICAgICBlcnI9TFZDU19TRW5oYW5jZXJJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGVycj1MVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisKKyAgICAgICAgZXJyPUxWQ1NfRXF1YWxpc2VySW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgfQorCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBlZmZlY3QgbGV2ZWwgb3Igc291cmNlIGZvcm1hdCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAhPSBwUGFyYW1zLT5FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcFBhcmFtcy0+U291cmNlRm9ybWF0KSkKKyAgICB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSB2b2x1bWUgY29ycmVjdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBVc2UgaW50ZXJuYWwgY29lZmZpY2llbnQgdGFibGUgKi8KKyAgICAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CisgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgcFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpOworCisgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOworCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZWZmZWN0IGxldmVsIGFuZCBhbHBoYS1taXhlciBnYWlucyAqLworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CisKKyAgICAvKiBTdGF5IG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICBpZigocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkpeworCisgICAgICAgIC8qIFNldCB0aGUgcmV2ZXJiIGRlbGF5IHRpbWVvdXQgKi8KKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAhPSBMVk1fVFJVRSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlRpbWVJbk1zID0KKyAgICAgICAgICAgIChMVk1fSU5UMTYpKCgocEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uLkRlbGF5U2l6ZSA8PCAyKQorICAgICAgICAgICAgL3BJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlKSArIDEpOworICAgICAgICAgICAgTFZNX1RpbWVyX0luaXQgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5UaW1lclBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KKyAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICAvKiBDaGFuZ2UgdHJhbnNpdGlvbiBieXBhc3MgbWl4ZXIgc2V0dGluZ3MgaWYgbmVlZGVkIGRlcGVuZGluZyBvbiB0cmFuc2l0aW9uIHR5cGUgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD1MVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlU2F2ZTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPUxWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD0wOworICAgICAgICB9CisKKworICAgICAgICAvKiBTZXQgdHJhbnNpdGlvbiBmbGFnICovCisgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1RpbWVyQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxsQmFjayBmdW5jdGlvbiBvZiB0aGUgVGltZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDU19UaW1lckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsIHZvaWQqIHBDYWxsQmFja1BhcmFtcywgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pCit7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlICA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgLyogQXZvaWQgd2FybmluZ3MgYmVjYXVzZSBwQ2FsbEJhY2tQYXJhbXMgYW5kIENhbGxiYWNrUGFyYW0gYXJlIG5vdCB1c2VkKi8KKyAgICBpZigocENhbGxCYWNrUGFyYW1zICE9IExWTV9OVUxMKSB8fCAoQ2FsbGJhY2tQYXJhbSAhPSAwKSl7CisgICAgICAgIHBDYWxsQmFja1BhcmFtcyA9IGhJbnN0YW5jZTsKKyAgICAgICAgQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fVFJVRTsKKworCisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMGQ4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19FcXVhbGlzZXIuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19FcXVhbGlzZXJJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGlzZXMgdGhlIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCisvKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLworLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KKy8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRvIGF2b2lkIGV4Y2Vzc2l2ZSB0ZXN0aW5nIGR1cmluZyB0aGUgc2FtcGxlIHByb2Nlc3NpbmcgdGhlIGJpcXVhZCB0eXBlIGlzICAgICAgKi8KKy8qICBzZXQgYXMgYSBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgaW5pdCByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgIENvZWZmczsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwRXF1YWxpc2VyQ29lZlRhYmxlOworCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDErTFZNX0ZTXzQ4MDAwKSkpOworICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9JTlQxNikgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0lOVDE2KSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fSU5UMTYpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9JTlQxNiktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0lOVDE2KS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0XzE2KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMpL3NpemVvZihMVk1fSU5UMTYpKSk7ICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworCisgICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGx5IHRoZSBlcXVhbGlzZXIgZmlsdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5wdXRPdXRwdXQgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dC9vdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCisgICAgeworICAgICAgICAvKiBBcHBseSBmaWx0ZXIgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5NmY1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZDU19FUVVBTElTRVJfSF9fCisjZGVmaW5lIF9fTFZDU19FUVVBTElTRVJfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOworCit9IExWQ1NfRXF1YWxpc2VyX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKTsKKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgIC8qIEVRVUFMSVNFUl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU1MjgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWQ1NfSEVBRFBIT05FX0NPRUZGU19IX18KKyNkZWZpbmUgX19MVkNTX0hFQURQSE9ORV9DT0VGRlNfSF9fCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGUgU3RlcmVvIEVuaGFuY2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA3NDYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjc3MjAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgLTcwNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTUxMjUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0zMDIwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjkyMTg5OSAqLworI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42MTE0NDEgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI0NjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zODAzNDQgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTc1NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMzEwOTcgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAtMjAzOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MjI0NzAgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQyODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMzA3NTkgKi8KKyNkZWZpbmUgQ1NfU0lERV84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjI5NDMgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc1NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIzMDgzOCAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzI2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyMTU1OSAqLworI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMwOTAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTQzMDU2ICovCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTgyNjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU1NzM3MiAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjgyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM5MTQ5MCAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtNTQzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE2NTg4MSAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0yODg1NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjg4MDYwOCAqLworI2RlZmluZSBDU19TSURFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDMyMzk3ICovCisjZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyMTkxICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjk5MzIgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTcyNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjE0MzYgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMTA1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk0NzYxNiAqLworI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Mjk4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTgzOTggKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAtMTI4NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zOTIyMTEgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTU0NDYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNjYxODcgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjkyNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44OTI1NTAgKi8KKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAzMjg1NiAqLworI2RlZmluZSBDU19TSURFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjM3MSAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzU1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjMwNjM4ICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03MzQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI0MjMyICovCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzE0NzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45NjA1NTAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgODE4NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDk5Njk1ICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC01ODI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzU1NTQzICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMzYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTQ0MTUyICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTE3MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMDUwNzg4ICovCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNDQxMDQgKi8KKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjA3ODEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc0OTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIyODc0OSAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzM0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNDEyOCAqLworI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMxODI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTcxMjYyICovCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MDExMiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2MTA5NiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAtMjkzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE3OTAxNiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0xODI5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjExNjc4NiAqLworI2RlZmluZSBDU19TSURFXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTgyNTA3ICovCisjZGVmaW5lIENTX1NJREVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxODgyICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzAzOTUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTc0MDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjYxMTcgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMTkwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk3MzU3MyAqLworI2RlZmluZSBDU19NSURETEVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Nzk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTQ3NzAgKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yODcxODIgKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgLTIwOTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMjc1ODggKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjAxNDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4yMjk2NDggKi8KKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4MjE3NyAqLworI2RlZmluZSBDU19TSURFXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDMyMiAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI4NDAwICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgIC03MzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI1MjE0ICovCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMzIxMTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45ODAxMjYgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk3MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzY0NTc5ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA3MzU1ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTU3MjI0ICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgLTIwODc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjc0MjMxICovCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMTI0OTUgKi8KKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjM4MzQgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc2NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIzMzU5MyAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtNzU3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIzMTIyNSAqLworI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMyMjk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTg1NTQ1ICovCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4NDU3MyAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAtNDI0MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI1ODkxMCAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAyNTY2MiAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTc2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjU3MjI0OCAqLworI2RlZmluZSBDU19TSURFXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgOTY0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTg4Mzk5ICovCisjZGVmaW5lIENTX1NJREVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTY0NDAyICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NjgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzQ0NDUgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgLTc2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMzIyNjEgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0zMjMzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk4NjcxMyAqLworI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNzI2MDYgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgLTQzNzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjY5NTIgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDU2NTQgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAtMjY0OTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS42MTcxNDEgKi8KKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMTAzMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzMDQwNSAqLworI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIFJldmVyYiBVbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXZlcmIgZGVsYXkgc2V0dGluZ3MgaW4gc2FtcGxlcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFogICAgICAgICAgICAgICAgICAgICA5MyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDhrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFogICAgICAgICAgICAgICAgICAgMTI4ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTFrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFogICAgICAgICAgICAgICAgICAgMTM5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFogICAgICAgICAgICAgICAgICAgMTg2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFogICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFogICAgICAgICAgICAgICAgICAgMjc5ICAgICAgICAgLyogU2FtcGxlIHJhdGUgMjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFogICAgICAgICAgICAgICAgICAgMzcyICAgICAgICAgLyogU2FtcGxlIHJhdGUgMzJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFogICAgICAgICAgICAgICAgICAgNTEyICAgICAgICAgLyogU2FtcGxlIHJhdGUgNDhrUy9zICovCisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIxODY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42NjcyNzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAtMjE4NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42NjcyNzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgIC0yMTg5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjY2ODE3OSAqLworI2RlZmluZSBDU19SRVZFUkJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIyOTI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42OTk2MzggKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAtMjI5MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42OTk2MzggKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yNDU0NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjc0OTA5NiAqLworI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDEyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIzMTY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MDY5MzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMjMxNjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43MDY5MzEgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yNTE0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjc2NzMyNyAqLworI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIzODY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MjgyNzIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAtMjM4NjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43MjgyNzIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0yNjg5MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjgyMDY3OSAqLworI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDE2OTIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MTYzOTYgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIC0xNjkyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjUxNjM5NiAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgIC0xNjk5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjUxODUxMiAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAtOTUzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI5MDk5MCAqLworI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQorCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLworI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxNTcxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc5NTY1ICovCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAtMTU3MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40Nzk1NjUgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAtMjA4OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42Mzc3NDUgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgLTY1MTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xOTg5MTIgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTI0NjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4MDM0OSAqLworI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgLTEyNDYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzgwMzQ5ICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTMxMTU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTUwODczICovCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxNjEwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wNDkxMjcgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQ4NzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI5NzM4OSAqLworI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC00ODcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjk3Mzg5ICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTE5NjY4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjAwNDIzICovCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICA0MjAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNTY1MjkgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgNDgwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQ1NjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI3ODY2MSAqLworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgIC00NTY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjc4NjYxICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgLTIwNTYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjU0OTkzICovCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICA0OTcwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMDMzNDcgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKworLyogUmV2ZXJiIEdhaW4gU2V0dGluZ3MgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfREVMQVlHQUlOICAgICAgICAgICAgICAgMC44MDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gZGVsYXkgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX09VVFBVVEdBSU4gICAgICAgICAgICAgIDEuMDAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIG91dHB1dCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOICAgICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogUHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOQ09SUkVDVCAgICAgICAgICAgICAxLjAwOTM0MyAgICAgICAgIC8qIERlbGF5IG1peGVyIGdhaW4gY29ycmVjdGlvbiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIEVxdWFsaXNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzODQ5NyBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3NTQ4MCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAyMDY5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjYzMzEyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgIC05ODU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjAxNzQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIC00NTk5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjgwNjgxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAgIC03Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDc1ODY1ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIC02Njg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4MTU0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgIDMwOTEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDMzNTcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAtMTQ3MjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40NDkzNDUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgLTY4NjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDk1OTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAtMTU1OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40NzU4NjUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMTMzNzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MDgxNTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTEwMjVIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMjc3NjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Njc0NjMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAgMTgwNDEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjEwMTE0NSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICAgICAgMjI3OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTM5MDIwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgLTE0MTYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODY0NDIzICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgNDAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjQ1NDEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAtMTQ4OTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45MDg5MzAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgMzE5ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjA1OCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgIC0yMjc4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjY5NTMyNiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAtMjk3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA5MDgwOSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgIC0yMDAwOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYxMDU5NCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgIC0xMDE5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxMTE0OSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNQorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzMjUyMSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MTAxNyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyMDkxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjc2NjYxICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTE2NjcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMDE3NTE5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtNzIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDQ0MTI4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTExOTU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzI5NjE2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0zMzUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA0NTMyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgIDE2NTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDcwOTUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAtMTQyODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44NzE5MTIgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAzODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAyMzIzMiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgIC0xMjIyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjc0NTg1NyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAtMzA5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE4OTE3MSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzMTM3OCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MDE2NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyMDk5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjgxNjI5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTE3NjI3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMDc1ODcyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAtNjc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDQxMzY1ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgLTExODgyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzI1MjM5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIC0zNjc2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI0MzU4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgIDE3NzEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wODEwOTEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAtMTQyMDggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44NjcxODMgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgLTExNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzAyNDcgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgLTg0NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MTUxMjEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgLTY5NzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MjU4OTMgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wNDE1NzYgYW5kIENTRVggc2NhbGVkIHdpdGggMC43Nzc3NzkgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgMjI3NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjM4ODYwNSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgIC0yMTM5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjMwNTc5OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDY1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDM5OTIyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgLTExNzg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzE5NDk0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgIC0zOTg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjQzMjQ1ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgIDIwODU1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yNzI5MTAgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAtMjE5NzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4zNDEwMTQgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgIDI3NDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE2NzQ2MiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgIC0xMDA2MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYxNDIxOSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAtNTY1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0NTM4NCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAzNDQ5NSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MjQ5MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyMzA5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNDA5ODMyICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgLTIzODYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuNDU2NTA2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAyNDgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNTE0MTAgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAtMTMxNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MDQyMDEgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgLTI2ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNjM3ODMgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgMjEyODYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI5OTE5OCAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgIC0yMzc5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjQ1MjQ0NyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgMzk0MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjQwNDg5ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgLTEwOTY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjY5MzAzICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgIC00ODMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjk0OTg0ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDQ0NTU5IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzgwMDA2ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDI1NTc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS41NjA5ODggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAtMzA3NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS44Nzc3MjQgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDYzODYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4OTc0MSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgIC0xNDg2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjkwNzQxMCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAtMTE1NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA3MDQ4OSAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAxNDYyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNzg1MDQ5ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgLTE4Mjk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTIuMjMzNDk3ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICA0MzEzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MjY0MzEgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgLTM2NTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40NDU5MzkgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgLTQyODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MjI0NDYgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKworLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMjIxNzAgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjMyODggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgMTMzMDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjYyMzk5MyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgIC0xODYwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0yLjI3MDc0MyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgNTY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjg4ODI5ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgIC05MTUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMTE3MTkwICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAxMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMzAyMDggKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgMTY2MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjAyODMxNSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSAgICAgICAgICAgICAgICAgIC0yMzYxMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0yLjg4MjQ1OSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgNzQxMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTA0NTM1ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgIC00ODYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTkzMzA4ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgIC0zMTYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzg1ODE2ICovCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEzNDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS42NDExNzcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAtMTkzNzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMi4zNjQ2ODcgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICAgIDYyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjc1OTkxMCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAtOTU1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjE2Njc3NCAqLworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMTQ1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTc4MDc0ICovCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgIDE3MjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4wOTk2NTUgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAtMjUxMTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMy4wNjUyMjAgKi8KKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgIDgyNzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAxMDQxNyAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAtNTE5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYzNDAyMSAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAtMjg0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0NzMzMiAqLworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhlIE91dHB1dCBHYWluIENvcnJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgICAgMjc3NzkgICAgICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICAgICA2ODQwICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLworI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAxODYwMCAgICAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgIDUxMDggICAgICAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KKy8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KKy8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KKy8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLworLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19NZW1vcnkoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBTY3JhdGNoU2l6ZTsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICopaEluc3RhbmNlOworCisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19JbnN0YW5jZV90KTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWQ1NfUEVSU0lTVEVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIERhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfRGF0YV90KTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWQ1NfREFUQTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0NvZWZmaWNpZW50X3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZDU19DT0VGRklDSUVOVDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkNTX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7ICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIExWTV9OVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICovCisvKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gKi8KKy8qICBMVkNTX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogIDMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgY2FwYWJpbGl0aWVzIGFzIHVzZWQgZm9yIHRoZSAgICAgKi8KKy8qICAgICAgY2FsbCB0byB0aGUgbWVtb3J5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgICAgICAgICAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOworICAgIH0KKyAgICBwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgY2FwYWJpbGl0aWVzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworCisKKyAgICAvKgorICAgICAqIFNldCBhbGwgaW5pdGlhbCBwYXJhbWV0ZXJzIHRvIGludmFsaWQgdG8gZm9yY2UgYSBmdWxsIGluaXRpYWxpc2F0aW9uCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAgPSBMVkNTX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAgICA9IExWQ1NfU1BFQUtFUlRZUEVfTUFYOworICAgIHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlICAgICAgICAgID0gTFZDU19IRUFEUEhPTkU7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVkNTX1NPVVJDRU1BWDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICA9IExWTV9GU19JTlZBTElEOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAgICA9IChMVk1fVUlOVDE2KTB4ODAwMDsKKyAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKyAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgLyogVGhlc2UgY3VycmVudCBhbmQgdGFyZ2V0IHZhbHVlcyBhcmUgaW50aWFsaXplZCBhZ2FpbiBpbiBMVkNTX0NvbnRyb2wuYyAqLworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwwLDApOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NU1RhcmdldDA9MDsKKyAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MT0wOworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5iVGltZXJEb25lICAgICAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5DYWxsQmFja1BhcmFtICAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrICAgICAgICAgICAgID0gTFZDU19UaW1lckNhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxiYWNrSW5zdGFuY2UgICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrUGFyYW1zICAgICAgID0gTFZNX05VTEw7CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhZGI4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhlYWRlciBmaWxlIGZvciB0aGUgcHJpdmF0ZSBsYXllciBpbnRlcmZhY2Ugb2YgY29uY2VydCBzb3VuZC4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlcyBpbmNsdWRlcyBhbGwgZGVmaW5pdGlvbnMsIHR5cGVzLCBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogIHByb3RvdHlwZXMgcmVxdWlyZWQgYnkgdGhlIGV4ZWN1dGlvbiBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fTFZDU19QUklWQVRFX0hfXworI2RlZmluZSBfX0xWQ1NfUFJJVkFURV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIiAgICAgICAgICAgICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIgICAgICAgICAgICAgICAvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfRXF1YWxpc2VyLmgiICAgICAgICAgICAgICAgICAgICAgLyogRXF1YWxpc2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiICAgICAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWTV9UaW1lci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb25maWd1cmF0aW9uIHN3aXRjaCBjb250cm9scyAqLworI2RlZmluZSBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0ggICAgMHgwMDAxICAgICAgLyogU3RlcmVvIGVuaGFuY2VtZW50IGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfUkVWRVJCU1dJVENIICAgICAgICAgICAweDAwMDIgICAgICAvKiBSZXZlcmJlcmF0aW9uIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfRVFVQUxJU0VSU1dJVENIICAgICAgICAweDAwMDQgICAgICAvKiBFcXVhbGlzZXIgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19CWVBBU1NNSVhTV0lUQ0ggICAgICAgIDB4MDAwOCAgICAgIC8qIEJ5cGFzcyBtaXhlciBlbmFibGUgY29udHJvbCAqLworI2RlZmluZSBMVkNTX0NPTVBHQUlORlJBTUUgICAgICAgICAgNjQgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHVwZGF0ZSBpbnRlcnZhbCAqLworCisvKiBNZW1vcnkgKi8KKyNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKworLyogR2VuZXJhbCAqLworI2RlZmluZSBMVkNTX0lOVkFMSUQgICAgICAgICAgICAgICAgMHhGRkZGICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLworI2RlZmluZSBMVkNTX0JZUEFTU19NSVhFUl9UQyAgICAgICAgMTAwICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KKworLyogQWNjZXNzIHRvIGV4dGVybmFsIGNvZWZmaWNpZW50cyB0YWJsZSAqLworI2RlZmluZSBMVkNTX05SX09GX0ZTICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIExWQ1NfTlJfT0ZfQ0hBTl9DRkcgICAgICAgICAgICAgIDIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBMVk1fVUlOVDE2ICBMVkNTX0NvbmZpZ3VyYXRpb25fdDsgICAgICAgLyogSW50ZXJuYWwgYWxnb3JpdGhtIGNvbmZpZ3VyYXRpb24gKi8KKwordHlwZWRlZiBlbnVtCit7CisgICAgTFZDU19IRUFEUEhPTkUgID0gMCwKKyAgICBMVkNTX0RFVklDRV9NQVggPSBMVk1fTUFYRU5VTQorfSBMVkNTX091dHB1dERldmljZV9lbjsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExWTV9JTlQxNiAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9JTlQxNiAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fSU5UMTYgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9JTlQxNiAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLworfSBMVkNTX1ZvbENvcnJlY3RfdDsKKworLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCisgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCisKKyAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLworICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisKKyAgICAvKiBTdWItYmxvY2sgY29uZmlndXJhdGlvbnMgKi8KKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICBTdGVyZW9FbmhhbmNlcjsgICAgIC8qIFN0ZXJlbyBlbmhhbmNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgUmV2ZXJiZXJhdGlvbjsgICAgICAvKiBSZXZlcmJlcmF0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX0VxdWFsaXNlcl90ICAgICAgICBFcXVhbGlzZXI7ICAgICAgICAgIC8qIEVxdWFsaXNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19CeXBhc3NNaXhfdCAgICAgICAgQnlwYXNzTWl4OyAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgY29uZmlndXJhdGlvbiAqLworCisgICAgLyogQnlwYXNzIHZhcmlhYmxlICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTVNUYXJnZXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgc3RhdGUgY29udHJvbCB2YXJpYWJsZSBmb3Igc21vb3RoIHRyYW5zdGlvbiAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE1TVGFyZ2V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peGVyIHN0YXRlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHNtb290aCB0cmFuc3Rpb24gKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgICAgICAgICAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiVGltZXJEb25lOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBjb21wbGV0aW9uIGZsYWcgKi8KKyAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICBUaW1lclBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBwYXJhbWV0ZXJzICovCisgICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgVGltZXJJbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgICAgLyogVGltZXIgaW5zdGFuY2UgKi8KKworfSBMVkNTX0luc3RhbmNlX3Q7CisKKy8qIENvZWZmaWNpZW50IFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKKyAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOworICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOworCit9IExWQ1NfQ29lZmZpY2llbnRfdDsKKworLyogRGF0YSBTdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgRXF1YWxpc2VyQmlxdWFkVGFwczsKKyAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCBSZXZlcmJCaXF1YWRUYXBzOworICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IFNFQmlxdWFkVGFwc01pZDsKKyAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCBTRUJpcXVhZFRhcHNTaWRlOworCit9IExWQ1NfRGF0YV90OworCisKK3ZvaWQgTFZDU19UaW1lckNhbGxCYWNrICggICB2b2lkKiBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENhbGxCYWNrUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgICAgICAvKiBQUklWQVRFX0ggKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDk5NDYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiQ29tcExpbS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3NfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICBfX19fX19fX18gICAgX19fX19fX18gICAgX19fX18gICAgX19fX19fXyAgICAgX19fICAgX19fX19fICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICB8ICAgICAgICAgfCAgfCAgICAgICAgfCAgfCAgICAgfCAgfCAgICAgICB8ICAgfCAgIHwgfCAgICAgIHwgICAgICAgICAgICovCisvKiAgICAgLS0tLS0+fCBTdGVyZW8gIHwtPnwgUmV2ZXJiIHwtPnwgRXF1IHwtPnwgQWxwaGEgfC0tPnwgKyB8LXwgR2FpbiB8LS0tLT4gICAgICAqLworLyogICAgICAgIHwgIHwgRW5oYW5jZSB8ICB8X19fX19fX198ICB8X19fX198ICB8X19fX19fX3wgICB8X19ffCB8X19fX19ffCAgICAgICAgICAgKi8KKy8qICAgICAgICB8ICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IDEgLSBBbHBoYSB8LS0tLS18ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgU3RlcmVvIEVuaGFuY2VyLCBSZXZlcmIgYW5kIEVxdWFsaXNlciBibG9ja3MgYXJlIGVhY2ggY29uZmlndXJlZCB0byBoYXZlICAgICovCisvKiAgdGhlaXIgZ2FpbiB0byBnaXZlIGEgbmVhciBwZWFrIHRvIHBlYWsgb3V0cHV0ICgtMC4xZEJGUykgd2l0aCBhIHdvcnN0IGNhc2UgICAgICAqLworLyogIGlucHV0IHNpZ25hbC4gVGhlIGdhaW5zIG9mIHRoZXNlIGJsb2NrcyBhcmUgcmUtY29tYmluZWQgaW4gdGhlIEFscGhhIG1peGVyIGFuZCAgKi8KKy8qICB0aGUgZ2FpbiBibG9jayBmb2xsb2luZyB0aGUgc3VtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBwcm9jZXNzaW5nIHVzZXMgdGhlIG91dHB1dCBidWZmZXIgZm9yIGRhdGEgc3RvcmFnZSBhZnRlciBlYWNoIHByb2Nlc3NpbmcgICAgKi8KKy8qICBibG9jay4gV2hlbiBwcm9jZXNzaW5nIGlzIGlucGxhY2UgYSBjb3B5IG9mIHRoZSBpbnB1dCBzaWduYWwgaXMgbWFkZSBpbiBzY3JhdGNoICovCisvKiAgbWVtb3J5IGZvciB0aGUgMS1BbHBoYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqcElucHV0OworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMTYgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQorICAgICAqLworICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIqTnVtU2FtcGxlcyk7CisgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0LCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKKyAgICAgKi8KKyAgICBlcnI9TFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3IoaEluc3RhbmNlLCAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgorICAgICAqLworICAgIGVycj1MVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIGJ5cGFzcyBtaXhlcgorICAgICAqLworICAgIGVycj1MVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICBpZihlcnIgIT1MVkNTX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0d28gICovCisvKiAgdmFyaWFudHMgb2YgdGhlIGFsZ29yaXRobSwgb25lIGZvciBoZWFkcGhvbmVzIGFuZCBvbmUgZm9yIG1vYmlsZSBzcGVha2Vycy4gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRhIGNhbiBiZSBwcm9jZXNzZWQgaW4gdHdvIGZvcm1hdHMsIHN0ZXJlbyBvciBtb25vLWluLXN0ZXJlby4gRGF0YSBpbiBtb25vICAgICovCisvKiAgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBjYWxsaW5nIHJvdXRpbmUgbXVzdCBjb252ZXJ0IHRoZSBtb25vIHN0cmVhbSB0byAgICAqLworLyogIG1vbm8taW4tc3RlcmVvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19Ub29NYW55U2FtcGxlcyAgICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCisgICAgICAgICAqLworICAgICAgICAgICAgZXJyPUxWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fSU5UMTYgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOworICAgICAgICAgICAgTFZNX0lOVDMyIEN1cnJlbnQxOworCisgICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgICAgICBHYWluID0gKExWTV9JTlQxNikoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpID4+IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0lOVDMyKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpID4+IDE1KSApOworCisgICAgICAgICAgICBpZihOdW1TYW1wbGVzIDwgTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRDE2KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIqTnVtU2FtcGxlcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgR2FpblN0ZXA7CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBGaW5hbEdhaW47CisgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOworICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKnBPdXRQdHI7CisKKyAgICAgICAgICAgICAgICAvKiBMYXJnZSBjaGFuZ2VzIGluIEdhaW4gY2FuIGNhdXNlIGNsaWNrcyBpbiBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICBTcGxpdCBkYXRhIGludG8gc21hbGwgYmxvY2tzIGFuZCB1c2UgaW50ZXJwb2xhdGVkIGdhaW4gdmFsdWVzICovCisKKyAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fSU5UMTYpKCgoR2Fpbi1wSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBMVkNTX0NPTVBHQUlORlJBTUUpL051bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09MCkmJihwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA8IEdhaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXA9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09MCkmJihwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcD0tMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbmFsR2FpbiA9IEdhaW47CisgICAgICAgICAgICAgICAgR2FpbiA9IHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluOworICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwT3V0RGF0YTsKKworICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBHYWluID0gKExWTV9JTlQxNikoR2FpbiArIEdhaW5TdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID4gMCkmJiAoRmluYWxHYWluIDw9IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPTA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPCAwKSYmIChGaW5hbEdhaW4gPiBHYWluKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0wOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNihHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMipMVkNTX0NPTVBHQUlORlJBTUUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIgKz0oMipMVkNTX0NPTVBHQUlORlJBTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoU2FtcGxlVG9Qcm9jZXNzLUxWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNihHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMipTYW1wbGVUb1Byb2Nlc3MpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdG9yZSBnYWluIHZhbHVlKi8KKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gR2FpbjsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgICAgICAgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBMVk1fVGltZXIgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworCisKKworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjU3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpc2VzIHRoZSByZXZlcmIgbW9kdWxlLiBUaGUgZGVsYXkgYnVmZmVyIHNpemUgaXMgY29uZmlndXJlZCBmb3IgdGhlICAgICAgKi8KKy8qICBzYW1wbGUgcmF0ZSBhbmQgdGhlIHNwZWFrZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSByb3V0aW5lIG1heSBhbHNvIGJlIGNhbGxlZCBmb3IgcmUtaW5pdGlhbGlzYXRpb24sIGkuZS4gd2hlbiBvbmUgb2YgdGhlICAgICAgKi8KKy8qICBjb250cm9sIHBhcmFtZXRlcnMgaGFzIGNoYW5nZWQuIEluIHRoaXMgY2FzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgYXJlIG9ubHkgICAgICovCisvKiAgcmUtaW5pdGlhbGlzZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnMgaXMgbWV0OiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtICAgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSAgIHRoZSBzcGVha2VyIHR5cGUgY2hhbmdlcyB0by9mcm9tIHRoZSBtb2JpbGUgc3BlYWtlciAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBJbiB0aGUgZGVsYXkgc2V0dGluZ3MgJ1NhbXBsZXMnIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB0aGUgZW5kIG9mIHRoZSAgKi8KKy8qICAgICAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoZSBudW1lcmF0b3IgY29lZmZpY2llbnRzIG9mIHRoZSBmaWx0ZXIgYXJlIG5lZ2F0ZWQgdG8gY2F1c2UgYW4gaW52ZXJzaW9uLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBEZWxheTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgICpwQ29uZmlnICAgPSAoTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAqKSZwSW5zdGFuY2UtPlJldmVyYmVyYXRpb247CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICBDb2VmZnM7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgorICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAorICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBkZWxheQorICAgICAgICAgKi8KKyAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CisKKworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpL3NpemVvZihMVk1fSU5UMTYpKSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlcnMKKyAgICAgICAgICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CisgICAgICAgIHBSZXZlcmJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfUmV2ZXJiQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9JTlQxNilwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmcy5BMSA9IChMVk1fSU5UMTYpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0lOVDE2KXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9JTlQxNiktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0lOVDE2KS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgIC8qIE51bWJlciBvZiB3b3JkcyAqLworCisgICAgICAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIG1peGVyCisgICAgICAgICAqLworICAgICAgICBwQ29uZmlnLT5Qcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOUFJPQyk7CisgICAgICAgIHBDb25maWctPlVucHJvY0dhaW4gID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5VTlBST0MpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDMyICAgUmV2ZXJiUGVyY2VudGFnZT04Mzg4NjsgICAgICAgICAgICAgICAgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBSZXZlcmJQZXJjZW50YWdlKj1wUGFyYW1zLT5SZXZlcmJMZXZlbDsgICAgICAgICAgICAgICAgIC8vIEFjdHVhbCBSZXZlcmIgTGV2ZWwgaW4gUSAyMyBmb3JtYXQKKyAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWw9KExWTV9JTlQxNikoUmV2ZXJiUGVyY2VudGFnZT4+OCk7ICAvLyBSZXZlcmIgTGV2ZWwgaW4gUSAxNSBmb3JtYXQKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19SZXZlcmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIHJldmVyYiB1c2luZyB0aGUgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGJsb2NrICAgICAqLworLyogIGRpYWdyYW06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgIF9fX19fICAgICBfX19fX19fICAgIHwgICAgICAgIHwtLS0tLS0tLS0tLT58ICAgICAgICB8ICAgIF9fX19fXyAgICAgX19fICAgICAgKi8KKy8qICAgIHwgICAgIHwgICB8ICAgICAgIHwgICB8IFN0ZXJlbyB8ICAgICAgICAgICAgfCBMICYgUiAgfCAgIHwgICAgICB8ICAgfCAgIHwgICAgICovCisvKiAtLT58IExQRiB8LS0+fCBEZWxheSB8LS0+fCAgIHRvICAgfCAgICBfX19fICAgIHwgICB0byAgIHwtLT58IEdhaW4gfC0tPnwgKyB8LS0+ICAqLworLyogIHwgfF9fX19ffCAgIHxfX19fX19ffCAgIHwgTCAmIFIgIHwgICB8ICAgIHwgICB8IFN0ZXJlbyB8ICAgfF9fX19fX3wgICB8X19ffCAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8LS0+fCAtMSB8LS0+fCAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgIHxfX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgfCAgICAgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKi8KKy8qICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBpbnB1dCBidWZmZXIgaXMgYnJva2VuIGluIHRvIHN1Yi1ibG9ja3Mgb2YgdGhlIHNpemUgb2YgdGhlIGRlbGF5IG9yIGxlc3MuICAgKi8KKy8qICBUaGlzIGFsbG93cyB0aGUgZGVsYXkgYnVmZmVyIHRvIGJlIHRyZWF0ZWQgYXMgYSBjaXJjdWxhciBidWZmZXIgYnV0IHByb2Nlc3NlZCAgICovCisvKiAgYXMgYSBsaW5lYXIgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBQcm9jZXNzIGluIGJsb2NrcyBvZiBzYW1wbGVzIHRoZSBzaXplIG9mIHRoZSBkZWxheSB3aGVyZSBwb3NzaWJsZSwgaWYgbm90ICAgKi8KKy8qICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGVzIGxlZnQgb3ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoZSBHYWluIGlzIGNvbWJpbmVkIHdpdGggdGhlIExQRiBhbmQgaW5jb3Jwb3JhdGVkIGluIHRvIHRoZSBjb2VmZmljaWVudHMgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDE2ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgaW4gb3V0cGxhY2UgcHJvY2Vzc2luZworICAgICAqLworICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmV2ZXJiIG5vdCByZXF1aXJlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcmV2ZXJiIGlzIHJlcXVpcmVkCisgICAgICovCisgICAgaWYgKCgocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgPT0gTFZDU19IRUFEUEhPTkUpIHx8ICAgICAgICAgICAvKiBEaXNhYmxlIHdoZW4gQ1M0TVMgaW4gc3RlcmVvIG1vZGUgKi8KKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0VYX0hFQURQSE9ORVMpIHx8CisgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IExWQ1NfU1RFUkVPKSkgICYmCisgICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPTApKSAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogQ29weSB0aGUgaW5wdXQgZGF0YSB0byBzY3JhdGNoIG1lbW9yeSBhbmQgZmlsdGVyIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisKKworICAgICAgICAvKgorICAgICAgICAgKiBGaWx0ZXIgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICBNdWx0M3NfMTZ4MTYoIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7CisKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CisgICAgICAgICAqLworICAgICAgICBEZWxheU1peF8xNngxNigoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTAyNmZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVkNTX1JFVkVSQkdFTkVSQVRPUl9IX18KKyNkZWZpbmUgX19MVkNTX1JFVkVSQkdFTkVSQVRPUl9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgICAgIEhFQURQSE9ORUdBSU5QUk9DICAgICAgICAgICBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTgorI2RlZmluZSAgICAgSEVBRFBIT05FR0FJTlVOUFJPQyAgICAgICAgIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisKKyAgICAvKiBTdGVyZW8gZGVsYXkgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlTaXplOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheU9mZnNldDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUHJvY0dhaW47CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFVucHJvY0dhaW47CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIqTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisKKyAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CisKKyAgICAvKiBGaWx0ZXIgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CisKK30gTFZDU19SZXZlcmJHZW5lcmF0b3JfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAqcFBhcmFtcyk7CisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmICAvKiBSRVZFUkJfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI4YjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfU3RlcmVvRW5oYW5jZXIuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19TdGVyZW9FbmhhbmNlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGlzZXMgdGhlIHN0ZXJlbyBlbmhhbmNlbWVudCBtb2R1bGUgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCisvKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLworLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KKy8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7CisgICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKKyAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICBDb2VmZnNTaWRlOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBTRVNpZGVDb2VmczsKKworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB1cGRhdGUgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUKKyAgICAgICAgICovCisgICAgICAgIC8qIE1pZCBmaWx0ZXIgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc01pZC5BMCA9IChMVk1fSU5UMTYpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9JTlQxNikgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNNaWQuQjEgPSAoTFZNX0lOVDE2KS1MVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQjE7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNNaWQpL3NpemVvZihMVk1fVUlOVDE2KSkpOyAgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKyAgICAgICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNNaWQpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBpZihMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uU2NhbGU9PTE1KQorICAgICAgICB7CisgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkICA9IEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICB9CisKKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUpOworICAgICAgICBwU0VTaWRlQ29lZnMgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfU0VTaWRlQ29lZlRhYmxlWzBdOworCisgICAgICAgIC8qIFNpZGUgZmlsdGVyICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzU2lkZS5BMCA9IChMVk1fSU5UMTYpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnNTaWRlLkExID0gKExWTV9JTlQxNikgcFNFU2lkZUNvZWZzW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmc1NpZGUuQTIgPSAoTFZNX0lOVDE2KSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzU2lkZS5CMSA9IChMVk1fSU5UMTYpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnNTaWRlLkIyID0gKExWTV9JTlQxNiktcFNFU2lkZUNvZWZzW09mZnNldF0uQjI7CisKKyAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KKyAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKS9zaXplb2YoTFZNX1VJTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBTRVNpZGVDb2Vmc1tPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7CisKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKKworICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1N0ZXJlb0VuaGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFbmhhbmNlIHRoZSBzdGVyZW8gaW1hZ2UgaW4gdGhlIGlucHV0IHNhbXBsZXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8ICAgICAgICB8ICBNaWRkbGUgICB8IFRyZWJsZSB8ICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCAgICAgICAgfC0tLS0tLS0tLS0+fCBCb29zdCAgfC0tLS0tLS0tPnwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgU3RlcmVvIHwgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICB8IE0gJiBTICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtLT58ICAgdG8gICB8ICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgfCAgIHRvICAgfC0tPiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCBNICYgUyAgfCAgU2lkZSAgICAgfCAgICAgICAgfCAgICAgICAgIHwgU3RlcmVvIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgICAgICAgIHwtLS0tLS0tLS0tPnwgU2lkZSAgIHwtLS0tLS0tLT58ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8X19fX19fX198ICAgICAgICAgICB8IEJvb3N0ICB8ICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJZiB0aGUgaW5wdXQgc2lnbmFsIGlzIGEgbW9ubyBzaWduYWwgdGhlcmUgd2lsbCBiZSBubyBzaWRlIHNpZ25hbCBhbmQgaGVuY2UgICAgICovCisvKiAgdGhlIHNpZGUgZmlsdGVyIHdpbGwgbm90IGJlIHJ1bi4gSW4gbW9iaWxlIHNwZWFrZXIgbW9kZSB0aGUgbWlkZGxlIGZpbHRlciBpcyAgICAqLworLyogIG5vdCByZXF1aXJlZCBhbmQgdGhlIFRyZWJibGUgYm9vc3QgZmlsdGVyIGlzIHJlcGxhY2VkIGJ5IGEgc2ltcGxlIGdhaW4gYmxvY2suICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFNjcmF0Y2ggID0gKExWTV9JTlQxNiAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBTdGVyZW8gRW5oYW5jZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfU1RFUkVPRU5IQU5DRVNXSVRDSCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gc3RlcmVvIHRvIG1pZGRsZSBhbmQgc2lkZQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbTJpVG9NU18xNngxNihwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoK051bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSBmaWx0ZXIgdG8gdGhlIG1pZGRsZSBzaWduYWwKKyAgICAgICAgICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkKKyAgICAgICAgeworICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQpKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNdWx0M3NfMTZ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KXBDb25maWctPk1pZEdhaW4sICAgICAgLyogR2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIgdGhlIHNpZGUgc2lnbmFsIG9ubHkgaW4gc3RlcmVvIG1vZGUgZm9yIGhlYWRwaG9uZXMKKyAgICAgICAgICogYW5kIGluIGFsbCBtb2RlcyBmb3IgbW9iaWxlIHNwZWFrZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWQ1NfU1RFUkVPKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUpKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KKyAgICAgICAgICovCisgICAgICAgIE1TVG8yaV9TYXRfMTZ4MTYocFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2grTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzdGVyZW8gZW5oYW5jZXIgaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBPdXREYXRhLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmM0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZDU19TVEVSRU9FTkhBTkNFUl9IX18KKyNkZWZpbmUgX19MVkNTX1NURVJFT0VOSEFOQ0VSX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RlcmVvIGVuaGFuY2VyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKgorICAgICAqIE1pZGRsZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19NaWQpKEJpcXVhZF9JbnN0YW5jZV90KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KiwgTFZNX0lOVDE2KTsKKworICAgIC8qCisgICAgICogU2lkZSBmaWx0ZXIKKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CisKKyAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1pZEdhaW47ICAgICAgICAgICAgLyogTWlkZGxlIGdhaW4gaW4gbW9iaWxlIHNwZWFrZXIgbW9kZSAqLworCit9IExWQ1NfU3RlcmVvRW5oYW5jZXJfdDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICAqcFBhcmFtcyk7CisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAgLyogU1RFUkVPRU5IQU5DRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0ZGUyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkZpbHRlcnMuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCIgICAgICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBtaWRkbGUgZmlsdGVyICovCitjb25zdCBCaXF1YWRBMDFCMUNvZWZzU1BfdCBMVkNTX1NFTWlkQ29lZlRhYmxlW10gPSB7CisgICAge0NTX01JRERMRV84MDAwX0EwLCAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfODAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzgwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfODAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xMTAyNV9BMCwgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzExMDI1X0ExLAorICAgICBDU19NSURETEVfMTEwMjVfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTEwMjVfU0NBTEV9LAorICAgIHtDU19NSURETEVfMTIwMDBfQTAsICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xMjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzEyMDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE2MDAwX0EwLCAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTYwMDBfQTEsCisgICAgIENTX01JRERMRV8xNjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xNjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8yMjA1MF9BMCwgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzIyMDUwX0ExLAorICAgICBDU19NSURETEVfMjIwNTBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjIwNTBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMjQwMDBfQTAsICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8yNDAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzI0MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzMyMDAwX0EwLCAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMzIwMDBfQTEsCisgICAgIENTX01JRERMRV8zMjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8zMjAwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV80NDEwMF9BMCwgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzQ0MTAwX0ExLAorICAgICBDU19NSURETEVfNDQxMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDQxMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV80ODAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfX07CisKKy8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgc2lkZSBmaWx0ZXIgKi8KK2NvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXSA9IHsKKyAgICAvKiBIZWFkcGhvbmUgU2lkZSBjb2VmZmljaWVudHMgKi8KKyAgICB7Q1NfU0lERV84MDAwX0EwLCAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfODAwMF9BMSwKKyAgICAgQ1NfU0lERV84MDAwX0EyLAorICAgICBDU19TSURFXzgwMDBfQjEsCisgICAgIENTX1NJREVfODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfODAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMTEwMjVfQTAsICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xMTAyNV9BMSwKKyAgICAgQ1NfU0lERV8xMTAyNV9BMiwKKyAgICAgQ1NfU0lERV8xMTAyNV9CMSwKKyAgICAgQ1NfU0lERV8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTEwMjVfU0NBTEV9LAorICAgIHtDU19TSURFXzEyMDAwX0EwLCAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTIwMDBfQTEsCisgICAgIENTX1NJREVfMTIwMDBfQTIsCisgICAgIENTX1NJREVfMTIwMDBfQjEsCisgICAgIENTX1NJREVfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xNjAwMF9BMCwgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzE2MDAwX0ExLAorICAgICBDU19TSURFXzE2MDAwX0EyLAorICAgICBDU19TSURFXzE2MDAwX0IxLAorICAgICBDU19TSURFXzE2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xNjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfMjIwNTBfQTAsICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8yMjA1MF9BMSwKKyAgICAgQ1NfU0lERV8yMjA1MF9BMiwKKyAgICAgQ1NfU0lERV8yMjA1MF9CMSwKKyAgICAgQ1NfU0lERV8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMjIwNTBfU0NBTEV9LAorICAgIHtDU19TSURFXzI0MDAwX0EwLCAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMjQwMDBfQTEsCisgICAgIENTX1NJREVfMjQwMDBfQTIsCisgICAgIENTX1NJREVfMjQwMDBfQjEsCisgICAgIENTX1NJREVfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8zMjAwMF9BMCwgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzMyMDAwX0ExLAorICAgICBDU19TSURFXzMyMDAwX0EyLAorICAgICBDU19TSURFXzMyMDAwX0IxLAorICAgICBDU19TSURFXzMyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8zMjAwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfNDQxMDBfQTAsICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV80NDEwMF9BMSwKKyAgICAgQ1NfU0lERV80NDEwMF9BMiwKKyAgICAgQ1NfU0lERV80NDEwMF9CMSwKKyAgICAgQ1NfU0lERV80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDQxMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzQ4MDAwX0EwLCAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfNDgwMDBfQTEsCisgICAgIENTX1NJREVfNDgwMDBfQTIsCisgICAgIENTX1NJREVfNDgwMDBfQjEsCisgICAgIENTX1NJREVfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFcXVhbGlzZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVtdID0geworICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfODAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLAorICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMTIwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE2MDAwX0EwLCAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLAorICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMjQwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzMyMDAwX0EwLCAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLAorICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl80ODAwMF9BMCwgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfNDgwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKworICAgIC8qIENvbmNlcnQgU291bmQgRVggSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCwgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCwgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCwgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCwgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCwgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCwgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEV9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBkZWxheSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGVyZW8gZGVsYXkgdGFibGUgZm9yIENvbmNlcnQgU291bmQgKi8KK2NvbnN0IExWTV9VSU5UMTYgICAgTFZDU19TdGVyZW9EZWxheUNTW10gPSB7CisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjJLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDRLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWn07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBjb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfUmV2ZXJiQ29lZlRhYmxlW10gPSB7CisgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgIHtDU19SRVZFUkJfODAwMF9BMCwgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84MDAwX0ExLAorICAgICBDU19SRVZFUkJfODAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzgwMDBfQjEsCisgICAgIENTX1JFVkVSQl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzgwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTEwMjVfQTAsICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTEwMjVfQTEsCisgICAgIENTX1JFVkVSQl8xMTAyNV9BMiwKKyAgICAgQ1NfUkVWRVJCXzExMDI1X0IxLAorICAgICBDU19SRVZFUkJfMTEwMjVfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTEwMjVfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTIwMDBfQTAsICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xMjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzEyMDAwX0IxLAorICAgICBDU19SRVZFUkJfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTIwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTYwMDBfQTAsICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTYwMDBfQTEsCisgICAgIENTX1JFVkVSQl8xNjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzE2MDAwX0IxLAorICAgICBDU19SRVZFUkJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTYwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMjIwNTBfQTAsICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMjIwNTBfQTEsCisgICAgIENTX1JFVkVSQl8yMjA1MF9BMiwKKyAgICAgQ1NfUkVWRVJCXzIyMDUwX0IxLAorICAgICBDU19SRVZFUkJfMjIwNTBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMjIwNTBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMjQwMDBfQTAsICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMjQwMDBfQTEsCisgICAgIENTX1JFVkVSQl8yNDAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzI0MDAwX0IxLAorICAgICBDU19SRVZFUkJfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMjQwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMzIwMDBfQTAsICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMzIwMDBfQTEsCisgICAgIENTX1JFVkVSQl8zMjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzMyMDAwX0IxLAorICAgICBDU19SRVZFUkJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMzIwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfNDQxMDBfQTAsICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfNDQxMDBfQTEsCisgICAgIENTX1JFVkVSQl80NDEwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzQ0MTAwX0IxLAorICAgICBDU19SRVZFUkJfNDQxMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDQxMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfNDgwMDBfQTAsICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfNDgwMDBfQTEsCisgICAgIENTX1JFVkVSQl80ODAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IxLAorICAgICBDU19SRVZFUkJfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfNDgwMDBfU0NBTEV9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEJ5cGFzcyBtaXhlciBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXSA9IHsKKyAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCisgICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAorICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0sCisgICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19IRUFEUEhPTkVfR0FJTn0sCisgICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKKyAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lIGNvcnJlY3Rpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb2VmZmljaWVudCBvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDb21wcmVzc2lvbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAxMDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW4gMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgQ29tcHJlc3Npb24gZ2FpbiBpcyByZXByZXNlbnRlZCBieSBhIFExLjE1IG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgMGRCICAgICovCisvKiAgdG8gKzZkQiwgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAwZEIgY29tcHJlc3Npb24gKG5vIGVmZmVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDU0NjEgICAgaXMgMWRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAxMDkyMyAgIGlzIDJkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMzI3NjcgICBpcyA2ZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIEdhaW4gaXMgcmVwcmVzZW50ZWQgYXMgYSBRMy4xMyBudW1iZXIgdG8gZ2l2ZSBhIHJhbmdlIG9mICs4IHRvIC1pbmZpbml0eSAgICAqLworLyogIEUuZy46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDAgICAgICAgaXMgLWluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzICsxOGRCICh4OCkgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNDA5NiAgICBpcyAwZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwMjQgICAgaXMgLTEyZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW10gPSB7CisgICAgezE0MjAwLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAsCisgICAgIDQwOTYsCisgICAgIDU3ODZ9LAorICAgIHsxNDIwMCwgICAgICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAwLAorICAgICA0MDk2LAorICAgICA1Nzg2fSwKKyAgICB7MzI3NjcsICAgICAgICAgLyogSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgMCwKKyAgICAgNDA5NiwKKyAgICAgNTc4Nn0sCisgICAgezMyNzY3LCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAsCisgICAgIDQwOTYsCisgICAgIDU3ODZ9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNaXhlciB0aW1lIGNvbnN0YW50cywgMTAwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgICAgICAzMjU4MCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwICAgICAzMjY3NCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworCisKK2NvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbOV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDB9OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YzRjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0xWQ1NfVEFCTEVTX0hfXworI2RlZmluZSBfX0xWQ1NfVEFCTEVTX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgbWlkZGxlIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMUIxQ29lZnNTUF90IExWQ1NfU0VNaWRDb2VmVGFibGVbXTsKKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19TRVNpZGVDb2VmVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRXF1YWxpc2VyIGNvZWZmaWNpZW50IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmVyYiBkZWxheSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTdGVyZW8gZGVsYXkgdGFibGUgZm9yIENvbmNlcnQgU291bmQgKi8KK2V4dGVybiBjb25zdCBMVk1fVUlOVDE2IExWQ1NfU3RlcmVvRGVsYXlDU1tdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXZlcmIgY29lZmZpY2llbnRzIGNvbnN0YW50IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19SZXZlcmJDb2VmVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQnlwYXNzIG1peGVyIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBjb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVm9sdW1lIGNvcnJlY3Rpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb2VmZmljaWVudCBvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBDb21wcmVzc2lvbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAxMDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW4gMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgQ29tcHJlc3Npb24gZ2FpbiBpcyByZXByZXNlbnRlZCBieSBhIFExLjE1IG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgMGRCICAgICovCisvKiAgdG8gKzZkQiwgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAwZEIgY29tcHJlc3Npb24gKG5vIGVmZmVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDU0NjEgICAgaXMgMWRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAxMDkyMyAgIGlzIDJkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMzI3NjcgICBpcyA2ZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIEdhaW4gaXMgcmVwcmVzZW50ZWQgYXMgYSBRMy4xMyBudW1iZXIgdG8gZ2l2ZSBhIHJhbmdlIG9mICs4IHRvIC1pbmZpbml0eSAgICAqLworLyogIEUuZy46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDAgICAgICAgaXMgLWluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzICsxOGRCICh4OCkgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNDA5NiAgICBpcyAwZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwMjQgICAgaXMgLTEyZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVtdOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gTFZNX0lOVDMyICAgICAgICAgICAgICAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlW107CisKKworLypTcGVha2VyIGNvZWZmaWVudCB0YWJsZXMqLworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1NFTWlkZGxlR2FpblRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfU0VTaWRlQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfUmV2ZXJiQ29lZlRhYmxlW10gOworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1N0ZXJlb0RlbGF5Q1M0TVNbXTsKK2V4dGVybiBHYWluX3QgICAgICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgTFZDU19NU19TbWFsbF9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9SZXZlcmJHYWluVGFibGVbXTsKKworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX01lZGl1bV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19NZWRpdW1fRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfTWVkaXVtX1JldmVyYkNvZWZUYWJsZVtdIDsKK2V4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgTFZDU19NU19NZWRpdW1fVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX1JldmVyYkdhaW5UYWJsZVtdOworCitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU0VNaWRkbGVHYWluVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9SZXZlcmJDb2VmVGFibGVbXSA7CitleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX0xhcmdlX1ZvbENvcnJlY3RUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX1JldmVyYkdhaW5UYWJsZVtdOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9fTFZDU19UQUJMRVNfSF9fICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTliOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCisjIG11c2ljIGJ1bmRsZSB3cmFwcGVyCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCUJ1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisKK0xPQ0FMX01PRFVMRTo9IGxpYmJ1bmRsZXdyYXBwZXIKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJtdXNpY2J1bmRsZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgbGliY3V0aWxzIFwKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisJJChMT0NBTF9QQVRIKS9CdW5kbGUgXAorCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKKwkkKExPQ0FMX1BBVEgpLy4uL2xpYi9CdW5kbGUvbGliLworCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyByZXZlcmIgd3JhcHBlcgoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKKworTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJid3JhcHBlcgorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnJldmVyYgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICAgbGliY3V0aWxzIFwKKworaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2Vsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL2xpYi9Db21tb24vbGliLyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi9saWIvUmV2ZXJiL2xpYi8gXAorCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZlZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMCwwICsxLDMwODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVuZGxlIgorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxFZmZlY3RCdW5kbGUuaD4KKworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBiYXNzIGJvb3N0CitleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZTsKKworI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyl7XAorICAgICAgICBpZiAoTHZtU3RhdHVzID09IExWTV9OVUxMQUREUkVTUyl7XAorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAorICAgICAgICB9XAorICAgICAgICBpZiAoTHZtU3RhdHVzID09IExWTV9BTElHTk1FTlRFUlJPUil7XAorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVk1fSU5WQUxJRE5VTVNBTVBMRVMpe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVk1fT1VUT0ZSQU5HRSl7XAorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAorICAgICAgICB9XAorICAgIH0KKworLy8gTmFtZXNwYWNlcworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHsKKworLyogbG9jYWwgZnVuY3Rpb25zICovCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiI2NvbmQpOyAgICAgIFwKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBGbGFnIHRvIGFsbG93IGEgb25lIHRpbWUgaW5pdCBvZiBnbG9iYWwgbWVtb3J5LCBvbmx5IGhhcHBlbnMgb24gZmlyc3QgY2FsbCBldmVyCitpbnQgTHZtSW5pdEZsYWcgPSBMVk1fRkFMU0U7CitpbnQgTHZtU2Vzc2lvbnNBY3RpdmUgPSAwOworU2Vzc2lvbkNvbnRleHQgR2xvYmFsU2Vzc2lvbk1lbW9yeVtMVk1fTUFYX1NFU1NJT05TXTsKK2ludCBTZXNzaW9uSW5kZXhbTFZNX01BWF9TRVNTSU9OU107CisKKy8vIE5YUCBTVyBCYXNzQm9vc3QgVVVJRAorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQmFzc0Jvb3N0RGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4MDYzNGYyMjAsIDB4ZGRkNCwgMHgxMWRiLCAweGEwZmMsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKKyAgICAgICAgezB4ODYzMWYzMDAsIDB4NzJlMiwgMHgxMWRmLCAweGI1N2UsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQKKyAgICAgICAgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCisgICAgICAgIEJBU1NfQk9PU1RfQ1VQX0xPQURfQVJNOUUsCisgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCisgICAgICAgICJEeW5hbWljIEJhc3MgQm9vc3QiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gTlhQIFNXIFZpcnR1YWxpemVyIFVVSUQKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ1ZpcnR1YWxpemVyRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4MzdjYzJjMDAsIDB4ZGRkZCwgMHgxMWRiLCAweDg1NzcsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORAorICAgICAgICB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKKyAgICAgICAgVklSVFVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCisgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCisgICAgICAgICJWaXJ0dWFsaXplciIsCisgICAgICAgICJOWFAgU29mdHdhcmUgTHRkLiIsCit9OworCisvLyBOWFAgU1cgRXF1YWxpemVyIFVVSUQKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0VxdWFsaXplckRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCisgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkIEVxIE5YUAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAorICAgICAgICBFUVVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCisgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCisgICAgICAgICJFcXVhbGl6ZXIiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gTlhQIFNXIFZvbHVtZSBVVUlECitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWb2x1bWVEZXNjcmlwdG9yID0geworICAgICAgICB7MHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LAorICAgICAgICB7MHgxMTkzNDFhMCwgMHg4NDY5LCAweDExZGYsIDB4ODFmOSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LCAvL3V1aWQgVk9MIE5YUAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAorICAgICAgICBWT0xVTUVfQ1VQX0xPQURfQVJNOUUsCisgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCisgICAgICAgICJWb2x1bWUiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcwordm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCAgICAgICh2b2lkKTsKK2ludCAgTHZtQnVuZGxlX2luaXQgICAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOworaW50ICBMdm1FZmZlY3RfZW5hYmxlICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7CitpbnQgIEx2bUVmZmVjdF9kaXNhYmxlICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKK3ZvaWQgTHZtRWZmZWN0X2ZyZWUgICAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOworaW50ICBFZmZlY3RfY29uZmlndXJlICAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKK2ludCAgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgQmFzc0Jvb3N0X2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKK2ludCAgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAqcFZhbHVlKTsKK2ludCAgRXF1YWxpemVyX3NldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKK2ludCAgVm9sdW1lX3NldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKK2ludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKKworLyogRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uICovCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKXsKKyAgICBMT0dWKCJcblx0RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIHN0YXJ0Iik7CisgICAgKnBOdW1FZmZlY3RzID0gNDsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyBjcmVhdGluZyAlZCBlZmZlY3RzIiwgKnBOdW1FZmZlY3RzKTsKKyAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyBlbmRcbiIpOworICAgIHJldHVybiAwOworfSAgICAgLyogZW5kIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpeworICAgIExPR1YoIlxuXHRFZmZlY3RRdWVyeUVmZmVjdCBzdGFydCIpOworICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgcHJvY2Vzc2luZyBpbmRleCAlZCIsIGluZGV4KTsKKworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RRdWVyeUVmZmVjdCB3YXMgcGFzc2VkIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKGluZGV4ID4gMyl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UXVlcnlFZmZlY3QgaW5kZXggb3V0IG9mIHJhbmdlICVkIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisgICAgaWYoaW5kZXggPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ0Jhc3NCb29zdERlc2NyaXB0b3IsICAgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICB9ZWxzZSBpZihpbmRleCA9PSBMVk1fVklSVFVBTElaRVIpeworICAgICAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdWaXJ0dWFsaXplckRlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfSBlbHNlIGlmKGluZGV4ID09IExWTV9FUVVBTElaRVIpeworICAgICAgICBMT0dWKCJcdEVmZmVjdFF1ZXJ5RWZmZWN0IHByb2Nlc3NpbmcgTFZNX0VRVUFMSVpFUiIpOworICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnRXF1YWxpemVyRGVzY3JpcHRvciwgICBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIH0gZWxzZSBpZihpbmRleCA9PSBMVk1fVk9MVU1FKXsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBwcm9jZXNzaW5nIExWTV9WT0xVTUUiKTsKKyAgICAgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ1ZvbHVtZURlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfQorICAgIExPR1YoIlx0RWZmZWN0UXVlcnlFZmZlY3QgZW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30gICAgIC8qIGVuZCBFZmZlY3RRdWVyeUVmZmVjdCAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAgICAgICAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2ludGVyZmFjZV90ICAqcEludGVyZmFjZSl7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2Vzc2lvbk5vOworICAgIGludCBpOworICAgIEVmZmVjdENvbnRleHQgKnBDb250ZXh0ID0gbmV3IEVmZmVjdENvbnRleHQ7CisKKyAgICBMT0dWKCJcblx0RWZmZWN0Q3JlYXRlIHN0YXJ0IHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOworCisgICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZihzZXNzaW9uSWQgPCAwKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUgc2Vzc2lvbklkIGlzIGxlc3MgdGhhbiAwIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmKEx2bUluaXRGbGFnID09IExWTV9GQUxTRSl7CisgICAgICAgIEx2bUluaXRGbGFnID0gTFZNX1RSVUU7CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gSW5pdGlhbGl6aW5nIGFsbCBnbG9iYWwgbWVtb3J5Iik7CisgICAgICAgIEx2bUdsb2JhbEJ1bmRsZV9pbml0KCk7CisgICAgfQorCisgICAgTE9HVigiXHRFZmZlY3RDcmVhdGU6IFRoZXJlIGFyZSAlZCBMVk0gc2Vzc2lvbnMgYWNpdmVcbiIsIEx2bVNlc3Npb25zQWN0aXZlKTsKKworICAgIC8vIEZpbmQgbmV4dCBhdmFpbGFibGUgc2Vzc2lvbk5vCisgICAgZm9yKGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspeworICAgICAgICBpZigoU2Vzc2lvbkluZGV4W2ldID09IC0xKXx8KFNlc3Npb25JbmRleFtpXSA9PSBzZXNzaW9uSWQpKXsKKyAgICAgICAgICAgIHNlc3Npb25ObyAgICAgICA9IGk7CisgICAgICAgICAgICBTZXNzaW9uSW5kZXhbaV0gPSBzZXNzaW9uSWQ7CisgICAgICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZTogQWxsb2NhdGluZyBTZXNzaW9uTm8gJWQgZm9yIFNlc3Npb25JZCAlZFxuIiwgc2Vzc2lvbk5vLHNlc3Npb25JZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGk9PUxWTV9NQVhfU0VTU0lPTlMpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IENhbm5vdCBmaW5kIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgY3VycmVudCBzZXNzaW9uIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBjcmVhdGUgaW4gdGhpcyBzZXNzaW9uCisgICAgaWYoR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBUaGlzIGlzIHRoZSBmaXJzdCBlZmZlY3QgaW4gY3VycmVudCBzZXNzaW9uSWQgJWQgc2Vzc2lvbk5vICVkIiwKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25Obyk7CisKKyAgICAgICAgTHZtU2Vzc2lvbnNBY3RpdmUrKzsKKworICAgICAgICBpZihMdm1TZXNzaW9uc0FjdGl2ZSA+PSBMVk1fTUFYX1NFU1NJT05TKXsKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9uIGlzIGdyZWF0ZXIgdGhhbiBMVk1fTUFYX1NFU1NJT05TICglZCkiLAorICAgICAgICAgICAgICAgICAgTFZNX01BWF9TRVNTSU9OUyk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID0gTFZNX1RSVUU7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQgICAgICAgID0gbmV3IEJ1bmRsZWRFZmZlY3RDb250ZXh0OworCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0OworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gICAgICAgICAgICAgICAgPSBzZXNzaW9uTm87CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCAgICAgICAgICAgICAgICA9IHNlc3Npb25JZDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgICAgICAgICAgICAgID0gTFZNX1RSVUU7CisKKyAgICAgICAgI2lmZGVmIExWTV9QQ00KKworICAgICAgICBjaGFyIGZpbGVOYW1lWzI1Nl07CisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCAyNTYsICIvZGF0YS90bXAvYnVuZGxlXyVwX3BjbV9pbi5wY20iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBmb3BlbihmaWxlTmFtZSwgInciKTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR1YoImNhbm5vdCBvcGVuICVzIiwgZmlsZU5hbWUpOworICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCAyNTYsICIvZGF0YS90bXAvYnVuZGxlXyVwX3BjbV9vdXQucGNtIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0ciA9IGZvcGVuKGZpbGVOYW1lLCAidyIpOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR1YoImNhbm5vdCBvcGVuICVzIiwgZmlsZU5hbWUpOworICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOworICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUgc2V0IHRvIHRoZSBnZXQKKyAgICAgICAgICogYmVjYXVzZSB3ZSBtYXAgdGhlIG9yaWdpbmFsIHN0cmVuZ3RoIHJhbmdlIG9mIDA6MTAwMCB0byAxOjE1LCBhbmQgdGhpcyB3aWxsIGF2b2lkCisgICAgICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgICAgICAgKi8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ICAgICAgICAgICAgICAgID0gUFJFU0VUX0NVU1RPTTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCAgICAgICAgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgICAgICAgICAgICA9IDA7CisKKyAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgICAgICAgIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0KTsKKworICAgICAgICBpZiAocmV0IDwgMCl7CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIEJ1bmRsZSBpbml0IGZhaWxlZCIpOworICAgICAgICAgICAgZGVsZXRlIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQ7CisgICAgICAgICAgICBkZWxldGUgcENvbnRleHQ7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQXNzaWduaW5nIG1lbW9yeSBmb3IgcHJldmlvdXNseSBjcmVhdGVkIGVmZmVjdCBvbiBzZXNzaW9uTm8gJWQiLAorICAgICAgICAgICAgICAgIHNlc3Npb25Obyk7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPQorICAgICAgICAgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQ7CisgICAgfQorICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gcEJ1bmRsZWRDb250ZXh0IGlzICVwIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7CisKKyAgICAvLyBDcmVhdGUgZWFjaCBFZmZlY3QKKyAgICBpZiAobWVtY21wKHV1aWQsICZnQmFzc0Jvb3N0RGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgICAgICAvLyBDcmVhdGUgQmFzcyBCb29zdAorICAgICAgICBMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVmZmVjdCB0byBiZSBjcmVhdGVkIGlzIExWTV9CQVNTX0JPT1NUIik7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9UUlVFOworCisgICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX0JBU1NfQk9PU1Q7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWaXJ0dWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKXsKKyAgICAgICAgLy8gQ3JlYXRlIFZpcnR1YWxpemVyCisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRWZmZWN0IHRvIGJlIGNyZWF0ZWQgaXMgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ9TFZNX1RSVUU7CisKKyAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fVklSVFVBTElaRVI7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgICAgIC8vIENyZWF0ZSBFcXVhbGl6ZXIKKyAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iRXF1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CisKKyAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fRVFVQUxJWkVSOworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnVm9sdW1lRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgICAgICAvLyBDcmVhdGUgVm9sdW1lCisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRWZmZWN0IHRvIGJlIGNyZWF0ZWQgaXMgTFZNX1ZPTFVNRSIpOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYlZvbHVtZUluc3RhbnRpYXRlZCA9IExWTV9UUlVFOworCisgICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX1ZPTFVNRTsKKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBpbnZhbGlkIFVVSUQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZC4uXG5cbiIpOworICAgIHJldHVybiAwOworfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSl7CisgICAgTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBpbnRlcmZhY2UpOworICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopaW50ZXJmYWNlOworCisgICAgTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgaW50ZXJmYWNlOiAlcCwgY29udGV4dCAlcCIsIGludGVyZmFjZSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIENsZWFyIHRoZSBpbnN0YW50aWF0ZWQgZmxhZyBmb3IgdGhlIGVmZmVjdAorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fQkFTU19CT09TVCBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKKyAgICB9IGVsc2UgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fVklSVFVBTElaRVIgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYlZpcnR1YWxpemVySW5zdGFudGlhdGVkCisgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICB9IGVsc2UgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2UgTFZNX0VRVUFMSVpFUiBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iRXF1YWxpemVySW5zdGFudGlhdGVkID1MVk1fRkFMU0U7CisgICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9WT0xVTUUgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob10uYlZvbHVtZUluc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgOiBVbnN1cHBvcnRlZCBlZmZlY3RcblxuXG5cblxuXG5cbiIpOworICAgIH0KKworICAgIC8vIGlmIGFsbCBlZmZlY3RzIGFyZSBubyBsb25nZXIgaW5zdGFudGlhZWQgZnJlZSB0aGUgbHZtIG1lbW9yeSBhbmQgZGVsZXRlIEJ1bmRsZWRFZmZlY3RDb250ZXh0CisgICAgaWYoKEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iQmFzc0luc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpJiYKKyAgICAoR2xvYmFsU2Vzc2lvbk1lbW9yeVtwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm9dLmJWb2x1bWVJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSYmCisgICAgKEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSYmCisgICAgKEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ9PUxWTV9GQUxTRSkpCisgICAgeworICAgICAgICAjaWZkZWYgTFZNX1BDTQorICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgIT0gTlVMTCkgeworICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZjbG9zZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBMdm1TZXNzaW9uc0FjdGl2ZS0tOworICAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IFRoZXJlIGFyZSAlZCBMVk0gc2Vzc2lvbnMgcmVtYWluaW5nXG4iLCBMdm1TZXNzaW9uc0FjdGl2ZSk7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIFNlc3Npb25JbmRleAorICAgICAgICBmb3IoaW50IGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspeworICAgICAgICAgICAgaWYoU2Vzc2lvbkluZGV4W2ldID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCl7CisgICAgICAgICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gLTE7CisgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBDbGVhcmluZyBTZXNzaW9uSW5kZXggU2Vzc2lvbk5vICVkIGZvciBTZXNzaW9uSWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBBbGwgZWZmZWN0cyBhcmUgbm8gbG9uZ2VyIGluc3RhbnRpYXRlZFxuIik7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID1MVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQgPSBMVk1fTlVMTDsKKyAgICAgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlOiBGcmVlaW5nIExWTSBCdW5kbGUgbWVtb3J5XG4iKTsKKyAgICAgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworICAgICAgICBMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IERlbGV0aW5nIExWTSBCdW5kbGUgY29udGV4dCAlcFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7CisgICAgICAgIGRlbGV0ZSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0OworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CisgICAgfQorICAgIC8vIGZyZWUgdGhlIGVmZmVjdCBjb250ZXh0IGZvciBjdXJyZW50IGVmZmVjdAorICAgIGRlbGV0ZSBwQ29udGV4dDsKKworICAgIExPR1YoIlx0RWZmZWN0UmVsZWFzZSBlbmRcbiIpOworICAgIHJldHVybiAwOworCit9IC8qIGVuZCBFZmZlY3RSZWxlYXNlICovCisKK3ZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQoKXsKKyAgICBMT0dWKCJcdEx2bUdsb2JhbEJ1bmRsZV9pbml0IHN0YXJ0Iik7CisgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkICAgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZvbHVtZUluc3RhbnRpYXRlZCAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgICA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iQmFzc0luc3RhbnRpYXRlZCAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZpcnR1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLnBCdW5kbGVkQ29udGV4dCAgICAgICAgICA9IExWTV9OVUxMOworCisgICAgICAgIFNlc3Npb25JbmRleFtpXSA9IC0xOworICAgIH0KKyAgICByZXR1cm47Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUJ1bmRsZV9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNyZWF0ZXMgaW5zdGFuY2UKKy8vIHdpdGggYWxsIGVmZmVjdHMgZGlzYWJsZWQuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBMdm1CdW5kbGVfaW5pdChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgaW50IHN0YXR1czsKKworICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKKworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICAgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlICAgICAgICAgICAgICAgICA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSAgICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKKworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICAgICAgICAgIi0+IENhbGxpbmcgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworCisgICAgICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKKworICAgICAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICAgIH0KKworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgIEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgIEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgICAgICAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgICBIZWFkcm9vbVBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgICBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbVRhYjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgICAgSW5zdFBhcmFtcy5CdWZmZXJNb2RlICAgICAgID0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTOworICAgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplICAgICA9IE1BWF9DQUxMX1NJWkU7CisgICAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzICAgID0gTUFYX05VTV9CQU5EUzsKKyAgICBJbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCAgICAgPSBMVk1fUFNBX09OOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtQnVuZGxlX2luaXQiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5ICovCisgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXVcbiIsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSApOworICAgICAgICAgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlbGQgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgb25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGZhaWxlZCB0byBhbGxvY2F0ZSwgZnJlZSB0aGUgcmVnaW9ucyB0aGF0IHdlcmUKKyAgICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAgICovCisgICAgaWYoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpeworICAgICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspeworICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgICAvKiBJbml0aWFsaXNlICovCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CisKKyAgICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0IikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSAgICAgICAgICA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy5TYW1wbGVSYXRlICAgICAgICAgICAgID0gTFZNX0ZTXzQ0MTAwOworICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAgICAgID0gTFZNX1NURVJFTzsKKyAgICBwYXJhbXMuU3BlYWtlclR5cGUgICAgICAgICAgICA9IExWTV9IRUFEUEhPTkVTOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKworICAgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgICA9IExWTV9NT0RFX09GRjsKKyAgICBwYXJhbXMuVmlydHVhbGl6ZXJUeXBlICAgICAgICAgICAgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgIHBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsICAgICA9IDEwMDsKKyAgICBwYXJhbXMuQ1NfRWZmZWN0TGV2ZWwgICAgICAgICAgICAgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgICA9IExWTV9FUU5CX09GRjsKKyAgICBwYXJhbXMuRVFOQl9OQmFuZHMgICAgICAgICAgICA9IEZJVkVCQU5EX05VTUJBTkRTOworICAgIHBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiAgID0gJkJhbmREZWZzWzBdOworCisgICAgZm9yIChpbnQgaT0wOyBpPEZJVkVCQU5EX05VTUJBTkRTOyBpKyspCisgICAgeworICAgICAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5RRmFjdG9yICAgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5HYWluICAgICAgPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgICAgfQorCisgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5WQ19FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuVkNfQmFsYW5jZSAgICAgICAgICAgICA9IDA7CisKKyAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5URV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX1RFX09GRjsKKyAgICBwYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICAgICAgICA9IDA7CisKKyAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgICAgPSBMVk1fUFNBX09GRjsKKyAgICBwYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICAgICA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKKworICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX0JFX09GRjsKKyAgICBwYXJhbXMuQkVfRWZmZWN0TGV2ZWwgICAgICAgICA9IDA7CisgICAgcGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgICAgICAgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisgICAgcGFyYW1zLkJFX0hQRiAgICAgICAgICAgICAgICAgPSBMVk1fQkVfSFBGX09OOworCisgICAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5QU0FfRW5hYmxlICAgICAgICAgICAgID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlICAgICAgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKworICAgIC8qIFRFIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy5URV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX1RFX09GRjsKKyAgICBwYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICAgICAgICA9IDA7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ICAgICAgICAgID0gMjA7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggICAgICAgICA9IDQ5OTk7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyAgICAgICAgICA9IDUwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggICAgICAgICA9IDI0MDAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gICAgPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICAgIEhlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047CisgICAgSGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgICAgICAgICA9IDI7CisKKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSGVhZHJvb21QYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgICAgTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBFbmQiKTsKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfcHJvY2VzcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSBMVk0gQnVuZGxlIGVmZmVjdHMKKy8vCisvLyBJbnB1dHM6CisvLyAgcEluOiAgICAgICAgcG9pbnRlciB0byBzdGVyZW8gMTYgYml0IGlucHV0IGRhdGEKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKKy8vICBmcmFtZUNvdW50OiBGcmFtZXMgdG8gcHJvY2VzcworLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKKy8vCisvLyAgT3V0cHV0czoKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX3Byb2Nlc3MoTFZNX0lOVDE2ICAgICAgICAqcEluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXQsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgICAgKnBDb250ZXh0KXsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRUbXA7CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpeworICAgICAgICBwT3V0VG1wID0gcE91dDsKKyAgICB9ZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgcE91dFRtcCA9IChMVk1fSU5UMTYgKiltYWxsb2MoZnJhbWVDb3VudCAqIHNpemVvZihMVk1fSU5UMTYpICogMik7CisgICAgICAgIGlmKHBPdXRUbXAgPT0gTlVMTCl7CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKyAgICAgICAgICAgICJFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFIG1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfWVsc2V7CisgICAgICAgIExPR1YoIkxWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIGludmFsaWQgYWNjZXNzIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCsrOworICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPT0gMTAwKQorICAgIHsKKyAgICAgICAgLy9MT0dWKCJcdEJCOiAlZCBWSVJUOiAlZCBFUTogJWQsIHNlc3Npb24gKCVkKSwgY29udGV4dCBpcyAlcFxuIiwKKyAgICAgICAgLy9BY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSwKKyAgICAgICAgLy9BY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlLCBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlLAorICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAwOworICAgIH0KKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKHBJbiwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSoyLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CisgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKKyAgICAjZW5kaWYKKworICAgIC8vTE9HVigiQ2FsbGluZyBMVk1fUHJvY2VzcyIpOworCisgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0VG1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZG8gVGltZSAqLworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9Qcm9jZXNzIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBmd3JpdGUocE91dFRtcCwgZnJhbWVDb3VudCpzaXplb2YoTFZNX0lOVDE2KSoyLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOworICAgICNlbmRpZgorCisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxmcmFtZUNvdW50KjI7IGkrKyl7CisgICAgICAgICAgICBwT3V0W2ldICs9ICBwT3V0VG1wW2ldOworICAgICAgICB9CisgICAgICAgIGZyZWUocE91dFRtcCk7CisgICAgfQorICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZW5hYmxlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRW5hYmxlIHRoZSBlZmZlY3QgaW4gdGhlIGJ1bmRsZQorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtRWZmZWN0X2VuYWJsZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgc3RhcnQiKTsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9lbmFibGUiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgLy9MT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fQkFTU19CT09TVCIpOworICAgICAgICBBY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9CRV9PTjsKKyAgICB9CisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSA6IEVuYWJsaW5nIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PTjsKKyAgICB9CisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgOiBFbmFibGluZyBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT047CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICAgICAgTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX1ZPTFVNRSIpOworICAgIH0KKworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIGVuZCIpOworICAgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9kaXNhYmxlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRGlzYWJsZSB0aGUgZWZmZWN0IGluIHRoZSBidW5kbGUKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEx2bUVmZmVjdF9kaXNhYmxlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKyAgICAvL0xPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgc3RhcnQiKTsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZGlzYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAvL0xPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgeworICAgICAgICBMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIDogRGlzYWJsaW5nIExWTV9CQVNTX0JPT1NUIik7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX0JFX09GRjsKKyAgICB9CisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBFbmFibGluZyBMVk1fVklSVFVBTElaRVIiKTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT0ZGOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBFbmFibGluZyBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT0ZGOworICAgIH0KKyAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBFbmFibGluZyBMVk1fVk9MVU1FIik7CisgICAgfQorCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZGlzYWJsZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgZW5kIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTHZtRWZmZWN0X2ZyZWUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgTHZtRWZmZWN0X2ZyZWUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpeworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIHBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7CisKKyAgICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspeworICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApeworICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpeworICAgICAgICAgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKworICAgICAgICAgICAgICAgIExPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEx2bUVmZmVjdF9mcmVlIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgJWxkIGJ5dGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ICAgIC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdF9jb25maWd1cmUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBTZXQgaW5wdXQgYW5kIG91dHB1dCBhdWRpbyBjb25maWd1cmF0aW9uLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwQ29uZmlnOiAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgaG9sZGluZyBpbnB1dCBhbmQgb3V0cHV0CisvLyAgICAgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBFZmZlY3RfY29uZmlndXJlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpeworICAgIExWTV9Gc19lbiAgIFNhbXBsZVJhdGU7CisgICAgLy9MT0dWKCJcdEVmZmVjdF9jb25maWd1cmUgc3RhcnQiKTsKKworICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKKyAgICBDSEVDS19BUkcocENvbmZpZyAhPSBOVUxMKTsKKworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQorICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1MxNSk7CisKKyAgICBtZW1jcHkoJnBDb250ZXh0LT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKworICAgIHN3aXRjaCAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKSB7CisgICAgY2FzZSA4MDAwOgorICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzgwMDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigiXHRFZmZlY3RfQ29uZmlndXJlIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSl7CisKKyAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOworICAgICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsKKworICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb25maWd1cmUgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFZmZlY3RfY29uZmlndXJlIikKKyAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKworICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVmZmVjdF9jb25maWd1cmUiKQorICAgICAgICBMT0dWKCJcdEVmZmVjdF9jb25maWd1cmUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOworCisgICAgfWVsc2V7CisgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29uZmlndXJlIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOworICAgIH0KKworICAgIC8vTE9HVigiXHRFZmZlY3RfY29uZmlndXJlIEVuZC4uLi4iKTsKKyAgICByZXR1cm4gMDsKK30gICAvKiBlbmQgRWZmZWN0X2NvbmZpZ3VyZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc3NHZXRTdHJlbmd0aCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBnZXQgdGhlIGVmZmVjdCBzdHJlbmd0aCBjdXJyZW50bHkgYmVpbmcgdXNlZCwgd2hhdCBpcyBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgc3RyZW5naCB0aGF0IHdhcworLy8gcHJldmlvdXNseSB1c2VkIGluIHRoZSBzZXQsIHRoaXMgaXMgYmVjYXVzZSB0aGUgYXBwIHVzZXMgYSBzdHJlbmd0aCBpbiB0aGUgcmFuZ2UgMC0xMDAwIHdoaWxlCisvLyB0aGUgYmFzc2Jvb3N0IHVzZXMgMS0xNSwgc28gdG8gYXZvaWQgYSBxdWFudGlzYXRpb24gdGhlIG9yaWdpbmFsIHNldCB2YWx1ZSBpcyB1c2VkLiBIb3dldmVyIHRoZQorLy8gYWN0dWFsIHVzZWQgdmFsdWUgaXMgY2hlY2tlZCB0byBtYWtlIHN1cmUgaXQgY29ycmVzcG9uZHMgdG8gdGhlIG9uZSBiZWluZyByZXR1cm5lZAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgQmFzc0dldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKyAgICAvL0xPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTAwMCkgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJCYXNzR2V0U3RyZW5ndGgiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0QmFzc0dldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cmVuZ3RoIHJldHVybmVkIG1hdGNoZXMgdGhlIHN0cmVuZ3RoIHRoYXQgd2FzIHNldCBlYXJsaWVyICovCisgICAgaWYoQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICE9CisgICAgICAgKExWTV9JTlQxNikoKDE1KnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKS8xMDAwKSl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0dldFN0cmVuZ3RoIG1vZHVsZSBzdHJlbmd0aCBkb2VzIG5vdCBtYXRjaCBzYXZlZFN0cmVuZ3RoICVkICVkXG4iLAorICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOworICAgIC8vTE9HVigiXHRCYXNzR2V0U3RyZW5ndGgoKSAoc2F2ZWQpICAtPiAlZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgKTsKKyAgICByZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQ7Cit9ICAgIC8qIGVuZCBCYXNzR2V0U3RyZW5ndGggKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXNzU2V0U3RyZW5ndGgoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIHN0cmVuZ3RoIHRvIHRoZSBCYXNzQm9zc3QuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIGZyb20gdGhlIHJhbmdlIDAtMTAwMCB0byAxLTE1CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBCYXNzU2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IHN0cmVuZ3RoKXsKKyAgICAvL0xPR1YoIlx0QmFzc1NldFN0cmVuZ3RoKCVkKSIsIHN0cmVuZ3RoKTsKKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gKGludClzdHJlbmd0aDsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJCYXNzU2V0U3RyZW5ndGgiKQorICAgIC8vTE9HVigiXHRCYXNzU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICAgID0gKExWTV9JTlQxNikoKDE1KnN0cmVuZ3RoKS8xMDAwKTsKKyAgICBBY3RpdmVQYXJhbXMuQkVfQ2VudHJlRnJlcSAgICAgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisKKyAgICAvL0xPR1YoIlx0QmFzc1NldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc1NldFN0cmVuZ3RoIikKKyAgICAvL0xPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworfSAgICAvKiBlbmQgQmFzc1NldFN0cmVuZ3RoICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBnZXQgdGhlIGVmZmVjdCBzdHJlbmd0aCBjdXJyZW50bHkgYmVpbmcgdXNlZCwgd2hhdCBpcyBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgc3RyZW5naCB0aGF0IHdhcworLy8gcHJldmlvdXNseSB1c2VkIGluIHRoZSBzZXQsIHRoaXMgaXMgYmVjYXVzZSB0aGUgYXBwIHVzZXMgYSBzdHJlbmd0aCBpbiB0aGUgcmFuZ2UgMC0xMDAwIHdoaWxlCisvLyB0aGUgVmlydHVhbGl6ZXIgdXNlcyAxLTEwMCwgc28gdG8gYXZvaWQgYSBxdWFudGlzYXRpb24gdGhlIG9yaWdpbmFsIHNldCB2YWx1ZSBpcyB1c2VkLkhvd2V2ZXIgdGhlCisvLyBhY3R1YWwgdXNlZCB2YWx1ZSBpcyBjaGVja2VkIHRvIG1ha2Ugc3VyZSBpdCBjb3JyZXNwb25kcyB0byB0aGUgb25lIGJlaW5nIHJldHVybmVkCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit1aW50MzJfdCBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKKyAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCAoMC0xMDAwKSAtPiAlZFxuIixwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCk7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWaXJ0dWFsaXplckdldFN0cmVuZ3RoIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoKCkgKDAtMTAwKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCoxMCk7CisgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkOworfSAgICAvKiBlbmQgZ2V0U3RyZW5ndGggKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEFwcGx5IHRoZSBzdHJlbmd0aCB0byB0aGUgVmlydHVhbGl6ZXIuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIGZyb20gdGhlIHJhbmdlIDAtMTAwMCB0byAxLTE1CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7CisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoJWQpIiwgc3RyZW5ndGgpOworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gKGludClzdHJlbmd0aDsKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyU2V0U3RyZW5ndGgiKQorICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIC8qIFZpcnR1YWxpemVyIHBhcmFtZXRlcnMgKi8KKyAgICBBY3RpdmVQYXJhbXMuQ1NfRWZmZWN0TGV2ZWwgICAgICAgICAgICAgPSAoaW50KSgoc3RyZW5ndGgqMzI3NjcpLzEwMDApOworCisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoKSAoMC0xMDAwKSAgIC0+ICVkXG4iLCBzdHJlbmd0aCApOworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtIDEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsICk7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCIpCisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuXG4iKTsKK30gICAgLyogZW5kIHNldFN0cmVuZ3RoICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyR2V0QmFuZExldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogUmV0cmlldmUgdGhlIGdhaW4gY3VycmVudGx5IGJlaW5nIHVzZWQgZm9yIHRoZSBiYW5kIHBhc3NlZCBpbgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQzMl90IEVxdWFsaXplckdldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kKXsKKworICAgIGludDMyX3QgR2FpbiA9MDsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAqQmFuZERlZjsKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRXF1YWxpemVyR2V0QmFuZExldmVsIikKKworICAgIEJhbmREZWYgPSBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247CisgICAgR2FpbiAgICA9IChpbnQzMl90KUJhbmREZWZbYmFuZF0uR2FpbioxMDA7ICAgIC8vIENvbnZlcnQgdG8gbWlsbGliZWxzCisKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyR2V0QmFuZExldmVsIC0+ICVkXG4iLCBHYWluICk7CisgICAgLy9MT0dWKCJcdEVxdWFsaXplckdldEJhbmRMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgcmV0dXJuIEdhaW47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyU2V0QmFuZExldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vICBTZXRzIGdhaW4gdmFsdWUgZm9yIHRoZSBnaXZlbiBiYW5kLgorLy8KKy8vIElucHV0czoKKy8vICBiYW5kOiAgICAgICBiYW5kIG51bWJlcgorLy8gIEdhaW46ICAgICAgIEdhaW4gdG8gYmUgYXBwbGllZCBpbiBtaWxsaWJlbHMKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2b2lkIEVxdWFsaXplclNldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50IGJhbmQsIHNob3J0IEdhaW4peworICAgIGludCBnYWluUm91bmRlZDsKKyAgICBpZihHYWluID4gMCl7CisgICAgICAgIGdhaW5Sb3VuZGVkID0gKGludCkoKEdhaW4rNTApLzEwMCk7CisgICAgfWVsc2V7CisgICAgICAgIGdhaW5Sb3VuZGVkID0gKGludCkoKEdhaW4tNTApLzEwMCk7CisgICAgfQorICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwoJWQpLT4oJWQpIiwgR2FpbiwgZ2FpblJvdW5kZWQpOworCisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKkJhbmREZWY7CisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclNldEJhbmRMZXZlbCIpCisgICAgLy9MT0dWKCJcdEVxdWFsaXplclNldEJhbmRMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdEVxdWFsaXplclNldEJhbmRMZXZlbCBqdXN0IEdvdCAtPiAlZFxuIixBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7CisKKyAgICAvKiBTZXQgbG9jYWwgRVEgcGFyYW1ldGVycyAqLworICAgIEJhbmREZWYgPSBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247CisgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4gPSBnYWluUm91bmRlZDsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwiKQorICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwganVzdCBTZXQgLT4gJWRcbiIsQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgICByZXR1cm47Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IFJldHJpZXZlIHRoZSBmcmVxdWVuY3kgYmVpbmcgdXNlZCBmb3IgdGhlIGJhbmQgcGFzc2VkIGluCisvLworLy8gSW5wdXRzOgorLy8gIGJhbmQ6ICAgICAgIGJhbmQgbnVtYmVyCisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludDMyX3QgRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5KEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGJhbmQpeworICAgIGludDMyX3QgRnJlcXVlbmN5ID0wOworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKkJhbmREZWY7CisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSIpCisKKyAgICBCYW5kRGVmICAgPSBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247CisgICAgRnJlcXVlbmN5ID0gKGludDMyX3QpQmFuZERlZltiYW5kXS5GcmVxdWVuY3kqMTAwMDsgICAgIC8vIENvbnZlcnQgdG8gbWlsbGliZWxzCisKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IC0+ICVkXG4iLCBGcmVxdWVuY3kgKTsKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICByZXR1cm4gRnJlcXVlbmN5OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gR2V0cyBsb3dlciBhbmQgdXBwZXIgYm91bmRhcmllcyBvZiBhIGJhbmQuCisvLyBGb3IgdGhlIGhpZ2ggc2hlbGYsIHRoZSBsb3cgYm91bmQgaXMgdGhlIGJhbmQgZnJlcXVlbmN5IGFuZCB0aGUgaGlnaAorLy8gYm91bmQgaXMgTnlxdWlzdC4KKy8vIEZvciB0aGUgcGVha2luZyBmaWx0ZXJzLCB0aGV5IGFyZSB0aGUgZ2FpbltkQl0vMiBwb2ludHMuCisvLworLy8gSW5wdXRzOgorLy8gIGJhbmQ6ICAgICAgIGJhbmQgbnVtYmVyCisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vICBwTG93OiAgICAgICBsb3dlciBiYW5kIHJhbmdlCisvLyAgcExvdzogICAgICAgdXBwZXIgYmFuZCByYW5nZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQzMl90IEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDMyX3QgYmFuZCwgdWludDMyX3QgKnBMb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBIaSl7CisgICAgKnBMb3cgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzBdOworICAgICpwSGkgID0gYmFuZEZyZXFSYW5nZVtiYW5kXVsxXTsKKyAgICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRCYW5kKAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIFJldHVybnMgdGhlIGJhbmQgd2l0aCB0aGUgbWF4aW11bSBpbmZsdWVuY2Ugb24gYSBnaXZlbiBmcmVxdWVuY3kuCisvLyBSZXN1bHQgaXMgdW5hZmZlY3RlZCBieSB3aGV0aGVyIEVRIGlzIGVuYWJsZWQgb3Igbm90LCBvciBieSB3aGV0aGVyCisvLyBjaGFuZ2VzIGhhdmUgYmVlbiBjb21taXR0ZWQgb3Igbm90LgorLy8KKy8vIElucHV0czoKKy8vICB0YXJnZXRGcmVxICAgVGhlIHRhcmdldCBmcmVxdWVuY3ksIGluIG1pbGxpaGVydHouCisvLyAgcENvbnRleHQ6ICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQorLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKKyAgICBpbnQgYmFuZCA9IDA7CisKKyAgICBpZih0YXJnZXRGcmVxIDwgYmFuZEZyZXFSYW5nZVswXVswXSl7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH1lbHNlIGlmKHRhcmdldEZyZXEgPT0gYmFuZEZyZXFSYW5nZVswXVswXSl7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IoaW50IGk9MDsgaTxGSVZFQkFORF9OVU1CQU5EUztpKyspeworICAgICAgICBpZigodGFyZ2V0RnJlcSA+IGJhbmRGcmVxUmFuZ2VbaV1bMF0pJiYodGFyZ2V0RnJlcSA8PSBiYW5kRnJlcVJhbmdlW2ldWzFdKSl7CisgICAgICAgICAgICBiYW5kID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmFuZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJHZXRQcmVzZXQoCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gR2V0cyB0aGUgY3VycmVudGx5IHNldCBwcmVzZXQgSUQuCisvLyBXaWxsIHJldHVybiBQUkVTRVRfQ1VTVE9NIGluIGNhc2UgdGhlIEVRIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIG1vZGlmaWVkCisvLyBtYW51YWxseSBzaW5jZSBhIHByZXNldCB3YXMgc2V0LgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQzMl90IEVxdWFsaXplckdldFByZXNldChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CisgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJTZXRQcmVzZXQoCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLworLy8gU2V0cyB0aGUgY3VycmVudCBwcmVzZXQgYnkgSUQuCisvLyBBbGwgdGhlIGJhbmQgcGFyYW1ldGVycyB3aWxsIGJlIG92ZXJyaWRkZW4uCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgRXF1YWxpemVyU2V0UHJlc2V0KEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQgcHJlc2V0KXsKKworICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQoJWQpIiwgcHJlc2V0KTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBwcmVzZXQ7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVxdWFsaXplclNldFByZXNldCIpCisgICAgLy9MT0dWKCJcdEVxdWFsaXplclNldFByZXNldCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgICAvL0FjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKyAgICBmb3IgKGludCBpPTA7IGk8RklWRUJBTkRfTlVNQkFORFM7IGkrKykKKyAgICB7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4KKyAgICAgICAgPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaSArIHByZXNldCAqIEZJVkVCQU5EX05VTUJBTkRTXTsKKyAgICB9CisgICAgLyogQWN0aXZhdGUgdGhlIG5ldyBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRXF1YWxpemVyU2V0UHJlc2V0IikKKworICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgcmV0dXJuOworfQorCitpbnQzMl90IEVxdWFsaXplckdldE51bVByZXNldHMoKXsKKyAgICByZXR1cm4gc2l6ZW9mKGdFcXVhbGl6ZXJQcmVzZXRzKSAvIHNpemVvZihQcmVzZXRDb25maWcpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplckdldFByZXNldE5hbWUoCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYSBwcmVzZXQgSUQuIFdpbGwgcmV0dXJuICJDdXN0b20iIGlmCisvLyBQUkVTRVRfQ1VTVE9NIGlzIHBhc3NlZC4KKy8vCisvLyBJbnB1dHM6CisvLyBwcmVzZXQgICAgICAgVGhlIHByZXNldCBJRC4gTXVzdCBiZSBsZXNzIHRoYW4gbnVtYmVyIG9mIHByZXNldHMuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjb25zdCBjaGFyICogRXF1YWxpemVyR2V0UHJlc2V0TmFtZShpbnQzMl90IHByZXNldCl7CisgICAgLy9MT0dWKCJcdEVxdWFsaXplckdldFByZXNldE5hbWUgc3RhcnQoJWQpIiwgcHJlc2V0KTsKKyAgICBpZiAocHJlc2V0ID09IFBSRVNFVF9DVVNUT00pIHsKKyAgICAgICAgcmV0dXJuICJDdXN0b20iOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBnRXF1YWxpemVyUHJlc2V0c1twcmVzZXRdLm5hbWU7CisgICAgfQorICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIGVuZCglZCkiLCBwcmVzZXQpOworICAgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZVNldFZvbHVtZUxldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpeworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLy9MT0dWKCJcdFZvbHVtZVNldFZvbHVtZUxldmVsIExldmVsIHRvIGJlIHNldCBpcyAlZCAlZFxuIiwgbGV2ZWwsIChMVk1fSU5UMTYpKGxldmVsLzEwMCkpOworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0Vm9sdW1lTGV2ZWwiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgLy9MT0dWKCJcdFZvbHVtZVNldFZvbHVtZUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIGdvdDogJWRcbiIsCisgICAgLy9BY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwpOworCisgICAgLyogVm9sdW1lIHBhcmFtZXRlcnMgKi8KKyAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgID0gKExWTV9JTlQxNikobGV2ZWwvMTAwKTsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwoKSAoLTk2ZEIgLT4gMGRCKSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRWb2x1bWVMZXZlbCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRWb2x1bWVMZXZlbCBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0Vm9sdW1lTGV2ZWwiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwganVzdCBzZXQgKC05NmRCIC0+IDBkQikgICAtPiAlZFxuIixBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgKTsKKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9PSBMVk1fVFJVRSl7CisgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKKyAgICAgICAgTE9HVigiXHRMVk1fVk9MVU1FOiBEaXNhYmxpbmcgU21vb3RoaW5nIGZvciBmaXJzdCB2b2x1bWUgY2hhbmdlIHRvIHJlbW92ZSBzcGlrZXMvY2xpY2tzIik7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZpcnN0Vm9sdW1lID0gTFZNX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gMDsKK30gICAgLyogZW5kIHNldFZvbHVtZUxldmVsICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZvbHVtZUdldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90ICpsZXZlbCl7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0Vm9sdW1lTGV2ZWwgc3RhcnQiKTsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVHZXRWb2x1bWVMZXZlbCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRWb2x1bWVMZXZlbCgpICgtOTZkQiAtPiAwZEIpIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgKTsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0Vm9sdW1lTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgKmxldmVsID0gQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsKjEwMDsgICAgIC8vIENvbnZlcnQgZEIgdG8gbWlsbGliZWxzCisgICAgLy9MT0dWKCJcdFZvbHVtZUdldFZvbHVtZUxldmVsIGVuZCIpOworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgVm9sdW1lR2V0Vm9sdW1lTGV2ZWwgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVTZXRNdXRlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgbXV0ZTogICAgICAgZW5hYmxlL2Rpc2FibGUgZmxhZworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQzMl90IFZvbHVtZVNldE11dGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IG11dGUpeworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRNdXRlIHN0YXJ0KCVkKSIsIG11dGUpOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gbXV0ZTsKKworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0TXV0ZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRNdXRlIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0TXV0ZSB0byAlZCwgbGV2ZWwgd2FzICVkXG4iLCBtdXRlLCBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgKTsKKworICAgIC8qIFNldCBhcHByb3ByaWF0ZSB2b2x1bWUgbGV2ZWwgKi8KKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsOworICAgICAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgICAgICAgICAgID0gLTk2OworICAgIH1lbHNleworICAgICAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZDsKKyAgICB9CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0TXV0ZSIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRNdXRlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRWb2x1bWVTZXRNdXRlIGVuZCIpOworICAgIHJldHVybiAwOworfSAgICAvKiBlbmQgc2V0TXV0ZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZUdldE11dGUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXJwdXRzOgorLy8gIG11dGU6ICAgICAgIGVuYWJsZS9kaXNhYmxlIGZsYWcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQzMl90IFZvbHVtZUdldE11dGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90ICptdXRlKXsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lR2V0TXV0ZSBzdGFydCIpOworICAgIGlmKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKXx8CisgICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fVFJVRSkpeworICAgICAgICAqbXV0ZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfWVsc2V7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lR2V0TXV0ZSByZWFkIGFuIGludmFsaWQgdmFsdWUgZnJvbSBjb250ZXh0ICVkIiwKKyAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIC8vTE9HVigiXHRWb2x1bWVHZXRNdXRlIGVuZCIpOworfSAgICAvKiBlbmQgZ2V0TXV0ZSAqLworCitpbnQxNl90IFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihpbnQxNl90IHBvc2l0aW9uKXsKKyAgICBpbnQxNl90IGNvbnZlcnRlZFBvc2l0aW9uID0gMDsKKworICAgIGNvbnZlcnRlZFBvc2l0aW9uID0gKGludDE2X3QpKCgoZmxvYXQpcG9zaXRpb24vMTAwMCkqOTYpOworICAgIHJldHVybiBjb252ZXJ0ZWRQb3NpdGlvbjsKKworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgICAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHBvc2l0aW9uOiAgICAgICBzdGVyZW8gcG9zaXRpb24KKy8vCisvLyBPdXRwdXRzOgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBwb3NpdGlvbil7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFsYW5jZSA9IDA7CisKKworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IHBvc2l0aW9uOworICAgIEJhbGFuY2UgPSBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gc3RhcnQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkIiwKKyAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworCisgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgLy9MT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFBvc2l0aW9uIHRvIGJlIHNldCBpcyAlZCAlZFxuIiwgcG9zaXRpb24sIEJhbGFuY2UpOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gcG9zaXRpb247CisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCisgICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIC8vTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyBnb3Q6IgorICAgICAgICAvLyAgICAgIiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOworCisgICAgICAgIC8qIFZvbHVtZSBwYXJhbWV0ZXJzICovCisgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICA9IEJhbGFuY2U7CisgICAgICAgIC8vTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbigpICgtOTZkQiAtPiArOTZkQikgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgKTsKKworICAgICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCisgICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgLy9MT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCisgICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIC8vTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyBnb3Q6ICIKKyAgICAgICAgLy8gICAgICIlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gUG9zaXRpb24gYXR0ZW1wdGluZyB0byBzZXQsIGJ1dCBub3QgZW5hYmxlZCAlZCAlZFxuIiwKKyAgICAgICAgLy9wb3NpdGlvbiwgQmFsYW5jZSk7CisgICAgfQorICAgIC8vTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBlbmQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkXG4iLAorICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICAgICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vICBwb3NpdGlvbjogICAgICAgc3RlcmVvIHBvc2l0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCAqcG9zaXRpb24peworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCIpOworCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgYmFsYW5jZTsKKworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWQiLAorICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy9MT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSk7CisgICAgLy9MT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAgIGJhbGFuY2UgPSBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisKKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgaWYoYmFsYW5jZSAhPSBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSl7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcG9zaXRpb24gPSAoTFZNX0lOVDE2KXBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQ7ICAgICAvLyBDb252ZXJ0IGRCIHRvIG1pbGxpYmVscworICAgIC8vTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBlbmQgcmV0dXJuaW5nIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSVkXG4iLAorICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgbXV0ZTogICAgICAgZW5hYmxlL2Rpc2FibGUgZmxhZworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQzMl90IFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBlbmFibGVkKXsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gc3RhcnQoKSIpOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IGVuYWJsZWQ7CisKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy9MT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gdG8gJWQsIHBvc2l0aW9uIHdhcyAlZFxuIiwKKyAgICAvLyAgICAgZW5hYmxlZCwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgKTsKKworICAgIC8qIFNldCBhcHByb3ByaWF0ZSBzdGVyZW8gcG9zaXRpb24gKi8KKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9GQUxTRSl7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlID0gMDsKKyAgICB9ZWxzZXsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgfQorCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy9MT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBlbmQoKVxuIik7CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IGEgQmFzc0Jvb3N0IHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwQmFzc0Jvb3N0ICAgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQorLy8gIHBWYWx1ZVNpemUgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorLy8KKy8vIE91dHB1dHM6CisvLyAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisvLyAgKnBWYWx1ZVNpemUgdXBkYXRlZCB3aXRoIGFjdHVhbCB2YWx1ZSBzaXplCisvLworLy8KKy8vIFNpZGUgRWZmZWN0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOworICAgIGludDMyX3QgcGFyYW0yOworICAgIGNoYXIgKm5hbWU7CisKKyAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X2dldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUxICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMiAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSDoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IEJhc3NHZXRTdHJlbmd0aChwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIFNldCBhIEJhc3NCb29zdCBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcEJhc3NCb29zdCAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgQmFzc0Jvb3N0X3NldFBhcmFtZXRlciAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQxNl90IHN0cmVuZ3RoOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKworICAgIC8vTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisKKyAgICBzd2l0Y2ggKCpwUGFyYW1UZW1wKXsKKyAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICBzdHJlbmd0aCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyKCkgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIHZhbHVlIGlzICVkIiwgc3RyZW5ndGgpOworICAgICAgICAgICAgLy9MT0dWKCJcdEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIHBCYXNzQm9vc3QtPkJhc3NTZXRTdHJlbmd0aCIpOworICAgICAgICAgICAgQmFzc1NldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X3NldFBhcmFtZXRlcigpIENhbGxlZCBwQmFzc0Jvb3N0LT5CYXNzU2V0U3RyZW5ndGgiKTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgKnBQYXJhbVRlbXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IGEgVmlydHVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBWaXJ0dWFsaXplciAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisvLyAgcFZhbHVlU2l6ZSAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisvLworLy8gT3V0cHV0czoKKy8vICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKy8vICAqcFZhbHVlU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKyAgICBpbnQzMl90IHBhcmFtMjsKKyAgICBjaGFyICpuYW1lOworCisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplICVkIiwqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMiAlZCIsKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSDoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFZpcnR1YWxpemVyR2V0U3RyZW5ndGgocENvbnRleHQpOworCisgICAgICAgICAgICAvL0xPR1YoIlx0VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFZpcnR1YWxpemVyX2dldFBhcmFtZXRlciAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBWaXJ0dWFsaXplciBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcFZpcnR1YWxpemVyICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDE2X3Qgc3RyZW5ndGg7CisgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOworCisgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEg6CisgICAgICAgICAgICBzdHJlbmd0aCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCB2YWx1ZSBpcyAlZCIsIHN0cmVuZ3RoKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIHBWaXJ0dWFsaXplci0+c2V0U3RyZW5ndGgiKTsKKyAgICAgICAgICAgIFZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIChpbnQzMl90KXN0cmVuZ3RoKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZpcnR1YWxpemVyLT5zZXRTdHJlbmd0aCIpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vTE9HVigiXHRWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFZpcnR1YWxpemVyX3NldFBhcmFtZXRlciAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IGEgRXF1YWxpemVyIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwRXF1YWxpemVyICAgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQorLy8gIHBWYWx1ZVNpemUgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorLy8KKy8vIE91dHB1dHM6CisvLyAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisvLyAgKnBWYWx1ZVNpemUgdXBkYXRlZCB3aXRoIGFjdHVhbCB2YWx1ZSBzaXplCisvLworLy8KKy8vIFNpZGUgRWZmZWN0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgICAgICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAqcFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludCBiTXV0ZSA9IDA7CisgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOworICAgIGludDMyX3QgcGFyYW0yOworICAgIGNoYXIgKm5hbWU7CisKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRVFfUEFSQU1fTlVNX0JBTkRTOgorICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUzoKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CisgICAgY2FzZSBFUV9QQVJBTV9HRVRfQkFORDoKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgMSAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgMiAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgMyAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MzJfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgNSAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRToKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplIDEgICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSAoMiArIEZJVkVCQU5EX05VTUJBTkRTKSAqIHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyIHVua25vd24gcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKKyAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClGSVZFQkFORF9OVU1CQU5EUzsKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9OVU1fQkFORFMgJWQiLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6CisgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IC0xNTAwOworICAgICAgICAqKChpbnQxNl90ICopcFZhbHVlICsgMSkgPSAxNTAwOworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgLy8gICAgICAqKGludDE2X3QgKilwVmFsdWUsICooKGludDE2X3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtVGVtcDsKKyAgICAgICAgaWYgKHBhcmFtMiA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IChpbnQxNl90KUVxdWFsaXplckdldEJhbmRMZXZlbChwQ29udGV4dCwgcGFyYW0yKTsKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwKKyAgICAgICAgLy8gICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7CisgICAgICAgIGlmIChwYXJhbTIgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGludDMyX3QgKilwVmFsdWUgPSBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kocENvbnRleHQsIHBhcmFtMik7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQ0VOVEVSX0ZSRVEgYmFuZCAlZCwgZnJlcXVlbmN5ICVkIiwKKyAgICAgICAgLy8gICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0U6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW1UZW1wOworICAgICAgICBpZiAocGFyYW0yID49IEZJVkVCQU5EX05VTUJBTkRTKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRXF1YWxpemVyR2V0QmFuZEZyZXFSYW5nZShwQ29udGV4dCwgcGFyYW0yLCAodWludDMyX3QgKilwVmFsdWUsICgodWludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGJhbmQgJWQsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgLy8gICAgICBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtVGVtcDsKKyAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kKHBDb250ZXh0LCBwYXJhbTIpOworICAgICAgICAvL0xPR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsCisgICAgICAgIC8vICAgICAgcGFyYW0yLCAqKHVpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpRXF1YWxpemVyR2V0UHJlc2V0KHBDb250ZXh0KTsKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DVVJfUFJFU0VUICVkIiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUzoKKyAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCk7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTICVkIiwgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRToKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbVRlbXA7CisgICAgICAgIGlmIChwYXJhbTIgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgIC8vaWYgKHBhcmFtMiA+PSAyMCkgeyAgICAgLy8gQUdPIEZJWAorICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5hbWUgPSAoY2hhciAqKXBWYWx1ZTsKKyAgICAgICAgc3RybmNweShuYW1lLCBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKHBhcmFtMiksICpwVmFsdWVTaXplIC0gMSk7CisgICAgICAgIG5hbWVbKnBWYWx1ZVNpemUgLSAxXSA9IDA7CisgICAgICAgICpwVmFsdWVTaXplID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkLCBuYW1lICVzIGxlbiAlZCIsCisgICAgICAgIC8vICAgICAgcGFyYW0yLCBnRXF1YWxpemVyUHJlc2V0c1twYXJhbTJdLm5hbWUsICpwVmFsdWVTaXplKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKKyAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOworICAgICAgICBMT0dWKCJcdEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9QUk9QRVJUSUVTIik7CisgICAgICAgIHBbMF0gPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRQcmVzZXQocENvbnRleHQpOworICAgICAgICBwWzFdID0gKGludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICAgICAgcFsyICsgaV0gPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIGkpOworICAgICAgICB9CisgICAgfSBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vR1YoIlx0RXF1YWxpemVyX2dldFBhcmFtZXRlciBlbmRcbiIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXF1YWxpemVyX3NldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBTZXQgYSBFcXVhbGl6ZXIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBFcXVhbGl6ZXIgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgcHJlc2V0OworICAgIGludDMyX3QgYmFuZDsKKyAgICBpbnQzMl90IGxldmVsOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKworCisgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBFUV9QQVJBTV9DVVJfUFJFU0VUOgorICAgICAgICBwcmVzZXQgPSAoaW50MzJfdCkoKih1aW50MTZfdCAqKXBWYWx1ZSk7CisKKyAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DVVJfUFJFU0VUICVkIiwgcHJlc2V0KTsKKyAgICAgICAgaWYgKChwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKXx8KHByZXNldCA8IDApKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgRXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCBwcmVzZXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6CisgICAgICAgIGJhbmQgPSAgKnBQYXJhbVRlbXA7CisgICAgICAgIGxldmVsID0gKGludDMyX3QpKCooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIGJhbmQsIGxldmVsKTsKKyAgICAgICAgaWYgKGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGJhbmQsIGxldmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CisgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fUFJPUEVSVElFUyIpOworICAgICAgICBpbnQxNl90ICpwID0gKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgIGlmICgoaW50KXBbMF0gPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBbMF0gPj0gMCkgeworICAgICAgICAgICAgRXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCAoaW50KXBbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChpbnQpcFsxXSAhPSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGksIChpbnQpcFsyICsgaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0RXF1YWxpemVyX3NldFBhcmFtZXRlciBlbmQiKTsKKyAgICByZXR1cm4gc3RhdHVzOworfSAvKiBlbmQgRXF1YWxpemVyX3NldFBhcmFtZXRlciAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZvbHVtZV9nZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IGEgVm9sdW1lIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwVm9sdW1lICAgICAgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQorLy8gIHBWYWx1ZVNpemUgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorLy8KKy8vIE91dHB1dHM6CisvLyAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisvLyAgKnBWYWx1ZVNpemUgdXBkYXRlZCB3aXRoIGFjdHVhbCB2YWx1ZSBzaXplCisvLworLy8KKy8vIFNpZGUgRWZmZWN0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZvbHVtZV9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAgICAgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICpwVmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgKnBWYWx1ZSl7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50IGJNdXRlID0gMDsKKyAgICBpbnQzMl90ICpwUGFyYW1UZW1wID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW1UZW1wKys7OworICAgIGNoYXIgKm5hbWU7CisKKyAgICAvL0xPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlciBzdGFydCIpOworCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0xFVkVMOgorICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NQVhMRVZFTDoKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgMSAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01VVEU6CisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUgMiAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9MRVZFTDoKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUdldFZvbHVtZUxldmVsKHBDb250ZXh0LCAoaW50MTZfdCAqKShwVmFsdWUpKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0xFVkVMIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTUFYTEVWRUw6CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBWT0xVTUVfUEFSQU1fTUFYTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCAoaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX2dldFBhcmFtZXRlcigpIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01VVEU6CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRNdXRlKHBDb250ZXh0LCAodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX01VVEUgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OOgorICAgICAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZDsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vTE9HVigiXHRWb2x1bWVfZ2V0UGFyYW1ldGVyIGVuZCIpOworICAgIHJldHVybiBzdGF0dXM7Cit9IC8qIGVuZCBWb2x1bWVfZ2V0UGFyYW1ldGVyICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWb2x1bWVfc2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIFNldCBhIFZvbHVtZSBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcFZvbHVtZSAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgVm9sdW1lX3NldFBhcmFtZXRlciAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgICAgICBzdGF0dXMgPSAwOworICAgIGludDE2X3QgIGxldmVsOworICAgIGludDE2X3QgIHBvc2l0aW9uOworICAgIHVpbnQzMl90IG11dGU7CisgICAgdWludDMyX3QgcG9zaXRpb25FbmFibGVkOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKworICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIHBWb2x1bWUtPnNldFZvbHVtZUxldmVsIik7CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QpbGV2ZWwpOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZvbHVtZS0+c2V0Vm9sdW1lTGV2ZWwiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01VVEU6CisgICAgICAgICAgICBtdXRlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBwVm9sdW1lLT5zZXRNdXRlLCBtdXRlIGlzICVkIiwgbXV0ZSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxpbmcgcFZvbHVtZS0+c2V0TXV0ZSIpOworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lU2V0TXV0ZShwQ29udGV4dCwgbXV0ZSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX3NldFBhcmFtZXRlcigpIENhbGxlZCBwVm9sdW1lLT5zZXRNdXRlIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjoKKyAgICAgICAgICAgIHBvc2l0aW9uRW5hYmxlZCA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgcG9zaXRpb25FbmFibGVkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGNhbGxlZCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT046CisgICAgICAgICAgICBwb3NpdGlvbiA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfc2V0UGFyYW1ldGVyKCkgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIHZhbHVlIGlzICVkIiwgcG9zaXRpb24pOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIHBWb2x1bWUtPlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIik7CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgKGludDE2X3QpcG9zaXRpb24pOworICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgcFZvbHVtZS0+Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFZvbHVtZV9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFZvbHVtZV9zZXRQYXJhbWV0ZXIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWUgOiBMVkNfVG9EQl9zMzJUb3MxNigpCisgKiAgSW5wdXQgICAgICAgOiBTaWduZWQgMzItYml0IGludGVnZXIKKyAqICBPdXRwdXQgICAgICA6IFNpZ25lZCAxNi1iaXQgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICBNU0IgKDE2KSA9IHNpZ24gYml0CisgKiAgICAgICAgICAgICAgICAgICgxNS0+MDUpID0gaW50ZWdlciBwYXJ0CisgKiAgICAgICAgICAgICAgICAgICgwNC0+MDEpID0gZGVjaW1hbCBwYXJ0CisgKiAgUmV0dXJucyAgICAgOiBEYiB2YWx1ZSB3aXRoIHJlc3BlY3QgdG8gZnVsbCBzY2FsZQorICogIERlc2NyaXB0aW9uIDoKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDE2IExWQ19Ub0RCX3MzMlRvczE2KExWTV9JTlQzMiBMaW5fZml4KQoreworICAgIExWTV9JTlQxNiAgIGRiX2ZpeDsKKyAgICBMVk1fSU5UMTYgICBTaGlmdDsKKyAgICBMVk1fSU5UMTYgICBTbWFsbFJlbWFpbmRlcjsKKyAgICBMVk1fVUlOVDMyICBSZW1haW5kZXIgPSAoTFZNX1VJTlQzMilMaW5fZml4OworCisgICAgLyogQ291bnQgbGVhZGluZyBiaXRzLCAxIGN5Y2xlIGluIGFzc2VtYmx5Ki8KKyAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQ8MzI7IFNoaWZ0KyspCisgICAgeworICAgICAgICBpZiAoKFJlbWFpbmRlciAmIDB4ODAwMDAwMDBVKSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgUmVtYWluZGVyID0gUmVtYWluZGVyIDw8IDE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBCYXNlZCBvbiB0aGUgYXBwcm94aW1hdGlvbiBlcXVhdGlvbiAoZm9yIFExMS40IGZvcm1hdCk6CisgICAgICoKKyAgICAgKiBkQiA9IC05NiAqIFNoaWZ0ICsgMTYgKiAoOCAqIFJlbWFpbmRlciAtIDIgKiBSZW1haW5kZXJeMikKKyAgICAgKi8KKyAgICBkYl9maXggICAgPSAoTFZNX0lOVDE2KSgtOTYgKiBTaGlmdCk7ICAgICAgICAgICAgICAgLyogU2l4IGRCIHN0ZXBzIGluIFExMS40IGZvcm1hdCovCisgICAgU21hbGxSZW1haW5kZXIgPSAoTFZNX0lOVDE2KSgoUmVtYWluZGVyICYgMHg3ZmZmZmZmZikgPj4gMjQpOworICAgIGRiX2ZpeCA9IChMVk1fSU5UMTYpKGRiX2ZpeCArIFNtYWxsUmVtYWluZGVyICk7CisgICAgU21hbGxSZW1haW5kZXIgPSAoTFZNX0lOVDE2KShTbWFsbFJlbWFpbmRlciAqIFNtYWxsUmVtYWluZGVyKTsKKyAgICBkYl9maXggPSAoTFZNX0lOVDE2KShkYl9maXggLSAoTFZNX0lOVDE2KSgoTFZNX1VJTlQxNilTbWFsbFJlbWFpbmRlciA+PiA5KSk7CisKKyAgICAvKiBDb3JyZWN0IGZvciBzbWFsbCBvZmZzZXQgKi8KKyAgICBkYl9maXggPSAoTFZNX0lOVDE2KShkYl9maXggLSA1KTsKKworICAgIHJldHVybiBkYl9maXg7Cit9CisKK30gLy8gbmFtZXNwYWNlCit9IC8vIG5hbWVzcGFjZQorCisvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IFByb2Nlc3MgKi8KK2V4dGVybiAiQyIgaW50IEVmZmVjdF9wcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKKyAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOworICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIGludCAgICBzdGF0dXMgPSAwOworICAgIGludCAgICBzdGF0dXMyU2VjID0gMDsKKyAgICBpbnQgICAgbHZtU3RhdHVzID0gMDsKKyAgICBMVk1fSU5UMTYgICAqaW4gID0gKExWTV9JTlQxNiAqKWluQnVmZmVyLT5yYXc7CisgICAgTFZNX0lOVDE2ICAgKm91dCA9IChMVk1fSU5UMTYgKilvdXRCdWZmZXItPnJhdzsKKworLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCIsCisvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQpOworLy8gICAgTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBTdGFydCA6IFNhbXBsZXMgbGVmdCAlZCAlZCAlZCIsCisvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiwKKy8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQsCisvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CisKKy8vICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworLy8gICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiIpCisvLyAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworLy8gICAgTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBJbnRlcm5hbCBPcGVyYXRpbmcgTW9kZXM6IEJCICVkICAgVklSVCAlZCAgICBFUSAlZCIsCisvLyAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUsIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUsCisvLyAgICAgICAgQWN0aXZlUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSk7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X3Byb2Nlc3MoKSBFUlJPUiBwQ29udGV4dCA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCAgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMICB8fAorICAgICAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIEVSUk9SIE5VTEwgSU5QVVQgUE9JTlRFUiBPUiBGUkFNRSBDT1VOVCBJUyBXUk9ORyIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fQkFTU19CT09TVCBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPiAwKXsKKyAgICAgICAgICAgIHN0YXR1czJTZWMgPSAtRU5PREFUQTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7IC8vIFNURVJFTworICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCisgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IC1FTk9EQVRBOworICAgICAgICB9CisgICAgfQorICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSl7CisgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WT0xVTUUgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIHN0YXR1cyA9IC1FTk9EQVRBOworICAgIH0KKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkmJgorICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApeworICAgICAgICAgICAgc3RhdHVzMlNlYyA9IC1FTk9EQVRBOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgZm9yIDIgc2VjcyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCisgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRU5PREFUQTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZJUlRVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCl7CisgICAgICAgICAgICBzdGF0dXMyU2VjID0gLUVOT0RBVEE7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDI7Ly8gU1RFUkVPCisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgZm9yIDIgc2VjcyB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKKyAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gLUVOT0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIG9mIGFuIGVmZmVjdCBwcm9jZXNzIGl0cyBvdXRwdXQgd2l0aCBubyBlZmZlY3QKKyAgICBpZihzdGF0dXMgPT0gLUVOT0RBVEEpeworICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgICAgIC8vTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfcHJvY2VzcygpIGFjY3VtdWxhdGluZyBsYXN0IGZyYW1lIGludG8gb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgLy9MT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgdHJ5aW5nIGNvcHlpbmcgbGFzdCBmcmFtZSBpbnRvIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRMVk1fRVJST1IgOiBFbmFibGVkID0gJWQgICAgIENhbGxlZCA9ICVkIiwKKyAgICAgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCisgICAgICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQpOworCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLy9MT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9wcm9jZXNzKCkgY29weWluZyBsYXN0IGZyYW1lIGludG8gb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoKHN0YXR1czJTZWMgIT0gLUVOT0RBVEEpJiYoc3RhdHVzICE9IC1FTk9EQVRBKSl7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQrKzsKKyAgICB9CisKKyAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID09CisgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZWZmZWN0cyBlbmFibGVkLCAlZCBjYWxsZWQ6IEVmZmVjdCAlZCIsCisgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCisgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOworCisgICAgICAgIGlmKHN0YXR1cyA9PSAtRU5PREFUQSl7CisgICAgICAgICAgICAvL0xPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X3Byb2Nlc3MoKSBhY3R1YWxseSBwcm9jZXNzaW5nIGxhc3QgZnJhbWUiKTsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKKyAgICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMKKyAgICAgICAgICAgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCisgICAgICAgIGx2bVN0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKCAgICAoTFZNX0lOVDE2ICopaW5CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilvdXRCdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyAgICAgICAgaWYobHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKXsKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogTHZtQnVuZGxlX3Byb2Nlc3MgcmV0dXJuZWQgZXJyb3IgJWQiLCBsdm1TdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGx2bVN0YXR1czsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgTm90IENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLAorICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAorICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgLy8gMiBpcyBmb3Igc3RlcmVvIGlucHV0CisgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9ICAgLyogZW5kIEVmZmVjdF9wcm9jZXNzICovCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogQ29tbWFuZCAqLworZXh0ZXJuICJDIiBpbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90ICBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKXsKKyAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOworICAgIGludCByZXRzaXplOworCisgICAgLy9MT0dWKCJcdFxuRWZmZWN0X2NvbW1hbmQgc3RhcnQiKTsKKworICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICB9CisgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fRVFVQUxJWkVSIik7CisgICAgfQorICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fVk9MVU1FIik7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIElOUFVUUyBhcmU6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CisKKyAgICAvLyBJbmNhc2Ugd2UgZGlzYWJsZSBhbiBlZmZlY3QsIG5leHQgdGltZSBwcm9jZXNzIGlzCisgICAgLy8gY2FsbGVkIHRoZSBudW1iZXIgb2YgZWZmZWN0IGNhbGxlZCBjb3VsZCBiZSBncmVhdGVyCisgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisKKyAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgTnVtYmVyRWZmZWN0c0NhbGxlZCA9ICVkLCBOdW1iZXJFZmZlY3RzRW5hYmxlZCA9ICVkIiwKKyAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKKyAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworCisgICAgc3dpdGNoIChjbWRDb2RlKXsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SLCBFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIGZvciBlZmZlY3QgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBzdGFydCIpOworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpCYXNzU2V0U3RyZW5ndGgocENvbnRleHQsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7CisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fRVFVQUxJWkVSIik7CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6RXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX1ZPTFVNRSIpOworICAgICAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVTZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFOgorICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9DT05GSUdVUkUgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICBjbWRTaXplICAgICAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KXx8CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9DT05GSUdVUkU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X2NvbmZpZ3VyZShwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0NPTkZJR1VSRSBlbmQiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgc3RhcnQiKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OkVmZmVjdF9jb25maWd1cmUocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgZW5kIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOnsKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisKKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoaW50KSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKworICAgICAgICAgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CisKKyAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworCisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0QmFzc0Jvb3N0X2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoaW50KSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKworICAgICAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworCisgICAgICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCAgKikmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworCisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworCisgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworCisgICAgICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisKKyAgICAgICAgICAgICAgICBpbnQgdm9mZnNldCA9ICgocC0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQzMl90KSArIDEpICogc2l6ZW9mKGludDMyX3QpOworCisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6RXF1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBwLT52c2l6ZTsKKworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAiKnBSZXBseURhdGEgJTA4eCAlMDh4IiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChpbnQpIChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKworICAgICAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworCisgICAgICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZvbHVtZV9nZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90ICAqKSZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKworICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOworCisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBlbmQiKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTp7CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICAhPSAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICtzaXplb2YoaW50MTZfdCkpfHwKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0bkJhc3NCb29zdF9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0c2l6ZW9mKGVmZmVjdF9wYXJhbV90KSBpcyAgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+dnNpemUgaXMgJWQiCisgICAgICAgICAgICAgICAgLy8gICAgICAgICJcbiIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOworCisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6QmFzc0Jvb3N0X3NldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKKyAgICAgICAgICAgICAgLy9MT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkIiwKKyAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICAhPSAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICtzaXplb2YoaW50MTZfdCkpfHwKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisKKyAgICAgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IsIHBzaXplIGlzIG5vdCBzaXplb2YoaW50MzJfdCkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9MT0dWKCJcdG5WaXJ0dWFsaXplcl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0c2l6ZW9mKGVmZmVjdF9wYXJhbV90KSBpcyAgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+cHNpemUgaXMgJWRcbiIKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+dnNpemUgaXMgJWQiCisgICAgICAgICAgICAgICAgLy8gICAgICAgICJcbiIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgIGNtZFNpemUsIHNpemVvZihlZmZlY3RfcGFyYW1fdCksIHAtPnBzaXplLCBwLT52c2l6ZSApOworCisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpeworICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAorICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCisgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKTsKKworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKworICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVxdWFsaXplcl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKKyAgICAgICAgICAgICAgICAvL0xPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIC8vTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICtzaXplb2YoaW50MzJfdCkpKTsKKworICAgICAgICAgICAgICAgIGlmICggICAgcENtZERhdGEgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKXx8CisgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEx8fAorICAgICAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworCisgICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6Vm9sdW1lX3NldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gZW5kIik7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRSBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHBDb250ZXh0LT5FZmZlY3RUeXBlKXsKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgorICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogQmFzc0Jvb3N0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTpFRkZFQ1RfQ01EX0VOQUJMRSBMVk1fQkFTU19CT09TVGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBMVk1fRVFVQUxJWkVSOgorICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1ItRWZmZWN0IGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6RUZGRUNUX0NNRF9FTkFCTEUgTFZNX0VRVUFMSVpFUiBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTFZNX1ZJUlRVQUxJWkVSOgorICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZpcnR1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SLUVmZmVjdCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIDpFRkZFQ1RfQ01EX0VOQUJMRSBMVk1fVklSVFVBTElaRVIgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9WT0xVTUU6CisgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUi1FZmZlY3QgaXMgYWxyZWFkeSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRU5BQkxFIExWTV9WT0xVTUUgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUiwgaW52YWxpZCBFZmZlY3QgVHlwZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCsrOworICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9CisgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQqMC4xKTsgLy8gMC4xIHNlY3MgU3RlcmVvCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9CisgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQqMC4xKTsgLy8gMC4xIHNlY3MgU3RlcmVvCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0KKyAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOyAvLyAwLjEgc2VjcyBTdGVyZW8KKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0VOQUJMRSBTYW1wbGVzIHRvIEV4aXQgPSAlZCIsCisgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIpOworICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEUgTnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEUgZW5kIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRSBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChwQ29udGV4dC0+RWZmZWN0VHlwZSl7CisgICAgICAgICAgICAgICAgY2FzZSBMVk1fQkFTU19CT09TVDoKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID09IExWTV9GQUxTRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzQm9vc3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFIExWTV9CQVNTX0JPT1NUIGRpc2FibGVkIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTFZNX0VRVUFMSVpFUjoKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1ItRWZmZWN0IGlzIG5vdCB5ZXQgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEUgTFZNX0VRVUFMSVpFUiBkaXNhYmxlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9WSVJUVUFMSVpFUjoKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpeworICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFIExWTV9WSVJUVUFMSVpFUiBkaXNhYmxlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExWTV9WT0xVTUU6CisgICAgICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9GQUxTRSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFIExWTV9WT0xVTUUgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLCBpbnZhbGlkIEVmZmVjdCBUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CisgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEUgTnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworICAgICAgICAgICAgLy9MT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFIGVuZCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0Ugc3RhcnQiKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZV9lIGRldmljZSA9ICooYXVkaW9fZGV2aWNlX2UgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgICAgICAgICAgICAgIGlmKChkZXZpY2UgPT0gREVWSUNFX1NQRUFLRVIpfHwoZGV2aWNlID09IERFVklDRV9CTFVFVE9PVEhfU0NPX0NBUktJVCl8fAorICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gREVWSUNFX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpKXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9CQVNTX0JPT1NUICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fQkFTX0JPT1NUIik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2UgZG9lc250IHN1cHBvcnQgYmFzc2Jvb3N0IHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKKworICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGlzYWJsZSBMVk1fQkFTU19CT09TVCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fQkFTU19CT09TVCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIGJhc3Nib29zdCBhbmQgdGhlIGVmZmVjdCBoYXMgYmVlbiB0ZW1wb3JhcmlseSBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IHRoZW4gcmUtZW5hYmxlIGl0CisKKyAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgcmUtZW5hYmxlIExWTV9CQVNTX0JPT1NUICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2VuYWJsZShwQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7CisgICAgICAgICAgICAgICAgaWYoKGRldmljZSA9PSBERVZJQ0VfU1BFQUtFUil8fChkZXZpY2UgPT0gREVWSUNFX0JMVUVUT09USF9TQ09fQ0FSS0lUKXx8CisgICAgICAgICAgICAgICAgICAgKGRldmljZSA9PSBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUikpeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkZXZpY2UgaXMgaW52YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICBMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSB0ZW1wb3JhcnkgZGlzYWJsZSBMVk1fVklSVFVBTElaRVIiKTsKKworICAgICAgICAgICAgICAgICAgICAvL0lmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseSBkaXNhYmxlZAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWZmZWN0IG11c3Qgc3RpbGwgcmVwb3J0IGl0cyBvcmlnaW5hbCBzdGF0ZSBhcyB0aGlzIGNhbiBvbmx5IGJlIGNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIEVOQUJMRS9ESVNBQkxFIGNvbW1hbmQKKworICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID09IExWTV9UUlVFKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRpc2FibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9kaXNhYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9UUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIGRldmljZSBpcyB2YWxpZCBmb3IgTFZNX1ZJUlRVQUxJWkVSICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIHN1cHBvcnRzIHZpcnR1YWxpemVyIGFuZCB0aGUgZWZmZWN0IGhhcyBiZWVuIHRlbXBvcmFyaWx5IGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgdGhlbiByZS1lbmFibGUgaXQKKworICAgICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgcmUtZW5hYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZW5kIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCB2b2wgICAgID0gKihpbnQzMl90ICopcENtZERhdGE7CisgICAgICAgICAgICBpbnQxNl90IGRCOworICAgICAgICAgICAgaW50MzJfdCB2b2xfcmV0WzJdID0gezE8PDI0LDE8PDI0fTsgLy8gQXBwbHkgbm8gdm9sdW1lCisKKyAgICAgICAgICAgIC8vIGlmIHBSZXBseURhdGEgaXMgTlVMTCwgVk9MX0NUUkwgaXMgZGVsZWdhdGVkIHRvIGFub3RoZXIgZWZmZWN0CisgICAgICAgICAgICBpZihwUmVwbHlEYXRhID09IExWTV9OVUxMKXsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodm9sPT0weDEwMDAwMDApeworICAgICAgICAgICAgICAgIHZvbCAtPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWUgbGluZWFyIChROC4yNCkgdG8gdm9sdW1lIGRCICgwLT4tOTYpCisgICAgICAgICAgICBkQiA9IGFuZHJvaWQ6OkxWQ19Ub0RCX3MzMlRvczE2KHZvbCA8PDcpOworICAgICAgICAgICAgZEIgPSAoZEIgKzgpPj40OworICAgICAgICAgICAgZEIgPSAoZEIgPC05NikgPyAtOTYgOiBkQiA7CisKKyAgICAgICAgICAgIExPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FIFNlc3Npb246ICVkLCBTZXNzaW9uSUQ6ICVkIFZPTFVNRSBpcyAlZCBkQiAoJWQpLCAiCisgICAgICAgICAgICAgICAgICAiZWZmZWN0IGlzICVkIiwKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkLAorICAgICAgICAgICAgKGludDMyX3QpZEIsIHZvbDw8NywgcENvbnRleHQtPkVmZmVjdFR5cGUpOworCisgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgdm9sX3JldCwgc2l6ZW9mKGludDMyX3QpKjIpOworICAgICAgICAgICAgYW5kcm9pZDo6Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90KShkQioxMDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vTE9HVigiXHRFZmZlY3RfY29tbWFuZCBlbmQuLi5cblxuIik7CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBFZmZlY3RfY29tbWFuZCAqLworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZSA9IHsKKyAgICBFZmZlY3RfcHJvY2VzcywKKyAgICBFZmZlY3RfY29tbWFuZAorfTsgICAgLyogZW5kIGdMdm1FZmZlY3RJbnRlcmZhY2UgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWUxMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUQlVORExFX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUQlVORExFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RCYXNzQm9vc3RBcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXJ0dWFsaXplckFwaS5oPgorI2luY2x1ZGUgPExWTS5oPgorCisjaWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgRklWRUJBTkRfTlVNQkFORFMgICAgICAgICAgNQorI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICAgICA1CisjZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBMVk1fTUFYX1NFU1NJT05TICAgICAgICAgICAzMgorI2RlZmluZSBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFICAxNTAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIFZJUlRVQUxJWkVSX0NVUF9MT0FEX0FSTTlFIDEyMCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgRVFVQUxJWkVSX0NVUF9MT0FEX0FSTTlFICAgMjIwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUworI2RlZmluZSBWT0xVTUVfQ1VQX0xPQURfQVJNOUUgICAgICAwICAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIEJVTkRMRV9NRU1fVVNBR0UgICAgICAgICAgIDI1ICAgICAvLyBFeHByZXNzZWQgaW4ga0IKKy8vI2RlZmluZSBMVk1fUENNCisKKyNpZm5kZWYgT1BFTlNMX0VTX0hfCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfVk9MVU1FXyA9IHsgMHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKK2NvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfVk9MVU1FID0gJlNMX0lJRF9WT0xVTUVfOworI2VuZGlmIC8vT1BFTlNMX0VTX0hfCisKK3R5cGVkZWYgZW51bQoreworICAgIExWTV9CQVNTX0JPT1NULAorICAgIExWTV9WSVJUVUFMSVpFUiwKKyAgICBMVk1fRVFVQUxJWkVSLAorICAgIExWTV9WT0xVTUUKK30gbHZtX2VmZmVjdF9lbjsKKworLy8gUHJlc2V0IGNvbmZpZ3VyYXRpb24uCitzdHJ1Y3QgUHJlc2V0Q29uZmlnIHsKKyAgICAvLyBIdW1hbi1yZWFkYWJsZSBuYW1lLgorICAgIGNvbnN0IGNoYXIgKiBuYW1lOworICAgIC8vIEFuIGFycmF5IG9mIHNpemUgbkJhbmRzIHdoZXJlIGVhY2ggZWxlbWVudCBpcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZQorICAgIC8vIGNvcnJlc3BvbmRpbmcgYmFuZC4KKyAgICAvL2NvbnN0IEJhbmRDb25maWcgKiBiYW5kQ29uZmlnczsKK307CisKKy8qIEJ1bmRsZWRFZmZlY3RDb250ZXh0IDogT25lIHBlciBzZXNzaW9uICovCitzdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHR7CisgICAgTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2U7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk5vOyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNlc3Npb24gbnVtYmVyICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uSWQ7ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBpZCAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZvbHVtZUVuYWJsZWQ7ICAgICAgICAgICAvKiBGbGFnIGZvciBWb2x1bWUgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFcXVhbGl6ZXJFbmFibGVkOyAgICAgICAgLyogRmxhZyBmb3IgRVEgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzRW5hYmxlZDsgICAgICAgICAgICAgLyogRmxhZyBmb3IgQmFzcyAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhc3NUZW1wRGlzYWJsZWQ7ICAgICAgICAvKiBGbGFnIGZvciBCYXNzIHRvIGJlIHJlLWVuYWJsZWQgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplckVuYWJsZWQ7ICAgICAgLyogRmxhZyBmb3IgVmlydHVhbGl6ZXIgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZDsgLyogRmxhZyBmb3IgZWZmZWN0IHRvIGJlIHJlLWVuYWJsZWQgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNFbmFibGVkOyAgICAgLyogRWZmZWN0cyBpbiB0aGlzIHNlc3Npb24gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlckVmZmVjdHNDYWxsZWQ7ICAgICAgLyogRWZmZWN0cyBjYWxsZWQgc28gZmFyICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFZvbHVtZTsgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCisgICAgLy8gU2F2ZWQgcGFyYW1ldGVycyBmb3IgZWFjaCBlZmZlY3QgKi8KKyAgICAvLyBCYXNzIEJvb3N0CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNzU3RyZW5ndGhTYXZlZDsgICAgICAgIC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCisgICAgLy8gRXF1YWxpemVyCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJQcmVzZXQ7ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcHJlc2V0IGJlaW5nIHVzZWQgKi8KKyAgICAvLyBWaXJ0dWFsemVyCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0U3RyZW5ndGhTYXZlZDsgICAgICAgIC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCisgICAgLy8gVm9sdW1lCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFNhdmVkOyAgICAgLyogZm9yIHdoZW4gbXV0ZSBpcyBzZXQsIGxldmVsIG11c3QgYmUgc2F2ZWQgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU2F2ZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXV0ZUVuYWJsZWQ7ICAgLyogTXVzdCBzdG9yZSBhcyBtdXRlID0gLTk2ZEIgbGV2ZWwgKi8KKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50OworICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNQZXJTZWNvbmQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRFcTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudEJiOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50VmlydDsKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOworICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKKyAgICAjZW5kaWYKK307CisKKy8qIFNlc3Npb25Db250ZXh0IDogT25lIHNlc3Npb24gKi8KK3N0cnVjdCBTZXNzaW9uQ29udGV4dHsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCdW5kbGVkRWZmZWN0c0VuYWJsZWQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiVm9sdW1lSW5zdGFudGlhdGVkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkVxdWFsaXplckluc3RhbnRpYXRlZDsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzSW5zdGFudGlhdGVkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZpcnR1YWxpemVySW5zdGFudGlhdGVkOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsKK307CisKK3N0cnVjdCBFZmZlY3RDb250ZXh0eworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7CisgICAgbHZtX2VmZmVjdF9lbiAgICAgICAgICAgICAgICAgICBFZmZlY3RUeXBlOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsKK307CisKKworLyogZW51bWVyYXRlZCBwYXJhbWV0ZXIgc2V0dGluZ3MgZm9yIFZvbHVtZSBlZmZlY3QgKi8KK3R5cGVkZWYgZW51bQoreworICAgIFZPTFVNRV9QQVJBTV9MRVZFTCwgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fTUFYTEVWRUwsICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMbWlsbGliZWwgPSB0eXBlZGVmIFNMdWludDE2IChnZXQpCisgICAgVk9MVU1FX1BBUkFNX01VVEUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiwgICAgICAgIC8vIHR5cGUgU0xib29sZWFuICA9IHR5cGVkZWYgU0x1aW50MzIgKHNldCAmIGdldCkKKyAgICBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04sICAgICAgICAgICAgICAvLyB0eXBlIFNMcGVybWlsbGUgPSB0eXBlZGVmIFNMdWludDE2IChzZXQgJiBnZXQpCit9IHRfdm9sdW1lX3BhcmFtczsKKworc3RhdGljIGNvbnN0IGludCBQUkVTRVRfQ1VTVE9NID0gLTE7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBiYW5kRnJlcVJhbmdlW0ZJVkVCQU5EX05VTUJBTkRTXVsyXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMDAwMCwgMTIwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMjAwMDEsIDQ2MDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDYwMDAxLCAxODAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxODAwMDAxLCA3MDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MDAwMDAxLCAxfX07CisKK3N0YXRpYyBjb25zdCBMVk1fVUlOVDE2ICBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwgICAgICAgICAgIC8qIEZyZXF1ZW5jaWVzIGluIEh6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwMDB9OworCitzdGF0aWMgY29uc3QgTFZNX1VJTlQxNiBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgICAgICAgICAgICAgICAvKiBRIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTZ9OworCitzdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmROb3JtYWxQcmVzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAwLCAzLCAgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA1LCAtMywgNSwgNiwgICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgLTYsIDcsIDEzLCAxMCwgICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAtMiwgLTIsIDYsIC0zLCAgICAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgLTgsIDEzLCAtMSwgLTQsICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgLTQsIDUsIDgsICAgICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgNSwgLTQsIDUsIDksICAgICAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsIDQsIDksIDQsIC01LCAgICAgIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAtMSwgOCwgMTB9OyAgIC8qIFJvY2sgUHJlc2V0ICovCisKK3N0YXRpYyBjb25zdCBMVk1fSU5UMTYgRVFOQl81QmFuZFNvZnRQcmVzZXRzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMCwgMywgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgLTIsIDQsIDQsICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMCwgMiwgNCwgMSwgICAgICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMiwgLTEsICAgICAvKiBGb2xrIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIDksIDMsIDAsICAgICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgMCwgMSwgMywgICAgICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDIsIC0yLCAyLCA1LCAgICAgLyogSmF6eiBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAyLCA1LCAxLCAtMiwgICAgIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAzLCAtMSwgMywgNX07ICAgIC8qIFJvY2sgUHJlc2V0ICovCisKK3N0YXRpYyBjb25zdCBQcmVzZXRDb25maWcgZ0VxdWFsaXplclByZXNldHNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ik5vcm1hbCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiQ2xhc3NpY2FsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJEYW5jZSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRmxhdCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRm9sayJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiSGVhdnkgTWV0YWwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkhpcCBIb3AifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkphenoifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlBvcCJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUm9jayJ9fTsKKworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVEJVTkRMRV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MGY0Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcApAQCAtMCwwICsxLDE5ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmV2ZXJiIgorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxFZmZlY3RSZXZlcmIuaD4KKyNpbmNsdWRlIDxMVlJFVi5oPgorCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciByZXZlcmIKK2V4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlOworCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKXtcCisgICAgICAgIGlmIChMdm1TdGF0dXMgPT0gTFZSRVZfTlVMTEFERFJFU1Mpe1wKKyAgICAgICAgICAgIExPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAorICAgICAgICAgICAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAorICAgICAgICB9XAorICAgICAgICBpZiAoTHZtU3RhdHVzID09IExWUkVWX0lOVkFMSUROVU1TQU1QTEVTKXtcCisgICAgICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICAgICAgaWYgKEx2bVN0YXR1cyA9PSBMVlJFVl9PVVRPRlJBTkdFKXtcCisgICAgICAgICAgICBMT0dWKCJcdExWUkVWX0VSUk9SIDogUGFyYW1ldGVyIGVycm9yIC0gIlwKKyAgICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpO1wKKyAgICAgICAgfVwKKyAgICB9CisKKy8vIE5hbWVzcGFjZXMKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUHJlc2V0IGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBzdGF0aWMgdF9yZXZlcmJfc2V0dGluZ3Mgc1JldmVyYlByZXNldHNbXSA9IHsKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9OT05FOiB2YWx1ZXMgYXJlIHVudXNlZAorICAgICAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgICAgIC8vIFJFVkVSQl9QUkVTRVRfU01BTExST09NCisgICAgICAgIHstMTAwMCwgLTYwMCwgMTEwMCwgODMwLCAtNDAwLCA1LCA1MDAsIDEwLCAxMDAwLCAxMDAwfSwKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9NRURJVU1ST09NCisgICAgICAgIHstMTAwMCwgLTYwMCwgMTMwMCwgODMwLCAtMTAwMCwgMjAsIC0yMDAsIDIwLCAxMDAwLCAxMDAwfSwKKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9MQVJHRVJPT00KKyAgICAgICAgey0xMDAwLCAtNjAwLCAxNTAwLCA4MzAsIC0xNjAwLCA1LCAtMTAwMCwgNDAsIDEwMDAsIDEwMDB9LAorICAgICAgICAvLyBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwKKyAgICAgICAgey0xMDAwLCAtNjAwLCAxODAwLCA3MDAsIC0xMzAwLCAxNSwgLTgwMCwgMzAsIDEwMDAsIDEwMDB9LAorICAgICAgICAvLyBSRVZFUkJfUFJFU0VUX0xBUkdFSEFMTAorICAgICAgICB7LTEwMDAsIC02MDAsIDE4MDAsIDcwMCwgLTIwMDAsIDMwLCAtMTQwMCwgNjAsIDEwMDAsIDEwMDB9LAorICAgICAgICAvLyBSRVZFUkJfUFJFU0VUX1BMQVRFCisgICAgICAgIHstMTAwMCwgLTIwMCwgMTMwMCwgOTAwLCAwLCAyLCAwLCAxMCwgMTAwMCwgNzUwfSwKK307CisKKworLy8gTlhQIFNXIGF1eGlsaWFyeSBlbnZpcm9ubWVudGFsIHJldmVyYgorY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKKyAgICAgICAgeyAweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7IDB4NGUsIDB4MjMsIDB4NGQsIDB4MDYsIDB4ODMsIDB4OWUgfSB9LAorICAgICAgICB7IDB4NGEzODdmYzAsIDB4OGFiMywgMHgxMWRmLCAweDhiYWQsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCisgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCisgICAgICAgICJBdXhpbGlhcnkgRW52aXJvbm1lbnRhbCBSZXZlcmIiLAorICAgICAgICAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorfTsKKworLy8gTlhQIFNXIGluc2VydCBlbnZpcm9ubWVudGFsIHJldmVyYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAorICAgICAgICB7MHhjN2E1MTFhMCwgMHhhM2JiLCAweDExZGYsIDB4ODYwZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKKyAgICAgICAgTFZSRVZfQ1VQX0xPQURfQVJNOUUsCisgICAgICAgIExWUkVWX01FTV9VU0FHRSwKKyAgICAgICAgIkluc2VydCBFbnZpcm9ubWVudGFsIFJldmVyYiIsCisgICAgICAgICJOWFAgU29mdHdhcmUgTHRkLiIsCit9OworCisvLyBOWFAgU1cgYXV4aWxpYXJ5IHByZXNldCByZXZlcmIKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0geworICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4ZjI5YTE0MDAsIDB4YTNiYiwgMHgxMWRmLCAweDhkZGMsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCisgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCisgICAgICAgICJBdXhpbGlhcnkgUHJlc2V0IFJldmVyYiIsCisgICAgICAgICJOWFAgU29mdHdhcmUgTHRkLiIsCit9OworCisvLyBOWFAgU1cgaW5zZXJ0IHByZXNldCByZXZlcmIKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0geworICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4MTcyY2RmMDAsIDB4YTNiYywgMHgxMWRmLCAweGE3MmYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsCisgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLAorICAgICAgICBMVlJFVl9NRU1fVVNBR0UsCisgICAgICAgICJJbnNlcnQgUHJlc2V0IFJldmVyYiIsCisgICAgICAgICJOWFAgU29mdHdhcmUgTHRkLiIsCit9OworCisvLyBnRGVzY3JpcHRvcnMgY29udGFpbnMgcG9pbnRlcnMgdG8gYWxsIGRlZmluZWQgZWZmZWN0IGRlc2NyaXB0b3IgaW4gdGhpcyBsaWJyYXJ5CitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqIGNvbnN0IGdEZXNjcmlwdG9yc1tdID0geworICAgICAgICAmZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IsCisgICAgICAgICZnSW5zZXJ0RW52UmV2ZXJiRGVzY3JpcHRvciwKKyAgICAgICAgJmdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yLAorICAgICAgICAmZ0luc2VydFByZXNldFJldmVyYkRlc2NyaXB0b3IKK307CisKK3N0cnVjdCBSZXZlcmJDb250ZXh0eworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7CisgICAgTFZSRVZfSGFuZGxlX3QgICAgICAgICAgICAgICAgICBoSW5zdGFuY2U7CisgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFJvb21MZXZlbDsKKyAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkSGZMZXZlbDsKKyAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGVjYXlUaW1lOworICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREZWNheUhmUmF0aW87CisgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFJldmVyYkxldmVsOworICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREaWZmdXNpb247CisgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERlbnNpdHk7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW5hYmxlZDsKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOworICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKKyAgICAjZW5kaWYKKyAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAqSW5GcmFtZXMzMjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICpPdXRGcmFtZXMzMjsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIGN1clByZXNldDsKKyAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQcmVzZXQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnQ7Cit9OworCisjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1BSRVNFVCBSRVZFUkJfUFJFU0VUX01FRElVTVJPT00KKworLy8tLS0gbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworaW50ICBSZXZlcmJfaW5pdCAgICAgICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCk7Cit2b2lkIFJldmVyYl9mcmVlICAgICAgICAgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KTsKK2ludCAgUmV2ZXJiX2NvbmZpZ3VyZSAgICAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7CitpbnQgIFJldmVyYl9zZXRQYXJhbWV0ZXIgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSk7CitpbnQgIFJldmVyYl9nZXRQYXJhbWV0ZXIgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSk7CitpbnQgUmV2ZXJiX0xvYWRQcmVzZXQgICAgICAgKFJldmVyYkNvbnRleHQgICAqcENvbnRleHQpOworCisvKiBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gKi8KK2V4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpeworICAgIExPR1YoIlxuXHRFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMgc3RhcnQiKTsKKyAgICAqcE51bUVmZmVjdHMgPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOworICAgIExPR1YoIlx0RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIGNyZWF0aW5nICVkIGVmZmVjdHMiLCAqcE51bUVmZmVjdHMpOworICAgIExPR1YoIlx0RWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIGVuZFxuIik7CisgICAgcmV0dXJuIDA7Cit9ICAgICAvKiBlbmQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzICovCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcil7CisgICAgTE9HVigiXG5cdEVmZmVjdFF1ZXJ5RWZmZWN0IHN0YXJ0Iik7CisgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBwcm9jZXNzaW5nIGluZGV4ICVkIiwgaW5kZXgpOworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RRdWVyeUVmZmVjdCB3YXMgcGFzc2VkIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKGluZGV4ID49IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKikpIHsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RRdWVyeUVmZmVjdCBpbmRleCBvdXQgb2YgcmFuZ2UgJWQiLCBpbmRleCk7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBtZW1jcHkocERlc2NyaXB0b3IsIGdEZXNjcmlwdG9yc1tpbmRleF0sIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgTE9HVigiXHRFZmZlY3RRdWVyeUVmZmVjdCBlbmRcbiIpOworICAgIHJldHVybiAwOworfSAgICAgLyogZW5kIEVmZmVjdFF1ZXJ5RWZmZWN0ICovCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICAgICAgICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgICpwSW50ZXJmYWNlKXsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworICAgIGludCBsZW5ndGggPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisKKyAgICBMT0dWKCJcdFxuRWZmZWN0Q3JlYXRlIHN0YXJ0Iik7CisKKyAgICBpZiAocEludGVyZmFjZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0Q3JlYXRlKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBkZXNjID0gZ0Rlc2NyaXB0b3JzW2ldOworICAgICAgICBpZiAobWVtY21wKHV1aWQsICZkZXNjLT51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpCisgICAgICAgICAgICAgICAgPT0gMCkgeworICAgICAgICAgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBVVUlEIG1hdGNoZWQgUmV2ZXJiIHR5cGUgJWQsIFVVSUQgPSAleCIsIGksIGRlc2MtPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpID09IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICBSZXZlcmJDb250ZXh0ICpwQ29udGV4dCA9IG5ldyBSZXZlcmJDb250ZXh0OworCisgICAgcENvbnRleHQtPml0ZmUgICAgICA9ICZnUmV2ZXJiSW50ZXJmYWNlOworICAgIHBDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOworCisgICAgcENvbnRleHQtPmF1eGlsaWFyeSA9IGZhbHNlOworICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKXsKKyAgICAgICAgcENvbnRleHQtPmF1eGlsaWFyeSA9IHRydWU7CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQVVYIik7CisgICAgfWVsc2V7CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gSU5TIik7CisgICAgfQorCisgICAgcENvbnRleHQtPnByZXNldCA9IGZhbHNlOworICAgIGlmIChtZW1jbXAoJmRlc2MtPnR5cGUsIFNMX0lJRF9QUkVTRVRSRVZFUkIsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBwQ29udGV4dC0+cHJlc2V0ID0gdHJ1ZTsKKyAgICAgICAgLy8gZm9yY2UgcmVsb2FkaW5nIHByZXNldCBhdCBmaXJzdCBjYWxsIHRvIHByb2Nlc3MoKQorICAgICAgICBwQ29udGV4dC0+Y3VyUHJlc2V0ID0gUkVWRVJCX1BSRVNFVF9MQVNUICsgMTsKKyAgICAgICAgcENvbnRleHQtPm5leHRQcmVzZXQgPSBSRVZFUkJfREVGQVVMVF9QUkVTRVQ7CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gUFJFU0VUIik7CisgICAgfWVsc2V7CisgICAgICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gRU5WSVJPTk1FTlRBTCIpOworICAgIH0KKworICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBSZXZlcmJfaW5pdCIpOworICAgIHJldCA9IFJldmVyYl9pbml0KHBDb250ZXh0KTsKKworICAgIGlmIChyZXQgPCAwKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBpbml0IGZhaWxlZCIpOworICAgICAgICBkZWxldGUgcENvbnRleHQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KXBDb250ZXh0OworCisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBwQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOworICAgIHBDb250ZXh0LT5QY21PdXRQdHIgPSBOVUxMOworCisgICAgcENvbnRleHQtPlBjbUluUHRyICA9IGZvcGVuKCIvZGF0YS90bXAvcmV2ZXJiX3BjbV9pbi5wY20iLCAidyIpOworICAgIHBDb250ZXh0LT5QY21PdXRQdHIgPSBmb3BlbigiL2RhdGEvdG1wL3JldmVyYl9wY21fb3V0LnBjbSIsICJ3Iik7CisKKyAgICBpZigocENvbnRleHQtPlBjbUluUHRyICA9PSBOVUxMKXx8CisgICAgICAgKHBDb250ZXh0LT5QY21PdXRQdHIgPT0gTlVMTCkpeworICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICAjZW5kaWYKKworCisgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciByZXZlcmIgcHJvY2VzcyAoKjIgaXMgZm9yIFNURVJFTykKKyAgICBwQ29udGV4dC0+SW5GcmFtZXMzMiAgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKKyAgICBwQ29udGV4dC0+T3V0RnJhbWVzMzIgPSAoTFZNX0lOVDMyICopbWFsbG9jKExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKExWTV9JTlQzMikgKiAyKTsKKworICAgIExPR1YoIlx0RWZmZWN0Q3JlYXRlICVwLCBzaXplICVkIiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CisgICAgTE9HVigiXHRFZmZlY3RDcmVhdGUgZW5kXG4iKTsKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIEVmZmVjdENyZWF0ZSAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UpeworICAgIFJldmVyYkNvbnRleHQgKiBwQ29udGV4dCA9IChSZXZlcmJDb250ZXh0ICopaW50ZXJmYWNlOworCisgICAgTE9HVigiXHRFZmZlY3RSZWxlYXNlICVwIiwgaW50ZXJmYWNlKTsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgI2lmZGVmIExWTV9QQ00KKyAgICBmY2xvc2UocENvbnRleHQtPlBjbUluUHRyKTsKKyAgICBmY2xvc2UocENvbnRleHQtPlBjbU91dFB0cik7CisgICAgI2VuZGlmCisgICAgZnJlZShwQ29udGV4dC0+SW5GcmFtZXMzMik7CisgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzMzIpOworICAgIFJldmVyYl9mcmVlKHBDb250ZXh0KTsKKyAgICBkZWxldGUgcENvbnRleHQ7CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBFZmZlY3RSZWxlYXNlICovCisKKy8qIGxvY2FsIGZ1bmN0aW9ucyAqLworI2RlZmluZSBDSEVDS19BUkcoY29uZCkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiNjb25kKTsgICAgICBcCisgICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNb25vVG8ySV8zMigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyAgQ29udmVydCBNT05PIHRvIFNURVJFTworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIE1vbm9UbzJJXzMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgIExWTV9JTlQxNiBpaTsKKyAgIHNyYyArPSAobi0xKTsKKyAgIGRzdCArPSAoKG4qMiktMSk7CisKKyAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgeworICAgICAgICpkc3QgPSAqc3JjOworICAgICAgIGRzdC0tOworCisgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgZHN0LS07CisgICAgICAgc3JjLS07CisgICB9CisKKyAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGcm9tMmlUb01vbm9fMzIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gIENvbnZlcnQgU1RFUkVPIHRvIE1PTk8KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBGcm9tMmlUb01vbm9fMzIoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgTFZNX0lOVDE2IGlpOworICAgTFZNX0lOVDMyIFRlbXA7CisKKyAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgeworICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7CisgICAgICAgc3JjKys7CisKKyAgICAgICBUZW1wICs9KCpzcmM+PjEpOworICAgICAgIHNyYysrOworCisgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgZHN0Kys7CisgICB9CisKKyAgIHJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCit7CisgICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKKyAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOworICAgIHJldHVybiBzYW1wbGU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcHJvY2VzcygpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgUmV2ZXJiCisvLworLy8gSW5wdXRzOgorLy8gIHBJbjogICAgICAgIHBvaW50ZXIgdG8gc3RlcmVvL21vbm8gMTYgYml0IGlucHV0IGRhdGEKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKKy8vICBmcmFtZUNvdW50OiBGcmFtZXMgdG8gcHJvY2VzcworLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHN0cmVuZ3RoICAgIHN0cmVuZ3RoIHRvIGJlIGFwcGxpZWQKKy8vCisvLyAgT3V0cHV0czoKKy8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgcHJvY2VzcyggTFZNX0lOVDE2ICAgICAqcEluLAorICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKnBPdXQsCisgICAgICAgICAgICAgaW50ICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgIFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKKworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDE7CisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICpPdXRGcmFtZXMxNjsKKworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgZWl0aGVyIG1vbm8gb3Igc3RlcmVvCisgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pIHsKKyAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMjsKKyAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgIT0gQ0hBTk5FTF9NT05PKSB7CisgICAgICAgIExPR1YoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBPdXRGcmFtZXMxNiA9IChMVk1fSU5UMTYgKilwQ29udGV4dC0+T3V0RnJhbWVzMzI7CisKKyAgICAvLyBDaGVjayBmb3IgTlVMTCBwb2ludGVycworICAgIGlmKChwQ29udGV4dC0+SW5GcmFtZXMzMiA9PSBOVUxMKXx8KHBDb250ZXh0LT5PdXRGcmFtZXMzMiA9PSBOVUxMKSl7CisgICAgICAgIExPR1YoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRlbXBvcmFyeSBidWZmZXJzICIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAjaWZkZWYgTFZNX1BDTQorICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqc2FtcGxlc1BlckZyYW1lLCAxLCBwQ29udGV4dC0+UGNtSW5QdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+UGNtSW5QdHIpOworICAgICNlbmRpZgorCisgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQgJiYgcENvbnRleHQtPm5leHRQcmVzZXQgIT0gcENvbnRleHQtPmN1clByZXNldCkgeworICAgICAgICBSZXZlcmJfTG9hZFByZXNldChwQ29udGV4dCk7CisgICAgfQorICAgIC8vIENvbnZlcnQgdG8gSW5wdXQgMzIgYml0cworICAgIGZvcihpbnQgaT0wOyBpPGZyYW1lQ291bnQqc2FtcGxlc1BlckZyYW1lOyBpKyspeworICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMzMltpXSA9IChMVk1fSU5UMzIpcEluW2ldPDw4OworICAgIH0KKworICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5jdXJQcmVzZXQgPT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CisgICAgICAgIG1lbXNldChwQ29udGV4dC0+T3V0RnJhbWVzMzIsIDAsIGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIDIpOyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UgJiYgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1lbXNldChwQ29udGV4dC0+SW5GcmFtZXMzMiwwLGZyYW1lQ291bnQgKiBzaXplb2YoTFZNX0lOVDMyKSAqIHNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgICAgICBMT0dWKCJcdFplcm9pbmcgJWQgc2FtcGxlcyBwZXIgZnJhbWUgYXQgdGhlIGVuZCBvZiBjYWxsIiwgc2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMsIHByb2R1Y2luZyBhIHN0ZXJlbyBvdXRwdXQgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfUHJvY2VzcyhwQ29udGV4dC0+aEluc3RhbmNlLCAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lczMyLCAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lczMyLCAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgfQorCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1Byb2Nlc3MiLCAicHJvY2VzcyIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgLy8gQ29udmVydCB0byAxNiBiaXRzCisgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNihwQ29udGV4dC0+T3V0RnJhbWVzMzJbaV0+PjgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCoyOyBpKyspIHsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgIE91dEZyYW1lczE2W2ldID0gY2xhbXAxNigocENvbnRleHQtPk91dEZyYW1lczMyW2ldPj44KSArIChMVk1fSU5UMzIpcEluW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNpZmRlZiBMVk1fUENNCisgICAgZndyaXRlKE91dEZyYW1lczE2LCBmcmFtZUNvdW50KnNpemVvZihMVk1fSU5UMTYpKjIsIDEsIHBDb250ZXh0LT5QY21PdXRQdHIpOworICAgIGZmbHVzaChwQ29udGV4dC0+UGNtT3V0UHRyKTsKKyAgICAjZW5kaWYKKworICAgIC8vIEFjY3VtdWxhdGUgaWYgcmVxdWlyZWQKKyAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKKyAgICAgICAgLy9MT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgQUNDVU1VTEFURSIpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8ZnJhbWVDb3VudCoyOyBpKyspeyAvL2Fsd2F5cyBzdGVyZW8gaGVyZQorICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKGludDMyX3QpcE91dFtpXSArIChpbnQzMl90KU91dEZyYW1lczE2W2ldKTsKKyAgICAgICAgfQorICAgIH1lbHNleworICAgICAgICAvL0xPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBXUklURSIpOworICAgICAgICBtZW1jcHkocE91dCwgT3V0RnJhbWVzMTYsIGZyYW1lQ291bnQqc2l6ZW9mKExWTV9JTlQxNikqMik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBwcm9jZXNzICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiX2ZyZWUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUmV2ZXJiX2ZyZWUoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgTWVtVGFiOworCisgICAgLyogRnJlZSB0aGUgYWxnb3JpdGhtIG1lbW9yeSAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiUmV2ZXJiX2ZyZWUiKQorCisgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdGZyZWUoKSAtIFNUQVJUIGZyZWVpbmcgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKworICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgICAgICAgICAgTE9HVigiXHRmcmVlKCkgLSBFTkQgICBmcmVlaW5nICVsZCBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfSAgICAvKiBlbmQgUmV2ZXJiX2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJfY29uZmlndXJlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmV2ZXJiX2NvbmZpZ3VyZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKKyAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOworICAgIC8vTE9HVigiXHRSZXZlcmJfY29uZmlndXJlIHN0YXJ0Iik7CisKKyAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWcgIT0gTlVMTCk7CisKKyAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgQ0hFQ0tfQVJHKChwQ29udGV4dC0+YXV4aWxpYXJ5ICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTykgfHwKKyAgICAgICAgICAgICAgKCghcENvbnRleHQtPmF1eGlsaWFyeSkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQ0hBTk5FTF9TVEVSRU8pKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKTsKKyAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TMTUpOworCisgICAgaWYocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IDQ0MTAwKXsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9jb25maWd1cmUgY2FsbGluZyBtZW1jcHkiKTsKKyAgICBtZW1jcHkoJnBDb250ZXh0LT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKworCisgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKKyAgICBjYXNlIDgwMDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVigiXHJSZXZlcmJfQ29uZmlndXJlIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmKHBDb250ZXh0LT5TYW1wbGVSYXRlICE9IFNhbXBsZVJhdGUpeworCisgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOworICAgICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7CisKKyAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb25maWd1cmUgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKKworICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYl9jb25maWd1cmUiKQorICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisKKyAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYl9jb25maWd1cmUiKQorICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbmZpZ3VyZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworCisgICAgfWVsc2V7CisgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29uZmlndXJlIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJfY29uZmlndXJlIEVuZCIpOworICAgIHJldHVybiAwOworfSAgIC8qIGVuZCBSZXZlcmJfY29uZmlndXJlICovCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBSZXZlcmJfaW5pdChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgaW50IHN0YXR1czsKKworICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgc3RhcnQiKTsKKworICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKKworICAgIGlmIChwQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpeworICAgICAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CisgICAgfQorCisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgaWYgKHBDb250ZXh0LT5hdXhpbGlhcnkpIHsKKyAgICAgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9NT05POworICAgIH0gZWxzZSB7CisgICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgICAgICAgICAgICAgICAgICA9IENIQU5ORUxfU1RFUkVPOworICAgIH0KKworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgID0gTUFYX0NBTExfU0laRTsKKyAgICBJbnN0UGFyYW1zLlNvdXJjZUZvcm1hdCAgPSBMVk1fU1RFUkVPOyAgICAgICAgICAvLyBNYXggZm9ybWF0LCBjb3VsZCBiZSBtb25vIGR1cmluZyBwcm9jZXNzCisgICAgSW5zdFBhcmFtcy5OdW1EZWxheXMgICAgID0gTFZSRVZfREVMQVlMSU5FU180OworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworCisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldE1lbW9yeVRhYmxlIiwgIlJldmVyYl9pbml0IikKKyAgICBpZihMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5ICovCisgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJWxkIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMgdGhhdCB3ZXJlCisgICAgICogc3VjY2VzZnVsbHkgYWxsb2NhdGVkIGFuZCByZXR1cm4gd2l0aCBhbiBlcnJvcgorICAgICAqLworICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKKyAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciByZWdpb24gJXUgLSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7CisgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICVsZCBieXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBMT0dWKCJcdFJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgICAvKiBJbml0aWFsaXNlICovCisgICAgcENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOworCisgICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiUmV2ZXJiX2luaXQiKQorICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT047CisgICAgcGFyYW1zLlNhbXBsZVJhdGUgICAgID0gTFZNX0ZTXzQ0MTAwOworCisgICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8peworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fTU9OTzsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fU1RFUkVPOworICAgIH0KKworICAgIC8qIFJldmVyYiBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLkxldmVsICAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuTFBGICAgICAgICAgICAgPSAyMzk5OTsKKyAgICBwYXJhbXMuSFBGICAgICAgICAgICAgPSA1MDsKKyAgICBwYXJhbXMuVDYwICAgICAgICAgICAgPSAxNDkwOworICAgIHBhcmFtcy5EZW5zaXR5ICAgICAgICA9IDEwMDsKKyAgICBwYXJhbXMuRGFtcGluZyAgICAgICAgPSAyMTsKKyAgICBwYXJhbXMuUm9vbVNpemUgICAgICAgPSAxMDA7CisKKyAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0gKHBhcmFtcy5UNjAgKiBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkvMTAwMDsKKworICAgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZSBzZXQgdG8gdGhlIGdldAorICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbCBhdm9pZAorICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgICAqLworICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCAgICA9IC02MDAwOworICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgICAgICA9IDA7CisgICAgcENvbnRleHQtPmJFbmFibGVkICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSAgICA9IHBhcmFtcy5UNjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcGFyYW1zLkRhbXBpbmcqMjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSAgICAgID0gcGFyYW1zLlJvb21TaXplKjEwOworICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiAgICA9IHBhcmFtcy5EZW5zaXR5KjEwOworICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsICA9IC02MDAwOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJfaW5pdCIpCisgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgICAgTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIExPR1YoIlx0UmV2ZXJiX2luaXQgRW5kIik7CisgICAgcmV0dXJuIDA7Cit9ICAgLyogZW5kIFJldmVyYl9pbml0ICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiQ29udmVydExldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENvbnZlcnQgbGV2ZWwgZnJvbSBPcGVuU0wgRVMgZm9ybWF0IHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkNvbnZlcnRMZXZlbChpbnQxNl90IGxldmVsKXsKKyAgICBzdGF0aWMgaW50MTZfdCBMZXZlbEFycmF5WzEwMV0gPQorICAgIHsKKyAgICAgICAtMTIwMDAsIC00MDAwLCAgLTMzOTgsICAtMzA0NiwgIC0yNzk2LCAgLTI2MDMsICAtMjQ0NCwgIC0yMzEwLCAgLTIxOTQsICAtMjA5MiwKKyAgICAgICAtMjAwMCwgIC0xOTE4LCAgLTE4NDIsICAtMTc3MywgIC0xNzA4LCAgLTE2NDgsICAtMTU5MiwgIC0xNTQwLCAgLTE0OTAsICAtMTQ0MywKKyAgICAgICAtMTM5OCwgIC0xMzU2LCAgLTEzMTYsICAtMTI3NywgIC0xMjQwLCAgLTEyMDUsICAtMTE3MSwgIC0xMTM4LCAgLTExMDYsICAtMTA3NiwKKyAgICAgICAtMTA0NiwgIC0xMDE4LCAgLTk5MCwgICAtOTYzLCAgIC05MzgsICAgLTkxMiwgICAtODg4LCAgIC04NjQsICAgLTg0MSwgICAtODE4LAorICAgICAgIC03OTYsICAgLTc3NSwgICAtNzU0LCAgIC03MzQsICAgLTcxNCwgICAtNjk0LCAgIC02NzUsICAgLTY1NiwgICAtNjM4LCAgIC02MjAsCisgICAgICAgLTYwMywgICAtNTg1LCAgIC01NjgsICAgLTU1MiwgICAtNTM2LCAgIC01MjAsICAgLTUwNCwgICAtNDg5LCAgIC00NzQsICAgLTQ1OSwKKyAgICAgICAtNDQ0LCAgIC00MzAsICAgLTQxNiwgICAtNDAyLCAgIC0zODgsICAgLTM3NSwgICAtMzYxLCAgIC0zNDgsICAgLTMzNSwgICAtMzIzLAorICAgICAgIC0zMTAsICAgLTI5OCwgICAtMjg2LCAgIC0yNzQsICAgLTI2MiwgICAtMjUwLCAgIC0yMzksICAgLTIyOCwgICAtMjE2LCAgIC0yMDUsCisgICAgICAgLTE5NCwgICAtMTg0LCAgIC0xNzMsICAgLTE2MiwgICAtMTUyLCAgIC0xNDIsICAgLTEzMiwgICAtMTIxLCAgIC0xMTIsICAgLTEwMiwKKyAgICAgICAtOTIsICAgIC04MiwgICAgLTczLCAgICAtNjQsICAgIC01NCwgICAgLTQ1LCAgICAtMzYsICAgIC0yNywgICAgLTE4LCAgICAtOSwKKyAgICAgICAwCisgICAgfTsKKyAgICBpbnQxNl90IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAxMDE7IGkrKykKKyAgICB7CisgICAgICAgaWYobGV2ZWwgPD0gTGV2ZWxBcnJheVtpXSkKKyAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYkNvbnZlcnRIRkxldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIENvbnZlcnQgbGV2ZWwgZnJvbSBPcGVuU0wgRVMgZm9ybWF0IHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkNvbnZlcnRIZkxldmVsKGludDE2X3QgSGZsZXZlbCl7CisgICAgaW50MTZfdCBpOworCisgICAgc3RhdGljIExQRlBhaXJfdCBMUEZBcnJheVs5N10gPQorICAgIHsgICAvLyBMaW1pdCByYW5nZSB0byA1MCBmb3IgTFZSRVYgcGFyYW1ldGVyIHJhbmdlCisgICAgICAgIHstMTAwMDAsIDUwfSwgeyAtNTAwMCwgNTAgfSwgeyAtNDAwMCwgNTB9LCAgeyAtMzAwMCwgMTU4fSwgeyAtMjAwMCwgNTAyfSwKKyAgICAgICAgey0xMDAwLCAxNjY2fSx7IC05MDAsIDE4OTd9LCB7IC04MDAsIDIxNjl9LCB7IC03MDAsIDI0OTZ9LCB7IC02MDAsIDI4OTV9LAorICAgICAgICB7LTUwMCwgMzQwMH0sIHsgLTQwMCwgNDA2Nn0sIHsgLTMwMCwgNTAxMX0sIHsgLTIwMCwgNjUzN30sIHsgLTEwMCwgIDk4MjZ9LAorICAgICAgICB7LTk5LCA5ODgxIH0sIHsgLTk4LCA5OTM3IH0sIHsgLTk3LCA5OTk0IH0sIHsgLTk2LCAxMDA1Mn0sIHsgLTk1LCAxMDExMX0sCisgICAgICAgIHstOTQsIDEwMTcxfSwgeyAtOTMsIDEwMjMxfSwgeyAtOTIsIDEwMjkzfSwgeyAtOTEsIDEwMzU2fSwgeyAtOTAsIDEwNDE5fSwKKyAgICAgICAgey04OSwgMTA0ODR9LCB7IC04OCwgMTA1NDl9LCB7IC04NywgMTA2MTZ9LCB7IC04NiwgMTA2ODR9LCB7IC04NSwgMTA3NTN9LAorICAgICAgICB7LTg0LCAxMDgyM30sIHsgLTgzLCAxMDg5NX0sIHsgLTgyLCAxMDk2OH0sIHsgLTgxLCAxMTA0Mn0sIHsgLTgwLCAxMTExN30sCisgICAgICAgIHstNzksIDExMTk0fSwgeyAtNzgsIDExMjcyfSwgeyAtNzcsIDExMzUyfSwgeyAtNzYsIDExNDMzfSwgeyAtNzUsIDExNTE2fSwKKyAgICAgICAgey03NCwgMTE2MDB9LCB7IC03MywgMTE2ODZ9LCB7IC03MiwgMTE3NzR9LCB7IC03MSwgMTE4NjR9LCB7IC03MCwgMTE5NTV9LAorICAgICAgICB7LTY5LCAxMjA0OX0sIHsgLTY4LCAxMjE0NH0sIHsgLTY3LCAxMjI0Mn0sIHsgLTY2LCAxMjM0MX0sIHsgLTY1LCAxMjQ0M30sCisgICAgICAgIHstNjQsIDEyNTQ4fSwgeyAtNjMsIDEyNjU0fSwgeyAtNjIsIDEyNzYzfSwgeyAtNjEsIDEyODc1fSwgeyAtNjAsIDEyOTkwfSwKKyAgICAgICAgey01OSwgMTMxMDd9LCB7IC01OCwgMTMyMjd9LCB7IC01NywgMTMzNTF9LCB7IC01NiwgMTM0Nzd9LCB7IC01NSwgMTM2MDd9LAorICAgICAgICB7LTU0LCAxMzc0MX0sIHsgLTUzLCAxMzg3OH0sIHsgLTUyLCAxNDAxOX0sIHsgLTUxLCAxNDE2NH0sIHsgLTUwLCAxNDMxM30sCisgICAgICAgIHstNDksIDE0NDY3fSwgeyAtNDgsIDE0NjI2fSwgeyAtNDcsIDE0Nzg5fSwgeyAtNDYsIDE0OTU4fSwgeyAtNDUsIDE1MTMyfSwKKyAgICAgICAgey00NCwgMTUzMTJ9LCB7IC00MywgMTU0OTh9LCB7IC00MiwgMTU2OTF9LCB7IC00MSwgMTU4OTB9LCB7IC00MCwgMTYwOTd9LAorICAgICAgICB7LTM5LCAxNjMxMX0sIHsgLTM4LCAxNjUzNH0sIHsgLTM3LCAxNjc2Nn0sIHsgLTM2LCAxNzAwN30sIHsgLTM1LCAxNzI1OX0sCisgICAgICAgIHstMzQsIDE3NTIxfSwgeyAtMzMsIDE3Nzk1fSwgeyAtMzIsIDE4MDgxfSwgeyAtMzEsIDE4MzgxfSwgeyAtMzAsIDE4Njk2fSwKKyAgICAgICAgey0yOSwgMTkwMjd9LCB7IC0yOCwgMTkzNzV9LCB7IC0yNywgMTk3NDJ9LCB7IC0yNiwgMjAxMjl9LCB7IC0yNSwgMjA1NDB9LAorICAgICAgICB7LTI0LCAyMDk3Nn0sIHsgLTIzLCAyMTQzOX0sIHsgLTIyLCAyMTkzNH0sIHsgLTIxLCAyMjQ2M30sIHsgLTIwLCAyMzAzMX0sCisgICAgICAgIHstMTksIDIzNjQzfSwgeyAtMTgsIDIzOTk5fQorICAgIH07CisKKyAgICBmb3IoaSA9IDA7IGkgPCA5NjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoSGZsZXZlbCA8PSBMUEZBcnJheVtpXS5Sb29tX0hGKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBMUEZBcnJheVtpXS5MUEY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiU2V0Um9vbUhmTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIEhGIGxldmVsIHRvIHRoZSBSZXZlcmIuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgbGV2ZWwgICAgICAgbGV2ZWwgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJldmVyYlNldFJvb21IZkxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSb29tSGZMZXZlbCIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldFJvb21IZkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRik7CisKKyAgICBBY3RpdmVQYXJhbXMuTFBGID0gUmV2ZXJiQ29udmVydEhmTGV2ZWwobGV2ZWwpOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKQorICAgIC8vTE9HVigiXHRSZXZlcmJTZXRSb29taGZMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICBwQ29udGV4dC0+U2F2ZWRIZkxldmVsID0gbGV2ZWw7CisgICAgLy9MT0dWKCJcdFJldmVyYlNldEhmUm9vbUxldmVsIGVuZC4uIHNhdmluZyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJHZXRSb29tSGZMZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGxldmVsIGFwcGxpZWQgdG8gdGhlIFJldmVydmIuIE11c3QgZmlyc3QgYmUgY29udmVydGVkIHRvIExWTSBmb3JtYXQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDE2X3QgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworICAgIGludDE2X3QgbGV2ZWw7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIHN0YXJ0LCBzYXZlZCBsZXZlbCBpcyAlZCIsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwpOworCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJvb21IZkxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKworICAgIGxldmVsID0gUmV2ZXJiQ29udmVydEhmTGV2ZWwocENvbnRleHQtPlNhdmVkSGZMZXZlbCk7CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBBY3RpdmVQYXJhbXMuTFBGTCAlZCwgcENvbnRleHQtPlNhdmVkSGZMZXZlbDogJWQsICIKKyAgICAvLyAgICAgImNvbnZlcnRlZCBsZXZlbDogJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYsIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwsIGxldmVsKTsKKworICAgIGlmKEFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJvb21IZkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsIGVuZCIpOworICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYlNldFJldmVyYkxldmVsKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIEFwcGx5IHRoZSBsZXZlbCB0byB0aGUgUmV2ZXJiLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byBMVk0gZm9ybWF0CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGxldmVsICAgICAgIGxldmVsIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBSZXZlcmJTZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7CisgICAgLy9MT0dWKCJcblx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKworICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSZXZlcmJMZXZlbCIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKKyAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKS1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAorICAgIC8vICAgICAgQ29tYmluZWRMZXZlbCwgbGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CisKKyAgICBBY3RpdmVQYXJhbXMuTGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBUcnlpbmcgdG8gc2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKQorICAgIC8vTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworCisgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgZW5kIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsIGlzICVkXG5cbiIsCisgICAgLy8gICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSBsZXZlbCBhcHBsaWVkIHRvIHRoZSBSZXZlcnZiLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byBMVk0gZm9ybWF0CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkdldFJldmVyYkxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKKyAgICBpbnQxNl90IGxldmVsOworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBzdGFydCIpOworCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJldmVyYkxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworCisgICAgLy8gbmVlZHMgdG8gc3VidHJhY3QgbWF4IGxldmVscyBmb3IgYm90aCBSb29tTGV2ZWwgYW5kIFJldmVyYkxldmVsCisgICAgQ29tYmluZWRMZXZlbCA9IChwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCArIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCktTFZSRVZfTUFYX1JFVkVSQl9MRVZFTDsKKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAorICAgIC8vQ29tYmluZWRMZXZlbCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CisgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0TGV2ZWwoQ29tYmluZWRMZXZlbCk7CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKTogQWN0aXZlUGFyYW1zLkxldmVsOiAlZCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWw6ICVkLCAiCisgICAgLy8icENvbnRleHQtPlNhdmVkUm9vbUxldmVsOiAlZCwgQ29tYmluZWRMZXZlbDogJWQsIGNvbnZlcnRlZCBsZXZlbDogJWRcbiIsCisgICAgLy9BY3RpdmVQYXJhbXMuTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCwgQ29tYmluZWRMZXZlbCxsZXZlbCk7CisKKyAgICBpZihBY3RpdmVQYXJhbXMuTGV2ZWwgIT0gbGV2ZWwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJldmVyYkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCBlbmRcbiIpOworCisgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYlNldFJvb21MZXZlbCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgbGV2ZWwgdG8gdGhlIFJldmVyYi4gTXVzdCBmaXJzdCBiZSBjb252ZXJ0ZWQgdG8gTFZNIGZvcm1hdAorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBsZXZlbCAgICAgICBsZXZlbCB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUmV2ZXJiU2V0Um9vbUxldmVsKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKKyAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwpLUxWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgQWN0aXZlUGFyYW1zLkxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwgPSBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIGVuZCIpOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJHZXRSb29tTGV2ZWwoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSBsZXZlbCBhcHBsaWVkIHRvIHRoZSBSZXZlcnZiLiBNdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byBMVk0gZm9ybWF0CisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQxNl90IFJldmVyYkdldFJvb21MZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgaW50MTZfdCBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIHN0YXJ0Iik7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0Um9vbUxldmVsIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisKKyAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKKyAgICBDb21iaW5lZExldmVsID0gKHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLUxWUkVWX01BWF9SRVZFUkJfTEVWRUwpOworICAgIGxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOworCisgICAgLy9MT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCwgTGV2ZWwgPSAlZCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsID0gJWQsICIKKyAgICAvLyAgICAgInBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsID0gJWQsIENvbWJpbmVkTGV2ZWwgPSAlZCwgbGV2ZWwgPSAlZCIsCisgICAgLy8gICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsLAorICAgIC8vICAgICBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCwgQ29tYmluZWRMZXZlbCwgbGV2ZWwpOworCisgICAgaWYoQWN0aXZlUGFyYW1zLkxldmVsICE9IGxldmVsKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSb29tTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCisgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgZW5kIik7CisgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJTZXREZWNheVRpbWUoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIGRlY2F5IHRpbWUgdG8gdGhlIFJldmVyYi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgdGltZSAgICAgICAgZGVjYXkgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJldmVyYlNldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgdGltZSl7CisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBzdGFydCAoJWQpIiwgdGltZSk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlUaW1lIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOworCisgICAgaWYgKHRpbWUgPD0gTFZSRVZfTUFYX1Q2MCkgeworICAgICAgICBBY3RpdmVQYXJhbXMuVDYwID0gKExWTV9VSU5UMTYpdGltZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5UNjAgPSBMVlJFVl9NQVhfVDYwOworICAgIH0KKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5VGltZSIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKworICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPSAoQWN0aXZlUGFyYW1zLlQ2MCAqIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlKS8xMDAwOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCBTYW1wbGVzVG9FeGl0Q291bnQtPiAlZFxuIixwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50KTsKKyAgICBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUgPSAoaW50MTZfdCl0aW1lOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgZW5kIik7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYkdldERlY2F5VGltZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGRlY2F5IHRpbWUgYXBwbGllZCB0byB0aGUgUmV2ZXJ2Yi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3VpbnQzMl90IFJldmVyYkdldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBzdGFydCIpOworCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlY2F5VGltZSIpCisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKworICAgIGlmKEFjdGl2ZVBhcmFtcy5UNjAgIT0gcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKXsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGZhaWwgaWYgdGhlIGRlY2F5IHRpbWUgaXMgc2V0IHRvIG1vcmUgdGhhbiA3MDAwCisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiR2V0RGVjYXlUaW1lKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgQWN0aXZlUGFyYW1zLlQ2MCwgcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKTsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lIGVuZCIpOworICAgIHJldHVybiAodWludDMyX3QpQWN0aXZlUGFyYW1zLlQ2MDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJTZXREZWNheUhmUmF0aW8oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gQXBwbHkgdGhlIEhGIGRlY2F5IHJhdGlvIHRvIHRoZSBSZXZlcmIuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHJhdGlvICAgICAgIHJhdGlvIHRvIGJlIGFwcGxpZWQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBSZXZlcmJTZXREZWNheUhmUmF0aW8oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgcmF0aW8peworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW9lIHN0YXJ0ICglZCkiLCByYXRpbyk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5SGZSYXRpbyIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbyBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisKKyAgICBBY3RpdmVQYXJhbXMuRGFtcGluZyA9IChMVk1fSU5UMTYpKHJhdGlvLzIwKTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5SGZSYXRpbyIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisKKyAgICBwQ29udGV4dC0+U2F2ZWREZWNheUhmUmF0aW8gPSByYXRpbzsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIGVuZCIpOworICAgIHJldHVybjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJHZXREZWNheUhmUmF0aW8oKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IHRoZSBIRiBkZWNheSByYXRpbyBhcHBsaWVkIHRvIHRoZSBSZXZlcnZiLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBSZXZlcmJHZXREZWNheUhmUmF0aW8oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworICAgIC8vTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gc3RhcnQiKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0RGVjYXlIZlJhdGlvIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKKworICAgIGlmKEFjdGl2ZVBhcmFtcy5EYW1waW5nICE9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyAvIDIwKSl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAorICAgICAgICAgQWN0aXZlUGFyYW1zLkRhbXBpbmcsIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyk7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlY2F5SGZSYXRpbyBlbmQiKTsKKyAgICByZXR1cm4gcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYlNldERpZmZ1c2lvbigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgZGlmZnVzaW9uIHRvIHRoZSBSZXZlcmIuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIGxldmVsICAgICAgICBkZWNheSB0byBiZSBhcHBsaWVkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgUmV2ZXJiU2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIHN0YXJ0ICglZCkiLCBsZXZlbCk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKworICAgIEFjdGl2ZVBhcmFtcy5EZW5zaXR5ID0gKExWTV9JTlQxNikobGV2ZWwvMTApOworCisgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGlmZnVzaW9uIikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKworICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiA9IGxldmVsOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gZW5kIik7CisgICAgcmV0dXJuOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYkdldERpZmZ1c2lvbigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGRlY2F5IHRpbWUgYXBwbGllZCB0byB0aGUgUmV2ZXJ2Yi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3QgUmV2ZXJiR2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIHN0YXJ0Iik7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBUZW1wOworCisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERpZmZ1c2lvbiIpCisgICAgLy9MT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworCisgICAgVGVtcCA9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbi8xMCk7CisKKyAgICBpZihBY3RpdmVQYXJhbXMuRGVuc2l0eSAhPSBUZW1wKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREaWZmdXNpb24gaW52YWxpZCB2YWx1ZSAlZCAlZCIsIFRlbXAsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGlmZnVzaW9uIGVuZCIpOworICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWREaWZmdXNpb247Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiU2V0RGVuc2l0eSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBBcHBseSB0aGUgZGVuc2l0eSBsZXZlbCB0aGUgUmV2ZXJiLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vICBsZXZlbCAgICAgICAgZGVjYXkgdG8gYmUgYXBwbGllZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJldmVyYlNldERlbnNpdHkoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpeworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IHN0YXJ0ICglZCkiLCBsZXZlbCk7CisKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVuc2l0eSIpCisgICAgLy9MT0dWKCJcdFJldmVyYlNldERlbnNpdHkgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworCisgICAgQWN0aXZlUGFyYW1zLlJvb21TaXplID0gKExWTV9JTlQxNikoKChsZXZlbCAqIDk5KSAvIDEwMDApICsgMSk7CisKKyAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZW5zaXR5IikKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKKworICAgIHBDb250ZXh0LT5TYXZlZERlbnNpdHkgPSBsZXZlbDsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBlbmQiKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiR2V0RGVuc2l0eSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgdGhlIGRlbnNpdHkgbGV2ZWwgYXBwbGllZCB0byB0aGUgUmV2ZXJ2Yi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludDMyX3QgUmV2ZXJiR2V0RGVuc2l0eShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CisgICAgLy9MT0dWKCJcdFJldmVyYkdldERlbnNpdHkgc3RhcnQiKTsKKworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFRlbXA7CisgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlbnNpdHkiKQorICAgIC8vTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvL0xPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworCisKKyAgICBUZW1wID0gKExWTV9JTlQxNikoKChwQ29udGV4dC0+U2F2ZWREZW5zaXR5ICogOTkpIC8gMTAwMCkgKyAxKTsKKworICAgIGlmKFRlbXAgIT0gQWN0aXZlUGFyYW1zLlJvb21TaXplKXsKKyAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREZW5zaXR5IGludmFsaWQgdmFsdWUgJWQgJWQiLCBUZW1wLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IGVuZCIpOworICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWREZW5zaXR5OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJldmVyYl9Mb2FkUHJlc2V0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIExvYWQgYSB0aGUgbmV4dCBwcmVzZXQKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLworLy8gT3V0cHV0czoKKy8vCisvLyBTaWRlIEVmZmVjdHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgUmV2ZXJiX0xvYWRQcmVzZXQoUmV2ZXJiQ29udGV4dCAgICpwQ29udGV4dCkKK3sKKyAgICAvL1RPRE86IGFkZCByZWZsZWN0aW9ucyBkZWxheSwgbGV2ZWwgYW5kIHJldmVyYiBkZWxheSB3aGVuIGVhcmx5IHJlZmxlY3Rpb25zIGFyZQorICAgIC8vIGltcGxlbWVudGVkCisgICAgcENvbnRleHQtPmN1clByZXNldCA9IHBDb250ZXh0LT5uZXh0UHJlc2V0OworCisgICAgaWYgKHBDb250ZXh0LT5jdXJQcmVzZXQgIT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CisgICAgICAgIGNvbnN0IHRfcmV2ZXJiX3NldHRpbmdzICpwcmVzZXQgPSAmc1JldmVyYlByZXNldHNbcENvbnRleHQtPmN1clByZXNldF07CisgICAgICAgIFJldmVyYlNldFJvb21MZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yb29tTGV2ZWwpOworICAgICAgICBSZXZlcmJTZXRSb29tSGZMZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yb29tSEZMZXZlbCk7CisgICAgICAgIFJldmVyYlNldERlY2F5VGltZShwQ29udGV4dCwgcHJlc2V0LT5kZWNheVRpbWUpOworICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHByZXNldC0+ZGVjYXlIRlJhdGlvKTsKKyAgICAgICAgLy9yZWZsZWN0aW9uc0xldmVsCisgICAgICAgIC8vcmVmbGVjdGlvbnNEZWxheQorICAgICAgICBSZXZlcmJTZXRSZXZlcmJMZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yZXZlcmJMZXZlbCk7CisgICAgICAgIC8vIHJldmVyYkRlbGF5CisgICAgICAgIFJldmVyYlNldERpZmZ1c2lvbihwQ29udGV4dCwgcHJlc2V0LT5kaWZmdXNpb24pOworICAgICAgICBSZXZlcmJTZXREZW5zaXR5KHBDb250ZXh0LCBwcmVzZXQtPmRlbnNpdHkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmV2ZXJiX2dldFBhcmFtZXRlcigpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6CisvLyBHZXQgYSBSZXZlcmIgcGFyYW1ldGVyCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0ICAgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorLy8gIHBQYXJhbSAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlcgorLy8gIHBWYWx1ZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisvLyAgcFZhbHVlU2l6ZSAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUgc2l6ZTogbWF4aW11bSBzaXplIGFzIGlucHV0CisvLworLy8gT3V0cHV0czoKKy8vICAqcFZhbHVlIHVwZGF0ZWQgd2l0aCBwYXJhbWV0ZXIgdmFsdWUKKy8vICAqcFZhbHVlU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKKy8vCisvLworLy8gU2lkZSBFZmZlY3RzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgKnBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpeworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKKyAgICBjaGFyICpuYW1lOworICAgIHRfcmV2ZXJiX3NldHRpbmdzICpwUHJvcGVydGllczsKKworICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgaWYgKHBDb250ZXh0LT5wcmVzZXQpIHsKKyAgICAgICAgaWYgKHBhcmFtICE9IFJFVkVSQl9QQVJBTV9QUkVTRVQgfHwgKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSBwQ29udGV4dC0+bmV4dFByZXNldDsKKyAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9QUkVTRVQsIHByZXNldCAlZCIsIHBDb250ZXh0LT5uZXh0UHJlc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dpdGNoIChwYXJhbSl7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUxICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTEyICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUzICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNCAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNSAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTYgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNyAlZCIsICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemU4ICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTkgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplMTAgJWQiLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih0X3JldmVyYl9zZXR0aW5ncykpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTExICVkIiwgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodF9yZXZlcmJfc2V0dGluZ3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyAqKSBwVmFsdWU7CisKKyAgICBzd2l0Y2ggKHBhcmFtKXsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWwgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsID0gUmV2ZXJiR2V0Um9vbUhmTGV2ZWwocENvbnRleHQpOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5VGltZSA9IFJldmVyYkdldERlY2F5VGltZShwQ29udGV4dCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVjYXlIRlJhdGlvID0gUmV2ZXJiR2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0xldmVsID0gMDsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0RlbGF5ID0gMDsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheSA9IDA7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiTGV2ZWwgPSBSZXZlcmJHZXRSZXZlcmJMZXZlbChwQ29udGV4dCk7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGlmZnVzaW9uID0gUmV2ZXJiR2V0RGlmZnVzaW9uKHBDb250ZXh0KTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZW5zaXR5ID0gUmV2ZXJiR2V0RGVuc2l0eShwQ29udGV4dCk7CisKKyAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIHJvb21MZXZlbCAgICAgICAgJWQiLAorICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWwpOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcm9vbUhGTGV2ZWwgICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKKyAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRlY2F5VGltZSAgICAgICAgJWQiLAorICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheVRpbWUpOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgZGVjYXlIRlJhdGlvICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5SEZSYXRpbyk7CisgICAgICAgICAgICBMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZWZsZWN0aW9uc0xldmVsICVkIiwKKyAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNMZXZlbCk7CisgICAgICAgICAgICBMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZWZsZWN0aW9uc0RlbGF5ICVkIiwKKyAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheSk7CisgICAgICAgICAgICBMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZXZlcmJEZWxheSAgICAgICVkIiwKKyAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmV2ZXJiRGVsYXkpOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcmV2ZXJiTGV2ZWwgICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkxldmVsKTsKKyAgICAgICAgICAgIExPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIGRpZmZ1c2lvbiAgICAgICAgJWQiLAorICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kaWZmdXNpb24pOworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgZGVuc2l0eSAgICAgICAgICAlZCIsCisgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlbnNpdHkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21MZXZlbChwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21IZkxldmVsKHBDb250ZXh0KTsKKworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERlY2F5VGltZShwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXREZWNheUhmUmF0aW8ocENvbnRleHQpOworCisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJT04gVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJldmVyYkxldmVsKHBDb250ZXh0KTsKKworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERpZmZ1c2lvbihwQ29udGV4dCk7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiBWYWx1ZSBpcyAlZCIsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXREZW5zaXR5KHBDb250ZXh0KTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFTlNJVFkgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gICAgICAgICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDA7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFJldmVyYl9nZXRQYXJhbWV0ZXIgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXZlcmJfc2V0UGFyYW1ldGVyKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZToKKy8vIFNldCBhIFJldmVyYiBwYXJhbWV0ZXIKKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQgICAgICAgICAtIGhhbmRsZSB0byBpbnN0YW5jZSBkYXRhCisvLyAgcFBhcmFtICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisvLyAgcFZhbHVlICAgICAgICAgICAtIHBvaW50ZXIgdG8gdmFsdWUKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKXsKKyAgICBpbnQgc3RhdHVzID0gMDsKKyAgICBpbnQxNl90IGxldmVsOworICAgIGludDE2X3QgcmF0aW87CisgICAgdWludDMyX3QgdGltZTsKKyAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7CisgICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtVGVtcCsrOworCisgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIgc3RhcnQiKTsKKyAgICBpZiAocENvbnRleHQtPnByZXNldCkgeworICAgICAgICBpZiAocGFyYW0gIT0gUkVWRVJCX1BBUkFNX1BSRVNFVCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICB1aW50MTZfdCBwcmVzZXQgPSAqKHVpbnQxNl90ICopcFZhbHVlOworICAgICAgICBMT0dWKCJzZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgcHJlc2V0KTsKKyAgICAgICAgaWYgKHByZXNldCA+IFJFVkVSQl9QUkVTRVRfTEFTVCkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm5leHRQcmVzZXQgPSBwcmVzZXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAocGFyYW0peworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMiKTsKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3NldHRpbmdzICopIHBWYWx1ZTsKKyAgICAgICAgICAgIFJldmVyYlNldFJvb21MZXZlbChwQ29udGV4dCwgcFByb3BlcnRpZXMtPnJvb21MZXZlbCk7CisgICAgICAgICAgICBSZXZlcmJTZXRSb29tSGZMZXZlbChwQ29udGV4dCwgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKKyAgICAgICAgICAgIFJldmVyYlNldERlY2F5VGltZShwQ29udGV4dCwgcFByb3BlcnRpZXMtPmRlY2F5VGltZSk7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW8pOworICAgICAgICAgICAgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbCk7CisgICAgICAgICAgICBSZXZlcmJTZXREaWZmdXNpb24ocENvbnRleHQsIHBQcm9wZXJ0aWVzLT5kaWZmdXNpb24pOworICAgICAgICAgICAgUmV2ZXJiU2V0RGVuc2l0eShwQ29udGV4dCwgcFByb3BlcnRpZXMtPmRlbnNpdHkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgdmFsdWUgaXMgJWQiLCBsZXZlbCk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUxldmVsIik7CisgICAgICAgICAgICBSZXZlcmJTZXRSb29tTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJvb21MZXZlbCIpOworICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSb29tSGZMZXZlbCIpOworICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJvb21IZkxldmVsIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICAgICAgdGltZSA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FIHZhbHVlIGlzICVkIiwgdGltZSk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheVRpbWUocENvbnRleHQsIHRpbWUpOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8gdmFsdWUgaXMgJWQiLCByYXRpbyk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICBSZXZlcmJTZXREZWNheUhmUmF0aW8ocENvbnRleHQsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlY2F5SGZSYXRpbyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXRSZXZlcmJMZXZlbCIpOworICAgICAgICAgICAgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwocENvbnRleHQsIGxldmVsKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJldmVyYkxldmVsIik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046CisgICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREaWZmdXNpb24iKTsKKyAgICAgICAgICAgIFJldmVyYlNldERpZmZ1c2lvbihwQ29udGV4dCwgcmF0aW8pOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGlmZnVzaW9uIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfREVOU0lUWSB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICBSZXZlcmJTZXREZW5zaXR5KHBDb250ZXh0LCByYXRpbyk7CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9MT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgcmV0dXJuIHN0YXR1czsKK30gLyogZW5kIFJldmVyYl9zZXRQYXJhbWV0ZXIgKi8KKworfSAvLyBuYW1lc3BhY2UKK30gLy8gbmFtZXNwYWNlCisKKy8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogUHJvY2VzcyAqLworZXh0ZXJuICJDIiBpbnQgUmV2ZXJiX3Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90ICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqb3V0QnVmZmVyKXsKKyAgICBhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqKSBzZWxmOworICAgIGludCAgICBzdGF0dXMgPSAwOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9wcm9jZXNzKCkgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKKyAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX3Byb2Nlc3MoKSBFUlJPUiBOVUxMIElOUFVUIFBPSU5URVIgT1IgRlJBTUUgQ09VTlQgSVMgV1JPTkciKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgaWYoIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKXsKKyAgICAgICAgICAgIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIEVmZmVjdCBpcyBiZWluZyBzdG9wcGVkICVkIiwgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCk7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIEVmZmVjdCBpcyBiZWluZyBzdG9wcGVkIik7CisgICAgICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgICAgIH0KKyAgICB9CisgICAgLy9MT0dWKCJcdFJldmVyYl9wcm9jZXNzKCkgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZnJhbWVzIiwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICAvKiBQcm9jZXNzIGFsbCB0aGUgYXZhaWxhYmxlIGZyYW1lcywgYmxvY2sgcHJvY2Vzc2luZyBpcyBoYW5kbGVkIGludGVybmFsTFkgYnkgdGhlIExWTSBidW5kbGUgKi8KKyAgICBzdGF0dXMgPSBwcm9jZXNzKCAgICAoTFZNX0lOVDE2ICopaW5CdWZmZXItPnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopb3V0QnVmZmVyLT5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30gICAvKiBlbmQgUmV2ZXJiX3Byb2Nlc3MgKi8KKworLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBDb21tYW5kICovCitleHRlcm4gIkMiIGludCBSZXZlcmJfY29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3QgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBSZXBseURhdGEpeworICAgIGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICopIHNlbGY7CisgICAgaW50IHJldHNpemU7CisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgSU5QVVRTIGFyZTogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSl7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0lOSVQgc3RhcnQiKTsKKworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfSU5JVDogRVJST1IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRToKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9DT05GSUdVUkUgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgICA9PSBOVUxMfHwKKyAgICAgICAgICAgICAgICBjbWRTaXplICAgICAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KXx8CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSAgPT0gTlVMTHx8CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9DT05GSUdVUkU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gUmV2ZXJiX2NvbmZpZ3VyZShwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfUkVTRVQgc3RhcnQiKTsKKyAgICAgICAgICAgIFJldmVyYl9jb25maWd1cmUocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06eworICAgICAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKXsKKyAgICAgICAgICAgICAgICBMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKworICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOworCisgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKworICAgICAgICAgICAgaW50IHZvZmZzZXQgPSAoKHAtPnBzaXplIC0gMSkgLyBzaXplb2YoaW50MzJfdCkgKyAxKSAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6UmV2ZXJiX2dldFBhcmFtZXRlcihwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QgICopJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKworICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCisgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSk7CisKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTp7CisKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKKyAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCisgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCisgICAgICAgICAgICAgICAgICAgIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IChpbnQpc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisKKyAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgICAgIExPR1YoIlx0NExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0xPR1YoIlx0bjVSZXZlcmJfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCisgICAgICAgICAgICAvLyAgICAgICAgIlx0c2l6ZW9mKGVmZmVjdF9wYXJhbV90KSBpcyAgJWRcbiIKKyAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT5wc2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgLy8gICAgICAgICJcdHAtPnZzaXplIGlzICVkIgorICAgICAgICAgICAgLy8gICAgICAgICJcbiIsCisgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CisKKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlJldmVyYl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgICAgICAvL0xPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFIHN0YXJ0Iik7CisKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUi1FZmZlY3QgaXMgYWxyZWFkeSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBwQ29udGV4dC0+YkVuYWJsZWQgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLworICAgICAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRUZGRUNUX0NNRF9FTkFCTEUiKQorICAgICAgICAgICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9CisgICAgICAgICAgICAgICAgICAgIChBY3RpdmVQYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpLzEwMDA7CisgICAgICAgICAgICAvL0xPR1YoIlx0RUZGRUNUX0NNRF9FTkFCTEUgU2FtcGxlc1RvRXhpdENvdW50ID0gJWQiLCBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFIHN0YXJ0Iik7CisKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICAgICAgICAgICAgICAgTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUi1FZmZlY3QgaXMgbm90IHlldCBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBwQ29udGV4dC0+YkVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKKyAgICAgICAgLy9MT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX0RFVklDRS9FRkZFQ1RfQ01EX1NFVF9WT0xVTUUvRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERSBzdGFydCIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICJERUZBVUxUIHN0YXJ0ICVkIEVSUk9SIixjbWRDb2RlKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vTE9HVigiXHRSZXZlcmJfY29tbWFuZCBlbmRcblxuIik7CisgICAgcmV0dXJuIDA7Cit9ICAgIC8qIGVuZCBSZXZlcmJfY29tbWFuZCAqLworCisvLyBlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBSZXZlcmIgZWZmZWN0Citjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2UgPSB7CisgICAgUmV2ZXJiX3Byb2Nlc3MsCisgICAgUmV2ZXJiX2NvbW1hbmQKK307ICAgIC8qIGVuZCBnUmV2ZXJiSW50ZXJmYWNlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzOTkyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUUkVWRVJCX0hfCisjZGVmaW5lIEFORFJPSURfRUZGRUNUUkVWRVJCX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RFbnZpcm9ubWVudGFsUmV2ZXJiQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0UHJlc2V0UmV2ZXJiQXBpLmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICA1CisjZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgIDI1NgorI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICA3MDAwCisjZGVmaW5lIExWUkVWX01BWF9SRVZFUkJfTEVWRUwgIDIwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX0ZSQU1FX1NJWkUgICAgMjU2MAorI2RlZmluZSBMVlJFVl9DVVBfTE9BRF9BUk05RSAgICA0NzAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIExWUkVWX01FTV9VU0FHRSAgICAgICAgIDcxKyhMVlJFVl9NQVhfRlJBTUVfU0laRT4+NykgICAgIC8vIEV4cHJlc3NlZCBpbiBrQgorLy8jZGVmaW5lIExWTV9QQ00KKwordHlwZWRlZiBzdHJ1Y3QgX0xQRlBhaXJfdAoreworICAgIGludDE2X3QgUm9vbV9IRjsKKyAgICBpbnQxNl90IExQRjsKK30gTFBGUGFpcl90OworI2lmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVFJFVkVSQl9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0FuZHJvaWQubWtfIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmE3MWVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BbmRyb2lkLm1rXwpAQCAtMCwwICsxLDY2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBUZXN0IFJldmVyYiBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCUVmZmVjdFJldmVyYi5jLmFybSBcCisJRWZmZWN0c01hdGguYy5hcm0KK0xPQ0FMX0NGTEFHUys9IC1PMgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngKK0xPQ0FMX01PRFVMRTo9IGxpYnJldmVyYnRlc3QKKworaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKK0xPQ0FMX0xETElCUyArPSAtbGRsCitlbmRpZgorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAorZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIFRlc3QgRXF1YWxpemVyIGxpYnJhcnkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJRWZmZWN0c01hdGguYy5hcm0gXAorCUVmZmVjdEVxdWFsaXplci5jcHAgXAorCUF1ZGlvQmlxdWFkRmlsdGVyLmNwcC5hcm0gXAorCUF1ZGlvQ29lZkludGVycG9sYXRvci5jcHAuYXJtIFwKKwlBdWRpb1BlYWtpbmdGaWx0ZXIuY3BwLmFybSBcCisJQXVkaW9TaGVsdmluZ0ZpbHRlci5jcHAuYXJtIFwKKwlBdWRpb0VxdWFsaXplci5jcHAuYXJtCisKK0xPQ0FMX0NGTEFHUys9IC1PMgorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMKKworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NIQVJFRF9MSUJSQVJJRVMpL3NvdW5kZngKK0xPQ0FMX01PRFVMRTo9IGxpYmVxdWFsaXplcnRlc3QKKworaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKK0xPQ0FMX0xETElCUyArPSAtbGRsCitlbmRpZgorCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAorZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGdyYXBoaWNzIGNvcmVjZykKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQmlxdWFkRmlsdGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9CaXF1YWRGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTE3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQmlxdWFkRmlsdGVyLmNwcApAQCAtMCwwICsxLDI2MCBAQAorLyogLy9kZXZpY2Uvc2VydmVycy9BdWRpb0ZsaW5nZXIvQXVkaW9CaXF1YWRGaWx0ZXIuY3BwCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIkF1ZGlvQmlxdWFkRmlsdGVyLmgiCisKKyNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKKyNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBhdWRpb19jb2VmX3QgQXVkaW9CaXF1YWRGaWx0ZXI6OklERU5USVRZX0NPRUZTW0F1ZGlvQmlxdWFkRmlsdGVyOjpOVU1fQ09FRlNdID0geyBBVURJT19DT0VGX09ORSwgMCwgMCwgMCwgMCB9OworCitBdWRpb0JpcXVhZEZpbHRlcjo6QXVkaW9CaXF1YWRGaWx0ZXIoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpIHsKKyAgICBjb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICByZXNldCgpOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpjb25maWd1cmUoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpIHsKKyAgICBhc3NlcnQobkNoYW5uZWxzID4gMCAmJiBuQ2hhbm5lbHMgPD0gTUFYX0NIQU5ORUxTKTsKKyAgICBhc3NlcnQoc2FtcGxlUmF0ZSA+IDApOworICAgIG1OdW1DaGFubmVscyAgPSBuQ2hhbm5lbHM7CisgICAgbU1heERlbHRhID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oTUFYX0RFTFRBX1BFUl9TRUMpCisgICAgICAgICAgICAgICAgKiBBVURJT19DT0VGX09ORQorICAgICAgICAgICAgICAgIC8gc2FtcGxlUmF0ZTsKKyAgICBjbGVhcigpOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpyZXNldCgpIHsKKyAgICBtZW1jcHkobUNvZWZzLCBJREVOVElUWV9DT0VGUywgc2l6ZW9mKG1Db2VmcykpOworICAgIG1Db2VmRGlydHlCaXRzID0gMDsKKyAgICBzZXRTdGF0ZShTVEFURV9CWVBBU1MpOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpjbGVhcigpIHsKKyAgICBtZW1zZXQobURlbGF5cywgMCwgc2l6ZW9mKG1EZWxheXMpKTsKK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6c2V0Q29lZnMoY29uc3QgYXVkaW9fY29lZl90IGNvZWZzW05VTV9DT0VGU10sIGJvb2wgaW1tZWRpYXRlKSB7CisgICAgbWVtY3B5KG1UYXJnZXRDb2VmcywgY29lZnMsIHNpemVvZihtVGFyZ2V0Q29lZnMpKTsKKyAgICBpZiAobVN0YXRlICYgU1RBVEVfRU5BQkxFRF9NQVNLKSB7CisgICAgICAgIGlmIChVTkxJS0VMWShpbW1lZGlhdGUpKSB7CisgICAgICAgICAgICBtZW1jcHkobUNvZWZzLCBjb2Vmcywgc2l6ZW9mKG1Db2VmcykpOworICAgICAgICAgICAgc2V0U3RhdGUoU1RBVEVfTk9STUFMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldFN0YXRlKFNUQVRFX1RSQU5TSVRJT05fVE9fTk9STUFMKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzcyhjb25zdCBhdWRpb19zYW1wbGVfdCBpbltdLCBhdWRpb19zYW1wbGVfdCBvdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKyAgICAodGhpcy0+Km1DdXJQcm9jZXNzRnVuYykoaW4sIG91dCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OmVuYWJsZShib29sIGltbWVkaWF0ZSkgeworICAgIGlmIChVTkxJS0VMWShpbW1lZGlhdGUpKSB7CisgICAgICAgIG1lbWNweShtQ29lZnMsIG1UYXJnZXRDb2Vmcywgc2l6ZW9mKG1Db2VmcykpOworICAgICAgICBzZXRTdGF0ZShTVEFURV9OT1JNQUwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX1RSQU5TSVRJT05fVE9fTk9STUFMKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OmRpc2FibGUoYm9vbCBpbW1lZGlhdGUpIHsKKyAgICBpZiAoVU5MSUtFTFkoaW1tZWRpYXRlKSkgeworICAgICAgICBtZW1jcHkobUNvZWZzLCBJREVOVElUWV9DT0VGUywgc2l6ZW9mKG1Db2VmcykpOworICAgICAgICBzZXRTdGF0ZShTVEFURV9CWVBBU1MpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFN0YXRlKFNUQVRFX1RSQU5TSVRJT05fVE9fQllQQVNTKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnNldFN0YXRlKHN0YXRlX3Qgc3RhdGUpIHsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBTVEFURV9CWVBBU1M6CisgICAgICBtQ3VyUHJvY2Vzc0Z1bmMgPSAmQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3NfYnlwYXNzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFURV9UUkFOU0lUSU9OX1RPX0JZUEFTUzoKKyAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICBtQ3VyUHJvY2Vzc0Z1bmMgPSAmQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3NfdHJhbnNpdGlvbl9ieXBhc3NfbW9ubzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1DdXJQcm9jZXNzRnVuYyA9ICZBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc190cmFuc2l0aW9uX2J5cGFzc19tdWx0aTsKKyAgICAgIH0KKyAgICAgIG1Db2VmRGlydHlCaXRzID0gKDEgPDwgTlVNX0NPRUZTKSAtIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX1RSQU5TSVRJT05fVE9fTk9STUFMOgorICAgICAgaWYgKG1OdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgIG1DdXJQcm9jZXNzRnVuYyA9ICZBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc190cmFuc2l0aW9uX25vcm1hbF9tb25vOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1clByb2Nlc3NGdW5jID0gJkF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX3RyYW5zaXRpb25fbm9ybWFsX211bHRpOworICAgICAgfQorICAgICAgbUNvZWZEaXJ0eUJpdHMgPSAoMSA8PCBOVU1fQ09FRlMpIC0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBVEVfTk9STUFMOgorICAgICAgaWYgKG1OdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgIG1DdXJQcm9jZXNzRnVuYyA9ICZBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc19ub3JtYWxfbW9ubzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1DdXJQcm9jZXNzRnVuYyA9ICZBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc19ub3JtYWxfbXVsdGk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgbVN0YXRlID0gc3RhdGU7Cit9CisKK2Jvb2wgQXVkaW9CaXF1YWRGaWx0ZXI6OnVwZGF0ZUNvZWZzKGNvbnN0IGF1ZGlvX2NvZWZfdCBjb2Vmc1tOVU1fQ09FRlNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKyAgICBpbnQ2NF90IG1heERlbHRhID0gbU1heERlbHRhICogZnJhbWVDb3VudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DT0VGUzsgKytpKSB7CisgICAgICAgIGlmIChtQ29lZkRpcnR5Qml0cyAmICgxPDxpKSkgeworICAgICAgICAgICAgYXVkaW9fY29lZl90IGRpZmYgPSBjb2Vmc1tpXSAtIG1Db2Vmc1tpXTsKKyAgICAgICAgICAgIGlmIChkaWZmID4gbWF4RGVsdGEpIHsKKyAgICAgICAgICAgICAgICBtQ29lZnNbaV0gKz0gbWF4RGVsdGE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAtbWF4RGVsdGEpIHsKKyAgICAgICAgICAgICAgICBtQ29lZnNbaV0gLT0gbWF4RGVsdGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Db2Vmc1tpXSA9IGNvZWZzW2ldOworICAgICAgICAgICAgICAgIG1Db2VmRGlydHlCaXRzIF49ICgxPDxpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbUNvZWZEaXJ0eUJpdHMgPT0gMDsKK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc19ieXBhc3MoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKyAgICAvLyBUaGUgY29tbW9uIGNhc2UgaXMgaW4tcGxhY2UgcHJvY2Vzc2luZywgYmVjYXVzZSB0aGlzIGlzIHdoYXQgdGhlIEVRIGRvZXMuCisgICAgaWYgKFVOTElLRUxZKGluICE9IG91dCkpIHsKKyAgICAgICAgbWVtY3B5KG91dCwgaW4sIGZyYW1lQ291bnQgKiBtTnVtQ2hhbm5lbHMgKiBzaXplb2YoYXVkaW9fc2FtcGxlX3QpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3Nfbm9ybWFsX21vbm8oY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KSB7CisgICAgc2l6ZV90IG5GcmFtZXMgPSBmcmFtZUNvdW50OworICAgIGF1ZGlvX3NhbXBsZV90IHgxID0gbURlbGF5c1swXVswXTsKKyAgICBhdWRpb19zYW1wbGVfdCB4MiA9IG1EZWxheXNbMF1bMV07CisgICAgYXVkaW9fc2FtcGxlX3QgeTEgPSBtRGVsYXlzWzBdWzJdOworICAgIGF1ZGlvX3NhbXBsZV90IHkyID0gbURlbGF5c1swXVszXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYjAgPSBtQ29lZnNbMF07CisgICAgY29uc3QgYXVkaW9fY29lZl90IGIxID0gbUNvZWZzWzFdOworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBiMiA9IG1Db2Vmc1syXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYTEgPSBtQ29lZnNbM107CisgICAgY29uc3QgYXVkaW9fY29lZl90IGEyID0gbUNvZWZzWzRdOworICAgIHdoaWxlIChuRnJhbWVzLS0gPiAwKSB7CisgICAgICAgIGF1ZGlvX3NhbXBsZV90IHgwID0gKihpbisrKTsKKyAgICAgICAgYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QgYWNjOworICAgICAgICBhY2MgPSBtdWxfY29lZl9zYW1wbGUoYjAsIHgwKTsKKyAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGIxLCB4MSwgYWNjKTsKKyAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGIyLCB4MiwgYWNjKTsKKyAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGExLCB5MSwgYWNjKTsKKyAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGEyLCB5MiwgYWNjKTsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgeTAgPSBjb2VmX3NhbXBsZV9hY2NfdG9fc2FtcGxlKGFjYyk7CisgICAgICAgIHkyID0geTE7CisgICAgICAgIHkxID0geTA7CisgICAgICAgIHgyID0geDE7CisgICAgICAgIHgxID0geDA7CisgICAgICAgICgqb3V0KyspID0geTA7CisgICAgfQorICAgIG1EZWxheXNbMF1bMF0gPSB4MTsKKyAgICBtRGVsYXlzWzBdWzFdID0geDI7CisgICAgbURlbGF5c1swXVsyXSA9IHkxOworICAgIG1EZWxheXNbMF1bM10gPSB5MjsKK30KKwordm9pZCBBdWRpb0JpcXVhZEZpbHRlcjo6cHJvY2Vzc190cmFuc2l0aW9uX25vcm1hbF9tb25vKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKyAgICBpZiAodXBkYXRlQ29lZnMobVRhcmdldENvZWZzLCBmcmFtZUNvdW50KSkgeworICAgICAgICBzZXRTdGF0ZShTVEFURV9OT1JNQUwpOworICAgIH0KKyAgICBwcm9jZXNzX25vcm1hbF9tb25vKGluLCBvdXQsIGZyYW1lQ291bnQpOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX3RyYW5zaXRpb25fYnlwYXNzX21vbm8oY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgIHsKKyAgaWYgKHVwZGF0ZUNvZWZzKElERU5USVRZX0NPRUZTLCBmcmFtZUNvdW50KSkgeworICAgICAgc2V0U3RhdGUoU1RBVEVfTk9STUFMKTsKKyAgfQorICBwcm9jZXNzX25vcm1hbF9tb25vKGluLCBvdXQsIGZyYW1lQ291bnQpOworfQorCit2b2lkIEF1ZGlvQmlxdWFkRmlsdGVyOjpwcm9jZXNzX25vcm1hbF9tdWx0aShjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCkgeworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBiMCA9IG1Db2Vmc1swXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYjEgPSBtQ29lZnNbMV07CisgICAgY29uc3QgYXVkaW9fY29lZl90IGIyID0gbUNvZWZzWzJdOworICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCBhMSA9IG1Db2Vmc1szXTsKKyAgICBjb25zdCBhdWRpb19jb2VmX3QgYTIgPSBtQ29lZnNbNF07CisgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IG1OdW1DaGFubmVsczsgKytjaCkgeworICAgICAgICBzaXplX3QgbkZyYW1lcyA9IGZyYW1lQ291bnQ7CisgICAgICAgIGF1ZGlvX3NhbXBsZV90IHgxID0gbURlbGF5c1tjaF1bMF07CisgICAgICAgIGF1ZGlvX3NhbXBsZV90IHgyID0gbURlbGF5c1tjaF1bMV07CisgICAgICAgIGF1ZGlvX3NhbXBsZV90IHkxID0gbURlbGF5c1tjaF1bMl07CisgICAgICAgIGF1ZGlvX3NhbXBsZV90IHkyID0gbURlbGF5c1tjaF1bM107CisgICAgICAgIHdoaWxlIChuRnJhbWVzLS0gPiAwKSB7CisgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCB4MCA9ICppbjsKKyAgICAgICAgICAgIGF1ZGlvX2NvZWZfc2FtcGxlX2FjY190IGFjYzsKKyAgICAgICAgICAgIGFjYyA9IG11bF9jb2VmX3NhbXBsZShiMCwgeDApOworICAgICAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGIxLCB4MSwgYWNjKTsKKyAgICAgICAgICAgIGFjYyA9IG1hY19jb2VmX3NhbXBsZShiMiwgeDIsIGFjYyk7CisgICAgICAgICAgICBhY2MgPSBtYWNfY29lZl9zYW1wbGUoYTEsIHkxLCBhY2MpOworICAgICAgICAgICAgYWNjID0gbWFjX2NvZWZfc2FtcGxlKGEyLCB5MiwgYWNjKTsKKyAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90IHkwID0gY29lZl9zYW1wbGVfYWNjX3RvX3NhbXBsZShhY2MpOworICAgICAgICAgICAgeTIgPSB5MTsKKyAgICAgICAgICAgIHkxID0geTA7CisgICAgICAgICAgICB4MiA9IHgxOworICAgICAgICAgICAgeDEgPSB4MDsKKyAgICAgICAgICAgICpvdXQgPSB5MDsKKyAgICAgICAgICAgIGluICs9IG1OdW1DaGFubmVsczsKKyAgICAgICAgICAgIG91dCArPSBtTnVtQ2hhbm5lbHM7CisgICAgICAgIH0KKyAgICAgICAgbURlbGF5c1tjaF1bMF0gPSB4MTsKKyAgICAgICAgbURlbGF5c1tjaF1bMV0gPSB4MjsKKyAgICAgICAgbURlbGF5c1tjaF1bMl0gPSB5MTsKKyAgICAgICAgbURlbGF5c1tjaF1bM10gPSB5MjsKKyAgICAgICAgaW4gLT0gZnJhbWVDb3VudCAqIG1OdW1DaGFubmVscyAtIDE7CisgICAgICAgIG91dCAtPSBmcmFtZUNvdW50ICogbU51bUNoYW5uZWxzIC0gMTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3NfdHJhbnNpdGlvbl9ub3JtYWxfbXVsdGkoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KSB7CisgICAgaWYgKHVwZGF0ZUNvZWZzKG1UYXJnZXRDb2VmcywgZnJhbWVDb3VudCkpIHsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfTk9STUFMKTsKKyAgICB9CisgICAgcHJvY2Vzc19ub3JtYWxfbXVsdGkoaW4sIG91dCwgZnJhbWVDb3VudCk7Cit9CisKK3ZvaWQgQXVkaW9CaXF1YWRGaWx0ZXI6OnByb2Nlc3NfdHJhbnNpdGlvbl9ieXBhc3NfbXVsdGkoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KSAgeworICAgIGlmICh1cGRhdGVDb2VmcyhJREVOVElUWV9DT0VGUywgZnJhbWVDb3VudCkpIHsKKyAgICAgICAgc2V0U3RhdGUoU1RBVEVfTk9STUFMKTsKKyAgICB9CisgICAgcHJvY2Vzc19ub3JtYWxfbXVsdGkoaW4sIG91dCwgZnJhbWVDb3VudCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9CaXF1YWRGaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9CaXF1YWRGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBlMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0JpcXVhZEZpbHRlci5oCkBAIC0wLDAgKzEsMTgwIEBACisvKiAvL2RldmljZS9pbmNsdWRlL3NlcnZlci9BdWRpb0ZsaW5nZXIvQXVkaW9CaXF1YWRGaWx0ZXIuaAorKioKKyoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fQklRVUFEX0ZJTFRFUl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fQklRVUFEX0ZJTFRFUl9ICisKKyNpbmNsdWRlICJBdWRpb0NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyBBIGJpcXVhZCBmaWx0ZXIuCisvLyBJbXBsZW1lbnRzIHRoZSByZWN1cnNpb24geVtuXT1hMCp5W24tMV0rYTEqeVtuLTJdK2IwKnhbbl0rYjEqeFtuLTFdK2IyKnhbbi0yXQorLy8gKHRoZSBhMCBhbmQgYTEgY29lZmZpY2llbnRzIGhhdmUgYW4gb3Bwb3NpdGUgc2lnbiB0byB0aGUgY29tbW9uIGNvbnZlbnRpb24pCisvLyBUaGUgZmlsdGVyIHdvcmtzIG9uIGZpeGVkIHNpemVkIGJsb2NrcyBvZiBkYXRhIChmcmFtZUNvdW50IG11bHRpLWNoYW5uZWwKKy8vIHNhbXBsZXMsIGFzIGRlZmluZWQgZHVyaW5nIGNvbnN0cnVjdGlvbikuIEFuIGFyYml0cmFyeSBudW1iZXIgb2YgaW50ZXJsYWNlZAorLy8gY2hhbm5lbHMgaXMgc3VwcG9ydGVkLgorLy8gRmlsdGVyIGNhbiBvcGVyYXRlIGluIGFuIGVuYWJsZWQgKGFjdGl2ZSkgb3IgZGlzYWJsZWQgKGJ5cGFzc2VkKSBzdGF0ZXMuCisvLyBBIG1lY2hhbmlzbSBmb3Igc3VwcHJlc3Npb24gb2YgYXJ0aWZhY3RzIGNhdXNlZCBieSBhYnJ1cHQgY29lZmZpY2llbnQgY2hhbmdlcworLy8gaXMgaW1wbGVtZW50ZWQ6IG5vcm1hbGx5LCB3aGVuIHRoZSBlbmFibGUoKSwgZGlzYWJsZSgpIGFuZCBzZXRDb2VmcygpIG1ldGhvZHMKKy8vIGFyZSBjYWxsZWQgd2l0aG91dCB0aGUgaW1tZWRpYXRlIGZsYWcgc2V0LCB0aGUgZmlsdGVyIHNtb290aGx5IHRyYW5zaXRpb25zCisvLyBmcm9tIGl0cyBjdXJyZW50IHN0YXRlIHRvIHRoZSBkZXNpcmVkIHN0YXRlLgorY2xhc3MgQXVkaW9CaXF1YWRGaWx0ZXIgeworcHVibGljOgorICAgIC8vIE1heCBudW1iZXIgb2YgY2hhbm5lbHMgKGNhbiBiZSBjaGFuZ2VkIGhlcmUsIGFuZCBldmVyeXRoaW5nIHNob3VsZCB3b3JrKS4KKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9DSEFOTkVMUyA9IDI7CisgICAgLy8gTnVtYmVyIG9mIGNvZWZmaWNpZW50cy4KKyAgICBzdGF0aWMgY29uc3QgaW50IE5VTV9DT0VGUyA9IDU7CisKKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLyBuQ2hhbm5lbHMgICAgTnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscy4KKyAgICAvLyBzYW1wbGVSYXRlICAgU2FtcGxlIHJhdGUsIGluIEh6LgorICAgIEF1ZGlvQmlxdWFkRmlsdGVyKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJlY29uZmlndXJhdGlvbiBvZiB0aGUgZmlsdGVyLiBJbXBsaWVzIGNsZWFyKCkuCisgICAgLy8gbkNoYW5uZWxzICAgIE51bWJlciBvZiBpbnB1dC9vdXRwdXQgY2hhbm5lbHMuCisgICAgLy8gc2FtcGxlUmF0ZSAgIFNhbXBsZSByYXRlLCBpbiBIei4KKyAgICB2b2lkIGNvbmZpZ3VyZShpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSk7CisKKyAgICAvLyBSZXNldHMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBmaWx0ZXIuCisgICAgLy8gQ29lZmZpY2llbnRzIGFyZSByZXNldCB0byBpZGVudGl0eSwgc3RhdGUgYmVjb21lcyBkaXNhYmxlZC4gVGhpcyBjaGFuZ2UKKyAgICAvLyBoYXBwZW5zIGltbWVkaWF0ZWx5IGFuZCBtaWdodCBjYXVzZSBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dC4KKyAgICAvLyBEZWxheSBsaW5lcyBhcmUgbm90IGNsZWFyZWQuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gQ2xlYXJzIHRoZSBkZWxheSBsaW5lcy4KKyAgICAvLyBUaGlzIGNoYW5nZSBoYXBwZW5zIGltbWVkaWF0ZWx5IGFuZCBtaWdodCBjYXVzZSBkaXNjb250aW51aXRpZXMgaW4gdGhlCisgICAgLy8gb3V0cHV0LgorICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8vIFNldHMgdGhlIGNvZWZmaWNpZW50cy4KKyAgICAvLyBJZiBjYWxsZWQgd2hlbiBmaWx0ZXIgaXMgZGlzYWJsZWQsIHdpbGwgaGF2ZSBubyBpbW1lZGlhdGUgZWZmZWN0LCBidXQgdGhlCisgICAgLy8gbmV3IGNvZWZmaWNpZW50cyB3aWxsIGJlIHNldCBhbmQgdXNlZCBuZXh0IHRpbWUgdGhlIGZpbHRlciBpcyBlbmFibGVkLgorICAgIC8vIGNvZWZzICAgICAgICBUaGUgbmV3IGNvZWZmaWNpZW50cy4KKyAgICAvLyBpbW1lZGlhdGUgICAgSWYgdHJ1ZSwgdHJhbnNpdGlvbnMgdG8gbmV3IGNvZWZmaWNpZW50cyBzbW9vdGhseSwgd2l0aG91dAorICAgIC8vICAgICAgICAgICAgICBpbnRyb2R1Y2luZyBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dC4gT3RoZXJ3aXNlLAorICAgIC8vICAgICAgICAgICAgICB0cmFuc2l0aW9ucyBpbW1lZGlhdGVseS4KKyAgICB2b2lkIHNldENvZWZzKGNvbnN0IGF1ZGlvX2NvZWZfdCBjb2Vmc1tOVU1fQ09FRlNdLCBib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworICAgIC8vIFByb2Nlc3MgYSBidWZmZXIgb2YgZGF0YS4gQWx3YXlzIHByb2Nlc3NlcyBmcmFtZUNvdW50IG11bHRpLWNoYW5uZWwKKyAgICAvLyBzYW1wbGVzLiBQcm9jZXNzaW5nIGNhbiBiZSBkb25lIGluLXBsYWNlLCBieSBwYXNzaW5nIHRoZSBzYW1lIGJ1ZmZlciBhcworICAgIC8vIGJvdGggYXJndW1lbnRzLgorICAgIC8vIGluICAgICAgICAgICBUaGUgaW5wdXQgYnVmZmVyLiBTaG91bGQgYmUgb2Ygc2l6ZSBmcmFtZUNvdW50ICogbkNoYW5uZWxzLgorICAgIC8vIG91dCAgICAgICAgICBUaGUgb3V0cHV0IGJ1ZmZlci4gU2hvdWxkIGJlIG9mIHNpemUgZnJhbWVDb3VudCAqIG5DaGFubmVscy4KKyAgICAvLyBmcmFtZUNvdW50ICAgTnVtYmVyIG9mIG11bHRpLWNoYW5uZWwgc2FtcGxlcyB0byBwcm9jZXNzLgorICAgIHZvaWQgcHJvY2Vzcyhjb25zdCBhdWRpb19zYW1wbGVfdCBpbltdLCBhdWRpb19zYW1wbGVfdCBvdXRbXSwKKyAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOworCisgICAgLy8gRW5hYmxlcyAoYWN0aXZhdGVzKSB0aGUgZmlsdGVyLgorICAgIC8vIGltbWVkaWF0ZSAgICBJZiB0cnVlLCB0cmFuc2l0aW9ucyB0byBuZXcgc3RhdGUgc21vb3RobHksIHdpdGhvdXQKKyAgICAvLyAgICAgICAgICAgICAgaW50cm9kdWNpbmcgZGlzY29udGludWl0aWVzIGluIHRoZSBvdXRwdXQuIE90aGVyd2lzZSwKKyAgICAvLyAgICAgICAgICAgICAgdHJhbnNpdGlvbnMgaW1tZWRpYXRlbHkuCisgICAgdm9pZCBlbmFibGUoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSk7CisKKyAgICAvLyBEaXNhYmxlcyAoYnlwYXNzZXMpIHRoZSBmaWx0ZXIuCisgICAgLy8gaW1tZWRpYXRlICAgIElmIHRydWUsIHRyYW5zaXRpb25zIHRvIG5ldyBzdGF0ZSBzbW9vdGhseSwgd2l0aG91dAorICAgIC8vICAgICAgICAgICAgICBpbnRyb2R1Y2luZyBkaXNjb250aW51aXRpZXMgaW4gdGhlIG91dHB1dC4gT3RoZXJ3aXNlLAorICAgIC8vICAgICAgICAgICAgICB0cmFuc2l0aW9ucyBpbW1lZGlhdGVseS4KKyAgICB2b2lkIGRpc2FibGUoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gQSBwcm90b3R5cGUgb2YgdGhlIGFjdHVhbCBwcm9jZXNzaW5nIGZ1bmN0aW9uLiBIYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCisgICAgLy8gdGhlIHByb2Nlc3MoKSBtZXRob2QuCisgICAgdHlwZWRlZiB2b2lkIChBdWRpb0JpcXVhZEZpbHRlcjo6KnByb2Nlc3NfZnVuYykoY29uc3QgYXVkaW9fc2FtcGxlX3RbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKKworICAgIC8vIFRoZSBtYXhpbXVtIHJhdGUgb2YgY29lZmZpY2llbnQgY2hhbmdlLCBtZWFzdXJlZCBpbiBjb2VmZmljaWVudCB1bml0cyBwZXIKKyAgICAvLyBzZWNvbmQuCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2NvZWZfdCBNQVhfREVMVEFfUEVSX1NFQyA9IDIwMDA7CisKKyAgICAvLyBDb2VmZmljaWVudHMgb2YgaWRlbnRpdHkgdHJhbnNmb3JtYXRpb24uCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX2NvZWZfdCBJREVOVElUWV9DT0VGU1tOVU1fQ09FRlNdOworCisgICAgLy8gRmlsdGVyIHN0YXRlLgorICAgIGVudW0gc3RhdGVfdCB7CisgICAgICAgIC8vIEJ5cGFzcy4KKyAgICAgICAgU1RBVEVfQllQQVNTID0gMHgwMSwKKyAgICAgICAgLy8gSW4gdGhlIHByb2Nlc3Mgb2Ygc21vb3RoIHRyYW5zaXRpb24gdG8gYnlwYXNzIHN0YXRlLgorICAgICAgICBTVEFURV9UUkFOU0lUSU9OX1RPX0JZUEFTUyA9IDB4MDIsCisgICAgICAgIC8vIEluIHRoZSBwcm9jZXNzIG9mIHNtb290aCB0cmFuc2l0aW9uIHRvIG5vcm1hbCAoZW5hYmxlZCkgc3RhdGUuCisgICAgICAgIFNUQVRFX1RSQU5TSVRJT05fVE9fTk9STUFMID0gMHgwNCwKKyAgICAgICAgLy8gSW4gbm9ybWFsIChlbmFibGVkKSBzdGF0ZS4KKyAgICAgICAgU1RBVEVfTk9STUFMID0gMHgwNSwKKyAgICAgICAgLy8gQSBiaXQtbWFzayBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgZmlsdGVyIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAgICAgICAgLy8gaW4gdGhlIGV5ZXMgb2YgdGhlIGNsaWVudC4KKyAgICAgICAgU1RBVEVfRU5BQkxFRF9NQVNLID0gMHgwNAorICAgIH07CisKKyAgICAvLyBOdW1iZXIgb2YgY2hhbm5lbHMuCisgICAgaW50IG1OdW1DaGFubmVsczsKKyAgICAvLyBDdXJyZW50IHN0YXRlLgorICAgIHN0YXRlX3QgbVN0YXRlOworICAgIC8vIE1heGltdW0gY29lZmZpY2llbnQgZGVsdGEgcGVyIHNhbXBsZS4KKyAgICBhdWRpb19jb2VmX3QgbU1heERlbHRhOworCisgICAgLy8gQSBiaXQtbWFzayBkZXNpZ25hdGluZyBmb3Igd2hpY2ggY29lZmZpY2llbnRzIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdAorICAgIC8vIG5lY2Vzc2FyaWx5IGlkZW50aWNhbCB0byB0aGUgdGFyZ2V0IHZhbHVlIChzaW5jZSB3ZSdyZSBpbiB0cmFuc2l0aW9uCisgICAgLy8gc3RhdGUpLgorICAgIHVpbnQzMl90IG1Db2VmRGlydHlCaXRzOworICAgIC8vIFRoZSBjdXJyZW50IGNvZWZmaWNpZW50cy4KKyAgICBhdWRpb19jb2VmX3QgbUNvZWZzW05VTV9DT0VGU107CisgICAgLy8gVGhlIHRhcmdldCBjb2VmZmljaWVudHMuIFdpbGwgbm90IGJlIGlkZW50aWNhbCB0byBtQ29lZnMgaWYgd2UgYXJlIGluIGEKKyAgICAvLyB0cmFuc2l0aW9uIHN0YXRlLgorICAgIGF1ZGlvX2NvZWZfdCBtVGFyZ2V0Q29lZnNbTlVNX0NPRUZTXTsKKworICAgIC8vIFRoZSBkZWxheSBsaW5lcy4KKyAgICBhdWRpb19zYW1wbGVfdCBtRGVsYXlzW01BWF9DSEFOTkVMU11bNF07CisKKyAgICAvLyBDdXJyZW50IHByb2Nlc3NpbmcgZnVuY3Rpb24gKGRldGVybWluZXMgYWNjb3JkaW5nIHRvIGN1cnJlbnQgc3RhdGUgYW5kCisgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzKS4KKyAgICBwcm9jZXNzX2Z1bmMgbUN1clByb2Nlc3NGdW5jOworCisgICAgLy8gU2V0cyBhIG5ldyBzdGF0ZS4gVXBkYXRlcyB0aGUgcHJvY2Vzc2luZyBmdW5jdGlvbiBhY2NvcmRpbmdseSwgYW5kIHNldHMKKyAgICAvLyB0aGUgZGlydHkgYml0cyBpZiBjaGFuZ2luZyB0byBhIHRyYW5zaXRpb24gc3RhdGUuCisgICAgdm9pZCBzZXRTdGF0ZShzdGF0ZV90IHN0YXRlKTsKKworICAgIC8vIEluIGEgdHJhbnNpdGlvbiBzdGF0ZSwgbW9kaWZpZXMgdGhlIGN1cnJlbnQgY29lZnMgdG93YXJkcyB0aGUgcGFzc2VkCisgICAgLy8gY29lZnMsIHdoaWxlIGtlZXBpbmcgYSBzbW9vdGggY2hhbmdlIHJhdGUuIFdoZW5ldmVyIGEgY29lZiByZWFjaGVzIGl0cworICAgIC8vIHRhcmdldCB2YWx1ZSwgdGhlIGRpcnR5IGJpdCBpcyBjbGVhcmVkLiBJZiBhbGwgYXJlIGNsZWFyLCB0aGUgZnVuY3Rpb24KKyAgICAvLyByZXR1cm5zIHRydWUsIGFuZCB3ZSBjYW4gdGhlbiBjaGFuZ2UgdG8gb3VyIHRhcmdldCBzdGF0ZS4KKyAgICBib29sIHVwZGF0ZUNvZWZzKGNvbnN0IGF1ZGlvX2NvZWZfdCBjb2Vmc1tOVU1fQ09FRlNdLCBpbnQgZnJhbWVDb3VudCk7CisKKyAgICAvLyBQcm9jZXNzaW5nIGZ1bmN0aW9uIHdoZW4gaW4gZGlzYWJsZWQgc3RhdGUuCisgICAgdm9pZCBwcm9jZXNzX2J5cGFzcyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLCBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKKyAgICAvLyBQcm9jZXNzaW5nIGZ1bmN0aW9uIHdoZW4gaW4gbm9ybWFsIHN0YXRlLCBtb25vLgorICAgIHZvaWQgcHJvY2Vzc19ub3JtYWxfbW9ubyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLCBhdWRpb19zYW1wbGVfdCAqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOworICAgIC8vIFByb2Nlc3NpbmcgZnVuY3Rpb24gd2hlbiB0cmFuc2l0aW9uaW5nIHRvIG5vcm1hbCBzdGF0ZSwgbW9uby4KKyAgICB2b2lkIHByb2Nlc3NfdHJhbnNpdGlvbl9ub3JtYWxfbW9ubyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogb3V0LCBpbnQgZnJhbWVDb3VudCk7CisgICAgLy8gUHJvY2Vzc2luZyBmdW5jdGlvbiB3aGVuIHRyYW5zaXRpb25pbmcgdG8gYnlwYXNzIHN0YXRlLCBtb25vLgorICAgIHZvaWQgcHJvY2Vzc190cmFuc2l0aW9uX2J5cGFzc19tb25vKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsIGludCBmcmFtZUNvdW50KTsKKyAgICAvLyBQcm9jZXNzaW5nIGZ1bmN0aW9uIHdoZW4gaW4gbm9ybWFsIHN0YXRlLCBtdWx0aS1jaGFubmVsLgorICAgIHZvaWQgcHJvY2Vzc19ub3JtYWxfbXVsdGkoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwgYXVkaW9fc2FtcGxlX3QgKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCk7CisgICAgLy8gUHJvY2Vzc2luZyBmdW5jdGlvbiB3aGVuIHRyYW5zaXRpb25pbmcgdG8gbm9ybWFsIHN0YXRlLCBtdWx0aS1jaGFubmVsLgorICAgIHZvaWQgcHJvY2Vzc190cmFuc2l0aW9uX25vcm1hbF9tdWx0aShjb25zdCBhdWRpb19zYW1wbGVfdCAqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIG91dCwgaW50IGZyYW1lQ291bnQpOworICAgIC8vIFByb2Nlc3NpbmcgZnVuY3Rpb24gd2hlbiB0cmFuc2l0aW9uaW5nIHRvIGJ5cGFzcyBzdGF0ZSwgbXVsdGktY2hhbm5lbC4KKyAgICB2b2lkIHByb2Nlc3NfdHJhbnNpdGlvbl9ieXBhc3NfbXVsdGkoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBvdXQsIGludCBmcmFtZUNvdW50KTsKK307Cit9CisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX0JJUVVBRF9GSUxURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvZWZJbnRlcnBvbGF0b3IuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvZWZJbnRlcnBvbGF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWFiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29lZkludGVycG9sYXRvci5jcHAKQEAgLTAsMCArMSw4NCBAQAorLyogLy9kZXZpY2Uvc2VydmVycy9BdWRpb0ZsaW5nZXIvQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmNwcAorICoqCisgKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmgiCisKKyNkZWZpbmUgTElLRUxZKCBleHAgKSAgICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgdHJ1ZSAgKSkKKyNkZWZpbmUgVU5MSUtFTFkoIGV4cCApICAgICAoX19idWlsdGluX2V4cGVjdCggKGV4cCkgIT0gMCwgZmFsc2UgKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBdWRpb0NvZWZJbnRlcnBvbGF0b3I6OkF1ZGlvQ29lZkludGVycG9sYXRvcihzaXplX3QgbkluRGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbkRpbXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuT3V0RGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvZWZfdCAqIHRhYmxlKSB7CisgICAgbU51bUluRGltcyA9IG5JbkRpbXM7CisgICAgbWVtY3B5KG1JbkRpbXMsIGluRGltcywgbkluRGltcyAqIHNpemVvZihzaXplX3QpKTsKKyAgICBtTnVtT3V0RGltcyA9IG5PdXREaW1zOworICAgIG1UYWJsZSA9IHRhYmxlOworICAgIC8vIEluaXRpYWxpemUgb2Zmc2V0cyBhcnJheQorICAgIHNpemVfdCBkaW0gPSBuSW5EaW1zIC0gMTsKKyAgICBtSW5EaW1PZmZzZXRzW25JbkRpbXMgLSAxXSA9IG5PdXREaW1zOworICAgIHdoaWxlIChkaW0tLSA+IDApIHsKKyAgICAgICAgbUluRGltT2Zmc2V0c1tkaW1dID0gbUluRGltT2Zmc2V0c1tkaW0gKyAxXSAqIG1JbkRpbXNbZGltICsgMV07CisgICAgfQorfQorCit2b2lkIEF1ZGlvQ29lZkludGVycG9sYXRvcjo6Z2V0Q29lZihjb25zdCBpbnQgaW50Q29vcmRbXSwgdWludDMyX3QgZnJhY0Nvb3JkW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb2VmX3Qgb3V0W10pIHsKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIHNpemVfdCBkaW0gPSBtTnVtSW5EaW1zOworICAgIHdoaWxlIChkaW0tLSA+IDApIHsKKyAgICAgICAgaWYgKFVOTElLRUxZKGludENvb3JkW2RpbV0gPCAwKSkgeworICAgICAgICAgICAgZnJhY0Nvb3JkW2RpbV0gPSAwOworICAgICAgICB9IGVsc2UgaWYgKFVOTElLRUxZKGludENvb3JkW2RpbV0gPj0gKGludCltSW5EaW1zW2RpbV0gLSAxKSkgeworICAgICAgICAgICAgZnJhY0Nvb3JkW2RpbV0gPSAwOworICAgICAgICAgICAgaW5kZXggKz0gbUluRGltT2Zmc2V0c1tkaW1dICogKG1JbkRpbXNbZGltXSAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5kZXggKz0gbUluRGltT2Zmc2V0c1tkaW1dICogaW50Q29vcmRbZGltXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBnZXRDb2VmUmVjdXJzZShpbmRleCwgZnJhY0Nvb3JkLCBvdXQsIDApOworfQorCit2b2lkIEF1ZGlvQ29lZkludGVycG9sYXRvcjo6Z2V0Q29lZlJlY3Vyc2Uoc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGZyYWNDb29yZFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvZWZfdCBvdXRbXSwgc2l6ZV90IGRpbSkgeworICAgIGlmIChkaW0gPT0gbU51bUluRGltcykgeworICAgICAgICBtZW1jcHkob3V0LCBtVGFibGUgKyBpbmRleCwgbU51bU91dERpbXMgKiBzaXplb2YoYXVkaW9fY29lZl90KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2V0Q29lZlJlY3Vyc2UoaW5kZXgsIGZyYWNDb29yZCwgb3V0LCBkaW0gKyAxKTsKKyAgICAgICAgaWYgKExJS0VMWShmcmFjQ29vcmQgIT0gMCkpIHsKKyAgICAgICAgICAgYXVkaW9fY29lZl90IHRlbXBDb2VmW01BWF9PVVRfRElNU107CisgICAgICAgICAgIGdldENvZWZSZWN1cnNlKGluZGV4ICsgbUluRGltT2Zmc2V0c1tkaW1dLCBmcmFjQ29vcmQsIHRlbXBDb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltICsgMSk7CisgICAgICAgICAgICBzaXplX3QgZCA9IG1OdW1PdXREaW1zOworICAgICAgICAgICAgd2hpbGUgKGQtLSA+IDApIHsKKyAgICAgICAgICAgICAgICBvdXRbZF0gPSBpbnRlcnAob3V0W2RdLCB0ZW1wQ29lZltkXSwgZnJhY0Nvb3JkW2RpbV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCithdWRpb19jb2VmX3QgQXVkaW9Db2VmSW50ZXJwb2xhdG9yOjppbnRlcnAoYXVkaW9fY29lZl90IGxvLCBhdWRpb19jb2VmX3QgaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhYykgeworICAgIGludDY0X3QgZGVsdGEgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihoaS1sbykgKiBmcmFjOworICAgIHJldHVybiBsbyArIHN0YXRpY19jYXN0PGF1ZGlvX2NvZWZfdD4gKGRlbHRhID4+IDMyKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvZWZJbnRlcnBvbGF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlNTY5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmgKQEAgLTAsMCArMSw5OCBAQAorLyogLy9kZXZpY2UvaW5jbHVkZS9zZXJ2ZXIvQXVkaW9GbGluZ2VyL0F1ZGlvQ29lZkludGVycG9sYXRvci5oCisgKioKKyAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19DT0VGX0lOVEVSUE9MQVRPUl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fQ09FRl9JTlRFUlBPTEFUT1JfSAorCisjaW5jbHVkZSAiQXVkaW9Db21tb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBIGhlbHBlciBjbGFzcyBmb3IgbGluZWFyIGludGVycG9sYXRpb24gb2YgTi1EIC0+IE0tRCBjb2VmZmljaWVudCB0YWJsZXMuCisvLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIG91dC1vZi1yYW5nZSBpbmRleGVzLgorLy8gRGV0YWlsczoKKy8vIFRoZSBwdXJwb3NlIGlzIGVmZmljaWVudCBhcHByb3hpbWF0aW9uIG9mIGEgTi1kaW1lbnNpb25hbCB2ZWN0b3IgdG8KKy8vIE0tZGltZW5zaW9uYWwgZnVuY3Rpb24uIFRoZSBhcHByb3hpbWF0aW9uIGlzIGJhc2VkIG9uIGEgdGFibGUgb2Ygb3V0cHV0CisvLyB2YWx1ZXMgb24gYSB1bmlmb3JtIGdyaWQgb2YgdGhlIGlucHV0IHZhbHVlcy4gVmFsdWVzIG5vdCBvbiB0aGUgZ3JpZCBhcmUKKy8vIGxpbmVhcmx5IGludGVycG9sYXRlZC4KKy8vIEFjY2VzcyB0byB2YWx1ZXMgYXJlIGRvbmUgYnkgc3BlY2lmeWluZyBpbnB1dCB2YWx1ZXMgaW4gdGFibGUgaW5kZXggdW5pdHMsCisvLyBoYXZpbmcgYW4gaW50ZWdlciBhbmQgYSBmcmFjdGlvbmFsIHBhcnQsIGUuZy4gcmV0cmlldmluZyBhIHZhbHVlIGZyb20gaW5kZXgKKy8vIDEuNCB3aWxsIHJlc3VsdCBpbiBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIGluZGV4IDEgYW5kIGluZGV4IDIuCitjbGFzcyBBdWRpb0NvZWZJbnRlcnBvbGF0b3IgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vIG5JbkRpbXMgICAgICBOdW1iZXIgb2YgaW5wdXQgZGltZW5zaW9ucyAobGltaXRlZCB0byBNQVhfSU5fRElNUykuCisgICAgLy8gaW5EaW1zICAgICAgIEFuIGFycmF5IG9mIHNpemUgbkluRGltcyB3aXRoIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBvbiBlYWNoCisgICAgLy8gICAgICAgICAgICAgIHJlc3BlY3RpdmUgZGltZW5zaW9uLgorICAgIC8vIG5PdXREaW1zICAgICBOdW1iZXIgb2Ygb3V0cHV0IGRpbWVuc2lvbnMgKGxpbWl0ZWQgdG8gTUFYX09VVF9ESU1TKS4KKyAgICAvLyB0YWJsZSAgICAgICAgVGhlIGNvZWZmaWNpZW50IHRhYmxlLiBTaG91bGQgYmUgb2Ygc2l6ZToKKyAgICAvLyAgICAgICAgICAgICAgaW5EaW1zWzBdKmluRGltc1sxXSouLi4qaW5EaW1zW25JbkRpbXMtMV0qbk91dERpbXMsIHdoZXJlCisgICAgLy8gICAgICAgICAgICAgIGZ1bmMoW2ksaixrXSkgPSB0YWJsZShpLGosayw6KQorICAgIEF1ZGlvQ29lZkludGVycG9sYXRvcihzaXplX3QgbkluRGltcywgY29uc3Qgc2l6ZV90IGluRGltc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbk91dERpbXMsIGNvbnN0IGF1ZGlvX2NvZWZfdCAqIHRhYmxlKTsKKworICAgIC8vIEdldCB0aGUgdmFsdWUgb2YgdGhlIGFwcHJveGltYXRlZCBmdW5jdGlvbiBhdCBhIGdpdmVuIHBvaW50LgorICAgIC8vIGludENvb3JkICAgICBUaGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBpbnB1dCB2YWx1ZS4gU2hvdWxkIGJlIGFuIGFycmF5IG9mCisgICAgLy8gICAgICAgICAgICAgIHNpemUgbkluRGltcy4KKyAgICAvLyBmcmFjQ29vcmQgICAgVGhlIGZyYWN0aW9uYWwgcGFydCBvZiB0aGUgaW5wdXQgdmFsdWUuIFNob3VsZCBiZSBhbiBhcnJheQorICAgIC8vICAgICAgICAgICAgICBvZiBzaXplIG5JbkRpbXMuIFRoaXMgdmFsdWUgaXMgaW4gMzItYml0IHByZWNpc2lvbi4KKyAgICAvLyBvdXQgICAgICAgICAgQW4gYXJyYXkgZm9yIHRoZSBvdXRwdXQgdmFsdWUuIFNob3VsZCBiZSBvZiBzaXplIG5PdXREaW1zLgorICAgIHZvaWQgZ2V0Q29lZihjb25zdCBpbnQgaW50Q29vcmRbXSwgdWludDMyX3QgZnJhY0Nvb3JkW10sIGF1ZGlvX2NvZWZfdCBvdXRbXSk7CisKK3ByaXZhdGU6CisgICAgLy8gTWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBpbnB1dCBkaW1lbnNpb25zLgorICAgIHN0YXRpYyBjb25zdCBzaXplX3QgTUFYX0lOX0RJTVMgPSA4OworICAgIC8vIE1heGltdW0gYWxsb3dlZCBudW1iZXIgb2Ygb3V0cHV0IGRpbWVuc2lvbnMuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBNQVhfT1VUX0RJTVMgPSA4OworCisgICAgLy8gTnVtYmVyIG9mIGlucHV0IGRpbWVuc2lvbnMuCisgICAgc2l6ZV90IG1OdW1JbkRpbXM7CisgICAgLy8gTnVtYmVyIG9mIGlucHV0IGRpbWVuc2lvbnMuCisgICAgc2l6ZV90IG1JbkRpbXNbTUFYX0lOX0RJTVNdOworICAgIC8vIFRoZSBvZmZzZXQgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgaW5kZXhlcyBvZiBlYWNoIGRpbWVuc2lvbi4gVGhpcyBpcyBpbgorICAgIC8vIGZhY3QgYSBjdW11bGF0aXZlIHByb2R1Y3Qgb2YgbUluRGltcyAoZG9uZSBpbiByZXZlcnNlKS4KKyAgICBzaXplX3QgbUluRGltT2Zmc2V0c1tNQVhfSU5fRElNU107CisgICAgLy8gTnVtYmVyIG9mIG91dHB1dCBkaW1lbnNpb25zLgorICAgIHNpemVfdCBtTnVtT3V0RGltczsKKyAgICAvLyBUaGUgY29lZmZpY2llbnQgdGFibGUuCisgICAgY29uc3QgYXVkaW9fY29lZl90ICogbVRhYmxlOworCisgICAgLy8gQSByZWN1cnNpdmUgZnVuY3Rpb24gZm9yIGdldHRpbmcgYW4gaW50ZXJwb2xhdGVkIGNvZWZmaWNpZW50IHZhbHVlLgorICAgIC8vIFRoZSByZWN1cnNpb24gZGVwdGggaXMgdGhlIG51bWJlciBvZiBpbnB1dCBkaW1lbnNpb25zLgorICAgIC8vIEF0IGVhY2ggc3RlcCwgd2UgZmV0Y2ggdHdvIGludGVycG9sYXRlZCB2YWx1ZXMgb2YgdGhlIGN1cnJlbnQgZGltZW5zaW9uLAorICAgIC8vIGJ5IHR3byByZWN1cnNpdmUgY2FsbHMgdG8gdGhpcyBtZXRob2QgZm9yIHRoZSBuZXh0IGRpbWVuc2lvbnMuIFdlIHRoZW4KKyAgICAvLyBsaW5lYXJseSBpbnRlcnBvbGF0ZSB0aGVzZSB2YWx1ZXMgb3ZlciB0aGUgY3VycmVudCBkaW1lbnNpb24uCisgICAgLy8gaW5kZXggICAgICBUaGUgbGluZWFyIGludGVnZXIgaW5kZXggb2YgdGhlIHZhbHVlIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUuCisgICAgLy8gZnJhY0Nvb3JkICBBIHZlY3RvciBvZiBmcmFjdGlvbmFsIGNvb3JkaW5hdGVzIGZvciBlYWNoIG9mIHRoZSBpbnB1dAorICAgIC8vICAgICAgICAgICAgZGltZW5zaW9ucy4KKyAgICAvLyBvdXQgICAgICAgIFdoZXJlIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHdyaXR0ZW4uIE5lZWRzIHRvIGJlIG9mIHNpemUKKyAgICAvLyAgICAgICAgICAgIG1OdW1PdXREaW1zLgorICAgIC8vIGRpbSAgICAgICAgVGhlIGlucHV0IGRpbWVuc2lvbnMgd2UgYXJlIGN1cnJlbnRseSBpbnRlcnBvbGF0aW5nLiBUaGlzCisgICAgLy8gICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIGluY3JlYXNlZCBvbiByZWN1cnNpdmUgY2FsbHMuCisgICAgdm9pZCBnZXRDb2VmUmVjdXJzZShzaXplX3QgaW5kZXgsIGNvbnN0IHVpbnQzMl90IGZyYWNDb29yZFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29lZl90IG91dFtdLCBzaXplX3QgZGltKTsKKworICAgIC8vIFNjYWxhciBpbnRlcnBvbGF0aW9uIG9mIHR3byBkYXRhIHBvaW50cy4KKyAgICAvLyBsbyAgICAgICBUaGUgZmlyc3QgZGF0YSBwb2ludC4KKyAgICAvLyBoaSAgICAgICBUaGUgc2Vjb25kIGRhdGEgcG9pbnQuCisgICAgLy8gZnJhYyAgICAgQSAzMi1iaXQgZnJhY3Rpb24gZGVzaWduYXRpbmcgdGhlIHdlaWdodCBvZiB0aGUgc2Vjb25kIHBvaW50LgorICAgIHN0YXRpYyBhdWRpb19jb2VmX3QgaW50ZXJwKGF1ZGlvX2NvZWZfdCBsbywgYXVkaW9fY29lZl90IGhpLCB1aW50MzJfdCBmcmFjKTsKK307CisKK30KKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fQ09FRl9JTlRFUlBPTEFUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvbW1vbi5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGY5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvQ29tbW9uLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0NPTU1PTl9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fQ09NTU9OX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEF1ZGlvIGNvZWZmaWNpZW50IHR5cGUuCit0eXBlZGVmIGludDMyX3QgYXVkaW9fY29lZl90OworLy8gQXVkaW8gc2FtcGxlIHR5cGUuCit0eXBlZGVmIGludDMyX3QgYXVkaW9fc2FtcGxlX3Q7CisvLyBBY2N1bXVsYXRvciB0eXBlIGZvciBjb2VmIHggc2FtcGxlLgordHlwZWRlZiBpbnQ2NF90IGF1ZGlvX2NvZWZfc2FtcGxlX2FjY190OworCisvLyBOdW1iZXIgb2YgZnJhY3Rpb24gYml0cyBmb3IgYXVkaW8gY29lZmZpY2llbnQuCitzdGF0aWMgY29uc3QgaW50IEFVRElPX0NPRUZfUFJFQ0lTSU9OID0gMjQ7CisvLyBBdWRpbyBjb2VmZmljaWVudCB3aXRoIHRoZSB2YWx1ZSBvZiAxLjAKK3N0YXRpYyBjb25zdCBhdWRpb19jb2VmX3QgQVVESU9fQ09FRl9PTkUgPSAxIDw8IEFVRElPX0NPRUZfUFJFQ0lTSU9OOworLy8gQXVkaW8gY29lZmZpY2llbnQgd2l0aCB0aGUgdmFsdWUgb2YgMC41CitzdGF0aWMgY29uc3QgYXVkaW9fY29lZl90IEFVRElPX0NPRUZfSEFMRiA9IDEgPDwgKEFVRElPX0NPRUZfUFJFQ0lTSU9OIC0gMSk7CisvLyBOdW1iZXIgb2YgZnJhY3Rpb24gYml0cyBmb3IgYXVkaW8gc2FtcGxlLgorc3RhdGljIGNvbnN0IGludCBBVURJT19TQU1QTEVfUFJFQ0lTSU9OID0gMjQ7CisvLyBBdWRpbyBzYW1wbGUgd2l0aCB0aGUgdmFsdWUgb2YgMS4wCitzdGF0aWMgY29uc3QgYXVkaW9fc2FtcGxlX3QgQVVESU9fU0FNUExFX09ORSA9IDEgPDwgQVVESU9fU0FNUExFX1BSRUNJU0lPTjsKKworLy8gVE9ETzogVGhlc2UgYXJlIGp1c3QgdGVtcG9yYXJ5IG5haXZlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgbmVjZXNzYXJ5CisvLyBhcml0aG1ldGljIG9wZXJhdGlvbnMgbmVlZGVkIGZvciB0aGUgZmlsdGVyLiBUaGV5IHNob3VsZCBiZSBtb3ZlZCB0byBhIG1vcmUKKy8vIGdlbmVyaWMgbG9jYXRpb24gYW5kIGltcGxlbWVudGVkIG1vcmUgZWZmaWNpZW50bHkuCisKKy8vIE11bHRpcGx5IGEgc2FtcGxlIGJ5IGEgY29lZmZpY2llbnQgdG8gcmV0dXJuIGFuIGFjY3VtdWxhdG9yLgoraW5saW5lIGF1ZGlvX2NvZWZfc2FtcGxlX2FjY190IG11bF9jb2VmX3NhbXBsZShhdWRpb19jb2VmX3QgeCwgYXVkaW9fc2FtcGxlX3QgeSkgeworICAgIHJldHVybiAoKGF1ZGlvX2NvZWZfc2FtcGxlX2FjY190KSAoeCkpICogeTsKK30KKworLy8gTXVsdGlwbHkgYW5kIGFjY3VtdWxhdGUgc2FtcGxlIGJ5IGEgY29lZmZpY2llbnQgdG8gcmV0dXJuIGFuIGFjY3VtdWxhdG9yLgoraW5saW5lIGF1ZGlvX2NvZWZfc2FtcGxlX2FjY190IG1hY19jb2VmX3NhbXBsZShhdWRpb19jb2VmX3QgeCwgYXVkaW9fc2FtcGxlX3QgeSwgYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QgYWNjKSB7CisgICAgcmV0dXJuIGFjYyArICgoYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QpICh4KSkgKiB5OworfQorCisvLyBDb252ZXJ0IGEgc2FtcGxlLWNvZWZmaWNpZW50IGFjY3VtdWxhdG9yIHRvIGEgc2FtcGxlLgoraW5saW5lIGF1ZGlvX3NhbXBsZV90IGNvZWZfc2FtcGxlX2FjY190b19zYW1wbGUoYXVkaW9fY29lZl9zYW1wbGVfYWNjX3QgYWNjKSB7CisgICAgaWYgKGFjYyA8IDApIHsKKyAgICAgICAgYWNjICs9IEFVRElPX0NPRUZfT05FIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIChhdWRpb19zYW1wbGVfdCkgKGFjYyA+PiBBVURJT19DT0VGX1BSRUNJU0lPTik7Cit9CisKKy8vIENvbnZlcnQgYSBTMTUgc2FtcGxlIHRvIGF1ZGlvX3NhbXBsZV90CitpbmxpbmUgYXVkaW9fc2FtcGxlX3QgczE1X3RvX2F1ZGlvX3NhbXBsZV90KGludDE2X3QgczE1KSB7CisgICAgcmV0dXJuIGF1ZGlvX3NhbXBsZV90KHMxNSkgPDwgOTsKK30KKworLy8gQ29udmVydCBhIGF1ZGlvX3NhbXBsZV90IHNhbXBsZSB0byBTMTUgKG5vIGNsaXBwaW5nKQoraW5saW5lIGludDE2X3QgYXVkaW9fc2FtcGxlX3RfdG9fczE1KGF1ZGlvX3NhbXBsZV90IHNhbXBsZSkgeworICAgIHJldHVybiBpbnQxNl90KChzYW1wbGUgKyAoMSA8PCA4KSkgPj4gOSk7Cit9CisKKy8vIENvbnZlcnQgYSBhdWRpb19zYW1wbGVfdCBzYW1wbGUgdG8gUzE1ICh3aXRoIGNsaXBwaW5nKQoraW5saW5lIGludDE2X3QgYXVkaW9fc2FtcGxlX3RfdG9fczE1X2NsaXAoYXVkaW9fc2FtcGxlX3Qgc2FtcGxlKSB7CisgICAgLy8gVE9ETzogb3B0aW1pemUgZm9yIHRhcmdldHMgc3VwcG9ydGluZyB0aGlzIGFzIGFuIGF0b21pYyBvcGVyYXRpb24uCisgICAgaWYgKF9fYnVpbHRpbl9leHBlY3Qoc2FtcGxlID49ICgweDdGRkYgPDwgOSksIDApKSB7CisgICAgICAgIHJldHVybiAweDdGRkY7CisgICAgfSBlbHNlIGlmIChfX2J1aWx0aW5fZXhwZWN0KHNhbXBsZSA8PSAtKDB4ODAwMCA8PCA5KSwgMCkpIHsKKyAgICAgICAgcmV0dXJuIDB4ODAwMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYXVkaW9fc2FtcGxlX3RfdG9fczE1KHNhbXBsZSk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit9CisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Yzk0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvRXF1YWxpemVyLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0VxdWFsaXplciIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkF1ZGlvRXF1YWxpemVyLmgiCisjaW5jbHVkZSAiQXVkaW9QZWFraW5nRmlsdGVyLmgiCisjaW5jbHVkZSAiQXVkaW9TaGVsdmluZ0ZpbHRlci5oIgorI2luY2x1ZGUgIkVmZmVjdHNNYXRoLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc2l6ZV90IEF1ZGlvRXF1YWxpemVyOjpHZXRJbnN0YW5jZVNpemUoaW50IG5CYW5kcykgeworICAgIGFzc2VydChuQmFuZHMgPj0gMik7CisgICAgcmV0dXJuIHNpemVvZihBdWRpb0VxdWFsaXplcikgKworICAgICAgICAgICBzaXplb2YoQXVkaW9TaGVsdmluZ0ZpbHRlcikgKiAyICsKKyAgICAgICAgICAgc2l6ZW9mKEF1ZGlvUGVha2luZ0ZpbHRlcikgKiAobkJhbmRzIC0gMik7Cit9CisKK0F1ZGlvRXF1YWxpemVyICogQXVkaW9FcXVhbGl6ZXI6OkNyZWF0ZUluc3RhbmNlKHZvaWQgKiBwTWVtLCBpbnQgbkJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVzZXRDb25maWcgKiBwcmVzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QcmVzZXRzKSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OkNyZWF0ZUluc3RhbmNlKHBNZW09JXAsIG5CYW5kcz0lZCwgbkNoYW5uZWxzPSVkLCAiCisgICAgICAgICAic2FtcGxlUmF0ZT0lZCwgblByZXNldHM9JWQpIiwKKyAgICAgICAgIHBNZW0sIG5CYW5kcywgbkNoYW5uZWxzLCBzYW1wbGVSYXRlLCBuUHJlc2V0cyk7CisgICAgYXNzZXJ0KG5CYW5kcyA+PSAyKTsKKyAgICBib29sIG93bk1lbSA9IGZhbHNlOworICAgIGlmIChwTWVtID09IE5VTEwpIHsKKyAgICAgICAgcE1lbSA9IG1hbGxvYyhHZXRJbnN0YW5jZVNpemUobkJhbmRzKSk7CisgICAgICAgIGlmIChwTWVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG93bk1lbSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBuZXcgKHBNZW0pIEF1ZGlvRXF1YWxpemVyKHBNZW0sIG5CYW5kcywgbkNoYW5uZWxzLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bk1lbSwgcHJlc2V0cywgblByZXNldHMpOworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpjb25maWd1cmUoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6Y29uZmlndXJlKG5DaGFubmVscz0lZCwgc2FtcGxlUmF0ZT0lZCkiLCBuQ2hhbm5lbHMsCisgICAgICAgICBzYW1wbGVSYXRlKTsKKyAgICBtcExvd1NoZWxmLT5jb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1QZWFraW5nOyArK2kpIHsKKyAgICAgICAgbXBQZWFraW5nRmlsdGVyc1tpXS5jb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICB9CisgICAgbXBIaWdoU2hlbGYtPmNvbmZpZ3VyZShuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpjbGVhcigpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6Y2xlYXIoKSIpOworICAgIG1wTG93U2hlbGYtPmNsZWFyKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUGVha2luZzsgKytpKSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbaV0uY2xlYXIoKTsKKyAgICB9CisgICAgbXBIaWdoU2hlbGYtPmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OmZyZWUoKSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OmZyZWUoKSIpOworICAgIGlmIChtcE1lbSAhPSBOVUxMKSB7CisgICAgICAgIDo6ZnJlZShtcE1lbSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpyZXNldCgpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6cmVzZXQoKSIpOworICAgIGNvbnN0IGludDMyX3QgYm90dG9tID0gRWZmZWN0c19sb2cyKGtNaW5GcmVxKTsKKyAgICBjb25zdCBpbnQzMl90IHRvcCA9IEVmZmVjdHNfbG9nMihtU2FtcGxlUmF0ZSAqIDUwMCk7CisgICAgY29uc3QgaW50MzJfdCBqdW1wID0gKHRvcCAtIGJvdHRvbSkgLyAobU51bVBlYWtpbmcgKyAyKTsKKyAgICBpbnQzMl90IGNlbnRlckZyZXEgPSBib3R0b20gKyBqdW1wLzI7CisKKyAgICBtcExvd1NoZWxmLT5yZXNldCgpOworICAgIG1wTG93U2hlbGYtPnNldEZyZXF1ZW5jeShFZmZlY3RzX2V4cDIoY2VudGVyRnJlcSkpOworICAgIGNlbnRlckZyZXEgKz0ganVtcDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1QZWFraW5nOyArK2kpIHsKKyAgICAgICAgbXBQZWFraW5nRmlsdGVyc1tpXS5yZXNldCgpOworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLnNldEZyZXF1ZW5jeShFZmZlY3RzX2V4cDIoY2VudGVyRnJlcSkpOworICAgICAgICBjZW50ZXJGcmVxICs9IGp1bXA7CisgICAgfQorICAgIG1wSGlnaFNoZWxmLT5yZXNldCgpOworICAgIG1wSGlnaFNoZWxmLT5zZXRGcmVxdWVuY3koRWZmZWN0c19leHAyKGNlbnRlckZyZXEpKTsKKyAgICBjb21taXQodHJ1ZSk7CisgICAgbUN1clByZXNldCA9IFBSRVNFVF9DVVNUT007Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OnNldEdhaW4oaW50IGJhbmQsIGludDMyX3QgbWlsbGliZWwpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6c2V0R2FpbihiYW5kPSVkLCBtaWxsaWJlbD0lZCkiLCBiYW5kLCBtaWxsaWJlbCk7CisgICAgYXNzZXJ0KGJhbmQgPj0gMCAmJiBiYW5kIDwgbU51bVBlYWtpbmcgKyAyKTsKKyAgICBpZiAoYmFuZCA9PSAwKSB7CisgICAgICAgIG1wTG93U2hlbGYtPnNldEdhaW4obWlsbGliZWwpOworICAgIH0gZWxzZSBpZiAoYmFuZCA9PSBtTnVtUGVha2luZyArIDEpIHsKKyAgICAgICAgbXBIaWdoU2hlbGYtPnNldEdhaW4obWlsbGliZWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnNbYmFuZCAtIDFdLnNldEdhaW4obWlsbGliZWwpOworICAgIH0KKyAgICBtQ3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKK30KKwordm9pZCBBdWRpb0VxdWFsaXplcjo6c2V0RnJlcXVlbmN5KGludCBiYW5kLCB1aW50MzJfdCBtaWxsaWhlcnR6KSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OnNldEZyZXF1ZW5jeShiYW5kPSVkLCBtaWxsaWhlcnR6PSVkKSIsIGJhbmQsCisgICAgICAgICBtaWxsaWhlcnR6KTsKKyAgICBhc3NlcnQoYmFuZCA+PSAwICYmIGJhbmQgPCBtTnVtUGVha2luZyArIDIpOworICAgIGlmIChiYW5kID09IDApIHsKKyAgICAgICAgbXBMb3dTaGVsZi0+c2V0RnJlcXVlbmN5KG1pbGxpaGVydHopOworICAgIH0gZWxzZSBpZiAoYmFuZCA9PSBtTnVtUGVha2luZyArIDEpIHsKKyAgICAgICAgbXBIaWdoU2hlbGYtPnNldEZyZXF1ZW5jeShtaWxsaWhlcnR6KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2JhbmQgLSAxXS5zZXRGcmVxdWVuY3kobWlsbGloZXJ0eik7CisgICAgfQorICAgIG1DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpzZXRCYW5kd2lkdGgoaW50IGJhbmQsIHVpbnQzMl90IGNlbnRzKSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OnNldEJhbmR3aWR0aChiYW5kPSVkLCBjZW50cz0lZCkiLCBiYW5kLCBjZW50cyk7CisgICAgYXNzZXJ0KGJhbmQgPj0gMCAmJiBiYW5kIDwgbU51bVBlYWtpbmcgKyAyKTsKKyAgICBpZiAoYmFuZCA+IDAgJiYgYmFuZCA8IG1OdW1QZWFraW5nICsgMSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2JhbmQgLSAxXS5zZXRCYW5kd2lkdGgoY2VudHMpOworICAgICAgICBtQ3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgICB9Cit9CisKK2ludDMyX3QgQXVkaW9FcXVhbGl6ZXI6OmdldEdhaW4oaW50IGJhbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoYmFuZCA+PSAwICYmIGJhbmQgPCBtTnVtUGVha2luZyArIDIpOworICAgIGlmIChiYW5kID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1wTG93U2hlbGYtPmdldEdhaW4oKTsKKyAgICB9IGVsc2UgaWYgKGJhbmQgPT0gbU51bVBlYWtpbmcgKyAxKSB7CisgICAgICAgIHJldHVybiBtcEhpZ2hTaGVsZi0+Z2V0R2FpbigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtcFBlYWtpbmdGaWx0ZXJzW2JhbmQgLSAxXS5nZXRHYWluKCk7CisgICAgfQorfQorCit1aW50MzJfdCBBdWRpb0VxdWFsaXplcjo6Z2V0RnJlcXVlbmN5KGludCBiYW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KGJhbmQgPj0gMCAmJiBiYW5kIDwgbU51bVBlYWtpbmcgKyAyKTsKKyAgICBpZiAoYmFuZCA9PSAwKSB7CisgICAgICAgIHJldHVybiBtcExvd1NoZWxmLT5nZXRGcmVxdWVuY3koKTsKKyAgICB9IGVsc2UgaWYgKGJhbmQgPT0gbU51bVBlYWtpbmcgKyAxKSB7CisgICAgICAgIHJldHVybiBtcEhpZ2hTaGVsZi0+Z2V0RnJlcXVlbmN5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1wUGVha2luZ0ZpbHRlcnNbYmFuZCAtIDFdLmdldEZyZXF1ZW5jeSgpOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9FcXVhbGl6ZXI6OmdldEJhbmR3aWR0aChpbnQgYmFuZCkgY29uc3QgeworICAgIGFzc2VydChiYW5kID49IDAgJiYgYmFuZCA8IG1OdW1QZWFraW5nICsgMik7CisgICAgaWYgKGJhbmQgPT0gMCB8fCBiYW5kID09IG1OdW1QZWFraW5nICsgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbXBQZWFraW5nRmlsdGVyc1tiYW5kIC0gMV0uZ2V0QmFuZHdpZHRoKCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpnZXRCYW5kUmFuZ2UoaW50IGJhbmQsIHVpbnQzMl90ICYgbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICYgaGlnaCkgY29uc3QgeworICAgIGFzc2VydChiYW5kID49IDAgJiYgYmFuZCA8IG1OdW1QZWFraW5nICsgMik7CisgICAgaWYgKGJhbmQgPT0gMCkgeworICAgICAgICBsb3cgPSAwOworICAgICAgICBoaWdoID0gbXBMb3dTaGVsZi0+Z2V0RnJlcXVlbmN5KCk7CisgICAgfSBlbHNlIGlmIChiYW5kID09IG1OdW1QZWFraW5nICsgMSkgeworICAgICAgICBsb3cgPSBtcEhpZ2hTaGVsZi0+Z2V0RnJlcXVlbmN5KCk7CisgICAgICAgIGhpZ2ggPSBtU2FtcGxlUmF0ZSAqIDUwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2JhbmQgLSAxXS5nZXRCYW5kUmFuZ2UobG93LCBoaWdoKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKiBBdWRpb0VxdWFsaXplcjo6Z2V0UHJlc2V0TmFtZShpbnQgcHJlc2V0KSBjb25zdCB7CisgICAgYXNzZXJ0KHByZXNldCA8IG1OdW1QcmVzZXRzICYmIHByZXNldCA+PSBQUkVTRVRfQ1VTVE9NKTsKKyAgICBpZiAocHJlc2V0ID09IFBSRVNFVF9DVVNUT00pIHsKKyAgICAgICAgcmV0dXJuICJDdXN0b20iOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtcFByZXNldHNbcHJlc2V0XS5uYW1lOworICAgIH0KK30KKworaW50IEF1ZGlvRXF1YWxpemVyOjpnZXROdW1QcmVzZXRzKCkgY29uc3QgeworICAgIHJldHVybiBtTnVtUHJlc2V0czsKK30KKworaW50IEF1ZGlvRXF1YWxpemVyOjpnZXRQcmVzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1DdXJQcmVzZXQ7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OnNldFByZXNldChpbnQgcHJlc2V0KSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OnNldFByZXNldChwcmVzZXQ9JWQpIiwgcHJlc2V0KTsKKyAgICBhc3NlcnQocHJlc2V0IDwgbU51bVByZXNldHMgJiYgcHJlc2V0ID49IDApOworICAgIGNvbnN0IFByZXNldENvbmZpZyAmcHJlc2V0Q2ZnID0gbXBQcmVzZXRzW3ByZXNldF07CisgICAgZm9yIChpbnQgYmFuZCA9IDA7IGJhbmQgPCAobU51bVBlYWtpbmcgKyAyKTsgKytiYW5kKSB7CisgICAgICAgIGNvbnN0IEJhbmRDb25maWcgJiBiYW5kQ2ZnID0gcHJlc2V0Q2ZnLmJhbmRDb25maWdzW2JhbmRdOworICAgICAgICBzZXRHYWluKGJhbmQsIGJhbmRDZmcuZ2Fpbik7CisgICAgICAgIHNldEZyZXF1ZW5jeShiYW5kLCBiYW5kQ2ZnLmZyZXEpOworICAgICAgICBzZXRCYW5kd2lkdGgoYmFuZCwgYmFuZENmZy5iYW5kd2lkdGgpOworICAgIH0KKyAgICBtQ3VyUHJlc2V0ID0gcHJlc2V0OworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpjb21taXQoYm9vbCBpbW1lZGlhdGUpIHsKKyAgICBMT0dWKCJBdWRpb0VxdWFsaXplcjo6Y29tbWl0KGltbWVkaWF0ZT0lZCkiLCBpbW1lZGlhdGUpOworICAgIG1wTG93U2hlbGYtPmNvbW1pdChpbW1lZGlhdGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLmNvbW1pdChpbW1lZGlhdGUpOworICAgIH0KKyAgICBtcEhpZ2hTaGVsZi0+Y29tbWl0KGltbWVkaWF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9FcXVhbGl6ZXI6OnByb2Nlc3MoY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBwSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogcE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsKKy8vICAgIExPR1YoIkF1ZGlvRXF1YWxpemVyOjpwcm9jZXNzKGZyYW1lQ291bnQ9JWQpIiwgZnJhbWVDb3VudCk7CisgICAgbXBMb3dTaGVsZi0+cHJvY2VzcyhwSW4sIHBPdXQsIGZyYW1lQ291bnQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLnByb2Nlc3MocEluLCBwT3V0LCBmcmFtZUNvdW50KTsKKyAgICB9CisgICAgbXBIaWdoU2hlbGYtPnByb2Nlc3MocEluLCBwT3V0LCBmcmFtZUNvdW50KTsKK30KKwordm9pZCBBdWRpb0VxdWFsaXplcjo6ZW5hYmxlKGJvb2wgaW1tZWRpYXRlKSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OmVuYWJsZShpbW1lZGlhdGU9JWQpIiwgaW1tZWRpYXRlKTsKKyAgICBtcExvd1NoZWxmLT5lbmFibGUoaW1tZWRpYXRlKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1QZWFraW5nOyArK2kpIHsKKyAgICAgICAgbXBQZWFraW5nRmlsdGVyc1tpXS5lbmFibGUoaW1tZWRpYXRlKTsKKyAgICB9CisgICAgbXBIaWdoU2hlbGYtPmVuYWJsZShpbW1lZGlhdGUpOworfQorCit2b2lkIEF1ZGlvRXF1YWxpemVyOjpkaXNhYmxlKGJvb2wgaW1tZWRpYXRlKSB7CisgICAgTE9HVigiQXVkaW9FcXVhbGl6ZXI6OmRpc2FibGUoaW1tZWRpYXRlPSVkKSIsIGltbWVkaWF0ZSk7CisgICAgbXBMb3dTaGVsZi0+ZGlzYWJsZShpbW1lZGlhdGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICBtcFBlYWtpbmdGaWx0ZXJzW2ldLmRpc2FibGUoaW1tZWRpYXRlKTsKKyAgICB9CisgICAgbXBIaWdoU2hlbGYtPmRpc2FibGUoaW1tZWRpYXRlKTsKK30KKworaW50IEF1ZGlvRXF1YWxpemVyOjpnZXRNb3N0UmVsZXZhbnRCYW5kKHVpbnQzMl90IHRhcmdldEZyZXEpIGNvbnN0IHsKKyAgICAvLyBGaXJzdCwgZmluZCB0aGUgdHdvIGJhbmRzIHRoYXQgdGhlIHRhcmdldCBmcmVxdWVuY3kgaXMgYmV0d2Vlbi4KKyAgICB1aW50MzJfdCBsb3cgPSBtcExvd1NoZWxmLT5nZXRGcmVxdWVuY3koKTsKKyAgICBpZiAodGFyZ2V0RnJlcSA8PSBsb3cpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHVpbnQzMl90IGhpZ2ggPSBtcEhpZ2hTaGVsZi0+Z2V0RnJlcXVlbmN5KCk7CisgICAgaWYgKHRhcmdldEZyZXEgPj0gaGlnaCkgeworICAgICAgICByZXR1cm4gbU51bVBlYWtpbmcgKyAxOworICAgIH0KKyAgICBpbnQgYmFuZCA9IG1OdW1QZWFraW5nOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVBlYWtpbmc7ICsraSkgeworICAgICAgICB1aW50MzJfdCBmcmVxID0gbXBQZWFraW5nRmlsdGVyc1tpXS5nZXRGcmVxdWVuY3koKTsKKyAgICAgICAgaWYgKGZyZXEgPj0gdGFyZ2V0RnJlcSkgeworICAgICAgICAgICAgaGlnaCA9IGZyZXE7CisgICAgICAgICAgICBiYW5kID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGxvdyA9IGZyZXE7CisgICAgfQorICAgIC8vIE5vdywgbG93IGlzIHJpZ2h0IGJlbG93IHRoZSB0YXJnZXQgYW5kIGhpZ2ggaXMgcmlnaHQgYWJvdmUuIFNlZSB3aGljaCBvbmUKKyAgICAvLyBpcyBjbG9zZXIgb24gYSBsb2cgc2NhbGUuCisgICAgbG93ID0gRWZmZWN0c19sb2cyKGxvdyk7CisgICAgaGlnaCA9IEVmZmVjdHNfbG9nMihoaWdoKTsKKyAgICB0YXJnZXRGcmVxID0gRWZmZWN0c19sb2cyKHRhcmdldEZyZXEpOworICAgIGlmIChoaWdoIC0gdGFyZ2V0RnJlcSA8IHRhcmdldEZyZXEgLSBsb3cpIHsKKyAgICAgICAgcmV0dXJuIGJhbmQgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBiYW5kOworICAgIH0KK30KKworCitBdWRpb0VxdWFsaXplcjo6QXVkaW9FcXVhbGl6ZXIodm9pZCAqIHBNZW0sIGludCBuQmFuZHMsIGludCBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsIGJvb2wgb3duTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByZXNldENvbmZpZyAqIHByZXNldHMsIGludCBuUHJlc2V0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtcFByZXNldHMocHJlc2V0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1OdW1QcmVzZXRzKG5QcmVzZXRzKSB7CisgICAgYXNzZXJ0KHBNZW0gIT0gTlVMTCk7CisgICAgYXNzZXJ0KG5QcmVzZXRzID09IDAgfHwgblByZXNldHMgPiAwICYmIHByZXNldHMgIT0gTlVMTCk7CisgICAgbXBNZW0gPSBvd25NZW0gPyBwTWVtIDogTlVMTDsKKworICAgIHBNZW0gPSAoY2hhciAqKSBwTWVtICsgc2l6ZW9mKEF1ZGlvRXF1YWxpemVyKTsKKyAgICBtcExvd1NoZWxmID0gbmV3IChwTWVtKSBBdWRpb1NoZWx2aW5nRmlsdGVyKEF1ZGlvU2hlbHZpbmdGaWx0ZXI6OmtMb3dTaGVsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgcE1lbSA9IChjaGFyICopIHBNZW0gKyBzaXplb2YoQXVkaW9TaGVsdmluZ0ZpbHRlcik7CisgICAgbXBIaWdoU2hlbGYgPSBuZXcgKHBNZW0pIEF1ZGlvU2hlbHZpbmdGaWx0ZXIoQXVkaW9TaGVsdmluZ0ZpbHRlcjo6a0hpZ2hTaGVsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgIHBNZW0gPSAoY2hhciAqKSBwTWVtICsgc2l6ZW9mKEF1ZGlvU2hlbHZpbmdGaWx0ZXIpOworICAgIG1OdW1QZWFraW5nID0gbkJhbmRzIC0gMjsKKyAgICBpZiAobU51bVBlYWtpbmcgPiAwKSB7CisgICAgICAgIG1wUGVha2luZ0ZpbHRlcnMgPSByZWludGVycHJldF9jYXN0PEF1ZGlvUGVha2luZ0ZpbHRlciAqPihwTWVtKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtUGVha2luZzsgKytpKSB7CisgICAgICAgICAgICBuZXcgKCZtcFBlYWtpbmdGaWx0ZXJzW2ldKSBBdWRpb1BlYWtpbmdGaWx0ZXIobkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJlc2V0KCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9FcXVhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI4NDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0VxdWFsaXplci5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPRVFVQUxJWkVSX0hfCisjZGVmaW5lIEFVRElPRVFVQUxJWkVSX0hfCisKKyNpbmNsdWRlICJBdWRpb0NvbW1vbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvU2hlbHZpbmdGaWx0ZXI7CitjbGFzcyBBdWRpb1BlYWtpbmdGaWx0ZXI7CisKKy8vIEEgcGFyYW1ldHJpYyBhdWRpbyBlcXVhbGl6ZXIuIFN1cHBvcnRzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgYmFuZHMgYW5kCisvLyBwcmVzZXRzLgorLy8gVGhlIEVRIGlzIGNvbXBvc2VkIG9mIGEgbG93LXNoZWxmLCB6ZXJvIG9yIG1vcmUgcGVha2luZyBmaWx0ZXJzIGFuZCBhIGhpZ2gKKy8vIHNoZWxmLCB3aGVyZSBlYWNoIGJhbmQgaGFzIGZyZXF1ZW5jeSBhbmQgZ2FpbiBjb250cm9scywgYW5kIHRoZSBwZWFraW5nCisvLyBmaWx0ZXJzIGhhdmUgYW4gYWRkaXRpb25hbCBiYW5kd2lkdGggY29udHJvbC4KK2NsYXNzIEF1ZGlvRXF1YWxpemVyIHsKK3B1YmxpYzoKKyAgICAvLyBDb25maWd1cmF0aW9uIG9mIGEgc2luZ2xlIGJhbmQuCisgICAgc3RydWN0IEJhbmRDb25maWcgeworICAgICAgICAvLyBHYWluIGluIG1pbGxpYmVsLgorICAgICAgICBpbnQzMl90IGdhaW47CisgICAgICAgIC8vIEZyZXF1ZW5jeSBpbiBtaWxsaWhlcnR6LgorICAgICAgICB1aW50MzJfdCBmcmVxOworICAgICAgICAvLyBCYW5kd2lkdGggaW4gY2VudHMgKGlnbm9yZWQgb24gc2hlbHZpbmcgZmlsdGVycykuCisgICAgICAgIHVpbnQzMl90IGJhbmR3aWR0aDsKKyAgICB9OworCisgICAgLy8gUHJlc2V0IGNvbmZpZ3VyYXRpb24uCisgICAgc3RydWN0IFByZXNldENvbmZpZyB7CisgICAgICAgIC8vIEh1bWFuLXJlYWRhYmxlIG5hbWUuCisgICAgICAgIGNvbnN0IGNoYXIgKiBuYW1lOworICAgICAgICAvLyBBbiBhcnJheSBvZiBzaXplIG5CYW5kcyB3aGVyZSBlYWNoIGVsZW1lbnQgaXMgYSBjb25maWd1cmF0aW9uIGZvciB0aGUKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBiYW5kLgorICAgICAgICBjb25zdCBCYW5kQ29uZmlnICogYmFuZENvbmZpZ3M7CisgICAgfTsKKworICAgIC8vIFRoaXMgdmFsdWUgaXMgdXNlZCB3aGVuIHJlcXVlc3RpbmcgY3VycmVudCBwcmVzZXQsIGFuZCBFUSBpcyBub3QgdXNpbmcgYQorICAgIC8vIHByZXNldC4KKyAgICBzdGF0aWMgY29uc3QgaW50IFBSRVNFVF9DVVNUT00gPSAtMTsKKworICAgIC8vIEdldCB0aGUgcmVxdWlyZWQgbWVtb3J5IHNpemUgZm9yIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCisgICAgLy8gbkJhbmRzICAgTnVtYmVyIG9mIGJhbmRzIHJlcXVpcmVkIGluIHRoZSBpbnN0YW5jZS4KKyAgICBzdGF0aWMgc2l6ZV90IEdldEluc3RhbmNlU2l6ZShpbnQgbkJhbmRzKTsKKworICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgIC8vIElmIHN1Y2NlZWRzLCBhIHJlc3BlY3RpdmUgY2FsbCBpcyBleHBlY3RlZCB0byBmcmVlSW5zdGFuY2UoKSwgcmVnYXJkbGVzcworICAgIC8vIG9mIHdobyBvd25zIHRoZSBjb250ZXh0IG1lbW9yeS4KKyAgICAvLyBwTWVtICAgICAgICAgQSBtZW1vcnkgYnVmZmVyIG9mIGF0IGxlYXN0IHRoZSBzaXplIHJldHVybmVkIGJ5CisgICAgLy8gICAgICAgICAgICAgIEdldEluc3RhbmNlU2l6ZSgpLCB3aGVyZSB0aGUgaW5zdGFuY2UgY29udGV4dCBpcyB0byBiZQorICAgIC8vICAgICAgICAgICAgICBzdG9yZWQuIElmIE5VTEwsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBhbGxvY2F0ZWQgKHVzaW5nCisgICAgLy8gICAgICAgICAgICAgIG1hbGxvYykuCisgICAgLy8gbkJhbmRzICAgICAgIE51bWJlciBvZiBiYW5kcy4gTXVzdCBiZSA+PSAyLgorICAgIC8vIG5DaGFubmVscyAgICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlICAgVGhlIGlucHV0L291dHB1dCBzYW1wbGUgcmF0ZSwgaW4gSHouCisgICAgLy8gcHJlc2V0cyAgICAgIFRoZSBwcmVzZXRzIGNvbmZpZ3VyYXRpb24uIE1heSBiZSBOVUxMLCBidXQgaW4gdGhhdCBjYXNlIHRoZQorICAgIC8vICAgICAgICAgICAgICBjbGllbnQgaXMgcmVxdWlyZWQgbm90IHRvIGNhbGwgcHJlc2V0LXJlbGF0ZWQgZnVuY3Rpb25zLgorICAgIC8vICAgICAgICAgICAgICBUaGlzIGFycmF5IGlzIG93bmVkIGJ5IHRoZSBjbGllbnQgYW5kIGlzIG5vdCBjb3BpZWQuIEl0CisgICAgLy8gICAgICAgICAgICAgIG11c3QgYmUga2VwdCB2YWxpZCBieSB0aGUgY2xpZW50IGFzIGxvbmcgYXMgdGhlIGluc3RhbmNlIGlzCisgICAgLy8gICAgICAgICAgICAgIGFsaXZlLgorICAgIC8vIG5QcmVzZXRzICAgICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHByZXNldHMgYXJyYXkuCisgICAgLy8gcmV0dXJucyAgICAgIFRoZSBpbnN0YW5jZSBpZiBzdWNjZXNzLiBOVUxMIGlmIHBNZW0gaXMgTlVMTCBhbmQgYWxsb2NhdGlvbgorICAgIC8vICAgICAgICAgICAgICBmYWlsZWQuCisgICAgc3RhdGljIEF1ZGlvRXF1YWxpemVyICogQ3JlYXRlSW5zdGFuY2Uodm9pZCAqIHBNZW0sIGludCBuQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVzZXRDb25maWcgKiBwcmVzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUHJlc2V0cyk7CisKKyAgICAvLyBSZWNvbmZpZ3VyYXRpb24gb2YgdGhlIGZpbHRlci4gQ2hhbmdlcyBpbnB1dC9vdXRwdXQgZm9ybWF0LCBidXQgZG9lcyBub3QKKyAgICAvLyBhbHRlciBjdXJyZW50IHBhcmFtZXRlciB2YWx1ZXMuIENhdXNlcyByZXNldCBvZiB0aGUgZGVsYXkgbGluZXMuCisgICAgLy8gbkNoYW5uZWxzICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlIFRoZSBpbnB1dC9vdXRwdXQgc2FtcGxlIHJhdGUsIGluIEh6LgorICAgIHZvaWQgY29uZmlndXJlKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJlc2V0cyB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgLy8gZnJlcXVlbmN5OiAwCisgICAgLy8gZ2FpbjogMAorICAgIC8vIGJhbmR3aWR0aDogMTIwMCBjZW50cy4KKyAgICAvLyBJdCBhbHNvIGRpc2FibGVzIHRoZSBmaWx0ZXIuIERvZXMgbm90IGNsZWFyIHRoZSBkZWxheSBsaW5lcy4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBDbGVhcnMgZGVsYXkgbGluZXMuIERvZXMgbm90IGFsdGVyIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8gRnJlZXMgdGhlIG9iamVjdC4gV2lsbCBmcmVlIHRoZSBtZW1vcnkgaWYgdGhlIG9iamVjdCBvd25lZCBpdCwgaS5lLiBpZgorICAgIC8vIGEgTlVMTCBwb2ludGVyIHdhcyBwYXNzZWQgdG8gQ3JlYXRlSW5zdGFuY2UgYXMgcE1lbS4KKyAgICB2b2lkIGZyZWUoKTsKKworICAgIC8vIFNldHMgZ2FpbiB2YWx1ZS4gQWN0dWFsIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBwbGFjZSB1cG9uIGNvbW1pdCgpLgorICAgIC8vIFRoaXMgdmFsdWUgd2lsbCBiZSByZW1lbWJlcmVkIGV2ZW4gaWYgdGhlIGZpbHRlciBpcyBpbiBkaXNhYmxlZCgpIHN0YXRlLgorICAgIC8vIGJhbmQgICAgIFRoZSBiYW5kIHRvIHNldCB0aGUgZ2FpbiBmb3IuCisgICAgLy8gbWlsbGliZWwgR2FpbiB2YWx1ZSBpbiBtaWxsaWJlbCAoMS8xMDAgb2YgZGVjaWJlbCkuCisgICAgdm9pZCBzZXRHYWluKGludCBiYW5kLCBpbnQzMl90IG1pbGxpYmVsKTsKKworICAgIC8vIEdldHMgZ2FpbiBvZiBhIGNlcnRhaW4gYmFuZC4gVGhpcyBpcyBhbHdheXMgdGhlIGxhc3QgdmFsdWUgc2V0IChvcgorICAgIC8vIGRlZmF1bHQgdmFsdWUgYWZ0ZXIgcmVzZXQpLgorICAgIC8vIGJhbmQgICAgIFRoZSBiYW5kIHRvIGdldCB0aGUgZ2FpbiBmb3IuCisgICAgLy8gcmV0dXJucyAgR2FpbiB2YWx1ZSBpbiBtaWxsaWJlbCAoMS8xMDAgb2YgZGVjaWJlbCkuCisgICAgaW50MzJfdCBnZXRHYWluKGludCBiYW5kKSBjb25zdDsKKworICAgIC8vIFNldHMgY3V0b2ZmIGZyZXF1ZW5jeSB2YWx1ZS4gQWN0dWFsIGNoYW5nZSB3aWxsIG9ubHkgdGFrZSBwbGFjZSB1cG9uCisgICAgLy8gY29tbWl0KCkuCisgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHJlbWVtYmVyZWQgZXZlbiBpZiB0aGUgZmlsdGVyIGlzIGluIGRpc2FibGVkKCkgc3RhdGUuCisgICAgLy8gYmFuZCAgICAgICBUaGUgYmFuZCB0byBzZXQgdGhlIGZyZXF1ZW5jeSBmb3IuCisgICAgLy8gbWlsbGloZXJ0eiBGcmVxdWVuY3kgdmFsdWUgaW4gbUh6LgorICAgIHZvaWQgc2V0RnJlcXVlbmN5KGludCBiYW5kLCB1aW50MzJfdCBtaWxsaWhlcnR6KTsKKworICAgIC8vIEdldHMgZnJlcXVlbmN5IG9mIGEgY2VydGFpbiBiYW5kLiBUaGlzIGlzIGFsd2F5cyB0aGUgbGFzdCB2YWx1ZSBzZXQgKG9yCisgICAgLy8gZGVmYXVsdCB2YWx1ZSBhZnRlciByZXNldCkuCisgICAgLy8gYmFuZCAgICAgVGhlIGJhbmQgdG8gZ2V0IHRoZSBmcmVxdWVuY3kgZm9yLgorICAgIC8vIHJldHVybnMgIEZyZXF1ZW5jeSB2YWx1ZSBpbiBtSHouCisgICAgdWludDMyX3QgZ2V0RnJlcXVlbmN5KGludCBiYW5kKSBjb25zdDsKKworICAgIC8vIFNldHMgYmFuZHdpZHRoIHZhbHVlLiBBY3R1YWwgY2hhbmdlIHdpbGwgb25seSB0YWtlIHBsYWNlIHVwb24gY29tbWl0KCkuCisgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHJlbWVtYmVyZWQgZXZlbiBpZiB0aGUgZmlsdGVyIGlzIGluIGRpc2FibGVkKCkgc3RhdGUuCisgICAgLy8gSWYgY2FsbGVkIG9uIHRoZSBmaXJzdCBvciBsYXN0IGJhbmQsIHRoaXMgY2FsbCBpcyBpZ25vcmVkLgorICAgIC8vIGJhbmQgIFRoZSBiYW5kIHRvIHNldCB0aGUgZnJlcXVlbmN5IGZvci4KKyAgICAvLyBjZW50cyBCYW5kd2lkdGggdmFsdWUgaW4gY2VudHMgKDEvMTIwMCBvY3RhdmUpLgorICAgIHZvaWQgc2V0QmFuZHdpZHRoKGludCBiYW5kLCB1aW50MzJfdCBjZW50cyk7CisKKyAgICAvLyBHZXRzIGJhbmR3aWR0aCBvZiBhIGNlcnRhaW4gYmFuZC4gVGhpcyBpcyBhbHdheXMgdGhlIGxhc3QgdmFsdWUgc2V0IChvcgorICAgIC8vIGRlZmF1bHQgdmFsdWUgYWZ0ZXIgcmVzZXQpLiBGb3IgdGhlIGZpcnN0IGFuZCBsYXN0IGJhbmRzLCAwIGlzIGFsd2F5cworICAgIC8vIHJldHVybmVkLgorICAgIC8vIGJhbmQgICAgIFRoZSBiYW5kIHRvIGdldCB0aGUgYmFuZHdpZHRoIGZvci4KKyAgICAvLyByZXR1cm5zICBCYW5kd2lkdGggdmFsdWUgaW4gY2VudHMgKDEvMTIwMCBvY3RhdmUpLgorICAgIHVpbnQzMl90IGdldEJhbmR3aWR0aChpbnQgYmFuZCkgY29uc3Q7CisKKyAgICAvLyBHZXRzIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyaWVzIG9mIGEgYmFuZC4KKyAgICAvLyBGb3IgdGhlIGxvdyBzaGVsZiwgdGhlIGxvdyBib3VuZCBpcyAwIGFuZCB0aGUgaGlnaCBib3VuZCBpcyB0aGUgYmFuZAorICAgIC8vIGZyZXF1ZW5jeS4KKyAgICAvLyBGb3IgdGhlIGhpZ2ggc2hlbGYsIHRoZSBsb3cgYm91bmQgaXMgdGhlIGJhbmQgZnJlcXVlbmN5IGFuZCB0aGUgaGlnaAorICAgIC8vIGJvdW5kIGlzIE55cXVpc3QuCisgICAgLy8gRm9yIHRoZSBwZWFraW5nIGZpbHRlcnMsIHRoZXkgYXJlIHRoZSBnYWluW2RCXS8yIHBvaW50cy4KKyAgICB2b2lkIGdldEJhbmRSYW5nZShpbnQgYmFuZCwgdWludDMyX3QgJiBsb3csIHVpbnQzMl90ICYgaGlnaCkgY29uc3Q7CisKKyAgICAvLyBHZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYSBwcmVzZXQgSUQuIFdpbGwgcmV0dXJuICJDdXN0b20iIGlmCisgICAgLy8gUFJFU0VUX0NVU1RPTSBpcyBwYXNzZWQuCisgICAgLy8gcHJlc2V0ICAgICAgIFRoZSBwcmVzZXQgSUQuIE11c3QgYmUgbGVzcyB0aGFuIG51bWJlciBvZiBwcmVzZXRzLgorICAgIGNvbnN0IGNoYXIgKiBnZXRQcmVzZXROYW1lKGludCBwcmVzZXQpIGNvbnN0OworCisgICAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHByZXNldHMuCisgICAgaW50IGdldE51bVByZXNldHMoKSBjb25zdDsKKworICAgIC8vIEdldHMgdGhlIGN1cnJlbnRseSBzZXQgcHJlc2V0IElELgorICAgIC8vIFdpbGwgcmV0dXJuIFBSRVNFVF9DVVNUT00gaW4gY2FzZSB0aGUgRVEgcGFyYW1ldGVycyBoYXZlIGJlZW4gbW9kaWZpZWQKKyAgICAvLyBtYW51YWxseSBzaW5jZSBhIHByZXNldCB3YXMgc2V0LgorICAgIGludCBnZXRQcmVzZXQoKSBjb25zdDsKKworICAgIC8vIFNldHMgdGhlIGN1cnJlbnQgcHJlc2V0IGJ5IElELgorICAgIC8vIEFsbCB0aGUgYmFuZCBwYXJhbWV0ZXJzIHdpbGwgYmUgb3ZlcnJpZGRlbi4KKyAgICAvLyBDaGFuZ2Ugd2lsbCBub3QgYmUgYXBwbGllZCB1bnRpbCBjb21taXQoKSBpcyBjYWxsZWQuCisgICAgLy8gcHJlc2V0ICAgICAgIFRoZSBwcmVzZXQgSUQuIE11c3QgYmUgbGVzcyB0aGFuIG51bWJlciBvZiBwcmVzZXRzLgorICAgIC8vICAgICAgICAgICAgICBQUkVTRVRfQ1VTVE9NIGlzIE5PVCBhIHZhbGlkIHZhbHVlIGhlcmUuCisgICAgdm9pZCBzZXRQcmVzZXQoaW50IHByZXNldCk7CisKKyAgICAvLyBBcHBsaWVzIGFsbCBwYXJhbWV0ZXIgY2hhbmdlcyBkb25lIHRvIHRoaXMgcG9pbnQgaW4gdGltZS4KKyAgICAvLyBJZiB0aGUgZmlsdGVyIGlzIGRpc2FibGVkLCB0aGUgbmV3IHBhcmFtZXRlcnMgd2lsbCB0YWtlIHBsYWNlIHdoZW4gaXQgaXMKKyAgICAvLyBlbmFibGVkIGFnYWluLiBEb2VzIG5vdCBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MgaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkgKGlnbm9yZWQgaWYgZmlsdGVyIGlzCisgICAgLy8gZGlzYWJsZWQpLgorICAgdm9pZCBjb21taXQoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSk7CisKKyAgICAvLyBQcm9jZXNzIGEgYnVmZmVyIG9mIGlucHV0IGRhdGEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHNob3VsZCBjb250YWluCisgICAgLy8gZnJhbWVDb3VudCAqIG5DaGFubmVscyBpbnRlcmxhY2VkIHNhbXBsZXMuIFByb2Nlc3NpbmcgY2FuIGJlIGRvbmUKKyAgICAvLyBpbi1wbGFjZSwgYnkgcGFzc2luZyB0aGUgc2FtZSBidWZmZXIgYXMgYm90aCBhcmd1bWVudHMuCisgICAgLy8gcEluICAgICAgICAgIElucHV0IGJ1ZmZlci4KKyAgICAvLyBwT3V0ICAgICAgICAgT3V0cHV0IGJ1ZmZlci4KKyAgICAvLyBmcmFtZUNvdW50ICAgTnVtYmVyIG9mIGZyYW1lcyB0byBwcm9kdWNlIG9uIGVhY2ggY2FsbCB0byBwcm9jZXNzKCkuCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogcEluLCBhdWRpb19zYW1wbGVfdCAqIHBPdXQsCisgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KTsKKworICAgIC8vIEVuYWJsZXMgdGhlIGZpbHRlciwgc28gaXQgd291bGQgc3RhcnQgcHJvY2Vzc2luZyBpbnB1dC4gRG9lcyBub3QKKyAgICAvLyBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MgaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkuCisgICAgdm9pZCBlbmFibGUoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSk7CisKKyAgICAvLyBEaXNhYmxlZCAoYnlwYXNzZXMpIHRoZSBmaWx0ZXIuIERvZXMgbm90IGludHJvZHVjZSBhcnRpZmFjdHMsIHVubGVzcworICAgIC8vIGltbWVkaWF0ZSBpcyBzZXQuCisgICAgLy8gaW1tZWRpYXRlICAgIFdoZXRoZXIgdG8gYXBwbHkgY2hhbmdlIGFicnVwdGx5LgorICAgIHZvaWQgZGlzYWJsZShib29sIGltbWVkaWF0ZSA9IGZhbHNlKTsKKworICAgIC8vIFJldHVybnMgdGhlIGJhbmQgd2l0aCB0aGUgbWF4aW11bSBpbmZsdWVuY2Ugb24gYSBnaXZlbiBmcmVxdWVuY3kuCisgICAgLy8gUmVzdWx0IGlzIHVuYWZmZWN0ZWQgYnkgd2hldGhlciBFUSBpcyBlbmFibGVkIG9yIG5vdCwgb3IgYnkgd2hldGhlcgorICAgIC8vIGNoYW5nZXMgaGF2ZSBiZWVuIGNvbW1pdHRlZCBvciBub3QuCisgICAgLy8gdGFyZ2V0RnJlcSAgIFRoZSB0YXJnZXQgZnJlcXVlbmN5LCBpbiBtaWxsaWhlcnR6LgorICAgIGludCBnZXRNb3N0UmVsZXZhbnRCYW5kKHVpbnQzMl90IHRhcmdldEZyZXEpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIEJvdHRvbSBmcmVxdWVuY3ksIGluIG1Iei4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtNaW5GcmVxID0gMjAwMDA7CisgICAgLy8gU2FtcGxlIHJhdGUsIGluIEh6LgorICAgIGludCBtU2FtcGxlUmF0ZTsKKyAgICAvLyBOdW1iZXIgb2YgcGVha2luZyBmaWx0ZXJzLiBUb3RhbCBudW1iZXIgb2YgYmFuZHMgaXMgKzIuCisgICAgaW50IG1OdW1QZWFraW5nOworICAgIC8vIFByZXNldCBjb25maWd1cmF0aW9ucy4KKyAgICBjb25zdCBQcmVzZXRDb25maWcgKiBtcFByZXNldHM7CisgICAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIG1wUHJlc2V0czsKKyAgICBpbnQgbU51bVByZXNldHM7CisgICAgLy8gQ3VycmVudCBwcmVzZXQuCisgICAgaW50IG1DdXJQcmVzZXQ7CisKKyAgICAvLyBNZW1vcnkgc3BhY2UgdG8gZnJlZSB3aGVuIGluc3RhbmNlIGlzIGRlbGV0ZWQsIG9yIE5VTEwgaWYgbm8gbWVtb3J5IGlzCisgICAgLy8gb3duZWQuCisgICAgdm9pZCAqIG1wTWVtOworICAgIC8vIFRoZSBsb3ctc2hlbHZpbmcgZmlsdGVyLgorICAgIEF1ZGlvU2hlbHZpbmdGaWx0ZXIgKiBtcExvd1NoZWxmOworICAgIC8vIFRoZSBoaWdoLXNoZWx2aW5nIGZpbHRlci4KKyAgICBBdWRpb1NoZWx2aW5nRmlsdGVyICogbXBIaWdoU2hlbGY7CisgICAgLy8gQW4gYXJyYXkgb2Ygc2l6ZSBtTnVtUGVha2luZyBvZiBwZWFraW5nIGZpbHRlcnMuCisgICAgQXVkaW9QZWFraW5nRmlsdGVyICogbXBQZWFraW5nRmlsdGVyczsKKworICAgIC8vIENvbnN0cnVjdG9yLiBSZXNldHMgdGhlIGZpbHRlciAoc2VlIHJlc2V0KCkpLiBNdXN0IGNhbGwgaW5pdCgpIGRvaW5nCisgICAgLy8gYW55dGhpbmcgZWxzZS4KKyAgICAvLyBwTWVtICAgICAgIE1lbW9yeSBidWZmZXIgZm9yIGJhbmRzLgorICAgIC8vIG5DaGFubmVscyAgTnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscyAoaW50ZXJsYWNlZCkuCisgICAgLy8gc2FtcGxlUmF0ZSBUaGUgaW5wdXQvb3V0cHV0IHNhbXBsZSByYXRlLCBpbiBIei4KKyAgICAvLyBvd25NZW0gICAgIFdoZXRoZXIgcE1lbSBpcyBvd25lZCBieSBtZS4KKyAgICAvLyBwcmVzZXRzICAgICAgVGhlIHByZXNldHMgY29uZmlndXJhdGlvbi4gTWF5IGJlIE5VTEwsIGJ1dCBpbiB0aGF0IGNhc2UgdGhlCisgICAgLy8gICAgICAgICAgICAgIGNsaWVudCBpcyByZXF1aXJlZCBub3QgdG8gY2FsbCBwcmVzZXQtcmVsYXRlZCBmdW5jdGlvbnMuCisgICAgLy8gICAgICAgICAgICAgIFRoaXMgYXJyYXkgaXMgb3duZWQgYnkgdGhlIGNsaWVudCBhbmQgaXMgbm90IGNvcGllZC4gSXQKKyAgICAvLyAgICAgICAgICAgICAgbXVzdCBiZSBrZXB0IHZhbGlkIGJ5IHRoZSBjbGllbnQgYXMgbG9uZyBhcyB0aGUgaW5zdGFuY2UgaXMKKyAgICAvLyAgICAgICAgICAgICAgYWxpdmUuCisgICAgLy8gblByZXNldHMgICAgIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcHJlc2V0cyBhcnJheS4KKyAgICBBdWRpb0VxdWFsaXplcih2b2lkICogcE1lbSwgaW50IG5CYW5kcywgaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBvd25NZW0sIGNvbnN0IFByZXNldENvbmZpZyAqIHByZXNldHMsIGludCBuUHJlc2V0cyk7Cit9OworCit9CisKKyNlbmRpZiAvLyBBVURJT0VRVUFMSVpFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Gb3JtYXRBZGFwdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzZWJlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9Gb3JtYXRBZGFwdGVyLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qIC9hbmRyb2lkL3NyYy9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGliZWZmZWN0cy9BdWRpb0Zvcm1hdEFkYXB0ZXIuaAorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFVRElPRk9STUFUQURBUFRFUl9IXworI2RlZmluZSBBVURJT0ZPUk1BVEFEQVBURVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgorCisKKyNkZWZpbmUgbWluKHgseSkgKCgoeCkgPCAoeSkpID8gKHgpIDogKHkpKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEFuIGFkYXB0ZXIgZm9yIGFuIGF1ZGlvIHByb2Nlc3NvciB3b3JraW5nIG9uIGF1ZGlvX3NhbXBsZV90IHNhbXBsZXMgd2l0aCBhCisvLyBidWZmZXIgb3ZlcnJpZGUgYmVoYXZpb3IgdG8gYXJiaXRyYXJ5IHNhbXBsZSBmb3JtYXRzIGFuZCBidWZmZXIgYmVoYXZpb3JzLgorLy8gVGhlIGFkYXB0ZXIgbWF5IHdvcmsgb24gYW55IHByb2Nlc3NpbmcgY2xhc3Mgd2hpY2ggaGFzIGEgcHJvY2Vzc2luZyBmdW5jdGlvbgorLy8gd2l0aCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKy8vIHZvaWQgcHJvY2Vzcyhjb25zdCBhdWRpb19zYW1wbGVfdCAqIHBJbiwKKy8vICAgICAgICAgICAgICBhdWRpb19zYW1wbGVfdCAqIHBPdXQsCisvLyAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpOworLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSB1bmRlcmx5aW5nIHByb2Nlc3NvciB3b3JrcyBpbiBTNy4yNCBmb3JtYXQgYW5kIGFuCisvLyBvdmVyd3JpdGUgYmVoYXZpb3IuCisvLworLy8gVXNhZ2UgaXMgc2ltcGxlOiBqdXN0IHdvcmsgd2l0aCB0aGUgcHJvY2Vzc29yIG5vcm1hbGx5LCBidXQgaW5zdGVhZCBvZgorLy8gY2FsbGluZyBpdHMgcHJvY2VzcygpIGZ1bmN0aW9uIGRpcmVjdGx5LCB3b3JrIHdpdGggdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBvZgorLy8gdGhlIGFkYXB0ZXIuCisvLyBUaGUgYWRhcHRlciBzdXBwb3J0cyByZS1jb25maWd1cmF0aW9uIHRvIGEgZGlmZmVyZW50IGZvcm1hdCBvbiB0aGUgZmx5LgorLy8KKy8vIFQgICAgICAgIFRoZSBwcm9jZXNzb3IgY2xhc3MuCisvLyBidWZTaXplICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2FtcGxlcyAoc2luZ2xlIGNoYW5uZWwpIHRvIHByb2Nlc3Mgb24gYQorLy8gICAgICAgICAgc2luZ2xlIGNhbGwgdG8gdGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yLiBTZXR0aW5nIHRoaXMgdG8gYSBzbWFsbAorLy8gICAgICAgICAgbnVtYmVyIHdpbGwgc2F2ZSBhIGxpdHRsZSBtZW1vcnksIGJ1dCB3aWxsIGNvc3QgZnVuY3Rpb24gY2FsbAorLy8gICAgICAgICAgb3ZlcmhlYWQsIHJlc3VsdGluZyBmcm9tIG11bHRpcGxlIGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nIHByb2Nlc3MoKQorLy8gICAgICAgICAgcGVyIGEgc2luZ2xlIGNhbGwgdG8gdGhpcyBjbGFzcydzIHByb2Nlc3MoKS4KK3RlbXBsYXRlPGNsYXNzIFQsIHNpemVfdCBidWZTaXplPgorY2xhc3MgQXVkaW9Gb3JtYXRBZGFwdGVyIHsKK3B1YmxpYzoKKyAgICAvLyBDb25maWd1cmUgdGhlIGFkYXB0ZXIuCisgICAgLy8gcHJvY2Vzc29yICAgIFRoZSB1bmRlcmx5aW5nIGF1ZGlvIHByb2Nlc3Nvci4KKyAgICAvLyBuQ2hhbm5lbHMgICAgTnVtYmVyIG9mIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMuIFRoZSBhZGFwdGVyIGRvZXMgbm90IGRvCisgICAgLy8gICAgICAgICAgICAgIGNoYW5uZWwgY29udmVyc2lvbiAtIHRoaXMgcGFyYW1ldGVyIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZQorICAgIC8vICAgICAgICAgICAgICBhY3R1YWwgcHJvY2Vzc29yLgorICAgIC8vIHBjbUZvcm1hdCAgICBUaGUgZGVzaXJlZCBpbnB1dC9vdXRwdXQgc2FtcGxlIGZvcm1hdC4KKyAgICAvLyBiZWhhdmlvciAgICAgVGhlIGRlc2lyZWQgYmVoYXZpb3IgKG92ZXJ3cml0ZSBvciBhY2N1bXVsYXRlKS4KKyAgICB2b2lkIGNvbmZpZ3VyZShUICYgcHJvY2Vzc29yLCBpbnQgbkNoYW5uZWxzLCB1aW50OF90IHBjbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiZWhhdmlvcikgeworICAgICAgICBtcFByb2Nlc3NvciA9ICZwcm9jZXNzb3I7CisgICAgICAgIG1OdW1DaGFubmVscyA9IG5DaGFubmVsczsKKyAgICAgICAgbVBjbUZvcm1hdCA9IHBjbUZvcm1hdDsKKyAgICAgICAgbUJlaGF2aW9yID0gYmVoYXZpb3I7CisgICAgICAgIG1NYXhTYW1wbGVzUGVyQ2FsbCA9IGJ1ZlNpemUgLyBuQ2hhbm5lbHM7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMuCisgICAgLy8gcEluICAgICAgICAgIEEgYnVmZmVyIG9mIHNhbXBsZXMgd2l0aCB0aGUgZm9ybWF0IHNwZWNpZmllZCBvbgorICAgIC8vICAgICAgICAgICAgICBjb25maWd1cmUoKS4KKyAgICAvLyBwT3V0ICAgICAgICAgQSBidWZmZXIgb2Ygc2FtcGxlcyB3aXRoIHRoZSBmb3JtYXQgc3BlY2lmaWVkIG9uCisgICAgLy8gICAgICAgICAgICAgIGNvbmZpZ3VyZSgpLiBNYXkgYmUgdGhlIHNhbWUgYXMgcEluLgorICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIG11bHRpLWNoYW5uZWwgc2FtcGxlcyB0byBwcm9jZXNzLgorICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB2b2lkICogcEluLCB2b2lkICogcE91dCwgdWludDMyX3QgbnVtU2FtcGxlcykgeworICAgICAgICB3aGlsZSAobnVtU2FtcGxlcyA+IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXNJdGVyID0gbWluKG51bVNhbXBsZXMsIG1NYXhTYW1wbGVzUGVyQ2FsbCk7CisgICAgICAgICAgICB1aW50MzJfdCBuU2FtcGxlc0NoYW5uZWxzID0gbnVtU2FtcGxlc0l0ZXIgKiBtTnVtQ2hhbm5lbHM7CisgICAgICAgICAgICBpZiAobVBjbUZvcm1hdCA9PSBTQU1QTEVfRk9STUFUX1BDTV9TN18yNCkgeworICAgICAgICAgICAgICAgIGlmIChtQmVoYXZpb3IgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBQcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGF1ZGlvX3NhbXBsZV90ICo+IChwSW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxhdWRpb19zYW1wbGVfdCAqPiAocE91dCksCisgICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzSXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQmVoYXZpb3IgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgICAgICAgICBtcFByb2Nlc3Nvci0+cHJvY2VzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYXVkaW9fc2FtcGxlX3QgKj4gKHBJbiksCisgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLCBudW1TYW1wbGVzSXRlcik7CisgICAgICAgICAgICAgICAgICAgIE1peE91dHB1dChwT3V0LCBudW1TYW1wbGVzSXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcEluID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBhdWRpb19zYW1wbGVfdCAqPiAocEluKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBuU2FtcGxlc0NoYW5uZWxzOworICAgICAgICAgICAgICAgIHBPdXQgPSByZWludGVycHJldF9jYXN0PGF1ZGlvX3NhbXBsZV90ICo+IChwT3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgKyBuU2FtcGxlc0NoYW5uZWxzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb252ZXJ0SW5wdXQocEluLCBuU2FtcGxlc0NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBtcFByb2Nlc3Nvci0+cHJvY2VzcyhtQnVmZmVyLCBtQnVmZmVyLCBudW1TYW1wbGVzSXRlcik7CisgICAgICAgICAgICAgICAgQ29udmVydE91dHB1dChwT3V0LCBuU2FtcGxlc0NoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bVNhbXBsZXMgLT0gbnVtU2FtcGxlc0l0ZXI7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gVGhlIHVuZGVybHlpbmcgcHJvY2Vzc29yLgorICAgIFQgKiBtcFByb2Nlc3NvcjsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscy4KKyAgICBpbnQgbU51bUNoYW5uZWxzOworICAgIC8vIFRoZSBkZXNpcmVkIFBDTSBmb3JtYXQuCisgICAgdWludDhfdCBtUGNtRm9ybWF0OworICAgIC8vIFRoZSBkZXNpcmVkIGJ1ZmZlciBiZWhhdmlvci4KKyAgICB1aW50MzJfdCBtQmVoYXZpb3I7CisgICAgLy8gQW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgcHJvY2Vzc2luZy4KKyAgICBhdWRpb19zYW1wbGVfdCBtQnVmZmVyW2J1ZlNpemVdOworICAgIC8vIFRoZSBidWZmZXIgc2l6ZSwgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIC0gcmVwcmVzZW50cyB0aGUKKyAgICAvLyBtYXhpbXVtIG51bWJlciBvZiBtdWx0aS1jaGFubmVsIHNhbXBsZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZQorICAgIC8vIGludGVybWVkaWF0ZSBidWZmZXIuCisgICAgc2l6ZV90IG1NYXhTYW1wbGVzUGVyQ2FsbDsKKworICAgIC8vIENvbnZlcnRzIGEgYnVmZmVyIG9mIGlucHV0IHNhbXBsZXMgdG8gYXVkaW9fc2FtcGxlX3QgZm9ybWF0LgorICAgIC8vIE91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSBpbnRlcm1lZGlhdGUgYnVmZmVyLgorICAgIC8vIHBJbiAgICAgICAgICBUaGUgaW5wdXQgYnVmZmVyIHdpdGggdGhlIGZvcm1hdCBkZXNpZ25hdGVkIGluIGNvbmZpZ3VyZSgpLgorICAgIC8vICAgICAgICAgICAgICBXaGVuIGZ1bmN0aW9uIGV4aXN0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgdW5yZWFkIGlucHV0CisgICAgLy8gICAgICAgICAgICAgIHNhbXBsZS4KKyAgICAvLyBudW1TYW1wbGVzICAgVGhlIG51bWJlciBvZiBzaW5nbGUtY2hhbm5lbCBzYW1wbGVzIHRvIHByb2Nlc3MuCisgICAgdm9pZCBDb252ZXJ0SW5wdXQoY29uc3Qgdm9pZCAqJiBwSW4sIHVpbnQzMl90IG51bVNhbXBsZXMpIHsKKyAgICAgICAgaWYgKG1QY21Gb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90ICogcEluMTYgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2X3QgKj4ocEluKTsKKyAgICAgICAgICAgIGF1ZGlvX3NhbXBsZV90ICogcE91dCA9IG1CdWZmZXI7CisgICAgICAgICAgICB3aGlsZSAobnVtU2FtcGxlcy0tID4gMCkgeworICAgICAgICAgICAgICAgICoocE91dCsrKSA9IHMxNV90b19hdWRpb19zYW1wbGVfdCgqKHBJbjE2KyspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBJbiA9IHBJbjE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENvbnZlcnRzIGF1ZGlvX3NhbXBsZV90IHNhbXBsZXMgZnJvbSB0aGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciB0byB0aGUKKyAgICAvLyBvdXRwdXQgYnVmZmVyLCBjb252ZXJ0aW5nIHRvIHRoZSBkZXNpcmVkIGZvcm1hdCBhbmQgYnVmZmVyIGJlaGF2aW9yLgorICAgIC8vIHBPdXQgICAgICAgICBUaGUgYnVmZmVyIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCisgICAgLy8gICAgICAgICAgICAgIFdoZW4gZnVuY3Rpb24gZXhpc3Qgd2lsbCBwb2ludCB0byB0aGUgbmV4dCBvdXRwdXQgc2FtcGxlLgorICAgIC8vIG51bVNhbXBsZXMgICBUaGUgbnVtYmVyIG9mIHNpbmdsZS1jaGFubmVsIHNhbXBsZXMgdG8gcHJvY2Vzcy4KKyAgICB2b2lkIENvbnZlcnRPdXRwdXQodm9pZCAqJiBwT3V0LCB1aW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgICAgIGlmIChtUGNtRm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1MxNSkgeworICAgICAgICAgICAgY29uc3QgYXVkaW9fc2FtcGxlX3QgKiBwSW4gPSBtQnVmZmVyOworICAgICAgICAgICAgaW50MTZfdCAqIHBPdXQxNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihwT3V0KTsKKyAgICAgICAgICAgIGlmIChtQmVoYXZpb3IgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobnVtU2FtcGxlcy0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAqKHBPdXQxNisrKSA9IGF1ZGlvX3NhbXBsZV90X3RvX3MxNV9jbGlwKCoocEluKyspKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1CZWhhdmlvciA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKG51bVNhbXBsZXMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKihwT3V0MTYrKykgKz0gYXVkaW9fc2FtcGxlX3RfdG9fczE1X2NsaXAoKihwSW4rKykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBPdXQgPSBwT3V0MTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWNjdW11bGF0ZSBkYXRhIGZyb20gdGhlIGludGVybWVkaWF0ZSBidWZmZXIgdG8gdGhlIG91dHB1dC4gT3V0cHV0IGlzCisgICAgLy8gYXNzdW1lZCB0byBiZSBvZiBhdWRpb19zYW1wbGVfdCB0eXBlLgorICAgIC8vIHBPdXQgICAgICAgICBUaGUgYnVmZmVyIHRvIG1peCB0aGUgb3V0cHV0IHRvLgorICAgIC8vICAgICAgICAgICAgICBXaGVuIGZ1bmN0aW9uIGV4aXN0IHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgb3V0cHV0IHNhbXBsZS4KKyAgICAvLyBudW1TYW1wbGVzICAgVGhlIG51bWJlciBvZiBzaW5nbGUtY2hhbm5lbCBzYW1wbGVzIHRvIHByb2Nlc3MuCisgICAgdm9pZCBNaXhPdXRwdXQodm9pZCAqJiBwT3V0LCB1aW50MzJfdCBudW1TYW1wbGVzKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3NhbXBsZV90ICogcEluID0gbUJ1ZmZlcjsKKyAgICAgICAgYXVkaW9fc2FtcGxlX3QgKiBwT3V0MjQgPSByZWludGVycHJldF9jYXN0PGF1ZGlvX3NhbXBsZV90ICo+KHBPdXQpOworICAgICAgICBudW1TYW1wbGVzICo9IG1OdW1DaGFubmVsczsKKyAgICAgICAgd2hpbGUgKG51bVNhbXBsZXMtLSA+IDApIHsKKyAgICAgICAgICAgICoocE91dDI0KyspICs9ICoocEluKyspOworICAgICAgICB9CisgICAgICAgIHBPdXQgPSBwT3V0MjQ7CisgICAgfQorfTsKKworfQorCisjZW5kaWYgLy8gQVVESU9GT1JNQVRBREFQVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvSGlnaFNoZWxmRmlsdGVyQ29lZi5pbmwgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvSGlnaFNoZWxmRmlsdGVyQ29lZi5pbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiYTEzOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9IaWdoU2hlbGZGaWx0ZXJDb2VmLmlubApAQCAtMCwwICsxLDIyNSBAQAorMTM2NzksCisyMTU3NSwKKzg5MjEsCiszMjMxNTA1NiwKKy0xNTU4MjAxNSwKKzI2MTcyLAorMzc2NzgsCisxNDc5NywKKzMxODkxMDk2LAorLTE1MTkyNTI3LAorNTEwMjAsCis2NDQ0OSwKKzIzOTQ1LAorMzEzMjI5ODgsCistMTQ2ODUxODYsCisxMDE4MTcsCisxMDYxNDQsCiszNzc0NCwKKzMwNTYyODgyLAorLTE0MDMxMzcyLAorMjA4OTk2LAorMTYyMTYzLAorNTg1MzYsCisyOTU0ODUzOCwKKy0xMzIwMTAxNywKKzQ0Mjk5NiwKKzIwNzQ1OSwKKzkzMzAwLAorMjgyMDA3OTIsCistMTIxNjczMzEsCis5NzE0MjMsCisxMjg3ODYsCisxNjk2OTAsCisyNjQyMjc0NCwKKy0xMDkxNTQyOCwKKzIyMDA0NjEsCistNDY1Njg2LAorMzk0OTg2LAorMjQxMDMzMTcsCistOTQ1NTg2MiwKKzUxMTk5OTEsCistMjc3NzE5OSwKKzExNDcyNDUsCisyMTEyOTQ3MywKKy03ODQyMjk0LAorMTIxMjAzNzksCistMTAxOTgxNjAsCiszNjMxNTQ0LAorMTc0MTE4MzcsCistNjE4ODM4NCwKKzI4ODM0MjM0LAorLTMxNjQ3MTM1LAorMTEzMzc3OTUsCisxMjkyNDk2MCwKKy00NjcyNjM4LAorNjgwMzc3NjYsCistODg5NzQzODgsCiszMzQ3NzI1NSwKKzc3NTI2ODAsCistMzUxNjA5OCwKKzE1NzM2OTk0NCwKKy0yMzIwNjMxNjAsCis5MjI4MjEyOSwKKzIxMTM5MjYsCistMjkyNTYyNCwKKzM1MzcyMDExMiwKKy01Njc0MjcxNDQsCisyMzcxNjQxMTIsCistMzY1OTk5MywKKy0zMDE5ODcxLAorNzY5MDkxMTUxLAorLTEzMDk4NzE5NDksCis1NzA1Mzk0MzAsCistOTIwMjExNCwKKy0zNzc5MzAyLAorNjY3OTEsCisxMjE3MDYsCis1NTg4OCwKKzMwNTcxMjQ1LAorLTE0MDM4NDE1LAorMTIwNDI2LAorMjEyMTc4LAorOTQ4MjAsCisyOTU1OTY3OSwKKy0xMzIwOTg4NiwKKzIxNzEzMCwKKzM2NTE2NSwKKzE1NzYxMCwKKzI4MjE1NTU0LAorLTEyMTc4MjQzLAorMzkxNDg5LAorNjE3MDE2LAorMjU1MDEwLAorMjY0NDIxMzEsCistMTA5Mjg0MzEsCis3MDU4NjIsCisxMDE1MTQ3LAorMzk4NDU3LAorMjQxMjg0MzAsCistOTQ3MDY4MCwKKzEyNzI2ODIsCisxNjA1MjUxLAorNTk2MTAyLAorMjExNjEzMzQsCistNzg1ODE1MywKKzIyOTQ2NjgsCisyMzg2ODMzLAorODQ4NTIzLAorMTc0NTEwNzIsCistNjIwMzg4MCwKKzQxMzczMjcsCiszMTk4Nzg5LAorMTE1NTUzNiwKKzEyOTcxMzYyLAorLTQ2ODU3OTgsCis3NDU5Njc1LAorMzQ3MDI2NiwKKzE1NjcyMTksCis3ODA0ODE4LAorLTM1MjQ3NjEsCisxMzQ0OTkyNiwKKzE3Mzg5MTEsCisyMzQ3NDA2LAorMjE2OTA4OSwKKy0yOTI4MTE2LAorMjQyNTA0NTUsCistNTIxMTI0MSwKKzQzNTg5NzEsCistMzYwNTI5OCwKKy0zMDE1NjcxLAorNDM3MjQwMDEsCistMjM4NDk1NzAsCis5ODIzMzE1LAorLTkxNTEyNTMsCistMzc2OTI3NywKKzc4ODM1MTUwLAorLTY2NTQyMzc1LAorMjM2ODYzNzMsCistMTQxNjExNDMsCistNTA0MDc5MCwKKzE0MjE0MTE3MywKKy0xNTYzMjQyNjEsCis1NjAyNDIzNCwKKy0xODQ1MTI3NSwKKy02NjEyNjU2LAorMjU2MjgzMDU3LAorLTMzNTYwNjMyNiwKKzEyNjM0MTI0NCwKKy0yMTk3MDAwNCwKKy04MjcwNzU1LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LAorMTY3NzcyMTYsCiszMzU1NDQzMiwKKzE2Nzc3MjE2LAorLTMzNTU0NDMyLAorLTE2Nzc3MjE2LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0xvd1NoZWxmRmlsdGVyQ29lZi5pbmwgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvTG93U2hlbGZGaWx0ZXJDb2VmLmlubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdkZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb0xvd1NoZWxmRmlsdGVyQ29lZi5pbmwKQEAgLTAsMCArMSwzNzUgQEAKKzE2MjEyNTA2LAorLTMyNDIwNTc0LAorMTYyMDgwNjgsCiszMjQwMTQxMSwKKy0xNTY2MjUyMSwKKzE2MzU2MTI5LAorLTMyNzA2MjQ2LAorMTYzNTAxMTgsCiszMjY5NTUyNSwKKy0xNTkzOTc1MiwKKzE2NDY0Mzk5LAorLTMyOTIwNjcwLAorMTY0NTYyNzQsCiszMjkxNDY4NiwKKy0xNjE0OTQ0MSwKKzE2NTQ2MTI4LAorLTMzMDgxMjg5LAorMTY1MzUxNjUsCiszMzA3Nzk1NSwKKy0xNjMwNzQxMSwKKzE2NjA4MTAxLAorLTMzMjAxNDIyLAorMTY1OTMzMjgsCiszMzE5OTU2OSwKKy0xNjQyNjA2NywKKzE2NjU1NTM5LAorLTMzMjkxMTc0LAorMTY2MzU2NDcsCiszMzI5MDE0NywKKy0xNjUxNDk5NywKKzE2NjkyNDc4LAorLTMzMzU4MTcxLAorMTY2NjU3MTUsCiszMzM1NzYwOCwKKy0xNjU4MTU0MCwKKzE2NzIyMDg5LAorLTMzNDA4MTQ5LAorMTY2ODYwOTksCiszMzQwNzg1MCwKKy0xNjYzMTI3MSwKKzE2NzQ2OTMwLAorLTMzNDQ1NDA5LAorMTY2OTg1NDksCiszMzQ0NTI2NywKKy0xNjY2ODQwNSwKKzE2NzY5MTU2LAorLTMzNDczMTY4LAorMTY3MDQxMzgsCiszMzQ3MzEzMywKKy0xNjY5NjExNCwKKzE2NzkwNzA2LAorLTMzNDkzODI3LAorMTY3MDMzNDgsCiszMzQ5Mzg4NiwKKy0xNjcxNjc3OSwKKzE2ODEzNDY2LAorLTMzNTA5MTY2LAorMTY2OTYxMTEsCiszMzUwOTM0MiwKKy0xNjczMjE4NiwKKzE2ODM5NDM3LAorLTMzNTIwNDk4LAorMTY2ODE4MDIsCiszMzUyMDg1MiwKKy0xNjc0MzY2OSwKKzE2ODcwOTExLAorLTMzNTI4NzY1LAorMTY2NTkxOTEsCiszMzUyOTQyNCwKKy0xNjc1MjIyNiwKKzE2OTEwNjgxLAorLTMzNTM0NjA3LAorMTY2MjYzMzcsCiszMzUzNTgwNywKKy0xNjc1ODYwMiwKKzE1NjY3NDAxLAorLTMxMzI2MjI0LAorMTU2NTg4MjUsCiszMTI1MjE2MSwKKy0xNDYyMzA3NCwKKzE1OTQ1ODY1LAorLTMxODgwMDA3LAorMTU5MzQxNDYsCiszMTgzODIwNSwKKy0xNTE0NDU5NywKKzE2MTU3NTIxLAorLTMyMjk5MDkxLAorMTYxNDE1NzgsCiszMjI3NTYwNCwKKy0xNTU0NTM2OSwKKzE2MzE4MjY3LAorLTMyNjE0OTAzLAorMTYyOTY2NTEsCiszMjYwMTc1NSwKKy0xNTg1MDg1MCwKKzE2NDQwNzEwLAorLTMyODUyMTU3LAorMTY0MTE0NzMsCiszMjg0NDgyMCwKKy0xNjA4MjMwMywKKzE2NTM0NzUxLAorLTMzMDI5OTg1LAorMTY0OTUyODEsCiszMzAyNTkxMCwKKy0xNjI1Njg5MSwKKzE2NjA4MTcxLAorLTMzMTYzMDQzLAorMTY1NTQ5NTcsCiszMzE2MDgwMywKKy0xNjM4ODE1MiwKKzE2NjY3MTQ1LAorLTMzMjYyNDY4LAorMTY1OTU0NzcsCiszMzI2MTI3NSwKKy0xNjQ4NjU5OSwKKzE2NzE2Njk5LAorLTMzMzM2NjcxLAorMTY2MjAyNTIsCiszMzMzNjEwNSwKKy0xNjU2MDMwMSwKKzE2NzYxMTAwLAorLTMzMzkxOTc2LAorMTY2MzEzNzksCiszMzM5MTgzNiwKKy0xNjYxNTQwNCwKKzE2ODA0MjA3LAorLTMzNDMzMTAzLAorMTY2Mjk4MDYsCiszMzQzMzM0MSwKKy0xNjY1NjU2MCwKKzE2ODQ5Nzk0LAorLTMzNDYzNTUxLAorMTY2MTUzOTksCiszMzQ2NDI1MSwKKy0xNjY4NzI3NywKKzE2OTAxODg3LAorLTMzNDg1ODU3LAorMTY1ODY5MzMsCiszMzQ4NzI3MSwKKy0xNjcxMDE4OSwKKzE2OTY1MTI1LAorLTMzNTAxNzgxLAorMTY1NDIwMDAsCiszMzUwNDQxNSwKKy0xNjcyNzI3NCwKKzE3MDQ1MTk4LAorLTMzNTEyMzg0LAorMTY0NzY4MjQsCiszMzUxNzE4MywKKy0xNjc0MDAwOCwKKzE0NjM1MjAxLAorLTI5MjU0Mzc2LAorMTQ2MTkxODQsCisyODk3NzcxMSwKKy0xMjc1MzgzNCwKKzE1MTU3NTU2LAorLTMwMjkyODI1LAorMTUxMzUyODUsCiszMDEzMzkzOCwKKy0xMzY3NDUxMywKKzE1NTYxNTExLAorLTMxMDkyMjk4LAorMTU1MzA4MTcsCiszMTAwMTg2MCwKKy0xNDQwNTU1MSwKKzE1ODcyMjExLAorLTMxNzAyMzQyLAorMTU4MzAxODcsCiszMTY1MTIxOCwKKy0xNDk3NjMwNiwKKzE2MTExMDk0LAorLTMyMTY0ODM0LAorMTYwNTM4NDMsCiszMjEzNjEwMSwKKy0xNTQxNjQ1MywKKzE2Mjk1ODQ4LAorLTMyNTEzODAyLAorMTYyMTgxNDAsCiszMjQ5Nzc1NywKKy0xNTc1MjgxNywKKzE2NDQwODUyLAorLTMyNzc2MTc5LAorMTYzMzU2NjUsCiszMjc2NzMyNiwKKy0xNjAwODE1NSwKKzE2NTU3ODA0LAorLTMyOTcyOTA3LAorMTY0MTU3MTUsCiszMjk2ODE3OSwKKy0xNjIwMTAzMSwKKzE2NjU2NDAzLAorLTMzMTIwMDUyLAorMTY0NjQ3NTgsCiszMzExNzgwMiwKKy0xNjM0NjE5NSwKKzE2NzQ1MDAxLAorLTMzMjI5ODA1LAorMTY0ODY4MTAsCiszMzIyOTI0NywKKy0xNjQ1NTE1MywKKzE2ODMxMjQwLAorLTMzMzExMzA2LAorMTY0ODM2OTIsCiszMzMxMjI1MiwKKy0xNjUzNjc3MSwKKzE2OTIyNjgyLAorLTMzMzcxMjc4LAorMTY0NTUxNDUsCiszMzM3NDA3MCwKKy0xNjU5NzgxOSwKKzE3MDI3NDcyLAorLTMzNDE0NDY1LAorMTYzOTg4MTgsCiszMzQyMDExMCwKKy0xNjY0MzQzMCwKKzE3MTU1MTA4LAorLTMzNDQzODc1LAorMTYzMTAxMTAsCiszMzQ1NDM5OCwKKy0xNjY3NzQ3OSwKKzE3MzE3Mzg0LAorLTMzNDYwNzYwLAorMTYxODE4ODcsCiszMzQ3OTkzMywKKy0xNjcwMjg4MiwKKzEyNzkyNzAzLAorLTI1NTU3Mzg4LAorMTI3NjQ3MTYsCisyNDU5MDUwNywKKy05NzQ3MDg1LAorMTM3MDY0NjUsCistMjczNzI2MjEsCisxMzY2NjIxNSwKKzI2Nzk4Mjk2LAorLTExMTY5NzkwLAorMTQ0Mzk0MjUsCistMjg4MjE4MzAsCisxNDM4MjUxOCwKKzI4NDg2NDY5LAorLTEyMzgwMDg4LAorMTUwMTg0NTMsCistMjk5NTcyNzMsCisxNDkzOTAzMCwKKzI5NzY0MDE4LAorLTEzMzczNTIyLAorMTU0NzI0NjAsCistMzA4MzQ3NTcsCisxNTM2MjY4OCwKKzMwNzI0NTY4LAorLTE0MTY4MTIwLAorMTU4Mjg3MjUsCistMzE1MDYxMjMsCisxNTY3ODExOCwKKzMxNDQzOTI4LAorLTE0NzkxODIyLAorMTYxMTE0MDYsCistMzIwMTU5ODgsCisxNTkwNTkwMSwKKzMxOTgxMzkxLAorLTE1Mjc0Njg4LAorMTYzNDEzMjksCistMzI0MDA5ODQsCisxNjA2MjA2MSwKKzMyMzgyMzk4LAorLTE1NjQ0NzYxLAorMTY1MzY0ODQsCistMzI2OTAyMzgsCisxNjE1ODEzMywKKzMyNjgxMzU0LAorLTE1OTI2Mjg2LAorMTY3MTI4NTMsCistMzI5MDYzMzcsCisxNjIwMTQzMiwKKzMyOTA0MTI4LAorLTE2MTM5Mjc4LAorMTY4ODU0MzAsCistMzMwNjYzMzYsCisxNjE5NTMwNiwKKzMzMDcwMDkwLAorLTE2Mjk5NzY3LAorMTcwNjkzNzcsCistMzMxODI1OTksCisxNjEzOTI4MiwKKzMzMTkzNzExLAorLTE2NDIwMzMyLAorMTcyODEzNzEsCistMzMyNjMyOTQsCisxNjAyOTAzOSwKKzMzMjg1Nzg1LAorLTE2NTEwNzAyLAorMTc1NDEyNzEsCistMzMzMTIzOTAsCisxNTg1NjI0MywKKzMzMzU0MzU5LAorLTE2NTc4MzI5LAorMTc4NzQzMzAsCistMzMzMjg5MDIsCisxNTYwODI4NywKKzMzNDA1NDMwLAorLTE2NjI4ODczLAorOTg4MTI3OSwKKy0xOTcxOTI2OCwKKzk4MzgwODQsCisxNjczNDMwMywKKy01OTI3MTExLAorMTEyNjQ4NTcsCistMjI0NjM0NDcsCisxMTE5ODc4NCwKKzIwNTc3NTg0LAorLTc1NzIyODgsCisxMjQ2MDczNiwKKy0yNDgyMzA0NiwKKzEyMzYyNjk3LAorMjM2NjczNTksCistOTIwMTkwMywKKzEzNDU5ODA1LAorLTI2Nzc2ODUxLAorMTMzMTc3OTksCisyNjA4NTY4MywKKy0xMDY5MTU1NSwKKzE0Mjc2Mjg3LAorLTI4MzQ5MjU2LAorMTQwNzQ0MDYsCisyNzk0Mzg5OSwKKy0xMTk3ODgzNCwKKzE0OTM2OTQzLAorLTI5NTg4MjQ4LAorMTQ2NTQwMTEsCisyOTM1NDUzMywKKy0xMzA0NzQ1MywKKzE1NDczMzAwLAorLTMwNTQ5Mjk5LAorMTUwODEwMzYsCiszMDQxNzIwMywKKy0xMzkwOTIxNiwKKzE1OTE3MjcxLAorLTMxMjg1Nzg4LAorMTUzNzc4MTcsCiszMTIxMzk3MiwKKy0xNDU4OTY4NywKKzE2Mjk5Mzg0LAorLTMxODQ0MzIwLAorMTU1NjIwMDYsCiszMTgwOTY4MywKKy0xNTExODgxMSwKKzE2NjQ4Nzc0LAorLTMyMjYyOTk5LAorMTU2NDU0MTQsCiszMjI1NDMyOSwKKy0xNTUyNTY0MSwKKzE2OTk0Mjc3LAorLTMyNTcxMDkwLAorMTU2MzM2MDcsCiszMjU4NTg5NSwKKy0xNTgzNTg2MiwKKzE3MzY2Mzc0LAorLTMyNzg5MDE5LAorMTU1MjU4MDEsCiszMjgzMzAwMywKKy0xNjA3MDk3NSwKKzE3Nzk5OTU1LAorLTMyOTI3ODM0LAorMTUzMTQ4OTUsCiszMzAxNzEwNywKKy0xNjI0ODM2MSwKKzE4MzM4MjA2LAorLTMyOTg3MzE4LAorMTQ5ODc2ODYsCiszMzE1NDI0NiwKKy0xNjM4MTc0NywKKzE5MDM4MjcwLAorLTMyOTUxNTQ1LAorMTQ1MjU1OTIsCiszMzI1NjM5MiwKKy0xNjQ4MTgwMCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZlZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsMTIxIEBACisvKiAvL2RldmljZS9pbmNsdWRlL3NlcnZlci9BdWRpb0ZsaW5nZXIvQXVkaW9QZWFraW5nRmlsdGVyLmNwcAorICoqCisgKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQXVkaW9QZWFraW5nRmlsdGVyLmgiCisjaW5jbHVkZSAiQXVkaW9Db21tb24uaCIKKyNpbmNsdWRlICJFZmZlY3RzTWF0aC5oIgorCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExJS0VMWSggZXhwICkgICAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIHRydWUgICkpCisjZGVmaW5lIFVOTElLRUxZKCBleHAgKSAgICAgKF9fYnVpbHRpbl9leHBlY3QoIChleHApICE9IDAsIGZhbHNlICkpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIEZvcm1hdCBvZiB0aGUgY29lZmZpY2llbnQgdGFibGU6CisvLyBrQ29lZlRhYmxlW2ZyZXFdW2dhaW5dW2J3XVtjb2VmXQorLy8gZnJlcSAtIHBlYWsgZnJlcXVlbmN5LCBpbiBvY3RhdmVzIGJlbG93IE55cXVpc3QsZnJvbSAtOSB0byAtMS4KKy8vIGdhaW4gLSBnYWluLCBpbiBtaWxsaWJlbCwgc3RhcnRpbmcgYXQgLTk2MDAsIGp1bXBzIG9mIDEwMjQsIHRvIDQ3MzYgbWlsbGliZWwuCisvLyBidyAgIC0gYmFuZHdpZHRoLCBzdGFydGluZyBhdCAxIGNlbnQsIGp1bXBzIG9mIDEwMjQsIHRvIDMwNzMgY2VudHMuCisvLyBjb2VmIC0gMDogYjAKKy8vICAgICAgICAxOiBiMQorLy8gICAgICAgIDI6IGIyCisvLyAgICAgICAgMzogLWExCisvLyAgICAgICAgNDogLWEyCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbkRpbXNbM10gPSB7OSwgMTUsIDR9Oworc3RhdGljIGNvbnN0IGF1ZGlvX2NvZWZfdCBrQ29lZlRhYmxlWzkqMTUqNCo1XSA9IHsKKyNpbmNsdWRlICJBdWRpb1BlYWtpbmdGaWx0ZXJDb2VmLmlubCIKK307CisKK0F1ZGlvQ29lZkludGVycG9sYXRvciBBdWRpb1BlYWtpbmdGaWx0ZXI6Om1Db2VmSW50ZXJwKDMsIGtJbkRpbXMsIDUsIChjb25zdCBhdWRpb19jb2VmX3QqKSBrQ29lZlRhYmxlKTsKKworQXVkaW9QZWFraW5nRmlsdGVyOjpBdWRpb1BlYWtpbmdGaWx0ZXIoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpCisgICAgICAgIDogbUJpcXVhZChuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpIHsKKyAgICBjb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICByZXNldCgpOworfQorCit2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6Y29uZmlndXJlKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKSB7CisgICAgbU5pcXVpc3RGcmVxID0gc2FtcGxlUmF0ZSAqIDUwMDsKKyAgICBtRnJlcXVlbmN5RmFjdG9yID0gKCgxdWxsKSA8PCA0MikgLyBtTmlxdWlzdEZyZXE7CisgICAgbUJpcXVhZC5jb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICBzZXRGcmVxdWVuY3kobU5vbWluYWxGcmVxdWVuY3kpOworICAgIGNvbW1pdCh0cnVlKTsKK30KKwordm9pZCBBdWRpb1BlYWtpbmdGaWx0ZXI6OnJlc2V0KCkgeworICAgIHNldEdhaW4oMCk7CisgICAgc2V0RnJlcXVlbmN5KDApOworICAgIHNldEJhbmR3aWR0aCgyNDAwKTsKKyAgICBjb21taXQodHJ1ZSk7Cit9CisKK3ZvaWQgQXVkaW9QZWFraW5nRmlsdGVyOjpzZXRGcmVxdWVuY3kodWludDMyX3QgbWlsbGloZXJ0eikgeworICAgIG1Ob21pbmFsRnJlcXVlbmN5ID0gbWlsbGloZXJ0ejsKKyAgICBpZiAoVU5MSUtFTFkobWlsbGloZXJ0eiA+IG1OaXF1aXN0RnJlcSAvIDIpKSB7CisgICAgICAgIG1pbGxpaGVydHogPSBtTmlxdWlzdEZyZXEgLyAyOworICAgIH0KKyAgICB1aW50MzJfdCBub3JtRnJlcSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjRfdD4obWlsbGloZXJ0eikgKiBtRnJlcXVlbmN5RmFjdG9yKSA+PiAxMCk7CisgICAgaWYgKExJS0VMWShub3JtRnJlcSA+ICgxIDw8IDIzKSkpIHsKKyAgICAgICAgbUZyZXF1ZW5jeSA9IChFZmZlY3RzX2xvZzIobm9ybUZyZXEpIC0gKCgzMi05KSA8PCAxNSkpIDw8IChGUkVRX1BSRUNJU0lPTl9CSVRTIC0gMTUpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1GcmVxdWVuY3kgPSAwOworICAgIH0KK30KKwordm9pZCBBdWRpb1BlYWtpbmdGaWx0ZXI6OnNldEdhaW4oaW50MzJfdCBtaWxsaWJlbCkgeworICAgIG1HYWluID0gbWlsbGliZWwgKyA5NjAwOworfQorCit2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6c2V0QmFuZHdpZHRoKHVpbnQzMl90IGNlbnRzKSB7CisgICAgbUJhbmR3aWR0aCA9IGNlbnRzIC0gMTsKK30KKwordm9pZCBBdWRpb1BlYWtpbmdGaWx0ZXI6OmNvbW1pdChib29sIGltbWVkaWF0ZSkgeworICAgIGF1ZGlvX2NvZWZfdCBjb2Vmc1s1XTsKKyAgICBpbnQgaW50Q29vcmRbM10gPSB7CisgICAgICAgIG1GcmVxdWVuY3kgPj4gRlJFUV9QUkVDSVNJT05fQklUUywKKyAgICAgICAgbUdhaW4gPj4gR0FJTl9QUkVDSVNJT05fQklUUywKKyAgICAgICAgbUJhbmR3aWR0aCA+PiBCQU5EV0lEVEhfUFJFQ0lTSU9OX0JJVFMKKyAgICB9OworICAgIHVpbnQzMl90IGZyYWNDb29yZFszXSA9IHsKKyAgICAgICAgbUZyZXF1ZW5jeSA8PCAoMzIgLSBGUkVRX1BSRUNJU0lPTl9CSVRTKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1HYWluKSA8PCAoMzIgLSBHQUlOX1BSRUNJU0lPTl9CSVRTKSwKKyAgICAgICAgbUJhbmR3aWR0aCA8PCAoMzIgLSBCQU5EV0lEVEhfUFJFQ0lTSU9OX0JJVFMpCisgICAgfTsKKyAgICBtQ29lZkludGVycC5nZXRDb2VmKGludENvb3JkLCBmcmFjQ29vcmQsIGNvZWZzKTsKKyAgICBtQmlxdWFkLnNldENvZWZzKGNvZWZzLCBpbW1lZGlhdGUpOworfQorCit2b2lkIEF1ZGlvUGVha2luZ0ZpbHRlcjo6Z2V0QmFuZFJhbmdlKHVpbnQzMl90ICYgbG93LCB1aW50MzJfdCAmIGhpZ2gpIGNvbnN0IHsKKyAgICAvLyBIYWxmIGJhbmR3aWR0aCwgaW4gb2N0YXZlcywgMTUtYml0IHByZWNpc2lvbgorICAgIGludDMyX3QgaGFsZkJXID0gKCgobUJhbmR3aWR0aCArIDEpIC8gMikgPDwgMTUpIC8gMTIwMDsKKworICAgIGxvdyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pigoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1Ob21pbmFsRnJlcXVlbmN5KSAqIEVmZmVjdHNfZXhwMigtaGFsZkJXICsgKDE2IDw8IDE1KSkpID4+IDE2KTsKKyAgICBpZiAoVU5MSUtFTFkoaGFsZkJXID49ICgxNiA8PCAxNSkpKSB7CisgICAgICAgIGhpZ2ggPSBtTmlxdWlzdEZyZXE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGlnaCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pigoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1Ob21pbmFsRnJlcXVlbmN5KSAqIEVmZmVjdHNfZXhwMihoYWxmQlcgKyAoMTYgPDwgMTUpKSkgPj4gMTYpOworICAgICAgICBpZiAoVU5MSUtFTFkoaGlnaCA+IG1OaXF1aXN0RnJlcSkpIHsKKyAgICAgICAgICAgIGhpZ2ggPSBtTmlxdWlzdEZyZXE7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmNDljOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qIC8vZGV2aWNlL2luY2x1ZGUvc2VydmVyL0F1ZGlvRmxpbmdlci9BdWRpb1BlYWtpbmdGaWx0ZXIuaAorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fUEVBS0lOR19GSUxURVJfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX1BFQUtJTkdfRklMVEVSX0gKKworI2luY2x1ZGUgIkF1ZGlvQmlxdWFkRmlsdGVyLmgiCisjaW5jbHVkZSAiQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQSBwZWFraW5nIGF1ZGlvIGZpbHRlciwgd2l0aCB1bml0eSBza2lydCBnYWluLCBhbmQgY29udHJvbGxhYmxlIHBlYWsKKy8vIGZyZXF1ZW5jeSwgZ2FpbiBhbmQgYmFuZHdpZHRoLgorLy8gVGhpcyBmaWx0ZXIgaXMgYWJsZSB0byBzdXBwcmVzcyBpbnRyb2R1Y2UgZGlzY29udGludWl0aWVzIGFuZCBvdGhlciBhcnRpZmFjdHMKKy8vIGluIHRoZSBvdXRwdXQsIGV2ZW4gd2hlbiBjaGFuZ2luZyBwYXJhbWV0ZXJzIGFicnVwdGx5LgorLy8gUGFyYW1ldGVycyBjYW4gYmUgc2V0IHRvIGFueSB2YWx1ZSAtIHRoaXMgY2xhc3Mgd2lsbCBtYWtlIHN1cmUgdG8gY2xpcCB0aGVtCisvLyB3aGVuIHRoZXkgYXJlIG91dCBvZiBzdXBwb3J0ZWQgcmFuZ2UuCisvLworLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6CisvLyBUaGlzIGNsYXNzIHVzZXMgYW4gdW5kZXJseWluZyBiaXF1YWQgZmlsdGVyIHdob3NlIHBhcmFtZXRlcnMgYXJlIGRldGVybWluZWQKKy8vIHVzaW5nIGEgbGluZWFyIGludGVycG9sYXRpb24gZnJvbSBhIGNvZWZmaWNpZW50IHRhYmxlLCB1c2luZyBhCisvLyBBdWRpb0NvZWZJbnRlcnBvbGF0b3IuCisvLyBBbGwgaXMgbGVmdCBmb3IgdGhpcyBjbGFzcyB0byBkbyBpcyBtYXBwaW5nIGJldHdlZW4gaGlnaC1sZXZlbCBwYXJhbWV0ZXJzIHRvCisvLyBmcmFjdGlvbmFsIGluZGljZXMgaW50byB0aGUgY29lZmZpY2llbnQgdGFibGUuCitjbGFzcyBBdWRpb1BlYWtpbmdGaWx0ZXIgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yLiBSZXNldHMgdGhlIGZpbHRlciAoc2VlIHJlc2V0KCkpLgorICAgIC8vIG5DaGFubmVscyAgTnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscyAoaW50ZXJsYWNlZCkuCisgICAgLy8gc2FtcGxlUmF0ZSBUaGUgaW5wdXQvb3V0cHV0IHNhbXBsZSByYXRlLCBpbiBIei4KKyAgICBBdWRpb1BlYWtpbmdGaWx0ZXIoaW50IG5DaGFubmVscywgaW50IHNhbXBsZVJhdGUpOworCisgICAgLy8gUmVjb25maWd1cmF0aW9uIG9mIHRoZSBmaWx0ZXIuIENoYW5nZXMgaW5wdXQvb3V0cHV0IGZvcm1hdCwgYnV0IGRvZXMgbm90CisgICAgLy8gYWx0ZXIgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWVzLiBDbGVhcnMgZGVsYXkgbGluZXMuCisgICAgLy8gbkNoYW5uZWxzICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlIFRoZSBpbnB1dC9vdXRwdXQgc2FtcGxlIHJhdGUsIGluIEh6LgorICAgIHZvaWQgY29uZmlndXJlKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJlc2V0cyB0aGUgZmlsdGVyIHBhcmFtZXRlcnMgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgICAgLy8gZnJlcXVlbmN5OiAwCisgICAgLy8gZ2FpbjogMAorICAgIC8vIGJhbmR3aWR0aDogMTIwMCBjZW50cy4KKyAgICAvLyBJdCBhbHNvIGRpc2FibGVzIHRoZSBmaWx0ZXIuIERvZXMgbm90IGNsZWFyIHRoZSBkZWxheSBsaW5lcy4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBDbGVhcnMgZGVsYXkgbGluZXMuIERvZXMgbm90IGFsdGVyIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgdm9pZCBjbGVhcigpIHsgbUJpcXVhZC5jbGVhcigpOyB9CisKKyAgICAvLyBTZXRzIGdhaW4gdmFsdWUuIEFjdHVhbCBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgcGxhY2UgdXBvbiBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBtaWxsaWJlbCBHYWluIHZhbHVlIGluIG1pbGxpYmVsICgxLzEwMCBvZiBkZWNpYmVsKS4KKyAgICB2b2lkIHNldEdhaW4oaW50MzJfdCBtaWxsaWJlbCk7CisKKyAgICAvLyBHZXRzIHRoZSBnYWluLCBpbiBtaWxsaWJlbCwgYXMgc2V0LgorICAgIGludDMyX3QgZ2V0R2FpbigpIGNvbnN0IHsgcmV0dXJuIG1HYWluIC0gOTYwMDsgfQorCisgICAgLy8gU2V0cyBiYW5kd2lkdGggdmFsdWUuIEFjdHVhbCBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgcGxhY2UgdXBvbiBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBjZW50cyBCYW5kd2lkdGggdmFsdWUgaW4gY2VudHMgKDEvMTIwMCBvY3RhdmUpLgorICAgIHZvaWQgc2V0QmFuZHdpZHRoKHVpbnQzMl90IGNlbnRzKTsKKworICAgIC8vIEdldHMgdGhlIGdhaW4sIGluIGNlbnRzLCBhcyBzZXQuCisgICAgdWludDMyX3QgZ2V0QmFuZHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbUJhbmR3aWR0aCArIDE7IH0KKworICAgIC8vIFNldHMgZnJlcXVlbmN5IHZhbHVlLiBBY3R1YWwgY2hhbmdlIHdpbGwgb25seSB0YWtlIHBsYWNlIHVwb24gY29tbWl0KCkuCisgICAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHJlbWVtYmVyZWQgZXZlbiBpZiB0aGUgZmlsdGVyIGlzIGluIGRpc2FibGVkKCkgc3RhdGUuCisgICAgLy8gbWlsbGloZXJ0eiBGcmVxdWVuY3kgdmFsdWUgaW4gbUh6LgorICAgIHZvaWQgc2V0RnJlcXVlbmN5KHVpbnQzMl90IG1pbGxpaGVydHopOworCisgICAgLy8gR2V0cyB0aGUgZnJlcXVlbmN5LCBpbiBtSHosIGFzIHNldC4KKyAgICB1aW50MzJfdCBnZXRGcmVxdWVuY3koKSBjb25zdCB7IHJldHVybiBtTm9taW5hbEZyZXF1ZW5jeTsgfQorCisgICAgLy8gR2V0cyBnYWluW2RCXS8yIHBvaW50cy4KKyAgICAvLyBSZXN1bHRzIGluIG1IeiwgYW5kIGFyZSBjb21wdXRlZCBiYXNlZCBvbiB0aGUgbm9taW5hbCB2YWx1ZXMgc2V0LCBub3Qgb24KKyAgICAvLyBwb3NzaWJseSByb3VuZGVkIG9yIHRydW5jYXRlZCBhY3R1YWwgdmFsdWVzLgorICAgIHZvaWQgZ2V0QmFuZFJhbmdlKHVpbnQzMl90ICYgbG93LCB1aW50MzJfdCAmIGhpZ2gpIGNvbnN0OworCisgICAgLy8gQXBwbGllcyBhbGwgcGFyYW1ldGVyIGNoYW5nZXMgZG9uZSB0byB0aGlzIHBvaW50IGluIHRpbWUuCisgICAgLy8gSWYgdGhlIGZpbHRlciBpcyBkaXNhYmxlZCwgdGhlIG5ldyBwYXJhbWV0ZXJzIHdpbGwgdGFrZSBwbGFjZSB3aGVuIGl0IGlzCisgICAgLy8gZW5hYmxlZCBhZ2Fpbi4gRG9lcyBub3QgaW50cm9kdWNlIGFydGlmYWN0cywgdW5sZXNzIGltbWVkaWF0ZSBpcyBzZXQuCisgICAgLy8gaW1tZWRpYXRlICAgIFdoZXRoZXIgdG8gYXBwbHkgY2hhbmdlIGFicnVwdGx5IChpZ25vcmVkIGlmIGZpbHRlciBpcworICAgIC8vIGRpc2FibGVkKS4KKyAgIHZvaWQgY29tbWl0KGJvb2wgaW1tZWRpYXRlID0gZmFsc2UpOworCisgICAgLy8gUHJvY2VzcyBhIGJ1ZmZlciBvZiBpbnB1dCBkYXRhLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBzaG91bGQgY29udGFpbgorICAgIC8vIGZyYW1lQ291bnQgKiBuQ2hhbm5lbHMgaW50ZXJsYWNlZCBzYW1wbGVzLiBQcm9jZXNzaW5nIGNhbiBiZSBkb25lCisgICAgLy8gaW4tcGxhY2UsIGJ5IHBhc3NpbmcgdGhlIHNhbWUgYnVmZmVyIGFzIGJvdGggYXJndW1lbnRzLgorICAgIC8vIGluICAgICAgICAgICBJbnB1dCBidWZmZXIuCisgICAgLy8gb3V0ICAgICAgICAgIE91dHB1dCBidWZmZXIuCisgICAgLy8gZnJhbWVDb3VudCAgIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvZHVjZS4KKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgYXVkaW9fc2FtcGxlX3QgaW5bXSwgYXVkaW9fc2FtcGxlX3Qgb3V0W10sCisgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KSB7IG1CaXF1YWQucHJvY2Vzcyhpbiwgb3V0LCBmcmFtZUNvdW50KTsgfQorCisgICAgLy8gRW5hYmxlcyB0aGUgZmlsdGVyLCBzbyBpdCB3b3VsZCBzdGFydCBwcm9jZXNzaW5nIGlucHV0LiBEb2VzIG5vdAorICAgIC8vIGludHJvZHVjZSBhcnRpZmFjdHMsIHVubGVzcyBpbW1lZGlhdGUgaXMgc2V0LgorICAgIC8vIGltbWVkaWF0ZSAgICBXaGV0aGVyIHRvIGFwcGx5IGNoYW5nZSBhYnJ1cHRseS4KKyAgICB2b2lkIGVuYWJsZShib29sIGltbWVkaWF0ZSA9IGZhbHNlKSB7IG1CaXF1YWQuZW5hYmxlKGltbWVkaWF0ZSk7IH0KKworICAgIC8vIERpc2FibGVkIChieXBhc3NlcykgdGhlIGZpbHRlci4gRG9lcyBub3QgaW50cm9kdWNlIGFydGlmYWN0cywgdW5sZXNzCisgICAgLy8gaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkuCisgICAgdm9pZCBkaXNhYmxlKGJvb2wgaW1tZWRpYXRlID0gZmFsc2UpIHsgbUJpcXVhZC5kaXNhYmxlKGltbWVkaWF0ZSk7IH0KKworcHJpdmF0ZToKKyAgICAvLyBQcmVjaXNpb24gZm9yIHRoZSBtRnJlcXVlbmN5IG1lbWJlci4KKyAgICBzdGF0aWMgY29uc3QgaW50IEZSRVFfUFJFQ0lTSU9OX0JJVFMgPSAyNjsKKyAgICAvLyBQcmVjaXNpb24gZm9yIHRoZSBtR2FpbiBtZW1iZXIuCisgICAgc3RhdGljIGNvbnN0IGludCBHQUlOX1BSRUNJU0lPTl9CSVRTID0gMTA7CisgICAgLy8gUHJlY2lzaW9uIGZvciB0aGUgbUJhbmR3aWR0aCBtZW1iZXIuCisgICAgc3RhdGljIGNvbnN0IGludCBCQU5EV0lEVEhfUFJFQ0lTSU9OX0JJVFMgPSAxMDsKKworICAgIC8vIE55cXVpc3QsIGluIG1Iei4KKyAgICB1aW50MzJfdCBtTmlxdWlzdEZyZXE7CisgICAgLy8gRnJhY3Rpb25hbCBpbmRleCBpbnRvIHRoZSBnYWluIGRpbWVuc2lvbiBvZiB0aGUgY29lZiB0YWJsZSBpbgorICAgIC8vIEdBSU5fUFJFQ0lTSU9OX0JJVFMgcHJlY2lzaW9uLgorICAgIGludDMyX3QgbUdhaW47CisgICAgLy8gRnJhY3Rpb25hbCBpbmRleCBpbnRvIHRoZSBiYW5kd2lkdGggZGltZW5zaW9uIG9mIHRoZSBjb2VmIHRhYmxlIGluCisgICAgLy8gQkFORFdJRFRIX1BSRUNJU0lPTl9CSVRTIHByZWNpc2lvbi4KKyAgICB1aW50MzJfdCBtQmFuZHdpZHRoOworICAgIC8vIEZyYWN0aW9uYWwgaW5kZXggaW50byB0aGUgZnJlcXVlbmN5IGRpbWVuc2lvbiBvZiB0aGUgY29lZiB0YWJsZSBpbgorICAgIC8vIEZSRVFfUFJFQ0lTSU9OX0JJVFMgcHJlY2lzaW9uLgorICAgIHVpbnQzMl90IG1GcmVxdWVuY3k7CisgICAgLy8gTm9taW5hbCB2YWx1ZSBvZiBmcmVxdWVuY3ksIGFzIHNldC4KKyAgICB1aW50MzJfdCBtTm9taW5hbEZyZXF1ZW5jeTsKKyAgICAvLyAxL055cXVpc3RbbUh6XSwgaW4gNDItYml0IHByZWNpc2lvbiAodmVyeSBzbWFsbCkuCisgICAgLy8gVXNlZCBmb3Igc2NhbGluZyB0aGUgZnJlcXVlbmN5LgorICAgIHVpbnQzMl90IG1GcmVxdWVuY3lGYWN0b3I7CisKKyAgICAvLyBBIGJpcXVhZCBmaWx0ZXIsIHVzZWQgZm9yIHRoZSBhY3R1YWwgcHJvY2Vzc2luZy4KKyAgICBBdWRpb0JpcXVhZEZpbHRlciBtQmlxdWFkOworICAgIC8vIEEgY29lZmZpY2llbnQgaW50ZXJwb2xhdG9yLCB1c2VkIGZvciBtYXBwaW5nIHRoZSBoaWdoIGxldmVsIHBhcmFtZXRlcnMgdG8KKyAgICAvLyB0aGUgbG93LWxldmVsIGJpcXVhZCBjb2VmZmljaWVudHMuCisgICAgc3RhdGljIEF1ZGlvQ29lZkludGVycG9sYXRvciBtQ29lZkludGVycDsKK307CisKK30KKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fUEVBS0lOR19GSUxURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1BlYWtpbmdGaWx0ZXJDb2VmLmlubCBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyQ29lZi5pbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0YzZlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvQXVkaW9QZWFraW5nRmlsdGVyQ29lZi5pbmwKQEAgLTAsMCArMSwyNzAwIEBACisxNjc2OTc1MSwKKy0zMzUzODg3MSwKKzE2NzY5NzUxLAorMzM1Mzg4NzEsCistMTY3NjIyODYsCisxMTQ2ODA4MywKKy0yMjkzNTU2NiwKKzExNDY3OTE1LAorMjI5MzU1NjYsCistNjE1ODc4MSwKKzg1MzI2NzMsCistMTcwNjQ3NjMsCis4NTMyNDEyLAorMTcwNjQ3NjMsCistMjg3ODY5LAorNjU2NzM2NiwKKy0xMzEzNDE2MCwKKzY1NjcwNDIsCisxMzEzNDE2MCwKKzM2NDI4MDgsCisxNjc3MzA3NSwKKy0zMzU0NTUxOCwKKzE2NzczMDc1LAorMzM1NDU1MTgsCistMTY3Njg5MzQsCisxMzM0OTY1OCwKKy0yNjY5ODQ1OSwKKzEzMzQ5MzA0LAorMjY2OTg0NTksCistOTkyMTc0NiwKKzEwOTIzNTgxLAorLTIxODQ2MTQ3LAorMTA5MjI5NzcsCisyMTg0NjE0NywKKy01MDY5MzQyLAorOTAwOTM5MCwKKy0xODAxNzY0MSwKKzkwMDg1OTAsCisxODAxNzY0MSwKKy0xMjQwNzY0LAorMTY3NzQ5MTksCistMzM1NDkyMDcsCisxNjc3NDkxOSwKKzMzNTQ5MjA3LAorLTE2NzcyNjIyLAorMTQ2ODYxNTAsCistMjkzNzEwNDcsCisxNDY4NTQ1MCwKKzI5MzcxMDQ3LAorLTEyNTk0Mzg0LAorMTI5MzM3MzYsCistMjU4NjU2OTcsCisxMjkzMjQ0OCwKKzI1ODY1Njk3LAorLTkwODg5NjgsCisxMTM1MDM2NCwKKy0yMjY5ODQ4MiwKKzExMzQ4NTQ1LAorMjI2OTg0ODIsCistNTkyMTY5MywKKzE2Nzc1OTQzLAorLTMzNTUxMjUyLAorMTY3NzU5NDEsCiszMzU1MTI1MiwKKy0xNjc3NDY2OCwKKzE1NTQ5NzQ2LAorLTMxMDk3NTY5LAorMTU1NDg0MDgsCiszMTA5NzU2OSwKKy0xNDMyMDkzOCwKKzE0NDA0MTYzLAorLTI4ODA1MTk3LAorMTQ0MDE1NzcsCisyODgwNTE5NywKKy0xMjAyODUyNCwKKzEzMjYxOTc4LAorLTI2NTE5NjI2LAorMTMyNTgxNDcsCisyNjUxOTYyNiwKKy05NzQyOTA5LAorMTY3NzY1MTEsCistMzM1NTIzODcsCisxNjc3NjUwOCwKKzMzNTUyMzg3LAorLTE2Nzc1ODAzLAorMTYwNzQzNDksCistMzIxNDU2MDAsCisxNjA3MTg1NiwKKzMyMTQ1NjAwLAorLTE1MzY4OTg5LAorMTUzNzQyNDQsCistMzA3NDI5MzMsCisxNTM2OTI2OCwKKzMwNzQyOTMzLAorLTEzOTY2Mjk2LAorMTQ2Mjk0MzEsCistMjkyNTA2OTUsCisxNDYyMTgxNCwKKzI5MjUwNjk1LAorLTEyNDc0MDMwLAorMTY3NzY4MjYsCistMzM1NTMwMTcsCisxNjc3NjgyMiwKKzMzNTUzMDE3LAorLTE2Nzc2NDMyLAorMTYzODE1NDgsCistMzI3NTc5MDAsCisxNjM3Njk2OCwKKzMyNzU3OTAwLAorLTE1OTgxMzAwLAorMTU5NzIxNjEsCistMzE5MzQ0MDIsCisxNTk2Mjg0MiwKKzMxOTM0NDAyLAorLTE1MTU3Nzg3LAorMTU1MTg4ODIsCistMzEwMjI2MTQsCisxNTUwNDMxNiwKKzMxMDIyNjE0LAorLTE0MjQ1OTgyLAorMTY3NzcwMDMsCistMzM1NTMzNjYsCisxNjc3Njk5NSwKKzMzNTUzMzY2LAorLTE2Nzc2NzgxLAorMTY1NTgzMTUsCistMzMxMDc2NjAsCisxNjU0OTk2OSwKKzMzMTA3NjYwLAorLTE2MzMxMDY3LAorMTYzMjY4NDgsCistMzI2MzU5MTAsCisxNjMwOTY3NywKKzMyNjM1OTEwLAorLTE1ODU5MzA4LAorMTYwNjQ0NTYsCistMzIxMDExMzMsCisxNjAzNzI4MSwKKzMyMTAxMTMzLAorLTE1MzI0NTIxLAorMTY3NzcxMDMsCistMzM1NTM1NTksCisxNjc3NzA4OCwKKzMzNTUzNTU5LAorLTE2Nzc2OTc1LAorMTY2NjAzMjUsCistMzMzMDQ4ODUsCisxNjY0NTE4NywKKzMzMzA0ODg1LAorLTE2NTI4Mjk2LAorMTY1MzUyMDAsCistMzMwMzg0MzYsCisxNjUwMzg1OCwKKzMzMDM4NDM2LAorLTE2MjYxODQyLAorMTYzOTE0MjUsCistMzI3MzIyNzMsCisxNjM0MTQ2NCwKKzMyNzMyMjczLAorLTE1OTU1NjczLAorMTY3NzcxNjIsCistMzM1NTM2NjcsCisxNjc3NzEzNiwKKzMzNTUzNjY3LAorLTE2Nzc3MDgyLAorMTY3MjE2NTEsCistMzM0MTUyODgsCisxNjY5NDI2NywKKzMzNDE1Mjg4LAorLTE2NjM4NzAxLAorMTY2NjE3NjEsCistMzMyNjU5OTcsCisxNjYwNDg2MiwKKzMzMjY1OTk3LAorLTE2NDg5NDA3LAorMTY1OTI0MTcsCistMzMwOTMxMzcsCisxNjUwMTM0MywKKzMzMDkzMTM3LAorLTE2MzE2NTQ0LAorMTY3NzcyMDMsCistMzM1NTM3MjYsCisxNjc3NzE1NSwKKzMzNTUzNzI2LAorLTE2Nzc3MTQyLAorMTY3NjM0NjYsCistMzM0NzY4MzYsCisxNjcxNDAwMSwKKzMzNDc2ODM2LAorLTE2NzAwMjUxLAorMTY3NDg1ODgsCistMzMzOTM1NjUsCisxNjY0NTYwNSwKKzMzMzkzNTY1LAorLTE2NjE2OTc4LAorMTY3MzEyODgsCistMzMyOTY3MzMsCisxNjU2NjA3MSwKKzMzMjk2NzMzLAorLTE2NTIwMTQ0LAorMTY3NzcyMzgsCistMzM1NTM3NTksCisxNjc3NzE1MiwKKzMzNTUzNzU5LAorLTE2Nzc3MTc1LAorMTY4MDA0ODksCistMzM1MTEwNzEsCisxNjcxMTIxMiwKKzMzNTExMDcxLAorLTE2NzM0NDg1LAorMTY4MjU3MjMsCistMzM0NjQ3NDAsCisxNjYzOTY0NywKKzMzNDY0NzQwLAorLTE2Njg4MTU0LAorMTY4NTUxMzcsCistMzM0MTA3MzYsCisxNjU1NjIyOCwKKzMzNDEwNzM2LAorLTE2NjM0MTQ5LAorMTY3NzcyODIsCistMzM1NTM3NzgsCisxNjc3NzEyNywKKzMzNTUzNzc4LAorLTE2Nzc3MTkzLAorMTY4NDU4ODksCistMzM1MzAwODgsCisxNjY4NDgzMCwKKzMzNTMwMDg4LAorLTE2NzUzNTAzLAorMTY5MjA0MzcsCistMzM1MDQzNDcsCisxNjU4NDU0MSwKKzMzNTA0MzQ3LAorLTE2NzI3NzYyLAorMTcwMDc0NDksCistMzM0NzQzMDIsCisxNjQ2NzQ4NCwKKzMzNDc0MzAyLAorLTE2Njk3NzE2LAorMTY3NzczNDksCistMzM1NTM3ODgsCisxNjc3NzA3MCwKKzMzNTUzNzg4LAorLTE2Nzc3MjAzLAorMTY5MTU4ODAsCistMzM1NDA2NDUsCisxNjYyNTM5NiwKKzMzNTQwNjQ1LAorLTE2NzY0MDYwLAorMTcwNjY1MDQsCistMzM1MjYzNTQsCisxNjQ2MDQ4MSwKKzMzNTI2MzU0LAorLTE2NzQ5NzY5LAorMTcyNDI0NDQsCistMzM1MDk2NjIsCisxNjI2Nzg0OSwKKzMzNTA5NjYyLAorLTE2NzMzMDc3LAorMTY3Nzc0NjQsCistMzM1NTM3OTMsCisxNjc3Njk2MSwKKzMzNTUzNzkzLAorLTE2Nzc3MjA5LAorMTcwMzU0ODcsCistMzM1NDY1MDMsCisxNjUxMTY0NywKKzMzNTQ2NTAzLAorLTE2NzY5OTE4LAorMTczMTYxMzcsCistMzM1Mzg1NzIsCisxNjIyMzA2NywKKzMzNTM4NTcyLAorLTE2NzYxOTg4LAorMTc2NDQwODksCistMzM1MjkzMDYsCisxNTg4NTg0OCwKKzMzNTI5MzA2LAorLTE2NzUyNzIxLAorMTY3Nzc2NjgsCistMzM1NTM3OTYsCisxNjc3Njc2MCwKKzMzNTUzNzk2LAorLTE2Nzc3MjEyLAorMTcyNDc0ODQsCistMzM1NDk3NTIsCisxNjMwMjkwMCwKKzMzNTQ5NzUyLAorLTE2NzczMTY4LAorMTc3NTg2MDMsCistMzM1NDUzNTMsCisxNTc4NzM4MSwKKzMzNTQ1MzUzLAorLTE2NzY4NzY4LAorMTgzNTYwMDcsCistMzM1NDAyMTEsCisxNTE4NDgzNSwKKzMzNTQwMjExLAorLTE2NzYzNjI2LAorMTY3NjIyOTMsCistMzM1MjIwNjIsCisxNjc2MjI5MywKKzMzNTIyMDYyLAorLTE2NzQ3MzcwLAorODcxMTQwNSwKKy0xNzQyMTI0MiwKKzg3MTExNDksCisxNzQyMTI0MiwKKy02NDUzMzgsCis1NzIxMjUwLAorLTExNDQxMjg4LAorNTcyMDkwMCwKKzExNDQxMjg4LAorNTMzNTA2NiwKKzQwODI4MzYsCistODE2NDY1NSwKKzQwODI0MzQsCis4MTY0NjU1LAorODYxMTk0NiwKKzE2NzY4OTM2LAorLTMzNTM1MzQ3LAorMTY3Njg5MzYsCiszMzUzNTM0NywKKy0xNjc2MDY1NiwKKzExMDg1MDU2LAorLTIyMTY3ODU2LAorMTEwODQ0NjksCisyMjE2Nzg1NiwKKy01MzkyMzA5LAorODA5ODIyMywKKy0xNjE5NDMzMywKKzgwOTczMjksCisxNjE5NDMzMywKKzU4MTY2NCwKKzYxNTgzMjMsCistMTIzMTQ2MjMsCis2MTU3MjI4LAorMTIzMTQ2MjMsCis0NDYxNjY1LAorMTY3NzI2MjMsCistMzM1NDI3MTksCisxNjc3MjYyMiwKKzMzNTQyNzE5LAorLTE2NzY4MDI5LAorMTMwNTg2MzQsCistMjYxMTQwNTUsCisxMzA1NzM4OCwKKzI2MTE0MDU1LAorLTkzMzg4MDYsCisxMDUyMzIxMSwKKy0yMTA0Mjc0MiwKKzEwNTIxMTE2LAorMjEwNDI3NDIsCistNDI2NzExMCwKKzg1NzY1NjAsCistMTcxNDkwODEsCis4NTczODEyLAorMTcxNDkwODEsCistMzczMTU2LAorMTY3NzQ2NzAsCistMzM1NDY4MTAsCisxNjc3NDY2NywKKzMzNTQ2ODEwLAorLTE2NzcyMTIwLAorMTQ0ODk3MjUsCistMjg5NzQ3NzYsCisxNDQ4NzIzMywKKzI4OTc0Nzc2LAorLTEyMTk5NzQyLAorMTI2MTk1MDksCistMjUyMzI1ODcsCisxMjYxNDk3OSwKKzI1MjMyNTg3LAorLTg0NTcyNzEsCisxMDk2NTE1MSwKKy0yMTkyMjMxOSwKKzEwOTU4ODE4LAorMjE5MjIzMTksCistNTE0Njc1MywKKzE2Nzc1ODA1LAorLTMzNTQ5MDc5LAorMTY3NzU4MDAsCiszMzU0OTA3OSwKKy0xNjc3NDM5MCwKKzE1NDI4MTAyLAorLTMwODQ5MDk1LAorMTU0MjMzMTcsCiszMDg0OTA5NSwKKy0xNDA3NDIwMiwKKzE0MTg4MTU3LAorLTI4MzY0OTk2LAorMTQxNzg5NzUsCisyODM2NDk5NiwKKy0xMTU4OTkxNiwKKzEyOTY5OTAwLAorLTI1OTI0MzQ2LAorMTI5NTYzOTgsCisyNTkyNDM0NiwKKy05MTQ5MDgyLAorMTY3NzY0MzcsCistMzM1NTAzMzgsCisxNjc3NjQyOCwKKzMzNTUwMzM4LAorLTE2Nzc1NjQ4LAorMTYwMDQyMTYsCistMzE5OTcwNzQsCisxNTk5NTI2OCwKKzMxOTk3MDc0LAorLTE1MjIyMjY3LAorMTUyNDEyMzMsCistMzA0NjIzOTMsCisxNTIyMzQ1NCwKKzMwNDYyMzkzLAorLTEzNjg3NDcxLAorMTQ0MzcwNzAsCistMjg4NDQ4ODAsCisxNDQwOTk4MiwKKzI4ODQ0ODgwLAorLTEyMDY5ODM2LAorMTY3NzY3ODksCistMzM1NTEwMzYsCisxNjc3Njc3MywKKzMzNTUxMDM2LAorLTE2Nzc2MzQ3LAorMTYzNDUxNTgsCistMzI2NzEzODMsCisxNjMyODY4NSwKKzMyNjcxMzgzLAorLTE1ODk2NjI3LAorMTU5MDA0NjIsCistMzE3NjUxMDQsCisxNTg2NzAzNCwKKzMxNzY1MTA0LAorLTE0OTkwMjgwLAorMTU0MTA4NDYsCistMzA3NjcyNzksCisxNTM1ODc1MCwKKzMwNzY3Mjc5LAorLTEzOTkyMzgwLAorMTY3NzY5OTAsCistMzM1NTE0MjMsCisxNjc3Njk2MCwKKzMzNTUxNDIzLAorLTE2Nzc2NzM0LAorMTY1NDUxNTYsCistMzMwNTc3NjksCisxNjUxNTEwMywKKzMzMDU3NzY5LAorLTE2MjgzMDQzLAorMTYzMDA1MDQsCistMzI1MzY4MjMsCisxNjIzODc2OSwKKzMyNTM2ODIzLAorLTE1NzYyMDU4LAorMTYwMjQwNzEsCistMzE5NDgyMDEsCisxNTkyNjUzNywKKzMxOTQ4MjAxLAorLTE1MTczMzkxLAorMTY3NzcxMDksCistMzM1NTE2MzgsCisxNjc3NzA1NiwKKzMzNTUxNjM4LAorLTE2Nzc2OTQ5LAorMTY2NjY1NDIsCistMzMyNzYwMzUsCisxNjYxMTk5OSwKKzMzMjc2MDM1LAorLTE2NTAxMzI1LAorMTY1NDgyNzAsCistMzI5ODEyMjUsCisxNjQzNTQzOSwKKzMyOTgxMjI1LAorLTE2MjA2NDkzLAorMTY0MTI2MjEsCistMzI2NDMxMDMsCisxNjIzMjk0MCwKKzMyNjQzMTAzLAorLTE1ODY4MzQ2LAorMTY3NzcxODksCistMzM1NTE3NTcsCisxNjc3NzA5NCwKKzMzNTUxNzU3LAorLTE2Nzc3MDY4LAorMTY3NDk3NzgsCistMzMzOTgzMzgsCisxNjY1MTA3NSwKKzMzMzk4MzM4LAorLTE2NjIzNjM3LAorMTY3MjAyMzMsCistMzMyMzI5NzYsCisxNjUxNTI0NSwKKzMzMjMyOTc2LAorLTE2NDU4MjYyLAorMTY2ODYwNTksCistMzMwNDE3MDYsCisxNjM1ODEzNSwKKzMzMDQxNzA2LAorLTE2MjY2OTc4LAorMTY3NzcyNjEsCistMzM1NTE4MjMsCisxNjc3NzA4OSwKKzMzNTUxODIzLAorLTE2Nzc3MTM0LAorMTY4MjM3MDMsCistMzM0NjY1NTksCisxNjY0NTM3NiwKKzMzNDY2NTU5LAorLTE2NjkxODYzLAorMTY4NzM5NzQsCistMzMzNzQyNjcsCisxNjUwMjgwNiwKKzMzMzc0MjY3LAorLTE2NTk5NTY0LAorMTY5MzIzOTgsCistMzMyNjcwMDYsCisxNjMzNzExNCwKKzMzMjY3MDA2LAorLTE2NDkyMjk1LAorMTY3NzczNDgsCistMzM1NTE4NjAsCisxNjc3NzAzOCwKKzMzNTUxODYwLAorLTE2Nzc3MTcwLAorMTY5MTQ0NjUsCistMzM1MDQ1MTcsCisxNjU5MjU3NCwKKzMzNTA0NTE3LAorLTE2NzI5ODI0LAorMTcwNjMyMzYsCistMzM0NTMxNTAsCisxNjM5MjQzMiwKKzMzNDUzMTUwLAorLTE2Njc4NDUzLAorMTcyMzY1OTUsCistMzMzOTMyOTMsCisxNjE1OTIxMywKKzMzMzkzMjkzLAorLTE2NjE4NTkyLAorMTY3Nzc0ODMsCistMzM1NTE4ODAsCisxNjc3NjkyNCwKKzMzNTUxODgwLAorLTE2Nzc3MTkxLAorMTcwNTQ0MzYsCistMzM1MjU2MDYsCisxNjQ3MzY5NSwKKzMzNTI1NjA2LAorLTE2NzUwOTE0LAorMTczNTUzMjEsCistMzM0OTcwNjEsCisxNjE0NDI2MiwKKzMzNDk3MDYxLAorLTE2NzIyMzY3LAorMTc3MDY0NTMsCistMzM0NjM3NDksCisxNTc1OTgxNiwKKzMzNDYzNzQ5LAorLTE2Njg5MDUzLAorMTY3Nzc3MTMsCistMzM1NTE4OTEsCisxNjc3NjcwNSwKKzMzNTUxODkxLAorLTE2Nzc3MjAyLAorMTcyOTM2NDYsCistMzM1MzczMTQsCisxNjI0NjE5NCwKKzMzNTM3MzE0LAorLTE2NzYyNjIzLAorMTc4NTQ1NzEsCistMzM1MjE0NjUsCisxNTY2OTQxOSwKKzMzNTIxNDY1LAorLTE2NzQ2NzczLAorMTg1MDk3MDYsCistMzM1MDI5NTQsCisxNDk5NTc3MiwKKzMzNTAyOTU0LAorLTE2NzI4MjYxLAorMTY3NzgxMjAsCistMzM1NTE4OTgsCisxNjc3NjMwNCwKKzMzNTUxODk4LAorLTE2Nzc3MjA4LAorMTc3MTc2MzksCistMzM1NDM4MTEsCisxNTgyODY5OCwKKzMzNTQzODExLAorLTE2NzY5MTIxLAorMTg3Mzk1MDEsCistMzM1MzUwMTYsCisxNDc5ODA0MCwKKzMzNTM1MDE2LAorLTE2NzYwMzI1LAorMTk5MzM1MzQsCistMzM1MjQ3MzgsCisxMzU5MzcyOSwKKzMzNTI0NzM4LAorLTE2NzUwMDQ3LAorMTY3NDczOTcsCistMzM0ODQ3MDUsCisxNjc0NzM5NiwKKzMzNDg0NzA1LAorLTE2NzE3NTc3LAorNTg4MzExMiwKKy0xMTc2MjMzNSwKKzU4ODI3NjcsCisxMTc2MjMzNSwKKzUwMTEzMzcsCiszNDQ4NzAxLAorLTY4OTQ5MDMsCiszNDQ4Mjc5LAorNjg5NDkwMywKKzk4ODAyMzYsCisyMzI0Mjg2LAorLTQ2NDY3MTQsCisyMzIzODI4LAorNDY0NjcxNCwKKzEyMTI5MTAyLAorMTY3NjA2NjUsCistMzM1MTEyMzIsCisxNjc2MDY2MywKKzMzNTExMjMyLAorLTE2NzQ0MTEyLAorODI3Njk4NCwKKy0xNjU0ODEwNiwKKzgyNzYxMDgsCisxNjU0ODEwNiwKKzIyNDEyNCwKKzUzMzc0MDAsCistMTA2NzA0MDYsCis1MzM2MjIxLAorMTA2NzA0MDYsCis2MTAzNTk2LAorMzc3MTUyNSwKKy03NTM5NDM5LAorMzc3MDE4NSwKKzc1Mzk0MzksCis5MjM1NTA2LAorMTY3NjgwMzMsCistMzM1MjU5NjMsCisxNjc2ODAzMCwKKzMzNTI1OTYzLAorLTE2NzU4ODQ4LAorMTA2ODk1NjQsCistMjEzNzA2NDksCisxMDY4NzUyNCwKKzIxMzcwNjQ5LAorLTQ1OTk4NzIsCis3NjY2MDY4LAorLTE1MzI0NDY2LAorNzY2MzAxNSwKKzE1MzI0NDY2LAorMTQ0ODEzMywKKzU3NjEyNjYsCistMTE1MTUzNzEsCis1NzU3NTc1LAorMTE1MTUzNzEsCis1MjU4Mzc2LAorMTY3NzIxMjQsCistMzM1MzQxMzksCisxNjc3MjExOCwKKzMzNTM0MTM5LAorLTE2NzY3MDI2LAorMTI3NTE0MjMsCistMjU0OTA3ODAsCisxMjc0NzAzNiwKKzI1NDkwNzgwLAorLTg3MjEyNDMsCisxMDExMzk0MiwKKy0yMDIxNDUzMywKKzEwMTA2NjgyLAorMjAyMTQ1MzMsCistMzQ0MzQwNywKKzgxNDUwMjUsCistMTYyNzU3NDEsCis4MTM1NjIwLAorMTYyNzU3NDEsCis0OTY1NzEsCisxNjc3NDM5NSwKKy0zMzUzODY3NSwKKzE2Nzc0Mzg1LAorMzM1Mzg2NzUsCistMTY3NzE1NjQsCisxNDI4MDEzNywKKy0yODU0MjgxOSwKKzE0MjcxMjgxLAorMjg1NDI4MTksCistMTE3NzQyMDIsCisxMjI5MjM5MSwKKy0yNDU2MTQ3NiwKKzEyMjc2NDg1LAorMjQ1NjE0NzYsCistNzc5MTY2MCwKKzEwNTcyOTQ5LAorLTIxMTE3NTMyLAorMTA1NTA5NDUsCisyMTExNzUzMiwKKy00MzQ2Njc4LAorMTY3NzU2NTcsCistMzM1NDExOTIsCisxNjc3NTYzOSwKKzMzNTQxMTkyLAorLTE2Nzc0MDgxLAorMTUyOTk2ODMsCistMzA1NzMwNTEsCisxNTI4MjU3OSwKKzMwNTczMDUxLAorLTEzODA1MDQ2LAorMTM5NjQyNTEsCistMjc4ODc1MzksCisxMzkzMTY5MCwKKzI3ODg3NTM5LAorLTExMTE4NzI0LAorMTI2NzI2ODYsCistMjUyOTAyNDEsCisxMjYyNTE3NCwKKzI1MjkwMjQxLAorLTg1MjA2NDQsCisxNjc3NjM2MywKKy0zMzU0MjU4OCwKKzE2Nzc2MzMwLAorMzM1NDI1ODgsCistMTY3NzU0NzcsCisxNTkzNTE5NiwKKy0zMTgyODY5OSwKKzE1OTAzMDkyLAorMzE4Mjg2OTksCistMTUwNjEwNzIsCisxNTExMjM1NiwKKy0zMDE1MjE1MywKKzE1MDQ4ODgxLAorMzAxNTIxNTMsCistMTMzODQwMjEsCisxNDI1Mzg1NywKKy0yODQwMjk1MCwKKzE0MTU3NjQ5LAorMjg0MDI5NTAsCistMTE2MzQyOTEsCisxNjc3Njc2MywKKy0zMzU0MzM2MiwKKzE2Nzc2NzA0LAorMzM1NDMzNjIsCistMTY3NzYyNTIsCisxNjMxOTgzMCwKKy0zMjU3MDYxNSwKKzE2MjYwNTk4LAorMzI1NzA2MTUsCistMTU4MDMyMTIsCisxNTg1MTc4MywKKy0zMTU3NDIwOCwKKzE1NzMxOTM4LAorMzE1NzQyMDgsCistMTQ4MDY1MDUsCisxNTMzOTYxNCwKKy0zMDQ4Mzg3MSwKKzE1MTUzNDQxLAorMzA0ODM4NzEsCistMTM3MTU4MzgsCisxNjc3NzAwMSwKKy0zMzU0Mzc5MSwKKzE2Nzc2ODk2LAorMzM1NDM3OTEsCistMTY3NzY2ODEsCisxNjU1NzY3MywKKy0zMjk5NzIwOCwKKzE2NDQ5NDc2LAorMzI5OTcyMDgsCistMTYyMjk5MzMsCisxNjMyNjk3NywKKy0zMjQyMjI5OSwKKzE2MTA1MDg5LAorMzI0MjIyOTksCistMTU2NTQ4NTEsCisxNjA2NzI0NCwKKy0zMTc3NTAyNCwKKzE1NzE3MzUzLAorMzE3NzUwMjQsCistMTUwMDczODEsCisxNjc3NzE2MywKKy0zMzU0NDAyOSwKKzE2Nzc2OTcyLAorMzM1NDQwMjksCistMTY3NzY5MTksCisxNjcyMjU5MCwKKy0zMzIzODY2MCwKKzE2NTI2MDgzLAorMzMyMzg2NjAsCistMTY0NzE0NTgsCisxNjY2NDMyMiwKKy0zMjkxMjYxMCwKKzE2MjU4MjAzLAorMzI5MTI2MTAsCistMTYxNDUzMTAsCisxNjU5NzYyOSwKKy0zMjUzOTQxOSwKKzE1OTUxNTkzLAorMzI1Mzk0MTksCistMTU3NzIwMDcsCisxNjc3NzMwNiwKKy0zMzU0NDE2MiwKKzE2Nzc2OTYyLAorMzM1NDQxNjIsCistMTY3NzcwNTEsCisxNjg2OTk1NSwKKy0zMzM3NDEwNSwKKzE2NTE0MjA1LAorMzMzNzQxMDUsCistMTY2MDY5NDQsCisxNjk2OTcxNCwKKy0zMzE5MDk5NiwKKzE2MjMxMjgyLAorMzMxOTA5OTYsCistMTY0MjM3ODAsCisxNzA4NDk3MiwKKy0zMjk3OTQ0MiwKKzE1OTA0NDA2LAorMzI5Nzk0NDIsCistMTYyMTIxNjIsCisxNjc3NzQ4MCwKKy0zMzU0NDIzNSwKKzE2Nzc2ODYwLAorMzM1NDQyMzUsCistMTY3NzcxMjUsCisxNzA1MTMyOCwKKy0zMzQ0OTcwMywKKzE2NDA4NDUyLAorMzM0NDk3MDMsCistMTY2ODI1NjUsCisxNzM0NzU4MywKKy0zMzM0NzQzNywKKzE2MDA5OTAxLAorMzMzNDc0MzcsCistMTY1ODAyNjcsCisxNzY5MTY2OCwKKy0zMzIyODY1OSwKKzE1NTQ3MDAyLAorMzMyMjg2NTksCistMTY0NjE0NTQsCisxNjc3Nzc1MCwKKy0zMzU0NDI3NSwKKzE2Nzc2NjMyLAorMzM1NDQyNzUsCistMTY3NzcxNjUsCisxNzMzMTIyMiwKKy0zMzQ5MTc4MCwKKzE2MTcwNjQ4LAorMzM0OTE3ODAsCistMTY3MjQ2NTQsCisxNzkzMTU1MCwKKy0zMzQzNDg0MCwKKzE1NTEzMzYzLAorMzM0MzQ4NDAsCistMTY2Njc2OTcsCisxODYzMDg1NSwKKy0zMzM2ODUxMiwKKzE0NzQ3NzEwLAorMzMzNjg1MTIsCistMTY2MDEzNDksCisxNjc3ODIxMCwKKy0zMzU0NDI5OCwKKzE2Nzc2MTk0LAorMzM1NDQyOTgsCistMTY3NzcxODgsCisxNzgwOTYyOCwKKy0zMzUxNTE2MiwKKzE1NzE1NjMxLAorMzM1MTUxNjIsCistMTY3NDgwNDMsCisxODkyOTk5MSwKKy0zMzQ4MzUxNCwKKzE0NTYzNjExLAorMzM0ODM1MTQsCistMTY3MTYzODUsCisyMDIzNzIxMiwKKy0zMzQ0NjU4NywKKzEzMjE5NDUxLAorMzM0NDY1ODcsCistMTY2Nzk0NDgsCisxNjc3OTAyNSwKKy0zMzU0NDMxMCwKKzE2Nzc1MzkyLAorMzM1NDQzMTAsCistMTY3NzcyMDAsCisxODY1NzYxMiwKKy0zMzUyODE0NSwKKzE0ODgwNjM0LAorMzM1MjgxNDUsCistMTY3NjEwMzAsCisyMDY5OTg0NCwKKy0zMzUxMDU3MSwKKzEyODIwODIyLAorMzM1MTA1NzEsCistMTY3NDM0NTEsCisyMzA4NDg2MywKKy0zMzQ5MDA0NywKKzEwNDE1Mjc0LAorMzM0OTAwNDcsCistMTY3MjI5MjEsCisxNjcxNzY4NCwKKy0zMzM5NTA5MSwKKzE2NzE3NjgyLAorMzMzOTUwOTEsCistMTY2NTgxNDksCiszNTY3MDA5LAorLTcxMjUwMDYsCiszNTY2NTkwLAorNzEyNTAwNiwKKzk2NDM2MTcsCisxOTIxOTI2LAorLTM4Mzg3NTEsCisxOTIxNDU1LAorMzgzODc1MSwKKzEyOTMzODM1LAorMTI0ODY2MiwKKy0yNDkzODI0LAorMTI0ODE3MCwKKzI0OTM4MjQsCisxNDI4MDM4NCwKKzE2NzQ0MTQ3LAorLTMzNDQ3OTUyLAorMTY3NDQxNDMsCiszMzQ0Nzk1MiwKKy0xNjcxMTA3NCwKKzU0OTM3ODUsCistMTA5NzMxNzQsCis1NDkyNjIyLAorMTA5NzMxNzQsCis1NzkwODA4LAorMzE3MzY5NCwKKy02MzM4MzQyLAorMzE3MjI5MiwKKzYzMzgzNDIsCisxMDQzMTIzMCwKKzIxMjQ3NTQsCistNDI0Mjg4MSwKKzIxMjMyNDQsCis0MjQyODgxLAorMTI1MjkyMTgsCisxNjc1ODg2MSwKKy0zMzQ3NzM0MiwKKzE2NzU4ODU1LAorMzM0NzczNDIsCistMTY3NDA1MDAsCis3ODQzODg1LAorLTE1NjY1ODg0LAorNzg0MDg5MiwKKzE1NjY1ODg0LAorMTA5MjQzOSwKKzQ5Njg2NDksCistOTkyMTM3NiwKKzQ5NjQ2OTIsCis5OTIxMzc2LAorNjg0Mzg3NSwKKzM0Nzg0MzcsCistNjk0NDA0MywKKzM0NzM5ODEsCis2OTQ0MDQzLAorOTgyNDc5OCwKKzE2NzY3MDM1LAorLTMzNDkzNjY1LAorMTY3NjcwMjQsCiszMzQ5MzY2NSwKKy0xNjc1Njg0MiwKKzEwMjg0NDIxLAorLTIwNTM2OTk5LAorMTAyNzczNDYsCisyMDUzNjk5OSwKKy0zNzg0NTUwLAorNzI0MDI1NCwKKy0xNDQ1MjY4NiwKKzcyMjk4NjIsCisxNDQ1MjY4NiwKKzIzMDcxMDAsCis1Mzc5Nzk4LAorLTEwNzM0MjMxLAorNTM2NzM3OSwKKzEwNzM0MjMxLAorNjAzMDAzOSwKKzE2NzcxNTc1LAorLTMzNTAyNzI1LAorMTY3NzE1NTUsCiszMzUwMjcyNSwKKy0xNjc2NTkxMywKKzEyNDMxMDQ2LAorLTI0ODE2NzQ5LAorMTI0MTU2MzIsCisyNDgxNjc0OSwKKy04MDY5NDYyLAorOTcwMjA0OSwKKy0xOTM1NTY2NCwKKzk2NzY5NTcsCisxOTM1NTY2NCwKKy0yNjAxNzkwLAorNzcyMjYxMSwKKy0xNTM5NDU0NCwKKzc2OTA0OTksCisxNTM5NDU0NCwKKzEzNjQxMDYsCisxNjc3NDA5OSwKKy0zMzUwNzc1MiwKKzE2Nzc0MDYzLAorMzM1MDc3NTIsCistMTY3NzA5NDYsCisxNDA2MjU4MywKKy0yODA1OTkwMywKKzE0MDMxMTYwLAorMjgwNTk5MDMsCistMTEzMTY1MjcsCisxMTk2Mjk5OSwKKy0yMzg0MTUxOSwKKzExOTA3MjczLAorMjM4NDE1MTksCistNzA5MzA1NiwKKzEwMTg4OTI5LAorLTIwMjc3MTQyLAorMTAxMTI2NjcsCisyMDI3NzE0MiwKKy0zNTI0MzgwLAorMTY3NzU1MTAsCistMzM1MTA1NDEsCisxNjc3NTQ0NSwKKzMzNTEwNTQxLAorLTE2NzczNzM4LAorMTUxNzUxMDIsCistMzAyNTI2MzcsCisxNTExNDAxOSwKKzMwMjUyNjM3LAorLTEzNTExOTA1LAorMTM3NTMyMDcsCistMjczNTgxMjMsCisxMzYzNzkxMSwKKzI3MzU4MTIzLAorLTEwNjEzOTAxLAorMTI0MDA5NzEsCistMjQ2MDU0MTYsCisxMjIzNDExOSwKKzI0NjA1NDE2LAorLTc4NTc4NzQsCisxNjc3NjMxMCwKKy0zMzUxMjA4OCwKKzE2Nzc2MTkzLAorMzM1MTIwODgsCistMTY3NzUyODcsCisxNTg4ODI0MiwKKy0zMTYyMzIyMSwKKzE1NzczMTE3LAorMzE2MjMyMjEsCistMTQ4ODQxNDMsCisxNTAyODk3MiwKKy0yOTc5NTYwOCwKKzE0ODAyNTcwLAorMjk3OTU2MDgsCistMTMwNTQzMjUsCisxNDE0MjIzNywKKy0yNzkwOTU3OCwKKzEzODAxMDAwLAorMjc5MDk1NzgsCistMTExNjYwMjEsCisxNjc3Njc4NywKKy0zMzUxMjk0NiwKKzE2Nzc2NTc1LAorMzM1MTI5NDYsCistMTY3NzYxNDYsCisxNjM0NTE3MiwKKy0zMjQzODMwMiwKKzE2MTMyMjUxLAorMzI0MzgzMDIsCistMTU3MDAyMDcsCisxNTkwNTg1NiwKKy0zMTM0NDQ4NCwKKzE1NDc2NDI5LAorMzEzNDQ0ODQsCistMTQ2MDUwNjksCisxNTQyODMyNCwKKy0zMDE1NTUxNCwKKzE0NzYzNTU4LAorMzAxNTU1MTQsCistMTM0MTQ2NjUsCisxNjc3NzExMCwKKy0zMzUxMzQyMiwKKzE2Nzc2NzI5LAorMzM1MTM0MjIsCistMTY3NzY2MjMsCisxNjY2ODk1MCwKKy0zMjkwODc0NCwKKzE2Mjc5NDgyLAorMzI5MDg3NDQsCistMTYxNzEyMTYsCisxNjU1NTU5NCwKKy0zMjI3NTAxNSwKKzE1NzU4MzQ0LAorMzIyNzUwMTUsCistMTU1MzY3MjIsCisxNjQyODQ2NSwKKy0zMTU2NDI4NCwKKzE1MTczODg2LAorMzE1NjQyODQsCistMTQ4MjUxMzQsCisxNjc3NzM5NSwKKy0zMzUxMzY4NiwKKzE2Nzc2NzA4LAorMzM1MTM2ODYsCistMTY3NzY4ODcsCisxNjk2MTc1OCwKKy0zMzE3NTU5NCwKKzE2MjUzODQ1LAorMzMxNzU1OTQsCistMTY0MzgzODcsCisxNzE1ODIxMiwKKy0zMjgxNTMyOSwKKzE1Njk2NjkyLAorMzI4MTUzMjksCistMTYwNzc2ODgsCisxNzM4MjU3OCwKKy0zMjQwMzg4MCwKKzE1MDYwMzgxLAorMzI0MDM4ODAsCistMTU2NjU3NDMsCisxNjc3Nzc0NSwKKy0zMzUxMzgzMiwKKzE2Nzc2NTA1LAorMzM1MTM4MzIsCistMTY3NzcwMzMsCisxNzMyMzkwMywKKy0zMzMyNTQ3MCwKKzE2MDQxNzU3LAorMzMzMjU0NzAsCistMTY1ODg0NDQsCisxNzkxMTMzMiwKKy0zMzEyMjg3NCwKKzE1MjUxNDg4LAorMzMxMjI4NzQsCistMTYzODU2MDQsCisxODU4OTIwMywKKy0zMjg4OTA4NiwKKzE0MzM5NTQ2LAorMzI4ODkwODYsCistMTYxNTE1MzQsCisxNjc3ODI4MywKKy0zMzUxMzkxMywKKzE2Nzc2MDQ4LAorMzM1MTM5MTMsCistMTY3NzcxMTUsCisxNzg4MzUwNSwKKy0zMzQwOTE4MCwKKzE1NTY1OTY2LAorMzM0MDkxODAsCistMTY2NzIyNTUsCisxOTA3ODQ1MSwKKy0zMzI5NTk0NCwKKzE0MjU3NjQ4LAorMzMyOTU5NDQsCistMTY1NTg4ODMsCisyMDQ2NTQ0MCwKKy0zMzE2NDUxMCwKKzEyNzM5MDY3LAorMzMxNjQ1MTAsCistMTY0MjcyOTAsCisxNjc3OTIwMywKKy0zMzUxMzk1OCwKKzE2Nzc1MTczLAorMzM1MTM5NTgsCistMTY3NzcxNjAsCisxODg0MDI2NSwKKy0zMzQ1NTc4OSwKKzE0NjU1ODcxLAorMzM0NTU3ODksCistMTY3MTg5MjEsCisyMTA3NTEyMSwKKy0zMzM5MjcxNSwKKzEyMzU3ODY2LAorMzMzOTI3MTUsCistMTY2NTU3NzEsCisyMzY3NzYyMSwKKy0zMzMxOTI2NiwKKzk2ODE4MjgsCiszMzMxOTI2NiwKKy0xNjU4MjIzMywKKzE2NzgwODM0LAorLTMzNTEzOTgzLAorMTY3NzM1NjcsCiszMzUxMzk4MywKKy0xNjc3NzE4NSwKKzIwNTM2MjI3LAorLTMzNDgxNjk2LAorMTI5ODU4NDgsCiszMzQ4MTY5NiwKKy0xNjc0NDg1OSwKKzI0NjE0ODU1LAorLTMzNDQ2NjMwLAorODg3MjExMiwKKzMzNDQ2NjMwLAorLTE2NzA5NzUxLAorMjkzNzMwNzUsCistMzM0MDU3MjEsCis0MDcyOTM0LAorMzM0MDU3MjEsCistMTY2Njg3OTMsCisxNjY1ODU3MiwKKy0zMzE1NjcxMCwKKzE2NjU4NTY4LAorMzMxNTY3MTAsCistMTY1Mzk5MjUsCisxOTk1Njk0LAorLTM5NzE3MDIsCisxOTk1MjI1LAorMzk3MTcwMiwKKzEyNzg2Mjk2LAorMTAxOTMzNCwKKy0yMDI4MzU1LAorMTAxODgzNSwKKzIwMjgzNTUsCisxNDczOTA0NywKKzY0ODM5NywKKy0xMjkwMDQxLAorNjQ3ODg2LAorMTI5MDA0MSwKKzE1NDgwOTMzLAorMTY3MTEyMDgsCistMzMyNjE0NzAsCisxNjcxMTIwMSwKKzMzMjYxNDcwLAorLTE2NjQ1MTkyLAorMzI4NDg3MywKKy02NTM2NzI3LAorMzI4MzQ4MywKKzY1MzY3MjcsCisxMDIwODg2MCwKKzE3NTI3NDYsCistMzQ4NzA3MSwKKzE3NTExOTgsCiszNDg3MDcxLAorMTMyNzMyNzIsCisxMTM0MjU0LAorLTIyNTU5ODEsCisxMTMyNjQyLAorMjI1NTk4MSwKKzE0NTEwMzE5LAorMTY3NDA1NDYsCistMzMzMTk4NTksCisxNjc0MDUzNCwKKzMzMzE5ODU5LAorLTE2NzAzODY0LAorNTExOTAxOSwKKy0xMDE4NDg1MywKKzUxMTUxMTMsCisxMDE4NDg1MywKKzY1NDMwODMsCisyOTE2NzY2LAorLTU4MDA4MjAsCisyOTEyMTIyLAorNTgwMDgyMCwKKzEwOTQ4MzI5LAorMTk0MDk1MCwKKy0zODU4MjYwLAorMTkzNTk3OSwKKzM4NTgyNjAsCisxMjkwMDI4OCwKKzE2NzU2ODY2LAorLTMzMzUyMzMyLAorMTY3NTY4NDQsCiszMzM1MjMzMiwKKy0xNjczNjQ5MywKKzc0MTYxNDEsCistMTQ3NTA3MDksCis3NDA1OTQxLAorMTQ3NTA3MDksCisxOTU1MTM0LAorNDYxODEzMiwKKy05MTc4NjA0LAorNDYwNDg4NCwKKzkxNzg2MDQsCis3NTU0MjAwLAorMzIwNTczMSwKKy02MzY1ODczLAorMzE5MDk0NCwKKzYzNjU4NzMsCisxMDM4MDU0MSwKKzE2NzY1OTM3LAorLTMzMzcwMzY5LAorMTY3NjU4OTcsCiszMzM3MDM2OSwKKy0xNjc1NDYxOCwKKzk4NzU3MTQsCistMTk2MzE5NjEsCis5ODUxMjM4LAorMTk2MzE5NjEsCistMjk0OTczNiwKKzY4Mjg4NzQsCistMTM1NTY4NzAsCis2NzkzNTkyLAorMTM1NTY4NzAsCiszMTU0NzUxLAorNTAyMTkyMCwKKy05OTUzOTg3LAorNDk4MDIzMCwKKzk5NTM5ODcsCis2Nzc1MDY2LAorMTY3NzA5ODMsCistMzMzODAzODEsCisxNjc3MDkxMSwKKzMzMzgwMzgxLAorLTE2NzY0Njc5LAorMTIxMDc3MzEsCistMjQwNDUwNjYsCisxMjA1MzY3OSwKKzI0MDQ1MDY2LAorLTczODQxOTQsCis5MzA0Njk3LAorLTE4NDMzNzA0LAorOTIxODIwMCwKKzE4NDMzNzA0LAorLTE3NDU2ODEsCis3MzMwMTczLAorLTE0NDgwOTI1LAorNzIyMDgxOSwKKzE0NDgwOTI1LAorMjIyNjIyNCwKKzE2NzczODA0LAorLTMzMzg1OTM3LAorMTY3NzM2NzQsCiszMzM4NTkzNywKKy0xNjc3MDI2MSwKKzEzODU3MDY3LAorLTI3NDY5ODgzLAorMTM3NDU3MzEsCisyNzQ2OTg4MywKKy0xMDgyNTU4MywKKzExNjY3MjMwLAorLTIzMDI4MjA5LAorMTE0NzI0MDMsCisyMzAyODIwOSwKKy02MzYyNDE3LAorOTg2MTUwOSwKKy0xOTM2NTY0MiwKKzk1OTc4MzUsCisxOTM2NTY0MiwKKy0yNjgyMTI4LAorMTY3NzU0MDUsCistMzMzODkwMTksCisxNjc3NTE3MCwKKzMzMzg5MDE5LAorLTE2NzczMzU4LAorMTUwOTQxNjYsCistMjk4MjYwNTcsCisxNDg3NjIwNywKKzI5ODI2MDU3LAorLTEzMTkzMTU3LAorMTM2Mjk1NzUsCistMjY3MjIyMjUsCisxMzIyMTk0OCwKKzI2NzIyMjI1LAorLTEwMDc0MzA3LAorMTIyNjEzMDQsCistMjM4MjI1MjAsCisxMTY3NjQ4MiwKKzIzODIyNTIwLAorLTcxNjA1NzEsCisxNjc3NjM1OCwKKy0zMzM5MDcyOSwKKzE2Nzc1OTM1LAorMzMzOTA3MjksCistMTY3NzUwNzYsCisxNTkzOTk3MywKKy0zMTMxNTgwOSwKKzE1NTI3MzYwLAorMzEzMTU4MDksCistMTQ2OTAxMTcsCisxNTE0MDI1NCwKKy0yOTMzMTg1MCwKKzE0MzMzNTIwLAorMjkzMzE4NTAsCistMTI2OTY1NTgsCisxNDMyNDU1MiwKKy0yNzMwODI0MCwKKzEzMTE1ODIxLAorMjczMDgyNDAsCistMTA2NjMxNTcsCisxNjc3NzAwNCwKKy0zMzM5MTY3NywKKzE2Nzc2MjQxLAorMzMzOTE2NzcsCistMTY3NzYwMjksCisxNjU2NDUxOSwKKy0zMjIwODA1MSwKKzE1Nzk5Mzc0LAorMzIyMDgwNTEsCistMTU1ODY2NzYsCisxNjM0OTcyMCwKKy0zMTAxMTUzOCwKKzE0ODExODcwLAorMzEwMTE1MzgsCistMTQzODQzNzQsCisxNjExNzg4NCwKKy0yOTcyMDExOSwKKzEzNzQ2MDM4LAorMjk3MjAxMTksCistMTMwODY3MDUsCisxNjc3NzU3NCwKKy0zMzM5MjIwMywKKzE2Nzc2MTk5LAorMzMzOTIyMDMsCistMTY3NzY1NTgsCisxNzE0MjYyMywKKy0zMjcyNTE4MywKKzE1NzQwOTAzLAorMzI3MjUxODMsCistMTYxMDYzMTAsCisxNzUyMzc0NiwKKy0zMjAyODc5MywKKzE0NjYwMDIxLAorMzIwMjg3OTMsCistMTU0MDY1NTEsCisxNzk0OTQ1MiwKKy0zMTI1MDk0MSwKKzEzNDUyNjk5LAorMzEyNTA5NDEsCistMTQ2MjQ5MzUsCisxNjc3ODI3MywKKy0zMzM5MjQ5NSwKKzE2Nzc1Nzk0LAorMzMzOTI0OTUsCistMTY3NzY4NTEsCisxNzg2NDUxMSwKKy0zMzAxOTIyMSwKKzE1MzE0NDc2LAorMzMwMTkyMjEsCistMTY0MDE3NzEsCisxOTAxOTU4MiwKKy0zMjYyMjI5NCwKKzEzNzYwNTU3LAorMzI2MjIyOTQsCistMTYwMDI5MjMsCisyMDMzNTg4NiwKKy0zMjE2OTk2MSwKKzExOTg5NzMxLAorMzIxNjk5NjEsCistMTU1NDg0MDEsCisxNjc3OTM1MCwKKy0zMzM5MjY1NywKKzE2Nzc0ODc5LAorMzMzOTI2NTcsCistMTY3NzcwMTQsCisxODk4Mjk3MiwKKy0zMzE4NDU5MiwKKzE0MzYyMTg2LAorMzMxODQ1OTIsCistMTY1Njc5NDIsCisyMTM1MDU1NCwKKy0zMjk2MTA0NiwKKzExNzY5OTc2LAorMzI5NjEwNDYsCistMTYzNDMzMTQsCisyNDA3OTY4OCwKKy0zMjcwMzM2MiwKKzg3ODE5MTIsCiszMjcwMzM2MiwKKy0xNjA4NDM4MywKKzE2NzgxMTkwLAorLTMzMzkyNzQ2LAorMTY3NzMxMzAsCiszMzM5Mjc0NiwKKy0xNjc3NzEwNCwKKzIwODk2MzAzLAorLTMzMjc3MDI2LAorMTI1NDE3MzcsCiszMzI3NzAyNiwKKy0xNjY2MDgyNCwKKzI1MzQzMTk5LAorLTMzMTUxOTc3LAorNzk2OTE4NSwKKzMzMTUxOTc3LAorLTE2NTM1MTY5LAorMzA1MDIzODQsCistMzMwMDY4OTYsCisyNjY0MjE5LAorMzMwMDY4OTYsCistMTYzODkzODcsCisxNjc4NDQ1MSwKKy0zMzM5Mjc5NiwKKzE2NzY5OTE4LAorMzMzOTI3OTYsCistMTY3NzcxNTQsCisyNDI4ODI1OCwKKy0zMzMyODUxNiwKKzkyMDE1MjAsCiszMzMyODUxNiwKKy0xNjcxMjU2MiwKKzMyNDIzMTg3LAorLTMzMjU4ODI4LAorOTk2NTY3LAorMzMyNTg4MjgsCistMTY2NDI1MzgsCis0MTg5NTMyMCwKKy0zMzE3NzY4NiwKKy04NTU3MTAxLAorMzMxNzc2ODYsCistMTY1NjEwMDMsCisxNjU0MTU5NSwKKy0zMjQ0NzQ5OCwKKzE2NTQxNTg3LAorMzI0NDc0OTgsCistMTYzMDU5NjYsCisxMDYwOTI1LAorLTIwODA1OTAsCisxMDYwNDI2LAorMjA4MDU5MCwKKzE0NjU1ODY1LAorNTI1NDc4LAorLTEwMzAyNTYsCis1MjQ5NjIsCisxMDMwMjU2LAorMTU3MjY3NzYsCiszMzAzMjEsCistNjQ3NDM3LAorMzI5ODAwLAorNjQ3NDM3LAorMTYxMTcwOTUsCisxNjY0NTcxNywKKy0zMjY1MTczNCwKKzE2NjQ1NzAzLAorMzI2NTE3MzQsCistMTY1MTQyMDMsCisxODIwNzg5LAorLTM1NzAwOTUsCisxODE5MjQ4LAorMzU3MDA5NSwKKzEzMTM3MTc5LAorOTI0NTc1LAorLTE4MTIwMTgsCis5MjI5NDIsCisxODEyMDE4LAorMTQ5Mjk2OTksCis1ODY2ODQsCistMTE0OTE4NiwKKzU4NTAxNiwKKzExNDkxODYsCisxNTYwNTUxNiwKKzE2NzA0MDM2LAorLTMyNzY2MTIxLAorMTY3MDQwMTEsCiszMjc2NjEyMSwKKy0xNjYzMDgzMSwKKzMwMjA4NzUsCistNTkyMTEzOCwKKzMwMTYyNjYsCis1OTIxMTM4LAorMTA3NDAwNzYsCisxNTk3NTczLAorLTMxMjg3NjQsCisxNTkyNDg3LAorMzEyODc2NCwKKzEzNTg3MTU2LAorMTAzMDEyNCwKKy0yMDE1NDg3LAorMTAyNDg0OCwKKzIwMTU0ODcsCisxNDcyMjI0NCwKKzE2NzM2NTY1LAorLTMyODI5OTA5LAorMTY3MzY1MjEsCiszMjgyOTkwOSwKKy0xNjY5NTg2OSwKKzQ3NjIwMTMsCistOTMyODE4NSwKKzQ3NDg5MjIsCis5MzI4MTg1LAorNzI2NjI4MSwKKzI2Nzk1NjYsCistNTI0MTA5MSwKKzI2NjQyMDUsCis1MjQxMDkxLAorMTE0MzM0NDYsCisxNzczOTEyLAorLTM0NjM2MjAsCisxNzU3NTY0LAorMzQ2MzYyMCwKKzEzMjQ1NzQwLAorMTY3NTQ2NzMsCistMzI4NjUzOTUsCisxNjc1NDU5MywKKzMyODY1Mzk1LAorLTE2NzMyMDUwLAorNzAwMTc3MiwKKy0xMzcwMDQ2OCwKKzY5NjcxMDQsCisxMzcwMDQ2OCwKKzI4MDgzNDAsCis0MjkzMzYzLAorLTgzNzgzMTIsCis0MjQ5MDg5LAorODM3ODMxMiwKKzgyMzQ3NjQsCisyOTYwMDYxLAorLTU3NTgzMDcsCisyOTExMDU4LAorNTc1ODMwNywKKzEwOTA2MDk3LAorMTY3NjQ3NTYsCistMzI4ODUxMTAsCisxNjc2NDYxMSwKKzMyODg1MTEwLAorLTE2NzUyMTUxLAorOTQ4MDE4OCwKKy0xODUxMzIxNSwKKzkzOTU3MjIsCisxODUxMzIxNSwKKy0yMDk4Njk0LAorNjQ1MzY5MywKKy0xMjU0MjE3MSwKKzYzMzQxOTQsCisxMjU0MjE3MSwKKzM5ODkzMzAsCis0NzEwNjQxLAorLTkxMDMyNjQsCis0NTcwOTY2LAorOTEwMzI2NCwKKzc0OTU2MDksCisxNjc3MDM5MywKKy0zMjg5NjA1NCwKKzE2NzcwMTMzLAorMzI4OTYwNTQsCistMTY3NjMzMTAsCisxMTgxNjI3NiwKKy0yMjk5Mjk0OSwKKzExNjI3MTMxLAorMjI5OTI5NDksCistNjY2NjE5MSwKKzg5NzU3MjYsCistMTczMTQ3ODksCis4Njc4MjgwLAorMTczMTQ3ODksCistODc2NzkwLAorNzAzMjQwOCwKKy0xMzQzMDE2NCwKKzY2NjA4NjksCisxMzQzMDE2NCwKKzMwODM5NDAsCisxNjc3MzU5MywKKy0zMjkwMjEyNywKKzE2NzczMTI0LAorMzI5MDIxMjcsCistMTY3Njk1MDIsCisxMzczNTYxNSwKKy0yNjU1NzA1MiwKKzEzMzQxNzIwLAorMjY1NTcwNTIsCistMTAzMDAxMjAsCisxMTUyODE2NSwKKy0yMTk0NjYwNiwKKzEwODQ4NDAwLAorMjE5NDY2MDYsCistNTU5OTM0OSwKKzk3NTI1NjMsCistMTgyMzgxMTAsCis4ODQyODUzLAorMTgyMzgxMTAsCistMTgxODIwMCwKKzE2Nzc1NDk5LAorLTMyOTA1NDk2LAorMTY3NzQ2NTQsCiszMjkwNTQ5NiwKKy0xNjc3MjkzNywKKzE1MjAwNTg4LAorLTI5MDU0OTU3LAorMTQ0MjM1ODksCisyOTA1NDk1NywKKy0xMjg0Njk2MSwKKzEzODU3MDA0LAorLTI1NzY5OTk1LAorMTI0MTc4NTUsCisyNTc2OTk5NSwKKy05NDk3NjQzLAorMTI2MjQ0NTMsCistMjI3NTY1MDAsCisxMDU3Nzg3MywKKzIyNzU2NTAwLAorLTY0MjUxMTEsCisxNjc3Njc5MiwKKy0zMjkwNzM2NSwKKzE2Nzc1MjY3LAorMzI5MDczNjUsCistMTY3NzQ4NDMsCisxNjM2NjM0NCwKKy0zMDY1NDA4OSwKKzE0ODg4Mjk0LAorMzA2NTQwODksCistMTQ0Nzc0MjIsCisxNTk3ODc1MywKKy0yODUyNjI5NSwKKzEzMTA2NDA2LAorMjg1MjYyOTUsCistMTIzMDc5NDIsCisxNTU4ODA1NywKKy0yNjM4MTQ1NiwKKzExMzEwMjQyLAorMjYzODE0NTYsCistMTAxMjEwODMsCisxNjc3NzkzMywKKy0zMjkwODQwMiwKKzE2Nzc1MTgzLAorMzI5MDg0MDIsCistMTY3NzU5MDAsCisxNzQ5MzgwMiwKKy0zMTYxOTI4NywKKzE0NzQ0OTQzLAorMzE2MTkyODcsCistMTU0NjE1MjksCisxODIxMjQxNCwKKy0zMDMyNTIzNCwKKzEyNzA2OTI3LAorMzAzMjUyMzQsCistMTQxNDIxMjQsCisxODk4MjcyNSwKKy0yODkzODA4MSwKKzEwNTIyMjg2LAorMjg5MzgwODEsCistMTI3Mjc3OTUsCisxNjc3OTMzMCwKKy0zMjkwODk3NywKKzE2Nzc0MzcyLAorMzI5MDg5NzcsCistMTY3NzY0ODYsCisxODkyODA0MSwKKy0zMjE4MTI4MCwKKzEzODgzNzA3LAorMzIxODEyODAsCistMTYwMzQ1MzIsCisyMTE2MzExOCwKKy0zMTQyNDMzNCwKKzEwODc2ODU1LAorMzE0MjQzMzQsCistMTUyNjI3NTcsCisyMzY1MDg3MSwKKy0zMDU4MTgxNCwKKzc1MzAwNzYsCiszMDU4MTgxNCwKKy0xNDQwMzczMSwKKzE2NzgxNDg0LAorLTMyOTA5Mjk2LAorMTY3NzI1NDMsCiszMjkwOTI5NiwKKy0xNjc3NjgxMSwKKzIxMTYxOTk2LAorLTMyNTAxNjc0LAorMTE5NzY0MjQsCiszMjUwMTY3NCwKKy0xNjM2MTIwNCwKKzI1ODEyMDA5LAorLTMyMDY4OTc1LAorNjg4NTIzNCwKKzMyMDY4OTc1LAorLTE1OTIwMDI3LAorMzExMDMzODUsCistMzE1NzY1OTQsCisxMDkxODMxLAorMzE1NzY1OTQsCistMTU0MTgwMDAsCisxNjc4NTE2NCwKKy0zMjkwOTQ3MywKKzE2NzY5MDQzLAorMzI5MDk0NzMsCistMTY3NzY5OTEsCisyNDk4ODA2NCwKKy0zMjY4MjEzOSwKKzgzMzQzNTYsCiszMjY4MjEzOSwKKy0xNjU0NTIwNCwKKzMzNzk1Nzk0LAorLTMyNDM4MDQzLAorLTcyMjI1MiwKKzMyNDM4MDQzLAorLTE2Mjk2MzI1LAorNDM5NDYxMjgsCistMzIxNTY3MzgsCistMTExNTk0MDMsCiszMjE1NjczOCwKKy0xNjAwOTUxMCwKKzE2NzkxNjg3LAorLTMyOTA5NTcxLAorMTY3NjI2MjAsCiszMjkwOTU3MSwKKy0xNjc3NzA5MSwKKzMxNzcyNTIxLAorLTMyNzgzMDk2LAorMTY1MjgzNCwKKzMyNzgzMDk2LAorLTE2NjQ4MTM5LAorNDc5NjEyMjksCistMzI2NDY0MjMsCistMTQ2NzUyMjUsCiszMjY0NjQyMywKKy0xNjUwODc4OCwKKzY2NzUxNjgyLAorLTMyNDg3Nzg1LAorLTMzNjI3NDIzLAorMzI0ODc3ODUsCistMTYzNDcwNDMsCisxNjMxMjUwMCwKKy0zMDE0MTU1NiwKKzE2MzEyNDg1LAorMzAxNDE1NTYsCistMTU4NDc3NjksCis1NDc1OTgsCistMTAxMTM1NCwKKzU0NzA4NCwKKzEwMTEzNTQsCisxNTY4MjUzNCwKKzI2NjQ0OCwKKy00OTE4NDksCisyNjU5MjUsCis0OTE4NDksCisxNjI0NDg0MywKKzE2NjExMSwKKy0zMDY0NDYsCisxNjU1ODQsCiszMDY0NDYsCisxNjQ0NTUyMSwKKzE2NTE2MjYyLAorLTMwNTE4MDQ5LAorMTY1MTYyMzYsCiszMDUxODA0OSwKKy0xNjI1NTI4MiwKKzk2MjQ4NywKKy0xNzc2OTM4LAorOTYwODU3LAorMTc3NjkzOCwKKzE0ODUzODcyLAorNDc0NzQyLAorLTg3NTY1NiwKKzQ3MzA2MiwKKzg3NTY1NiwKKzE1ODI5NDEzLAorMjk3NTIwLAorLTU0ODE3NiwKKzI5NTgyMSwKKzU0ODE3NiwKKzE2MTgzODc1LAorMTY2MzE0OTIsCistMzA3MzA5NDQsCisxNjYzMTQ0MywKKzMwNzMwOTQ0LAorLTE2NDg1NzE5LAorMTY2MDE0NiwKKy0zMDYyODcwLAorMTY1NTA4MSwKKzMwNjI4NzAsCisxMzQ2MTk4OSwKKzgzODE3MiwKKy0xNTQzODA2LAorODMyODMxLAorMTU0MzgwNiwKKzE1MTA2MjEzLAorNTMwMTM1LAorLTk3NDUzMiwKKzUyNDY5MSwKKzk3NDUzMiwKKzE1NzIyMzkwLAorMTY2OTYxMTAsCistMzA4NTAzMDcsCisxNjY5NjAyMiwKKzMwODUwMzA3LAorLTE2NjE0OTE2LAorMjc3NjY0MiwKKy01MTE2NDcyLAorMjc2MTM4NywKKzUxMTY0NzIsCisxMTIzOTE4NywKKzE0NTY4NDUsCistMjY3NjQ3NywKKzE0NDAxNTIsCisyNjc2NDc3LAorMTM4ODAyMTksCis5MzYxNTEsCistMTcxMzgzNSwKKzkxODg5MSwKKzE3MTM4MzUsCisxNDkyMjE3NCwKKzE2NzMyMTkxLAorLTMwOTE2OTEwLAorMTY3MzIwMzEsCiszMDkxNjkxMCwKKy0xNjY4NzAwNiwKKzQ0MzAyMTksCistODE0NTUyMywKKzQzODY0MzEsCis4MTQ1NTIzLAorNzk2MDU2NiwKKzI0Njc3MTUsCistNDUxMjg1NywKKzI0MTY5NjYsCis0NTEyODU3LAorMTE4OTI1MzUsCisxNjI4MTEzLAorLTI5NTg3MjUsCisxNTc0Mzg3LAorMjk1ODcyNSwKKzEzNTc0NzE2LAorMTY3NTIzMTQsCistMzA5NTM5NzMsCisxNjc1MjAyNSwKKzMwOTUzOTczLAorLTE2NzI3MTIzLAorNjYyMjE5MywKKy0xMjEyNzYxNiwKKzY1MDQ2NDQsCisxMjEyNzYxNiwKKzM2NTAzNzksCis0MDE2NTQxLAorLTcyODUxMzUsCiszODY4ODMxLAorNzI4NTEzNSwKKzg4OTE4NDMsCisyNzYyNjc1LAorLTQ5NTQ4ODMsCisyNjAwNDUxLAorNDk1NDg4MywKKzExNDE0MDg5LAorMTY3NjM1NzUsCistMzA5NzQ1NjgsCisxNjc2MzA1NSwKKzMwOTc0NTY4LAorLTE2NzQ5NDE1LAorOTE1MDQzMSwKKy0xNjYzOTE0MiwKKzg4NTk2NDYsCisxNjYzOTE0MiwKKy0xMjMyODYxLAorNjE4MjE4MSwKKy0xMTA0OTk3NCwKKzU3NzgyMjUsCisxMTA0OTk3NCwKKzQ4MTY4MTAsCis0NTE4NjI5LAorLTc5MTc1MzIsCis0MDUxMjQ3LAorNzkxNzUzMiwKKzgyMDczNDEsCisxNjc2OTk3MywKKy0zMDk4NjAwMiwKKzE2NzY5MDM0LAorMzA5ODYwMDIsCistMTY3NjE3OTEsCisxMTY3NjI2OSwKKy0yMDk2NDYzMCwKKzExMDE1NjgzLAorMjA5NjQ2MzAsCistNTkxNDczNiwKKzg4OTM0MTgsCistMTU0ODk2MzgsCis3ODcyNDQ2LAorMTU0ODk2MzgsCisxMTM1MiwKKzcwNDEzODMsCistMTE4NDU5MzksCis1NzgwNTY4LAorMTE4NDU5MzksCiszOTU1MjY1LAorMTY3NzM3ODMsCistMzA5OTIzNDcsCisxNjc3MjA5MiwKKzMwOTkyMzQ3LAorLTE2NzY4NjU5LAorMTM5NTMyODAsCistMjQ0OTY1MzQsCisxMjU2MTU3NywKKzI0NDk2NTM0LAorLTk3Mzc2NDEsCisxMTk3MDkyMSwKKy0xOTkzMTAyNSwKKzk2MDIyNjUsCisxOTkzMTAyNSwKKy00Nzk1OTcwLAorMTA0MTMxNzIsCistMTYzNDM0MjEsCis3Mjc2ODIwLAorMTYzNDM0MjEsCistOTEyNzc1LAorMTY3NzYzNjgsCistMzA5OTU4NjgsCisxNjc3MzMxOCwKKzMwOTk1ODY4LAorLTE2NzcyNDcwLAorMTYwMDc3OTAsCistMjcwMjEzNDMsCisxMzIzOTkwMSwKKzI3MDIxMzQzLAorLTEyNDcwNDc1LAorMTUzNjU1MjcsCistMjM3MDAwMjQsCisxMDI4NzE5NCwKKzIzNzAwMDI0LAorLTg4NzU1MDUsCisxNDc4NTk0NywKKy0yMDcwMjg1NywKKzc2MjI2NjQsCisyMDcwMjg1NywKKy01NjMxMzk1LAorMTY3Nzg2NTAsCistMzA5OTc4MjEsCisxNjc3MzE1MCwKKzMwOTk3ODIxLAorLTE2Nzc0NTgzLAorMTgxNTcwNTYsCistMjg2NTk2NDksCisxMjg2MzkyNSwKKzI4NjU5NjQ5LAorLTE0MjQzNzY0LAorMTk0NDM4MDYsCistMjY0NzY5NTAsCis5MjE0NjM4LAorMjY0NzY5NTAsCistMTE4ODEyMjgsCisyMDcyODY4MSwKKy0yNDI5NzQzMywKKzU1NzA2NzEsCisyNDI5NzQzMywKKy05NTIyMTM2LAorMTY3ODE0NDUsCistMzA5OTg5MDQsCisxNjc3MTUyNywKKzMwOTk4OTA0LAorLTE2Nzc1NzU2LAorMjA5ODgwNjAsCistMjk2NTY5MjEsCisxMTExMjM2MSwKKzI5NjU2OTIxLAorLTE1MzIzMjA0LAorMjUxODc3NDMsCistMjgzMTcxNTAsCis1NDYyNTIwLAorMjgzMTcxNTAsCistMTM4NzMwNDcsCisyOTY3MjEyNCwKKy0yNjg4NjU1NiwKKy01NzAzMjYsCisyNjg4NjU1NiwKKy0xMjMyNDU4MiwKKzE2Nzg1NzUyLAorLTMwOTk5NTA1LAorMTY3Njc4NzAsCiszMDk5OTUwNSwKKy0xNjc3NjQwNiwKKzI1NDQ0MzAwLAorLTMwMjQwNTQ1LAorNzI4NzgzMCwKKzMwMjQwNTQ1LAorLTE1OTU0OTE0LAorMzQ0MzQ5ODAsCistMjk0NTI0NzIsCistMjU1NTg1NCwKKzI5NDUyNDcyLAorLTE1MTAxOTEwLAorNDQ0NDEyNDIsCistMjg1NzUzNzksCistMTM1MTE0NzQsCisyODU3NTM3OSwKKy0xNDE1MjU1MiwKKzE2NzkzMTEyLAorLTMwOTk5ODM4LAorMTY3NjA4NzEsCiszMDk5OTgzOCwKKy0xNjc3Njc2NywKKzMzMDk1NTA2LAorLTMwNTc0MjUwLAorLTIxNzcsCiszMDU3NDI1MCwKKy0xNjMxNjExMywKKzUwNDA4MDM0LAorLTMwMTIyMjkxLAorLTE3ODAzOTAyLAorMzAxMjIyOTEsCistMTU4MjY5MTcsCis3MDE1Mzc2NSwKKy0yOTYwNjgxMSwKKy0zODEwNzU4MywKKzI5NjA2ODExLAorLTE1MjY4OTY2LAorMTY4MDYxNTgsCistMzEwMDAwMjMsCisxNjc0ODAyNSwKKzMxMDAwMDIzLAorLTE2Nzc2OTY3LAorNDY2NzAxNTUsCistMzA3NjI1MjYsCistMTMzNzMwMzcsCiszMDc2MjUyNiwKKy0xNjUxOTkwMiwKKzc4Nzg5NTQ0LAorLTMwNTA3MDkyLAorLTQ1NzY4OTA1LAorMzA1MDcwOTIsCistMTYyNDM0MjMsCisxMTU5NDI3NDcsCistMzAyMTE2MjcsCistODMyNDE5MTgsCiszMDIxMTYyNywKKy0xNTkyMzYxMywKKzE1ODcyODM1LAorLTIyNDQ3NTU5LAorMTU4NzI4MDcsCisyMjQ0NzU1OSwKKy0xNDk2ODQyNiwKKzI3Nzc1NCwKKy0zOTI0MzQsCisyNzcyMzEsCiszOTI0MzQsCisxNjIyMjIzMSwKKzEzMzA2MSwKKy0xODc4MDQsCisxMzI1MzMsCisxODc4MDQsCisxNjUxMTYyMiwKKzgxNzYzLAorLTExNTI1NiwKKzgxMjMzLAorMTE1MjU2LAorMTY2MTQyMjAsCisxNjI2MzMwMywKKy0yMjk5OTc0NiwKKzE2MjYzMjUwLAorMjI5OTk3NDYsCistMTU3NDkzMzcsCis0OTQ2MDUsCistNjk4MjkwLAorNDkyOTI3LAorNjk4MjkwLAorMTU3ODk2ODUsCisyMzg3NzYsCistMzM2NDc1LAorMjM3MDcxLAorMzM2NDc1LAorMTYzMDEzNjksCisxNDcyMjgsCistMjA3MDAwLAorMTQ1NTE0LAorMjA3MDAwLAorMTY0ODQ0NzMsCisxNjQ4ODI3OCwKKy0yMzMxNzg3NywKKzE2NDg4MTgxLAorMjMzMTc4NzcsCistMTYxOTkyNDIsCis4NzIzNzgsCistMTIyOTk2MSwKKzg2NzA0OSwKKzEyMjk5NjEsCisxNTAzNzc4OCwKKzQyNjg4OSwKKy01OTk4MzksCis0MjE0MTEsCis1OTk4MzksCisxNTkyODkxNiwKKzI2NDg0MCwKKy0zNzA2MjksCisyNTkzMDgsCiszNzA2MjksCisxNjI1MzA2OCwKKzE2NjE1Nzg1LAorLTIzNDk4MTQ1LAorMTY2MTU2MDksCisyMzQ5ODE0NSwKKy0xNjQ1NDE3OSwKKzE1MTM3NTcsCistMjEyOTAxNiwKKzE0OTcxMjYsCisyMTI5MDE2LAorMTM3NjYzMzMsCis3NTgyNjEsCistMTA2MDAwMSwKKzc0MDgwNiwKKzEwNjAwMDEsCisxNTI3ODE0OSwKKzQ3NTU1MSwKKy02NTk5NzEsCis0NTc3ODksCis2NTk5NzEsCisxNTg0Mzg3NSwKKzE2Njg3NDA3LAorLTIzNTk5MzMyLAorMTY2ODcwODksCisyMzU5OTMzMiwKKy0xNjU5NzI4MCwKKzI1NTcxMTYsCistMzU4MDY0NywKKzI1MDY2ODQsCiszNTgwNjQ3LAorMTE3MTM0MTYsCisxMzMyMDA3LAorLTE4NDUwMDksCisxMjc3MjMwLAorMTg0NTAwOSwKKzE0MTY3OTc5LAorODUxMjcyLAorLTExNjM5NDIsCis3OTQ3OTEsCisxMTYzOTQyLAorMTUxMzExNTQsCisxNjcyNzQ4NiwKKy0yMzY1NTgzMCwKKzE2NzI2OTEwLAorMjM2NTU4MzAsCistMTY2NzcxODAsCis0MTQ0NzQ5LAorLTU3NTgxNjMsCiszOTk4NTIzLAorNTc1ODE2MywKKzg2MzM5NDQsCisyMjk3ODAzLAorLTMxMzEwNjksCisyMTMwMTk4LAorMzEzMTA2OSwKKzEyMzQ5MjE2LAorMTUxNjAyNSwKKy0yMDE5MDcwLAorMTMzOTM3MSwKKzIwMTkwNzAsCisxMzkyMTgyMCwKKzE2NzQ5OTU3LAorLTIzNjg3MjgyLAorMTY3NDg5MTgsCisyMzY4NzI4MiwKKy0xNjcyMTY2MCwKKzYzNDI4MDcsCistODY4ODc3NCwKKzU5NDQ5NzUsCis4Njg4Nzc0LAorNDQ4OTQzNCwKKzM4NTU3MjIsCistNTEwNDQ1NCwKKzMzNjMwNjYsCis1MTA0NDU0LAorOTU1ODQyOCwKKzI2NzgyODYsCistMzQwNzU2NCwKKzIxNDA3MzgsCiszNDA3NTY0LAorMTE5NTgxOTIsCisxNjc2MjczNiwKKy0yMzcwNDc2MiwKKzE2NzYwODYxLAorMjM3MDQ3NjIsCistMTY3NDYzODAsCis5MDU5OTQ4LAorLTEyMTA2MDE0LAorODA2MDU0MiwKKzEyMTA2MDE0LAorLTM0MzI3NCwKKzYyMzE5NTksCistNzg0NzY2OSwKKzQ4NjYzMjIsCis3ODQ3NjY5LAorNTY3ODkzNiwKKzQ2Nzg1NzMsCistNTUwODYwMywKKzMxMTE3NjgsCis1NTA4NjAzLAorODk4Njg3NSwKKzE2NzcwMzUzLAorLTIzNzE0NDY4LAorMTY3NjY5NzAsCisyMzcxNDQ2OCwKKy0xNjc2MDEwNywKKzEyMTAwNzY4LAorLTE1NDgzNDI3LAorOTc5NjEwNCwKKzE1NDgzNDI3LAorLTUxMTk2NTYsCis5NjU5NDAxLAorLTExMTgwMDQ3LAorNjE1MTU3MywKKzExMTgwMDQ3LAorOTY2MjQyLAorODA2NjAwMywKKy04MzcxMzc2LAorMzc3MjkxMSwKKzgzNzEzNzYsCis0OTM4MzAyLAorMTY3NzU1MjAsCistMjM3MTk4NTUsCisxNjc2OTQyMCwKKzIzNzE5ODU1LAorLTE2NzY3NzI1LAorMTU0MTA2NDcsCistMTgzMTc3OTQsCisxMDQ5NDYyNiwKKzE4MzE3Nzk0LAorLTkxMjgwNTYsCisxNDQ3NzQzOSwKKy0xNDYyNDIzMywKKzYyMDQzNTAsCisxNDYyNDIzMywKKy0zOTA0NTczLAorMTM3NTQxMjcsCistMTE3NjE0MTksCisyODc5MDMyLAorMTE3NjE0MTksCisxNDQwNTgsCisxNjc4MDA4MywKKy0yMzcyMjg0NCwKKzE2NzY5MDg0LAorMjM3MjI4NDQsCistMTY3NzE5NTEsCisxOTM0ODk0NywKKy0yMDM4NzczNSwKKzk0ODM2NjQsCisyMDM4NzczNSwKKy0xMjA1NTM5NSwKKzIxNDY3MDM4LAorLTE3NjM3ODU1LAorMzQ3NjY1NiwKKzE3NjM3ODU1LAorLTgxNjY0NzgsCisyMzM2OTMwMSwKKy0xNTE2ODE4MSwKKy0xOTE4MjUzLAorMTUxNjgxODEsCistNDY3MzgzMiwKKzE2Nzg1NjczLAorLTIzNzI0NTAxLAorMTY3NjU4MzksCisyMzcyNDUwMSwKKy0xNjc3NDI5NiwKKzI0ODY4NTQ3LAorLTIxNzUwOTQ1LAorNTg5MTkzNCwKKzIxNzUwOTQ1LAorLTEzOTgzMjY1LAorMzIzOTI1NDMsCistMTk5MTM4NDcsCistNDIzMDExMCwKKzE5OTEzODQ3LAorLTExMzg1MjE3LAorMzk5Mzg2NDEsCistMTgwNzEzNTMsCistMTQzODE4ODgsCisxODA3MTM1MywKKy04Nzc5NTM3LAorMTY3OTQyODgsCistMjM3MjU0MjEsCisxNjc1ODUyNSwKKzIzNzI1NDIxLAorLTE2Nzc1NTk2LAorMzM3MzkwMjUsCistMjI1ODg2MzYsCistMTc5Mzg3MCwKKzIyNTg4NjM2LAorLTE1MTY3OTQwLAorNTA3MjczNzEsCistMjE0NDg5MjYsCistMjAzOTQwMTAsCisyMTQ0ODkyNiwKKy0xMzU1NjE0NiwKKzY5MDgyMjE4LAorLTIwMjE3NTQwLAorLTQwNDkwMjk4LAorMjAyMTc1NDAsCistMTE4MTQ3MDMsCisxNjgwOTAwOCwKKy0yMzcyNTkzMSwKKzE2NzQ0NTI2LAorMjM3MjU5MzEsCistMTY3NzYzMTgsCis0OTA1MzU5NCwKKy0yMzA4MTY2NiwKKy0xNjQxMTE4OSwKKzIzMDgxNjY2LAorLTE1ODY1MTg5LAorODI4MjQyOTYsCistMjI0MDY5MDgsCistNTExMzYxNDMsCisyMjQwNjkwOCwKKy0xNDkxMDkzNywKKzEyMTA0OTkxNSwKKy0yMTY0MzEzOCwKKy05MDQ0MTg5NSwKKzIxNjQzMTM4LAorLTEzODMwODAzLAorMTY4MzUwOTksCistMjM3MjYyMTQsCisxNjcxODgzNSwKKzIzNzI2MjE0LAorLTE2Nzc2NzE4LAorNzYyNjE0NjgsCistMjMzNjQ1MDUsCistNDMyMTkwNjgsCisyMzM2NDUwNSwKKy0xNjI2NTE4NCwKKzE0MDA4MDYwMywKKy0yMjk3NjA1OSwKKy0xMDc1ODc1NDksCisyMjk3NjA1OSwKKy0xNTcxNTgzOCwKKzIxNDM0ODU1NywKKy0yMjUyNDAxNCwKKy0xODI0OTQ3OTEsCisyMjUyNDAxNCwKKy0xNTA3NjU1MCwKKzE1MDYwOTcxLAorMCwKKzE1MDYwOTE2LAorMCwKKy0xMzM0NDY3MSwKKzEzNzcxNSwKKzAsCisxMzcxODgsCiswLAorMTY1MDIzMTMsCis2MjQ5NCwKKzAsCis2MTk2NCwKKzAsCisxNjY1Mjc1NywKKzM1NDk5LAorMCwKKzM0OTY5LAorMCwKKzE2NzA2NzQ4LAorMTU3Nzk5MzksCiswLAorMTU3Nzk4MzcsCiswLAorLTE0NzgyNTYwLAorMjQ3MDU5LAorMCwKKzI0NTM1NiwKKzAsCisxNjI4NDgwMSwKKzExMjcyNiwKKzAsCisxMTEwMDksCiswLAorMTY1NTM0ODEsCis2NDI4MiwKKzAsCis2MjU2MCwKKzAsCisxNjY1MDM3NSwKKzE2MjA5MTI0LAorMCwKKzE2MjA4OTM0LAorMCwKKy0xNTY0MDg0MiwKKzQ0MTQ4MywKKzAsCis0MzYwMTAsCiswLAorMTU4OTk3MjMsCisyMDM0MDEsCiswLAorMTk3ODQ4LAorMCwKKzE2Mzc1OTY3LAorMTE2Nzk0LAorMCwKKzExMTIxMiwKKzAsCisxNjU0OTIxMSwKKzE2NDU3NDMzLAorMCwKKzE2NDU3MDg1LAorMCwKKy0xNjEzNzMwMiwKKzc4MzUxMCwKKzAsCis3NjYwODMsCiswLAorMTUyMjc2MjMsCiszNjcyMjksCiswLAorMzQ5MzQ5LAorMCwKKzE2MDYwNjM4LAorMjEzNDU3LAorMCwKKzE5NTQwOSwKKzAsCisxNjM2ODM0OSwKKzE2NTk4NTU2LAorMCwKKzE2NTk3OTIzLAorMCwKKy0xNjQxOTI2MywKKzEzNzQzMzIsCiswLAorMTMxOTcwNSwKKzAsCisxNDA4MzE3OSwKKzY2MzY4MywKKzAsCis2MDY1MzYsCiswLAorMTU1MDY5OTYsCiszOTQwNzcsCiswLAorMzM1OTc0LAorMCwKKzE2MDQ3MTY2LAorMTY2NzgwNTEsCiswLAorMTY2NzY5MDMsCiswLAorLTE2NTc3NzM4LAorMjM2NTAxMCwKKzAsCisyMTk4MTgzLAorMCwKKzEyMjE0MDIzLAorMTIwMTQ3OSwKKzAsCisxMDIxMTgzLAorMCwKKzE0NTU0NTU0LAorNzM5NjY2LAorMCwKKzU1NDAyNSwKKzAsCisxNTQ4MzUyNSwKKzE2NzIyNzg5LAorMCwKKzE2NzIwNzE0LAorMCwKKy0xNjY2NjI4NywKKzM5NTMyMTQsCiswLAorMzQ2NDI3NSwKKzAsCis5MzU5NzI4LAorMjE4MDgwNywKKzAsCisxNjI0MjkxLAorMCwKKzEyOTcyMTE4LAorMTQyMzkzNiwKKzAsCis4Mzg1NjQsCiswLAorMTQ1MTQ3MTYsCisxNjc0ODI4MiwKKzAsCisxNjc0NDUzNSwKKzAsCistMTY3MTU2MDEsCis2MzUzNzg2LAorMCwKKzUwMDM5MjYsCiswLAorNTQxOTUwNCwKKzM5NzMxMDgsCiswLAorMjMxNDk0NCwKKzAsCisxMDQ4OTE2NSwKKzI4Mzc1MTEsCiswLAorMTAzMjI4NCwKKzAsCisxMjkwNzQyMSwKKzE2NzYzNDk2LAorMCwKKzE2NzU2NzM1LAorMCwKKy0xNjc0MzAxNSwKKzk3NzU5NzgsCiswLAorNjMyNTYwMiwKKzAsCis2NzU2MzYsCis3MjY5OTU5LAorMCwKKzI1ODQ1NTgsCiswLAorNjkyMjY5OCwKKzU4Nzg1MjAsCiswLAorNTA3Mzg0LAorMCwKKzEwMzkxMzEzLAorMTY3NzM4MjYsCiswLAorMTY3NjE2MjksCiswLAorLTE2NzU4MjM5LAorMTQ1MjY0NjIsCiswLAorNjQyOTcyMywKKzAsCistNDE3ODk2OCwKKzEzMzUxMDg2LAorMCwKKzEwMjYxMTcsCiswLAorMjQwMDAxMiwKKzEyNTY2ODQ2LAorMCwKKy0yNTc5MzA2LAorMCwKKzY3ODk2NzYsCisxNjc4Mjk1MCwKKzAsCisxNjc2MDk1NCwKKzAsCistMTY3NjY2ODgsCisyMTM0Njk5NiwKKzAsCiszODE3MTAyLAorMCwKKy04Mzg2ODgxLAorMjQ1NDgyNTcsCiswLAorLTUyNjE4MjgsCiswLAorLTI1MDkyMTIsCisyNzEzNjc0NiwKKzAsCistMTI2MDI5MDgsCiswLAorMjI0MzM3OCwKKzE2Nzk0MTI5LAorMCwKKzE2NzU0NDYzLAorMCwKKy0xNjc3MTM3NiwKKzMxOTQyNzU2LAorMCwKKy0zNjI1MDExLAorMCwKKy0xMTU0MDUyOSwKKzQ1MDQ4NjczLAorMCwKKy0yMTI1NjQyMywKKzAsCistNzAxNTAzNCwKKzU3NjQ2MTQwLAorMCwKKy0zODIwMzgxNywKKzAsCistMjY2NTEwNywKKzE2ODExMzU4LAorMCwKKzE2NzM5ODM1LAorMCwKKy0xNjc3Mzk3NywKKzQ5Njc2NDE1LAorMCwKKy0xOTI0MzM0MiwKKzAsCistMTM2NTU4NTcsCis4MjMzOTk4NCwKKzAsCistNTUwMDU5MTUsCiswLAorLTEwNTU2ODUzLAorMTE4Mjg3NDk2LAorMCwKKy05NDM2Mzk5OSwKKzAsCistNzE0NjI4MSwKKzE2ODQwNzk5LAorMCwKKzE2NzExODM3LAorMCwKKy0xNjc3NTQxOSwKKzgwNjkxMzgzLAorMCwKKy00ODk0Mjk2MSwKKzAsCistMTQ5NzEyMDYsCisxNDk4NTg1MDUsCiswLAorLTEyMDA2NDUyNCwKKzAsCistMTMwMTY3NjUsCisyMzM1MjA2NTIsCiswLAorLTIwNjA5MDY5NSwKKzAsCistMTA2NTI3NDEsCisxNjg5Mjk4MSwKKzAsCisxNjY2MDQ1NSwKKzAsCistMTY3NzYyMjAsCisxMzYwMDA4NjgsCiswLAorLTEwMzQ3MjY5NiwKKzAsCistMTU3NTA5NTYsCisyNzE4MDE0NjksCiswLAorLTI0MDQ0MjI1MCwKKzAsCistMTQ1ODIwMDMsCis0NDYzMDk2MDEsCiswLAorLTQxNjQ1MjUyNCwKKzAsCistMTMwNzk4NjIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY1MGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcApAQCAtMCwwICsxLDEwOSBAQAorLyogL2FuZHJvaWQvc3JjL2ZyYW1ld29ya3MvYmFzZS9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb1NoZWx2aW5nRmlsdGVyLmNwcAorKioKKyoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiQXVkaW9TaGVsdmluZ0ZpbHRlci5oIgorI2luY2x1ZGUgIkF1ZGlvQ29tbW9uLmgiCisjaW5jbHVkZSAiRWZmZWN0c01hdGguaCIKKworI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQorI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyBGb3JtYXQgb2YgdGhlIGNvZWZmaWNpZW50IHRhYmxlczoKKy8vIGtDb2VmVGFibGVbZnJlcV1bZ2Fpbl1bY29lZl0KKy8vIGZyZXEgIC0gY3V0b2ZmIGZyZXF1ZW5jeSwgaW4gb2N0YXZlcyBiZWxvdyBOeXF1aXN0LGZyb20gLTEwIHRvIC02IGluIGxvdworLy8gICAgICAgICBzaGVsZiwgLTIgdG8gMCBpbiBoaWdoIHNoZWxmLgorLy8gZ2FpbiAgLSBnYWluLCBpbiBtaWxsaWJlbCwgc3RhcnRpbmcgYXQgLTk2MDAsIGp1bXBzIG9mIDEwMjQsIHRvIDQ3MzYgbWlsbGliZWwuCisvLyBjb2VmIC0gMDogYjAKKy8vICAgICAgICAxOiBiMQorLy8gICAgICAgIDI6IGIyCisvLyAgICAgICAgMzogLWExCisvLyAgICAgICAgNDogLWEyCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaUluRGltc1syXSA9IHszLCAxNX07CitzdGF0aWMgY29uc3QgYXVkaW9fY29lZl90IGtIaUNvZWZUYWJsZVszKjE1KjVdID0geworI2luY2x1ZGUgIkF1ZGlvSGlnaFNoZWxmRmlsdGVyQ29lZi5pbmwiCit9Oworc3RhdGljIGNvbnN0IHNpemVfdCBrTG9JbkRpbXNbMl0gPSB7NSwgMTV9Oworc3RhdGljIGNvbnN0IGF1ZGlvX2NvZWZfdCBrTG9Db2VmVGFibGVbNSoxNSo1XSA9IHsKKyNpbmNsdWRlICJBdWRpb0xvd1NoZWxmRmlsdGVyQ29lZi5pbmwiCit9OworCitBdWRpb0NvZWZJbnRlcnBvbGF0b3IgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6bUhpQ29lZkludGVycCgyLCBrSGlJbkRpbXMsIDUsIChjb25zdCBhdWRpb19jb2VmX3QqKSBrSGlDb2VmVGFibGUpOworQXVkaW9Db2VmSW50ZXJwb2xhdG9yIEF1ZGlvU2hlbHZpbmdGaWx0ZXI6Om1Mb0NvZWZJbnRlcnAoMiwga0xvSW5EaW1zLCA1LCAoY29uc3QgYXVkaW9fY29lZl90Kikga0xvQ29lZlRhYmxlKTsKKworQXVkaW9TaGVsdmluZ0ZpbHRlcjo6QXVkaW9TaGVsdmluZ0ZpbHRlcihTaGVsZlR5cGUgdHlwZSwgaW50IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUpCisgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgbUJpcXVhZChuQ2hhbm5lbHMsIHNhbXBsZVJhdGUpICB7CisgICAgY29uZmlndXJlKG5DaGFubmVscywgc2FtcGxlUmF0ZSk7Cit9CisKK3ZvaWQgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6Y29uZmlndXJlKGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKSB7CisgICAgbU5pcXVpc3RGcmVxID0gc2FtcGxlUmF0ZSAqIDUwMDsKKyAgICBtRnJlcXVlbmN5RmFjdG9yID0gKCgxdWxsKSA8PCA0MikgLyBtTmlxdWlzdEZyZXE7CisgICAgbUJpcXVhZC5jb25maWd1cmUobkNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKKyAgICBzZXRGcmVxdWVuY3kobU5vbWluYWxGcmVxdWVuY3kpOworICAgIGNvbW1pdCh0cnVlKTsKK30KKwordm9pZCBBdWRpb1NoZWx2aW5nRmlsdGVyOjpyZXNldCgpIHsKKyAgICBzZXRHYWluKDApOworICAgIHNldEZyZXF1ZW5jeShtVHlwZSA9PSBrTG93U2hlbGYgPyAwIDogbU5pcXVpc3RGcmVxKTsKKyAgICBjb21taXQodHJ1ZSk7Cit9CisKK3ZvaWQgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6c2V0RnJlcXVlbmN5KHVpbnQzMl90IG1pbGxpaGVydHopIHsKKyAgICBtTm9taW5hbEZyZXF1ZW5jeSA9IG1pbGxpaGVydHo7CisgICAgaWYgKFVOTElLRUxZKG1pbGxpaGVydHogPiBtTmlxdWlzdEZyZXEgLyAyKSkgeworICAgICAgICBtaWxsaWhlcnR6ID0gbU5pcXVpc3RGcmVxIC8gMjsKKyAgICB9CisgICAgdWludDMyX3Qgbm9ybUZyZXEgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG1pbGxpaGVydHopICogbUZyZXF1ZW5jeUZhY3RvcikgPj4gMTApOworICAgIHVpbnQzMl90IGxvZzJtaW5GcmVxID0gKG1UeXBlID09IGtMb3dTaGVsZiA/ICgzMi0xMCkgOiAoMzItMikpOworICAgIGlmIChMSUtFTFkobm9ybUZyZXEgPiAoMVUgPDwgbG9nMm1pbkZyZXEpKSkgeworICAgICAgICBtRnJlcXVlbmN5ID0gKEVmZmVjdHNfbG9nMihub3JtRnJlcSkgLSAobG9nMm1pbkZyZXEgPDwgMTUpKSA8PCAoRlJFUV9QUkVDSVNJT05fQklUUyAtIDE1KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRnJlcXVlbmN5ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6c2V0R2FpbihpbnQzMl90IG1pbGxpYmVsKSB7CisgICAgbUdhaW4gPSBtaWxsaWJlbCArIDk2MDA7Cit9CisKK3ZvaWQgQXVkaW9TaGVsdmluZ0ZpbHRlcjo6Y29tbWl0KGJvb2wgaW1tZWRpYXRlKSB7CisgICAgYXVkaW9fY29lZl90IGNvZWZzWzVdOworICAgIGludCBpbnRDb29yZFsyXSA9IHsKKyAgICAgICAgbUZyZXF1ZW5jeSA+PiBGUkVRX1BSRUNJU0lPTl9CSVRTLAorICAgICAgICBtR2FpbiA+PiBHQUlOX1BSRUNJU0lPTl9CSVRTCisgICAgfTsKKyAgICB1aW50MzJfdCBmcmFjQ29vcmRbMl0gPSB7CisgICAgICAgIG1GcmVxdWVuY3kgPDwgKDMyIC0gRlJFUV9QUkVDSVNJT05fQklUUyksCisgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihtR2FpbikgPDwgKDMyIC0gR0FJTl9QUkVDSVNJT05fQklUUykKKyAgICB9OworICAgIGlmIChtVHlwZSA9PSBrSGlnaFNoZWxmKSB7CisgICAgICAgIG1IaUNvZWZJbnRlcnAuZ2V0Q29lZihpbnRDb29yZCwgZnJhY0Nvb3JkLCBjb2Vmcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxvQ29lZkludGVycC5nZXRDb2VmKGludENvb3JkLCBmcmFjQ29vcmQsIGNvZWZzKTsKKyAgICB9CisgICAgbUJpcXVhZC5zZXRDb2Vmcyhjb2VmcywgaW1tZWRpYXRlKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0F1ZGlvU2hlbHZpbmdGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJkNzkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9BdWRpb1NoZWx2aW5nRmlsdGVyLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8qIC9hbmRyb2lkL3NyYy9mcmFtZXdvcmtzL2Jhc2UvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9TaGVsdmluZ0ZpbHRlci5oCisqKgorKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQVVESU9fU0hFTFZJTkdfRklMVEVSX0gKKyNkZWZpbmUgQVVESU9fU0hFTFZJTkdfRklMVEVSX0gKKworI2luY2x1ZGUgIkF1ZGlvQmlxdWFkRmlsdGVyLmgiCisjaW5jbHVkZSAiQXVkaW9Db2VmSW50ZXJwb2xhdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQSBzaGVsdmluZyBhdWRpbyBmaWx0ZXIsIHdpdGggdW5pdHkgc2tpcnQgZ2FpbiwgYW5kIGNvbnRyb2xsYWJsZSBjdXRvZmYKKy8vIGZyZXF1ZW5jeSBhbmQgZ2Fpbi4KKy8vIFRoaXMgZmlsdGVyIGlzIGFibGUgdG8gc3VwcHJlc3MgaW50cm9kdWNlIGRpc2NvbnRpbnVpdGllcyBhbmQgb3RoZXIgYXJ0aWZhY3RzCisvLyBpbiB0aGUgb3V0cHV0LCBldmVuIHdoZW4gY2hhbmdpbmcgcGFyYW1ldGVycyBhYnJ1cHRseS4KKy8vIFBhcmFtZXRlcnMgY2FuIGJlIHNldCB0byBhbnkgdmFsdWUgLSB0aGlzIGNsYXNzIHdpbGwgbWFrZSBzdXJlIHRvIGNsaXAgdGhlbQorLy8gd2hlbiB0aGV5IGFyZSBvdXQgb2Ygc3VwcG9ydGVkIHJhbmdlLgorLy8KKy8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgorLy8gVGhpcyBjbGFzcyB1c2VzIGFuIHVuZGVybHlpbmcgYmlxdWFkIGZpbHRlciB3aG9zZSBwYXJhbWV0ZXJzIGFyZSBkZXRlcm1pbmVkCisvLyB1c2luZyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZyb20gYSBjb2VmZmljaWVudCB0YWJsZSwgdXNpbmcgYQorLy8gQXVkaW9Db2VmSW50ZXJwb2xhdG9yLgorLy8gQWxsIGlzIGxlZnQgZm9yIHRoaXMgY2xhc3MgdG8gZG8gaXMgbWFwcGluZyBiZXR3ZWVuIGhpZ2gtbGV2ZWwgcGFyYW1ldGVycyB0bworLy8gZnJhY3Rpb25hbCBpbmRpY2VzIGludG8gdGhlIGNvZWZmaWNpZW50IHRhYmxlLgorY2xhc3MgQXVkaW9TaGVsdmluZ0ZpbHRlciB7CitwdWJsaWM6CisgICAgLy8gU2hlbGYgdHlwZQorICAgIGVudW0gU2hlbGZUeXBlIHsKKyAgICAgICAga0xvd1NoZWxmLAorICAgICAgICBrSGlnaFNoZWxmCisgICAgfTsKKworICAgIC8vIENvbnN0cnVjdG9yLiBSZXNldHMgdGhlIGZpbHRlciAoc2VlIHJlc2V0KCkpLgorICAgIC8vIHR5cGUgICAgICAgVHlwZSBvZiB0aGUgZmlsdGVyIChoaWdoIHNoZWxmIG9yIGxvdyBzaGVsZikuCisgICAgLy8gbkNoYW5uZWxzICBOdW1iZXIgb2YgaW5wdXQvb3V0cHV0IGNoYW5uZWxzIChpbnRlcmxhY2VkKS4KKyAgICAvLyBzYW1wbGVSYXRlIFRoZSBpbnB1dC9vdXRwdXQgc2FtcGxlIHJhdGUsIGluIEh6LgorICAgIEF1ZGlvU2hlbHZpbmdGaWx0ZXIoU2hlbGZUeXBlIHR5cGUsIGludCBuQ2hhbm5lbHMsIGludCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFJlY29uZmlndXJhdGlvbiBvZiB0aGUgZmlsdGVyLiBDaGFuZ2VzIGlucHV0L291dHB1dCBmb3JtYXQsIGJ1dCBkb2VzIG5vdAorICAgIC8vIGFsdGVyIGN1cnJlbnQgcGFyYW1ldGVyIHZhbHVlcy4gQ2xlYXJzIGRlbGF5IGxpbmVzLgorICAgIC8vIG5DaGFubmVscyAgTnVtYmVyIG9mIGlucHV0L291dHB1dCBjaGFubmVscyAoaW50ZXJsYWNlZCkuCisgICAgLy8gc2FtcGxlUmF0ZSBUaGUgaW5wdXQvb3V0cHV0IHNhbXBsZSByYXRlLCBpbiBIei4KKyAgICB2b2lkIGNvbmZpZ3VyZShpbnQgbkNoYW5uZWxzLCBpbnQgc2FtcGxlUmF0ZSk7CisKKyAgICAvLyBSZXNldHMgdGhlIGZpbHRlciBwYXJhbWV0ZXJzIHRvIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgIC8vIGZyZXF1ZW5jeTogMAorICAgIC8vIGdhaW46IDAKKyAgICAvLyBJdCBhbHNvIGRpc2FibGVzIHRoZSBmaWx0ZXIuIERvZXMgbm90IGNsZWFyIHRoZSBkZWxheSBsaW5lcy4KKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBDbGVhcnMgZGVsYXkgbGluZXMuIERvZXMgbm90IGFsdGVyIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgdm9pZCBjbGVhcigpIHsgbUJpcXVhZC5jbGVhcigpOyB9CisKKyAgICAvLyBTZXRzIGdhaW4gdmFsdWUuIEFjdHVhbCBjaGFuZ2Ugd2lsbCBvbmx5IHRha2UgcGxhY2UgdXBvbiBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBtaWxsaWJlbCBHYWluIHZhbHVlIGluIG1pbGxpYmVsICgxLzEwMCBvZiBkZWNpYmVsKS4KKyAgICB2b2lkIHNldEdhaW4oaW50MzJfdCBtaWxsaWJlbCk7CisKKyAgICAvLyBHZXRzIHRoZSBnYWluLCBpbiBtaWxsaWJlbCwgYXMgc2V0LgorICAgIGludDMyX3QgZ2V0R2FpbigpIGNvbnN0IHsgcmV0dXJuIG1HYWluIC0gOTYwMDsgfQorCisgICAgLy8gU2V0cyBjdXRvZmYgZnJlcXVlbmN5IHZhbHVlLiBBY3R1YWwgY2hhbmdlIHdpbGwgb25seSB0YWtlIHBsYWNlIHVwb24KKyAgICAvLyBjb21taXQoKS4KKyAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgcmVtZW1iZXJlZCBldmVuIGlmIHRoZSBmaWx0ZXIgaXMgaW4gZGlzYWJsZWQoKSBzdGF0ZS4KKyAgICAvLyBtaWxsaWhlcnR6IEZyZXF1ZW5jeSB2YWx1ZSBpbiBtSHouCisgICAgdm9pZCBzZXRGcmVxdWVuY3kodWludDMyX3QgbWlsbGloZXJ0eik7CisKKyAgICAvLyBHZXRzIHRoZSBmcmVxdWVuY3ksIGluIG1IeiwgYXMgc2V0LgorICAgIHVpbnQzMl90IGdldEZyZXF1ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIG1Ob21pbmFsRnJlcXVlbmN5OyB9CisKKyAgICAvLyBBcHBsaWVzIGFsbCBwYXJhbWV0ZXIgY2hhbmdlcyBkb25lIHRvIHRoaXMgcG9pbnQgaW4gdGltZS4KKyAgICAvLyBJZiB0aGUgZmlsdGVyIGlzIGRpc2FibGVkLCB0aGUgbmV3IHBhcmFtZXRlcnMgd2lsbCB0YWtlIHBsYWNlIHdoZW4gaXQgaXMKKyAgICAvLyBlbmFibGVkIGFnYWluLiBEb2VzIG5vdCBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MgaW1tZWRpYXRlIGlzIHNldC4KKyAgICAvLyBpbW1lZGlhdGUgICAgV2hldGhlciB0byBhcHBseSBjaGFuZ2UgYWJydXB0bHkgKGlnbm9yZWQgaWYgZmlsdGVyIGlzCisgICAgLy8gZGlzYWJsZWQpLgorICAgdm9pZCBjb21taXQoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSk7CisKKyAgICAvLyBQcm9jZXNzIGEgYnVmZmVyIG9mIGlucHV0IGRhdGEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHNob3VsZCBjb250YWluCisgICAgLy8gZnJhbWVDb3VudCAqIG5DaGFubmVscyBpbnRlcmxhY2VkIHNhbXBsZXMuIFByb2Nlc3NpbmcgY2FuIGJlIGRvbmUKKyAgICAvLyBpbi1wbGFjZSwgYnkgcGFzc2luZyB0aGUgc2FtZSBidWZmZXIgYXMgYm90aCBhcmd1bWVudHMuCisgICAgLy8gaW4gICBJbnB1dCBidWZmZXIuCisgICAgLy8gb3V0ICBPdXRwdXQgYnVmZmVyLgorICAgLy8gZnJhbWVDb3VudCAgIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvZHVjZS4KKyAgIHZvaWQgcHJvY2Vzcyhjb25zdCBhdWRpb19zYW1wbGVfdCBpbltdLCBhdWRpb19zYW1wbGVfdCBvdXRbXSwKKyAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQpIHsgbUJpcXVhZC5wcm9jZXNzKGluLCBvdXQsIGZyYW1lQ291bnQpOyB9CisKKyAgICAvLyBFbmFibGVzIHRoZSBmaWx0ZXIsIHNvIGl0IHdvdWxkIHN0YXJ0IHByb2Nlc3NpbmcgaW5wdXQuIERvZXMgbm90CisgICAgLy8gaW50cm9kdWNlIGFydGlmYWN0cywgdW5sZXNzIGltbWVkaWF0ZSBpcyBzZXQuCisgICAgLy8gaW1tZWRpYXRlICAgIFdoZXRoZXIgdG8gYXBwbHkgY2hhbmdlIGFicnVwdGx5LgorICAgIHZvaWQgZW5hYmxlKGJvb2wgaW1tZWRpYXRlID0gZmFsc2UpIHsgbUJpcXVhZC5lbmFibGUoaW1tZWRpYXRlKTsgfQorCisgICAgLy8gRGlzYWJsZWQgKGJ5cGFzc2VzKSB0aGUgZmlsdGVyLiBEb2VzIG5vdCBpbnRyb2R1Y2UgYXJ0aWZhY3RzLCB1bmxlc3MKKyAgICAvLyBpbW1lZGlhdGUgaXMgc2V0LgorICAgIC8vIGltbWVkaWF0ZSAgICBXaGV0aGVyIHRvIGFwcGx5IGNoYW5nZSBhYnJ1cHRseS4KKyAgICB2b2lkIGRpc2FibGUoYm9vbCBpbW1lZGlhdGUgPSBmYWxzZSkgeyBtQmlxdWFkLmRpc2FibGUoaW1tZWRpYXRlKTsgfQorCitwcml2YXRlOgorICAgIC8vIFByZWNpc2lvbiBmb3IgdGhlIG1GcmVxdWVuY3kgbWVtYmVyLgorICAgIHN0YXRpYyBjb25zdCBpbnQgRlJFUV9QUkVDSVNJT05fQklUUyA9IDI2OworICAgIC8vIFByZWNpc2lvbiBmb3IgdGhlIG1HYWluIG1lbWJlci4KKyAgICBzdGF0aWMgY29uc3QgaW50IEdBSU5fUFJFQ0lTSU9OX0JJVFMgPSAxMDsKKworICAgIC8vIFNoZWxmIHR5cGUuCisgICAgU2hlbGZUeXBlIG1UeXBlOworICAgIC8vIE55cXVpc3QsIGluIG1Iei4KKyAgICB1aW50MzJfdCBtTmlxdWlzdEZyZXE7CisgICAgLy8gRnJhY3Rpb25hbCBpbmRleCBpbnRvIHRoZSBnYWluIGRpbWVuc2lvbiBvZiB0aGUgY29lZiB0YWJsZSBpbgorICAgIC8vIEdBSU5fUFJFQ0lTSU9OX0JJVFMgcHJlY2lzaW9uLgorICAgIGludDMyX3QgbUdhaW47CisgICAgLy8gRnJhY3Rpb25hbCBpbmRleCBpbnRvIHRoZSBmcmVxdWVuY3kgZGltZW5zaW9uIG9mIHRoZSBjb2VmIHRhYmxlIGluCisgICAgLy8gRlJFUV9QUkVDSVNJT05fQklUUyBwcmVjaXNpb24uCisgICAgdWludDMyX3QgbUZyZXF1ZW5jeTsKKyAgICAvLyBOb21pbmFsIHZhbHVlIG9mIGZyZXF1ZW5jeSwgYXMgc2V0LgorICAgIHVpbnQzMl90IG1Ob21pbmFsRnJlcXVlbmN5OworICAgLy8gMS9OeXF1aXN0W21Iel0sIGluIDQyLWJpdCBwcmVjaXNpb24gKHZlcnkgc21hbGwpLgorICAgIC8vIFVzZWQgZm9yIHNjYWxpbmcgdGhlIGZyZXF1ZW5jeS4KKyAgICB1aW50MzJfdCBtRnJlcXVlbmN5RmFjdG9yOworCisgICAgLy8gQSBiaXF1YWQgZmlsdGVyLCB1c2VkIGZvciB0aGUgYWN0dWFsIHByb2Nlc3NpbmcuCisgICAgQXVkaW9CaXF1YWRGaWx0ZXIgbUJpcXVhZDsKKyAgICAvLyBBIGNvZWZmaWNpZW50IGludGVycG9sYXRvciwgdXNlZCBmb3IgbWFwcGluZyB0aGUgaGlnaCBsZXZlbCBwYXJhbWV0ZXJzIHRvCisgICAgLy8gdGhlIGxvdy1sZXZlbCBiaXF1YWQgY29lZmZpY2llbnRzLiBUaGlzIG9uZSBpcyB1c2VkIGZvciB0aGUgaGlnaCBzaGVsZi4KKyAgICBzdGF0aWMgQXVkaW9Db2VmSW50ZXJwb2xhdG9yIG1IaUNvZWZJbnRlcnA7CisgICAgLy8gQSBjb2VmZmljaWVudCBpbnRlcnBvbGF0b3IsIHVzZWQgZm9yIG1hcHBpbmcgdGhlIGhpZ2ggbGV2ZWwgcGFyYW1ldGVycyB0bworICAgIC8vIHRoZSBsb3ctbGV2ZWwgYmlxdWFkIGNvZWZmaWNpZW50cy4gVGhpcyBvbmUgaXMgdXNlZCBmb3IgdGhlIGxvdyBzaGVsZi4KKyAgICBzdGF0aWMgQXVkaW9Db2VmSW50ZXJwb2xhdG9yIG1Mb0NvZWZJbnRlcnA7Cit9OworCit9CisKKworI2VuZGlmIC8vIEFVRElPX1NIRUxWSU5HX0ZJTFRFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdEVxdWFsaXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlNDM1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRXF1YWxpemVyIgorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mIGFycmF5IC8gc2l6ZW9mIGFycmF5WzBdKQorLy8KKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlICJBdWRpb0VxdWFsaXplci5oIgorI2luY2x1ZGUgIkF1ZGlvQmlxdWFkRmlsdGVyLmgiCisjaW5jbHVkZSAiQXVkaW9Gb3JtYXRBZGFwdGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0RXF1YWxpemVyQXBpLmg+CisKKy8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVxdWFsaXplciBlZmZlY3QKK2V4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnRXF1YWxpemVySW50ZXJmYWNlOworCitlbnVtIGVxdWFsaXplcl9zdGF0ZV9lIHsKKyAgICBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQsCisgICAgRVFVQUxJWkVSX1NUQVRFX0FDVElWRSwKK307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB7CisKKy8vIEdvb2dsZSBHcmFwaGljIEVxdWFsaXplciBVVUlEOiBlMjVhYTg0MC01NDNiLTExZGYtOThhNS0wMDAyYTVkNWM1MWIKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0VxdWFsaXplckRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB0eXBlCisgICAgICAgIHsweGUyNWFhODQwLCAweDU0M2IsIDB4MTFkZiwgMHg5OGE1LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QpLAorICAgICAgICAwLCAvLyBUT0RPCisgICAgICAgIDEsCisgICAgICAgICJHcmFwaGljIEVxdWFsaXplciIsCisgICAgICAgICJHb29nbGUgSW5jLiIsCit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vIEJFR0lOIEVRIFBSRVNFVFMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworY29uc3QgaW50IGtOdW1CYW5kcyA9IDU7Citjb25zdCB1aW50MzJfdCBnRnJlcXNba051bUJhbmRzXSA9ICAgICAgeyA1MDAwMCwgMTI1MDAwLCA5MDAwMDAsIDMyMDAwMDAsIDYzMDAwMDAgfTsKK2NvbnN0IHVpbnQzMl90IGdCYW5kd2lkdGhzW2tOdW1CYW5kc10gPSB7IDAsICAgICAzNjAwLCAgIDM2MDAsICAgMjQwMCwgICAgMCAgICAgICB9OworCitjb25zdCBBdWRpb0VxdWFsaXplcjo6QmFuZENvbmZpZyBnQmFuZHNDbGFzc2ljW2tOdW1CYW5kc10gPSB7CisgICAgeyAzMDAsICBnRnJlcXNbMF0sIGdCYW5kd2lkdGhzWzBdIH0sCisgICAgeyA0MDAsICBnRnJlcXNbMV0sIGdCYW5kd2lkdGhzWzFdIH0sCisgICAgeyAwLCAgICBnRnJlcXNbMl0sIGdCYW5kd2lkdGhzWzJdIH0sCisgICAgeyAyMDAsICBnRnJlcXNbM10sIGdCYW5kd2lkdGhzWzNdIH0sCisgICAgeyAtMzAwLCBnRnJlcXNbNF0sIGdCYW5kd2lkdGhzWzRdIH0KK307CisKK2NvbnN0IEF1ZGlvRXF1YWxpemVyOjpCYW5kQ29uZmlnIGdCYW5kc0phenpba051bUJhbmRzXSA9IHsKKyAgICB7IC02MDAsIGdGcmVxc1swXSwgZ0JhbmR3aWR0aHNbMF0gfSwKKyAgICB7IDIwMCwgIGdGcmVxc1sxXSwgZ0JhbmR3aWR0aHNbMV0gfSwKKyAgICB7IDQwMCwgIGdGcmVxc1syXSwgZ0JhbmR3aWR0aHNbMl0gfSwKKyAgICB7IC00MDAsIGdGcmVxc1szXSwgZ0JhbmR3aWR0aHNbM10gfSwKKyAgICB7IC02MDAsIGdGcmVxc1s0XSwgZ0JhbmR3aWR0aHNbNF0gfQorfTsKKworY29uc3QgQXVkaW9FcXVhbGl6ZXI6OkJhbmRDb25maWcgZ0JhbmRzUG9wW2tOdW1CYW5kc10gPSB7CisgICAgeyA0MDAsICBnRnJlcXNbMF0sIGdCYW5kd2lkdGhzWzBdIH0sCisgICAgeyAtNDAwLCBnRnJlcXNbMV0sIGdCYW5kd2lkdGhzWzFdIH0sCisgICAgeyAzMDAsICBnRnJlcXNbMl0sIGdCYW5kd2lkdGhzWzJdIH0sCisgICAgeyAtNDAwLCBnRnJlcXNbM10sIGdCYW5kd2lkdGhzWzNdIH0sCisgICAgeyA2MDAsICBnRnJlcXNbNF0sIGdCYW5kd2lkdGhzWzRdIH0KK307CisKK2NvbnN0IEF1ZGlvRXF1YWxpemVyOjpCYW5kQ29uZmlnIGdCYW5kc1JvY2tba051bUJhbmRzXSA9IHsKKyAgICB7IDcwMCwgIGdGcmVxc1swXSwgZ0JhbmR3aWR0aHNbMF0gfSwKKyAgICB7IDQwMCwgIGdGcmVxc1sxXSwgZ0JhbmR3aWR0aHNbMV0gfSwKKyAgICB7IC00MDAsIGdGcmVxc1syXSwgZ0JhbmR3aWR0aHNbMl0gfSwKKyAgICB7IDQwMCwgIGdGcmVxc1szXSwgZ0JhbmR3aWR0aHNbM10gfSwKKyAgICB7IDIwMCwgIGdGcmVxc1s0XSwgZ0JhbmR3aWR0aHNbNF0gfQorfTsKKworY29uc3QgQXVkaW9FcXVhbGl6ZXI6OlByZXNldENvbmZpZyBnRXF1YWxpemVyUHJlc2V0c1tdID0geworICAgIHsgIkNsYXNzaWMiLCBnQmFuZHNDbGFzc2ljIH0sCisgICAgeyAiSmF6eiIsICAgIGdCYW5kc0phenogICAgfSwKKyAgICB7ICJQb3AiLCAgICAgZ0JhbmRzUG9wICAgICB9LAorICAgIHsgIlJvY2siLCAgICBnQmFuZHNSb2NrICAgIH0KK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8gRU5EIEVRIFBSRVNFVFMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0J1ZmZlclNpemUgPSAzMjsKKwordHlwZWRlZiBBdWRpb0Zvcm1hdEFkYXB0ZXI8QXVkaW9FcXVhbGl6ZXIsIGtCdWZmZXJTaXplPiBGb3JtYXRBZGFwdGVyOworCitzdHJ1Y3QgRXF1YWxpemVyQ29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICAgIEZvcm1hdEFkYXB0ZXIgYWRhcHRlcjsKKyAgICBBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXI7CisgICAgdWludDMyX3Qgc3RhdGU7Cit9OworCisvLy0tLSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCisKK2ludCBFcXVhbGl6ZXJfaW5pdChFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCk7CitpbnQgRXF1YWxpemVyX2NvbmZpZ3VyZShFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCBzaXplX3QgKnBWYWx1ZVNpemUsIHZvaWQgKnBWYWx1ZSk7CitpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihBdWRpb0VxdWFsaXplciAqIHBFcXVhbGl6ZXIsIGludDMyX3QgKnBQYXJhbSwgdm9pZCAqcFZhbHVlKTsKKworCisvLworLy8tLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCisvLworCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgKnBOdW1FZmZlY3RzID0gMTsKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyAqLworCitleHRlcm4gIkMiIGludCBFZmZlY3RRdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKGluZGV4ID4gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ0VxdWFsaXplckRlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBFZmZlY3RRdWVyeU5leHQgKi8KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgIGVmZmVjdF9pbnRlcmZhY2VfdCAqcEludGVyZmFjZSkgeworICAgIGludCByZXQ7CisgICAgaW50IGk7CisKKyAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3Qgc3RhcnQiKTsKKworICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChtZW1jbXAodXVpZCwgJmdFcXVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgIT0gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCA9IG5ldyBFcXVhbGl6ZXJDb250ZXh0OworCisgICAgcENvbnRleHQtPml0ZmUgPSAmZ0VxdWFsaXplckludGVyZmFjZTsKKyAgICBwQ29udGV4dC0+cEVxdWFsaXplciA9IE5VTEw7CisgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQ7CisKKyAgICByZXQgPSBFcXVhbGl6ZXJfaW5pdChwQ29udGV4dCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HVygiRWZmZWN0TGliQ3JlYXRlRWZmZWN0KCkgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgZGVsZXRlIHBDb250ZXh0OworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CisKKyAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAsIHNpemUgJWQiLCBwQ29udGV4dCwgQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShrTnVtQmFuZHMpK3NpemVvZihFcXVhbGl6ZXJDb250ZXh0KSk7CisKKyAgICByZXR1cm4gMDsKKworfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSkgeworICAgIEVxdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChFcXVhbGl6ZXJDb250ZXh0ICopaW50ZXJmYWNlOworCisgICAgTE9HVigiRWZmZWN0TGliUmVsZWFzZUVmZmVjdCAlcCIsIGludGVyZmFjZSk7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQ7CisgICAgcENvbnRleHQtPnBFcXVhbGl6ZXItPmZyZWUoKTsKKyAgICBkZWxldGUgcENvbnRleHQ7CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIEVmZmVjdFJlbGVhc2UgKi8KKworCisvLworLy8tLS0gbG9jYWwgZnVuY3Rpb25zCisvLworCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9HVigiSW52YWxpZCBhcmd1bWVudDogIiNjb25kKTsgICAgICBcCisgICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJfY29uZmlndXJlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLyAgcENvbmZpZzogICAgcG9pbnRlciB0byBlZmZlY3RfY29uZmlnX3Qgc3RydWN0dXJlIGhvbGRpbmcgaW5wdXQgYW5kIG91dHB1dAorLy8gICAgICBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRXF1YWxpemVyX2NvbmZpZ3VyZShFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKQoreworICAgIExPR1YoIkVxdWFsaXplcl9jb25maWd1cmUgc3RhcnQiKTsKKworICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKKyAgICBDSEVDS19BUkcocENvbmZpZyAhPSBOVUxMKTsKKworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyAgICBDSEVDS19BUkcoKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfTU9OTykgfHwgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IENIQU5ORUxfU1RFUkVPKSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCisgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gU0FNUExFX0ZPUk1BVF9QQ01fUzdfMjQKKyAgICAgICAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IFNBTVBMRV9GT1JNQVRfUENNX1MxNSk7CisKKyAgICBpbnQgY2hhbm5lbENvdW50OworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX01PTk8pIHsKKyAgICAgICAgY2hhbm5lbENvdW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFubmVsQ291bnQgPSAyOworICAgIH0KKyAgICBDSEVDS19BUkcoY2hhbm5lbENvdW50IDw9IEF1ZGlvQmlxdWFkRmlsdGVyOjpNQVhfQ0hBTk5FTFMpOworCisgICAgbWVtY3B5KCZwQ29udGV4dC0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisKKyAgICBwQ29udGV4dC0+cEVxdWFsaXplci0+Y29uZmlndXJlKGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKKworICAgIHBDb250ZXh0LT5hZGFwdGVyLmNvbmZpZ3VyZSgqcENvbnRleHQtPnBFcXVhbGl6ZXIsIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlKTsKKworICAgIHJldHVybiAwOworfSAgIC8vIGVuZCBFcXVhbGl6ZXJfY29uZmlndXJlCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFcXVhbGl6ZXJfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uIGFuZCBjcmVhdGVzCisvLyAgICAgQXVkaW9FcXVhbGl6ZXIgaW5zdGFuY2UuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBFcXVhbGl6ZXJfaW5pdChFcXVhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgTE9HVigiRXF1YWxpemVyX2luaXQgc3RhcnQiKTsKKworICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKKworICAgIGlmIChwQ29udGV4dC0+cEVxdWFsaXplciAhPSBOVUxMKSB7CisgICAgICAgIHBDb250ZXh0LT5wRXF1YWxpemVyLT5mcmVlKCk7CisgICAgfQorCisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgIHBDb250ZXh0LT5wRXF1YWxpemVyID0gQXVkaW9FcXVhbGl6ZXI6OkNyZWF0ZUluc3RhbmNlKAorICAgICAgICBOVUxMLAorICAgICAgICBrTnVtQmFuZHMsCisgICAgICAgIEF1ZGlvQmlxdWFkRmlsdGVyOjpNQVhfQ0hBTk5FTFMsCisgICAgICAgIDQ0MTAwLAorICAgICAgICBnRXF1YWxpemVyUHJlc2V0cywKKyAgICAgICAgQVJSQVlfU0laRShnRXF1YWxpemVyUHJlc2V0cykpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQmFuZHM7ICsraSkgeworICAgICAgICBwQ29udGV4dC0+cEVxdWFsaXplci0+c2V0RnJlcXVlbmN5KGksIGdGcmVxc1tpXSk7CisgICAgICAgIHBDb250ZXh0LT5wRXF1YWxpemVyLT5zZXRCYW5kd2lkdGgoaSwgZ0JhbmR3aWR0aHNbaV0pOworICAgIH0KKworICAgIHBDb250ZXh0LT5wRXF1YWxpemVyLT5lbmFibGUodHJ1ZSk7CisKKyAgICBFcXVhbGl6ZXJfY29uZmlndXJlKHBDb250ZXh0LCAmcENvbnRleHQtPmNvbmZpZyk7CisKKyAgICByZXR1cm4gMDsKK30gICAvLyBlbmQgRXF1YWxpemVyX2luaXQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gR2V0IGEgRXF1YWxpemVyIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwRXF1YWxpemVyICAgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQorLy8gIHBWYWx1ZVNpemUgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorLy8KKy8vIE91dHB1dHM6CisvLyAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisvLyAgKnBWYWx1ZVNpemUgdXBkYXRlZCB3aXRoIGFjdHVhbCB2YWx1ZSBzaXplCisvLworLy8KKy8vIFNpZGUgRWZmZWN0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoQXVkaW9FcXVhbGl6ZXIgKiBwRXF1YWxpemVyLCBpbnQzMl90ICpwUGFyYW0sIHNpemVfdCAqcFZhbHVlU2l6ZSwgdm9pZCAqcFZhbHVlKQoreworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludDMyX3QgcGFyYW0gPSAqcFBhcmFtKys7CisgICAgaW50MzJfdCBwYXJhbTI7CisgICAgY2hhciAqbmFtZTsKKworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEVRX1BBUkFNX05VTV9CQU5EUzoKKyAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgY2FzZSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFM6CisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgorICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9MRVZFTF9SQU5HRToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOgorICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IDIgKiBzaXplb2YoaW50MzJfdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUToKKyAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRToKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8ICgyICsga051bUJhbmRzKSAqIHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICpwVmFsdWVTaXplID0gKDIgKyBrTnVtQmFuZHMpICogc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBFUV9QQVJBTV9OVU1fQkFORFM6CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3Qpa051bUJhbmRzOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fTlVNX0JBTkRTICVkIiwgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0xFVkVMX1JBTkdFOgorICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAtOTYwMDsKKyAgICAgICAgKigoaW50MTZfdCAqKXBWYWx1ZSArIDEpID0gNDgwMDsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwgKihpbnQzMl90ICopcFZhbHVlLCAqKChpbnQzMl90ICopcFZhbHVlICsgMSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQkFORF9MRVZFTDoKKyAgICAgICAgcGFyYW0yID0gKnBQYXJhbTsKKyAgICAgICAgaWYgKHBhcmFtMiA+PSBrTnVtQmFuZHMpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAoaW50MTZfdClwRXF1YWxpemVyLT5nZXRHYWluKHBhcmFtMik7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwgcGFyYW0yLCAqKGludDMyX3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fQ0VOVEVSX0ZSRVE6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgIGlmIChwYXJhbTIgPj0ga051bUJhbmRzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gcEVxdWFsaXplci0+Z2V0RnJlcXVlbmN5KHBhcmFtMik7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0U6CisgICAgICAgIHBhcmFtMiA9ICpwUGFyYW07CisgICAgICAgIGlmIChwYXJhbTIgPj0ga051bUJhbmRzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcEVxdWFsaXplci0+Z2V0QmFuZFJhbmdlKHBhcmFtMiwgKih1aW50MzJfdCAqKXBWYWx1ZSwgKigodWludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgYmFuZCAlZCwgbWluICVkLCBtYXggJWQiLCBwYXJhbTIsICooaW50MzJfdCAqKXBWYWx1ZSwgKigoaW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9CQU5EOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtOworICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KXBFcXVhbGl6ZXItPmdldE1vc3RSZWxldmFudEJhbmQocGFyYW0yKTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAlZCIsIHBhcmFtMiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6CisgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAodWludDE2X3QpcEVxdWFsaXplci0+Z2V0UHJlc2V0KCk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9DVVJfUFJFU0VUICVkIiwgKihpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUzoKKyAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClwRXF1YWxpemVyLT5nZXROdW1QcmVzZXRzKCk7CisgICAgICAgIExPR1YoIkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIoKSBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgJWQiLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FOgorICAgICAgICBwYXJhbTIgPSAqcFBhcmFtOworICAgICAgICBpZiAocGFyYW0yID49IHBFcXVhbGl6ZXItPmdldE51bVByZXNldHMoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5hbWUgPSAoY2hhciAqKXBWYWx1ZTsKKyAgICAgICAgc3RybmNweShuYW1lLCBwRXF1YWxpemVyLT5nZXRQcmVzZXROYW1lKHBhcmFtMiksICpwVmFsdWVTaXplIC0gMSk7CisgICAgICAgIG5hbWVbKnBWYWx1ZVNpemUgLSAxXSA9IDA7CisgICAgICAgICpwVmFsdWVTaXplID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2dldFBhcmFtZXRlcigpIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRSBwcmVzZXQgJWQsIG5hbWUgJXMgbGVuICVkIiwgcGFyYW0yLCBnRXF1YWxpemVyUHJlc2V0c1twYXJhbTJdLm5hbWUsICpwVmFsdWVTaXplKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVRX1BBUkFNX1BST1BFUlRJRVM6IHsKKyAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOworICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgRVFfUEFSQU1fUFJPUEVSVElFUyIpOworICAgICAgICBwWzBdID0gKGludDE2X3QpcEVxdWFsaXplci0+Z2V0UHJlc2V0KCk7CisgICAgICAgIHBbMV0gPSAoaW50MTZfdClrTnVtQmFuZHM7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIHBbMiArIGldID0gKGludDE2X3QpcEVxdWFsaXplci0+Z2V0R2FpbihpKTsKKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dWKCJFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30gLy8gZW5kIEVxdWFsaXplcl9nZXRQYXJhbWV0ZXIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOgorLy8gU2V0IGEgRXF1YWxpemVyIHBhcmFtZXRlcgorLy8KKy8vIElucHV0czoKKy8vICBwRXF1YWxpemVyICAgICAgIC0gaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKy8vICBwUGFyYW0gICAgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKy8vICBwVmFsdWUgICAgICAgICAgIC0gcG9pbnRlciB0byB2YWx1ZQorLy8KKy8vIE91dHB1dHM6CisvLworLy8KKy8vIFNpZGUgRWZmZWN0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIgKEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciwgaW50MzJfdCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50MzJfdCBwcmVzZXQ7CisgICAgaW50MzJfdCBiYW5kOworICAgIGludDMyX3QgbGV2ZWw7CisgICAgaW50MzJfdCBwYXJhbSA9ICpwUGFyYW0rKzsKKworCisgICAgc3dpdGNoIChwYXJhbSkgeworICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICAgICAgcHJlc2V0ID0gKGludDMyX3QpKCoodWludDE2X3QgKilwVmFsdWUpOworCisgICAgICAgIExPR1YoInNldFBhcmFtZXRlcigpIEVRX1BBUkFNX0NVUl9QUkVTRVQgJWQiLCBwcmVzZXQpOworICAgICAgICBpZiAocHJlc2V0IDwgMCB8fCBwcmVzZXQgPj0gcEVxdWFsaXplci0+Z2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcEVxdWFsaXplci0+c2V0UHJlc2V0KHByZXNldCk7CisgICAgICAgIHBFcXVhbGl6ZXItPmNvbW1pdCh0cnVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOgorICAgICAgICBiYW5kID0gICpwUGFyYW07CisgICAgICAgIGxldmVsID0gKGludDMyX3QpKCooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgIExPR1YoInNldFBhcmFtZXRlcigpIEVRX1BBUkFNX0JBTkRfTEVWRUwgYmFuZCAlZCwgbGV2ZWwgJWQiLCBiYW5kLCBsZXZlbCk7CisgICAgICAgIGlmIChiYW5kID49IGtOdW1CYW5kcykgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBFcXVhbGl6ZXItPnNldEdhaW4oYmFuZCwgbGV2ZWwpOworICAgICAgICBwRXF1YWxpemVyLT5jb21taXQodHJ1ZSk7CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7CisgICAgICAgIExPR1YoInNldFBhcmFtZXRlcigpIEVRX1BBUkFNX1BST1BFUlRJRVMiKTsKKyAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOworICAgICAgICBpZiAoKGludClwWzBdID49IHBFcXVhbGl6ZXItPmdldE51bVByZXNldHMoKSkgeworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwWzBdID49IDApIHsKKyAgICAgICAgICAgIHBFcXVhbGl6ZXItPnNldFByZXNldCgoaW50KXBbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChpbnQpcFsxXSAhPSBrTnVtQmFuZHMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIHBFcXVhbGl6ZXItPnNldEdhaW4oaSwgKGludDMyX3QpcFsyICsgaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBFcXVhbGl6ZXItPmNvbW1pdCh0cnVlKTsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1YoInNldFBhcmFtZXRlcigpIGludmFsaWQgcGFyYW0gJWQiLCBwYXJhbSk7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9IC8vIGVuZCBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyCisKK30gLy8gbmFtZXNwYWNlCit9IC8vIG5hbWVzcGFjZQorCisKKy8vCisvLy0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KKy8vCisKK2V4dGVybiAiQyIgaW50IEVxdWFsaXplcl9wcm9jZXNzKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCit7CisgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKKworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSA9PSBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSA9PSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKworICAgIHBDb250ZXh0LT5hZGFwdGVyLnByb2Nlc3MoaW5CdWZmZXItPnJhdywgb3V0QnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30gICAvLyBlbmQgRXF1YWxpemVyX3Byb2Nlc3MKKworZXh0ZXJuICJDIiBpbnQgRXF1YWxpemVyX2NvbW1hbmQoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7CisKKyAgICBhbmRyb2lkOjpFcXVhbGl6ZXJDb250ZXh0ICogcENvbnRleHQgPSAoYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqKSBzZWxmOworICAgIGludCByZXRzaXplOworCisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGFuZHJvaWQ6OkF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplciA9IHBDb250ZXh0LT5wRXF1YWxpemVyOworCisgICAgTE9HVigiRXF1YWxpemVyX2NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBFcXVhbGl6ZXJfaW5pdChwQ29udGV4dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9DT05GSUdVUkU6CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKKyAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IEVxdWFsaXplcl9jb25maWd1cmUocENvbnRleHQsCisgICAgICAgICAgICAgICAgKGVmZmVjdF9jb25maWdfdCAqKSBwQ21kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgRXF1YWxpemVyX2NvbmZpZ3VyZShwQ29udGV4dCwgJnBDb250ZXh0LT5jb25maWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOiB7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgPCAoaW50KSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKKyAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CisgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OkVxdWFsaXplcl9nZXRQYXJhbWV0ZXIocEVxdWFsaXplciwgKGludDMyX3QgKilwLT5kYXRhLCAmcC0+dnNpemUsCisgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBwLT52c2l6ZTsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlMDh4ICUwOHgiLAorICAgICAgICAgICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQgKyBzaXplb2YoaW50MzJfdCkpKTsKKworICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgTE9HVigiRXF1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gY21kU2l6ZSAlZCBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlZCwgcFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopIHBDbWREYXRhOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKHBFcXVhbGl6ZXIsIChpbnQzMl90ICopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOworICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSAhPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9BQ1RJVkU7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSAhPSBFUVVBTElaRVJfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgorICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOgorICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiRXF1YWxpemVyX2NvbW1hbmQgaW52YWxpZCBjb21tYW5kICVkIixjbWRDb2RlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVxdWFsaXplciBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0VxdWFsaXplckludGVyZmFjZSA9IHsKKyAgICAgICAgRXF1YWxpemVyX3Byb2Nlc3MsCisgICAgICAgIEVxdWFsaXplcl9jb21tYW5kCit9OworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjhiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5jCkBAIC0wLDAgKzEsMjEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0UmV2ZXJiIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCisjaW5jbHVkZSAiRWZmZWN0c01hdGguaCIKKworLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgcmV2ZXJiIGVmZmVjdAorY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnUmV2ZXJiSW50ZXJmYWNlID0geworICAgICAgICBSZXZlcmJfUHJvY2VzcywKKyAgICAgICAgUmV2ZXJiX0NvbW1hbmQKK307CisKKy8vIEdvb2dsZSBhdXhpbGlhcnkgZW52aXJvbm1lbnRhbCByZXZlcmIgVVVJRDogMWYwYWUyZTAtNGVmNy0xMWRmLWJjMDktMDAwMmE1ZDVjNTFiCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCisgICAgICAgIHsweDFmMGFlMmUwLCAweDRlZjcsIDB4MTFkZiwgMHhiYzA5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICBFRkZFQ1RfQVBJX1ZFUlNJT04sCisgICAgICAgIC8vIGZsYWdzIG90aGVyIHRoYW4gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgc2V0IGZvciB0ZXN0IHB1cnBvc2UKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EIHwgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQsCisgICAgICAgIDAsIC8vIFRPRE8KKyAgICAgICAgMzMsCisgICAgICAgICJBdXggRW52aXJvbm1lbnRhbCBSZXZlcmIiLAorICAgICAgICAiR29vZ2xlIEluYy4iCit9OworCisvLyBHb29nbGUgaW5zZXJ0IGVudmlyb25tZW50YWwgcmV2ZXJiIFVVSUQ6IGFhNDc2MDQwLTYzNDItMTFkZi05MWE0LTAwMDJhNWQ1YzUxYgorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweGMyZTVkNWYwLCAweDk0YmQsIDB4NDc2MywgMHg5Y2FjLCB7MHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZX19LAorICAgICAgICB7MHhhYTQ3NjA0MCwgMHg2MzQyLCAweDExZGYsIDB4OTFhNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKKyAgICAgICAgMCwgLy8gVE9ETworICAgICAgICAzMywKKyAgICAgICAgIkluc2VydCBFbnZpcm9ubWVudGFsIHJldmVyYiIsCisgICAgICAgICJHb29nbGUgSW5jLiIKK307CisKKy8vIEdvb2dsZSBhdXhpbGlhcnkgcHJlc2V0IHJldmVyYiBVVUlEOiA2MzkwOTMyMC01M2E2LTExZGYtYmRiZC0wMDAyYTVkNWM1MWIKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0geworICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4NjM5MDkzMjAsIDB4NTNhNiwgMHgxMWRmLCAweGJkYmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCisgICAgICAgIDAsIC8vIFRPRE8KKyAgICAgICAgMzMsCisgICAgICAgICJBdXggUHJlc2V0IFJldmVyYiIsCisgICAgICAgICJHb29nbGUgSW5jLiIKK307CisKKy8vIEdvb2dsZSBpbnNlcnQgcHJlc2V0IHJldmVyYiBVVUlEOiBkOTNkYzZhMC02MzQyLTExZGYtYjEyOC0wMDAyYTVkNWM1MWIKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yID0geworICAgICAgICB7MHg0NzM4MmQ2MCwgMHhkZGQ4LCAweDExZGIsIDB4YmYzYSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgezB4ZDkzZGM2YTAsIDB4NjM0MiwgMHgxMWRmLCAweGIxMjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIEVGRkVDVF9BUElfVkVSU0lPTiwKKyAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsCisgICAgICAgIDAsIC8vIFRPRE8KKyAgICAgICAgMzMsCisgICAgICAgICJJbnNlcnQgUHJlc2V0IFJldmVyYiIsCisgICAgICAgICJHb29nbGUgSW5jLiIKK307CisKKy8vIGdEZXNjcmlwdG9ycyBjb250YWlucyBwb2ludGVycyB0byBhbGwgZGVmaW5lZCBlZmZlY3QgZGVzY3JpcHRvciBpbiB0aGlzIGxpYnJhcnkKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICogY29uc3QgZ0Rlc2NyaXB0b3JzW10gPSB7CisgICAgICAgICZnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciwKKyAgICAgICAgJmdJbnNlcnRFbnZSZXZlcmJEZXNjcmlwdG9yLAorICAgICAgICAmZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IsCisgICAgICAgICZnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcgorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFZmZlY3QgQVBJIGltcGxlbWVudGF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCisKK2ludCBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7CisgICAgKnBOdW1FZmZlY3RzID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCBnRGVzY3JpcHRvcnNbaW5kZXhdLAorICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKKyAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpIHsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworICAgIHJldmVyYl9tb2R1bGVfdCAqbW9kdWxlOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisgICAgaW50IGF1eCA9IDA7CisgICAgaW50IHByZXNldCA9IDA7CisKKyAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3Qgc3RhcnQiKTsKKworICAgIGlmIChwSW50ZXJmYWNlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGdEZXNjcmlwdG9yc1tpXSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgZGVzYyA9IGdEZXNjcmlwdG9yc1tpXTsKKyAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZGVzYy0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKQorICAgICAgICAgICAgICAgID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdEZXNjcmlwdG9yc1tpXSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIG1vZHVsZSA9IG1hbGxvYyhzaXplb2YocmV2ZXJiX21vZHVsZV90KSk7CisKKyAgICBtb2R1bGUtPml0ZmUgPSAmZ1JldmVyYkludGVyZmFjZTsKKworICAgIG1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKworICAgIGlmIChtZW1jbXAoJmRlc2MtPnR5cGUsIFNMX0lJRF9QUkVTRVRSRVZFUkIsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICBwcmVzZXQgPSAxOworICAgIH0KKyAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgeworICAgICAgICBhdXggPSAxOworICAgIH0KKyAgICByZXQgPSBSZXZlcmJfSW5pdChtb2R1bGUsIGF1eCwgcHJlc2V0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dXKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QoKSBpbml0IGZhaWxlZCIpOworICAgICAgICBmcmVlKG1vZHVsZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKnBJbnRlcmZhY2UgPSAoZWZmZWN0X2ludGVyZmFjZV90KSBtb2R1bGU7CisKKyAgICBtb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOworCisgICAgTE9HVigiRWZmZWN0TGliQ3JlYXRlRWZmZWN0ICVwICxzaXplICVkIiwgbW9kdWxlLCBzaXplb2YocmV2ZXJiX21vZHVsZV90KSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSkgeworICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKilpbnRlcmZhY2U7CisKKyAgICBMT0dWKCJFZmZlY3RMaWJSZWxlYXNlRWZmZWN0ICVwIiwgaW50ZXJmYWNlKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKworICAgIGZyZWUocFJ2Yk1vZHVsZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyotLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCisKK3N0YXRpYyBpbnQgUmV2ZXJiX1Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikgeworICAgIHJldmVyYl9vYmplY3RfdCAqcFJldmVyYjsKKyAgICBpbnQxNl90ICpwU3JjLCAqcERzdDsKKyAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopc2VsZjsKKworICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBSZXZlcmIgPSAocmV2ZXJiX29iamVjdF90KikgJnBSdmJNb2R1bGUtPmNvbnRleHQ7CisKKyAgICBpZiAocFJldmVyYi0+bVN0YXRlID09IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAocFJldmVyYi0+bVN0YXRlID09IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCisgICAgLy9pZiBieXBhc3NlZCBvciB0aGUgcHJlc2V0IGZvcmNlcyB0aGUgc2lnbmFsIHRvIGJlIGNvbXBsZXRlbHkgZHJ5CisgICAgaWYgKHBSZXZlcmItPm1fYkJ5cGFzcyAhPSAwKSB7CisgICAgICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisgICAgICAgICAgICBpbnQxNl90IHNtcDsKKyAgICAgICAgICAgIHBTcmMgPSBpbkJ1ZmZlci0+czE2OworICAgICAgICAgICAgcERzdCA9IG91dEJ1ZmZlci0+czE2OworICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAocFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID09IHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBjb3VudCAqPSAyOworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgICAgICAgICAgICAgICpwRHN0KysgPSAqcFNyYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAgICAgICAgICAgc21wID0gKnBTcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgKnBEc3QrKyA9IHNtcDsKKyAgICAgICAgICAgICAgICAgICAgKnBEc3QrKyA9IHNtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHBSZXZlcmItPm1fbk5leHRSb29tICE9IHBSZXZlcmItPm1fbkN1cnJlbnRSb29tKSB7CisgICAgICAgIFJldmVyYlVwZGF0ZVJvb20ocFJldmVyYiwgdHJ1ZSk7CisgICAgfQorCisgICAgcFNyYyA9IGluQnVmZmVyLT5zMTY7CisgICAgcERzdCA9IG91dEJ1ZmZlci0+czE2OworICAgIHNpemVfdCBudW1TYW1wbGVzID0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OworICAgIHdoaWxlIChudW1TYW1wbGVzKSB7CisgICAgICAgIHVpbnQzMl90IHByb2Nlc3NlZFNhbXBsZXM7CisgICAgICAgIGlmIChudW1TYW1wbGVzID4gKHVpbnQzMl90KSBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJblNhbXBsZXMpIHsKKyAgICAgICAgICAgIHByb2Nlc3NlZFNhbXBsZXMgPSAodWludDMyX3QpIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluU2FtcGxlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2Nlc3NlZFNhbXBsZXMgPSBudW1TYW1wbGVzOworICAgICAgICB9CisKKyAgICAgICAgLyogaW5jcmVtZW50IHVwZGF0ZSBjb3VudGVyICovCisgICAgICAgIHBSZXZlcmItPm1fblVwZGF0ZUNvdW50ZXIgKz0gKGludDE2X3QpIHByb2Nlc3NlZFNhbXBsZXM7CisgICAgICAgIC8qIGNoZWNrIGlmIHVwZGF0ZSBjb3VudGVyIG5lZWRzIHRvIGJlIHJlc2V0ICovCisgICAgICAgIGlmIChwUmV2ZXJiLT5tX25VcGRhdGVDb3VudGVyID49IHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluU2FtcGxlcykgeworICAgICAgICAgICAgLyogdXBkYXRlIGludGVydmFsIGhhcyBlbGFwc2VkLCBzbyByZXNldCBjb3VudGVyICovCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25VcGRhdGVDb3VudGVyIC09IHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluU2FtcGxlczsKKyAgICAgICAgICAgIFJldmVyYlVwZGF0ZVhmYWRlKHBSZXZlcmIsIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluU2FtcGxlcyk7CisKKyAgICAgICAgfSAvKiBlbmQgaWYgbV9uVXBkYXRlQ291bnRlciA+PSB1cGRhdGUgaW50ZXJ2YWwgKi8KKworICAgICAgICBSZXZlcmIocFJldmVyYiwgcHJvY2Vzc2VkU2FtcGxlcywgcERzdCwgcFNyYyk7CisKKyAgICAgICAgbnVtU2FtcGxlcyAtPSBwcm9jZXNzZWRTYW1wbGVzOworICAgICAgICBpZiAocFJldmVyYi0+bV9BdXgpIHsKKyAgICAgICAgICAgIHBTcmMgKz0gcHJvY2Vzc2VkU2FtcGxlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTcmMgKz0gcHJvY2Vzc2VkU2FtcGxlcyAqIE5VTV9PVVRQVVRfQ0hBTk5FTFM7CisgICAgICAgIH0KKyAgICAgICAgcERzdCArPSBwcm9jZXNzZWRTYW1wbGVzICogTlVNX09VVFBVVF9DSEFOTkVMUzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSA9IChyZXZlcmJfbW9kdWxlX3QgKikgc2VsZjsKKyAgICByZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmI7CisgICAgaW50IHJldHNpemU7CisKKyAgICBpZiAocFJ2Yk1vZHVsZSA9PSBOVUxMIHx8CisgICAgICAgICAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9PSBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwUmV2ZXJiID0gKHJldmVyYl9vYmplY3RfdCopICZwUnZiTW9kdWxlLT5jb250ZXh0OworCisgICAgTE9HVigiUmV2ZXJiX0NvbW1hbmQgY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKworICAgIHN3aXRjaCAoY21kQ29kZSkgeworICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBSZXZlcmJfSW5pdChwUnZiTW9kdWxlLCBwUmV2ZXJiLT5tX0F1eCwgcFJldmVyYi0+bV9QcmVzZXQpOworICAgICAgICBpZiAoKihpbnQgKikgcFJlcGx5RGF0YSA9PSAwKSB7CisgICAgICAgICAgICBwUnZiTW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfQ09ORklHVVJFOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBSZXZlcmJfQ29uZmlndXJlKHBSdmJNb2R1bGUsCisgICAgICAgICAgICAgICAgKGVmZmVjdF9jb25maWdfdCAqKXBDbWREYXRhLCBmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKKyAgICAgICAgUmV2ZXJiX1Jlc2V0KHBSZXZlcmIsIGZhbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTToKKyAgICAgICAgTE9HVigiUmV2ZXJiX0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcENtZERhdGEgJXAsICpyZXBseVNpemUgJWQsIHBSZXBseURhdGE6ICVwIixwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChpbnQpIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpyZXAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcFJlcGx5RGF0YTsKKyAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgTE9HVigiUmV2ZXJiX0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcGFyYW0gJWQsIHJlcGx5U2l6ZSAlZCIsKihpbnQzMl90ICopcmVwLT5kYXRhLCByZXAtPnZzaXplKTsKKyAgICAgICAgcmVwLT5zdGF0dXMgPSBSZXZlcmJfZ2V0UGFyYW1ldGVyKHBSZXZlcmIsICooaW50MzJfdCAqKXJlcC0+ZGF0YSwgJnJlcC0+dnNpemUsCisgICAgICAgICAgICAgICAgcmVwLT5kYXRhICsgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyByZXAtPnZzaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOgorICAgICAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICVkLCBwUmVwbHlEYXRhICVwIiwKKyAgICAgICAgICAgICAgICBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gKGludClzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpjbWQgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IFJldmVyYl9zZXRQYXJhbWV0ZXIocFJldmVyYiwgKihpbnQzMl90ICopY21kLT5kYXRhLAorICAgICAgICAgICAgICAgIGNtZC0+dnNpemUsIGNtZC0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBSZXZlcmItPm1TdGF0ZSAhPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBSZXZlcmItPm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9BQ1RJVkU7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBSZXZlcmItPm1TdGF0ZSAhPSBSRVZFUkJfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwUmV2ZXJiLT5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiUmV2ZXJiX0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfREVWSUNFOiAweCUwOHgiLCAqKHVpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogeworICAgICAgICAvLyBhdWRpbyBvdXRwdXQgaXMgYWx3YXlzIHN0ZXJlbyA9PiAyIGNoYW5uZWwgdm9sdW1lcworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSAqIDIpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGZsb2F0IGxlZnQgPSAoZmxvYXQpKCoodWludDMyX3QgKilwQ21kRGF0YSkgLyAoMSA8PCAyNCk7CisgICAgICAgIGZsb2F0IHJpZ2h0ID0gKGZsb2F0KSgqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMSkpIC8gKDEgPDwgMjQpOworICAgICAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IGxlZnQgJWYsIHJpZ2h0ICVmICIsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gKGludClzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBMT0dWKCJSZXZlcmJfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAlZCIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIlJldmVyYl9Db21tYW5kIGludmFsaWQgY29tbWFuZCAlZCIsY21kQ29kZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiIGludGVybmFsIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiX0luaXQoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogSW5pdGlhbGl6ZSByZXZlcmIgY29udGV4dCBhbmQgYXBwbHkgZGVmYXVsdCBwYXJhbWV0ZXJzCisgKgorICogSW5wdXRzOgorICogIHBSdmJNb2R1bGUgICAgLSBwb2ludGVyIHRvIHJldmVyYiBlZmZlY3QgbW9kdWxlCisgKiAgYXV4ICAgICAgICAgICAtIGluZGljYXRlcyBpZiB0aGUgcmV2ZXJiIGlzIHVzZWQgYXMgYXV4aWxpYXJ5ICgxKSBvciBpbnNlcnQgKDApCisgKiAgcHJlc2V0ICAgICAgICAtIGluZGljYXRlcyBpZiB0aGUgcmV2ZXJiIGlzIHVzZWQgaW4gcHJlc2V0ICgxKSBvciBlbnZpcm9ubWVudGFsICgwKSBtb2RlCisgKgorICogT3V0cHV0czoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworaW50IFJldmVyYl9Jbml0KHJldmVyYl9tb2R1bGVfdCAqcFJ2Yk1vZHVsZSwgaW50IGF1eCwgaW50IHByZXNldCkgeworICAgIGludCByZXQ7CisKKyAgICBMT0dWKCJSZXZlcmJfSW5pdCBtb2R1bGUgJXAsIGF1eDogJWQsIHByZXNldDogJWQiLCBwUnZiTW9kdWxlLGF1eCwgcHJlc2V0KTsKKworICAgIG1lbXNldCgmcFJ2Yk1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKHJldmVyYl9vYmplY3RfdCkpOworCisgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tX0F1eCA9ICh1aW50MTZfdClhdXg7CisgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tX1ByZXNldCA9ICh1aW50MTZfdClwcmVzZXQ7CisKKyAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgaWYgKGF1eCkgeworICAgICAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX01PTk87CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgfQorICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcFJ2Yk1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfU1RFUkVPOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwUnZiTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgcmV0ID0gUmV2ZXJiX0NvbmZpZ3VyZShwUnZiTW9kdWxlLCAmcFJ2Yk1vZHVsZS0+Y29uZmlnLCB0cnVlKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBMT0dWKCJSZXZlcmJfSW5pdCBlcnJvciAlZCBvbiBtb2R1bGUgJXAiLCByZXQsIHBSdmJNb2R1bGUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiX0luaXQoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogIFNldCBpbnB1dCBhbmQgb3V0cHV0IGF1ZGlvIGNvbmZpZ3VyYXRpb24uCisgKgorICogSW5wdXRzOgorICogIHBSdmJNb2R1bGUgICAgLSBwb2ludGVyIHRvIHJldmVyYiBlZmZlY3QgbW9kdWxlCisgKiAgcENvbmZpZyAgICAgICAtIHBvaW50ZXIgdG8gZWZmZWN0X2NvbmZpZ190IHN0cnVjdHVyZSBjb250YWluaW5nIGlucHV0CisgKiAgICAgICAgICAgICAgYW5kIG91dHB1dCBhdWRpbyBwYXJhbWV0ZXJzIGNvbmZpZ3VyYXRpb24KKyAqICBpbml0ICAgICAgICAgIC0gdHJ1ZSBpZiBjYWxsZWQgZnJvbSBpbml0IGZ1bmN0aW9uCisgKiBPdXRwdXRzOgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitpbnQgUmV2ZXJiX0NvbmZpZ3VyZShyZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywKKyAgICAgICAgYm9vbCBpbml0KSB7CisgICAgcmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiID0gJnBSdmJNb2R1bGUtPmNvbnRleHQ7CisgICAgaW50IGJ1ZmZlclNpemVJblNhbXBsZXM7CisgICAgaW50IHVwZGF0ZVBlcmlvZEluU2FtcGxlczsKKyAgICBpbnQgeGZhZGVQZXJpb2RJblNhbXBsZXM7CisKKyAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zCisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZQorICAgICAgICAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlCisgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyAhPSBPVVRQVVRfQ0hBTk5FTFMKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IFNBTVBMRV9GT1JNQVRfUENNX1MxNQorICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ICE9IFNBTVBMRV9GT1JNQVRfUENNX1MxNSkgeworICAgICAgICBMT0dWKCJSZXZlcmJfQ29uZmlndXJlIGludmFsaWQgY29uZmlnIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoKHBSZXZlcmItPm1fQXV4ICYmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBDSEFOTkVMX01PTk8pKSB8fAorICAgICAgICAoIXBSZXZlcmItPm1fQXV4ICYmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBDSEFOTkVMX1NURVJFTykpKSB7CisgICAgICAgIExPR1YoIlJldmVyYl9Db25maWd1cmUgaW52YWxpZCBjb25maWciKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KCZwUnZiTW9kdWxlLT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKworICAgIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSA9IHBSdmJNb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlOworCisgICAgc3dpdGNoIChwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpIHsKKyAgICBjYXNlIDgwMDA6CisgICAgICAgIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0cyA9IDU7CisgICAgICAgIGJ1ZmZlclNpemVJblNhbXBsZXMgPSA0MDk2OworICAgICAgICBwUmV2ZXJiLT5tX25Db3NXVF81S0h6ID0gLTIzMTcwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2MDAwOgorICAgICAgICBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHMgPSA2OworICAgICAgICBidWZmZXJTaXplSW5TYW1wbGVzID0gODE5MjsKKyAgICAgICAgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiA9IC0xMjU0MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgICAgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5CaXRzID0gNzsKKyAgICAgICAgYnVmZmVyU2l6ZUluU2FtcGxlcyA9IDgxOTI7CisgICAgICAgIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogPSA0NzY4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyMDAwOgorICAgICAgICBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHMgPSA3OworICAgICAgICBidWZmZXJTaXplSW5TYW1wbGVzID0gMTYzODQ7CisgICAgICAgIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogPSAxODIwNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgICAgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5CaXRzID0gODsKKyAgICAgICAgYnVmZmVyU2l6ZUluU2FtcGxlcyA9IDE2Mzg0OworICAgICAgICBwUmV2ZXJiLT5tX25Db3NXVF81S0h6ID0gMjQ3OTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDA6CisgICAgICAgIHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0cyA9IDg7CisgICAgICAgIGJ1ZmZlclNpemVJblNhbXBsZXMgPSAxNjM4NDsKKyAgICAgICAgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiA9IDI1OTk3OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dWKCJSZXZlcmJfQ29uZmlndXJlIGludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCIsIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIERlZmluZSBhIG1hc2sgZm9yIGNpcmN1bGFyIGFkZHJlc3NpbmcsIHNvIHRoYXQgYXJyYXkgaW5kZXgKKyAgICAvLyBjYW4gd3JhcGFyb3VuZCBhbmQgc3RheSBpbiBhcnJheSBib3VuZGFyeSBvZiAwLCAxLCAuLi4sIChidWZmZXIgc2l6ZSAtMSkKKyAgICAvLyBUaGUgYnVmZmVyIHNpemUgTVVTVCBiZSBhIHBvd2VyIG9mIHR3bworICAgIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2sgPSAoaW50MzJfdCkgKGJ1ZmZlclNpemVJblNhbXBsZXMgLSAxKTsKKyAgICAvKiByZXZlcmIgcGFyYW1ldGVycyBhcmUgdXBkYXRlZCBldmVyeSAyXihwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHMpIHNhbXBsZXMgKi8KKyAgICB1cGRhdGVQZXJpb2RJblNhbXBsZXMgPSAoaW50MzJfdCkgKDB4MUwgPDwgcFJldmVyYi0+bV9uVXBkYXRlUGVyaW9kSW5CaXRzKTsKKyAgICAvKgorICAgICBjYWxjdWxhdGUgdGhlIHVwZGF0ZSBjb3VudGVyIGJ5IGJpdHdpc2UgQU5ESU5HIHdpdGggdGhpcyB2YWx1ZSB0bworICAgICBnZW5lcmF0ZSBhIDJebiBtb2R1bG8gdmFsdWUKKyAgICAgKi8KKyAgICBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJblNhbXBsZXMgPSAoaW50MzJfdCkgdXBkYXRlUGVyaW9kSW5TYW1wbGVzOworCisgICAgeGZhZGVQZXJpb2RJblNhbXBsZXMgPSAoaW50MzJfdCkgKFJFVkVSQl9YRkFERV9QRVJJT0RfSU5fU0VDT05EUworICAgICAgICAgICAgKiAoZG91YmxlKSBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpOworCisgICAgLy8gc2V0IHhmYWRlIHBhcmFtZXRlcnMKKyAgICBwUmV2ZXJiLT5tX25QaGFzZUluY3JlbWVudAorICAgICAgICAgICAgPSAoaW50MTZfdCkgKDY1NTM2IC8gKChpbnQxNl90KSB4ZmFkZVBlcmlvZEluU2FtcGxlcworICAgICAgICAgICAgICAgICAgICAvIChpbnQxNl90KSB1cGRhdGVQZXJpb2RJblNhbXBsZXMpKTsKKworICAgIGlmIChpbml0KSB7CisgICAgICAgIFJldmVyYlJlYWRJblByZXNldHMocFJldmVyYik7CisKKyAgICAgICAgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3NlcywgYWxsb3cgbm9pc2UgZ2VuZXJhdG9yCisgICAgICAgIHBSZXZlcmItPm1fYlVzZU5vaXNlID0gdHJ1ZTsKKworICAgICAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBhbGxvdyBieXBhc3MKKyAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gMDsKKworICAgICAgICBwUmV2ZXJiLT5tX25OZXh0Um9vbSA9IDE7CisKKyAgICAgICAgcFJldmVyYi0+bV9uTm9pc2UgPSAoaW50MTZfdCkgMHhBQkNEOworICAgIH0KKworICAgIFJldmVyYl9SZXNldChwUmV2ZXJiLCBpbml0KTsKKworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYl9SZXNldCgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiAgUmVzZXQgaW50ZXJuYWwgc3RhdGVzIGFuZCBjbGVhciBkZWxheSBsaW5lcy4KKyAqCisgKiBJbnB1dHM6CisgKiAgcFJldmVyYiAgICAtIHBvaW50ZXIgdG8gcmV2ZXJiIGNvbnRleHQKKyAqICBpbml0ICAgICAgIC0gdHJ1ZSBpZiBjYWxsZWQgZnJvbSBpbml0IGZ1bmN0aW9uCisgKgorICogT3V0cHV0czoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwordm9pZCBSZXZlcmJfUmVzZXQocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBib29sIGluaXQpIHsKKyAgICBpbnQgYnVmZmVyU2l6ZUluU2FtcGxlcyA9IChpbnQzMl90KSAocFJldmVyYi0+bV9uQnVmZmVyTWFzayArIDEpOworICAgIGludCBtYXhBcFNhbXBsZXM7CisgICAgaW50IG1heERlbGF5U2FtcGxlczsKKyAgICBpbnQgbWF4RWFybHlTYW1wbGVzOworICAgIGludCBhcDFJbjsKKyAgICBpbnQgZGVsYXkwSW47CisgICAgaW50IGRlbGF5MUluOworICAgIGludDMyX3QgaTsKKyAgICB1aW50MTZfdCBuT2Zmc2V0OworCisgICAgbWF4QXBTYW1wbGVzID0gKChpbnQzMl90KSAoTUFYX0FQX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2KTsKKyAgICBtYXhEZWxheVNhbXBsZXMgPSAoKGludDMyX3QpIChNQVhfREVMQVlfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkKKyAgICAgICAgICAgID4+IDE2KTsKKyAgICBtYXhFYXJseVNhbXBsZXMgPSAoKGludDMyX3QpIChNQVhfRUFSTFlfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkKKyAgICAgICAgICAgID4+IDE2KTsKKworICAgIGFwMUluID0gKEFQMF9JTiArIG1heEFwU2FtcGxlcyArIEdVQVJEKTsKKyAgICBkZWxheTBJbiA9IChhcDFJbiArIG1heEFwU2FtcGxlcyArIEdVQVJEKTsKKyAgICBkZWxheTFJbiA9IChkZWxheTBJbiArIG1heERlbGF5U2FtcGxlcyArIEdVQVJEKTsKKyAgICAvLyBEZWZpbmUgdGhlIG1heCBvZmZzZXRzIGZvciB0aGUgZW5kIHBvaW50cyBvZiBlYWNoIHNlY3Rpb24KKyAgICAvLyBpLmUuLCB3ZSBkb24ndCBleHBlY3QgYSBnaXZlbiBzZWN0aW9uJ3MgdGFwcyB0byBnbyBiZXlvbmQKKyAgICAvLyB0aGUgZm9sbG93aW5nIGxpbWl0cworCisgICAgcFJldmVyYi0+bV9uRWFybHkwaW4gPSAoZGVsYXkxSW4gKyBtYXhEZWxheVNhbXBsZXMgKyBHVUFSRCk7CisgICAgcFJldmVyYi0+bV9uRWFybHkxaW4gPSAocFJldmVyYi0+bV9uRWFybHkwaW4gKyBtYXhFYXJseVNhbXBsZXMgKyBHVUFSRCk7CisKKyAgICBwUmV2ZXJiLT5tX3NBcDAubV96QXBJbiA9IEFQMF9JTjsKKworICAgIHBSZXZlcmItPm1fekQwSW4gPSBkZWxheTBJbjsKKworICAgIHBSZXZlcmItPm1fc0FwMS5tX3pBcEluID0gYXAxSW47CisKKyAgICBwUmV2ZXJiLT5tX3pEMUluID0gZGVsYXkxSW47CisKKyAgICBwUmV2ZXJiLT5tX3pPdXRMcGZMID0gMDsKKyAgICBwUmV2ZXJiLT5tX3pPdXRMcGZSID0gMDsKKworICAgIHBSZXZlcmItPm1fblJldkZia1IgPSAwOworICAgIHBSZXZlcmItPm1fblJldkZia0wgPSAwOworCisgICAgLy8gc2V0IGJhc2UgaW5kZXggaW50byBjaXJjdWxhciBidWZmZXIKKyAgICBwUmV2ZXJiLT5tX25CYXNlSW5kZXggPSAwOworCisgICAgLy8gY2xlYXIgdGhlIHJldmVyYiBkZWxheSBsaW5lCisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlclNpemVJblNhbXBsZXM7IGkrKykgeworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheUxpbmVbaV0gPSAwOworICAgIH0KKworICAgIFJldmVyYlVwZGF0ZVJvb20ocFJldmVyYiwgaW5pdCk7CisKKyAgICBwUmV2ZXJiLT5tX25VcGRhdGVDb3VudGVyID0gMDsKKworICAgIHBSZXZlcmItPm1fblBoYXNlID0gLTMyNzY4OworCisgICAgcFJldmVyYi0+bV9uU2luID0gMDsKKyAgICBwUmV2ZXJiLT5tX25Db3MgPSAwOworICAgIHBSZXZlcmItPm1fblNpbkluY3JlbWVudCA9IDA7CisgICAgcFJldmVyYi0+bV9uQ29zSW5jcmVtZW50ID0gMDsKKworICAgIC8vIHNldCBkZWxheSB0YXAgbGVuZ3RocworICAgIG5PZmZzZXQgPSBSZXZlcmJDYWxjdWxhdGVOb2lzZShwUmV2ZXJiKTsKKworICAgIHBSZXZlcmItPm1fekQxQ3Jvc3MgPSBwUmV2ZXJiLT5tX25EZWxheTFPdXQgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24KKyAgICAgICAgICAgICsgbk9mZnNldDsKKworICAgIG5PZmZzZXQgPSBSZXZlcmJDYWxjdWxhdGVOb2lzZShwUmV2ZXJiKTsKKworICAgIHBSZXZlcmItPm1fekQwQ3Jvc3MgPSBwUmV2ZXJiLT5tX25EZWxheTBPdXQgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24KKyAgICAgICAgICAgIC0gbk9mZnNldDsKKworICAgIG5PZmZzZXQgPSBSZXZlcmJDYWxjdWxhdGVOb2lzZShwUmV2ZXJiKTsKKworICAgIHBSZXZlcmItPm1fekQwU2VsZiA9IHBSZXZlcmItPm1fbkRlbGF5ME91dCAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbgorICAgICAgICAgICAgLSBuT2Zmc2V0OworCisgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgcFJldmVyYi0+bV96RDFTZWxmID0gcFJldmVyYi0+bV9uRGVsYXkxT3V0IC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uCisgICAgICAgICAgICArIG5PZmZzZXQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiX2dldFBhcmFtZXRlcigpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBHZXQgYSBSZXZlcmIgcGFyYW1ldGVyCisgKgorICogSW5wdXRzOgorICogIHBSZXZlcmIgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorICogIHBhcmFtICAgICAgICAgLSBwYXJhbWV0ZXIKKyAqICBwVmFsdWUgICAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQorICogIHBTaXplICAgICAgICAgLSBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorICoKKyAqIE91dHB1dHM6CisgKiAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisgKiAgKnBTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK2ludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYiwgaW50MzJfdCBwYXJhbSwgc2l6ZV90ICpwU2l6ZSwKKyAgICAgICAgdm9pZCAqcFZhbHVlKSB7CisgICAgaW50MzJfdCAqcFZhbHVlMzI7CisgICAgaW50MTZfdCAqcFZhbHVlMTY7CisgICAgdF9yZXZlcmJfc2V0dGluZ3MgKnBQcm9wZXJ0aWVzOworICAgIGludDMyX3QgaTsKKyAgICBpbnQzMl90IHRlbXA7CisgICAgaW50MzJfdCB0ZW1wMjsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIGlmIChwUmV2ZXJiLT5tX1ByZXNldCkgeworICAgICAgICBpZiAocGFyYW0gIT0gUkVWRVJCX1BBUkFNX1BSRVNFVCB8fCAqcFNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIHBWYWx1ZTE2ID0gKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgIC8vIFJFVkVSQl9QUkVTRVRfTk9ORSBpcyBtYXBwZWQgdG8gYnlwYXNzCisgICAgICAgIGlmIChwUmV2ZXJiLT5tX2JCeXBhc3MgIT0gMCkgeworICAgICAgICAgICAgKnBWYWx1ZTE2ID0gKGludDE2X3QpUkVWRVJCX1BSRVNFVF9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnBWYWx1ZTE2ID0gKGludDE2X3QpKHBSZXZlcmItPm1fbk5leHRSb29tICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9QUkVTRVQsIHByZXNldCAlZCIsICpwVmFsdWUxNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0JZUEFTUzoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc2l6ZSA9IHNpemVvZih0X3JldmVyYl9zZXR0aW5ncyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKnBTaXplIDwgc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBwVmFsdWUzMiA9IChpbnQzMl90ICopIHBWYWx1ZTsKKyAgICAgICAgcFZhbHVlMTYgPSAoaW50MTZfdCAqKSBwVmFsdWU7CisgICAgICAgIHBQcm9wZXJ0aWVzID0gKHRfcmV2ZXJiX3NldHRpbmdzICopIHBWYWx1ZTsKKworICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0JZUEFTUzoKKyAgICAgICAgICAgICpwVmFsdWUzMiA9IChpbnQzMl90KSBwUmV2ZXJiLT5tX2JCeXBhc3M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPnJvb21MZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgICAgICAvLyBDb252ZXJ0IG1fblJvb21McGZGd2QgdG8gbWlsbGliZWxzCisgICAgICAgICAgICB0ZW1wID0gKHBSZXZlcmItPm1fblJvb21McGZGd2QgPDwgMTUpCisgICAgICAgICAgICAgICAgICAgIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisgICAgICAgICAgICAqcFZhbHVlMTYgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcCk7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCAlZCwgZ2FpbiAlZCwgbV9uUm9vbUxwZkZ3ZCAlZCwgbV9uUm9vbUxwZkZiayAlZCIsICpwVmFsdWUxNiwgdGVtcCwgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCwgcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPnJvb21IRkxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgICAgIC8vIFRoZSByYXRpbyBiZXR3ZWVuIGxpbmVhciBnYWluIGF0IDBIeiBhbmQgYXQgNTAwMEh6IGZvciB0aGUgcm9vbSBsb3cgcGFzcyBpczoKKyAgICAgICAgICAgIC8vICgxICsgYTEpIC8gc3FydChhMV4yICsgMipDKmExICsgMSkgd2hlcmU6CisgICAgICAgICAgICAvLyAtIGExIGlzIG1pbnVzIHRoZSBMUCBmZWVkYmFjayBnYWluOiAtcFJldmVyYi0+bV9uUm9vbUxwZkZiaworICAgICAgICAgICAgLy8gLSBDIGlzIGNvcygycGlXVCkgQCA1MDAwSHo6IHBSZXZlcmItPm1fbkNvc1dUXzVLSHoKKworICAgICAgICAgICAgdGVtcCA9IE1VTFRfRUcxX0VHMShwUmV2ZXJiLT5tX25Sb29tTHBmRmJrLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgYTFeMiAlZCIsIHRlbXApOworICAgICAgICAgICAgdGVtcDIgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUm9vbUxwZkZiaywgcFJldmVyYi0+bV9uQ29zV1RfNUtIeikKKyAgICAgICAgICAgICAgICAgICAgPDwgMTsKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgMiBDb3MgYTEgJWQiLCB0ZW1wMik7CisgICAgICAgICAgICB0ZW1wID0gMzI3NjcgKyB0ZW1wIC0gdGVtcDI7CisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIGExXjIgKyAyIENvcyBhMSArIDEgJWQiLCB0ZW1wKTsKKyAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX1NxcnQodGVtcCkgKiAxODE7CisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwsIFNRUlQoYTFeMiArIDIgQ29zIGExICsgMSkgJWQiLCB0ZW1wKTsKKyAgICAgICAgICAgIHRlbXAgPSAoKDMyNzY3IC0gcFJldmVyYi0+bV9uUm9vbUxwZkZiaykgPDwgMTUpIC8gdGVtcDsKKworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBnYWluICVkLCBtX25Sb29tTHBmRndkICVkLCBtX25Sb29tTHBmRmJrICVkIiwgdGVtcCwgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCwgcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUzMiA9ICZwUHJvcGVydGllcy0+ZGVjYXlUaW1lOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByZXZlcmIgZmVlZGJhY2sgcGF0aCBnYWluCisgICAgICAgICAgICB0ZW1wID0gKHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCA8PCAxNSkgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspOworICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyh0ZW1wKTsKKworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGRlY2F5IHRpbWU6IGcgPSAtNjAwMCBkL0RUICwgZyBnYWluIGluIG1pbGxpYmVscywgZCByZXZlcmIgZGVsYXksIERUIGRlY2F5IHRpbWUKKyAgICAgICAgICAgIHRlbXAgPSAoLTYwMDAgKiBwUmV2ZXJiLT5tX25MYXRlRGVsYXkpIC8gdGVtcDsKKworICAgICAgICAgICAgLy8gQ29udmVydCBzYW1wbGVzIHRvIG1zCisgICAgICAgICAgICAqcFZhbHVlMzIgPSAodGVtcCAqIDEwMDApIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUsIHNhbXBsZXMgJWQsIG1zICVkIiwgdGVtcCwgKnBWYWx1ZTMyKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGVjYXlIRlJhdGlvOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgICAgICAvLyBJZiByIGlzIHRoZSBkZWNheSBIRiByYXRpbyAgKHIgPSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8vMTAwMCkgd2UgaGF2ZToKKyAgICAgICAgICAgIC8vICAgICAgIERUXzUwMDBIeiA9IERUXzBIeiAqIHIKKyAgICAgICAgICAgIC8vICBhbmQgIEdfNTAwMEh6ID0gLTYwMDAgKiBkIC8gRFRfNTAwMEh6IGFuZCBHXzBIeiA9IC02MDAwICogZCAvIERUXzBIeiBpbiBtaWxsaWJlbHMgc28gOgorICAgICAgICAgICAgLy8gciA9IEdfMEh6L0dfNTAwMEh6IGluIG1pbGxpYmVscworICAgICAgICAgICAgLy8gVGhlIGxpbmVhciBnYWluIGF0IDUwMDBIeiBpcyBiMCAvIHNxcnQoYTFeMiArIDIqQyphMSArIDEpIHdoZXJlOgorICAgICAgICAgICAgLy8gLSBhMSBpcyBtaW51cyB0aGUgTFAgZmVlZGJhY2sgZ2FpbjogLXBSZXZlcmItPm1fblJ2YkxwZkZiaworICAgICAgICAgICAgLy8gLSBiMCBpcyB0aGUgTFAgZm9yd2FyZCBnYWluOiBwUmV2ZXJiLT5tX25SdmJMcGZGd2QKKyAgICAgICAgICAgIC8vIC0gQyBpcyBjb3MoMnBpV1QpIEAgNTAwMEh6OiBwUmV2ZXJiLT5tX25Db3NXVF81S0h6CisgICAgICAgICAgICBpZiAocFJldmVyYi0+bV9uUnZiTHBmRmJrID09IDApIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlMTYgPSAxMDAwOworICAgICAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIHBSZXZlcmItPm1fblJ2YkxwZkZiayA9PSAwLCByYXRpbyAlZCIsICpwVmFsdWUxNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUnZiTHBmRmJrLCBwUmV2ZXJiLT5tX25SdmJMcGZGYmspOworICAgICAgICAgICAgICAgIHRlbXAyID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJ2YkxwZkZiaywgcFJldmVyYi0+bV9uQ29zV1RfNUtIeikKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE7CisgICAgICAgICAgICAgICAgdGVtcCA9IDMyNzY3ICsgdGVtcCAtIHRlbXAyOworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX1NxcnQodGVtcCkgKiAxODE7CisgICAgICAgICAgICAgICAgdGVtcCA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gdGVtcDsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbGluZWFyIGdhaW4gYXQgMEh6IGlzIGIwIC8gKGExICsgMSkKKyAgICAgICAgICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3CisgICAgICAgICAgICAgICAgICAgICAgICAtIHBSZXZlcmItPm1fblJ2YkxwZkZiayk7CisKKyAgICAgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAyID0gRWZmZWN0c19MaW5lYXIxNlRvTWlsbGliZWxzKHRlbXAyKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBnYWluIDVLSHogJWQgbUIsIGdhaW4gREMgJWQgbUIiLCB0ZW1wLCB0ZW1wMik7CisKKyAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0ZW1wID0gMTsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKGludDE2X3QpICgoMTAwMCAqIHRlbXAyKSAvIHRlbXApOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID4gMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IDEwMDA7CisKKyAgICAgICAgICAgICAgICAqcFZhbHVlMTYgPSB0ZW1wOworICAgICAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8sIHJhdGlvICVkIiwgKnBWYWx1ZTE2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFZhbHVlMTYgPSAmcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgICAgICpwVmFsdWUxNiA9IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25FYXJseUdhaW4pOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMLCAlZCIsICpwVmFsdWUxNik7CisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUzMiA9ICZwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICAgICAgLy8gY29udmVydCBzYW1wbGVzIHRvIG1zCisgICAgICAgICAgICAqcFZhbHVlMzIgPSAocFJldmVyYi0+bV9uRWFybHlEZWxheSAqIDEwMDApIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZLCBzYW1wbGVzICVkLCBtcyAlZCIsIHBSZXZlcmItPm1fbkVhcmx5RGVsYXksICpwVmFsdWUzMik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTE2ID0gJnBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbGluZWFyIGdhaW4gdG8gbWlsbGliZWxzCisgICAgICAgICAgICAqcFZhbHVlMTYgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMocFJldmVyYi0+bV9uTGF0ZUdhaW4gPDwgMik7CisKKyAgICAgICAgICAgIExPR1YoImdldCBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMICVkIiwgKnBWYWx1ZTE2KTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBWYWx1ZTMyID0gJnBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgc2FtcGxlcyB0byBtcworICAgICAgICAgICAgKnBWYWx1ZTMyID0gKHBSZXZlcmItPm1fbkxhdGVEZWxheSAqIDEwMDApIC8gcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWSwgc2FtcGxlcyAlZCwgbXMgJWQiLCBwUmV2ZXJiLT5tX25MYXRlRGVsYXksICpwVmFsdWUzMik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGlmZnVzaW9uOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgorICAgICAgICAgICAgdGVtcCA9IChpbnQxNl90KSAoKDEwMDAgKiAocFJldmVyYi0+bV9zQXAwLm1fbkFwR2FpbiAtIEFQMF9HQUlOX0JBU0UpKQorICAgICAgICAgICAgICAgICAgICAvIEFQMF9HQUlOX1JBTkdFKTsKKworICAgICAgICAgICAgaWYgKHRlbXAgPCAwKQorICAgICAgICAgICAgICAgIHRlbXAgPSAwOworICAgICAgICAgICAgaWYgKHRlbXAgPiAxMDAwKQorICAgICAgICAgICAgICAgIHRlbXAgPSAxMDAwOworCisgICAgICAgICAgICAqcFZhbHVlMTYgPSB0ZW1wOworICAgICAgICAgICAgTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9ESUZGVVNJT04sICVkLCBBUDAgZ2FpbiAlZCIsICpwVmFsdWUxNiwgcFJldmVyYi0+bV9zQXAwLm1fbkFwR2Fpbik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwVmFsdWUxNiA9ICZwUHJvcGVydGllcy0+ZGVuc2l0eTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgQVAgZGVsYXkgaW4gdGltZSB1bml0cworICAgICAgICAgICAgdGVtcCA9ICgocFJldmVyYi0+bV9zQXAwLm1fekFwT3V0IC0gcFJldmVyYi0+bV9zQXAwLm1fekFwSW4pIDw8IDE2KQorICAgICAgICAgICAgICAgICAgICAvIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZTsKKworICAgICAgICAgICAgdGVtcCA9IChpbnQxNl90KSAoKDEwMDAgKiAodGVtcCAtIEFQMF9USU1FX0JBU0UpKSAvIEFQMF9USU1FX1JBTkdFKTsKKworICAgICAgICAgICAgaWYgKHRlbXAgPCAwKQorICAgICAgICAgICAgICAgIHRlbXAgPSAwOworICAgICAgICAgICAgaWYgKHRlbXAgPiAxMDAwKQorICAgICAgICAgICAgICAgIHRlbXAgPSAxMDAwOworCisgICAgICAgICAgICAqcFZhbHVlMTYgPSB0ZW1wOworCisgICAgICAgICAgICBMT0dWKCJnZXQgUkVWRVJCX1BBUkFNX0RFTlNJVFksICVkLCBBUDAgZGVsYXkgc21wcyAlZCIsICpwVmFsdWUxNiwgcFJldmVyYi0+bV9zQXAwLm1fekFwT3V0IC0gcFJldmVyYi0+bV9zQXAwLm1fekFwSW4pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgKnBTaXplID0gc2l6ZTsKKworICAgIExPR1YoIlJldmVyYl9nZXRQYXJhbWV0ZXIsIGNvbnRleHQgJXAsIHBhcmFtICVkLCB2YWx1ZSAlZCIsCisgICAgICAgICAgICBwUmV2ZXJiLCBwYXJhbSwgKihpbnQgKilwVmFsdWUpOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBSZXZlcmJfZ2V0UGFyYW1ldGVyICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiX3NldFBhcmFtZXRlcigpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBTZXQgYSBSZXZlcmIgcGFyYW1ldGVyCisgKgorICogSW5wdXRzOgorICogIHBSZXZlcmIgICAgICAgLSBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorICogIHBhcmFtICAgICAgICAgLSBwYXJhbWV0ZXIKKyAqICBwVmFsdWUgICAgICAgIC0gcG9pbnRlciB0byBwYXJhbWV0ZXIgdmFsdWUKKyAqICBzaXplICAgICAgICAgIC0gdmFsdWUgc2l6ZQorICoKKyAqIE91dHB1dHM6CisgKgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdm9pZCAqcFZhbHVlKSB7CisgICAgaW50MzJfdCB2YWx1ZTMyOworICAgIGludDE2X3QgdmFsdWUxNjsKKyAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7CisgICAgaW50MzJfdCBpOworICAgIGludDMyX3QgdGVtcDsKKyAgICBpbnQzMl90IHRlbXAyOworICAgIHJldmVyYl9wcmVzZXRfdCAqcFByZXNldDsKKyAgICBpbnQgbWF4U2FtcGxlczsKKyAgICBpbnQzMl90IGF2ZXJhZ2VEZWxheTsKKyAgICBzaXplX3QgcGFyYW1TaXplOworCisgICAgTE9HVigiUmV2ZXJiX3NldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJWQsIHZhbHVlMTYgJWQsIHZhbHVlMzIgJWQiLAorICAgICAgICAgICAgcFJldmVyYiwgcGFyYW0sICooaW50MTZfdCAqKXBWYWx1ZSwgKihpbnQzMl90ICopcFZhbHVlKTsKKworICAgIGlmIChwUmV2ZXJiLT5tX1ByZXNldCkgeworICAgICAgICBpZiAocGFyYW0gIT0gUkVWRVJCX1BBUkFNX1BSRVNFVCB8fCBzaXplICE9IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWUxNiA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgTE9HVigic2V0IFJFVkVSQl9QQVJBTV9QUkVTRVQsIHByZXNldCAlZCIsIHZhbHVlMTYpOworICAgICAgICBpZiAodmFsdWUxNiA8IFJFVkVSQl9QUkVTRVRfTk9ORSB8fCB2YWx1ZTE2ID4gUkVWRVJCX1BSRVNFVF9QTEFURSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgLy8gUkVWRVJCX1BSRVNFVF9OT05FIGlzIG1hcHBlZCB0byBieXBhc3MKKyAgICAgICAgaWYgKHZhbHVlMTYgPT0gUkVWRVJCX1BSRVNFVF9OT05FKSB7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX2JCeXBhc3MgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gMDsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fbk5leHRSb29tID0gdmFsdWUxNiAtIDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6CisgICAgICAgICAgICBwYXJhbVNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9CWVBBU1M6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6CisgICAgICAgICAgICBwYXJhbVNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcGFyYW1TaXplID0gc2l6ZW9mKHRfcmV2ZXJiX3NldHRpbmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplICE9IHBhcmFtU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1TaXplID09IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgdmFsdWUxNiA9ICooaW50MTZfdCAqKSBwVmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAocGFyYW1TaXplID09IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgdmFsdWUzMiA9ICooaW50MzJfdCAqKSBwVmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyAqKSBwVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwUHJlc2V0ID0gJnBSZXZlcmItPm1fc1ByZXNldC5tX3NQcmVzZXRbcFJldmVyYi0+bV9uTmV4dFJvb21dOworCisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fQllQQVNTOgorICAgICAgICAgICAgcFJldmVyYi0+bV9iQnlwYXNzID0gKHVpbnQxNl90KXZhbHVlMzI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWw7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgorICAgICAgICAgICAgLy8gQ29udmVydCBtaWxsaWJlbHMgdG8gbGluZWFyIDE2IGJpdCBzaWduZWQgPT4gbV9uUm9vbUxwZkZ3ZAorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHZhbHVlMTYpOworCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25Sb29tTHBmRndkCisgICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHRlbXAsICgzMjc2NyAtIHBSZXZlcmItPm1fblJvb21McGZGYmspKTsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwsIGdhaW4gJWQsIG5ldyBtX25Sb29tTHBmRndkICVkLCBtX25Sb29tTHBmRmJrICVkIiwgdGVtcCwgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCwgcFJldmVyYi0+bV9uUm9vbUxwZkZiayk7CisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPnJvb21IRkxldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKworICAgICAgICAgICAgLy8gTGltaXQgdG8gMCAsIC00MGRCIHJhbmdlIGJlY2F1c2Ugb2YgbG93IHBhc3MgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGlmICh2YWx1ZTE2ID4gMCB8fCB2YWx1ZTE2IDwgLTQwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGF0dGVudWF0aW9uIEAgNTAwMEggZXhwcmVzc2VkIGluIG1pbGxpYmVscyB0byA9PiBtX25Sb29tTHBmRmJrCisgICAgICAgICAgICAvLyBtX25Sb29tTHBmRmJrIGlzIC1hMSB3aGVyZSBhMSBpcyB0aGUgc29sdXRpb24gb2Y6CisgICAgICAgICAgICAvLyBhMV4yICsgMiooQy1kR14yKS8oMS1kR14yKSphMSArIDEgPSAwIHdoZXJlOgorICAgICAgICAgICAgLy8gLSBDIGlzIGNvcygyKnBpKjUwMDAvRnMpIChwUmV2ZXJiLT5tX25Db3NXVF81S0h6KQorICAgICAgICAgICAgLy8gLSBkRyBpcyBHMC9HZiAoRzAgaXMgdGhlIGxpbmVhciBnYWluIGF0IERDIGFuZCBHZiBpcyB0aGUgd2FudGVkIGdhaW4gYXQgNTAwMEh6KQorCisgICAgICAgICAgICAvLyBTYXZlIGN1cnJlbnQgREMgZ2FpbiBtX25Sb29tTHBmRndkIC8gKDMyNzY3IC0gbV9uUm9vbUxwZkZiaykgdG8ga2VlcCBpdCB1bmNoYW5nZWQKKyAgICAgICAgICAgIC8vIHdoaWxlIGNoYW5naW5nIEhGIGxldmVsCisgICAgICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25Sb29tTHBmRndkIDw8IDE1KSAvICgzMjc2NworICAgICAgICAgICAgICAgICAgICAtIHBSZXZlcmItPm1fblJvb21McGZGYmspOworICAgICAgICAgICAgaWYgKHZhbHVlMTYgPT0gMCkgeworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGYmsgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGRHMiwgYiwgZGVsdGE7CisKKyAgICAgICAgICAgICAgICAvLyBkR14yCisgICAgICAgICAgICAgICAgdGVtcCA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih2YWx1ZTE2KTsKKyAgICAgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgSEYgZ2FpbiAlZCIsIHRlbXApOworICAgICAgICAgICAgICAgIHRlbXAgPSAoMSA8PCAzMCkgLyB0ZW1wOworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAxLyBIRiBnYWluICVkIiwgdGVtcCk7CisgICAgICAgICAgICAgICAgZEcyID0gKGludDMyX3QpICgoKGludDY0X3QpIHRlbXAgKiAoaW50NjRfdCkgdGVtcCkgPj4gMTUpOworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCAxLyBIRiBnYWluIF4gMiAlZCIsIGRHMik7CisgICAgICAgICAgICAgICAgLy8gYiA9IDIqKEMtZEdeMikvKDEtZEdeMikKKyAgICAgICAgICAgICAgICBiID0gKGludDMyX3QpICgoKChpbnQ2NF90KSAxIDw8ICgxNSArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgKiAoKGludDY0X3QpIHBSZXZlcmItPm1fbkNvc1dUXzVLSHogLSAoaW50NjRfdCkgZEcyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gKChpbnQ2NF90KSAzMjc2NyAtIChpbnQ2NF90KSBkRzIpKTsKKworICAgICAgICAgICAgICAgIC8vIGRlbHRhID0gYl4yIC0gNAorICAgICAgICAgICAgICAgIGRlbHRhID0gKGludDMyX3QpICgoKChpbnQ2NF90KSBiICogKGludDY0X3QpIGIpID4+IDE1KSAtICgxIDw8ICgxNQorICAgICAgICAgICAgICAgICAgICAgICAgKyAyKSkpOworCisgICAgICAgICAgICAgICAgTE9HVl9JRihkZWx0YSA+ICgxPDwzMCksICIgZGVsdGEgb3ZlcmZsb3cgJWQiLCBkZWx0YSk7CisKKyAgICAgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCwgZEcyICVkLCBiICVkLCBkZWx0YSAlZCwgbV9uQ29zV1RfNUtIeiAlZCIsIGRHMiwgYiwgZGVsdGEsIHBSZXZlcmItPm1fbkNvc1dUXzVLSHopOworICAgICAgICAgICAgICAgIC8vIG1fblJvb21McGZGYmsgPSAtYTEgPSAtICgtIGIgKyBzcXJ0KGRlbHRhKSkgLyAyCisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9uUm9vbUxwZkZiayA9IChiIC0gRWZmZWN0c19TcXJ0KGRlbHRhKSAqIDE4MSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBvbGcgREMgZ2FpbiAlZCBuZXcgbV9uUm9vbUxwZkZiayAlZCwgb2xkIG1fblJvb21McGZGd2QgJWQiLAorICAgICAgICAgICAgICAgICAgICB0ZW1wMiwgcFJldmVyYi0+bV9uUm9vbUxwZkZiaywgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCk7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGd2QKKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcDIsICgzMjc2NyAtIHBSZXZlcmItPm1fblJvb21McGZGYmspKTsKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMLCBuZXcgbV9uUm9vbUxwZkZ3ZCAlZCIsIHBSZXZlcmItPm1fblJvb21McGZGd2QpOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTMyID0gcFByb3BlcnRpZXMtPmRlY2F5VGltZTsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbWlsbGlzZWNvbmRzIHRvID0+IG1fblJ2YkxwZkZ3ZCAoZnVuY3Rpb24gb2YgbV9uUnZiTHBmRmJrKQorICAgICAgICAgICAgLy8gY29udmVydCBtcyB0byBzYW1wbGVzCisgICAgICAgICAgICB2YWx1ZTMyID0gKHZhbHVlMzIgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpIC8gMTAwMDsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHZhbGlkIGRlY2F5IHRpbWUgcmFuZ2UgYXMgYSBmdW5jdGlvbiBvZiBjdXJyZW50IHJldmVyYiBkZWxheSBhbmQKKyAgICAgICAgICAgIC8vIG1heCBmZWVkIGJhY2sgZ2Fpbi4gTWluIHZhbHVlIDw9PiAtNDBkQiBpbiBvbmUgcGFzcywgTWF4IHZhbHVlIDw9PiBmZWVkYmFjayBnYWluID0gLTEgZEIKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdHRlbnVhdGlvbiBmb3IgZWFjaCByb3VuZCBpbiBsYXRlIHJldmVyYiBnaXZlbiBhIHRvdGFsIGF0dGVudWF0aW9uIG9mIC02MDAwIG1pbGxpYmVscy4KKyAgICAgICAgICAgIC8vIGcgPSAtNjAwMCBkL0RUICwgZyBnYWluIGluIG1pbGxpYmVscywgZCByZXZlcmIgZGVsYXksIERUIGRlY2F5IHRpbWUKKyAgICAgICAgICAgIGF2ZXJhZ2VEZWxheSA9IHBSZXZlcmItPm1fbkxhdGVEZWxheSAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbjsKKyAgICAgICAgICAgIGF2ZXJhZ2VEZWxheSArPSAoKHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCAtIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluKQorICAgICAgICAgICAgICAgICAgICArIChwUmV2ZXJiLT5tX3NBcDEubV96QXBPdXQgLSBwUmV2ZXJiLT5tX3NBcDEubV96QXBJbikpID4+IDE7CisKKyAgICAgICAgICAgIHRlbXAgPSAoLTYwMDAgKiBhdmVyYWdlRGVsYXkpIC8gdmFsdWUzMjsKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9USU1FLCBkZWxheSBzbXBzICVkLCBEVCBzbXBzICVkLCBnYWluIG1CICVkIixhdmVyYWdlRGVsYXksIHZhbHVlMzIsIHRlbXApOworICAgICAgICAgICAgaWYgKHRlbXAgPCAtNDAwMCB8fCB0ZW1wID4gLTEwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGxvdyBwYXNzIGdhaW4gYnkgYWRkaW5nIHJldmVyYiBpbnB1dCBhdHRlbnVhdGlvbiAocFJldmVyYi0+bV9uTGF0ZUdhaW4pIGFuZCBzdWJzdHJhdGluZyBvdXRwdXQKKyAgICAgICAgICAgIC8vIHhmYWRlIGFuZCBzdW0gZ2FpbiAobWF4ICs5ZEIpCisgICAgICAgICAgICB0ZW1wIC09IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyhwUmV2ZXJiLT5tX25MYXRlR2FpbikgKyA5MDA7CisgICAgICAgICAgICB0ZW1wID0gRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KHRlbXApOworCisgICAgICAgICAgICAvLyBEQyBnYWluICh0ZW1wKSA9IGIwIC8gKDEgKyBhMSkgPSBwUmV2ZXJiLT5tX25SdmJMcGZGd2QgLyAoMzI3NjcgLSBwUmV2ZXJiLT5tX25SdmJMcGZGYmspCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25SdmJMcGZGd2QKKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcCwgKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKSk7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9USU1FLCBnYWluICVkLCBuZXcgbV9uUnZiTHBmRndkICVkLCBvbGQgbV9uUnZiTHBmRmJrICVkLCByZXZlcmIgZ2FpbiAlZCIsIHRlbXAsIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCwgcFJldmVyYi0+bV9uUnZiTHBmRmJrLCBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMocFJldmVyYi0+bV9uTGF0ZUdhaW4pKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW87CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKKworICAgICAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIHRvIDEwMDAgYmVjYXVzZSByZXZlcmIgZmlsdGVyIGlzIGxvd3Bhc3Mgb25seQorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPCAxMDAgfHwgdmFsdWUxNiA+IDEwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byA9PiBtX25McGZGd2QsIG1fbkxwZkZiaworCisgICAgICAgICAgICAvLyBTYXZlIGN1cnJlbnQgREMgZ2FpbiBtX25Sb29tTHBmRndkIC8gKDMyNzY3IC0gbV9uUm9vbUxwZkZiaykgdG8ga2VlcCBpdCB1bmNoYW5nZWQKKyAgICAgICAgICAgIC8vIHdoaWxlIGNoYW5naW5nIEhGIGxldmVsCisgICAgICAgICAgICB0ZW1wMiA9IChwUmV2ZXJiLT5tX25SdmJMcGZGd2QgPDwgMTUpIC8gKDMyNzY3IC0gcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKKworICAgICAgICAgICAgaWYgKHZhbHVlMTYgPT0gMTAwMCkgeworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZiayA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDMyX3QgZEcyLCBiLCBkZWx0YTsKKworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHModGVtcDIpOworICAgICAgICAgICAgICAgIC8vIEdfNTAwMEh6ID0gR19EQyAqICgxMDAwL1JFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTykgaW4gbWlsbGliZWxzCisKKyAgICAgICAgICAgICAgICB2YWx1ZTMyID0gKChpbnQzMl90KSAxMDAwIDw8IDE1KSAvIChpbnQzMl90KSB2YWx1ZTE2OworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgREMgZ2FpbiAlZCwgREMgZ2FpbiBtQiAlZCwgMTAwMC9SICVkIiwgdGVtcDIsIHRlbXAsIHZhbHVlMzIpOworCisgICAgICAgICAgICAgICAgdGVtcCA9IChpbnQzMl90KSAoKChpbnQ2NF90KSB0ZW1wICogKGludDY0X3QpIHZhbHVlMzIpID4+IDE1KTsKKworICAgICAgICAgICAgICAgIGlmICh0ZW1wIDwgLTQwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPIEhGIGdhaW4gb3ZlcmZsb3cgJWQgbUIiLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IC00MDAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXAgPSBFZmZlY3RzX01pbGxpYmVsc1RvTGluZWFyMTYodGVtcCk7CisgICAgICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPLCBIRiBnYWluICVkIiwgdGVtcCk7CisgICAgICAgICAgICAgICAgLy8gZEdeMgorICAgICAgICAgICAgICAgIHRlbXAgPSAodGVtcDIgPDwgMTUpIC8gdGVtcDsKKyAgICAgICAgICAgICAgICBkRzIgPSAoaW50MzJfdCkgKCgoaW50NjRfdCkgdGVtcCAqIChpbnQ2NF90KSB0ZW1wKSA+PiAxNSk7CisKKyAgICAgICAgICAgICAgICAvLyBiID0gMiooQy1kR14yKS8oMS1kR14yKQorICAgICAgICAgICAgICAgIGIgPSAoaW50MzJfdCkgKCgoKGludDY0X3QpIDEgPDwgKDE1ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAqICgoaW50NjRfdCkgcFJldmVyYi0+bV9uQ29zV1RfNUtIeiAtIChpbnQ2NF90KSBkRzIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLyAoKGludDY0X3QpIDMyNzY3IC0gKGludDY0X3QpIGRHMikpOworCisgICAgICAgICAgICAgICAgLy8gZGVsdGEgPSBiXjIgLSA0CisgICAgICAgICAgICAgICAgZGVsdGEgPSAoaW50MzJfdCkgKCgoKGludDY0X3QpIGIgKiAoaW50NjRfdCkgYikgPj4gMTUpIC0gKDEgPDwgKDE1CisgICAgICAgICAgICAgICAgICAgICAgICArIDIpKSk7CisKKyAgICAgICAgICAgICAgICAvLyBtX25Sb29tTHBmRmJrID0gLWExID0gLSAoLSBiICsgc3FydChkZWx0YSkpIC8gMgorICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZiayA9IChiIC0gRWZmZWN0c19TcXJ0KGRlbHRhKSAqIDE4MSkgPj4gMTsKKworICAgICAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgZEcyICVkLCBiICVkLCBkZWx0YSAlZCIsIGRHMiwgYiwgZGVsdGEpOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTywgZ2FpbiAlZCwgbV9uUnZiTHBmRmJrICVkLCBtX25SdmJMcGZGd2QgJWQiLCB0ZW1wMiwgcFJldmVyYi0+bV9uUnZiTHBmRmJrLCBwUmV2ZXJiLT5tX25SdmJMcGZGd2QpOworCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25SdmJMcGZGd2QKKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEodGVtcDIsICgzMjc2NyAtIHBSZXZlcmItPm1fblJ2YkxwZkZiaykpOworCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0xldmVsOworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6CisgICAgICAgICAgICAvLyBXZSBsaW1pdCBtYXggdmFsdWUgdG8gMCBiZWNhdXNlIGdhaW4gaXMgbGltaXRlZCB0byAwZEIKKyAgICAgICAgICAgIGlmICh2YWx1ZTE2ID4gMCB8fCB2YWx1ZTE2IDwgLTYwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbWlsbGliZWxzIHRvIGxpbmVhciAxNiBiaXQgc2lnbmVkIGFuZCByZWNvbXB1dGUgbV9zRWFybHlMLm1fbkdhaW5baV0gYW5kIG1fc0Vhcmx5Ui5tX25HYWluW2ldLgorICAgICAgICAgICAgdmFsdWUxNiA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih2YWx1ZTE2KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlMLm1fbkdhaW5baV0KKyAgICAgICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluW2ldLHZhbHVlMTYpOworICAgICAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5Ui5tX25HYWluW2ldCisgICAgICAgICAgICAgICAgICAgICAgICA9IE1VTFRfRUcxX0VHMShwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpbltpXSx2YWx1ZTE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkVhcmx5R2FpbiA9IHZhbHVlMTY7CisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwsIG1fbkVhcmx5R2FpbiAlZCIsIHBSZXZlcmItPm1fbkVhcmx5R2Fpbik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTMyID0gcFByb3BlcnRpZXMtPnJlZmxlY3Rpb25zRGVsYXk7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKKyAgICAgICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSBNQVhfRUFSTFlfVElNRQorICAgICAgICAgICAgLy8gY29udmVydCBtcyB0byB0aW1lIHVuaXRzCisgICAgICAgICAgICB0ZW1wID0gKHZhbHVlMzIgKiA2NTUzNikgLyAxMDAwOworICAgICAgICAgICAgaWYgKHRlbXAgPCAwIHx8IHRlbXAgPiBNQVhfRUFSTFlfVElNRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICAgICAgbWF4U2FtcGxlcyA9IChpbnQzMl90KSAoTUFYX0VBUkxZX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgICAgID4+IDE2OworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSB0ZW1wICsgKCgoaW50MzJfdCkgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5W2ldCisgICAgICAgICAgICAgICAgICAgICAgICAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTYpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wMiA+IG1heFNhbXBsZXMpCisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gbWF4U2FtcGxlczsKKyAgICAgICAgICAgICAgICBwUmV2ZXJiLT5tX3NFYXJseUwubV96RGVsYXlbaV0gPSBwUmV2ZXJiLT5tX25FYXJseTBpbiArIHRlbXAyOworICAgICAgICAgICAgICAgIHRlbXAyID0gdGVtcCArICgoKGludDMyX3QpIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2KTsKKyAgICAgICAgICAgICAgICBpZiAodGVtcDIgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IG1heFNhbXBsZXM7CisgICAgICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlSLm1fekRlbGF5W2ldID0gcFJldmVyYi0+bV9uRWFybHkxaW4gKyB0ZW1wMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkVhcmx5RGVsYXkgPSB0ZW1wOworCisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVksIG1fbkVhcmx5RGVsYXkgc21wcyAlZCBtYXggc21wIGRlbGF5ICVkIiwgcFJldmVyYi0+bV9uRWFybHlEZWxheSwgbWF4U2FtcGxlcyk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbWlsbGlzZWNvbmRzIHRvIHNhbXBsZSBjb3VudCA9PiBtX25FYXJseURlbGF5CisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0RFTEFZKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbDsKKyAgICAgICAgICAgIC8qIEZBTEwgVEhST1VHSCAqLworCisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgICAgIC8vIFdlIGxpbWl0IG1heCB2YWx1ZSB0byAwIGJlY2F1c2UgZ2FpbiBpcyBsaW1pdGVkIHRvIDBkQgorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPiAwIHx8IHZhbHVlMTYgPCAtNjAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbWlsbGliZWxzIHRvIGxpbmVhciAxNiBiaXRzIChnYW5nZSAwIC0gODE5MSkgPT4gbV9uTGF0ZUdhaW4uCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25MYXRlR2FpbiA9IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNih2YWx1ZTE2KSA+PiAyOworCisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMLCBtX25MYXRlR2FpbiAlZCIsIHBSZXZlcmItPm1fbkxhdGVHYWluKTsKKworICAgICAgICAgICAgaWYgKHBhcmFtID09IFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB2YWx1ZTMyID0gcFByb3BlcnRpZXMtPnJldmVyYkRlbGF5OworICAgICAgICAgICAgLyogRkFMTCBUSFJPVUdIICovCisKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgLy8gV2UgbGltaXQgbWF4IHZhbHVlIHRvIE1BWF9ERUxBWV9USU1FCisgICAgICAgICAgICAvLyBjb252ZXJ0IG1zIHRvIHRpbWUgdW5pdHMKKyAgICAgICAgICAgIHRlbXAgPSAodmFsdWUzMiAqIDY1NTM2KSAvIDEwMDA7CisgICAgICAgICAgICBpZiAodGVtcCA8IDAgfHwgdGVtcCA+IE1BWF9ERUxBWV9USU1FKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICBtYXhTYW1wbGVzID0gKGludDMyX3QpIChNQVhfREVMQVlfVElNRSAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgPj4gMTY7CisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICAgICAgaWYgKCh0ZW1wICsgcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uKSA+IG1heFNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gbWF4U2FtcGxlcyAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZW1wIDwgcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uKSB7CisgICAgICAgICAgICAgICAgdGVtcCA9IHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcCAtPSBwUmV2ZXJiLT5tX25MYXRlRGVsYXk7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX25EZWxheTBPdXQgKz0gdGVtcDsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5MU91dCArPSB0ZW1wOworICAgICAgICAgICAgcFJldmVyYi0+bV9uTGF0ZURlbGF5ICs9IHRlbXA7CisKKyAgICAgICAgICAgIExPR1YoIlJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVksIG1fbkxhdGVEZWxheSBzbXBzICVkIG1heCBzbXAgZGVsYXkgJWQiLCBwUmV2ZXJiLT5tX25MYXRlRGVsYXksIG1heFNhbXBsZXMpOworCisgICAgICAgICAgICAvLyBDb252ZXJ0IG1pbGxpc2Vjb25kcyB0byBzYW1wbGUgY291bnQgPT4gbV9uRGVsYXkxT3V0ICsgbV9uTWF4RXhjdXJzaW9uCisgICAgICAgICAgICBpZiAocGFyYW0gPT0gUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgdmFsdWUxNiA9IHBQcm9wZXJ0aWVzLT5kaWZmdXNpb247CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ESUZGVVNJT046CisgICAgICAgICAgICBpZiAodmFsdWUxNiA8IDAgfHwgdmFsdWUxNiA+IDEwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgcGVyIG1pbGxlIHRvIG1fc0FwMC5tX25BcEdhaW4sIG1fc0FwMS5tX25BcEdhaW4KKyAgICAgICAgICAgIHBSZXZlcmItPm1fc0FwMC5tX25BcEdhaW4gPSBBUDBfR0FJTl9CQVNFICsgKChpbnQzMl90KSB2YWx1ZTE2CisgICAgICAgICAgICAgICAgICAgICogQVAwX0dBSU5fUkFOR0UpIC8gMTAwMDsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fc0FwMS5tX25BcEdhaW4gPSBBUDFfR0FJTl9CQVNFICsgKChpbnQzMl90KSB2YWx1ZTE2CisgICAgICAgICAgICAgICAgICAgICogQVAxX0dBSU5fUkFOR0UpIC8gMTAwMDsKKworICAgICAgICAgICAgTE9HVigiUkVWRVJCX1BBUkFNX0RJRkZVU0lPTiwgbV9zQXAwLm1fbkFwR2FpbiAlZCBtX3NBcDEubV9uQXBHYWluICVkIiwgcFJldmVyYi0+bV9zQXAwLm1fbkFwR2FpbiwgcFJldmVyYi0+bV9zQXAxLm1fbkFwR2Fpbik7CisKKyAgICAgICAgICAgIGlmIChwYXJhbSA9PSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB2YWx1ZTE2ID0gcFByb3BlcnRpZXMtPmRlbnNpdHk7CisgICAgICAgICAgICAvKiBGQUxMIFRIUk9VR0ggKi8KKworICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgorICAgICAgICAgICAgaWYgKHZhbHVlMTYgPCAwIHx8IHZhbHVlMTYgPiAxMDAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAvLyBDb252ZXJ0IHBlciBtaWxsZSB0byBtX3NBcDAubV96QXBPdXQsIG1fc0FwMS5tX3pBcE91dAorICAgICAgICAgICAgbWF4U2FtcGxlcyA9IChpbnQzMl90KSAoTUFYX0FQX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworCisgICAgICAgICAgICB0ZW1wID0gQVAwX1RJTUVfQkFTRSArICgoaW50MzJfdCkgdmFsdWUxNiAqIEFQMF9USU1FX1JBTkdFKSAvIDEwMDA7CisgICAgICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgICAgICBpZiAodGVtcCA+IG1heFNhbXBsZXMpCisgICAgICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7CisgICAgICAgICAgICBwUmV2ZXJiLT5tX3NBcDAubV96QXBPdXQgPSAodWludDE2X3QpIChwUmV2ZXJiLT5tX3NBcDAubV96QXBJbiArIHRlbXApOworCisgICAgICAgICAgICBMT0dWKCJSRVZFUkJfUEFSQU1fREVOU0lUWSwgQXAwIGRlbGF5IHNtcHMgJWQiLCB0ZW1wKTsKKworICAgICAgICAgICAgdGVtcCA9IEFQMV9USU1FX0JBU0UgKyAoKGludDMyX3QpIHZhbHVlMTYgKiBBUDFfVElNRV9SQU5HRSkgLyAxMDAwOworICAgICAgICAgICAgLypsaW50IC1lezcwMn0gc2hpZnQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgICAgIHRlbXAgPSBtYXhTYW1wbGVzOworICAgICAgICAgICAgcFJldmVyYi0+bV9zQXAxLm1fekFwT3V0ID0gKHVpbnQxNl90KSAocFJldmVyYi0+bV9zQXAxLm1fekFwSW4gKyB0ZW1wKTsKKworICAgICAgICAgICAgTE9HVigiQXAxIGRlbGF5IHNtcHMgJWQiLCB0ZW1wKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBSZXZlcmJfc2V0UGFyYW1ldGVyICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiVXBkYXRlWGZhZGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIFVwZGF0ZSB0aGUgeGZhZGUgcGFyYW1ldGVycyBhcyByZXF1aXJlZAorICoKKyAqIElucHV0czoKKyAqIG5OdW1TYW1wbGVzVG9BZGQgLSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSB0byBidWZmZXIKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtIHhmYWRlIHBhcmFtZXRlcnMgd2lsbCBiZSBjaGFuZ2VkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBpbnQgUmV2ZXJiVXBkYXRlWGZhZGUocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQgbk51bVNhbXBsZXNUb0FkZCkgeworICAgIHVpbnQxNl90IG5PZmZzZXQ7CisgICAgaW50MTZfdCB0ZW1wQ29zOworICAgIGludDE2X3QgdGVtcFNpbjsKKworICAgIGlmIChwUmV2ZXJiLT5tX25YZmFkZUNvdW50ZXIgPj0gcFJldmVyYi0+bV9uWGZhZGVJbnRlcnZhbCkgeworICAgICAgICAvKiB1cGRhdGUgaW50ZXJ2YWwgaGFzIGVsYXBzZWQsIHNvIHJlc2V0IGNvdW50ZXIgKi8KKyAgICAgICAgcFJldmVyYi0+bV9uWGZhZGVDb3VudGVyID0gMDsKKworICAgICAgICAvLyBQaW4gdGhlIHNpbixjb3MgdmFsdWVzIHRvIG1pbiAvIG1heCB2YWx1ZXMgdG8gZW5zdXJlIHRoYXQgdGhlCisgICAgICAgIC8vIG1vZHVsYXRlZCB0YXBzJyBjb2VmcyBhcmUgemVybyAodGh1cyBubyBjbGlja3MpCisgICAgICAgIGlmIChwUmV2ZXJiLT5tX25QaGFzZUluY3JlbWVudCA+IDApIHsKKyAgICAgICAgICAgIC8vIGlmIHBoYXNlIGluY3JlbWVudCA+IDAsIHRoZW4gc2luIC0+IDEsIGNvcyAtPiAwCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25TaW4gPSAzMjc2NzsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fbkNvcyA9IDA7CisKKyAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwaGFzZSB0byBtYXRjaCB0aGUgc2luLCBjb3MgdmFsdWVzCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25QaGFzZSA9IDMyNzY3OworCisgICAgICAgICAgICAvLyBtb2R1bGF0ZSB0aGUgY3Jvc3MgdGFwcyBiZWNhdXNlIHRoZWlyIHRhcCBjb2VmcyBhcmUgemVybworICAgICAgICAgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgICAgICAgICBwUmV2ZXJiLT5tX3pEMUNyb3NzID0gcFJldmVyYi0+bV9uRGVsYXkxT3V0CisgICAgICAgICAgICAgICAgICAgIC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uICsgbk9mZnNldDsKKworICAgICAgICAgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgICAgICAgICBwUmV2ZXJiLT5tX3pEMENyb3NzID0gcFJldmVyYi0+bV9uRGVsYXkwT3V0CisgICAgICAgICAgICAgICAgICAgIC0gcFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uIC0gbk9mZnNldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHBoYXNlIGluY3JlbWVudCA8IDAsIHRoZW4gc2luIC0+IDAsIGNvcyAtPiAxCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25TaW4gPSAwOworICAgICAgICAgICAgcFJldmVyYi0+bV9uQ29zID0gMzI3Njc7CisKKyAgICAgICAgICAgIC8vIHJlc2V0IHRoZSBwaGFzZSB0byBtYXRjaCB0aGUgc2luLCBjb3MgdmFsdWVzCisgICAgICAgICAgICBwUmV2ZXJiLT5tX25QaGFzZSA9IC0zMjc2ODsKKworICAgICAgICAgICAgLy8gbW9kdWxhdGUgdGhlIHNlbGYgdGFwcyBiZWNhdXNlIHRoZWlyIHRhcCBjb2VmcyBhcmUgemVybworICAgICAgICAgICAgbk9mZnNldCA9IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHBSZXZlcmIpOworCisgICAgICAgICAgICBwUmV2ZXJiLT5tX3pEMFNlbGYgPSBwUmV2ZXJiLT5tX25EZWxheTBPdXQKKyAgICAgICAgICAgICAgICAgICAgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24gLSBuT2Zmc2V0OworCisgICAgICAgICAgICBuT2Zmc2V0ID0gUmV2ZXJiQ2FsY3VsYXRlTm9pc2UocFJldmVyYik7CisKKyAgICAgICAgICAgIHBSZXZlcmItPm1fekQxU2VsZiA9IHBSZXZlcmItPm1fbkRlbGF5MU91dAorICAgICAgICAgICAgICAgICAgICAtIHBSZXZlcmItPm1fbk1heEV4Y3Vyc2lvbiArIG5PZmZzZXQ7CisKKyAgICAgICAgfSAvLyBlbmQgaWYtZWxzZSAocFJldmVyYi0+bV9uUGhhc2VJbmNyZW1lbnQgPiAwKQorCisgICAgICAgIC8vIFJldmVyc2UgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc2luLGNvcyBzbyB0aGF0IHRoZQorICAgICAgICAvLyB0YXAgd2hvc2UgY29lZiB3YXMgcHJldmlvdXNseSBpbmNyZWFzaW5nIG5vdyBkZWNyZWFzZXMKKyAgICAgICAgLy8gYW5kIHZpY2UgdmVyc2EKKyAgICAgICAgcFJldmVyYi0+bV9uUGhhc2VJbmNyZW1lbnQgPSAtcFJldmVyYi0+bV9uUGhhc2VJbmNyZW1lbnQ7CisKKyAgICB9IC8vIGVuZCBpZiBjb3VudGVyID49IHVwZGF0ZSBpbnRlcnZhbAorCisgICAgLy9jb21wdXRlIHdoYXQgcGhhc2Ugd2lsbCBiZSBuZXh0IHRpbWUKKyAgICBwUmV2ZXJiLT5tX25QaGFzZSArPSBwUmV2ZXJiLT5tX25QaGFzZUluY3JlbWVudDsKKworICAgIC8vY2FsY3VsYXRlIHdoYXQgdGhlIG5ldyBzaW4gYW5kIGNvcyBuZWVkIHRvIHJlYWNoIGJ5IHRoZSBuZXh0IHVwZGF0ZQorICAgIFJldmVyYkNhbGN1bGF0ZVNpbkNvcyhwUmV2ZXJiLT5tX25QaGFzZSwgJnRlbXBTaW4sICZ0ZW1wQ29zKTsKKworICAgIC8vY2FsY3VsYXRlIHRoZSBwZXItc2FtcGxlIGluY3JlbWVudCByZXF1aXJlZCB0byBnZXQgdGhlcmUgYnkgdGhlIG5leHQgdXBkYXRlCisgICAgLypsaW50IC1lezcwMn0gc2hpZnQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgcFJldmVyYi0+bV9uU2luSW5jcmVtZW50ID0gKHRlbXBTaW4gLSBwUmV2ZXJiLT5tX25TaW4pCisgICAgICAgICAgICA+PiBwUmV2ZXJiLT5tX25VcGRhdGVQZXJpb2RJbkJpdHM7CisKKyAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICBwUmV2ZXJiLT5tX25Db3NJbmNyZW1lbnQgPSAodGVtcENvcyAtIHBSZXZlcmItPm1fbkNvcykKKyAgICAgICAgICAgID4+IHBSZXZlcmItPm1fblVwZGF0ZVBlcmlvZEluQml0czsKKworICAgIC8qIGluY3JlbWVudCB1cGRhdGUgY291bnRlciAqLworICAgIHBSZXZlcmItPm1fblhmYWRlQ291bnRlciArPSAodWludDE2X3QpIG5OdW1TYW1wbGVzVG9BZGQ7CisKKyAgICByZXR1cm4gMDsKKworfSAvKiBlbmQgUmV2ZXJiVXBkYXRlWGZhZGUgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJDYWxjdWxhdGVOb2lzZQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogQ2FsY3VsYXRlIGEgbm9pc2Ugc2FtcGxlIGFuZCBsaW1pdCBpdHMgdmFsdWUKKyAqCisgKiBJbnB1dHM6CisgKiBuTWF4RXhjdXJzaW9uIC0gbm9pc2UgdmFsdWUgaXMgbGltaXRlZCB0byB0aGlzIHZhbHVlCisgKiBwbk5vaXNlIC0gcmV0dXJuIG5ldyBub2lzZSBzYW1wbGUgaW4gdGhpcyAobm90IGxpbWl0ZWQpCisgKgorICogT3V0cHV0czoKKyAqIG5ldyBsaW1pdGVkIG5vaXNlIHZhbHVlCisgKgorICogU2lkZSBFZmZlY3RzOgorICogLSAqcG5Ob2lzZSBub2lzZSB2YWx1ZSBpcyB1cGRhdGVkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0YXRpYyB1aW50MTZfdCBSZXZlcmJDYWxjdWxhdGVOb2lzZShyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIpIHsKKyAgICBpbnQxNl90IG5Ob2lzZSA9IHBSZXZlcmItPm1fbk5vaXNlOworCisgICAgLy8gY2FsY3VsYXRlIG5ldyBub2lzZSB2YWx1ZQorICAgIGlmIChwUmV2ZXJiLT5tX2JVc2VOb2lzZSkgeworICAgICAgICBuTm9pc2UgPSAoaW50MTZfdCkgKG5Ob2lzZSAqIDUgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBuTm9pc2UgPSAwOworICAgIH0KKworICAgIHBSZXZlcmItPm1fbk5vaXNlID0gbk5vaXNlOworICAgIC8vIHJldHVybiB0aGUgbGltaXRlZCBub2lzZSB2YWx1ZQorICAgIHJldHVybiAocFJldmVyYi0+bV9uTWF4RXhjdXJzaW9uICYgbk5vaXNlKTsKKworfSAvKiBlbmQgUmV2ZXJiQ2FsY3VsYXRlTm9pc2UgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJDYWxjdWxhdGVTaW5Db3MKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIENhbGN1bGF0ZSBhIG5ldyBzaW4gYW5kIGNvc2luZSB2YWx1ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGhhc2UKKyAqCisgKiBJbnB1dHM6CisgKiBuUGhhc2UgICAtIHBoYXNlIGFuZ2xlCisgKiBwblNpbiAgICAtIGlucHV0IG9sZCB2YWx1ZSwgb3V0cHV0IG5ldyB2YWx1ZQorICogcG5Db3MgICAgLSBpbnB1dCBvbGQgdmFsdWUsIG91dHB1dCBuZXcgdmFsdWUKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqIC0gKnBuU2luLCAqcG5Db3MgYXJlIHVwZGF0ZWQKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBSZXZlcmJDYWxjdWxhdGVTaW5Db3MoaW50MTZfdCBuUGhhc2UsIGludDE2X3QgKnBuU2luLCBpbnQxNl90ICpwbkNvcykgeworICAgIGludDMyX3QgblRlbXA7CisgICAgaW50MzJfdCBuTmV0QW5nbGU7CisKKyAgICAvLyAgLTEgPD0gIG5QaGFzZSAgPCAxCisgICAgLy8gSG93ZXZlciwgZm9yIHRoZSBjYWxjdWxhdGlvbiwgd2UgbmVlZCBhIHZhbHVlCisgICAgLy8gdGhhdCByYW5nZXMgZnJvbSAtMS8yIHRvICsxLzIsIHNvIGRpdmlkZSB0aGUgcGhhc2UgYnkgMgorICAgIC8qbGludCAtZXs3MDJ9IHNoaWZ0IGZvciBwZXJmb3JtYW5jZSAqLworICAgIG5OZXRBbmdsZSA9IG5QaGFzZSA+PiAxOworCisgICAgLyoKKyAgICAgSW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAgc2luKHgpID0gKDItNCpjKSp4XjIgKyBjICsgeAorICAgICBjb3MoeCkgPSAoMi00KmMpKnheMiArIGMgLSB4CisKKyAgICAgd2hlcmUgIGMgPSAxL3NxcnQoMikKKyAgICAgdXNpbmcgdGhlIGEwICsgeCooYTEgKyB4KmEyKSBhcHByb2FjaAorICAgICAqLworCisgICAgLyogbGltaXQgdGhlIGlucHV0ICJhbmdsZSIgdG8gYmUgYmV0d2VlbiAtMC41IGFuZCArMC41ICovCisgICAgaWYgKG5OZXRBbmdsZSA+IEVHMV9IQUxGKSB7CisgICAgICAgIG5OZXRBbmdsZSA9IEVHMV9IQUxGOworICAgIH0gZWxzZSBpZiAobk5ldEFuZ2xlIDwgRUcxX01JTlVTX0hBTEYpIHsKKyAgICAgICAgbk5ldEFuZ2xlID0gRUcxX01JTlVTX0hBTEY7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIHNpbiAqLworICAgIG5UZW1wID0gRUcxX09ORSArIE1VTFRfRUcxX0VHMShSRVZFUkJfUEFOX0cyLCBuTmV0QW5nbGUpOworICAgIG5UZW1wID0gUkVWRVJCX1BBTl9HMCArIE1VTFRfRUcxX0VHMShuVGVtcCwgbk5ldEFuZ2xlKTsKKyAgICAqcG5TaW4gPSAoaW50MTZfdCkgU0FUVVJBVEVfRUcxKG5UZW1wKTsKKworICAgIC8qIGNhbGN1bGF0ZSBjb3MgKi8KKyAgICBuVGVtcCA9IC1FRzFfT05FICsgTVVMVF9FRzFfRUcxKFJFVkVSQl9QQU5fRzIsIG5OZXRBbmdsZSk7CisgICAgblRlbXAgPSBSRVZFUkJfUEFOX0cwICsgTVVMVF9FRzFfRUcxKG5UZW1wLCBuTmV0QW5nbGUpOworICAgICpwbkNvcyA9IChpbnQxNl90KSBTQVRVUkFURV9FRzEoblRlbXApOworCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBSZXZlcmJDYWxjdWxhdGVTaW5Db3MgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmIKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIGFwcGx5IHJldmVyYiB0byB0aGUgZ2l2ZW4gc2lnbmFsCisgKgorICogSW5wdXRzOgorICogbk51CisgKiBwblNpbiAgICAtIGlucHV0IG9sZCB2YWx1ZSwgb3V0cHV0IG5ldyB2YWx1ZQorICogcG5Db3MgICAgLSBpbnB1dCBvbGQgdmFsdWUsIG91dHB1dCBuZXcgdmFsdWUKKyAqCisgKiBPdXRwdXRzOgorICogbnVtYmVyIG9mIHNhbXBsZXMgYWN0dWFsbHkgcmV2ZXJiZXJhdGVkCisgKgorICogU2lkZSBFZmZlY3RzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IFJldmVyYihyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludCBuTnVtU2FtcGxlc1RvQWRkLAorICAgICAgICBzaG9ydCAqcE91dHB1dEJ1ZmZlciwgc2hvcnQgKnBJbnB1dEJ1ZmZlcikgeworICAgIGludDMyX3QgaTsKKyAgICBpbnQzMl90IG5EZWxheU91dDA7CisgICAgaW50MzJfdCBuRGVsYXlPdXQxOworICAgIHVpbnQxNl90IG5CYXNlOworCisgICAgdWludDMyX3QgbkFkZHI7CisgICAgaW50MzJfdCBuVGVtcDE7CisgICAgaW50MzJfdCBuVGVtcDI7CisgICAgaW50MzJfdCBuQXBJbjsKKyAgICBpbnQzMl90IG5BcE91dDsKKworICAgIGludDMyX3QgajsKKyAgICBpbnQzMl90IG5FYXJseU91dDsKKworICAgIGludDMyX3QgdGVtcFZhbHVlOworCisgICAgLy8gZ2V0IHRoZSBiYXNlIGFkZHJlc3MKKyAgICBuQmFzZSA9IHBSZXZlcmItPm1fbkJhc2VJbmRleDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuTnVtU2FtcGxlc1RvQWRkOyBpKyspIHsKKyAgICAgICAgLy8gKioqKioqKioqKiBMZWZ0IEFsbHBhc3MgLSBzdGFydAorICAgICAgICBuQXBJbiA9ICpwSW5wdXRCdWZmZXI7CisgICAgICAgIGlmICghcFJldmVyYi0+bV9BdXgpIHsKKyAgICAgICAgICAgIHBJbnB1dEJ1ZmZlcisrOworICAgICAgICB9CisgICAgICAgIC8vIHN0b3JlIHRvIGVhcmx5IGRlbGF5IGxpbmUKKyAgICAgICAgbkFkZHIgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV9uRWFybHkwaW4sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdID0gKHNob3J0KSBuQXBJbjsKKworICAgICAgICAvLyBsZWZ0IGlucHV0ID0gKGxlZnQgZHJ5ICogbV9uTGF0ZUdhaW4pICsgcmlnaHQgZmVlZGJhY2sgZnJvbSBwcmV2aW91cyBwZXJpb2QKKworICAgICAgICBuQXBJbiA9IFNBVFVSQVRFKG5BcEluICsgcFJldmVyYi0+bV9uUmV2RmJrUik7CisgICAgICAgIG5BcEluID0gTVVMVF9FRzFfRUcxKG5BcEluLCBwUmV2ZXJiLT5tX25MYXRlR2Fpbik7CisKKyAgICAgICAgLy8gZmV0Y2ggYWxscGFzcyBkZWxheSBsaW5lIG91dAorICAgICAgICAvL25BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBzQXAwLT5tX3pBcE91dCwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIG5BZGRyCisgICAgICAgICAgICAgICAgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV9zQXAwLm1fekFwT3V0LCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgbkRlbGF5T3V0MCA9IHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl07CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGFsbHBhc3MgZmVlZGZvcndhcmQ7IHN1YnRyYWN0IHRoZSBmZWVkZm9yd2FyZCByZXN1bHQKKyAgICAgICAgblRlbXAxID0gTVVMVF9FRzFfRUcxKG5BcEluLCBwUmV2ZXJiLT5tX3NBcDAubV9uQXBHYWluKTsKKyAgICAgICAgbkFwT3V0ID0gU0FUVVJBVEUobkRlbGF5T3V0MCAtIG5UZW1wMSk7IC8vIGFsbHBhc3Mgb3V0cHV0CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGFsbHBhc3MgZmVlZGJhY2s7IGFkZCB0aGUgZmVlZGJhY2sgcmVzdWx0CisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuQXBPdXQsIHBSZXZlcmItPm1fc0FwMC5tX25BcEdhaW4pOworICAgICAgICBuVGVtcDEgPSBTQVRVUkFURShuQXBJbiArIG5UZW1wMSk7CisKKyAgICAgICAgLy8gaW5qZWN0IGludG8gYWxscGFzcyBkZWxheQorICAgICAgICBuQWRkcgorICAgICAgICAgICAgICAgID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fc0FwMC5tX3pBcEluLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXSA9IChzaG9ydCkgblRlbXAxOworCisgICAgICAgIC8vIGluamVjdCBhbGxwYXNzIG91dHB1dCBpbnRvIGRlbGF5IGxpbmUKKyAgICAgICAgbkFkZHIgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV96RDBJbiwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl0gPSAoc2hvcnQpIG5BcE91dDsKKworICAgICAgICAvLyAqKioqKioqKioqIExlZnQgQWxscGFzcyAtIGVuZAorCisgICAgICAgIC8vICoqKioqKioqKiogUmlnaHQgQWxscGFzcyAtIHN0YXJ0CisgICAgICAgIG5BcEluID0gKCpwSW5wdXRCdWZmZXIrKyk7CisgICAgICAgIC8vIHN0b3JlIHRvIGVhcmx5IGRlbGF5IGxpbmUKKyAgICAgICAgbkFkZHIgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV9uRWFybHkxaW4sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdID0gKHNob3J0KSBuQXBJbjsKKworICAgICAgICAvLyByaWdodCBpbnB1dCA9IChyaWdodCBkcnkgKiBtX25MYXRlR2FpbikgKyBsZWZ0IGZlZWRiYWNrIGZyb20gcHJldmlvdXMgcGVyaW9kCisgICAgICAgIC8qbGludCAtZXs3MDJ9IHVzZSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgbkFwSW4gPSBTQVRVUkFURShuQXBJbiArIHBSZXZlcmItPm1fblJldkZia0wpOworICAgICAgICBuQXBJbiA9IE1VTFRfRUcxX0VHMShuQXBJbiwgcFJldmVyYi0+bV9uTGF0ZUdhaW4pOworCisgICAgICAgIC8vIGZldGNoIGFsbHBhc3MgZGVsYXkgbGluZSBvdXQKKyAgICAgICAgbkFkZHIKKyAgICAgICAgICAgICAgICA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3NBcDEubV96QXBPdXQsIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBuRGVsYXlPdXQxID0gcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgYWxscGFzcyBmZWVkZm9yd2FyZDsgc3VidHJhY3QgdGhlIGZlZWRmb3J3YXJkIHJlc3VsdAorICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkFwSW4sIHBSZXZlcmItPm1fc0FwMS5tX25BcEdhaW4pOworICAgICAgICBuQXBPdXQgPSBTQVRVUkFURShuRGVsYXlPdXQxIC0gblRlbXAxKTsgLy8gYWxscGFzcyBvdXRwdXQKKworICAgICAgICAvLyBjYWxjdWxhdGUgYWxscGFzcyBmZWVkYmFjazsgYWRkIHRoZSBmZWVkYmFjayByZXN1bHQKKyAgICAgICAgblRlbXAxID0gTVVMVF9FRzFfRUcxKG5BcE91dCwgcFJldmVyYi0+bV9zQXAxLm1fbkFwR2Fpbik7CisgICAgICAgIG5UZW1wMSA9IFNBVFVSQVRFKG5BcEluICsgblRlbXAxKTsKKworICAgICAgICAvLyBpbmplY3QgaW50byBhbGxwYXNzIGRlbGF5CisgICAgICAgIG5BZGRyCisgICAgICAgICAgICAgICAgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV9zQXAxLm1fekFwSW4sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdID0gKHNob3J0KSBuVGVtcDE7CisKKyAgICAgICAgLy8gaW5qZWN0IGFsbHBhc3Mgb3V0cHV0IGludG8gZGVsYXkgbGluZQorICAgICAgICBuQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3pEMUluLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXSA9IChzaG9ydCkgbkFwT3V0OworCisgICAgICAgIC8vICoqKioqKioqKiogUmlnaHQgQWxscGFzcyAtIGVuZAorCisgICAgICAgIC8vICoqKioqKioqKiogRDAgb3V0cHV0IC0gc3RhcnQKKyAgICAgICAgLy8gZmV0Y2ggZGVsYXkgbGluZSBzZWxmIG91dAorICAgICAgICBuQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3pEMFNlbGYsIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBuRGVsYXlPdXQwID0gcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZGVsYXkgbGluZSBzZWxmIG91dAorICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MCwgcFJldmVyYi0+bV9uU2luKTsKKworICAgICAgICAvLyBmZXRjaCBkZWxheSBsaW5lIGNyb3NzIG91dAorICAgICAgICBuQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3pEMUNyb3NzLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgbkRlbGF5T3V0MCA9IHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl07CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRlbGF5IGxpbmUgc2VsZiBvdXQKKyAgICAgICAgblRlbXAyID0gTVVMVF9FRzFfRUcxKG5EZWxheU91dDAsIHBSZXZlcmItPm1fbkNvcyk7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIHVuZmlsdGVyZWQgZGVsYXkgb3V0CisgICAgICAgIG5EZWxheU91dDAgPSBTQVRVUkFURShuVGVtcDEgKyBuVGVtcDIpOworCisgICAgICAgIC8vICoqKioqKioqKiogRDAgb3V0cHV0IC0gZW5kCisKKyAgICAgICAgLy8gKioqKioqKioqKiBEMSBvdXRwdXQgLSBzdGFydAorICAgICAgICAvLyBmZXRjaCBkZWxheSBsaW5lIHNlbGYgb3V0CisgICAgICAgIG5BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fekQxU2VsZiwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgIG5EZWxheU91dDEgPSBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkZWxheSBsaW5lIHNlbGYgb3V0CisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQxLCBwUmV2ZXJiLT5tX25TaW4pOworCisgICAgICAgIC8vIGZldGNoIGRlbGF5IGxpbmUgY3Jvc3Mgb3V0CisgICAgICAgIG5BZGRyID0gQ0lSQ1VMQVIobkJhc2UsIHBSZXZlcmItPm1fekQwQ3Jvc3MsIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworICAgICAgICBuRGVsYXlPdXQxID0gcFJldmVyYi0+bV9uRGVsYXlMaW5lW25BZGRyXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZGVsYXkgbGluZSBzZWxmIG91dAorICAgICAgICBuVGVtcDIgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MSwgcFJldmVyYi0+bV9uQ29zKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgdW5maWx0ZXJlZCBkZWxheSBvdXQKKyAgICAgICAgbkRlbGF5T3V0MSA9IFNBVFVSQVRFKG5UZW1wMSArIG5UZW1wMik7CisKKyAgICAgICAgLy8gKioqKioqKioqKiBEMSBvdXRwdXQgLSBlbmQKKworICAgICAgICAvLyAqKioqKioqKioqIG1peGVyIGFuZCBmZWVkYmFjayAtIHN0YXJ0CisgICAgICAgIC8vIHN1bSBpcyBmZWRiYWNrIHRvIHJpZ2h0IGlucHV0IChSICsgTCkKKyAgICAgICAgbkRlbGF5T3V0MCA9IChzaG9ydCkgU0FUVVJBVEUobkRlbGF5T3V0MCArIG5EZWxheU91dDEpOworCisgICAgICAgIC8vIGRpZmZlcmVuY2UgaXMgZmVlZGJhY2sgdG8gbGVmdCBpbnB1dCAoUiAtIEwpCisgICAgICAgIC8qbGludCAtZXs2ODV9IGxpbnQgY29tcGxhaW5zIHRoYXQgaXQgY2FuJ3Qgc2F0dXJhdGUgbmVnYXRpdmUgKi8KKyAgICAgICAgbkRlbGF5T3V0MSA9IChzaG9ydCkgU0FUVVJBVEUobkRlbGF5T3V0MSAtIG5EZWxheU91dDApOworCisgICAgICAgIC8vICoqKioqKioqKiogbWl4ZXIgYW5kIGZlZWRiYWNrIC0gZW5kCisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGxvd3Bhc3MgZmlsdGVyIChtaXhlciBzY2FsZSBmYWN0b3IgaW5jbHVkZWQgaW4gTFBGIGZlZWRmb3J3YXJkKQorICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MCwgcFJldmVyYi0+bV9uUnZiTHBmRndkKTsKKworICAgICAgICBuVGVtcDIgPSBNVUxUX0VHMV9FRzEocFJldmVyYi0+bV9uUmV2RmJrTCwgcFJldmVyYi0+bV9uUnZiTHBmRmJrKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZmlsdGVyZWQgZGVsYXkgb3V0IGFuZCBzaW11bHRhbmVvdXNseSB1cGRhdGUgTFBGIHN0YXRlIHZhcmlhYmxlCisgICAgICAgIC8vIGZpbHRlcmVkIGRlbGF5IG91dHB1dCBpcyBzdG9yZWQgaW4gbV9uUmV2RmJrTAorICAgICAgICBwUmV2ZXJiLT5tX25SZXZGYmtMID0gKHNob3J0KSBTQVRVUkFURShuVGVtcDEgKyBuVGVtcDIpOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBsb3dwYXNzIGZpbHRlciAobWl4ZXIgc2NhbGUgZmFjdG9yIGluY2x1ZGVkIGluIExQRiBmZWVkZm9yd2FyZCkKKyAgICAgICAgblRlbXAxID0gTVVMVF9FRzFfRUcxKG5EZWxheU91dDEsIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCk7CisKKyAgICAgICAgblRlbXAyID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fblJldkZia1IsIHBSZXZlcmItPm1fblJ2YkxwZkZiayk7CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGZpbHRlcmVkIGRlbGF5IG91dCBhbmQgc2ltdWx0YW5lb3VzbHkgdXBkYXRlIExQRiBzdGF0ZSB2YXJpYWJsZQorICAgICAgICAvLyBmaWx0ZXJlZCBkZWxheSBvdXRwdXQgaXMgc3RvcmVkIGluIG1fblJldkZia1IKKyAgICAgICAgcFJldmVyYi0+bV9uUmV2RmJrUiA9IChzaG9ydCkgU0FUVVJBVEUoblRlbXAxICsgblRlbXAyKTsKKworICAgICAgICAvLyAqKioqKioqKioqIHN0YXJ0IGVhcmx5IHJlZmxlY3Rpb24gZ2VuZXJhdG9yLCBsZWZ0CisgICAgICAgIC8vcHNFYXJseSA9ICYocFJldmVyYi0+bV9zRWFybHlMKTsKKworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OUzsgaisrKSB7CisgICAgICAgICAgICAvLyBmZXRjaCBkZWxheSBsaW5lIG91dAorICAgICAgICAgICAgLy9uQWRkciA9IENJUkNVTEFSKG5CYXNlLCBwc0Vhcmx5LT5tX3pEZWxheVtqXSwgcFJldmVyYi0+bV9uQnVmZmVyTWFzayk7CisgICAgICAgICAgICBuQWRkcgorICAgICAgICAgICAgICAgICAgICA9IENJUkNVTEFSKG5CYXNlLCBwUmV2ZXJiLT5tX3NFYXJseUwubV96RGVsYXlbal0sIHBSZXZlcmItPm1fbkJ1ZmZlck1hc2spOworCisgICAgICAgICAgICBuVGVtcDEgPSBwUmV2ZXJiLT5tX25EZWxheUxpbmVbbkFkZHJdOworCisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgcmVmbGVjdGlvbgorICAgICAgICAgICAgLy9uVGVtcDEgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MCwgcHNFYXJseS0+bV9uR2FpbltqXSk7CisgICAgICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEoblRlbXAxLCBwUmV2ZXJiLT5tX3NFYXJseUwubV9uR2FpbltqXSk7CisKKyAgICAgICAgICAgIG5EZWxheU91dDAgPSBTQVRVUkFURShuRGVsYXlPdXQwICsgblRlbXAxKTsKKworICAgICAgICB9IC8vIGVuZCBmb3IgKGo9MDsgaiA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBqKyspCisKKyAgICAgICAgLy8gYXBwbHkgbG93cGFzcyB0byBlYXJseSByZWZsZWN0aW9ucyBhbmQgcmV2ZXJiIG91dHB1dAorICAgICAgICAvL25UZW1wMSA9IE1VTFRfRUcxX0VHMShuRWFybHlPdXQsIHBzRWFybHktPm1fblJ2YkxwZkZ3ZCk7CisgICAgICAgIG5UZW1wMSA9IE1VTFRfRUcxX0VHMShuRGVsYXlPdXQwLCBwUmV2ZXJiLT5tX25Sb29tTHBmRndkKTsKKworICAgICAgICAvL25UZW1wMiA9IE1VTFRfRUcxX0VHMShwc0Vhcmx5LT5tX3pMcGYsIHBzRWFybHktPm1fbkxwZkZiayk7CisgICAgICAgIG5UZW1wMiA9IE1VTFRfRUcxX0VHMShwUmV2ZXJiLT5tX3pPdXRMcGZMLCBwUmV2ZXJiLT5tX25Sb29tTHBmRmJrKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZmlsdGVyZWQgb3V0IGFuZCBzaW11bHRhbmVvdXNseSB1cGRhdGUgTFBGIHN0YXRlIHZhcmlhYmxlCisgICAgICAgIC8vIGZpbHRlcmVkIG91dHB1dCBpcyBzdG9yZWQgaW4gbV96T3V0THBmTAorICAgICAgICBwUmV2ZXJiLT5tX3pPdXRMcGZMID0gKHNob3J0KSBTQVRVUkFURShuVGVtcDEgKyBuVGVtcDIpOworCisgICAgICAgIC8vc3VtIHdpdGggb3V0cHV0IGJ1ZmZlcgorICAgICAgICB0ZW1wVmFsdWUgPSAqcE91dHB1dEJ1ZmZlcjsKKyAgICAgICAgKnBPdXRwdXRCdWZmZXIrKyA9IChzaG9ydCkgU0FUVVJBVEUodGVtcFZhbHVlK3BSZXZlcmItPm1fek91dExwZkwpOworCisgICAgICAgIC8vICoqKioqKioqKiogZW5kIGVhcmx5IHJlZmxlY3Rpb24gZ2VuZXJhdG9yLCBsZWZ0CisKKyAgICAgICAgLy8gKioqKioqKioqKiBzdGFydCBlYXJseSByZWZsZWN0aW9uIGdlbmVyYXRvciwgcmlnaHQKKyAgICAgICAgLy9wc0Vhcmx5ID0gJihwUmV2ZXJiLT5tX3NFYXJseVIpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OUzsgaisrKSB7CisgICAgICAgICAgICAvLyBmZXRjaCBkZWxheSBsaW5lIG91dAorICAgICAgICAgICAgbkFkZHIKKyAgICAgICAgICAgICAgICAgICAgPSBDSVJDVUxBUihuQmFzZSwgcFJldmVyYi0+bV9zRWFybHlSLm1fekRlbGF5W2pdLCBwUmV2ZXJiLT5tX25CdWZmZXJNYXNrKTsKKyAgICAgICAgICAgIG5UZW1wMSA9IHBSZXZlcmItPm1fbkRlbGF5TGluZVtuQWRkcl07CisKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSByZWZsZWN0aW9uCisgICAgICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEoblRlbXAxLCBwUmV2ZXJiLT5tX3NFYXJseVIubV9uR2FpbltqXSk7CisKKyAgICAgICAgICAgIG5EZWxheU91dDEgPSBTQVRVUkFURShuRGVsYXlPdXQxICsgblRlbXAxKTsKKworICAgICAgICB9IC8vIGVuZCBmb3IgKGo9MDsgaiA8IFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TOyBqKyspCisKKyAgICAgICAgLy8gYXBwbHkgbG93cGFzcyB0byBlYXJseSByZWZsZWN0aW9ucworICAgICAgICBuVGVtcDEgPSBNVUxUX0VHMV9FRzEobkRlbGF5T3V0MSwgcFJldmVyYi0+bV9uUm9vbUxwZkZ3ZCk7CisKKyAgICAgICAgblRlbXAyID0gTVVMVF9FRzFfRUcxKHBSZXZlcmItPm1fek91dExwZlIsIHBSZXZlcmItPm1fblJvb21McGZGYmspOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBmaWx0ZXJlZCBvdXQgYW5kIHNpbXVsdGFuZW91c2x5IHVwZGF0ZSBMUEYgc3RhdGUgdmFyaWFibGUKKyAgICAgICAgLy8gZmlsdGVyZWQgb3V0cHV0IGlzIHN0b3JlZCBpbiBtX3pPdXRMcGZSCisgICAgICAgIHBSZXZlcmItPm1fek91dExwZlIgPSAoc2hvcnQpIFNBVFVSQVRFKG5UZW1wMSArIG5UZW1wMik7CisKKyAgICAgICAgLy9zdW0gd2l0aCBvdXRwdXQgYnVmZmVyCisgICAgICAgIHRlbXBWYWx1ZSA9ICpwT3V0cHV0QnVmZmVyOworICAgICAgICAqcE91dHB1dEJ1ZmZlcisrID0gKHNob3J0KSBTQVRVUkFURSh0ZW1wVmFsdWUgKyBwUmV2ZXJiLT5tX3pPdXRMcGZSKTsKKworICAgICAgICAvLyAqKioqKioqKioqIGVuZCBlYXJseSByZWZsZWN0aW9uIGdlbmVyYXRvciwgcmlnaHQKKworICAgICAgICAvLyBkZWNyZW1lbnQgYmFzZSBhZGRyIGZvciBuZXh0IHNhbXBsZSBwZXJpb2QKKyAgICAgICAgbkJhc2UtLTsKKworICAgICAgICBwUmV2ZXJiLT5tX25TaW4gKz0gcFJldmVyYi0+bV9uU2luSW5jcmVtZW50OworICAgICAgICBwUmV2ZXJiLT5tX25Db3MgKz0gcFJldmVyYi0+bV9uQ29zSW5jcmVtZW50OworCisgICAgfSAvLyBlbmQgZm9yIChpPTA7IGkgPCBuTnVtU2FtcGxlc1RvQWRkOyBpKyspCisKKyAgICAvLyBzdG9yZSB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24KKyAgICBwUmV2ZXJiLT5tX25CYXNlSW5kZXggPSBuQmFzZTsKKworICAgIHJldHVybiAwOworfSAvKiBlbmQgUmV2ZXJiICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiVXBkYXRlUm9vbQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogVXBkYXRlIHRoZSByb29tJ3MgcHJlc2V0IHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQKKyAqCisgKiBJbnB1dHM6CisgKgorICogT3V0cHV0czoKKyAqCisgKgorICogU2lkZSBFZmZlY3RzOgorICogLSByZXZlcmIgcGFyYW10ZXJzIChmYmssIGZ3ZCwgZXRjKSB3aWxsIGJlIGNoYW5nZWQKKyAqIC0gbV9uQ3VycmVudFJvb20gOj0gbV9uTmV4dFJvb20KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgaW50IFJldmVyYlVwZGF0ZVJvb20ocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBib29sIGZ1bGxVcGRhdGUpIHsKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWF4U2FtcGxlczsKKyAgICBpbnQgZWFybHlEZWxheTsKKyAgICBpbnQgZWFybHlHYWluOworCisgICAgcmV2ZXJiX3ByZXNldF90ICpwUHJlc2V0ID0KKyAgICAgICAgICAgICZwUmV2ZXJiLT5tX3NQcmVzZXQubV9zUHJlc2V0W3BSZXZlcmItPm1fbk5leHRSb29tXTsKKworICAgIGlmIChmdWxsVXBkYXRlKSB7CisgICAgICAgIHBSZXZlcmItPm1fblJ2YkxwZkZ3ZCA9IHBQcmVzZXQtPm1fblJ2YkxwZkZ3ZDsKKyAgICAgICAgcFJldmVyYi0+bV9uUnZiTHBmRmJrID0gcFByZXNldC0+bV9uUnZiTHBmRmJrOworCisgICAgICAgIHBSZXZlcmItPm1fbkVhcmx5R2FpbiA9IHBQcmVzZXQtPm1fbkVhcmx5R2FpbjsKKyAgICAgICAgLy9zdG9yZWQgYXMgdGltZSBiYXNlZCwgY29udmVydCB0byBzYW1wbGUgYmFzZWQKKyAgICAgICAgcFJldmVyYi0+bV9uTGF0ZUdhaW4gPSBwUHJlc2V0LT5tX25MYXRlR2FpbjsKKyAgICAgICAgcFJldmVyYi0+bV9uUm9vbUxwZkZiayA9IHBQcmVzZXQtPm1fblJvb21McGZGYms7CisgICAgICAgIHBSZXZlcmItPm1fblJvb21McGZGd2QgPSBwUHJlc2V0LT5tX25Sb29tTHBmRndkOworCisgICAgICAgIC8vIHNldCB0aGUgZWFybHkgcmVmbGVjdGlvbnMgZ2FpbnMKKyAgICAgICAgZWFybHlHYWluID0gcFByZXNldC0+bV9uRWFybHlHYWluOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUkVWRVJCX01BWF9OVU1fUkVGTEVDVElPTlM7IGkrKykgeworICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlMLm1fbkdhaW5baV0KKyAgICAgICAgICAgICAgICAgICAgPSBNVUxUX0VHMV9FRzEocFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5baV0sZWFybHlHYWluKTsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5Ui5tX25HYWluW2ldCisgICAgICAgICAgICAgICAgICAgID0gTVVMVF9FRzFfRUcxKHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluW2ldLGVhcmx5R2Fpbik7CisgICAgICAgIH0KKworICAgICAgICBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24gPSBwUHJlc2V0LT5tX25NYXhFeGN1cnNpb247CisKKyAgICAgICAgcFJldmVyYi0+bV9zQXAwLm1fbkFwR2FpbiA9IHBQcmVzZXQtPm1fbkFwMF9BcEdhaW47CisgICAgICAgIHBSZXZlcmItPm1fc0FwMS5tX25BcEdhaW4gPSBwUHJlc2V0LT5tX25BcDFfQXBHYWluOworCisgICAgICAgIC8vIHNldCB0aGUgZWFybHkgcmVmbGVjdGlvbnMgZGVsYXkKKyAgICAgICAgZWFybHlEZWxheSA9ICgoaW50KSBwUHJlc2V0LT5tX25FYXJseURlbGF5ICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgICAgID4+IDE2OworICAgICAgICBwUmV2ZXJiLT5tX25FYXJseURlbGF5ID0gZWFybHlEZWxheTsKKyAgICAgICAgbWF4U2FtcGxlcyA9IChpbnQzMl90KSAoTUFYX0VBUkxZX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgPj4gMTY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICAvL3N0b3JlZCBhcyB0aW1lIGJhc2VkLCBjb252ZXJ0IHRvIHNhbXBsZSBiYXNlZAorICAgICAgICAgICAgdGVtcCA9IGVhcmx5RGVsYXkgKyAoKChpbnQpIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVtpXQorICAgICAgICAgICAgICAgICAgICAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTYpOworICAgICAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgICAgIHRlbXAgPSBtYXhTYW1wbGVzOworICAgICAgICAgICAgcFJldmVyYi0+bV9zRWFybHlMLm1fekRlbGF5W2ldID0gcFJldmVyYi0+bV9uRWFybHkwaW4gKyB0ZW1wOworICAgICAgICAgICAgLy9zdG9yZWQgYXMgdGltZSBiYXNlZCwgY29udmVydCB0byBzYW1wbGUgYmFzZWQKKyAgICAgICAgICAgIHRlbXAgPSBlYXJseURlbGF5ICsgKCgoaW50KSBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbaV0KKyAgICAgICAgICAgICAgICAgICAgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2KTsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gbWF4U2FtcGxlcykKKyAgICAgICAgICAgICAgICB0ZW1wID0gbWF4U2FtcGxlczsKKyAgICAgICAgICAgIHBSZXZlcmItPm1fc0Vhcmx5Ui5tX3pEZWxheVtpXSA9IHBSZXZlcmItPm1fbkVhcmx5MWluICsgdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIG1heFNhbXBsZXMgPSAoaW50MzJfdCkgKE1BWF9ERUxBWV9USU1FICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKQorICAgICAgICAgICAgICAgID4+IDE2OworICAgICAgICAvL3N0b3JlZCBhcyB0aW1lIGJhc2VkLCBjb252ZXJ0IHRvIHNhbXBsZSBiYXNlZAorICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgdGVtcCA9IChwUHJlc2V0LT5tX25MYXRlRGVsYXkgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICBpZiAoKHRlbXAgKyBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb24pID4gbWF4U2FtcGxlcykgeworICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXMgLSBwUmV2ZXJiLT5tX25NYXhFeGN1cnNpb247CisgICAgICAgIH0KKyAgICAgICAgdGVtcCAtPSBwUmV2ZXJiLT5tX25MYXRlRGVsYXk7CisgICAgICAgIHBSZXZlcmItPm1fbkRlbGF5ME91dCArPSB0ZW1wOworICAgICAgICBwUmV2ZXJiLT5tX25EZWxheTFPdXQgKz0gdGVtcDsKKyAgICAgICAgcFJldmVyYi0+bV9uTGF0ZURlbGF5ICs9IHRlbXA7CisKKyAgICAgICAgbWF4U2FtcGxlcyA9IChpbnQzMl90KSAoTUFYX0FQX1RJTUUgKiBwUmV2ZXJiLT5tX25TYW1wbGluZ1JhdGUpID4+IDE2OworICAgICAgICAvL3N0b3JlZCBhcyB0aW1lIGJhc2VkLCBjb252ZXJ0IHRvIGFic29sdXRlIHNhbXBsZSB2YWx1ZQorICAgICAgICB0ZW1wID0gcFByZXNldC0+bV9uQXAwX0FwT3V0OworICAgICAgICAvKmxpbnQgLWV7NzAyfSBzaGlmdCBmb3IgcGVyZm9ybWFuY2UgKi8KKyAgICAgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICAgICAgaWYgKHRlbXAgPiBtYXhTYW1wbGVzKQorICAgICAgICAgICAgdGVtcCA9IG1heFNhbXBsZXM7CisgICAgICAgIHBSZXZlcmItPm1fc0FwMC5tX3pBcE91dCA9ICh1aW50MTZfdCkgKHBSZXZlcmItPm1fc0FwMC5tX3pBcEluICsgdGVtcCk7CisKKyAgICAgICAgLy9zdG9yZWQgYXMgdGltZSBiYXNlZCwgY29udmVydCB0byBhYnNvbHV0ZSBzYW1wbGUgdmFsdWUKKyAgICAgICAgdGVtcCA9IHBQcmVzZXQtPm1fbkFwMV9BcE91dDsKKyAgICAgICAgLypsaW50IC1lezcwMn0gc2hpZnQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgICAgIHRlbXAgPSAodGVtcCAqIHBSZXZlcmItPm1fblNhbXBsaW5nUmF0ZSkgPj4gMTY7CisgICAgICAgIGlmICh0ZW1wID4gbWF4U2FtcGxlcykKKyAgICAgICAgICAgIHRlbXAgPSBtYXhTYW1wbGVzOworICAgICAgICBwUmV2ZXJiLT5tX3NBcDEubV96QXBPdXQgPSAodWludDE2X3QpIChwUmV2ZXJiLT5tX3NBcDEubV96QXBJbiArIHRlbXApOworICAgICAgICAvL2dwc1JldmVyYk9iamVjdC0+bV9zQXAxLm1fekFwT3V0ID0gcFByZXNldC0+bV9uQXAxX0FwT3V0OworICAgIH0KKworICAgIC8vc3RvcmVkIGFzIHRpbWUgYmFzZWQsIGNvbnZlcnQgdG8gc2FtcGxlIGJhc2VkCisgICAgdGVtcCA9IHBQcmVzZXQtPm1fblhmYWRlSW50ZXJ2YWw7CisgICAgLypsaW50IC1lezcwMn0gc2hpZnQgZm9yIHBlcmZvcm1hbmNlICovCisgICAgdGVtcCA9ICh0ZW1wICogcFJldmVyYi0+bV9uU2FtcGxpbmdSYXRlKSA+PiAxNjsKKyAgICBwUmV2ZXJiLT5tX25YZmFkZUludGVydmFsID0gKHVpbnQxNl90KSB0ZW1wOworICAgIC8vZ3NSZXZlcmJPYmplY3QubV9uWGZhZGVJbnRlcnZhbCA9IHBQcmVzZXQtPm1fblhmYWRlSW50ZXJ2YWw7CisgICAgcFJldmVyYi0+bV9uWGZhZGVDb3VudGVyID0gcFJldmVyYi0+bV9uWGZhZGVJbnRlcnZhbCArIDE7IC8vIGZvcmNlIHVwZGF0ZSBvbiBmaXJzdCBpdGVyYXRpb24KKworICAgIHBSZXZlcmItPm1fbkN1cnJlbnRSb29tID0gcFJldmVyYi0+bV9uTmV4dFJvb207CisKKyAgICByZXR1cm4gMDsKKworfSAvKiBlbmQgUmV2ZXJiVXBkYXRlUm9vbSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYlJlYWRJblByZXNldHMoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOiBzZXRzIGdsb2JhbCByZXZlcmIgcHJlc2V0IGJhbmsgdG8gZGVmYXVsdHMKKyAqCisgKiBJbnB1dHM6CisgKgorICogT3V0cHV0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBSZXZlcmJSZWFkSW5QcmVzZXRzKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYikgeworCisgICAgaW50IHByZXNldDsKKworICAgIC8vIHRoaXMgaXMgZm9yIHRlc3Qgb25seS4gT3BlblNMIEVTIHByZXNldHMgYXJlIG1hcHBlZCB0byA0IHByZXNldHMuCisgICAgLy8gUkVWRVJCX1BSRVNFVF9OT05FIGlzIG1hcHBlZCB0byBieXBhc3MKKyAgICBmb3IgKHByZXNldCA9IDA7IHByZXNldCA8IFJFVkVSQl9OVU1fUFJFU0VUUzsgcHJlc2V0KyspIHsKKyAgICAgICAgcmV2ZXJiX3ByZXNldF90ICpwUHJlc2V0ID0gJnBSZXZlcmItPm1fc1ByZXNldC5tX3NQcmVzZXRbcHJlc2V0XTsKKyAgICAgICAgc3dpdGNoIChwcmVzZXQgKyAxKSB7CisgICAgICAgIGNhc2UgUkVWRVJCX1BSRVNFVF9QTEFURToKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX1NNQUxMUk9PTToKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDUwNzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxMTA3NjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjA0NzQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDE0NjI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OworICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDY0NzA7IC8vNjQ4MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcEdhaW4gPSAxNDc2ODsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMF9BcE91dCA9IDc5MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcEdhaW4gPSAxNDc3NzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkFwMV9BcE91dCA9IDExOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTQgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU1ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NiA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTcgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU4ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTEwID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFVkVSQl9QUkVTRVRfTUVESVVNUk9PTToKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX0xBUkdFUk9PTToKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJ2YkxwZkZiayA9IDUwNzc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGd2QgPSAxMjkyMjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5R2FpbiA9IDI3NjkwOworICAgICAgICAgICAgcFByZXNldC0+bV9uRWFybHlEZWxheSA9IDEzMTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlR2FpbiA9IDgxOTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25MYXRlRGVsYXkgPSAzOTMyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZiayA9IDM2OTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25Sb29tTHBmRndkID0gMjE3MDM7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMF0gPSAxMzc2OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMF0gPSAyMjE1MjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsxXSA9IDE0NjI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbM10gPSAxODM1OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bM10gPSAxNDMwNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzBdID0gNzIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMF0gPSAyMDMwNjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsxXSA9IDI2MjE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsxXSA9IDE3NTM3OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzJdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzJdID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbM10gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bM10gPSAxNjE1MzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVs0XSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2Fpbls0XSA9IDEzMzg0OworICAgICAgICAgICAgcFByZXNldC0+bV9uTWF4RXhjdXJzaW9uID0gMTI3OworICAgICAgICAgICAgcFByZXNldC0+bV9uWGZhZGVJbnRlcnZhbCA9IDY0NDk7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBHYWluID0gMTU2OTE7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDBfQXBPdXQgPSA3NzQ7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBHYWluID0gMTYzMTc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25BcDFfQXBPdXQgPSAxMTU1OworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU0ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTYgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU3ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1OCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTkgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnUxMCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEw6CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGYmsgPSA2NDYxOworICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRndkID0gMTQzMDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseUdhaW4gPSAyNzY5MDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5RGVsYXkgPSAxMzExOworICAgICAgICAgICAgcFByZXNldC0+bV9uTGF0ZUdhaW4gPSA4MTkxOworICAgICAgICAgICAgcFByZXNldC0+bV9uTGF0ZURlbGF5ID0gMzkzMjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGYmsgPSAzNjkyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZ3ZCA9IDI0NTY5OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzBdID0gMTM3NjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzBdID0gMjIxNTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMV0gPSAxNDYyOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMV0gPSAxNzUzNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsyXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsyXSA9IDE0NzY4OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzNdID0gMTgzNTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzNdID0gMTQzMDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbNF0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bNF0gPSAxMzM4NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVswXSA9IDcyMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzBdID0gMjAzMDY7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMV0gPSAyNjIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMV0gPSAxNzUzNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsyXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsyXSA9IDE0NzY4OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzNdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzNdID0gMTYxNTM7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbNF0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bNF0gPSAxMzM4NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbk1heEV4Y3Vyc2lvbiA9IDEyNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblhmYWRlSW50ZXJ2YWwgPSA2MzkxOworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwR2FpbiA9IDE1MjMwOworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwT3V0ID0gNzA4OworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwR2FpbiA9IDE1NTQ3OworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwT3V0ID0gMTAyMzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTUgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU2ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NyA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTggPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU5ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1MTAgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BSRVNFVF9MQVJHRUhBTEw6CisgICAgICAgICAgICBwUHJlc2V0LT5tX25SdmJMcGZGYmsgPSA4MzA3OworICAgICAgICAgICAgcFByZXNldC0+bV9uUnZiTHBmRndkID0gMTQ3Njg7CisgICAgICAgICAgICBwUHJlc2V0LT5tX25FYXJseUdhaW4gPSAyNzY5MDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbkVhcmx5RGVsYXkgPSAxMzExOworICAgICAgICAgICAgcFByZXNldC0+bV9uTGF0ZUdhaW4gPSA4MTkxOworICAgICAgICAgICAgcFByZXNldC0+bV9uTGF0ZURlbGF5ID0gMzkzMjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblJvb21McGZGYmsgPSAzNjkyOworICAgICAgICAgICAgcFByZXNldC0+bV9uUm9vbUxwZkZ3ZCA9IDI0NTY5OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzBdID0gMTM3NjsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzBdID0gMjIxNTI7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbMV0gPSAyMTYzOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bMV0gPSAxNzUzNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX3pEZWxheVsyXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV9uR2FpblsyXSA9IDE0NzY4OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fekRlbGF5WzNdID0gMTgzNTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5TC5tX25HYWluWzNdID0gMTQzMDc7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseUwubV96RGVsYXlbNF0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlMLm1fbkdhaW5bNF0gPSAxMzM4NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVswXSA9IDcyMTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzBdID0gMjAzMDY7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbMV0gPSAyNjIxOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bMV0gPSAxNzUzNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX3pEZWxheVsyXSA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV9uR2FpblsyXSA9IDE0NzY4OworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fekRlbGF5WzNdID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fc0Vhcmx5Ui5tX25HYWluWzNdID0gMTYxNTM7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3NFYXJseVIubV96RGVsYXlbNF0gPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9zRWFybHlSLm1fbkdhaW5bNF0gPSAxMzM4NDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fbk1heEV4Y3Vyc2lvbiA9IDEyNzsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fblhmYWRlSW50ZXJ2YWwgPSA2Mzg4OworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwR2FpbiA9IDE1NjkxOworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAwX0FwT3V0ID0gNzExOworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwR2FpbiA9IDE2MzE3OworICAgICAgICAgICAgcFByZXNldC0+bV9uQXAxX0FwT3V0ID0gMTAyOTsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NCA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTUgPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU2ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1NyA9IDA7CisgICAgICAgICAgICBwUHJlc2V0LT5tX3JmdTggPSAwOworICAgICAgICAgICAgcFByZXNldC0+bV9yZnU5ID0gMDsKKyAgICAgICAgICAgIHBQcmVzZXQtPm1fcmZ1MTAgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0UmV2ZXJiLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2QxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdFJldmVyYi5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0VGRkVDVFJFVkVSQl9IXworI2RlZmluZSBBTkRST0lEX0VGRkVDVFJFVkVSQl9IXworCisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0RW52aXJvbm1lbnRhbFJldmVyYkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdFByZXNldFJldmVyYkFwaS5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZWZpbmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKK0NJUkNVTEFSKCkgY2FsY3VsYXRlcyB0aGUgYXJyYXkgaW5kZXggdXNpbmcgbW9kdWxvIGFyaXRobWV0aWMuCitUaGUgInRyaWNrIiBpcyB0aGF0IG1vZHVsbyBhcml0aG1ldGljIGlzIHNpbXBsaWZpZWQgYnkgbWFza2luZwordGhlIGVmZmVjdGl2ZSBhZGRyZXNzIHdoZXJlIHRoZSBtYXNrIGlzICgyXm4pLTEuIFRoaXMgb25seSB3b3JrcworaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGEgcG93ZXIgb2YgdHdvLgorKi8KKyNkZWZpbmUgQ0lSQ1VMQVIoYmFzZSxvZmZzZXQsc2l6ZSkgKHVpbnQzMl90KSggICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShiYXNlKSkgKyAoKGludDMyX3QpKG9mZnNldCkpICAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAmIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworI2RlZmluZSBOVU1fT1VUUFVUX0NIQU5ORUxTIDIKKyNkZWZpbmUgT1VUUFVUX0NIQU5ORUxTIENIQU5ORUxfU1RFUkVPCisKKyNkZWZpbmUgUkVWRVJCX0JVRkZFUl9TSVpFX0lOX1NBTVBMRVNfTUFYICAgMTYzODQKKworI2RlZmluZSBSRVZFUkJfTlVNX1BSRVNFVFMgIFJFVkVSQl9QUkVTRVRfUExBVEUgICAvLyBSRVZFUkJfUFJFU0VUX05PTkUgaXMgbm90IGluY2x1ZGVkCisjZGVmaW5lIFJFVkVSQl9NQVhfTlVNX1JFRkxFQ1RJT05TICAgICAgNSAgIC8vIG1heCBudW0gcmVmbGVjdGlvbnMgcGVyIGNoYW5uZWwKKworCisvLyB4ZmFkZSBwYXJhbWV0ZXJzCisjZGVmaW5lIFJFVkVSQl9YRkFERV9QRVJJT0RfSU5fU0VDT05EUyAgICAgIChkb3VibGUpICgxMDAuMCAvIDEwMDAuMCkgICAgICAgIC8vIHhmYWRlIG9uY2UgZXZlcnkgdGhpcyBtYW55IHNlY29uZHMKKworCisvKioqKioqKioqKi8KKy8qIHRoZSBlbnRpcmUgc3ludGggdXNlcyB2YXJpb3VzIGZsYWdzIGluIGEgYml0IGZpZWxkICovCisKKy8qIGlmIGZsYWcgaXMgc2V0LCBzeW50aCByZXNldCBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgUkVWRVJCX0ZMQUdfUkVTRVRfSVNfUkVRVUVTVEVEICAgICAgICAgIDB4MDEgICAgLyogYml0IDAgKi8KKyNkZWZpbmUgTUFTS19SRVZFUkJfUkVTRVRfSVNfUkVRVUVTVEVEICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTUFTS19SRVZFUkJfUkVTRVRfSVNfTk9UX1JFUVVFU1RFRCAgICAgICh1aW50MzJfdCkofk1BU0tfUkVWRVJCX1JFU0VUX0lTX1JFUVVFU1RFRCkKKworLyoKK2J5IGRlZmF1bHQsIHdlIGFsd2F5cyB3YW50IHRvIHVwZGF0ZSBBTEwgY2hhbm5lbCBwYXJhbWV0ZXJzCit3aGVuIHdlIHJlc2V0IHRoZSBzeW50aCAoZS5nLiwgZHVyaW5nIEdNIE9OKQorKi8KKyNkZWZpbmUgREVGQVVMVF9SRVZFUkJfRkxBR1MgICAgICAgICAgICAgICAgICAgIDB4MAorCisvKiBjb2VmZmljaWVudHMgZm9yIGdlbmVyYXRpbmcgc2luLCBjb3MgKi8KKyNkZWZpbmUgUkVWRVJCX1BBTl9HMiAgIDQyOTQ5NDAxNTEgICAgICAgICAgLyogLTAuODI4NDI3MTI0NzQ2MTkgPSAyIC0gNC9zcXJ0KDIpICovCisvKgoraW50MzJfdCBuUGFuRzEgPSArMS4wIGZvciBzaW4KK2ludDMyX3QgblBhbkcxID0gLTEuMCBmb3IgY29zCisqLworI2RlZmluZSBSRVZFUkJfUEFOX0cwICAgMjMxNzAgICAgICAgICAgICAgICAvKiAwLjcwNzEwNjc4MTE4NjU0NyA9IDEvc3FydCgyKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGRlZmluZSB0aGUgaW5wdXQgaW5qZWN0aW9uIHBvaW50cworI2RlZmluZSBHVUFSRCAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhZmV0eSBndWFyZCBvZiB0aGlzIG1hbnkgc2FtcGxlcworCisjZGVmaW5lIE1BWF9BUF9USU1FICAgICAgICAgKGludCkgKCgyMCo2NTUzNikvMTAwMCkgIC8vIGRlbGF5IHRpbWUgaW4gdGltZSB1bml0cyAoNjU1MzZ0aCBvZiBzZWMpCisjZGVmaW5lIE1BWF9ERUxBWV9USU1FICAgICAgKGludCkgKCg2NSo2NTUzNikvMTAwMCkgIC8vIGRlbGF5IHRpbWUgaW4gdGltZSB1bml0cworI2RlZmluZSBNQVhfRUFSTFlfVElNRSAgICAgIChpbnQpICgoNjUqNjU1MzYpLzEwMDApICAvLyBkZWxheSB0aW1lIGluIHRpbWUgdW5pdHMKKworI2RlZmluZSBBUDBfSU4gICAgICAgICAgICAgIDAKKworCisjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1JPT01fTlVNQkVSICAgICAgMSAgICAgICAvLyBkZWZhdWx0IHByZXNldCBudW1iZXIKKyNkZWZpbmUgREVGQVVMVF9BUDBfR0FJTiAgICAgICAgICAgICAgICAxOTQwMAorI2RlZmluZSBERUZBVUxUX0FQMV9HQUlOICAgICAgICAgICAgICAgIC0xOTQwMAorCisjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1dFVCAgICAgICAgICAgICAgMzI3NjcKKyNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfRFJZICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgUkVWRVJCX1dFVF9NQVggICAgICAgICAgICAgIDMyNzY3CisjZGVmaW5lIFJFVkVSQl9XRVRfTUlOICAgICAgICAgICAgICAwCisjZGVmaW5lIFJFVkVSQl9EUllfTUFYICAgICAgICAgICAgICAzMjc2NworI2RlZmluZSBSRVZFUkJfRFJZX01JTiAgICAgICAgICAgICAgMAorCisvLyBjb25zdGFudHMgZm9yIHJldmVyYiBkZW5zaXR5CisvLyBUaGUgZGVuc2l0eSBleHByZXNzZWQgaW4gcGVybWlsbGVzIGNoYW5nZXMgdGhlIEFsbHBhc3MgZGVsYXkgaW4gYSBsaW5lYXIgbWFubmVyIGluIHRoZSByYW5nZSBkZWZpbmVkIGJ5CisvLyBBUDBfVElNRV9CQVNFIHRvIEFQMF9USU1FX0JBU0UgKyBBUDBfVElNRV9SQU5HRQorI2RlZmluZSBBUDBfVElNRV9CQVNFIChpbnQpKCg5KjY1NTM2KS8xMDAwKQorI2RlZmluZSBBUDBfVElNRV9SQU5HRSAoaW50KSgoNCo2NTUzNikvMTAwMCkKKyNkZWZpbmUgQVAxX1RJTUVfQkFTRSAoaW50KSgoMTIqNjU1MzYpLzEwMDApCisjZGVmaW5lIEFQMV9USU1FX1JBTkdFIChpbnQpKCg4KjY1NTM2KS8xMDAwKQorCisvLyBjb25zdGFudHMgZm9yIHJldmVyYiBkaWZmdXNpb24KKy8vIFRoZSBkaWZmdXNpb24gZXhwcmVzc2VkIGluIHBlcm1pbGxlcyBjaGFuZ2VzIHRoZSBBbGxwYXNzIGdhaW4gaW4gYSBsaW5lYXIgbWFubmVyIGluIHRoZSByYW5nZSBkZWZpbmVkIGJ5CisvLyBBUDBfR0FJTl9CQVNFIHRvIEFQMF9HQUlOX0JBU0UgKyBBUDBfR0FJTl9SQU5HRQorI2RlZmluZSBBUDBfR0FJTl9CQVNFIChpbnQpKDk4MzApCisjZGVmaW5lIEFQMF9HQUlOX1JBTkdFIChpbnQpKDE5NjYwLTk4MzApCisjZGVmaW5lIEFQMV9HQUlOX0JBU0UgKGludCkoNjU1MykKKyNkZWZpbmUgQVAxX0dBSU5fUkFOR0UgKGludCkoMjI5MzYtNjU1MykKKworCitlbnVtIHJldmVyYl9zdGF0ZV9lIHsKKyAgICBSRVZFUkJfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQsCisgICAgUkVWRVJCX1NUQVRFX0FDVElWRSwKK307CisKKy8qIHBhcmFtZXRlcnMgZm9yIGVhY2ggYWxscGFzcyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX3pBcE91dDsgICAgICAgLy8gZGVsYXkgb2Zmc2V0IGZvciBhcCBvdXQKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQXBHYWluOyAgICAgIC8vIGdhaW4gZm9yIGFwCisKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX3pBcEluOyAgICAgICAgLy8gZGVsYXkgb2Zmc2V0IGZvciBhcCBpbgorCit9IGFsbHBhc3Nfb2JqZWN0X3Q7CisKKworLyogcGFyYW1ldGVycyBmb3IgZWFybHkgcmVmbGVjdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDE2X3QgICAgICAgICAgICBtX3pEZWxheVtSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OU107ICAgLy8gZGVsYXkgb2Zmc2V0IGZvciBhcCBvdXQKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uR2FpbltSRVZFUkJfTUFYX05VTV9SRUZMRUNUSU9OU107ICAgIC8vIGdhaW4gZm9yIGFwCisKK30gZWFybHlfcmVmbGVjdGlvbl9vYmplY3RfdDsKKworLy9kZW1vCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUnZiTHBmRmJrOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUnZiTHBmRndkOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUm9vbUxwZkZiazsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblJvb21McGZGd2Q7CisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkVhcmx5R2FpbjsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkVhcmx5RGVsYXk7CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25MYXRlR2FpbjsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkxhdGVEZWxheTsKKworICAgIGVhcmx5X3JlZmxlY3Rpb25fb2JqZWN0X3QgbV9zRWFybHlMOworICAgIGVhcmx5X3JlZmxlY3Rpb25fb2JqZWN0X3QgbV9zRWFybHlSOworCisgICAgdWludDE2X3QgICAgICAgICAgICBtX25NYXhFeGN1cnNpb247IC8vMjgKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblhmYWRlSW50ZXJ2YWw7CisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkFwMF9BcEdhaW47IC8vMzAKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkFwMF9BcE91dDsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkFwMV9BcEdhaW47CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25BcDFfQXBPdXQ7CisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25EaWZmdXNpb247CisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1NDsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1NTsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1NjsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1NzsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1ODsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1OTsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fcmZ1MTA7IC8vNDMKKworfSByZXZlcmJfcHJlc2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgcmV2ZXJiX3ByZXNldF90ICAgICBtX3NQcmVzZXRbUkVWRVJCX05VTV9QUkVTRVRTXTsgLy8gYXJyYXkgb2YgcHJlc2V0cyhkb2VzIG5vdCBpbmNsdWRlIFJFVkVSQl9QUkVTRVRfTk9ORSkKKworfSByZXZlcmJfcHJlc2V0X2JhbmtfdDsKKworCisvKiBwYXJhbWV0ZXJzIGZvciBlYWNoIHJldmVyYiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiB1cGRhdGUgY291bnRlciBrZWVwcyB0cmFjayBvZiB3aGVuIHN5bnRoIHBhcmFtcyBuZWVkIHVwZGF0aW5nICovCisgICAgLyogb25seSBuZWVkcyB0byBiZSBhcyBsYXJnZSBhcyBSRVZFUkJfVVBEQVRFX1BFUklPRF9JTl9TQU1QTEVTICovCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25VcGRhdGVDb3VudGVyOworCisgICAgdWludDE2X3QgICAgICAgICAgICAgbV9uQmFzZUluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBpbmRleCBmb3IgY2lyY3VsYXIgYnVmZmVyCisKKyAgICAvLyByZXZlcmIgZGVsYXkgbGluZSBvZmZzZXRzLCBhbGxwYXNzIHBhcmFtZXRlcnMsIGV0YzoKKworICAgIHNob3J0ICAgICAgICAgICAgIG1fblJldkZia1I7ICAgICAgICAgICAgICAvLyBjb21iaW5lIGZlZWRiYWNrIHJldmVyYiByaWdodCBvdXQgd2l0aCBkcnkgbGVmdCBpbgorICAgIHNob3J0ICAgICAgICAgICAgIG1fek91dExwZkw7ICAgICAgICAgICAgICAvLyBsZWZ0IHJldmVyYiBvdXRwdXQKKworICAgIGFsbHBhc3Nfb2JqZWN0X3QgICAgbV9zQXAwOyAgICAgICAgICAgICAgICAgICAgIC8vIGFsbHBhc3MgMCAobGVmdCBjaGFubmVsKQorCisgICAgdWludDE2X3QgICAgICAgICAgICAgbV96RDBJbjsgICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IG9mZnNldCBmb3IgZGVsYXkgbGluZSBEMCBpbgorCisgICAgc2hvcnQgICAgICAgICAgICAgbV9uUmV2RmJrTDsgICAgICAgICAgICAgIC8vIGNvbWJpbmUgZmVlZGJhY2sgcmV2ZXJiIGxlZnQgb3V0IHdpdGggZHJ5IHJpZ2h0IGluCisgICAgc2hvcnQgICAgICAgICAgICAgbV96T3V0THBmUjsgICAgICAgICAgICAgIC8vIHJpZ2h0IHJldmVyYiBvdXRwdXQKKworICAgIGFsbHBhc3Nfb2JqZWN0X3QgICAgbV9zQXAxOyAgICAgICAgICAgICAgICAgICAgIC8vIGFsbHBhc3MgMSAocmlnaHQgY2hhbm5lbCkKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgIG1fekQxSW47ICAgICAgICAgICAgICAgICAgICAvLyBkZWxheSBvZmZzZXQgZm9yIGRlbGF5IGxpbmUgRDEgaW4KKworICAgIC8vIGRlbGF5IG91dHB1dCB0YXBzLCBub3RpY2UgY3Jpc3MgY3Jvc3Mgb3JkZXIKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX3pEMFNlbGY7ICAgICAgICAgICAgICAgICAgLy8gc2VsZiBmZWVkcyBmb3J3YXJkIGQwIC0tPiBkMAorCisgICAgdWludDE2X3QgICAgICAgICAgICAgbV96RDFDcm9zczsgICAgICAgICAgICAgICAgIC8vIGNyb3NzIGZlZWRzIGFjcm9zcyBkMSAtLT4gZDAKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgIG1fekQxU2VsZjsgICAgICAgICAgICAgICAgICAvLyBzZWxmIGZlZWRzIGZvcndhcmQgZDEgLS0+IGQxCisKKyAgICB1aW50MTZfdCAgICAgICAgICAgICBtX3pEMENyb3NzOyAgICAgICAgICAgICAgICAgLy8gY3Jvc3MgZmVlZHMgYWNyb3NzIGQwIC0tPiBkMQorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25TaW47ICAgICAgICAgICAgICAgICAgICAgLy8gZ2FpbiBmb3Igc2VsZiB0YXBzCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkNvczsgICAgICAgICAgICAgICAgICAgICAvLyBnYWluIGZvciBjcm9zcyB0YXBzCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblNpbkluY3JlbWVudDsgICAgICAgICAgICAvLyBpbmNyZW1lbnQgZm9yIGdhaW4KKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQ29zSW5jcmVtZW50OyAgICAgICAgICAgIC8vIGluY3JlbWVudCBmb3IgZ2FpbgorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25SdmJMcGZGd2Q7ICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJiIGZlZWRiYWNrIGxwZiBmb3J3YXJkIGdhaW4gKGluY2x1ZGVzIHNjYWxpbmcgZm9yIG1peGVyKQorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25SdmJMcGZGYms7ICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJiIGZlZWRiYWNrIGxwZiBmZWVkYmFjayBnYWluCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblJvb21McGZGd2Q7ICAgICAgICAgICAgICAgICAgLy8gcm9vbSBscGYgZm9yd2FyZCBnYWluIChpbmNsdWRlcyBzY2FsaW5nIGZvciBtaXhlcikKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uUm9vbUxwZkZiazsgICAgICAgICAgICAgICAgICAvLyByb29tIGxwZiBmZWVkYmFjayBnYWluCisKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1fblhmYWRlSW50ZXJ2YWw7ICAgICAgICAgICAvLyB1cGRhdGUveGZhZGUgYWZ0ZXIgdGhpcyBtYW55IHNhbXBsZXMKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9uWGZhZGVDb3VudGVyOyAgICAgICAgICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hlbiB0byB4ZmFkZQorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25QaGFzZTsgICAgICAgICAgICAgICAgICAgLy8gLTEgPD0gbV9uUGhhc2UgPCAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGR1cmluZyBzaW4sY29zIGNhbGN1bGF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBtX25QaGFzZS8yCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fblBoYXNlSW5jcmVtZW50OyAgICAgICAgICAvLyBhZGQgdGhpcyB0byBtX25QaGFzZSBlYWNoIGZyYW1lCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbk5vaXNlOyAgICAgICAgICAgICAgICAgICAvLyByYW5kb20gbm9pc2Ugc2FtcGxlCisKKyAgICB1aW50MTZfdCAgICAgICAgICAgIG1fbk1heEV4Y3Vyc2lvbjsgICAgICAgICAgICAvLyB0aGUgdGFwcyBjYW4gZXhjdXJzZSArLy0gdGhpcyBhbW91bnQKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9iVXNlTm9pc2U7ICAgICAgICAgICAgICAgIC8vIGlmIFRSVUUsIHVzZSBub2lzZSBhcyBpbnB1dCBzaWduYWwKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9iQnlwYXNzOyAgICAgICAgICAgICAgICAgIC8vIGlmIFRSVUUsIHRoZW4gYnlwYXNzIHJldmVyYiBhbmQgY29weSBpbnB1dCB0byBvdXRwdXQKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQ3VycmVudFJvb207ICAgICAgICAgICAgIC8vIHByZXNldCBudW1iZXIgZm9yIGN1cnJlbnQgcm9vbQorCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25OZXh0Um9vbTsgICAgICAgICAgICAgICAgLy8gcHJlc2V0IG51bWJlciBmb3IgbmV4dCByb29tCisKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkVhcmx5R2FpbjsgICAgICAgICAgICAgICAvLyBnYWluIGZvciBlYXJseSAod2lkZW4pIHNpZ25hbAorICAgIGludDE2X3QgICAgICAgICAgICAgbV9uRWFybHlEZWxheTsgICAgICAgICAgICAgIC8vIGluaXRpYWwgZGVhbHkgZm9yIGVhcmx5ICh3aWRlbikgc2lnbmFsCisgICAgaW50MTZfdCAgICAgICAgICAgICBtX25FYXJseTBpbjsKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkVhcmx5MWluOworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uTGF0ZUdhaW47ICAgICAgICAgICAgICAgLy8gZ2FpbiBmb3IgbGF0ZSByZXZlcmIKKyAgICBpbnQxNl90ICAgICAgICAgICAgIG1fbkxhdGVEZWxheTsKKworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uRGlmZnVzaW9uOworCisgICAgZWFybHlfcmVmbGVjdGlvbl9vYmplY3RfdCAgIG1fc0Vhcmx5TDsgICAgICAgICAgLy8gbGVmdCBjaGFubmVsIGVhcmx5IHJlZmxlY3Rpb25zCisgICAgZWFybHlfcmVmbGVjdGlvbl9vYmplY3RfdCAgIG1fc0Vhcmx5UjsgICAgICAgICAgLy8gcmlnaHQgY2hhbm5lbCBlYXJseSByZWZsZWN0aW9ucworCisgICAgc2hvcnQgICAgICAgICAgICAgbV9uRGVsYXlMaW5lW1JFVkVSQl9CVUZGRVJfU0laRV9JTl9TQU1QTEVTX01BWF07ICAgIC8vIG9uZSBsYXJnZSBkZWxheSBsaW5lIGZvciBhbGwgcmV2ZXJiIGVsZW1lbnRzCisKKyAgICByZXZlcmJfcHJlc2V0X3QgICAgIHBQcmVzZXQ7CisKKyAgICByZXZlcmJfcHJlc2V0X2JhbmtfdCAgbV9zUHJlc2V0OworCisgICAgLy9pbnQ4X3QgICAgICAgICAgICBwcmVzZXQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBtX25TYW1wbGluZ1JhdGU7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtX25VcGRhdGVQZXJpb2RJbkJpdHM7CisgICAgaW50MzJfdCAgICAgICAgICAgICBtX25CdWZmZXJNYXNrOworICAgIGludDMyX3QgICAgICAgICAgICAgbV9uVXBkYXRlUGVyaW9kSW5TYW1wbGVzOworICAgIGludDMyX3QgICAgICAgICAgICAgbV9uRGVsYXkwT3V0OworICAgIGludDMyX3QgICAgICAgICAgICAgbV9uRGVsYXkxT3V0OworICAgIGludDE2X3QgICAgICAgICAgICAgbV9uQ29zV1RfNUtIejsKKworICAgIHVpbnQxNl90ICAgICAgICAgICAgbV9BdXg7ICAgICAgICAgICAgICAgIC8vIGlmIFRSVUUsIGlzIGNvbm5lY3RlZCBhcyBhdXhpbGlhcnkgZWZmZWN0CisgICAgdWludDE2X3QgICAgICAgICAgICBtX1ByZXNldDsgICAgICAgICAgICAgLy8gaWYgVFJVRSwgZXhwb3NlIHByZXNldCByZXZlcnQgaW50ZXJmYWNlCisKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1TdGF0ZTsKK30gcmV2ZXJiX29iamVjdF90OworCisKKwordHlwZWRlZiBzdHJ1Y3QgcmV2ZXJiX21vZHVsZV9zIHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgcmV2ZXJiX29iamVjdF90IGNvbnRleHQ7Cit9IHJldmVyYl9tb2R1bGVfdDsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdCBBUEkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOworaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKK2ludCBFZmZlY3RDcmVhdGUoZWZmZWN0X3V1aWRfdCAqZWZmZWN0VUlELAorICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpOworaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSk7CisKK3N0YXRpYyBpbnQgUmV2ZXJiX1Byb2Nlc3MoZWZmZWN0X2ludGVyZmFjZV90IHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcik7CitzdGF0aWMgaW50IFJldmVyYl9Db21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludGVybmFsIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK2ludCBSZXZlcmJfSW5pdChyZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUsIGludCBhdXgsIGludCBwcmVzZXQpOworaW50IFJldmVyYl9Db25maWd1cmUocmV2ZXJiX21vZHVsZV90ICpwUnZiTW9kdWxlLCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGJvb2wgaW5pdCk7Cit2b2lkIFJldmVyYl9SZXNldChyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGJvb2wgaW5pdCk7CisKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyIChyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmIsIGludDMyX3QgcGFyYW0sIHNpemVfdCBzaXplLCB2b2lkICpwVmFsdWUpOworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIocmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiLCBpbnQzMl90IHBhcmFtLCBzaXplX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYlVwZGF0ZVhmYWRlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBVcGRhdGUgdGhlIHhmYWRlIHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQKKyAqCisgKiBJbnB1dHM6CisgKiBuTnVtU2FtcGxlc1RvQWRkIC0gbnVtYmVyIG9mIHNhbXBsZXMgdG8gd3JpdGUgdG8gYnVmZmVyCisgKgorICogT3V0cHV0czoKKyAqCisgKgorICogU2lkZSBFZmZlY3RzOgorICogLSB4ZmFkZSBwYXJhbWV0ZXJzIHdpbGwgYmUgY2hhbmdlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBpbnQgUmV2ZXJiVXBkYXRlWGZhZGUocmV2ZXJiX29iamVjdF90KiBwUmV2ZXJiRGF0YSwgaW50IG5OdW1TYW1wbGVzVG9BZGQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYkNhbGN1bGF0ZU5vaXNlCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBDYWxjdWxhdGUgYSBub2lzZSBzYW1wbGUgYW5kIGxpbWl0IGl0cyB2YWx1ZQorICoKKyAqIElucHV0czoKKyAqIFBvaW50ZXIgdG8gcmV2ZXJiIGNvbnRleHQKKyAqCisgKiBPdXRwdXRzOgorICogbmV3IGxpbWl0ZWQgbm9pc2UgdmFsdWUKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKiAtIHBSZXZlcmJEYXRhLT5tX25Ob2lzZSB2YWx1ZSBpcyB1cGRhdGVkCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIHVpbnQxNl90IFJldmVyYkNhbGN1bGF0ZU5vaXNlKHJldmVyYl9vYmplY3RfdCAqcFJldmVyYkRhdGEpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYkNhbGN1bGF0ZVNpbkNvcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogQ2FsY3VsYXRlIGEgbmV3IHNpbiBhbmQgY29zaW5lIHZhbHVlIGJhc2VkIG9uIHRoZSBnaXZlbiBwaGFzZQorICoKKyAqIElucHV0czoKKyAqIG5QaGFzZSAgIC0gcGhhc2UgYW5nbGUKKyAqIHBuU2luICAgIC0gaW5wdXQgb2xkIHZhbHVlLCBvdXRwdXQgbmV3IHZhbHVlCisgKiBwbkNvcyAgICAtIGlucHV0IG9sZCB2YWx1ZSwgb3V0cHV0IG5ldyB2YWx1ZQorICoKKyAqIE91dHB1dHM6CisgKgorICogU2lkZSBFZmZlY3RzOgorICogLSAqcG5TaW4sICpwbkNvcyBhcmUgdXBkYXRlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBpbnQgUmV2ZXJiQ2FsY3VsYXRlU2luQ29zKGludDE2X3QgblBoYXNlLCBpbnQxNl90ICpwblNpbiwgaW50MTZfdCAqcG5Db3MpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFJldmVyYgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogYXBwbHkgcmV2ZXJiIHRvIHRoZSBnaXZlbiBzaWduYWwKKyAqCisgKiBJbnB1dHM6CisgKiBuTnUKKyAqIHBuU2luICAgIC0gaW5wdXQgb2xkIHZhbHVlLCBvdXRwdXQgbmV3IHZhbHVlCisgKiBwbkNvcyAgICAtIGlucHV0IG9sZCB2YWx1ZSwgb3V0cHV0IG5ldyB2YWx1ZQorICoKKyAqIE91dHB1dHM6CisgKiBudW1iZXIgb2Ygc2FtcGxlcyBhY3R1YWxseSByZXZlcmJlcmF0ZWQKKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludCBSZXZlcmIocmV2ZXJiX29iamVjdF90KiBwUmV2ZXJiRGF0YSwgaW50IG5OdW1TYW1wbGVzVG9BZGQsIHNob3J0ICpwT3V0cHV0QnVmZmVyLCBzaG9ydCAqcElucHV0QnVmZmVyKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBSZXZlcmJSZWFkSW5QcmVzZXRzKCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZTogc2V0cyBnbG9iYWwgcmV2ZXJiIHByZXNldCBiYW5rIHRvIGRlZmF1bHRzCisgKgorICogSW5wdXRzOgorICoKKyAqIE91dHB1dHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworc3RhdGljIGludCBSZXZlcmJSZWFkSW5QcmVzZXRzKHJldmVyYl9vYmplY3RfdCogcFJldmVyYkRhdGEpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmV2ZXJiVXBkYXRlUm9vbQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogVXBkYXRlIHRoZSByb29tJ3MgcHJlc2V0IHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQKKyAqCisgKiBJbnB1dHM6CisgKgorICogT3V0cHV0czoKKyAqCisgKgorICogU2lkZSBFZmZlY3RzOgorICogLSByZXZlcmIgcGFyYW10ZXJzIChmYmssIGZ3ZCwgZXRjKSB3aWxsIGJlIGNoYW5nZWQKKyAqIC0gbV9uQ3VycmVudFJvb20gOj0gbV9uTmV4dFJvb20KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KK3N0YXRpYyBpbnQgUmV2ZXJiVXBkYXRlUm9vbShyZXZlcmJfb2JqZWN0X3QqIHBSZXZlcmJEYXRhLCBib29sIGZ1bGxVcGRhdGUpOworCisKK3N0YXRpYyBpbnQgUmV2ZXJiQ29tcHV0ZUNvbnN0YW50cyhyZXZlcmJfb2JqZWN0X3QgKnBSZXZlcmJEYXRhLCB1aW50MzJfdCBzYW1wbGluZ1JhdGUpOworCisjZW5kaWYgLypBTkRST0lEX0VGRkVDVFJFVkVSQl9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmMgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlYzY2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkVGRkVDVFNNQVRIIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgIkVmZmVjdHNNYXRoLmgiCisKKy8vIGdMb2dUYWIgY29udGFpbnMgcHJlLWNhbGN1bGF0ZWQgdmFsdWVzIG9mIGxvZzIoMSArIGFpNSoyXi0xICsgYWk0KjJeLTIgKyBhaTMqMl4tMyArIGFpMioyXi00ICsgYWkxKjJeLTUgKyBhaTAqMl4tNikKKy8vIGZvciBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCB0byA2MyAoaSA9IGFpNSoyXjUgKyBhaTQqMl40ICsgYWkzKjJeMyArIGFpMioyXjIgKyBhaTEqMl4xICsgYWkwKjJeMCkKKy8vIEl0IGlzIHVzZWQgZm9yIGEgYmV0dGVyIHRoYW4gcGllY2Ugd2lzZSBhcHByb3hpbWF0aW9uIG9mIGxpbiB0byBsb2cyIGNvbnZlcnNpb24KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGdMb2dUYWJbXSA9Cit7CisgICAgMCwgNzMzLCAxNDU1LCAyMTY2LAorICAgIDI4NjYsIDM1NTYsIDQyMzYsIDQ5MDcsCisgICAgNTU2OCwgNjIyMCwgNjg2MywgNzQ5OCwKKyAgICA4MTI0LCA4NzQyLCA5MzUyLCA5OTU0LAorICAgIDEwNTQ5LCAxMTEzNiwgMTE3MTYsIDEyMjg5LAorICAgIDEyODU1LCAxMzQxNSwgMTM5NjgsIDE0NTE0LAorICAgIDE1MDU1LCAxNTU4OSwgMTYxMTcsIDE2NjM5LAorICAgIDE3MTU2LCAxNzY2NywgMTgxNzMsIDE4NjczLAorICAgIDE5MTY4LCAxOTY1OCwgMjAxNDMsIDIwNjIzLAorICAgIDIxMDk4LCAyMTU2OCwgMjIwMzQsIDIyNDk1LAorICAgIDIyOTUyLCAyMzQwNCwgMjM4NTIsIDI0Mjk2LAorICAgIDI0NzM2LCAyNTE3MiwgMjU2MDQsIDI2MDMxLAorICAgIDI2NDU1LCAyNjg3NiwgMjcyOTIsIDI3NzA1LAorICAgIDI4MTE0LCAyODUyMCwgMjg5MjIsIDI5MzIxLAorICAgIDI5NzE3LCAzMDEwOSwgMzA0OTgsIDMwODg0LAorICAgIDMxMjY3LCAzMTY0NywgMzIwMjQsIDMyMzk3LAorICAgIDMyNzY4Cit9OworCitpbnQzMl90IEVmZmVjdHNfbG9nMih1aW50MzJfdCB4KSB7CisgICAgaW50MzJfdCBleHAgPSAzMSAtIF9fYnVpbHRpbl9jbHooeCk7CisgICAgdWludDMyX3Qgc2VnU3RhcnQgPSB4ID4+IChleHAgLSA2KTsKKyAgICB1aW50MzJfdCBpID0gc2VnU3RhcnQgJiAweDNGOworICAgIGludDMyX3QgbG9nID0gKGludDMyX3QpZ0xvZ1RhYltpXTsKKyAgICBpbnQzMl90IGxvZ0VuZCA9IChpbnQzMl90KWdMb2dUYWJbaSsxXTsKKyAgICBzZWdTdGFydCA8PD0gZXhwIC0gNjsKKworICAgIHJldHVybiAoZXhwIDw8IDE1KSArIGxvZyArICgoKHggLSBzZWdTdGFydCkgKiAobG9nRW5kIC0gbG9nKSkgPj4gKGV4cCAtIDYpKTsKK30KKworLy8gZ0V4cFRhYltpXSA9ICgyXihpPj42KSkgPDwgMjIKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBnRXhwVGFiW10gPSB7CisgICAgICAgICAgICA0MTk0MzA0LCA0MjM5OTc3LCA0Mjg2MTQ3LCA0MzMyODIwLAorICAgICAgICAgICAgNDM4MDAwMiwgNDQyNzY5NywgNDQ3NTkxMSwgNDUyNDY1MSwKKyAgICAgICAgICAgIDQ1NzM5MjEsIDQ2MjM3MjgsIDQ2NzQwNzcsIDQ3MjQ5NzQsCisgICAgICAgICAgICA0Nzc2NDI2LCA0ODI4NDM4LCA0ODgxMDE2LCA0OTM0MTY3LAorICAgICAgICAgICAgNDk4Nzg5NiwgNTA0MjIxMSwgNTA5NzExNywgNTE1MjYyMSwKKyAgICAgICAgICAgIDUyMDg3MjksIDUyNjU0NDksIDUzMjI3ODYsIDUzODA3NDcsCisgICAgICAgICAgICA1NDM5MzM5LCA1NDk4NTcwLCA1NTU4NDQ1LCA1NjE4OTczLAorICAgICAgICAgICAgNTY4MDE1OSwgNTc0MjAxMiwgNTgwNDUzOSwgNTg2Nzc0NiwKKyAgICAgICAgICAgIDU5MzE2NDIsIDU5OTYyMzMsIDYwNjE1MjgsIDYxMjc1MzMsCisgICAgICAgICAgICA2MTk0MjU4LCA2MjYxNzA5LCA2MzI5ODk0LCA2Mzk4ODIyLAorICAgICAgICAgICAgNjQ2ODUwMSwgNjUzODkzOCwgNjYxMDE0MywgNjY4MjEyMiwKKyAgICAgICAgICAgIDY3NTQ4ODYsIDY4Mjg0NDIsIDY5MDI3OTksIDY5Nzc5NjUsCisgICAgICAgICAgICA3MDUzOTUwLCA3MTMwNzYzLCA3MjA4NDEyLCA3Mjg2OTA2LAorICAgICAgICAgICAgNzM2NjI1NSwgNzQ0NjQ2OSwgNzUyNzU1NSwgNzYwOTUyNSwKKyAgICAgICAgICAgIDc2OTIzODcsIDc3NzYxNTIsIDc4NjA4MjksIDc5NDY0MjgsCisgICAgICAgICAgICA4MDMyOTU5LCA4MTIwNDMyLCA4MjA4ODU3LCA4Mjk4MjQ2LAorICAgICAgICAgICAgODM4ODYwOAorfTsKKworCit1aW50MzJfdCBFZmZlY3RzX2V4cDIoaW50MzJfdCB4KSB7CisgICAgaW50MzJfdCBpID0geCA+PiAxNTsKKyAgICBhc3NlcnQoaSA8IDMyKTsKKyAgICB4ICY9ICgxIDw8IDE1KSAtIDE7CisgICAgaW50MzJfdCBqID0geCA+PiA5OworICAgIHggJj0gKDEgPDwgOSkgLSAxOworICAgIHVpbnQzMl90IGV4cCA9IGdFeHBUYWJbal07CisgICAgdWludDMyX3QgZXhwRW5kID0gZ0V4cFRhYltqKzFdOworCisgICAgcmV0dXJuICgoZXhwIDw8IDkpICsgKGV4cEVuZCAtIGV4cCkgKiB4KSA+PiAoMzEgLSBpKTsKK30KKworCitpbnQxNl90IEVmZmVjdHNfTWlsbGliZWxzVG9MaW5lYXIxNiAoaW50MzJfdCBuR2FpbikKK3sKKyAgICBuR2FpbiA9ICgobkdhaW4gKyBNQl9UT19MSU5fSzEpIDw8IDE1ICkgLyBNQl9UT19MSU5fSzI7CisgICAgdWludDMyX3QgZXhwMiA9IEVmZmVjdHNfZXhwMihuR2Fpbik7CisKKyAgICBpZiAoZXhwMiA+IDMyNzY3KSBleHAyID0gMzI3Njc7CisKKyAgICByZXR1cm4gKGludDE2X3QpZXhwMjsKK30KKworCitpbnQxNl90IEVmZmVjdHNfTGluZWFyMTZUb01pbGxpYmVscyAoaW50MzJfdCBuR2FpbikKK3sKKyAgICByZXR1cm4gKGludDE2X3QpKCgoTUJfVE9fTElOX0syKkVmZmVjdHNfbG9nMihuR2FpbikpPj4xNSktTUJfVE9fTElOX0sxKTsKK30KKworCitpbnQzMl90IEVmZmVjdHNfU3FydChpbnQzMl90IGluKQoreworICAgIGludDMyX3QgdG1wOworICAgIGludDMyX3Qgb3V0ID0gMDsKKyAgICBpbnQzMl90IGk7CisgICAgaW50MzJfdCBqOworCisKKyAgICBpZiAoaW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICBpZiAoaW4gPj0gMHgxMDAwMDAwMCkKKyAgICB7CisgICAgICAgIG91dCA9IDB4NDAwMDsKKyAgICAgICAgaW4gLT0gMHgxMDAwMDAwMDsKKyAgICB9CisKKyAgICBqID0gMzIgLSBfX2J1aWx0aW5fY2x6KGluKTsKKworICAgIGlmIChqICYgMSkgaisrOworICAgIGogPj49IDE7CisKKyAgICBmb3IgKGkgPSBqOyBpID4gMDsgaS0tKSB7CisgICAgICAgIHRtcCA9IChvdXQgPDwgaSkgKyAoMSA8PCAoKGkgLSAxKSoyKSk7CisgICAgICAgIGlmIChpbiA+PSB0bXApCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCArPSAxIDw8IChpLTEpOworICAgICAgICAgICAgaW4gLT0gdG1wOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RzTWF0aC5oIGIvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RzTWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDQzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmgKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRUZGRUNUU01BVEhfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RTTUFUSF9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIGNvZWZzIGZvciBwYW4sIGdlbmVyYXRlcyBzaW4sIGNvcyAqLworI2RlZmluZSBDT0VGRl9QQU5fRzIgICAgLTI3MTQ2ICAgIC8qIC0wLjgyODQyNzEyNDc0NjE5ID0gMiAtIDQvc3FydCgyKSAqLworI2RlZmluZSBDT0VGRl9QQU5fRzAgICAgMjMxNzAgICAgIC8qIDAuNzA3MTA2NzgxMTg2NTQ3ID0gMS9zcXJ0KDIpICovCisKKy8qCitjb2VmZmljaWVudHMgZm9yIGFwcHJveGltYXRpbmcKKzJeeCA9IGduMnRvWDAgKyBnbjJ0b1gxKnggKyBnbjJ0b1gyKnheMiArIGduMnRvWDMqeF4zCit3aGVyZSB4IGlzIGEgaW50LmZyYWMgbnVtYmVyIHJlcHJlc2VudGluZyBudW1iZXIgb2Ygb2N0YXZlcy4KK0FjdHVhbGx5LCB3ZSBhcHByb3hpbWF0ZSBvbmx5IHRoZSAyXihmcmFjKSB1c2luZyB0aGUgcG93ZXIgc2VyaWVzCithbmQgaW1wbGVtZW50IHRoZSAyXihpbnQpIGFzIGEgc2hpZnQsIHNvIHRoYXQKKzJeeCA9PSAyXihpbnQuZnJhYykgPT0gMl4oaW50KSAqIDJeKGZyYWN0KQorICAgID09IChnbjJ0b1gwICsgZ24ydG9YMSp4ICsgZ24ydG9YMip4XjIgKyBnbjJ0b1gzKnheMykgPDwgKGludCkKKworVGhlIGduMnRvWC4uIHdlcmUgZ2VuZXJhdGVkIHVzaW5nIGEgYmVzdCBmaXQgZm9yIGEgM3JkCitvcmRlciBwb2x5bm9taWFsLCBpbnN0ZWFkIG9mIHRha2luZyB0aGUgY29lZmZpY2llbnRzIGZyb20KK2EgdHJ1bmNhdGVkIFRheWxvciAob3IgTWFjbGF1cmluPykgc2VyaWVzLgorKi8KKworI2RlZmluZSBHTjJfVE9fWDAgICAgMzI3NjggICAgLyogICAgMSAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgR04yX1RPX1gxICAgIDIyODMzICAgIC8qICAgIDAuNjk2ODA3ODYxMzI4MTI1ICAgICovCisjZGVmaW5lIEdOMl9UT19YMiAgICA3MzQ0ICAgIC8qICAgIDAuMjI0MTIxMDkzNzUgICAgICAgICovCisjZGVmaW5lIEdOMl9UT19YMyAgICAyNTg4ICAgIC8qICAgIDAuMDc4OTc5NDkyMTg3NSAgICAgICAgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBGaXhlZCBQb2ludCBNYXRoCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgZml4ZWQgcG9pbnQgbXVsdGlwbGllcy4gSWYgdGhlIHByb2Nlc3NvcgorICogc3VwcG9ydHMgZml4ZWQgcG9pbnQgbXVsdGlwbGllcywgcmVwbGFjZSB0aGVzZSBtYWNyb3Mgd2l0aCBpbmxpbmUKKyAqIGFzc2VtYmx5IGNvZGUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyogRml4ZWQgcG9pbnQgbXVsdGlwbHkgMC4xNSB4IDAuMTUgPSAwLjE1IHJldHVybmVkIGFzIDMyLWJpdHMgKi8KKyNkZWZpbmUgRk1VTF8xNXgxNShhLGIpIFwKKyAgICAvKmxpbnQgLWUoNzA0KSA8YXZvaWQgbXVsdGlwbHkgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAoKChpbnQzMl90KShhKSAqIChpbnQzMl90KShiKSkgPj4gMTUpCisKKy8qIEZpeGVkIHBvaW50IG11bHRpcGx5IDAuNyB4IDAuNyA9IDAuMTUgcmV0dXJuZWQgYXMgMzItYml0cyAqLworI2RlZmluZSBGTVVMXzd4NyhhLGIpIFwKKyAgICAvKmxpbnQgLWUoNzA0KSA8YXZvaWQgbXVsdGlwbHkgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAoKChpbnQzMl90KShhKSAqIChpbnQzMl90KShiKSApIDw8IDEpCisKKy8qIEZpeGVkIHBvaW50IG11bHRpcGx5IDAuOCB4IDAuOCA9IDAuMTUgcmV0dXJuZWQgYXMgMzItYml0cyAqLworI2RlZmluZSBGTVVMXzh4OChhLGIpIFwKKyAgICAvKmxpbnQgLWUoNzA0KSA8YXZvaWQgbXVsdGlwbHkgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAoKChpbnQzMl90KShhKSAqIChpbnQzMl90KShiKSApID4+IDEpCisKKy8qIEZpeGVkIHBvaW50IG11bHRpcGx5IDAuOCB4IDEuMTUgPSAwLjE1IHJldHVybmVkIGFzIDMyLWJpdHMgKi8KKyNkZWZpbmUgRk1VTF84eDE1KGEsYikgXAorICAgIC8qbGludCAtZSg3MDQpIDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAoKChpbnQzMl90KSgoYSkgPDwgNykgKiAoaW50MzJfdCkoYikpID4+IDE1KQorCisvKiBtYWNyb3MgZm9yIGZyYWN0aW9uYWwgcGhhc2UgYWNjdW11bGF0b3IgKi8KKy8qCitOb3RlOiBjaGFuZ2VkIHRoZSBfVTMyIHRvIF9JMzIgb24gMDMvMTQvMDIuIFRoaXMgc2hvdWxkIG5vdAorYWZmZWN0IHRoZSBwaGFzZSBjYWxjdWxhdGlvbnMsIGFuZCBzaG91bGQgYWxsb3cgdXMgdG8gcmV1c2UgdGhlc2UKK21hY3JvcyBmb3Igb3RoZXIgYXVkaW8gc2FtcGxlIHJlbGF0ZWQgbWF0aC4KKyovCisjZGVmaW5lIEhBUkRXQVJFX0JJVF9XSURUSCAgICAgICAgMzIKKworI2RlZmluZSBOVU1fUEhBU0VfSU5UX0JJVFMgICAgICAgIDEKKyNkZWZpbmUgTlVNX1BIQVNFX0ZSQUNfQklUUyAgICAgICAxNQorCisjZGVmaW5lIFBIQVNFX0ZSQUNfTUFTSyAgICAgICAgICAgKHVpbnQzMl90KSAoKDB4MUwgPDwgTlVNX1BIQVNFX0ZSQUNfQklUUykgLTEpCisKKyNkZWZpbmUgR0VUX1BIQVNFX0lOVF9QQVJUKHgpICAgICAodWludDMyX3QpKCh1aW50MzJfdCkoeCkgPj4gTlVNX1BIQVNFX0ZSQUNfQklUUykKKyNkZWZpbmUgR0VUX1BIQVNFX0ZSQUNfUEFSVCh4KSAgICAodWludDMyX3QpKCh1aW50MzJfdCkoeCkgJiBQSEFTRV9GUkFDX01BU0spCisKKyNkZWZpbmUgREVGQVVMVF9QSEFTRV9GUkFDICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfUEhBU0VfSU5UICAgICAgICAgMAorCisvKgorTGluZWFyIGludGVycG9sYXRpb24gY2FsY3VsYXRlczoKK291dHB1dCA9ICgxLWZyYWMpICogc2FtcGxlW25dICsgKGZyYWMpICogc2FtcGxlW24rMV0KKword2hlcmUgY29uY2VwdHVhbGx5ICAgIDAgPD0gZnJhYyA8IDEKKworRm9yIGEgZml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24sIGZyYWMgaXMgYWN0dWFsbHkgYW4gaW50ZWdlciB2YWx1ZQord2l0aCBhbiBpbXBsaWVkIGJpbmFyeSBwb2ludCBvbmUgcG9zaXRpb24gdG8gdGhlIGxlZnQuIFRoZSB2YWx1ZSBvZgorb25lICh1bml0eSkgaXMgZ2l2ZW4gYnkgUEhBU0VfT05FCitvbmUgaGFsZiBhbmQgb25lIHF1YXJ0ZXIgYXJlIHVzZWZ1bCBmb3IgNC1wb2ludCBsaW5lYXIgaW50ZXJwLgorKi8KKyNkZWZpbmUgUEhBU0VfT05FICAgICAgICAgICAgICAgIChpbnQzMl90KSAoMHgxTCA8PCBOVU1fUEhBU0VfRlJBQ19CSVRTKQorCisvKgorIE11bHRpcGx5IHRoZSBzaWduZWQgYXVkaW8gc2FtcGxlIGJ5IHRoZSB1bnNpZ25lZCBmcmFjdGlvbi4KKy0gIGEgaXMgdGhlIHNpZ25lZCBhdWRpbyBzYW1wbGUKKy0gIGIgaXMgdGhlIHVuc2lnbmVkIGZyYWN0aW9uIChjYXN0IHRvIHNpZ25lZCBpbnQgYXMgbG9uZyBhcyBjb2VmCisgICAgdXNlcyAobi0xKSBvciBsZXNzIGJpdHMsIHdoZXJlIG4gPT0gaGFyZHdhcmUgYml0IHdpZHRoKQorKi8KKyNkZWZpbmUgTVVMVF9BVURJT19DT0VGKGF1ZGlvLGNvZWYpICAgICAgICAgLypsaW50IC1lNzA0IDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAgICAgICAgIChpbnQzMl90KSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShhdWRpbykpICogKChpbnQzMl90KShjb2VmKSkgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPj4gTlVNX1BIQVNFX0ZSQUNfQklUUyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW50ICs3MDQgPHJlc3RvcmUgY2hlY2tpbmc+Ki8KKworLyogd2V0IC8gZHJ5IGNhbGN1bGF0aW9uIG1hY3JvcyAqLworI2RlZmluZSBOVU1fV0VUX0RSWV9GUkFDX0JJVFMgICAgICAgNyAgICAvLyAxNQorI2RlZmluZSBOVU1fV0VUX0RSWV9JTlRfQklUUyAgICAgICAgOSAgICAvLyAxCisKKy8qIGRlZmluZSBhIDEuMCAqLworI2RlZmluZSBXRVRfRFJZX09ORSAgICAgICAgICAgICAgICAgKGludDMyX3QpICgoMHgxTCA8PCBOVU1fV0VUX0RSWV9GUkFDX0JJVFMpKQorI2RlZmluZSBXRVRfRFJZX01JTlVTX09ORSAgICAgICAgICAgKGludDMyX3QpICh+V0VUX0RSWV9PTkUpCisjZGVmaW5lIFdFVF9EUllfRlVMTF9TQ0FMRSAgICAgICAgICAoaW50MzJfdCkgKFdFVF9EUllfT05FIC0gMSkKKworI2RlZmluZSBNVUxUX0FVRElPX1dFVF9EUllfQ09FRihhdWRpbyxjb2VmKSAvKmxpbnQgLWUoNzAyKSA8YXZvaWQgZGl2aWRlIGZvciBwZXJmb3JtYW5jZT4qLyBcCisgICAgICAgICAgICAoaW50MzJfdCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShhdWRpbykpICogKChpbnQzMl90KShjb2VmKSkgICAgICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA+PiBOVU1fV0VUX0RSWV9GUkFDX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworLyogRW52ZWxvcGUgMSAoRUcxKSBjYWxjdWxhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgICAgTlVNX0VHMV9JTlRfQklUUyAgICAgICAgICAxCisjZGVmaW5lIE5VTV9FRzFfRlJBQ19CSVRTICAgICAgICAgICAgMTUKKworLyogdGhlIG1heCBwb3NpdGl2ZSBnYWluIHVzZWQgaW4gdGhlIHN5bnRoIGZvciBFRzEgKi8KKy8qIFNZTlRIX0ZVTExfU0NBTEVfRUcxX0dBSU4gbXVzdCBtYXRjaCB0aGUgdmFsdWUgaW4gdGhlIGRsczJlYXMKK2NvbnZlcnRlciwgb3RoZXJ3aXNlLCB0aGUgdmFsdWVzIHdlIHJlYWQgZnJvbSB0aGUgLmVhcyBmaWxlIGFyZSBib2d1cy4gKi8KKyNkZWZpbmUgU1lOVEhfRlVMTF9TQ0FMRV9FRzFfR0FJTiAgICAoaW50MzJfdCkgKCgweDFMIDw8IE5VTV9FRzFfRlJBQ19CSVRTKSAtMSkKKworLyogZGVmaW5lIGEgMS4wICovCisjZGVmaW5lIEVHMV9PTkUgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpICgoMHgxTCA8PCBOVU1fRUcxX0ZSQUNfQklUUykpCisjZGVmaW5lIEVHMV9NSU5VU19PTkUgICAgICAgICAgICAgICAgKGludDMyX3QpICh+U1lOVEhfRlVMTF9TQ0FMRV9FRzFfR0FJTikKKworI2RlZmluZSBFRzFfSEFMRiAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSAoRUcxX09ORS8yKQorI2RlZmluZSBFRzFfTUlOVVNfSEFMRiAgICAgICAgICAgICAgIChpbnQzMl90KSAoRUcxX01JTlVTX09ORS8yKQorCisvKgorV2UgaW1wbGVtZW50IHRoZSBFRzEgdXNpbmcgYSBsaW5lYXIgZ2FpbiB2YWx1ZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUKK2F0dGFjayBzZWdtZW50IGlzIGhhbmRsZWQgYnkgaW5jcmVtZW50aW5nIChhZGRpbmcpIHRoZSBsaW5lYXIgZ2Fpbi4KK0hvd2V2ZXIsIEVHMSB0cmVhdHMgdGhlIERlY2F5LCBTdXN0YWluLCBhbmQgUmVsZWFzZSBkaWZmZXJlbnRseSB0aGFuCit0aGUgQXR0YWNrIHBvcnRpb24uIEZvciBEZWNheSwgU3VzdGFpbiwgYW5kIFJlbGVhc2UsIHRoZSBnYWluIGlzCitsaW5lYXIgb24gZEIgc2NhbGUsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gZXhwb25lbnRpYWwgZGFtcGluZyBvbgorYSBsaW5lYXIgc2NhbGUuIEJlY2F1c2Ugd2UgdXNlIGEgbGluZWFyIGdhaW4gZm9yIEVHMSwgd2UgaW1wbGVtZW50Cit0aGUgRGVjYXkgYW5kIFJlbGVhc2UgYXMgbXVsdGlwbGljYXRpb24gKGluc3RlYWQgb2YgaW5jcmVtZW50aW5nCithcyB3ZSBkaWQgZm9yIHRoZSBhdHRhY2sgc2VnbWVudCkuCitUaGVyZWZvcmUsIHdlIG5lZWQgdGhlIGZvbGxvd2luZyBtYWNybyB0byBpbXBsZW1lbnQgdGhlIG11bHRpcGxpY2F0aW9uCisoaS5lLiwgZXhwb25lbnRpYWwgZGFtcGluZykgZHVyaW5nIHRoZSBEZWNheSBhbmQgUmVsZWFzZSBzZWdtZW50cyBvZgordGhlIEVHMQorKi8KKyNkZWZpbmUgTVVMVF9FRzFfRUcxKGdhaW4sZGFtcGluZykgICAgICAgIC8qbGludCAtZSg3MDQpIDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAgICAgICAgIChpbnQzMl90KSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGludDMyX3QpKGdhaW4pKSAqICgoaW50MzJfdCkoZGFtcGluZykpICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA+PiBOVU1fRUcxX0ZSQUNfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisvLyBVc2UgdGhlIGZvbGxvd2luZyBtYWNybyBzcGVjaWZpY2FsbHkgZm9yIHRoZSBmaWx0ZXIsIHdoZW4gbXVsdGlwbHlpbmcKKy8vIHRoZSBiMSBjb2VmZmljaWVudC4gVGhlIDAgPD0gfGIxfCA8IDIsIHdoaWNoIHRoZXJlZm9yZSBtaWdodCBvdmVyZmxvdworLy8gaW4gY2VydGFpbiBjb25kaXRpb25zIGJlY2F1c2Ugd2Ugc3RvcmUgYjEgYXMgYSAxLjE1IHZhbHVlLgorLy8gSW5zdGVhZCwgd2UgY291bGQgc3RvcmUgYjEgYXMgYjFwIChiMScgPT0gYjEgInByaW1lIikgd2hlcmUKKy8vIGIxcCA9PSBiMS8yLCB0aHVzIGVuc3VyaW5nIG5vIHBvdGVudGlhbCBvdmVyZmxvdyBmb3IgYjFwIGJlY2F1c2UKKy8vIDAgPD0gfGIxcHwgPCAxCisvLyBIb3dldmVyLCBkdXJpbmcgdGhlIGZpbHRlciBjYWxjdWxhdGlvbiwgd2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZmFjdAorLy8gdGhhdCB3ZSBhcmUgdXNpbmcgYjFwIGluc3RlYWQgb2YgYjEsIGFuZCB0aGVyZWJ5IG11bHRpcGx5IGJ5CisvLyBhbiBleHRyYSBmYWN0b3Igb2YgMi4gUmF0aGVyIHRoYW4gbXVsdGlwbHkgYnkgYW4gZXh0cmEgZmFjdG9yIG9mIDIsCisvLyB3ZSBjYW4gaW5zdGVhZCBzaGlmdCB0aGUgcmVzdWx0IHJpZ2h0IGJ5IG9uZSBsZXNzLCBoZW5jZSB0aGUKKy8vIG1vZGlmaWVkIHNoaWZ0IHJpZ2h0IHZhbHVlIG9mIChOVU1fRUcxX0ZSQUNfQklUUyAtMSkKKyNkZWZpbmUgTVVMVF9FRzFfRUcxX1gyKGdhaW4sZGFtcGluZykgICAgICAgICAvKmxpbnQgLWUoNzAyKSA8YXZvaWQgZGl2aWRlIGZvciBwZXJmb3JtYW5jZT4qLyBcCisgICAgICAgICAgICAoaW50MzJfdCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShnYWluKSkgKiAoKGludDMyX3QpKGRhbXBpbmcpKSAgICBcCisgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPj4gKE5VTV9FRzFfRlJBQ19CSVRTIC0xKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyNkZWZpbmUgU0FUVVJBVEVfRUcxKHgpICAgICAgICAvKmxpbnQgLWV7NzM0fSBzYXR1cmF0aW9uIG9wZXJhdGlvbiAqLyAgICAgICAgICAgICAgICBcCisgICAgKChpbnQzMl90KSh4KSA+IFNZTlRIX0ZVTExfU0NBTEVfRUcxX0dBSU4pICAgID8gKFNZTlRIX0ZVTExfU0NBTEVfRUcxX0dBSU4pIDogICAgXAorICAgICgoaW50MzJfdCkoeCkgPCBFRzFfTUlOVVNfT05FKSAgICAgICAgICAgICAgICA/IChFRzFfTUlOVVNfT05FKSA6ICAgICh4KTsKKworCisvKiB1c2UgImRpZ2l0YWwgY2VudHMiID09ICJkZW50cyIgaW5zdGVhZCBvZiBjZW50cyAqLworLyogd2UgY291ZGwgcmUtdXNlIHRoZSBwaGFzZSBmcmFjIG1hY3JvcywgYnV0IGlmIHdlIGRvLAord2UgbXVzdCBjaGFuZ2UgdGhlIHBoYXNlIG1hY3JvcyB0byBjYXN0IHRvIF9JMzIgaW5zdGVhZCBvZiBfVTMyLAorYmVjYXVzZSB1c2luZyBhIF9VMzIgY2FzdCBjYXVzZXMgcHJvYmxlbXMgd2hlbiBzaGlmdGluZyB0aGUgZXhwb25lbnQKK2ZvciB0aGUgMl54IGNhbGN1bGF0aW9uLCBiZWNhdXNlIHJpZ2h0IHNoaWZ0IGEgbmVnYXRpdmUgdmFsdWVzIE1VU1QKK2JlIHNpZ24gZXh0ZW5kZWQsIG9yIGVsc2UgdGhlIDJeeCBjYWxjdWxhdGlvbiBpcyB3cm9uZyAqLworCisvKiB1c2UgImRpZ2l0YWwgY2VudHMiID09ICJkZW50cyIgaW5zdGVhZCBvZiBjZW50cyAqLworI2RlZmluZSBOVU1fREVOVFNfRlJBQ19CSVRTICAgICAgICAxMgorI2RlZmluZSBOVU1fREVOVFNfSU5UX0JJVFMgICAgICAgICAoSEFSRFdBUkVfQklUX1dJRFRIIC0gTlVNX0RFTlRTX0ZSQUNfQklUUykKKworI2RlZmluZSBERU5UU19GUkFDX01BU0sgICAgICAgICAgICAoaW50MzJfdCkgKCgweDFMIDw8IE5VTV9ERU5UU19GUkFDX0JJVFMpIC0xKQorCisjZGVmaW5lIEdFVF9ERU5UU19JTlRfUEFSVCh4KSAgICAgICAgLypsaW50IC1lKDcwNCkgPGF2b2lkIGRpdmlkZSBmb3IgcGVyZm9ybWFuY2U+Ki8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KSgoaW50MzJfdCkoeCkgPj4gTlVNX0RFTlRTX0ZSQUNfQklUUykKKworI2RlZmluZSBHRVRfREVOVFNfRlJBQ19QQVJUKHgpICAgICAoaW50MzJfdCkoKGludDMyX3QpKHgpICYgREVOVFNfRlJBQ19NQVNLKQorCisjZGVmaW5lIERFTlRTX09ORSAgICAgICAgICAgICAgICAgIChpbnQzMl90KSAoMHgxTCA8PCBOVU1fREVOVFNfRlJBQ19CSVRTKQorCisvKiB1c2UgQ0VOVFNfVE9fREVOVFMgdG8gY29udmVydCBhIHZhbHVlIGluIGNlbnRzIHRvIGRlbnRzICovCisjZGVmaW5lIENFTlRTX1RPX0RFTlRTIChpbnQzMl90KSAoREVOVFNfT05FICogKDB4MUwgPDwgTlVNX0VHMV9GUkFDX0JJVFMpIC8gMTIwMEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworCisvKgorRm9yIGdhaW4sIHRoZSBMRk8gZ2VuZXJhdGVzIGEgdmFsdWUgdGhhdCBtb2R1bGF0ZXMgaW4gdGVybXMKK29mIGRCLiBIb3dldmVyLCB3ZSB1c2UgYSBsaW5lYXIgZ2FpbiB2YWx1ZSwgc28gd2UgbXVzdCBjb252ZXJ0Cit0aGUgTEZPIHZhbHVlIGluIGRCIHRvIGEgbGluZWFyIGdhaW4uIE5vcm1hbGx5LCB3ZSB3b3VsZCB1c2UKK2xpbmVhciBnYWluID0gMTBeeCwgd2hlcmUgeCA9IExGTyB2YWx1ZSBpbiBkQiAvIDIwLgorSW5zdGVhZCwgd2UgaW1wbGVtZW50IDEwXnggdXNpbmcgb3VyIDJeeCBhcHByb3hpbWF0aW9uLgorYmVjYXVzZQorCisgIDEwXnggPSAyXihsb2cyKDEwXngpKSA9IDJeKHggKiBsb2cyKDEwKSkKKworc28gd2UgbmVlZCB0byBtdWx0aXBseSBieSBsb2cyKDEwKSB3aGljaCBpcyBqdXN0IGEgY29uc3RhbnQuCitBaCwgYnV0IGp1c3Qgd2FpdCAtLSBvdXIgMl54IGFjdHVhbGx5IGRvZXNuJ3QgZXhhY3RseSBpbXBsZW1lbnQKKzJeeCwgYnV0IGl0IGFjdHVhbGx5IGFzc3VtZXMgdGhhdCB0aGUgaW5wdXQgaXMgaW4gY2VudHMsIGFuZCB3aXRoaW4KK3RoZSAyXnggYXBwcm94aW1hdGlvbiBjb252ZXJ0cyBpdHMgaW5wdXQgZnJvbSBjZW50cyB0byBvY3RhdmVzCitieSBkaXZpZGluZyBpdHMgaW5wdXQgYnkgMTIwMC4KKworU28sIGluIG9yZGVyIHRvIGNvbnZlcnQgdGhlIExGTyBnYWluIHZhbHVlIGluIGRCIHRvIHNvbWV0aGluZwordGhhdCBvdXIgZXhpc3RpbmcgMl54IGFwcHJveGltYXRpb24gY2FuIHVzZSwgbXVsdGlwbHkgdGhlIExGTyBnYWluCitieSBsb2cyKDEwKSAqIDEyMDAgLyAyMAorCitUaGUgZGl2aWRlIGJ5IDIwIGhlbHBzIGNvbnZlcnQgZEIgdG8gbGluZWFyIGdhaW4sIGFuZCB3ZSBtaWdodAorYXMgd2VsbCBpbmNvcnBvcmF0ZSB0aGF0IG9wZXJhdGlvbiBpbnRvIHRoaXMgY29udmVyc2lvbi4KK09mIGNvdXJzZSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZnJhY3Rpb25hbCBiaXRzLCBzbyBtdWx0aXBseQordGhlIGNvbnN0YW50IGJ5IE5VTV9FRzFfRlJBQ19CSVRTCisqLworCisvKiB1c2UgTEZPX0dBSU5fVE9fQ0VOVFMgdG8gY29udmVydCB0aGUgTEZPIGdhaW4gdmFsdWUgdG8gY2VudHMgKi8KKyNpZiAwCisjZGVmaW5lICAgIERPVUJMRV9MT0cyXzEwICAgIChkb3VibGUpICgzLjMyMTkyODA5NDg4NzM2KSAgICAvKiBsb2cyKDEwKSAqLworCisjZGVmaW5lICAgIERPVUJMRV9MRk9fR0FJTl9UT19DRU5UUyAgICAoZG91YmxlKSAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChET1VCTEVfTE9HMl8xMCkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgMTIwMC4wICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgMjAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKQorCisjZGVmaW5lICAgIExGT19HQUlOX1RPX0NFTlRTICAgIChpbnQzMl90KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgRE9VQkxFX0xGT19HQUlOX1RPX0NFTlRTICogICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoMHgxTCA8PCBOVU1fRUcxX0ZSQUNfQklUUykgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisjZW5kaWYKKworI2RlZmluZSBMRk9fR0FJTl9UT19DRU5UUyAoaW50MzJfdCkgKDE2NzE5ODExNTZMID4+ICgyMyAtIE5VTV9FRzFfRlJBQ19CSVRTKSkKKworCisjZGVmaW5lIE1VTFRfREVOVFNfQ09FRihkZW50cyxjb2VmKSAgICAgLypsaW50IC1lNzA0IDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovICAgIFwKKyAgICAgICAgICAgIChpbnQzMl90KSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShkZW50cykpICogKChpbnQzMl90KShjb2VmKSkgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgPj4gTlVNX0RFTlRTX0ZSQUNfQklUUyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW50ICtlNzA0IDxyZXN0b3JlIGNoZWNraW5nPiovCisKKworLyogd2UgdXNlIDE2LWJpdHMgaW4gdGhlIFBDIHBlciBhdWRpbyBzYW1wbGUgKi8KKyNkZWZpbmUgQklUU19QRVJfQVVESU9fU0FNUExFICAgIDE2CisKKy8qIHdlIGRlZmluZSAxIGFzIDEuMCAtIDEgTFNiaXQgKi8KKyNkZWZpbmUgRElTVE9SVElPTl9PTkUgICAgICAgICAgIChpbnQzMl90KSgoMHgxTCA8PCAoQklUU19QRVJfQVVESU9fU0FNUExFLTEpKSAtMSkKKyNkZWZpbmUgRElTVE9SVElPTl9NSU5VU19PTkUgICAgIChpbnQzMl90KSh+RElTVE9SVElPTl9PTkUpCisKKy8qIGRyaXZlIGNvZWYgaXMgZ2l2ZW4gYXMgaW50LmZyYWMgKi8KKyNkZWZpbmUgTlVNX0RSSVZFX0NPRUZfSU5UX0JJVFMgIDEKKyNkZWZpbmUgTlVNX0RSSVZFX0NPRUZfRlJBQ19CSVRTIDQKKworI2RlZmluZSBNVUxUX0FVRElPX0RSSVZFKGF1ZGlvLGRyaXZlKSAgICAgICAgIC8qbGludCAtZSg3MDIpIDxhdm9pZCBkaXZpZGUgZm9yIHBlcmZvcm1hbmNlPiovIFwKKyAgICAgICAgICAgIChpbnQzMl90KSAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShhdWRpbykpICogKChpbnQzMl90KShkcml2ZSkpICAgIFwKKyAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID4+IE5VTV9EUklWRV9DT0VGX0ZSQUNfQklUUyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIE1VTFRfQVVESU9fQVVESU8oYXVkaW8xLGF1ZGlvMikgICAgICAgICAvKmxpbnQgLWUoNzAyKSA8YXZvaWQgZGl2aWRlIGZvciBwZXJmb3JtYW5jZT4qLyBcCisgICAgICAgICAgICAoaW50MzJfdCkgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQzMl90KShhdWRpbzEpKSAqICgoaW50MzJfdCkoYXVkaW8yKSkgICAgXAorICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgID4+IChCSVRTX1BFUl9BVURJT19TQU1QTEUtMSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyNkZWZpbmUgU0FUVVJBVEUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCgoKGludDMyX3QpKHgpKSA+IERJU1RPUlRJT05fT05FKSAgICAgICAgPyAoRElTVE9SVElPTl9PTkUpIDogICAgICAgICAgICBcCisgICAgKCgoaW50MzJfdCkoeCkpIDwgRElTVE9SVElPTl9NSU5VU19PTkUpICAgID8gKERJU1RPUlRJT05fTUlOVVNfT05FKSA6ICAgICgoaW50MzJfdCkoeCkpKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdHNfbG9nMigpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBGaXhlZC1wb2ludCBsb2cyIGZ1bmN0aW9uLgorICoKKyAqIElucHV0czoKKyAqIElucHV0IGlzIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgKHNob3VsZCBub3QgYmUgMCkuCisgKgorICogT3V0cHV0czoKKyAqIE91dHB1dCBpcyBpbiAxNS1iaXQgcHJlY2lzaW9uLgorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitpbnQzMl90IEVmZmVjdHNfbG9nMih1aW50MzJfdCB4KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFZmZlY3RzX2V4cDIoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogRml4ZWQtcG9pbnQgcmFkaXgtMiBleHBvbmVudC4KKyAqCisgKiBJbnB1dHM6CisgKiBJbnB1dCBpcyBpbiAxNS1iaXQgcHJlY2lzaW9uLiBNdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbGVzcyB0aGFuIDMyLgorICoKKyAqIE91dHB1dHM6CisgKiBPdXRwdXQgaXMgYW4gaW50ZWdlci4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLwordWludDMyX3QgRWZmZWN0c19leHAyKGludDMyX3QgeCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2KCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIFRyYW5zZm9ybSBnYWluIGluIG1pbGxpYmVscyB0byBsaW5lYXIgZ2FpbiBtdWx0aXBsaWVyOgorICoKKyAqIG1CID0gMjAwMCpsb2cobGluLzMyNzY3KQorICogICAgPT4gbGluID0gMl4oKG1CKzIwMDAqbG9nKDMyNzY3KSkvMjAwMCpsb2coMikpCisgKiAgICA9PiBsaW4gPSBFZmZlY3RzX2V4cDIoKChtQiArIEsxKSA8PCAxNSkgLyBLMikKKyAqIHdpdGg6CisgKiAgICBLMSA9IDIwMDAqbG9nKDMyNzY3KSBhbmQgSzIgPSAyMDAwKmxvZygyKQorICoKKyAqIElucHV0czoKKyAqIG5HYWluIC0gbG9nIHNjYWxlIHZhbHVlIGluIG1pbGxpYmVscy4KKyAqCisgKiBPdXRwdXRzOgorICogUmV0dXJucyBhIDE2LWJpdCBsaW5lYXIgdmFsdWUgYXBwcm94aW1hdGVseSBlcXVhbCB0byAyXihuR2Fpbi8xMDI0KQorICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisjZGVmaW5lIE1CX1RPX0xJTl9LMSA5MDMxCisjZGVmaW5lIE1CX1RPX0xJTl9LMiA2MDIKK2ludDE2X3QgRWZmZWN0c19NaWxsaWJlbHNUb0xpbmVhcjE2IChpbnQzMl90IG5HYWluKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogVHJhbnNmb3JtIGxpbmVhciBnYWluIG11bHRpcGxpZXIgdG8gbWlsbGliZWxzCisgKiAgbUIgPSAyMDAwKmxvZyhsaW4vMzI3NjcpCisgKiAgICAgPSAyMDAwKmxvZygyKSpsb2cyKGxpbiktMjAwMCpsb2coMzI3NjcpCisgKiAgICA9PiBtQiA9IEsxKkVmZmVjdHNfbG9nMihsaW4pICsgSzIKKyAqIHdpdGg6CisgKiAgICBLMSA9IDIwMDAqbG9nKDIpIGFuZCBLMiA9IC0yMDAwKmxvZygzMjc2NykKKyAqCisgKiBJbnB1dHM6CisgKiBuR2FpbiAtIGxpbmVhciBtdWx0aXBsaWVyIHJhbmdpbmcgZm9ybSAwIHRvIDMyNzY3IChjb3JyZXNwb25kaW5nIHRvIFswIDFdIGdhaW4gcmFuZ2UpLgorICoKKyAqIE91dHB1dHM6CisgKiBSZXR1cm5zIGEgMTYtYml0IGxvZyB2YWx1ZSBleHByZXNzZWQgaW4gbWlsbGxpYmVscy4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50MTZfdCBFZmZlY3RzX0xpbmVhcjE2VG9NaWxsaWJlbHMgKGludDMyX3QgbkdhaW4pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdHNfU3FydCgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBSZXR1cm5zIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgYXJndW1lbnQgZ2l2ZW4uCisgKgorICogSW5wdXRzOgorICogaW4gLSBwb3NpdGl2ZSBudW1iZXIgaW4gdGhlIHJhbmdlIDAgLSAyXjI4CisgKgorICogT3V0cHV0czoKKyAqIFJldHVybmVkIHZhbHVlOiBzcXVhcmUgcm9vdCBvZiBpbi4KKyAqCisgKiBTaWRlIEVmZmVjdHM6CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworaW50MzJfdCBFZmZlY3RzX1NxcnQoaW50MzJfdCBpbik7CisKKyNpZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvKkFORFJPSURfRUZGRUNUU01BVEhfSF8qLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YjQ1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMwIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworIyBWaXN1YWxpemVyIGxpYnJhcnkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJRWZmZWN0VmlzdWFsaXplci5jcHAKKworTE9DQUxfQ0ZMQUdTKz0gLU8yCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscworCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvc291bmRmeAorTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgorCitpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQorTE9DQUxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK2lmbmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQorCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjU3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlZpc3VhbGl6ZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxtZWRpYS9FZmZlY3RWaXN1YWxpemVyQXBpLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmlzdWFsaXplciBlZmZlY3QKK2V4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnVmlzdWFsaXplckludGVyZmFjZTsKKworLy8gR29vZ2xlIFZpc3VhbGl6ZXIgVVVJRDogZDA2OWQ5ZTAtODMyOS0xMWRmLTkxNjgtMDAwMmE1ZDVjNTFiCitjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdWaXN1YWxpemVyRGVzY3JpcHRvciA9IHsKKyAgICAgICAgezB4ZTQ2YjI2YTAsIDB4ZGRkZCwgMHgxMWRiLCAweDhhZmQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHR5cGUKKyAgICAgICAgezB4ZDA2OWQ5ZTAsIDB4ODMyOSwgMHgxMWRmLCAweDkxNjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sIC8vIHV1aWQKKyAgICAgICAgRUZGRUNUX0FQSV9WRVJTSU9OLAorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QpLAorICAgICAgICAwLCAvLyBUT0RPCisgICAgICAgIDEsCisgICAgICAgICJWaXN1YWxpemVyIiwKKyAgICAgICAgIkdvb2dsZSBJbmMuIiwKK307CisKK2VudW0gdmlzdWFsaXplcl9zdGF0ZV9lIHsKKyAgICBWSVNVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQsCisgICAgVklTVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRCwKKyAgICBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSwKK307CisKK3N0cnVjdCBWaXN1YWxpemVyQ29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqbUl0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190IG1Db25maWc7CisgICAgdWludDMyX3QgbVN0YXRlOworICAgIHVpbnQzMl90IG1DYXB0dXJlSWR4OworICAgIHVpbnQzMl90IG1DYXB0dXJlU2l6ZTsKKyAgICB1aW50MzJfdCBtQ3VycmVudEJ1ZjsKKyAgICB1aW50OF90IG1DYXB0dXJlQnVmWzJdW1ZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWF07Cit9OworCisKKy8vCisvLy0tLSBMb2NhbCBmdW5jdGlvbnMKKy8vCisKK3ZvaWQgVmlzdWFsaXplcl9yZXNldChWaXN1YWxpemVyQ29udGV4dCAqcENvbnRleHQpCit7CisgICAgcENvbnRleHQtPm1DYXB0dXJlSWR4ID0gMDsKKyAgICBwQ29udGV4dC0+bUN1cnJlbnRCdWYgPSAwOworICAgIG1lbXNldChwQ29udGV4dC0+bUNhcHR1cmVCdWZbMF0sIDAsIFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWCk7CisgICAgbWVtc2V0KHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZlsxXSwgMCwgVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXN1YWxpemVyX2NvbmZpZ3VyZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IFNldCBpbnB1dCBhbmQgb3V0cHV0IGF1ZGlvIGNvbmZpZ3VyYXRpb24uCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8gIHBDb25maWc6ICAgIHBvaW50ZXIgdG8gZWZmZWN0X2NvbmZpZ190IHN0cnVjdHVyZSBob2xkaW5nIGlucHV0IGFuZCBvdXRwdXQKKy8vICAgICAgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZpc3VhbGl6ZXJfY29uZmlndXJlKFZpc3VhbGl6ZXJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKQoreworICAgIExPR1YoIlZpc3VhbGl6ZXJfY29uZmlndXJlIHN0YXJ0Iik7CisKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlICE9IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IENIQU5ORUxfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKKyAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1KSByZXR1cm4gLUVJTlZBTDsKKworICAgIG1lbWNweSgmcENvbnRleHQtPm1Db25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKworICAgIFZpc3VhbGl6ZXJfcmVzZXQocENvbnRleHQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWaXN1YWxpemVyX2luaXQoKQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdXJwb3NlOiBJbml0aWFsaXplIGVuZ2luZSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZpc3VhbGl6ZXJfaW5pdChWaXN1YWxpemVyQ29udGV4dCAqcENvbnRleHQpCit7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBDSEFOTkVMX1NURVJFTzsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IFNBTVBMRV9GT1JNQVRfUENNX1MxNTsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplID0gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYOworCisgICAgVmlzdWFsaXplcl9jb25maWd1cmUocENvbnRleHQsICZwQ29udGV4dC0+bUNvbmZpZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworLy8KKy8vLS0tIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgorLy8KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgeworICAgICpwTnVtRWZmZWN0cyA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiAiQyIgaW50IEVmZmVjdFF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgeworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBtZW1jcHkocERlc2NyaXB0b3IsICZnVmlzdWFsaXplckRlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiAiQyIgaW50IEVmZmVjdENyZWF0ZShlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwKKyAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgKnBJbnRlcmZhY2UpIHsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworCisgICAgaWYgKHBJbnRlcmZhY2UgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ1Zpc3VhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgIT0gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBWaXN1YWxpemVyQ29udGV4dCAqcENvbnRleHQgPSBuZXcgVmlzdWFsaXplckNvbnRleHQ7CisKKyAgICBwQ29udGV4dC0+bUl0ZmUgPSAmZ1Zpc3VhbGl6ZXJJbnRlcmZhY2U7CisgICAgcENvbnRleHQtPm1TdGF0ZSA9IFZJU1VBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRDsKKworICAgIHJldCA9IFZpc3VhbGl6ZXJfaW5pdChwQ29udGV4dCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HVygiRWZmZWN0Q3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgZGVsZXRlIHBDb250ZXh0OworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKworICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX0lOSVRJQUxJWkVEOworCisgICAgTE9HVigiRWZmZWN0Q3JlYXRlICVwIiwgcENvbnRleHQpOworCisgICAgcmV0dXJuIDA7CisKK30KKworZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKSB7CisgICAgVmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChWaXN1YWxpemVyQ29udGV4dCAqKWludGVyZmFjZTsKKworICAgIExPR1YoIkVmZmVjdFJlbGVhc2UgJXAiLCBpbnRlcmZhY2UpOworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBwQ29udGV4dC0+bVN0YXRlID0gVklTVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEOworICAgIGRlbGV0ZSBwQ29udGV4dDsKKworICAgIHJldHVybiAwOworfQorCisvLworLy8tLS0gRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCisvLworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQorICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworZXh0ZXJuICJDIiBpbnQgVmlzdWFsaXplcl9wcm9jZXNzKAorICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZixhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpCit7CisgICAgYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICAvLyBhbGwgY29kZSBiZWxvdyBhc3N1bWVzIHN0ZXJlbyAxNiBiaXQgUENNIG91dHB1dCBhbmQgaW5wdXQKKyAgICB1aW50MzJfdCBjYXB0SWR4OworICAgIHVpbnQzMl90IGluSWR4OworICAgIHVpbnQ4X3QgKmJ1ZiA9IHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZltwQ29udGV4dC0+bUN1cnJlbnRCdWZdOworICAgIGZvciAoaW5JZHggPSAwLCBjYXB0SWR4ID0gcENvbnRleHQtPm1DYXB0dXJlSWR4OworICAgICAgICAgaW5JZHggPCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAmJiBjYXB0SWR4IDwgcENvbnRleHQtPm1DYXB0dXJlU2l6ZTsKKyAgICAgICAgIGluSWR4KyssIGNhcHRJZHgrKykgeworICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbMiAqIGluSWR4XSArIGluQnVmZmVyLT5zMTZbMiAqIGluSWR4ICsgMV07CisgICAgICAgIHNtcCA9IChzbXAgKyAoMSA8PCA4KSkgPj4gOTsKKyAgICAgICAgYnVmW2NhcHRJZHhdID0gKCh1aW50OF90KXNtcCleMHg4MDsKKyAgICB9CisgICAgcENvbnRleHQtPm1DYXB0dXJlSWR4ID0gY2FwdElkeDsKKworICAgIC8vIGdvIHRvIG5leHQgYnVmZmVyIHdoZW4gYnVmZmVyIGZ1bGwKKyAgICBpZiAocENvbnRleHQtPm1DYXB0dXJlSWR4ID09IHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpIHsKKyAgICAgICAgcENvbnRleHQtPm1DdXJyZW50QnVmIF49IDE7CisgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUlkeCA9IDA7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorICAgIHJldHVybiAwOworfSAgIC8vIGVuZCBWaXN1YWxpemVyX3Byb2Nlc3MKKworZXh0ZXJuICJDIiBpbnQgVmlzdWFsaXplcl9jb21tYW5kKGVmZmVjdF9pbnRlcmZhY2VfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworCisgICAgYW5kcm9pZDo6VmlzdWFsaXplckNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpWaXN1YWxpemVyQ29udGV4dCAqKXNlbGY7CisgICAgaW50IHJldHNpemU7CisKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwQ29udGV4dC0+bVN0YXRlID09IFZJU1VBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKy8vICAgIExPR1YoIlZpc3VhbGl6ZXJfY29tbWFuZCBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOworCisgICAgc3dpdGNoIChjbWRDb2RlKSB7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IFZpc3VhbGl6ZXJfaW5pdChwQ29udGV4dCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9DT05GSUdVUkU6CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkKKyAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IFZpc3VhbGl6ZXJfY29uZmlndXJlKHBDb250ZXh0LAorICAgICAgICAgICAgICAgIChlZmZlY3RfY29uZmlnX3QgKikgcENtZERhdGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6CisgICAgICAgIFZpc3VhbGl6ZXJfcmVzZXQocENvbnRleHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5tU3RhdGUgPSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRTsKKyAgICAgICAgTE9HVigiRUZGRUNUX0NNRF9FTkFCTEUoKSBPSyIpOworICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocENvbnRleHQtPm1TdGF0ZSAhPSBWSVNVQUxJWkVSX1NUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgcENvbnRleHQtPm1TdGF0ZSA9IFZJU1VBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgIGNtZFNpemUgIT0gKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCkpIHx8CisgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICpyZXBseVNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZih1aW50MzJfdCkpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworICAgICAgICBwLT5zdGF0dXMgPSAwOworICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCk7CisgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YodWludDMyX3QpIHx8CisgICAgICAgICAgICAqKHVpbnQzMl90ICopcC0+ZGF0YSAhPSBWSVNVX1BBUkFNX0NBUFRVUkVfU0laRSkgeworICAgICAgICAgICAgcC0+c3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIExPR1YoImdldCBtQ2FwdHVyZVNpemUgPSAlZCIsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAqKCh1aW50MzJfdCAqKXAtPmRhdGEgKyAxKSA9IHBDb250ZXh0LT5tQ2FwdHVyZVNpemU7CisgICAgICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgKnJlcGx5U2l6ZSArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgIGNtZFNpemUgIT0gKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YodWludDMyX3QpKSB8fAorICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqKGludDMyX3QgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YTsKKyAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwKKyAgICAgICAgICAgIHAtPnZzaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwKKyAgICAgICAgICAgICoodWludDMyX3QgKilwLT5kYXRhICE9IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFKSB7CisgICAgICAgICAgICAqKGludDMyX3QgKilwUmVwbHlEYXRhID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOzsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplID0gKigodWludDMyX3QgKilwLT5kYXRhICsgMSk7CisgICAgICAgIExPR1YoInNldCBtQ2FwdHVyZVNpemUgPSAlZCIsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgorICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOgorICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKKyAgICAgICAgYnJlYWs7CisKKworICAgIGNhc2UgVklTVV9DTURfQ0FQVFVSRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IChpbnQpcENvbnRleHQtPm1DYXB0dXJlU2l6ZSkgeworICAgICAgICAgICAgTE9HVigiVklTVV9DTURfQ0FQVFVSRSgpIGVycm9yICpyZXBseVNpemUgJWQgcENvbnRleHQtPm1DYXB0dXJlU2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUsIHBDb250ZXh0LT5tQ2FwdHVyZVNpemUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgPT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLAorICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tQ2FwdHVyZUJ1ZltwQ29udGV4dC0+bUN1cnJlbnRCdWYgXiAxXSwKKyAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldChwUmVwbHlEYXRhLCAweDgwLCBwQ29udGV4dC0+bUNhcHR1cmVTaXplKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIlZpc3VhbGl6ZXJfY29tbWFuZCBpbnZhbGlkIGNvbW1hbmQgJWQiLGNtZENvZGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gZWZmZWN0X2ludGVyZmFjZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmlzdWFsaXplciBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1Zpc3VhbGl6ZXJJbnRlcmZhY2UgPSB7CisgICAgICAgIFZpc3VhbGl6ZXJfcHJvY2VzcywKKyAgICAgICAgVmlzdWFsaXplcl9jb21tYW5kCit9OworCit9IC8vIG5hbWVzcGFjZQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tawppbmRleCAzYWRhYmNjLi5iNGQwMWY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKQEAgLTEyLDYgKzEyLDcgQEAKICAgICBtZWRpYXBsYXllci5jcHAgXAogICAgIElNZWRpYVBsYXllclNlcnZpY2UuY3BwIFwKICAgICBJTWVkaWFQbGF5ZXJDbGllbnQuY3BwIFwKKyAgICBJTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgXAogICAgIElNZWRpYVBsYXllci5jcHAgXAogICAgIElNZWRpYVJlY29yZGVyLmNwcCBcCiAgICAgTWV0YWRhdGEuY3BwIFwKQEAgLTI2LDcgKzI3LDEyIEBACiAgICAgTWVkaWFTY2FubmVyQ2xpZW50LmNwcCBcCiAgICAgYXV0b2RldGVjdC5jcHAgXAogICAgIElNZWRpYURlYXRoTm90aWZpZXIuY3BwIFwKLSAgICBNZWRpYVByb2ZpbGVzLmNwcAorICAgIE1lZGlhUHJvZmlsZXMuY3BwIFwKKyAgICBJRWZmZWN0LmNwcCBcCisgICAgSUVmZmVjdENsaWVudC5jcHAgXAorICAgIEF1ZGlvRWZmZWN0LmNwcCBcCisgICAgVmlzdWFsaXplci5jcHAgXAorICAgIGZpeGVkZmZ0LmNwcC5hcm0KIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlidWkgbGliY3V0aWxzIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzb25pdm94IGxpYmljdXVjIGxpYmV4cGF0IGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudCBsaWJjYW1lcmFfY2xpZW50CkBAIC00NSwxMSArNTEsNyBAQAogICAgICQoSk5JX0hfSU5DTFVERSkgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3NwZWV4L2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3NwZWV4L2xpYnNwZWV4IFwKICAgICBleHRlcm5hbC9pY3U0Yy9jb21tb24gXAogICAgIGV4dGVybmFsL2V4cGF0L2xpYgogCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnNwZWV4Ci0KIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNlMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCkBAIC0wLDAgKzEsNDgxIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9FZmZlY3QiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KCkKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCkKK3sKK30KKworCitBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCisgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQKKyAgICAgICAgICAgICAgICApCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpCit7CisgICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIG91dHB1dCk7Cit9CisKK0F1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dAorICAgICAgICAgICAgICAgICkKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCkKK3sKKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgZWZmZWN0X3V1aWRfdCAqcFR5cGUgPSBOVUxMOworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBlZmZlY3RfdXVpZF90ICpwVXVpZCA9IE5VTEw7CisKKyAgICBMT0dWKCJDb25zdHJ1Y3RvciBzdHJpbmdcbiAtIHR5cGU6ICVzXG4gLSB1dWlkOiAlcyIsIHR5cGVTdHIsIHV1aWRTdHIpOworCisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgcFR5cGUgPSAmdHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBVdWlkID0gJnV1aWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhdHVzID0gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgc2Vzc2lvbklkLCBvdXRwdXQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoreworICAgIHNwPElFZmZlY3Q+IGlFZmZlY3Q7CisgICAgc3A8SU1lbW9yeT4gY2JsazsKKyAgICBpbnQgZW5hYmxlZDsKKworICAgIExPR1YoInNldCAlcCBtVXNlckRhdGE6ICVwIiwgdGhpcywgdXNlcik7CisKKyAgICBpZiAobUlFZmZlY3QgIT0gMCkgeworICAgICAgICBMT0dXKCJFZmZlY3QgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKKyAgICAgICAgTE9HRSgic2V0KCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmICh0eXBlID09IE5VTEwgJiYgdXVpZCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIk11c3Qgc3BlY2lmeSBhdCBsZWFzdCB0eXBlIG9yIHV1aWQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICBtQ2JmID0gY2JmOworICAgIG1Vc2VyRGF0YSA9IHVzZXI7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKworICAgIG1lbXNldCgmbURlc2NyaXB0b3IsIDAsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgbWVtY3B5KCZtRGVzY3JpcHRvci50eXBlLCBFRkZFQ1RfVVVJRF9OVUxMLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgIG1lbWNweSgmbURlc2NyaXB0b3IudXVpZCwgRUZGRUNUX1VVSURfTlVMTCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKworICAgIGlmICh0eXBlICE9IE5VTEwpIHsKKyAgICAgICAgbWVtY3B5KCZtRGVzY3JpcHRvci50eXBlLCB0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgIH0KKyAgICBpZiAodXVpZCAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweSgmbURlc2NyaXB0b3IudXVpZCwgdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICB9CisKKyAgICBtSUVmZmVjdENsaWVudCA9IG5ldyBFZmZlY3RDbGllbnQodGhpcyk7CisKKyAgICBpRWZmZWN0ID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVFZmZlY3QoZ2V0cGlkKCksIChlZmZlY3RfZGVzY3JpcHRvcl90ICopJm1EZXNjcmlwdG9yLAorICAgICAgICAgICAgbUlFZmZlY3RDbGllbnQsIHByaW9yaXR5LCBvdXRwdXQsIG1TZXNzaW9uSWQsICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CisKKyAgICBpZiAoaUVmZmVjdCA9PSAwIHx8IChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpKSB7CisgICAgICAgIExPR0UoInNldCgpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSBlZmZlY3QsIHN0YXR1czogJWQiLCBtU3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgfQorCisgICAgbUVuYWJsZWQgPSAodm9sYXRpbGUgaW50MzJfdCllbmFibGVkOworCisgICAgbUlFZmZlY3QgPSBpRWZmZWN0OworICAgIGNibGsgPSBpRWZmZWN0LT5nZXRDYmxrKCk7CisgICAgaWYgKGNibGsgPT0gMCkgeworICAgICAgICBtU3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CisgICAgICAgIHJldHVybiBtU3RhdHVzOworICAgIH0KKworICAgIG1JRWZmZWN0ID0gaUVmZmVjdDsKKyAgICBtQ2Jsa01lbW9yeSA9IGNibGs7CisgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxlZmZlY3RfcGFyYW1fY2Jsa190Kj4oY2Jsay0+cG9pbnRlcigpKTsKKyAgICBpbnQgYnVmT2Zmc2V0ID0gKChzaXplb2YoZWZmZWN0X3BhcmFtX2NibGtfdCkgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKyAgICBtQ2Jsay0+YnVmZmVyID0gKHVpbnQ4X3QgKiltQ2JsayArIGJ1Zk9mZnNldDsKKworICAgIGlFZmZlY3QtPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKKyAgICBMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCwgIiwgdGhpcywgbURlc2NyaXB0b3IubmFtZSwgbUlkLCBtU3RhdHVzLCBtRW5hYmxlZCk7CisKKyAgICByZXR1cm4gbVN0YXR1czsKK30KKworCitBdWRpb0VmZmVjdDo6fkF1ZGlvRWZmZWN0KCkKK3sKKyAgICBMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CisKKyAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUiB8fCBtU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIHNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBpZiAobUlFZmZlY3QgIT0gTlVMTCkgeworICAgICAgICAgICAgbUlFZmZlY3QtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1JRWZmZWN0LT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKKyAgICAgICAgfQorICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KKyAgICBtSUVmZmVjdC5jbGVhcigpOworICAgIG1JRWZmZWN0Q2xpZW50LmNsZWFyKCk7CisgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKK30KKworCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6aW5pdENoZWNrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVN0YXR1czsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlZmZlY3RfZGVzY3JpcHRvcl90IEF1ZGlvRWZmZWN0OjpkZXNjcmlwdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbURlc2NyaXB0b3I7Cit9CisKK2Jvb2wgQXVkaW9FZmZlY3Q6OmdldEVuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiAobUVuYWJsZWQgIT0gMCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgTE9HVigiZW5hYmxlICVwIiwgdGhpcyk7CisgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19vcigxLCAmbUVuYWJsZWQpID09IDApIHsKKyAgICAgICAgICAgcmV0dXJuIG1JRWZmZWN0LT5lbmFibGUoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1YoImRpc2FibGUgJXAiLCB0aGlzKTsKKyAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2FuZCh+MSwgJm1FbmFibGVkKSA9PSAxKSB7CisgICAgICAgICAgIHJldHVybiBtSUVmZmVjdC0+ZGlzYWJsZSgpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlcGx5RGF0YSkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUiAmJiBtU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSUVmZmVjdC0+Y29tbWFuZChjbWRDb2RlLCBjbWRTaXplLCBjbWREYXRhLCByZXBseVNpemUsIHJlcGx5RGF0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0dXMgPSAqKHN0YXR1c190ICopcmVwbHlEYXRhOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0VOQUJMRSkgeworICAgICAgICBhbmRyb2lkX2F0b21pY19vcigxLCAmbUVuYWJsZWQpOworICAgIH0KKyAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0RJU0FCTEUpIHsKKyAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH4xLCAmbUVuYWJsZWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKQoreworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCBwYXJhbS0+cHNpemUgPT0gMCB8fCBwYXJhbS0+dnNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoaW50KTsKKyAgICB1aW50MzJfdCBwc2l6ZSA9ICgocGFyYW0tPnBzaXplIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCkgKyBwYXJhbS0+dnNpemU7CisKKyAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IHBhcmFtOiAlZCwgcGFyYW0yOiAlZCIsICooaW50ICopcGFyYW0tPmRhdGEsIChwYXJhbS0+cHNpemUgPT0gOCkgPyAqKChpbnQgKilwYXJhbS0+ZGF0YSArIDEpOiAtMSk7CisKKyAgICByZXR1cm4gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sIHNpemVvZiAoZWZmZWN0X3BhcmFtX3QpICsgcHNpemUsIHBhcmFtLCAmc2l6ZSwgJnBhcmFtLT5zdGF0dXMpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0UGFyYW1ldGVyRGVmZXJyZWQoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKQoreworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGFyYW0gPT0gTlVMTCB8fCBwYXJhbS0+cHNpemUgPT0gMCB8fCBwYXJhbS0+dnNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2Jsay0+bG9jayk7CisKKyAgICBpbnQgcHNpemUgPSAoKHBhcmFtLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpICsgcGFyYW0tPnZzaXplOworICAgIGludCBzaXplID0gKChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemUgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KTsKKworICAgIGlmIChtQ2Jsay0+Y2xpZW50SW5kZXggKyBzaXplID4gRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIGludCAqcCA9IChpbnQgKikobUNibGstPmJ1ZmZlciArIG1DYmxrLT5jbGllbnRJbmRleCk7CisgICAgKnArKyA9IHNpemU7CisgICAgbWVtY3B5KHAsIHBhcmFtLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemUpOworICAgIG1DYmxrLT5jbGllbnRJbmRleCArPSBzaXplOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0UGFyYW1ldGVyQ29tbWl0KCkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYmxrLT5sb2NrKTsKKyAgICBpZiAobUNibGstPmNsaWVudEluZGV4ID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICByZXR1cm4gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlULCAwLCBOVUxMLCAmc2l6ZSwgTlVMTCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpnZXRQYXJhbWV0ZXIoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKQoreworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChwYXJhbSA9PSBOVUxMIHx8IHBhcmFtLT5wc2l6ZSA9PSAwIHx8IHBhcmFtLT52c2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTE9HVigiZ2V0UGFyYW1ldGVyOiBwYXJhbTogJWQsIHBhcmFtMjogJWQiLCAqKGludCAqKXBhcmFtLT5kYXRhLCAocGFyYW0tPnBzaXplID09IDgpID8gKigoaW50ICopcGFyYW0tPmRhdGEgKyAxKTogLTEpOworCisgICAgdWludDMyX3QgcHNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgKChwYXJhbS0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KSArIHBhcmFtLT52c2l6ZTsKKworICAgIHJldHVybiBtSUVmZmVjdC0+Y29tbWFuZChFRkZFQ1RfQ01EX0dFVF9QQVJBTSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBhcmFtLT5wc2l6ZSwgcGFyYW0sICZwc2l6ZSwgcGFyYW0pOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBBdWRpb0VmZmVjdDo6YmluZGVyRGllZCgpCit7CisgICAgTE9HVygiSUVmZmVjdCBkaWVkIik7CisgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CisgICAgaWYgKG1DYmYpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIG1DYmYoRVZFTlRfRVJST1IsIG1Vc2VyRGF0YSwgJnN0YXR1cyk7CisgICAgfQorICAgIG1JRWZmZWN0LmNsZWFyKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBBdWRpb0VmZmVjdDo6Y29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkKK3sKKyAgICBMT0dWKCJjb250cm9sU3RhdHVzQ2hhbmdlZCAlcCBjb250cm9sICVkIGNhbGxiYWNrICVwIG1Vc2VyRGF0YSAlcCIsIHRoaXMsIGNvbnRyb2xHcmFudGVkLCBtQ2JmLCBtVXNlckRhdGEpOworICAgIGlmIChjb250cm9sR3JhbnRlZCkgeworICAgICAgICBpZiAobVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUNiZikgeworICAgICAgICBtQ2JmKEVWRU5UX0NPTlRST0xfU1RBVFVTX0NIQU5HRUQsIG1Vc2VyRGF0YSwgJmNvbnRyb2xHcmFudGVkKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9FZmZlY3Q6OmVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKQoreworICAgIExPR1YoImVuYWJsZVN0YXR1c0NoYW5nZWQgJXAgZW5hYmxlZCAlZCBtQ2JmICVwIiwgdGhpcywgZW5hYmxlZCwgbUNiZik7CisgICAgaWYgKG1TdGF0dXMgPT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKDEsICZtRW5hYmxlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofjEsICZtRW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1DYmYpIHsKKyAgICAgICAgICAgIG1DYmYoRVZFTlRfRU5BQkxFX1NUQVRVU19DSEFOR0VELCBtVXNlckRhdGEsICZlbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0VmZmVjdDo6Y29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXBseURhdGEpCit7CisgICAgaWYgKGNtZERhdGEgPT0gTlVMTCB8fCByZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYmYgJiYgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTSkgeworICAgICAgICBlZmZlY3RfcGFyYW1fdCAqY21kID0gKGVmZmVjdF9wYXJhbV90ICopY21kRGF0YTsKKyAgICAgICAgY21kLT5zdGF0dXMgPSAqKGludDMyX3QgKilyZXBseURhdGE7CisgICAgICAgIG1DYmYoRVZFTlRfUEFSQU1FVEVSX0NIQU5HRUQsIG1Vc2VyRGF0YSwgY21kKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5sb2FkRWZmZWN0TGlicmFyeShsaWJQYXRoLCBoYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6dW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT51bmxvYWRFZmZlY3RMaWJyYXJ5KGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKm51bUVmZmVjdHMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYWYtPnF1ZXJ5TnVtYmVyRWZmZWN0cyhudW1FZmZlY3RzKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5xdWVyeUVmZmVjdChpbmRleCwgZGVzY3JpcHRvcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgKnV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgZGVzY3JpcHRvcik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKmd1aWQpCit7CisgICAgaWYgKHN0ciA9PSBOVUxMIHx8IGd1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludCB0bXBbMTBdOworCisgICAgaWYgKHNzY2FuZihzdHIsICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICB0bXAsIHRtcCsxLCB0bXArMiwgdG1wKzMsIHRtcCs0LCB0bXArNSwgdG1wKzYsIHRtcCs3LCB0bXArOCwgdG1wKzkpIDwgMTApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZ3VpZC0+dGltZUxvdyA9ICh1aW50MzJfdCl0bXBbMF07CisgICAgZ3VpZC0+dGltZU1pZCA9ICh1aW50MTZfdCl0bXBbMV07CisgICAgZ3VpZC0+dGltZUhpQW5kVmVyc2lvbiA9ICh1aW50MTZfdCl0bXBbMl07CisgICAgZ3VpZC0+Y2xvY2tTZXEgPSAodWludDE2X3QpdG1wWzNdOworICAgIGd1aWQtPm5vZGVbMF0gPSAodWludDhfdCl0bXBbNF07CisgICAgZ3VpZC0+bm9kZVsxXSA9ICh1aW50OF90KXRtcFs1XTsKKyAgICBndWlkLT5ub2RlWzJdID0gKHVpbnQ4X3QpdG1wWzZdOworICAgIGd1aWQtPm5vZGVbM10gPSAodWludDhfdCl0bXBbN107CisgICAgZ3VpZC0+bm9kZVs0XSA9ICh1aW50OF90KXRtcFs4XTsKKyAgICBndWlkLT5ub2RlWzVdID0gKHVpbnQ4X3QpdG1wWzldOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKGNvbnN0IGVmZmVjdF91dWlkX3QgKmd1aWQsIGNoYXIgKnN0ciwgc2l6ZV90IG1heExlbikKK3sKKyAgICBpZiAoZ3VpZCA9PSBOVUxMIHx8IHN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc25wcmludGYoc3RyLCBtYXhMZW4sICIlMDh4LSUwNHgtJTA0eC0lMDR4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisgICAgICAgICAgICBndWlkLT50aW1lTG93LAorICAgICAgICAgICAgZ3VpZC0+dGltZU1pZCwKKyAgICAgICAgICAgIGd1aWQtPnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICBndWlkLT5jbG9ja1NlcSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbMF0sCisgICAgICAgICAgICBndWlkLT5ub2RlWzFdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVsyXSwKKyAgICAgICAgICAgIGd1aWQtPm5vZGVbM10sCisgICAgICAgICAgICBndWlkLT5ub2RlWzRdLAorICAgICAgICAgICAgZ3VpZC0+bm9kZVs1XSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCmluZGV4IGFkMDM3ZDYuLmE2YzUxNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKQEAgLTQxLDExICs0MSw0MyBAQAogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gc3RhdGljCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6Z2V0TWluRnJhbWVDb3VudCgKKyAgICAgICAgaW50KiBmcmFtZUNvdW50LAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICBpbnQgY2hhbm5lbENvdW50KQoreworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBpZiAoQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgJnNpemUpCisgICAgICAgICAgICAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplLiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIExPR0UoIlVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb246IHNhbXBsZVJhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbENvdW50ICVkIiwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBXZSBkb3VibGUgdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGZvciBwaW5nIHBvbmcgdXNlIG9mIHJlY29yZCBidWZmZXIuCisgICAgc2l6ZSA8PD0gMTsKKworICAgIGlmIChBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00oZm9ybWF0KSkgeworICAgICAgICBzaXplIC89IGNoYW5uZWxDb3VudCAqIChmb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQgPyAyIDogMSk7CisgICAgfQorCisgICAgKmZyYW1lQ291bnQgPSBzaXplOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZCgpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApCiB7CiB9CiAKQEAgLTU4LDExICs5MCwxMiBAQAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMpCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpCisgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGludCBzZXNzaW9uSWQpCisgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtU2Vzc2lvbklkKDApCiB7CiAgICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVscywKLSAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcyk7CisgICAgICAgICAgICBmcmFtZUNvdW50LCBmbGFncywgY2JmLCB1c2VyLCBub3RpZmljYXRpb25GcmFtZXMsIHNlc3Npb25JZCk7CiB9CiAKIEF1ZGlvUmVjb3JkOjp+QXVkaW9SZWNvcmQoKQpAQCAtOTEsNyArMTI0LDggQEAKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEpCisgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCisgICAgICAgIGludCBzZXNzaW9uSWQpCiB7CiAKICAgICBMT0dWKCJzZXQoKTogc2FtcGxlUmF0ZSAlZCwgY2hhbm5lbHMgJWQsIGZyYW1lQ291bnQgJWQiLHNhbXBsZVJhdGUsIGNoYW5uZWxzLCBmcmFtZUNvdW50KTsKQEAgLTExOSw2ICsxNTMsNyBAQAogICAgIGlmICghQXVkaW9TeXN0ZW06OmlzSW5wdXRDaGFubmVsKGNoYW5uZWxzKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKwogICAgIGludCBjaGFubmVsQ291bnQgPSBBdWRpb1N5c3RlbTo6cG9wQ291bnQoY2hhbm5lbHMpOwogCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXQoaW5wdXRTb3VyY2UsCkBAIC0xMjksMjkgKzE2NCwxMSBAQAogICAgIH0KIAogICAgIC8vIHZhbGlkYXRlIGZyYW1lY291bnQKLSAgICBzaXplX3QgaW5wdXRCdWZmU2l6ZUluQnl0ZXMgPSAtMTsKLSAgICBpZiAoQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgJmlucHV0QnVmZlNpemVJbkJ5dGVzKQotICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZS4iKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgaW50IG1pbkZyYW1lQ291bnQgPSAwOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1pbkZyYW1lQ291bnQoJm1pbkZyYW1lQ291bnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotCi0gICAgaWYgKGlucHV0QnVmZlNpemVJbkJ5dGVzID09IDApIHsKLSAgICAgICAgTE9HRSgiUmVjb3JkaW5nIHBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQ6IHNhbXBsZVJhdGUgJWQsIGNoYW5uZWxDb3VudCAlZCwgZm9ybWF0ICVkIiwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpbnQgZnJhbWVTaXplSW5CeXRlcyA9IGNoYW5uZWxDb3VudCAqIChmb3JtYXQgPT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQgPyAyIDogMSk7Ci0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShmb3JtYXQpKSB7Ci0gICAgICAgIGZyYW1lU2l6ZUluQnl0ZXMgPSBjaGFubmVsQ291bnQgKiAoZm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUID8gc2l6ZW9mKGludDE2X3QpIDogc2l6ZW9mKGludDhfdCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lU2l6ZUluQnl0ZXMgPSBzaXplb2YoaW50OF90KTsKLSAgICB9Ci0KLQotICAgIC8vIFdlIHVzZSAyKiBzaXplIG9mIGlucHV0IGJ1ZmZlciBmb3IgcGluZyBwb25nIHVzZSBvZiByZWNvcmQgYnVmZmVyLgotICAgIGludCBtaW5GcmFtZUNvdW50ID0gMiAqIGlucHV0QnVmZlNpemVJbkJ5dGVzIC8gZnJhbWVTaXplSW5CeXRlczsKICAgICBMT0dWKCJBdWRpb1JlY29yZDo6c2V0KCkgbWluRnJhbWVDb3VudCA9ICVkIiwgbWluRnJhbWVDb3VudCk7CiAKICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7CkBAIC0xNjQsMTAgKzE4MSwxMSBAQAogICAgICAgICBub3RpZmljYXRpb25GcmFtZXMgPSBmcmFtZUNvdW50LzI7CiAgICAgfQogCi0gICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuUmVjb3JkKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGlucHV0KTsKKyAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogCisgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9SZWNvcmQKKyAgICBzdGF0dXMgPSBvcGVuUmVjb3JkKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGlucHV0KTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQpAQCAtNDE0LDYgKzQzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdClmbGFncykgPDwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAgICAgaWYgKHJlY29yZCA9PSAwKSB7CiAgICAgICAgIExPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHJlY29yZCB0cmFjaywgc3RhdHVzOiAlZCIsIHN0YXR1cyk7CkBAIC00MzAsNyArNDQ5LDcgQEAKICAgICBtQ2Jsa01lbW9yeSA9IGNibGs7CiAgICAgbUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwogICAgIG1DYmxrLT5idWZmZXJzID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7Ci0gICAgbUNibGstPm91dCA9IDA7CisgICAgbUNibGstPmZsYWdzICY9IH5DQkxLX0RJUkVDVElPTl9NU0s7CiAgICAgbUNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKICAgICBtQ2Jsay0+d2FpdFRpbWVNcyA9IDA7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTMyLDYgKzU1MSwxMSBAQAogICAgIHJldHVybiBtSW5wdXQ7CiB9CiAKK2ludCBBdWRpb1JlY29yZDo6Z2V0U2Vzc2lvbklkKCkKK3sKKyAgICByZXR1cm4gbVNlc3Npb25JZDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzc2l6ZV90IEF1ZGlvUmVjb3JkOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplKQpAQCAtNjQ0LDEwICs2NjgsMTAgQEAKIAogICAgIC8vIE1hbmFnZSBvdmVycnVuIGNhbGxiYWNrCiAgICAgaWYgKG1BY3RpdmUgJiYgKG1DYmxrLT5mcmFtZXNBdmFpbGFibGVfbCgpID09IDApKSB7Ci0gICAgICAgIExPR1YoIk92ZXJydW4gdXNlcjogJXgsIHNlcnZlcjogJXgsIGZsb3dDb250cm9sRmxhZyAlZCIsIG1DYmxrLT51c2VyLCBtQ2Jsay0+c2VydmVyLCBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnKTsKLSAgICAgICAgaWYgKG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPT0gMCkgeworICAgICAgICBMT0dWKCJPdmVycnVuIHVzZXI6ICV4LCBzZXJ2ZXI6ICV4LCBmbGFncyAlMDR4IiwgbUNibGstPnVzZXIsIG1DYmxrLT5zZXJ2ZXIsIG1DYmxrLT5mbGFncyk7CisgICAgICAgIGlmICgobUNibGstPmZsYWdzICYgQ0JMS19VTkRFUlJVTl9NU0spID09IENCTEtfVU5ERVJSVU5fT0ZGKSB7CiAgICAgICAgICAgICBtQ2JmKEVWRU5UX09WRVJSVU4sIG1Vc2VyRGF0YSwgMCk7Ci0gICAgICAgICAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKKyAgICAgICAgICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX1VOREVSUlVOX09OOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKaW5kZXggNWU2Y2U0Mi4uN2UzYjc0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcApAQCAtMzY0LDYgKzM2NCwxMiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK2ludCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9TZXNzaW9uSWQoKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiAwOworICAgIHJldHVybiBhZi0+bmV3QXVkaW9TZXNzaW9uSWQoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CkBAIC01ODQsMTggKzU5MCwyMiBAQAogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtKTsKKyAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCkBAIC02NjAsNiArNjcwLDM4IEBACiAgICAgcmV0dXJuIGFwcy0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCk7CiB9CiAKK3VpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gYXBzLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzYyk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgb3V0cHV0LCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCmluZGV4IGNkN2JjZDUuLjg5MDc4NmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvVHJhY2suY3BwCkBAIC00MSw2ICs0MSwzNSBAQAogI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gc3RhdGljCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50KAorICAgICAgICBpbnQqIGZyYW1lQ291bnQsCisgICAgICAgIGludCBzdHJlYW1UeXBlLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKQoreworICAgIGludCBhZlNhbXBsZVJhdGU7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCBhZkZyYW1lQ291bnQ7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICB1aW50MzJfdCBhZkxhdGVuY3k7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQorICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5IC8gKCgxMDAwICogYWZGcmFtZUNvdW50KSAvIGFmU2FtcGxlUmF0ZSk7CisgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgbWluQnVmQ291bnQgPSAyOworCisgICAgKmZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSA9PSAwKSA/IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50IDoKKyAgICAgICAgICAgICAgYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiBzYW1wbGVSYXRlIC8gYWZTYW1wbGVSYXRlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTU4LDExICs4NywxMyBAQAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMpCisgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7CiAgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAotICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCAwKTsKKyAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgICAgIDAsIGZhbHNlLCBzZXNzaW9uSWQpOwogfQogCiBBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKApAQCAtNzQsMTEgKzEwNSwxMyBAQAogICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMpCisgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCisgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpCiB7CiAgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLAotICAgICAgICAgICAgMCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIpOworICAgICAgICAgICAgMCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAorICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSwgc2Vzc2lvbklkKTsKIH0KIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQpAQCAtMTEwLDcgKzE0Myw4IEBACiAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgIGludCBub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCi0gICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEpCisgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEsCisgICAgICAgIGludCBzZXNzaW9uSWQpCiB7CiAKICAgICBMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwpAQCAtMTI0LDEwICsxNTgsNiBAQAogICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpbnQgYWZGcmFtZUNvdW50OwotICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9CiAgICAgdWludDMyX3QgYWZMYXRlbmN5OwogICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE3Myw0OCArMjAzLDE3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNMaW5lYXJQQ00oZm9ybWF0KSkgewotICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQotICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGFmTGF0ZW5jeSAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkvYWZTYW1wbGVSYXRlKTsKLSAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgbWluQnVmQ291bnQgPSAyOwotCi0gICAgICAgIGludCBtaW5GcmFtZUNvdW50ID0gKGFmRnJhbWVDb3VudCpzYW1wbGVSYXRlKm1pbkJ1ZkNvdW50KS9hZlNhbXBsZVJhdGU7Ci0KLSAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uRnJhbWVzID09IDApIHsKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMgPSBmcmFtZUNvdW50LzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luCi0gICAgICAgICAgICAvLyBiZWZvcmUgdW5kZXJydW4KLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb25GcmFtZXMgPiBmcmFtZUNvdW50LzIpIHsKLSAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMgPSBmcmFtZUNvdW50LzI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIgc2l6ZTogbWluRnJhbWVDb3VudCAlZCwgZnJhbWVDb3VudCAlZCIsIG1pbkZyYW1lQ291bnQsIGZyYW1lQ291bnQpOwotICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGFsaWdubWVudCBtYXRjaGVzIGNoYW5uZWxjb3VudAotICAgICAgICAgICAgaWYgKCgodWludDMyX3Qpc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgJiAoY2hhbm5lbENvdW50IHwgMSkpICE9IDApIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGJ1ZmZlciBhbGlnbmVtZW50OiBhZGRyZXNzICVwLCBjaGFubmVsQ291bnQgJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpL2NoYW5uZWxDb3VudC9zaXplb2YoaW50MTZfdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBtVm9sdW1lW0xFRlRdID0gMS4wZjsKICAgICBtVm9sdW1lW1JJR0hUXSA9IDEuMGY7CisgICAgbVNlbmRMZXZlbCA9IDA7CisgICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPSBub3RpZmljYXRpb25GcmFtZXM7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBtQXV4RWZmZWN0SWQgPSAwOworCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawogICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZVRyYWNrKHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBzaGFyZWRCdWZmZXIsIG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIHNoYXJlZEJ1ZmZlciwgb3V0cHV0LCB0cnVlKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTIzOCwxMCArMjM3LDcgQEAKICAgICBtTXV0ZWQgPSBmYWxzZTsKICAgICBtQWN0aXZlID0gMDsKICAgICBtQ2JmID0gY2JmOwotICAgIG1Ob3RpZmljYXRpb25GcmFtZXMgPSBub3RpZmljYXRpb25GcmFtZXM7Ci0gICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKICAgICBtVXNlckRhdGEgPSB1c2VyOwotICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqbUZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZTsKICAgICBtTG9vcENvdW50ID0gMDsKICAgICBtTWFya2VyUG9zaXRpb24gPSAwOwogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CkBAIC0yODEsNyArMjc3LDcgQEAKIAogdWludDMyX3QgQXVkaW9UcmFjazo6ZnJhbWVDb3VudCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1GcmFtZUNvdW50OworICAgIHJldHVybiBtQ2Jsay0+ZnJhbWVDb3VudDsKIH0KIAogaW50IEF1ZGlvVHJhY2s6OmZyYW1lU2l6ZSgpIGNvbnN0CkBAIC0zMDMsNiArMjk5LDcgQEAKIHZvaWQgQXVkaW9UcmFjazo6c3RhcnQoKQogewogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CiAKICAgICBMT0dWKCJzdGFydCAlcCIsIHRoaXMpOwogICAgIGlmICh0ICE9IDApIHsKQEAgLTMyNSwxMSArMzIyLDE4IEBACiAgICAgICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIFRIUkVBRF9QUklPUklUWV9BVURJT19DTElFTlQpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgICAgIGlmIChtQ2Jsay0+ZmxhZ3MgJiBDQkxLX0lOVkFMSURfTVNLKSB7CisgICAgICAgICAgICBMT0dXKCJzdGFydCgpIHRyYWNrICVwIGludmFsaWRhdGVkLCBjcmVhdGluZyBhIG5ldyBvbmUiLCB0aGlzKTsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2xlYXIgdGhlIGludmFsaWQgZmxhZyBhcyB0aGlzIGNibGsgd2lsbCBub3QgYmUgdXNlZCBhbnltb3JlCisgICAgICAgICAgICAvLyBmb3JjZSBuZXcgdHJhY2sgY3JlYXRpb24KKyAgICAgICAgICAgIHN0YXR1cyA9IERFQURfT0JKRUNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgTE9HVigic3RhcnQoKSBkZWFkIElBdWRpb1RyYWNrOiBjcmVhdGluZyBhIG5ldyBvbmUiKTsKICAgICAgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrKG1TdHJlYW1UeXBlLCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtRmxhZ3MsIG1TaGFyZWRCdWZmZXIsIGdldE91dHB1dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtRmxhZ3MsIG1TaGFyZWRCdWZmZXIsIGdldE91dHB1dCgpLCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtNDMwLDE5ICs0MzQsNTAgQEAKICAgICByZXR1cm4gbU11dGVkOwogfQogCi12b2lkIEF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkKIHsKKyAgICBpZiAobGVmdCA+IDEuMGYgfHwgcmlnaHQgPiAxLjBmKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgbVZvbHVtZVtMRUZUXSA9IGxlZnQ7CiAgICAgbVZvbHVtZVtSSUdIVF0gPSByaWdodDsKIAogICAgIC8vIHdyaXRlIG11c3QgYmUgYXRvbWljCi0gICAgbUNibGstPnZvbHVtZUxSID0gKGludDMyX3QoaW50MTZfdChsZWZ0ICogMHgxMDAwKSkgPDwgMTYpIHwgaW50MTZfdChyaWdodCAqIDB4MTAwMCk7CisgICAgbUNibGstPnZvbHVtZUxSID0gKHVpbnQzMl90KHVpbnQxNl90KHJpZ2h0ICogMHgxMDAwKSkgPDwgMTYpIHwgdWludDE2X3QobGVmdCAqIDB4MTAwMCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHZvaWQgQXVkaW9UcmFjazo6Z2V0Vm9sdW1lKGZsb2F0KiBsZWZ0LCBmbG9hdCogcmlnaHQpCiB7Ci0gICAgKmxlZnQgID0gbVZvbHVtZVtMRUZUXTsKLSAgICAqcmlnaHQgPSBtVm9sdW1lW1JJR0hUXTsKKyAgICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgICAgICpsZWZ0ICA9IG1Wb2x1bWVbTEVGVF07CisgICAgfQorICAgIGlmIChyaWdodCAhPSBOVUxMKSB7CisgICAgICAgICpyaWdodCA9IG1Wb2x1bWVbUklHSFRdOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQoreworICAgIExPR1YoInNldEF1eEVmZmVjdFNlbmRMZXZlbCglZikiLCBsZXZlbCk7CisgICAgaWYgKGxldmVsID4gMS4wZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKKworICAgIG1DYmxrLT5zZW5kTGV2ZWwgPSB1aW50MTZfdChsZXZlbCAqIDB4MTAwMCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9UcmFjazo6Z2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0KiBsZXZlbCkKK3sKKyAgICBpZiAobGV2ZWwgIT0gTlVMTCkgeworICAgICAgICAqbGV2ZWwgID0gbVNlbmRMZXZlbDsKKyAgICB9CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUoaW50IHJhdGUpCkBAIC00NzksMTQgKzUxNCwxNCBAQAogICAgIH0KIAogICAgIGlmIChsb29wU3RhcnQgPj0gbG9vcEVuZCB8fAotICAgICAgICBsb29wRW5kIC0gbG9vcFN0YXJ0ID4gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgTE9HRSgic2V0TG9vcCBpbnZhbGlkIHZhbHVlOiBsb29wU3RhcnQgJWQsIGxvb3BFbmQgJWQsIGxvb3BDb3VudCAlZCwgZnJhbWVjb3VudCAlZCwgdXNlciAlZCIsIGxvb3BTdGFydCwgbG9vcEVuZCwgbG9vcENvdW50LCBtRnJhbWVDb3VudCwgY2Jsay0+dXNlcik7CisgICAgICAgIGxvb3BFbmQgLSBsb29wU3RhcnQgPiBjYmxrLT5mcmFtZUNvdW50KSB7CisgICAgICAgIExPR0UoInNldExvb3AgaW52YWxpZCB2YWx1ZTogbG9vcFN0YXJ0ICVkLCBsb29wRW5kICVkLCBsb29wQ291bnQgJWQsIGZyYW1lY291bnQgJWQsIHVzZXIgJWQiLCBsb29wU3RhcnQsIGxvb3BFbmQsIGxvb3BDb3VudCwgY2Jsay0+ZnJhbWVDb3VudCwgY2Jsay0+dXNlcik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKChtU2hhcmVkQnVmZmVyICE9IDApICYmIChsb29wRW5kICAgPiBtRnJhbWVDb3VudCkpIHsKKyAgICBpZiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgJiYgKGxvb3BFbmQgICA+IGNibGstPmZyYW1lQ291bnQpKSB7CiAgICAgICAgIExPR0UoInNldExvb3AgaW52YWxpZCB2YWx1ZTogbG9vcCBtYXJrZXJzIGJleW9uZCBkYXRhOiBsb29wU3RhcnQgJWQsIGxvb3BFbmQgJWQsIGZyYW1lY291bnQgJWQiLAotICAgICAgICAgICAgbG9vcFN0YXJ0LCBsb29wRW5kLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBsb29wU3RhcnQsIGxvb3BFbmQsIGNibGstPmZyYW1lQ291bnQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNTY2LDcgKzYwMSw3IEBACiAgICAgaWYgKHBvc2l0aW9uID4gbUNibGstPnVzZXIpIHJldHVybiBCQURfVkFMVUU7CiAKICAgICBtQ2Jsay0+c2VydmVyID0gcG9zaXRpb247Ci0gICAgbUNibGstPmZvcmNlUmVhZHkgPSAxOworICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX0ZPUkNFUkVBRFlfT047CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC01ODYsNyArNjIxLDcgQEAKIAogICAgIGZsdXNoKCk7CiAKLSAgICBtQ2Jsay0+c3RlcFVzZXIobUZyYW1lQ291bnQpOworICAgIG1DYmxrLT5zdGVwVXNlcihtQ2Jsay0+ZnJhbWVDb3VudCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC01OTcsNiArNjMyLDIxIEBACiAgICAgICAgICAgICBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxzLCAoQXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncyltRmxhZ3MpOwogfQogCitpbnQgQXVkaW9UcmFjazo6Z2V0U2Vzc2lvbklkKCkKK3sKKyAgICByZXR1cm4gbVNlc3Npb25JZDsKK30KKworc3RhdHVzX3QgQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKK3sKKyAgICBMT0dWKCJhdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUF1eEVmZmVjdElkID0gZWZmZWN0SWQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Y3JlYXRlVHJhY2soCkBAIC02MDcsNyArNjU3LDggQEAKICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgYm9vbCBlbmZvcmNlRnJhbWVDb3VudCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwpAQCAtNjE2LDYgKzY2Nyw2MSBAQAogICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIGludCBhZlNhbXBsZVJhdGU7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoJmFmU2FtcGxlUmF0ZSwgc3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCBhZkZyYW1lQ291bnQ7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZhZkZyYW1lQ291bnQsIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICB1aW50MzJfdCBhZkxhdGVuY3k7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KCZhZkxhdGVuY3ksIHN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBtTm90aWZpY2F0aW9uRnJhbWVzUmVxOworICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpIHsKKyAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gc2hhcmVkQnVmZmVyLT5zaXplKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKKyAgICAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3kgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpL2FmU2FtcGxlUmF0ZSk7CisgICAgICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIG1pbkJ1ZkNvdW50ID0gMjsKKworICAgICAgICBpbnQgbWluRnJhbWVDb3VudCA9IChhZkZyYW1lQ291bnQqc2FtcGxlUmF0ZSptaW5CdWZDb3VudCkvYWZTYW1wbGVSYXRlOworCisgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCkgeworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50LzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhcHBsaWNhdGlvbiBpcyBub3RpZmllZCB3aXRoIHN1ZmZpY2llbnQgbWFyZ2luCisgICAgICAgICAgICAvLyBiZWZvcmUgdW5kZXJydW4KKyAgICAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gKHVpbnQzMl90KWZyYW1lQ291bnQvMikgeworICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50LzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5mb3JjZUZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIgc2l6ZTogbWluRnJhbWVDb3VudCAlZCwgZnJhbWVDb3VudCAlZCIsIG1pbkZyYW1lQ291bnQsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBhbGlnbm1lbnQgbWF0Y2hlcyBjaGFubmVsY291bnQKKyAgICAgICAgICAgIGlmICgoKHVpbnQzMl90KXNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpICYgKGNoYW5uZWxDb3VudCB8IDEpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIgYWxpZ25lbWVudDogYWRkcmVzcyAlcCwgY2hhbm5lbENvdW50ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzaGFyZWRCdWZmZXItPnNpemUoKS9jaGFubmVsQ291bnQvc2l6ZW9mKGludDE2X3QpOworICAgICAgICB9CisgICAgfQorCiAgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhnZXRwaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLApAQCAtNjI1LDYgKzczMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90KWZsYWdzKSA8PCAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAodHJhY2sgPT0gMCkgewpAQCAtNjQxLDIwICs3NDgsMjIgQEAKICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCo+KGNibGstPnBvaW50ZXIoKSk7Ci0gICAgbUNibGstPm91dCA9IDE7Ci0gICAgLy8gVXBkYXRlIGJ1ZmZlciBzaXplIGluIGNhc2UgaXQgaGFzIGJlZW4gbGltaXRlZCBieSBBdWRpb0ZsaW5nZXIgZHVyaW5nIHRyYWNrIGNyZWF0aW9uCi0gICAgbUZyYW1lQ291bnQgPSBtQ2Jsay0+ZnJhbWVDb3VudDsKKyAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19ESVJFQ1RJT05fT1VUOwogICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICBtQ2Jsay0+YnVmZmVycyA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1DYmxrLT5idWZmZXJzID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CiAgICAgICAgICAvLyBGb3JjZSBidWZmZXIgZnVsbCBjb25kaXRpb24gYXMgZGF0YSBpcyBhbHJlYWR5IHByZXNlbnQgaW4gc2hhcmVkIG1lbW9yeQotICAgICAgICBtQ2Jsay0+c3RlcFVzZXIobUZyYW1lQ291bnQpOworICAgICAgICBtQ2Jsay0+c3RlcFVzZXIobUNibGstPmZyYW1lQ291bnQpOwogICAgIH0KIAotICAgIG1DYmxrLT52b2x1bWVMUiA9IChpbnQzMl90KGludDE2X3QobVZvbHVtZVtMRUZUXSAqIDB4MTAwMCkpIDw8IDE2KSB8IGludDE2X3QobVZvbHVtZVtSSUdIVF0gKiAweDEwMDApOworICAgIG1DYmxrLT52b2x1bWVMUiA9ICh1aW50MzJfdCh1aW50MTZfdChtVm9sdW1lW1JJR0hUXSAqIDB4MTAwMCkpIDw8IDE2KSB8IHVpbnQxNl90KG1Wb2x1bWVbTEVGVF0gKiAweDEwMDApOworICAgIG1DYmxrLT5zZW5kTGV2ZWwgPSB1aW50MTZfdChtU2VuZExldmVsICogMHgxMDAwKTsKKyAgICBtQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgbUNibGstPmJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9TVEFSVFVQX1RJTUVPVVRfTVM7CiAgICAgbUNibGstPndhaXRUaW1lTXMgPSAwOworICAgIG1SZW1haW5pbmdGcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OworICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqbUNibGstPmZyYW1lQ291bnQpIC8gc2FtcGxlUmF0ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTY4NSw4ICs3OTQsMTUgQEAKICAgICAgICAgICAgICAgICBjYmxrLT5sb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0ID0gY2Jsay0+Y3Yud2FpdFJlbGF0aXZlKGNibGstPmxvY2ssIG1pbGxpc2Vjb25kcyh3YWl0VGltZU1zKSk7CisgICAgICAgICAgICBpZiAoIShjYmxrLT5mbGFncyAmIENCTEtfSU5WQUxJRF9NU0spKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2Jsay0+Y3Yud2FpdFJlbGF0aXZlKGNibGstPmxvY2ssIG1pbGxpc2Vjb25kcyh3YWl0VGltZU1zKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2Jsay0+ZmxhZ3MgJiBDQkxLX0lOVkFMSURfTVNLKSB7CisgICAgICAgICAgICAgICAgTE9HVygib2J0YWluQnVmZmVyKCkgdHJhY2sgJXAgaW52YWxpZGF0ZWQsIGNyZWF0aW5nIGEgbmV3IG9uZSIsIHRoaXMpOworICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2xlYXIgdGhlIGludmFsaWQgZmxhZyBhcyB0aGlzIGNibGsgd2lsbCBub3QgYmUgdXNlZCBhbnltb3JlCisgICAgICAgICAgICAgICAgY2Jsay0+bG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBnb3RvIGNyZWF0ZV9uZXdfdHJhY2s7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoX19idWlsdGluX2V4cGVjdChyZXN1bHQhPU5PX0VSUk9SLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgICBjYmxrLT53YWl0VGltZU1zICs9IHdhaXRUaW1lTXM7CiAgICAgICAgICAgICAgICAgaWYgKGNibGstPndhaXRUaW1lTXMgPj0gY2Jsay0+YnVmZmVyVGltZW91dE1zKSB7CkBAIC03MDAsOCArODE2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR1coIm9idGFpbkJ1ZmZlcigpIGRlYWQgSUF1ZGlvVHJhY2s6IGNyZWF0aW5nIGEgbmV3IG9uZSIpOworY3JlYXRlX25ld190cmFjazoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVUcmFjayhtU3RyZWFtVHlwZSwgY2Jsay0+c2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCwgbUZsYWdzLCBtU2hhcmVkQnVmZmVyLCBnZXRPdXRwdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1GbGFncywgbVNoYXJlZEJ1ZmZlciwgZ2V0T3V0cHV0KCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGsgPSBtQ2JsazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+YnVmZmVyVGltZW91dE1zID0gTUFYX1JVTl9USU1FT1VUX01TOwpAQCAtODI2LDEzICs5NDMsMTMgQEAKIAogICAgIC8vIE1hbmFnZSB1bmRlcnJ1biBjYWxsYmFjawogICAgIGlmIChtQWN0aXZlICYmIChtQ2Jsay0+ZnJhbWVzUmVhZHkoKSA9PSAwKSkgewotICAgICAgICBMT0dWKCJVbmRlcnJ1biB1c2VyOiAleCwgc2VydmVyOiAleCwgZmxvd0NvbnRyb2xGbGFnICVkIiwgbUNibGstPnVzZXIsIG1DYmxrLT5zZXJ2ZXIsIG1DYmxrLT5mbG93Q29udHJvbEZsYWcpOwotICAgICAgICBpZiAobUNibGstPmZsb3dDb250cm9sRmxhZyA9PSAwKSB7CisgICAgICAgIExPR1YoIlVuZGVycnVuIHVzZXI6ICV4LCBzZXJ2ZXI6ICV4LCBmbGFncyAlMDR4IiwgbUNibGstPnVzZXIsIG1DYmxrLT5zZXJ2ZXIsIG1DYmxrLT5mbGFncyk7CisgICAgICAgIGlmICgobUNibGstPmZsYWdzICYgQ0JMS19VTkRFUlJVTl9NU0spID09IENCTEtfVU5ERVJSVU5fT0ZGKSB7CiAgICAgICAgICAgICBtQ2JmKEVWRU5UX1VOREVSUlVOLCBtVXNlckRhdGEsIDApOwogICAgICAgICAgICAgaWYgKG1DYmxrLT5zZXJ2ZXIgPT0gbUNibGstPmZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICBtQ2JmKEVWRU5UX0JVRkZFUl9FTkQsIG1Vc2VyRGF0YSwgMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKKyAgICAgICAgICAgIG1DYmxrLT5mbGFncyB8PSBDQkxLX1VOREVSUlVOX09OOwogICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtOTMyLDcgKzEwNDksNyBAQAogICAgIHdoaWxlIChmcmFtZXMpOwogCiAgICAgaWYgKGZyYW1lcyA9PSAwKSB7Ci0gICAgICAgIG1SZW1haW5pbmdGcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzOworICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICB9IGVsc2UgewogICAgICAgICBtUmVtYWluaW5nRnJhbWVzID0gZnJhbWVzOwogICAgIH0KQEAgLTk0OSw3ICsxMDY2LDcgQEAKICAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9UcmFjazo6ZHVtcFxuIik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLCBtU3RyZWFtVHlwZSwgbVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBmb3JtYXQoJWQpLCBjaGFubmVsIGNvdW50KCVkKSwgZnJhbWUgY291bnQoJWQpXG4iLCBtRm9ybWF0LCBtQ2hhbm5lbENvdW50LCBtRnJhbWVDb3VudCk7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGZvcm1hdCglZCksIGNoYW5uZWwgY291bnQoJWQpLCBmcmFtZSBjb3VudCglZClcbiIsIG1Gb3JtYXQsIG1DaGFubmVsQ291bnQsIG1DYmxrLT5mcmFtZUNvdW50KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHNhbXBsZSByYXRlKCVkKSwgc3RhdHVzKCVkKSwgbXV0ZWQoJWQpXG4iLCAobUNibGsgPT0gMCkgPyAwIDogbUNibGstPnNhbXBsZVJhdGUsIG1TdGF0dXMsIG1NdXRlZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwpAQCAtOTg2LDcgKzExMDMsNyBAQAogICAgIDogbG9jayhNdXRleDo6U0hBUkVEKSwgY3YoQ29uZGl0aW9uOjpTSEFSRUQpLCB1c2VyKDApLCBzZXJ2ZXIoMCksCiAgICAgdXNlckJhc2UoMCksIHNlcnZlckJhc2UoMCksIGJ1ZmZlcnMoMCksIGZyYW1lQ291bnQoMCksCiAgICAgbG9vcFN0YXJ0KFVJTlRfTUFYKSwgbG9vcEVuZChVSU5UX01BWCksIGxvb3BDb3VudCgwKSwgdm9sdW1lTFIoMCksCi0gICAgZmxvd0NvbnRyb2xGbGFnKDEpLCBmb3JjZVJlYWR5KDApCisgICAgZmxhZ3MoMCksIHNlbmRMZXZlbCgwKQogewogfQogCkBAIC05OTYsNyArMTExMyw3IEBACiAKICAgICB1ICs9IGZyYW1lQ291bnQ7CiAgICAgLy8gRW5zdXJlIHRoYXQgdXNlciBpcyBuZXZlciBhaGVhZCBvZiBzZXJ2ZXIgZm9yIEF1ZGlvUmVjb3JkCi0gICAgaWYgKG91dCkgeworICAgIGlmIChmbGFncyAmIENCTEtfRElSRUNUSU9OX01TSykgewogICAgICAgICAvLyBJZiBzdGVwU2VydmVyKCkgaGFzIGJlZW4gY2FsbGVkIG9uY2UsIHN3aXRjaCB0byBub3JtYWwgb2J0YWluQnVmZmVyKCkgdGltZW91dCBwZXJpb2QKICAgICAgICAgaWYgKGJ1ZmZlclRpbWVvdXRNcyA9PSBNQVhfU1RBUlRVUF9USU1FT1VUX01TLTEpIHsKICAgICAgICAgICAgIGJ1ZmZlclRpbWVvdXRNcyA9IE1BWF9SVU5fVElNRU9VVF9NUzsKQEAgLTEwMTMsNyArMTEzMCw3IEBACiAgICAgdGhpcy0+dXNlciA9IHU7CiAKICAgICAvLyBDbGVhciBmbG93IGNvbnRyb2wgZXJyb3IgY29uZGl0aW9uIGFzIG5ldyBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4vcmVhZCB0by9mcm9tIGJ1ZmZlci4KLSAgICBmbG93Q29udHJvbEZsYWcgPSAwOworICAgIGZsYWdzICY9IH5DQkxLX1VOREVSUlVOX01TSzsKIAogICAgIHJldHVybiB1OwogfQpAQCAtMTAzOCw3ICsxMTU1LDcgQEAKICAgICB1aW50MzJfdCBzID0gdGhpcy0+c2VydmVyOwogCiAgICAgcyArPSBmcmFtZUNvdW50OwotICAgIGlmIChvdXQpIHsKKyAgICBpZiAoZmxhZ3MgJiBDQkxLX0RJUkVDVElPTl9NU0spIHsKICAgICAgICAgLy8gTWFyayB0aGF0IHdlIGhhdmUgcmVhZCB0aGUgZmlyc3QgYnVmZmVyIHNvIHRoYXQgbmV4dCB0aW1lIHN0ZXBVc2VyKCkgaXMgY2FsbGVkCiAgICAgICAgIC8vIHdlIHN3aXRjaCB0byBub3JtYWwgb2J0YWluQnVmZmVyKCkgdGltZW91dCBwZXJpb2QKICAgICAgICAgaWYgKGJ1ZmZlclRpbWVvdXRNcyA9PSBNQVhfU1RBUlRVUF9USU1FT1VUX01TKSB7CkBAIC0xMDg5LDcgKzEyMDYsNyBAQAogICAgIHVpbnQzMl90IHUgPSB0aGlzLT51c2VyOwogICAgIHVpbnQzMl90IHMgPSB0aGlzLT5zZXJ2ZXI7CiAKLSAgICBpZiAob3V0KSB7CisgICAgaWYgKGZsYWdzICYgQ0JMS19ESVJFQ1RJT05fTVNLKSB7CiAgICAgICAgIHVpbnQzMl90IGxpbWl0ID0gKHMgPCBsb29wU3RhcnQpID8gcyA6IGxvb3BTdGFydDsKICAgICAgICAgcmV0dXJuIGxpbWl0ICsgZnJhbWVDb3VudCAtIHU7CiAgICAgfSBlbHNlIHsKQEAgLTExMDIsNyArMTIxOSw3IEBACiAgICAgdWludDMyX3QgdSA9IHRoaXMtPnVzZXI7CiAgICAgdWludDMyX3QgcyA9IHRoaXMtPnNlcnZlcjsKIAotICAgIGlmIChvdXQpIHsKKyAgICBpZiAoZmxhZ3MgJiBDQkxLX0RJUkVDVElPTl9NU0spIHsKICAgICAgICAgaWYgKHUgPCBsb29wRW5kKSB7CiAgICAgICAgICAgICByZXR1cm4gdSAtIHM7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDQ3YmNjMTIuLjNhODllMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC02Miw3ICs2MiwxNSBAQAogICAgIFNFVF9TVFJFQU1fT1VUUFVULAogICAgIFNFVF9WT0lDRV9WT0xVTUUsCiAgICAgR0VUX1JFTkRFUl9QT1NJVElPTiwKLSAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QKKyAgICBHRVRfSU5QVVRfRlJBTUVTX0xPU1QsCisgICAgTkVXX0FVRElPX1NFU1NJT05fSUQsCisgICAgTE9BRF9FRkZFQ1RfTElCUkFSWSwKKyAgICBVTkxPQURfRUZGRUNUX0xJQlJBUlksCisgICAgUVVFUllfTlVNX0VGRkVDVFMsCisgICAgUVVFUllfRUZGRUNULAorICAgIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwKKyAgICBDUkVBVEVfRUZGRUNULAorICAgIE1PVkVfRUZGRUNUUwogfTsKIAogY2xhc3MgQnBBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvRmxpbmdlcj4KQEAgLTgzLDYgKzkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtOTcsMTAgKzEwNiwxOSBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNoYXJlZEJ1ZmZlci0+YXNCaW5kZXIoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOworICAgICAgICBpbnQgbFNlc3Npb25JZCA9IDA7CisgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgeworICAgICAgICAgICAgbFNlc3Npb25JZCA9ICpzZXNzaW9uSWQ7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxTZXNzaW9uSWQpOwogICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9UUkFDSywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIExPR0UoImNyZWF0ZVRyYWNrIGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxTdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHRyYWNrID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvVHJhY2s+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgIH0KQEAgLTExOCw2ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMTMwLDEwICsxNDksMTkgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxDb3VudCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgaW50IGxTZXNzaW9uSWQgPSAwOworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihsU2Vzc2lvbklkKTsKICAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1JFQ09SRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIExPR0UoIm9wZW5SZWNvcmQgZXJyb3I6ICVzIiwgc3RyZXJyb3IoLWxTdGF0dXMpKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVjb3JkID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICB9CkBAIC00OTcsNiArNTI1LDE2OSBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOUFVUX0ZSQU1FU19MT1NULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBpbnQgbmV3QXVkaW9TZXNzaW9uSWQoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KE5FV19BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpbnQgaWQgPSAwOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQorICAgIHsKKyAgICAgICAgaWYgKGxpYlBhdGggPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqaGFuZGxlID0gMDsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobGliUGF0aCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMT0FEX0VGRkVDVF9MSUJSQVJZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAqaGFuZGxlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubG9hZEVmZmVjdExpYnJhcnkoaW50IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVU5MT0FEX0VGRkVDVF9MSUJSQVJZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFFVRVJZX05VTV9FRkZFQ1RTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChudW1FZmZlY3RzKSB7CisgICAgICAgICAgICAqbnVtRWZmZWN0cyA9ICh1aW50MzJfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCisgICAgeworICAgICAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFUllfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQocERlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X3V1aWRfdCAqcFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQorICAgIHsKKyAgICAgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHBVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0VGRkVDVF9ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlcGx5LnJlYWQocERlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdChwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0OworCisgICAgICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKKyAgICAgICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKKyAgICAgICAgZGF0YS53cml0ZShwRGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjbGllbnQtPmFzQmluZGVyKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7CisKKyAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiY3JlYXRlRWZmZWN0IGVycm9yOiAlcyIsIHN0cmVycm9yKC1sU3RhdHVzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsU3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgdG1wID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgICAgICAqaWQgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgKmVuYWJsZWQgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3QgPSBpbnRlcmZhY2VfY2FzdDxJRWZmZWN0PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHkucmVhZChwRGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlZmZlY3Q7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhpbnQgc2Vzc2lvbiwgaW50IHNyY091dHB1dCwgaW50IGRzdE91dHB1dCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNyY091dHB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkc3RPdXRwdXQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTU9WRV9FRkZFQ1RTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlciwgImFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlciIpOwpAQCAtNTE4LDEwICs3MDksMTIgQEAKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlciA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICAgICAgICAgIGludCBvdXRwdXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2sgPSBjcmVhdGVUcmFjayhwaWQsCiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBidWZmZXJDb3VudCwgZmxhZ3MsIGJ1ZmZlciwgb3V0cHV0LCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBidWZmZXJDb3VudCwgZmxhZ3MsIGJ1ZmZlciwgb3V0cHV0LCAmc2Vzc2lvbklkLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHRyYWNrLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTUzNSw5ICs3MjgsMTEgQEAKICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBzZXNzaW9uSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgICAgICAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBvcGVuUmVjb3JkKHBpZCwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBidWZmZXJDb3VudCwgZmxhZ3MsICZzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgYnVmZmVyQ291bnQsIGZsYWdzLCAmc2Vzc2lvbklkLCAmc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb25JZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKHJlY29yZC0+YXNCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC03NjgsNyArOTYzLDg3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGUpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBORVdfQVVESU9fU0VTU0lPTl9JRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG5ld0F1ZGlvU2Vzc2lvbklkKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIExPQURfRUZGRUNUX0xJQlJBUlk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgaGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbG9hZEVmZmVjdExpYnJhcnkoZGF0YS5yZWFkQ1N0cmluZygpLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFVOTE9BRF9FRkZFQ1RfTElCUkFSWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHVubG9hZEVmZmVjdExpYnJhcnkoZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgUVVFUllfTlVNX0VGRkVDVFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpbnVtRWZmZWN0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBRVUVSWV9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBxdWVyeUVmZmVjdChkYXRhLnJlYWRJbnQzMigpLCAmZGVzYyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnV1aWQsICZkZXNjKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ1JFQVRFX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHBpZF90IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgICAgICBzcDxJRWZmZWN0Q2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJRWZmZWN0Q2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBvdXRwdXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgICBpbnQgZW5hYmxlZDsKIAorICAgICAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0ID0gY3JlYXRlRWZmZWN0KHBpZCwgJmRlc2MsIGNsaWVudCwgcHJpb3JpdHksIG91dHB1dCwgc2Vzc2lvbklkLCAmc3RhdHVzLCAmaWQsICZlbmFibGVkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmFibGVkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihlZmZlY3QtPmFzQmluZGVyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE1PVkVfRUZGRUNUUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBzcmNPdXRwdXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGRzdE91dHB1dCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNPdXRwdXQsIGRzdE91dHB1dCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDE4ZGQxNzMuLjk1MGMyMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC00NCw3ICs0NCwxMSBAQAogICAgIFJFTEVBU0VfSU5QVVQsCiAgICAgSU5JVF9TVFJFQU1fVk9MVU1FLAogICAgIFNFVF9TVFJFQU1fVk9MVU1FLAotICAgIEdFVF9TVFJFQU1fVk9MVU1FCisgICAgR0VUX1NUUkVBTV9WT0xVTUUsCisgICAgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU0sCisgICAgR0VUX09VVFBVVF9GT1JfRUZGRUNULAorICAgIFJFR0lTVEVSX0VGRkVDVCwKKyAgICBVTlJFR0lTVEVSX0VGRkVDVAogfTsKIAogY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZT4KQEAgLTEzNywyMiArMTQxLDI4IEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24pCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW0pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICB9CkBAIC0yNDIsNiArMjUyLDUxIEBACiAgICAgICAgIGlmIChpbmRleCkgKmluZGV4ID0gbEluZGV4OwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0cmVhbSkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU0sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09VVFBVVF9GT1JfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZShkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIob3V0cHV0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmF0ZWd5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVU5SRUdJU1RFUl9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlIik7CkBAIC0yNTUsMTggKzMxMCwyNCBAQAogICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBzdGF0ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGU+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcykpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBHRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXM+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXM+IChkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcykpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0yODcsNyArMzQ4LDggQEAKICAgICAgICAgY2FzZSBTRVRfRk9SQ0VfVVNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZyA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWc+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMzAxLDExICszNjMsMTMgQEAKIAogICAgICAgICBjYXNlIEdFVF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06Om91dHB1dF9mbGFncz4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3M+KGRhdGEucmVhZEludDMyKCkpOwogCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBnZXRPdXRwdXQoc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKQEAgLTMyMCw3ICszODQsMTAgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LCAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSkpKTsKKyAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMzI4LDcgKzM5NSwxMCBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KG91dHB1dCwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlzdHJlYW0pKSk7CisgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0b3BPdXRwdXQob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTM0NSw3ICs0MTUsOCBAQAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzIGFjb3VzdGljcyA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6YXVkaW9faW5fYWNvdXN0aWNzPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3M+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBnZXRJbnB1dChpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCkBAIC0zNzgsNyArNDQ5LDggQEAKIAogICAgICAgICBjYXNlIElOSVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPSBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGludCBpbmRleE1pbiA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgaW5kZXhNYXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihpbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4saW5kZXhNYXgpKSk7CkBAIC0zODcsNyArNDU5LDggQEAKIAogICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9IHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGU+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTM5NSw3ICs0NjgsOCBAQAogCiAgICAgICAgIGNhc2UgR0VUX1NUUkVBTV9WT0xVTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0gc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZT4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpbnQgaW5kZXg7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sICZpbmRleCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CkBAIC00MDMsNiArNDc3LDQ2IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8QXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlPihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICAgICAgICAgICAgZGF0YS5yZWFkKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCZkZXNjKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KG91dHB1dCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgUkVHSVNURVJfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICAgICAgICAgICAgZGF0YS5yZWFkKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBzZXNzaW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVnaXN0ZXJFZmZlY3QoJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4odW5yZWdpc3RlckVmZmVjdChpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKaW5kZXggMDFmZmQ3NS4uYmM4ZmYzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcApAQCAtMzQsNyArMzQsOCBAQAogICAgIFNUT1AsCiAgICAgRkxVU0gsCiAgICAgTVVURSwKLSAgICBQQVVTRQorICAgIFBBVVNFLAorICAgIEFUVEFDSF9BVVhfRUZGRUNUCiB9OwogCiBjbGFzcyBCcEF1ZGlvVHJhY2sgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvVHJhY2s+CkBAIC05Nyw3ICs5OCwyMSBAQAogICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNibGs7Ci0gICAgfSAgICAKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVmZmVjdElkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSF9BVVhfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1coImF0dGFjaEF1eEVmZmVjdCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1RyYWNrLCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9UcmFjayIpOwpAQCAtMTM4LDYgKzE1MywxMSBAQAogICAgICAgICAgICAgcGF1c2UoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIEFUVEFDSF9BVVhfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGF0dGFjaEF1eEVmZmVjdChkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0NWI5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDEwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklFZmZlY3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIHsKKyAgICBFTkFCTEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIERJU0FCTEUsCisgICAgQ09NTUFORCwKKyAgICBESVNDT05ORUNULAorICAgIEdFVF9DQkxLCit9OworCitjbGFzcyBCcEVmZmVjdDogcHVibGljIEJwSW50ZXJmYWNlPElFZmZlY3Q+Cit7CitwdWJsaWM6CisgICAgQnBFZmZlY3QoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SUVmZmVjdD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgc3RhdHVzX3QgZW5hYmxlKCkKKyAgICB7CisgICAgICAgIExPR1YoImVuYWJsZSIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZGlzYWJsZSgpCisgICAgeworICAgICAgICBMT0dWKCJkaXNhYmxlIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNBQkxFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBSZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKQorICAgIHsKKyAgICAgICAgTE9HVigiY29tbWFuZCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY21kQ29kZSk7CisgICAgICAgIGludCBzaXplID0gY21kU2l6ZTsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGUocENtZERhdGEsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChwUmVwbHlTaXplID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZSA9ICpwUmVwbHlTaXplOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTU1BTkQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBzaXplID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzaXplICE9IDAgJiYgcFJlcGx5RGF0YSAhPSBOVUxMICYmIHBSZXBseVNpemUgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVwbHkucmVhZChwUmVwbHlEYXRhLCBzaXplKTsKKyAgICAgICAgICAgICpwUmVwbHlTaXplID0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpCisgICAgeworICAgICAgICBMT0dWKCJkaXNjb25uZWN0Iik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChESVNDT05ORUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3QKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNibGs7CisgICAgfQorIH07CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShFZmZlY3QsICJhbmRyb2lkLm1lZGlhLklFZmZlY3QiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbkVmZmVjdDo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQoreworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgRU5BQkxFOiB7CisgICAgICAgICAgICBMT0dWKCJFTkFCTEUiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbmFibGUoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBESVNBQkxFOiB7CisgICAgICAgICAgICBMT0dWKCJESVNBQkxFIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGlzYWJsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIENPTU1BTkQ6IHsKKyAgICAgICAgICAgIExPR1YoIkNPTU1BTkQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgY2hhciAqY21kID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChjbWRTaXplKSB7CisgICAgICAgICAgICAgICAgY21kID0gKGNoYXIgKiltYWxsb2MoY21kU2l6ZSk7CisgICAgICAgICAgICAgICAgZGF0YS5yZWFkKGNtZCwgY21kU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTeiA9IHJlcGx5U2l6ZTsKKyAgICAgICAgICAgIGNoYXIgKnJlc3AgPSBOVUxMOworICAgICAgICAgICAgaWYgKHJlcGx5U2l6ZSkgeworICAgICAgICAgICAgICAgIHJlc3AgPSAoY2hhciAqKW1hbGxvYyhyZXBseVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29tbWFuZChjbWRDb2RlLCBjbWRTaXplLCBjbWQsICZyZXBseVN6LCByZXNwKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAocmVwbHlTeiA8IHJlcGx5U2l6ZSkgeworICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9IHJlcGx5U3o7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXBseVNpemUpOworICAgICAgICAgICAgaWYgKHJlcGx5U2l6ZSkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShyZXNwLCByZXBseVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNtZCkgeworICAgICAgICAgICAgICAgIGZyZWUoY21kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXNwKSB7CisgICAgICAgICAgICAgICAgZnJlZShyZXNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6IHsKKyAgICAgICAgICAgIExPR1YoIkRJU0NPTk5FQ1QiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBkaXNjb25uZWN0KCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfQ0JMSzogeworICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGdldENibGsoKS0+YXNCaW5kZXIoKSk7CisgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE5Y2JlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSUVmZmVjdENsaWVudCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRWZmZWN0Q2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgRU5BQkxFX1NUQVRVU19DSEFOR0VELAorICAgIENPTU1BTkRfRVhFQ1VURUQKK307CisKK2NsYXNzIEJwRWZmZWN0Q2xpZW50OiBwdWJsaWMgQnBJbnRlcmZhY2U8SUVmZmVjdENsaWVudD4KK3sKK3B1YmxpYzoKKyAgICBCcEVmZmVjdENsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJRWZmZWN0Q2xpZW50PihpbXBsKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpCisgICAgeworICAgICAgICBMT0dWKCJjb250cm9sU3RhdHVzQ2hhbmdlZCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0Q2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWNvbnRyb2xHcmFudGVkKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTlRST0xfU1RBVFVTX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKworICAgIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpCisgICAgeworICAgICAgICBMT0dWKCJlbmFibGVTdGF0dXNDaGFuZ2VkIik7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3RDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlZCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTkFCTEVfU1RBVFVTX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKworICAgIHZvaWQgY29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKKyAgICB7CisgICAgICAgIExPR1YoImNvbW1hbmRFeGVjdXRlZCIpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0Q2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoY21kQ29kZSk7CisgICAgICAgIGludCBzaXplID0gY21kU2l6ZTsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGUocENtZERhdGEsIHNpemUpOworICAgICAgICB9CisgICAgICAgIHNpemUgPSByZXBseVNpemU7CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGUocFJlcGx5RGF0YSwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTU1BTkRfRVhFQ1VURUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KKworfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEVmZmVjdENsaWVudCwgImFuZHJvaWQubWVkaWEuSUVmZmVjdENsaWVudCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuRWZmZWN0Q2xpZW50OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBDT05UUk9MX1NUQVRVU19DSEFOR0VEOiB7CisgICAgICAgICAgICBMT0dWKCJDT05UUk9MX1NUQVRVU19DSEFOR0VEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdENsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBoYXNDb250cm9sID0gKGJvb2wpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGhhc0NvbnRyb2wpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVOQUJMRV9TVEFUVVNfQ0hBTkdFRDogeworICAgICAgICAgICAgTE9HVigiRU5BQkxFX1NUQVRVU19DSEFOR0VEIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdENsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBlbmFibGVkID0gKGJvb2wpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ09NTUFORF9FWEVDVVRFRDogeworICAgICAgICAgICAgTE9HVigiQ09NTUFORF9FWEVDVVRFRCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3RDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjaGFyICpjbWQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGNtZFNpemUpIHsKKyAgICAgICAgICAgICAgICBjbWQgPSAoY2hhciAqKW1hbGxvYyhjbWRTaXplKTsKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWQoY21kLCBjbWRTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjaGFyICpyZXNwID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChyZXBseVNpemUpIHsKKyAgICAgICAgICAgICAgICByZXNwID0gKGNoYXIgKiltYWxsb2MocmVwbHlTaXplKTsKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWQocmVzcCwgcmVwbHlTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBjbWQsIHJlcGx5U2l6ZSwgcmVzcCk7CisgICAgICAgICAgICBpZiAoY21kKSB7CisgICAgICAgICAgICAgICAgZnJlZShjbWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3ApIHsKKyAgICAgICAgICAgICAgICBmcmVlKHJlc3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggZWQ3OTJiMy4uMGY1NWIxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC00NSw2ICs0NSw4IEBACiAgICAgR0VUX01FVEFEQVRBLAogICAgIFNVU1BFTkQsCiAgICAgUkVTVU1FLAorICAgIFNFVF9BVVhfRUZGRUNUX1NFTkRfTEVWRUwsCisgICAgQVRUQUNIX0FVWF9FRkZFQ1QKIH07CiAKIGNsYXNzIEJwTWVkaWFQbGF5ZXI6IHB1YmxpYyBCcEludGVyZmFjZTxJTWVkaWFQbGF5ZXI+CkBAIC0yMjEsNiArMjIzLDI0IEBACiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KKworICAgIHN0YXR1c190IHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KGxldmVsKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVVhfRUZGRUNUX1NFTkRfTEVWRUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZWZmZWN0SWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQVRUQUNIX0FVWF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFQbGF5ZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVBsYXllciIpOwpAQCAtMzM5LDYgKzM1OSwxNiBAQAogICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbigwKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfQVVYX0VGRkVDVF9TRU5EX0xFVkVMOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZGF0YS5yZWFkRmxvYXQoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEFUVEFDSF9BVVhfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihhdHRhY2hBdXhFZmZlY3QoZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDcxYzVmODYuLjRhYmZhNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zNSw4ICszNSw3IEBACiAgICAgREVDT0RFX0ZELAogICAgIENSRUFURV9NRURJQV9SRUNPUkRFUiwKICAgICBDUkVBVEVfTUVUQURBVEFfUkVUUklFVkVSLAotICAgIEdFVF9PTVgsCi0gICAgU05PT1AKKyAgICBHRVRfT01YCiB9OwogCiBjbGFzcyBCcE1lZGlhUGxheWVyU2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVBsYXllclNlcnZpY2U+CkBAIC01OCw3ICs1Nyw3IEBACiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKAogICAgICAgICAgICAgcGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmwsIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLCBpbnQgYXVkaW9TZXNzaW9uSWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CkBAIC03NSw4ICs3NCwxMCBAQAogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGhlYWRlcnMtPnZhbHVlQXQoaSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb25JZCk7CiAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9VUkwsIGRhdGEsICZyZXBseSk7CisKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKQEAgLTg5LDcgKzkwLDggQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVJlY29yZGVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiBjcmVhdGUocGlkX3QgcGlkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBmZCwKKyAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IGF1ZGlvU2Vzc2lvbklkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKQEAgLTk4LDggKzEwMCwxMSBAQAogICAgICAgICBkYXRhLndyaXRlRmlsZURlc2NyaXB0b3IoZmQpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KGxlbmd0aCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb25JZCk7CisKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9GRCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOzsKICAgICB9CiAKICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCkKQEAgLTEyOCwxNCArMTMzLDYgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBzbm9vcCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU05PT1AsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3A8SU9NWD4gZ2V0T01YKCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTY2LDkgKzE2MywxMCBAQAogICAgICAgICAgICAgICAgIFN0cmluZzggdmFsdWUgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9IGNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgcGlkLCBjbGllbnQsIHVybCwgbnVtSGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBwaWQsIGNsaWVudCwgdXJsLCBudW1IZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCwgYXVkaW9TZXNzaW9uSWQpOwogCiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocGxheWVyLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTE4MCw3ICsxNzgsOSBAQAogICAgICAgICAgICAgaW50IGZkID0gZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpOwogICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW50NjRfdCBsZW5ndGggPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPSBjcmVhdGUocGlkLCBjbGllbnQsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgICAgICBpbnQgYXVkaW9TZXNzaW9uSWQgPSBkYXRhLnJlYWRJbnQzMigpOworCisgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllciA9IGNyZWF0ZShwaWQsIGNsaWVudCwgZmQsIG9mZnNldCwgbGVuZ3RoLCBhdWRpb1Nlc3Npb25JZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocGxheWVyLT5hc0JpbmRlcigpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTIxMiwxMiArMjEyLDYgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihwbGF5ZXItPmFzQmluZGVyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNOT09QOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lbW9yeT4gc25vb3BlZF9hdWRpbyA9IHNub29wKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoc25vb3BlZF9hdWRpby0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ1JFQVRFX01FRElBX1JFQ09SREVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcGlkX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAppbmRleCAxZGU5ZjliLi45NDdmZjM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCkBAIC0yMSw4ICsyMSw5IEBACiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPHN1cmZhY2VmbGluZ2VyL0lTdXJmYWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmEuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg5LDcgKzE5MCw3IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBsaXN0ZW5lcikKKyAgICBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKQogICAgIHsKICAgICAgICAgTE9HVigic2V0TGlzdGVuZXIoJXApIiwgbGlzdGVuZXIuZ2V0KCkpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0zNzMsNiArMzc0LDcgQEAKICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE91dHB1dEZpbGUoZmQsIG9mZnNldCwgbGVuZ3RoKSk7CisgICAgICAgICAgICA6OmNsb3NlKGZkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfVklERU9fU0laRTogewpAQCAtMzk5LDggKzQwMSw4IEBACiAgICAgICAgIGNhc2UgU0VUX0xJU1RFTkVSOiB7CiAgICAgICAgICAgICBMT0dWKCJTRVRfTElTVEVORVIiKTsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbGlzdGVuZXIgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVJlY29yZGVyQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRMaXN0ZW5lcihsaXN0ZW5lcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgTk9USUZZID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKK307CisKK2NsYXNzIEJwTWVkaWFSZWNvcmRlckNsaWVudDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyQ2xpZW50PgoreworcHVibGljOgorICAgIEJwTWVkaWFSZWNvcmRlckNsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFSZWNvcmRlckNsaWVudD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihleHQxKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGV4dDIpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTk9USUZZLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFSZWNvcmRlckNsaWVudCwgImFuZHJvaWQubWVkaWEuSU1lZGlhUmVjb3JkZXJDbGllbnQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCbk1lZGlhUmVjb3JkZXJDbGllbnQ6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIE5PVElGWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgbXNnID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBleHQxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBleHQyID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIG5vdGlmeShtc2csIGV4dDEsIGV4dDIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCmluZGV4IDAxYjY3MzcuLmYzODA0YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGpmaWVsZElEIHN1cmZhY2VJRCA9IGVudi0+R2V0RmllbGRJRChzdXJmYWNlQ2xhc3MsICJtU3VyZmFjZSIsICJJIik7CisgICAgamZpZWxkSUQgc3VyZmFjZUlEID0gZW52LT5HZXRGaWVsZElEKHN1cmZhY2VDbGFzcywgQU5EUk9JRF9WSUVXX1NVUkZBQ0VfSk5JX0lELCAiSSIpOwogICAgIGlmIChzdXJmYWNlSUQgPT0gTlVMTCkgewogICAgICAgICBMT0dFKCJDYW4ndCBmaW5kIFN1cmZhY2UubVN1cmZhY2UiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDEyNjMzNzMuLjM4NjkzODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0yNzIsNyArMjcyLDcgQEAKIH0KIAogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZShjb25zdCBjaGFyICoqYXR0cykKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZUNhbWNvcmRlclByb2ZpbGUoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cykKIHsKICAgICBDSEVDSyghc3RyY21wKCJxdWFsaXR5IiwgICAgYXR0c1swXSkgJiYKICAgICAgICAgICAhc3RyY21wKCJmaWxlRm9ybWF0IiwgYXR0c1syXSkgJiYKQEAgLTI4NywxNiArMjg3LDQ3IEBACiAgICAgQ0hFQ0soZmlsZUZvcm1hdCAhPSAtMSk7CiAKICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gY2FtZXJhSWQ7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBzdGF0aWNfY2FzdDxvdXRwdXRfZm9ybWF0PihmaWxlRm9ybWF0KTsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHN0YXRpY19jYXN0PGNhbWNvcmRlcl9xdWFsaXR5PihxdWFsaXR5KTsKICAgICBwcm9maWxlLT5tRHVyYXRpb24gPSBhdG9pKGF0dHNbNV0pOwogICAgIHJldHVybiBwcm9maWxlOwogfQogCi0vKnN0YXRpYyovIGludAotTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChjb25zdCBjaGFyKiogYXR0cykKK01lZGlhUHJvZmlsZXM6OkltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKgorTWVkaWFQcm9maWxlczo6ZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGludCBjYW1lcmFJZCkgY29uc3QKK3sKKyAgICBpbnQgbiA9IG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5zaXplKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsc1tpXTsKKyAgICAgICAgaWYgKGxldmVscy0+bUNhbWVyYUlkID09IGNhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gbGV2ZWxzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE1lZGlhUHJvZmlsZXM6OmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cykKIHsKICAgICBDSEVDSyghc3RyY21wKCJxdWFsaXR5IiwgYXR0c1swXSkpOworICAgIGludCBxdWFsaXR5ID0gYXRvaShhdHRzWzFdKTsKKyAgICBMT0dWKCIlczogY2FtZXJhSWQ9JWQsIHF1YWxpdHk9JWRcbiIsIF9fZnVuY19fLCBjYW1lcmFJZCwgcXVhbGl0eSk7CisgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IGZpbmRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhjYW1lcmFJZCk7CisKKyAgICBpZiAobGV2ZWxzID09IE5VTEwpIHsKKyAgICAgICAgbGV2ZWxzID0gbmV3IEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKCk7CisgICAgICAgIGxldmVscy0+bUNhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgICAgIG1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5hZGQobGV2ZWxzKTsKKyAgICB9CisKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKHF1YWxpdHkpOworfQorCisvKnN0YXRpYyovIGludAorTWVkaWFQcm9maWxlczo6Z2V0Q2FtZXJhSWQoY29uc3QgY2hhcioqIGF0dHMpCit7CisgICAgaWYgKCFhdHRzWzBdKSByZXR1cm4gMDsgIC8vIGRlZmF1bHQgY2FtZXJhSWQgPSAwCisgICAgQ0hFQ0soIXN0cmNtcCgiY2FtZXJhSWQiLCBhdHRzWzBdKSk7CiAgICAgcmV0dXJuIGF0b2koYXR0c1sxXSk7CiB9CiAKQEAgLTMyMiwxMCArMzUzLDEzIEBACiAgICAgICAgIHByb2ZpbGVzLT5tQXVkaW9EZWNvZGVycy5hZGQoY3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGF0dHMpKTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQiLCBuYW1lKSA9PSAwKSB7CiAgICAgICAgIHByb2ZpbGVzLT5tRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzLmFkZChjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChhdHRzKSk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAoIkNhbWNvcmRlclByb2ZpbGVzIiwgbmFtZSkgPT0gMCkgeworICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCA9IGdldENhbWVyYUlkKGF0dHMpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJFbmNvZGVyUHJvZmlsZSIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQoY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShhdHRzKSk7CisgICAgICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuYWRkKAorICAgICAgICAgICAgY3JlYXRlQ2FtY29yZGVyUHJvZmlsZShwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJJbWFnZUVuY29kaW5nIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZChnZXRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGF0dHMpKTsKKyAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMpOwogICAgIH0KIH0KIApAQCAtMzgzLDcgKzQxNyw4IEBACiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMzYwMDAwLCAzNTIsIDI4OCwgMjApOwogCiAgICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7Ci0gICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBDYW1jb3JkZXJQcm9maWxlOworICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKKyAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBDQU1DT1JERVJfUVVBTElUWV9ISUdIOwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOwpAQCAtNDAyLDYgKzQzNyw3IEBACiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CiAKICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgcHJvZmlsZS0+bUNhbWVyYUlkID0gMDsKICAgICBwcm9maWxlLT5tRmlsZUZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOwogICAgIHByb2ZpbGUtPm1RdWFsaXR5ID0gQ0FNQ09SREVSX1FVQUxJVFlfTE9XOwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDMwOwpAQCAtNDU4LDkgKzQ5NCwxMiBAQAogLypzdGF0aWMqLyB2b2lkCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCiB7Ci0gICAgcHJvZmlsZXMtPm1JbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscy5hZGQoNzApOwotICAgIHByb2ZpbGVzLT5tSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMuYWRkKDgwKTsKLSAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZCg5MCk7CisgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMgKmxldmVscyA9IG5ldyBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscygpOworICAgIGxldmVscy0+bUNhbWVyYUlkID0gMDsKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKDcwKTsKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKDgwKTsKKyAgICBsZXZlbHMtPm1MZXZlbHMuYWRkKDkwKTsKKyAgICBwcm9maWxlcy0+bUltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzLmFkZChsZXZlbHMpOwogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXMqCkBAIC02MjksMTkgKzY2OCwyNCBAQAogICAgIHJldHVybiBkZWNvZGVyczsgIC8vIGNvcHkgb3V0CiB9CiAKLWludCBNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKK2ludCBNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdAogewotICAgIExPR1YoImdldENhbWNvcmRlclByb2ZpbGVQYXJhbUJ5TmFtZTogJXMgZm9yIHF1YWxpdHkgJWQiLCBuYW1lLCBxdWFsaXR5KTsKKyAgICBMT0dWKCJnZXRDYW1jb3JkZXJQcm9maWxlUGFyYW1CeU5hbWU6ICVzIGZvciBjYW1lcmEgJWQsIHF1YWxpdHkgJWQiLAorICAgICAgICAgbmFtZSwgY2FtZXJhSWQsIHF1YWxpdHkpOwogCiAgICAgaW50IGluZGV4ID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDAsIG4gPSBtQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIGlmIChtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1RdWFsaXR5ID09IHF1YWxpdHkpIHsKKyAgICAgICAgaWYgKG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bUNhbWVyYUlkID09IGNhbWVyYUlkICYmCisgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1RdWFsaXR5ID09IHF1YWxpdHkpIHsKICAgICAgICAgICAgIGluZGV4ID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChpbmRleCA9PSAtMSkgewotICAgICAgICBMT0dFKCJUaGUgZ2l2ZW4gY2FtY29yZGVyIHByb2ZpbGUgcXVhbGl0eSAlZCBpcyBub3QgZm91bmQiLCBxdWFsaXR5KTsKKyAgICAgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIGNhbWVyYSAlZCBxdWFsaXR5ICVkIGlzIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgY2FtZXJhSWQsIHF1YWxpdHkpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC02NTcsMTMgKzcwMSwxOCBAQAogICAgIGlmICghc3RyY21wKCJhdWQuY2giLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjLT5tQ2hhbm5lbHM7CiAgICAgaWYgKCFzdHJjbXAoImF1ZC5oeiIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1TYW1wbGVSYXRlOwogCi0gICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIHBhcmFtIG5hbWUgJXMgaXMgbm90IGZvdW5kIiwgbmFtZSk7CisgICAgTE9HRSgiVGhlIGdpdmVuIGNhbWNvcmRlciBwcm9maWxlIHBhcmFtIGlkICVkIG5hbWUgJXMgaXMgbm90IGZvdW5kIiwgY2FtZXJhSWQsIG5hbWUpOwogICAgIHJldHVybiAtMTsKIH0KIAotVmVjdG9yPGludD4gTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoKSBjb25zdAorVmVjdG9yPGludD4gTWVkaWFQcm9maWxlczo6Z2V0SW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoaW50IGNhbWVyYUlkKSBjb25zdAogewotICAgIHJldHVybiBtSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHM7ICAvLyBjb3B5IG91dAorICAgIFZlY3RvcjxpbnQ+IHJlc3VsdDsKKyAgICBJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyAqbGV2ZWxzID0gZmluZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzKGNhbWVyYUlkKTsKKyAgICBpZiAobGV2ZWxzICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gbGV2ZWxzLT5tTGV2ZWxzOyAgLy8gY29weSBvdXQKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogTWVkaWFQcm9maWxlczo6fk1lZGlhUHJvZmlsZXMoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhU2Nhbm5lci5jcHAKaW5kZXggYWY3ZjA3YS4uYzUxMTJhNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVNjYW5uZXIuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNjYW5uZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxtZWRpYS9tZWRpYXNjYW5uZXIuaD4KIAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTUyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcApAQCAtMCwwICsxLDMxOSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpc3VhbGl6ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL1Zpc3VhbGl6ZXIuaD4KKworZXh0ZXJuIHZvaWQgZml4ZWRfZmZ0X3JlYWwoaW50IG4sIGludDMyX3QgKnYpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWaXN1YWxpemVyOjpWaXN1YWxpemVyIChpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAorICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgIGludCBzZXNzaW9uSWQpCisgICAgOiAgIEF1ZGlvRWZmZWN0KFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBOVUxMLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQpLAorICAgICAgICBtQ2FwdHVyZVJhdGUoQ0FQVFVSRV9SQVRFX0RFRiksCisgICAgICAgIG1DYXB0dXJlU2l6ZShDQVBUVVJFX1NJWkVfREVGKSwKKyAgICAgICAgbVNhbXBsZVJhdGUoNDQxMDAwMDApLAorICAgICAgICBtQ2FwdHVyZUNhbGxCYWNrKE5VTEwpLAorICAgICAgICBtQ2FwdHVyZUNia1VzZXIoTlVMTCkKK3sKKyAgICBpbml0Q2FwdHVyZVNpemUoKTsKK30KKworVmlzdWFsaXplcjo6flZpc3VhbGl6ZXIoKQoreworfQorCitzdGF0dXNfdCBWaXN1YWxpemVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8Q2FwdHVyZVRocmVhZD4gdCA9IG1DYXB0dXJlVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICh0LT5leGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIlZpc3VhbGl6ZXI6OmVuYWJsZSgpIGNhbGxlZCBmcm9tIHRocmVhZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHQtPm1Mb2NrLmxvY2soKTsKKyAgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9FZmZlY3Q6OnNldEVuYWJsZWQoZW5hYmxlZCk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgdC0+cnVuKCJBdWRpb1RyYWNrVGhyZWFkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHQtPnJlcXVlc3RFeGl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQtPm1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OnNldENhcHR1cmVDYWxsQmFjayhjYXB0dXJlX2Nia190IGNiaywgdm9pZCogdXNlciwgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IHJhdGUpCit7CisgICAgaWYgKHJhdGUgPiBDQVBUVVJFX1JBVEVfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNwPENhcHR1cmVUaHJlYWQ+IHQgPSBtQ2FwdHVyZVRocmVhZDsKKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQtPm1Mb2NrLmxvY2soKTsKKyAgICB9CisgICAgbUNhcHR1cmVUaHJlYWQuY2xlYXIoKTsKKyAgICBtQ2FwdHVyZUNhbGxCYWNrID0gY2JrOworICAgIG1DYXB0dXJlQ2JrVXNlciA9IHVzZXI7CisgICAgbUNhcHR1cmVGbGFncyA9IGZsYWdzOworICAgIG1DYXB0dXJlUmF0ZSA9IHJhdGU7CisKKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQtPm1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIGlmIChjYmsgIT0gTlVMTCkgeworICAgICAgICBtQ2FwdHVyZVRocmVhZCA9IG5ldyBDYXB0dXJlVGhyZWFkKCp0aGlzLCByYXRlLCAoKGZsYWdzICYgQ0FQVFVSRV9DQUxMX0pBVkEpICE9IDApKTsKKyAgICAgICAgaWYgKG1DYXB0dXJlVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBjcmVhdGUgY2FsbGJhY2sgdGhyZWFkIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dWKCJzZXRDYXB0dXJlQ2FsbEJhY2soKSByYXRlOiAlZCB0aHJlYWQgJXAgZmxhZ3MgMHglMDh4IiwKKyAgICAgICAgICAgIHJhdGUsIG1DYXB0dXJlVGhyZWFkLmdldCgpLCBtQ2FwdHVyZUZsYWdzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OnNldENhcHR1cmVTaXplKHVpbnQzMl90IHNpemUpCit7CisgICAgaWYgKHNpemUgPiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVggfHwKKyAgICAgICAgc2l6ZSA8IFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01JTiB8fAorICAgICAgICBBdWRpb1N5c3RlbTo6cG9wQ291bnQoc2l6ZSkgIT0gMSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1FbmFibGVkKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBidWYzMltzaXplb2YoZWZmZWN0X3BhcmFtX3QpIC8gc2l6ZW9mKHVpbnQzMl90KSArIDJdOworICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopYnVmMzI7CisKKyAgICBwLT5wc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgcC0+dnNpemUgPSBzaXplb2YodWludDMyX3QpOworICAgICooaW50MzJfdCAqKXAtPmRhdGEgPSBWSVNVX1BBUkFNX0NBUFRVUkVfU0laRTsKKyAgICAqKChpbnQzMl90ICopcC0+ZGF0YSArIDEpPSBzaXplOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFBhcmFtZXRlcihwKTsKKworICAgIExPR1YoInNldENhcHR1cmVTaXplIHNpemUgJWQgIHN0YXR1cyAlZCBwLT5zdGF0dXMgJWQiLCBzaXplLCBzdGF0dXMsIHAtPnN0YXR1cyk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IHAtPnN0YXR1czsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtQ2FwdHVyZVNpemUgPSBzaXplOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OmdldFdhdmVGb3JtKHVpbnQ4X3QgKndhdmVmb3JtKQoreworICAgIGlmICh3YXZlZm9ybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQ2FwdHVyZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gbUNhcHR1cmVTaXplOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tYW5kKFZJU1VfQ01EX0NBUFRVUkUsIDAsIE5VTEwsICZyZXBseVNpemUsIHdhdmVmb3JtKTsKKyAgICAgICAgaWYgKHJlcGx5U2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQod2F2ZWZvcm0sIDB4ODAsIG1DYXB0dXJlU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFZpc3VhbGl6ZXI6OmdldEZmdCh1aW50OF90ICpmZnQpCit7CisgICAgaWYgKGZmdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChtQ2FwdHVyZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgdWludDhfdCBidWZbbUNhcHR1cmVTaXplXTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0V2F2ZUZvcm0oYnVmKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gZG9GZnQoZmZ0LCBidWYpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KGZmdCwgMCwgbUNhcHR1cmVTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6ZG9GZnQodWludDhfdCAqZmZ0LCB1aW50OF90ICp3YXZlZm9ybSkKK3sKKyAgICBpbnQzMl90IHdvcmtzcGFjZVttQ2FwdHVyZVNpemUgPj4gMV07CisgICAgaW50MzJfdCBub256ZXJvID0gMDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FwdHVyZVNpemU7IGkgKz0gMikgeworICAgICAgICB3b3Jrc3BhY2VbaSA+PiAxXSA9ICh3YXZlZm9ybVtpXSBeIDB4ODApIDw8IDIzOworICAgICAgICB3b3Jrc3BhY2VbaSA+PiAxXSB8PSAod2F2ZWZvcm1baSArIDFdIF4gMHg4MCkgPDwgNzsKKyAgICAgICAgbm9uemVybyB8PSB3b3Jrc3BhY2VbaSA+PiAxXTsKKyAgICB9CisKKyAgICBpZiAobm9uemVybykgeworICAgICAgICBmaXhlZF9mZnRfcmVhbChtQ2FwdHVyZVNpemUgPj4gMSwgd29ya3NwYWNlKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUNhcHR1cmVTaXplOyBpICs9IDIpIHsKKyAgICAgICAgZmZ0W2ldID0gd29ya3NwYWNlW2kgPj4gMV0gPj4gMjM7CisgICAgICAgIGZmdFtpICsgMV0gPSB3b3Jrc3BhY2VbaSA+PiAxXSA+PiA3OworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBWaXN1YWxpemVyOjpwZXJpb2RpY0NhcHR1cmUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgTE9HVigicGVyaW9kaWNDYXB0dXJlKCkgJXAgbUNhcHR1cmVDYWxsQmFjayAlcCBtQ2FwdHVyZUZsYWdzIDB4JTA4eCIsCisgICAgICAgICAgICB0aGlzLCBtQ2FwdHVyZUNhbGxCYWNrLCBtQ2FwdHVyZUZsYWdzKTsKKyAgICBpZiAobUNhcHR1cmVDYWxsQmFjayAhPSBOVUxMICYmCisgICAgICAgIChtQ2FwdHVyZUZsYWdzICYgKENBUFRVUkVfV0FWRUZPUk18Q0FQVFVSRV9GRlQpKSAmJgorICAgICAgICBtQ2FwdHVyZVNpemUgIT0gMCkgeworICAgICAgICB1aW50OF90IHdhdmVmb3JtW21DYXB0dXJlU2l6ZV07CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFdhdmVGb3JtKHdhdmVmb3JtKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgZmZ0W21DYXB0dXJlU2l6ZV07CisgICAgICAgIGlmIChtQ2FwdHVyZUZsYWdzICYgQ0FQVFVSRV9GRlQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRvRmZ0KGZmdCwgd2F2ZWZvcm0pOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90ICp3YXZlUHRyID0gTlVMTDsKKyAgICAgICAgdWludDhfdCAqZmZ0UHRyID0gTlVMTDsKKyAgICAgICAgdWludDMyX3Qgd2F2ZVNpemUgPSAwOworICAgICAgICB1aW50MzJfdCBmZnRTaXplID0gMDsKKyAgICAgICAgaWYgKG1DYXB0dXJlRmxhZ3MgJiBDQVBUVVJFX1dBVkVGT1JNKSB7CisgICAgICAgICAgICB3YXZlUHRyID0gd2F2ZWZvcm07CisgICAgICAgICAgICB3YXZlU2l6ZSA9IG1DYXB0dXJlU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNhcHR1cmVGbGFncyAmIENBUFRVUkVfRkZUKSB7CisgICAgICAgICAgICBmZnRQdHIgPSBmZnQ7CisgICAgICAgICAgICBmZnRTaXplID0gbUNhcHR1cmVTaXplOworICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlQ2FsbEJhY2sobUNhcHR1cmVDYmtVc2VyLCB3YXZlU2l6ZSwgd2F2ZVB0ciwgZmZ0U2l6ZSwgZmZ0UHRyLCBtU2FtcGxlUmF0ZSk7CisgICAgfQorfQorCit1aW50MzJfdCBWaXN1YWxpemVyOjppbml0Q2FwdHVyZVNpemUoKQoreworICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07CisgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilidWYzMjsKKworICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisgICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VfUEFSQU1fQ0FQVFVSRV9TSVpFOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFBhcmFtZXRlcihwKTsKKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3RhdHVzID0gcC0+c3RhdHVzOworICAgIH0KKworICAgIHVpbnQzMl90IHNpemUgPSAwOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc2l6ZSA9ICooKGludDMyX3QgKilwLT5kYXRhICsgMSk7CisgICAgfQorICAgIG1DYXB0dXJlU2l6ZSA9IHNpemU7CisKKyAgICBMT0dWKCJpbml0Q2FwdHVyZVNpemUgc2l6ZSAlZCBzdGF0dXMgJWQiLCBtQ2FwdHVyZVNpemUsIHN0YXR1cyk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Zpc3VhbGl6ZXI6OkNhcHR1cmVUaHJlYWQ6OkNhcHR1cmVUaHJlYWQoVmlzdWFsaXplciYgcmVjZWl2ZXIsIHVpbnQzMl90IGNhcHR1cmVSYXRlLCBib29sIGJDYW5DYWxsSmF2YSkKKyAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpCit7CisgICAgbVNsZWVwVGltZVVzID0gMTAwMDAwMDAwMCAvIGNhcHR1cmVSYXRlOworICAgIExPR1YoIkNhcHR1cmVUaHJlYWQgY3N0b3IgJXAgY2FwdHVyZVJhdGUgJWQgbVNsZWVwVGltZVVzICVkIiwgdGhpcywgY2FwdHVyZVJhdGUsIG1TbGVlcFRpbWVVcyk7Cit9CisKK2Jvb2wgVmlzdWFsaXplcjo6Q2FwdHVyZVRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgTE9HVigiQ2FwdHVyZVRocmVhZCAlcCBlbnRlciIsIHRoaXMpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIHVzbGVlcChtU2xlZXBUaW1lVXMpOworICAgICAgICBtUmVjZWl2ZXIucGVyaW9kaWNDYXB0dXJlKCk7CisgICAgfQorICAgIExPR1YoIkNhcHR1cmVUaHJlYWQgJXAgZXhpdGluZyIsIHRoaXMpOworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgVmlzdWFsaXplcjo6Q2FwdHVyZVRocmVhZDo6cmVhZHlUb1J1bigpCit7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFZpc3VhbGl6ZXI6OkNhcHR1cmVUaHJlYWQ6Om9uRmlyc3RSZWYoKQoreworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9maXhlZGZmdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9maXhlZGZmdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0OTVlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL2ZpeGVkZmZ0LmNwcApAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIEEgRml4ZWQgcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUKS4gQ29tcGxleCBudW1iZXJzCisgKiBhcmUgcmVwcmVzZW50ZWQgYnkgMzItYml0IGludGVnZXJzLCB3aGVyZSBoaWdoZXIgMTYgYml0cyBhcmUgcmVhbCBwYXJ0IGFuZAorICogbG93ZXIgb25lcyBhcmUgaW1hZ2luYXJ5IHBhcnQuIEZldyBjb21wcm9taXNlcyBhcmUgbWFkZSBiZXR3ZWVuIGVmZmljaWVuY3ksCisgKiBhY2N1cmFjeSwgYW5kIG1haW50YWluYWJpbGl0eS4gVG8gbWFrZSBpdCBmYXN0LCBhcml0aG1ldGljIHNoaWZ0cyBhcmUgdXNlZAorICogaW5zdGVhZCBvZiBkaXZpc2lvbnMsIGFuZCBiaXR3aXNlIGludmVyc2VzIGFyZSB1c2VkIGluc3RlYWQgb2YgbmVnYXRlcy4gVG8KKyAqIGtlZXAgaXQgc21hbGwsIG9ubHkgcmFkaXgtMiBDb29sZXktVHVrZXkgYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkLCBhbmQgb25seQorICogaGFsZiBvZiB0aGUgdHdpZGRsZSBmYWN0b3JzIGFyZSBzdG9yZWQuIEFsdGhvdWdoIHRoZXJlIGFyZSBzdGlsbCB3YXlzIHRvIG1ha2UKKyAqIGl0IGV2ZW4gZmFzdGVyIG9yIHNtYWxsZXIsIGl0IGNvc3RzIHRvbyBtdWNoIG9uIG9uZSBvZiB0aGUgYXNwZWN0cy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZmRlZiBfX2FybV9fCisjaW5jbHVkZSA8bWFjaGluZS9jcHUtZmVhdHVyZXMuaD4KKyNlbmRpZgorCisjZGVmaW5lIExPR19GRlRfU0laRSAxMAorI2RlZmluZSBNQVhfRkZUX1NJWkUgKDEgPDwgTE9HX0ZGVF9TSVpFKQorCitzdGF0aWMgY29uc3QgaW50MzJfdCB0d2lkZGxlW01BWF9GRlRfU0laRSAvIDRdID0geworICAgIDB4MDAwMDgwMDAsIDB4ZmYzNzgwMDEsIDB4ZmU2ZTgwMDIsIDB4ZmRhNTgwMDYsIDB4ZmNkYzgwMGEsIDB4ZmMxMzgwMGYsCisgICAgMHhmYjRhODAxNiwgMHhmYTgxODAxZSwgMHhmOWI4ODAyNywgMHhmOGVmODAzMiwgMHhmODI3ODAzZSwgMHhmNzVlODA0YiwKKyAgICAweGY2OTU4MDU5LCAweGY1Y2Q4MDY4LCAweGY1MDU4MDc5LCAweGY0M2M4MDhiLCAweGYzNzQ4MDllLCAweGYyYWM4MGIyLAorICAgIDB4ZjFlNDgwYzgsIDB4ZjExYzgwZGUsIDB4ZjA1NTgwZjYsIDB4ZWY4ZDgxMTAsIDB4ZWVjNjgxMmEsIDB4ZWRmZjgxNDYsCisgICAgMHhlZDM4ODE2MywgMHhlYzcxODE4MSwgMHhlYmFiODFhMCwgMHhlYWU0ODFjMSwgMHhlYTFlODFlMiwgMHhlOTU4ODIwNSwKKyAgICAweGU4OTI4MjJhLCAweGU3Y2Q4MjRmLCAweGU3MDc4Mjc2LCAweGU2NDI4MjlkLCAweGU1N2Q4MmM2LCAweGU0Yjk4MmYxLAorICAgIDB4ZTNmNDgzMWMsIDB4ZTMzMDgzNDksIDB4ZTI2ZDgzNzcsIDB4ZTFhOTgzYTYsIDB4ZTBlNjgzZDYsIDB4ZTAyMzg0MDcsCisgICAgMHhkZjYxODQzYSwgMHhkZTllODQ2ZSwgMHhkZGRjODRhMywgMHhkZDFiODRkOSwgMHhkYzU5ODUxMSwgMHhkYjk5ODU0OSwKKyAgICAweGRhZDg4NTgzLCAweGRhMTg4NWJlLCAweGQ5NTg4NWZhLCAweGQ4OTg4NjM3LCAweGQ3ZDk4Njc2LCAweGQ3MWI4NmI2LAorICAgIDB4ZDY1Yzg2ZjYsIDB4ZDU5ZTg3MzgsIDB4ZDRlMTg3N2IsIDB4ZDQyNDg3YzAsIDB4ZDM2Nzg4MDUsIDB4ZDJhYjg4NGMsCisgICAgMHhkMWVmODg5NCwgMHhkMTM0ODhkZCwgMHhkMDc5ODkyNywgMHhjZmJlODk3MiwgMHhjZjA0ODliZSwgMHhjZTRiOGEwYywKKyAgICAweGNkOTI4YTVhLCAweGNjZDk4YWFhLCAweGNjMjE4YWZiLCAweGNiNjk4YjRkLCAweGNhYjI4YmEwLCAweGM5ZmM4YmY1LAorICAgIDB4Yzk0NjhjNGEsIDB4Yzg5MDhjYTEsIDB4YzdkYjhjZjgsIDB4YzcyNzhkNTEsIDB4YzY3MzhkYWIsIDB4YzVjMDhlMDYsCisgICAgMHhjNTBkOGU2MiwgMHhjNDViOGViZiwgMHhjM2E5OGYxZCwgMHhjMmY4OGY3ZCwgMHhjMjQ4OGZkZCwgMHhjMTk4OTAzZSwKKyAgICAweGMwZTk5MGExLCAweGMwM2E5MTA1LCAweGJmOGM5MTY5LCAweGJlZGY5MWNmLCAweGJlMzI5MjM2LCAweGJkODY5MjllLAorICAgIDB4YmNkYTkzMDcsIDB4YmMyZjkzNzEsIDB4YmI4NTkzZGMsIDB4YmFkYzk0NDgsIDB4YmEzMzk0YjUsIDB4Yjk4Yjk1MjMsCisgICAgMHhiOGUzOTU5MiwgMHhiODNjOTYwMywgMHhiNzk2OTY3NCwgMHhiNmYxOTZlNiwgMHhiNjRjOTc1OSwgMHhiNWE4OTdjZSwKKyAgICAweGI1MDU5ODQzLCAweGI0NjI5OGI5LCAweGIzYzA5OTMwLCAweGIzMWY5OWE5LCAweGIyN2Y5YTIyLCAweGIxZGY5YTljLAorICAgIDB4YjE0MDliMTcsIDB4YjBhMjliOTQsIDB4YjAwNTljMTEsIDB4YWY2ODljOGYsIDB4YWVjYzlkMGUsIDB4YWUzMTlkOGUsCisgICAgMHhhZDk3OWUwZiwgMHhhY2ZkOWU5MSwgMHhhYzY1OWYxNCwgMHhhYmNkOWY5OCwgMHhhYjM2YTAxYywgMHhhYWEwYTBhMiwKKyAgICAweGFhMGFhMTI5LCAweGE5NzZhMWIwLCAweGE4ZTJhMjM4LCAweGE4NGZhMmMyLCAweGE3YmRhMzRjLCAweGE3MmNhM2Q3LAorICAgIDB4YTY5Y2E0NjMsIDB4YTYwY2E0ZjAsIDB4YTU3ZWE1N2UsIDB4YTRmMGE2MGMsIDB4YTQ2M2E2OWMsIDB4YTNkN2E3MmMsCisgICAgMHhhMzRjYTdiZCwgMHhhMmMyYTg0ZiwgMHhhMjM4YThlMiwgMHhhMWIwYTk3NiwgMHhhMTI5YWEwYSwgMHhhMGEyYWFhMCwKKyAgICAweGEwMWNhYjM2LCAweDlmOThhYmNkLCAweDlmMTRhYzY1LCAweDllOTFhY2ZkLCAweDllMGZhZDk3LCAweDlkOGVhZTMxLAorICAgIDB4OWQwZWFlY2MsIDB4OWM4ZmFmNjgsIDB4OWMxMWIwMDUsIDB4OWI5NGIwYTIsIDB4OWIxN2IxNDAsIDB4OWE5Y2IxZGYsCisgICAgMHg5YTIyYjI3ZiwgMHg5OWE5YjMxZiwgMHg5OTMwYjNjMCwgMHg5OGI5YjQ2MiwgMHg5ODQzYjUwNSwgMHg5N2NlYjVhOCwKKyAgICAweDk3NTliNjRjLCAweDk2ZTZiNmYxLCAweDk2NzRiNzk2LCAweDk2MDNiODNjLCAweDk1OTJiOGUzLCAweDk1MjNiOThiLAorICAgIDB4OTRiNWJhMzMsIDB4OTQ0OGJhZGMsIDB4OTNkY2JiODUsIDB4OTM3MWJjMmYsIDB4OTMwN2JjZGEsIDB4OTI5ZWJkODYsCisgICAgMHg5MjM2YmUzMiwgMHg5MWNmYmVkZiwgMHg5MTY5YmY4YywgMHg5MTA1YzAzYSwgMHg5MGExYzBlOSwgMHg5MDNlYzE5OCwKKyAgICAweDhmZGRjMjQ4LCAweDhmN2RjMmY4LCAweDhmMWRjM2E5LCAweDhlYmZjNDViLCAweDhlNjJjNTBkLCAweDhlMDZjNWMwLAorICAgIDB4OGRhYmM2NzMsIDB4OGQ1MWM3MjcsIDB4OGNmOGM3ZGIsIDB4OGNhMWM4OTAsIDB4OGM0YWM5NDYsIDB4OGJmNWM5ZmMsCisgICAgMHg4YmEwY2FiMiwgMHg4YjRkY2I2OSwgMHg4YWZiY2MyMSwgMHg4YWFhY2NkOSwgMHg4YTVhY2Q5MiwgMHg4YTBjY2U0YiwKKyAgICAweDg5YmVjZjA0LCAweDg5NzJjZmJlLCAweDg5MjdkMDc5LCAweDg4ZGRkMTM0LCAweDg4OTRkMWVmLCAweDg4NGNkMmFiLAorICAgIDB4ODgwNWQzNjcsIDB4ODdjMGQ0MjQsIDB4ODc3YmQ0ZTEsIDB4ODczOGQ1OWUsIDB4ODZmNmQ2NWMsIDB4ODZiNmQ3MWIsCisgICAgMHg4Njc2ZDdkOSwgMHg4NjM3ZDg5OCwgMHg4NWZhZDk1OCwgMHg4NWJlZGExOCwgMHg4NTgzZGFkOCwgMHg4NTQ5ZGI5OSwKKyAgICAweDg1MTFkYzU5LCAweDg0ZDlkZDFiLCAweDg0YTNkZGRjLCAweDg0NmVkZTllLCAweDg0M2FkZjYxLCAweDg0MDdlMDIzLAorICAgIDB4ODNkNmUwZTYsIDB4ODNhNmUxYTksIDB4ODM3N2UyNmQsIDB4ODM0OWUzMzAsIDB4ODMxY2UzZjQsIDB4ODJmMWU0YjksCisgICAgMHg4MmM2ZTU3ZCwgMHg4MjlkZTY0MiwgMHg4Mjc2ZTcwNywgMHg4MjRmZTdjZCwgMHg4MjJhZTg5MiwgMHg4MjA1ZTk1OCwKKyAgICAweDgxZTJlYTFlLCAweDgxYzFlYWU0LCAweDgxYTBlYmFiLCAweDgxODFlYzcxLCAweDgxNjNlZDM4LCAweDgxNDZlZGZmLAorICAgIDB4ODEyYWVlYzYsIDB4ODExMGVmOGQsIDB4ODBmNmYwNTUsIDB4ODBkZWYxMWMsIDB4ODBjOGYxZTQsIDB4ODBiMmYyYWMsCisgICAgMHg4MDllZjM3NCwgMHg4MDhiZjQzYywgMHg4MDc5ZjUwNSwgMHg4MDY4ZjVjZCwgMHg4MDU5ZjY5NSwgMHg4MDRiZjc1ZSwKKyAgICAweDgwM2VmODI3LCAweDgwMzJmOGVmLCAweDgwMjdmOWI4LCAweDgwMWVmYTgxLCAweDgwMTZmYjRhLCAweDgwMGZmYzEzLAorICAgIDB4ODAwYWZjZGMsIDB4ODAwNmZkYTUsIDB4ODAwMmZlNmUsIDB4ODAwMWZmMzcsCit9OworCisvKiBSZXR1cm5zIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiBcY29uanthfSBhbmQge2J9LiAqLworc3RhdGljIGlubGluZSBpbnQzMl90IG11bHQoaW50MzJfdCBhLCBpbnQzMl90IGIpCit7CisjaWYgX19BUk1fQVJDSF9fID49IDYKKyAgICBpbnQzMl90IHQgPSBiOworICAgIF9fYXNtX18oInNtdWFkICAlMCwgJTAsICUxIiAgICAgICAgICA6ICIrciIgKHQpIDogInIiIChhKSk7CisgICAgX19hc21fXygic211c2R4ICUwLCAlMCwgJTEiICAgICAgICAgIDogIityIiAoYikgOiAiciIgKGEpKTsKKyAgICBfX2FzbV9fKCJwa2h0YiAgJTAsICUwLCAlMSwgQVNSICMxNiIgOiAiK3IiICh0KSA6ICJyIiAoYikpOworICAgIHJldHVybiB0OworI2Vsc2UKKyAgICByZXR1cm4gKCgoYSA+PiAxNikgKiAoYiA+PiAxNikgKyAoaW50MTZfdClhICogKGludDE2X3QpYikgJiB+MHhGRkZGKSB8CisgICAgICAgICgoKChhID4+IDE2KSAqIChpbnQxNl90KWIgLSAoaW50MTZfdClhICogKGIgPj4gMTYpKSA+PiAxNikgJiAweEZGRkYpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBoYWxmKGludDMyX3QgYSkKK3sKKyNpZiBfX0FSTV9BUkNIX18gPj0gNgorICAgIF9fYXNtX18oInNoYWRkMTYgJTAsICUwLCAlMSIgOiAiK3IiIChhKSA6ICJyIiAoMCkpOworICAgIHJldHVybiBhOworI2Vsc2UKKyAgICByZXR1cm4gKChhID4+IDEpICYgfjB4ODAwMCkgfCAoYSAmIDB4ODAwMCk7CisjZW5kaWYKK30KKwordm9pZCBmaXhlZF9mZnQoaW50IG4sIGludDMyX3QgKnYpCit7CisgICAgaW50IHNjYWxlID0gTE9HX0ZGVF9TSVpFLCBpLCBwLCByOworCisgICAgZm9yIChyID0gMCwgaSA9IDE7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgZm9yIChwID0gbjsgIShwICYgcik7IHAgPj49IDEsIHIgXj0gcCk7CisgICAgICAgIGlmIChpIDwgcikgeworICAgICAgICAgICAgaW50MzJfdCB0ID0gdltpXTsKKyAgICAgICAgICAgIHZbaV0gPSB2W3JdOworICAgICAgICAgICAgdltyXSA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHAgPSAxOyBwIDwgbjsgcCA8PD0gMSkgeworICAgICAgICAtLXNjYWxlOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IHAgPDwgMSkgeworICAgICAgICAgICAgaW50MzJfdCB4ID0gaGFsZih2W2ldKTsKKyAgICAgICAgICAgIGludDMyX3QgeSA9IGhhbGYodltpICsgcF0pOworICAgICAgICAgICAgdltpXSA9IHggKyB5OworICAgICAgICAgICAgdltpICsgcF0gPSB4IC0geTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAociA9IDE7IHIgPCBwOyArK3IpIHsKKyAgICAgICAgICAgIGludDMyX3QgdyA9IE1BWF9GRlRfU0laRSAvIDQgLSAociA8PCBzY2FsZSk7CisgICAgICAgICAgICBpID0gdyA+PiAzMTsKKyAgICAgICAgICAgIHcgPSB0d2lkZGxlWyh3IF4gaSkgLSBpXSBeIChpIDw8IDE2KTsKKyAgICAgICAgICAgIGZvciAoaSA9IHI7IGkgPCBuOyBpICs9IHAgPDwgMSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgeCA9IGhhbGYodltpXSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCB5ID0gbXVsdCh3LCB2W2kgKyBwXSk7CisgICAgICAgICAgICAgICAgdltpXSA9IHggLSB5OworICAgICAgICAgICAgICAgIHZbaSArIHBdID0geCArIHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZml4ZWRfZmZ0X3JlYWwoaW50IG4sIGludDMyX3QgKnYpCit7CisgICAgaW50IHNjYWxlID0gTE9HX0ZGVF9TSVpFLCBtID0gbiA+PiAxLCBpOworCisgICAgZml4ZWRfZmZ0KG4sIHYpOworICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSA8PD0gMSwgLS1zY2FsZSk7CisgICAgdlswXSA9IG11bHQofnZbMF0sIDB4ODAwMDgwMDApOworICAgIHZbbV0gPSBoYWxmKHZbbV0pOworCisgICAgZm9yIChpID0gMTsgaSA8IG4gPj4gMTsgKytpKSB7CisgICAgICAgIGludDMyX3QgeCA9IGhhbGYodltpXSk7CisgICAgICAgIGludDMyX3QgeiA9IGhhbGYodltuIC0gaV0pOworICAgICAgICBpbnQzMl90IHkgPSB6IC0gKHggXiAweEZGRkYpOworICAgICAgICB4ID0gaGFsZih4ICsgKHogXiAweEZGRkYpKTsKKyAgICAgICAgeSA9IG11bHQoeSwgdHdpZGRsZVtpIDw8IHNjYWxlXSk7CisgICAgICAgIHZbaV0gPSB4IC0geTsKKyAgICAgICAgdltuIC0gaV0gPSAoeCArIHkpIF4gMHhGRkZGOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAppbmRleCBjNmJiYmNjLi5mMzIyOWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCkBAIC01NSw2ICs1NSw3IEBACiAgICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7CiAgICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOwogICAgIG1Mb2NrVGhyZWFkSWQgPSAwOworICAgIG1BdWRpb1Nlc3Npb25JZCA9IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1Nlc3Npb25JZCgpOwogfQogCiBNZWRpYVBsYXllcjo6fk1lZGlhUGxheWVyKCkKQEAgLTEzNyw3ICsxMzgsNyBAQAogICAgICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZShnZXRNZWRpYVBsYXllclNlcnZpY2UoKSk7CiAgICAgICAgIGlmIChzZXJ2aWNlICE9IDApIHsKICAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoZ2V0cGlkKCksIHRoaXMsIHVybCwgaGVhZGVycykpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5jcmVhdGUoZ2V0cGlkKCksIHRoaXMsIHVybCwgaGVhZGVycywgbUF1ZGlvU2Vzc2lvbklkKSk7CiAgICAgICAgICAgICBlcnIgPSBzZXREYXRhU291cmNlKHBsYXllcik7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTAsNyArMTUxLDcgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZShnZXRwaWQoKSwgdGhpcywgZmQsIG9mZnNldCwgbGVuZ3RoKSk7CisgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZShnZXRwaWQoKSwgdGhpcywgZmQsIG9mZnNldCwgbGVuZ3RoLCBtQXVkaW9TZXNzaW9uSWQpKTsKICAgICAgICAgZXJyID0gc2V0RGF0YVNvdXJjZShwbGF5ZXIpOwogICAgIH0KICAgICByZXR1cm4gZXJyOwpAQCAtMjY5LDYgKzI3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSB8IE1FRElBX1BMQVlFUl9QQVVTRUQgKSApICkgewogICAgICAgICBtUGxheWVyLT5zZXRMb29waW5nKG1Mb29wKTsKICAgICAgICAgbVBsYXllci0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgICAgICBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfU1RBUlRFRDsKICAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewpAQCAtNTAxLDYgKzUwMyw1MiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldEF1ZGlvU2Vzc2lvbklkKGludCBzZXNzaW9uSWQpCit7CisgICAgTE9HVigiTWVkaWFQbGF5ZXI6OnNldEF1ZGlvU2Vzc2lvbklkKCVkKSIsIHNlc3Npb25JZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX0lETEUpKSB7CisgICAgICAgIExPR0UoInNldEF1ZGlvU2Vzc2lvbklkIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2ludCBNZWRpYVBsYXllcjo6Z2V0QXVkaW9TZXNzaW9uSWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkKK3sKKyAgICBMT0dWKCJNZWRpYVBsYXllcjo6c2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TZW5kTGV2ZWwgPSBsZXZlbDsKKyAgICBpZiAobVBsYXllciAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKQoreworICAgIExPR1YoIk1lZGlhUGxheWVyOjphdHRhY2hBdXhFZmZlY3QoJWQpIiwgZWZmZWN0SWQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1QbGF5ZXIgPT0gMCB8fAorICAgICAgICAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9JRExFKSB8fAorICAgICAgICAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVJfU1RBVEVfRVJST1IgKSkgeworICAgICAgICBMT0dFKCJhdHRhY2hBdXhFZmZlY3QgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbVBsYXllci0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKK30KKwogdm9pZCBNZWRpYVBsYXllcjo6bm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKIHsKICAgICBMT0dWKCJtZXNzYWdlIHJlY2VpdmVkIG1zZz0lZCwgZXh0MT0lZCwgZXh0Mj0lZCIsIG1zZywgZXh0MSwgZXh0Mik7CkBAIC01MjAsNyArNTY4LDggQEAKICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKICAgICB9CiAKLSAgICBpZiAobVBsYXllciA9PSAwKSB7CisgICAgLy8gQWxsb3dzIGNhbGxzIGZyb20gSk5JIGluIGlkbGUgc3RhdGUgdG8gbm90aWZ5IGVycm9ycworICAgIGlmICghKG1zZyA9PSBNRURJQV9FUlJPUiAmJiBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUl9JRExFKSAmJiBtUGxheWVyID09IDApIHsKICAgICAgICAgTE9HVigibm90aWZ5KCVkLCAlZCwgJWQpIGNhbGxiYWNrIG9uIGRpc2Nvbm5lY3RlZCBtZWRpYXBsYXllciIsIG1zZywgZXh0MSwgZXh0Mik7CiAgICAgICAgIGlmIChsb2NrZWQpIG1Mb2NrLnVubG9jaygpOyAgIC8vIHJlbGVhc2UgdGhlIGxvY2sgd2hlbiBkb25lLgogICAgICAgICByZXR1cm47CkBAIC02MzYsNjEgKzY4NSw0IEBACiAKIH0KIAotZXh0ZXJuICJDIiB7Ci0jZGVmaW5lIEZMT0FUSU5HX1BPSU5UIDEKLSNpbmNsdWRlICJmZnR3cmFwLmgiCi19Ci0KLXN0YXRpYyB2b2lkICpmZnR0YWJsZSA9IE5VTEw7Ci0KLS8vIHBlZWtzIGF0IHRoZSBhdWRpbyBkYXRhIGFuZCBmaWxscyAnZGF0YScgd2l0aCB0aGUgcmVxdWVzdGVkIGtpbmQKLS8vIChjdXJyZW50bHkga2luZD0wIHJldHVybnMgbW9ubyAxNiBiaXQgUENNIGRhdGEsIGFuZCBraW5kPTEgcmV0dXJucwotLy8gMjU2IHBvaW50IEZGVCBkYXRhKS4gUmV0dXJuIHZhbHVlIGlzIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkLAotLy8gd2hpY2ggbWF5IGJlIDAuCi0vKnN0YXRpYyovIGludCBNZWRpYVBsYXllcjo6c25vb3Aoc2hvcnQqIGRhdGEsIGludCBsZW4sIGludCBraW5kKSB7Ci0KLSAgICBzcDxJTWVtb3J5PiBwOwotICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlID0gZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCk7Ci0gICAgaWYgKHNlcnZpY2UgIT0gMCkgewotICAgICAgICAvLyBUYWtlIGEgcGVlayBhdCB0aGUgd2F2ZWZvcm0uIFRoZSByZXR1cm5lZCBkYXRhIGNvbnNpc3RzIG9mIDE2IGJpdCBtb25vIFBDTSBkYXRhLgotICAgICAgICBwID0gc2VydmljZS0+c25vb3AoKTsKLQotICAgICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChraW5kID09IDApIHsgLy8gcmV0dXJuIHdhdmVmb3JtIGRhdGEKLSAgICAgICAgICAgIGludCBwbGVuID0gcC0+c2l6ZSgpOwotICAgICAgICAgICAgbGVuICo9IDI7IC8vIG51bWJlciBvZiBzaG9ydHMgLT4gbnVtYmVyIG9mIGJ5dGVzCi0gICAgICAgICAgICBzaG9ydCAqc3JjID0gKHNob3J0KikgcC0+cG9pbnRlcigpOwotICAgICAgICAgICAgaWYgKHBsZW4gPiBsZW4pIHsKLSAgICAgICAgICAgICAgICBwbGVuID0gbGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHNyYywgcGxlbik7Ci0gICAgICAgICAgICByZXR1cm4gcGxlbiAvIHNpemVvZihzaG9ydCk7IC8vIHJldHVybiBudW1iZXIgb2Ygc2FtcGxlcwotICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT0gMSkgewotICAgICAgICAgICAgLy8gVE9ETzogdXNlIGEgbW9yZSBlZmZpY2llbnQgRkZUCi0gICAgICAgICAgICAvLyBSaWdodCBub3cgdGhpcyB1c2VzIHRoZSBzcGVleCBsaWJyYXJ5LCB3aGljaCBpcyBjb21waWxlZCB0byBkbyBhIGZsb2F0IEZGVAotICAgICAgICAgICAgaWYgKCFmZnR0YWJsZSkgZmZ0dGFibGUgPSBzcHhfZmZ0X2luaXQoNTEyKTsKLSAgICAgICAgICAgIHNob3J0ICp1c3JjID0gKHNob3J0KikgcC0+cG9pbnRlcigpOwotICAgICAgICAgICAgZmxvYXQgZnNyY1s1MTJdOwotICAgICAgICAgICAgZm9yIChpbnQgaT0wO2k8NTEyO2krKykKLSAgICAgICAgICAgICAgICBmc3JjW2ldID0gdXNyY1tpXTsKLSAgICAgICAgICAgIGZsb2F0IGZkc3RbNTEyXTsKLSAgICAgICAgICAgIHNweF9mZnRfZmxvYXQoZmZ0dGFibGUsIGZzcmMsIGZkc3QpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDUxMikgewotICAgICAgICAgICAgICAgIGxlbiA9IDUxMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxlbiAvPSAyOyAvLyBvbmx5IGhhbGYgdGhlIG91dHB1dCBkYXRhIGlzIHZhbGlkCi0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgICAgICAgICBkYXRhW2ldID0gZmRzdFtpXTsKLSAgICAgICAgICAgIHJldHVybiBsZW47Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoIlVuYWJsZSB0byBsb2NhdGUgbWVkaWEgc2VydmljZSIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggNWFkYzExNi4uOWQ1M2MyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgICAgICBMT0dFKCJzZXRPdXRwdXRGb3JtYXQgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGU6ICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG1Jc1ZpZGVvU291cmNlU2V0ICYmIG9mID49IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9TVEFSVCkgeyAvL2ZpcnN0IG5vbi12aWRlbyBvdXRwdXQgZm9ybWF0CisgICAgaWYgKG1Jc1ZpZGVvU291cmNlU2V0ICYmIG9mID49IE9VVFBVVF9GT1JNQVRfQVVESU9fT05MWV9TVEFSVCAmJiBvZiAhPSBPVVRQVVRfRk9STUFUX1JUUF9BVlApIHsgLy9maXJzdCBub24tdmlkZW8gb3V0cHV0IGZvcm1hdAogICAgICAgICBMT0dFKCJvdXRwdXQgZm9ybWF0ICglZCkgaXMgbWVhbnQgZm9yIGF1ZGlvIHJlY29yZGluZyBvbmx5IGFuZCBpbmNvbXBhdGlibGUgd2l0aCB2aWRlbyByZWNvcmRpbmciLCBvZik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IGNmOTdiMjMuLmUxZWRkMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rCkBAIC0xMSwyMSArMTEsMTEgQEAKICAgICBNZWRpYVBsYXllclNlcnZpY2UuY3BwICAgICAgXAogICAgIE1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBcCiAgICAgVGVzdFBsYXllclN0dWIuY3BwICAgICAgICAgIFwKLSAgICBWb3JiaXNQbGF5ZXIuY3BwICAgICAgICAgICAgXAotICAgIFZvcmJpc01ldGFkYXRhUmV0cmlldmVyLmNwcCBcCi0gICAgTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCAJXAotICAgIE1pZGlGaWxlLmNwcAotCi1pZmVxICgkKEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVCksdHJ1ZSkKLQotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdGFnZWZyaWdodFBsYXllci5jcHAgICAgICAgICAgICAgICBcCisgICAgTWlkaU1ldGFkYXRhUmV0cmlldmVyLmNwcCAgIFwKKyAgICBNaWRpRmlsZS5jcHAgICAgICAgICAgICAgICAgXAorICAgIFN0YWdlZnJpZ2h0UGxheWVyLmNwcCAgICAgICBcCiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1EQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUPTEKLQotZW5kaWYKLQogaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKIExPQ0FMX0xETElCUyArPSAtbGRsIC1scHRocmVhZAogZW5kaWYKQEAgLTM3LDEyICsyNywxNyBAQAogCWxpYnZvcmJpc2lkZWMgICAgICAgICAJCQlcCiAJbGlic29uaXZveCAgICAgICAgICAgIAkJCVwKIAlsaWJtZWRpYSAgICAgICAgICAgICAgCQkJXAorCWxpYmNhbWVyYV9jbGllbnQgICAgICAJCQlcCiAJbGliYW5kcm9pZF9ydW50aW1lICAgIAkJCVwKIAlsaWJzdGFnZWZyaWdodCAgICAgICAgCQkJXAogCWxpYnN0YWdlZnJpZ2h0X29teCAgICAJCQlcCi0JbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiBcCisJbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiAgICAgICAgIFwKKwlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uICAgICAgICAgICAgICAgXAogCWxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudAogCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcAorCiBpZm5lcSAoJChCVUlMRF9XSVRIT1VUX1BWKSx0cnVlKQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCiAJbGlib3BlbmNvcmVfcGxheWVyICAgIFwKQEAgLTYwLDYgKzU1LDcgQEAKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKSAgICAgICAgICAgICAgICAgICAgICAgXAogCSQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgXAogICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sby9UcmVtb2xvCiAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhcGxheWVyc2VydmljZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCA2YTZhZmExLi5hYmE1ZjUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCiAKICNpbmNsdWRlICJNaWRpRmlsZS5oIgotI2luY2x1ZGUgIlZvcmJpc1BsYXllci5oIgogI2luY2x1ZGUgPG1lZGlhL1BWUGxheWVyLmg+CiAjaW5jbHVkZSAiVGVzdFBsYXllclN0dWIuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsYXllci5oIgpAQCAtMTk3LDggKzE5Niw2IEBACiAgICAgICAgIHsiLnJ0dHRsIiwgU09OSVZPWF9QTEFZRVJ9LAogICAgICAgICB7Ii5ydHgiLCBTT05JVk9YX1BMQVlFUn0sCiAgICAgICAgIHsiLm90YSIsIFNPTklWT1hfUExBWUVSfSwKLSAgICAgICAgeyIub2dnIiwgVk9SQklTX1BMQVlFUn0sCi0gICAgICAgIHsiLm9nYSIsIFZPUkJJU19QTEFZRVJ9LAogI2lmbmRlZiBOT19PUEVOQ09SRQogICAgICAgICB7Ii53bWEiLCBQVl9QTEFZRVJ9LAogICAgICAgICB7Ii53bXYiLCBQVl9QTEFZRVJ9LApAQCAtMjI4LDE0ICsyMjUsMTAgQEAKIAogc3A8SU1lZGlhUmVjb3JkZXI+IE1lZGlhUGxheWVyU2VydmljZTo6Y3JlYXRlTWVkaWFSZWNvcmRlcihwaWRfdCBwaWQpCiB7Ci0jaWZuZGVmIE5PX09QRU5DT1JFCiAgICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlckNsaWVudCh0aGlzLCBwaWQpOwogICAgIHdwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IHcgPSByZWNvcmRlcjsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbU1lZGlhUmVjb3JkZXJDbGllbnRzLmFkZCh3KTsKLSNlbHNlCi0gICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gcmVjb3JkZXIgPSBOVUxMOwotI2VuZGlmCiAgICAgTE9HVigiQ3JlYXRlIG5ldyBtZWRpYSByZWNvcmRlciBjbGllbnQgZnJvbSBwaWQgJWQiLCBwaWQpOwogICAgIHJldHVybiByZWNvcmRlcjsKIH0KQEAgLTI1NiwxMSArMjQ5LDEyIEBACiAKIHNwPElNZWRpYVBsYXllcj4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpjcmVhdGUoCiAgICAgICAgIHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBjb25zdCBjaGFyKiB1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywgaW50IGF1ZGlvU2Vzc2lvbklkKQogewogICAgIGludDMyX3QgY29ubklkID0gYW5kcm9pZF9hdG9taWNfaW5jKCZtTmV4dENvbm5JZCk7Ci0gICAgc3A8Q2xpZW50PiBjID0gbmV3IENsaWVudCh0aGlzLCBwaWQsIGNvbm5JZCwgY2xpZW50KTsKLSAgICBMT0dWKCJDcmVhdGUgbmV3IGNsaWVudCglZCkgZnJvbSBwaWQgJWQsIHVybD0lcywgY29ubklkPSVkIiwgY29ubklkLCBwaWQsIHVybCwgY29ubklkKTsKKyAgICBzcDxDbGllbnQ+IGMgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQsIGF1ZGlvU2Vzc2lvbklkKTsKKyAgICBMT0dWKCJDcmVhdGUgbmV3IGNsaWVudCglZCkgZnJvbSBwaWQgJWQsIHVybD0lcywgY29ubklkPSVkLCBhdWRpb1Nlc3Npb25JZD0lZCIsCisgICAgICAgICAgICBjb25uSWQsIHBpZCwgdXJsLCBjb25uSWQsIGF1ZGlvU2Vzc2lvbklkKTsKICAgICBpZiAoTk9fRVJST1IgIT0gYy0+c2V0RGF0YVNvdXJjZSh1cmwsIGhlYWRlcnMpKQogICAgIHsKICAgICAgICAgYy5jbGVhcigpOwpAQCAtMjczLDEyICsyNjcsMTIgQEAKIH0KIAogc3A8SU1lZGlhUGxheWVyPiBNZWRpYVBsYXllclNlcnZpY2U6OmNyZWF0ZShwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBpbnQgYXVkaW9TZXNzaW9uSWQpCiB7CiAgICAgaW50MzJfdCBjb25uSWQgPSBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0Q29ubklkKTsKLSAgICBzcDxDbGllbnQ+IGMgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQpOwotICAgIExPR1YoIkNyZWF0ZSBuZXcgY2xpZW50KCVkKSBmcm9tIHBpZCAlZCwgZmQ9JWQsIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCi0gICAgICAgICAgICBjb25uSWQsIHBpZCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICBzcDxDbGllbnQ+IGMgPSBuZXcgQ2xpZW50KHRoaXMsIHBpZCwgY29ubklkLCBjbGllbnQsIGF1ZGlvU2Vzc2lvbklkKTsKKyAgICBMT0dWKCJDcmVhdGUgbmV3IGNsaWVudCglZCkgZnJvbSBwaWQgJWQsIGZkPSVkLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQsIGF1ZGlvU2Vzc2lvbklkPSVkIiwKKyAgICAgICAgICAgIGNvbm5JZCwgcGlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIGF1ZGlvU2Vzc2lvbklkKTsKICAgICBpZiAoTk9fRVJST1IgIT0gYy0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKSB7CiAgICAgICAgIGMuY2xlYXIoKTsKICAgICB9IGVsc2UgewpAQCAtMzM1LDYgKzMyOSwxMCBAQAogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBtc2VjIHBlciBmcmFtZSglZiksIGxhdGVuY3kgKCVkKVxuIiwKICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCBtTGF0ZW5jeSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBhdXggZWZmZWN0IGlkKCVkKSwgc2VuZCBsZXZlbCAoJWYpXG4iLAorICAgICAgICAgICAgbUF1eEVmZmVjdElkLCBtU2VuZExldmVsKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIGlmIChtVHJhY2sgIT0gMCkgewogICAgICAgICBtVHJhY2stPmR1bXAoZmQsIGFyZ3MpOwpAQCAtNTE3LDExICs1MTUsMTcgQEAKICAgICAgICAgICAgIHNwPENsaWVudD4gYyA9IG1DbGllbnRzW2ldLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChjICE9IDApIGMtPmR1bXAoZmQsIGFyZ3MpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbU1lZGlhUmVjb3JkZXJDbGllbnRzLnNpemUoKTsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIE1lZGlhUmVjb3JkZXJDbGllbnRcbiIpOwotICAgICAgICAgICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gYyA9IG1NZWRpYVJlY29yZGVyQ2xpZW50c1tpXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgcGlkKCVkKVxuXG4iLCBjLT5tUGlkKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgaWYgKG1NZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiBObyBtZWRpYSByZWNvcmRlciBjbGllbnRcblxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IG1NZWRpYVJlY29yZGVyQ2xpZW50cy5zaXplKCk7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcDxNZWRpYVJlY29yZGVyQ2xpZW50PiBjID0gbU1lZGlhUmVjb3JkZXJDbGllbnRzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiBNZWRpYVJlY29yZGVyQ2xpZW50IHBpZCglZClcbiIsIGMtPm1QaWQpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiXG4iOworICAgICAgICAgICAgICAgIGMtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CkBAIC02MTMsNyArNjE3LDcgQEAKIH0KIAogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQsCi0gICAgICAgIGludDMyX3QgY29ubklkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQpCisgICAgICAgIGludDMyX3QgY29ubklkLCBjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBjbGllbnQsIGludCBhdWRpb1Nlc3Npb25JZCkKIHsKICAgICBMT0dWKCJDbGllbnQoJWQpIGNvbnN0cnVjdG9yIiwgY29ubklkKTsKICAgICBtUGlkID0gcGlkOwpAQCAtNjIyLDYgKzYyNiw4IEBACiAgICAgbUNsaWVudCA9IGNsaWVudDsKICAgICBtTG9vcCA9IGZhbHNlOwogICAgIG1TdGF0dXMgPSBOT19JTklUOworICAgIG1BdWRpb1Nlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbklkOworCiAjaWYgQ0FMTEJBQ0tfQU5UQUdPTklaRVIKICAgICBMT0dEKCJjcmVhdGUgQW50YWdvbml6ZXIiKTsKICAgICBtQW50YWdvbml6ZXIgPSBuZXcgQW50YWdvbml6ZXIobm90aWZ5LCB0aGlzKTsKQEAgLTY2NywzNyArNjczLDkgQEAKIH0KIAogc3RhdGljIHBsYXllcl90eXBlIGdldERlZmF1bHRQbGF5ZXJUeXBlKCkgewotI2lmIEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVAotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtcGxheWVyIiwgdmFsdWUsIE5VTEwpCi0gICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgewotICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIFBWX1BMQVlFUjsKKyAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwogfQogCi0vLyBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgVk9SQklTX1BMQVlFUiBmb3Igdm9yYmlzIHBsYXliYWNrIChkdWghKSwKLS8vIGJ1dCBpZiB0aGUgbWFnaWMgcHJvcGVydHkgaXMgc2V0IHdlIHdpbGwgdXNlIG91ciBuZXcgZXhwZXJpbWVudGFsCi0vLyBzdGFnZWZyaWdodCBjb2RlIGluc3RlYWQuCi1zdGF0aWMgcGxheWVyX3R5cGUgT3ZlcnJpZGVTdGFnZWZyaWdodEZvclZvcmJpcyhwbGF5ZXJfdHlwZSBwbGF5ZXIpIHsKLSAgICBpZiAocGxheWVyICE9IFZPUkJJU19QTEFZRVIpIHsKLSAgICAgICAgcmV0dXJuIHBsYXllcjsKLSAgICB9Ci0KLSNpZiBCVUlMRF9XSVRIX0ZVTExfU1RBR0VGUklHSFQKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQuZW5hYmxlLXZvcmJpcyIsIHZhbHVlLCBOVUxMKQotICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY21wKHZhbHVlLCAidHJ1ZSIpKSkgewotICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwotICAgIH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIFZPUkJJU19QTEFZRVI7Ci19Ci0KLQogcGxheWVyX3R5cGUgZ2V0UGxheWVyVHlwZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKIHsKICAgICBjaGFyIGJ1ZlsyMF07CkBAIC03MDksNyArNjg3LDcgQEAKIAogICAgIC8vIE9nZyB2b3JiaXM/CiAgICAgaWYgKGlkZW50ID09IDB4NTM2NzY3NGYpIC8vICdPZ2dTJwotICAgICAgICByZXR1cm4gT3ZlcnJpZGVTdGFnZWZyaWdodEZvclZvcmJpcyhWT1JCSVNfUExBWUVSKTsKKyAgICAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKIAogI2lmbmRlZiBOT19PUEVOQ09SRQogICAgIGlmIChpZGVudCA9PSAweDc1YjIyNjMwKSB7CkBAIC03NDUsMTMgKzcyMyw2IEBACiAgICAgICAgIHJldHVybiBURVNUX1BMQVlFUjsKICAgICB9CiAKLSAgICBib29sIHVzZVN0YWdlZnJpZ2h0Rm9ySFRUUCA9IGZhbHNlOwotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtaHR0cCIsIHZhbHVlLCBOVUxMKQotICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpIHsKLSAgICAgICAgdXNlU3RhZ2VmcmlnaHRGb3JIVFRQID0gdHJ1ZTsKLSAgICB9Ci0KICAgICAvLyB1c2UgTWlkaUZpbGUgZm9yIE1JREkgZXh0ZW5zaW9ucwogICAgIGludCBsZW5VUkwgPSBzdHJsZW4odXJsKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5FTEVNKEZJTEVfRVhUUyk7ICsraSkgewpAQCAtNzU5LDI3ICs3MzAsMjEgQEAKICAgICAgICAgaW50IHN0YXJ0ID0gbGVuVVJMIC0gbGVuOwogICAgICAgICBpZiAoc3RhcnQgPiAwKSB7CiAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCArIHN0YXJ0LCBGSUxFX0VYVFNbaV0uZXh0ZW5zaW9uLCBsZW4pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEZJTEVfRVhUU1tpXS5wbGF5ZXJ0eXBlID09IFZPUkJJU19QTEFZRVIKLSAgICAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQotICAgICAgICAgICAgICAgICAgICAmJiB1c2VTdGFnZWZyaWdodEZvckhUVFApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE92ZXJyaWRlU3RhZ2VmcmlnaHRGb3JWb3JiaXMoRklMRV9FWFRTW2ldLnBsYXllcnR5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBGSUxFX0VYVFNbaV0ucGxheWVydHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghc3RybmNhc2VjbXAodXJsLCAiaHR0cDovLyIsIDcpKSB7Ci0gICAgICAgIGlmICghdXNlU3RhZ2VmcmlnaHRGb3JIVFRQKSB7CisgICAgaWYgKCFzdHJuY2FzZWNtcCh1cmwsICJydHNwOi8vIiwgNykpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtcnRzcCIsIHZhbHVlLCBOVUxMKQorICAgICAgICAgICAgJiYgKHN0cmNtcCh2YWx1ZSwgIjEiKSAmJiBzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgeworICAgICAgICAgICAgLy8gRm9yIG5vdywgd2UncmUgZ29pbmcgdG8gdXNlIFBWIGZvciBydHNwLWJhc2VkIHBsYXliYWNrCisgICAgICAgICAgICAvLyBieSBkZWZhdWx0IHVudGlsIHdlIGNhbiBjbGVhciB1cCBhIGZldyBtb3JlIGlzc3Vlcy4KICAgICAgICAgICAgIHJldHVybiBQVl9QTEFZRVI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBVc2UgUFZfUExBWUVSIGZvciBydHNwIGZvciBub3cKLSAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgInJ0c3A6Ly8iLCA3KSkgewotICAgICAgICByZXR1cm4gUFZfUExBWUVSOwotICAgIH0KLQogICAgIHJldHVybiBnZXREZWZhdWx0UGxheWVyVHlwZSgpOwogfQogCkBAIC03OTgsMTYgKzc2MywxMCBAQAogICAgICAgICAgICAgTE9HVigiIGNyZWF0ZSBNaWRpRmlsZSIpOwogICAgICAgICAgICAgcCA9IG5ldyBNaWRpRmlsZSgpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVk9SQklTX1BMQVlFUjoKLSAgICAgICAgICAgIExPR1YoIiBjcmVhdGUgVm9yYmlzUGxheWVyIik7Ci0gICAgICAgICAgICBwID0gbmV3IFZvcmJpc1BsYXllcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0jaWYgQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUCiAgICAgICAgIGNhc2UgU1RBR0VGUklHSFRfUExBWUVSOgogICAgICAgICAgICAgTE9HVigiIGNyZWF0ZSBTdGFnZWZyaWdodFBsYXllciIpOwogICAgICAgICAgICAgcCA9IG5ldyBTdGFnZWZyaWdodFBsYXllcjsKICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCiAgICAgICAgIGNhc2UgVEVTVF9QTEFZRVI6CiAgICAgICAgICAgICBMT0dWKCJDcmVhdGUgVGVzdCBQbGF5ZXIgc3R1YiIpOwogICAgICAgICAgICAgcCA9IG5ldyBUZXN0UGxheWVyU3R1YigpOwpAQCAtODcwLDcgKzgyOSw3IEBACiAgICAgICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOT19JTklUOwogCiAgICAgICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KCk7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkKTsKICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZGlhUGxheWVySW50ZXJmYWNlKj4ocC5nZXQoKSktPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwogICAgICAgICB9CiAKQEAgLTkyMCw3ICs4NzksNyBAQAogICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOT19JTklUOwogCiAgICAgaWYgKCFwLT5oYXJkd2FyZU91dHB1dCgpKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBBdWRpb091dHB1dCgpOworICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkKTsKICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwLmdldCgpKS0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAgICAgfQogCkBAIC0xMTM4LDYgKzEwOTcsMjEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpCit7CisgICAgTE9HVigiWyVkXSBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbUNvbm5JZCwgbGV2ZWwpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKK3sKKyAgICBMT0dWKCJbJWRdIGF0dGFjaEF1eEVmZmVjdCglZCkiLCBtQ29ubklkLCBlZmZlY3RJZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgcmV0dXJuIG1BdWRpb091dHB1dC0+YXR0YWNoQXV4RWZmZWN0KGVmZmVjdElkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeSh2b2lkKiBjb29raWUsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MikKIHsKQEAgLTEzMTYsMTExICsxMjkwLDIyIEBACiAgICAgcmV0dXJuIG1lbTsKIH0KIAotLyoKLSAqIEF2ZXJ0IHlvdXIgZXllcywgdWdseSBoYWNrIGFoZWFkLgotICogVGhlIGZvbGxvd2luZyBpcyB0byBzdXBwb3J0IG11c2ljIHZpc3VhbGl6YXRpb25zLgotICovCi0KLXN0YXRpYyBjb25zdCBpbnQgTlVNVklaQlVGID0gMzI7Ci1zdGF0aWMgY29uc3QgaW50IFZJWkJVRkZSQU1FUyA9IDEwMjQ7Ci1zdGF0aWMgY29uc3QgaW50IEJVRlRJTUVNU0VDID0gTlVNVklaQlVGICogVklaQlVGRlJBTUVTICogMTAwMCAvIDQ0MTAwOwotc3RhdGljIGNvbnN0IGludCBUT1RBTEJVRlRJTUVNU0VDID0gTlVNVklaQlVGICogQlVGVElNRU1TRUM7Ci0KLXN0YXRpYyBib29sIGdvdE1lbSA9IGZhbHNlOwotc3RhdGljIHNwPE1lbW9yeUhlYXBCYXNlPiBoZWFwOyAKLXN0YXRpYyBzcDxNZW1vcnlCYXNlPiBtZW1bTlVNVklaQlVGXTsKLXN0YXRpYyB1aW50NjRfdCBlbmRUaW1lOwotc3RhdGljIHVpbnQ2NF90IGxhc3RSZWFkVGltZTsKLXN0YXRpYyB1aW50NjRfdCBsYXN0V3JpdGVUaW1lOwotc3RhdGljIGludCB3cml0ZUlkeCA9IDA7Ci0KLXN0YXRpYyB2b2lkIGFsbG9jVml6QnVmcygpIHsKLSAgICBpZiAoIWdvdE1lbSkgewotICAgICAgICBoZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKE5VTVZJWkJVRiAqIFZJWkJVRkZSQU1FUyAqIDIsIDAsICJzbm9vcGVyIik7Ci0gICAgICAgIGZvciAoaW50IGk9MDtpPE5VTVZJWkJVRjtpKyspIHsKLSAgICAgICAgICAgIG1lbVtpXSA9IG5ldyBNZW1vcnlCYXNlKGhlYXAsIFZJWkJVRkZSQU1FUyAqIDIgKiBpLCBWSVpCVUZGUkFNRVMgKiAyKTsKLSAgICAgICAgfQotICAgICAgICBlbmRUaW1lID0gMDsKLSAgICAgICAgZ290TWVtID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIEdldCBhIGJ1ZmZlciBvZiBhdWRpbyBkYXRhIHRoYXQgaXMgYWJvdXQgdG8gYmUgcGxheWVkLgotICogV2UgZG9uJ3Qgc3luY2hyb25pemUgdGhpcyBiZWNhdXNlIGluIHByYWN0aWNlIHRoZSB3cml0ZXIKLSAqIGlzIGFoZWFkIG9mIHRoZSByZWFkZXIsIGFuZCBldmVuIGlmIHdlIGRpZCBoYXBwZW4gdG8gY2F0Y2gKLSAqIGEgYnVmZmVyIHdoaWxlIGl0J3MgYmVpbmcgd3JpdHRlbiwgaXQncyBqdXN0IGEgdmlzdWFsaXphdGlvbiwKLSAqIHNvIG5vIGhhcm0gZG9uZS4KLSAqLwotc3RhdGljIHNwPE1lbW9yeUJhc2U+IGdldFZpekJ1ZmZlcigpIHsKLQotICAgIGFsbG9jVml6QnVmcygpOwotCi0gICAgbGFzdFJlYWRUaW1lID0gdXB0aW1lTWlsbGlzKCk7Ci0KLSAgICAvLyBpZiB0aGVyZSBpcyBubyByZWNlbnQgYnVmZmVyICh5ZXQpLCBqdXN0IHJldHVybiBlbXB0eSBoYW5kZWQKLSAgICBpZiAobGFzdFdyaXRlVGltZSArIFRPVEFMQlVGVElNRU1TRUMgPCBsYXN0UmVhZFRpbWUpIHsKLSAgICAgICAgLy9MT0dJKCJAQEBAICAgIG5vIGF1ZGlvIGRhdGEgdG8gbG9vayBhdCB5ZXQ6ICVkICsgJWQgPCAlZCIsIChpbnQpbGFzdFdyaXRlVGltZSwgVE9UQUxCVUZUSU1FTVNFQywgKGludClsYXN0UmVhZFRpbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQgdGltZWRlbHRhID0gZW5kVGltZSAtIGxhc3RSZWFkVGltZTsKLSAgICBpZiAodGltZWRlbHRhIDwgMCkgdGltZWRlbHRhID0gMDsKLSAgICBpbnQgZnJhbWVkZWx0YSA9IHRpbWVkZWx0YSAqIDQ0MTAwIC8gMTAwMDsKLSAgICBpbnQgaGVhZElkeCA9ICh3cml0ZUlkeCAtIGZyYW1lZGVsdGEpIC8gVklaQlVGRlJBTUVTIC0gMTsKLSAgICB3aGlsZSAoaGVhZElkeCA8IDApIHsKLSAgICAgICAgaGVhZElkeCArPSBOVU1WSVpCVUY7Ci0gICAgfQotICAgIHJldHVybiBtZW1baGVhZElkeF07Ci19Ci0KLS8vIEFwcGVuZCB0aGUgZGF0YSB0byB0aGUgdml6dWFsaXphdGlvbiBidWZmZXIKLXN0YXRpYyB2b2lkIG1ha2VWaXpCdWZmZXJzKGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4sIHVpbnQ2NF90IHRpbWUpIHsKLQotICAgIGFsbG9jVml6QnVmcygpOwotCi0gICAgdWludDY0X3Qgc3RhcnRUaW1lID0gdGltZTsKLSAgICBjb25zdCBpbnQgZnJhbWVTaXplID0gNDsgLy8gMTYgYml0IHN0ZXJlbyBzYW1wbGUgaXMgNCBieXRlcwotICAgIGludCBvZmZzZXQgPSB3cml0ZUlkeDsKLSAgICBpbnQgbWF4b2ZmID0gaGVhcC0+Z2V0U2l6ZSgpIC8gMjsgLy8gaW4gc2hvcnRzCi0gICAgc2hvcnQgKmJhc2UgPSAoc2hvcnQqKWhlYXAtPmdldEJhc2UoKTsKLSAgICBzaG9ydCAqc3JjID0gKHNob3J0KilkYXRhOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBEZWdyYWRlIHF1YWxpdHkgYnkgbWl4aW5nIHRvIG1vbm8gYW5kIGNsZWFyaW5nIHRoZSBsb3dlc3QgMyBiaXRzLgotICAgICAgICAvLyBUaGlzIHNob3VsZCBzdGlsbCBiZSBnb29kIGVub3VnaCBmb3IgYSB2aXN1YWxpemF0aW9uCi0gICAgICAgIGJhc2Vbb2Zmc2V0KytdID0gKChpbnQoc3JjWzBdKSArIGludChzcmNbMV0pKSA+PiAxKSAmIH4weDc7Ci0gICAgICAgIHNyYyArPSAyOwotICAgICAgICBsZW4gLT0gZnJhbWVTaXplOwotICAgICAgICBpZiAob2Zmc2V0ID49IG1heG9mZikgewotICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZUlkeCA9IG9mZnNldDsKLSAgICBlbmRUaW1lID0gdGltZSArIChsZW4gLyBmcmFtZVNpemUpIC8gNDQ7Ci0gICAgLy9MT0dJKCJAQEAgc3RvcmVkIGJ1ZmZlcnMgZnJvbSAlZCB0byAlZCIsIHVpbnQzMl90KHN0YXJ0VGltZSksIHVpbnQzMl90KHRpbWUpKTsKLX0KLQotc3A8SU1lbW9yeT4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpzbm9vcCgpCi17Ci0gICAgc3A8TWVtb3J5QmFzZT4gbWVtID0gZ2V0Vml6QnVmZmVyKCk7Ci0gICAgcmV0dXJuIG1lbTsKLX0KLQogCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCi1NZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dCgpCitNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChpbnQgc2Vzc2lvbklkKQogICAgIDogbUNhbGxiYWNrKE5VTEwpLAotICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpIHsKKyAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7CisgICAgTE9HVigiQXVkaW9PdXRwdXQoJWQpIiwgc2Vzc2lvbklkKTsKICAgICBtVHJhY2sgPSAwOwogICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06Ok1VU0lDOwogICAgIG1MZWZ0Vm9sdW1lID0gMS4wOwogICAgIG1SaWdodFZvbHVtZSA9IDEuMDsKICAgICBtTGF0ZW5jeSA9IDA7CiAgICAgbU1zZWNzUGVyRnJhbWUgPSAwOwotICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKKyAgICBtQXV4RWZmZWN0SWQgPSAwOworICAgIG1TZW5kTGV2ZWwgPSAwLjA7CiAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKIH0KIApAQCAtMTUwMyw3ICsxMzg4LDcgQEAKICAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7CiAKICAgICB9Ci0gICAgTE9HVigib3BlbigldSwgJWQsICVkLCAlZCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGZvcm1hdCwgYnVmZmVyQ291bnQpOworICAgIExPR1YoIm9wZW4oJXUsICVkLCAlZCwgJWQsICVkKSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBidWZmZXJDb3VudCxtU2Vzc2lvbklkKTsKICAgICBpZiAobVRyYWNrKSBjbG9zZSgpOwogICAgIGludCBhZlNhbXBsZVJhdGU7CiAgICAgaW50IGFmRnJhbWVDb3VudDsKQEAgLTE1MjgsMTQgKzE0MTMsMjEgQEAKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8sCiAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKICAgICB9IGVsc2UgewogICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCiAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgKGNoYW5uZWxDb3VudCA9PSAyKSA/IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX09VVF9TVEVSRU8gOiBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfTU9OTywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgfQogCiAgICAgaWYgKCh0ID09IDApIHx8ICh0LT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikpIHsKQEAgLTE1NDYsMTAgKzE0MzgsMTMgQEAKIAogICAgIExPR1YoInNldFZvbHVtZSIpOwogICAgIHQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKKwogICAgIG1Nc2Vjc1BlckZyYW1lID0gMS5lMyAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKICAgICBtTGF0ZW5jeSA9IHQtPmxhdGVuY3koKTsKICAgICBtVHJhY2sgPSB0OwotICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIHQtPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICByZXR1cm4gdC0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7OwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnN0YXJ0KCkKQEAgLTE1NTcsMzEgKzE0NTIsMTEgQEAKICAgICBMT0dWKCJzdGFydCIpOwogICAgIGlmIChtVHJhY2spIHsKICAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwogICAgICAgICBtVHJhY2stPnN0YXJ0KCk7Ci0gICAgICAgIG1UcmFjay0+Z2V0UG9zaXRpb24oJm1OdW1GcmFtZXNXcml0dGVuKTsKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c25vb3BXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgLy8gT25seSBtYWtlIHZpc3VhbGl6YXRpb24gYnVmZmVycyBpZiBhbnlvbmUgcmVjZW50bHkgcmVxdWVzdGVkIHZpc3VhbGl6YXRpb24gZGF0YQotICAgIHVpbnQ2NF90IG5vdyA9IHVwdGltZU1pbGxpcygpOwotICAgIGlmIChsYXN0UmVhZFRpbWUgKyBUT1RBTEJVRlRJTUVNU0VDID49IG5vdykgewotICAgICAgICAvLyBCYXNlZCBvbiB0aGUgY3VycmVudCBwbGF5IGNvdW50ZXIsIHRoZSBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gYW5kCi0gICAgICAgIC8vIHRoZSBjdXJyZW50IHJlYWwgdGltZSB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBhcHByb3hpbWF0ZSByZWFsIHN0YXJ0Ci0gICAgICAgIC8vIHRpbWUgb2YgdGhlIGJ1ZmZlciB3ZSdyZSBhYm91dCB0byB3cml0ZS4KLSAgICAgICAgdWludDMyX3QgcG9zOwotICAgICAgICBtVHJhY2stPmdldFBvc2l0aW9uKCZwb3MpOwotCi0gICAgICAgIC8vIHdlJ3JlIHdyaXRpbmcgYWhlYWQgYnkgdGhpcyBtYW55IGZyYW1lczoKLSAgICAgICAgaW50IGFoZWFkID0gbU51bUZyYW1lc1dyaXR0ZW4gLSBwb3M7Ci0gICAgICAgIC8vTE9HSSgiQEBAIHdyaXR0ZW46ICVkLCBwbGF5cG9zOiAlZCwgbGF0ZW5jeTogJWQiLCBtTnVtRnJhbWVzV3JpdHRlbiwgcG9zLCBtVHJhY2stPmxhdGVuY3koKSk7Ci0gICAgICAgIC8vIHdoaWNoIGlzIHRoaXMgbWFueSBtaWxsaXNlY29uZHMsIGFzc3VtaW5nIDQ0MTAwIEh6OgotICAgICAgICBhaGVhZCAvPSA0NDsKLQotICAgICAgICBtYWtlVml6QnVmZmVycygoY29uc3QgY2hhciopYnVmZmVyLCBzaXplLCBub3cgKyBhaGVhZCArIG1UcmFjay0+bGF0ZW5jeSgpKTsKLSAgICAgICAgbGFzdFdyaXRlVGltZSA9IG5vdzsKLSAgICB9Ci19CiAKIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKQpAQCAtMTU5MCw5ICsxNDY1LDcgQEAKIAogICAgIC8vTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7CiAgICAgaWYgKG1UcmFjaykgewotICAgICAgICBzbm9vcFdyaXRlKGJ1ZmZlciwgc2l6ZSk7CiAgICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUpOwotICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSByZXQgLyA0OyAvLyBhc3N1bWUgMTYgYml0IHN0ZXJlbwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE2MDIsNyArMTQ3NSw2IEBACiB7CiAgICAgTE9HVigic3RvcCIpOwogICAgIGlmIChtVHJhY2spIG1UcmFjay0+c3RvcCgpOwotICAgIGxhc3RXcml0ZVRpbWUgPSAwOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmZsdXNoKCkKQEAgLTE2MTUsNyArMTQ4Nyw2IEBACiB7CiAgICAgTE9HVigicGF1c2UiKTsKICAgICBpZiAobVRyYWNrKSBtVHJhY2stPnBhdXNlKCk7Ci0gICAgbGFzdFdyaXRlVGltZSA9IDA7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Y2xvc2UoKQpAQCAtMTYzNSw2ICsxNTA2LDI2IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpCit7CisgICAgTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKKyAgICBtU2VuZExldmVsID0gbGV2ZWw7CisgICAgaWYgKG1UcmFjaykgeworICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCit7CisgICAgTE9HVigiYXR0YWNoQXV4RWZmZWN0KCVkKSIsIGVmZmVjdElkKTsKKyAgICBtQXV4RWZmZWN0SWQgPSBlZmZlY3RJZDsKKyAgICBpZiAobVRyYWNrKSB7CisgICAgICAgIHJldHVybiBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogLy8gc3RhdGljCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkNhbGxiYWNrV3JhcHBlcigKICAgICAgICAgaW50IGV2ZW50LCB2b2lkICpjb29raWUsIHZvaWQgKmluZm8pIHsKQEAgLTE2NTEsOSArMTU0Miw2IEBACiAKICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwogCi0gICAgaWYgKGFjdHVhbFNpemUgPiAwKSB7Ci0gICAgICAgIG1lLT5zbm9vcFdyaXRlKGJ1ZmZlci0+cmF3LCBhY3R1YWxTaXplKTsKLSAgICB9CiB9CiAKICN1bmRlZiBMT0dfVEFHCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggMjQwOGM2Mi4uYTk2N2VlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtNjUsNyArNjUsNyBAQAogICAgIGNsYXNzIEF1ZGlvT3V0cHV0IDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCiAgICAgewogICAgIHB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9PdXRwdXQoaW50IHNlc3Npb25JZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb091dHB1dCgpOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlYWR5KCkgY29uc3QgeyByZXR1cm4gbVRyYWNrICE9IE5VTEw7IH0KQEAgLTkxLDYgKzkxLDggQEAKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGludCBzdHJlYW1UeXBlKSB7IG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCiAgICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIGlzT25FbXVsYXRvcigpOwpAQCAtMTA4LDEzICsxMTAsMTIgQEAKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZTsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUxhdGVuY3k7Ci0KKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKKyAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwogICAgICAgICBzdGF0aWMgaW50ICAgICAgICAgICAgICBtTWluQnVmZmVyQ291bnQ7ICAvLyAxMiBmb3IgZW11bGF0b3I7IG90aGVyd2lzZSA0CiAKLSAgICAgICAgcHVibGljOiAvLyB2aXN1YWxpemF0aW9uIGhhY2sgc3VwcG9ydAotICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc25vb3BXcml0ZShjb25zdCB2b2lkKiwgc2l6ZV90KTsKICAgICB9OwogCiAgICAgY2xhc3MgQXVkaW9DYWNoZSA6IHB1YmxpYyBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luawpAQCAtMTg1LDEyICsxODYsMTEgQEAKICAgICAvLyBIb3VzZSBrZWVwaW5nIGZvciBtZWRpYSBwbGF5ZXIgY2xpZW50cwogICAgIHZpcnR1YWwgc3A8SU1lZGlhUGxheWVyPiAgICBjcmVhdGUoCiAgICAgICAgICAgICBwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgY29uc3QgY2hhciogdXJsLAotICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOworICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsIGludCBhdWRpb1Nlc3Npb25JZCk7CiAKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKHBpZF90IHBpZCwgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFQbGF5ZXI+ICAgIGNyZWF0ZShwaWRfdCBwaWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGludCBhdWRpb1Nlc3Npb25JZCk7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIGRlY29kZShjb25zdCBjaGFyKiB1cmwsIHVpbnQzMl90ICpwU2FtcGxlUmF0ZSwgaW50KiBwTnVtQ2hhbm5lbHMsIGludCogcEZvcm1hdCk7CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiAgICAgICAgIGRlY29kZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgdWludDMyX3QgKnBTYW1wbGVSYXRlLCBpbnQqIHBOdW1DaGFubmVscywgaW50KiBwRm9ybWF0KTsKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+ICAgICAgICAgc25vb3AoKTsKICAgICB2aXJ0dWFsIHNwPElPTVg+ICAgICAgICAgICAgZ2V0T01YKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtMjI0LDYgKzIyNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCAqcmVwbHkpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdXNwZW5kKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHJlc3VtZSgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKIAogICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICBjcmVhdGVQbGF5ZXIocGxheWVyX3R5cGUgcGxheWVyVHlwZSk7CiAKQEAgLTIzNywxMiArMjM5LDE1IEBACiAgICAgICAgICAgICAgICAgcGlkX3QgICAgICAgICAgIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1QaWQ7IH0KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogCisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdldEF1ZGlvU2Vzc2lvbklkKCkgeyByZXR1cm4gbUF1ZGlvU2Vzc2lvbklkOyB9CisKICAgICBwcml2YXRlOgogICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQbGF5ZXJTZXJ2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQoIGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29ubklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb1Nlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCgpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+Q2xpZW50KCk7CiAKQEAgLTI3MSw2ICsyNzYsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgbVN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wOwogICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUNvbm5JZDsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKIAogICAgICAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgogICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFBbGxvdzsgIC8vIHByb3RlY3RlZCBieSBtTG9jawpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCmluZGV4IDEyZGUwZDkuLjE5OTE1ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKQEAgLTI5NCwxMyArMjk0LDExIEBACiAgICAgTE9HVigiQ2xpZW50IGNvbnN0cnVjdG9yIik7CiAgICAgbVBpZCA9IHBpZDsKIAotI2lmIEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVAogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtcmVjb3JkIiwgdmFsdWUsIE5VTEwpCi0gICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgeworICAgIGlmICghcHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5lbmFibGUtcmVjb3JkIiwgdmFsdWUsIE5VTEwpCisgICAgICAgIHx8ICFzdHJjbXAodmFsdWUsICIxIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJ0cnVlIikpIHsKICAgICAgICAgbVJlY29yZGVyID0gbmV3IFN0YWdlZnJpZ2h0UmVjb3JkZXI7CiAgICAgfSBlbHNlCi0jZW5kaWYKICNpZm5kZWYgTk9fT1BFTkNPUkUKICAgICB7CiAgICAgICAgIG1SZWNvcmRlciA9IG5ldyBQVk1lZGlhUmVjb3JkZXIoKTsKQEAgLTMyMCw3ICszMTgsNyBAQAogICAgIHJlbGVhc2UoKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6c2V0TGlzdGVuZXIoY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgbGlzdGVuZXIpCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKQogewogICAgIExPR1YoInNldExpc3RlbmVyIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwpAQCAtMzMxLDUgKzMyOSwxMiBAQAogICAgIHJldHVybiBtUmVjb3JkZXItPnNldExpc3RlbmVyKGxpc3RlbmVyKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKKyAgICBpZiAobVJlY29yZGVyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmRlci0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKaW5kZXggODA1MDA1ZC4uMWQxOTEzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCkBAIC0yOCw3ICsyOCw3IEBACiBjbGFzcyBNZWRpYVJlY29yZGVyQ2xpZW50IDogcHVibGljIEJuTWVkaWFSZWNvcmRlcgogewogcHVibGljOgotICAgIHZpcnR1YWwJICAgIHN0YXR1c190CQlzZXRDYW1lcmEoY29uc3Qgc3A8SUNhbWVyYT4mIGNhbWVyYSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9Tb3VyY2UoaW50IHZzKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9Tb3VyY2UoaW50IGFzKTsKQEAgLTQwLDI2ICs0MCwyNyBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9GcmFtZVJhdGUoaW50IGZyYW1lc19wZXJfc2Vjb25kKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+JiBsaXN0ZW5lcik7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlKCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIGdldE1heEFtcGxpdHVkZShpbnQqIG1heCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgICAgIHN0b3AoKTsKLSAgICB2aXJ0dWFsCSAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgcmVzZXQoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgaW5pdCgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICBjbG9zZSgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgICAgICByZWxlYXNlKCk7CiAKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTsgIC8vIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSBjb25zdHJ1Y3RvcgorICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U7ICAvLyBmb3IgYWNjZXNzaW5nIHByaXZhdGUgY29uc3RydWN0b3IKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZWNvcmRlckNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQpOwotICAgIHZpcnR1YWwgCQkgICAgICAgICB+TWVkaWFSZWNvcmRlckNsaWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgICAgIH5NZWRpYVJlY29yZGVyQ2xpZW50KCk7CiAKLSAgICBwaWRfdAkJCSBtUGlkOwotICAgIE11dGV4CQkJIG1Mb2NrOwotICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgICAgICAgKm1SZWNvcmRlcjsKLSAgICBzcDxNZWRpYVBsYXllclNlcnZpY2U+ICAgICAgIG1NZWRpYVBsYXllclNlcnZpY2U7CisgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOworICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgICAgICAqbVJlY29yZGVyOworICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gICAgICBtTWVkaWFQbGF5ZXJTZXJ2aWNlOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCmluZGV4IDU1MGI4NGQuLmNhMjI5ZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcApAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvUFZNZXRhZGF0YVJldHJpZXZlci5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgotI2luY2x1ZGUgIlZvcmJpc01ldGFkYXRhUmV0cmlldmVyLmgiCiAjaW5jbHVkZSAiTWlkaU1ldGFkYXRhUmV0cmlldmVyLmgiCiAjaW5jbHVkZSAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCkBAIC0xMDMsMzAgKzEwMiwxNyBAQAogewogICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiBwOwogICAgIHN3aXRjaCAocGxheWVyVHlwZSkgewotI2lmIEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVAogICAgICAgICBjYXNlIFNUQUdFRlJJR0hUX1BMQVlFUjoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQuZW5hYmxlLW1ldGEiLCB2YWx1ZSwgTlVMTCkKLSAgICAgICAgICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJjcmVhdGUgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciIpOwotICAgICAgICAgICAgICAgIHAgPSBuZXcgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBwID0gbmV3IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotI2VuZGlmCiAjaWZuZGVmIE5PX09QRU5DT1JFCiAgICAgICAgIGNhc2UgUFZfUExBWUVSOgogICAgICAgICAgICAgTE9HVigiY3JlYXRlIHB2IG1ldGFkYXRhIHJldHJpZXZlciIpOwogICAgICAgICAgICAgcCA9IG5ldyBQVk1ldGFkYXRhUmV0cmlldmVyKCk7CiAgICAgICAgICAgICBicmVhazsKICNlbmRpZgotICAgICAgICBjYXNlIFZPUkJJU19QTEFZRVI6Ci0gICAgICAgICAgICBMT0dWKCJjcmVhdGUgdm9yYmlzIG1ldGFkYXRhIHJldHJpZXZlciIpOwotICAgICAgICAgICAgcCA9IG5ldyBWb3JiaXNNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU09OSVZPWF9QTEFZRVI6CiAgICAgICAgICAgICBMT0dWKCJjcmVhdGUgbWlkaSBtZXRhZGF0YSByZXRyaWV2ZXIiKTsKICAgICAgICAgICAgIHAgPSBuZXcgTWlkaU1ldGFkYXRhUmV0cmlldmVyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggNTMxZmQxMS4uY2YwMWZmNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRSZWNvcmRlci5oIgogCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaD4KQEAgLTI5LDYwICszMCwxMzEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFQcm9maWxlcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSAiQVJUUFdyaXRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLVN0YWdlZnJpZ2h0UmVjb3JkZXI6OlN0YWdlZnJpZ2h0UmVjb3JkZXIoKSB7CitTdGFnZWZyaWdodFJlY29yZGVyOjpTdGFnZWZyaWdodFJlY29yZGVyKCkKKyAgICA6IG1Xcml0ZXIoTlVMTCksCisgICAgICBtT3V0cHV0RmQoLTEpIHsKKworICAgIExPR1YoIkNvbnN0cnVjdG9yIik7CiAgICAgcmVzZXQoKTsKIH0KIAogU3RhZ2VmcmlnaHRSZWNvcmRlcjo6flN0YWdlZnJpZ2h0UmVjb3JkZXIoKSB7CisgICAgTE9HVigiRGVzdHJ1Y3RvciIpOwogICAgIHN0b3AoKTsKLQotICAgIGlmIChtT3V0cHV0RmQgPj0gMCkgewotICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZCk7Ci0gICAgICAgIG1PdXRwdXRGZCA9IC0xOwotICAgIH0KIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6aW5pdCgpIHsKKyAgICBMT0dWKCJpbml0Iik7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2UgYXMpIHsKLSAgICBtQXVkaW9Tb3VyY2UgPSBhczsKKyAgICBMT0dWKCJzZXRBdWRpb1NvdXJjZTogJWQiLCBhcyk7CisgICAgaWYgKGFzIDwgQVVESU9fU09VUkNFX0RFRkFVTFQgfHwKKyAgICAgICAgYXMgPj0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgYXVkaW8gc291cmNlOiAlZCIsIGFzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoYXMgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgbUF1ZGlvU291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9Tb3VyY2UgPSBhczsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFZpZGVvU291cmNlKHZpZGVvX3NvdXJjZSB2cykgewotICAgIG1WaWRlb1NvdXJjZSA9IHZzOworICAgIExPR1YoInNldFZpZGVvU291cmNlOiAlZCIsIHZzKTsKKyAgICBpZiAodnMgPCBWSURFT19TT1VSQ0VfREVGQVVMVCB8fAorICAgICAgICB2cyA+PSBWSURFT19TT1VSQ0VfTElTVF9FTkQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCB2aWRlbyBzb3VyY2U6ICVkIiwgdnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICh2cyA9PSBWSURFT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBtVmlkZW9Tb3VyY2UgPSBWSURFT19TT1VSQ0VfQ0FNRVJBOworICAgIH0gZWxzZSB7CisgICAgICAgIG1WaWRlb1NvdXJjZSA9IHZzOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0Rm9ybWF0KG91dHB1dF9mb3JtYXQgb2YpIHsKLSAgICBtT3V0cHV0Rm9ybWF0ID0gb2Y7CisgICAgTE9HVigic2V0T3V0cHV0Rm9ybWF0OiAlZCIsIG9mKTsKKyAgICBpZiAob2YgPCBPVVRQVVRfRk9STUFUX0RFRkFVTFQgfHwKKyAgICAgICAgb2YgPj0gT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIG91dHB1dCBmb3JtYXQ6ICVkIiwgb2YpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChvZiA9PSBPVVRQVVRfRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBvZjsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldEF1ZGlvRW5jb2RlcihhdWRpb19lbmNvZGVyIGFlKSB7Ci0gICAgbUF1ZGlvRW5jb2RlciA9IGFlOworICAgIExPR1YoInNldEF1ZGlvRW5jb2RlcjogJWQiLCBhZSk7CisgICAgaWYgKGFlIDwgQVVESU9fRU5DT0RFUl9ERUZBVUxUIHx8CisgICAgICAgIGFlID49IEFVRElPX0VOQ09ERVJfTElTVF9FTkQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBhdWRpbyBlbmNvZGVyOiAlZCIsIGFlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoYWUgPT0gQVVESU9fRU5DT0RFUl9ERUZBVUxUKSB7CisgICAgICAgIG1BdWRpb0VuY29kZXIgPSBBVURJT19FTkNPREVSX0FNUl9OQjsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9FbmNvZGVyID0gYWU7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRWaWRlb0VuY29kZXIodmlkZW9fZW5jb2RlciB2ZSkgewotICAgIG1WaWRlb0VuY29kZXIgPSB2ZTsKKyAgICBMT0dWKCJzZXRWaWRlb0VuY29kZXI6ICVkIiwgdmUpOworICAgIGlmICh2ZSA8IFZJREVPX0VOQ09ERVJfREVGQVVMVCB8fAorICAgICAgICB2ZSA+PSBWSURFT19FTkNPREVSX0xJU1RfRU5EKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gZW5jb2RlcjogJWQiLCB2ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHZlID09IFZJREVPX0VOQ09ERVJfREVGQVVMVCkgeworICAgICAgICBtVmlkZW9FbmNvZGVyID0gVklERU9fRU5DT0RFUl9IMjYzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1WaWRlb0VuY29kZXIgPSB2ZTsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICBMT0dWKCJzZXRWaWRlb1NpemU6ICVkeCVkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCB2aWRlbyBzaXplOiAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgb24gdGhlIGRpbWVuc2lvbiB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlcgogICAgIG1WaWRlb1dpZHRoID0gd2lkdGg7CiAgICAgbVZpZGVvSGVpZ2h0ID0gaGVpZ2h0OwogCkBAIC05MCwzNSArMTYyLDcwIEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkgeworICAgIExPR1YoInNldFZpZGVvRnJhbWVSYXRlOiAlZCIsIGZyYW1lc19wZXJfc2Vjb25kKTsKKyAgICBpZiAoZnJhbWVzX3Blcl9zZWNvbmQgPD0gMCB8fCBmcmFtZXNfcGVyX3NlY29uZCA+IDMwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gZnJhbWUgcmF0ZTogJWQiLCBmcmFtZXNfcGVyX3NlY29uZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQWRkaXRpb25hbCBjaGVjayBvbiB0aGUgZnJhbWUgcmF0ZSB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlcgogICAgIG1GcmFtZVJhdGUgPSBmcmFtZXNfcGVyX3NlY29uZDsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+ICZjYW1lcmEpIHsKLSAgICBtQ2FtZXJhID0gY2FtZXJhOworICAgIExPR1YoInNldENhbWVyYSIpOworICAgIGlmIChjYW1lcmEgPT0gMCkgeworICAgICAgICBMT0dFKCJjYW1lcmEgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIG1GbGFncyAmPSB+RkxBR1NfSE9UX0NBTUVSQTsKKyAgICBtQ2FtZXJhID0gQ2FtZXJhOjpjcmVhdGUoY2FtZXJhKTsKKyAgICBpZiAobUNhbWVyYSA9PSAwKSB7CisgICAgICAgIExPR0UoIlVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSIpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBMT0dWKCJDb25uZWN0ZWQgdG8gY2FtZXJhIik7CisgICAgaWYgKG1DYW1lcmEtPnByZXZpZXdFbmFibGVkKCkpIHsKKyAgICAgICAgTE9HVigiY2FtZXJhIGlzIGhvdCIpOworICAgICAgICBtRmxhZ3MgfD0gRkxBR1NfSE9UX0NBTUVSQTsKKyAgICB9CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIExPR1YoInNldFByZXZpZXdTdXJmYWNlOiAlcCIsIHN1cmZhY2UuZ2V0KCkpOwogICAgIG1QcmV2aWV3U3VyZmFjZSA9IHN1cmZhY2U7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworICAgIExPR0UoInNldE91dHB1dEZpbGUoY29uc3QgY2hhciopIG11c3Qgbm90IGJlIGNhbGxlZCIpOwogICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgdGhpcyBhdCBhbGwsIGFzIHRoZSBtZWRpYV9zZXJ2ZXIgcHJvY2VzcwogICAgIC8vIG5vIGxvbmdlciBoYXMgcGVybWlzc2lvbnMgdG8gY3JlYXRlIGZpbGVzLgogCi0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgcmV0dXJuIC1FUEVSTTsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIExPR1YoInNldE91dHB1dEZpbGU6ICVkLCAlbGxkLCAlbGxkIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAvLyBUaGVzZSBkb24ndCBtYWtlIGFueSBzZW5zZSwgZG8gdGhleT8KICAgICBDSEVDS19FUShvZmZzZXQsIDApOwogICAgIENIRUNLX0VRKGxlbmd0aCwgMCk7CiAKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiAlZCIsIGZkKTsKKyAgICAgICAgcmV0dXJuIC1FQkFERjsKKyAgICB9CisKICAgICBpZiAobU91dHB1dEZkID49IDApIHsKICAgICAgICAgOjpjbG9zZShtT3V0cHV0RmQpOwogICAgIH0KQEAgLTEyNywxMyArMjM0LDM3MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4ICZwYXJhbXMpIHsKLSAgICBtUGFyYW1zID0gcGFyYW1zOworLy8gQXR0ZW1wdCB0byBwYXJzZSBhbiBpbnQ2NCBsaXRlcmFsIG9wdGlvbmFsbHkgc3Vycm91bmRlZCBieSB3aGl0ZXNwYWNlLAorLy8gcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK3N0YXRpYyBib29sIHNhZmVfc3RydG9pNjQoY29uc3QgY2hhciAqcywgaW50NjRfdCAqdmFsKSB7CisgICAgY2hhciAqZW5kOworICAgICp2YWwgPSBzdHJ0b2xsKHMsICZlbmQsIDEwKTsKIAorICAgIGlmIChlbmQgPT0gcyB8fCBlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXAgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgIHdoaWxlIChpc3NwYWNlKCplbmQpKSB7CisgICAgICAgICsrZW5kOworICAgIH0KKworICAgIC8vIEZvciBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgc3RyaW5nIG11c3QgY29udGFpbiBub3RoaW5nIGJ1dCBhIHZhbGlkCisgICAgLy8gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZS4KKworICAgIHJldHVybiAqZW5kID09ICdcMCc7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBpbiBbMCwgMHgwMDdGRkZGRkZGXQorc3RhdGljIGJvb2wgc2FmZV9zdHJ0b2kzMihjb25zdCBjaGFyICpzLCBpbnQzMl90ICp2YWwpIHsKKyAgICBpbnQ2NF90IHRlbXA7CisgICAgaWYgKHNhZmVfc3RydG9pNjQocywgJnRlbXApKSB7CisgICAgICAgIGlmICh0ZW1wID49IDAgJiYgdGVtcCA8PSAweDAwN0ZGRkZGRkYpIHsKKyAgICAgICAgICAgICp2YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0ZW1wKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gVHJpbSBib3RoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgorc3RhdGljIHZvaWQgVHJpbVN0cmluZyhTdHJpbmc4ICpzKSB7CisgICAgc2l6ZV90IG51bV9ieXRlcyA9IHMtPmJ5dGVzKCk7CisgICAgY29uc3QgY2hhciAqZGF0YSA9IHMtPnN0cmluZygpOworCisgICAgc2l6ZV90IGxlYWRpbmdfc3BhY2UgPSAwOworICAgIHdoaWxlIChsZWFkaW5nX3NwYWNlIDwgbnVtX2J5dGVzICYmIGlzc3BhY2UoZGF0YVtsZWFkaW5nX3NwYWNlXSkpIHsKKyAgICAgICAgKytsZWFkaW5nX3NwYWNlOworICAgIH0KKworICAgIHNpemVfdCBpID0gbnVtX2J5dGVzOworICAgIHdoaWxlIChpID4gbGVhZGluZ19zcGFjZSAmJiBpc3NwYWNlKGRhdGFbaSAtIDFdKSkgeworICAgICAgICAtLWk7CisgICAgfQorCisgICAgcy0+c2V0VG8oU3RyaW5nOCgmZGF0YVtsZWFkaW5nX3NwYWNlXSwgaSAtIGxlYWRpbmdfc3BhY2UpKTsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdWRpb1NhbXBsaW5nUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUF1ZGlvU2FtcGxpbmdSYXRlOiAlZCIsIHNhbXBsZVJhdGUpOworICAgIGlmIChzYW1wbGVSYXRlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBhdWRpbyBzYW1wbGluZyByYXRlOiAlZCIsIHNhbXBsZVJhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgb24gdGhlIHNhbXBsZSByYXRlIHdpbGwgYmUgcGVyZm9ybWVkIGxhdGVyLgorICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4gJmxpc3RlbmVyKSB7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUF1ZGlvTnVtYmVyT2ZDaGFubmVscyhpbnQzMl90IGNoYW5uZWxzKSB7CisgICAgTE9HVigic2V0UGFyYW1BdWRpb051bWJlck9mQ2hhbm5lbHM6ICVkIiwgY2hhbm5lbHMpOworICAgIGlmIChjaGFubmVscyA8PSAwIHx8IGNoYW5uZWxzID49IDMpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHM6ICVkIiwgY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFkZGl0aW9uYWwgY2hlY2sgb24gdGhlIG51bWJlciBvZiBjaGFubmVscyB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlci4KKyAgICBtQXVkaW9DaGFubmVscyA9IGNoYW5uZWxzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdWRpb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUF1ZGlvRW5jb2RpbmdCaXRSYXRlOiAlZCIsIGJpdFJhdGUpOworICAgIGlmIChiaXRSYXRlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBhdWRpbyBlbmNvZGluZyBiaXQgcmF0ZTogJWQiLCBiaXRSYXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBUaGUgdGFyZ2V0IGJpdCByYXRlIG1heSBub3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgcmVxdWVzdGVkLgorICAgIC8vIEl0IGRlcGVuZHMgb24gbWFueSBmYWN0b3JzLCBzdWNoIGFzIHJhdGUgY29udHJvbCwgYW5kIHRoZSBiaXQgcmF0ZQorICAgIC8vIHJhbmdlIHRoYXQgYSBzcGVjaWZpYyBlbmNvZGVyIHN1cHBvcnRzLiBUaGUgbWlzbWF0Y2ggYmV0d2VlbiB0aGUKKyAgICAvLyB0aGUgdGFyZ2V0IGFuZCByZXF1ZXN0ZWQgYml0IHJhdGUgd2lsbCBOT1QgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4KKyAgICBtQXVkaW9CaXRSYXRlID0gYml0UmF0ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb0VuY29kaW5nQml0UmF0ZTogJWQiLCBiaXRSYXRlKTsKKyAgICBpZiAoYml0UmF0ZSA8PSAwKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gZW5jb2RpbmcgYml0IHJhdGU6ICVkIiwgYml0UmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVGhlIHRhcmdldCBiaXQgcmF0ZSBtYXkgbm90IGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHJlcXVlc3RlZC4KKyAgICAvLyBJdCBkZXBlbmRzIG9uIG1hbnkgZmFjdG9ycywgc3VjaCBhcyByYXRlIGNvbnRyb2wsIGFuZCB0aGUgYml0IHJhdGUKKyAgICAvLyByYW5nZSB0aGF0IGEgc3BlY2lmaWMgZW5jb2RlciBzdXBwb3J0cy4gVGhlIG1pc21hdGNoIGJldHdlZW4gdGhlCisgICAgLy8gdGhlIHRhcmdldCBhbmQgcmVxdWVzdGVkIGJpdCByYXRlIHdpbGwgTk9UIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCisgICAgbVZpZGVvQml0UmF0ZSA9IGJpdFJhdGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbU1heEZpbGVEdXJhdGlvblVzKGludDY0X3QgdGltZVVzKSB7CisgICAgTE9HVigic2V0UGFyYW1NYXhGaWxlRHVyYXRpb25VczogJWxsZCB1cyIsIHRpbWVVcyk7CisgICAgaWYgKHRpbWVVcyA8PSAwKSB7CisgICAgICAgIExPR1coIk1heCBmaWxlIGR1cmF0aW9uIGlzIG5vdCBwb3NpdGl2ZTogJWxsZCB1cy4gRGlzYWJsaW5nIGR1cmF0aW9uIGxpbWl0LiIsIHRpbWVVcyk7CisgICAgICAgIHRpbWVVcyA9IDA7IC8vIERpc2FibGUgdGhlIGR1cmF0aW9uIGxpbWl0IGZvciB6ZXJvIG9yIG5lZ2F0aXZlIHZhbHVlcy4KKyAgICB9IGVsc2UgaWYgKHRpbWVVcyA8PSAxMDAwMDBMTCkgeyAgLy8gWFhYOiAxMDAgbWlsbGktc2Vjb25kcworICAgICAgICBMT0dFKCJNYXggZmlsZSBkdXJhdGlvbiBpcyB0b28gc2hvcnQ6ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IHRpbWVVczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtTWF4RmlsZVNpemVCeXRlcyhpbnQ2NF90IGJ5dGVzKSB7CisgICAgTE9HVigic2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzOiAlbGxkIGJ5dGVzIiwgYnl0ZXMpOworICAgIGlmIChieXRlcyA8PSAxMDI0KSB7ICAvLyBYWFg6IDEga0IKKyAgICAgICAgTE9HRSgiTWF4IGZpbGUgc2l6ZSBpcyB0b28gc21hbGw6ICVsbGQgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gYnl0ZXM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUludGVybGVhdmVEdXJhdGlvbihpbnQzMl90IGR1cmF0aW9uVXMpIHsKKyAgICBMT0dWKCJzZXRQYXJhbUludGVybGVhdmVEdXJhdGlvbjogJWQiLCBkdXJhdGlvblVzKTsKKyAgICBpZiAoZHVyYXRpb25VcyA8PSA1MDAwMDApIHsgICAgICAgICAgIC8vICA1MDAgbXMKKyAgICAgICAgLy8gSWYgaW50ZXJsZWF2ZSBkdXJhdGlvbiBpcyB0b28gc21hbGwsIGl0IGlzIHZlcnkgaW5lZmZpY2llbnQgdG8gZG8KKyAgICAgICAgLy8gaW50ZXJsZWF2aW5nIHNpbmNlIHRoZSBtZXRhZGF0YSBvdmVyaGVhZCB3aWxsIGNvdW50IGZvciBhIHNpZ25pZmljYW50CisgICAgICAgIC8vIHBvcnRpb24gb2YgdGhlIHNhdmVkIGNvbnRlbnRzCisgICAgICAgIExPR0UoIkF1ZGlvL3ZpZGVvIGludGVybGVhdmUgZHVyYXRpb24gaXMgdG9vIHNtYWxsOiAlZCB1cyIsIGR1cmF0aW9uVXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoZHVyYXRpb25VcyA+PSAxMDAwMDAwMCkgeyAgLy8gMTAgc2Vjb25kcworICAgICAgICAvLyBJZiBpbnRlcmxlYXZpbmcgZHVyYXRpb24gaXMgdG9vIGxhcmdlLCBpdCBjYW4gY2F1c2UgdGhlIHJlY29yZGluZworICAgICAgICAvLyBzZXNzaW9uIHRvIHVzZSB0b28gbXVjaCBtZW1vcnkgc2luY2Ugd2UgaGF2ZSB0byBzYXZlIHRoZSBvdXRwdXQKKyAgICAgICAgLy8gZGF0YSBiZWZvcmUgd2Ugd3JpdGUgdGhlbSBvdXQKKyAgICAgICAgTE9HRSgiQXVkaW8vdmlkZW8gaW50ZXJsZWF2ZSBkdXJhdGlvbiBpcyB0b28gbGFyZ2U6ICVkIHVzIiwgZHVyYXRpb25Vcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBJZiBzZWNvbmRzIDwgIDAsIG9ubHkgdGhlIGZpcnN0IGZyYW1lIGlzIEkgZnJhbWUsIGFuZCByZXN0IGFyZSBhbGwgUCBmcmFtZXMKKy8vIElmIHNlY29uZHMgPT0gMCwgYWxsIGZyYW1lcyBhcmUgZW5jb2RlZCBhcyBJIGZyYW1lcy4gTm8gUCBmcmFtZXMKKy8vIElmIHNlY29uZHMgPiAgMCwgaXQgaXMgdGhlIHRpbWUgc3BhY2luZyAoc2Vjb25kcykgYmV0d2VlbiAyIG5laWdoYm9yaW5nIEkgZnJhbWVzCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvSUZyYW1lc0ludGVydmFsKGludDMyX3Qgc2Vjb25kcykgeworICAgIExPR1YoInNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWw6ICVkIHNlY29uZHMiLCBzZWNvbmRzKTsKKyAgICBtSUZyYW1lc0ludGVydmFsU2VjID0gc2Vjb25kczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtNjRCaXRGaWxlT2Zmc2V0KGJvb2wgdXNlNjRCaXQpIHsKKyAgICBMT0dWKCJzZXRQYXJhbTY0Qml0RmlsZU9mZnNldDogJXMiLAorICAgICAgICB1c2U2NEJpdD8gInVzZSA2NCBiaXQgZmlsZSBvZmZzZXQiOiAidXNlIDMyIGJpdCBmaWxlIG9mZnNldCIpOworICAgIG1Vc2U2NEJpdEZpbGVPZmZzZXQgPSB1c2U2NEJpdDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9DYW1lcmFJZChpbnQzMl90IGNhbWVyYUlkKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb0NhbWVyYUlkOiAlZCIsIGNhbWVyYUlkKTsKKyAgICBpZiAoY2FtZXJhSWQgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UcmFja1RpbWVTdGF0dXMoaW50NjRfdCB0aW1lRHVyYXRpb25VcykgeworICAgIExPR1YoInNldFBhcmFtVHJhY2tUaW1lU3RhdHVzOiAlbGxkIiwgdGltZUR1cmF0aW9uVXMpOworICAgIGlmICh0aW1lRHVyYXRpb25VcyA8IDIwMDAwKSB7ICAvLyBJbmZlYXNpYmxlIGlmIHNob3J0ZXIgdGhhbiAyMCBtcz8KKyAgICAgICAgTE9HRSgiVHJhY2tpbmcgdGltZSBkdXJhdGlvbiB0b28gc2hvcnQ6ICVsbGQgdXMiLCB0aW1lRHVyYXRpb25Vcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSB0aW1lRHVyYXRpb25VczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShpbnQzMl90IHByb2ZpbGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGU6ICVkIiwgcHJvZmlsZSk7CisKKyAgICAvLyBBZGRpdGlvbmFsIGNoZWNrIHdpbGwgYmUgZG9uZSBsYXRlciB3aGVuIHdlIGxvYWQgdGhlIGVuY29kZXIuCisgICAgLy8gRm9yIG5vdywgd2UgYXJlIGFjY2VwdGluZyB2YWx1ZXMgZGVmaW5lZCBpbiBPcGVuTUFYIElMLgorICAgIG1WaWRlb0VuY29kZXJQcm9maWxlID0gcHJvZmlsZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoaW50MzJfdCBsZXZlbCkgeworICAgIExPR1YoInNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWw6ICVkIiwgbGV2ZWwpOworCisgICAgLy8gQWRkaXRpb25hbCBjaGVjayB3aWxsIGJlIGRvbmUgbGF0ZXIgd2hlbiB3ZSBsb2FkIHRoZSBlbmNvZGVyLgorICAgIC8vIEZvciBub3csIHdlIGFyZSBhY2NlcHRpbmcgdmFsdWVzIGRlZmluZWQgaW4gT3Blbk1BWCBJTC4KKyAgICBtVmlkZW9FbmNvZGVyTGV2ZWwgPSBsZXZlbDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtTW92aWVUaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbU1vdmllVGltZVNjYWxlOiAlZCIsIHRpbWVTY2FsZSk7CisKKyAgICAvLyBUaGUgcmFuZ2UgaXMgc2V0IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBhdWRpbydzIHRpbWUgc2NhbGUgcmFuZ2UKKyAgICAvLyBzaW5jZSBhdWRpbydzIHRpbWUgc2NhbGUgaGFzIGEgd2lkZXIgcmFuZ2UuCisgICAgaWYgKHRpbWVTY2FsZSA8IDYwMCB8fCB0aW1lU2NhbGUgPiA5NjAwMCkgeworICAgICAgICBMT0dFKCJUaW1lIHNjYWxlICglZCkgZm9yIG1vdmllIGlzIG91dCBvZiByYW5nZSBbNjAwLCA5NjAwMF0iLCB0aW1lU2NhbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtTW92aWVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvVGltZVNjYWxlKGludDMyX3QgdGltZVNjYWxlKSB7CisgICAgTE9HVigic2V0UGFyYW1WaWRlb1RpbWVTY2FsZTogJWQiLCB0aW1lU2NhbGUpOworCisgICAgLy8gNjAwMDAgaXMgY2hvc2VuIHRvIG1ha2Ugc3VyZSB0aGF0IGVhY2ggdmlkZW8gZnJhbWUgZnJvbSBhIDYwLWZwcworICAgIC8vIHZpZGVvIGhhcyAxMDAwIHRpY2tzLgorICAgIGlmICh0aW1lU2NhbGUgPCA2MDAgfHwgdGltZVNjYWxlID4gNjAwMDApIHsKKyAgICAgICAgTE9HRSgiVGltZSBzY2FsZSAoJWQpIGZvciB2aWRlbyBpcyBvdXQgb2YgcmFuZ2UgWzYwMCwgNjAwMDBdIiwgdGltZVNjYWxlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVZpZGVvVGltZVNjYWxlID0gdGltZVNjYWxlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1BdWRpb1RpbWVTY2FsZShpbnQzMl90IHRpbWVTY2FsZSkgeworICAgIExPR1YoInNldFBhcmFtQXVkaW9UaW1lU2NhbGU6ICVkIiwgdGltZVNjYWxlKTsKKworICAgIC8vIDk2MDAwIEh6IGlzIHRoZSBoaWdoZXN0IHNhbXBsaW5nIHJhdGUgc3VwcG9ydCBpbiBBQUMuCisgICAgaWYgKHRpbWVTY2FsZSA8IDYwMCB8fCB0aW1lU2NhbGUgPiA5NjAwMCkgeworICAgICAgICBMT0dFKCJUaW1lIHNjYWxlICglZCkgZm9yIGF1ZGlvIGlzIG91dCBvZiByYW5nZSBbNjAwLCA5NjAwMF0iLCB0aW1lU2NhbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQXVkaW9UaW1lU2NhbGUgPSB0aW1lU2NhbGU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXIoCisgICAgICAgIGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKKyAgICBMT0dWKCJzZXRQYXJhbWV0ZXI6IGtleSAoJXMpID0+IHZhbHVlICglcykiLCBrZXkuc3RyaW5nKCksIHZhbHVlLnN0cmluZygpKTsKKyAgICBpZiAoa2V5ID09ICJtYXgtZHVyYXRpb24iKSB7CisgICAgICAgIGludDY0X3QgbWF4X2R1cmF0aW9uX21zOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJm1heF9kdXJhdGlvbl9tcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbU1heEZpbGVEdXJhdGlvblVzKDEwMDBMTCAqIG1heF9kdXJhdGlvbl9tcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAibWF4LWZpbGVzaXplIikgeworICAgICAgICBpbnQ2NF90IG1heF9maWxlc2l6ZV9ieXRlczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pNjQodmFsdWUuc3RyaW5nKCksICZtYXhfZmlsZXNpemVfYnl0ZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1NYXhGaWxlU2l6ZUJ5dGVzKG1heF9maWxlc2l6ZV9ieXRlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAiaW50ZXJsZWF2ZS1kdXJhdGlvbi11cyIpIHsKKyAgICAgICAgaW50MzJfdCBkdXJhdGlvblVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1JbnRlcmxlYXZlRHVyYXRpb24oZHVyYXRpb25Vcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicGFyYW0tbW92aWUtdGltZS1zY2FsZSIpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdGltZVNjYWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtTW92aWVUaW1lU2NhbGUodGltZVNjYWxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJwYXJhbS11c2UtNjRiaXQtb2Zmc2V0IikgeworICAgICAgICBpbnQzMl90IHVzZTY0Qml0T2Zmc2V0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnVzZTY0Qml0T2Zmc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtNjRCaXRGaWxlT2Zmc2V0KHVzZTY0Qml0T2Zmc2V0ICE9IDApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInBhcmFtLXRyYWNrLXRpbWUtc3RhdHVzIikgeworICAgICAgICBpbnQ2NF90IHRpbWVEdXJhdGlvblVzOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVEdXJhdGlvblVzKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVHJhY2tUaW1lU3RhdHVzKHRpbWVEdXJhdGlvblVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJhdWRpby1wYXJhbS1zYW1wbGluZy1yYXRlIikgeworICAgICAgICBpbnQzMl90IHNhbXBsaW5nX3JhdGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmc2FtcGxpbmdfcmF0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUF1ZGlvU2FtcGxpbmdSYXRlKHNhbXBsaW5nX3JhdGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gImF1ZGlvLXBhcmFtLW51bWJlci1vZi1jaGFubmVscyIpIHsKKyAgICAgICAgaW50MzJfdCBudW1iZXJfb2ZfY2hhbm5lbHM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmbnVtYmVyX29mX2NoYW5uZWxzKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtQXVkaW9OdW1iZXJPZkNoYW5uZWxzKG51bWJlcl9vZl9jaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAiYXVkaW8tcGFyYW0tZW5jb2RpbmctYml0cmF0ZSIpIHsKKyAgICAgICAgaW50MzJfdCBhdWRpb19iaXRyYXRlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJmF1ZGlvX2JpdHJhdGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdWRpb0VuY29kaW5nQml0UmF0ZShhdWRpb19iaXRyYXRlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJhdWRpby1wYXJhbS10aW1lLXNjYWxlIikgeworICAgICAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ0aW1lU2NhbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1BdWRpb1RpbWVTY2FsZSh0aW1lU2NhbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWVuY29kaW5nLWJpdHJhdGUiKSB7CisgICAgICAgIGludDMyX3QgdmlkZW9fYml0cmF0ZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ2aWRlb19iaXRyYXRlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9FbmNvZGluZ0JpdFJhdGUodmlkZW9fYml0cmF0ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0taS1mcmFtZXMtaW50ZXJ2YWwiKSB7CisgICAgICAgIGludDMyX3Qgc2Vjb25kczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZzZWNvbmRzKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tZW5jb2Rlci1wcm9maWxlIikgeworICAgICAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUocHJvZmlsZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tZW5jb2Rlci1sZXZlbCIpIHsKKyAgICAgICAgaW50MzJfdCBsZXZlbDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZsZXZlbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsKGxldmVsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1jYW1lcmEtaWQiKSB7CisgICAgICAgIGludDMyX3QgY2FtZXJhSWQ7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmY2FtZXJhSWQpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb0NhbWVyYUlkKGNhbWVyYUlkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS10aW1lLXNjYWxlIikgeworICAgICAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZ0aW1lU2NhbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1WaWRlb1RpbWVTY2FsZSh0aW1lU2NhbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzggJnBhcmFtcykgeworICAgIExPR1YoInNldFBhcmFtZXRlcnM6ICVzIiwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBjb25zdCBjaGFyICpjcGFyYW1zID0gcGFyYW1zLnN0cmluZygpOworICAgIGNvbnN0IGNoYXIgKmtleV9zdGFydCA9IGNwYXJhbXM7CisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBjaGFyICplcXVhbF9wb3MgPSBzdHJjaHIoa2V5X3N0YXJ0LCAnPScpOworICAgICAgICBpZiAoZXF1YWxfcG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIlBhcmFtZXRlcnMgJXMgbWlzcyBhIHZhbHVlIiwgY3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzgga2V5KGtleV9zdGFydCwgZXF1YWxfcG9zIC0ga2V5X3N0YXJ0KTsKKyAgICAgICAgVHJpbVN0cmluZygma2V5KTsKKyAgICAgICAgaWYgKGtleS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJQYXJhbWV0ZXJzICVzIGNvbnRhaW5zIGFuIGVtcHR5IGtleSIsIGNwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICp2YWx1ZV9zdGFydCA9IGVxdWFsX3BvcyArIDE7CisgICAgICAgIGNvbnN0IGNoYXIgKnNlbWljb2xvbl9wb3MgPSBzdHJjaHIodmFsdWVfc3RhcnQsICc7Jyk7CisgICAgICAgIFN0cmluZzggdmFsdWU7CisgICAgICAgIGlmIChzZW1pY29sb25fcG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIHZhbHVlLnNldFRvKHZhbHVlX3N0YXJ0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlLnNldFRvKHZhbHVlX3N0YXJ0LCBzZW1pY29sb25fcG9zIC0gdmFsdWVfc3RhcnQpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXRQYXJhbWV0ZXIoa2V5LCB2YWx1ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbWljb2xvbl9wb3MgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7ICAvLyBSZWFjaGVzIHRoZSBlbmQKKyAgICAgICAgfQorICAgICAgICBrZXlfc3RhcnQgPSBzZW1pY29sb25fcG9zICsgMTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gJmxpc3RlbmVyKSB7CiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiAKICAgICByZXR1cm4gT0s7CkBAIC0xNDQsNyArNjA4LDEwIEBACiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnN0YXJ0KCkgeworICAgIENIRUNLKG1PdXRwdXRGZCA+PSAwKTsKKwogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRmlsZSB3cml0ZXIgaXMgbm90IGF2YWlhbGJsZSIpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKQEAgLTE1OCw0MCArNjI1LDYzIEBACiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BTVJfV0I6CiAgICAgICAgICAgICByZXR1cm4gc3RhcnRBTVJSZWNvcmRpbmcoKTsKIAorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FESUY6CisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUzoKKyAgICAgICAgICAgIHJldHVybiBzdGFydEFBQ1JlY29yZGluZygpOworCisgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UlRQUmVjb3JkaW5nKCk7CisKICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBmaWxlIGZvcm1hdDogJWQiLCBtT3V0cHV0Rm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIH0KIAotc3A8TWVkaWFTb3VyY2U+IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNyZWF0ZUFNUkF1ZGlvU291cmNlKCkgewotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPQotICAgICAgICBtQXVkaW9FbmNvZGVyID09IEFVRElPX0VOQ09ERVJfQU1SX05CID8gODAwMCA6IDE2MDAwOwotCitzcDxNZWRpYVNvdXJjZT4gU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y3JlYXRlQXVkaW9Tb3VyY2UoKSB7CiAgICAgc3A8QXVkaW9Tb3VyY2U+IGF1ZGlvU291cmNlID0KICAgICAgICAgbmV3IEF1ZGlvU291cmNlKAogICAgICAgICAgICAgICAgIG1BdWRpb1NvdXJjZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8pOworICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxzKTsKIAogICAgIHN0YXR1c190IGVyciA9IGF1ZGlvU291cmNlLT5pbml0Q2hlY2soKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgTE9HRSgiYXVkaW8gc291cmNlIGlzIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gZW5jTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBlbmNNZXRhLT5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLAotICAgICAgICAgICAgbUF1ZGlvRW5jb2RlciA9PSBBVURJT19FTkNPREVSX0FNUl9OQgotICAgICAgICAgICAgICAgID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CIDogTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIHN3aXRjaCAobUF1ZGlvRW5jb2RlcikgeworICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgorICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfREVGQVVMVDoKKyAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FNUl9XQjoKKyAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKKyAgICAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbmNNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBDSEVDSyhhdWRpb1NvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQzMigKICAgICAgICAgICAgICAgICBrS2V5TWF4SW5wdXRTaXplLCAmbWF4SW5wdXRTaXplKSk7CiAKICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDEpOwotICAgIGVuY01ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQXVkaW9DaGFubmVscyk7CisgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKKyAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbUF1ZGlvQml0UmF0ZSk7CisgICAgaWYgKG1BdWRpb1RpbWVTY2FsZSA+IDApIHsKKyAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgbUF1ZGlvVGltZVNjYWxlKTsKKyAgICB9CiAKICAgICBPTVhDbGllbnQgY2xpZW50OwogICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIE9LKTsKQEAgLTE5OSwxNDQgKzY4OSw1NDMgQEAKICAgICBzcDxNZWRpYVNvdXJjZT4gYXVkaW9FbmNvZGVyID0KICAgICAgICAgT01YQ29kZWM6OkNyZWF0ZShjbGllbnQuaW50ZXJmYWNlKCksIGVuY01ldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBhdWRpb1NvdXJjZSk7CisgICAgbUF1ZGlvU291cmNlTm9kZSA9IGF1ZGlvU291cmNlOwogCiAgICAgcmV0dXJuIGF1ZGlvRW5jb2RlcjsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRBQUNSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FBQ19BRElGIHx8CisgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FBQ19BRFRTKTsKKworICAgIENIRUNLKG1BdWRpb0VuY29kZXIgPT0gQVVESU9fRU5DT0RFUl9BQUMpOworICAgIENIRUNLKG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfTElTVF9FTkQpOworCisgICAgQ0hFQ0soMCA9PSAiQUFDV3JpdGVyIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKTsKKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRBTVJSZWNvcmRpbmcoKSB7Ci0gICAgaWYgKG1BdWRpb1NvdXJjZSA9PSBBVURJT19TT1VSQ0VfTElTVF9FTkQKLSAgICAgICAgfHwgbVZpZGVvU291cmNlICE9IFZJREVPX1NPVVJDRV9MSVNUX0VORCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CisgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CisKKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQikgeworICAgICAgICBpZiAobUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0RFRkFVTFQgJiYKKyAgICAgICAgICAgIG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9BTVJfTkIpIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgZW5jb2RlciAlZCB1c2VkIGZvciBBTVJOQiByZWNvcmRpbmciLAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9FbmNvZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TYW1wbGVSYXRlICE9IDgwMDApIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgc2FtcGxpbmcgcmF0ZSAlZCB1c2VkIGZvciBBTVJOQiByZWNvcmRpbmciLAorICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIG1PdXRwdXRGb3JtYXQgbXVzdCBiZSBPVVRQVVRfRk9STUFUX0FNUl9XQgorICAgICAgICBpZiAobUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0FNUl9XQikgeworICAgICAgICAgICAgTE9HRSgiSW52bGFpZCBlbmNvZGVyICVkIHVzZWQgZm9yIEFNUldCIHJlY29yZGluZyIsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0VuY29kZXIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNhbXBsZVJhdGUgIT0gMTYwMDApIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgc2FtcGxlIHJhdGUgJWQgdXNlZCBmb3IgQU1SV0IgcmVjb3JkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUF1ZGlvQ2hhbm5lbHMgIT0gMSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyAlZCB1c2VkIGZvciBhbXIgcmVjb3JkaW5nIiwKKyAgICAgICAgICAgICAgICBtQXVkaW9DaGFubmVscyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfTkIKLSAgICAgICAgICAgICYmIG1BdWRpb0VuY29kZXIgIT0gQVVESU9fRU5DT0RFUl9ERUZBVUxUCi0gICAgICAgICAgICAmJiBtQXVkaW9FbmNvZGVyICE9IEFVRElPX0VOQ09ERVJfQU1SX05CKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0gZWxzZSBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQgotICAgICAgICAgICAgJiYgbUF1ZGlvRW5jb2RlciAhPSBBVURJT19FTkNPREVSX0FNUl9XQikgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAobUF1ZGlvU291cmNlID49IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBtQXVkaW9Tb3VyY2UpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPSBjcmVhdGVBTVJBdWRpb1NvdXJjZSgpOworICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOwogCiAgICAgaWYgKGF1ZGlvRW5jb2RlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIENIRUNLKG1PdXRwdXRGZCA+PSAwKTsKICAgICBtV3JpdGVyID0gbmV3IEFNUldyaXRlcihkdXAobU91dHB1dEZkKSk7CiAgICAgbVdyaXRlci0+YWRkU291cmNlKGF1ZGlvRW5jb2Rlcik7CisKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKKyAgICAgICAgbVdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKG1NYXhGaWxlRHVyYXRpb25Vcyk7CisgICAgfQorICAgIGlmIChtTWF4RmlsZVNpemVCeXRlcyAhPSAwKSB7CisgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVTaXplKG1NYXhGaWxlU2l6ZUJ5dGVzKTsKKyAgICB9CisgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKICAgICBtV3JpdGVyLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdGFydFJUUFJlY29yZGluZygpIHsKKyAgICBDSEVDS19FUShtT3V0cHV0Rm9ybWF0LCBPVVRQVVRfRk9STUFUX1JUUF9BVlApOworCisgICAgaWYgKChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5ECisgICAgICAgICAgICAgICAgJiYgbVZpZGVvU291cmNlICE9IFZJREVPX1NPVVJDRV9MSVNUX0VORCkKKyAgICAgICAgICAgIHx8IChtQXVkaW9Tb3VyY2UgPT0gQVVESU9fU09VUkNFX0xJU1RfRU5ECisgICAgICAgICAgICAgICAgJiYgbVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9MSVNUX0VORCkpIHsKKyAgICAgICAgLy8gTXVzdCBoYXZlIGV4YWN0bHkgb25lIHNvdXJjZS4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dEZkIDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2U7CisKKyAgICBpZiAobUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9MSVNUX0VORCkgeworICAgICAgICBzb3VyY2UgPSBjcmVhdGVBdWRpb1NvdXJjZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKCZzb3VyY2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgbVdyaXRlciA9IG5ldyBBUlRQV3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKKyAgICBtV3JpdGVyLT5hZGRTb3VyY2Uoc291cmNlKTsKKyAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOworCisgICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KCk7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2xpcFZpZGVvRnJhbWVSYXRlKCkgeworICAgIExPR1YoImNsaXBWaWRlb0ZyYW1lUmF0ZTogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtaW5GcmFtZVJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmZwcy5taW4iLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpbnQgbWF4RnJhbWVSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5mcHMubWF4IiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaWYgKG1GcmFtZVJhdGUgPCBtaW5GcmFtZVJhdGUpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgcmF0ZSAoJWQgZnBzKSBpcyB0b28gc21hbGwiCisgICAgICAgICAgICAgIiBhbmQgd2lsbCBiZSBzZXQgdG8gKCVkIGZwcykiLCBtRnJhbWVSYXRlLCBtaW5GcmFtZVJhdGUpOworICAgICAgICBtRnJhbWVSYXRlID0gbWluRnJhbWVSYXRlOworICAgIH0gZWxzZSBpZiAobUZyYW1lUmF0ZSA+IG1heEZyYW1lUmF0ZSkgeworICAgICAgICBMT0dXKCJJbnRlbmRlZCB2aWRlbyBlbmNvZGluZyBmcmFtZSByYXRlICglZCBmcHMpIGlzIHRvbyBsYXJnZSIKKyAgICAgICAgICAgICAiIGFuZCB3aWxsIGJlIHNldCB0byAoJWQgZnBzKSIsIG1GcmFtZVJhdGUsIG1heEZyYW1lUmF0ZSk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtYXhGcmFtZVJhdGU7CisgICAgfQorfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNsaXBWaWRlb0JpdFJhdGUoKSB7CisgICAgTE9HVigiY2xpcFZpZGVvQml0UmF0ZTogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtaW5CaXRSYXRlID0gbUVuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jLnZpZC5icHMubWluIiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaW50IG1heEJpdFJhdGUgPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmJwcy5tYXgiLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpZiAobVZpZGVvQml0UmF0ZSA8IG1pbkJpdFJhdGUpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgYml0IHJhdGUgKCVkIGJwcykgaXMgdG9vIHNtYWxsIgorICAgICAgICAgICAgICIgYW5kIHdpbGwgYmUgc2V0IHRvICglZCBicHMpIiwgbVZpZGVvQml0UmF0ZSwgbWluQml0UmF0ZSk7CisgICAgICAgIG1WaWRlb0JpdFJhdGUgPSBtaW5CaXRSYXRlOworICAgIH0gZWxzZSBpZiAobVZpZGVvQml0UmF0ZSA+IG1heEJpdFJhdGUpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgYml0IHJhdGUgKCVkIGJwcykgaXMgdG9vIGxhcmdlIgorICAgICAgICAgICAgICIgYW5kIHdpbGwgYmUgc2V0IHRvICglZCBicHMpIiwgbVZpZGVvQml0UmF0ZSwgbWF4Qml0UmF0ZSk7CisgICAgICAgIG1WaWRlb0JpdFJhdGUgPSBtYXhCaXRSYXRlOworICAgIH0KK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZVdpZHRoKCkgeworICAgIExPR1YoImNsaXBWaWRlb0ZyYW1lV2lkdGg6IGVuY29kZXIgJWQiLCBtVmlkZW9FbmNvZGVyKTsKKyAgICBpbnQgbWluRnJhbWVXaWR0aCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWluIiwgbVZpZGVvRW5jb2Rlcik7CisgICAgaW50IG1heEZyYW1lV2lkdGggPSBtRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLndpZHRoLm1heCIsIG1WaWRlb0VuY29kZXIpOworICAgIGlmIChtVmlkZW9XaWR0aCA8IG1pbkZyYW1lV2lkdGgpIHsKKyAgICAgICAgTE9HVygiSW50ZW5kZWQgdmlkZW8gZW5jb2RpbmcgZnJhbWUgd2lkdGggKCVkKSBpcyB0b28gc21hbGwiCisgICAgICAgICAgICAgIiBhbmQgd2lsbCBiZSBzZXQgdG8gKCVkKSIsIG1WaWRlb1dpZHRoLCBtaW5GcmFtZVdpZHRoKTsKKyAgICAgICAgbVZpZGVvV2lkdGggPSBtaW5GcmFtZVdpZHRoOworICAgIH0gZWxzZSBpZiAobVZpZGVvV2lkdGggPiBtYXhGcmFtZVdpZHRoKSB7CisgICAgICAgIExPR1coIkludGVuZGVkIHZpZGVvIGVuY29kaW5nIGZyYW1lIHdpZHRoICglZCkgaXMgdG9vIGxhcmdlIgorICAgICAgICAgICAgICIgYW5kIHdpbGwgYmUgc2V0IHRvICglZCkiLCBtVmlkZW9XaWR0aCwgbWF4RnJhbWVXaWR0aCk7CisgICAgICAgIG1WaWRlb1dpZHRoID0gbWF4RnJhbWVXaWR0aDsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKCkgeworICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKKyAgICBjbGlwVmlkZW9GcmFtZVJhdGUoKTsKKyAgICBjbGlwVmlkZW9GcmFtZVdpZHRoKCk7CisgICAgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKKworICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGlmIChtQ2FtZXJhID09IDApIHsKKyAgICAgICAgbUNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdChtQ2FtZXJhSWQpOworICAgICAgICBpZiAobUNhbWVyYSA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJDYW1lcmEgY29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQuIik7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisgICAgICAgIG1GbGFncyAmPSB+RkxBR1NfSE9UX0NBTUVSQTsKKyAgICAgICAgbUNhbWVyYS0+bG9jaygpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgYWN0dWFsIHZpZGVvIHJlY29yZGluZyBmcmFtZSBzaXplCisgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKKyAgICBwYXJhbXMuc2V0UHJldmlld1NpemUobVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgcGFyYW1zLnNldFByZXZpZXdGcmFtZVJhdGUobUZyYW1lUmF0ZSk7CisgICAgU3RyaW5nOCBzID0gcGFyYW1zLmZsYXR0ZW4oKTsKKyAgICBpZiAoT0sgIT0gbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhzKSkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3QgY2hhbmdlIHNldHRpbmdzLiIKKyAgICAgICAgICAgICAiIFNvbWVvbmUgZWxzZSBpcyB1c2luZyBjYW1lcmEgJWQ/IiwgbUNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgQ2FtZXJhUGFyYW1ldGVycyBuZXdDYW1lcmFQYXJhbXMobUNhbWVyYS0+Z2V0UGFyYW1ldGVycygpKTsKKworICAgIC8vIENoZWNrIG9uIHZpZGVvIGZyYW1lIHNpemUKKyAgICBpbnQgZnJhbWVXaWR0aCA9IDAsIGZyYW1lSGVpZ2h0ID0gMDsKKyAgICBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld1NpemUoJmZyYW1lV2lkdGgsICZmcmFtZUhlaWdodCk7CisgICAgaWYgKGZyYW1lV2lkdGggIDwgMCB8fCBmcmFtZVdpZHRoICAhPSBtVmlkZW9XaWR0aCB8fAorICAgICAgICBmcmFtZUhlaWdodCA8IDAgfHwgZnJhbWVIZWlnaHQgIT0gbVZpZGVvSGVpZ2h0KSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgdGhlIHZpZGVvIGZyYW1lIHNpemUgdG8gJWR4JWQiLAorICAgICAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gQ2hlY2sgb24gdmlkZW8gZnJhbWUgcmF0ZQorICAgIGludCBmcmFtZVJhdGUgPSBuZXdDYW1lcmFQYXJhbXMuZ2V0UHJldmlld0ZyYW1lUmF0ZSgpOworICAgIGlmIChmcmFtZVJhdGUgPCAwIHx8IChmcmFtZVJhdGUgLSBtRnJhbWVSYXRlKSAhPSAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgZnJhbWUgcmF0ZSB0byAlZCBmcHMuIFRoZSBhY3R1YWwgIgorICAgICAgICAgICAgICJmcmFtZSByYXRlIGlzICVkIiwgbUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIENIRUNLIGlzIGdvb2QsIHNpbmNlIHdlIGp1c3QgcGFzc2VkIHRoZSBsb2NrL3VubG9jaworICAgIC8vIGNoZWNrIGVhcmxpZXIgYnkgY2FsbGluZyBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKCkuCisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnNldFByZXZpZXdEaXNwbGF5KG1QcmV2aWV3U3VyZmFjZSkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyOjpjbGlwVmlkZW9GcmFtZUhlaWdodCgpIHsKKyAgICBMT0dWKCJjbGlwVmlkZW9GcmFtZUhlaWdodDogZW5jb2RlciAlZCIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtaW5GcmFtZUhlaWdodCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1pbiIsIG1WaWRlb0VuY29kZXIpOworICAgIGludCBtYXhGcmFtZUhlaWdodCA9IG1FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1heCIsIG1WaWRlb0VuY29kZXIpOworICAgIGlmIChtVmlkZW9IZWlnaHQgPCBtaW5GcmFtZUhlaWdodCkgeworICAgICAgICBMT0dXKCJJbnRlbmRlZCB2aWRlbyBlbmNvZGluZyBmcmFtZSBoZWlnaHQgKCVkKSBpcyB0b28gc21hbGwiCisgICAgICAgICAgICAgIiBhbmQgd2lsbCBiZSBzZXQgdG8gKCVkKSIsIG1WaWRlb0hlaWdodCwgbWluRnJhbWVIZWlnaHQpOworICAgICAgICBtVmlkZW9IZWlnaHQgPSBtaW5GcmFtZUhlaWdodDsKKyAgICB9IGVsc2UgaWYgKG1WaWRlb0hlaWdodCA+IG1heEZyYW1lSGVpZ2h0KSB7CisgICAgICAgIExPR1coIkludGVuZGVkIHZpZGVvIGVuY29kaW5nIGZyYW1lIGhlaWdodCAoJWQpIGlzIHRvbyBsYXJnZSIKKyAgICAgICAgICAgICAiIGFuZCB3aWxsIGJlIHNldCB0byAoJWQpIiwgbVZpZGVvSGVpZ2h0LCBtYXhGcmFtZUhlaWdodCk7CisgICAgICAgIG1WaWRlb0hlaWdodCA9IG1heEZyYW1lSGVpZ2h0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBWaWRlb0VuY29kZXIoc3A8TWVkaWFTb3VyY2U+ICpzb3VyY2UpIHsKKyAgICBzb3VyY2UtPmNsZWFyKCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cENhbWVyYVNvdXJjZSgpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IGNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYShtQ2FtZXJhKTsKKyAgICBDSEVDSyhjYW1lcmFTb3VyY2UgIT0gTlVMTCk7CisKKyAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1GcmFtZVJhdGUpOworCisgICAgc3dpdGNoIChtVmlkZW9FbmNvZGVyKSB7CisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjYzOgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9NUEVHXzRfU1A6CisgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVklERU9fRU5DT0RFUl9IMjY0OgorICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLCB1bnN1cHBvcnRlZCB2aWRlbyBlbmNvZGluZy4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodCwgY29sb3JGb3JtYXQ7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVN0cmlkZSwgJnN0cmlkZSkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2xpY2VIZWlnaHQsICZzbGljZUhlaWdodCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZjb2xvckZvcm1hdCkpOworCisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVN0cmlkZSwgc3RyaWRlKTsKKyAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVNsaWNlSGVpZ2h0LCBzbGljZUhlaWdodCk7CisgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOworICAgIGlmIChtVmlkZW9UaW1lU2NhbGUgPiAwKSB7CisgICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5VGltZVNjYWxlLCBtVmlkZW9UaW1lU2NhbGUpOworICAgIH0KKyAgICBpZiAobVZpZGVvRW5jb2RlclByb2ZpbGUgIT0gLTEpIHsKKyAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKKyAgICB9CisgICAgaWYgKG1WaWRlb0VuY29kZXJMZXZlbCAhPSAtMSkgeworICAgICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIG1WaWRlb0VuY29kZXJMZXZlbCk7CisgICAgfQorCisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCBPSyk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gZW5jb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY19tZXRhLAorICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBjYW1lcmFTb3VyY2UpOworICAgIGlmIChlbmNvZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgKnNvdXJjZSA9IGVuY29kZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQXVkaW9FbmNvZGVyKGNvbnN0IHNwPE1lZGlhV3JpdGVyPiYgd3JpdGVyKSB7CisgICAgc3A8TWVkaWFTb3VyY2U+IGF1ZGlvRW5jb2RlcjsKKyAgICBzd2l0Y2gobUF1ZGlvRW5jb2RlcikgeworICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX05COgorICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQU1SX1dCOgorICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfQUFDOgorICAgICAgICAgICAgYXVkaW9FbmNvZGVyID0gY3JlYXRlQXVkaW9Tb3VyY2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB3cml0ZXItPmFkZFNvdXJjZShhdWRpb0VuY29kZXIpOworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c3RhcnRNUEVHNFJlY29yZGluZygpIHsKLSAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKGR1cChtT3V0cHV0RmQpKTsKKyAgICBpbnQzMl90IHRvdGFsQml0UmF0ZSA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihkdXAobU91dHB1dEZkKSk7CiAKKyAgICAvLyBBZGQgYXVkaW8gc291cmNlIGZpcnN0IGlmIGl0IGV4aXN0cworICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7CisgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisgICAgICAgIHRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KICAgICBpZiAobVZpZGVvU291cmNlID09IFZJREVPX1NPVVJDRV9ERUZBVUxUCiAgICAgICAgICAgICB8fCBtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkgewotICAgICAgICBDSEVDSyhtQ2FtZXJhICE9IE5VTEwpOwotCi0gICAgICAgIHNwPENhbWVyYVNvdXJjZT4gY2FtZXJhU291cmNlID0KLSAgICAgICAgICAgIENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUlDYW1lcmEobUNhbWVyYSk7Ci0KLSAgICAgICAgQ0hFQ0soY2FtZXJhU291cmNlICE9IE5VTEwpOwotCi0gICAgICAgIGNhbWVyYVNvdXJjZS0+c2V0UHJldmlld1N1cmZhY2UobVByZXZpZXdTdXJmYWNlKTsKLQotICAgICAgICBzcDxNZXRhRGF0YT4gZW5jX21ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgIHN3aXRjaCAobVZpZGVvRW5jb2RlcikgewotICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjM6Ci0gICAgICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX01QRUdfNF9TUDoKLSAgICAgICAgICAgICAgICBlbmNfbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBWSURFT19FTkNPREVSX0gyNjQ6Ci0gICAgICAgICAgICAgICAgZW5jX21ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLCB1bnN1cHBvcnRlZCB2aWRlbyBlbmNvZGluZy4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKLQotICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCkpOwotCi0gICAgICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7Ci0KLSAgICAgICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICAgICAgQ0hFQ0tfRVEoY2xpZW50LmNvbm5lY3QoKSwgT0spOwotCi0gICAgICAgIHNwPE1lZGlhU291cmNlPiBlbmNvZGVyID0KLSAgICAgICAgICAgIE9NWENvZGVjOjpDcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5pbnRlcmZhY2UoKSwgZW5jX21ldGEsCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogY3JlYXRlRW5jb2RlciAqLywgY2FtZXJhU291cmNlKTsKLQotICAgICAgICBDSEVDSyhtT3V0cHV0RmQgPj0gMCk7Ci0gICAgICAgIG1Xcml0ZXItPmFkZFNvdXJjZShlbmNvZGVyKTsKKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IGVuY29kZXI7CisgICAgICAgIGVyciA9IHNldHVwVmlkZW9FbmNvZGVyKCZlbmNvZGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgd3JpdGVyLT5hZGRTb3VyY2UoZW5jb2Rlcik7CisgICAgICAgIHRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0xJU1RfRU5EKSB7Ci0gICAgICAgIHNwPE1lZGlhU291cmNlPiBhdWRpb0VuY29kZXIgPSBjcmVhdGVBTVJBdWRpb1NvdXJjZSgpOwotCi0gICAgICAgIGlmIChhdWRpb0VuY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBtV3JpdGVyLT5hZGRTb3VyY2UoYXVkaW9FbmNvZGVyKTsKKyAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgeworICAgICAgICByZWludGVycHJldF9jYXN0PE1QRUc0V3JpdGVyICo+KHdyaXRlci5nZXQoKSktPgorICAgICAgICAgICAgc2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CiAgICAgfQogCi0gICAgbVdyaXRlci0+c3RhcnQoKTsKKyAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKKyAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obU1heEZpbGVEdXJhdGlvblVzKTsKKyAgICB9CisgICAgaWYgKG1NYXhGaWxlU2l6ZUJ5dGVzICE9IDApIHsKKyAgICAgICAgd3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtTWF4RmlsZVNpemVCeXRlcyk7CisgICAgfQorICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzeXN0ZW1UaW1lKCkgLyAxMDAwKTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG1PdXRwdXRGb3JtYXQpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRSYXRlLCB0b3RhbEJpdFJhdGUpOworICAgIG1ldGEtPnNldEludDMyKGtLZXk2NEJpdEZpbGVPZmZzZXQsIG1Vc2U2NEJpdEZpbGVPZmZzZXQpOworICAgIGlmIChtTW92aWVUaW1lU2NhbGUgPiAwKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIG1Nb3ZpZVRpbWVTY2FsZSk7CisgICAgfQorICAgIGlmIChtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID4gMCkgeworICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5VHJhY2tUaW1lU3RhdHVzLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICB9CisgICAgd3JpdGVyLT5zZXRMaXN0ZW5lcihtTGlzdGVuZXIpOworICAgIG1Xcml0ZXIgPSB3cml0ZXI7CisgICAgcmV0dXJuIG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpwYXVzZSgpIHsKKyAgICBMT0dWKCJwYXVzZSIpOworICAgIGlmIChtV3JpdGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1Xcml0ZXItPnBhdXNlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzdG9wKCkgewotICAgIGlmIChtV3JpdGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgTE9HVigic3RvcCIpOworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gbVdyaXRlci0+c3RvcCgpOworICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CiAgICAgfQogCi0gICAgbVdyaXRlci0+c3RvcCgpOwotICAgIG1Xcml0ZXIgPSBOVUxMOworICAgIGlmIChtQ2FtZXJhICE9IDApIHsKKyAgICAgICAgTE9HVigiRGlzY29ubmVjdCBjYW1lcmEiKTsKKyAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgIGlmICgobUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgPT0gMCkgeworICAgICAgICAgICAgTE9HVigiQ2FtZXJhIHdhcyBjb2xkIHdoZW4gd2Ugc3RhcnRlZCwgc3RvcHBpbmcgcHJldmlldyIpOworICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKKyAgICAgICAgbUNhbWVyYS5jbGVhcigpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgbUZsYWdzID0gMDsKKyAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgaWYgKG1PdXRwdXRGZCA+PSAwKSB7CisgICAgICAgIDo6Y2xvc2UobU91dHB1dEZkKTsKKyAgICAgICAgbU91dHB1dEZkID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y2xvc2UoKSB7CisgICAgTE9HVigiY2xvc2UiKTsKICAgICBzdG9wKCk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnJlc2V0KCkgeworICAgIExPR1YoInJlc2V0Iik7CiAgICAgc3RvcCgpOwogCisgICAgLy8gTm8gYXVkaW8gb3IgdmlkZW8gc291cmNlIGJ5IGRlZmF1bHQKICAgICBtQXVkaW9Tb3VyY2UgPSBBVURJT19TT1VSQ0VfTElTVF9FTkQ7CiAgICAgbVZpZGVvU291cmNlID0gVklERU9fU09VUkNFX0xJU1RfRU5EOwotICAgIG1PdXRwdXRGb3JtYXQgPSBPVVRQVVRfRk9STUFUX0xJU1RfRU5EOwotICAgIG1BdWRpb0VuY29kZXIgPSBBVURJT19FTkNPREVSX0xJU1RfRU5EOwotICAgIG1WaWRlb0VuY29kZXIgPSBWSURFT19FTkNPREVSX0xJU1RfRU5EOwotICAgIG1WaWRlb1dpZHRoID0gLTE7Ci0gICAgbVZpZGVvSGVpZ2h0ID0gLTE7Ci0gICAgbUZyYW1lUmF0ZSA9IC0xOworCisgICAgLy8gRGVmYXVsdCBwYXJhbWV0ZXJzCisgICAgbU91dHB1dEZvcm1hdCAgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKKyAgICBtQXVkaW9FbmNvZGVyICA9IEFVRElPX0VOQ09ERVJfQU1SX05COworICAgIG1WaWRlb0VuY29kZXIgID0gVklERU9fRU5DT0RFUl9IMjYzOworICAgIG1WaWRlb1dpZHRoICAgID0gMTc2OworICAgIG1WaWRlb0hlaWdodCAgID0gMTQ0OworICAgIG1GcmFtZVJhdGUgICAgID0gMjA7CisgICAgbVZpZGVvQml0UmF0ZSAgPSAxOTIwMDA7CisgICAgbVNhbXBsZVJhdGUgICAgPSA4MDAwOworICAgIG1BdWRpb0NoYW5uZWxzID0gMTsKKyAgICBtQXVkaW9CaXRSYXRlICA9IDEyMjAwOworICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IDA7CisgICAgbUlGcmFtZXNJbnRlcnZhbFNlYyA9IDE7CisgICAgbUF1ZGlvU291cmNlTm9kZSA9IDA7CisgICAgbVVzZTY0Qml0RmlsZU9mZnNldCA9IGZhbHNlOworICAgIG1Nb3ZpZVRpbWVTY2FsZSAgPSAtMTsKKyAgICBtQXVkaW9UaW1lU2NhbGUgID0gLTE7CisgICAgbVZpZGVvVGltZVNjYWxlICA9IC0xOworICAgIG1DYW1lcmFJZCAgICAgICAgPSAwOworICAgIG1WaWRlb0VuY29kZXJQcm9maWxlID0gLTE7CisgICAgbVZpZGVvRW5jb2RlckxldmVsICAgPSAtMTsKKyAgICBtTWF4RmlsZUR1cmF0aW9uVXMgPSAwOworICAgIG1NYXhGaWxlU2l6ZUJ5dGVzID0gMDsKKyAgICBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzID0gMDsKKyAgICBtRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKKwogICAgIG1PdXRwdXRGZCA9IC0xOworICAgIG1GbGFncyA9IDA7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmdldE1heEFtcGxpdHVkZShpbnQgKm1heCkgewotICAgICptYXggPSAwOworICAgIExPR1YoImdldE1heEFtcGxpdHVkZSIpOworCisgICAgaWYgKG1heCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk51bGwgcG9pbnRlciBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgKm1heCA9IG1BdWRpb1NvdXJjZU5vZGUtPmdldE1heEFtcGxpdHVkZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgICptYXggPSAwOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CisgICAgTE9HVigiZHVtcCIpOworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworICAgIGlmIChtV3JpdGVyICE9IDApIHsKKyAgICAgICAgbVdyaXRlci0+ZHVtcChmZCwgYXJncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgTm8gZmlsZSB3cml0ZXJcbiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIFJlY29yZGVyOiAlcFxuIiwgdGhpcyk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgT3V0cHV0IGZpbGUgKGZkICVkKTpcbiIsIG1PdXRwdXRGZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRmlsZSBmb3JtYXQ6ICVkXG4iLCBtT3V0cHV0Rm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBzaXplIChieXRlcyk6ICVsbGRcbiIsIG1NYXhGaWxlU2l6ZUJ5dGVzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggZmlsZSBkdXJhdGlvbiAodXMpOiAlbGxkXG4iLCBtTWF4RmlsZUR1cmF0aW9uVXMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZpbGUgb2Zmc2V0IGxlbmd0aCAoYml0cyk6ICVkXG4iLCBtVXNlNjRCaXRGaWxlT2Zmc2V0PyA2NDogMzIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEludGVybGVhdmUgZHVyYXRpb24gKHVzKTogJWRcbiIsIG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgUHJvZ3Jlc3Mgbm90aWZpY2F0aW9uOiAlbGxkIHVzXG4iLCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgQXVkaW9cbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIFNvdXJjZTogJWRcbiIsIG1BdWRpb1NvdXJjZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRW5jb2RlcjogJWRcbiIsIG1BdWRpb0VuY29kZXIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEJpdCByYXRlIChicHMpOiAlZFxuIiwgbUF1ZGlvQml0UmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgU2FtcGxpbmcgcmF0ZSAoaHopOiAlZFxuIiwgbVNhbXBsZVJhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIE51bWJlciBvZiBjaGFubmVsczogJWRcbiIsIG1BdWRpb0NoYW5uZWxzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBNYXggYW1wbGl0dWRlOiAlZFxuIiwgbUF1ZGlvU291cmNlTm9kZSA9PSAwPyAwOiBtQXVkaW9Tb3VyY2VOb2RlLT5nZXRNYXhBbXBsaXR1ZGUoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgIFZpZGVvXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBTb3VyY2U6ICVkXG4iLCBtVmlkZW9Tb3VyY2UpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIENhbWVyYSBJZDogJWRcbiIsIG1DYW1lcmFJZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQ2FtZXJhIGZsYWdzOiAlZFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBFbmNvZGVyOiAlZFxuIiwgbVZpZGVvRW5jb2Rlcik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgRW5jb2RlciBwcm9maWxlOiAlZFxuIiwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEVuY29kZXIgbGV2ZWw6ICVkXG4iLCBtVmlkZW9FbmNvZGVyTGV2ZWwpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEkgZnJhbWVzIGludGVydmFsIChzKTogJWRcbiIsIG1JRnJhbWVzSW50ZXJ2YWxTZWMpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgIEZyYW1lIHNpemUgKHBpeGVscyk6ICVkeCVkXG4iLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICBGcmFtZSByYXRlIChmcHMpOiAlZFxuIiwgbUZyYW1lUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgQml0IHJhdGUgKGJwcyk6ICVkXG4iLCBtVmlkZW9CaXRSYXRlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gT0s7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggN2VjNDEyZC4uMjE2ZjZiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC0yMyw4ICsyMywxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIENhbWVyYTsKIHN0cnVjdCBNZWRpYVNvdXJjZTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKK3N0cnVjdCBBdWRpb1NvdXJjZTsKK2NsYXNzIE1lZGlhUHJvZmlsZXM7CiAKIHN0cnVjdCBTdGFnZWZyaWdodFJlY29yZGVyIDogcHVibGljIE1lZGlhUmVjb3JkZXJCYXNlIHsKICAgICBTdGFnZWZyaWdodFJlY29yZGVyKCk7CkBAIC00MywzMyArNDYsODkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGxpc3RlbmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heEFtcGxpdHVkZShpbnQgKm1heCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3A8SUNhbWVyYT4gbUNhbWVyYTsKKyAgICBlbnVtIENhbWVyYUZsYWdzIHsKKyAgICAgICAgRkxBR1NfU0VUX0NBTUVSQSA9IDFMIDw8IDAsCisgICAgICAgIEZMQUdTX0hPVF9DQU1FUkEgPSAxTCA8PCAxLAorICAgIH07CisKKyAgICBzcDxDYW1lcmE+IG1DYW1lcmE7CiAgICAgc3A8SVN1cmZhY2U+IG1QcmV2aWV3U3VyZmFjZTsKLSAgICBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+IG1MaXN0ZW5lcjsKKyAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwogICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOworICAgIHNwPEF1ZGlvU291cmNlPiBtQXVkaW9Tb3VyY2VOb2RlOwogCiAgICAgYXVkaW9fc291cmNlIG1BdWRpb1NvdXJjZTsKICAgICB2aWRlb19zb3VyY2UgbVZpZGVvU291cmNlOwogICAgIG91dHB1dF9mb3JtYXQgbU91dHB1dEZvcm1hdDsKICAgICBhdWRpb19lbmNvZGVyIG1BdWRpb0VuY29kZXI7CiAgICAgdmlkZW9fZW5jb2RlciBtVmlkZW9FbmNvZGVyOwotICAgIGludCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0OwotICAgIGludCBtRnJhbWVSYXRlOworICAgIGJvb2wgbVVzZTY0Qml0RmlsZU9mZnNldDsKKyAgICBpbnQzMl90IG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQ7CisgICAgaW50MzJfdCBtRnJhbWVSYXRlOworICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZTsKKyAgICBpbnQzMl90IG1BdWRpb0JpdFJhdGU7CisgICAgaW50MzJfdCBtQXVkaW9DaGFubmVsczsKKyAgICBpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIGludDMyX3QgbUludGVybGVhdmVEdXJhdGlvblVzOworICAgIGludDMyX3QgbUlGcmFtZXNJbnRlcnZhbFNlYzsKKyAgICBpbnQzMl90IG1DYW1lcmFJZDsKKyAgICBpbnQzMl90IG1WaWRlb0VuY29kZXJQcm9maWxlOworICAgIGludDMyX3QgbVZpZGVvRW5jb2RlckxldmVsOworICAgIGludDMyX3QgbU1vdmllVGltZVNjYWxlOworICAgIGludDMyX3QgbVZpZGVvVGltZVNjYWxlOworICAgIGludDMyX3QgbUF1ZGlvVGltZVNjYWxlOworICAgIGludDY0X3QgbU1heEZpbGVTaXplQnl0ZXM7CisgICAgaW50NjRfdCBtTWF4RmlsZUR1cmF0aW9uVXM7CisgICAgaW50NjRfdCBtVHJhY2tFdmVyeVRpbWVEdXJhdGlvblVzOworCiAgICAgU3RyaW5nOCBtUGFyYW1zOwogICAgIGludCBtT3V0cHV0RmQ7CisgICAgaW50MzJfdCBtRmxhZ3M7CisKKyAgICBNZWRpYVByb2ZpbGVzICptRW5jb2RlclByb2ZpbGVzOwogCiAgICAgc3RhdHVzX3Qgc3RhcnRNUEVHNFJlY29yZGluZygpOwogICAgIHN0YXR1c190IHN0YXJ0QU1SUmVjb3JkaW5nKCk7Ci0gICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUFNUkF1ZGlvU291cmNlKCk7CisgICAgc3RhdHVzX3Qgc3RhcnRBQUNSZWNvcmRpbmcoKTsKKyAgICBzdGF0dXNfdCBzdGFydFJUUFJlY29yZGluZygpOworICAgIHNwPE1lZGlhU291cmNlPiBjcmVhdGVBdWRpb1NvdXJjZSgpOworICAgIHN0YXR1c190IHNldHVwQ2FtZXJhU291cmNlKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBBdWRpb0VuY29kZXIoY29uc3Qgc3A8TWVkaWFXcml0ZXI+JiB3cml0ZXIpOworICAgIHN0YXR1c190IHNldHVwVmlkZW9FbmNvZGVyKHNwPE1lZGlhU291cmNlPiAqc291cmNlKTsKKworICAgIC8vIEVuY29kaW5nIHBhcmFtZXRlciBoYW5kbGluZyB1dGlsaXRpZXMKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1BdWRpb0VuY29kaW5nQml0UmF0ZShpbnQzMl90IGJpdFJhdGUpOworICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9OdW1iZXJPZkNoYW5uZWxzKGludDMyX3QgY2hhbm5sZXMpOworICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9TYW1wbGluZ1JhdGUoaW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvVGltZVNjYWxlKGludDMyX3QgdGltZVNjYWxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0lGcmFtZXNJbnRlcnZhbChpbnQzMl90IHNlY29uZHMpOworICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShpbnQzMl90IHByb2ZpbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyTGV2ZWwoaW50MzJfdCBsZXZlbCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0NhbWVyYUlkKGludDMyX3QgY2FtZXJhSWQpOworICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9UaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOworICAgIHN0YXR1c190IHNldFBhcmFtVHJhY2tUaW1lU3RhdHVzKGludDY0X3QgdGltZUR1cmF0aW9uVXMpOworICAgIHN0YXR1c190IHNldFBhcmFtSW50ZXJsZWF2ZUR1cmF0aW9uKGludDMyX3QgZHVyYXRpb25Vcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW02NEJpdEZpbGVPZmZzZXQoYm9vbCB1c2U2NEJpdEZpbGVPZmZzZXQpOworICAgIHN0YXR1c190IHNldFBhcmFtTWF4RmlsZUR1cmF0aW9uVXMoaW50NjRfdCB0aW1lVXMpOworICAgIHN0YXR1c190IHNldFBhcmFtTWF4RmlsZVNpemVCeXRlcyhpbnQ2NF90IGJ5dGVzKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbU1vdmllVGltZVNjYWxlKGludDMyX3QgdGltZVNjYWxlKTsKKyAgICB2b2lkIGNsaXBWaWRlb0JpdFJhdGUoKTsKKyAgICB2b2lkIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOworICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOworICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVIZWlnaHQoKTsKIAogICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgU3RhZ2VmcmlnaHRSZWNvcmRlciAmKTsKICAgICBTdGFnZWZyaWdodFJlY29yZGVyICZvcGVyYXRvcj0oY29uc3QgU3RhZ2VmcmlnaHRSZWNvcmRlciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWM3NGZjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZvcmJpc01ldGFkYXRhUmV0cmlldmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmg+Ci0jCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9pZCBWb3JiaXNNZXRhZGF0YVJldHJpZXZlcjo6Y2xlYXJNZXRhZGF0YVZhbHVlcygpCi17Ci0gICAgTE9HVigiY2xlZWFyTWV0YWRhdGFWYWx1ZXMiKTsKLSAgICBtTWV0YWRhdGFWYWx1ZXNbMF1bMF0gPSAnXDAnOwotfQotCi1zdGF0dXNfdCBWb3JiaXNNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwpCi17Ci0gICAgTE9HVigic2V0RGF0YVNvdXJjZTogdXJsKCVzKSIsIHVybD8gdXJsOiAiTlVMTCBwb2ludGVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyTWV0YWRhdGFWYWx1ZXMoKTsKLSAgICBpZiAobVZvcmJpc1BsYXllciA9PSAwKSB7Ci0gICAgICAgIG1Wb3JiaXNQbGF5ZXIgPSBuZXcgVm9yYmlzUGxheWVyKCk7Ci0gICAgfQotICAgIC8vIFRPRE86IHN1cHBvcnQgaGVhZGVycyBpbiBNZXRhZGF0YVJldHJpZXZlciBpbnRlcmZhY2UhCi0gICAgcmV0dXJuIG1Wb3JiaXNQbGF5ZXItPnNldERhdGFTb3VyY2UodXJsLCBOVUxMIC8qIGhlYWRlcnMgKi8pOwotfQotCi1zdGF0dXNfdCBWb3JiaXNNZXRhZGF0YVJldHJpZXZlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKLXsKLSAgICBMT0dWKCJzZXREYXRhU291cmNlOiBmZCglZCksIG9mZnNldCglbGxkKSwgYW5kIGxlbmd0aCglbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyTWV0YWRhdGFWYWx1ZXMoKTsKLSAgICBpZiAobVZvcmJpc1BsYXllciA9PSAwKSB7Ci0gICAgICAgIG1Wb3JiaXNQbGF5ZXIgPSBuZXcgVm9yYmlzUGxheWVyKCk7Ci0gICAgfQotICAgIHJldHVybiBtVm9yYmlzUGxheWVyLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci19Ci0KLWNvbnN0IGNoYXIqIFZvcmJpc01ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpCi17Ci0gICAgTE9HVigiZXh0cmFjdE1ldGFkYXRhOiBrZXkoJWQpIiwga2V5Q29kZSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVm9yYmlzUGxheWVyID09IDAgfHwgbVZvcmJpc1BsYXllci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgibm8gdm9yYmlzIHBsYXllciBpcyBpbml0aWFsaXplZCB5ZXQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgIGNhc2UgTUVUQURBVEFfS0VZX0RVUkFUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhVmFsdWVzWzBdWzBdID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24gPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAobVZvcmJpc1BsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gZ2V0IGR1cmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzbnByaW50ZihtTWV0YWRhdGFWYWx1ZXNbMF0sIE1BWF9NRVRBREFUQV9TVFJJTkdfTEVOR1RILCAiJWQiLCBkdXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dWKCJkdXJhdGlvbjogJXMgbXMiLCBtTWV0YWRhdGFWYWx1ZXNbMF0pOwotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YVZhbHVlc1swXTsKLSAgICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR0UoIlVuc3VwcG9ydGVkIGtleSBjb2RlICglZCkiLCBrZXlDb2RlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi19OwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNNZXRhZGF0YVJldHJpZXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzU3ZmUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNNZXRhZGF0YVJldHJpZXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZPUkJJU01FVEFEQVRBUkVUUklFVkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9WT1JCSVNNRVRBREFUQVJFVFJJRVZFUl9ICi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiVm9yYmlzUGxheWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVm9yYmlzTWV0YWRhdGFSZXRyaWV2ZXIgOiBwdWJsaWMgTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvcmJpc01ldGFkYXRhUmV0cmlldmVyKCkge30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflZvcmJpc01ldGFkYXRhUmV0cmlldmVyKCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICp1cmwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfTUVUQURBVEFfU1RSSU5HX0xFTkdUSCA9IDEyODsKLSAgICB2b2lkIGNsZWFyTWV0YWRhdGFWYWx1ZXMoKTsKLQotICAgIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgc3A8Vm9yYmlzUGxheWVyPiAgICBtVm9yYmlzUGxheWVyOwotICAgIGNoYXIgICAgICAgICAgICAgICAgbU1ldGFkYXRhVmFsdWVzWzFdW01BWF9NRVRBREFUQV9TVFJJTkdfTEVOR1RIXTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1ZPUkJJU01FVEFEQVRBUkVUUklFVkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc1BsYXllci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODE5OTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZvcmJpc1BsYXllciIKLSNpbmNsdWRlICJ1dGlscy9Mb2cuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLQotI2luY2x1ZGUgIlZvcmJpc1BsYXllci5oIgotCi0jaWZkZWYgSEFWRV9HRVRUSUQKLXN0YXRpYyBwaWRfdCBteVRpZCgpIHsgcmV0dXJuIGdldHRpZCgpOyB9Ci0jZWxzZQotc3RhdGljIHBpZF90IG15VGlkKCkgeyByZXR1cm4gZ2V0cGlkKCk7IH0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUT0RPOiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgcmV0dXJuIGNvZGVzCi1zdGF0aWMgc3RhdHVzX3QgRVJST1JfTk9UX09QRU4gPSAtMTsKLXN0YXRpYyBzdGF0dXNfdCBFUlJPUl9PUEVOX0ZBSUxFRCA9IC0yOwotc3RhdGljIHN0YXR1c190IEVSUk9SX0FMTE9DQVRFX0ZBSUxFRCA9IC00Owotc3RhdGljIHN0YXR1c190IEVSUk9SX05PVF9TVVBQT1JURUQgPSAtODsKLXN0YXRpYyBzdGF0dXNfdCBFUlJPUl9OT1RfUkVBRFkgPSAtMTY7Ci1zdGF0aWMgc3RhdHVzX3QgU1RBVEVfSU5JVCA9IDA7Ci1zdGF0aWMgc3RhdHVzX3QgU1RBVEVfRVJST1IgPSAxOwotc3RhdGljIHN0YXR1c190IFNUQVRFX09QRU4gPSAyOwotCi0KLVZvcmJpc1BsYXllcjo6Vm9yYmlzUGxheWVyKCkgOgotICAgIG1BdWRpb0J1ZmZlcihOVUxMKSwgbVBsYXlUaW1lKC0xKSwgbUR1cmF0aW9uKC0xKSwgbVN0YXRlKFNUQVRFX0VSUk9SKSwKLSAgICBtU3RyZWFtVHlwZShBdWRpb1N5c3RlbTo6TVVTSUMpLCBtTG9vcChmYWxzZSksIG1BbmRyb2lkTG9vcChmYWxzZSksCi0gICAgbUV4aXQoZmFsc2UpLCBtUGF1c2VkKGZhbHNlKSwgbVJlbmRlcihmYWxzZSksIG1SZW5kZXJUaWQoLTEpCi17Ci0gICAgTE9HVigiY29uc3RydWN0b3JcbiIpOwotICAgIG1lbXNldCgmbVZvcmJpc0ZpbGUsIDAsIHNpemVvZiBtVm9yYmlzRmlsZSk7Ci19Ci0KLXZvaWQgVm9yYmlzUGxheWVyOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBMT0dWKCJvbkZpcnN0UmVmIik7Ci0gICAgLy8gY3JlYXRlIHBsYXliYWNrIHRocmVhZAotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgY3JlYXRlVGhyZWFkRXRjKHJlbmRlclRocmVhZCwgdGhpcywgInZvcmJpcyBkZWNvZGVyIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci0gICAgbUNvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgaWYgKG1SZW5kZXJUaWQgPiAwKSB7Ci0gICAgICAgIExPR1YoInJlbmRlciB0aHJlYWQoJWQpIHN0YXJ0ZWQiLCBtUmVuZGVyVGlkKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfSU5JVDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6aW5pdENoZWNrKCkKLXsKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX0VSUk9SKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgcmV0dXJuIEVSUk9SX05PVF9SRUFEWTsKLX0KLQotVm9yYmlzUGxheWVyOjp+Vm9yYmlzUGxheWVyKCkgewotICAgIExPR1YoIlZvcmJpc1BsYXllciBkZXN0cnVjdG9yXG4iKTsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c2V0RGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIHJldHVybiBzZXRkYXRhc291cmNlKHVyaSwgLTEsIDAsIDB4N2ZmZmZmZmZmZmZmZmZmTEwpOyAvLyBpbnRlbnRpb25hbGx5IGxlc3MgdGhhbiBMT05HX01BWAotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi17Ci0gICAgcmV0dXJuIHNldGRhdGFzb3VyY2UoTlVMTCwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKLX0KLQotc2l6ZV90IFZvcmJpc1BsYXllcjo6dnBfZnJlYWQodm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCB2b2lkICptZSkgewotICAgIFZvcmJpc1BsYXllciAqc2VsZiA9IChWb3JiaXNQbGF5ZXIqKSBtZTsKLQotICAgIGxvbmcgY3VycG9zID0gdnBfZnRlbGwobWUpOwotICAgIHdoaWxlIChubWVtYiAhPSAwICYmIChjdXJwb3MgKyBzaXplICogbm1lbWIpID4gc2VsZi0+bUxlbmd0aCkgewotICAgICAgICBubWVtYi0tOwotICAgIH0KLSAgICByZXR1cm4gZnJlYWQoYnVmLCBzaXplLCBubWVtYiwgc2VsZi0+bUZpbGUpOwotfQotCi1pbnQgVm9yYmlzUGxheWVyOjp2cF9mc2Vlayh2b2lkICptZSwgb2dnX2ludDY0X3Qgb2ZmLCBpbnQgd2hlbmNlKSB7Ci0gICAgVm9yYmlzUGxheWVyICpzZWxmID0gKFZvcmJpc1BsYXllciopIG1lOwotICAgIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpCi0gICAgICAgIHJldHVybiBmc2VlayhzZWxmLT5tRmlsZSwgb2ZmICsgc2VsZi0+bU9mZnNldCwgd2hlbmNlKTsKLSAgICBlbHNlIGlmICh3aGVuY2UgPT0gU0VFS19DVVIpCi0gICAgICAgIHJldHVybiBmc2VlayhzZWxmLT5tRmlsZSwgb2ZmLCB3aGVuY2UpOwotICAgIGVsc2UgaWYgKHdoZW5jZSA9PSBTRUVLX0VORCkKLSAgICAgICAgcmV0dXJuIGZzZWVrKHNlbGYtPm1GaWxlLCBzZWxmLT5tT2Zmc2V0ICsgc2VsZi0+bUxlbmd0aCArIG9mZiwgU0VFS19TRVQpOwotICAgIHJldHVybiAtMTsKLX0KLQotaW50IFZvcmJpc1BsYXllcjo6dnBfZmNsb3NlKHZvaWQgKm1lKSB7Ci0gICAgTE9HVigidnBfZmNsb3NlIik7Ci0gICAgVm9yYmlzUGxheWVyICpzZWxmID0gKFZvcmJpc1BsYXllciopIG1lOwotICAgIGludCByZXQgPSBmY2xvc2UgKHNlbGYtPm1GaWxlKTsKLSAgICBzZWxmLT5tRmlsZSA9IE5VTEw7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotbG9uZyBWb3JiaXNQbGF5ZXI6OnZwX2Z0ZWxsKHZvaWQgKm1lKSB7Ci0gICAgVm9yYmlzUGxheWVyICpzZWxmID0gKFZvcmJpc1BsYXllciopIG1lOwotICAgIHJldHVybiBmdGVsbChzZWxmLT5tRmlsZSkgLSBzZWxmLT5tT2Zmc2V0OwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnNldGRhdGFzb3VyY2UoY29uc3QgY2hhciAqcGF0aCwgaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi17Ci0gICAgTE9HVigic2V0RGF0YVNvdXJjZSB1cmw9JXMsIGZkPSVkXG4iLCBwYXRoLCBmZCk7Ci0KLSAgICAvLyBmaWxlIHN0aWxsIG9wZW4/Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobVN0YXRlID09IFNUQVRFX09QRU4pIHsKLSAgICAgICAgcmVzZXRfbm9zeW5jKCk7Ci0gICAgfQotCi0gICAgLy8gb3BlbiBmaWxlIGFuZCBzZXQgcGF1c2VkIHN0YXRlCi0gICAgaWYgKHBhdGgpIHsKLSAgICAgICAgbUZpbGUgPSBmb3BlbihwYXRoLCAiciIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GaWxlID0gZmRvcGVuKGR1cChmZCksICJyIik7Ci0gICAgfQotICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PUEVOX0ZBSUxFRDsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc3RhdCBzYjsKLSAgICBpbnQgcmV0OwotICAgIGlmIChwYXRoKSB7Ci0gICAgICAgIHJldCA9IHN0YXQocGF0aCwgJnNiKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBmc3RhdChmZCwgJnNiKTsKLSAgICB9Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICBmY2xvc2UobUZpbGUpOwotICAgICAgICByZXR1cm4gRVJST1JfT1BFTl9GQUlMRUQ7Ci0gICAgfQotICAgIGlmIChzYi5zdF9zaXplID4gKGxlbmd0aCArIG9mZnNldCkpIHsKLSAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGVuZ3RoID0gc2Iuc3Rfc2l6ZSAtIG9mZnNldDsKLSAgICB9Ci0KLSAgICBvdl9jYWxsYmFja3MgY2FsbGJhY2tzID0gewotICAgICAgICAoc2l6ZV90ICgqKSh2b2lkICosIHNpemVfdCwgc2l6ZV90LCB2b2lkICopKSAgdnBfZnJlYWQsCi0gICAgICAgIChpbnQgKCopKHZvaWQgKiwgb2dnX2ludDY0X3QsIGludCkpICAgICAgICAgICB2cF9mc2VlaywKLSAgICAgICAgKGludCAoKikodm9pZCAqKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwX2ZjbG9zZSwKLSAgICAgICAgKGxvbmcgKCopKHZvaWQgKikpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwX2Z0ZWxsCi0gICAgfTsKLQotICAgIG1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgZnNlZWsobUZpbGUsIG9mZnNldCwgU0VFS19TRVQpOwotCi0gICAgaW50IHJlc3VsdCA9IG92X29wZW5fY2FsbGJhY2tzKHRoaXMsICZtVm9yYmlzRmlsZSwgTlVMTCwgMCwgY2FsbGJhY2tzKTsKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICBMT0dFKCJvdl9vcGVuKCkgZmFpbGVkOiBbJWRdXG4iLCAoaW50KXJlc3VsdCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICBmY2xvc2UobUZpbGUpOwotICAgICAgICByZXR1cm4gRVJST1JfT1BFTl9GQUlMRUQ7Ci0gICAgfQotCi0gICAgLy8gbG9vayBmb3IgdGhlIGFuZHJvaWQgbG9vcCB0YWcgIChmb3IgcmluZ3RvbmVzKQotICAgIGNoYXIgKipwdHIgPSBvdl9jb21tZW50KCZtVm9yYmlzRmlsZSwtMSktPnVzZXJfY29tbWVudHM7Ci0gICAgd2hpbGUoKnB0cikgewotICAgICAgICAvLyBkb2VzIHRoZSBjb21tZW50IHN0YXJ0IHdpdGggQU5EUk9JRF9MT09QX1RBRwotICAgICAgICBpZihzdHJuY21wKCpwdHIsIEFORFJPSURfTE9PUF9UQUcsIHN0cmxlbihBTkRST0lEX0xPT1BfVEFHKSkgPT0gMCkgewotICAgICAgICAgICAgLy8gcmVhZCB0aGUgdmFsdWUgb2YgdGhlIHRhZwotICAgICAgICAgICAgY2hhciAqdmFsID0gKnB0ciArIHN0cmxlbihBTkRST0lEX0xPT1BfVEFHKSArIDE7Ci0gICAgICAgICAgICBtQW5kcm9pZExvb3AgPSAoc3RybmNtcCh2YWwsICJ0cnVlIiwgNCkgPT0gMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gd2Uga2VlcCBwYXJzaW5nIGV2ZW4gYWZ0ZXIgZmluZGluZyBvbmUgb2NjdXJlbmNlIG9mIEFORFJPSURfTE9PUF9UQUcsCi0gICAgICAgIC8vIGFzIHdlIGNvdWxkIGZpbmQgYW5vdGhlciBvbmUgICh0aGUgdGFnIG1pZ2h0IGhhdmUgYmVlbiBhcHBlbmRlZCBtb3JlIHRoYW4gb25jZSkuCi0gICAgICAgICsrcHRyOwotICAgIH0KLSAgICBMT0dWX0lGKG1BbmRyb2lkTG9vcCwgImxvb3BlZCBzb3VuZCIpOwotCi0gICAgbVN0YXRlID0gU1RBVEVfT1BFTjsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6cHJlcGFyZSgpCi17Ci0gICAgTE9HVigicHJlcGFyZVxuIik7Ci0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9PUEVOICkgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgTE9HVigicHJlcGFyZUFzeW5jXG4iKTsKLSAgICAvLyBjYW4ndCBob2xkIHRoZSBsb2NrIGhlcmUgYmVjYXVzZSBvZiB0aGUgY2FsbGJhY2sKLSAgICAvLyBpdCdzIHNhZmUgYmVjYXVzZSB3ZSBkb24ndCBjaGFuZ2Ugc3RhdGUKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX09QRU4gKSB7Ci0gICAgICAgIHNlbmRFdmVudChNRURJQV9FUlJPUik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgc2VuZEV2ZW50KE1FRElBX1BSRVBBUkVEKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c3RhcnQoKQotewotICAgIExPR1YoInN0YXJ0XG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTikgewotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotCi0gICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIG1SZW5kZXIgPSB0cnVlOwotCi0gICAgLy8gd2FrZSB1cCByZW5kZXIgdGhyZWFkCi0gICAgTE9HVigiICB3YWtldXAgcmVuZGVyIHRocmVhZFxuIik7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6c3RvcCgpCi17Ci0gICAgTE9HVigic3RvcFxuIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX09QRU4pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9PUEVOOwotICAgIH0KLSAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICBtUmVuZGVyID0gZmFsc2U7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnNlZWtUbyhpbnQgcG9zaXRpb24pCi17Ci0gICAgTE9HVigic2Vla1RvICVkXG4iLCBwb3NpdGlvbik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX09QRU4pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9PUEVOOwotICAgIH0KLQotICAgIGludCByZXN1bHQgPSBvdl90aW1lX3NlZWsoJm1Wb3JiaXNGaWxlLCBwb3NpdGlvbik7Ci0gICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgIExPR0UoIm92X3RpbWVfc2VlaygpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBzZW5kRXZlbnQoTUVESUFfU0VFS19DT01QTEVURSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnBhdXNlKCkKLXsKLSAgICBMT0dWKCJwYXVzZVxuIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX09QRU4pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9PUEVOOwotICAgIH0KLSAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWJvb2wgVm9yYmlzUGxheWVyOjppc1BsYXlpbmcoKQotewotICAgIExPR1YoImlzUGxheWluZ1xuIik7Ci0gICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9PUEVOKSB7Ci0gICAgICAgIHJldHVybiBtUmVuZGVyOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludCogcG9zaXRpb24pCi17Ci0gICAgTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uXG4iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOwotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfT1BFTikgewotICAgICAgICBMT0dFKCJnZXRDdXJyZW50UG9zaXRpb24oKTogZmlsZSBub3Qgb3BlbiIpOwotICAgICAgICByZXR1cm4gRVJST1JfTk9UX09QRU47Ci0gICAgfQotICAgICpwb3NpdGlvbiA9IG92X3RpbWVfdGVsbCgmbVZvcmJpc0ZpbGUpOwotICAgIGlmICgqcG9zaXRpb24gPCAwKSB7Ci0gICAgICAgIExPR0UoImdldEN1cnJlbnRQb3NpdGlvbigpOiBvdl90aW1lX3RlbGwgcmV0dXJuZWQgJWQiLCAqcG9zaXRpb24pOwotICAgICAgICByZXR1cm4gKnBvc2l0aW9uOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFZvcmJpc1BsYXllcjo6Z2V0RHVyYXRpb24oaW50KiBkdXJhdGlvbikKLXsKLSAgICBMT0dWKCJnZXREdXJhdGlvblxuIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX09QRU4pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9PUEVOOwotICAgIH0KLQotICAgIGludCByZXQgPSBvdl90aW1lX3RvdGFsKCZtVm9yYmlzRmlsZSwgLTEpOwotICAgIGlmIChyZXQgPT0gT1ZfRUlOVkFMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAqZHVyYXRpb24gPSByZXQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnJlbGVhc2UoKQotewotICAgIExPR1YoInJlbGVhc2VcbiIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgcmVzZXRfbm9zeW5jKCk7Ci0KLSAgICAvLyBUT0RPOiB0aW1lb3V0IHdoZW4gdGhyZWFkIHdvbid0IGV4aXQKLSAgICAvLyB3YWl0IGZvciByZW5kZXIgdGhyZWFkIHRvIGV4aXQKLSAgICBpZiAobVJlbmRlclRpZCA+IDApIHsKLSAgICAgICAgbUV4aXQgPSB0cnVlOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICBtQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnJlc2V0KCkKLXsKLSAgICBMT0dWKCJyZXNldFxuIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICByZXR1cm4gcmVzZXRfbm9zeW5jKCk7Ci19Ci0KLS8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnJlc2V0X25vc3luYygpCi17Ci0gICAgLy8gY2xvc2UgZmlsZQotICAgIGlmIChtRmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIG92X2NsZWFyKCZtVm9yYmlzRmlsZSk7IC8vIHRoaXMgYWxzbyBjbG9zZXMgdGhlIEZJTEUKLSAgICAgICAgaWYgKG1GaWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIExPR1YoIk9PUFMhIFZvcmJpcyBkaWRuJ3QgY2xvc2UgdGhlIGZpbGUiKTsKLSAgICAgICAgICAgIGZjbG9zZShtRmlsZSk7Ci0gICAgICAgICAgICBtRmlsZSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVN0YXRlID0gU1RBVEVfRVJST1I7Ci0KLSAgICBtUGxheVRpbWUgPSAtMTsKLSAgICBtRHVyYXRpb24gPSAtMTsKLSAgICBtTG9vcCA9IGZhbHNlOwotICAgIG1BbmRyb2lkTG9vcCA9IGZhbHNlOwotICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICBtUmVuZGVyID0gZmFsc2U7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWb3JiaXNQbGF5ZXI6OnNldExvb3BpbmcoaW50IGxvb3ApCi17Ci0gICAgTE9HVigic2V0TG9vcGluZ1xuIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBtTG9vcCA9IChsb29wICE9IDApOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgVm9yYmlzUGxheWVyOjpjcmVhdGVPdXRwdXRUcmFjaygpIHsKLSAgICAvLyBvcGVuIGF1ZGlvIHRyYWNrCi0gICAgdm9yYmlzX2luZm8gKnZpID0gb3ZfaW5mbygmbVZvcmJpc0ZpbGUsIC0xKTsKLQotICAgIExPR1YoIkNyZWF0ZSBBdWRpb1RyYWNrIG9iamVjdDogcmF0ZT0lbGQsIGNoYW5uZWxzPSVkXG4iLAotICAgICAgICAgICAgdmktPnJhdGUsIHZpLT5jaGFubmVscyk7Ci0gICAgaWYgKG1BdWRpb1NpbmstPm9wZW4odmktPnJhdGUsIHZpLT5jaGFubmVscywgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5UKSAhPSBOT19FUlJPUikgewotICAgICAgICBMT0dFKCJtQXVkaW9TaW5rIG9wZW4gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9PUEVOX0ZBSUxFRDsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgVm9yYmlzUGxheWVyOjpyZW5kZXJUaHJlYWQodm9pZCogcCkgewotICAgIHJldHVybiAoKFZvcmJpc1BsYXllciopcCktPnJlbmRlcigpOwotfQotCi0jZGVmaW5lIEFVRElPQlVGRkVSX1NJWkUgNDA5NgotCi1pbnQgVm9yYmlzUGxheWVyOjpyZW5kZXIoKSB7Ci0gICAgaW50IHJlc3VsdCA9IC0xOwotICAgIGludCB0ZW1wOwotICAgIGludCBjdXJyZW50X3NlY3Rpb24gPSAwOwotICAgIGJvb2wgYXVkaW9TdGFydGVkID0gZmFsc2U7Ci0KLSAgICBMT0dWKCJyZW5kZXJcbiIpOwotCi0gICAgLy8gYWxsb2NhdGUgcmVuZGVyIGJ1ZmZlcgotICAgIG1BdWRpb0J1ZmZlciA9IG5ldyBjaGFyW0FVRElPQlVGRkVSX1NJWkVdOwotICAgIGlmICghbUF1ZGlvQnVmZmVyKSB7Ci0gICAgICAgIExPR0UoIm1BdWRpb0J1ZmZlciBhbGxvY2F0ZSBmYWlsZWRcbiIpOwotICAgICAgICBnb3RvIHRocmVhZEV4aXQ7Ci0gICAgfQotCi0gICAgLy8gbGV0IG1haW4gdGhyZWFkIGtub3cgd2UncmUgcmVhZHkKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIG1SZW5kZXJUaWQgPSBteVRpZCgpOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGxvbmcgbnVtcmVhZCA9IDA7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0KLSAgICAgICAgICAgIC8vIHBhdXNpbmc/Ci0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5yZWFkeSgpKSBtQXVkaW9TaW5rLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgIG1SZW5kZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBhdWRpb1N0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbm90aGluZyB0byByZW5kZXIsIHdhaXQgZm9yIGNsaWVudCB0aHJlYWQgdG8gd2FrZSB1cyB1cAotICAgICAgICAgICAgaWYgKCFtRXhpdCAmJiAhbVJlbmRlcikgewotICAgICAgICAgICAgICAgIExPR1YoInJlbmRlciAtIHNpZ25hbCB3YWl0XG4iKTsKLSAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgICAgICAgICBMT0dWKCJyZW5kZXIgLSBzaWduYWwgcngnZFxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUV4aXQpIGJyZWFrOwotCi0gICAgICAgICAgICAvLyBXZSBjb3VsZCBlbmQgdXAgaGVyZSBpZiBzdGFydCgpIGlzIGNhbGxlZCwgYW5kIGJlZm9yZSB3ZSBnZXQgYQotICAgICAgICAgICAgLy8gY2hhbmNlIHRvIHJ1biwgdGhlIGFwcCBjYWxscyBzdG9wKCkgb3IgcmVzZXQoKS4gUmUtY2hlY2sgcmVuZGVyCi0gICAgICAgICAgICAvLyBmbGFnIHNvIHdlIGRvbid0IHRyeSB0byByZW5kZXIgaW4gc3RvcCBvciByZXNldCBzdGF0ZS4KLSAgICAgICAgICAgIGlmICghbVJlbmRlcikgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIHJlbmRlciB2b3JiaXMgZGF0YSBpbnRvIHRoZSBpbnB1dCBidWZmZXIKLSAgICAgICAgICAgIG51bXJlYWQgPSBvdl9yZWFkKCZtVm9yYmlzRmlsZSwgbUF1ZGlvQnVmZmVyLCBBVURJT0JVRkZFUl9TSVpFLCAmY3VycmVudF9zZWN0aW9uKTsKLSAgICAgICAgICAgIGlmIChudW1yZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBlbmQgb2YgZmlsZSwgZG8gd2UgbmVlZCB0byBsb29wPwotICAgICAgICAgICAgICAgIC8vIC4uLgotICAgICAgICAgICAgICAgIGlmIChtTG9vcCB8fCBtQW5kcm9pZExvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgb3ZfdGltZV9zZWVrKCZtVm9yYmlzRmlsZSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc2VjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG51bXJlYWQgPSBvdl9yZWFkKCZtVm9yYmlzRmlsZSwgbUF1ZGlvQnVmZmVyLCBBVURJT0JVRkZFUl9TSVpFLCAmY3VycmVudF9zZWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtUmVuZGVyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgZW5kcG9zID0gb3ZfdGltZV90ZWxsKCZtVm9yYmlzRmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTE9HVigic2VuZCBNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOwotICAgICAgICAgICAgICAgICAgICBzZW5kRXZlbnQoTUVESUFfUExBWUJBQ0tfQ09NUExFVEUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgd2UncmUgc3RhcnRlZCBhZ2FpbgotICAgICAgICAgICAgICAgICAgICBMT0dWKCJwbGF5YmFjayBjb21wbGV0ZSAtIHdhaXQgZm9yIHNpZ25hbCIpOwotICAgICAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobU11dGV4KTsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigicGxheWJhY2sgY29tcGxldGUgLSBzaWduYWwgcngnZCIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUV4aXQpIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlJ3JlIHN0aWxsIGF0IHRoZSBlbmQsIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfT1BFTikgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN1cnBvcyA9IG92X3RpbWVfdGVsbCgmbVZvcmJpc0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnBvcyA9PSBlbmRwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdl90aW1lX3NlZWsoJm1Wb3JiaXNGaWxlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfc2VjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1yZWFkID0gb3ZfcmVhZCgmbVZvcmJpc0ZpbGUsIG1BdWRpb0J1ZmZlciwgQVVESU9CVUZGRVJfU0laRSwgJmN1cnJlbnRfc2VjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb2RlYyByZXR1cm5zIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvcgotICAgICAgICBpZiAobnVtcmVhZCA8IDApIHsKLSAgICAgICAgICAgIExPR0UoIkVycm9yIGluIFZvcmJpcyBkZWNvZGVyIik7Ci0gICAgICAgICAgICBzZW5kRXZlbnQoTUVESUFfRVJST1IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjcmVhdGUgYXVkaW8gb3V0cHV0IHRyYWNrIGlmIG5lY2Vzc2FyeQotICAgICAgICBpZiAoIW1BdWRpb1NpbmstPnJlYWR5KCkpIHsKLSAgICAgICAgICAgIExPR1YoInJlbmRlciAtIGNyZWF0ZSBvdXRwdXQgdHJhY2tcbiIpOwotICAgICAgICAgICAgaWYgKGNyZWF0ZU91dHB1dFRyYWNrKCkgIT0gTk9fRVJST1IpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXcml0ZSBkYXRhIHRvIHRoZSBhdWRpbyBoYXJkd2FyZQotICAgICAgICBpZiAoKHRlbXAgPSBtQXVkaW9TaW5rLT53cml0ZShtQXVkaW9CdWZmZXIsIG51bXJlYWQpKSA8IDApIHsKLSAgICAgICAgICAgIExPR0UoIkVycm9yIGluIHdyaXRpbmc6JWQiLHRlbXApOwotICAgICAgICAgICAgcmVzdWx0ID0gdGVtcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3RhcnQgYXVkaW8gb3V0cHV0IGlmIG5lY2Vzc2FyeQotICAgICAgICBpZiAoIWF1ZGlvU3RhcnRlZCAmJiAhbVBhdXNlZCAmJiAhbUV4aXQpIHsKLSAgICAgICAgICAgIExPR1YoInJlbmRlciAtIHN0YXJ0aW5nIGF1ZGlvXG4iKTsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICBhdWRpb1N0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi10aHJlYWRFeGl0OgotICAgIG1BdWRpb1NpbmsuY2xlYXIoKTsKLSAgICBpZiAobUF1ZGlvQnVmZmVyKSB7Ci0gICAgICAgIGRlbGV0ZSBbXSBtQXVkaW9CdWZmZXI7Ci0gICAgICAgIG1BdWRpb0J1ZmZlciA9IE5VTEw7Ci0gICAgfQotCi0gICAgLy8gdGVsbCBtYWluIHRocmVhZCBnb29kYnllCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKLSAgICBtUmVuZGVyVGlkID0gLTE7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi19IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc1BsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZvcmJpc1BsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTUwODM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Wb3JiaXNQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9WT1JCSVNQTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX1ZPUkJJU1BMQVlFUl9ICi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLQotI2luY2x1ZGUgIml2b3JiaXNjb2RlYy5oIgotI2luY2x1ZGUgIml2b3JiaXNmaWxlLmgiCi0KLSNkZWZpbmUgQU5EUk9JRF9MT09QX1RBRyAiQU5EUk9JRF9MT09QIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFZvcmJpc1BsYXllciA6IHB1YmxpYyBNZWRpYVBsYXllckludGVyZmFjZSB7Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBWb3JiaXNQbGF5ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH5Wb3JiaXNQbGF5ZXIoKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlKSB7IHJldHVybiBVTktOT1dOX0VSUk9SOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZWVrVG8oaW50IG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzUGxheWluZygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludCogbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXREdXJhdGlvbihpbnQqIG1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZSgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVzZXQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgIHZpcnR1YWwgcGxheWVyX3R5cGUgcGxheWVyVHlwZSgpIHsgcmV0dXJuIFZPUkJJU19QTEFZRVI7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHtyZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047fQotCi1wcml2YXRlOgotICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0ZGF0YXNvdXJjZShjb25zdCBjaGFyICpwYXRoLCBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICByZXNldF9ub3N5bmMoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZU91dHB1dFRyYWNrKCk7Ci0gICAgc3RhdGljICBpbnQgICAgICAgICByZW5kZXJUaHJlYWQodm9pZCopOwotICAgICAgICAgICAgaW50ICAgICAgICAgcmVuZGVyKCk7Ci0KLSAgICBzdGF0aWMgIHNpemVfdCAgICAgIHZwX2ZyZWFkKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsIHZvaWQgKik7Ci0gICAgc3RhdGljICBpbnQgICAgICAgICB2cF9mc2Vlayh2b2lkICosIG9nZ19pbnQ2NF90LCBpbnQpOwotICAgIHN0YXRpYyAgaW50ICAgICAgICAgdnBfZmNsb3NlKHZvaWQgKik7Ci0gICAgc3RhdGljICBsb25nICAgICAgICB2cF9mdGVsbCh2b2lkICopOwotCi0gICAgTXV0ZXggICAgICAgICAgICAgICBtTXV0ZXg7Ci0gICAgQ29uZGl0aW9uICAgICAgICAgICBtQ29uZGl0aW9uOwotICAgIEZJTEUqICAgICAgICAgICAgICAgbUZpbGU7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICBtT2Zmc2V0OwotICAgIGludDY0X3QgICAgICAgICAgICAgbUxlbmd0aDsKLSAgICBPZ2dWb3JiaXNfRmlsZSAgICAgIG1Wb3JiaXNGaWxlOwotICAgIGNoYXIqICAgICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOwotICAgIGludCAgICAgICAgICAgICAgICAgbVBsYXlUaW1lOwotICAgIGludCAgICAgICAgICAgICAgICAgbUR1cmF0aW9uOwotICAgIHN0YXR1c190ICAgICAgICAgICAgbVN0YXRlOwotICAgIGludCAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGU7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBtTG9vcDsKLSAgICBib29sICAgICAgICAgICAgICAgIG1BbmRyb2lkTG9vcDsKLSAgICB2b2xhdGlsZSBib29sICAgICAgIG1FeGl0OwotICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsKLSAgICB2b2xhdGlsZSBib29sICAgICAgIG1SZW5kZXI7Ci0gICAgcGlkX3QgICAgICAgICAgICAgICBtUmVuZGVyVGlkOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVk9SQklTUExBWUVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJFeHRyYWN0b3IuY3BwCmluZGV4IDBmZWE3MmUuLjFiMDU1MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SRXh0cmFjdG9yLmNwcApAQCAtODcsNyArODcsNyBAQAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSB7CiAgICAgU3RyaW5nOCBtaW1lVHlwZTsKICAgICBmbG9hdCBjb25maWRlbmNlOwotICAgIGlmICghU25pZmZBTVIobURhdGFTb3VyY2UsICZtaW1lVHlwZSwgJmNvbmZpZGVuY2UpKSB7CisgICAgaWYgKCFTbmlmZkFNUihtRGF0YVNvdXJjZSwgJm1pbWVUeXBlLCAmY29uZmlkZW5jZSwgTlVMTCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjEyLDcgKzIxMiw4IEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGludDY0X3Qgc2Vla0ZyYW1lID0gc2Vla1RpbWVVcyAvIDIwMDAwbGw7ICAvLyAyMG1zIHBlciBmcmFtZS4KICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiAyMDAwMGxsOwogICAgICAgICBtT2Zmc2V0ID0gc2Vla0ZyYW1lICogbUZyYW1lU2l6ZSArIChtSXNXaWRlID8gOSA6IDYpOwpAQCAtMjYyLDYgKzI2Myw3IEBACiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemUpOwogICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCkBAIC0yNzQsNyArMjc2LDggQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgU25pZmZBTVIoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCmluZGV4IGJmNDQyNGIuLjcxZDQ4YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcApAQCAtMjIsMTkgKzIyLDI0IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEFNUldyaXRlcjo6QU1SV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSwKICAgICAgIG1Jbml0Q2hlY2sobUZpbGUgIT0gTlVMTCA/IE9LIDogTk9fSU5JVCksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUmVzdW1lZChmYWxzZSkgewogfQogCiBBTVJXcml0ZXI6OkFNUldyaXRlcihpbnQgZmQpCiAgICAgOiBtRmlsZShmZG9wZW4oZmQsICJ3YiIpKSwKICAgICAgIG1Jbml0Q2hlY2sobUZpbGUgIT0gTlVMTCA/IE9LIDogTk9fSU5JVCksCi0gICAgICBtU3RhcnRlZChmYWxzZSkgeworICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUmVzdW1lZChmYWxzZSkgewogfQogCiBBTVJXcml0ZXI6On5BTVJXcml0ZXIoKSB7CkBAIC01Myw4ICs1OCw2IEBACiB9CiAKIHN0YXR1c190IEFNUldyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOwogICAgIH0KQEAgLTk0LDE3ICs5NywyNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQU1SV3JpdGVyOjpzdGFydCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCitzdGF0dXNfdCBBTVJXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKICAgICB9CiAKLSAgICBpZiAobVN0YXJ0ZWQgfHwgbVNvdXJjZSA9PSBOVUxMKSB7CisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAobVN0YXJ0ZWQgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBzdGFydGVkLCBkb2VzIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xMjYsNDcgKzEzNiwxMDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQU1SV3JpdGVyOjpzdG9wKCkgewotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRG9uZSA9IHRydWU7CitzdGF0dXNfdCBBTVJXcml0ZXI6OnBhdXNlKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFNUldyaXRlcjo6c3RvcCgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtRG9uZSA9IHRydWU7CiAKICAgICB2b2lkICpkdW1teTsKICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJmR1bW15KTsKIAotICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBzdGF0dXNfdCBlcnIgPSAoc3RhdHVzX3QpIGR1bW15OworICAgIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBpZiAoZXJyID09IE9LICYmCisgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXJyOworfQorCitib29sIEFNUldyaXRlcjo6ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtRXN0aW1hdGVkU2l6ZUJ5dGVzID49IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXM7Cit9CisKK2Jvb2wgQU1SV3JpdGVyOjpleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUVzdGltYXRlZER1cmF0aW9uVXMgPj0gbU1heEZpbGVEdXJhdGlvbkxpbWl0VXM7CiB9CiAKIC8vIHN0YXRpYwogdm9pZCAqQU1SV3JpdGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8QU1SV3JpdGVyICo+KG1lKS0+dGhyZWFkRnVuYygpOwotCi0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICh2b2lkICopIHN0YXRpY19jYXN0PEFNUldyaXRlciAqPihtZSktPnRocmVhZEZ1bmMoKTsKIH0KIAotdm9pZCBBTVJXcml0ZXI6OnRocmVhZEZ1bmMoKSB7Ci0gICAgZm9yICg7OykgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworc3RhdHVzX3QgQU1SV3JpdGVyOjp0aHJlYWRGdW5jKCkgeworICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gMDsKKyAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzID0gMDsKKyAgICBib29sIHN0b3BwZWRQcmVtYXR1cmVseSA9IHRydWU7CisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgbWF4VGltZXN0YW1wVXMgPSAwOworICAgIHN0YXR1c190IGVyciA9IE9LOwogCi0gICAgICAgIGlmIChtRG9uZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQorICAgIHdoaWxlICghbURvbmUpIHsKICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gKHRpbWVzdGFtcFVzIC0gbWF4VGltZXN0YW1wVXMgLSAyMDAwMCk7CisgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgTE9HVigidGltZSBzdGFtcDogJWxsZCwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlbGxkIiwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbWF4VGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIG1heFRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9EVVJBVElPTl9SRUFDSEVELCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIHNzaXplX3QgbiA9IGZ3cml0ZSgKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAxLApAQCAtMTgwLDE2ICsyNTEsMzAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gWFhYOiBIb3cgdG8gdGVsbCBpdCBpcyBzdG9wcGVkIHByZW1hdHVyZWx5PworICAgICAgICBpZiAoc3RvcHBlZFByZW1hdHVyZWx5KSB7CisgICAgICAgICAgICBzdG9wcGVkUHJlbWF0dXJlbHkgPSBmYWxzZTsKKyAgICAgICAgfQorCiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogICAgIH0KIAotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKHN0b3BwZWRQcmVtYXR1cmVseSkgeworICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19DT01QTEVUSU9OX1NUQVRVUywgVU5LTk9XTl9FUlJPUik7CisgICAgfQorCisgICAgZmZsdXNoKG1GaWxlKTsKKyAgICBmY2xvc2UobUZpbGUpOworICAgIG1GaWxlID0gTlVMTDsKICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogYm9vbCBBTVJXcml0ZXI6OnJlYWNoZWRFT1MoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVJlYWNoZWRFT1M7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCmluZGV4IDgxZjk5NWIuLjg2ZmE2NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMSw1NiArMSw1MyBAQAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgIFwKLSAgICAgICAgRVNEUy5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE1lZGlhQnVmZmVyLmNwcCAgICAgICAgICAgXAotICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwLmNwcCAgICAgIFwKLSAgICAgICAgTWVkaWFEZWZzLmNwcCAgICAgICAgICAgICBcCi0gICAgICAgIE1lZGlhU291cmNlLmNwcCAgICAgICAgICAgXAotICAgICAgICBNZXRhRGF0YS5jcHAgICAgICAgICAgICAgIFwKLSAgICAgICAgT01YQ29kZWMuY3BwICAgICAgICAgICAgICBcCi0gICAgICAgIFV0aWxzLmNwcCAgICAgICAgICAgICAgICAgXAotICAgICAgICBPTVhDbGllbnQuY3BwCitpbmNsdWRlIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tawogCi1pZmVxICgkKEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVCksdHJ1ZSkKLQotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQU1SRXh0cmFjdG9yLmNwcCAgICAgICAgICBcCi0gICAgICAgIEFNUldyaXRlci5jcHAgICAgICAgICAgICAgXAotICAgICAgICBBdWRpb1BsYXllci5jcHAgICAgICAgICAgIFwKLSAgICAgICAgQXVkaW9Tb3VyY2UuY3BwICAgICAgICAgICBcCi0gICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgXAotICAgICAgICBDYWNoaW5nRGF0YVNvdXJjZS5jcHAgICAgIFwKLSAgICAgICAgQ2FtZXJhU291cmNlLmNwcCAgICAgICAgICBcCi0gICAgICAgIERhdGFTb3VyY2UuY3BwICAgICAgICAgICAgXAotICAgICAgICBGaWxlU291cmNlLmNwcCAgICAgICAgICAgIFwKLSAgICAgICAgSFRUUERhdGFTb3VyY2UuY3BwICAgICAgICBcCi0gICAgICAgIEhUVFBTdHJlYW0uY3BwICAgICAgICAgICAgXAotICAgICAgICBKUEVHU291cmNlLmNwcCAgICAgICAgICAgIFwKLSAgICAgICAgTVAzRXh0cmFjdG9yLmNwcCAgICAgICAgICBcCi0gICAgICAgIE1QRUc0RXh0cmFjdG9yLmNwcCAgICAgICAgXAotICAgICAgICBNUEVHNFdyaXRlci5jcHAgICAgICAgICAgIFwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICBcCi0gICAgICAgIE9nZ0V4dHJhY3Rvci5jcHAgICAgICAgICAgXAotICAgICAgICBQcmVmZXRjaGVyLmNwcCAgICAgICAgICAgIFwKLSAgICAgICAgU2FtcGxlSXRlcmF0b3IuY3BwICAgICAgICBcCi0gICAgICAgIFNhbXBsZVRhYmxlLmNwcCAgICAgICAgICAgXAotICAgICAgICBTaG91dGNhc3RTb3VyY2UuY3BwICAgICAgIFwKLSAgICAgICAgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIFwKLSAgICAgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgXAotICAgICAgICBUaW1lU291cmNlLmNwcCAgICAgICAgICAgIFwKLSAgICAgICAgVGltZWRFdmVudFF1ZXVlLmNwcCAgICAgICBcCi0gICAgICAgIFdBVkV4dHJhY3Rvci5jcHAgICAgICAgICAgXAorTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTVJFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTVJXcml0ZXIuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBdWRpb1BsYXllci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBdWRpb1NvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBd2Vzb21lUGxheWVyLmNwcCAgICAgICAgICAgICAgICAgXAorICAgICAgICBDYW1lcmFTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICBEYXRhU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBFU0RTLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGaWxlU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBIVFRQU3RyZWFtLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBKUEVHU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNUDNFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNUEVHNEV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNUEVHNFdyaXRlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYUJ1ZmZlci5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwLmNwcCAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYURlZnMuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZWRpYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNZXRhRGF0YS5jcHAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBOdUNhY2hlZFNvdXJjZTIuY3BwICAgICAgICAgICAgICAgXAorICAgICAgICBOdUhUVFBEYXRhU291cmNlLmNwcCAgICAgICAgICAgICAgXAorICAgICAgICBPTVhDbGllbnQuY3BwICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPTVhDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPZ2dFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTYW1wbGVJdGVyYXRvci5jcHAgICAgICAgICAgICAgICAgXAorICAgICAgICBTYW1wbGVUYWJsZS5jcHAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTaG91dGNhc3RTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAorICAgICAgICBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgICAgICAgXAorICAgICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCAgXAorICAgICAgICBUaHJvdHRsZWRTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAorICAgICAgICBUaW1lU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUaW1lZEV2ZW50UXVldWUuY3BwICAgICAgICAgICAgICAgXAorICAgICAgICBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXQVZFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdmNfdXRpbHMuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBzdHJpbmcuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtREJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVAotZW5kaWYKLQogTE9DQUxfQ19JTkNMVURFUzo9IFwKIAkkKEpOSV9IX0lOQ0xVREUpIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKICAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2FuZHJvaWQgXAotICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbworICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvdHJlbW9sbyBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGliYmluZGVyICAgICAgICAgXApAQCAtNjUsMjQgKzYyLDMxIEBACiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y2RlYyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y2VuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXAzZGVjIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfdm9yYmlzZGVjCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3ZvcmJpc2RlYyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfdnB4ZGVjIFwKKyAgICAgICAgbGlidnB4IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfbXBlZzJ0cyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfcnRzcCBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2lkMyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2c3MTFkZWMgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfYXZjX2NvbW1vbgotCi1pZmVxICgkKEJVSUxEX1dJVEhfRlVMTF9TVEFHRUZSSUdIVCksdHJ1ZSkKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2lkMwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y19jb21tb24gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbgogCiBpZmVxICgkKFRBUkdFVF9PUyktJChUQVJHRVRfU0lNVUxBVE9SKSxsaW51eC10cnVlKQpAQCAtOTUsOCArOTksNiBAQAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAogZW5kaWYKIAotZW5kaWYKLQogaWZlcSAoJChUQVJHRVRfT1MpLSQoVEFSR0VUX1NJTVVMQVRPUiksbGludXgtdHJ1ZSkKICAgICAgICAgTE9DQUxfTERMSUJTICs9IC1scHRocmVhZAogZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAppbmRleCBiY2YyNDYzLi5jMjdjZmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTQxLDYgKzQyLDkgQEAKICAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSwKICAgICAgIG1GaW5hbFN0YXR1cyhPSyksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtSXNGaXJzdEJ1ZmZlcihmYWxzZSksCisgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQoT0spLAorICAgICAgbUZpcnN0QnVmZmVyKE5VTEwpLAogICAgICAgbUF1ZGlvU2luayhhdWRpb1NpbmspIHsKIH0KIApAQCAtNjgsNiArNzIsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFdlIGFsbG93IGFuIG9wdGlvbmFsIElORk9fRk9STUFUX0NIQU5HRUQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisgICAgLy8gb2YgcGxheWJhY2ssIGlmIHRoZXJlIGlzIG9uZSwgZ2V0Rm9ybWF0IGJlbG93IHdpbGwgcmV0cmlldmUgdGhlCisgICAgLy8gdXBkYXRlZCBmb3JtYXQsIGlmIHRoZXJlIGlzbid0LCB3ZSdsbCBzdGFzaCBhd2F5IHRoZSB2YWxpZCBidWZmZXIKKyAgICAvLyBvZiBkYXRhIHRvIGJlIHVzZWQgb24gdGhlIGZpcnN0IGF1ZGlvIGNhbGxiYWNrLgorCisgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOworCisgICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gbVNvdXJjZS0+cmVhZCgmbUZpcnN0QnVmZmVyKTsKKyAgICBpZiAobUZpcnN0QnVmZmVyUmVzdWx0ID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgTE9HVigiSU5GT19GT1JNQVRfQ0hBTkdFRCEhISIpOworCisgICAgICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gT0s7CisgICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSB0cnVlOworICAgIH0KKwogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIGJvb2wgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CkBAIC04Nyw3ICsxMDksMTQgQEAKICAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKICAgICAgICAgICAgICAgICAmQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrLCB0aGlzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQpAQCAtMTA4LDcgKzEzNywxNCBAQAogICAgICAgICAgICAgZGVsZXRlIG1BdWRpb1RyYWNrOwogICAgICAgICAgICAgbUF1ZGlvVHJhY2sgPSBOVUxMOwogCi0gICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC0xNTksNiArMTk1LDEyIEBACiAKICAgICAvLyBNYWtlIHN1cmUgdG8gcmVsZWFzZSBhbnkgYnVmZmVyIHdlIGhvbGQgb250byBzbyB0aGF0IHRoZQogICAgIC8vIHNvdXJjZSBpcyBhYmxlIHRvIHN0b3AoKS4KKworICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBtRmlyc3RCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgTE9HVigiQXVkaW9QbGF5ZXIgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKIApAQCAtMjQzLDYgKzI4NSwxNCBAQAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgICAgICAgICAgaWYgKG1TZWVraW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc0ZpcnN0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CkBAIC0yNTUsNyArMzA1LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1JbnB1dEJ1ZmZlciwgJm9wdGlvbnMpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworCisgICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBlcnIgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZvcHRpb25zKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQ0hFQ0soKGVyciA9PSBPSyAmJiBtSW5wdXRCdWZmZXIgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICB8fCAoZXJyICE9IE9LICYmIG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKaW5kZXggZWRhYmFmOS4uOGQ3YWRhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Tb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KQEAgLTIxLDE2ICsyNSwzMyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9Tb3VyY2U6OkF1ZGlvU291cmNlKAogICAgICAgICBpbnQgaW5wdXRTb3VyY2UsIHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxzKQotICAgIDogbVJlY29yZChuZXcgQXVkaW9SZWNvcmQoCi0gICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklULCBjaGFubmVscykpLAotICAgICAgbUluaXRDaGVjayhtUmVjb3JkLT5pbml0Q2hlY2soKSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgOiBtU3RhcnRlZChmYWxzZSksCisgICAgICBtQ29sbGVjdFN0YXRzKGZhbHNlKSwKKyAgICAgIG1QcmV2U2FtcGxlVGltZVVzKDApLAorICAgICAgbVRvdGFsTG9zdEZyYW1lcygwKSwKKyAgICAgIG1QcmV2TG9zdEJ5dGVzKDApLAogICAgICAgbUdyb3VwKE5VTEwpIHsKKworICAgIExPR1YoInNhbXBsZVJhdGU6ICVkLCBjaGFubmVsczogJWQiLCBzYW1wbGVSYXRlLCBjaGFubmVscyk7CisgICAgQ0hFQ0soY2hhbm5lbHMgPT0gMSB8fCBjaGFubmVscyA9PSAyKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IEF1ZGlvUmVjb3JkOjpSRUNPUkRfQUdDX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZDo6UkVDT1JEX05TX0VOQUJMRSAgfAorICAgICAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmQ6OlJFQ09SRF9JSVJfRU5BQkxFOworCisgICAgbVJlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKKyAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgY2hhbm5lbHMgPiAxPyBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9JTl9TVEVSRU86IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8sCisgICAgICAgICAgICAgICAgNCAqIGtNYXhCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpLCAvKiBFbmFibGUgcGluZy1wb25nIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgICAgICBmbGFncyk7CisKKyAgICBtSW5pdENoZWNrID0gbVJlY29yZC0+aW5pdENoZWNrKCk7CiB9CiAKIEF1ZGlvU291cmNlOjp+QXVkaW9Tb3VyY2UoKSB7CkBAIC01MSw2ICs3MiwyNCBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQucmVjb3JkLXN0YXRzIiwgdmFsdWUsIE5VTEwpCisgICAgICAgICYmICghc3RyY21wKHZhbHVlLCAiMSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKSkgeworICAgICAgICBtQ29sbGVjdFN0YXRzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtVHJhY2tNYXhBbXBsaXR1ZGUgPSBmYWxzZTsKKyAgICBtTWF4QW1wbGl0dWRlID0gMDsKKyAgICBtSW5pdGlhbFJlYWRUaW1lVXMgPSAwOworICAgIG1TdGFydFRpbWVVcyA9IDA7CisgICAgaW50NjRfdCBzdGFydFRpbWVVczsKKyAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmc3RhcnRUaW1lVXMpKSB7CisgICAgICAgIG1TdGFydFRpbWVVcyA9IHN0YXJ0VGltZVVzOworICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBtUmVjb3JkLT5zdGFydCgpOwogCiAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNjgsNiArMTA3LDEwIEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKwogICAgIG1SZWNvcmQtPnN0b3AoKTsKIAogICAgIGRlbGV0ZSBtR3JvdXA7CkBAIC03NSwxMCArMTE4LDE5IEBACiAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCisgICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKKyAgICAgICAgTE9HSSgiVG90YWwgbG9zdCBhdWRpbyBmcmFtZXM6ICVsbGQiLAorICAgICAgICAgICAgbVRvdGFsTG9zdEZyYW1lcyArIChtUHJldkxvc3RCeXRlcyA+PiAxKSk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCiBzcDxNZXRhRGF0YT4gQXVkaW9Tb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVJlY29yZC0+Z2V0U2FtcGxlUmF0ZSgpKTsKQEAgLTg4LDM1ICsxNDAsMjIyIEBACiAgICAgcmV0dXJuIG1ldGE7CiB9CiAKKy8qCisgKiBSZXR1cm5zIC0xIGlmIGZyYW1lIHNraXBwaW5nIHJlcXVlc3QgaXMgdG9vIGxvbmcuCisgKiBSZXR1cm5zICAwIGlmIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2tpcCBmcmFtZXMuCisgKiBSZXR1cm5zICAxIGlmIHdlIG5lZWQgdG8gc2tpcCBmcmFtZXMuCisgKi8KK3N0YXRpYyBpbnQgc2tpcEZyYW1lKGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgaW50NjRfdCBza2lwRnJhbWVVczsKKyAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMtPmdldFNraXBGcmFtZSgmc2tpcEZyYW1lVXMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChza2lwRnJhbWVVcyA8PSB0aW1lc3RhbXBVcykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBTYWZlIGd1YXJkIGFnYWluc3QgdGhlIGFidXNlIG9mIHRoZSBrU2tpcEZyYW1lX09wdGlvbi4KKyAgICBpZiAoc2tpcEZyYW1lVXMgLSB0aW1lc3RhbXBVcyA+PSAxRTYpIHsKKyAgICAgICAgTE9HRSgiRnJhbWUgc2tpcHBpbmcgcmVxdWVzdGVkIGlzIHdheSB0b28gbG9uZzogJWxsZCB1cyIsCisgICAgICAgICAgICBza2lwRnJhbWVVcyAtIHRpbWVzdGFtcFVzKTsKKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTE9HVigic2tpcEZyYW1lOiAlbGxkIHVzID4gdGltZXN0YW1wOiAlbGxkIHVzIiwKKyAgICAgICAgc2tpcEZyYW1lVXMsIHRpbWVzdGFtcFVzKTsKKworICAgIHJldHVybiAxOworCit9CisKK3ZvaWQgQXVkaW9Tb3VyY2U6OnJhbXBWb2x1bWUoCisgICAgICAgIGludDMyX3Qgc3RhcnRGcmFtZSwgaW50MzJfdCByYW1wRHVyYXRpb25GcmFtZXMsCisgICAgICAgIHVpbnQ4X3QgKmRhdGEsICAgc2l6ZV90IGJ5dGVzKSB7CisKKyAgICBjb25zdCBpbnQzMl90IGtTaGlmdCA9IDE0OworICAgIGludDMyX3QgZml4ZWRNdWx0aXBsaWVyID0gKHN0YXJ0RnJhbWUgPDwga1NoaWZ0KSAvIHJhbXBEdXJhdGlvbkZyYW1lczsKKyAgICBjb25zdCBpbnQzMl90IG5DaGFubmVscyA9IG1SZWNvcmQtPmNoYW5uZWxDb3VudCgpOworICAgIGludDMyX3Qgc3RvcEZyYW1lID0gc3RhcnRGcmFtZSArIGJ5dGVzIC8gc2l6ZW9mKGludDE2X3QpOworICAgIGludDE2X3QgKmZyYW1lID0gKGludDE2X3QgKikgZGF0YTsKKyAgICBpZiAoc3RvcEZyYW1lID4gcmFtcER1cmF0aW9uRnJhbWVzKSB7CisgICAgICAgIHN0b3BGcmFtZSA9IHJhbXBEdXJhdGlvbkZyYW1lczsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RhcnRGcmFtZSA8IHN0b3BGcmFtZSkgeworICAgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsgIC8vIG1vbm8KKyAgICAgICAgICAgIGZyYW1lWzBdID0gKGZyYW1lWzBdICogZml4ZWRNdWx0aXBsaWVyKSA+PiBrU2hpZnQ7CisgICAgICAgICAgICArK2ZyYW1lOworICAgICAgICAgICAgKytzdGFydEZyYW1lOworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgIC8vIHN0ZXJlbworICAgICAgICAgICAgZnJhbWVbMF0gPSAoZnJhbWVbMF0gKiBmaXhlZE11bHRpcGxpZXIpID4+IGtTaGlmdDsKKyAgICAgICAgICAgIGZyYW1lWzFdID0gKGZyYW1lWzFdICogZml4ZWRNdWx0aXBsaWVyKSA+PiBrU2hpZnQ7CisgICAgICAgICAgICBmcmFtZSArPSAyOworICAgICAgICAgICAgc3RhcnRGcmFtZSArPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBtdWx0aXBsaWVyIGV2ZXJ5IDQgZnJhbWVzCisgICAgICAgIGlmICgoc3RhcnRGcmFtZSAmIDMpID09IDApIHsKKyAgICAgICAgICAgIGZpeGVkTXVsdGlwbGllciA9IChzdGFydEZyYW1lIDw8IGtTaGlmdCkgLyByYW1wRHVyYXRpb25GcmFtZXM7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvU291cmNlOjpyZWFkKAogICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGludDY0X3QgcmVhZFRpbWVVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwogICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlciksIE9LKTsKIAotICAgIHVpbnQzMl90IG51bUZyYW1lc1JlY29yZGVkOwotICAgIG1SZWNvcmQtPmdldFBvc2l0aW9uKCZudW1GcmFtZXNSZWNvcmRlZCk7CisgICAgaW50IGVyciA9IDA7CisgICAgd2hpbGUgKG1TdGFydGVkKSB7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgIGtLZXlUaW1lLAotICAgICAgICAgICAgKDEwMDAwMDBsbCAqIG51bUZyYW1lc1JlY29yZGVkKSAvIG1SZWNvcmQtPmdldFNhbXBsZVJhdGUoKQotICAgICAgICAgICAgLSBtUmVjb3JkLT5sYXRlbmN5KCkgKiAxMDAwKTsKKyAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUmVjb3JkZWQ7CisgICAgICAgIG1SZWNvcmQtPmdldFBvc2l0aW9uKCZudW1GcmFtZXNSZWNvcmRlZCk7CiAKLSAgICBzc2l6ZV90IG4gPSBtUmVjb3JkLT5yZWFkKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAKLSAgICBpZiAobiA8IDApIHsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGlmIChudW1GcmFtZXNSZWNvcmRlZCA9PSAwICYmIG1QcmV2U2FtcGxlVGltZVVzID09IDApIHsKKyAgICAgICAgICAgIG1Jbml0aWFsUmVhZFRpbWVVcyA9IHJlYWRUaW1lVXM7CisgICAgICAgICAgICAvLyBJbml0aWFsIGRlbGF5CisgICAgICAgICAgICBpZiAobVN0YXJ0VGltZVVzID4gMCkgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHJlYWRUaW1lVXMgLSBtU3RhcnRUaW1lVXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBsYXRlbmN5IGlzIGNvbnN0YW50LgorICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcyArPSBtUmVjb3JkLT5sYXRlbmN5KCkgKiAxMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVByZXZTYW1wbGVUaW1lVXMgPSBtU3RhcnRUaW1lVXM7CisgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gKHN0YXR1c190KW47CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtUmVjb3JkLT5nZXRTYW1wbGVSYXRlKCk7CisKKyAgICAgICAgLy8gSW5zZXJ0IG51bGwgZnJhbWVzIHdoZW4gbG9zdCBmcmFtZXMgYXJlIGRldGVjdGVkLgorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzID0gbVByZXZTYW1wbGVUaW1lVXM7CisgICAgICAgIHVpbnQzMl90IG51bUxvc3RCeXRlcyA9IG1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpIDw8IDE7CisgICAgICAgIG51bUxvc3RCeXRlcyArPSBtUHJldkxvc3RCeXRlczsKKyNpZiAwCisgICAgICAgIC8vIFNpbXVsYXRlIGxvc3QgZnJhbWVzCisgICAgICAgIG51bUxvc3RCeXRlcyA9ICgocmFuZCgpICogMS4wIC8gUkFORF9NQVgpKSAqIDIgKiBrTWF4QnVmZmVyU2l6ZTsKKyAgICAgICAgbnVtTG9zdEJ5dGVzICY9IDB4RkZGRkZGRkU7IC8vIEFsaWdubWVudCByZXF1aXJlbWVudAorCisgICAgICAgIC8vIFJlZHVjZSB0aGUgY2hhbmNlIHRvIGxvc2UKKyAgICAgICAgaWYgKHJhbmQoKSAqIDEuMCAvIFJBTkRfTUFYID49IDAuMDUpIHsKKyAgICAgICAgICAgIG51bUxvc3RCeXRlcyA9IDA7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAobnVtTG9zdEJ5dGVzID4gMCkgeworICAgICAgICAgICAgaWYgKG51bUxvc3RCeXRlcyA+IGtNYXhCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbVByZXZMb3N0Qnl0ZXMgPSBudW1Mb3N0Qnl0ZXMgLSBrTWF4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICBudW1Mb3N0Qnl0ZXMgPSBrTWF4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0tfRVEobnVtTG9zdEJ5dGVzICYgMSwgMCk7CisgICAgICAgICAgICB0aW1lc3RhbXBVcyArPSAoKDEwMDAwMDBMTCAqIChudW1Mb3N0Qnl0ZXMgPj4gMSkpICsKKyAgICAgICAgICAgICAgICAgICAgKHNhbXBsZVJhdGUgPj4gMSkpIC8gc2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgQ0hFQ0sodGltZXN0YW1wVXMgPiBtUHJldlNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBpZiAobUNvbGxlY3RTdGF0cykgeworICAgICAgICAgICAgICAgIG1Ub3RhbExvc3RGcmFtZXMgKz0gKG51bUxvc3RCeXRlcyA+PiAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZXJyID0gc2tpcEZyYW1lKHRpbWVzdGFtcFVzLCBvcHRpb25zKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChidWZmZXItPmRhdGEoKSwgMCwgbnVtTG9zdEJ5dGVzKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG51bUxvc3RCeXRlcyk7CisgICAgICAgICAgICBpZiAobnVtRnJhbWVzUmVjb3JkZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtU3RhcnRUaW1lVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgcmVhZFRpbWVVcyAtIG1Jbml0aWFsUmVhZFRpbWVVcyk7CisgICAgICAgICAgICBtUHJldlNhbXBsZVRpbWVVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1SZWNvcmQtPnJlYWQoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiAoc3RhdHVzX3QpbjsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgcmVjb3JkRHVyYXRpb25VcyA9ICgxMDAwMDAwTEwgKiBuID4+IDEpIC8gc2FtcGxlUmF0ZTsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0gcmVjb3JkRHVyYXRpb25VczsKKyAgICAgICAgaWYgKChlcnIgPSBza2lwRnJhbWUodGltZXN0YW1wVXMsIG9wdGlvbnMpKSA9PSAtMSkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVByZXZTYW1wbGVUaW1lVXMgLSBtU3RhcnRUaW1lVXMgPCBrQXV0b1JhbXBTdGFydFVzKSB7CisgICAgICAgICAgICAvLyBNdXRlIHRoZSBpbml0aWFsIHZpZGVvIHJlY29yZGluZyBzaWduYWwKKyAgICAgICAgICAgIG1lbXNldCgodWludDhfdCAqKSBidWZmZXItPmRhdGEoKSwgMCwgbik7CisgICAgICAgIH0gZWxzZSBpZiAobVByZXZTYW1wbGVUaW1lVXMgLSBtU3RhcnRUaW1lVXMgPCBrQXV0b1JhbXBTdGFydFVzICsga0F1dG9SYW1wRHVyYXRpb25VcykgeworICAgICAgICAgICAgaW50MzJfdCBhdXRvUmFtcER1cmF0aW9uRnJhbWVzID0KKyAgICAgICAgICAgICAgICAgICAgKGtBdXRvUmFtcER1cmF0aW9uVXMgKiBzYW1wbGVSYXRlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMOworCisgICAgICAgICAgICBpbnQzMl90IGF1dG9SYW1wU3RhcnRGcmFtZXMgPQorICAgICAgICAgICAgICAgICAgICAoa0F1dG9SYW1wU3RhcnRVcyAqIHNhbXBsZVJhdGUgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisKKyAgICAgICAgICAgIGludDMyX3QgbkZyYW1lcyA9IG51bUZyYW1lc1JlY29yZGVkIC0gYXV0b1JhbXBTdGFydEZyYW1lczsKKyAgICAgICAgICAgIHJhbXBWb2x1bWUobkZyYW1lcywgYXV0b1JhbXBEdXJhdGlvbkZyYW1lcywgKHVpbnQ4X3QgKikgYnVmZmVyLT5kYXRhKCksIG4pOworICAgICAgICB9CisgICAgICAgIGlmIChtVHJhY2tNYXhBbXBsaXR1ZGUpIHsKKyAgICAgICAgICAgIHRyYWNrTWF4QW1wbGl0dWRlKChpbnQxNl90ICopIGJ1ZmZlci0+ZGF0YSgpLCBuID4+IDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG51bUZyYW1lc1JlY29yZGVkID09IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlBbmNob3JUaW1lLCBtU3RhcnRUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIG1TdGFydFRpbWVVcyArIG1QcmV2U2FtcGxlVGltZVVzKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgcmVhZFRpbWVVcyAtIG1Jbml0aWFsUmVhZFRpbWVVcyk7CisgICAgICAgIENIRUNLKHRpbWVzdGFtcFVzID4gbVByZXZTYW1wbGVUaW1lVXMpOworICAgICAgICBtUHJldlNhbXBsZVRpbWVVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBMT0dWKCJpbml0aWFsIGRlbGF5OiAlbGxkLCBzYW1wbGUgcmF0ZTogJWQsIHRpbWVzdGFtcDogJWxsZCIsCisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzLCBzYW1wbGVSYXRlLCB0aW1lc3RhbXBVcyk7CisKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgbik7CisKKyAgICAgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwotCi0gICAgKm91dCA9IGJ1ZmZlcjsKLQogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBBdWRpb1NvdXJjZTo6dHJhY2tNYXhBbXBsaXR1ZGUoaW50MTZfdCAqZGF0YSwgaW50IG5TYW1wbGVzKSB7CisgICAgZm9yIChpbnQgaSA9IG5TYW1wbGVzOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGludDE2X3QgdmFsdWUgPSAqZGF0YSsrOworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICB2YWx1ZSA9IC12YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1heEFtcGxpdHVkZSA8IHZhbHVlKSB7CisgICAgICAgICAgICBtTWF4QW1wbGl0dWRlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludDE2X3QgQXVkaW9Tb3VyY2U6OmdldE1heEFtcGxpdHVkZSgpIHsKKyAgICAvLyBGaXJzdCBjYWxsIGFjdGl2YXRlcyB0aGUgdHJhY2tpbmcuCisgICAgaWYgKCFtVHJhY2tNYXhBbXBsaXR1ZGUpIHsKKyAgICAgICAgbVRyYWNrTWF4QW1wbGl0dWRlID0gdHJ1ZTsKKyAgICB9CisgICAgaW50MTZfdCB2YWx1ZSA9IG1NYXhBbXBsaXR1ZGU7CisgICAgbU1heEFtcGxpdHVkZSA9IDA7CisgICAgTE9HVigibWF4IGFtcGxpdHVkZSBzaW5jZSBsYXN0IGNhbGw6ICVkIiwgdmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggMjc0ZGFkOS4uODUwN2FmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTIwLDEzICsyMCwyMCBAQAogCiAjaW5jbHVkZSA8ZGxmY24uaD4KIAorI2luY2x1ZGUgImluY2x1ZGUvQVJUU1BDb250cm9sbGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9QcmVmZXRjaGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9MaXZlU291cmNlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oIgorCisjaW5jbHVkZSAiQVJUUFNlc3Npb24uaCIKKyNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIlVEUFB1c2hlci5oIgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KQEAgLTM5LDggKzQ2LDEzIEBACiAKICNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGludDY0X3Qga0xvd1dhdGVyTWFya1VzID0gMjAwMDAwMGxsOyAgLy8gMnNlY3MKK3N0YXRpYyBpbnQ2NF90IGtIaWdoV2F0ZXJNYXJrVXMgPSAxMDAwMDAwMGxsOyAgLy8gMTBzZWNzCisKIHN0cnVjdCBBd2Vzb21lRXZlbnQgOiBwdWJsaWMgVGltZWRFdmVudFF1ZXVlOjpFdmVudCB7CiAgICAgQXdlc29tZUV2ZW50KAogICAgICAgICAgICAgQXdlc29tZVBsYXllciAqcGxheWVyLApAQCAtMjYxLDYgKzI3MywyMCBAQAogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlKAogICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworI2lmIDAKKyAgICAvLyByZXR1cm4gc2V0RGF0YVNvdXJjZSgiaHR0cGxpdmU6Ly9xdGh0dHAuYXBwbGUuY29tLmVkZ2VzdWl0ZS5uZXQvMTAwOXFwZWlqcmZuL3NsLm0zdTgiKTsKKyAgICByZXR1cm4gc2V0RGF0YVNvdXJjZSgiaHR0cGxpdmU6Ly9xdGh0dHAuYXBwbGUuY29tLmVkZ2VzdWl0ZS5uZXQvMTAwOXFwZWlqcmZuLzA0NDAubTN1OCIpOworICAgIC8vIHJldHVybiBzZXREYXRhU291cmNlKCJodHRwbGl2ZTovL3F0aHR0cC5hcHBsZS5jb20uZWRnZXN1aXRlLm5ldC8xMDA5cXBlaWpyZm4vMDY0MC5tM3U4Iik7CisgICAgLy8gcmV0dXJuIHNldERhdGFTb3VyY2UoImh0dHBsaXZlOi8vcXRodHRwLmFwcGxlLmNvbS5lZGdlc3VpdGUubmV0LzEwMDlxcGVpanJmbi8xMjQwX3ZvZC5tM3U4Iik7CisgICAgLy8gcmV0dXJuIHNldERhdGFTb3VyY2UoImh0dHBsaXZlOi8vaXBob25lZDUuYWthbWFpLmNvbS5lZGdlc3VpdGUubmV0L21oYmFycm9uL25hc2F0di9uYXNhdHZfOTYubTN1OCIpOworICAgIC8vIHJldHVybiBzZXREYXRhU291cmNlKCJodHRwbGl2ZTovL2lwaG9uZWQ1LmFrYW1haS5jb20uZWRnZXN1aXRlLm5ldC9taGJhcnJvbi9uYXNhdHYvbmFzYXR2XzE1MDAubTN1OCIpOworICAgIC8vIHJldHVybiBzZXREYXRhU291cmNlKCJodHRwbGl2ZTovL2lwaG9uZS52aWRlby5oc24uY29tL2lQaG9uZV9oaWdoLm0zdTgiKTsKKyAgICAvLyByZXR1cm4gc2V0RGF0YVNvdXJjZSgiaHR0cGxpdmU6Ly9pcGhvbmVkNS5ha2FtYWkuY29tLmVkZ2VzdWl0ZS5uZXQvbWhiYXJyb24vaXBob25ld2ViY2FzdC93ZWJjYXN0MDkwMjA5X2FsbC93ZWJjYXN0MDkwMjA5X2FsbC5tM3U4Iik7CisgICAgLy8gcmV0dXJuIHNldERhdGFTb3VyY2UoImh0dHBsaXZlOi8vcXRodHRwLmFrYW1haS5jb20uZWRnZXN1aXRlLm5ldC9pcGhvbmVfZGVtby9WaWRlb19Db250ZW50L3VzYXQvdHRfMDYyMjA5X2lwaG9uZS9oaS9wcm9nX2luZGV4Lm0zdTgiKTsKKyAgICAvLyByZXR1cm4gc2V0RGF0YVNvdXJjZSgiaHR0cGxpdmU6Ly9xdGh0dHAuYWthbWFpLmNvbS5lZGdlc3VpdGUubmV0L2lwaG9uZV9kZW1vL1ZpZGVvX0NvbnRlbnQvdXNhdC90dF9nb29nbWFwcy9oaS9wcm9nX2luZGV4Lm0zdTgiKTsKKyAgICAvLyByZXR1cm4gc2V0RGF0YVNvdXJjZSgiaHR0cGxpdmU6Ly9xdGh0dHAuYWthbWFpLmNvbS5lZGdlc3VpdGUubmV0L2lwaG9uZV9kZW1vL1ZpZGVvX0NvbnRlbnQvbXR2L25pX3Nwb18yNWFfcnQ3NDEzN19jbGlwX3N5bi9oaS9wcm9nX2luZGV4Lm0zdTgiKTsKKyNlbmRpZgorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHJlc2V0X2woKTsKQEAgLTMwNCw2ICszMzAsMTMgQEAKICAgICAgICAgfSBlbHNlIGlmICghaGF2ZUF1ZGlvICYmICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgIHNldEF1ZGlvU291cmNlKGV4dHJhY3Rvci0+Z2V0VHJhY2soaSkpOwogICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKKworICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOworICAgICAgICAgICAgaW50MzJfdCBsb29wOworICAgICAgICAgICAgaWYgKGZpbGVNZXRhICE9IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgJiYgZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gQVVUT19MT09QSU5HOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhdmVBdWRpbyAmJiBoYXZlVmlkZW8pIHsKQEAgLTM0MCwxMSArMzczLDcgQEAKIAogICAgIGNhbmNlbFBsYXllckV2ZW50cygpOwogCi0gICAgaWYgKG1QcmVmZXRjaGVyICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0tfRVEobVByZWZldGNoZXItPmdldFN0cm9uZ0NvdW50KCksIDEpOwotICAgIH0KLSAgICBtUHJlZmV0Y2hlci5jbGVhcigpOwotCisgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOwogICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CiAgICAgbVZpZGVvVHJhY2suY2xlYXIoKTsKIApAQCAtMzYxLDkgKzM5MCw2IEBACiAgICAgfQogICAgIG1BdWRpb1NvdXJjZS5jbGVhcigpOwogCi0gICAgaWYgKG1UaW1lU291cmNlICE9IG1BdWRpb1BsYXllcikgewotICAgICAgICBkZWxldGUgbVRpbWVTb3VyY2U7Ci0gICAgfQogICAgIG1UaW1lU291cmNlID0gTlVMTDsKIAogICAgIGRlbGV0ZSBtQXVkaW9QbGF5ZXI7CkBAIC0zODEsNiArNDA3LDE1IEBACiAgICAgICAgIG1WaWRlb0J1ZmZlciA9IE5VTEw7CiAgICAgfQogCisgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgIG1SVFNQQ29udHJvbGxlci0+ZGlzY29ubmVjdCgpOworICAgICAgICBtUlRTUENvbnRyb2xsZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICBtUlRQUHVzaGVyLmNsZWFyKCk7CisgICAgbVJUQ1BQdXNoZXIuY2xlYXIoKTsKKyAgICBtUlRQU2Vzc2lvbi5jbGVhcigpOworCiAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIG1WaWRlb1NvdXJjZS0+c3RvcCgpOwogCkBAIC00MjUsNiArNDYwLDI1IEBACiAgICAgfQogfQogCisvLyBSZXR1cm5zIHRydWUgaWZmIGNhY2hlZCBkdXJhdGlvbiBpcyBhdmFpbGFibGUvYXBwbGljYWJsZS4KK2Jvb2wgQXdlc29tZVBsYXllcjo6Z2V0Q2FjaGVkRHVyYXRpb25fbChpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpIHsKKyAgICBvZmZfdCB0b3RhbFNpemU7CisKKyAgICBpZiAobVJUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKKyAgICAgICAgKmR1cmF0aW9uVXMgPSBtUlRTUENvbnRyb2xsZXItPmdldFF1ZXVlRHVyYXRpb25Vcyhlb3MpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCAmJiBtRHVyYXRpb25VcyA+PSAwCisgICAgICAgICAgICAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZ0b3RhbFNpemUpID09IE9LKSB7CisgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IHRvdGFsU2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOyAgLy8gaW4gYml0cy9zZWMKKworICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoZW9zKTsKKyAgICAgICAgKmR1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6Om9uQnVmZmVyaW5nVXBkYXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtQnVmZmVyaW5nRXZlbnRQZW5kaW5nKSB7CkBAIC00MzIsMjkgKzQ4Niw4MyBAQAogICAgIH0KICAgICBtQnVmZmVyaW5nRXZlbnRQZW5kaW5nID0gZmFsc2U7CiAKLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1pc2NTdGF0ZUxvY2spOwotICAgICAgICBkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7CisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBib29sIGVvczsKKyAgICAgICAgc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSBtQ2FjaGVkU291cmNlLT5hcHByb3hEYXRhUmVtYWluaW5nKCZlb3MpOworCisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfQlVGRkVSSU5HX1VQREFURSwgMTAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZl90IHNpemU7CisgICAgICAgICAgICBpZiAobUR1cmF0aW9uVXMgPj0gMCAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsgIC8vIGluIGJpdHMvc2VjCisKKyAgICAgICAgICAgICAgICBzaXplX3QgY2FjaGVkU2l6ZSA9IG1DYWNoZWRTb3VyY2UtPmNhY2hlZFNpemUoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWRTaXplICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKworICAgICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiAoZG91YmxlKWNhY2hlZER1cmF0aW9uVXMgLyBtRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAocGVyY2VudGFnZSA+IDEwMCkgeworICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfQlVGRkVSSU5HX1VQREFURSwgcGVyY2VudGFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIGJpdHJhdGUgb2YgdGhlIHN0cmVhbSwgdXNlIGFic29sdXRlIHNpemUKKyAgICAgICAgICAgICAgICAvLyBsaW1pdHMgdG8gbWFpbnRhaW4gdGhlIGNhY2hlLgorCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtMb3dXYXRlck1hcmtCeXRlcyA9IDQwMDAwMDsKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga0hpZ2hXYXRlck1hcmtCeXRlcyA9IDEwMDAwMDA7CisKKyAgICAgICAgICAgICAgICBpZiAoKG1GbGFncyAmIFBMQVlJTkcpICYmICFlb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChjYWNoZWREYXRhUmVtYWluaW5nIDwga0xvd1dhdGVyTWFya0J5dGVzKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBpcyBydW5uaW5nIGxvdyAoPCAlZCkgLCBwYXVzaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAga0xvd1dhdGVyTWFya0J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgICAgICAgICBwYXVzZV9sKCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woTUVESUFfSU5GTywgTUVESUFfSU5GT19CVUZGRVJJTkdfU1RBUlQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZERhdGFSZW1haW5pbmcgPiBrSGlnaFdhdGVyTWFya0J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HSSgiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHJlc3VtaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIaWdoV2F0ZXJNYXJrQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19FTkQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiY2FjaGUgaGFzIGZpbGxlZCB1cCAoPiAlZCksIHByZXBhcmUgaXMgZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIaWdoV2F0ZXJNYXJrQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQXN5bmNQcmVwYXJlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChkdXJhdGlvblVzID49IDApIHsKLSAgICAgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gbVByZWZldGNoZXItPmdldENhY2hlZER1cmF0aW9uVXMoKTsKLQotICAgICAgICBMT0dWKCJjYWNoZSBob2xkcyAlLjJmIHNlY3Mgd29ydGggb2YgZGF0YS4iLCBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKLQotICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXM7Ci0gICAgICAgIGdldFBvc2l0aW9uKCZwb3NpdGlvblVzKTsKLQotICAgICAgICBjYWNoZWREdXJhdGlvblVzICs9IHBvc2l0aW9uVXM7Ci0KLSAgICAgICAgZG91YmxlIHBlcmNlbnRhZ2UgPSAoZG91YmxlKWNhY2hlZER1cmF0aW9uVXMgLyBkdXJhdGlvblVzOwotICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0JVRkZFUklOR19VUERBVEUsIHBlcmNlbnRhZ2UgKiAxMDAuMCk7Ci0KLSAgICAgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dFKCJOb3Qgc2VuZGluZyBidWZmZXJpbmcgc3RhdHVzIGJlY2F1c2UgZHVyYXRpb24gaXMgdW5rbm93bi4iKTsKKyAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXM7CisgICAgYm9vbCBlb3M7CisgICAgaWYgKGdldENhY2hlZER1cmF0aW9uX2woJmNhY2hlZER1cmF0aW9uVXMsICZlb3MpKSB7CisgICAgICAgIGlmICgobUZsYWdzICYgUExBWUlORykgJiYgIWVvcworICAgICAgICAgICAgICAgICYmIChjYWNoZWREdXJhdGlvblVzIDwga0xvd1dhdGVyTWFya1VzKSkgeworICAgICAgICAgICAgTE9HSSgiY2FjaGUgaXMgcnVubmluZyBsb3cgKCUuMmYgc2VjcykgLCBwYXVzaW5nLiIsCisgICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgLyAxRTYpOworICAgICAgICAgICAgbUZsYWdzIHw9IENBQ0hFX1VOREVSUlVOOworICAgICAgICAgICAgcGF1c2VfbCgpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9JTkZPLCBNRURJQV9JTkZPX0JVRkZFUklOR19TVEFSVCk7CisgICAgICAgIH0gZWxzZSBpZiAoZW9zIHx8IGNhY2hlZER1cmF0aW9uVXMgPiBrSGlnaFdhdGVyTWFya1VzKSB7CisgICAgICAgICAgICBpZiAobUZsYWdzICYgQ0FDSEVfVU5ERVJSVU4pIHsKKyAgICAgICAgICAgICAgICBMT0dJKCJjYWNoZSBoYXMgZmlsbGVkIHVwICglLjJmIHNlY3MpLCByZXN1bWluZy4iLAorICAgICAgICAgICAgICAgICAgICAgY2FjaGVkRHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgICAgICAgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKyAgICAgICAgICAgICAgICBwbGF5X2woKTsKKyAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX0lORk8sIE1FRElBX0lORk9fQlVGRkVSSU5HX0VORCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIFBSRVBBUklORykgeworICAgICAgICAgICAgICAgIExPR1YoImNhY2hlIGhhcyBmaWxsZWQgdXAgKCUuMmYgc2VjcyksIHByZXBhcmUgaXMgZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgICBmaW5pc2hBc3luY1ByZXBhcmVfbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQorCisgICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpvblN0cmVhbURvbmUoKSB7CkBAIC00NjYsMjIgKzU3NCwzNSBAQAogICAgIH0KICAgICBtU3RyZWFtRG9uZUV2ZW50UGVuZGluZyA9IGZhbHNlOwogCi0gICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0gJiYgKG1GbGFncyAmIExPT1BJTkcpKSB7CisgICAgaWYgKG1TdHJlYW1Eb25lU3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgTE9HVigiTUVESUFfRVJST1IgJWQiLCBtU3RyZWFtRG9uZVN0YXR1cyk7CisKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKKyAgICAgICAgICAgICAgICBNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfVU5LTk9XTiwgbVN0cmVhbURvbmVTdGF0dXMpOworCisgICAgICAgIHBhdXNlX2woKTsKKworICAgICAgICBtRmxhZ3MgfD0gQVRfRU9TOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYm9vbCBhbGxEb25lID0KKyAgICAgICAgKG1WaWRlb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBWSURFT19BVF9FT1MpKQorICAgICAgICAgICAgJiYgKG1BdWRpb1NvdXJjZSA9PSBOVUxMIHx8IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpKTsKKworICAgIGlmICghYWxsRG9uZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1GbGFncyAmIChMT09QSU5HIHwgQVVUT19MT09QSU5HKSkgewogICAgICAgICBzZWVrVG9fbCgwKTsKIAogICAgICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgIHBvc3RWaWRlb0V2ZW50X2woKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtU3RyZWFtRG9uZVN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9QTEFZQkFDS19DT01QTEVURSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJNRURJQV9FUlJPUiAlZCIsIG1TdHJlYW1Eb25lU3RhdHVzKTsKLQotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbCgKLSAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1VOS05PV04sIG1TdHJlYW1Eb25lU3RhdHVzKTsKLSAgICAgICAgfQorICAgICAgICBMT0dWKCJNRURJQV9QTEFZQkFDS19DT01QTEVURSIpOworICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BMQVlCQUNLX0NPTVBMRVRFKTsKIAogICAgICAgICBwYXVzZV9sKCk7CiAKQEAgLTQ5MSw2ICs2MTIsOSBAQAogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpwbGF5KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworCiAgICAgcmV0dXJuIHBsYXlfbCgpOwogfQogCkBAIC01MzIsNyArNjU2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBkZWxldGUgbVRpbWVTb3VyY2U7CiAgICAgICAgICAgICAgICAgbVRpbWVTb3VyY2UgPSBtQXVkaW9QbGF5ZXI7CiAKICAgICAgICAgICAgICAgICBkZWZlcnJlZEF1ZGlvU2VlayA9IHRydWU7CkBAIC01NDgsNyArNjcxLDcgQEAKICAgICB9CiAKICAgICBpZiAobVRpbWVTb3VyY2UgPT0gTlVMTCAmJiBtQXVkaW9QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICBtVGltZVNvdXJjZSA9IG5ldyBTeXN0ZW1UaW1lU291cmNlOworICAgICAgICBtVGltZVNvdXJjZSA9ICZtU3lzdGVtVGltZVNvdXJjZTsKICAgICB9CiAKICAgICBpZiAobVZpZGVvU291cmNlICE9IE5VTEwpIHsKQEAgLTYxNSw2ICs3MzgsOSBAQAogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpwYXVzZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbUZsYWdzICY9IH5DQUNIRV9VTkRFUlJVTjsKKwogICAgIHJldHVybiBwYXVzZV9sKCk7CiB9CiAKQEAgLTYzNSw3ICs3NjEsNyBAQAogfQogCiBib29sIEF3ZXNvbWVQbGF5ZXI6OmlzUGxheWluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZsYWdzICYgUExBWUlORzsKKyAgICByZXR1cm4gKG1GbGFncyAmIFBMQVlJTkcpIHx8IChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTik7CiB9CiAKIHZvaWQgQXdlc29tZVBsYXllcjo6c2V0SVN1cmZhY2UoY29uc3Qgc3A8SVN1cmZhY2U+ICZpc3VyZmFjZSkgewpAQCAtNjc2LDcgKzgwMiwxMCBAQAogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpnZXRQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvblVzKSB7Ci0gICAgaWYgKG1TZWVraW5nKSB7CisgICAgaWYgKG1SVFNQQ29udHJvbGxlciAhPSBOVUxMKSB7CisgICAgICAgICpwb3NpdGlvblVzID0gbVJUU1BDb250cm9sbGVyLT5nZXROb3JtYWxQbGF5VGltZVVzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKG1TZWVraW5nKSB7CiAgICAgICAgICpwb3NpdGlvblVzID0gbVNlZWtUaW1lVXM7CiAgICAgfSBlbHNlIGlmIChtVmlkZW9Tb3VyY2UgIT0gTlVMTCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU1pc2NTdGF0ZUxvY2spOwpAQCAtNzAyLDEwICs4MzEsMjMgQEAKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2Vla1RvX2woaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAobVJUU1BDb250cm9sbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJUU1BDb250cm9sbGVyLT5zZWVrKHRpbWVVcyk7CisKKyAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TRUVLX0NPTVBMRVRFKTsKKyAgICAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtRmxhZ3MgJiBDQUNIRV9VTkRFUlJVTikgeworICAgICAgICBtRmxhZ3MgJj0gfkNBQ0hFX1VOREVSUlVOOworICAgICAgICBwbGF5X2woKTsKKyAgICB9CisKICAgICBtU2Vla2luZyA9IHRydWU7CiAgICAgbVNlZWtOb3RpZmljYXRpb25TZW50ID0gZmFsc2U7CiAgICAgbVNlZWtUaW1lVXMgPSB0aW1lVXM7Ci0gICAgbUZsYWdzICY9IH5BVF9FT1M7CisgICAgbUZsYWdzICY9IH4oQVRfRU9TIHwgQVVESU9fQVRfRU9TIHwgVklERU9fQVRfRU9TKTsKIAogICAgIHNlZWtBdWRpb0lmTmVjZXNzYXJ5X2woKTsKIApAQCAtNzQ3LDEwICs4ODksNiBAQAogdm9pZCBBd2Vzb21lUGxheWVyOjpzZXRBdWRpb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKSB7CiAgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwogCi0gICAgaWYgKG1QcmVmZXRjaGVyICE9IE5VTEwpIHsKLSAgICAgICAgc291cmNlID0gbVByZWZldGNoZXItPmFkZFNvdXJjZShzb3VyY2UpOwotICAgIH0KLQogICAgIG1BdWRpb1RyYWNrID0gc291cmNlOwogfQogCkBAIC03OTcsMTggKzkzNSwxNiBAQAogdm9pZCBBd2Vzb21lUGxheWVyOjpzZXRWaWRlb1NvdXJjZShzcDxNZWRpYVNvdXJjZT4gc291cmNlKSB7CiAgICAgQ0hFQ0soc291cmNlICE9IE5VTEwpOwogCi0gICAgaWYgKG1QcmVmZXRjaGVyICE9IE5VTEwpIHsKLSAgICAgICAgc291cmNlID0gbVByZWZldGNoZXItPmFkZFNvdXJjZShzb3VyY2UpOwotICAgIH0KLQogICAgIG1WaWRlb1RyYWNrID0gc291cmNlOwogfQogCiBzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjppbml0VmlkZW9EZWNvZGVyKCkgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBtVmlkZW9Tb3VyY2UgPSBPTVhDb2RlYzo6Q3JlYXRlKAogICAgICAgICAgICAgbUNsaWVudC5pbnRlcmZhY2UoKSwgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLAogICAgICAgICAgICAgZmFsc2UsIC8vIGNyZWF0ZUVuY29kZXIKLSAgICAgICAgICAgIG1WaWRlb1RyYWNrKTsKKyAgICAgICAgICAgIG1WaWRlb1RyYWNrLAorICAgICAgICAgICAgTlVMTCwgZmxhZ3MpOwogCiAgICAgaWYgKG1WaWRlb1NvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKQEAgLTg1Miw2ICs5ODgsMjEgQEAKICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbVZpZGVvQnVmZmVyID0gTlVMTDsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwgJiYgbUF1ZGlvU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHNlZWsgdGhlIHZpZGVvIHNvdXJjZSBmaXJzdCwgZm9sbG93ZWQgYnkKKyAgICAgICAgICAgIC8vIHRoZSBhdWRpbyBzb3VyY2UuCisgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBhdm9pZCBqdW1wcyBpbiB0aGUgRGF0YVNvdXJjZSBvZmZzZXQgY2F1c2VkIGJ5CisgICAgICAgICAgICAvLyB0aGUgYXVkaW8gY29kZWMgcHJlZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBvbGQgbG9jYXRpb25zCisgICAgICAgICAgICAvLyB3aGlsZSB0aGUgdmlkZW8gY29kZWMgaXMgYWxyZWFkeSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgbmV3CisgICAgICAgICAgICAvLyBsb2NhdGlvbnMsIHdlJ2xsICJwYXVzZSIgdGhlIGF1ZGlvIHNvdXJjZSwgY2F1c2luZyBpdCB0bworICAgICAgICAgICAgLy8gc3RvcCByZWFkaW5nIGlucHV0IGRhdGEgdW50aWwgYSBzdWJzZXF1ZW50IHNlZWsuCisKKyAgICAgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+cGF1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb1NvdXJjZS0+cGF1c2UoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghbVZpZGVvQnVmZmVyKSB7CkBAIC04NTksNyArMTAxMCw4IEBACiAgICAgICAgIGlmIChtU2Vla2luZykgewogICAgICAgICAgICAgTE9HVigic2Vla2luZyB0byAlbGxkIHVzICglLjJmIHNlY3MpIiwgbVNlZWtUaW1lVXMsIG1TZWVrVGltZVVzIC8gMUU2KTsKIAotICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOworICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oCisgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKICAgICAgICAgfQogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtVmlkZW9Tb3VyY2UtPnJlYWQoJm1WaWRlb0J1ZmZlciwgJm9wdGlvbnMpOwpAQCAtODc4LDYgKzEwMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0gVklERU9fQVRfRU9TOwogICAgICAgICAgICAgICAgIHBvc3RTdHJlYW1Eb25lRXZlbnRfbChlcnIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTkwOCw2ICsxMDYxLDcgQEAKICAgICAgICAgICAgIExPR1YoInNlZWtpbmcgYXVkaW8gdG8gJWxsZCB1cyAoJS4yZiBzZWNzKS4iLCB0aW1lVXMsIHRpbWVVcyAvIDFFNik7CiAKICAgICAgICAgICAgIG1BdWRpb1BsYXllci0+c2Vla1RvKHRpbWVVcyk7CisgICAgICAgICAgICBtQXVkaW9QbGF5ZXItPnJlc3VtZSgpOwogICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9TZWVrQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKCFtU2Vla05vdGlmaWNhdGlvblNlbnQpIHsKQEAgLTkyMSwyMiArMTA3NSwzMCBAQAogICAgICAgICBtU2Vla05vdGlmaWNhdGlvblNlbnQgPSBmYWxzZTsKICAgICB9CiAKKyAgICBUaW1lU291cmNlICp0cyA9IChtRmxhZ3MgJiBBVURJT19BVF9FT1MpID8gJm1TeXN0ZW1UaW1lU291cmNlIDogbVRpbWVTb3VyY2U7CisKICAgICBpZiAobUZsYWdzICYgRklSU1RfRlJBTUUpIHsKICAgICAgICAgbUZsYWdzICY9IH5GSVJTVF9GUkFNRTsKIAotICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSBtVGltZVNvdXJjZS0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOworICAgICAgICBtVGltZVNvdXJjZURlbHRhVXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gdGltZVVzOwogICAgIH0KIAogICAgIGludDY0X3QgcmVhbFRpbWVVcywgbWVkaWFUaW1lVXM7Ci0gICAgaWYgKG1BdWRpb1BsYXllciAhPSBOVUxMCisgICAgaWYgKCEobUZsYWdzICYgQVVESU9fQVRfRU9TKSAmJiBtQXVkaW9QbGF5ZXIgIT0gTlVMTAogICAgICAgICAmJiBtQXVkaW9QbGF5ZXItPmdldE1lZGlhVGltZU1hcHBpbmcoJnJlYWxUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKICAgICAgICAgbVRpbWVTb3VyY2VEZWx0YVVzID0gcmVhbFRpbWVVcyAtIG1lZGlhVGltZVVzOwogICAgIH0KIAotICAgIGludDY0X3Qgbm93VXMgPSBtVGltZVNvdXJjZS0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOworICAgIGludDY0X3Qgbm93VXMgPSB0cy0+Z2V0UmVhbFRpbWVVcygpIC0gbVRpbWVTb3VyY2VEZWx0YVVzOwogCiAgICAgaW50NjRfdCBsYXRlbmVzc1VzID0gbm93VXMgLSB0aW1lVXM7CiAKKyAgICBpZiAobVJUUFNlc3Npb24gIT0gTlVMTCkgeworICAgICAgICAvLyBXZSdsbCBjb21wbGV0ZWx5IGlnbm9yZSB0aW1lc3RhbXBzIGZvciBndGFsayB2aWRlb2NoYXQKKyAgICAgICAgLy8gYW5kIHdlJ2xsIHBsYXkgaW5jb21pbmcgdmlkZW8gYXMgZmFzdCBhcyB3ZSBnZXQgaXQuCisgICAgICAgIGxhdGVuZXNzVXMgPSAwOworICAgIH0KKwogICAgIGlmIChsYXRlbmVzc1VzID4gNDAwMDApIHsKICAgICAgICAgLy8gV2UncmUgbW9yZSB0aGFuIDQwbXMgbGF0ZS4KICAgICAgICAgTE9HVigid2UncmUgbGF0ZSBieSAlbGxkIHVzICglLjJmIHNlY3MpIiwgbGF0ZW5lc3NVcywgbGF0ZW5lc3NVcyAvIDFFNik7CkBAIC05OTUsMTAgKzExNTcsNiBAQAogfQogCiB2b2lkIEF3ZXNvbWVQbGF5ZXI6OnBvc3RCdWZmZXJpbmdFdmVudF9sKCkgewotICAgIGlmIChtUHJlZmV0Y2hlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICBpZiAobUJ1ZmZlcmluZ0V2ZW50UGVuZGluZykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTAzOCw2ICsxMTk2LDggQEAKICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKICAgICBpZiAobVdhdGNoRm9yQXVkaW9FT1MgJiYgbUF1ZGlvUGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKICAgICAgICAgbVdhdGNoRm9yQXVkaW9FT1MgPSBmYWxzZTsKKyAgICAgICAgbUZsYWdzIHw9IEFVRElPX0FUX0VPUzsKKyAgICAgICAgbUZsYWdzIHw9IEZJUlNUX0ZSQU1FOwogICAgICAgICBwb3N0U3RyZWFtRG9uZUV2ZW50X2woZmluYWxTdGF0dXMpOwogICAgIH0KIApAQCAtMTEwNiwxMCArMTI2NiwxMCBAQAogICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2U7CiAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgbVVyaS5zdHJpbmcoKSwgNykpIHsKLSAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlID0gbmV3IEhUVFBEYXRhU291cmNlKG1VcmksICZtVXJpSGVhZGVycyk7CisgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZSA9IG5ldyBOdUhUVFBEYXRhU291cmNlOwogCiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29ubmVjdGluZ0RhdGFTb3VyY2UtPmNvbm5lY3QoKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvbm5lY3RpbmdEYXRhU291cmNlLT5jb25uZWN0KG1VcmksICZtVXJpSGVhZGVycyk7CiAgICAgICAgIG1Mb2NrLmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xMTE5LDEwICsxMjc5LDE1OSBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIGRhdGFTb3VyY2UgPSBuZXcgQ2FjaGluZ0RhdGFTb3VyY2UoCi0gICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLCA2NCAqIDEwMjQsIDEwKTsKLQorI2lmIDAKKyAgICAgICAgbUNhY2hlZFNvdXJjZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoCisgICAgICAgICAgICAgICAgbmV3IFRocm90dGxlZFNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdEYXRhU291cmNlLCA1MCAqIDEwMjQgLyogYnl0ZXMvc2VjICovKSk7CisjZWxzZQorICAgICAgICBtQ2FjaGVkU291cmNlID0gbmV3IE51Q2FjaGVkU291cmNlMihtQ29ubmVjdGluZ0RhdGFTb3VyY2UpOworI2VuZGlmCiAgICAgICAgIG1Db25uZWN0aW5nRGF0YVNvdXJjZS5jbGVhcigpOworCisgICAgICAgIGRhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlOworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1Vcmkuc3RyaW5nKCksICJodHRwbGl2ZTovLyIsIDExKSkgeworICAgICAgICBTdHJpbmc4IHVyaSgiaHR0cDovLyIpOworICAgICAgICB1cmkuYXBwZW5kKG1Vcmkuc3RyaW5nKCkgKyAxMSk7CisKKyAgICAgICAgZGF0YVNvdXJjZSA9IG5ldyBMaXZlU291cmNlKHVyaS5zdHJpbmcoKSk7CisKKyAgICAgICAgbUNhY2hlZFNvdXJjZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoZGF0YVNvdXJjZSk7CisgICAgICAgIGRhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlOworCisgICAgICAgIHNwPE1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPQorICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShkYXRhU291cmNlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7CisKKyAgICAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChleHRyYWN0b3IpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoInJ0c3A6Ly9ndGFsay8iLCBtVXJpLnN0cmluZygpLCAxMykpIHsKKyAgICAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiZ3RhbGsgcnRwIik7CisgICAgICAgICAgICBtTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcnVuT25DYWxsaW5nVGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYW5DYWxsSmF2YSAqLywKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfSElHSEVTVCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpzdGFydE9mQ29kZWNTdHJpbmcgPSAmbVVyaS5zdHJpbmcoKVsxM107CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0T2ZTbGFzaDEgPSBzdHJjaHIoc3RhcnRPZkNvZGVjU3RyaW5nLCAnLycpOworICAgICAgICBpZiAoc3RhcnRPZlNsYXNoMSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0T2ZXaWR0aFN0cmluZyA9ICZzdGFydE9mU2xhc2gxWzFdOworICAgICAgICBjb25zdCBjaGFyICpzdGFydE9mU2xhc2gyID0gc3RyY2hyKHN0YXJ0T2ZXaWR0aFN0cmluZywgJy8nKTsKKyAgICAgICAgaWYgKHN0YXJ0T2ZTbGFzaDIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBjaGFyICpzdGFydE9mSGVpZ2h0U3RyaW5nID0gJnN0YXJ0T2ZTbGFzaDJbMV07CisKKyAgICAgICAgU3RyaW5nOCBjb2RlY1N0cmluZyhzdGFydE9mQ29kZWNTdHJpbmcsIHN0YXJ0T2ZTbGFzaDEgLSBzdGFydE9mQ29kZWNTdHJpbmcpOworICAgICAgICBTdHJpbmc4IHdpZHRoU3RyaW5nKHN0YXJ0T2ZXaWR0aFN0cmluZywgc3RhcnRPZlNsYXNoMiAtIHN0YXJ0T2ZXaWR0aFN0cmluZyk7CisgICAgICAgIFN0cmluZzggaGVpZ2h0U3RyaW5nKHN0YXJ0T2ZIZWlnaHRTdHJpbmcpOworCisjaWYgMAorICAgICAgICBtUlRQUHVzaGVyID0gbmV3IFVEUFB1c2hlcigiL2RhdGEvbWlzYy9ydHBvdXQuYmluIiwgNTQzNCk7CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUlRQUHVzaGVyKTsKKworICAgICAgICBtUlRDUFB1c2hlciA9IG5ldyBVRFBQdXNoZXIoIi9kYXRhL21pc2MvcnRjcG91dC5iaW4iLCA1NDM1KTsKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SVENQUHVzaGVyKTsKKyNlbmRpZgorCisgICAgICAgIG1SVFBTZXNzaW9uID0gbmV3IEFSVFBTZXNzaW9uOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJUUFNlc3Npb24pOworCisjaWYgMAorICAgICAgICAvLyBNeSBBTVIgU0RQCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpyYXcgPQorICAgICAgICAgICAgInY9MFxyXG4iCisgICAgICAgICAgICAibz0tIDY0IDIzMzU3Mjk0NCBJTiBJUDQgMTI3LjAuMC4wXHJcbiIKKyAgICAgICAgICAgICJzPVF1aWNrVGltZVxyXG4iCisgICAgICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAgICAgImE9cmFuZ2U6bnB0PTAtMzE1XHJcbiIKKyAgICAgICAgICAgICJhPWlzbWEtY29tcGxpYW5jZToyLDIuMCwyXHJcbiIKKyAgICAgICAgICAgICJtPWF1ZGlvIDU0MzQgUlRQL0FWUCA5N1xyXG4iCisgICAgICAgICAgICAiYz1JTiBJUDQgMTI3LjAuMC4xXHJcbiIKKyAgICAgICAgICAgICJiPUFTOjMwXHJcbiIKKyAgICAgICAgICAgICJhPXJ0cG1hcDo5NyBBTVIvODAwMC8xXHJcbiIKKyAgICAgICAgICAgICJhPWZtdHA6OTcgb2N0ZXQtYWxpZ25cclxuIjsKKyNlbGlmIDEKKyAgICAgICAgU3RyaW5nOCBzZHA7CisgICAgICAgIHNkcC5hcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAidj0wXHJcbiIKKyAgICAgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAgICAgInM9UXVpY2tUaW1lXHJcbiIKKyAgICAgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICAgICAiYT1yYW5nZTpucHQ9MC0zMTVcclxuIgorICAgICAgICAgICAgImE9aXNtYS1jb21wbGlhbmNlOjIsMi4wLDJcclxuIgorICAgICAgICAgICAgIm09dmlkZW8gNTQzNCBSVFAvQVZQIDk3XHJcbiIKKyAgICAgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAgICAgImI9QVM6MzBcclxuIgorICAgICAgICAgICAgImE9cnRwbWFwOjk3ICVzLzkwMDAwXHJcbiIKKyAgICAgICAgICAgICJhPWNsaXByZWN0OjAsMCwlcywlc1xyXG4iCisgICAgICAgICAgICAiYT1mcmFtZXNpemU6OTcgJXMtJXNcclxuIiwKKworICAgICAgICAgICAgY29kZWNTdHJpbmcuc3RyaW5nKCksCisgICAgICAgICAgICBoZWlnaHRTdHJpbmcuc3RyaW5nKCksIHdpZHRoU3RyaW5nLnN0cmluZygpLAorICAgICAgICAgICAgd2lkdGhTdHJpbmcuc3RyaW5nKCksIGhlaWdodFN0cmluZy5zdHJpbmcoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgY29uc3QgY2hhciAqcmF3ID0gc2RwLnN0cmluZygpOworCisjZW5kaWYKKworICAgICAgICBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBkZXNjID0gbmV3IEFTZXNzaW9uRGVzY3JpcHRpb247CisgICAgICAgIENIRUNLKGRlc2MtPnNldFRvKHJhdywgc3RybGVuKHJhdykpKTsKKworICAgICAgICBDSEVDS19FUShtUlRQU2Vzc2lvbi0+c2V0dXAoZGVzYyksIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgaWYgKG1SVFBQdXNoZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVJUUFB1c2hlci0+c3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUlRDUFB1c2hlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUlRDUFB1c2hlci0+c3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKG1SVFBTZXNzaW9uLT5jb3VudFRyYWNrcygpLCAxdSk7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtUlRQU2Vzc2lvbi0+dHJhY2tBdCgwKTsKKworI2lmIDAKKyAgICAgICAgYm9vbCBlb3M7CisgICAgICAgIHdoaWxlICgoKEFQYWNrZXRTb3VyY2UgKilzb3VyY2UuZ2V0KCkpCisgICAgICAgICAgICAgICAgLT5nZXRRdWV1ZWREdXJhdGlvbigmZW9zKSA8IDUwMDAwMDBsbCAmJiAhZW9zKSB7CisgICAgICAgICAgICB1c2xlZXAoMTAwMDAwbGwpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgIHNldFZpZGVvU291cmNlKHNvdXJjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKTsKKyAgICAgICAgICAgIHNldEF1ZGlvU291cmNlKHNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBtRXh0cmFjdG9yRmxhZ3MgPSBNZWRpYUV4dHJhY3Rvcjo6Q0FOX1BBVVNFOworCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgicnRzcDovLyIsIG1Vcmkuc3RyaW5nKCksIDcpKSB7CisgICAgICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICAgICAgICAgIG1Mb29wZXItPnNldE5hbWUoInJ0c3AiKTsKKyAgICAgICAgICAgIG1Mb29wZXItPnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgbVJUU1BDb250cm9sbGVyID0gbmV3IEFSVFNQQ29udHJvbGxlcihtTG9vcGVyKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVJUU1BDb250cm9sbGVyLT5jb25uZWN0KG1Vcmkuc3RyaW5nKCkpOworCisgICAgICAgIExPR0koIkFSVFNQQ29udHJvbGxlcjo6Y29ubmVjdCByZXR1cm5lZCAlZCIsIGVycik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgbVJUU1BDb250cm9sbGVyLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgc3A8TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG1SVFNQQ29udHJvbGxlci5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChleHRyYWN0b3IpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tVVJJKG1Vcmkuc3RyaW5nKCksICZtVXJpSGVhZGVycyk7CiAgICAgfQpAQCAtMTEzNywxMCArMTQ0Niw2IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChkYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a1dhbnRzUHJlZmV0Y2hpbmcpIHsKLSAgICAgICAgbVByZWZldGNoZXIgPSBuZXcgUHJlZmV0Y2hlcjsKLSAgICB9Ci0KICAgICByZXR1cm4gc2V0RGF0YVNvdXJjZV9sKGV4dHJhY3Rvcik7CiB9CiAKQEAgLTExNjUsODAgKzE0NzAsNDkgQEAKIH0KIAogdm9pZCBBd2Vzb21lUGxheWVyOjpvblByZXBhcmVBc3luY0V2ZW50KCkgewotICAgIHNwPFByZWZldGNoZXI+IHByZWZldGNoZXI7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgaWYgKG1GbGFncyAmIFBSRVBBUkVfQ0FOQ0VMTEVEKSB7Ci0gICAgICAgICAgICBMT0dJKCJwcmVwYXJlIHdhcyBjYW5jZWxsZWQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIik7Ci0gICAgICAgICAgICBhYm9ydFByZXBhcmUoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVVyaS5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBmaW5pc2hTZXREYXRhU291cmNlX2woKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMICYmIG1WaWRlb1NvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbml0VmlkZW9EZWNvZGVyKCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBhYm9ydFByZXBhcmUoZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdEF1ZGlvRGVjb2RlcigpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYWJvcnRQcmVwYXJlKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJlZmV0Y2hlciA9IG1QcmVmZXRjaGVyOwotICAgIH0KLQotICAgIGlmIChwcmVmZXRjaGVyICE9IE5VTEwpIHsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBQUkVQQVJFX0NBTkNFTExFRCkgewotICAgICAgICAgICAgICAgIExPR0koInByZXBhcmUgd2FzIGNhbmNlbGxlZCBiZWZvcmUgcHJlcGFyaW5nIHRoZSBwcmVmZXRjaGVyIik7Ci0KLSAgICAgICAgICAgICAgICBwcmVmZXRjaGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgYWJvcnRQcmVwYXJlKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExPR0koImNhbGxpbmcgcHJlZmV0Y2hlci0+cHJlcGFyZSgpIik7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9Ci0gICAgICAgICAgICBwcmVmZXRjaGVyLT5wcmVwYXJlKCZBd2Vzb21lUGxheWVyOjpDb250aW51ZVByZXBhcmF0aW9uLCB0aGlzKTsKLQotICAgICAgICBwcmVmZXRjaGVyLmNsZWFyKCk7Ci0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgTE9HSSgicHJlZmV0Y2hlciBpcyBkb25lIHByZXBhcmluZyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICAgICAgICAgQ0hFQ0tfRVEocmVzdWx0LCAtRUlOVFIpOwotCi0gICAgICAgICAgICBMT0dJKCJwcmVmZXRjaGVyLT5wcmVwYXJlKCkgd2FzIGNhbmNlbGxlZCBlYXJseS4iKTsKLSAgICAgICAgICAgIGFib3J0UHJlcGFyZShVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKKyAgICBpZiAobUZsYWdzICYgUFJFUEFSRV9DQU5DRUxMRUQpIHsKKyAgICAgICAgTE9HSSgicHJlcGFyZSB3YXMgY2FuY2VsbGVkIGJlZm9yZSBkb2luZyBhbnl0aGluZyIpOworICAgICAgICBhYm9ydFByZXBhcmUoVU5LTk9XTl9FUlJPUik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVVyaS5zaXplKCkgPiAwKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdFZpZGVvRGVjb2RlcigpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwgJiYgbUF1ZGlvU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gaW5pdEF1ZGlvRGVjb2RlcigpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGFib3J0UHJlcGFyZShlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCB8fCBtUlRTUENvbnRyb2xsZXIgIT0gTlVMTCkgeworICAgICAgICBwb3N0QnVmZmVyaW5nRXZlbnRfbCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisgICAgfQorfQorCit2b2lkIEF3ZXNvbWVQbGF5ZXI6OmZpbmlzaEFzeW5jUHJlcGFyZV9sKCkgewogICAgIGlmIChtSXNBc3luY1ByZXBhcmUpIHsKICAgICAgICAgaWYgKG1WaWRlb1dpZHRoIDwgMCB8fCBtVmlkZW9IZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NFVF9WSURFT19TSVpFLCAwLCAwKTsKQEAgLTEyNTQsOCArMTUyOCw2IEBACiAgICAgbUZsYWdzIHw9IFBSRVBBUkVEOwogICAgIG1Bc3luY1ByZXBhcmVFdmVudCA9IE5VTEw7CiAgICAgbVByZXBhcmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotCi0gICAgcG9zdEJ1ZmZlcmluZ0V2ZW50X2woKTsKIH0KIAogc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c3VzcGVuZCgpIHsKQEAgLTEyOTUsNyArMTU2Nyw3IEBACiAgICAgc3RhdGUtPm1VcmlIZWFkZXJzID0gbVVyaUhlYWRlcnM7CiAgICAgc3RhdGUtPm1GaWxlU291cmNlID0gbUZpbGVTb3VyY2U7CiAKLSAgICBzdGF0ZS0+bUZsYWdzID0gbUZsYWdzICYgKFBMQVlJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKKyAgICBzdGF0ZS0+bUZsYWdzID0gbUZsYWdzICYgKFBMQVlJTkcgfCBBVVRPX0xPT1BJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKICAgICBnZXRQb3NpdGlvbigmc3RhdGUtPm1Qb3NpdGlvblVzKTsKIAogICAgIGlmIChtTGFzdFZpZGVvQnVmZmVyKSB7CkBAIC0xMzU2LDcgKzE2MjgsNyBAQAogCiAgICAgc2Vla1RvX2woc3RhdGUtPm1Qb3NpdGlvblVzKTsKIAotICAgIG1GbGFncyA9IHN0YXRlLT5tRmxhZ3MgJiAoTE9PUElORyB8IEFUX0VPUyk7CisgICAgbUZsYWdzID0gc3RhdGUtPm1GbGFncyAmIChBVVRPX0xPT1BJTkcgfCBMT09QSU5HIHwgQVRfRU9TKTsKIAogICAgIGlmIChzdGF0ZS0+bUxhc3RWaWRlb0ZyYW1lICYmIG1JU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIG1WaWRlb1JlbmRlcmVyID0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhNDYzZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWNoaW5nRGF0YVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUNhY2hpbmdEYXRhU291cmNlOjpDYWNoaW5nRGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgc2l6ZV90IHBhZ2VTaXplLCBpbnQgbnVtUGFnZXMpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtRGF0YShtYWxsb2MocGFnZVNpemUgKiBudW1QYWdlcykpLAotICAgICAgbVBhZ2VTaXplKHBhZ2VTaXplKSwKLSAgICAgIG1GaXJzdChOVUxMKSwKLSAgICAgIG1MYXN0KE5VTEwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBhZ2VzOyArK2kpIHsKLSAgICAgICAgUGFnZSAqcGFnZSA9IG5ldyBQYWdlOwotICAgICAgICBwYWdlLT5tUHJldiA9IG1MYXN0OwotICAgICAgICBwYWdlLT5tTmV4dCA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKG1MYXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaXJzdCA9IHBhZ2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTGFzdC0+bU5leHQgPSBwYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgbUxhc3QgPSBwYWdlOwotCi0gICAgICAgIHBhZ2UtPm1PZmZzZXQgPSAtMTsKLSAgICAgICAgcGFnZS0+bUxlbmd0aCA9IDA7Ci0gICAgICAgIHBhZ2UtPm1EYXRhID0gKGNoYXIgKiltRGF0YSArIG1QYWdlU2l6ZSAqIGk7Ci0gICAgfQotfQotCi1DYWNoaW5nRGF0YVNvdXJjZTo6fkNhY2hpbmdEYXRhU291cmNlKCkgewotICAgIFBhZ2UgKnBhZ2UgPSBtRmlyc3Q7Ci0gICAgd2hpbGUgKHBhZ2UgIT0gTlVMTCkgewotICAgICAgICBQYWdlICpuZXh0ID0gcGFnZS0+bU5leHQ7Ci0gICAgICAgIGRlbGV0ZSBwYWdlOwotICAgICAgICBwYWdlID0gbmV4dDsKLSAgICB9Ci0gICAgbUZpcnN0ID0gbUxhc3QgPSBOVUxMOwotCi0gICAgZnJlZShtRGF0YSk7Ci0gICAgbURhdGEgPSBOVUxMOwotfQotCi1zdGF0dXNfdCBDYWNoaW5nRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKLX0KLQotc3RhdHVzX3QgQ2FjaGluZ0RhdGFTb3VyY2U6OmdldFNpemUob2ZmX3QgKnNpemUpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKLX0KLQotdWludDMyX3QgQ2FjaGluZ0RhdGFTb3VyY2U6OmZsYWdzKCkgewotICAgIHJldHVybiBtU291cmNlLT5mbGFncygpOwotfQotCi1zc2l6ZV90IENhY2hpbmdEYXRhU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzaXplX3QgdG90YWwgPSAwOwotICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICBQYWdlICpwYWdlID0gbUZpcnN0OwotICAgICAgICB3aGlsZSAocGFnZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAocGFnZS0+bU9mZnNldCA+PSAwICYmIG9mZnNldCA+PSBwYWdlLT5tT2Zmc2V0Ci0gICAgICAgICAgICAgICAgJiYgb2Zmc2V0IDwgcGFnZS0+bU9mZnNldCArIChvZmZfdClwYWdlLT5tTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYWdlID0gcGFnZS0+bU5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFnZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwYWdlID0gYWxsb2NhdGVfcGFnZSgpOwotICAgICAgICAgICAgcGFnZS0+bU9mZnNldCA9IG9mZnNldCAtIG9mZnNldCAlIG1QYWdlU2l6ZTsKLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdChwYWdlLT5tT2Zmc2V0LCBwYWdlLT5tRGF0YSwgbVBhZ2VTaXplKTsKLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIHBhZ2UtPm1MZW5ndGggPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYWdlLT5tTGVuZ3RoID0gKHNpemVfdCluOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpcnN0LT5tUHJldiA9IHBhZ2U7Ci0gICAgICAgICAgICBwYWdlLT5tTmV4dCA9IG1GaXJzdDsKLSAgICAgICAgICAgIHBhZ2UtPm1QcmV2ID0gTlVMTDsKLSAgICAgICAgICAgIG1GaXJzdCA9IHBhZ2U7Ci0KLSAgICAgICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IHBhZ2UtPm1PZmZzZXQgKyAob2ZmX3QpcGFnZS0+bUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTW92ZSAicGFnZSIgdG8gdGhlIGZyb250IGluIExSVSBvcmRlci4KLSAgICAgICAgICAgIGlmIChwYWdlLT5tTmV4dCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcGFnZS0+bU5leHQtPm1QcmV2ID0gcGFnZS0+bVByZXY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1MYXN0ID0gcGFnZS0+bVByZXY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdlLT5tUHJldiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcGFnZS0+bVByZXYtPm1OZXh0ID0gcGFnZS0+bU5leHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1GaXJzdCA9IHBhZ2UtPm1OZXh0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRmlyc3QtPm1QcmV2ID0gcGFnZTsKLSAgICAgICAgICAgIHBhZ2UtPm1OZXh0ID0gbUZpcnN0OwotICAgICAgICAgICAgcGFnZS0+bVByZXYgPSBOVUxMOwotICAgICAgICAgICAgbUZpcnN0ID0gcGFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gcGFnZS0+bUxlbmd0aCAtIChvZmZzZXQgLSBwYWdlLT5tT2Zmc2V0KTsKLSAgICAgICAgaWYgKGNvcHkgPiBzaXplKSB7Ci0gICAgICAgICAgICBjb3B5ID0gc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoZGF0YSwoY29uc3QgY2hhciAqKXBhZ2UtPm1EYXRhICsgKG9mZnNldCAtIHBhZ2UtPm1PZmZzZXQpLAotICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgdG90YWwgKz0gY29weTsKLQotICAgICAgICBpZiAocGFnZS0+bUxlbmd0aCA8IG1QYWdlU2l6ZSkgewotICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGZpbmFsIHBhZ2UuIFRoZXJlIGlzIG5vIG1vcmUgZGF0YSBiZXlvbmQgaXQuCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldCArPSBjb3B5OwotICAgICAgICBzaXplIC09IGNvcHk7Ci0gICAgICAgIGRhdGEgPSAoY2hhciAqKWRhdGEgKyBjb3B5OwotICAgIH0KLQotICAgIHJldHVybiB0b3RhbDsKLX0KLQotQ2FjaGluZ0RhdGFTb3VyY2U6OlBhZ2UgKkNhY2hpbmdEYXRhU291cmNlOjphbGxvY2F0ZV9wYWdlKCkgewotICAgIC8vIFRoZSBsYXN0IHBhZ2UgaXMgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQsIGkuZS4gb2xkZXN0LgotCi0gICAgUGFnZSAqcGFnZSA9IG1MYXN0OwotCi0gICAgcGFnZS0+bVByZXYtPm1OZXh0ID0gTlVMTDsKLSAgICBtTGFzdCA9IHBhZ2UtPm1QcmV2OwotICAgIHBhZ2UtPm1QcmV2ID0gTlVMTDsKLQotICAgIHJldHVybiBwYWdlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggMDc1YjFlMy4uM2UzMWQ2MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC0xNCwxMiArMTQsMTIgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTI3LDQ2ICsyNywxMSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL092ZXJsYXkuaD4KLSNpbmNsdWRlIDxzdXJmYWNlZmxpbmdlci9JU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkgewotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotCi0gICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwOwotfQotCi1zdHJ1Y3QgRHVtbXlTdXJmYWNlIDogcHVibGljIEJuU3VyZmFjZSB7Ci0gICAgRHVtbXlTdXJmYWNlKCkge30KLQotICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gcmVxdWVzdEJ1ZmZlcihpbnQgYnVmZmVySWR4LCBpbnQgdXNhZ2UpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcnMoY29uc3QgQnVmZmVySGVhcCAmYnVmZmVycykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpIHt9Ci0gICAgdmlydHVhbCB2b2lkIHVucmVnaXN0ZXJCdWZmZXJzKCkge30KLQotICAgIHZpcnR1YWwgc3A8T3ZlcmxheVJlZj4gY3JlYXRlT3ZlcmxheSgKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIGludDMyX3QgZm9ybWF0LCBpbnQzMl90IG9yaWVudGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkR1bW15U3VyZmFjZSgpIHt9Ci0KLSAgICBEdW1teVN1cmZhY2UoY29uc3QgRHVtbXlTdXJmYWNlICYpOwotICAgIER1bW15U3VyZmFjZSAmb3BlcmF0b3I9KGNvbnN0IER1bW15U3VyZmFjZSAmKTsKLX07Ci0KIHN0cnVjdCBDYW1lcmFTb3VyY2VMaXN0ZW5lciA6IHB1YmxpYyBDYW1lcmFMaXN0ZW5lciB7CiAgICAgQ2FtZXJhU291cmNlTGlzdGVuZXIoY29uc3Qgc3A8Q2FtZXJhU291cmNlPiAmc291cmNlKTsKIApAQCAtMTAwLDIyICs2NSw0MCBAQAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YVB0cikgewogICAgIExPR1YoInBvc3REYXRhKCVkLCBwdHI6JXAsIHNpemU6JWQpIiwKICAgICAgICAgIG1zZ1R5cGUsIGRhdGFQdHItPnBvaW50ZXIoKSwgZGF0YVB0ci0+c2l6ZSgpKTsKLQotICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHNvdXJjZS5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHNvdXJjZS0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGRhdGFQdHIpOwotICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdERhdGFUaW1lc3RhbXAoCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyKSB7Ci0gICAgTE9HVigicG9zdERhdGFUaW1lc3RhbXAoJWxsZCwgJWQsIHB0cjolcCwgc2l6ZTolZCkiLAotICAgICAgICAgdGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyLT5wb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7CisKKyAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAvMTAwMCwgbXNnVHlwZSwgZGF0YVB0cik7CisgICAgfQorfQorCitzdGF0aWMgaW50MzJfdCBnZXRDb2xvckZvcm1hdChjb25zdCBjaGFyKiBjb2xvckZvcm1hdCkgeworICAgIGlmICghc3RyY21wKGNvbG9yRm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIyU1ApKSB7CisgICAgICAgcmV0dXJuIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyOworICAgIH0KKworICAgIGlmICghc3RyY21wKGNvbG9yRm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwU1ApKSB7CisgICAgICAgIHJldHVybiBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChjb2xvckZvcm1hdCwgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMkkpKSB7CisgICAgICAgIHJldHVybiBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyOworICAgIH0KKworICAgIGlmICghc3RyY21wKGNvbG9yRm9ybWF0LCBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfUkdCNTY1KSkgeworICAgICAgIHJldHVybiBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU7CisgICAgfQorCisgICAgQ0hFQ0tfRVEoMCwgIlVua25vd24gY29sb3IgZm9ybWF0Iik7CiB9CiAKIC8vIHN0YXRpYwogQ2FtZXJhU291cmNlICpDYW1lcmFTb3VyY2U6OkNyZWF0ZSgpIHsKLSAgICBzcDxDYW1lcmE+IGNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdCgpOworICAgIHNwPENhbWVyYT4gY2FtZXJhID0gQ2FtZXJhOjpjb25uZWN0KDApOwogCiAgICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTI1LDkgKzEwOCw3IEBACiB9CiAKIC8vIHN0YXRpYwotQ2FtZXJhU291cmNlICpDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21JQ2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+ICZpY2FtZXJhKSB7Ci0gICAgc3A8Q2FtZXJhPiBjYW1lcmEgPSBDYW1lcmE6OmNyZWF0ZShpY2FtZXJhKTsKLQorQ2FtZXJhU291cmNlICpDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEoY29uc3Qgc3A8Q2FtZXJhPiAmY2FtZXJhKSB7CiAgICAgaWYgKGNhbWVyYS5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEzNywyMyArMTE4LDUwIEBACiAKIENhbWVyYVNvdXJjZTo6Q2FtZXJhU291cmNlKGNvbnN0IHNwPENhbWVyYT4gJmNhbWVyYSkKICAgICA6IG1DYW1lcmEoY2FtZXJhKSwKLSAgICAgIG1XaWR0aCgwKSwKLSAgICAgIG1IZWlnaHQoMCksCiAgICAgICBtRmlyc3RGcmFtZVRpbWVVcygwKSwKLSAgICAgIG1OdW1GcmFtZXMoMCksCisgICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCisgICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQoMCksCisgICAgICBtTnVtRnJhbWVzRW5jb2RlZCgwKSwKKyAgICAgIG1OdW1GcmFtZXNEcm9wcGVkKDApLAorICAgICAgbU51bUdsaXRjaGVzKDApLAorICAgICAgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXMoMjAwMDAwKSwKKyAgICAgIG1Db2xsZWN0U3RhdHMoZmFsc2UpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgicm8uaGFyZHdhcmUiLCB2YWx1ZSwgTlVMTCkgJiYgIXN0cmNtcCh2YWx1ZSwgInNob2xlcyIpKSB7Ci0gICAgICAgIC8vIFRoZSBoYXJkd2FyZSBlbmNvZGVyKHMpIGRvIG5vdCBzdXBwb3J0IHl1djQyMCwgYnV0IG9ubHkgWUNiWUNyLAotICAgICAgICAvLyBmb3J0dW5hdGVseSB0aGUgY2FtZXJhIGFsc28gc3VwcG9ydHMgdGhpcywgc28gd2UgbmVlZG4ndCB0cmFuc2NvZGUuCi0gICAgICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMoU3RyaW5nOCgicHJldmlldy1mb3JtYXQ9eXV2NDIyaS15dXl2IikpOwotICAgIH0KIAorICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIFN0cmluZzggcyA9IG1DYW1lcmEtPmdldFBhcmFtZXRlcnMoKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKwogICAgIHByaW50ZigicGFyYW1zOiBcIiVzXCJcbiIsIHMuc3RyaW5nKCkpOwogCisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNsaWNlSGVpZ2h0OwogICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHMpOwotICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmbVdpZHRoLCAmbUhlaWdodCk7CisgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisKKyAgICAvLyBDYWxjdWxhdGUgZ2xpdGNoIGR1cmF0b24gdGhyZXNob2xkIGJhc2VkIG9uIGZyYW1lIHJhdGUKKyAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IHBhcmFtcy5nZXRQcmV2aWV3RnJhbWVSYXRlKCk7CisgICAgaW50NjRfdCBnbGl0Y2hEdXJhdGlvblVzID0gKDEwMDAwMDBMTCAvIGZyYW1lUmF0ZSk7CisgICAgaWYgKGdsaXRjaER1cmF0aW9uVXMgPiBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcykgeworICAgICAgICBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcyA9IGdsaXRjaER1cmF0aW9uVXM7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqY29sb3JGb3JtYXRTdHIgPSBwYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9WSURFT19GUkFNRV9GT1JNQVQpOworICAgIENIRUNLKGNvbG9yRm9ybWF0U3RyICE9IE5VTEwpOworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBnZXRDb2xvckZvcm1hdChjb2xvckZvcm1hdFN0cik7CisKKyAgICAvLyBYWFg6IHF1ZXJ5IGNhbWVyYSBmb3IgdGhlIHN0cmlkZSBhbmQgc2xpY2UgaGVpZ2h0CisgICAgLy8gd2hlbiB0aGUgY2FwYWJpbGl0eSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICBzdHJpZGUgPSB3aWR0aDsKKyAgICBzbGljZUhlaWdodCA9IGhlaWdodDsKKworICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U3RyaWRlLCBzdHJpZGUpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2xpY2VIZWlnaHQsIHNsaWNlSGVpZ2h0KTsKKwogfQogCiBDYW1lcmFTb3VyY2U6On5DYW1lcmFTb3VyY2UoKSB7CkBAIC0xNjIsNjAgKzE3MCwxMDYgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZT4gJnN1cmZhY2UpIHsKLSAgICBtUHJldmlld1N1cmZhY2UgPSBzdXJmYWNlOwotfQotCi1zdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICopIHsKK3N0YXR1c190IENhbWVyYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGlmIChwcm9wZXJ0eV9nZXQoIm1lZGlhLnN0YWdlZnJpZ2h0LnJlY29yZC1zdGF0cyIsIHZhbHVlLCBOVUxMKQorICAgICAgICAmJiAoIXN0cmNtcCh2YWx1ZSwgIjEiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSkpIHsKKyAgICAgICAgbUNvbGxlY3RTdGF0cyA9IHRydWU7CisgICAgfQorCisgICAgbVN0YXJ0VGltZVVzID0gMDsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOworICAgIGlmIChtZXRhICYmIG1ldGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICBtU3RhcnRUaW1lVXMgPSBzdGFydFRpbWVVczsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihuZXcgQ2FtZXJhU291cmNlTGlzdGVuZXIodGhpcykpOwotCi0gICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgbUNhbWVyYS0+c2V0UHJldmlld0Rpc3BsYXkoCi0gICAgICAgICAgICAgICAgbVByZXZpZXdTdXJmYWNlICE9IE5VTEwgPyBtUHJldmlld1N1cmZhY2UgOiBuZXcgRHVtbXlTdXJmYWNlKTsKLSAgICBDSEVDS19FUShlcnIsIE9LKTsKLQotICAgIG1DYW1lcmEtPnNldFByZXZpZXdDYWxsYmFja0ZsYWdzKAotICAgICAgICAgICAgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSwotICAgICAgICAgICAgfCBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spOwotCi0gICAgZXJyID0gbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CisgICAgQ0hFQ0tfRVEoT0ssIG1DYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCkpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwotCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKLQorICAgIExPR1YoInN0b3AiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwogCisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIoTlVMTCk7CisgICAgbUNhbWVyYS0+c3RvcFJlY29yZGluZygpOworICAgIHJlbGVhc2VRdWV1ZWRGcmFtZXMoKTsKKyAgICB3aGlsZSAoIW1GcmFtZXNCZWluZ0VuY29kZWQuZW1wdHkoKSkgeworICAgICAgICBMT0dJKCJXYWl0aW5nIGZvciBvdXRzdGFuZGluZyBmcmFtZXMgYmVpbmcgZW5jb2RlZDogJWQiLAorICAgICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuc2l6ZSgpKTsKKyAgICAgICAgbUZyYW1lQ29tcGxldGVDb25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorICAgIG1DYW1lcmEgPSBOVUxMOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgaWYgKG1Db2xsZWN0U3RhdHMpIHsKKyAgICAgICAgTE9HSSgiRnJhbWVzIHJlY2VpdmVkL2VuY29kZWQvZHJvcHBlZDogJWQvJWQvJWQgaW4gJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgbU51bUZyYW1lc1JlY2VpdmVkLCBtTnVtRnJhbWVzRW5jb2RlZCwgbU51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOworICAgIH0KKworICAgIENIRUNLX0VRKG1OdW1GcmFtZXNSZWNlaXZlZCwgbU51bUZyYW1lc0VuY29kZWQgKyBtTnVtRnJhbWVzRHJvcHBlZCk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zcDxNZXRhRGF0YT4gQ2FtZXJhU291cmNlOjpnZXRGb3JtYXQoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOwordm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VRdWV1ZWRGcmFtZXMoKSB7CisgICAgTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdDsKKyAgICB3aGlsZSAoIW1GcmFtZXNSZWNlaXZlZC5lbXB0eSgpKSB7CisgICAgICAgIGl0ID0gbUZyYW1lc1JlY2VpdmVkLmJlZ2luKCk7CisgICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZSgqaXQpOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQuZXJhc2UoaXQpOworICAgICAgICArK21OdW1GcmFtZXNEcm9wcGVkOworICAgIH0KK30KIAotICAgIHJldHVybiBtZXRhOworc3A8TWV0YURhdGE+IENhbWVyYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtTWV0YTsKK30KKwordm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpIHsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworfQorCit2b2lkIENhbWVyYVNvdXJjZTo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIExPR1YoInNpZ25hbEJ1ZmZlclJldHVybmVkOiAlcCIsIGJ1ZmZlci0+ZGF0YSgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGZvciAoTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdCA9IG1GcmFtZXNCZWluZ0VuY29kZWQuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1GcmFtZXNCZWluZ0VuY29kZWQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5wb2ludGVyKCkgPT0gIGJ1ZmZlci0+ZGF0YSgpKSB7CisKKyAgICAgICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZSgoKml0KSk7CisgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICsrbU51bUZyYW1lc0VuY29kZWQ7CisgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKDApOworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtRnJhbWVDb21wbGV0ZUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDS19FUSgwLCAic2lnbmFsQnVmZmVyUmV0dXJuZWQ6IGJvZ3VzIGJ1ZmZlciIpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewotICAgIENIRUNLKG1TdGFydGVkKTsKKyAgICBMT0dWKCJyZWFkIik7CiAKICAgICAqYnVmZmVyID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIApAQCAtMjI0LDM4ICsyNzgsODkgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgd2hpbGUgKG1GcmFtZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICB3aGlsZSAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgIHdoaWxlKG1GcmFtZXNSZWNlaXZlZC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZSA9ICptRnJhbWVzUmVjZWl2ZWQuYmVnaW4oKTsKKyAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZC5lcmFzZShtRnJhbWVzUmVjZWl2ZWQuYmVnaW4oKSk7CisKKyAgICAgICAgICAgIGZyYW1lVGltZSA9ICptRnJhbWVUaW1lcy5iZWdpbigpOworICAgICAgICAgICAgbUZyYW1lVGltZXMuZXJhc2UobUZyYW1lVGltZXMuYmVnaW4oKSk7CisgICAgICAgICAgICBpbnQ2NF90IHNraXBUaW1lVXM7CisgICAgICAgICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMtPmdldFNraXBGcmFtZSgmc2tpcFRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBza2lwVGltZVVzID0gZnJhbWVUaW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNraXBUaW1lVXMgPiBmcmFtZVRpbWUpIHsKKyAgICAgICAgICAgICAgICBMT0dWKCJza2lwVGltZVVzOiAlbGxkIHVzID4gZnJhbWVUaW1lOiAlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgc2tpcFRpbWVVcywgZnJhbWVUaW1lKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZnJhbWUpOworICAgICAgICAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CisgICAgICAgICAgICAgICAgLy8gU2FmZWd1YXJkIGFnYWluc3QgdGhlIGFidXNlIG9mIHRoZSBrU2tpcEZyYW1lX09wdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAoc2tpcFRpbWVVcyAtIGZyYW1lVGltZSA+PSAxRTYpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRnJhbWUgc2tpcHBpbmcgcmVxdWVzdGVkIGlzIHdheSB0b28gbG9uZzogJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwVGltZVVzIC0gZnJhbWVUaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRnJhbWVzQmVpbmdFbmNvZGVkLnB1c2hfYmFjayhmcmFtZSk7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihmcmFtZS0+cG9pbnRlcigpLCBmcmFtZS0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPnNldE9ic2VydmVyKHRoaXMpOworICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+YWRkX3JlZigpOworICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBmcmFtZVRpbWUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgZnJhbWUgPSAqbUZyYW1lcy5iZWdpbigpOwotICAgICAgICBtRnJhbWVzLmVyYXNlKG1GcmFtZXMuYmVnaW4oKSk7Ci0KLSAgICAgICAgZnJhbWVUaW1lID0gKm1GcmFtZVRpbWVzLmJlZ2luKCk7Ci0gICAgICAgIG1GcmFtZVRpbWVzLmVyYXNlKG1GcmFtZVRpbWVzLmJlZ2luKCkpOwogICAgIH0KLQotICAgICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWUtPnNpemUoKSk7Ci0gICAgbWVtY3B5KCgqYnVmZmVyKS0+ZGF0YSgpLCBmcmFtZS0+cG9pbnRlcigpLCBmcmFtZS0+c2l6ZSgpKTsKLSAgICAoKmJ1ZmZlciktPnNldF9yYW5nZSgwLCBmcmFtZS0+c2l6ZSgpKTsKLQotICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPmNsZWFyKCk7Ci0gICAgKCpidWZmZXIpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewordm9pZCBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKSB7CisgICAgTE9HVigiZGF0YUNhbGxiYWNrVGltZXN0YW1wOiB0aW1lc3RhbXAgJWxsZCB1cyIsIHRpbWVzdGFtcFVzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaW50NjRfdCBub3dVcyA9IGdldE5vd1VzKCk7Ci0gICAgaWYgKG1OdW1GcmFtZXMgPT0gMCkgewotICAgICAgICBtRmlyc3RGcmFtZVRpbWVVcyA9IG5vd1VzOworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOworICAgICAgICArK21OdW1GcmFtZXNSZWNlaXZlZDsKKyAgICAgICAgKyttTnVtRnJhbWVzRHJvcHBlZDsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICArK21OdW1GcmFtZXM7CiAKLSAgICBtRnJhbWVzLnB1c2hfYmFjayhkYXRhKTsKLSAgICBtRnJhbWVUaW1lcy5wdXNoX2JhY2sobm93VXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7CisgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDAgJiYKKyAgICAgICAgdGltZXN0YW1wVXMgLSBtTGFzdEZyYW1lVGltZXN0YW1wVXMgPiBtR2xpdGNoRHVyYXRpb25UaHJlc2hvbGRVcykgeworICAgICAgICBpZiAobU51bUdsaXRjaGVzICUgMTAgPT0gMCkgeyAgLy8gRG9uJ3Qgc3BhbSB0aGUgbG9nCisgICAgICAgICAgICBMT0dXKCJMb25nIGRlbGF5IGRldGVjdGVkIGluIHZpZGVvIHJlY29yZGluZyIpOworICAgICAgICB9CisgICAgICAgICsrbU51bUdsaXRjaGVzOworICAgIH0KKworICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICBtRmlyc3RGcmFtZVRpbWVVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAvLyBJbml0aWFsIGRlbGF5CisgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPiAwKSB7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wVXMgPCBtU3RhcnRUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICAvLyBGcmFtZSB3YXMgY2FwdHVyZWQgYmVmb3JlIHJlY29yZGluZyB3YXMgc3RhcnRlZAorICAgICAgICAgICAgICAgIC8vIERyb3AgaXQgd2l0aG91dCB1cGRhdGluZyB0aGUgc3RhdGlzdGljYWwgZGF0YS4KKyAgICAgICAgICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXJ0VGltZVVzID0gdGltZXN0YW1wVXMgLSBtU3RhcnRUaW1lVXM7CisgICAgICAgIH0KKyAgICB9CisgICAgKyttTnVtRnJhbWVzUmVjZWl2ZWQ7CisKKyAgICBtRnJhbWVzUmVjZWl2ZWQucHVzaF9iYWNrKGRhdGEpOworICAgIGludDY0X3QgdGltZVVzID0gbVN0YXJ0VGltZVVzICsgKHRpbWVzdGFtcFVzIC0gbUZpcnN0RnJhbWVUaW1lVXMpOworICAgIG1GcmFtZVRpbWVzLnB1c2hfYmFjayh0aW1lVXMpOworICAgIExPR1YoImluaXRpYWwgZGVsYXk6ICVsbGQsIGN1cnJlbnQgdGltZSBzdGFtcDogJWxsZCIsCisgICAgICAgIG1TdGFydFRpbWVVcywgdGltZVVzKTsKICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKaW5kZXggYTY2Zjg2Yi4uNDllYWM2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAKQEAgLTE5LDExICsxOSwxNSBAQAogI2luY2x1ZGUgImluY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL1dBVkV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImluY2x1ZGUvT2dnRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCIKIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhY2hpbmdEYXRhU291cmNlLmg+CisjaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKQEAgLTUzLDE5ICs1NywyMyBAQAogTXV0ZXggRGF0YVNvdXJjZTo6Z1NuaWZmZXJNdXRleDsKIExpc3Q8RGF0YVNvdXJjZTo6U25pZmZlckZ1bmM+IERhdGFTb3VyY2U6OmdTbmlmZmVyczsKIAotYm9vbCBEYXRhU291cmNlOjpzbmlmZihTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK2Jvb2wgRGF0YVNvdXJjZTo6c25pZmYoCisgICAgICAgIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgc3A8QU1lc3NhZ2U+ICptZXRhKSB7CiAgICAgKm1pbWVUeXBlID0gIiI7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOworICAgIG1ldGEtPmNsZWFyKCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1NuaWZmZXJNdXRleCk7CiAgICAgZm9yIChMaXN0PFNuaWZmZXJGdW5jPjo6aXRlcmF0b3IgaXQgPSBnU25pZmZlcnMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IGdTbmlmZmVycy5lbmQoKTsgKytpdCkgewogICAgICAgICBTdHJpbmc4IG5ld01pbWVUeXBlOwogICAgICAgICBmbG9hdCBuZXdDb25maWRlbmNlOwotICAgICAgICBpZiAoKCppdCkodGhpcywgJm5ld01pbWVUeXBlLCAmbmV3Q29uZmlkZW5jZSkpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld01ldGE7CisgICAgICAgIGlmICgoKml0KSh0aGlzLCAmbmV3TWltZVR5cGUsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSkpIHsKICAgICAgICAgICAgIGlmIChuZXdDb25maWRlbmNlID4gKmNvbmZpZGVuY2UpIHsKICAgICAgICAgICAgICAgICAqbWltZVR5cGUgPSBuZXdNaW1lVHlwZTsKICAgICAgICAgICAgICAgICAqY29uZmlkZW5jZSA9IG5ld0NvbmZpZGVuY2U7CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXdNZXRhOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODksMTEgKzk3LDEzIEBACiAKIC8vIHN0YXRpYwogdm9pZCBEYXRhU291cmNlOjpSZWdpc3RlckRlZmF1bHRTbmlmZmVycygpIHsKLSAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZNUDMpOwogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QRUc0KTsKLSAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZBTVIpOwotICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZldBVik7CisgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmTWF0cm9za2EpOwogICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk9nZyk7CisgICAgUmVnaXN0ZXJTbmlmZmVyKFNuaWZmV0FWKTsKKyAgICBSZWdpc3RlclNuaWZmZXIoU25pZmZBTVIpOworICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QRUcyVFMpOworICAgIFJlZ2lzdGVyU25pZmZlcihTbmlmZk1QMyk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMTAzLDExICsxMTMsMTEgQEAKICAgICBpZiAoIXN0cm5jYXNlY21wKCJmaWxlOi8vIiwgdXJpLCA3KSkgewogICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkgKyA3KTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykpIHsKLSAgICAgICAgc3A8SFRUUERhdGFTb3VyY2U+IGh0dHBTb3VyY2UgPSBuZXcgSFRUUERhdGFTb3VyY2UodXJpLCBoZWFkZXJzKTsKLSAgICAgICAgaWYgKGh0dHBTb3VyY2UtPmNvbm5lY3QoKSAhPSBPSykgeworICAgICAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBodHRwU291cmNlID0gbmV3IE51SFRUUERhdGFTb3VyY2U7CisgICAgICAgIGlmIChodHRwU291cmNlLT5jb25uZWN0KHVyaSwgaGVhZGVycykgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBDYWNoaW5nRGF0YVNvdXJjZShodHRwU291cmNlLCA2NCAqIDEwMjQsIDEwKTsKKyAgICAgICAgc291cmNlID0gbmV3IE51Q2FjaGVkU291cmNlMihodHRwU291cmNlKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBBc3N1bWUgaXQncyBhIGZpbGVuYW1lLgogICAgICAgICBzb3VyY2UgPSBuZXcgRmlsZVNvdXJjZSh1cmkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCBiNmYxYWYyLi5kZDI1NzliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtNDUsNiArNDUsMTAgQEAKIH0KIAogc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXQob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBpZiAobUxlbmd0aCA+PSAwKSB7CkBAIC02Nyw2ICs3MSwxMCBAQAogfQogCiBzdGF0dXNfdCBGaWxlU291cmNlOjpnZXRTaXplKG9mZl90ICpzaXplKSB7CisgICAgaWYgKG1GaWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCiAgICAgaWYgKG1MZW5ndGggPj0gMCkgewogICAgICAgICAqc2l6ZSA9IG1MZW5ndGg7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxYzNjOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQRGF0YVNvdXJjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSFRUUERhdGFTb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL3N0YWdlZnJpZ2h0X3N0cmluZy5oIgotI2luY2x1ZGUgImluY2x1ZGUvSFRUUFN0cmVhbS5oIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0hUVFBEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IEhUVFBEYXRhU291cmNlOjpjb25uZWN0V2l0aFJlZGlyZWN0c0FuZFJhbmdlKG9mZl90IHJhbmdlU3RhcnQpIHsKLSAgICBzdHJpbmcgaG9zdCA9IG1TdGFydGluZ0hvc3Quc3RyaW5nKCk7Ci0gICAgc3RyaW5nIHBhdGggPSBtU3RhcnRpbmdQYXRoLnN0cmluZygpOwotICAgIGludCBwb3J0ID0gbVN0YXJ0aW5nUG9ydDsKLQotICAgIExPR1YoIkNvbm5lY3RpbmcgdG8gaG9zdCAnJXMnLCBwb3J0ICVkLCBwYXRoICclcyciLAotICAgICAgICAgaG9zdC5jX3N0cigpLCBwb3J0LCBwYXRoLmNfc3RyKCkpOwotCi0gICAgaW50IG51bVJlZGlyZWN0c1JlbWFpbmluZyA9IDU7Ci0gICAgd2hpbGUgKG51bVJlZGlyZWN0c1JlbWFpbmluZy0tID4gMCkgewotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRlTG9jayk7Ci0gICAgICAgICAgICBpZiAobVN0YXRlID09IERJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUh0dHAtPmNvbm5lY3QoaG9zdC5jX3N0cigpLCBwb3J0KTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nOCByZXF1ZXN0OwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiR0VUICIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZChwYXRoLmNfc3RyKCkpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIEhUVFAvMS4xXHJcbiIpOwotICAgICAgICByZXF1ZXN0LmFwcGVuZChtSGVhZGVycyk7Ci0gICAgICAgIHJlcXVlc3QuYXBwZW5kKCJIb3N0OiAiKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoaG9zdC5jX3N0cigpKTsKLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICBpZiAocmFuZ2VTdGFydCA+IDApIHsKLSAgICAgICAgICAgIGNoYXIgcmFuZ2VbMTI4XTsKLSAgICAgICAgICAgIHNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLVxyXG4iLCByYW5nZVN0YXJ0KTsKLQotICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocmFuZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICBlcnIgPSBtSHR0cC0+c2VuZChyZXF1ZXN0LnN0cmluZygpKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGh0dHBTdGF0dXM7Ci0gICAgICAgIGVyciA9IG1IdHRwLT5yZWNlaXZlX2hlYWRlcigmaHR0cFN0YXR1cyk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChodHRwU3RhdHVzID49IDIwMCAmJiBodHRwU3RhdHVzIDwgMzAwKSB7Ci0gICAgICAgICAgICBhcHBseVRpbWVvdXRSZXNwb25zZSgpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGh0dHBTdGF0dXMgIT0gMzAxICYmIGh0dHBTdGF0dXMgIT0gMzAyKSB7Ci0gICAgICAgICAgICBMT0dFKCJIVFRQIHJlcXVlc3QgZmFpbGVkIHcvIGh0dHAgc3RhdHVzICVkIiwgaHR0cFN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJpbmcgbG9jYXRpb247Ci0gICAgICAgIENIRUNLKG1IdHRwLT5maW5kX2hlYWRlcl92YWx1ZSgiTG9jYXRpb24iLCAmbG9jYXRpb24pKTsKLQotICAgICAgICBDSEVDSyhzdHJpbmcobG9jYXRpb24sIDAsIDcpID09ICJodHRwOi8vIik7Ci0gICAgICAgIGxvY2F0aW9uLmVyYXNlKDAsIDcpOwotICAgICAgICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaFBvcyA9IGxvY2F0aW9uLmZpbmQoJy8nKTsKLSAgICAgICAgaWYgKHNsYXNoUG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgc2xhc2hQb3MgPSBsb2NhdGlvbi5zaXplKCk7Ci0gICAgICAgICAgICBsb2NhdGlvbiArPSAnLyc7Ci0gICAgICAgIH0KLQotICAgICAgICBtSHR0cC0+ZGlzY29ubmVjdCgpOwotCi0gICAgICAgIExPR1YoIlJlZGlyZWN0aW5nIHRvICVzXG4iLCBsb2NhdGlvbi5jX3N0cigpKTsKLQotICAgICAgICBob3N0ID0gc3RyaW5nKGxvY2F0aW9uLCAwLCBzbGFzaFBvcyk7Ci0KLSAgICAgICAgc3RyaW5nOjpzaXplX3R5cGUgY29sb25Qb3MgPSBob3N0LmZpbmQoJzonKTsKLSAgICAgICAgaWYgKGNvbG9uUG9zICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhcnQgPSBob3N0LmNfc3RyKCkgKyBjb2xvblBvcyArIDE7Ci0gICAgICAgICAgICBjaGFyICplbmQ7Ci0gICAgICAgICAgICBsb25nIHRtcCA9IHN0cnRvbChzdGFydCwgJmVuZCwgMTApOwotICAgICAgICAgICAgQ0hFQ0soZW5kID4gc3RhcnQgJiYgKCplbmQgPT0gJ1wwJykpOwotCi0gICAgICAgICAgICBwb3J0ID0gKHRtcCA+PSAwICYmIHRtcCA8IDY1NTM2KSA/IChpbnQpdG1wIDogODA7Ci0KLSAgICAgICAgICAgIGhvc3QuZXJhc2UoY29sb25Qb3MsIGhvc3Quc2l6ZSgpIC0gY29sb25Qb3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9ydCA9IDgwOwotICAgICAgICB9Ci0KLSAgICAgICAgcGF0aCA9IHN0cmluZyhsb2NhdGlvbiwgc2xhc2hQb3MpOwotCi0gICAgICAgIG1TdGFydGluZ0hvc3QgPSBob3N0LmNfc3RyKCk7Ci0gICAgICAgIG1TdGFydGluZ1BhdGggPSBwYXRoLmNfc3RyKCk7Ci0gICAgICAgIG1TdGFydGluZ1BvcnQgPSBwb3J0OwotICAgIH0KLQotICAgIHJldHVybiBFUlJPUl9JTzsKLX0KLQotdm9pZCBIVFRQRGF0YVNvdXJjZTo6YXBwbHlUaW1lb3V0UmVzcG9uc2UoKSB7Ci0gICAgc3RyaW5nIHRpbWVvdXQ7Ci0gICAgaWYgKG1IdHRwLT5maW5kX2hlYWRlcl92YWx1ZSgiWC1Tb2NrZXRUaW1lb3V0IiwgJnRpbWVvdXQpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnMgPSB0aW1lb3V0LmNfc3RyKCk7Ci0gICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgbG9uZyB0bXAgPSBzdHJ0b2wocywgJmVuZCwgMTApOwotICAgICAgICBpZiAoZW5kID09IHMgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBMT0dXKCJJbGxlZ2FsIFgtU29ja2V0VGltZW91dCB2YWx1ZSBnaXZlbi4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExPR0koIm92ZXJyaWRpbmcgZGVmYXVsdCB0aW1lb3V0LCBuZXcgdGltZW91dCBpcyAlbGQgc2Vjb25kcyIsIHRtcCk7Ci0gICAgICAgIG1IdHRwLT5zZXRSZWNlaXZlVGltZW91dCh0bXApOwotICAgIH0KLX0KLQotSFRUUERhdGFTb3VyY2U6OkhUVFBEYXRhU291cmNlKAotICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgQ0hFQ0soIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSk7Ci0KLSAgICBzdHJpbmcgaG9zdDsKLSAgICBzdHJpbmcgcGF0aDsKLSAgICBpbnQgcG9ydDsKLQotICAgIGNvbnN0IGNoYXIgKnNsYXNoID0gc3RyY2hyKHVyaSArIDcsICcvJyk7Ci0gICAgaWYgKHNsYXNoID09IE5VTEwpIHsKLSAgICAgICAgaG9zdCA9IHVyaSArIDc7Ci0gICAgICAgIHBhdGggPSAiLyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaG9zdCA9IHN0cmluZyh1cmkgKyA3LCBzbGFzaCAtICh1cmkgKyA3KSk7Ci0gICAgICAgIHBhdGggPSBzbGFzaDsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpjb2xvbiA9IHN0cmNocihob3N0LmNfc3RyKCksICc6Jyk7Ci0gICAgaWYgKGNvbG9uID09IE5VTEwpIHsKLSAgICAgICAgcG9ydCA9IDgwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgKmVuZDsKLSAgICAgICAgbG9uZyB0bXAgPSBzdHJ0b2woY29sb24gKyAxLCAmZW5kLCAxMCk7Ci0gICAgICAgIENIRUNLKGVuZCA+IGNvbG9uICsgMSk7Ci0gICAgICAgIENIRUNLKHRtcCA+IDAgJiYgdG1wIDwgNjU1MzYpOwotICAgICAgICBwb3J0ID0gdG1wOwotCi0gICAgICAgIGhvc3QgPSBzdHJpbmcoaG9zdCwgMCwgY29sb24gLSBob3N0LmNfc3RyKCkpOwotICAgIH0KLQotICAgIG1TdGFydGluZ0hvc3QgPSBob3N0LmNfc3RyKCk7Ci0gICAgbVN0YXJ0aW5nUGF0aCA9IHBhdGguY19zdHIoKTsKLSAgICBtU3RhcnRpbmdQb3J0ID0gcG9ydDsKLQotICAgIGluaXQoaGVhZGVycyk7Ci19Ci0KLUhUVFBEYXRhU291cmNlOjpIVFRQRGF0YVNvdXJjZSgKLSAgICAgICAgY29uc3QgY2hhciAqX2hvc3QsIGludCBwb3J0LCBjb25zdCBjaGFyICpfcGF0aCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBtU3RhcnRpbmdIb3N0ID0gX2hvc3Q7Ci0gICAgbVN0YXJ0aW5nUGF0aCA9IF9wYXRoOwotICAgIG1TdGFydGluZ1BvcnQgPSBwb3J0OwotCi0gICAgaW5pdChoZWFkZXJzKTsKLX0KLQotdm9pZCBIVFRQRGF0YVNvdXJjZTo6aW5pdChjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewotICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICBtSHR0cCA9IG5ldyBIVFRQU3RyZWFtOwotCi0gICAgaW5pdEhlYWRlcnMoaGVhZGVycyk7Ci0KLSAgICBtQnVmZmVyID0gbWFsbG9jKGtCdWZmZXJTaXplKTsKLQotICAgIG1OdW1SZXRyaWVzTGVmdCA9IGtNYXhOdW1SZXRyaWVzOwotfQotCi1zdGF0dXNfdCBIVFRQRGF0YVNvdXJjZTo6Y29ubmVjdCgpIHsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdGVMb2NrKTsKLQotICAgICAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0FMUkVBRFlfQ09OTkVDVEVEOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN0YXRlID0gQ09OTkVDVElORzsKLSAgICB9Ci0KLSAgICBtQnVmZmVyTGVuZ3RoID0gMDsKLSAgICBtQnVmZmVyT2Zmc2V0ID0gMDsKLSAgICBtQ29udGVudExlbmd0aFZhbGlkID0gZmFsc2U7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0V2l0aFJlZGlyZWN0c0FuZFJhbmdlKDApOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRlTG9jayk7Ci0KLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNUSU5HKSB7Ci0gICAgICAgICAgICBMT0dWKCJjb25uZWN0KCkgY2FuY2VsbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgc3RyaW5nIHZhbHVlOwotICAgIGlmIChtSHR0cC0+ZmluZF9oZWFkZXJfdmFsdWUoIkNvbnRlbnQtTGVuZ3RoIiwgJnZhbHVlKSkgewotICAgICAgICBjaGFyICplbmQ7Ci0gICAgICAgIG1Db250ZW50TGVuZ3RoID0gc3RydG91bGwodmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotICAgICAgICBtQ29udGVudExlbmd0aFZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRlTG9jayk7Ci0KLSAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RJTkcpIHsKLSAgICAgICAgLy8gZGlzY29ubmVjdCB3YXMgY2FsbGVkIHdoZW4gd2UgaGFkIGp1c3Qgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZC4KLSAgICAgICAgTE9HVigiY29ubmVjdCgpIGNhbmNlbGxlZCAod2UgaGFkIGp1c3Qgc3VjY2VlZGVkIGNvbm5lY3RpbmcpIik7Ci0KLSAgICAgICAgbUh0dHAtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ09OTkVDVEVEOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEhUVFBEYXRhU291cmNlOjpkaXNjb25uZWN0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU3RhdGVMb2NrKTsKLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORyB8fCBtU3RhdGUgPT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIG1IdHRwLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEhUVFBEYXRhU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0ZUxvY2spOwotCi0gICAgcmV0dXJuIChtU3RhdGUgPT0gQ09OTkVDVEVEKSA/IChzdGF0dXNfdClPSyA6IEVSUk9SX05PVF9DT05ORUNURUQ7Ci19Ci0KLXN0YXR1c190IEhUVFBEYXRhU291cmNlOjpnZXRTaXplKG9mZl90ICpzaXplKSB7Ci0gICAgKnNpemUgPSAwOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVN0YXRlTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghbUNvbnRlbnRMZW5ndGhWYWxpZCkgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtQ29udGVudExlbmd0aDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotSFRUUERhdGFTb3VyY2U6On5IVFRQRGF0YVNvdXJjZSgpIHsKLSAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICBkZWxldGUgbUh0dHA7Ci0gICAgbUh0dHAgPSBOVUxMOwotCi0gICAgZnJlZShtQnVmZmVyKTsKLSAgICBtQnVmZmVyID0gTlVMTDsKLX0KLQotc3NpemVfdCBIVFRQRGF0YVNvdXJjZTo6c2VuZFJhbmdlUmVxdWVzdChzaXplX3Qgb2Zmc2V0KSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gY29ubmVjdFdpdGhSZWRpcmVjdHNBbmRSYW5nZShvZmZzZXQpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHN0cmluZyB2YWx1ZTsKLSAgICBpZiAoIW1IdHRwLT5maW5kX2hlYWRlcl92YWx1ZSgiQ29udGVudC1MZW5ndGgiLCAmdmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiBrQnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgdW5zaWduZWQgbG9uZyBjb250ZW50TGVuZ3RoID0gc3RydG91bCh2YWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICByZXR1cm4gY29udGVudExlbmd0aDsKLX0KLQotc3NpemVfdCBIVFRQRGF0YVNvdXJjZTo6cmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBMT0dWKCJyZWFkQXQgJWxkLCBzaXplICVkIiwgb2Zmc2V0LCBzaXplKTsKLQotcmluc2VfcmVwZWF0OgotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0ZUxvY2spOwotICAgICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX05PVF9DT05ORUNURUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0ID49IG1CdWZmZXJPZmZzZXQKLSAgICAgICAgICAgICYmIG9mZnNldCA8IChvZmZfdCkobUJ1ZmZlck9mZnNldCArIG1CdWZmZXJMZW5ndGgpKSB7Ci0gICAgICAgIHNpemVfdCBudW1fYnl0ZXNfYXZhaWxhYmxlID0gbUJ1ZmZlckxlbmd0aCAtIChvZmZzZXQgLSBtQnVmZmVyT2Zmc2V0KTsKLQotICAgICAgICBzaXplX3QgY29weSA9IG51bV9ieXRlc19hdmFpbGFibGU7Ci0gICAgICAgIGlmIChjb3B5ID4gc2l6ZSkgewotICAgICAgICAgICAgY29weSA9IHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHkoZGF0YSwgKGNvbnN0IGNoYXIgKiltQnVmZmVyICsgKG9mZnNldCAtIG1CdWZmZXJPZmZzZXQpLCBjb3B5KTsKLQotICAgICAgICBpZiAoY29weSA8IHNpemUpIHsKLSAgICAgICAgICAgIExPR1YoInNob3J0IHJlYWQgKDEpLCByZXR1cm5pbmcgJWQgdnMuICVkIHJlcXVlc3RlZCIsIGNvcHksIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvcHk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBjb250ZW50TGVuZ3RoID0gMDsKLSAgICBpZiAob2Zmc2V0ICE9IChvZmZfdCkobUJ1ZmZlck9mZnNldCArIG1CdWZmZXJMZW5ndGgpKSB7Ci0gICAgICAgIExPR1YoIm5ldyByYW5nZSBvZmZzZXQ9JWxkIChvbGQ9JWxkKSIsCi0gICAgICAgICAgICAgb2Zmc2V0LCBtQnVmZmVyT2Zmc2V0ICsgbUJ1ZmZlckxlbmd0aCk7Ci0KLSAgICAgICAgbUh0dHAtPmRpc2Nvbm5lY3QoKTsKLQotICAgICAgICBjb250ZW50TGVuZ3RoID0gc2VuZFJhbmdlUmVxdWVzdChvZmZzZXQpOwotCi0gICAgICAgIGlmIChjb250ZW50TGVuZ3RoID4ga0J1ZmZlclNpemUpIHsKLSAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggPSBrQnVmZmVyU2l6ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnRlbnRMZW5ndGggPSBrQnVmZmVyU2l6ZTsKLSAgICB9Ci0KLSAgICBtQnVmZmVyT2Zmc2V0ID0gb2Zmc2V0OwotCi0gICAgaWYgKG1Db250ZW50TGVuZ3RoVmFsaWQKLSAgICAgICAgICAgICYmIG1CdWZmZXJPZmZzZXQgKyBjb250ZW50TGVuZ3RoID49IChvZmZfdCltQ29udGVudExlbmd0aCkgewotICAgICAgICAvLyBJZiB3ZSBuZXZlciB0cmlnZ2VyZWQgYSByYW5nZSByZXF1ZXN0IGJ1dCBrbm93IHRoZSBjb250ZW50IGxlbmd0aCwKLSAgICAgICAgLy8gbWFrZSBzdXJlIHRvIG5vdCByZWFkIG1vcmUgZGF0YSB0aGFuIHRoZXJlIGNvdWxkIGJlLCBvdGhlcndpc2UKLSAgICAgICAgLy8gd2UnZCBibG9jayBpbmRlZmluaXRlbHkgaWYgdGhlIHNlcnZlciBkb2Vzbid0IGNsb3NlIHRoZSBjb25uZWN0aW9uLgotCi0gICAgICAgIGNvbnRlbnRMZW5ndGggPSBtQ29udGVudExlbmd0aCAtIG1CdWZmZXJPZmZzZXQ7Ci0gICAgfQotCi0gICAgaWYgKGNvbnRlbnRMZW5ndGggPD0gMCkgewotICAgICAgICByZXR1cm4gY29udGVudExlbmd0aDsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IG51bV9ieXRlc19yZWNlaXZlZCA9IG1IdHRwLT5yZWNlaXZlKG1CdWZmZXIsIGNvbnRlbnRMZW5ndGgpOwotCi0gICAgaWYgKG51bV9ieXRlc19yZWNlaXZlZCA8IDAKLSAgICAgICAgICAgIHx8IChtQ29udGVudExlbmd0aFZhbGlkICYmIG51bV9ieXRlc19yZWNlaXZlZCA8IGNvbnRlbnRMZW5ndGgpKSB7Ci0gICAgICAgIGlmIChtTnVtUmV0cmllc0xlZnQtLSA+IDApIHsKLSAgICAgICAgICAgIG1IdHRwLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBtQnVmZmVyTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWNlaXZlZCA9IGNvbm5lY3RXaXRoUmVkaXJlY3RzQW5kUmFuZ2UobUJ1ZmZlck9mZnNldCk7Ci0gICAgICAgICAgICBpZiAobnVtX2J5dGVzX3JlY2VpdmVkID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgTE9HSSgicmV0cnlpbmcgY29ubmVjdGlvbiBzdWNjZWVkZWQuIik7Ci0gICAgICAgICAgICAgICAgZ290byByaW5zZV9yZXBlYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0dFKCJyZXRyeWluZyBjb25uZWN0aW9uIGZhaWxlZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1ZmZlckxlbmd0aCA9IDA7Ci0KLSAgICAgICAgcmV0dXJuIG51bV9ieXRlc19yZWNlaXZlZDsKLSAgICB9Ci0KLSAgICBtQnVmZmVyTGVuZ3RoID0gKHNpemVfdCludW1fYnl0ZXNfcmVjZWl2ZWQ7Ci0KLSAgICBzaXplX3QgY29weSA9IG1CdWZmZXJMZW5ndGg7Ci0gICAgaWYgKGNvcHkgPiBzaXplKSB7Ci0gICAgICAgIGNvcHkgPSBzaXplOwotICAgIH0KLQotICAgIG1lbWNweShkYXRhLCBtQnVmZmVyLCBjb3B5KTsKLQotICAgIHJldHVybiBjb3B5OwotfQotCi12b2lkIEhUVFBEYXRhU291cmNlOjppbml0SGVhZGVycygKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKm92ZXJyaWRlcykgewotICAgIG1IZWFkZXJzID0gU3RyaW5nOCgpOwotCi0gICAgbUhlYWRlcnMuYXBwZW5kKCJVc2VyLUFnZW50OiBzdGFnZWZyaWdodC8xLjAgKExpbnV4O0FuZHJvaWQgIik7Ci0KLSNpZiAoUFJPUEVSVFlfVkFMVUVfTUFYIDwgOCkKLSNlcnJvciAiUFJPUEVSVFlfVkFMVUVfTUFYIG11c3QgYmUgYXQgbGVhc3QgOCIKLSNlbmRpZgotCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlIiwgdmFsdWUsICJVbmtub3duIik7Ci0gICAgbUhlYWRlcnMuYXBwZW5kKHZhbHVlKTsKLSAgICBtSGVhZGVycy5hcHBlbmQoIilcclxuIik7Ci0KLSAgICBpZiAob3ZlcnJpZGVzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3ZlcnJpZGVzLT5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGxpbmU7Ci0gICAgICAgIGxpbmUuYXBwZW5kKG92ZXJyaWRlcy0+a2V5QXQoaSkpOwotICAgICAgICBsaW5lLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbGluZS5hcHBlbmQob3ZlcnJpZGVzLT52YWx1ZUF0KGkpKTsKLSAgICAgICAgbGluZS5hcHBlbmQoIlxyXG4iKTsKLQotICAgICAgICBtSGVhZGVycy5hcHBlbmQobGluZSk7Ci0gICAgfQotfQotCi11aW50MzJfdCBIVFRQRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7Ci0gICAgdWludDMyX3QgZiA9IGtXYW50c1ByZWZldGNoaW5nOwotCi0gICAgaWYgKCFzdHJjYXNlY21wKG1TdGFydGluZ0hvc3Quc3RyaW5nKCksICJsb2NhbGhvc3QiKQotICAgICAgICAgICAgfHwgIXN0cmNtcChtU3RhcnRpbmdIb3N0LnN0cmluZygpLCAiMTI3LjAuMC4xIikpIHsKLSAgICAgICAgZiB8PSBrU3RyZWFtZWRGcm9tTG9jYWxIb3N0OwotICAgIH0KLQotICAgIHJldHVybiBmOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQU3RyZWFtLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwCmluZGV4IDljOTk4NjYuLmNjYzZhMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBTdHJlYW0uY3BwCkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIHNldFJlY2VpdmVUaW1lb3V0KDUpOyAgLy8gVGltZSBvdXQgcmVhZHMgYWZ0ZXIgNSBzZWNzIGJ5IGRlZmF1bHQKKyAgICBzZXRSZWNlaXZlVGltZW91dCgzMCk7ICAvLyBUaW1lIG91dCByZWFkcyBhZnRlciAzMCBzZWNzIGJ5IGRlZmF1bHQKIAogICAgIG1TdGF0ZSA9IENPTk5FQ1RJTkc7CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogLy8gVGhlIHdvcmthcm91bmQgYWNjZXB0cyBib3RoIGJlaGF2aW91cnMgYnV0IGNvdWxkIHBvdGVudGlhbGx5IGJyZWFrCiAvLyBsZWdpdGltYXRlIHJlc3BvbnNlcyB0aGF0IHVzZSBhIHNpbmdsZSBuZXdsaW5lIHRvICJmb2xkIiBoZWFkZXJzLCB3aGljaCBpcwogLy8gd2h5IGl0J3Mgbm90IHlldCBvbiBieSBkZWZhdWx0LgotI2RlZmluZSBXT1JLQVJPVU5EX0ZPUl9NSVNTSU5HX0NSICAgICAgIDAKKyNkZWZpbmUgV09SS0FST1VORF9GT1JfTUlTU0lOR19DUiAgICAgICAxCiAKIHN0YXR1c190IEhUVFBTdHJlYW06OnJlY2VpdmVfbGluZShjaGFyICpsaW5lLCBzaXplX3Qgc2l6ZSkgewogICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9KUEVHU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwCmluZGV4IGE0YmUyZGQuLmVjODEwOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0pQRUdTb3VyY2UuY3BwCkBAIC0xMTIsNyArMTEyLDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKaW5kZXggZjkyNTFlMS4uODJjMDQyNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUDNFeHRyYWN0b3IuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlICJpbmNsdWRlL0lEMy5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KQEAgLTQ1Niw2MCArNDU3LDc4IEBACiAgICAgTVAzU291cmNlICZvcGVyYXRvcj0oY29uc3QgTVAzU291cmNlICYpOwogfTsKIAotTVAzRXh0cmFjdG9yOjpNUDNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCitNUDNFeHRyYWN0b3I6Ok1QM0V4dHJhY3RvcigKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtRmlyc3RGcmFtZVBvcygtMSksCiAgICAgICBtRml4ZWRIZWFkZXIoMCksCiAgICAgICBtQnl0ZU51bWJlcigwKSB7CiAgICAgb2ZmX3QgcG9zID0gMDsKICAgICB1aW50MzJfdCBoZWFkZXI7Ci0gICAgYm9vbCBzdWNjZXNzID0gUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmaGVhZGVyKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKKyAgICBib29sIHN1Y2Nlc3M7CiAKLSAgICBpZiAoc3VjY2VzcykgewotICAgICAgICBtRmlyc3RGcmFtZVBvcyA9IHBvczsKLSAgICAgICAgbUZpeGVkSGVhZGVyID0gaGVhZGVyOworICAgIGludDY0X3QgbWV0YV9vZmZzZXQ7CisgICAgdWludDMyX3QgbWV0YV9oZWFkZXI7CisgICAgaWYgKG1ldGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDY0KCJvZmZzZXQiLCAmbWV0YV9vZmZzZXQpCisgICAgICAgICAgICAmJiBtZXRhLT5maW5kSW50MzIoImhlYWRlciIsIChpbnQzMl90ICopJm1ldGFfaGVhZGVyKSkgeworICAgICAgICAvLyBUaGUgc25pZmZlciBoYXMgYWxyZWFkeSBkb25lIGFsbCB0aGUgaGFyZCB3b3JrIGZvciB1cywgc2ltcGx5CisgICAgICAgIC8vIGFjY2VwdCBpdHMganVkZ2VtZW50LgorICAgICAgICBwb3MgPSAob2ZmX3QpbWV0YV9vZmZzZXQ7CisgICAgICAgIGhlYWRlciA9IG1ldGFfaGVhZGVyOwogCi0gICAgICAgIHNpemVfdCBmcmFtZV9zaXplOwotICAgICAgICBpbnQgc2FtcGxlX3JhdGU7Ci0gICAgICAgIGludCBudW1fY2hhbm5lbHM7Ci0gICAgICAgIGludCBiaXRyYXRlOwotICAgICAgICBnZXRfbXAzX2ZyYW1lX3NpemUoCi0gICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVfc2l6ZSwgJnNhbXBsZV9yYXRlLCAmbnVtX2NoYW5uZWxzLCAmYml0cmF0ZSk7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHN1Y2Nlc3MgPSBSZXN5bmMobURhdGFTb3VyY2UsIDAsICZwb3MsICZoZWFkZXIpOworICAgIH0KIAotICAgICAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKLSAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgYml0cmF0ZSAqIDEwMDApOwotICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBtRmlyc3RGcmFtZVBvcyA9IHBvczsKKyAgICBtRml4ZWRIZWFkZXIgPSBoZWFkZXI7CiAKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICAgICAgcGFyc2VfeGluZ19oZWFkZXIoCi0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zLCBOVUxMLCAmbUJ5dGVOdW1iZXIsCi0gICAgICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cywgTlVMTCwgJmR1cmF0aW9uKTsKLSAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgbU1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2ZmX3QgZmlsZVNpemU7Ci0gICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJmZpbGVTaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIDgwMDBMTCAqIChmaWxlU2l6ZSAtIG1GaXJzdEZyYW1lUG9zKSAvIGJpdHJhdGUpOwotICAgICAgICAgICAgfQorICAgIHNpemVfdCBmcmFtZV9zaXplOworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgbnVtX2NoYW5uZWxzOworICAgIGludCBiaXRyYXRlOworICAgIGdldF9tcDNfZnJhbWVfc2l6ZSgKKyAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lX3NpemUsICZzYW1wbGVfcmF0ZSwgJm51bV9jaGFubmVscywgJmJpdHJhdGUpOworCisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7CisKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgYml0cmF0ZSAqIDEwMDApOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOworCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBwYXJzZV94aW5nX2hlYWRlcigKKyAgICAgICAgICAgIG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcywgTlVMTCwgJm1CeXRlTnVtYmVyLAorICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cywgTlVMTCwgJmR1cmF0aW9uKTsKKyAgICBpZiAoZHVyYXRpb24gPiAwKSB7CisgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvZmZfdCBmaWxlU2l6ZTsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZmaWxlU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgIG1NZXRhLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICA4MDAwTEwgKiAoZmlsZVNpemUgLSBtRmlyc3RGcmFtZVBvcykgLyBiaXRyYXRlKTsKICAgICAgICAgfQogICAgIH0KLX0KIAotTVAzRXh0cmFjdG9yOjp+TVAzRXh0cmFjdG9yKCkgeworICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogc2l6ZV90IE1QM0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7Ci0gICAgcmV0dXJuIChtRmlyc3RGcmFtZVBvcyA8IDApID8gMCA6IDE7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAogc3A8TWVkaWFTb3VyY2U+IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKG1GaXJzdEZyYW1lUG9zIDwgMCB8fCBpbmRleCAhPSAwKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTUxOSw3ICs1MzgsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gTVAzRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBpZiAobUZpcnN0RnJhbWVQb3MgPCAwIHx8IGluZGV4ICE9IDApIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtNTg2LDcgKzYwNSw4IEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgIT0gTlVMTCAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBpbnQzMl90IGJpdHJhdGU7CiAgICAgICAgIGlmICghbU1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAvLyBiaXRyYXRlIGlzIGluIGJpdHMvc2VjLgpAQCAtNjM0LDYgKzY1NCw3IEBACiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgaW50IGJpdHJhdGU7CiAgICAgZm9yICg7OykgewogICAgICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1DdXJyZW50UG9zLCBidWZmZXItPmRhdGEoKSwgNCk7CiAgICAgICAgIGlmIChuIDwgNCkgewpAQCAtNjQ2LDcgKzY2Nyw3IEBACiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKIAogICAgICAgICBpZiAoKGhlYWRlciAmIGtNYXNrKSA9PSAobUZpeGVkSGVhZGVyICYga01hc2spCi0gICAgICAgICAgICAmJiBnZXRfbXAzX2ZyYW1lX3NpemUoaGVhZGVyLCAmZnJhbWVfc2l6ZSkpIHsKKyAgICAgICAgICAgICYmIGdldF9tcDNfZnJhbWVfc2l6ZShoZWFkZXIsICZmcmFtZV9zaXplLCBOVUxMLCBOVUxMLCAmYml0cmF0ZSkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTY4MSw5ICs3MDIsMTAgQEAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZV9zaXplKTsKIAogICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKIAogICAgIG1DdXJyZW50UG9zICs9IGZyYW1lX3NpemU7Ci0gICAgbUN1cnJlbnRUaW1lVXMgKz0gMTE1MiAqIDEwMDAwMDAgLyA0NDEwMDsKKyAgICBtQ3VycmVudFRpbWVVcyArPSBmcmFtZV9zaXplICogODAwMGxsIC8gYml0cmF0ZTsKIAogICAgICpvdXQgPSBidWZmZXI7CiAKQEAgLTY5Myw3ICs3MTUsNyBAQAogc3A8TWV0YURhdGE+IE1QM0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAKLSAgICBpZiAobUZpcnN0RnJhbWVQb3MgPCAwKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1ldGE7CiAgICAgfQogCkBAIC03NTYsMTUgKzc3OCwyMCBAQAogfQogCiBib29sIFNuaWZmTVAzKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsCisgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLCBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKICAgICBvZmZfdCBwb3MgPSAwOwogICAgIHVpbnQzMl90IGhlYWRlcjsKICAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZoZWFkZXIpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICAoKm1ldGEpLT5zZXRJbnQ2NCgib2Zmc2V0IiwgcG9zKTsKKyAgICAoKm1ldGEpLT5zZXRJbnQzMigiaGVhZGVyIiwgaGVhZGVyKTsKKwogICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7Ci0gICAgKmNvbmZpZGVuY2UgPSAwLjNmOworICAgICpjb25maWRlbmNlID0gMC4yZjsKIAogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRFeHRyYWN0b3IuY3BwCmluZGV4IGE0MWIyZjQuLjRiYmMyNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTQyOCw2ICs0MjgsMTQgQEAKICAgICAgICAgfQogICAgICAgICBjaHVua19zaXplID0gbnRvaDY0KGNodW5rX3NpemUpOwogICAgICAgICBkYXRhX29mZnNldCArPSA4OworCisgICAgICAgIGlmIChjaHVua19zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyAxNiBieXRlcyBsb25nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNodW5rX3NpemUgPCA4KSB7CisgICAgICAgIC8vIFRoZSBzbWFsbGVzdCB2YWxpZCBjaHVuayBpcyA4IGJ5dGVzIGxvbmcuCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgY2hhciBjaHVua1s1XTsKQEAgLTQ4NCw3ICs0OTIsNiBAQAogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpOgogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2EnLCAnZicpOgogICAgICAgICBjYXNlIEZPVVJDQygnbScsICdmJywgJ3InLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdrJywgJ2knICwncCcpOgogICAgICAgICBjYXNlIEZPVVJDQygndScsICdkJywgJ3QnLCAnYScpOgogICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpOgogICAgICAgICB7CkBAIC04NjUsNyArODcyLDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZTsKLSAgICAgICAgICAgIENIRUNLX0VRKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhfc2l6ZSksIE9LKTsKKyAgICAgICAgICAgIGVyciA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBhIGdpdmVuIGJ1ZmZlciBvbmx5IGNvbnRhaW5zIGF0IG1vc3QgMTAgZnJhZ21lbnRzLAogICAgICAgICAgICAgLy8gZWFjaCBmcmFnbWVudCBvcmlnaW5hbGx5IHByZWZpeGVkIHdpdGggYSAyIGJ5dGUgbGVuZ3RoIHdpbGwKQEAgLTEyNjYsNiArMTI3NywxNCBAQAogICAgIGhleGR1bXAoY3NkLCBjc2Rfc2l6ZSk7CiAjZW5kaWYKIAorICAgIGlmIChjc2Rfc2l6ZSA9PSAwKSB7CisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gZnVydGhlciBpbmZvcm1hdGlvbiwgaS5lLiBubyBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgICAgIC8vIExldCdzIGFzc3VtZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpbiB0aGUgbXBlZzQgaGVhZGVycworICAgICAgICAvLyBpcyBhY2N1cmF0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIGlmIChjc2Rfc2l6ZSA8IDIpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CkBAIC0xNDYwLDEyICsxNDc5LDQ1IEBACiAKICAgICAqb3V0ID0gTlVMTDsKIAorICAgIGludDY0X3QgdGFyZ2V0U2FtcGxlVGltZVVzID0gLTE7CisKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7CisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0JlZm9yZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgorICAgICAgICAgICAgICAgIGZpbmRGbGFncyA9IFNhbXBsZVRhYmxlOjprRmxhZ0FmdGVyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CisgICAgICAgICAgICAgICAgZmluZEZsYWdzID0gU2FtcGxlVGFibGU6OmtGbGFnQ2xvc2VzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kQ2xvc2VzdFNhbXBsZSgKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5maW5kU2FtcGxlQXRUaW1lKAogICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgKiBtVGltZXNjYWxlIC8gMTAwMDAwMCwKLSAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIFNhbXBsZVRhYmxlOjprU3luY1NhbXBsZV9GbGFnKTsKKyAgICAgICAgICAgICAgICAmc2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCkgeworICAgICAgICAgICAgLy8gV2UgZm91bmQgdGhlIGNsb3Nlc3Qgc2FtcGxlIGFscmVhZHksIG5vdyB3ZSB3YW50IHRoZSBzeW5jCisgICAgICAgICAgICAvLyBzYW1wbGUgcHJlY2VkaW5nIGl0IChvciB0aGUgc2FtcGxlIGl0c2VsZiBvZiBjb3Vyc2UpLCBldmVuCisgICAgICAgICAgICAvLyBpZiB0aGUgc3Vic2VxdWVudCBzeW5jIHNhbXBsZSBpcyBjbG9zZXIuCisgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdCZWZvcmU7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXg7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFN5bmNTYW1wbGVOZWFyKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgJnN5bmNTYW1wbGVJbmRleCwgZmluZEZsYWdzKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CkBAIC0xNDc5LDcgKzE1MzEsMjcgQEAKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gc2FtcGxlSW5kZXg7CisgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CisgICAgICAgIENIRUNLX0VRKE9LLCBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpKTsKKworICAgICAgICBpZiAobW9kZSA9PSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUKSB7CisgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOworICAgICAgICB9CisKKyNpZiAwCisgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVUaW1lOworICAgICAgICBDSEVDS19FUShPSywgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKKyAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZUluZGV4LCBOVUxMLCBOVUxMLCAmc3luY1NhbXBsZVRpbWUpKTsKKworICAgICAgICBMT0dJKCJzZWVrIHRvIHRpbWUgJWxsZCB1cyA9PiBzYW1wbGUgYXQgdGltZSAlbGxkIHVzLCAiCisgICAgICAgICAgICAgInN5bmMgc2FtcGxlIGF0IHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgc2Vla1RpbWVVcywKKyAgICAgICAgICAgICBzYW1wbGVUaW1lICogMTAwMDAwMGxsIC8gbVRpbWVzY2FsZSwKKyAgICAgICAgICAgICBzeW5jU2FtcGxlVGltZSAqIDEwMDAwMDBsbCAvIG1UaW1lc2NhbGUpOworI2VuZGlmCisKKyAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IHN5bmNTYW1wbGVJbmRleDsKICAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CkBAIC0xNDkxLDEzICsxNTYzLDE0IEBACiAgICAgb2ZmX3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwogICAgIHVpbnQzMl90IGR0czsKKyAgICBib29sIGlzU3luY1NhbXBsZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwogICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZkdHMpOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmR0cywgJmlzU3luY1NhbXBsZSk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTE1MjgsNiArMTYwMSwxNiBAQAogICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CiAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpZHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICB9CiAKQEAgLTE2MjQsNiArMTcwNywxNiBAQAogICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+Y2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KAogICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpZHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKworICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgfQorCiAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKIAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKQEAgLTE2MzMsNyArMTcyNiw3IEBACiAgICAgfQogfQogCi1ib29sIFNuaWZmTVBFRzQoCitzdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KAogICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICB1aW50OF90IGhlYWRlcls4XTsKIApAQCAtMTY0OSw3ICsxNzQyLDcgQEAKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRBICIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGY0diAiLCA4KQogICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBrZGRpIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwTTRWUCIsIDgpKSB7CiAgICAgICAgICptaW1lVHlwZSA9IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKLSAgICAgICAgKmNvbmZpZGVuY2UgPSAwLjE7CisgICAgICAgICpjb25maWRlbmNlID0gMC40OwogCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTE2NTcsNSArMTc1MCw4NCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGJvb2wgaXNDb21wYXRpYmxlQnJhbmQodWludDMyX3QgZm91cmNjKSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDb21wYXRpYmxlQnJhbmRzW10gPSB7CisgICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnbScpLAorICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJzInKSwKKyAgICAgICAgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCisgICAgICAgIEZPVVJDQygnMycsICdnJywgJ3AnLCAnNCcpLAorICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzEnKSwKKyAgICAgICAgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICcyJyksCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgaSA8IHNpemVvZihrQ29tcGF0aWJsZUJyYW5kcykgLyBzaXplb2Yoa0NvbXBhdGlibGVCcmFuZHNbMF0pOworICAgICAgICAgKytpKSB7CisgICAgICAgIGlmIChrQ29tcGF0aWJsZUJyYW5kc1tpXSA9PSBmb3VyY2MpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBBdHRlbXB0IHRvIGFjdHVhbGx5IHBhcnNlIHRoZSAnZnR5cCcgYXRvbSBhbmQgZGV0ZXJtaW5lIGlmIGEgc3VpdGFibGUKKy8vIGNvbXBhdGlibGUgYnJhbmQgaXMgcHJlc2VudC4KK3N0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgIHVpbnQ4X3QgaGVhZGVyWzEyXTsKKyAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCAxMikgIT0gMTIKKyAgICAgICAgICAgIHx8IG1lbWNtcCgiZnR5cCIsICZoZWFkZXJbNF0sIDQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzaXplX3QgYXRvbVNpemUgPSBVMzJfQVQoJmhlYWRlclswXSk7CisgICAgaWYgKGF0b21TaXplIDwgMTYgfHwgKGF0b21TaXplICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgaWYgKGlzQ29tcGF0aWJsZUJyYW5kKFUzMl9BVCgmaGVhZGVyWzhdKSkpIHsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IG51bUNvbXBhdGlibGVCcmFuZHMgPSAoYXRvbVNpemUgLSAxNikgLyA0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbXBhdGlibGVCcmFuZHM7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCB0bXBbNF07CisgICAgICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoMTYgKyBpICogNCwgdG1wLCA0KSAhPSA0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNDb21wYXRpYmxlQnJhbmQoVTMyX0FUKCZ0bXBbMF0pKSkgeworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqbWltZVR5cGUgPSBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7CisgICAgKmNvbmZpZGVuY2UgPSAwLjRmOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU25pZmZNUEVHNCgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgeworICAgIGlmIChCZXR0ZXJTbmlmZk1QRUc0KHNvdXJjZSwgbWltZVR5cGUsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KHNvdXJjZSwgbWltZVR5cGUsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIExPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggMmNmMGRkZi4uZGU0MjMzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTVBFRzRXcml0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC0yNCw0NiArMjgsMTU4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGNvbnN0IGludDY0X3Qga01heDMyQml0RmlsZVNpemUgPSAweDAwN2ZmZmZmZmZMTDsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0ID0gMHgwNzsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtOYWxVbml0VHlwZVBpY1BhcmFtU2V0ID0gMHgwODsKKwogY2xhc3MgTVBFRzRXcml0ZXI6OlRyYWNrIHsKIHB1YmxpYzoKICAgICBUcmFjayhNUEVHNFdyaXRlciAqb3duZXIsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKwogICAgIH5UcmFjaygpOwogCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICB2b2lkIHN0b3AoKTsKKyAgICBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBzdG9wKCk7CisgICAgc3RhdHVzX3QgcGF1c2UoKTsKICAgICBib29sIHJlYWNoZWRFT1MoKTsKIAogICAgIGludDY0X3QgZ2V0RHVyYXRpb25VcygpIGNvbnN0OwotICAgIHZvaWQgd3JpdGVUcmFja0hlYWRlcihpbnQzMl90IHRyYWNrSUQpOworICAgIGludDY0X3QgZ2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdDsKKyAgICB2b2lkIHdyaXRlVHJhY2tIZWFkZXIoaW50MzJfdCB0cmFja0lELCBib29sIHVzZTMyQml0T2Zmc2V0ID0gdHJ1ZSk7CisgICAgdm9pZCBidWZmZXJDaHVuayhpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKyAgICBib29sIGlzQXZjKCkgY29uc3QgeyByZXR1cm4gbUlzQXZjOyB9CisgICAgYm9vbCBpc0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUlzQXVkaW87IH0KKyAgICBib29sIGlzTVBFRzQoKSBjb25zdCB7IHJldHVybiBtSXNNUEVHNDsgfQorICAgIHZvaWQgYWRkQ2h1bmtPZmZzZXQob2ZmX3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgTVBFRzRXcml0ZXIgKm1Pd25lcjsKICAgICBzcDxNZXRhRGF0YT4gbU1ldGE7CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgdm9sYXRpbGUgYm9vbCBtRG9uZTsKKyAgICB2b2xhdGlsZSBib29sIG1QYXVzZWQ7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZDsKKyAgICBib29sIG1Jc0F2YzsKKyAgICBib29sIG1Jc0F1ZGlvOworICAgIGJvb2wgbUlzTVBFRzQ7CisgICAgaW50NjRfdCBtVHJhY2tEdXJhdGlvblVzOworCisgICAgLy8gRm9yIHJlYWx0aW1lIGFwcGxpY2F0aW9ucywgd2UgbmVlZCB0byBhZGp1c3QgdGhlIG1lZGlhIGNsb2NrCisgICAgLy8gZm9yIHZpZGVvIHRyYWNrIGJhc2VkIG9uIHRoZSBhdWRpbyBtZWRpYSBjbG9jaworICAgIGJvb2wgbUlzUmVhbFRpbWVSZWNvcmRpbmc7CiAgICAgaW50NjRfdCBtTWF4VGltZVN0YW1wVXM7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXM7CisgICAgaW50NjRfdCBtTWRhdFNpemVCeXRlczsKKyAgICBpbnQzMl90IG1UaW1lU2NhbGU7CiAKICAgICBwdGhyZWFkX3QgbVRocmVhZDsKIAotICAgIHN0cnVjdCBTYW1wbGVJbmZvIHsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIG9mZl90IG9mZnNldDsKLSAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgLy8gbU51bVNhbXBsZXMgaXMgdXNlZCB0byB0cmFjayBob3cgbWFueSBzYW1wbGVzIGluIG1TYW1wbGVTaXplcyBMaXN0LgorICAgIC8vIFRoaXMgaXMgdG8gcmVkdWNlIHRoZSBjb3N0IGFzc29jaWF0ZWQgd2l0aCBtU2FtcGxlU2l6ZXMuc2l6ZSgpIGNhbGwsCisgICAgLy8gc2luY2UgaXQgaXMgTyhuKS4gSWRlYWxseSwgdGhlIGZpeCBzaG91bGQgYmUgaW4gTGlzdCBjbGFzcy4KKyAgICBzaXplX3QgICAgICAgICAgICAgIG1OdW1TYW1wbGVzOworICAgIExpc3Q8c2l6ZV90PiAgICAgICAgbVNhbXBsZVNpemVzOworICAgIGJvb2wgICAgICAgICAgICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemU7CisKKyAgICBMaXN0PE1lZGlhQnVmZmVyICo+IG1DaHVua1NhbXBsZXM7CisKKyAgICBzaXplX3QgICAgICAgICAgICAgIG1OdW1TdGNvVGFibGVFbnRyaWVzOworICAgIExpc3Q8b2ZmX3Q+ICAgICAgICAgbUNodW5rT2Zmc2V0czsKKworICAgIHNpemVfdCAgICAgICAgICAgICAgbU51bVN0c2NUYWJsZUVudHJpZXM7CisgICAgc3RydWN0IFN0c2NUYWJsZUVudHJ5IHsKKworICAgICAgICBTdHNjVGFibGVFbnRyeSh1aW50MzJfdCBjaHVuaywgdWludDMyX3Qgc2FtcGxlcywgdWludDMyX3QgaWQpCisgICAgICAgICAgICA6IGZpcnN0Q2h1bmsoY2h1bmspLAorICAgICAgICAgICAgICBzYW1wbGVzUGVyQ2h1bmsoc2FtcGxlcyksCisgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSWQoaWQpIHt9CisKKyAgICAgICAgdWludDMyX3QgZmlyc3RDaHVuazsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlc1BlckNodW5rOworICAgICAgICB1aW50MzJfdCBzYW1wbGVEZXNjcmlwdGlvbklkOwogICAgIH07Ci0gICAgTGlzdDxTYW1wbGVJbmZvPiBtU2FtcGxlSW5mb3M7CisgICAgTGlzdDxTdHNjVGFibGVFbnRyeT4gbVN0c2NUYWJsZUVudHJpZXM7CisKKyAgICBzaXplX3QgICAgICAgIG1OdW1TdHNzVGFibGVFbnRyaWVzOworICAgIExpc3Q8aW50MzJfdD4gbVN0c3NUYWJsZUVudHJpZXM7CisKKyAgICBzaXplX3QgICAgICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzOworICAgIHN0cnVjdCBTdHRzVGFibGVFbnRyeSB7CisKKyAgICAgICAgU3R0c1RhYmxlRW50cnkodWludDMyX3QgY291bnQsIHVpbnQzMl90IGR1cmF0aW9uVXMpCisgICAgICAgICAgICA6IHNhbXBsZUNvdW50KGNvdW50KSwgc2FtcGxlRHVyYXRpb25VcyhkdXJhdGlvblVzKSB7fQorCisgICAgICAgIHVpbnQzMl90IHNhbXBsZUNvdW50OworICAgICAgICB1aW50MzJfdCBzYW1wbGVEdXJhdGlvblVzOworICAgIH07CisgICAgTGlzdDxTdHRzVGFibGVFbnRyeT4gbVN0dHNUYWJsZUVudHJpZXM7CisKKyAgICAvLyBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IG9yIHBpY3R1cmUgcGFyYW1ldGVyIHNldAorICAgIHN0cnVjdCBBVkNQYXJhbVNldCB7CisgICAgICAgIEFWQ1BhcmFtU2V0KHVpbnQxNl90IGxlbmd0aCwgY29uc3QgdWludDhfdCAqZGF0YSkKKyAgICAgICAgICAgIDogbUxlbmd0aChsZW5ndGgpLCBtRGF0YShkYXRhKSB7fQorCisgICAgICAgIHVpbnQxNl90IG1MZW5ndGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1EYXRhOworICAgIH07CisgICAgTGlzdDxBVkNQYXJhbVNldD4gbVNlcVBhcmFtU2V0czsKKyAgICBMaXN0PEFWQ1BhcmFtU2V0PiBtUGljUGFyYW1TZXRzOworICAgIHVpbnQ4X3QgbVByb2ZpbGVJZGM7CisgICAgdWludDhfdCBtUHJvZmlsZUNvbXBhdGlibGU7CisgICAgdWludDhfdCBtTGV2ZWxJZGM7CiAKICAgICB2b2lkICptQ29kZWNTcGVjaWZpY0RhdGE7CiAgICAgc2l6ZV90IG1Db2RlY1NwZWNpZmljRGF0YVNpemU7CisgICAgYm9vbCBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgYm9vbCBtVHJhY2tpbmdQcm9ncmVzc1N0YXR1czsKIAogICAgIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgaW50NjRfdCBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICBpbnQ2NF90IG1QcmV2aW91c1RyYWNrVGltZVVzOworICAgIGludDY0X3QgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VczsKIAogICAgIHN0YXRpYyB2b2lkICpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKTsKLSAgICB2b2lkIHRocmVhZEVudHJ5KCk7CisgICAgc3RhdHVzX3QgdGhyZWFkRW50cnkoKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnBhcnNlUGFyYW1TZXQoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgsIGludCB0eXBlLCBzaXplX3QgKnBhcmFtU2V0TGVuKTsKKworICAgIHN0YXR1c190IG1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBjb3B5QVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKKyAgICB2b2lkIHRyYWNrUHJvZ3Jlc3NTdGF0dXMoaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVyciA9IE9LKTsKKyAgICB2b2lkIGluaXRUcmFja2luZ1Byb2dyZXNzU3RhdHVzKE1ldGFEYXRhICpwYXJhbXMpOworCisgICAgdm9pZCBnZXRDb2RlY1NwZWNpZmljRGF0YUZyb21JbnB1dEZvcm1hdElmUG9zc2libGUoKTsKKworICAgIC8vIERldGVybWluZSB0aGUgdHJhY2sgdGltZSBzY2FsZQorICAgIC8vIElmIGl0IGlzIGFuIGF1ZGlvIHRyYWNrLCB0cnkgdG8gdXNlIHRoZSBzYW1wbGluZyByYXRlIGFzCisgICAgLy8gdGhlIHRpbWUgc2NhbGU7IGhvd2V2ZXIsIGlmIHVzZXIgY2hvb3NlcyB0aGUgb3ZlcndyaXRlCisgICAgLy8gdmFsdWUsIHRoZSB1c2VyLXN1cHBsaWVkIHRpbWUgc2NhbGUgd2lsbCBiZSB1c2VkLgorICAgIHZvaWQgc2V0VGltZVNjYWxlKCk7CisKKyAgICAvLyBTaW1wbGUgdmFsaWRhdGlvbiBvbiB0aGUgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgIHN0YXR1c190IGNoZWNrQ29kZWNTcGVjaWZpY0RhdGEoKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKTsKKyAgICB2b2lkIGFkZE9uZVN0c2NUYWJsZUVudHJ5KHNpemVfdCBjaHVua0lkLCBzaXplX3Qgc2FtcGxlSWQpOworICAgIHZvaWQgYWRkT25lU3Rzc1RhYmxlRW50cnkoc2l6ZV90IHNhbXBsZUlkKTsKKyAgICB2b2lkIGFkZE9uZVN0dHNUYWJsZUVudHJ5KHNpemVfdCBzYW1wbGVDb3VudCwgaW50NjRfdCBkdXJhdGlvblVzKTsKIAogICAgIFRyYWNrKGNvbnN0IFRyYWNrICYpOwogICAgIFRyYWNrICZvcGVyYXRvcj0oY29uc3QgVHJhY2sgJik7CkBAIC03MSwyOCArMTg3LDczIEBACiAKIE1QRUc0V3JpdGVyOjpNUEVHNFdyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKICAgICA6IG1GaWxlKGZvcGVuKGZpbGVuYW1lLCAid2IiKSksCisgICAgICBtVXNlNEJ5dGVOYWxMZW5ndGgodHJ1ZSksCisgICAgICBtVXNlMzJCaXRPZmZzZXQodHJ1ZSksCisgICAgICBtUGF1c2VkKGZhbHNlKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTWRhdE9mZnNldCgwKSB7CisgICAgICBtTWRhdE9mZnNldCgwKSwKKyAgICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSgwKSwKKyAgICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcygxMDAwMDAwKSB7CiAgICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCk7CiB9CiAKIE1QRUc0V3JpdGVyOjpNUEVHNFdyaXRlcihpbnQgZmQpCiAgICAgOiBtRmlsZShmZG9wZW4oZmQsICJ3YiIpKSwKKyAgICAgIG1Vc2U0Qnl0ZU5hbExlbmd0aCh0cnVlKSwKKyAgICAgIG1Vc2UzMkJpdE9mZnNldCh0cnVlKSwKKyAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1NZGF0T2Zmc2V0KDApIHsKKyAgICAgIG1NZGF0T2Zmc2V0KDApLAorICAgICAgbUVzdGltYXRlZE1vb3ZCb3hTaXplKDApLAorICAgICAgbUludGVybGVhdmVEdXJhdGlvblVzKDEwMDAwMDApIHsKICAgICBDSEVDSyhtRmlsZSAhPSBOVUxMKTsKIH0KIAogTVBFRzRXcml0ZXI6On5NUEVHNFdyaXRlcigpIHsKICAgICBzdG9wKCk7CiAKLSAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgIHdoaWxlICghbVRyYWNrcy5lbXB0eSgpKSB7CisgICAgICAgIExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICBkZWxldGUgKml0OworICAgICAgICAoKml0KSA9IE5VTEw7CisgICAgICAgIG1UcmFja3MuZXJhc2UoaXQpOwogICAgIH0KICAgICBtVHJhY2tzLmNsZWFyKCk7CiB9CiAKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICBNUEVHNFdyaXRlciAlcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgbVN0YXJ0ZWQ6ICVzXG4iLCBtU3RhcnRlZD8gInRydWUiOiAiZmFsc2UiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICAoKml0KS0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpkdW1wKAorICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICVzIHRyYWNrXG4iLCBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICByZWFjaGVkIEVPUzogJXNcbiIsCisgICAgICAgICAgICBtUmVhY2hlZEVPUz8gInRydWUiOiAiZmFsc2UiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1QRUc0V3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2sodGhpcywgc291cmNlKTsKICAgICBtVHJhY2tzLnB1c2hfYmFjayh0cmFjayk7CkBAIC0xMDAsMjMgKzI2MSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0YXJ0KCkgewotICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGJlZ2luQm94KCJmdHlwIik7Ci0gICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOwotICAgICAgd3JpdGVJbnQzMigwKTsKLSAgICAgIHdyaXRlRm91cmNjKCJpc29tIik7Ci0gICAgZW5kQm94KCk7Ci0KLSAgICBtTWRhdE9mZnNldCA9IG1PZmZzZXQ7Ci0gICAgd3JpdGUoIlx4MDBceDAwXHgwMFx4MDFtZGF0Pz8/Pz8/Pz8iLCAxNik7Ci0KK3N0YXR1c190IE1QRUc0V3JpdGVyOjpzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKSB7CiAgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gKCppdCktPnN0YXJ0KCk7CisgICAgICAgIHN0YXR1c190IGVyciA9ICgqaXQpLT5zdGFydChwYXJhbXMpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQyID0gbVRyYWNrcy5iZWdpbigpOwpAQCAtMTI3LDM0ICsyNzUsMjUwIEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE1QRUc0V3JpdGVyOjpzdG9wKCkgewotICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKK2ludDY0X3QgTVBFRzRXcml0ZXI6OmVzdGltYXRlTW9vdkJveFNpemUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBoaWdobHkgZXhwZXJpbWVudGFsL2hldXJpc2l0aWMuCisgICAgLy8KKyAgICAvLyBTdGF0aXN0aWNhbCBhbmFseXNpcyBzaG93cyB0aGF0IG1ldGFkYXRhIHVzdWFsbHkgYWNjb3VudHMKKyAgICAvLyBmb3IgYSBzbWFsbCBwb3J0aW9uIG9mIHRoZSB0b3RhbCBmaWxlIHNpemUsIHVzdWFsbHkgPCAwLjYlLgorICAgIC8vIEN1cnJlbnRseSwgbGV0cyBzZXQgdG8gMC40JSBmb3Igbm93LgorCisgICAgLy8gVGhlIGRlZmF1bHQgTUlOX01PT1ZfQk9YX1NJWkUgaXMgc2V0IHRvIDAuNCUgeCAxTUIsCisgICAgLy8gd2hlcmUgMU1CIGlzIHRoZSBjb21tb24gZmlsZSBzaXplIGxpbWl0IGZvciBNTVMgYXBwbGljYXRpb24uCisgICAgLy8gVGhlIGRlZmF1bHQgTUFYIF9NT09WX0JPWF9TSVpFIHZhbHVlIGlzIGJhc2VkIG9uIGFib3V0IDQKKyAgICAvLyBtaW51dGUgdmlkZW8gcmVjb3JkaW5nIHdpdGggYSBiaXQgcmF0ZSBhYm91dCAzIE1icHMsIGJlY2F1c2UKKyAgICAvLyBzdGF0aXN0aWNzIGFsc28gc2hvdyB0aGF0IG1vc3Qgb2YgdGhlIHZpZGVvIGNhcHR1cmVkIGFyZSBnb2luZworICAgIC8vIHRvIGJlIGxlc3MgdGhhbiAzIG1pbnV0ZXMuCisKKyAgICAvLyBJZiB0aGUgZXN0aW1hdGlvbiBpcyB3cm9uZywgd2Ugd2lsbCBwYXkgdGhlIHByaWNlIG9mIHdhc3RpbmcKKyAgICAvLyBzb21lIHJlc2VydmVkIHNwYWNlLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHNvIG9mdGVuIHN0YXRpc3RpY2FsbHkuCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZmFjdG9yID0gbVVzZTMyQml0T2Zmc2V0PyAxOiAyOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1JTl9NT09WX0JPWF9TSVpFID0gNCAqIDEwMjQ7ICAvLyA0IEtCCisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTUFYX01PT1ZfQk9YX1NJWkUgPSAoMTgwICogMzAwMDAwMCAqIDZMTCAvIDgwMDApOworICAgIGludDY0X3Qgc2l6ZSA9IE1JTl9NT09WX0JPWF9TSVpFOworCisgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgIT0gMCkgeworICAgICAgICBzaXplID0gbU1heEZpbGVTaXplTGltaXRCeXRlcyAqIDQgLyAxMDAwOworICAgIH0gZWxzZSBpZiAobU1heEZpbGVEdXJhdGlvbkxpbWl0VXMgIT0gMCkgeworICAgICAgICBpZiAoYml0UmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAvLyBXZSBjb3VsZCBub3QgZXN0aW1hdGUgdGhlIGZpbGUgc2l6ZSBzaW5jZSBiaXRSYXRlIGlzIG5vdCBzZXQuCisgICAgICAgICAgICBzaXplID0gTUlOX01PT1ZfQk9YX1NJWkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplID0gKChtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyAqIGJpdFJhdGUgKiA0KSAvIDEwMDAgLyA4MDAwMDAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2l6ZSA8IE1JTl9NT09WX0JPWF9TSVpFKSB7CisgICAgICAgIHNpemUgPSBNSU5fTU9PVl9CT1hfU0laRTsKICAgICB9CiAKLSAgICBpbnQ2NF90IG1heF9kdXJhdGlvbiA9IDA7Ci0gICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgKCppdCktPnN0b3AoKTsKKyAgICAvLyBBbnkgbG9uZyBkdXJhdGlvbiByZWNvcmRpbmcgd2lsbCBiZSBwcm9iYWJseSBlbmQgdXAgd2l0aAorICAgIC8vIG5vbi1zdHJlYW1hYmxlIG1wNCBmaWxlLgorICAgIGlmIChzaXplID4gTUFYX01PT1ZfQk9YX1NJWkUpIHsKKyAgICAgICAgc2l6ZSA9IE1BWF9NT09WX0JPWF9TSVpFOworICAgIH0KIAotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gKCppdCktPmdldER1cmF0aW9uVXMoKTsKLSAgICAgICAgaWYgKGR1cmF0aW9uID4gbWF4X2R1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtYXhfZHVyYXRpb24gPSBkdXJhdGlvbjsKKyAgICBMT0dJKCJsaW1pdHM6ICVsbGQvJWxsZCBieXRlcy91cywgYml0IHJhdGU6ICVkIGJwcyBhbmQgdGhlIGVzdGltYXRlZCIKKyAgICAgICAgICIgbW9vdiBzaXplICVsbGQgYnl0ZXMiLAorICAgICAgICAgbU1heEZpbGVTaXplTGltaXRCeXRlcywgbU1heEZpbGVEdXJhdGlvbkxpbWl0VXMsIGJpdFJhdGUsIHNpemUpOworICAgIHJldHVybiBmYWN0b3IgKiBzaXplOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtKSB7CisgICAgaWYgKG1GaWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaW50MzJfdCB1c2U2NEJpdE9mZnNldDsKKyAgICBpZiAocGFyYW0gJiYKKyAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5NjRCaXRGaWxlT2Zmc2V0LCAmdXNlNjRCaXRPZmZzZXQpICYmCisgICAgICAgIHVzZTY0Qml0T2Zmc2V0KSB7CisgICAgICAgIG1Vc2UzMkJpdE9mZnNldCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtVXNlMzJCaXRPZmZzZXQpIHsKKyAgICAgICAgLy8gSW1wbGljaXQgMzIgYml0IGZpbGUgc2l6ZSBsaW1pdAorICAgICAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgICAgICBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0ga01heDMyQml0RmlsZVNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBmaWxlIHNpemUgaXMgc2V0IHRvIGJlIGxhcmdlciB0aGFuIHRoZSAzMiBiaXQgZmlsZQorICAgICAgICAvLyBzaXplIGxpbWl0LCB0cmVhdCBpdCBhcyBhbiBlcnJvci4KKyAgICAgICAgaWYgKG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPiBrTWF4MzJCaXRGaWxlU2l6ZSkgeworICAgICAgICAgICAgTE9HVygiMzItYmkgZmlsZSBzaXplIGxpbWl0ICglbGxkIGJ5dGVzKSB0b28gYmlnLiAiCisgICAgICAgICAgICAgICAgICJJdCBpcyBjaGFuZ2VkIHRvICVsbGQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMsIGtNYXgzMkJpdEZpbGVTaXplKTsKKyAgICAgICAgICAgIG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXMgPSBrTWF4MzJCaXRGaWxlU2l6ZTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDMyX3QgdXNlMkJ5dGVOYWxMZW5ndGg7CisgICAgaWYgKHBhcmFtICYmCisgICAgICAgIHBhcmFtLT5maW5kSW50MzIoa0tleTJCeXRlTmFsTGVuZ3RoLCAmdXNlMkJ5dGVOYWxMZW5ndGgpICYmCisgICAgICAgIHVzZTJCeXRlTmFsTGVuZ3RoKSB7CisgICAgICAgIG1Vc2U0Qnl0ZU5hbExlbmd0aCA9IGZhbHNlOworICAgIH0KKworICAgIG1TdGFydFRpbWVzdGFtcFVzID0gLTE7CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBzdGFydFRyYWNrcyhwYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmICghcGFyYW0gfHwKKyAgICAgICAgIXBhcmFtLT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJm1UaW1lU2NhbGUpKSB7CisgICAgICAgIG1UaW1lU2NhbGUgPSAxMDAwOworICAgIH0KKyAgICBDSEVDSyhtVGltZVNjYWxlID4gMCk7CisgICAgTE9HVigibW92aWUgdGltZSBzY2FsZTogJWQiLCBtVGltZVNjYWxlKTsKKworICAgIG1TdHJlYW1hYmxlRmlsZSA9IHRydWU7CisgICAgbVdyaXRlTW9vdkJveFRvTWVtb3J5ID0gZmFsc2U7CisgICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOworICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKKworICAgIGJlZ2luQm94KCJmdHlwIik7CisgICAgICB7CisgICAgICAgIGludDMyX3QgZmlsZVR5cGU7CisgICAgICAgIGlmIChwYXJhbSAmJiBwYXJhbS0+ZmluZEludDMyKGtLZXlGaWxlVHlwZSwgJmZpbGVUeXBlKSAmJgorICAgICAgICAgICAgZmlsZVR5cGUgIT0gT1VUUFVUX0ZPUk1BVF9NUEVHXzQpIHsKKyAgICAgICAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZUZvdXJjYygiaXNvbSIpOworICAgICAgICB9CisgICAgICB9CisgICAgICB3cml0ZUludDMyKDApOworICAgICAgd3JpdGVGb3VyY2MoImlzb20iKTsKKyAgICAgIHdyaXRlRm91cmNjKCIzZ3A0Iik7CisgICAgZW5kQm94KCk7CisKKyAgICBtRnJlZUJveE9mZnNldCA9IG1PZmZzZXQ7CisKKyAgICBpZiAobUVzdGltYXRlZE1vb3ZCb3hTaXplID09IDApIHsKKyAgICAgICAgaW50MzJfdCBiaXRSYXRlID0gLTE7CisgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgcGFyYW0tPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgICAgICB9CisgICAgICAgIG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSA9IGVzdGltYXRlTW9vdkJveFNpemUoYml0UmF0ZSk7CisgICAgfQorICAgIENIRUNLKG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSA+PSA4KTsKKyAgICBmc2Vla28obUZpbGUsIG1GcmVlQm94T2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgd3JpdGVJbnQzMihtRXN0aW1hdGVkTW9vdkJveFNpemUpOworICAgIHdyaXRlKCJmcmVlIiwgNCk7CisKKyAgICBtTWRhdE9mZnNldCA9IG1GcmVlQm94T2Zmc2V0ICsgbUVzdGltYXRlZE1vb3ZCb3hTaXplOworICAgIG1PZmZzZXQgPSBtTWRhdE9mZnNldDsKKyAgICBmc2Vla28obUZpbGUsIG1NZGF0T2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKG1Vc2UzMkJpdE9mZnNldCkgeworICAgICAgICB3cml0ZSgiPz8/P21kYXQiLCA4KTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZSgiXHgwMFx4MDBceDAwXHgwMW1kYXQ/Pz8/Pz8/PyIsIDE2KTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGFydFdyaXRlclRocmVhZCgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBzdGFydFRyYWNrcyhwYXJhbSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgTVBFRzRXcml0ZXI6OnVzZTMyQml0RmlsZU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVVzZTMyQml0T2Zmc2V0OworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6cGF1c2UoKSB7CisgICAgaWYgKG1GaWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVRyYWNrcy5lbmQoKTsgKytpdCkgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKml0KS0+cGF1c2UoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OnN0b3BXcml0ZXJUaHJlYWQoKSB7CisgICAgTE9HVigic3RvcFdyaXRlclRocmVhZCIpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworCisgICAgICAgIG1Eb25lID0gdHJ1ZTsKKyAgICAgICAgbUNodW5rUmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorCisgICAgdm9pZCAqZHVtbXk7CisgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpzdG9wKCkgeworICAgIGlmIChtRmlsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOworICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9ICgqaXQpLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAoKml0KS0+Z2V0RHVyYXRpb25VcygpOworICAgICAgICBpZiAoZHVyYXRpb25VcyA+IG1heER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1heER1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RvcFdyaXRlclRocmVhZCgpOworCisgICAgLy8gRG8gbm90IHdyaXRlIG91dCBtb3ZpZSBoZWFkZXIgb24gZXJyb3IuCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBmZmx1c2gobUZpbGUpOworICAgICAgICBmY2xvc2UobUZpbGUpOworICAgICAgICBtRmlsZSA9IE5VTEw7CisgICAgICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCiAgICAgLy8gRml4IHVwIHRoZSBzaXplIG9mIHRoZSAnbWRhdCcgY2h1bmsuCi0gICAgZnNlZWsobUZpbGUsIG1NZGF0T2Zmc2V0ICsgOCwgU0VFS19TRVQpOwotICAgIGludDY0X3Qgc2l6ZSA9IG1PZmZzZXQgLSBtTWRhdE9mZnNldDsKLSAgICBzaXplID0gaHRvbjY0KHNpemUpOwotICAgIGZ3cml0ZSgmc2l6ZSwgMSwgOCwgbUZpbGUpOwotICAgIGZzZWVrKG1GaWxlLCBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKG1Vc2UzMkJpdE9mZnNldCkgeworICAgICAgICBmc2Vla28obUZpbGUsIG1NZGF0T2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIGludDMyX3Qgc2l6ZSA9IGh0b25sKHN0YXRpY19jYXN0PGludDMyX3Q+KG1PZmZzZXQgLSBtTWRhdE9mZnNldCkpOworICAgICAgICBmd3JpdGUoJnNpemUsIDEsIDQsIG1GaWxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmc2Vla28obUZpbGUsIG1NZGF0T2Zmc2V0ICsgOCwgU0VFS19TRVQpOworICAgICAgICBpbnQ2NF90IHNpemUgPSBtT2Zmc2V0IC0gbU1kYXRPZmZzZXQ7CisgICAgICAgIHNpemUgPSBodG9uNjQoc2l6ZSk7CisgICAgICAgIGZ3cml0ZSgmc2l6ZSwgMSwgOCwgbUZpbGUpOworICAgIH0KKyAgICBmc2Vla28obUZpbGUsIG1PZmZzZXQsIFNFRUtfU0VUKTsKIAogICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICAgIGNvbnN0IG9mZl90IG1vb3ZPZmZzZXQgPSBtT2Zmc2V0OworICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IHRydWU7CisgICAgbU1vb3ZCb3hCdWZmZXIgPSAodWludDhfdCAqKSBtYWxsb2MobUVzdGltYXRlZE1vb3ZCb3hTaXplKTsKKyAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7CisgICAgQ0hFQ0sobU1vb3ZCb3hCdWZmZXIgIT0gTlVMTCk7CisgICAgaW50MzJfdCBkdXJhdGlvbiA9IChtYXhEdXJhdGlvblVzICogbVRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CiAKICAgICBiZWdpbkJveCgibW9vdiIpOwogCkBAIC0xNjIsOSArNTI2LDkgQEAKICAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCiAgICAgICAgIHdyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKICAgICAgICAgd3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKLSAgICAgICAgd3JpdGVJbnQzMigxMDAwKTsgICAgICAgICAgLy8gdGltZXNjYWxlCi0gICAgICAgIHdyaXRlSW50MzIobWF4X2R1cmF0aW9uIC8gMTAwMCk7Ci0gICAgICAgIHdyaXRlSW50MzIoMHgxMDAwMCk7ICAgICAgIC8vIHJhdGUKKyAgICAgICAgd3JpdGVJbnQzMihtVGltZVNjYWxlKTsgICAgLy8gbXZoZCB0aW1lc2NhbGUKKyAgICAgICAgd3JpdGVJbnQzMihkdXJhdGlvbik7CisgICAgICAgIHdyaXRlSW50MzIoMHgxMDAwMCk7ICAgICAgIC8vIHJhdGU6IDEuMAogICAgICAgICB3cml0ZUludDE2KDB4MTAwKTsgICAgICAgICAvLyB2b2x1bWUKICAgICAgICAgd3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgd3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKQEAgLTE5MCwxOSArNTU0LDU1IEBACiAgICAgICBpbnQzMl90IGlkID0gMTsKICAgICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQsICsraWQpIHsKLSAgICAgICAgICAoKml0KS0+d3JpdGVUcmFja0hlYWRlcihpZCk7CisgICAgICAgICAgKCppdCktPndyaXRlVHJhY2tIZWFkZXIoaWQsIG1Vc2UzMkJpdE9mZnNldCk7CiAgICAgICB9CiAgICAgZW5kQm94KCk7ICAvLyBtb292CiAKKyAgICBtV3JpdGVNb292Qm94VG9NZW1vcnkgPSBmYWxzZTsKKyAgICBpZiAobVN0cmVhbWFibGVGaWxlKSB7CisgICAgICAgIENIRUNLKG1Nb292Qm94QnVmZmVyT2Zmc2V0ICsgOCA8PSBtRXN0aW1hdGVkTW9vdkJveFNpemUpOworCisgICAgICAgIC8vIE1vb3YgYm94CisgICAgICAgIGZzZWVrbyhtRmlsZSwgbUZyZWVCb3hPZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgbU9mZnNldCA9IG1GcmVlQm94T2Zmc2V0OworICAgICAgICB3cml0ZShtTW9vdkJveEJ1ZmZlciwgMSwgbU1vb3ZCb3hCdWZmZXJPZmZzZXQsIG1GaWxlKTsKKworICAgICAgICAvLyBGcmVlIGJveAorICAgICAgICBmc2Vla28obUZpbGUsIG1PZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgd3JpdGVJbnQzMihtRXN0aW1hdGVkTW9vdkJveFNpemUgLSBtTW9vdkJveEJ1ZmZlck9mZnNldCk7CisgICAgICAgIHdyaXRlKCJmcmVlIiwgNCk7CisKKyAgICAgICAgLy8gRnJlZSB0ZW1wIG1lbW9yeQorICAgICAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKKyAgICAgICAgbU1vb3ZCb3hCdWZmZXIgPSBOVUxMOworICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HSSgiVGhlIG1wNCBmaWxlIHdpbGwgbm90IGJlIHN0cmVhbWFibGUuIik7CisgICAgfQorCiAgICAgQ0hFQ0sobUJveGVzLmVtcHR5KCkpOwogCisgICAgZmZsdXNoKG1GaWxlKTsKICAgICBmY2xvc2UobUZpbGUpOwogICAgIG1GaWxlID0gTlVMTDsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBlcnI7CiB9CiAKLW9mZl90IE1QRUc0V3JpdGVyOjphZGRTYW1wbGUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0SW50ZXJsZWF2ZUR1cmF0aW9uKHVpbnQzMl90IGR1cmF0aW9uVXMpIHsKKyAgICBtSW50ZXJsZWF2ZUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOworICAgIHJldHVybiBPSzsKK30KIAordm9pZCBNUEVHNFdyaXRlcjo6bG9jaygpIHsKKyAgICBtTG9jay5sb2NrKCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OnVubG9jaygpIHsKKyAgICBtTG9jay51bmxvY2soKTsKK30KKworb2ZmX3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKICAgICBvZmZfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKIAogICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKQEAgLTIxMywzMSArNjEzLDg5IEBACiAgICAgcmV0dXJuIG9sZF9vZmZzZXQ7CiB9CiAKLW9mZl90IE1QRUc0V3JpdGVyOjphZGRMZW5ndGhQcmVmaXhlZFNhbXBsZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKK3N0YXRpYyB2b2lkIFN0cmlwU3RhcnRjb2RlKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAorICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworCisgICAgaWYgKCFtZW1jbXAocHRyLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpKSB7CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyA0LCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gNCk7CisgICAgfQorfQorCitvZmZfdCBNUEVHNFdyaXRlcjo6YWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CiAgICAgb2ZmX3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7CiAKICAgICBzaXplX3QgbGVuZ3RoID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKLSAgICBDSEVDSyhsZW5ndGggPCA2NTUzNik7CiAKLSAgICB1aW50OF90IHggPSBsZW5ndGggPj4gODsKLSAgICBmd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKLSAgICB4ID0gbGVuZ3RoICYgMHhmZjsKLSAgICBmd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKKyAgICBpZiAobVVzZTRCeXRlTmFsTGVuZ3RoKSB7CisgICAgICAgIHVpbnQ4X3QgeCA9IGxlbmd0aCA+PiAyNDsKKyAgICAgICAgZndyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7CisgICAgICAgIHggPSAobGVuZ3RoID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGZ3cml0ZSgmeCwgMSwgMSwgbUZpbGUpOworICAgICAgICB4ID0gKGxlbmd0aCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGZ3cml0ZSgmeCwgMSwgMSwgbUZpbGUpOworICAgICAgICB4ID0gbGVuZ3RoICYgMHhmZjsKKyAgICAgICAgZndyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7CiAKLSAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgIDEsIGxlbmd0aCwgbUZpbGUpOworICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgMSwgbGVuZ3RoLCBtRmlsZSk7CisgICAgICAgIG1PZmZzZXQgKz0gbGVuZ3RoICsgNDsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDSyhsZW5ndGggPCA2NTUzNik7CiAKLSAgICBtT2Zmc2V0ICs9IGxlbmd0aCArIDI7CisgICAgICAgIHVpbnQ4X3QgeCA9IGxlbmd0aCA+PiA4OworICAgICAgICBmd3JpdGUoJngsIDEsIDEsIG1GaWxlKTsKKyAgICAgICAgeCA9IGxlbmd0aCAmIDB4ZmY7CisgICAgICAgIGZ3cml0ZSgmeCwgMSwgMSwgbUZpbGUpOworICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgMSwgbGVuZ3RoLCBtRmlsZSk7CisgICAgICAgIG1PZmZzZXQgKz0gbGVuZ3RoICsgMjsKKyAgICB9CiAKICAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIAorc2l6ZV90IE1QRUc0V3JpdGVyOjp3cml0ZSgKKyAgICAgICAgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCBGSUxFICpzdHJlYW0pIHsKKworICAgIGNvbnN0IHNpemVfdCBieXRlcyA9IHNpemUgKiBubWVtYjsKKyAgICBpZiAobVdyaXRlTW9vdkJveFRvTWVtb3J5KSB7CisgICAgICAgIG9mZl90IG1vb3ZCb3hTaXplID0gOCArIG1Nb292Qm94QnVmZmVyT2Zmc2V0ICsgYnl0ZXM7CisgICAgICAgIGlmIChtb292Qm94U2l6ZSA+IG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSkgeworICAgICAgICAgICAgZm9yIChMaXN0PG9mZl90Pjo6aXRlcmF0b3IgaXQgPSBtQm94ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgaXQgIT0gbUJveGVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgKCppdCkgKz0gbU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZzZWVrbyhtRmlsZSwgbU9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgZndyaXRlKG1Nb292Qm94QnVmZmVyLCAxLCBtTW9vdkJveEJ1ZmZlck9mZnNldCwgc3RyZWFtKTsKKyAgICAgICAgICAgIGZ3cml0ZShwdHIsIHNpemUsIG5tZW1iLCBzdHJlYW0pOworICAgICAgICAgICAgbU9mZnNldCArPSAoYnl0ZXMgKyBtTW9vdkJveEJ1ZmZlck9mZnNldCk7CisgICAgICAgICAgICBmcmVlKG1Nb292Qm94QnVmZmVyKTsKKyAgICAgICAgICAgIG1Nb292Qm94QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG1Nb292Qm94QnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSA9IGZhbHNlOworICAgICAgICAgICAgbVN0cmVhbWFibGVGaWxlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobU1vb3ZCb3hCdWZmZXIgKyBtTW9vdkJveEJ1ZmZlck9mZnNldCwgcHRyLCBieXRlcyk7CisgICAgICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldCArPSBieXRlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZ3cml0ZShwdHIsIHNpemUsIG5tZW1iLCBzdHJlYW0pOworICAgICAgICBtT2Zmc2V0ICs9IGJ5dGVzOworICAgIH0KKyAgICByZXR1cm4gYnl0ZXM7Cit9CisKIHZvaWQgTVBFRzRXcml0ZXI6OmJlZ2luQm94KGNvbnN0IGNoYXIgKmZvdXJjYykgewogICAgIENIRUNLX0VRKHN0cmxlbihmb3VyY2MpLCA0KTsKIAotICAgIG1Cb3hlcy5wdXNoX2JhY2sobU9mZnNldCk7CisgICAgbUJveGVzLnB1c2hfYmFjayhtV3JpdGVNb292Qm94VG9NZW1vcnk/CisgICAgICAgICAgICBtTW9vdkJveEJ1ZmZlck9mZnNldDogbU9mZnNldCk7CiAKICAgICB3cml0ZUludDMyKDApOwogICAgIHdyaXRlRm91cmNjKGZvdXJjYyk7CkBAIC0yNDksNTEgKzcwNyw3OCBAQAogICAgIG9mZl90IG9mZnNldCA9ICotLW1Cb3hlcy5lbmQoKTsKICAgICBtQm94ZXMuZXJhc2UoLS1tQm94ZXMuZW5kKCkpOwogCi0gICAgZnNlZWsobUZpbGUsIG9mZnNldCwgU0VFS19TRVQpOwotICAgIHdyaXRlSW50MzIobU9mZnNldCAtIG9mZnNldCk7Ci0gICAgbU9mZnNldCAtPSA0OwotICAgIGZzZWVrKG1GaWxlLCBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKG1Xcml0ZU1vb3ZCb3hUb01lbW9yeSkgeworICAgICAgIGludDMyX3QgeCA9IGh0b25sKG1Nb292Qm94QnVmZmVyT2Zmc2V0IC0gb2Zmc2V0KTsKKyAgICAgICBtZW1jcHkobU1vb3ZCb3hCdWZmZXIgKyBvZmZzZXQsICZ4LCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmc2Vla28obUZpbGUsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICB3cml0ZUludDMyKG1PZmZzZXQgLSBvZmZzZXQpOworICAgICAgICBtT2Zmc2V0IC09IDQ7CisgICAgICAgIGZzZWVrbyhtRmlsZSwgbU9mZnNldCwgU0VFS19TRVQpOworICAgIH0KIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJbnQ4KGludDhfdCB4KSB7Ci0gICAgZndyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7Ci0gICAgKyttT2Zmc2V0OworICAgIHdyaXRlKCZ4LCAxLCAxLCBtRmlsZSk7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlSW50MTYoaW50MTZfdCB4KSB7CiAgICAgeCA9IGh0b25zKHgpOwotICAgIGZ3cml0ZSgmeCwgMSwgMiwgbUZpbGUpOwotICAgIG1PZmZzZXQgKz0gMjsKKyAgICB3cml0ZSgmeCwgMSwgMiwgbUZpbGUpOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUludDMyKGludDMyX3QgeCkgewogICAgIHggPSBodG9ubCh4KTsKLSAgICBmd3JpdGUoJngsIDEsIDQsIG1GaWxlKTsKLSAgICBtT2Zmc2V0ICs9IDQ7CisgICAgd3JpdGUoJngsIDEsIDQsIG1GaWxlKTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6d3JpdGVJbnQ2NChpbnQ2NF90IHgpIHsKICAgICB4ID0gaHRvbjY0KHgpOwotICAgIGZ3cml0ZSgmeCwgMSwgOCwgbUZpbGUpOwotICAgIG1PZmZzZXQgKz0gODsKKyAgICB3cml0ZSgmeCwgMSwgOCwgbUZpbGUpOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUNTdHJpbmcoY29uc3QgY2hhciAqcykgewogICAgIHNpemVfdCBuID0gc3RybGVuKHMpOwotCi0gICAgZndyaXRlKHMsIDEsIG4gKyAxLCBtRmlsZSk7Ci0gICAgbU9mZnNldCArPSBuICsgMTsKKyAgICB3cml0ZShzLCAxLCBuICsgMSwgbUZpbGUpOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjp3cml0ZUZvdXJjYyhjb25zdCBjaGFyICpzKSB7CiAgICAgQ0hFQ0tfRVEoc3RybGVuKHMpLCA0KTsKLSAgICBmd3JpdGUocywgMSwgNCwgbUZpbGUpOwotICAgIG1PZmZzZXQgKz0gNDsKKyAgICB3cml0ZShzLCAxLCA0LCBtRmlsZSk7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OndyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgZndyaXRlKGRhdGEsIDEsIHNpemUsIG1GaWxlKTsKLSAgICBtT2Zmc2V0ICs9IHNpemU7CisgICAgd3JpdGUoZGF0YSwgMSwgc2l6ZSwgbUZpbGUpOworfQorCitib29sIE1QRUc0V3JpdGVyOjpleGNlZWRzRmlsZVNpemVMaW1pdCgpIHsKKyAgICAvLyBObyBsaW1pdAorICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgblRvdGFsQnl0ZXNFc3RpbWF0ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KG1Fc3RpbWF0ZWRNb292Qm94U2l6ZSk7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgblRvdGFsQnl0ZXNFc3RpbWF0ZSArPSAoKml0KS0+Z2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gKG5Ub3RhbEJ5dGVzRXN0aW1hdGUgICsgMTAyNCA+PSBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzKTsKK30KKworYm9vbCBNUEVHNFdyaXRlcjo6ZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCkgeworICAgIC8vIE5vIGxpbWl0CisgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS0+Z2V0RHVyYXRpb25VcygpID49IG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIGJvb2wgTVBFRzRXcml0ZXI6OnJlYWNoZWRFT1MoKSB7CkBAIC0zMDksNiArNzk0LDI2IEBACiAgICAgcmV0dXJuIGFsbERvbmU7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OnNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBMT0dJKCJzZXRTdGFydFRpbWVzdGFtcFVzOiAlbGxkIiwgdGltZVVzKTsKKyAgICBDSEVDSyh0aW1lVXMgPj0gMCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgPCAwIHx8IG1TdGFydFRpbWVzdGFtcFVzID4gdGltZVVzKSB7CisgICAgICAgIG1TdGFydFRpbWVzdGFtcFVzID0gdGltZVVzOworICAgICAgICBMT0dJKCJFYXJsaWVzdCB0cmFjayBzdGFydGluZyB0aW1lOiAlbGxkIiwgbVN0YXJ0VGltZXN0YW1wVXMpOworICAgIH0KK30KKworaW50NjRfdCBNUEVHNFdyaXRlcjo6Z2V0U3RhcnRUaW1lc3RhbXBVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU3RhcnRUaW1lc3RhbXBVczsKK30KKworc2l6ZV90IE1QRUc0V3JpdGVyOjpudW1UcmFja3MoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUc0V3JpdGVyOjpUcmFjazo6VHJhY2soCkBAIC0zMTcsMTAgKzgyMiwxMjAgQEAKICAgICAgIG1NZXRhKHNvdXJjZS0+Z2V0Rm9ybWF0KCkpLAogICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbURvbmUoZmFsc2UpLAotICAgICAgbU1heFRpbWVTdGFtcFVzKDApLAorICAgICAgbVBhdXNlZChmYWxzZSksCisgICAgICBtUmVzdW1lZChmYWxzZSksCisgICAgICBtVHJhY2tEdXJhdGlvblVzKDApLAorICAgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzKDApLAorICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUodHJ1ZSksCiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEoTlVMTCksCiAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKDApLAorICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKICAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSB7CisgICAgZ2V0Q29kZWNTcGVjaWZpY0RhdGFGcm9tSW5wdXRGb3JtYXRJZlBvc3NpYmxlKCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIG1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBtSXNBdmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKKyAgICBtSXNNUEVHNCA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB8fAorICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIHNldFRpbWVTY2FsZSgpOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKSB7CisKKyAgICBpbnQ2NF90IHN0Y29Cb3hTaXplQnl0ZXMgPSBtT3duZXItPnVzZTMyQml0RmlsZU9mZnNldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbU51bVN0Y29UYWJsZUVudHJpZXMgKiA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbU51bVN0Y29UYWJsZUVudHJpZXMgKiA4OworCisgICAgaW50NjRfdCBzdHN6Qm94U2l6ZUJ5dGVzID0gbVNhbXBsZXNIYXZlU2FtZVNpemU/IDQ6IChtTnVtU2FtcGxlcyAqIDQpOworCisgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gbU1kYXRTaXplQnl0ZXMgKyAgICAgICAgICAgICAvLyBtZWRpYSBkYXRhIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3RzY1RhYmxlRW50cmllcyAqIDEyICsgIC8vIHN0c2MgYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtU3R0c1RhYmxlRW50cmllcyAqIDggKyAgIC8vIHN0dHMgYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNvQm94U2l6ZUJ5dGVzICsgICAgICAgICAgIC8vIHN0Y28gYm94IHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHN6Qm94U2l6ZUJ5dGVzOyAgICAgICAgICAgIC8vIHN0c3ogYm94IHNpemUKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZVN0c2NUYWJsZUVudHJ5KAorICAgICAgICBzaXplX3QgY2h1bmtJZCwgc2l6ZV90IHNhbXBsZUlkKSB7CisKKyAgICAgICAgU3RzY1RhYmxlRW50cnkgc3RzY0VudHJ5KGNodW5rSWQsIHNhbXBsZUlkLCAxKTsKKyAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMucHVzaF9iYWNrKHN0c2NFbnRyeSk7CisgICAgICAgICsrbU51bVN0c2NUYWJsZUVudHJpZXM7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVTdHNzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlSWQpIHsKKyAgICBtU3Rzc1RhYmxlRW50cmllcy5wdXNoX2JhY2soc2FtcGxlSWQpOworICAgICsrbU51bVN0c3NUYWJsZUVudHJpZXM7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVTdHRzVGFibGVFbnRyeSgKKyAgICAgICAgc2l6ZV90IHNhbXBsZUNvdW50LCBpbnQ2NF90IGR1cmF0aW9uVXMpIHsKKworICAgIFN0dHNUYWJsZUVudHJ5IHN0dHNFbnRyeShzYW1wbGVDb3VudCwgZHVyYXRpb25Vcyk7CisgICAgbVN0dHNUYWJsZUVudHJpZXMucHVzaF9iYWNrKHN0dHNFbnRyeSk7CisgICAgKyttTnVtU3R0c1RhYmxlRW50cmllczsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZl90IG9mZnNldCkgeworICAgICsrbU51bVN0Y29UYWJsZUVudHJpZXM7CisgICAgbUNodW5rT2Zmc2V0cy5wdXNoX2JhY2sob2Zmc2V0KTsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OnNldFRpbWVTY2FsZSgpIHsKKyAgICBMT0dWKCJzZXRUaW1lU2NhbGUiKTsKKyAgICAvLyBEZWZhdWx0IHRpbWUgc2NhbGUKKyAgICBtVGltZVNjYWxlID0gOTAwMDA7CisKKyAgICBpZiAobUlzQXVkaW8pIHsKKyAgICAgICAgLy8gVXNlIHRoZSBzYW1wbGluZyByYXRlIGFzIHRoZSBkZWZhdWx0IHRpbWUgc2NhbGUgZm9yIGF1ZGlvIHRyYWNrLgorICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1NZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgQ0hFQ0soc3VjY2Vzcyk7CisgICAgICAgIG1UaW1lU2NhbGUgPSBzYW1wbGVSYXRlOworICAgIH0KKworICAgIC8vIElmIHNvbWVvbmUgd291bGQgbGlrZSB0byBvdmVyd3JpdGUgdGhlIHRpbWVzY2FsZSwgdXNlIHVzZXItc3VwcGxpZWQgdmFsdWUuCisgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgaWYgKG1NZXRhLT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJnRpbWVTY2FsZSkpIHsKKyAgICAgICAgbVRpbWVTY2FsZSA9IHRpbWVTY2FsZTsKKyAgICB9CisKKyAgICBDSEVDSyhtVGltZVNjYWxlID4gMCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRDb2RlY1NwZWNpZmljRGF0YUZyb21JbnB1dEZvcm1hdElmUG9zc2libGUoKSB7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtTWV0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShtQ29kZWNTcGVjaWZpY0RhdGEsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgbUdvdEFsbENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAobU1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgRVNEUyBlc2RzKGRhdGEsIHNpemUpOworICAgICAgICAgICAgaWYgKGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmRhdGEsICZzaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgICAgICBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiBNUEVHNFdyaXRlcjo6VHJhY2s6On5UcmFjaygpIHsKQEAgLTMzMiw5ICs5NDcsMTkwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnN0YXJ0KCkgewotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7Cit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6aW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMoTWV0YURhdGEgKnBhcmFtcykgeworICAgIExPR1YoImluaXRUcmFja2luZ1Byb2dyZXNzU3RhdHVzIik7CisgICAgbVByZXZpb3VzVHJhY2tUaW1lVXMgPSAtMTsKKyAgICBtVHJhY2tpbmdQcm9ncmVzc1N0YXR1cyA9IGZhbHNlOworICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSAwOworICAgIHsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIGlmIChwYXJhbXMgJiYgcGFyYW1zLT5maW5kSW50NjQoa0tleVRyYWNrVGltZVN0YXR1cywgJnRpbWVVcykpIHsKKyAgICAgICAgICAgIExPR1YoIlJlY2VpdmUgcmVxdWVzdCB0byB0cmFjayBwcm9ncmVzcyBzdGF0dXMgZm9yIGV2ZXJ5ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICAgICAgbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA9IHRpbWVVczsKKyAgICAgICAgICAgIG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KIAorLy8gc3RhdGljCit2b2lkICpNUEVHNFdyaXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkICptZSkgeworICAgIExPR1YoIlRocmVhZFdyYXBwZXI6ICVwIiwgbWUpOworICAgIE1QRUc0V3JpdGVyICp3cml0ZXIgPSBzdGF0aWNfY2FzdDxNUEVHNFdyaXRlciAqPihtZSk7CisgICAgd3JpdGVyLT50aHJlYWRGdW5jKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OmJ1ZmZlckNodW5rKGNvbnN0IENodW5rJiBjaHVuaykgeworICAgIExPR1YoImJ1ZmZlckNodW5rOiAlcCIsIGNodW5rLm1UcmFjayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19FUShtRG9uZSwgZmFsc2UpOworCisgICAgZm9yIChMaXN0PENodW5rSW5mbz46Oml0ZXJhdG9yIGl0ID0gbUNodW5rSW5mb3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1DaHVua0luZm9zLmVuZCgpOyArK2l0KSB7CisKKyAgICAgICAgaWYgKGNodW5rLm1UcmFjayA9PSBpdC0+bVRyYWNrKSB7ICAvLyBGb3VuZCBvd25lcgorICAgICAgICAgICAgaXQtPm1DaHVua3MucHVzaF9iYWNrKGNodW5rKTsKKyAgICAgICAgICAgIG1DaHVua1JlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0soIlJlY2VpdmVkIGEgY2h1bmsgZm9yIGEgdW5rbm93biB0cmFjayIgPT0gMCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlRmlyc3RDaHVuayhDaHVua0luZm8qIGluZm8pIHsKKyAgICBMT0dWKCJ3cml0ZUZpcnN0Q2h1bms6ICVwIiwgaW5mby0+bVRyYWNrKTsKKworICAgIExpc3Q8Q2h1bms+OjppdGVyYXRvciBjaHVua0l0ID0gaW5mby0+bUNodW5rcy5iZWdpbigpOworICAgIGZvciAoTGlzdDxNZWRpYUJ1ZmZlciAqPjo6aXRlcmF0b3IgaXQgPSBjaHVua0l0LT5tU2FtcGxlcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2h1bmtJdC0+bVNhbXBsZXMuZW5kKCk7ICsraXQpIHsKKworICAgICAgICBvZmZfdCBvZmZzZXQgPSBpbmZvLT5tVHJhY2stPmlzQXZjKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woKml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWRkU2FtcGxlX2woKml0KTsKKyAgICAgICAgaWYgKGl0ID09IGNodW5rSXQtPm1TYW1wbGVzLmJlZ2luKCkpIHsKKyAgICAgICAgICAgIGluZm8tPm1UcmFjay0+YWRkQ2h1bmtPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvbmUgd2l0aCB0aGUgY3VycmVudCBjaHVuay4KKyAgICAvLyBSZWxlYXNlIGFsbCB0aGUgc2FtcGxlcyBpbiB0aGlzIGNodW5rLgorICAgIHdoaWxlICghY2h1bmtJdC0+bVNhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICBMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IGNodW5rSXQtPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7CisgICAgICAgICgqaXQpID0gTlVMTDsKKyAgICAgICAgY2h1bmtJdC0+bVNhbXBsZXMuZXJhc2UoaXQpOworICAgIH0KKyAgICBjaHVua0l0LT5tU2FtcGxlcy5jbGVhcigpOworICAgIGluZm8tPm1DaHVua3MuZXJhc2UoY2h1bmtJdCk7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OndyaXRlQ2h1bmtzKCkgeworICAgIExPR1YoIndyaXRlQ2h1bmtzIik7CisgICAgc2l6ZV90IG91dHN0YW5kaW5nQ2h1bmtzID0gMDsKKyAgICB3aGlsZSAoIW1DaHVua0luZm9zLmVtcHR5KCkpIHsKKyAgICAgICAgTGlzdDxDaHVua0luZm8+OjppdGVyYXRvciBpdCA9IG1DaHVua0luZm9zLmJlZ2luKCk7CisgICAgICAgIHdoaWxlICghaXQtPm1DaHVua3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIHdyaXRlT25lQ2h1bmsoKSk7CisgICAgICAgICAgICArK291dHN0YW5kaW5nQ2h1bmtzOworICAgICAgICB9CisgICAgICAgIGl0LT5tVHJhY2sgPSBOVUxMOworICAgICAgICBtQ2h1bmtJbmZvcy5lcmFzZShpdCk7CisgICAgfQorICAgIG1DaHVua0luZm9zLmNsZWFyKCk7CisgICAgTE9HRCgiJWQgY2h1bmtzIGFyZSB3cml0dGVuIGluIHRoZSBsYXN0IGJhdGNoIiwgb3V0c3RhbmRpbmdDaHVua3MpOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6d3JpdGVPbmVDaHVuaygpIHsKKyAgICBMT0dWKCJ3cml0ZU9uZUNodW5rIik7CisKKyAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCB0aW1lc3RhbXAsIGFuZCB3cml0ZSB0aGF0IGNodW5rIG91dAorICAgIC8vIFhYWDogV2hhdCBpZiBzb21lIHRyYWNrIGlzIGp1c3QgdG9vIHNsb3c/CisgICAgaW50NjRfdCBtaW5UaW1lc3RhbXBVcyA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMOworICAgIFRyYWNrICp0cmFjayA9IE5VTEw7CisgICAgZm9yIChMaXN0PENodW5rSW5mbz46Oml0ZXJhdG9yIGl0ID0gbUNodW5rSW5mb3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1DaHVua0luZm9zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICghaXQtPm1DaHVua3MuZW1wdHkoKSkgeworICAgICAgICAgICAgTGlzdDxDaHVuaz46Oml0ZXJhdG9yIGNodW5rSXQgPSBpdC0+bUNodW5rcy5iZWdpbigpOworICAgICAgICAgICAgaWYgKGNodW5rSXQtPm1UaW1lU3RhbXBVcyA8IG1pblRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgbWluVGltZXN0YW1wVXMgPSBjaHVua0l0LT5tVGltZVN0YW1wVXM7CisgICAgICAgICAgICAgICAgdHJhY2sgPSBpdC0+bVRyYWNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgTE9HVigiTm90aGluZyB0byBiZSB3cml0dGVuIGFmdGVyIGFsbCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1Jc0ZpcnN0Q2h1bmspIHsKKyAgICAgICAgbUlzRmlyc3RDaHVuayA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKExpc3Q8Q2h1bmtJbmZvPjo6aXRlcmF0b3IgaXQgPSBtQ2h1bmtJbmZvcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbUNodW5rSW5mb3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5tVHJhY2sgPT0gdHJhY2spIHsKKyAgICAgICAgICAgIHdyaXRlRmlyc3RDaHVuaygmKCppdCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6dGhyZWFkRnVuYygpIHsKKyAgICBMT0dWKCJ0aHJlYWRGdW5jIik7CisKKyAgICB3aGlsZSAoIW1Eb25lKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgICAgICAgICBtQ2h1bmtSZWFkeUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICAgICAgICAgIENIRUNLX0VRKHdyaXRlT25lQ2h1bmsoKSwgT0spOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICAvLyBXcml0ZSBBTEwgc2FtcGxlcworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgICAgICB3cml0ZUNodW5rcygpOworICAgIH0KK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN0YXJ0V3JpdGVyVGhyZWFkKCkgeworICAgIExPR1YoInN0YXJ0V3JpdGVyVGhyZWFkIik7CisKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1Jc0ZpcnN0Q2h1bmsgPSB0cnVlOworICAgIG1EcmlmdFRpbWVVcyA9IDA7CisgICAgZm9yIChMaXN0PFRyYWNrICo+OjppdGVyYXRvciBpdCA9IG1UcmFja3MuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQ2h1bmtJbmZvIGluZm87CisgICAgICAgIGluZm8ubVRyYWNrID0gKml0OworICAgICAgICBtQ2h1bmtJbmZvcy5wdXNoX2JhY2soaW5mbyk7CisgICAgfQorCisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICZhdHRyLCBUaHJlYWRXcmFwcGVyLCB0aGlzKTsKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7CisgICAgcmV0dXJuIE9LOworfQorCisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIGlmICghbURvbmUgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CisgICAgaWYgKHBhcmFtcyA9PSBOVUxMIHx8ICFwYXJhbXMtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnN0YXJ0VGltZVVzKSkgeworICAgICAgICBzdGFydFRpbWVVcyA9IDA7CisgICAgfQorCisgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcgPSB0cnVlOworICAgIHsKKyAgICAgICAgaW50MzJfdCBpc05vdFJlYWxUaW1lOworICAgICAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlOb3RSZWFsVGltZSwgJmlzTm90UmVhbFRpbWUpKSB7CisgICAgICAgICAgICBtSXNSZWFsVGltZVJlY29yZGluZyA9IChpc05vdFJlYWxUaW1lID09IDApOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdFRyYWNraW5nUHJvZ3Jlc3NTdGF0dXMocGFyYW1zKTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQobWV0YS5nZXQoKSk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRG9uZSA9IG1SZWFjaGVkRU9TID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTM0NSw4ICsxMTQxLDE0IEBACiAgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CiAKICAgICBtRG9uZSA9IGZhbHNlOwotICAgIG1NYXhUaW1lU3RhbXBVcyA9IDA7CisgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7CiAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOworICAgIG1OdW1TdGNvVGFibGVFbnRyaWVzID0gMDsKKyAgICBtTnVtU3Rzc1RhYmxlRW50cmllcyA9IDA7CisgICAgbU51bVN0c2NUYWJsZUVudHJpZXMgPSAwOworICAgIG1OdW1TdHRzVGFibGVFbnRyaWVzID0gMDsKKyAgICBtTWRhdFNpemVCeXRlcyA9IDA7CiAKICAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgJmF0dHIsIFRocmVhZFdyYXBwZXIsIHRoaXMpOwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKQEAgLTM1NCw5ICsxMTU2LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6c3RvcCgpIHsKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6cGF1c2UoKSB7CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnN0b3AoKSB7CiAgICAgaWYgKG1Eb25lKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIG1Eb25lID0gdHJ1ZTsKQEAgLTM2NCw3ICsxMTcxLDE2IEBACiAgICAgdm9pZCAqZHVtbXk7CiAgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CiAKLSAgICBtU291cmNlLT5zdG9wKCk7CisgICAgc3RhdHVzX3QgZXJyID0gKHN0YXR1c190KSBkdW1teTsKKworICAgIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBpZiAoZXJyID09IE9LICYmIHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgZXJyID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKIH0KIAogYm9vbCBNUEVHNFdyaXRlcjo6VHJhY2s6OnJlYWNoZWRFT1MoKSB7CkBAIC0zNzUsMTYwICsxMTkxLDY1MyBAQAogdm9pZCAqTVBFRzRXcml0ZXI6OlRyYWNrOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7CiAgICAgVHJhY2sgKnRyYWNrID0gc3RhdGljX2Nhc3Q8VHJhY2sgKj4obWUpOwogCi0gICAgdHJhY2stPnRocmVhZEVudHJ5KCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKKyAgICBzdGF0dXNfdCBlcnIgPSB0cmFjay0+dGhyZWFkRW50cnkoKTsKKyAgICByZXR1cm4gKHZvaWQgKikgZXJyOwogfQogCi12b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dGhyZWFkRW50cnkoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwotICAgIGJvb2wgaXNfbXBlZzQgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7Ci0gICAgYm9vbCBpc19hdmMgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOwotICAgIGludDMyX3QgY291bnQgPSAwOworc3RhdGljIHZvaWQgZ2V0TmFsVW5pdFR5cGUodWludDhfdCBieXRlLCB1aW50OF90KiB0eXBlKSB7CisgICAgTE9HVigiZ2V0TmFsVW5pdFR5cGU6ICVkIiwgYnl0ZSk7CiAKKyAgICAvLyBuYWxfdW5pdF90eXBlOiA1LWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgICAgKnR5cGUgPSAoYnl0ZSAmIDB4MUYpOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCAqZmluZE5leHRTdGFydENvZGUoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpIHsKKworICAgIExPR1YoImZpbmROZXh0U3RhcnRDb2RlOiAlcCAlZCIsIGRhdGEsIGxlbmd0aCk7CisKKyAgICBzaXplX3QgYnl0ZXNMZWZ0ID0gbGVuZ3RoOworICAgIHdoaWxlIChieXRlc0xlZnQgPiA0ICAmJgorICAgICAgICAgICAgbWVtY21wKCJceDAwXHgwMFx4MDBceDAxIiwgJmRhdGFbbGVuZ3RoIC0gYnl0ZXNMZWZ0XSwgNCkpIHsKKyAgICAgICAgLS1ieXRlc0xlZnQ7CisgICAgfQorICAgIGlmIChieXRlc0xlZnQgPD0gNCkgeworICAgICAgICBieXRlc0xlZnQgPSAwOyAvLyBMYXN0IHBhcmFtZXRlciBzZXQKKyAgICB9CisgICAgcmV0dXJuICZkYXRhW2xlbmd0aCAtIGJ5dGVzTGVmdF07Cit9CisKK2NvbnN0IHVpbnQ4X3QgKk1QRUc0V3JpdGVyOjpUcmFjazo6cGFyc2VQYXJhbVNldCgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCwgaW50IHR5cGUsIHNpemVfdCAqcGFyYW1TZXRMZW4pIHsKKworICAgIExPR1YoInBhcnNlUGFyYW1TZXQiKTsKKyAgICBDSEVDSyh0eXBlID09IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0IHx8CisgICAgICAgICAgdHlwZSA9PSBrTmFsVW5pdFR5cGVQaWNQYXJhbVNldCk7CisKKyAgICBjb25zdCB1aW50OF90ICpuZXh0U3RhcnRDb2RlID0gZmluZE5leHRTdGFydENvZGUoZGF0YSwgbGVuZ3RoKTsKKyAgICAqcGFyYW1TZXRMZW4gPSBuZXh0U3RhcnRDb2RlIC0gZGF0YTsKKyAgICBpZiAoKnBhcmFtU2V0TGVuID09IDApIHsKKyAgICAgICAgTE9HRSgiUGFyYW0gc2V0IGlzIG1hbGZvcm1lZCwgc2luY2UgaXRzIGxlbmd0aCBpcyAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFWQ1BhcmFtU2V0IHBhcmFtU2V0KCpwYXJhbVNldExlbiwgZGF0YSk7CisgICAgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlU2VxUGFyYW1TZXQpIHsKKyAgICAgICAgaWYgKCpwYXJhbVNldExlbiA8IDQpIHsKKyAgICAgICAgICAgIExPR0UoIlNlcSBwYXJhbWV0ZXIgc2V0IG1hbGZvcm1lZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZXFQYXJhbVNldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgbVByb2ZpbGVJZGMgPSBkYXRhWzFdOworICAgICAgICAgICAgbVByb2ZpbGVDb21wYXRpYmxlID0gZGF0YVsyXTsKKyAgICAgICAgICAgIG1MZXZlbElkYyA9IGRhdGFbM107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVByb2ZpbGVJZGMgIT0gZGF0YVsxXSB8fAorICAgICAgICAgICAgICAgIG1Qcm9maWxlQ29tcGF0aWJsZSAhPSBkYXRhWzJdIHx8CisgICAgICAgICAgICAgICAgbUxldmVsSWRjICE9IGRhdGFbM10pIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbmNvbnNpc3RlbnQgcHJvZmlsZS9sZXZlbCBmb3VuZCBpbiBzZXEgcGFyYW1ldGVyIHNldHMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU2VxUGFyYW1TZXRzLnB1c2hfYmFjayhwYXJhbVNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBpY1BhcmFtU2V0cy5wdXNoX2JhY2socGFyYW1TZXQpOworICAgIH0KKyAgICByZXR1cm4gbmV4dFN0YXJ0Q29kZTsKK30KKworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpjb3B5QVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTE9HVigiY29weUFWQ0NvZGVjU3BlY2lmaWNEYXRhIik7CisKKyAgICAvLyAyIGJ5dGVzIGZvciBlYWNoIG9mIHRoZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aCBmaWVsZAorICAgIC8vIHBsdXMgdGhlIDcgYnl0ZXMgZm9yIHRoZSBoZWFkZXIKKyAgICBpZiAoc2l6ZSA8IDQgKyA3KSB7CisgICAgICAgIExPR0UoIkNvZGVjIHNwZWNpZmljIGRhdGEgbGVuZ3RoIHRvbyBzaG9ydDogJWQiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gc2l6ZTsKKyAgICBtQ29kZWNTcGVjaWZpY0RhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgbWVtY3B5KG1Db2RlY1NwZWNpZmljRGF0YSwgZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnBhcnNlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisKKyAgICBMT0dWKCJwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIik7CisgICAgLy8gRGF0YSBzdGFydHMgd2l0aCBhIHN0YXJ0IGNvZGUuCisgICAgLy8gU1BTIGFuZCBQUFMgYXJlIHNlcGFyYXRlZCB3aXRoIHN0YXJ0IGNvZGVzLgorICAgIC8vIEFsc28sIFNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUworICAgIHVpbnQ4X3QgdHlwZSA9IGtOYWxVbml0VHlwZVNlcVBhcmFtU2V0OworICAgIGJvb2wgZ290U3BzID0gZmFsc2U7CisgICAgYm9vbCBnb3RQcHMgPSBmYWxzZTsKKyAgICBjb25zdCB1aW50OF90ICp0bXAgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKm5leHRTdGFydENvZGUgPSBkYXRhOworICAgIHNpemVfdCBieXRlc0xlZnQgPSBzaXplOworICAgIHNpemVfdCBwYXJhbVNldExlbiA9IDA7CisgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA9IDA7CisgICAgd2hpbGUgKGJ5dGVzTGVmdCA+IDQgJiYgIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIHRtcCwgNCkpIHsKKyAgICAgICAgZ2V0TmFsVW5pdFR5cGUoKih0bXAgKyA0KSwgJnR5cGUpOworICAgICAgICBpZiAodHlwZSA9PSBrTmFsVW5pdFR5cGVTZXFQYXJhbVNldCkgeworICAgICAgICAgICAgaWYgKGdvdFBwcykgeworICAgICAgICAgICAgICAgIExPR0UoIlNQUyBtdXN0IGNvbWUgYmVmb3JlIFBQUyIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWdvdFNwcykgeworICAgICAgICAgICAgICAgIGdvdFNwcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0U3RhcnRDb2RlID0gcGFyc2VQYXJhbVNldCh0bXAgKyA0LCBieXRlc0xlZnQgLSA0LCB0eXBlLCAmcGFyYW1TZXRMZW4pOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga05hbFVuaXRUeXBlUGljUGFyYW1TZXQpIHsKKyAgICAgICAgICAgIGlmICghZ290U3BzKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiU1BTIG11c3QgY29tZSBiZWZvcmUgUFBTIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ290UHBzKSB7CisgICAgICAgICAgICAgICAgZ290UHBzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRTdGFydENvZGUgPSBwYXJzZVBhcmFtU2V0KHRtcCArIDQsIGJ5dGVzTGVmdCAtIDQsIHR5cGUsICZwYXJhbVNldExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJPbmx5IFNQUyBhbmQgUFBTIE5hbCB1bml0cyBhcmUgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV4dFN0YXJ0Q29kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSBvbiB0byBmaW5kIHRoZSBuZXh0IHBhcmFtZXRlciBzZXQKKyAgICAgICAgYnl0ZXNMZWZ0IC09IG5leHRTdGFydENvZGUgLSB0bXA7CisgICAgICAgIHRtcCA9IG5leHRTdGFydENvZGU7CisgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKz0gKDIgKyBwYXJhbVNldExlbik7CisgICAgfQorCisgICAgeworICAgICAgICAvLyBDaGVjayBvbiB0aGUgbnVtYmVyIG9mIHNlcSBwYXJhbWV0ZXIgc2V0cworICAgICAgICBzaXplX3QgblNlcVBhcmFtU2V0cyA9IG1TZXFQYXJhbVNldHMuc2l6ZSgpOworICAgICAgICBpZiAoblNlcVBhcmFtU2V0cyA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJDb3VuZCBub3QgZmluZCBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Iik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5TZXFQYXJhbVNldHMgPiAweDFGKSB7CisgICAgICAgICAgICBMT0dFKCJUb28gbWFueSBzZXEgcGFyYW1ldGVyIHNldHMgKCVkKSBmb3VuZCIsIG5TZXFQYXJhbVNldHMpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgb24gdGhlIG51bWJlciBvZiBwaWMgcGFyYW1ldGVyIHNldHMKKyAgICAgICAgc2l6ZV90IG5QaWNQYXJhbVNldHMgPSBtUGljUGFyYW1TZXRzLnNpemUoKTsKKyAgICAgICAgaWYgKG5QaWNQYXJhbVNldHMgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgiQ291bmQgbm90IGZpbmQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0Iik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmIChuUGljUGFyYW1TZXRzID4gMHhGRikgeworICAgICAgICAgICAgTE9HRSgiVG9vIG1hbnkgcGljIHBhcmFtZXRlciBzZXRzICglZCkgZm91bmQiLCBuUGljUGFyYW1TZXRzKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIENoZWNrIG9uIHRoZSBwcm9maWxlcworICAgICAgICAvLyBUaGVzZSBwcm9maWxlcyByZXF1aXJlcyBhZGRpdGlvbmFsIHBhcmFtZXRlciBzZXQgZXh0ZW5zaW9ucworICAgICAgICBpZiAobVByb2ZpbGVJZGMgPT0gMTAwIHx8IG1Qcm9maWxlSWRjID09IDExMCB8fAorICAgICAgICAgICAgbVByb2ZpbGVJZGMgPT0gMTIyIHx8IG1Qcm9maWxlSWRjID09IDE0NCkgeworICAgICAgICAgICAgTE9HRSgiU29ycnksIG5vIHN1cHBvcnQgZm9yIHByb2ZpbGVfaWRjOiAlZCEiLCBtUHJvZmlsZUlkYyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6Om1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKworICAgIGlmIChtQ29kZWNTcGVjaWZpY0RhdGEgIT0gTlVMTCkgeworICAgICAgICBMT0dFKCJBbHJlYWR5IGhhdmUgY29kZWMgc3BlY2lmaWMgZGF0YSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICBMT0dFKCJDb2RlYyBzcGVjaWZpYyBkYXRhIGxlbmd0aCB0b28gc2hvcnQ6ICVkIiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gRGF0YSBpcyBpbiB0aGUgZm9ybSBvZiBBVkNDb2RlY1NwZWNpZmljRGF0YQorICAgIGlmIChtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBkYXRhLCA0KSkgeworICAgICAgICByZXR1cm4gY29weUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpOworICAgIH0KKworICAgIGlmIChwYXJzZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGRhdGEsIHNpemUpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gSVNPIDE0NDk2LTE1OiBBVkMgZmlsZSBmb3JtYXQKKyAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplICs9IDc7ICAvLyA3IG1vcmUgYnl0ZXMgaW4gdGhlIGhlYWRlcgorICAgIG1Db2RlY1NwZWNpZmljRGF0YSA9IG1hbGxvYyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICB1aW50OF90ICpoZWFkZXIgPSAodWludDhfdCAqKW1Db2RlY1NwZWNpZmljRGF0YTsKKyAgICBoZWFkZXJbMF0gPSAxOyAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24KKyAgICBoZWFkZXJbMV0gPSBtUHJvZmlsZUlkYzsgICAgICAgICAgIC8vIHByb2ZpbGUgaW5kaWNhdGlvbgorICAgIGhlYWRlclsyXSA9IG1Qcm9maWxlQ29tcGF0aWJsZTsgICAgLy8gcHJvZmlsZSBjb21wYXRpYmlsaXR5CisgICAgaGVhZGVyWzNdID0gbUxldmVsSWRjOworCisgICAgLy8gNi1iaXQgJzExMTExMScgZm9sbG93ZWQgYnkgMi1iaXQgdG8gbGVuZ3RoU2l6ZU1pbnV1c09uZQorICAgIGlmIChtT3duZXItPnVzZU5hbExlbmd0aEZvdXIoKSkgeworICAgICAgICBoZWFkZXJbNF0gPSAweGZjIHwgMzsgIC8vIGxlbmd0aCBzaXplID09IDQgYnl0ZXMKKyAgICB9IGVsc2UgeworICAgICAgICBoZWFkZXJbNF0gPSAweGZjIHwgMTsgIC8vIGxlbmd0aCBzaXplID09IDIgYnl0ZXMKKyAgICB9CisKKyAgICAvLyAzLWJpdCAnMTExJyBmb2xsb3dlZCBieSA1LWJpdCBudW1TZXF1ZW5jZVBhcmFtZXRlclNldHMKKyAgICBpbnQgblNlcXVlbmNlUGFyYW1TZXRzID0gbVNlcVBhcmFtU2V0cy5zaXplKCk7CisgICAgaGVhZGVyWzVdID0gMHhlMCB8IG5TZXF1ZW5jZVBhcmFtU2V0czsKKyAgICBoZWFkZXIgKz0gNjsKKyAgICBmb3IgKExpc3Q8QVZDUGFyYW1TZXQ+OjppdGVyYXRvciBpdCA9IG1TZXFQYXJhbVNldHMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1TZXFQYXJhbVNldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgLy8gMTYtYml0IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgbGVuZ3RoCisgICAgICAgIHVpbnQxNl90IHNlcVBhcmFtU2V0TGVuZ3RoID0gaXQtPm1MZW5ndGg7CisgICAgICAgIGhlYWRlclswXSA9IHNlcVBhcmFtU2V0TGVuZ3RoID4+IDg7CisgICAgICAgIGhlYWRlclsxXSA9IHNlcVBhcmFtU2V0TGVuZ3RoICYgMHhmZjsKKworICAgICAgICAvLyBTUFMgTkFMIHVuaXQgKHNlcXVlbmNlIHBhcmFtZXRlciBsZW5ndGggYnl0ZXMpCisgICAgICAgIG1lbWNweSgmaGVhZGVyWzJdLCBpdC0+bURhdGEsIHNlcVBhcmFtU2V0TGVuZ3RoKTsKKyAgICAgICAgaGVhZGVyICs9ICgyICsgc2VxUGFyYW1TZXRMZW5ndGgpOworICAgIH0KKworICAgIC8vIDgtYml0IG5QaWN0dXJlUGFyYW1ldGVyU2V0cworICAgIGludCBuUGljdHVyZVBhcmFtU2V0cyA9IG1QaWNQYXJhbVNldHMuc2l6ZSgpOworICAgIGhlYWRlclswXSA9IG5QaWN0dXJlUGFyYW1TZXRzOworICAgIGhlYWRlciArPSAxOworICAgIGZvciAoTGlzdDxBVkNQYXJhbVNldD46Oml0ZXJhdG9yIGl0ID0gbVBpY1BhcmFtU2V0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVBpY1BhcmFtU2V0cy5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyAxNi1iaXQgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IGxlbmd0aAorICAgICAgICB1aW50MTZfdCBwaWNQYXJhbVNldExlbmd0aCA9IGl0LT5tTGVuZ3RoOworICAgICAgICBoZWFkZXJbMF0gPSBwaWNQYXJhbVNldExlbmd0aCA+PiA4OworICAgICAgICBoZWFkZXJbMV0gPSBwaWNQYXJhbVNldExlbmd0aCAmIDB4ZmY7CisKKyAgICAgICAgLy8gUFBTIE5hbCB1bml0IChwaWN0dXJlIHBhcmFtZXRlciBzZXQgbGVuZ3RoIGJ5dGVzKQorICAgICAgICBtZW1jcHkoJmhlYWRlclsyXSwgaXQtPm1EYXRhLCBwaWNQYXJhbVNldExlbmd0aCk7CisgICAgICAgIGhlYWRlciArPSAoMiArIHBpY1BhcmFtU2V0TGVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpUcmFjazo6dGhyZWFkRW50cnkoKSB7CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgY29uc3QgaW50NjRfdCBpbnRlcmxlYXZlRHVyYXRpb25VcyA9IG1Pd25lci0+aW50ZXJsZWF2ZUR1cmF0aW9uKCk7CisgICAgaW50NjRfdCBjaHVua1RpbWVzdGFtcFVzID0gMDsKKyAgICBpbnQzMl90IG5DaHVua3MgPSAwOworICAgIGludDMyX3Qgblplcm9MZW5ndGhGcmFtZXMgPSAwOworICAgIGludDY0X3QgbGFzdFRpbWVzdGFtcFVzID0gMDsgIC8vIFByZXZpb3VzIHNhbXBsZSB0aW1lIHN0YW1wIGluIG1zCisgICAgaW50NjRfdCBsYXN0RHVyYXRpb25VcyA9IDA7ICAgLy8gQmV0d2VlbiB0aGUgcHJldmlvdXMgdHdvIHNhbXBsZXMgaW4gbXMKKyAgICBpbnQ2NF90IGN1cnJEdXJhdGlvblRpY2tzID0gMDsgIC8vIFRpbWVzY2FsZSBiYXNlZCB0aWNrcworICAgIGludDY0X3QgbGFzdER1cmF0aW9uVGlja3MgPSAwOyAgLy8gVGltZXNjYWxlIGJhc2VkIHRpY2tzCisgICAgaW50MzJfdCBzYW1wbGVDb3VudCA9IDE7ICAgICAgLy8gU2FtcGxlIGNvdW50IGluIHRoZSBjdXJyZW50IHN0dHMgdGFibGUgZW50cnkKKyAgICB1aW50MzJfdCBwcmV2aW91c1NhbXBsZVNpemUgPSAwOyAgLy8gU2l6ZSBvZiB0aGUgcHJldmlvdXMgc2FtcGxlCisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YV9kYXRhOworCisgICAgbU51bVNhbXBsZXMgPSAwOworICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgd2hpbGUgKCFtRG9uZSAmJiBtU291cmNlLT5yZWFkKCZidWZmZXIpID09IE9LKSB7CisgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgKytuWmVyb0xlbmd0aEZyYW1lczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKKyAgICAgICAgLy8gSWYgdGhlIGNvZGVjIHNwZWNpZmljIGRhdGEgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIHlldCwgZGVsYXkgcGF1c2UuCisgICAgICAgIC8vIEFmdGVyIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhIGlzIHJlY2VpdmVkLCBkaXNjYXJkIHdoYXQgd2UgcmVjZWl2ZWQKKyAgICAgICAgLy8gd2hlbiB0aGUgdHJhY2sgaXMgdG8gYmUgcGF1c2VkLgorICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgKytjb3VudDsKIAotICAgICAgICBpZiAoaXNfYXZjICYmIGNvdW50IDwgMykgewotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBpbnQzMl90IGlzQ29kZWNDb25maWc7CisgICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjQ29uZmlnKQorICAgICAgICAgICAgICAgICYmIGlzQ29kZWNDb25maWcpIHsKKyAgICAgICAgICAgIENIRUNLKCFtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEpOwogCi0gICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjU3BlY2lmaWNEYXRhLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKHNpemUgKyA4KTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaGVhZGVyID0gKHVpbnQ4X3QgKiltQ29kZWNTcGVjaWZpY0RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclswXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSA9IDB4NDI7ICAvLyBwcm9maWxlCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsyXSA9IDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclszXSA9IDB4MWU7ICAvLyBsZXZlbAotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbNF0gPSAweGZjIHwgMzsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzVdID0gMHhlMCB8IDE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcls2XSA9IHNpemUgPj4gODsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzddID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmaGVhZGVyWzhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPSBzaXplICsgODsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IG1Db2RlY1NwZWNpZmljRGF0YVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgKz0gc2l6ZSArIDM7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YSA9IHJlYWxsb2MobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaGVhZGVyID0gKHVpbnQ4X3QgKiltQ29kZWNTcGVjaWZpY0RhdGE7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcltvZmZzZXRdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyW29mZnNldCArIDFdID0gc2l6ZSA+PiA4OwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbb2Zmc2V0ICsgMl0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZoZWFkZXJbb2Zmc2V0ICsgM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSXNBdmMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoT0ssIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Jc01QRUc0KSB7CisgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgICAgICAgICAgICAgIG1lbWNweShtQ29kZWNTcGVjaWZpY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCisgICAgICAgICAgICBtR290QWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUNvZGVjU3BlY2lmaWNEYXRhID09IE5VTEwgJiYgaXNfbXBlZzQpIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKG9mZnNldCArIDMgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGFbb2Zmc2V0XSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMAotICAgICAgICAgICAgICAgICAgICAmJiBkYXRhW29mZnNldCArIDJdID09IDB4MDEgJiYgZGF0YVtvZmZzZXQgKyAzXSA9PSAweGI2KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrb2Zmc2V0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDSEVDSyhvZmZzZXQgKyAzIDwgc2l6ZSk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ICsgMyA+PSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgLy8gWFhYIGFzc3VtZSB0aGUgZW50aXJlIGZpcnN0IGNodW5rIG9mIGRhdGEgaXMgdGhlIGNvZGVjIHNwZWNpZmljCi0gICAgICAgICAgICAgICAgLy8gZGF0YS4KLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBzaXplOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplID0gb2Zmc2V0OwotICAgICAgICAgICAgbUNvZGVjU3BlY2lmaWNEYXRhID0gbWFsbG9jKG9mZnNldCk7Ci0gICAgICAgICAgICBtZW1jcHkobUNvZGVjU3BlY2lmaWNEYXRhLCBkYXRhLCBvZmZzZXQpOwotCi0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZl90IG9mZnNldCA9IGlzX2F2YyA/IG1Pd25lci0+YWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGUoYnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtT3duZXItPmFkZFNhbXBsZShidWZmZXIpOwotCi0gICAgICAgIFNhbXBsZUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5zaXplID0gaXNfYXZjID8gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDIgOiBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBpbmZvLm9mZnNldCA9IG9mZnNldDsKLQotICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lc3RhbXBVcykpOwotCi0gICAgICAgIGlmICh0aW1lc3RhbXBVcyA+IG1NYXhUaW1lU3RhbXBVcykgewotICAgICAgICAgICAgbU1heFRpbWVTdGFtcFVzID0gdGltZXN0YW1wVXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPdXIgdGltZXN0YW1wIGlzIGluIG1zLgotICAgICAgICBpbmZvLnRpbWVzdGFtcCA9ICh0aW1lc3RhbXBVcyArIDUwMCkgLyAxMDAwOwotCi0gICAgICAgIG1TYW1wbGVJbmZvcy5wdXNoX2JhY2soaW5mbyk7Ci0KKyAgICAgICAgLy8gTWFrZSBhIGRlZXAgY29weSBvZiB0aGUgTWVkaWFCdWZmZXIgYW5kIE1ldGFkYXRhIGFuZCByZWxlYXNlCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBhcyBzb29uIGFzIHdlIGNhbgorICAgICAgICBNZWRpYUJ1ZmZlciAqY29weSA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIGNvcHktPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgbWV0YV9kYXRhID0gbmV3IE1ldGFEYXRhKCpidWZmZXItPm1ldGFfZGF0YSgpLmdldCgpKTsKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKG1Jc0F2YykgU3RyaXBTdGFydGNvZGUoY29weSk7CisKKyAgICAgICAgc2l6ZV90IHNhbXBsZVNpemUgPSBjb3B5LT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgaWYgKG1Jc0F2YykgeworICAgICAgICAgICAgaWYgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSArPSA0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVTaXplICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXggZmlsZSBzaXplIG9yIGR1cmF0aW9uIGhhbmRsaW5nCisgICAgICAgIG1NZGF0U2l6ZUJ5dGVzICs9IHNhbXBsZVNpemU7CisgICAgICAgIHVwZGF0ZVRyYWNrU2l6ZUVzdGltYXRlKCk7CisKKyAgICAgICAgaWYgKG1Pd25lci0+ZXhjZWVkc0ZpbGVTaXplTGltaXQoKSkgeworICAgICAgICAgICAgbU93bmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAobU93bmVyLT5leGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSkgeworICAgICAgICAgICAgbU93bmVyLT5ub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgaW50MzJfdCBpc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgbWV0YV9kYXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKKworICAgICAgICBDSEVDSyhtZXRhX2RhdGEtPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVzdGFtcFVzKSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIGlmIChtU2FtcGxlU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyhtU3RhcnRUaW1lc3RhbXBVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVJlc3VtZWQpIHsKKyAgICAgICAgICAgIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyArPSAodGltZXN0YW1wVXMgLSBtVHJhY2tEdXJhdGlvblVzIC0gbGFzdER1cmF0aW9uVXMpOworICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKKyAgICAgICAgaWYgKG1Jc1JlYWxUaW1lUmVjb3JkaW5nICYmICFtSXNBdWRpbykgeworICAgICAgICAgICAgLy8gVGhlIG1pbm9yIGFkanVzdG1lbnQgb24gdGhlIHRpbWVzdGFtcCBpcyBoZXVyaXN0aWMvZXhwZXJpbWVudGFsCisgICAgICAgICAgICAvLyBXZSBhcmUgYWRqdXN0aW5nIHRoZSB0aW1lc3RhbXAgdG8gcmVkdWNlIHRoZSBmbHVjdHVhdGlvbiBvZiB0aGUgZHVyYXRpb24KKyAgICAgICAgICAgIC8vIG9mIG5laWdoYm9yaW5nIHNhbXBsZXMuIFRoaXMgaW4gdHVybiBoZWxwcyByZWR1Y2UgdGhlIHRyYWNrIGhlYWRlciBzaXplLAorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSwgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAic3R0cyIgYm94LgorICAgICAgICAgICAgaWYgKG1OdW1TYW1wbGVzID4gMSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgY3VyckRyaWZ0VGltZVVzID0gbU93bmVyLT5nZXREcmlmdFRpbWVVcygpOworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzICsgY3VyckRyaWZ0VGltZVVzIC0gbGFzdFRpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZlVzID0gKGR1cmF0aW9uVXMgPiBsYXN0RHVyYXRpb25VcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGR1cmF0aW9uVXMgLSBsYXN0RHVyYXRpb25VcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFzdER1cmF0aW9uVXMgLSBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChkaWZmVXMgPD0gNTAwMCkgeyAgLy8gWFhYOiBNYWdpYyBudW1iZXIgNW1zCisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gbGFzdFRpbWVzdGFtcFVzICsgbGFzdER1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMgKz0gY3VyckRyaWZ0VGltZVVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+PSAwKTsKKyAgICAgICAgaWYgKG1OdW1TYW1wbGVzID4gMSkgeworICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFVzIDw9IGxhc3RUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgIExPR1coIkZyYW1lIGFycml2ZXMgdG9vIGxhdGUhIik7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZHJvcCB0aGUgbGF0ZSBmcmFtZSwgc2luY2UgZHJvcHBpbmcgYSBmcmFtZSBtYXkgY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBwcm9ibGVtcyBsYXRlciBkdXJpbmcgcGxheWJhY2sKKworICAgICAgICAgICAgICAgIC8vIFRoZSBpZGVhIGhlcmUgaXMgdG8gYXZvaWQgaGF2aW5nIHR3byBvciBtb3JlIHNhbXBsZXMgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAvLyBzYW1lIHRpbWVzdGFtcCBpbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgICAgICAgICAgaWYgKG1UaW1lU2NhbGUgPj0gMTAwMDAwMExMKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gbGFzdFRpbWVzdGFtcFVzICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyA9IGxhc3RUaW1lc3RhbXBVcyArICgxMDAwMDAwTEwgKyAobVRpbWVTY2FsZSA+PiAxKSkgLyBtVGltZVNjYWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExPR1YoInRpbWUgc3RhbXA6ICVsbGQgYW5kIHByZXZpb3VzIHBhdXNlZCBkdXJhdGlvbiAlbGxkIiwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbVRyYWNrRHVyYXRpb25VcykgeworICAgICAgICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IHRpbWVzdGFtcFVzOworICAgICAgICB9CisKKyAgICAgICAgbVNhbXBsZVNpemVzLnB1c2hfYmFjayhzYW1wbGVTaXplKTsKKyAgICAgICAgKyttTnVtU2FtcGxlczsKKyAgICAgICAgaWYgKG1OdW1TYW1wbGVzID4gMikgeworICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1c2UgdGhlIHRpbWUgc2NhbGUgYmFzZWQgdGlja3MsIHJhdGhlciB0aGFuIHRoZQorICAgICAgICAgICAgLy8gdGltZXN0YW1wIGl0c2VsZiB0byBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIHRvIHVzZSBhIG5ldworICAgICAgICAgICAgLy8gc3R0cyBlbnRyeSwgc2luY2Ugd2UgbWF5IGhhdmUgcm91bmRpbmcgZXJyb3JzLgorICAgICAgICAgICAgLy8gVGhlIGNhbGN1bGF0aW9uIGlzIGludGVuZGVkIHRvIHJlZHVjZSB0aGUgYWNjdW11bGF0ZWQKKyAgICAgICAgICAgIC8vIHJvdW5kaW5nIGVycm9ycy4KKyAgICAgICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0KKyAgICAgICAgICAgICAgICAgICAgICgodGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KKyAgICAgICAgICAgICAgICAgICAgIChsYXN0VGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMKTsKKworICAgICAgICAgICAgaWYgKGN1cnJEdXJhdGlvblRpY2tzICE9IGxhc3REdXJhdGlvblRpY2tzKSB7CisgICAgICAgICAgICAgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVDb3VudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrc2FtcGxlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TYW1wbGVzSGF2ZVNhbWVTaXplKSB7CisgICAgICAgICAgICBpZiAobU51bVNhbXBsZXMgPj0gMiAmJiBwcmV2aW91c1NhbXBsZVNpemUgIT0gc2FtcGxlU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2aW91c1NhbXBsZVNpemUgPSBzYW1wbGVTaXplOworICAgICAgICB9CisgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CisgICAgICAgIGxhc3REdXJhdGlvblRpY2tzID0gY3VyckR1cmF0aW9uVGlja3M7CisgICAgICAgIGxhc3RUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobUlzUmVhbFRpbWVSZWNvcmRpbmcgJiYgbUlzQXVkaW8pIHsKKyAgICAgICAgICAgIGludDY0X3QgZHJpZnRUaW1lVXMgPSAwOworICAgICAgICAgICAgaWYgKG1ldGFfZGF0YS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZkcmlmdFRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBtT3duZXItPnNldERyaWZ0VGltZVVzKGRyaWZ0VGltZVVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1N5bmMgIT0gMCkgeworICAgICAgICAgICAgYWRkT25lU3Rzc1RhYmxlRW50cnkobU51bVNhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UcmFja2luZ1Byb2dyZXNzU3RhdHVzKSB7CisgICAgICAgICAgICBpZiAobVByZXZpb3VzVHJhY2tUaW1lVXMgPD0gMCkgeworICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFja1Byb2dyZXNzU3RhdHVzKHRpbWVzdGFtcFVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU93bmVyLT5udW1UcmFja3MoKSA9PSAxKSB7CisgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSBtSXNBdmM/IG1Pd25lci0+YWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbChjb3B5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtT3duZXItPmFkZFNhbXBsZV9sKGNvcHkpOworICAgICAgICAgICAgaWYgKG1DaHVua09mZnNldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGFkZENodW5rT2Zmc2V0KG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBjb3B5ID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbUNodW5rU2FtcGxlcy5wdXNoX2JhY2soY29weSk7CisgICAgICAgIGlmIChpbnRlcmxlYXZlRHVyYXRpb25VcyA9PSAwKSB7CisgICAgICAgICAgICBhZGRPbmVTdHNjVGFibGVFbnRyeSgrK25DaHVua3MsIDEpOworICAgICAgICAgICAgYnVmZmVyQ2h1bmsodGltZXN0YW1wVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNodW5rVGltZXN0YW1wVXMgPT0gMCkgeworICAgICAgICAgICAgICAgIGNodW5rVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFVzIC0gY2h1bmtUaW1lc3RhbXBVcyA+IGludGVybGVhdmVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgICAgICsrbkNodW5rczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5DaHVua3MgPT0gMSB8fCAgLy8gRmlyc3QgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICgtLShtU3RzY1RhYmxlRW50cmllcy5lbmQoKSkpLT5zYW1wbGVzUGVyQ2h1bmsgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtQ2h1bmtTYW1wbGVzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkobkNodW5rcywgbUNodW5rU2FtcGxlcy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNodW5rKHRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgfQogCisgICAgaWYgKG1TYW1wbGVTaXplcy5lbXB0eSgpKSB7CisgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKE9LICE9IGNoZWNrQ29kZWNTcGVjaWZpY0RhdGEoKSkgeworICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIG1Pd25lci0+dHJhY2tQcm9ncmVzc1N0YXR1cyh0aGlzLCAtMSwgZXJyKTsKKworICAgIC8vIExhc3QgY2h1bmsKKyAgICBpZiAobU93bmVyLT5udW1UcmFja3MoKSA9PSAxKSB7CisgICAgICAgIGFkZE9uZVN0c2NUYWJsZUVudHJ5KDEsIG1OdW1TYW1wbGVzKTsKKyAgICB9IGVsc2UgaWYgKCFtQ2h1bmtTYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgYWRkT25lU3RzY1RhYmxlRW50cnkoKytuQ2h1bmtzLCBtQ2h1bmtTYW1wbGVzLnNpemUoKSk7CisgICAgICAgIGJ1ZmZlckNodW5rKHRpbWVzdGFtcFVzKTsKKyAgICB9CisKKyAgICAvLyBXZSBkb24ndCByZWFsbHkga25vdyBob3cgbG9uZyB0aGUgbGFzdCBmcmFtZSBsYXN0cywgc2luY2UKKyAgICAvLyB0aGVyZSBpcyBubyBmcmFtZSB0aW1lIGFmdGVyIGl0LCBqdXN0IHJlcGVhdCB0aGUgcHJldmlvdXMKKyAgICAvLyBmcmFtZSdzIGR1cmF0aW9uLgorICAgIGlmIChtTnVtU2FtcGxlcyA9PSAxKSB7CisgICAgICAgIGxhc3REdXJhdGlvblVzID0gMDsgIC8vIEEgc2luZ2xlIHNhbXBsZSdzIGR1cmF0aW9uCisgICAgfSBlbHNlIHsKKyAgICAgICAgKytzYW1wbGVDb3VudDsgIC8vIENvdW50IGZvciB0aGUgbGFzdCBzYW1wbGUKKyAgICB9CisgICAgYWRkT25lU3R0c1RhYmxlRW50cnkoc2FtcGxlQ291bnQsIGxhc3REdXJhdGlvblVzKTsKKyAgICBtVHJhY2tEdXJhdGlvblVzICs9IGxhc3REdXJhdGlvblVzOwogICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICBMT0dJKCJSZWNlaXZlZCB0b3RhbC8wLWxlbmd0aCAoJWQvJWQpIGJ1ZmZlcnMgYW5kIGVuY29kZWQgJWQgZnJhbWVzLiAtICVzIiwKKyAgICAgICAgICAgIGNvdW50LCBuWmVyb0xlbmd0aEZyYW1lcywgbU51bVNhbXBsZXMsIG1Jc0F1ZGlvPyAiYXVkaW8iOiAidmlkZW8iKTsKKworICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp0cmFja1Byb2dyZXNzU3RhdHVzKGludDY0X3QgdGltZVVzLCBzdGF0dXNfdCBlcnIpIHsKKyAgICBMT0dWKCJ0cmFja1Byb2dyZXNzU3RhdHVzOiAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICBpZiAobVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcyA+IDAgJiYKKyAgICAgICAgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMgPj0gbVRyYWNrRXZlcnlUaW1lRHVyYXRpb25VcykgeworICAgICAgICBMT0dWKCJGaXJlIHRpbWUgdHJhY2tpbmcgcHJvZ3Jlc3Mgc3RhdHVzIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICBtT3duZXItPnRyYWNrUHJvZ3Jlc3NTdGF0dXModGhpcywgdGltZVVzIC0gbVByZXZpb3VzVHJhY2tUaW1lVXMsIGVycik7CisgICAgICAgIG1QcmV2aW91c1RyYWNrVGltZVVzID0gdGltZVVzOworICAgIH0KK30KKwordm9pZCBNUEVHNFdyaXRlcjo6dHJhY2tQcm9ncmVzc1N0YXR1cygKKyAgICAgICAgY29uc3QgTVBFRzRXcml0ZXI6OlRyYWNrKiB0cmFjaywgaW50NjRfdCB0aW1lVXMsIHN0YXR1c190IGVycikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpbnQzMl90IG5UcmFja3MgPSBtVHJhY2tzLnNpemUoKTsKKyAgICBDSEVDSyhuVHJhY2tzID49IDEpOworICAgIENIRUNLKG5UcmFja3MgPCA2NCk7ICAvLyBBcmJpdHJhcnkgbnVtYmVyCisKKyAgICBpbnQzMl90IHRyYWNrTnVtID0gMDsKKyAgICBDSEVDSyh0cmFja051bSA8IG5UcmFja3MpOworICAgIHRyYWNrTnVtIDw8PSAxNjsKKworICAgIC8vIEVycm9yIG5vdGlmaWNhdGlvbgorICAgIC8vIERvIG5vdCBjb25zaWRlciBFUlJPUl9FTkRfT0ZfU1RSRUFNIGFuIGVycm9yCisgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfRVJST1IsCisgICAgICAgICAgICAgICB0cmFja051bSB8IE1FRElBX1JFQ09SREVSX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHRpbWVVcyA9PSAtMSkgeworICAgICAgICAvLyBTZW5kIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCisgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9JTkZPX0NPTVBMRVRJT05fU1RBVFVTLAorICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNlbmQgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgdHJhY2tOdW0gfCBNRURJQV9SRUNPUkRFUl9JTkZPX1BST0dSRVNTX1RJTUVfU1RBVFVTLAorICAgICAgICAgICAgICAgdGltZVVzIC8gMTAwMCk7CisgICAgfQorfQorCit2b2lkIE1QRUc0V3JpdGVyOjpzZXREcmlmdFRpbWVVcyhpbnQ2NF90IGRyaWZ0VGltZVVzKSB7CisgICAgTE9HVigic2V0RHJpZnRUaW1lVXM6ICVsbGQgdXMiLCBkcmlmdFRpbWVVcyk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICBtRHJpZnRUaW1lVXMgPSBkcmlmdFRpbWVVczsKK30KKworaW50NjRfdCBNUEVHNFdyaXRlcjo6Z2V0RHJpZnRUaW1lVXMoKSB7CisgICAgTE9HVigiZ2V0RHJpZnRUaW1lVXM6ICVsbGQgdXMiLCBtRHJpZnRUaW1lVXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EcmlmdFRpbWVVczsKK30KKworYm9vbCBNUEVHNFdyaXRlcjo6dXNlTmFsTGVuZ3RoRm91cigpIHsKKyAgICByZXR1cm4gbVVzZTRCeXRlTmFsTGVuZ3RoOworfQorCit2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YnVmZmVyQ2h1bmsoaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIExPR1YoImJ1ZmZlckNodW5rIik7CisKKyAgICBDaHVuayBjaHVuayh0aGlzLCB0aW1lc3RhbXBVcywgbUNodW5rU2FtcGxlcyk7CisgICAgbU93bmVyLT5idWZmZXJDaHVuayhjaHVuayk7CisgICAgbUNodW5rU2FtcGxlcy5jbGVhcigpOwogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RHVyYXRpb25VcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1heFRpbWVTdGFtcFVzOworICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzOwogfQogCi12b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVUcmFja0hlYWRlcihpbnQzMl90IHRyYWNrSUQpIHsKK2ludDY0X3QgTVBFRzRXcml0ZXI6OlRyYWNrOjpnZXRFc3RpbWF0ZWRUcmFja1NpemVCeXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzOworfQorCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmNoZWNrQ29kZWNTcGVjaWZpY0RhdGEoKSBjb25zdCB7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsIG1pbWUpIHx8CisgICAgICAgICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCBtaW1lKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CisgICAgICAgIGlmICghbUNvZGVjU3BlY2lmaWNEYXRhIHx8CisgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGFTaXplIDw9IDApIHsKKyAgICAgICAgICAgIC8vIE1pc3NpbmcgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQ29kZWNTcGVjaWZpY0RhdGEgfHwKKyAgICAgICAgICAgIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPiAwKSB7CisgICAgICAgICAgICAvLyBVbmV4ZXBlY3RlZCBjb2RlYyBzcGVjaWZpYyBkYXRhIGZvdW5kCisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlVHJhY2tIZWFkZXIoCisgICAgICAgIGludDMyX3QgdHJhY2tJRCwgYm9vbCB1c2UzMkJpdE9mZnNldCkgewogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgYm9vbCBzdWNjZXNzID0gbU1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwogCi0gICAgYm9vbCBpc19hdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisgICAgTE9HVigiJXMgdHJhY2sgdGltZSBzY2FsZTogJWQiLAorICAgICAgICBtSXNBdWRpbz8gIkF1ZGlvIjogIlZpZGVvIiwgbVRpbWVTY2FsZSk7CiAKICAgICB0aW1lX3Qgbm93ID0gdGltZShOVUxMKTsKKyAgICBpbnQzMl90IG12aGRUaW1lU2NhbGUgPSBtT3duZXItPmdldFRpbWVTY2FsZSgpOworICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CiAKICAgICBtT3duZXItPmJlZ2luQm94KCJ0cmFrIik7CiAKICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInRraGQiKTsKLSAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICAgICAgLy8gRmxhZ3MgPSA3IHRvIGluZGljYXRlIHRoYXQgdGhlIHRyYWNrIGlzIGVuYWJsZWQsIGFuZAorICAgICAgICAvLyBwYXJ0IG9mIHRoZSBwcmVzZW50YXRpb24KKyAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDB4MDcpOyAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTcKICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG5vdyk7ICAgICAgICAgICAvLyBjcmVhdGlvbiB0aW1lCiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihub3cpOyAgICAgICAgICAgLy8gbW9kaWZpY2F0aW9uIHRpbWUKICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHRyYWNrSUQpOwogICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihnZXREdXJhdGlvblVzKCkgLyAxMDAwKTsKKyAgICAgICAgaW50MzJfdCB0a2hkRHVyYXRpb24gPQorICAgICAgICAgICAgKHRyYWtEdXJhdGlvblVzICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMih0a2hkRHVyYXRpb24pOyAgLy8gaW4gbXZoZCB0aW1lc2NhbGUKICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAogICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gbGF5ZXIKICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBhbHRlcm5hdGUgZ3JvdXAKLSAgICAgICAgbU93bmVyLT53cml0ZUludDE2KGlzX2F1ZGlvID8gMHgxMDAgOiAwKTsgIC8vIHZvbHVtZQorICAgICAgICBtT3duZXItPndyaXRlSW50MTYobUlzQXVkaW8gPyAweDEwMCA6IDApOyAgLy8gdm9sdW1lCiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKIAogICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMHgxMDAwMCk7ICAgICAgIC8vIG1hdHJpeApAQCAtNTQxLDcgKzE4NTAsNyBAQAogICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDQwMDAwMDAwKTsKIAotICAgICAgICBpZiAoaXNfYXVkaW8pIHsKKyAgICAgICAgaWYgKG1Jc0F1ZGlvKSB7CiAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC01NTAsNDYgKzE4NTksNjUgQEAKICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1NZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCk7CiAgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKIAotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHdpZHRoKTsKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihoZWlnaHQpOworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHdpZHRoIDw8IDE2KTsgICAvLyAzMi1iaXQgZml4ZWQtcG9pbnQgdmFsdWUKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihoZWlnaHQgPDwgMTYpOyAgLy8gMzItYml0IGZpeGVkLXBvaW50IHZhbHVlCiAgICAgICAgIH0KICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB0a2hkCiAKKyAgICAgIGludDY0X3QgbW9vdlN0YXJ0VGltZVVzID0gbU93bmVyLT5nZXRTdGFydFRpbWVzdGFtcFVzKCk7CisgICAgICBpZiAobVN0YXJ0VGltZXN0YW1wVXMgIT0gbW9vdlN0YXJ0VGltZVVzKSB7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImVkdHMiKTsKKyAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJlbHN0Iik7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTA6IDMyLWJpdCB0aW1lCisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMik7ICAgICAgICAgICAvLyBuZXZlciBlbmRzIHdpdGggYW4gZW1wdHkgbGlzdAorCisgICAgICAgICAgICAvLyBGaXJzdCBlbHN0IGVudHJ5OiBzcGVjaWZ5IHRoZSBzdGFydGluZyB0aW1lIG9mZnNldAorICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRVcyA9IG1TdGFydFRpbWVzdGFtcFVzIC0gbW9vdlN0YXJ0VGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBzZWcgPSAob2Zmc2V0VXMgKiBtdmhkVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzZWcpOyAgICAgICAgIC8vIGluIG12aGQgdGltZWNhbGUKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigtMSk7ICAgICAgICAgIC8vIHN0YXJ0aW5nIHRpbWUgb2Zmc2V0CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSA8PCAxNik7ICAgICAvLyByYXRlID0gMS4wCisKKyAgICAgICAgICAgIC8vIFNlY29uZCBlbHN0IGVudHJ5OiBzcGVjaWZ5IHRoZSB0cmFjayBkdXJhdGlvbgorICAgICAgICAgICAgc2VnID0gKHRyYWtEdXJhdGlvblVzICogbXZoZFRpbWVTY2FsZSArIDVFNSkgLyAxRTY7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoc2VnKTsgICAgICAgICAvLyBpbiBtdmhkIHRpbWVzY2FsZQorICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOworICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7CisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7CisgICAgICB9CisKICAgICAgIG1Pd25lci0+YmVnaW5Cb3goIm1kaWEiKTsKIAogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGhkIik7CiAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIGNyZWF0aW9uIHRpbWUKICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobm93KTsgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEwMDApOyAgICAgICAgICAvLyB0aW1lc2NhbGUKLSAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoZ2V0RHVyYXRpb25VcygpIC8gMTAwMCk7Ci0gICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgICAvLyBsYW5ndWFnZSBjb2RlIFhYWAorICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtVGltZVNjYWxlKTsgICAgLy8gbWVkaWEgdGltZXNjYWxlCisgICAgICAgICAgaW50MzJfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKKyAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobWRoZER1cmF0aW9uKTsgIC8vIHVzZSBtZWRpYSB0aW1lc2NhbGUKKyAgICAgICAgICAvLyBMYW5ndWFnZSBmb2xsb3dzIHRoZSB0aHJlZSBsZXR0ZXIgc3RhbmRhcmQgSVNPLTYzOS0yL1QKKyAgICAgICAgICAvLyAnZScsICduJywgJ2cnIGZvciAiRW5nbGlzaCIsIGZvciBpbnN0YW5jZS4KKyAgICAgICAgICAvLyBFYWNoIGNoYXJhY3RlciBpcyBwYWNrZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpdHMgQVNDSUkgdmFsdWUgYW5kIDB4NjAuCisgICAgICAgICAgLy8gRm9yICJFbmdsaXNoIiwgdGhlc2UgYXJlIDAwMTAxLCAwMTExMCwgMDAxMTEuCisgICAgICAgICAgLy8gWFhYOiBXaGVyZSBpcyB0aGUgcGFkZGluZyBiaXQgbG9jYXRlZDogMHgxNUM3PworICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gbGFuZ3VhZ2UgY29kZQogICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAogICAgICAgICBtT3duZXItPmVuZEJveCgpOwogCiAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImhkbHIiKTsKICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcHJlZGVmaW5lZAotICAgICAgICAgIG1Pd25lci0+d3JpdGVGb3VyY2MoaXNfYXVkaW8gPyAic291biIgOiAidmlkZSIpOworICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gY29tcG9uZW50IHR5cGU6IHNob3VsZCBiZSBtaGxyCisgICAgICAgICAgbU93bmVyLT53cml0ZUZvdXJjYyhtSXNBdWRpbyA/ICJzb3VuIiA6ICJ2aWRlIik7ICAvLyBjb21wb25lbnQgc3VidHlwZQogICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKCIiKTsgICAgICAgICAgLy8gbmFtZQorICAgICAgICAgIC8vIFJlbW92aW5nICJyIiBmb3IgdGhlIG5hbWUgc3RyaW5nIGp1c3QgbWFrZXMgdGhlIHN0cmluZyA0IGJ5dGUgYWxpZ25lZAorICAgICAgICAgIG1Pd25lci0+d3JpdGVDU3RyaW5nKG1Jc0F1ZGlvID8gIlNvdW5kSGFuZGxlIjogIlZpZGVvSGFuZGxlIik7ICAvLyBuYW1lCiAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7CiAKICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgibWluZiIpOwotCi0gICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZGluZiIpOwotICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZHJlZiIpOwotICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJ1cmwgIik7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEpOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0xCi0gICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB1cmwKLSAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBkcmVmCi0gICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGRpbmYKLQotICAgICAgICAgIGlmIChpc19hdWRpbykgeworICAgICAgICAgIGlmIChtSXNBdWRpbykgewogICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzbWhkIik7CiAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAogICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBiYWxhbmNlCkBAIC01OTcsMjYgKzE5MjUsMzkgQEAKICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJ2bWhkIik7Ci0gICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigweDAwMDAwMDAxKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MQorICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMHgwMSk7ICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTEKICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gZ3JhcGhpY3MgbW9kZQogICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBvcGNvbG9yCiAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsKICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOwogICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOwogICAgICAgICAgIH0KLSAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1pbmYKKworICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImRpbmYiKTsKKyAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImRyZWYiKTsKKyAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgIC8vIGVudHJ5IGNvdW50IChlaXRoZXIgdXJsIG9yIHVybikKKyAgICAgICAgICAgICAgLy8gVGhlIHRhYmxlIGluZGV4IGhlcmUgcmVmZXJzIHRvIHRoZSBzYW1wbGUgZGVzY3JpcHRpb24gaW5kZXgKKyAgICAgICAgICAgICAgLy8gaW4gdGhlIHNhbXBsZSB0YWJsZSBlbnRyaWVzLgorICAgICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJ1cmwgIik7CisgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEpOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0xIChzZWxmLWNvbnRhaW5lZCkKKyAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHVybAorICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGRyZWYKKyAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZGluZgogCiAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0YmwiKTsKIAogICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c2QiKTsKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsgICAgICAgICAgICAgICAvLyBlbnRyeSBjb3VudAotICAgICAgICAgICAgaWYgKGlzX2F1ZGlvKSB7CisgICAgICAgICAgICBpZiAobUlzQXVkaW8pIHsKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3VyY2MgPSBOVUxMOwogICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsIG1pbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvdXJjYyA9ICJzYW1yIjsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgbWltZSkpIHsKICAgICAgICAgICAgICAgICAgICAgZm91cmNjID0gInNhd2IiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCBtaW1lKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VyY2MgPSAibXA0YSI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTE9HRSgiVW5rbm93biBtaW1lIHR5cGUgJyVzJy4iLCBtaW1lKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soISJzaG91bGQgbm90IGJlIGhlcmUsIHVua25vd24gbWltZSB0eXBlLiIpOwpAQCAtNjI1LDEwICsxOTY2LDEyIEBACiAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveChmb3VyY2MpOyAgICAgICAgICAvLyBhdWRpbyBmb3JtYXQKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAotICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKKyAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDEpOyAgICAgICAgIC8vIGRhdGEgcmVmIGluZGV4CiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyByZXNlcnZlZAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigyKTsgICAgICAgICAgIC8vIGNoYW5uZWwgY291bnQKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEodHJ1ZSwgbU1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbkNoYW5uZWxzKSk7CisgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYobkNoYW5uZWxzKTsgICAvLyBjaGFubmVsIGNvdW50CiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMTYpOyAgICAgICAgICAvLyBzYW1wbGUgc2l6ZQogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcHJlZGVmaW5lZAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKQEAgLTYzNiw4ICsxOTc5LDUxIEBACiAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXJhdGU7CiAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSk7CiAgICAgICAgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKLQogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKHNhbXBsZXJhdGUgPDwgMTYpOworICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbWltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZXNkcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPiAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDAzKTsgICAvLyBFU19EZXNjclRhZworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOy8vIEVTX0lECisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNCk7ICAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgxNSArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHg0MCk7ICAgLy8gb2JqZWN0VHlwZUluZGljYXRpb24gSVNPL0lFQyAxNDQ5Mi0yCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDE1KTsgICAvLyBzdHJlYW1UeXBlIEF1ZGlvU3RyZWFtCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAzKTsgIC8vIFhYWAorICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMCk7ICAgLy8gYnVmZmVyIHNpemUgMjQtYml0CisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoOTYwMDApOyAvLyBtYXggYml0IHJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMig5NjAwMCk7IC8vIGF2ZyBiaXQgcmF0ZQorCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgweDA1KTsgICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCisgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGEyW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNiwgIC8vIFNMQ29uZmlnRGVzY3JpcHRvclRhZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGUoa0RhdGEyLCBzaXplb2Yoa0RhdGEyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIGVzZHMKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBtaW1lKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsIG1pbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDNncHAyIFNwZWMgQU1SU2FtcGxlRW50cnkgZmllbGRzCisgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goImRhbXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlQ1N0cmluZygiICAgIik7ICAvLyB2ZW5kb3I6IDQgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAgICAgICAvLyBkZWNvZGVyIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMHg4M0ZGKTsgICAvLyBtb2RlIHNldDogYWxsIGVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgwKTsgICAgICAgICAvLyBtb2RlIGNoYW5nZSBwZXJpb2QKKyAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50OCgxKTsgICAgICAgICAvLyBmcmFtZXMgcGVyIHNhbXBsZQorICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOworICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgbWltZSkpIHsKQEAgLTY1Myw3ICsyMDM5LDcgQEAKIAogICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MTYoMCk7ICAgICAgICAgICAvLyBkYXRhIHJlZiBpbmRleAorICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KDEpOyAgICAgICAgICAgLy8gZGF0YSByZWYgaW5kZXgKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHByZWRlZmluZWQKICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQxNigwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCiAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyBwcmVkZWZpbmVkCkBAIC02NzgsNiArMjA2NCw4IEBACiAgICAgICAgICAgICAgICAgICBDSEVDSygyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUgPCAxMjgpOwogCiAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsIG1pbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiZXNkcyIpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAgICAgICAgICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKQEAgLTY5OCw3ICsyMDg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAzLCAweGU4LCAweDAwCiAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShrRGF0YSwgc2l6ZW9mKGtEYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNSk7ICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCiAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwpAQCAtNzIyLDY0ICsyMTEwLDk0IEBACiAKICAgICAgICAgICAgICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gZDI2MwogICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobUNvZGVjU3BlY2lmaWNEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWNTcGVjaWZpY0RhdGFTaXplID4gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiYXZjQyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZShtQ29kZWNTcGVjaWZpY0RhdGEsIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOwogICAgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBhdmNDCiAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInBhc3AiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHBpeGVsIGlzIG5vdCBzcXVhcmUKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gaHNwYWNpbmcKKyAgICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gdnNwYWNpbmcKKyAgICAgICAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBwYXNwCiAgICAgICAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIG1wNHYsIHMyNjMgb3IgYXZjMQogICAgICAgICAgICAgfQogICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNkCiAKICAgICAgICAgICBtT3duZXItPmJlZ2luQm94KCJzdHRzIik7CiAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKLSAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtU2FtcGxlSW5mb3Muc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobU51bVN0dHNUYWJsZUVudHJpZXMpOworICAgICAgICAgICAgaW50NjRfdCBwcmV2VGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgZm9yIChMaXN0PFN0dHNUYWJsZUVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtU3R0c1RhYmxlRW50cmllcy5iZWdpbigpOworICAgICAgICAgICAgICAgICBpdCAhPSBtU3R0c1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihpdC0+c2FtcGxlQ291bnQpOwogCi0gICAgICAgICAgICBMaXN0PFNhbXBsZUluZm8+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVJbmZvcy5iZWdpbigpOwotICAgICAgICAgICAgaW50NjRfdCBsYXN0ID0gKCppdCkudGltZXN0YW1wOwotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgICAgIHdoaWxlIChpdCAhPSBtU2FtcGxlSW5mb3MuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKCgqaXQpLnRpbWVzdGFtcCAtIGxhc3QpOworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBjYWxjdWxhdGluZyB0aGUgc2FtcGxlIGR1cmF0aW9uIHRoZSBleGFjdGx5CisgICAgICAgICAgICAgICAgLy8gc2FtZSB3YXkgYXMgd2UgbWFkZSBkZWNpc2lvbiBvbiBob3cgdG8gY3JlYXRlIHN0dHMgZW50cmllcy4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJUaW1lc3RhbXBVcyA9IHByZXZUaW1lc3RhbXBVcyArIGl0LT5zYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGludDMyX3QgZHVyID0gKChjdXJyVGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldlRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCk7CisgICAgICAgICAgICAgICAgcHJldlRpbWVzdGFtcFVzICs9IChpdC0+c2FtcGxlQ291bnQgKiBpdC0+c2FtcGxlRHVyYXRpb25Vcyk7CiAKLSAgICAgICAgICAgICAgICBsYXN0ID0gKCppdCkudGltZXN0YW1wOwotCi0gICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoZHVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3R0cwogCisgICAgICAgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic3RzcyIpOworICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyB2ZXJzaW9uPTAsIGZsYWdzPTAKKyAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1OdW1TdHNzVGFibGVFbnRyaWVzKTsgIC8vIG51bWJlciBvZiBzeW5jIGZyYW1lcworICAgICAgICAgICAgICBmb3IgKExpc3Q8aW50MzJfdD46Oml0ZXJhdG9yIGl0ID0gbVN0c3NUYWJsZUVudHJpZXMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICBpdCAhPSBtU3Rzc1RhYmxlRW50cmllcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKCppdCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdHNzCisgICAgICAgICAgfQorCiAgICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgic3RzeiIpOwogICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOyAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7ICAvLyBkZWZhdWx0IHNhbXBsZSBzaXplCi0gICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobVNhbXBsZUluZm9zLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8U2FtcGxlSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVNhbXBsZUluZm9zLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgIGl0ICE9IG1TYW1wbGVJbmZvcy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigoKml0KS5zaXplKTsKKyAgICAgICAgICAgIGlmIChtU2FtcGxlc0hhdmVTYW1lU2l6ZSkgeworICAgICAgICAgICAgICAgIExpc3Q8c2l6ZV90Pjo6aXRlcmF0b3IgaXQgPSBtU2FtcGxlU2l6ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoKml0KTsgIC8vIGRlZmF1bHQgc2FtcGxlIHNpemUKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1OdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGlmICghbVNhbXBsZXNIYXZlU2FtZVNpemUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKExpc3Q8c2l6ZV90Pjo6aXRlcmF0b3IgaXQgPSBtU2FtcGxlU2l6ZXMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgIGl0ICE9IG1TYW1wbGVTaXplcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoKml0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0c3oKIAogICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInN0c2MiKTsKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1TYW1wbGVJbmZvcy5zaXplKCkpOwotICAgICAgICAgICAgaW50MzJfdCBuID0gMTsKLSAgICAgICAgICAgIGZvciAoTGlzdDxTYW1wbGVJbmZvPjo6aXRlcmF0b3IgaXQgPSBtU2FtcGxlSW5mb3MuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgaXQgIT0gbVNhbXBsZUluZm9zLmVuZCgpOyArK2l0LCArK24pIHsKLSAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIobik7Ci0gICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihtTnVtU3RzY1RhYmxlRW50cmllcyk7CisgICAgICAgICAgICBmb3IgKExpc3Q8U3RzY1RhYmxlRW50cnk+OjppdGVyYXRvciBpdCA9IG1TdHNjVGFibGVFbnRyaWVzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgIGl0ICE9IG1TdHNjVGFibGVFbnRyaWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5maXJzdENodW5rKTsKKyAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoaXQtPnNhbXBsZXNQZXJDaHVuayk7CisgICAgICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGl0LT5zYW1wbGVEZXNjcmlwdGlvbklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RzYwotCi0gICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiY282NCIpOworICAgICAgICAgIG1Pd25lci0+YmVnaW5Cb3godXNlMzJCaXRPZmZzZXQ/ICJzdGNvIjogImNvNjQiKTsKICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAotICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1TYW1wbGVJbmZvcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChMaXN0PFNhbXBsZUluZm8+OjppdGVyYXRvciBpdCA9IG1TYW1wbGVJbmZvcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBtU2FtcGxlSW5mb3MuZW5kKCk7ICsraXQsICsrbikgewotICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ2NCgoKml0KS5vZmZzZXQpOworICAgICAgICAgICAgbU93bmVyLT53cml0ZUludDMyKG1OdW1TdGNvVGFibGVFbnRyaWVzKTsKKyAgICAgICAgICAgIGZvciAoTGlzdDxvZmZfdD46Oml0ZXJhdG9yIGl0ID0gbUNodW5rT2Zmc2V0cy5iZWdpbigpOworICAgICAgICAgICAgICAgICBpdCAhPSBtQ2h1bmtPZmZzZXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgaWYgKHVzZTMyQml0T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PigqaXQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtT3duZXItPndyaXRlSW50NjQoKCppdCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gY282NAorICAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBzdGNvIG9yIGNvNjQKIAogICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gc3RibAorICAgICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyBtaW5mCiAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gbWRpYQogICAgIG1Pd25lci0+ZW5kQm94KCk7ICAvLyB0cmFrCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmNwcAppbmRleCA0YjM4MTNiLi43NjQ4ZDQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRGVmcy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRyA9ICJpbWFnZS9qcGVnIjsKIAorY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlBYID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCA9ICJ2aWRlby9tcDR2LWVzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7CkBAIC0zMSwxMCArMzIsMTQgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FBQyA9ICJhdWRpby9tcDRhLWxhdG0iOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFAgPSAiYXVkaW8vcWNlbHAiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTID0gImF1ZGlvL3ZvcmJpcyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcgPSAiYXVkaW8vZzcxMS1hbGF3IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyA9ICJhdWRpby9nNzExLW1sYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXID0gImF1ZGlvL3JhdyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCA9ICJ2aWRlby9tcGVnNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWID0gImF1ZGlvL3dhdiI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHID0gImFwcGxpY2F0aW9uL29nZyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EgPSAidmlkZW8veC1tYXRyb3NrYSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyA9ICJ2aWRlby9tcDJ0cyI7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggNTEzZjQ5Yy4uOWJjOTRkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjMsNyArMjMsMTEgQEAKICNpbmNsdWRlICJpbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9XQVZFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL09nZ0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oIgogCisjaW5jbHVkZSAibWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KQEAgLTQzLDEwICs0NywxMiBAQAogLy8gc3RhdGljCiBzcDxNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSgKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgeworICAgIHNwPEFNZXNzYWdlPiBtZXRhOworCiAgICAgU3RyaW5nOCB0bXA7CiAgICAgaWYgKG1pbWUgPT0gTlVMTCkgewogICAgICAgICBmbG9hdCBjb25maWRlbmNlOwotICAgICAgICBpZiAoIXNvdXJjZS0+c25pZmYoJnRtcCwgJmNvbmZpZGVuY2UpKSB7CisgICAgICAgIGlmICghc291cmNlLT5zbmlmZigmdG1wLCAmY29uZmlkZW5jZSwgJm1ldGEpKSB7CiAgICAgICAgICAgICBMT0dWKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwogCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTYxLDcgKzY3LDcgQEAKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsICJhdWRpby9tcDQiKSkgewogICAgICAgICByZXR1cm4gbmV3IE1QRUc0RXh0cmFjdG9yKHNvdXJjZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgewotICAgICAgICByZXR1cm4gbmV3IE1QM0V4dHJhY3Rvcihzb3VyY2UpOworICAgICAgICByZXR1cm4gbmV3IE1QM0V4dHJhY3Rvcihzb3VyY2UsIG1ldGEpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSkgewogICAgICAgICByZXR1cm4gbmV3IEFNUkV4dHJhY3Rvcihzb3VyY2UpOwpAQCAtNjksNiArNzUsMTAgQEAKICAgICAgICAgcmV0dXJuIG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpKSB7CiAgICAgICAgIHJldHVybiBuZXcgT2dnRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpKSB7CisgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKSkgeworICAgICAgICByZXR1cm4gbmV3IE1QRUcyVFNFeHRyYWN0b3Ioc291cmNlKTsKICAgICB9CiAKICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcAppbmRleCBlYzg5Yjc0Li5iNGVmMzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCkBAIC0zMiwyMyArMzIsNDMgQEAKICAgICBtT3B0aW9ucyA9IDA7CiAgICAgbVNlZWtUaW1lVXMgPSAwOwogICAgIG1MYXRlbmVzc1VzID0gMDsKKyAgICBtU2tpcEZyYW1lVW50aWxUaW1lVXMgPSAwOwogfQogCi12b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cykgewordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKICAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKICAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVNlZWtNb2RlID0gbW9kZTsKIH0KIAogdm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmNsZWFyU2Vla1RvKCkgewogICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKICAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgbVNlZWtNb2RlID0gU0VFS19DTE9TRVNUX1NZTkM7CiB9CiAKLWJvb2wgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cykgY29uc3QgeworYm9vbCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKKyAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKICAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOworICAgICptb2RlID0gbVNlZWtNb2RlOwogICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKIH0KIAordm9pZCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OmNsZWFyU2tpcEZyYW1lKCkgeworICAgIG1PcHRpb25zICY9IH5rU2tpcEZyYW1lX09wdGlvbjsKKyAgICBtU2tpcEZyYW1lVW50aWxUaW1lVXMgPSAwOworfQorCit2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0U2tpcEZyYW1lKGludDY0X3QgdGltZVVzKSB7CisgICAgbU9wdGlvbnMgfD0ga1NraXBGcmFtZV9PcHRpb247CisgICAgbVNraXBGcmFtZVVudGlsVGltZVVzID0gdGltZVVzOworfQorCitib29sIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6Z2V0U2tpcEZyYW1lKGludDY0X3QgKnRpbWVVcykgY29uc3QgeworICAgICp0aW1lVXMgPSBtU2tpcEZyYW1lVW50aWxUaW1lVXM7CisgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTa2lwRnJhbWVfT3B0aW9uKSAhPSAwOworfQorCiB2b2lkIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6c2V0TGF0ZUJ5KGludDY0X3QgbGF0ZW5lc3NfdXMpIHsKICAgICBtTGF0ZW5lc3NVcyA9IGxhdGVuZXNzX3VzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MWFhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk51Q2FjaGVkU291cmNlMiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBQYWdlQ2FjaGUgeworICAgIFBhZ2VDYWNoZShzaXplX3QgcGFnZVNpemUpOworICAgIH5QYWdlQ2FjaGUoKTsKKworICAgIHN0cnVjdCBQYWdlIHsKKyAgICAgICAgdm9pZCAqbURhdGE7CisgICAgICAgIHNpemVfdCBtU2l6ZTsKKyAgICB9OworCisgICAgUGFnZSAqYWNxdWlyZVBhZ2UoKTsKKyAgICB2b2lkIHJlbGVhc2VQYWdlKFBhZ2UgKnBhZ2UpOworCisgICAgdm9pZCBhcHBlbmRQYWdlKFBhZ2UgKnBhZ2UpOworICAgIHNpemVfdCByZWxlYXNlRnJvbVN0YXJ0KHNpemVfdCBtYXhCeXRlcyk7CisKKyAgICBzaXplX3QgdG90YWxTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRvdGFsU2l6ZTsKKyAgICB9CisKKyAgICB2b2lkIGNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBzaXplX3QgbVBhZ2VTaXplOworICAgIHNpemVfdCBtVG90YWxTaXplOworCisgICAgTGlzdDxQYWdlICo+IG1BY3RpdmVQYWdlczsKKyAgICBMaXN0PFBhZ2UgKj4gbUZyZWVQYWdlczsKKworICAgIHZvaWQgZnJlZVBhZ2VzKExpc3Q8UGFnZSAqPiAqbGlzdCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYWdlQ2FjaGUpOworfTsKKworUGFnZUNhY2hlOjpQYWdlQ2FjaGUoc2l6ZV90IHBhZ2VTaXplKQorICAgIDogbVBhZ2VTaXplKHBhZ2VTaXplKSwKKyAgICAgIG1Ub3RhbFNpemUoMCkgeworfQorCitQYWdlQ2FjaGU6On5QYWdlQ2FjaGUoKSB7CisgICAgZnJlZVBhZ2VzKCZtQWN0aXZlUGFnZXMpOworICAgIGZyZWVQYWdlcygmbUZyZWVQYWdlcyk7Cit9CisKK3ZvaWQgUGFnZUNhY2hlOjpmcmVlUGFnZXMoTGlzdDxQYWdlICo+ICpsaXN0KSB7CisgICAgTGlzdDxQYWdlICo+OjppdGVyYXRvciBpdCA9IGxpc3QtPmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGxpc3QtPmVuZCgpKSB7CisgICAgICAgIFBhZ2UgKnBhZ2UgPSAqaXQ7CisKKyAgICAgICAgZnJlZShwYWdlLT5tRGF0YSk7CisgICAgICAgIGRlbGV0ZSBwYWdlOworICAgICAgICBwYWdlID0gTlVMTDsKKworICAgICAgICArK2l0OworICAgIH0KK30KKworUGFnZUNhY2hlOjpQYWdlICpQYWdlQ2FjaGU6OmFjcXVpcmVQYWdlKCkgeworICAgIGlmICghbUZyZWVQYWdlcy5lbXB0eSgpKSB7CisgICAgICAgIExpc3Q8UGFnZSAqPjo6aXRlcmF0b3IgaXQgPSBtRnJlZVBhZ2VzLmJlZ2luKCk7CisgICAgICAgIFBhZ2UgKnBhZ2UgPSAqaXQ7CisgICAgICAgIG1GcmVlUGFnZXMuZXJhc2UoaXQpOworCisgICAgICAgIHJldHVybiBwYWdlOworICAgIH0KKworICAgIFBhZ2UgKnBhZ2UgPSBuZXcgUGFnZTsKKyAgICBwYWdlLT5tRGF0YSA9IG1hbGxvYyhtUGFnZVNpemUpOworICAgIHBhZ2UtPm1TaXplID0gMDsKKworICAgIHJldHVybiBwYWdlOworfQorCit2b2lkIFBhZ2VDYWNoZTo6cmVsZWFzZVBhZ2UoUGFnZSAqcGFnZSkgeworICAgIHBhZ2UtPm1TaXplID0gMDsKKyAgICBtRnJlZVBhZ2VzLnB1c2hfYmFjayhwYWdlKTsKK30KKwordm9pZCBQYWdlQ2FjaGU6OmFwcGVuZFBhZ2UoUGFnZSAqcGFnZSkgeworICAgIG1Ub3RhbFNpemUgKz0gcGFnZS0+bVNpemU7CisgICAgbUFjdGl2ZVBhZ2VzLnB1c2hfYmFjayhwYWdlKTsKK30KKworc2l6ZV90IFBhZ2VDYWNoZTo6cmVsZWFzZUZyb21TdGFydChzaXplX3QgbWF4Qnl0ZXMpIHsKKyAgICBzaXplX3QgYnl0ZXNSZWxlYXNlZCA9IDA7CisKKyAgICB3aGlsZSAobWF4Qnl0ZXMgPiAwICYmICFtQWN0aXZlUGFnZXMuZW1wdHkoKSkgeworICAgICAgICBMaXN0PFBhZ2UgKj46Oml0ZXJhdG9yIGl0ID0gbUFjdGl2ZVBhZ2VzLmJlZ2luKCk7CisKKyAgICAgICAgUGFnZSAqcGFnZSA9ICppdDsKKworICAgICAgICBpZiAobWF4Qnl0ZXMgPCBwYWdlLT5tU2l6ZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlUGFnZXMuZXJhc2UoaXQpOworCisgICAgICAgIG1heEJ5dGVzIC09IHBhZ2UtPm1TaXplOworICAgICAgICBieXRlc1JlbGVhc2VkICs9IHBhZ2UtPm1TaXplOworCisgICAgICAgIHJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0KKworICAgIG1Ub3RhbFNpemUgLT0gYnl0ZXNSZWxlYXNlZDsKKyAgICByZXR1cm4gYnl0ZXNSZWxlYXNlZDsKK30KKwordm9pZCBQYWdlQ2FjaGU6OmNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJjb3B5IGZyb20gIiA8PCBmcm9tIDw8ICIgc2l6ZSAiIDw8IHNpemU7CisKKyAgICBDSEVDS19MRShmcm9tICsgc2l6ZSwgbVRvdGFsU2l6ZSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBMaXN0PFBhZ2UgKj46Oml0ZXJhdG9yIGl0ID0gbUFjdGl2ZVBhZ2VzLmJlZ2luKCk7CisgICAgd2hpbGUgKGZyb20gPj0gb2Zmc2V0ICsgKCppdCktPm1TaXplKSB7CisgICAgICAgIG9mZnNldCArPSAoKml0KS0+bVNpemU7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgc2l6ZV90IGRlbHRhID0gZnJvbSAtIG9mZnNldDsKKyAgICBzaXplX3QgYXZhaWwgPSAoKml0KS0+bVNpemUgLSBkZWx0YTsKKworICAgIGlmIChhdmFpbCA+PSBzaXplKSB7CisgICAgICAgIG1lbWNweShkYXRhLCAoY29uc3QgdWludDhfdCAqKSgqaXQpLT5tRGF0YSArIGRlbHRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweShkYXRhLCAoY29uc3QgdWludDhfdCAqKSgqaXQpLT5tRGF0YSArIGRlbHRhLCBhdmFpbCk7CisgICAgKytpdDsKKyAgICBkYXRhID0gKHVpbnQ4X3QgKilkYXRhICsgYXZhaWw7CisgICAgc2l6ZSAtPSBhdmFpbDsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBzaXplX3QgY29weSA9ICgqaXQpLT5tU2l6ZTsKKyAgICAgICAgaWYgKGNvcHkgPiBzaXplKSB7CisgICAgICAgICAgICBjb3B5ID0gc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoZGF0YSwgKCppdCktPm1EYXRhLCBjb3B5KTsKKyAgICAgICAgZGF0YSA9ICh1aW50OF90ICopZGF0YSArIGNvcHk7CisgICAgICAgIHNpemUgLT0gY29weTsKKyAgICAgICAgKytpdDsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK051Q2FjaGVkU291cmNlMjo6TnVDYWNoZWRTb3VyY2UyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxOdUNhY2hlZFNvdXJjZTI+KHRoaXMpKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbUNhY2hlKG5ldyBQYWdlQ2FjaGUoa1BhZ2VTaXplKSksCisgICAgICBtQ2FjaGVPZmZzZXQoMCksCisgICAgICBtRmluYWxTdGF0dXMoT0spLAorICAgICAgbUxhc3RBY2Nlc3NQb3MoMCksCisgICAgICBtRmV0Y2hpbmcodHJ1ZSksCisgICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSB7CisgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVDYWNoZWRTb3VyY2UyIik7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworfQorCitOdUNhY2hlZFNvdXJjZTI6On5OdUNhY2hlZFNvdXJjZTIoKSB7CisgICAgbUxvb3Blci0+c3RvcCgpOworICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3ItPmlkKCkpOworCisgICAgZGVsZXRlIG1DYWNoZTsKKyAgICBtQ2FjaGUgPSBOVUxMOworfQorCitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0U2l6ZShvZmZfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgeworICAgIHJldHVybiBtU291cmNlLT5mbGFncygpOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRGZXRjaE1vcmU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uRmV0Y2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdFJlYWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUmVhZChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpmZXRjaEludGVybmFsKCkgeworICAgIExPRyhWRVJCT1NFKSA8PCAiZmV0Y2hJbnRlcm5hbCI7CisKKyAgICBDSEVDS19FUShtRmluYWxTdGF0dXMsIChzdGF0dXNfdClPSyk7CisKKyAgICBQYWdlQ2FjaGU6OlBhZ2UgKnBhZ2UgPSBtQ2FjaGUtPmFjcXVpcmVQYWdlKCk7CisKKyAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpLCBwYWdlLT5tRGF0YSwga1BhZ2VTaXplKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic291cmNlIHJldHVybmVkIGVycm9yICIgPDwgbjsKKyAgICAgICAgbUZpbmFsU3RhdHVzID0gbjsKKyAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKKyAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICBMT0coSU5GTykgPDwgIkVSUk9SX0VORF9PRl9TVFJFQU0iOworICAgICAgICBtRmluYWxTdGF0dXMgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhZ2UtPm1TaXplID0gbjsKKyAgICAgICAgbUNhY2hlLT5hcHBlbmRQYWdlKHBhZ2UpOworICAgIH0KK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6Om9uRmV0Y2goKSB7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJvbkZldGNoIjsKKworICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJFT1MgcmVhY2hlZCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93IjsKKyAgICAgICAgbUZldGNoaW5nID0gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBrZWVwQWxpdmUgPQorICAgICAgICAhbUZldGNoaW5nCisgICAgICAgICAgICAmJiBtRmluYWxTdGF0dXMgPT0gT0sKKyAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgPj0gbUxhc3RGZXRjaFRpbWVVcyArIGtLZWVwQWxpdmVJbnRlcnZhbFVzOworCisgICAgaWYgKG1GZXRjaGluZyB8fCBrZWVwQWxpdmUpIHsKKyAgICAgICAgaWYgKGtlZXBBbGl2ZSkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJLZWVwIGFsaXZlIjsKKyAgICAgICAgfQorCisgICAgICAgIGZldGNoSW50ZXJuYWwoKTsKKworICAgICAgICBtTGFzdEZldGNoVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgICAgICBpZiAobUZldGNoaW5nICYmIG1DYWNoZS0+dG90YWxTaXplKCkgPj0ga0hpZ2hXYXRlclRocmVzaG9sZCkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDYWNoZSBmdWxsLCBkb25lIHByZWZldGNoaW5nIGZvciBub3ciOworICAgICAgICAgICAgbUZldGNoaW5nID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woKTsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoCisgICAgICAgICAgICBtRmV0Y2hpbmcgPyAwIDogMTAwMDAwbGwpOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6b25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJvblJlYWQiOworCisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm9mZnNldCIsICZvZmZzZXQpKTsKKworICAgIHZvaWQgKmRhdGE7CisgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZGF0YSIsICZkYXRhKSk7CisKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKTsKKworICAgIHNzaXplX3QgcmVzdWx0ID0gcmVhZEludGVybmFsKG9mZnNldCwgZGF0YSwgc2l6ZSk7CisKKyAgICBpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKKyAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CisKKyAgICBtQXN5bmNSZXN1bHQgPSBuZXcgQU1lc3NhZ2U7CisgICAgbUFzeW5jUmVzdWx0LT5zZXRJbnQzMigicmVzdWx0IiwgcmVzdWx0KTsKKworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpyZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrR3JheUFyZWEgPSAyNTYgKiAxMDI0OworCisgICAgaWYgKG1GZXRjaGluZyB8fCBtRmluYWxTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpIC0gbUxhc3RBY2Nlc3NQb3MKKyAgICAgICAgICAgID49IGtMb3dXYXRlclRocmVzaG9sZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IG1heEJ5dGVzID0gbUxhc3RBY2Nlc3NQb3MgLSBtQ2FjaGVPZmZzZXQ7CisgICAgaWYgKG1heEJ5dGVzIDwga0dyYXlBcmVhKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtYXhCeXRlcyAtPSBrR3JheUFyZWE7CisKKyAgICBzaXplX3QgYWN0dWFsQnl0ZXMgPSBtQ2FjaGUtPnJlbGVhc2VGcm9tU3RhcnQobWF4Qnl0ZXMpOworICAgIG1DYWNoZU9mZnNldCArPSBhY3R1YWxCeXRlczsKKworICAgIExPRyhJTkZPKSA8PCAicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAiIDw8IG1DYWNoZS0+dG90YWxTaXplKCk7CisgICAgbUZldGNoaW5nID0gdHJ1ZTsKK30KKworc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9TZXJpYWxpemVyKG1TZXJpYWxpemVyKTsKKworICAgIExPRyhWRVJCT1NFKSA8PCAicmVhZEF0IG9mZnNldCAiIDw8IG9mZnNldCA8PCAiIHNpemUgIiA8PCBzaXplOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIC8vIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBjb21wbGV0ZWx5IHNhdGlzZmllZCBmcm9tIHRoZSBjYWNoZSwgZG8gc28uCisKKyAgICBpZiAob2Zmc2V0ID49IG1DYWNoZU9mZnNldAorICAgICAgICAgICAgJiYgb2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7CisgICAgICAgIHNpemVfdCBkZWx0YSA9IG9mZnNldCAtIG1DYWNoZU9mZnNldDsKKyAgICAgICAgbUNhY2hlLT5jb3B5KGRlbHRhLCBkYXRhLCBzaXplKTsKKworICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldCArIHNpemU7CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIG1zZy0+c2V0SW50NjQoIm9mZnNldCIsIG9mZnNldCk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJkYXRhIiwgZGF0YSk7CisgICAgbXNnLT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CisKKyAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CisgICAgbXNnLT5wb3N0KCk7CisKKyAgICB3aGlsZSAobUFzeW5jUmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc3VsdDsKKyAgICBDSEVDSyhtQXN5bmNSZXN1bHQtPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgbUFzeW5jUmVzdWx0LmNsZWFyKCk7CisKKyAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldCArIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gKHNzaXplX3QpcmVzdWx0OworfQorCitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpjYWNoZWRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoYm9vbCAqZW9zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKGVvcyk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChib29sICplb3MpIHsKKyAgICAqZW9zID0gKG1GaW5hbFN0YXR1cyAhPSBPSyk7CisgICAgb2ZmX3QgbGFzdEJ5dGVQb3NDYWNoZWQgPSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOworICAgIGlmIChtTGFzdEFjY2Vzc1BvcyA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CisgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG1MYXN0QWNjZXNzUG9zOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OnJlYWRJbnRlcm5hbChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJyZWFkSW50ZXJuYWwgb2Zmc2V0ICIgPDwgb2Zmc2V0IDw8ICIgc2l6ZSAiIDw8IHNpemU7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG9mZnNldCA8IG1DYWNoZU9mZnNldAorICAgICAgICAgICAgfHwgb2Zmc2V0ID49IChvZmZfdCkobUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSkpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IG9mZl90IGtQYWRkaW5nID0gMzI3Njg7CisKKyAgICAgICAgLy8gSW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIGRlY29kZWQgc3RyZWFtcywgb25jZSBvZiB0aGVtIHdpbGwKKyAgICAgICAgLy8gdHJpZ2dlciB0aGlzIHNlZWsgcmVxdWVzdCwgdGhlIG90aGVyIG9uZSB3aWxsIHJlcXVlc3QgZGF0YSAibmVhcmJ5IgorICAgICAgICAvLyBzb29uLCBhZGp1c3QgdGhlIHNlZWsgcG9zaXRpb24gc28gdGhhdCB0aGF0IHN1YnNlcXVlbnQgcmVxdWVzdAorICAgICAgICAvLyBkb2VzIG5vdCB0cmlnZ2VyIGFub3RoZXIgc2Vlay4KKyAgICAgICAgb2ZmX3Qgc2Vla09mZnNldCA9IChvZmZzZXQgPiBrUGFkZGluZykgPyBvZmZzZXQgLSBrUGFkZGluZyA6IDA7CisKKyAgICAgICAgc2Vla0ludGVybmFsX2woc2Vla09mZnNldCk7CisgICAgfQorCisgICAgc2l6ZV90IGRlbHRhID0gb2Zmc2V0IC0gbUNhY2hlT2Zmc2V0OworCisgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSykgeworICAgICAgICBpZiAoZGVsdGEgPj0gbUNhY2hlLT50b3RhbFNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1GaW5hbFN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1DYWNoZS0+dG90YWxTaXplKCkgLSBkZWx0YTsKKyAgICAgICAgbUNhY2hlLT5jb3B5KGRlbHRhLCBkYXRhLCBhdmFpbCk7CisKKyAgICAgICAgcmV0dXJuIGF2YWlsOworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyBzaXplIDw9IG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkpIHsKKyAgICAgICAgbUNhY2hlLT5jb3B5KGRlbHRhLCBkYXRhLCBzaXplKTsKKworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBMT0coVkVSQk9TRSkgPDwgImRlZmVycmluZyByZWFkIjsKKworICAgIHJldHVybiAtRUFHQUlOOworfQorCitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OnNlZWtJbnRlcm5hbF9sKG9mZl90IG9mZnNldCkgeworICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OworCisgICAgaWYgKG9mZnNldCA+PSBtQ2FjaGVPZmZzZXQKKyAgICAgICAgICAgICYmIG9mZnNldCA8PSAob2ZmX3QpKG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBMT0coSU5GTykgPDwgIm5ldyByYW5nZTogb2Zmc2V0PSAiIDw8IG9mZnNldDsKKworICAgIG1DYWNoZU9mZnNldCA9IG9mZnNldDsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSBtQ2FjaGUtPnRvdGFsU2l6ZSgpOworICAgIENIRUNLX0VRKG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydCh0b3RhbFNpemUpLCB0b3RhbFNpemUpOworCisgICAgbUZpbmFsU3RhdHVzID0gT0s7CisgICAgbUZldGNoaW5nID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUhUVFBEYXRhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjkyODVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVIVFRQRGF0YVNvdXJjZS5jcHAKQEAgLTAsMCArMSwzMzggQEAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTnVIVFRQRGF0YVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgYm9vbCBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZygKKyAgICAgICAgY29uc3QgY2hhciAqZnJvbSwgdW5zaWduZWQgbG9uZyAqeCkgeworICAgIGNoYXIgKmVuZDsKKyAgICAqeCA9IHN0cnRvdWwoZnJvbSwgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBmcm9tIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFBhcnNlVVJMKAorICAgICAgICBjb25zdCBjaGFyICp1cmwsIFN0cmluZzggKmhvc3QsIHVuc2lnbmVkICpwb3J0LCBTdHJpbmc4ICpwYXRoKSB7CisgICAgaG9zdC0+c2V0VG8oIiIpOworICAgICpwb3J0ID0gMDsKKyAgICBwYXRoLT5zZXRUbygiIik7CisKKyAgICBpZiAoc3RybmNhc2VjbXAoImh0dHA6Ly8iLCB1cmwsIDcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cmNocigmdXJsWzddLCAnLycpOworCisgICAgaWYgKHNsYXNoUG9zID09IE5VTEwpIHsKKyAgICAgICAgaG9zdC0+c2V0VG8oJnVybFs3XSk7CisgICAgICAgIHBhdGgtPnNldFRvKCIvIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaG9zdC0+c2V0VG8oJnVybFs3XSwgc2xhc2hQb3MgLSAmdXJsWzddKTsKKyAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOworICAgIH0KKworICAgIGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPnN0cmluZygpLCAnOicpOworCisgICAgaWYgKGNvbG9uUG9zICE9IE5VTEwpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB4OworICAgICAgICBpZiAoIVBhcnNlU2luZ2xlVW5zaWduZWRMb25nKGNvbG9uUG9zICsgMSwgJngpIHx8IHggPj0gNjU1MzYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICpwb3J0ID0geDsKKworICAgICAgICBzaXplX3QgY29sb25PZmZzZXQgPSBjb2xvblBvcyAtIGhvc3QtPnN0cmluZygpOworICAgICAgICBTdHJpbmc4IHRtcChob3N0LT5zdHJpbmcoKSwgY29sb25PZmZzZXQpOworICAgICAgICAqaG9zdCA9IHRtcDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcG9ydCA9IDgwOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitOdUhUVFBEYXRhU291cmNlOjpOdUhUVFBEYXRhU291cmNlKCkKKyAgICA6IG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbVBvcnQoMCksCisgICAgICBtT2Zmc2V0KDApLAorICAgICAgbUNvbnRlbnRMZW5ndGgoMCksCisgICAgICBtQ29udGVudExlbmd0aFZhbGlkKGZhbHNlKSB7Cit9CisKK051SFRUUERhdGFTb3VyY2U6On5OdUhUVFBEYXRhU291cmNlKCkgeworfQorCitzdGF0dXNfdCBOdUhUVFBEYXRhU291cmNlOjpjb25uZWN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpvdmVycmlkZXMsCisgICAgICAgIG9mZl90IG9mZnNldCkgeworICAgIFN0cmluZzggaGVhZGVyczsKKyAgICBNYWtlRnVsbEhlYWRlcnMob3ZlcnJpZGVzLCAmaGVhZGVycyk7CisKKyAgICByZXR1cm4gY29ubmVjdCh1cmksIGhlYWRlcnMsIG9mZnNldCk7Cit9CisKK3N0YXR1c190IE51SFRUUERhdGFTb3VyY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmaGVhZGVycywKKyAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgU3RyaW5nOCBob3N0LCBwYXRoOworICAgIHVuc2lnbmVkIHBvcnQ7CisgICAgaWYgKCFQYXJzZVVSTCh1cmksICZob3N0LCAmcG9ydCwgJnBhdGgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgcmV0dXJuIGNvbm5lY3QoaG9zdCwgcG9ydCwgcGF0aCwgaGVhZGVycywgb2Zmc2V0KTsKK30KKworc3RhdHVzX3QgTnVIVFRQRGF0YVNvdXJjZTo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmaGVhZGVycywKKyAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CisgICAgTE9HSSgiY29ubmVjdCB0byAlczoldSVzIEAlbGQiLCBob3N0LCBwb3J0LCBwYXRoLCBvZmZzZXQpOworCisgICAgYm9vbCBuZWVkc1RvUmVjb25uZWN0ID0gdHJ1ZTsKKworICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVEVEICYmIGhvc3QgPT0gbUhvc3QgJiYgcG9ydCA9PSBtUG9ydAorICAgICAgICAgICAgJiYgb2Zmc2V0ID09IG1PZmZzZXQpIHsKKyAgICAgICAgaWYgKG1Db250ZW50TGVuZ3RoVmFsaWQgJiYgbU9mZnNldCA9PSBtQ29udGVudExlbmd0aCkgeworICAgICAgICAgICAgTE9HSSgiRGlkbid0IGhhdmUgdG8gcmVjb25uZWN0LCBvbGQgb25lJ3Mgc3RpbGwgZ29vZC4iKTsKKyAgICAgICAgICAgIG5lZWRzVG9SZWNvbm5lY3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1Ib3N0ID0gaG9zdDsKKyAgICBtUG9ydCA9IHBvcnQ7CisgICAgbVBhdGggPSBwYXRoOworICAgIG1IZWFkZXJzID0gaGVhZGVyczsKKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgbVN0YXRlID0gQ09OTkVDVElORzsKKworICAgIGlmIChuZWVkc1RvUmVjb25uZWN0KSB7CisgICAgICAgIG1IVFRQLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgZXJyID0gbUhUVFAuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSAhPSBDT05ORUNUSU5HKSB7CisgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOworCisgICAgICAgIG1PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIG1Db250ZW50TGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbnRlbnRMZW5ndGhWYWxpZCA9IGZhbHNlOworCisgICAgICAgIFN0cmluZzggcmVxdWVzdCgiR0VUICIpOworICAgICAgICByZXF1ZXN0LmFwcGVuZChtUGF0aCk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgSFRUUC8xLjFcclxuIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJIb3N0OiAiKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQobUhvc3QpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIGlmIChvZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgY2hhciByYW5nZUhlYWRlclsxMjhdOworICAgICAgICAgICAgc3ByaW50ZihyYW5nZUhlYWRlciwgIlJhbmdlOiBieXRlcz0lbGQtXHJcbiIsIG9mZnNldCk7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChyYW5nZUhlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0LmFwcGVuZChtSGVhZGVycyk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgaW50IGh0dHBTdGF0dXM7CisgICAgICAgIGlmICgoZXJyID0gbUhUVFAuc2VuZChyZXF1ZXN0LnN0cmluZygpLCByZXF1ZXN0LnNpemUoKSkpICE9IE9LCisgICAgICAgICAgICAgICAgfHwgKGVyciA9IG1IVFRQLnJlY2VpdmVfaGVhZGVyKCZodHRwU3RhdHVzKSkgIT0gT0spIHsKKyAgICAgICAgICAgIG1IVFRQLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFN0YXR1cyA9PSAzMDIpIHsKKyAgICAgICAgICAgIHN0cmluZyB2YWx1ZTsKKyAgICAgICAgICAgIENIRUNLKG1IVFRQLmZpbmRfaGVhZGVyX3ZhbHVlKCJMb2NhdGlvbiIsICZ2YWx1ZSkpOworCisgICAgICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisKKyAgICAgICAgICAgIG1IVFRQLmRpc2Nvbm5lY3QoKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3QodmFsdWUuY19zdHIoKSwgaGVhZGVycywgb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChodHRwU3RhdHVzIDwgMjAwIHx8IGh0dHBTdGF0dXMgPj0gMzAwKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisgICAgICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIGFwcGx5VGltZW91dFJlc3BvbnNlKCk7CisKKyAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgICAgICAgICBpZiAobUhUVFAuZmluZF9oZWFkZXJfdmFsdWUoc3RyaW5nKCJDb250ZW50LUxlbmd0aCIpLCAmdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICYmIFBhcnNlU2luZ2xlVW5zaWduZWRMb25nKHZhbHVlLmNfc3RyKCksICZ4KSkgeworICAgICAgICAgICAgICAgIG1Db250ZW50TGVuZ3RoID0gKG9mZl90KXg7CisgICAgICAgICAgICAgICAgbUNvbnRlbnRMZW5ndGhWYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgICAgICAgICBpZiAobUhUVFAuZmluZF9oZWFkZXJfdmFsdWUoc3RyaW5nKCJDb250ZW50LVJhbmdlIiksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cmNocih2YWx1ZS5jX3N0cigpLCAnLycpOworICAgICAgICAgICAgICAgIGlmIChzbGFzaFBvcyAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZyhzbGFzaFBvcyArIDEsICZ4KSkgeworICAgICAgICAgICAgICAgICAgICBtQ29udGVudExlbmd0aCA9IHg7CisgICAgICAgICAgICAgICAgICAgIG1Db250ZW50TGVuZ3RoVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgTnVIVFRQRGF0YVNvdXJjZTo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcgfHwgbVN0YXRlID09IENPTk5FQ1RFRCkgeworICAgICAgICBtSFRUUC5kaXNjb25uZWN0KCk7CisgICAgfQorICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKK30KKworc3RhdHVzX3QgTnVIVFRQRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhdGUgPT0gQ09OTkVDVEVEID8gT0sgOiBOT19JTklUOworfQorCitzc2l6ZV90IE51SFRUUERhdGFTb3VyY2U6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTE9HVigicmVhZEF0IG9mZnNldCAlbGQsIHNpemUgJWQiLCBvZmZzZXQsIHNpemUpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChvZmZzZXQgIT0gbU9mZnNldCkgeworICAgICAgICBTdHJpbmc4IGhvc3QgPSBtSG9zdDsKKyAgICAgICAgU3RyaW5nOCBwYXRoID0gbVBhdGg7CisgICAgICAgIFN0cmluZzggaGVhZGVycyA9IG1IZWFkZXJzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uZWN0KGhvc3QsIG1Qb3J0LCBwYXRoLCBoZWFkZXJzLCBvZmZzZXQpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNvbnRlbnRMZW5ndGhWYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPQorICAgICAgICAgICAgKG9mZnNldCA+PSBtQ29udGVudExlbmd0aCkgPyAwIDogbUNvbnRlbnRMZW5ndGggLSBvZmZzZXQ7CisKKyAgICAgICAgaWYgKHNpemUgPiBhdmFpbCkgeworICAgICAgICAgICAgc2l6ZSA9IGF2YWlsOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc3NpemVfdCBuID0KKyAgICAgICAgICAgIG1IVFRQLnJlY2VpdmUoKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBzaXplIC0gbnVtQnl0ZXNSZWFkKTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisKKyAgICAgICAgbnVtQnl0ZXNSZWFkICs9IChzaXplX3QpbjsKKworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBpZiAobUNvbnRlbnRMZW5ndGhWYWxpZCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlIGNvbnRlbnQgbGVuZ3RoIGFuZCBtYWRlIHN1cmUgbm90IHRvIHJlYWQgYmV5b25kCisgICAgICAgICAgICAgICAgLy8gaXQgYW5kIHlldCB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBvbiB1cy4KKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbU9mZnNldCArPSBudW1CeXRlc1JlYWQ7CisKKyAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOworfQorCitzdGF0dXNfdCBOdUhUVFBEYXRhU291cmNlOjpnZXRTaXplKG9mZl90ICpzaXplKSB7CisgICAgKnNpemUgPSAwOworCisgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGlmIChtQ29udGVudExlbmd0aFZhbGlkKSB7CisgICAgICAgICpzaXplID0gbUNvbnRlbnRMZW5ndGg7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3VpbnQzMl90IE51SFRUUERhdGFTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZzsKK30KKworLy8gc3RhdGljCit2b2lkIE51SFRUUERhdGFTb3VyY2U6Ok1ha2VGdWxsSGVhZGVycygKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKm92ZXJyaWRlcywgU3RyaW5nOCAqaGVhZGVycykgeworICAgIGhlYWRlcnMtPnNldFRvKCIiKTsKKworICAgIGhlYWRlcnMtPmFwcGVuZCgiVXNlci1BZ2VudDogc3RhZ2VmcmlnaHQvMS4xIChMaW51eDtBbmRyb2lkICIpOworCisjaWYgKFBST1BFUlRZX1ZBTFVFX01BWCA8IDgpCisjZXJyb3IgIlBST1BFUlRZX1ZBTFVFX01BWCBtdXN0IGJlIGF0IGxlYXN0IDgiCisjZW5kaWYKKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSIsIHZhbHVlLCAiVW5rbm93biIpOworICAgIGhlYWRlcnMtPmFwcGVuZCh2YWx1ZSk7CisgICAgaGVhZGVycy0+YXBwZW5kKCIpXHJcbiIpOworCisgICAgaWYgKG92ZXJyaWRlcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG92ZXJyaWRlcy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBsaW5lOworICAgICAgICBsaW5lLmFwcGVuZChvdmVycmlkZXMtPmtleUF0KGkpKTsKKyAgICAgICAgbGluZS5hcHBlbmQoIjogIik7CisgICAgICAgIGxpbmUuYXBwZW5kKG92ZXJyaWRlcy0+dmFsdWVBdChpKSk7CisgICAgICAgIGxpbmUuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgaGVhZGVycy0+YXBwZW5kKGxpbmUpOworICAgIH0KK30KKwordm9pZCBOdUhUVFBEYXRhU291cmNlOjphcHBseVRpbWVvdXRSZXNwb25zZSgpIHsKKyAgICBzdHJpbmcgdGltZW91dDsKKyAgICBpZiAobUhUVFAuZmluZF9oZWFkZXJfdmFsdWUoIlgtU29ja2V0VGltZW91dCIsICZ0aW1lb3V0KSkgeworICAgICAgICBjb25zdCBjaGFyICpzID0gdGltZW91dC5jX3N0cigpOworICAgICAgICBjaGFyICplbmQ7CisgICAgICAgIGxvbmcgdG1wID0gc3RydG9sKHMsICZlbmQsIDEwKTsKKyAgICAgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICAgICAgTE9HVygiSWxsZWdhbCBYLVNvY2tldFRpbWVvdXQgdmFsdWUgZ2l2ZW4uIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMT0dJKCJvdmVycmlkaW5nIGRlZmF1bHQgdGltZW91dCwgbmV3IHRpbWVvdXQgaXMgJWxkIHNlY29uZHMiLCB0bXApOworICAgICAgICBtSFRUUC5zZXRSZWNlaXZlVGltZW91dCh0bXApOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAppbmRleCA2OWRhN2VmLi4xNjVjZWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCkBAIC0xOSwxMyArMTksMTkgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvQUFDRGVjb2Rlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQUFDRW5jb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvQU1STkJEZWNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BTVJOQkVuY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL0FNUldCRGVjb2Rlci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQU1SV0JFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BVkNEZWNvZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9BVkNFbmNvZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9HNzExRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTTR2SDI2M0RlY29kZXIuaCIKKyNpbmNsdWRlICJpbmNsdWRlL000dkgyNjNFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NUDNEZWNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9Wb3JiaXNEZWNvZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9WUFhEZWNvZGVyLmgiCiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKIApAQCAtNjAsNiArNjYsMTEgQEAKICAgICByZXR1cm4gbmV3IG5hbWUoc291cmNlKTsgXAogfQogCisjZGVmaW5lIEZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIobmFtZSkgXAorc3RhdGljIHNwPE1lZGlhU291cmNlPiBNYWtlIyNuYW1lKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsgXAorICAgIHJldHVybiBuZXcgbmFtZShzb3VyY2UsIG1ldGEpOyBcCit9CisKICNkZWZpbmUgRkFDVE9SWV9SRUYobmFtZSkgeyAjbmFtZSwgTWFrZSMjbmFtZSB9LAogCiBGQUNUT1JZX0NSRUFURShNUDNEZWNvZGVyKQpAQCAtNjcsOSArNzgsNDAgQEAKIEZBQ1RPUllfQ1JFQVRFKEFNUldCRGVjb2RlcikKIEZBQ1RPUllfQ1JFQVRFKEFBQ0RlY29kZXIpCiBGQUNUT1JZX0NSRUFURShBVkNEZWNvZGVyKQorRkFDVE9SWV9DUkVBVEUoRzcxMURlY29kZXIpCiBGQUNUT1JZX0NSRUFURShNNHZIMjYzRGVjb2RlcikKIEZBQ1RPUllfQ1JFQVRFKFZvcmJpc0RlY29kZXIpCi1GQUNUT1JZX0NSRUFURShBTVJOQkVuY29kZXIpCitGQUNUT1JZX0NSRUFURShWUFhEZWNvZGVyKQorRkFDVE9SWV9DUkVBVEVfRU5DT0RFUihBTVJOQkVuY29kZXIpCitGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFNUldCRW5jb2RlcikKK0ZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQUFDRW5jb2RlcikKK0ZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQVZDRW5jb2RlcikKK0ZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoTTR2SDI2M0VuY29kZXIpCisKK3N0YXRpYyBzcDxNZWRpYVNvdXJjZT4gSW5zdGFudGlhdGVTb2Z0d2FyZUVuY29kZXIoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKKyAgICBzdHJ1Y3QgRmFjdG9yeUluZm8geworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gKCpDcmVhdGVGdW5jKShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJiwgY29uc3Qgc3A8TWV0YURhdGE+ICYpOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgRmFjdG9yeUluZm8ga0ZhY3RvcnlJbmZvW10gPSB7CisgICAgICAgIEZBQ1RPUllfUkVGKEFNUk5CRW5jb2RlcikKKyAgICAgICAgRkFDVE9SWV9SRUYoQU1SV0JFbmNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihBQUNFbmNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihBVkNFbmNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihNNHZIMjYzRW5jb2RlcikKKyAgICB9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgaSA8IHNpemVvZihrRmFjdG9yeUluZm8pIC8gc2l6ZW9mKGtGYWN0b3J5SW5mb1swXSk7ICsraSkgeworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBrRmFjdG9yeUluZm9baV0ubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAoKmtGYWN0b3J5SW5mb1tpXS5DcmVhdGVGdW5jKShzb3VyY2UsIG1ldGEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CiAKIHN0YXRpYyBzcDxNZWRpYVNvdXJjZT4gSW5zdGFudGlhdGVTb2Z0d2FyZUNvZGVjKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSkgewpAQCAtODQsOSArMTI2LDEwIEBACiAgICAgICAgIEZBQ1RPUllfUkVGKEFNUldCRGVjb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoQUFDRGVjb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoQVZDRGVjb2RlcikKKyAgICAgICAgRkFDVE9SWV9SRUYoRzcxMURlY29kZXIpCiAgICAgICAgIEZBQ1RPUllfUkVGKE00dkgyNjNEZWNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihWb3JiaXNEZWNvZGVyKQotICAgICAgICBGQUNUT1JZX1JFRihBTVJOQkVuY29kZXIpCisgICAgICAgIEZBQ1RPUllfUkVGKFZQWERlY29kZXIpCiAgICAgfTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsKICAgICAgICAgIGkgPCBzaXplb2Yoa0ZhY3RvcnlJbmZvKSAvIHNpemVvZihrRmFjdG9yeUluZm9bMF0pOyArK2kpIHsKQEAgLTExNSwzNCArMTU4LDQ5IEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmRlY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIkFBQ0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5QVi5hYWNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcsICJHNzExRGVjb2RlciIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywgIkc3MTFEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLnZpZGVvLmRlY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5WaWRlby5EZWNvZGVyIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJNNHZIMjYzRGVjb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguUFYubXBlZzRkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20uN3gzMC52aWRlby5kZWNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5oMjYzIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgIk00dkgyNjNEZWNvZGVyIiB9LAogLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlBWLmgyNjNkZWMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS43eDMwLnZpZGVvLmRlY29kZXIuYXZjIiB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVguVEkuVmlkZW8uRGVjb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIkFWQ0RlY29kZXIiIH0sCiAvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5QVi5hdmNkZWMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJWb3JiaXNEZWNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlBYLCAiVlBYRGVjb2RlciIgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBDb2RlY0luZm8ga0VuY29kZXJJbmZvW10gPSB7CiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJPTVguVEkuQU1SLmVuY29kZSIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgIkFNUk5CRW5jb2RlciIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgIk9NWC5USS5XQkFNUi5lbmNvZGUiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJBTVJXQkVuY29kZXIiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguVEkuQUFDLmVuY29kZSIgfSwKLSAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgIk9NWC5QVi5hYWNlbmMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJBQUNFbmNvZGVyIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJPTVguUFYuYWFjZW5jIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzQiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAotICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJPTVguUFYubXBlZzRlbmMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk00dkgyNjNFbmNvZGVyIiB9LAorLy8gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgIk9NWC5QVi5tcGVnNGVuYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIuaDI2MyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmgyNjMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlRJLlZpZGVvLmVuY29kZXIiIH0sCi0gICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiT01YLlBWLmgyNjNlbmMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiTTR2SDI2M0VuY29kZXIiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJPTVguUFYuaDI2M2VuYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCisgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAotICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlBWLmF2Y2VuYyIgfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIkFWQ0VuY29kZXIiIH0sCisvLyAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5QVi5hdmNlbmMiIH0sCiB9OwogCiAjdW5kZWYgT1BUSU9OQUwKQEAgLTI5NSwxMSArMzUzLDI3IEBACiAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNMb2FkZWRUb0lkbGVBZnRlckFsbG9jYXRpb247CiAgICAgICAgIHF1aXJrcyB8PSBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKKyAgICAgICAgaWYgKCFzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIsIDI2KSkgeworCisgICAgICAgICAgICAvLyBUaGUgQVZDIGVuY29kZXIgYWR2ZXJ0aXNlcyB0aGUgc2l6ZSBvZiBvdXRwdXQgYnVmZmVycworICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGlucHV0IHZpZGVvIHJlc29sdXRpb24gYW5kIGFzc3VtZXMKKyAgICAgICAgICAgIC8vIHRoZSB3b3JzdC9sZWFzdCBjb21wcmVzc2lvbiByYXRpbyBpcyAwLjUuIEl0IGlzIGZvdW5kIHRoYXQKKyAgICAgICAgICAgIC8vIHNvbWV0aW1lcywgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbgorICAgICAgICAgICAgLy8gc2l6ZSBhZHZlcnRpc2VkIGJ5IHRoZSBlbmNvZGVyLgorICAgICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0xhcmdlckVuY29kZXJPdXRwdXRCdWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVgucWNvbS43eDMwLnZpZGVvLmVuY29kZXIuIiwgMjgpKSB7CiAgICAgfQogICAgIGlmICghc3RybmNtcChjb21wb25lbnROYW1lLCAiT01YLnFjb20udmlkZW8uZGVjb2Rlci4iLCAyMykpIHsKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKICAgICAgICAgcXVpcmtzIHw9IGtEZWZlcnNPdXRwdXRCdWZmZXJBbGxvY2F0aW9uOwogICAgIH0KKyAgICBpZiAoIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5xY29tLjd4MzAudmlkZW8uZGVjb2Rlci4iLCAyOCkpIHsKKyAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOworICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOworICAgICAgICBxdWlya3MgfD0ga0RlZmVyc091dHB1dEJ1ZmZlckFsbG9jYXRpb247CisgICAgfQogCiAgICAgaWYgKCFzdHJuY21wKGNvbXBvbmVudE5hbWUsICJPTVguVEkuIiwgNykpIHsKICAgICAgICAgLy8gQXBwYXJlbnRseSBJIG11c3Qgbm90IHVzZSBPTVhfVXNlQnVmZmVyIG9uIGVpdGhlciBpbnB1dCBvcgpAQCAtMzA5LDYgKzM4Myw5IEBACiAKICAgICAgICAgcXVpcmtzIHw9IGtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25JbnB1dFBvcnRzOwogICAgICAgICBxdWlya3MgfD0ga1JlcXVpcmVzQWxsb2NhdGVCdWZmZXJPbk91dHB1dFBvcnRzOworICAgICAgICBpZiAoIXN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5USS5WaWRlby5lbmNvZGVyIiwgMjApKSB7CisgICAgICAgICAgICBxdWlya3MgfD0ga0F2b2lkTWVtY29weUlucHV0UmVjb3JkaW5nRnJhbWVzOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFzdHJjbXAoY29tcG9uZW50TmFtZSwgIk9NWC5USS5WaWRlby5EZWNvZGVyIikpIHsKQEAgLTM4NCw4ICs0NjEsOCBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldLnN0cmluZygpOwogCi0jaWYgQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUCi0gICAgICAgIHNwPE1lZGlhU291cmNlPiBzb2Z0d2FyZUNvZGVjID0KKyAgICAgICAgc3A8TWVkaWFTb3VyY2U+IHNvZnR3YXJlQ29kZWMgPSBjcmVhdGVFbmNvZGVyPworICAgICAgICAgICAgSW5zdGFudGlhdGVTb2Z0d2FyZUVuY29kZXIoY29tcG9uZW50TmFtZSwgc291cmNlLCBtZXRhKToKICAgICAgICAgICAgIEluc3RhbnRpYXRlU29mdHdhcmVDb2RlYyhjb21wb25lbnROYW1lLCBzb3VyY2UpOwogCiAgICAgICAgIGlmIChzb2Z0d2FyZUNvZGVjICE9IE5VTEwpIHsKQEAgLTM5Myw3ICs0NzAsNiBAQAogCiAgICAgICAgICAgICByZXR1cm4gc29mdHdhcmVDb2RlYzsKICAgICAgICAgfQotI2VuZGlmCiAKICAgICAgICAgTE9HVigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBPTVggbm9kZSAnJXMnIiwgY29tcG9uZW50TmFtZSk7CiAKQEAgLTQ5NiwxMSArNTcyLDEyIEBACiAgICAgICAgICAgICBzaXplIC09IGxlbmd0aDsKICAgICAgICAgfQogCi0gICAgICAgIExPR1YoIkFWQyBwcm9maWxlID0gJWQgKCVzKSwgbGV2ZWwgPSAlZCIsCi0gICAgICAgICAgICAgKGludClwcm9maWxlLCBBVkNQcm9maWxlVG9TdHJpbmcocHJvZmlsZSksIChpbnQpbGV2ZWwgLyAxMCk7CisgICAgICAgIENPREVDX0xPR1YoCisgICAgICAgICAgICAgICAgIkFWQyBwcm9maWxlID0gJWQgKCVzKSwgbGV2ZWwgPSAlZCIsCisgICAgICAgICAgICAgICAgKGludClwcm9maWxlLCBBVkNQcm9maWxlVG9TdHJpbmcocHJvZmlsZSksIGxldmVsKTsKIAogICAgICAgICBpZiAoIXN0cmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5USS5WaWRlby5EZWNvZGVyIikKLSAgICAgICAgICAgICYmIChwcm9maWxlICE9IGtBVkNQcm9maWxlQmFzZWxpbmUgfHwgbGV2ZWwgPiAzOSkpIHsKKyAgICAgICAgICAgICYmIChwcm9maWxlICE9IGtBVkNQcm9maWxlQmFzZWxpbmUgfHwgbGV2ZWwgPiAzMCkpIHsKICAgICAgICAgICAgIC8vIFRoaXMgc3RyZWFtIGV4Y2VlZHMgdGhlIGRlY29kZXIncyBjYXBhYmlsaXRpZXMuIFRoZSBkZWNvZGVyCiAgICAgICAgICAgICAvLyBkb2VzIG5vdCBoYW5kbGUgdGhpcyBncmFjZWZ1bGx5IGFuZCB3b3VsZCBjbG9iYmVyIHRoZSBoZWFwCiAgICAgICAgICAgICAvLyBhbmQgd3JlYWsgaGF2b2MgaW5zdGVhZC4uLgpAQCAtNTEwLDI4ICs1ODcsMzMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDMyX3QgYml0UmF0ZSA9IDA7CisgICAgaWYgKG1Jc0VuY29kZXIpIHsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSkpOworICAgIH0KICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBtTUlNRSkpIHsKLSAgICAgICAgc2V0QU1SRm9ybWF0KGZhbHNlIC8qIGlzV0FNUiAqLyk7CisgICAgICAgIHNldEFNUkZvcm1hdChmYWxzZSAvKiBpc1dBTVIgKi8sIGJpdFJhdGUpOwogICAgIH0KICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCBtTUlNRSkpIHsKLSAgICAgICAgc2V0QU1SRm9ybWF0KHRydWUgLyogaXNXQU1SICovKTsKKyAgICAgICAgc2V0QU1SRm9ybWF0KHRydWUgLyogaXNXQU1SICovLCBiaXRSYXRlKTsKICAgICB9CiAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbU1JTUUpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwogCi0gICAgICAgIHNldEFBQ0Zvcm1hdChudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgIHNldEFBQ0Zvcm1hdChudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgYml0UmF0ZSk7CiAgICAgfQorCiAgICAgaWYgKCFzdHJuY2FzZWNtcChtTUlNRSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgYm9vbCBzdWNjZXNzID0gbWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKLSAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOwotICAgICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgICAgICBpZiAobUlzRW5jb2RlcikgewotICAgICAgICAgICAgc2V0VmlkZW9JbnB1dEZvcm1hdChtTUlNRSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzZXRWaWRlb0lucHV0Rm9ybWF0KG1NSU1FLCBtZXRhKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCk7CisgICAgICAgICAgICBDSEVDSyhzdWNjZXNzKTsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldFZpZGVvT3V0cHV0Rm9ybWF0KAogICAgICAgICAgICAgICAgICAgICBtTUlNRSwgd2lkdGgsIGhlaWdodCk7CiAKQEAgLTU3MCw3ICs2NTIsOCBAQAogICAgIH0KIAogICAgIGlmICghc3RyY21wKG1Db21wb25lbnROYW1lLCAiT01YLlRJLkFNUi5lbmNvZGUiKQotICAgICAgICB8fCAhc3RyY21wKG1Db21wb25lbnROYW1lLCAiT01YLlRJLldCQU1SLmVuY29kZSIpKSB7CisgICAgICAgIHx8ICFzdHJjbXAobUNvbXBvbmVudE5hbWUsICJPTVguVEkuV0JBTVIuZW5jb2RlIikKKyAgICAgICAgfHwgIXN0cmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5USS5BQUMuZW5jb2RlIikpIHsKICAgICAgICAgc2V0TWluQnVmZmVyU2l6ZShrUG9ydEluZGV4T3V0cHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIApAQCAtNjgzLDYgKzc2Niw3IEBACiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKICAgICAgICAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAqIDI7CiAKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgogICAgICAgICAgICAgcmV0dXJuICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKIApAQCAtNjkyLDkgKzc3Niw3NyBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgT01YQ29kZWM6OmZpbmRUYXJnZXRDb2xvckZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBPTVhfQ09MT1JfRk9STUFUVFlQRSAqY29sb3JGb3JtYXQpIHsKKyAgICBMT0dWKCJmaW5kVGFyZ2V0Q29sb3JGb3JtYXQiKTsKKyAgICBDSEVDSyhtSXNFbmNvZGVyKTsKKworICAgICpjb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgIGludDMyX3QgdGFyZ2V0Q29sb3JGb3JtYXQ7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZ0YXJnZXRDb2xvckZvcm1hdCkpIHsKKyAgICAgICAgKmNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKSB0YXJnZXRDb2xvckZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5USS5WaWRlby5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7CisgICAgICAgICAgICAqY29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgdGFyZ2V0IGNvbG9yIGZvcm1hdCBpcyBzdXBwb3J0ZWQuCisgICAgcmV0dXJuIGlzQ29sb3JGb3JtYXRTdXBwb3J0ZWQoKmNvbG9yRm9ybWF0LCBrUG9ydEluZGV4SW5wdXQpOworfQorCitzdGF0dXNfdCBPTVhDb2RlYzo6aXNDb2xvckZvcm1hdFN1cHBvcnRlZCgKKyAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQsIGludCBwb3J0SW5kZXgpIHsKKyAgICBMT0dWKCJpc0NvbG9yRm9ybWF0U3VwcG9ydGVkOiAlZCIsIHN0YXRpY19jYXN0PGludD4oY29sb3JGb3JtYXQpKTsKKworICAgIC8vIEVudW1lcmF0ZSBhbGwgdGhlIGNvbG9yIGZvcm1hdHMgc3VwcG9ydGVkIGJ5CisgICAgLy8gdGhlIG9teCBjb21wb25lbnQgdG8gc2VlIHdoZXRoZXIgdGhlIGdpdmVuCisgICAgLy8gY29sb3IgZm9ybWF0IGlzIHN1cHBvcnRlZC4KKyAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgcG9ydEZvcm1hdDsKKyAgICBJbml0T01YUGFyYW1zKCZwb3J0Rm9ybWF0KTsKKyAgICBwb3J0Rm9ybWF0Lm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgT01YX1UzMiBpbmRleCA9IDA7CisgICAgcG9ydEZvcm1hdC5uSW5kZXggPSBpbmRleDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoT01YX0Vycm9yTm9uZSAhPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LAorICAgICAgICAgICAgICAgICZwb3J0Rm9ybWF0LCBzaXplb2YocG9ydEZvcm1hdCkpKSB7CisKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG9teCBjb21wb25lbnQgZG9lcyBub3Qgb3ZlcndyaXRlCisgICAgICAgIC8vIHRoZSBpbmNyZW1lbnRlZCBpbmRleCAoYnVnIDI4OTc0MTMpLgorICAgICAgICBDSEVDS19FUShpbmRleCwgcG9ydEZvcm1hdC5uSW5kZXgpOworICAgICAgICBpZiAoKHBvcnRGb3JtYXQuZUNvbG9yRm9ybWF0ID09IGNvbG9yRm9ybWF0KSkgeworICAgICAgICAgICAgTE9HVigiRm91bmQgc3VwcG9ydGVkIGNvbG9yIGZvcm1hdDogJWQiLCBwb3J0Rm9ybWF0LmVDb2xvckZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7ICAvLyBjb2xvckZvcm1hdCBpcyBzdXBwb3J0ZWQhCisgICAgICAgIH0KKyAgICAgICAgKytpbmRleDsKKyAgICAgICAgcG9ydEZvcm1hdC5uSW5kZXggPSBpbmRleDsKKworICAgICAgICAvLyBPTVggU3BlYyBkZWZpbmVzIGxlc3MgdGhhbiA1MCBjb2xvciBmb3JtYXRzCisgICAgICAgIC8vIDEwMDAgaXMgbW9yZSB0aGFuIGVub3VnaCBmb3IgdXMgdG8gdGVsbCB3aGV0aGVyIHRoZSBvbXgKKyAgICAgICAgLy8gY29tcG9uZW50IGluIHF1ZXN0aW9uIGlzIGJ1Z2d5IG9yIG5vdC4KKyAgICAgICAgaWYgKGluZGV4ID49IDEwMDApIHsKKyAgICAgICAgICAgIExPR0UoIk1vcmUgdGhhbiAlbGQgY29sb3IgZm9ybWF0cyBhcmUgc3VwcG9ydGVkPz8/IiwgaW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKIHZvaWQgT01YQ29kZWM6OnNldFZpZGVvSW5wdXRGb3JtYXQoCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KSB7Ci0gICAgQ09ERUNfTE9HVigic2V0VmlkZW9JbnB1dEZvcm1hdCB3aWR0aD0lbGQsIGhlaWdodD0lbGQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZSwgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIGZyYW1lUmF0ZSwgYml0UmF0ZSwgc3RyaWRlLCBzbGljZUhlaWdodDsKKyAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZVJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5U3RyaWRlLCAmc3RyaWRlKTsKKyAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpOworICAgIENIRUNLKHN1Y2Nlc3MpOworICAgIENIRUNLKHN0cmlkZSAhPSAwKTsKIAogICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKICAgICBpZiAoIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lKSkgewpAQCAtNzA4LDQzICs4NjAsMTggQEAKICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIE5vdCBhIHN1cHBvcnRlZCB2aWRlbyBtaW1lIHR5cGUuIik7CiAgICAgfQogCi0gICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKLSAgICBpZiAoIXN0cmNhc2VjbXAoIk9NWC5USS5WaWRlby5lbmNvZGVyIiwgbUNvbXBvbmVudE5hbWUpKSB7Ci0gICAgICAgIGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlDYllDcjsKLSAgICB9CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQ7CisgICAgQ0hFQ0tfRVEoT0ssIGZpbmRUYXJnZXRDb2xvckZvcm1hdChtZXRhLCAmY29sb3JGb3JtYXQpKTsKIAorICAgIHN0YXR1c190IGVycjsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKKyAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFICp2aWRlb19kZWYgPSAmZGVmLmZvcm1hdC52aWRlbzsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnB1dCBwb3J0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICBDSEVDS19FUShzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKAogICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBPTVhfVklERU9fQ29kaW5nVW51c2VkLAogICAgICAgICAgICAgY29sb3JGb3JtYXQpLCBPSyk7CiAKLSAgICBDSEVDS19FUShzZXRWaWRlb1BvcnRGb3JtYXRUeXBlKAotICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgY29tcHJlc3Npb25Gb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQpLAotICAgICAgICAgICAgT0spOwotCi0gICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7Ci0gICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKLSAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7Ci0KLSAgICBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFICp2aWRlb19kZWYgPSAmZGVmLmZvcm1hdC52aWRlbzsKLQotICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7Ci0KLSAgICBDSEVDS19FUShlcnIsIE9LKTsKLSAgICBDSEVDS19FUShkZWYuZURvbWFpbiwgT01YX1BvcnREb21haW5WaWRlbyk7Ci0KLSAgICB2aWRlb19kZWYtPm5GcmFtZVdpZHRoID0gd2lkdGg7Ci0gICAgdmlkZW9fZGVmLT5uRnJhbWVIZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgICB2aWRlb19kZWYtPmVDb21wcmVzc2lvbkZvcm1hdCA9IGNvbXByZXNzaW9uRm9ybWF0OwotICAgIHZpZGVvX2RlZi0+ZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKLQotICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwogICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OwogCkBAIC03NTIsMzUgKzg3OSw2NiBAQAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKIAotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGdldEZyYW1lU2l6ZShjb2xvckZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgQ09ERUNfTE9HVigiU2V0dGluZyBuQnVmZmVyU2l6ZSA9ICVsZCIsIGRlZi5uQnVmZmVyU2l6ZSk7CisgICAgZGVmLm5CdWZmZXJTaXplID0gZ2V0RnJhbWVTaXplKGNvbG9yRm9ybWF0LAorICAgICAgICAgICAgc3RyaWRlID4gMD8gc3RyaWRlOiAtc3RyaWRlLCBzbGljZUhlaWdodCk7CiAKICAgICBDSEVDS19FUShkZWYuZURvbWFpbiwgT01YX1BvcnREb21haW5WaWRlbyk7CiAKICAgICB2aWRlb19kZWYtPm5GcmFtZVdpZHRoID0gd2lkdGg7CiAgICAgdmlkZW9fZGVmLT5uRnJhbWVIZWlnaHQgPSBoZWlnaHQ7CisgICAgdmlkZW9fZGVmLT5uU3RyaWRlID0gc3RyaWRlOworICAgIHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID0gc2xpY2VIZWlnaHQ7CisgICAgdmlkZW9fZGVmLT54RnJhbWVyYXRlID0gKGZyYW1lUmF0ZSA8PCAxNik7ICAvLyBRMTYgZm9ybWF0CiAgICAgdmlkZW9fZGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwogICAgIHZpZGVvX2RlZi0+ZUNvbG9yRm9ybWF0ID0gY29sb3JGb3JtYXQ7CiAKLSAgICB2aWRlb19kZWYtPnhGcmFtZXJhdGUgPSAyNCA8PCAxNjsgIC8vIFhYWCBjcnVjaWFsIQotCiAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKICAgICBDSEVDS19FUShlcnIsIE9LKTsKIAorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBPdXRwdXQgcG9ydCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgQ0hFQ0tfRVEoc2V0VmlkZW9Qb3J0Rm9ybWF0VHlwZSgKKyAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIGNvbXByZXNzaW9uRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0VW51c2VkKSwKKyAgICAgICAgICAgIE9LKTsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKworICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICBDSEVDS19FUShlcnIsIE9LKTsKKyAgICBDSEVDS19FUShkZWYuZURvbWFpbiwgT01YX1BvcnREb21haW5WaWRlbyk7CisKKyAgICB2aWRlb19kZWYtPm5GcmFtZVdpZHRoID0gd2lkdGg7CisgICAgdmlkZW9fZGVmLT5uRnJhbWVIZWlnaHQgPSBoZWlnaHQ7CisgICAgdmlkZW9fZGVmLT54RnJhbWVyYXRlID0gMDsgICAgICAvLyBObyBuZWVkIGZvciBvdXRwdXQgcG9ydAorICAgIHZpZGVvX2RlZi0+bkJpdHJhdGUgPSBiaXRSYXRlOyAgLy8gUTE2IGZvcm1hdAorICAgIHZpZGVvX2RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gY29tcHJlc3Npb25Gb3JtYXQ7CisgICAgdmlkZW9fZGVmLT5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIGlmIChtUXVpcmtzICYga1JlcXVpcmVzTGFyZ2VyRW5jb2Rlck91dHB1dEJ1ZmZlcikgeworICAgICAgICAvLyBJbmNyZWFzZXMgdGhlIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICBkZWYubkJ1ZmZlclNpemUgPSAoKGRlZi5uQnVmZmVyU2l6ZSAqIDMpID4+IDEpOworICAgIH0KKworICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSk7CisgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vIENvZGVjLXNwZWNpZmljIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIHN3aXRjaCAoY29tcHJlc3Npb25Gb3JtYXQpIHsKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nTVBFRzQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKHNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycygpLCBPSyk7CisgICAgICAgICAgICBDSEVDS19FUShzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMobWV0YSksIE9LKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nSDI2MzoKKyAgICAgICAgICAgIENIRUNLX0VRKHNldHVwSDI2M0VuY29kZXJQYXJhbWV0ZXJzKG1ldGEpLCBPSyk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdBVkM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKHNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoKSwgT0spOworICAgICAgICAgICAgQ0hFQ0tfRVEoc2V0dXBBVkNFbmNvZGVyUGFyYW1ldGVycyhtZXRhKSwgT0spOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNzkwLDcgKzk0OCwxNTkgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpzZXR1cE1QRUc0RW5jb2RlclBhcmFtZXRlcnMoKSB7CitzdGF0aWMgT01YX1UzMiBzZXRQRnJhbWVzU3BhY2luZyhpbnQzMl90IGlGcmFtZXNJbnRlcnZhbCwgaW50MzJfdCBmcmFtZVJhdGUpIHsKKyAgICBpZiAoaUZyYW1lc0ludGVydmFsIDwgMCkgeworICAgICAgICByZXR1cm4gMHhGRkZGRkZGRjsKKyAgICB9IGVsc2UgaWYgKGlGcmFtZXNJbnRlcnZhbCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBPTVhfVTMyIHJldCA9IGZyYW1lUmF0ZSAqIGlGcmFtZXNJbnRlcnZhbDsKKyAgICBDSEVDSyhyZXQgPiAxKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBPTVhDb2RlYzo6c2V0dXBFcnJvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKCkgeworICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVycm9yQ29ycmVjdGlvblR5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmZXJyb3JDb3JyZWN0aW9uVHlwZSk7CisgICAgZXJyb3JDb3JyZWN0aW9uVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKworICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uLAorICAgICAgICAgICAgJmVycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihlcnJvckNvcnJlY3Rpb25UeXBlKSk7CisgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CisKKyAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVIRUMgPSBPTVhfRkFMU0U7CisgICAgZXJyb3JDb3JyZWN0aW9uVHlwZS5iRW5hYmxlUmVzeW5jID0gT01YX1RSVUU7CisgICAgZXJyb3JDb3JyZWN0aW9uVHlwZS5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSAyNTY7CisgICAgZXJyb3JDb3JyZWN0aW9uVHlwZS5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IE9NWF9GQUxTRTsKKyAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVSVkxDID0gT01YX0ZBTFNFOworCisgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sCisgICAgICAgICAgICAmZXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKGVycm9yQ29ycmVjdGlvblR5cGUpKTsKKyAgICBDSEVDS19FUShlcnIsIE9LKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9NWENvZGVjOjpzZXR1cEJpdFJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIGJpdHJhdGVUeXBlOworICAgIEluaXRPTVhQYXJhbXMoJmJpdHJhdGVUeXBlKTsKKyAgICBiaXRyYXRlVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKworICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwKKyAgICAgICAgICAgICZiaXRyYXRlVHlwZSwgc2l6ZW9mKGJpdHJhdGVUeXBlKSk7CisgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CisKKyAgICBiaXRyYXRlVHlwZS5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKKyAgICBiaXRyYXRlVHlwZS5uVGFyZ2V0Qml0cmF0ZSA9IGJpdFJhdGU7CisKKyAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsCisgICAgICAgICAgICAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOworICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT01YQ29kZWM6OmdldFZpZGVvUHJvZmlsZUxldmVsKAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsCisgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsJiBkZWZhdWx0UHJvZmlsZUxldmVsLAorICAgICAgICBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsKSB7CisgICAgQ09ERUNfTE9HVigiRGVmYXVsdCBwcm9maWxlOiAlbGQsIGxldmVsICVsZCIsCisgICAgICAgICAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1Qcm9maWxlLCBkZWZhdWx0UHJvZmlsZUxldmVsLm1MZXZlbCk7CisKKyAgICAvLyBBcmUgdGhlIGRlZmF1bHQgcHJvZmlsZSBhbmQgbGV2ZWwgb3ZlcndyaXRlbj8KKyAgICBpbnQzMl90IHByb2ZpbGUsIGxldmVsOworICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKSkgeworICAgICAgICBwcm9maWxlID0gZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZTsKKyAgICB9CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCkpIHsKKyAgICAgICAgbGV2ZWwgPSBkZWZhdWx0UHJvZmlsZUxldmVsLm1MZXZlbDsKKyAgICB9CisgICAgQ09ERUNfTE9HVigiVGFyZ2V0IHByb2ZpbGU6ICVkLCBsZXZlbDogJWQiLCBwcm9maWxlLCBsZXZlbCk7CisKKyAgICAvLyBBcmUgdGhlIHRhcmdldCBwcm9maWxlIGFuZCBsZXZlbCBzdXBwb3J0ZWQgYnkgdGhlIGVuY29kZXI/CisgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgcGFyYW07CisgICAgSW5pdE9NWFBhcmFtcygmcGFyYW0pOworICAgIHBhcmFtLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworICAgIGZvciAocGFyYW0ublByb2ZpbGVJbmRleCA9IDA7OyArK3BhcmFtLm5Qcm9maWxlSW5kZXgpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgJnBhcmFtLCBzaXplb2YocGFyYW0pKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkUHJvZmlsZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBhcmFtLmVQcm9maWxlKTsKKyAgICAgICAgaW50MzJfdCBzdXBwb3J0ZWRMZXZlbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHBhcmFtLmVMZXZlbCk7CisgICAgICAgIENPREVDX0xPR1YoIlN1cHBvcnRlZCBwcm9maWxlOiAlZCwgbGV2ZWwgJWQiLAorICAgICAgICAgICAgc3VwcG9ydGVkUHJvZmlsZSwgc3VwcG9ydGVkTGV2ZWwpOworCisgICAgICAgIGlmIChwcm9maWxlID09IHN1cHBvcnRlZFByb2ZpbGUgJiYKKyAgICAgICAgICAgIGxldmVsID09IHN1cHBvcnRlZExldmVsKSB7CisgICAgICAgICAgICBwcm9maWxlTGV2ZWwubVByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1MZXZlbCA9IGxldmVsOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfQorCisgICAgQ09ERUNfTE9HRSgiVGFyZ2V0IHByb2ZpbGUgKCVkKSBhbmQgbGV2ZWwgKCVkKSBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgIHByb2ZpbGUsIGxldmVsKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBPTVhDb2RlYzo6c2V0dXBIMjYzRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgaW50MzJfdCBpRnJhbWVzSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgYml0UmF0ZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZVJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaUZyYW1lc0ludGVydmFsKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKyAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgaDI2M3R5cGU7CisgICAgSW5pdE9NWFBhcmFtcygmaDI2M3R5cGUpOworICAgIGgyNjN0eXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAmaDI2M3R5cGUsIHNpemVvZihoMjYzdHlwZSkpOworICAgIENIRUNLX0VRKGVyciwgT0spOworCisgICAgaDI2M3R5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPQorICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKKworICAgIGgyNjN0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lc0ludGVydmFsLCBmcmFtZVJhdGUpOworICAgIGlmIChoMjYzdHlwZS5uUEZyYW1lcyA9PSAwKSB7CisgICAgICAgIGgyNjN0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0gT01YX1ZJREVPX1BpY3R1cmVUeXBlSTsKKyAgICB9CisgICAgaDI2M3R5cGUubkJGcmFtZXMgPSAwOworCisgICAgLy8gQ2hlY2sgcHJvZmlsZSBhbmQgbGV2ZWwgcGFyYW1ldGVycworICAgIENvZGVjUHJvZmlsZUxldmVsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbDsKKyAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1Qcm9maWxlID0gT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmU7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBPTVhfVklERU9fSDI2M0xldmVsNDU7CisgICAgZXJyID0gZ2V0VmlkZW9Qcm9maWxlTGV2ZWwobWV0YSwgZGVmYXVsdFByb2ZpbGVMZXZlbCwgcHJvZmlsZUxldmVsKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgIGgyNjN0eXBlLmVQcm9maWxlID0gc3RhdGljX2Nhc3Q8T01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRT4ocHJvZmlsZUxldmVsLm1Qcm9maWxlKTsKKyAgICBoMjYzdHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fSDI2M0xFVkVMVFlQRT4ocHJvZmlsZUxldmVsLm1MZXZlbCk7CisKKyAgICBoMjYzdHlwZS5iUExVU1BUWVBFQWxsb3dlZCA9IE9NWF9GQUxTRTsKKyAgICBoMjYzdHlwZS5iRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gPSBPTVhfRkFMU0U7CisgICAgaDI2M3R5cGUublBpY3R1cmVIZWFkZXJSZXBldGl0aW9uID0gMDsKKyAgICBoMjYzdHlwZS5uR09CSGVhZGVySW50ZXJ2YWwgPSAwOworCisgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAmaDI2M3R5cGUsIHNpemVvZihoMjYzdHlwZSkpOworICAgIENIRUNLX0VRKGVyciwgT0spOworCisgICAgQ0hFQ0tfRVEoc2V0dXBCaXRSYXRlKGJpdFJhdGUpLCBPSyk7CisgICAgQ0hFQ0tfRVEoc2V0dXBFcnJvckNvcnJlY3Rpb25QYXJhbWV0ZXJzKCksIE9LKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT01YQ29kZWM6OnNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBpbnQzMl90IGlGcmFtZXNJbnRlcnZhbCwgZnJhbWVSYXRlLCBiaXRSYXRlOworICAgIGJvb2wgc3VjY2VzcyA9IG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsICZpRnJhbWVzSW50ZXJ2YWwpOworICAgIENIRUNLKHN1Y2Nlc3MpOwogICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgbXBlZzR0eXBlOwogICAgIEluaXRPTVhQYXJhbXMoJm1wZWc0dHlwZSk7CiAgICAgbXBlZzR0eXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwpAQCAtODA2LDkgKzExMTYsMTEgQEAKICAgICBtcGVnNHR5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPQogICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKIAotICAgIG1wZWc0dHlwZS5uUEZyYW1lcyA9IDIzOworICAgIG1wZWc0dHlwZS5uUEZyYW1lcyA9IHNldFBGcmFtZXNTcGFjaW5nKGlGcmFtZXNJbnRlcnZhbCwgZnJhbWVSYXRlKTsKKyAgICBpZiAobXBlZzR0eXBlLm5QRnJhbWVzID09IDApIHsKKyAgICAgICAgbXBlZzR0eXBlLm5BbGxvd2VkUGljdHVyZVR5cGVzID0gT01YX1ZJREVPX1BpY3R1cmVUeXBlSTsKKyAgICB9CiAgICAgbXBlZzR0eXBlLm5CRnJhbWVzID0gMDsKLQogICAgIG1wZWc0dHlwZS5uSURDVkxDVGhyZXNob2xkID0gMDsKICAgICBtcGVnNHR5cGUuYkFDUHJlZCA9IE9NWF9UUlVFOwogICAgIG1wZWc0dHlwZS5uTWF4UGFja2V0U2l6ZSA9IDI1NjsKQEAgLTgxNiw1OCArMTEyOCwzMiBAQAogICAgIG1wZWc0dHlwZS5uSGVhZGVyRXh0ZW5zaW9uID0gMDsKICAgICBtcGVnNHR5cGUuYlJldmVyc2libGVWTEMgPSBPTVhfRkFMU0U7CiAKLSAgICBtcGVnNHR5cGUuZVByb2ZpbGUgPSBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZTsKLSAgICBtcGVnNHR5cGUuZUxldmVsID0gT01YX1ZJREVPX01QRUc0TGV2ZWwyOworICAgIC8vIENoZWNrIHByb2ZpbGUgYW5kIGxldmVsIHBhcmFtZXRlcnMKKyAgICBDb2RlY1Byb2ZpbGVMZXZlbCBkZWZhdWx0UHJvZmlsZUxldmVsLCBwcm9maWxlTGV2ZWw7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGU7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tTGV2ZWwgPSBPTVhfVklERU9fTVBFRzRMZXZlbDI7CisgICAgZXJyID0gZ2V0VmlkZW9Qcm9maWxlTGV2ZWwobWV0YSwgZGVmYXVsdFByb2ZpbGVMZXZlbCwgcHJvZmlsZUxldmVsKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworICAgIG1wZWc0dHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFPihwcm9maWxlTGV2ZWwubVByb2ZpbGUpOworICAgIG1wZWc0dHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU+KHByb2ZpbGVMZXZlbC5tTGV2ZWwpOwogCiAgICAgZXJyID0gbU9NWC0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNCwgJm1wZWc0dHlwZSwgc2l6ZW9mKG1wZWc0dHlwZSkpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIGJpdHJhdGVUeXBlOwotICAgIEluaXRPTVhQYXJhbXMoJmJpdHJhdGVUeXBlKTsKLSAgICBiaXRyYXRlVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwKLSAgICAgICAgICAgICZiaXRyYXRlVHlwZSwgc2l6ZW9mKGJpdHJhdGVUeXBlKSk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7Ci0KLSAgICBiaXRyYXRlVHlwZS5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKLSAgICBiaXRyYXRlVHlwZS5uVGFyZ2V0Qml0cmF0ZSA9IDEwMDAwMDA7Ci0KLSAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsCi0gICAgICAgICAgICAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOwotICAgIENIRUNLX0VRKGVyciwgT0spOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgZXJyb3JDb3JyZWN0aW9uVHlwZTsKLSAgICBJbml0T01YUGFyYW1zKCZlcnJvckNvcnJlY3Rpb25UeXBlKTsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotCi0gICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sCi0gICAgICAgICAgICAmZXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKGVycm9yQ29ycmVjdGlvblR5cGUpKTsKLSAgICBDSEVDS19FUShlcnIsIE9LKTsKLQotICAgIGVycm9yQ29ycmVjdGlvblR5cGUuYkVuYWJsZUhFQyA9IE9NWF9GQUxTRTsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVSZXN5bmMgPSBPTVhfVFJVRTsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IDI1NjsKLSAgICBlcnJvckNvcnJlY3Rpb25UeXBlLmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gT01YX0ZBTFNFOwotICAgIGVycm9yQ29ycmVjdGlvblR5cGUuYkVuYWJsZVJWTEMgPSBPTVhfRkFMU0U7Ci0KLSAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbiwKLSAgICAgICAgICAgICZlcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoZXJyb3JDb3JyZWN0aW9uVHlwZSkpOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKHNldHVwQml0UmF0ZShiaXRSYXRlKSwgT0spOworICAgIENIRUNLX0VRKHNldHVwRXJyb3JDb3JyZWN0aW9uUGFyYW1ldGVycygpLCBPSyk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpzZXR1cEFWQ0VuY29kZXJQYXJhbWV0ZXJzKCkgeworc3RhdHVzX3QgT01YQ29kZWM6OnNldHVwQVZDRW5jb2RlclBhcmFtZXRlcnMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgaW50MzJfdCBpRnJhbWVzSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgYml0UmF0ZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRSYXRlKTsKKyAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiBtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZmcmFtZVJhdGUpOworICAgIHN1Y2Nlc3MgPSBzdWNjZXNzICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaUZyYW1lc0ludGVydmFsKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKwogICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIGgyNjR0eXBlOwogICAgIEluaXRPTVhQYXJhbXMoJmgyNjR0eXBlKTsKICAgICBoMjY0dHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKQEAgLTg4MCw0NyArMTE2Niw1MSBAQAogICAgICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJIHwgT01YX1ZJREVPX1BpY3R1cmVUeXBlUDsKIAogICAgIGgyNjR0eXBlLm5TbGljZUhlYWRlclNwYWNpbmcgPSAwOwotICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gMDsKLSAgICBoMjY0dHlwZS5iVXNlSGFkYW1hcmQgPSBPTVhfVFJVRTsKLSAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKLSAgICBoMjY0dHlwZS5uUmVmSWR4MTBBY3RpdmVNaW51czEgPSAwOwotICAgIGgyNjR0eXBlLm5SZWZJZHgxMUFjdGl2ZU1pbnVzMSA9IDA7CisgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOyAgIC8vIE5vIEIgZnJhbWVzIHN1cHBvcnQgeWV0CisgICAgaDI2NHR5cGUublBGcmFtZXMgPSBzZXRQRnJhbWVzU3BhY2luZyhpRnJhbWVzSW50ZXJ2YWwsIGZyYW1lUmF0ZSk7CisgICAgaWYgKGgyNjR0eXBlLm5QRnJhbWVzID09IDApIHsKKyAgICAgICAgaDI2NHR5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPSBPTVhfVklERU9fUGljdHVyZVR5cGVJOworICAgIH0KKworICAgIC8vIENoZWNrIHByb2ZpbGUgYW5kIGxldmVsIHBhcmFtZXRlcnMKKyAgICBDb2RlY1Byb2ZpbGVMZXZlbCBkZWZhdWx0UHJvZmlsZUxldmVsLCBwcm9maWxlTGV2ZWw7CisgICAgZGVmYXVsdFByb2ZpbGVMZXZlbC5tUHJvZmlsZSA9IGgyNjR0eXBlLmVQcm9maWxlOworICAgIGRlZmF1bHRQcm9maWxlTGV2ZWwubUxldmVsID0gaDI2NHR5cGUuZUxldmVsOworICAgIGVyciA9IGdldFZpZGVvUHJvZmlsZUxldmVsKG1ldGEsIGRlZmF1bHRQcm9maWxlTGV2ZWwsIHByb2ZpbGVMZXZlbCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICBoMjY0dHlwZS5lUHJvZmlsZSA9IHN0YXRpY19jYXN0PE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRT4ocHJvZmlsZUxldmVsLm1Qcm9maWxlKTsKKyAgICBoMjY0dHlwZS5lTGV2ZWwgPSBzdGF0aWNfY2FzdDxPTVhfVklERU9fQVZDTEVWRUxUWVBFPihwcm9maWxlTGV2ZWwubUxldmVsKTsKKworICAgIGlmIChoMjY0dHlwZS5lUHJvZmlsZSA9PSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lKSB7CisgICAgICAgIGgyNjR0eXBlLmJVc2VIYWRhbWFyZCA9IE9NWF9UUlVFOworICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKKyAgICAgICAgaDI2NHR5cGUublJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKKyAgICAgICAgaDI2NHR5cGUublJlZklkeDExQWN0aXZlTWludXMxID0gMDsKKyAgICAgICAgaDI2NHR5cGUuYkVudHJvcHlDb2RpbmdDQUJBQyA9IE9NWF9GQUxTRTsKKyAgICAgICAgaDI2NHR5cGUuYldlaWdodGVkUFByZWRpY3Rpb24gPSBPTVhfRkFMU0U7CisgICAgICAgIGgyNjR0eXBlLmJjb25zdElwcmVkID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5iRGlyZWN0OHg4SW5mZXJlbmNlID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5iRGlyZWN0U3BhdGlhbFRlbXBvcmFsID0gT01YX0ZBTFNFOworICAgICAgICBoMjY0dHlwZS5uQ2FiYWNJbml0SWRjID0gMDsKKyAgICB9CisKKyAgICBpZiAoaDI2NHR5cGUubkJGcmFtZXMgIT0gMCkgeworICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyB8PSBPTVhfVklERU9fUGljdHVyZVR5cGVCOworICAgIH0KKwogICAgIGgyNjR0eXBlLmJFbmFibGVVRVAgPSBPTVhfRkFMU0U7CiAgICAgaDI2NHR5cGUuYkVuYWJsZUZNTyA9IE9NWF9GQUxTRTsKICAgICBoMjY0dHlwZS5iRW5hYmxlQVNPID0gT01YX0ZBTFNFOwogICAgIGgyNjR0eXBlLmJFbmFibGVSUyA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7Ci0gICAgaDI2NHR5cGUuZUxldmVsID0gT01YX1ZJREVPX0FWQ0xldmVsMWI7CiAgICAgaDI2NHR5cGUuYkZyYW1lTUJzT25seSA9IE9NWF9UUlVFOwogICAgIGgyNjR0eXBlLmJNQkFGRiA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5iRW50cm9weUNvZGluZ0NBQkFDID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJXZWlnaHRlZFBQcmVkaWN0aW9uID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJjb25zdElwcmVkID0gT01YX0ZBTFNFOwotICAgIGgyNjR0eXBlLmJEaXJlY3Q4eDhJbmZlcmVuY2UgPSBPTVhfRkFMU0U7Ci0gICAgaDI2NHR5cGUuYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCA9IE9NWF9GQUxTRTsKLSAgICBoMjY0dHlwZS5uQ2FiYWNJbml0SWRjID0gMDsKICAgICBoMjY0dHlwZS5lTG9vcEZpbHRlck1vZGUgPSBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZTsKIAogICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAmaDI2NHR5cGUsIHNpemVvZihoMjY0dHlwZSkpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCi0gICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIGJpdHJhdGVUeXBlOwotICAgIEluaXRPTVhQYXJhbXMoJmJpdHJhdGVUeXBlKTsKLSAgICBiaXRyYXRlVHlwZS5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKLQotICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZSwKLSAgICAgICAgICAgICZiaXRyYXRlVHlwZSwgc2l6ZW9mKGJpdHJhdGVUeXBlKSk7Ci0gICAgQ0hFQ0tfRVEoZXJyLCBPSyk7Ci0KLSAgICBiaXRyYXRlVHlwZS5lQ29udHJvbFJhdGUgPSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTsKLSAgICBiaXRyYXRlVHlwZS5uVGFyZ2V0Qml0cmF0ZSA9IDEwMDAwMDA7Ci0KLSAgICBlcnIgPSBtT01YLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsCi0gICAgICAgICAgICAmYml0cmF0ZVR5cGUsIHNpemVvZihiaXRyYXRlVHlwZSkpOwotICAgIENIRUNLX0VRKGVyciwgT0spOworICAgIENIRUNLX0VRKHNldHVwQml0UmF0ZShiaXRSYXRlKSwgT0spOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTA1Nyw3ICsxMzQ3LDExIEBACiAgICAgICBtTm9Nb3JlT3V0cHV0RGF0YShmYWxzZSksCiAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQoZmFsc2UpLAogICAgICAgbVNlZWtUaW1lVXMoLTEpLAotICAgICAgbUxlZnRPdmVyQnVmZmVyKE5VTEwpIHsKKyAgICAgIG1TZWVrTW9kZShSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpLAorICAgICAgbVRhcmdldFRpbWVVcygtMSksCisgICAgICBtU2tpcFRpbWVVcygtMSksCisgICAgICBtTGVmdE92ZXJCdWZmZXIoTlVMTCksCisgICAgICBtUGF1c2VkKGZhbHNlKSB7CiAgICAgbVBvcnRTdGF0dXNba1BvcnRJbmRleElucHV0XSA9IEVOQUJMRUQ7CiAgICAgbVBvcnRTdGF0dXNba1BvcnRJbmRleE91dHB1dF0gPSBFTkFCTEVEOwogCkBAIC0xMjEwLDYgKzE1MDQsMTAgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBDT0RFQ19MT0dJKCJhbGxvY2F0aW5nICVsdSBidWZmZXJzIG9mIHNpemUgJWx1IG9uICVzIHBvcnQiLAorICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgZGVmLm5CdWZmZXJTaXplLAorICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CisKICAgICBzaXplX3QgdG90YWxTaXplID0gZGVmLm5CdWZmZXJDb3VudEFjdHVhbCAqIGRlZi5uQnVmZmVyU2l6ZTsKICAgICBtRGVhbGVyW3BvcnRJbmRleF0gPSBuZXcgTWVtb3J5RGVhbGVyKHRvdGFsU2l6ZSwgIk9NWENvZGVjIik7CiAKQEAgLTE0MDAsNiArMTY5OCwxNCBAQAogCiAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IGluZm8tPm1NZWRpYUJ1ZmZlcjsKIAorICAgICAgICAgICAgICAgIGlmIChtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5yYW5nZV9vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlYyBsaWVkIGFib3V0IGl0cyBidWZmZXIgc2l6ZSByZXF1aXJlbWVudHMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZGluZyBhIGJ1ZmZlciBsYXJnZXIgdGhhbiB0aGUgb3JpZ2luYWxseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdmVydGlzZWQgc2l6ZSBpbiBGSUxMX0JVRkZFUl9ET05FISIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aCk7CkBAIC0xNDI0LDEzICsxNzMwLDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5QnVmZmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS5idWZmZXIpOwogCi0gICAgICAgICAgICAgICAgbUZpbGxlZEJ1ZmZlcnMucHVzaF9iYWNrKGkpOwotICAgICAgICAgICAgICAgIG1CdWZmZXJGaWxsZWQuc2lnbmFsKCk7Ci0KICAgICAgICAgICAgICAgICBpZiAobXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigiTm8gbW9yZSBvdXRwdXQgZGF0YS4iKTsKICAgICAgICAgICAgICAgICAgICAgbU5vTW9yZU91dHB1dERhdGEgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtVGFyZ2V0VGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEudGltZXN0YW1wIDw9IG1UYXJnZXRUaW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPCBtVGFyZ2V0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBpbmcgb3V0cHV0IGJ1ZmZlciBhdCB0aW1lc3RhbXAgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxPdXRwdXRCdWZmZXIoaW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIENPREVDX0xPR1YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmluZyBvdXRwdXQgYnVmZmVyIGF0IHRhcmdldCB0aW1lc3RhbXAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlbGxkIHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXApOworCisgICAgICAgICAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtRmlsbGVkQnVmZmVycy5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckZpbGxlZC5zaWduYWwoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNjQ3LDYgKzE5NzMsOSBAQAogICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJGaW5pc2hlZCBmbHVzaGluZyBib3RoIHBvcnRzLCBub3cgY29udGludWluZyBmcm9tIgogICAgICAgICAgICAgICAgICAgICAgICAgICIgc2Vlay10aW1lLiIpOwogCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGltcGxpY2l0bHkgcmVzdW1lIHB1bGxpbmcgb24gb3VyIHVwc3RyZWFtIHNvdXJjZS4KKyAgICAgICAgICAgICAgICAgICAgbVBhdXNlZCA9IGZhbHNlOworCiAgICAgICAgICAgICAgICAgICAgIGRyYWluSW5wdXRCdWZmZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgIGZpbGxPdXRwdXRCdWZmZXJzKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTk0Niw2ICsyMjc1LDEwIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpZiAobVBhdXNlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyOwogCiAgICAgYm9vbCBzaWduYWxFT1MgPSBmYWxzZTsKQEAgLTE5NTUsMjYgKzIyODgsNDAgQEAKICAgICBpbnQzMl90IG4gPSAwOwogICAgIGZvciAoOzspIHsKICAgICAgICAgTWVkaWFCdWZmZXIgKnNyY0J1ZmZlcjsKKyAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgICAgIGlmIChtU2tpcFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBvcHRpb25zLnNldFNraXBGcmFtZShtU2tpcFRpbWVVcyk7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1TZWVrVGltZVVzID49IDApIHsKICAgICAgICAgICAgIGlmIChtTGVmdE92ZXJCdWZmZXIpIHsKICAgICAgICAgICAgICAgICBtTGVmdE92ZXJCdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBtTGVmdE92ZXJCdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKKyAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzLCBtU2Vla01vZGUpOwogCiAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IC0xOworICAgICAgICAgICAgbVNlZWtNb2RlID0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOwogICAgICAgICAgICAgbUJ1ZmZlckZpbGxlZC5zaWduYWwoKTsKIAogICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmc3JjQnVmZmVyLCAmb3B0aW9ucyk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVVczsKKyAgICAgICAgICAgICAgICBpZiAoc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCAmdGFyZ2V0VGltZVVzKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGFyZ2V0VGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IHRhcmdldFRpbWVVczsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1MZWZ0T3ZlckJ1ZmZlcikgewogICAgICAgICAgICAgc3JjQnVmZmVyID0gbUxlZnRPdmVyQnVmZmVyOwogICAgICAgICAgICAgbUxlZnRPdmVyQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZzcmNCdWZmZXIpOworICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmc3JjQnVmZmVyLCAmb3B0aW9ucyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMDA0LDEzICsyMzUxLDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIG1lbWNweSgodWludDhfdCAqKWluZm8tPm1EYXRhICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNCdWZmZXItPmRhdGEoKSArIHNyY0J1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgaWYgKG1Jc0VuY29kZXIgJiYgKG1RdWlya3MgJiBrQXZvaWRNZW1jb3B5SW5wdXRSZWNvcmRpbmdGcmFtZXMpKSB7CisgICAgICAgICAgICBDSEVDSyhtT01YTGl2ZXNMb2NhbGx5ICYmIG9mZnNldCA9PSAwKTsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikgaW5mby0+bUJ1ZmZlcjsKKyAgICAgICAgICAgIGhlYWRlci0+cEJ1ZmZlciA9IChPTVhfVTggKikgc3JjQnVmZmVyLT5kYXRhKCkgKyBzcmNCdWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KCh1aW50OF90ICopaW5mby0+bURhdGEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjQnVmZmVyLT5kYXRhKCkgKyBzcmNCdWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgfQogCiAgICAgICAgIGludDY0X3QgbGFzdEJ1ZmZlclRpbWVVczsKICAgICAgICAgQ0hFQ0soc3JjQnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmbGFzdEJ1ZmZlclRpbWVVcykpOwotICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+PSAwKTsKKyAgICAgICAgQ0hFQ0sobGFzdEJ1ZmZlclRpbWVVcyA+PSAwKTsKIAogICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgICAgICAgIHRpbWVzdGFtcFVzID0gbGFzdEJ1ZmZlclRpbWVVczsKQEAgLTIxMjgsMTEgKzI0ODEsMjQgQEAKIAogdm9pZCBPTVhDb2RlYzo6c2V0UmF3QXVkaW9Gb3JtYXQoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMpIHsKKworICAgIC8vIHBvcnQgZGVmaW5pdGlvbgorICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICBDSEVDS19FUShlcnIsIE9LKTsKKyAgICBkZWYuZm9ybWF0LmF1ZGlvLmVFbmNvZGluZyA9IE9NWF9BVURJT19Db2RpbmdQQ007CisgICAgQ0hFQ0tfRVEobU9NWC0+c2V0UGFyYW1ldGVyKG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICAgICAgICAgJmRlZiwgc2l6ZW9mKGRlZikpLCBPSyk7CisKKyAgICAvLyBwY20gcGFyYW0KICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGNtUGFyYW1zOwogICAgIEluaXRPTVhQYXJhbXMoJnBjbVBhcmFtcyk7CiAgICAgcGNtUGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwY21QYXJhbXMsIHNpemVvZihwY21QYXJhbXMpKTsKIAogICAgIENIRUNLX0VRKGVyciwgT0spOwpAQCAtMjE1OSw3ICsyNTI1LDUxIEBACiAgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CiB9CiAKLXZvaWQgT01YQ29kZWM6OnNldEFNUkZvcm1hdChib29sIGlzV0FNUikgeworc3RhdGljIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgcGlja01vZGVGcm9tQml0UmF0ZShib29sIGlzQU1SV0IsIGludDMyX3QgYnBzKSB7CisgICAgaWYgKGlzQU1SV0IpIHsKKyAgICAgICAgaWYgKGJwcyA8PSA2NjAwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0IwOworICAgICAgICB9IGVsc2UgaWYgKGJwcyA8PSA4ODUwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0IxOworICAgICAgICB9IGVsc2UgaWYgKGJwcyA8PSAxMjY1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMjsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gMTQyNTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjM7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDE1ODUwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0I0OworICAgICAgICB9IGVsc2UgaWYgKGJwcyA8PSAxODI1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNTsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gMTk4NTApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjY7CisgICAgICAgIH0gZWxzZSBpZiAoYnBzIDw9IDIzMDUwKSB7CisgICAgICAgICAgICByZXR1cm4gT01YX0FVRElPX0FNUkJhbmRNb2RlV0I3OworICAgICAgICB9CisKKyAgICAgICAgLy8gMjM4NTAgYnBzCisgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjg7CisgICAgfSBlbHNlIHsgIC8vIEFNUk5CCisgICAgICAgIGlmIChicHMgPD0gNDc1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMDsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gNTE1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMTsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gNTkwMCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMjsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gNjcwMCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMzsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gNzQwMCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNDsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gNzk1MCkgeworICAgICAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNTsKKyAgICAgICAgfSBlbHNlIGlmIChicHMgPD0gMTAyMDApIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjY7CisgICAgICAgIH0KKworICAgICAgICAvLyAxMjIwMCBicHMKKyAgICAgICAgcmV0dXJuIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNzsKKyAgICB9Cit9CisKK3ZvaWQgT01YQ29kZWM6OnNldEFNUkZvcm1hdChib29sIGlzV0FNUiwgaW50MzJfdCBiaXRSYXRlKSB7CiAgICAgT01YX1UzMiBwb3J0SW5kZXggPSBtSXNFbmNvZGVyID8ga1BvcnRJbmRleE91dHB1dCA6IGtQb3J0SW5kZXhJbnB1dDsKIAogICAgIE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIGRlZjsKQEAgLTIxNzIsOSArMjU4Miw4IEBACiAgICAgQ0hFQ0tfRVEoZXJyLCBPSyk7CiAKICAgICBkZWYuZUFNUkZyYW1lRm9ybWF0ID0gT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0RlNGOwotICAgIGRlZi5lQU1SQmFuZE1vZGUgPQotICAgICAgICBpc1dBTVIgPyBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjAgOiBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjA7CiAKKyAgICBkZWYuZUFNUkJhbmRNb2RlID0gcGlja01vZGVGcm9tQml0UmF0ZShpc1dBTVIsIGJpdFJhdGUpOwogICAgIGVyciA9IG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FtciwgJmRlZiwgc2l6ZW9mKGRlZikpOwogICAgIENIRUNLX0VRKGVyciwgT0spOwogCkBAIC0yMTkxLDkgKzI2MDAsNjEgQEAKICAgICB9CiB9CiAKLXZvaWQgT01YQ29kZWM6OnNldEFBQ0Zvcm1hdChpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpIHsKK3ZvaWQgT01YQ29kZWM6OnNldEFBQ0Zvcm1hdChpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgYml0UmF0ZSkgeworICAgIENIRUNLKG51bUNoYW5uZWxzID09IDEgfHwgbnVtQ2hhbm5lbHMgPT0gMik7CiAgICAgaWYgKG1Jc0VuY29kZXIpIHsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLyBpbnB1dCBwb3J0IC8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgIHNldFJhd0F1ZGlvRm9ybWF0KGtQb3J0SW5kZXhJbnB1dCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8gb3V0cHV0IHBvcnQgLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gZm9ybWF0CisgICAgICAgIE9NWF9BVURJT19QQVJBTV9QT1JURk9STUFUVFlQRSBmb3JtYXQ7CisgICAgICAgIGZvcm1hdC5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgZm9ybWF0Lm5JbmRleCA9IDA7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIHdoaWxlIChPTVhfRXJyb3JOb25lID09IGVycikgeworICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUG9ydEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpLCBPSyk7CisgICAgICAgICAgICBpZiAoZm9ybWF0LmVFbmNvZGluZyA9PSBPTVhfQVVESU9fQ29kaW5nQUFDKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQubkluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfRVEoT0ssIGVycik7CisgICAgICAgIENIRUNLX0VRKG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQsCisgICAgICAgICAgICAgICAgJmZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpLCBPSyk7CisKKyAgICAgICAgLy8gcG9ydCBkZWZpbml0aW9uCisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgICAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgICAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAmZGVmLCBzaXplb2YoZGVmKSksIE9LKTsKKyAgICAgICAgZGVmLmZvcm1hdC5hdWRpby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfVFJVRTsKKyAgICAgICAgZGVmLmZvcm1hdC5hdWRpby5lRW5jb2RpbmcgPSBPTVhfQVVESU9fQ29kaW5nQUFDOworICAgICAgICBDSEVDS19FUShtT01YLT5zZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgICAgICAgICAgICAgJmRlZiwgc2l6ZW9mKGRlZikpLCBPSyk7CisKKyAgICAgICAgLy8gcHJvZmlsZQorICAgICAgICBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgcHJvZmlsZTsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmcHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGUublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgIENIRUNLX0VRKG1PTVgtPmdldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywKKyAgICAgICAgICAgICAgICAmcHJvZmlsZSwgc2l6ZW9mKHByb2ZpbGUpKSwgT0spOworICAgICAgICBwcm9maWxlLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICAgICAgICBwcm9maWxlLmVDaGFubmVsTW9kZSA9IChudW1DaGFubmVscyA9PSAxPworICAgICAgICAgICAgICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1vbm86IE9NWF9BVURJT19DaGFubmVsTW9kZVN0ZXJlbyk7CisgICAgICAgIHByb2ZpbGUublNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBwcm9maWxlLm5CaXRSYXRlID0gYml0UmF0ZTsKKyAgICAgICAgcHJvZmlsZS5uQXVkaW9CYW5kV2lkdGggPSAwOworICAgICAgICBwcm9maWxlLm5GcmFtZUxlbmd0aCA9IDA7CisgICAgICAgIHByb2ZpbGUubkFBQ3Rvb2xzID0gT01YX0FVRElPX0FBQ1Rvb2xBbGw7CisgICAgICAgIHByb2ZpbGUubkFBQ0VSdG9vbHMgPSBPTVhfQVVESU9fQUFDRVJOb25lOworICAgICAgICBwcm9maWxlLmVBQUNQcm9maWxlID0gT01YX0FVRElPX0FBQ09iamVjdExDOworICAgICAgICBwcm9maWxlLmVBQUNTdHJlYW1Gb3JtYXQgPSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkY7CisgICAgICAgIENIRUNLX0VRKG1PTVgtPnNldFBhcmFtZXRlcihtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywKKyAgICAgICAgICAgICAgICAmcHJvZmlsZSwgc2l6ZW9mKHByb2ZpbGUpKSwgT0spOworCiAgICAgfSBlbHNlIHsKICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFIHByb2ZpbGU7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJnByb2ZpbGUpOwpAQCAtMjMyOCw3ICsyNzg5LDcgQEAKICAgICBtQ29kZWNTcGVjaWZpY0RhdGFJbmRleCA9IDA7CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjpzdGFydChNZXRhRGF0YSAqKSB7CitzdGF0dXNfdCBPTVhDb2RlYzo6c3RhcnQoTWV0YURhdGEgKm1ldGEpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1TdGF0ZSAhPSBMT0FERUQpIHsKQEAgLTIzMzksNiArMjgwMCwxNCBAQAogICAgIGlmIChtUXVpcmtzICYga1dhbnRzTkFMRnJhZ21lbnRzKSB7CiAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoa0tleVdhbnRzTkFMRnJhZ21lbnRzLCB0cnVlKTsKICAgICB9CisgICAgaWYgKG1ldGEpIHsKKyAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IDA7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChrS2V5VGltZSwgc3RhcnRUaW1lVXMpOworICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydChwYXJhbXMuZ2V0KCkpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjM1MSw3ICsyODIwLDEwIEBACiAgICAgbU5vTW9yZU91dHB1dERhdGEgPSBmYWxzZTsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzSGF2ZUNoYW5nZWQgPSBmYWxzZTsKICAgICBtU2Vla1RpbWVVcyA9IC0xOworICAgIG1TZWVrTW9kZSA9IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzsKKyAgICBtVGFyZ2V0VGltZVVzID0gLTE7CiAgICAgbUZpbGxlZEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CiAKICAgICByZXR1cm4gaW5pdCgpOwogfQpAQCAtMjQ0NCw5ICsyOTE2LDE2IEBACiAKICAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKICAgICAgICAgc2Vla2luZyA9IHRydWU7CiAgICAgfQorICAgIGludDY0X3Qgc2tpcFRpbWVVczsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTa2lwRnJhbWUoJnNraXBUaW1lVXMpKSB7CisgICAgICAgIG1Ta2lwVGltZVVzID0gc2tpcFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2tpcFRpbWVVcyA9IC0xOworICAgIH0KIAogICAgIGlmIChtSW5pdGlhbEJ1ZmZlclN1Ym1pdCkgewogICAgICAgICBtSW5pdGlhbEJ1ZmZlclN1Ym1pdCA9IGZhbHNlOwpAQCAtMjQ1NCwxMCArMjkzMywxMiBAQAogICAgICAgICBpZiAoc2Vla2luZykgewogICAgICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKICAgICAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgICAgIG1TZWVrTW9kZSA9IHNlZWtNb2RlOwogCiAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHJlYXNvbiB0byB0cmlnZ2VyIHRoZSBjb2RlIGJlbG93LCB0aGVyZSdzCiAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGZsdXNoIHlldC4KICAgICAgICAgICAgIHNlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIGRyYWluSW5wdXRCdWZmZXJzKCk7CkBAIC0yNDc2LDYgKzI5NTcsNyBAQAogCiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAgICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKKyAgICAgICAgbVNlZWtNb2RlID0gc2Vla01vZGU7CiAKICAgICAgICAgbUZpbGxlZEJ1ZmZlcnMuY2xlYXIoKTsKIApAQCAtMjg3MCw2ICszMzUyLDEyIEBACiB2b2lkIE9NWENvZGVjOjppbml0T3V0cHV0Rm9ybWF0KGNvbnN0IHNwPE1ldGFEYXRhPiAmaW5wdXRGb3JtYXQpIHsKICAgICBtT3V0cHV0Rm9ybWF0ID0gbmV3IE1ldGFEYXRhOwogICAgIG1PdXRwdXRGb3JtYXQtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsIG1Db21wb25lbnROYW1lKTsKKyAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICBpbnQzMl90IHRpbWVTY2FsZTsKKyAgICAgICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoa0tleVRpbWVTY2FsZSwgJnRpbWVTY2FsZSkpIHsKKyAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIHRpbWVTY2FsZSk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwpAQCAtMjk2Miw2ICszNDUwLDEzIEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKGF1ZGlvX2RlZi0+ZUVuY29kaW5nID09IE9NWF9BVURJT19Db2RpbmdBQUMpIHsKICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGJpdFJhdGU7CisgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYml0UmF0ZSk7CisgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgYml0UmF0ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiBVbmtub3duIGF1ZGlvIGVuY29kaW5nLiIpOwogICAgICAgICAgICAgfQpAQCAtMzAxMSw2ICszNTA2LDE0IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBPTVhDb2RlYzo6cGF1c2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIG1QYXVzZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBzdGF0dXNfdCBRdWVyeUNvZGVjcygKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCmluZGV4IGQwZDFiMTQuLjdhOGNmMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcApAQCAtNzYsNyArNzYsOSBAQAogICAgIHN0YXR1c190IHNlZWtUb09mZnNldChvZmZfdCBvZmZzZXQpOwogICAgIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqYnVmZmVyKTsKIAotICAgIHZvaWQgaW5pdCgpOworICAgIHN0YXR1c190IGluaXQoKTsKKworICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YURhdGEoKSB7IHJldHVybiBtRmlsZU1ldGE7IH0KIAogcHJpdmF0ZToKICAgICBzdHJ1Y3QgUGFnZSB7CkBAIC0xMDAsMTMgKzEwMiwxNyBAQAogICAgIHZvcmJpc19jb21tZW50IG1WYzsKIAogICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOwogCiAgICAgc3NpemVfdCByZWFkUGFnZShvZmZfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpOwogICAgIHN0YXR1c190IGZpbmROZXh0UGFnZShvZmZfdCBzdGFydE9mZnNldCwgb2ZmX3QgKnBhZ2VPZmZzZXQpOwogCi0gICAgdm9pZCB2ZXJpZnlIZWFkZXIoCisgICAgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKAogICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKIAorICAgIHZvaWQgcGFyc2VGaWxlTWV0YURhdGEoKTsKKyAgICB2b2lkIGV4dHJhY3RBbGJ1bUFydChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKICAgICBNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBNeVZvcmJpc0V4dHJhY3RvciAmKTsKICAgICBNeVZvcmJpc0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15Vm9yYmlzRXh0cmFjdG9yICYpOwogfTsKQEAgLTE0OSw5ICsxNTUsMTAgQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgb2ZmX3QgcG9zID0gc2Vla1RpbWVVcyAqIG1FeHRyYWN0b3ItPm1JbXBsLT5hcHByb3hCaXRyYXRlKCkgLyA4MDAwMDAwbGw7Ci0gICAgICAgIExPR0koInNlZWtpbmcgdG8gb2Zmc2V0ICVsZCIsIHBvcyk7CisgICAgICAgIExPR1YoInNlZWtpbmcgdG8gb2Zmc2V0ICVsZCIsIHBvcyk7CiAKICAgICAgICAgaWYgKG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9PZmZzZXQocG9zKSAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CkBAIC0xNzQsNiArMTgxLDggQEAKICAgICB9CiAjZW5kaWYKIAorICAgIHBhY2tldC0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisKICAgICAqb3V0ID0gcGFja2V0OwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMTg4LDkgKzE5NywxNCBAQAogICAgICAgbU5leHRMYWNlSW5kZXgoMCksCiAgICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSB7CiAgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CisKKyAgICB2b3JiaXNfaW5mb19pbml0KCZtVmkpOworICAgIHZvcmJpc19jb21tZW50X2luaXQoJm1WYyk7CiB9CiAKIE15Vm9yYmlzRXh0cmFjdG9yOjp+TXlWb3JiaXNFeHRyYWN0b3IoKSB7CisgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7CiB9CiAKIHNwPE1ldGFEYXRhPiBNeVZvcmJpc0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KCkgY29uc3QgewpAQCAtMjUzLDcgKzI2Nyw3IEBACiAgICAgdWludDhfdCBoZWFkZXJbMjddOwogICAgIGlmIChtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKQogICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewotICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDhseCIsIHNpemVvZihoZWFkZXIpLCBvZmZzZXQpOworICAgICAgICBMT0dWKCJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDhseCIsIHNpemVvZihoZWFkZXIpLCBvZmZzZXQpOwogCiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CkBAIC0yOTcsNiArMzExLDcgQEAKICAgICAgICAgdG90YWxTaXplICs9IHBhZ2UtPm1MYWNlW2ldOwogICAgIH0KIAorI2lmIDAKICAgICBTdHJpbmc4IHRtcDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2UtPm1OdW1TZWdtZW50czsgKytpKSB7CiAgICAgICAgIGNoYXIgeFszMl07CkBAIC0zMDYsNiArMzIxLDcgQEAKICAgICB9CiAKICAgICBMT0dWKCIlYyAlcyIsIHBhZ2UtPm1GbGFncyAmIDEgPyAnKycgOiAnICcsIHRtcC5zdHJpbmcoKSk7CisjZW5kaWYKIAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KQEAgLTM1MSw3ICszNjcsMTMgQEAKICAgICAgICAgICAgICAgICAvLyBYWFggTm90IG9ubHkgaXMgdGhpcyBub3QgdGVjaG5pY2FsbHkgdGhlIGNvcnJlY3QgdGltZSBmb3IKICAgICAgICAgICAgICAgICAvLyB0aGlzIHBhY2tldCwgd2UgYWxzbyBzdGFtcCBldmVyeSBwYWNrZXQgaW4gdGhpcyBwYWdlCiAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgc2FtZSB0aW1lLiBUaGlzIG5lZWRzIGZpeGluZyBsYXRlci4KLSAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworCisgICAgICAgICAgICAgICAgaWYgKG1WaS5yYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJhdGUgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0IGlmIHdlJ3JlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoZSBjb25maWd1cmF0aW9uIHBhY2tldHMuLi4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9ydHVuYXRlbHksIHRoZSB0aW1lc3RhbXAgZG9lc24ndCBtYXR0ZXIgZm9yIHRob3NlLgorICAgICAgICAgICAgICAgICAgICB0aW1lVXMgPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKQEAgLTM2Miw3ICszODQsNyBAQAogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHJlYWQgJWQgYnl0ZXMgYXQgMHglMDhseCIsIHBhY2tldFNpemUsIGRhdGFPZmZzZXQpOworICAgICAgICAgICAgICAgIExPR1YoImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIGF0IDB4JTA4bHgiLCBwYWNrZXRTaXplLCBkYXRhT2Zmc2V0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKQEAgLTM5Niw3ICs0MTgsNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIExPR0UoInJlYWRQYWdlIHJldHVybmVkICVsZCIsIG4pOworICAgICAgICAgICAgTE9HVigicmVhZFBhZ2UgcmV0dXJuZWQgJWxkIiwgbik7CiAKICAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IG4gOiAoc3RhdHVzX3QpRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQpAQCAtNDIxLDQ3ICs0NDMsNjAgQEAKICAgICB9CiB9CiAKLXZvaWQgTXlWb3JiaXNFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgdm9yYmlzX2luZm9faW5pdCgmbVZpKTsKLQotICAgIHZvcmJpc19jb21tZW50IG1WYzsKLQorc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OmluaXQoKSB7CiAgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOwogCiAgICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKLSAgICBDSEVDS19FUShyZWFkTmV4dFBhY2tldCgmcGFja2V0KSwgT0spOworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IHJlYWROZXh0UGFja2V0KCZwYWNrZXQpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KICAgICBMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICVkXG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKLSAgICB2ZXJpZnlIZWFkZXIocGFja2V0LCAxKTsKKyAgICBlcnIgPSB2ZXJpZnlIZWFkZXIocGFja2V0LCAxKTsKICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICBwYWNrZXQgPSBOVUxMOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKLSAgICBDSEVDS19FUShyZWFkTmV4dFBhY2tldCgmcGFja2V0KSwgT0spOworICAgIGlmICgoZXJyID0gcmVhZE5leHRQYWNrZXQoJnBhY2tldCkpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogICAgIExPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJWRcbiIsIHBhY2tldC0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIHZlcmlmeUhlYWRlcihwYWNrZXQsIDMpOworICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIDMpOwogICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgIHBhY2tldCA9IE5VTEw7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KIAotICAgIENIRUNLX0VRKHJlYWROZXh0UGFja2V0KCZwYWNrZXQpLCBPSyk7CisgICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0KSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAgICAgTE9HVigicmVhZCBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgdmVyaWZ5SGVhZGVyKHBhY2tldCwgNSk7CisgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgNSk7CiAgICAgcGFja2V0LT5yZWxlYXNlKCk7CiAgICAgcGFja2V0ID0gTlVMTDsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCiAgICAgbUZpcnN0RGF0YU9mZnNldCA9IG1PZmZzZXQgKyBtQ3VycmVudFBhZ2VTaXplOworCisgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCitzdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKAogICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAKLSAgICBDSEVDSyhzaXplID49IDcpOwotCi0gICAgQ0hFQ0tfRVEoZGF0YVswXSwgdHlwZSk7Ci0gICAgQ0hFQ0soIW1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKTsKKyAgICBpZiAoc2l6ZSA8IDcgfHwgZGF0YVswXSAhPSB0eXBlIHx8IG1lbWNtcCgmZGF0YVsxXSwgInZvcmJpcyIsIDYpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgb2dnX2J1ZmZlciBidWY7CiAgICAgYnVmLmRhdGEgPSAodWludDhfdCAqKWRhdGE7CkBAIC01MDgsMTggKzU0MywyNiBAQAogCiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cykpOworICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXJzZUZpbGVNZXRhRGF0YSgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIDU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKDAsIF92b3JiaXNfdW5wYWNrX2Jvb2tzKCZtVmksICZiaXRzKSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcygmbVZpLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTWV0YS0+c2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIHVpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgewpAQCAtNTMwLDYgKzU3MywxOTYgQEAKICAgICByZXR1cm4gKG1WaS5iaXRyYXRlX2xvd2VyICsgbVZpLmJpdHJhdGVfdXBwZXIpIC8gMjsKIH0KIAordm9pZCBNeVZvcmJpc0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7CisgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1GaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOworCisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKKyAgICAgICAgdWludDMyX3QgbUtleTsKKyAgICB9IGtNYXBbXSA9IHsKKyAgICAgICAgeyAiVElUTEUiLCBrS2V5VGl0bGUgfSwKKyAgICAgICAgeyAiQVJUSVNUIiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJBTEJVTSIsIGtLZXlBbGJ1bSB9LAorICAgICAgICB7ICJDT01QT1NFUiIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJHRU5SRSIsIGtLZXlHZW5yZSB9LAorICAgICAgICB7ICJBVVRIT1IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgIlRSQUNLTlVNQkVSIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKKyAgICAgICAgeyAiRElTQ05VTUJFUiIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgIkRBVEUiLCBrS2V5RGF0ZSB9LAorICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKKyAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAorICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKKyAgICB9OworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgeworICAgICAgICBjb25zdCBjaGFyICpjb21tZW50ID0gbVZjLnVzZXJfY29tbWVudHNbaV07CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgeworICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUFsYnVtQXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmMuY29tbWVudF9sZW5ndGhzW2ldIC0gdGFnTGVuIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0ga0tleUF1dG9Mb29wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5QXV0b0xvb3AsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRDU3RyaW5nKGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmIDAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1WYy5jb21tZW50czsgKytpKSB7CisgICAgICAgIExPR0koImNvbW1lbnQgIyVkOiAnJXMnIiwgaSArIDEsIG1WYy51c2VyX2NvbW1lbnRzW2ldKTsKKyAgICB9CisjZW5kaWYKK30KKworLy8gVGhlIHJldHVybmVkIGJ1ZmZlciBzaG91bGQgYmUgZnJlZSgpZC4KK3N0YXRpYyB1aW50OF90ICpEZWNvZGVCYXNlNjQoY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemUsIHNpemVfdCAqb3V0U2l6ZSkgeworICAgICpvdXRTaXplID0gMDsKKworICAgIGlmICgoc2l6ZSAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IG4gPSBzaXplOworICAgIHNpemVfdCBwYWRkaW5nID0gMDsKKyAgICBpZiAobiA+PSAxICYmIHNbbiAtIDFdID09ICc9JykgeworICAgICAgICBwYWRkaW5nID0gMTsKKworICAgICAgICBpZiAobiA+PSAyICYmIHNbbiAtIDJdID09ICc9JykgeworICAgICAgICAgICAgcGFkZGluZyA9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3Qgb3V0TGVuID0gMyAqIHNpemUgLyA0IC0gcGFkZGluZzsKKworICAgICpvdXRTaXplID0gb3V0TGVuOworCisgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKG91dExlbik7CisKKyAgICB1aW50OF90ICpvdXQgPSAodWludDhfdCAqKWJ1ZmZlcjsKKyAgICBzaXplX3QgaiA9IDA7CisgICAgdWludDMyX3QgYWNjdW0gPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGNoYXIgYyA9IHNbaV07CisgICAgICAgIHVuc2lnbmVkIHZhbHVlOworICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICd6JykgeworICAgICAgICAgICAgdmFsdWUgPSAyNiArIGMgLSAnYSc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNTIgKyBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJysnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYyOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDYzOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgYWNjdW0gPSAoYWNjdW0gPDwgNikgfCB2YWx1ZTsKKworICAgICAgICBpZiAoKChpICsgMSkgJSA0KSA9PSAwKSB7CisgICAgICAgICAgICBvdXRbaisrXSA9IChhY2N1bSA+PiAxNik7CisKKyAgICAgICAgICAgIGlmIChqIDwgb3V0TGVuKSB7IG91dFtqKytdID0gKGFjY3VtID4+IDgpICYgMHhmZjsgfQorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICh1aW50OF90ICopYnVmZmVyOworfQorCit2b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjpleHRyYWN0QWxidW1BcnQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKworICAgIHNpemVfdCBmbGFjU2l6ZTsKKyAgICB1aW50OF90ICpmbGFjID0gRGVjb2RlQmFzZTY0KChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSwgJmZsYWNTaXplKTsKKworICAgIGlmIChmbGFjID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dWKCJnb3QgZmxhYyBvZiBzaXplICVkIiwgZmxhY1NpemUpOworCisgICAgdWludDMyX3QgcGljVHlwZTsKKyAgICB1aW50MzJfdCB0eXBlTGVuOworICAgIHVpbnQzMl90IGRlc2NMZW47CisgICAgdWludDMyX3QgZGF0YUxlbjsKKyAgICBjaGFyIHR5cGVbMTI4XTsKKworICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7CisKKyAgICBpZiAocGljVHlwZSAhPSAzKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKKyAgICBpZiAodHlwZUxlbiArIDEgPiBzaXplb2YodHlwZSkpIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGlmIChmbGFjU2l6ZSA8IDggKyB0eXBlTGVuKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOworICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOworCisgICAgTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOworCisgICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKKworICAgIGlmIChmbGFjU2l6ZSA8IDMyICsgdHlwZUxlbiArIGRlc2NMZW4pIHsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7CisKKyAgICBpZiAoZmxhY1NpemUgPCAzMiArIHR5cGVMZW4gKyBkZXNjTGVuICsgZGF0YUxlbikgeworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgTE9HVigiZ290IGltYWdlIGRhdGEsICVkIHRyYWlsaW5nIGJ5dGVzIiwKKyAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOworCisgICAgbUZpbGVNZXRhLT5zZXREYXRhKAorICAgICAgICAgICAga0tleUFsYnVtQXJ0LCAwLCAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKKworICAgIG1GaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCB0eXBlKTsKKworZXhpdDoKKyAgICBmcmVlKGZsYWMpOworICAgIGZsYWMgPSBOVUxMOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBPZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQpAQCAtNTM3LDEwICs3NzAsMTEgQEAKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSW1wbChOVUxMKSB7CiAgICAgbUltcGwgPSBuZXcgTXlWb3JiaXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOwotICAgIENIRUNLX0VRKG1JbXBsLT5zZWVrVG9PZmZzZXQoMCksIE9LKTsKLSAgICBtSW1wbC0+aW5pdCgpOworICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOwogCi0gICAgbUluaXRDaGVjayA9IE9LOworICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+aW5pdCgpOworICAgIH0KIH0KIAogT2dnRXh0cmFjdG9yOjp+T2dnRXh0cmFjdG9yKCkgewpAQCAtNTcwLDE5ICs4MDQsMTIgQEAKIH0KIAogc3A8TWV0YURhdGE+IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gbWV0YTsKLSAgICB9Ci0KLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyk7Ci0KLSAgICByZXR1cm4gbWV0YTsKKyAgICByZXR1cm4gbUltcGwtPmdldEZpbGVNZXRhRGF0YSgpOwogfQogCiBib29sIFNuaWZmT2dnKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgewogICAgIGNoYXIgdG1wWzRdOwogICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ByZWZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUHJlZmV0Y2hlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MGE5ZjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUHJlZmV0Y2hlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUHJlZmV0Y2hlciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvUHJlZmV0Y2hlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBQcmVmZXRjaGVkU291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBQcmVmZXRjaGVkU291cmNlKAotICAgICAgICAgICAgc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflByZWZldGNoZWRTb3VyY2UoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgc3RydWN0IFByZWZldGNoZXI7Ci0KLSAgICBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLQotICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOwotICAgIHNpemVfdCBtSW5kZXg7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBib29sIG1SZWFjaGVkRU9TOwotICAgIHN0YXR1c190IG1GaW5hbFN0YXR1czsKLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgIGludDY0X3QgbUNhY2hlRHVyYXRpb25VczsKLSAgICBzaXplX3QgbUNhY2hlU2l6ZUJ5dGVzOwotICAgIGJvb2wgbVByZWZldGNoZXJTdG9wcGVkOwotICAgIGJvb2wgbUN1cnJlbnRseVByZWZldGNoaW5nOwotCi0gICAgTGlzdDxNZWRpYUJ1ZmZlciAqPiBtQ2FjaGVkQnVmZmVyczsKLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgc291cmNlIGlzIGN1cnJlbnRseSBjYWNoaW5nLgotICAgIGJvb2wgZ2V0Q2FjaGVEdXJhdGlvblVzKGludDY0X3QgKmR1cmF0aW9uVXMsIHNpemVfdCAqdG90YWxTaXplID0gTlVMTCk7Ci0KLSAgICB2b2lkIHVwZGF0ZUNhY2hlRHVyYXRpb25fbCgpOwotICAgIHZvaWQgY2xlYXJDYWNoZV9sKCk7Ci0KLSAgICB2b2lkIGNhY2hlTW9yZSgpOwotICAgIHZvaWQgb25QcmVmZXRjaGVyU3RvcHBlZCgpOwotCi0gICAgUHJlZmV0Y2hlZFNvdXJjZShjb25zdCBQcmVmZXRjaGVkU291cmNlICYpOwotICAgIFByZWZldGNoZWRTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBQcmVmZXRjaGVkU291cmNlICYpOwotfTsKLQotUHJlZmV0Y2hlcjo6UHJlZmV0Y2hlcigpCi0gICAgOiBtRG9uZShmYWxzZSksCi0gICAgICBtVGhyZWFkRXhpdGVkKGZhbHNlKSB7Ci0gICAgc3RhcnRUaHJlYWQoKTsKLX0KLQotUHJlZmV0Y2hlcjo6flByZWZldGNoZXIoKSB7Ci0gICAgc3RvcFRocmVhZCgpOwotfQotCi1zcDxNZWRpYVNvdXJjZT4gUHJlZmV0Y2hlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNwPFByZWZldGNoZWRTb3VyY2U+IHBzb3VyY2UgPQotICAgICAgICBuZXcgUHJlZmV0Y2hlZFNvdXJjZShtU291cmNlcy5zaXplKCksIHNvdXJjZSk7Ci0KLSAgICBtU291cmNlcy5hZGQocHNvdXJjZSk7Ci0KLSAgICByZXR1cm4gcHNvdXJjZTsKLX0KLQotdm9pZCBQcmVmZXRjaGVyOjpzdGFydFRocmVhZCgpIHsKLSAgICBtVGhyZWFkRXhpdGVkID0gZmFsc2U7Ci0gICAgbURvbmUgPSBmYWxzZTsKLQotICAgIGludCByZXMgPSBhbmRyb2lkQ3JlYXRlVGhyZWFkRXRjKAotICAgICAgICAgICAgVGhyZWFkV3JhcHBlciwgdGhpcywgIlByZWZldGNoZXIiLAotICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9ERUZBVUxULCAwLCAmbVRocmVhZCk7Ci0KLSAgICBDSEVDS19FUShyZXMsIDEpOwotfQotCi12b2lkIFByZWZldGNoZXI6OnN0b3BUaHJlYWQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHdoaWxlICghbVRocmVhZEV4aXRlZCkgewotICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLWludCBQcmVmZXRjaGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQgKm1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8UHJlZmV0Y2hlciAqPihtZSktPnRocmVhZEZ1bmMoKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vLyBDYWNoZSBhdCBtb3N0IDEgbWluIGZvciBlYWNoIHNvdXJjZS4KLXN0YXRpYyBpbnQ2NF90IGtNYXhDYWNoZUR1cmF0aW9uVXMgPSA2MCAqIDEwMDAwMDBsbDsKLQotLy8gQXQgdGhlIHNhbWUgdGltZSBjYWNoZSBhdCBtb3N0IDVNQiBwZXIgc291cmNlLgotc3RhdGljIHNpemVfdCBrTWF4Q2FjaGVTaXplQnl0ZXMgPSA1ICogMTAyNCAqIDEwMjQ7Ci0KLS8vIElmIHRoZSBhbW91bnQgb2YgY2FjaGVkIGRhdGEgZHJvcHMgYmVsb3cgdGhpcywKLS8vIGZpbGwgdGhlIGNhY2hlIHVwIHRvIHRoZSBtYXggZHVyYXRpb24gYWdhaW4uCi1zdGF0aWMgaW50NjRfdCBrTG93V2F0ZXJEdXJhdGlvblVzID0gNTAwMDAwMGxsOwotCi12b2lkIFByZWZldGNoZXI6OnRocmVhZEZ1bmMoKSB7Ci0gICAgYm9vbCBmaWxsaW5nQ2FjaGUgPSBmYWxzZTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgc3A8UHJlZmV0Y2hlZFNvdXJjZT4gbWluU291cmNlOwotICAgICAgICBpbnQ2NF90IG1pbkNhY2hlRHVyYXRpb25VcyA9IC0xOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0UmVsYXRpdmUoCi0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLCBmaWxsaW5nQ2FjaGUgPyAxbGwgOiAxMDAwMDAwMDAwbGwpOwotCi0KLSAgICAgICAgICAgIHNzaXplX3QgbWluSW5kZXggPSAtMTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzcDxQcmVmZXRjaGVkU291cmNlPiBzb3VyY2UgPSBtU291cmNlc1tpXS5wcm9tb3RlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBjYWNoZUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNhY2hlU2l6ZUJ5dGVzOwotICAgICAgICAgICAgICAgIGlmICghc291cmNlLT5nZXRDYWNoZUR1cmF0aW9uVXMoJmNhY2hlRHVyYXRpb25VcywgJmNhY2hlU2l6ZUJ5dGVzKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVTaXplQnl0ZXMgPiBrTWF4Q2FjaGVTaXplQnl0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HSSgibWF4IGNhY2hlIHNpemUgcmVhY2hlZCIpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZXMuc2l6ZSgpID4gMSAmJiBjYWNoZUR1cmF0aW9uVXMgPj0ga01heENhY2hlRHVyYXRpb25VcykgewotICAgICAgICAgICAgICAgICAgICBMT0dJKCJtYXggZHVyYXRpb24gcmVhY2hlZCwgc2l6ZSA9ICVkIGJ5dGVzIiwgY2FjaGVTaXplQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobWluSW5kZXggPCAwIHx8IGNhY2hlRHVyYXRpb25VcyA8IG1pbkNhY2hlRHVyYXRpb25VcykgewotICAgICAgICAgICAgICAgICAgICBtaW5DYWNoZUR1cmF0aW9uVXMgPSBjYWNoZUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIG1pbkluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgbWluU291cmNlID0gc291cmNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1pbkluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIGlmIChmaWxsaW5nQ2FjaGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigiWyVwXSBkb25lIGZpbGxpbmcgdGhlIGNhY2hlLCBhYm92ZSBoaWdoIHdhdGVyIG1hcmsuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgZmlsbGluZ0NhY2hlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFmaWxsaW5nQ2FjaGUgJiYgbWluQ2FjaGVEdXJhdGlvblVzIDwga0xvd1dhdGVyRHVyYXRpb25VcykgewotICAgICAgICAgICAgTE9HSSgiWyVwXSBjYWNoZSBiZWxvdyBsb3cgd2F0ZXIgbWFyaywgZmlsbGluZyBjYWNoZS4iLCB0aGlzKTsKLSAgICAgICAgICAgIGZpbGxpbmdDYWNoZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlsbGluZ0NhY2hlKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGhvbGQgdGhlIGxvY2sgd2hpbGUgY2FsbGluZyBpbnRvIHRoZSBzb3VyY2UuCi0gICAgICAgICAgICAvLyBUaGUgbG9jayBndWFyZHMgdGhlIGxpc3Qgb2Ygc291cmNlcywgbm90IHRoZSBpbmRpdmlkdWFsIHNvdXJjZXMKLSAgICAgICAgICAgIC8vIHRoZW1zZWx2ZXMuCi0gICAgICAgICAgICBtaW5Tb3VyY2UtPmNhY2hlTW9yZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFByZWZldGNoZWRTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2VzW2ldLnByb21vdGUoKTsKLQotICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc291cmNlLT5vblByZWZldGNoZXJTdG9wcGVkKCk7Ci0gICAgfQotCi0gICAgbVRocmVhZEV4aXRlZCA9IHRydWU7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotaW50NjRfdCBQcmVmZXRjaGVyOjpnZXRDYWNoZWREdXJhdGlvblVzKGJvb2wgKm5vTW9yZURhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaW50NjRfdCBtaW5DYWNoZUR1cmF0aW9uVXMgPSAtMTsKLSAgICBzc2l6ZV90IG1pbkluZGV4ID0gLTE7Ci0gICAgYm9vbCBhbnlTb3VyY2VBY3RpdmUgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGludDY0X3QgY2FjaGVEdXJhdGlvblVzOwotICAgICAgICBzcDxQcmVmZXRjaGVkU291cmNlPiBzb3VyY2UgPSBtU291cmNlc1tpXS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc291cmNlLT5nZXRDYWNoZUR1cmF0aW9uVXMoJmNhY2hlRHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIGFueVNvdXJjZUFjdGl2ZSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWluSW5kZXggPCAwIHx8IGNhY2hlRHVyYXRpb25VcyA8IG1pbkNhY2hlRHVyYXRpb25VcykgewotICAgICAgICAgICAgbWluQ2FjaGVEdXJhdGlvblVzID0gY2FjaGVEdXJhdGlvblVzOwotICAgICAgICAgICAgbWluSW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5vTW9yZURhdGEpIHsKLSAgICAgICAgKm5vTW9yZURhdGEgPSAhYW55U291cmNlQWN0aXZlOwotICAgIH0KLQotICAgIHJldHVybiBtaW5DYWNoZUR1cmF0aW9uVXMgPCAwID8gMCA6IG1pbkNhY2hlRHVyYXRpb25VczsKLX0KLQotc3RhdHVzX3QgUHJlZmV0Y2hlcjo6cHJlcGFyZSgKLSAgICAgICAgYm9vbCAoKmNvbnRpbnVlRnVuYykodm9pZCAqY29va2llKSwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gRmlsbCB0aGUgY2FjaGUuCi0KLSAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgIGJvb2wgbm9Nb3JlRGF0YTsKLSAgICBkbyB7Ci0gICAgICAgIHVzbGVlcCgxMDAwMDApOwotCi0gICAgICAgIGlmIChjb250aW51ZUZ1bmMgJiYgISgqY29udGludWVGdW5jKShjb29raWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlRSOwotICAgICAgICB9Ci0KLSAgICAgICAgZHVyYXRpb24gPSBnZXRDYWNoZWREdXJhdGlvblVzKCZub01vcmVEYXRhKTsKLSAgICB9IHdoaWxlICghbm9Nb3JlRGF0YSAmJiBkdXJhdGlvbiA8IDIwMDAwMDBsbCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLVByZWZldGNoZWRTb3VyY2U6OlByZWZldGNoZWRTb3VyY2UoCi0gICAgICAgIHNpemVfdCBpbmRleCwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtSW5kZXgoaW5kZXgpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpLAotICAgICAgbVNlZWtUaW1lVXMoMCksCi0gICAgICBtQ2FjaGVEdXJhdGlvblVzKDApLAotICAgICAgbUNhY2hlU2l6ZUJ5dGVzKDApLAotICAgICAgbVByZWZldGNoZXJTdG9wcGVkKGZhbHNlKSwKLSAgICAgIG1DdXJyZW50bHlQcmVmZXRjaGluZyhmYWxzZSkgewotfQotCi1QcmVmZXRjaGVkU291cmNlOjp+UHJlZmV0Y2hlZFNvdXJjZSgpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUHJlZmV0Y2hlZFNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIENIRUNLKCFtU3RhcnRlZCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByZWZldGNoZWRTb3VyY2U6OnN0b3AoKSB7Ci0gICAgQ0hFQ0sobVN0YXJ0ZWQpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHdoaWxlIChtQ3VycmVudGx5UHJlZmV0Y2hpbmcpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICBjbGVhckNhY2hlX2woKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBQcmVmZXRjaGVkU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICAqb3V0ID0gTlVMTDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgewotICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwotCi0gICAgICAgIGNsZWFyQ2FjaGVfbCgpOwotCi0gICAgICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci0gICAgICAgIG1TZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIW1QcmVmZXRjaGVyU3RvcHBlZCAmJiAhbVJlYWNoZWRFT1MgJiYgbUNhY2hlZEJ1ZmZlcnMuZW1wdHkoKSkgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIGlmIChtQ2FjaGVkQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBtUmVhY2hlZEVPUyA/IG1GaW5hbFN0YXR1cyA6IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfQotCi0gICAgKm91dCA9ICptQ2FjaGVkQnVmZmVycy5iZWdpbigpOwotICAgIG1DYWNoZWRCdWZmZXJzLmVyYXNlKG1DYWNoZWRCdWZmZXJzLmJlZ2luKCkpOwotICAgIHVwZGF0ZUNhY2hlRHVyYXRpb25fbCgpOwotICAgIG1DYWNoZVNpemVCeXRlcyAtPSAoKm91dCktPnNpemUoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IFByZWZldGNoZWRTb3VyY2U6OmdldEZvcm1hdCgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLWJvb2wgUHJlZmV0Y2hlZFNvdXJjZTo6Z2V0Q2FjaGVEdXJhdGlvblVzKAotICAgICAgICBpbnQ2NF90ICpkdXJhdGlvblVzLCBzaXplX3QgKnRvdGFsU2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqZHVyYXRpb25VcyA9IG1DYWNoZUR1cmF0aW9uVXM7Ci0gICAgaWYgKHRvdGFsU2l6ZSAhPSBOVUxMKSB7Ci0gICAgICAgICp0b3RhbFNpemUgPSBtQ2FjaGVTaXplQnl0ZXM7Ci0gICAgfQotCi0gICAgaWYgKCFtU3RhcnRlZCB8fCBtUmVhY2hlZEVPUykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUHJlZmV0Y2hlZFNvdXJjZTo6Y2FjaGVNb3JlKCkgewotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1DdXJyZW50bHlQcmVmZXRjaGluZyA9IHRydWU7Ci0KLSAgICBpZiAobVNlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcyk7Ci0gICAgICAgIG1TZWVrVGltZVVzID0gLTE7Ci0gICAgfQotCi0gICAgLy8gRW5zdXJlIG91ciBvYmplY3QgZG9lcyBub3QgZ28gYXdheSB3aGlsZSB3ZSdyZSBub3QgaG9sZGluZwotICAgIC8vIHRoZSBsb2NrLgotICAgIHNwPFByZWZldGNoZWRTb3VyY2U+IG1lID0gdGhpczsKLQotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIE1lZGlhQnVmZmVyICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtQ3VycmVudGx5UHJlZmV0Y2hpbmcgPSBmYWxzZTsKLSAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwotICAgICAgICBtRmluYWxTdGF0dXMgPSBlcnI7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKLQotICAgIE1lZGlhQnVmZmVyICpjb3B5ID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgIG1lbWNweShjb3B5LT5kYXRhKCksCi0gICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgIHNwPE1ldGFEYXRhPiBmcm9tID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICBzcDxNZXRhRGF0YT4gdG8gPSBjb3B5LT5tZXRhX2RhdGEoKTsKLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChmcm9tLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgIHRvLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICB9Ci0KLSAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICBidWZmZXIgPSBOVUxMOwotCi0gICAgbUNhY2hlZEJ1ZmZlcnMucHVzaF9iYWNrKGNvcHkpOwotICAgIHVwZGF0ZUNhY2hlRHVyYXRpb25fbCgpOwotICAgIG1DYWNoZVNpemVCeXRlcyArPSBjb3B5LT5zaXplKCk7Ci0KLSAgICBtQ3VycmVudGx5UHJlZmV0Y2hpbmcgPSBmYWxzZTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotfQotCi12b2lkIFByZWZldGNoZWRTb3VyY2U6OnVwZGF0ZUNhY2hlRHVyYXRpb25fbCgpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlcnMuc2l6ZSgpIDwgMikgewotICAgICAgICBtQ2FjaGVEdXJhdGlvblVzID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzLCBsYXN0VGltZVVzOwotICAgICAgICBDSEVDSygoKm1DYWNoZWRCdWZmZXJzLmJlZ2luKCkpLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgJmZpcnN0VGltZVVzKSk7Ci0gICAgICAgIENIRUNLKCgqLS1tQ2FjaGVkQnVmZmVycy5lbmQoKSktPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbGFzdFRpbWVVcykpOwotCi0gICAgICAgIG1DYWNoZUR1cmF0aW9uVXMgPSBsYXN0VGltZVVzIC0gZmlyc3RUaW1lVXM7Ci0gICAgfQotfQotCi12b2lkIFByZWZldGNoZWRTb3VyY2U6OmNsZWFyQ2FjaGVfbCgpIHsKLSAgICBMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IG1DYWNoZWRCdWZmZXJzLmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IG1DYWNoZWRCdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgICgqaXQpLT5yZWxlYXNlKCk7Ci0KLSAgICAgICAgaXQgPSBtQ2FjaGVkQnVmZmVycy5lcmFzZShpdCk7Ci0gICAgfQotCi0gICAgdXBkYXRlQ2FjaGVEdXJhdGlvbl9sKCk7Ci0gICAgbUNhY2hlU2l6ZUJ5dGVzID0gMDsKLX0KLQotdm9pZCBQcmVmZXRjaGVkU291cmNlOjpvblByZWZldGNoZXJTdG9wcGVkKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVByZWZldGNoZXJTdG9wcGVkID0gdHJ1ZTsKLSAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCmluZGV4IDg5YTUyMmUuLjI3ZmFmNGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKQEAgLTU1LDYgKzU1LDggQEAKICAgICAgIG1UaW1lVG9TYW1wbGUoTlVMTCksCiAgICAgICBtU3luY1NhbXBsZU9mZnNldCgtMSksCiAgICAgICBtTnVtU3luY1NhbXBsZXMoMCksCisgICAgICBtU3luY1NhbXBsZXMoTlVMTCksCisgICAgICBtTGFzdFN5bmNTYW1wbGVJbmRleCgwKSwKICAgICAgIG1TYW1wbGVUb0NodW5rRW50cmllcyhOVUxMKSB7CiAgICAgbVNhbXBsZUl0ZXJhdG9yID0gbmV3IFNhbXBsZUl0ZXJhdG9yKHRoaXMpOwogfQpAQCAtNjMsNiArNjUsOSBAQAogICAgIGRlbGV0ZVtdIG1TYW1wbGVUb0NodW5rRW50cmllczsKICAgICBtU2FtcGxlVG9DaHVua0VudHJpZXMgPSBOVUxMOwogCisgICAgZGVsZXRlW10gbVN5bmNTYW1wbGVzOworICAgIG1TeW5jU2FtcGxlcyA9IE5VTEw7CisKICAgICBkZWxldGVbXSBtVGltZVRvU2FtcGxlOwogICAgIG1UaW1lVG9TYW1wbGUgPSBOVUxMOwogCkBAIC0yNzgsNiArMjgzLDE4IEBACiAgICAgaWYgKG1OdW1TeW5jU2FtcGxlcyA8IDIpIHsKICAgICAgICAgTE9HVygiVGFibGUgb2Ygc3luYyBzYW1wbGVzIGlzIGVtcHR5IG9yIGhhcyBvbmx5IGEgc2luZ2xlIGVudHJ5ISIpOwogICAgIH0KKworICAgIG1TeW5jU2FtcGxlcyA9IG5ldyB1aW50MzJfdFttTnVtU3luY1NhbXBsZXNdOworICAgIHNpemVfdCBzaXplID0gbU51bVN5bmNTYW1wbGVzICogc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChtU3luY1NhbXBsZU9mZnNldCArIDgsIG1TeW5jU2FtcGxlcywgc2l6ZSkKKyAgICAgICAgICAgICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bVN5bmNTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgbVN5bmNTYW1wbGVzW2ldID0gbnRvaGwobVN5bmNTYW1wbGVzW2ldKSAtIDE7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0zMTQsOCArMzMxLDEwIEBACiAgICAgcmV0dXJuIHRpbWUxID4gdGltZTIgPyB0aW1lMSAtIHRpbWUyIDogdGltZTIgLSB0aW1lMTsKIH0KIAotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRDbG9zZXN0U2FtcGxlKAorc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRTYW1wbGVBdFRpbWUoCiAgICAgICAgIHVpbnQzMl90IHJlcV90aW1lLCB1aW50MzJfdCAqc2FtcGxlX2luZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgICpzYW1wbGVfaW5kZXggPSAwOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHVpbnQzMl90IGN1cl9zYW1wbGUgPSAwOwpAQCAtMzMwLDE2ICszNDksMzcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHRpbWUxID0gdGltZSArIGogKiBkZWx0YTsKICAgICAgICAgICAgIHVpbnQzMl90IHRpbWUyID0gdGltZTEgKyBkZWx0YTsKIAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKICAgICAgICAgICAgIGlmIChpKzEgPT0gbVRpbWVUb1NhbXBsZUNvdW50CiAgICAgICAgICAgICAgICAgICAgIHx8IChhYnNfZGlmZmVyZW5jZShyZXFfdGltZSwgdGltZTEpCiAgICAgICAgICAgICAgICAgICAgICAgICA8IGFic19kaWZmZXJlbmNlKHJlcV90aW1lLCB0aW1lMikpKSB7CiAgICAgICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IGN1cl9zYW1wbGUgKyBqOworICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSB0aW1lMTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKnNhbXBsZV9pbmRleCA9IGN1cl9zYW1wbGUgKyBqICsgMTsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gdGltZTI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChmbGFncyAmIGtTeW5jU2FtcGxlX0ZsYWcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluZENsb3Nlc3RTeW5jU2FtcGxlX2woKnNhbXBsZV9pbmRleCwgc2FtcGxlX2luZGV4KTsKKyAgICAgICAgICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtGbGFnQmVmb3JlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPiByZXFfdGltZSAmJiAqc2FtcGxlX2luZGV4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS0qc2FtcGxlX2luZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lIDwgcmVxX3RpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAqc2FtcGxlX2luZGV4ICsgMSA8IG1OdW1TYW1wbGVTaXplcykgeworICAgICAgICAgICAgICAgICAgICAgICAgKysqc2FtcGxlX2luZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gT0s7CkBAIC0zNTIsOCArMzkyLDEwIEBACiAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKIH0KIAotc3RhdHVzX3QgU2FtcGxlVGFibGU6OmZpbmRDbG9zZXN0U3luY1NhbXBsZV9sKAotICAgICAgICB1aW50MzJfdCBzdGFydF9zYW1wbGVfaW5kZXgsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgpIHsKK3N0YXR1c190IFNhbXBsZVRhYmxlOjpmaW5kU3luY1NhbXBsZU5lYXIoCisgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCiAgICAgKnNhbXBsZV9pbmRleCA9IDA7CiAKICAgICBpZiAobVN5bmNTYW1wbGVPZmZzZXQgPCAwKSB7CkBAIC0zNjIsMjkgKzQwNCwxMDQgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIHVpbnQzMl90IHg7Ci0gICAgdWludDMyX3QgbGVmdCA9IDA7Ci0gICAgdWludDMyX3QgcmlnaHQgPSBtTnVtU3luY1NhbXBsZXM7Ci0gICAgd2hpbGUgKGxlZnQgPCByaWdodCkgewotICAgICAgICB1aW50MzJfdCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7CisgICAgaWYgKG1OdW1TeW5jU2FtcGxlcyA9PSAwKSB7CisgICAgICAgICpzYW1wbGVfaW5kZXggPSAwOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQogCi0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtU3luY1NhbXBsZU9mZnNldCArIDggKyBtaWQgKiA0LCAmeCwgNCkgIT0gNCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIHVpbnQzMl90IGxlZnQgPSAwOworICAgIHdoaWxlIChsZWZ0IDwgbU51bVN5bmNTYW1wbGVzKSB7CisgICAgICAgIHVpbnQzMl90IHggPSBtU3luY1NhbXBsZXNbbGVmdF07CisKKyAgICAgICAgaWYgKHggPj0gc3RhcnRfc2FtcGxlX2luZGV4KSB7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIHggPSBudG9obCh4KTsKKyAgICAgICAgKytsZWZ0OworICAgIH0KIAotICAgICAgICBpZiAoeCA8IChzdGFydF9zYW1wbGVfaW5kZXggKyAxKSkgewotICAgICAgICAgICAgbGVmdCA9IG1pZCArIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoeCA+IChzdGFydF9zYW1wbGVfaW5kZXggKyAxKSkgewotICAgICAgICAgICAgcmlnaHQgPSBtaWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAtLWxlZnQ7CisgICAgdWludDMyX3QgeDsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBtU3luY1NhbXBsZU9mZnNldCArIDggKyBsZWZ0ICogNCwgJngsIDQpICE9IDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHggPSBudG9obCh4KTsKKyAgICAtLXg7CisKKyAgICBpZiAobGVmdCArIDEgPCBtTnVtU3luY1NhbXBsZXMpIHsKKyAgICAgICAgdWludDMyX3QgeSA9IG1TeW5jU2FtcGxlc1tsZWZ0ICsgMV07CisKKyAgICAgICAgLy8gb3VyIHNhbXBsZSBsaWVzIGJldHdlZW4gc3luYyBzYW1wbGVzIHggYW5kIHkuCisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oc3RhcnRfc2FtcGxlX2luZGV4KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oeCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgeF90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisKKyAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8oeSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB5X3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKKworICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UoeF90aW1lLCBzYW1wbGVfdGltZSkKKyAgICAgICAgICAgICAgICA+IGFic19kaWZmZXJlbmNlKHlfdGltZSwgc2FtcGxlX3RpbWUpKSB7CisgICAgICAgICAgICAvLyBQaWNrIHRoZSBzeW5jIHNhbXBsZSBjbG9zZXN0ICh0aW1ld2lzZSkgdG8gdGhlIHN0YXJ0LXNhbXBsZS4KKyAgICAgICAgICAgIHggPSB5OworICAgICAgICAgICAgKytsZWZ0OwogICAgICAgICB9CiAgICAgfQogCi0gICAgKnNhbXBsZV9pbmRleCA9IHggLSAxOworICAgIHN3aXRjaCAoZmxhZ3MpIHsKKyAgICAgICAgY2FzZSBrRmxhZ0JlZm9yZToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHggPiBzdGFydF9zYW1wbGVfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhsZWZ0ID4gMCk7CisKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1NhbXBsZU9mZnNldCArIDggKyAobGVmdCAtIDEpICogNCwgJngsIDQpICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHggPSBudG9obCh4KTsKKyAgICAgICAgICAgICAgICAtLXg7CisKKyAgICAgICAgICAgICAgICBDSEVDSyh4IDw9IHN0YXJ0X3NhbXBsZV9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga0ZsYWdBZnRlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHggPCBzdGFydF9zYW1wbGVfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCArIDEgPj0gbU51bVN5bmNTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeCA9IG1TeW5jU2FtcGxlc1tsZWZ0ICsgMV07CisKKyAgICAgICAgICAgICAgICBDSEVDSyh4ID49IHN0YXJ0X3NhbXBsZV9pbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgICpzYW1wbGVfaW5kZXggPSB4OwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNDEyLDEzICs1MjksNyBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvU2NhbjsgKytpKSB7Ci0gICAgICAgIHVpbnQzMl90IHg7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICBtU3luY1NhbXBsZU9mZnNldCArIDggKyBpICogNCwgJngsIDQpICE9IDQpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgfQotICAgICAgICB4ID0gbnRvaGwoeCk7Ci0gICAgICAgIC0teDsKKyAgICAgICAgdWludDMyX3QgeCA9IG1TeW5jU2FtcGxlc1tpXTsKIAogICAgICAgICAvLyBOb3cgeCBpcyBhIHNhbXBsZSBpbmRleC4KICAgICAgICAgc2l6ZV90IHNhbXBsZVNpemU7CkBAIC00NDgsNyArNTU5LDggQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsCiAgICAgICAgIG9mZl90ICpvZmZzZXQsCiAgICAgICAgIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgdWludDMyX3QgKmRlY29kaW5nVGltZSkgeworICAgICAgICB1aW50MzJfdCAqZGVjb2RpbmdUaW1lLAorICAgICAgICBib29sICppc1N5bmNTYW1wbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNDY4LDYgKzU4MCwyOCBAQAogICAgICAgICAqZGVjb2RpbmdUaW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAgICAgfQogCisgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAqaXNTeW5jU2FtcGxlID0gZmFsc2U7CisgICAgICAgIGlmIChtU3luY1NhbXBsZU9mZnNldCA8IDApIHsKKyAgICAgICAgICAgIC8vIEV2ZXJ5IHNhbXBsZSBpcyBhIHN5bmMgc2FtcGxlLgorICAgICAgICAgICAgKmlzU3luY1NhbXBsZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgaSA9IChtTGFzdFN5bmNTYW1wbGVJbmRleCA8IG1OdW1TeW5jU2FtcGxlcykKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1TeW5jU2FtcGxlc1ttTGFzdFN5bmNTYW1wbGVJbmRleF0gPD0gc2FtcGxlSW5kZXgpCisgICAgICAgICAgICAgICAgPyBtTGFzdFN5bmNTYW1wbGVJbmRleCA6IDA7CisKKyAgICAgICAgICAgIHdoaWxlIChpIDwgbU51bVN5bmNTYW1wbGVzICYmIG1TeW5jU2FtcGxlc1tpXSA8IHNhbXBsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA8IG1OdW1TeW5jU2FtcGxlcyAmJiBtU3luY1NhbXBsZXNbaV0gPT0gc2FtcGxlSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAqaXNTeW5jU2FtcGxlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUxhc3RTeW5jU2FtcGxlSW5kZXggPSBpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaG91dGNhc3RTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2hvdXRjYXN0U291cmNlLmNwcAppbmRleCBlYzI1NDMwLi4yM2I3NjgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaG91dGNhc3RTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Nob3V0Y2FzdFNvdXJjZS5jcHAKQEAgLTkzLDcgKzkzLDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCmluZGV4IDAzMjg3ZGQuLjE2MjllOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKQEAgLTI2LDEwICsyNiw2IEBACiAvLyBTb25pdm94IGluY2x1ZGVzCiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXMuaD4KIAotLy8gT2dnIFZvcmJpcyBpbmNsdWRlcwotI2luY2x1ZGUgPFRyZW1vbG8vaXZvcmJpc2NvZGVjLmg+Ci0jaW5jbHVkZSA8VHJlbW9sby9pdm9yYmlzZmlsZS5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpTdGFnZWZyaWdodE1lZGlhU2Nhbm5lcigpCkBAIC00Miw3ICszOCw4IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtWYWxpZEV4dGVuc2lvbnNbXSA9IHsKICAgICAgICAgIi5tcDMiLCAiLm1wNCIsICIubTRhIiwgIi4zZ3AiLCAiLjNncHAiLCAiLjNnMiIsICIuM2dwcDIiLAogICAgICAgICAiLm1wZWciLCAiLm9nZyIsICIubWlkIiwgIi5zbWYiLCAiLmlteSIsICIud21hIiwgIi5hYWMiLAotICAgICAgICAiLndhdiIsICIuYW1yIiwgIi5taWRpIiwgIi54bWYiLCAiLnJ0dHRsIiwgIi5ydHgiLCAiLm90YSIKKyAgICAgICAgIi53YXYiLCAiLmFtciIsICIubWlkaSIsICIueG1mIiwgIi5ydHR0bCIsICIucnR4IiwgIi5vdGEiLAorICAgICAgICAiLm1rdiIsICIubWthIiwgIi53ZWJtIiwgIi50cyIKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bVZhbGlkRXh0ZW5zaW9ucyA9CiAgICAgICAgIHNpemVvZihrVmFsaWRFeHRlbnNpb25zKSAvIHNpemVvZihrVmFsaWRFeHRlbnNpb25zWzBdKTsKQEAgLTEwMiw0OCArOTksNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdGljIHN0YXR1c190IEhhbmRsZU9HRygKLSAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIE1lZGlhU2Nhbm5lckNsaWVudCAqY2xpZW50KSB7Ci0gICAgaW50IGR1cmF0aW9uOwotCi0gICAgRklMRSAqZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCJyIik7Ci0gICAgaWYgKCFmaWxlKQotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLQotICAgIE9nZ1ZvcmJpc19GaWxlIHZmOwotICAgIGlmIChvdl9vcGVuKGZpbGUsICZ2ZiwgTlVMTCwgMCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIGNoYXIgKipwdHI9b3ZfY29tbWVudCgmdmYsLTEpLT51c2VyX2NvbW1lbnRzOwotICAgIHdoaWxlKCpwdHIpewotICAgICAgICBjaGFyICp2YWwgPSBzdHJzdHIoKnB0ciwgIj0iKTsKLSAgICAgICAgaWYgKHZhbCkgewotICAgICAgICAgICAgaW50IGtleWxlbiA9IHZhbCsrIC0gKnB0cjsKLSAgICAgICAgICAgIGNoYXIga2V5W2tleWxlbiArIDFdOwotICAgICAgICAgICAgc3RybmNweShrZXksICpwdHIsIGtleWxlbik7Ci0gICAgICAgICAgICBrZXlba2V5bGVuXSA9IDA7Ci0gICAgICAgICAgICBpZiAoIWNsaWVudC0+YWRkU3RyaW5nVGFnKGtleSwgdmFsKSkgZ290byBmYWlsdXJlOwotICAgICAgICB9Ci0gICAgICAgICsrcHRyOwotICAgIH0KLQotICAgIC8vIER1cmF0aW9uCi0gICAgZHVyYXRpb24gPSBvdl90aW1lX3RvdGFsKCZ2ZiwgLTEpOwotICAgIGlmIChkdXJhdGlvbiA+IDApIHsKLSAgICAgICAgY2hhciBidWZmZXJbMjBdOwotICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVkIiwgZHVyYXRpb24pOwotICAgICAgICBpZiAoIWNsaWVudC0+YWRkU3RyaW5nVGFnKCJkdXJhdGlvbiIsIGJ1ZmZlcikpIGdvdG8gZmFpbHVyZTsKLSAgICB9Ci0KLSAgICBvdl9jbGVhcigmdmYpOyAvLyB0aGlzIGFsc28gY2xvc2VzIHRoZSBGSUxFCi0gICAgcmV0dXJuIE9LOwotCi1mYWlsdXJlOgotICAgIG92X2NsZWFyKCZ2Zik7IC8vIHRoaXMgYWxzbyBjbG9zZXMgdGhlIEZJTEUKLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQogc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6OnByb2Nlc3NGaWxlKAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptaW1lVHlwZSwKICAgICAgICAgTWVkaWFTY2FubmVyQ2xpZW50ICZjbGllbnQpIHsKQEAgLTE3NSwxMCArMTMwLDYgQEAKICAgICAgICAgcmV0dXJuIEhhbmRsZU1JREkocGF0aCwgJmNsaWVudCk7CiAgICAgfQogCi0gICAgaWYgKCFzdHJjYXNlY21wKGV4dGVuc2lvbiwgIi5vZ2ciKSkgewotICAgICAgICByZXR1cm4gSGFuZGxlT0dHKHBhdGgsICZjbGllbnQpOwotICAgIH0KLQogICAgIGlmIChtUmV0cmlldmVyLT5zZXREYXRhU291cmNlKHBhdGgpID09IE9LCiAgICAgICAgICAgICAmJiBtUmV0cmlldmVyLT5zZXRNb2RlKAogICAgICAgICAgICAgICAgIE1FVEFEQVRBX01PREVfTUVUQURBVEFfUkVUUklFVkFMX09OTFkpID09IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDI1OGJlNzQuLjlkODljMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0zNzgsNiArMzc4LDI0IEBACiAgICAgLy8gVGhlIGR1cmF0aW9uIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZHVyYXRpb24gaW4gbXMuCiAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKG1heER1cmF0aW9uVXMgKyA1MDApIC8gMTAwMCk7CiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRFVSQVRJT04sIFN0cmluZzgodG1wKSk7CisKKyAgICBpZiAobnVtVHJhY2tzID09IDEpIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZU1JTUU7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJmZpbGVNSU1FKSk7CisKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKGZpbGVNSU1FLCAidmlkZW8veC1tYXRyb3NrYSIpKSB7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgwKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRyYWNrTUlNRTsKKyAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmdHJhY2tNSU1FKSk7CisKKyAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIHRyYWNrTUlNRSwgNikpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF0cm9za2EgZmlsZSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIGF1ZGlvIHRyYWNrLAorICAgICAgICAgICAgICAgIC8vIHJld3JpdGUgaXRzIG1pbWUgdHlwZS4KKyAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX01JTUVUWVBFLCBTdHJpbmc4KCJhdWRpby94LW1hdHJvc2thIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Rocm90dGxlZFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaHJvdHRsZWRTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTFmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9UaHJvdHRsZWRTb3VyY2UuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgaW50NjRfdCBnZXROb3dVcygpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworICAgIHJldHVybiAoaW50NjRfdCl0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMGxsOworfQorCitUaHJvdHRsZWRTb3VyY2U6OlRocm90dGxlZFNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgaW50MzJfdCBiYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbUJhbmR3aWR0aExpbWl0Qnl0ZXNQZXJTZWNvbmQoYmFuZHdpZHRoTGltaXRCeXRlc1BlclNlY29uZCksCisgICAgICBtU3RhcnRUaW1lVXMoLTEpLAorICAgICAgbVRvdGFsVHJhbnNmZXJyZWQoMCkgeworICAgIENIRUNLKG1CYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kID4gMCk7Cit9CisKK3N0YXR1c190IFRocm90dGxlZFNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKK30KKworc3NpemVfdCBUaHJvdHRsZWRTb3VyY2U6OnJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworCisgICAgaWYgKG4gPD0gMCkgeworICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBtVG90YWxUcmFuc2ZlcnJlZCArPSBuOworCisgICAgaW50NjRfdCBub3dVcyA9IGdldE5vd1VzKCk7CisKKyAgICBpZiAobVN0YXJ0VGltZVVzIDwgMCkgeworICAgICAgICBtU3RhcnRUaW1lVXMgPSBub3dVczsKKyAgICB9CisKKyAgICAvLyBIb3cgbG9uZyB3b3VsZCBpdCBoYXZlIHRha2VuIHRvIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgd2UgZXZlcgorICAgIC8vIHRyYW5zZmVycmVkIGdpdmVuIHRoZSBsaW1pdGVkIGJhbmR3aWR0aC4KKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPQorICAgICAgICBtVG90YWxUcmFuc2ZlcnJlZCAqIDEwMDAwMDBsbCAvIG1CYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kOworCisgICAgaW50NjRfdCB3aGVuVXMgPSBtU3RhcnRUaW1lVXMgKyBkdXJhdGlvblVzOworCisgICAgaWYgKHdoZW5VcyA+IG5vd1VzKSB7CisgICAgICAgIHVzbGVlcCh3aGVuVXMgLSBub3dVcyk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK3N0YXR1c190IFRocm90dGxlZFNvdXJjZTo6Z2V0U2l6ZShvZmZfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBUaHJvdHRsZWRTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBtU291cmNlLT5mbGFncygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGltZWRFdmVudFF1ZXVlLmNwcAppbmRleCAwZGFjYjUzLi41YTQ1M2U5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaW1lZEV2ZW50UXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RpbWVkRXZlbnRRdWV1ZS5jcHAKQEAgLTI2LDYgKzI2LDggQEAKIAogI2luY2x1ZGUgImluY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgiCiAKKyNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+CisKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgpAQCAtMjA5LDYgKzIxMSw4IEBACiAjZW5kaWYKIAogICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKKyAgICBzZXRfc2NoZWRfcG9saWN5KGFuZHJvaWRHZXRUaWQoKSwgU1BfRk9SRUdST1VORCk7CisKICAgICBzdGF0aWNfY2FzdDxUaW1lZEV2ZW50UXVldWUgKj4obWUpLT50aHJlYWRFbnRyeSgpOwogCiAjaWZkZWYgQU5EUk9JRF9TSU1VTEFUT1IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XQVZFeHRyYWN0b3IuY3BwCmluZGV4IDczNjVkZmEuLjU3YzEwNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dBVkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV0FWRXh0cmFjdG9yLmNwcApAQCAtMzEsNyArMzEsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgdWludDE2X3QgV0FWRV9GT1JNQVRfUENNID0gMTsKK2VudW0geworICAgIFdBVkVfRk9STUFUX1BDTSA9IDEsCisgICAgV0FWRV9GT1JNQVRfQUxBVyA9IDYsCisgICAgV0FWRV9GT1JNQVRfTVVMQVcgPSA3LAorfTsKIAogc3RhdGljIHVpbnQzMl90IFUzMl9MRV9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKICAgICByZXR1cm4gcHRyWzNdIDw8IDI0IHwgcHRyWzJdIDw8IDE2IHwgcHRyWzFdIDw8IDggfCBwdHJbMF07CkBAIC00NSw2ICs0OSw3IEBACiAgICAgV0FWU291cmNlKAogICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCisgICAgICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAogICAgICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAogICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKQEAgLTYzLDYgKzY4LDcgQEAKIAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKyAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKICAgICBpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIGludDMyX3QgbU51bUNoYW5uZWxzOwogICAgIGludDMyX3QgbUJpdHNQZXJTYW1wbGU7CkBAIC0xMDgsNyArMTE0LDcgQEAKIAogICAgIHJldHVybiBuZXcgV0FWU291cmNlKAogICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGEsCi0gICAgICAgICAgICBtQml0c1BlclNhbXBsZSwgbURhdGFPZmZzZXQsIG1EYXRhU2l6ZSk7CisgICAgICAgICAgICBtV2F2ZUZvcm1hdCwgbUJpdHNQZXJTYW1wbGUsIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwogfQogCiBzcDxNZXRhRGF0YT4gV0FWRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKApAQCAtMTYwLDggKzE2NiwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBmb3JtYXQgPSBVMTZfTEVfQVQoZm9ybWF0U3BlYyk7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ICE9IFdBVkVfRk9STUFUX1BDTSkgeworICAgICAgICAgICAgbVdhdmVGb3JtYXQgPSBVMTZfTEVfQVQoZm9ybWF0U3BlYyk7CisgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfUENNCisgICAgICAgICAgICAgICAgICAgICYmIG1XYXZlRm9ybWF0ICE9IFdBVkVfRk9STUFUX0FMQVcKKyAgICAgICAgICAgICAgICAgICAgJiYgbVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfTVVMQVcpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKQEAgLTE3OCw5ICsxODYsMTcgQEAKIAogICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSBVMTZfTEVfQVQoJmZvcm1hdFNwZWNbMTRdKTsKIAotICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDggJiYgbUJpdHNQZXJTYW1wbGUgIT0gMTYKLSAgICAgICAgICAgICAgICAmJiBtQml0c1BlclNhbXBsZSAhPSAyNCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9QQ00pIHsKKyAgICAgICAgICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgIT0gOCAmJiBtQml0c1BlclNhbXBsZSAhPSAxNgorICAgICAgICAgICAgICAgICAgICAmJiBtQml0c1BlclNhbXBsZSAhPSAyNCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NVUxBVworICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfQUxBVyk7CisgICAgICAgICAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbVZhbGlkRm9ybWF0ID0gdHJ1ZTsKQEAgLTE5MCw3ICsyMDYsMjMgQEAKICAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CiAKICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChtV2F2ZUZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfQUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1XYXZlRm9ybWF0LCBXQVZFX0ZPUk1BVF9NVUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIG1UcmFja01ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSk7CiAKQEAgLTIxNywxMCArMjQ5LDEyIEBACiBXQVZTb3VyY2U6OldBVlNvdXJjZSgKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJmRhdGFTb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwKKyAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAogICAgICAgICBvZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1XYXZlRm9ybWF0KHdhdmVGb3JtYXQpLAogICAgICAgbVNhbXBsZVJhdGUoMCksCiAgICAgICBtTnVtQ2hhbm5lbHMoMCksCiAgICAgICBtQml0c1BlclNhbXBsZShiaXRzUGVyU2FtcGxlKSwKQEAgLTI4Miw3ICszMTYsOCBAQAogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgaW50NjRfdCBwb3MgPSAoc2Vla1RpbWVVcyAqIG1TYW1wbGVSYXRlKSAvIDEwMDAwMDAgKiBtTnVtQ2hhbm5lbHMgKiAyOwogICAgICAgICBpZiAocG9zID4gbVNpemUpIHsKICAgICAgICAgICAgIHBvcyA9IG1TaXplOwpAQCAtMzExLDQzICszNDYsNDUgQEAKIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCisgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgeworICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgeworICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCiAKLSAgICAgICAgTWVkaWFCdWZmZXIgKnRtcDsKLSAgICAgICAgQ0hFQ0tfRVEobUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmdG1wKSwgT0spOworICAgICAgICAgICAgTWVkaWFCdWZmZXIgKnRtcDsKKyAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIE9LKTsKIAotICAgICAgICAvLyBUaGUgbmV3IGJ1ZmZlciBob2xkcyB0aGUgc2FtcGxlIG51bWJlciBvZiBzYW1wbGVzLCBidXQgZWFjaAotICAgICAgICAvLyBvbmUgaXMgMiBieXRlcyB3aWRlLgotICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7CisgICAgICAgICAgICAvLyBUaGUgbmV3IGJ1ZmZlciBob2xkcyB0aGUgc2FtcGxlIG51bWJlciBvZiBzYW1wbGVzLCBidXQgZWFjaAorICAgICAgICAgICAgLy8gb25lIGlzIDIgYnl0ZXMgd2lkZS4KKyAgICAgICAgICAgIHRtcC0+c2V0X3JhbmdlKDAsIDIgKiBuKTsKIAotICAgICAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKXRtcC0+ZGF0YSgpOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICB3aGlsZSAobi0tID4gMCkgewotICAgICAgICAgICAgKmRzdCsrID0gKChpbnQxNl90KSgqc3JjKSAtIDEyOCkgKiAyNTY7Ci0gICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgIGludDE2X3QgKmRzdCA9IChpbnQxNl90ICopdG1wLT5kYXRhKCk7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgd2hpbGUgKG4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAoKGludDE2X3QpKCpzcmMpIC0gMTI4KSAqIDI1NjsKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSB0bXA7CisgICAgICAgIH0gZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgMjQtYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9CisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgICAgICBpbnQxNl90ICpkc3QgPSAoaW50MTZfdCAqKXNyYzsKKworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC8gMzsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB4ID0gKGludDMyX3QpKHNyY1swXSB8IHNyY1sxXSA8PCA4IHwgc3JjWzJdIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB4ID0gKHggPDwgOCkgPj4gODsgIC8vIHNpZ24gZXh0ZW5zaW9uCisKKyAgICAgICAgICAgICAgICB4ID0geCA+PiA4OworICAgICAgICAgICAgICAgICpkc3QrKyA9IChpbnQxNl90KXg7CisgICAgICAgICAgICAgICAgc3JjICs9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksIDIgKiBudW1TYW1wbGVzKTsKICAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSB0bXA7Ci0gICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkLgotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLSAgICAgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilzcmM7Ci0KLSAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC8gMzsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgICAgIGludDMyX3QgeCA9IChpbnQzMl90KShzcmNbMF0gfCBzcmNbMV0gPDwgOCB8IHNyY1syXSA8PCAxNik7Ci0gICAgICAgICAgICB4ID0gKHggPDwgOCkgPj4gODsgIC8vIHNpZ24gZXh0ZW5zaW9uCi0KLSAgICAgICAgICAgIHggPSB4ID4+IDg7Ci0gICAgICAgICAgICAqZHN0KysgPSAoaW50MTZfdCl4OwotICAgICAgICAgICAgc3JjICs9IDM7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpLCAyICogbnVtU2FtcGxlcyk7CiAgICAgfQogCiAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKQEAgLTM1Nyw2ICszOTQsNyBAQAogICAgICAgICAgICAgMTAwMDAwMExMICogKG1DdXJyZW50UG9zIC0gbU9mZnNldCkKICAgICAgICAgICAgICAgICAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSkgLyBtU2FtcGxlUmF0ZSk7CiAKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIApAQCAtMzY2LDcgKzQwNCw4IEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIFNuaWZmV0FWKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgewogICAgIGNoYXIgaGVhZGVyWzEyXTsKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFhZTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyB1bnNpZ25lZCBwYXJzZVVFKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgdW5zaWduZWQgbnVtWmVyb2VzID0gMDsKKyAgICB3aGlsZSAoYnItPmdldEJpdHMoMSkgPT0gMCkgeworICAgICAgICArK251bVplcm9lczsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB4ID0gYnItPmdldEJpdHMobnVtWmVyb2VzKTsKKworICAgIHJldHVybiB4ICsgKDF1IDw8IG51bVplcm9lcykgLSAxOworfQorCisvLyBEZXRlcm1pbmUgdmlkZW8gZGltZW5zaW9ucyBmcm9tIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXJzZXQuCit2b2lkIEZpbmRBVkNEaW1lbnNpb25zKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBBQml0UmVhZGVyIGJyKHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCBzZXFQYXJhbVNldC0+c2l6ZSgpIC0gMSk7CisKKyAgICB1bnNpZ25lZCBwcm9maWxlX2lkYyA9IGJyLmdldEJpdHMoOCk7CisgICAgYnIuc2tpcEJpdHMoMTYpOworICAgIHBhcnNlVUUoJmJyKTsgIC8vIHNlcV9wYXJhbWV0ZXJfc2V0X2lkCisKKyAgICBpZiAocHJvZmlsZV9pZGMgPT0gMTAwIHx8IHByb2ZpbGVfaWRjID09IDExMAorICAgICAgICAgICAgfHwgcHJvZmlsZV9pZGMgPT0gMTIyIHx8IHByb2ZpbGVfaWRjID09IDI0NAorICAgICAgICAgICAgfHwgcHJvZmlsZV9pZGMgPT0gNDQgfHwgcHJvZmlsZV9pZGMgPT0gODMgfHwgcHJvZmlsZV9pZGMgPT0gODYpIHsKKyAgICAgICAgdW5zaWduZWQgY2hyb21hX2Zvcm1hdF9pZGMgPSBwYXJzZVVFKCZicik7CisgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisgICAgICAgICAgICBici5za2lwQml0cygxKTsgIC8vIHJlc2lkdWFsX2NvbG91cl90cmFuc2Zvcm1fZmxhZworICAgICAgICB9CisgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIGJpdF9kZXB0aF9sdW1hX21pbnVzOAorICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBiaXRfZGVwdGhfY2hyb21hX21pbnVzOAorICAgICAgICBici5za2lwQml0cygxKTsgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZworICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAwdSk7ICAvLyBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnCisgICAgfQorCisgICAgcGFyc2VVRSgmYnIpOyAgLy8gbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNAorICAgIHVuc2lnbmVkIHBpY19vcmRlcl9jbnRfdHlwZSA9IHBhcnNlVUUoJmJyKTsKKworICAgIGlmIChwaWNfb3JkZXJfY250X3R5cGUgPT0gMCkgeworICAgICAgICBwYXJzZVVFKCZicik7ICAvLyBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQKKyAgICB9IGVsc2UgaWYgKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKSB7CisgICAgICAgIC8vIG9mZnNldF9mb3Jfbm9uX3JlZl9waWMsIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCBhbmQKKyAgICAgICAgLy8gb2Zmc2V0X2Zvcl9yZWZfZnJhbWUgYXJlIHRlY2huaWNhbGx5IHNlKHYpLCBidXQgc2luY2Ugd2UgYXJlCisgICAgICAgIC8vIGp1c3Qgc2tpcHBpbmcgb3ZlciB0aGVtIHRoZSBtaWRwb2ludCBkb2VzIG5vdCBtYXR0ZXIuCisKKyAgICAgICAgYnIuZ2V0Qml0cygxKTsgIC8vIGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnCisgICAgICAgIHBhcnNlVUUoJmJyKTsgIC8vIG9mZnNldF9mb3Jfbm9uX3JlZl9waWMKKyAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gb2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkCisKKyAgICAgICAgdW5zaWduZWQgbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9IHBhcnNlVUUoJmJyKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7ICsraSkgeworICAgICAgICAgICAgcGFyc2VVRSgmYnIpOyAgLy8gb2Zmc2V0X2Zvcl9yZWZfZnJhbWUKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcnNlVUUoJmJyKTsgIC8vIG51bV9yZWZfZnJhbWVzCisgICAgYnIuZ2V0Qml0cygxKTsgIC8vIGdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZworCisgICAgdW5zaWduZWQgcGljX3dpZHRoX2luX21ic19taW51czEgPSBwYXJzZVVFKCZicik7CisgICAgdW5zaWduZWQgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gcGFyc2VVRSgmYnIpOworICAgIHVuc2lnbmVkIGZyYW1lX21ic19vbmx5X2ZsYWcgPSBici5nZXRCaXRzKDEpOworCisgICAgKndpZHRoID0gcGljX3dpZHRoX2luX21ic19taW51czEgKiAxNiArIDE2OworCisgICAgKmhlaWdodCA9ICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykKKyAgICAgICAgKiAocGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICogMTYgKyAxNik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FBQ0RlY29kZXIuY3BwCmluZGV4IDJiYzQ0NDguLmM1YjUxYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQUFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BQUNEZWNvZGVyLmNwcApAQCAtMTUsNiArMTUsNyBAQAogICovCiAKICNpbmNsdWRlICJBQUNEZWNvZGVyLmgiCisjZGVmaW5lIExPR19UQUcgIkFBQ0RlY29kZXIiCiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL0VTRFMuaCIKIApAQCAtMzYsMjYgKzM3LDMzIEBACiAgICAgICBtQW5jaG9yVGltZVVzKDApLAogICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCiAgICAgICBtSW5wdXRCdWZmZXIoTlVMTCkgewotfQogCi1BQUNEZWNvZGVyOjp+QUFDRGVjb2RlcigpIHsKLSAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgc3RvcCgpOworICAgIHNwPE1ldGFEYXRhPiBzcmNGb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoKTsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKKworICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKworICAgIC8vIFdlJ2xsIGFsd2F5cyBvdXRwdXQgc3RlcmVvLCByZWdhcmRsZXNzIG9mIGhvdyBtYW55IGNoYW5uZWxzIGFyZQorICAgIC8vIHByZXNlbnQgaW4gdGhlIGlucHV0IGR1ZSB0byBkZWNvZGVyIGxpbWl0YXRpb25zLgorICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAyKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKICAgICB9CisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBQUNEZWNvZGVyIik7CiAKLSAgICBkZWxldGUgbUNvbmZpZzsKLSAgICBtQ29uZmlnID0gTlVMTDsKKyAgICBtSW5pdENoZWNrID0gaW5pdENoZWNrKCk7CiB9CiAKLXN0YXR1c190IEFBQ0RlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotCi0gICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigyMDQ4ICogMikpOwotCitzdGF0dXNfdCBBQUNEZWNvZGVyOjppbml0Q2hlY2soKSB7CisgICAgbWVtc2V0KG1Db25maWcsIDAsIHNpemVvZih0UFZNUDRBdWRpb0RlY29kZXJFeHRlcm5hbCkpOwogICAgIG1Db25maWctPm91dHB1dEZvcm1hdCA9IE9VVFBVVEZPUk1BVF8xNlBDTV9JTlRFUkxFQVZFRDsKLSAgICBtQ29uZmlnLT5hYWNQbHVzVXBzYW1wbGluZ0ZhY3RvciA9IDA7Ci0gICAgbUNvbmZpZy0+YWFjUGx1c0VuYWJsZWQgPSBmYWxzZTsKKyAgICBtQ29uZmlnLT5hYWNQbHVzRW5hYmxlZCA9IDE7CiAKICAgICAvLyBUaGUgc29mdHdhcmUgZGVjb2RlciBkb2Vzbid0IHByb3Blcmx5IHN1cHBvcnQgbW9ubyBvdXRwdXQgb24KICAgICAvLyBBQUNwbHVzIGZpbGVzLiBBbHdheXMgb3V0cHV0IHN0ZXJlby4KQEAgLTY0LDggKzcyLDExIEBACiAgICAgVUludDMyIG1lbVJlcXVpcmVtZW50cyA9IFBWTVA0QXVkaW9EZWNvZGVyR2V0TWVtUmVxdWlyZW1lbnRzKCk7CiAgICAgbURlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKIAotICAgIENIRUNLX0VRKFBWTVA0QXVkaW9EZWNvZGVySW5pdExpYnJhcnkobUNvbmZpZywgbURlY29kZXJCdWYpLAotICAgICAgICAgICAgIE1QNEFVREVDX1NVQ0NFU1MpOworICAgIHN0YXR1c190IGVyciA9IFBWTVA0QXVkaW9EZWNvZGVySW5pdExpYnJhcnkobUNvbmZpZywgbURlY29kZXJCdWYpOworICAgIGlmIChlcnIgIT0gTVA0QVVERUNfU1VDQ0VTUykgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNUDQgYXVkaW8gZGVjb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CiAKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CkBAIC04MywxOCArOTQsMjkgQEAKICAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gKFVDaGFyICopY29kZWNfc3BlY2lmaWNfZGF0YTsKICAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gY29kZWNfc3BlY2lmaWNfZGF0YV9zaXplOwogICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlck1heExlbmd0aCA9IDA7Ci0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IDA7Ci0gICAgICAgIG1Db25maWctPnJlbWFpbmRlckJpdHMgPSAwOwotCi0gICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyX3BsdXMgPSBOVUxMOwotICAgICAgICBtQ29uZmlnLT5yZXBvc2l0aW9uRmxhZyA9IGZhbHNlOwogCiAgICAgICAgIGlmIChQVk1QNEF1ZGlvRGVjb2RlckNvbmZpZyhtQ29uZmlnLCBtRGVjb2RlckJ1ZikKICAgICAgICAgICAgICAgICAhPSBNUDRBVURFQ19TVUNDRVNTKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitBQUNEZWNvZGVyOjp+QUFDRGVjb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKworICAgIGRlbGV0ZSBtQ29uZmlnOworICAgIG1Db25maWcgPSBOVUxMOworfQorCitzdGF0dXNfdCBBQUNEZWNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgQ0hFQ0soIW1TdGFydGVkKTsKKworICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoNDA5NiAqIDIpKTsKIAogICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CiAKQEAgLTEyNywyOCArMTQ5LDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IEFBQ0RlY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0soc3JjRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLQotICAgIC8vIFdlJ2xsIGFsd2F5cyBvdXRwdXQgc3RlcmVvLCByZWdhcmRsZXNzIG9mIGhvdyBtYW55IGNoYW5uZWxzIGFyZQotICAgIC8vIHByZXNlbnQgaW4gdGhlIGlucHV0IGR1ZSB0byBkZWNvZGVyIGxpbWl0YXRpb25zLgotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIDIpOwotCi0gICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOwotCi0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwotICAgIH0KLQotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBQUNEZWNvZGVyIik7Ci0KLSAgICByZXR1cm4gbWV0YTsKKyAgICByZXR1cm4gbU1ldGE7CiB9CiAKIHN0YXR1c190IEFBQ0RlY29kZXI6OnJlYWQoCkBAIC0xNTgsNyArMTU5LDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKIAogICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CkBAIC0yMDAsMTMgKzIwMiwzMiBAQAogICAgIG1Db25maWctPnJlbWFpbmRlckJpdHMgPSAwOwogCiAgICAgbUNvbmZpZy0+cE91dHB1dEJ1ZmZlciA9IHN0YXRpY19jYXN0PEludDE2ICo+KGJ1ZmZlci0+ZGF0YSgpKTsKLSAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyX3BsdXMgPSBOVUxMOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXJfcGx1cyA9ICZtQ29uZmlnLT5wT3V0cHV0QnVmZmVyWzIwNDhdOwogICAgIG1Db25maWctPnJlcG9zaXRpb25GbGFnID0gZmFsc2U7CiAKICAgICBJbnQgZGVjb2RlckVyciA9IFBWTVA0QXVkaW9EZWNvZGVGcmFtZShtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAKKyAgICAvLyBDaGVjayBvbiB0aGUgc2FtcGxpbmcgcmF0ZSB0byBzZWUgd2hldGhlciBpdCBpcyBjaGFuZ2VkLgorICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOworICAgIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxlUmF0ZSkgeworICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7CisgICAgICAgIExPR1coIlNhbXBsZSByYXRlIHdhcyAlZCwgYnV0IG5vdyBpcyAlZCIsCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKTsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gSU5GT19GT1JNQVRfQ0hBTkdFRDsKKyAgICB9CisKICAgICBzaXplX3QgbnVtT3V0Qnl0ZXMgPQogICAgICAgICBtQ29uZmlnLT5mcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1Db25maWctPmRlc2lyZWRDaGFubmVsczsKKyAgICBpZiAobUNvbmZpZy0+YWFjUGx1c1Vwc2FtcGxpbmdGYWN0b3IgPT0gMikgeworICAgICAgICBpZiAobUNvbmZpZy0+ZGVzaXJlZENoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIG1lbWNweSgmbUNvbmZpZy0+cE91dHB1dEJ1ZmZlclsxMDI0XSwgJm1Db25maWctPnBPdXRwdXRCdWZmZXJbMjA0OF0sIG51bU91dEJ5dGVzICogMik7CisgICAgICAgIH0KKyAgICAgICAgbnVtT3V0Qnl0ZXMgKj0gMjsKKyAgICB9CiAKICAgICBpZiAoZGVjb2RlckVyciAhPSBNUDRBVURFQ19TVUNDRVNTKSB7CiAgICAgICAgIExPR1coIkFBQyBkZWNvZGVyIHJldHVybmVkIGVycm9yICVkLCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsIGRlY29kZXJFcnIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BQUNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5ZjEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQUFDRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFBQ0VuY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBQUNFbmNvZGVyLmgiCisjaW5jbHVkZSAidm9BQUMuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FBQ0VuY29kZXI6OkFBQ0VuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1NZXRhKG1ldGEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAorICAgICAgbUlucHV0QnVmZmVyKE5VTEwpLAorICAgICAgbUVuY29kZXJIYW5kbGUoTlVMTCksCisgICAgICBtQXBpSGFuZGxlKE5VTEwpLAorICAgICAgbU1lbU9wZXJhdG9yKE5VTEwpIHsKK30KKworc3RhdHVzX3QgQUFDRW5jb2Rlcjo6aW5pdENoZWNrKCkgeworICAgIENIRUNLKG1BcGlIYW5kbGUgPT0gTlVMTCAmJiBtRW5jb2RlckhhbmRsZSA9PSBOVUxMKTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmbUJpdFJhdGUpKTsKKworICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7CisgICAgQ0hFQ0sobUFwaUhhbmRsZSk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBQUNFbmNBUEkobUFwaUhhbmRsZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1NZW1PcGVyYXRvciA9IG5ldyBWT19NRU1fT1BFUkFUT1I7CisgICAgQ0hFQ0sobU1lbU9wZXJhdG9yICE9IE5VTEwpOworICAgIG1NZW1PcGVyYXRvci0+QWxsb2MgPSBjbW5NZW1BbGxvYzsKKyAgICBtTWVtT3BlcmF0b3ItPkNvcHkgPSBjbW5NZW1Db3B5OworICAgIG1NZW1PcGVyYXRvci0+RnJlZSA9IGNtbk1lbUZyZWU7CisgICAgbU1lbU9wZXJhdG9yLT5TZXQgPSBjbW5NZW1TZXQ7CisgICAgbU1lbU9wZXJhdG9yLT5DaGVjayA9IGNtbk1lbUNoZWNrOworCisgICAgVk9fQ09ERUNfSU5JVF9VU0VSREFUQSB1c2VyRGF0YTsKKyAgICBtZW1zZXQoJnVzZXJEYXRhLCAwLCBzaXplb2YodXNlckRhdGEpKTsKKyAgICB1c2VyRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsKKyAgICB1c2VyRGF0YS5tZW1EYXRhID0gKFZPX1BUUikgbU1lbU9wZXJhdG9yOworICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5Jbml0KCZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQUFDLCAmdXNlckRhdGEpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0IEFBQyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoT0sgIT0gc2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIEFBQyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIENvbmZpZ3VyZSBBQUMgZW5jb2RlciQKKyAgICBBQUNFTkNfUEFSQU0gcGFyYW1zOworICAgIG1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICBwYXJhbXMuYml0UmF0ZSA9IG1CaXRSYXRlOworICAgIHBhcmFtcy5uQ2hhbm5lbHMgPSBtQ2hhbm5lbHM7CisgICAgcGFyYW1zLmFkdHNVc2VkID0gMDsgIC8vIEZvciBNUDQgZmlsZSwgZG9uJ3QgdXNlIGFkdHMgZm9ybWF0JAorICAgIGlmIChWT19FUlJfTk9ORSAhPSBtQXBpSGFuZGxlLT5TZXRQYXJhbShtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FBQ19FTkNQQVJBTSwgICZwYXJhbXMpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgJmluZGV4KSB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsZVJhdGVUYWJsZVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLAorICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgIGNvbnN0IGludDMyX3QgdGFibGVTaXplID0gc2l6ZW9mKGtTYW1wbGVSYXRlVGFibGUpIC8gc2l6ZW9mKGtTYW1wbGVSYXRlVGFibGVbMF0pOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHRhYmxlU2l6ZTsgKytpKSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID09IGtTYW1wbGVSYXRlVGFibGVbaV0pIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0UoIlNhbXBsaW5nIHJhdGUgJWQgYnBzIGlzIG5vdCBzdXBwb3J0ZWQiLCBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworc3RhdHVzX3QgQUFDRW5jb2Rlcjo6c2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEoKSB7CisgICAgTE9HVigic2V0QXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGE6ICVkIGh6LCAlZCBicHMsIGFuZCAlZCBjaGFubmVscyIsCisgICAgICAgICBtU2FtcGxlUmF0ZSwgbUJpdFJhdGUsIG1DaGFubmVscyk7CisKKyAgICBpbnQzMl90IGluZGV4OworICAgIENIRUNLX0VRKE9LLCBnZXRTYW1wbGVSYXRlVGFibGVJbmRleChtU2FtcGxlUmF0ZSwgaW5kZXgpKTsKKyAgICBpZiAobUNoYW5uZWxzID4gMiB8fCBtQ2hhbm5lbHMgPD0gMCkgeworICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMoJWQpIiwgbUNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gT01YX0FVRElPX0FBQ09iamVjdExDCisgICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzBdID0gKCgweDAyIDw8IDMpIHwgKGluZGV4ID4+IDEpKTsKKyAgICBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGFbMV0gPSAoKGluZGV4ICYgMHgwMSkgPDwgNykgfCAobUNoYW5uZWxzIDw8IDMpOworICAgIHJldHVybiBPSzsKK30KKworQUFDRW5jb2Rlcjo6fkFBQ0VuY29kZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEFBQ0VuY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdGFydCgpIHdoZW4gZW5jb2RlciBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1CdWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIoMjA0OCkpOworCisgICAgQ0hFQ0tfRVEoT0ssIGluaXRDaGVjaygpKTsKKworICAgIG1OdW1JbnB1dFNhbXBsZXMgPSAwOworICAgIG1BbmNob3JUaW1lVXMgPSAwOworICAgIG1GcmFtZUNvdW50ID0gMDsKKyAgICBtU291cmNlLT5zdGFydChwYXJhbXMpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQUNFbmNvZGVyOjpzdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7CisKKyAgICBtU291cmNlLT5zdG9wKCk7CisKKyAgICBpZiAobUVuY29kZXJIYW5kbGUpIHsKKyAgICAgICAgQ0hFQ0tfRVEoVk9fRVJSX05PTkUsIG1BcGlIYW5kbGUtPlVuaW5pdChtRW5jb2RlckhhbmRsZSkpOworICAgICAgICBtRW5jb2RlckhhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIGRlbGV0ZSBtQXBpSGFuZGxlOworICAgIG1BcGlIYW5kbGUgPSBOVUxMOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IEFBQ0VuY29kZXI6OmdldEZvcm1hdCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQUFDRW5jb2RlciIpOworCisgICAgcmV0dXJuIG1NZXRhOworfQorCitzdGF0dXNfdCBBQUNFbmNvZGVyOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBDSEVDSyhvcHRpb25zID09IE5VTEwgfHwgIW9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKTsKKworICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgQ0hFQ0tfRVEobUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKSwgT0spOworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CisgICAgYm9vbCByZWFkRnJvbVNvdXJjZSA9IGZhbHNlOworICAgIGludDY0X3Qgd2FsbENsb2NrVGltZVVzID0gLTE7CisKKyAgICBpZiAobUZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtZW1jcHkob3V0UHRyLCBtQXVkaW9TcGVjaWZpY0NvbmZpZ0RhdGEsIDIpOworICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOworICAgICAgICAqb3V0ID0gYnVmZmVyOworICAgICAgICArK21GcmFtZUNvdW50OworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtRnJhbWVDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCBmYWxzZSk7CisgICAgfQorCisgICAgd2hpbGUgKG1OdW1JbnB1dFNhbXBsZXMgPCBrTnVtU2FtcGxlc1BlckZyYW1lKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPnJlYWQoJm1JbnB1dEJ1ZmZlciwgb3B0aW9ucykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobU51bUlucHV0U2FtcGxlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtc2V0KCZtSW5wdXRGcmFtZVttTnVtSW5wdXRTYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpICogKGtOdW1TYW1wbGVzUGVyRnJhbWUgLSBtTnVtSW5wdXRTYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBhbGlnbiA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgJSBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBDSEVDS19FUShhbGlnbiwgMCk7CisKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5RHJpZnRUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIHdhbGxDbG9ja1RpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleUFuY2hvclRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRGcm9tU291cmNlID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNvcHkgPQorICAgICAgICAgICAgKGtOdW1TYW1wbGVzUGVyRnJhbWUgLSBtTnVtSW5wdXRTYW1wbGVzKSAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBpZiAoY29weSA+IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGNvcHkgPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCZtSW5wdXRGcmFtZVttTnVtSW5wdXRTYW1wbGVzXSwKKyAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopIG1JbnB1dEJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIGNvcHkpOworCisgICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGNvcHksCisgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gY29weSk7CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIG1OdW1JbnB1dFNhbXBsZXMgKz0gY29weSAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKG1OdW1JbnB1dFNhbXBsZXMgPj0ga051bVNhbXBsZXNQZXJGcmFtZSkgeworICAgICAgICAgICAgbU51bUlucHV0U2FtcGxlcyAlPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWT19DT0RFQ0JVRkZFUiBpbnB1dERhdGE7CisgICAgbWVtc2V0KCZpbnB1dERhdGEsIDAsIHNpemVvZihpbnB1dERhdGEpKTsKKyAgICBpbnB1dERhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKSBtSW5wdXRGcmFtZTsKKyAgICBpbnB1dERhdGEuTGVuZ3RoID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBDSEVDSyhWT19FUlJfTk9ORSA9PSBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsJmlucHV0RGF0YSkpOworCisgICAgVk9fQ09ERUNCVUZGRVIgb3V0cHV0RGF0YTsKKyAgICBtZW1zZXQoJm91dHB1dERhdGEsIDAsIHNpemVvZihvdXRwdXREYXRhKSk7CisgICAgVk9fQVVESU9fT1VUUFVUSU5GTyBvdXRwdXRJbmZvOworICAgIG1lbXNldCgmb3V0cHV0SW5mbywgMCwgc2l6ZW9mKG91dHB1dEluZm8pKTsKKworICAgIFZPX1UzMiByZXQgPSBWT19FUlJfTk9ORTsKKyAgICBvdXRwdXREYXRhLkJ1ZmZlciA9IG91dFB0cjsKKyAgICBvdXRwdXREYXRhLkxlbmd0aCA9IGJ1ZmZlci0+c2l6ZSgpOworICAgIHJldCA9IG1BcGlIYW5kbGUtPkdldE91dHB1dERhdGEobUVuY29kZXJIYW5kbGUsICZvdXRwdXREYXRhLCAmb3V0cHV0SW5mbyk7CisgICAgQ0hFQ0socmV0ID09IFZPX0VSUl9OT05FIHx8IHJldCA9PSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKTsKKyAgICBDSEVDSyhvdXRwdXREYXRhLkxlbmd0aCAhPSAwKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBvdXRwdXREYXRhLkxlbmd0aCk7CisKKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0KKyAgICAgICAgKChtRnJhbWVDb3VudCAtIDEpICogMTAwMDAwMExMICoga051bVNhbXBsZXNQZXJGcmFtZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgbUFuY2hvclRpbWVVcyArIG1lZGlhVGltZVVzKTsKKyAgICBpZiAocmVhZEZyb21Tb3VyY2UgJiYgd2FsbENsb2NrVGltZVVzICE9IC0xKSB7CisgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlEcmlmdFRpbWUsIG1lZGlhVGltZVVzIC0gd2FsbENsb2NrVGltZVVzKTsKKyAgICB9CisgICAgKyttRnJhbWVDb3VudDsKKworICAgICpvdXQgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTRmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQubWsKQEAgLTAsMCArMSw4NyBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitpbmNsdWRlIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5taworCitMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQorCitMT0NBTF9TUkNfRklMRVMgOj0gYmFzaWNfb3AvYmFzaWNvcDIuYyBiYXNpY19vcC9vcGVyXzMyYi5jCisKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisJQUFDRW5jb2Rlci5jcHAgXAorCXNyYy9hYWNfcm9tLmMgXAorCXNyYy9hYWNlbmMuYyBcCisJc3JjL2FhY2VuY19jb3JlLmMgXAorCXNyYy9hZGpfdGhyLmMgXAorCXNyYy9iYW5kX25yZy5jIFwKKwlzcmMvYml0X2NudC5jIFwKKwlzcmMvYml0YnVmZmVyLmMgXAorCXNyYy9iaXRlbmMuYyBcCisJc3JjL2Jsb2NrX3N3aXRjaC5jIFwKKwlzcmMvY2hhbm5lbF9tYXAuYyBcCisJc3JjL2R5bl9iaXRzLmMgXAorCXNyYy9ncnBfZGF0YS5jIFwKKwlzcmMvaW50ZXJmYWNlLmMgXAorCXNyYy9saW5lX3BlLmMgXAorCXNyYy9tc19zdGVyZW8uYyBcCisJc3JjL3ByZV9lY2hvX2NvbnRyb2wuYyBcCisJc3JjL3BzeV9jb25maWd1cmF0aW9uLmMgXAorCXNyYy9wc3lfbWFpbi5jIFwKKwlzcmMvcWNfbWFpbi5jIFwKKwlzcmMvcXVhbnRpemUuYyBcCisJc3JjL3NmX2VzdGltLmMgXAorCXNyYy9zcHJlYWRpbmcuYyBcCisJc3JjL3N0YXRfYml0cy5jIFwKKwlzcmMvdG5zLmMgXAorCXNyYy90cmFuc2Zvcm0uYyBcCisJc3JjL21lbWFsaWduLmMKKworaWZlcSAoJChWT1RUKSwgdjUpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorCXNyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zIFwKKwlzcmMvYXNtL0FSTVY1RS9iYW5kX25yZ192NS5zIFwKKwlzcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMgXAorCXNyYy9hc20vQVJNVjVFL1I0UjhGaXJzdF92NS5zIFwKKwlzcmMvYXNtL0FSTVY1RS9SYWRpeDRGRlRfdjUucworZW5kaWYKKworaWZlcSAoJChWT1RUKSwgdjcpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorCXNyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zIFwKKwlzcmMvYXNtL0FSTVY1RS9iYW5kX25yZ192NS5zIFwKKwlzcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMgXAorCXNyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucyBcCisJc3JjL2FzbS9BUk1WNy9SNFI4Rmlyc3RfdjcucyBcCisJc3JjL2FzbS9BUk1WNy9SYWRpeDRGRlRfdjcucworZW5kaWYKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2FhY2VuYworCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PQorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZSBcCisJZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorCSQoTE9DQUxfUEFUSCkvc3JjIFwKKwkkKExPQ0FMX1BBVEgpL2luYyBcCisJJChMT0NBTF9QQVRIKS9iYXNpY19vcAorCitMT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCisKK2lmZXEgKCQoVk9UVCksIHY1KQorTE9DQUxfQ0ZMQUdTICs9IC1EQVJNVjVFIC1EQVJNX0lOQVNNIC1EQVJNVjVfSU5BU00KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY1RQorZW5kaWYKKworaWZlcSAoJChWT1RUKSwgdjcpCitMT0NBTF9DRkxBR1MgKz0gLURBUk1WNUUgLURBUk1WN05lb24gLURBUk1fSU5BU00gLURBUk1WNV9JTkFTTQorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjVFCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNworZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FBQ19FX1NBTVBMRVMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BQUNfRV9TQU1QTEVTLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkMDEyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9BQUNfRV9TQU1QTEVTLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCUFBQ19FX1NBTVBMRVMuaA0KKw0KKwlDb250ZW50OglzYW1wbGUgY29kZSBmb3IgQUFDIGVuY29kZXINCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlCQk8ZGxmY24uaD4NCisjaW5jbHVkZQkJPHN0ZGlvLmg+DQorI2luY2x1ZGUJCTxzdGRsaWIuaD4NCisjaW5jbHVkZQkJPHN0cmluZy5oPg0KKyNpbmNsdWRlCQk8dGltZS5oPg0KKyNpbmNsdWRlCQkidm9BQUMuaCINCisjaW5jbHVkZQkJImNtbk1lbW9yeS5oIg0KKw0KKyNkZWZpbmUgIFZPX0FBQ19FX09VVFBVVAkgIDENCisjZGVmaW5lIFJFQURfU0laRQkoMTAyNCo4KQkNCit1bnNpZ25lZCBjaGFyIG91dEJ1ZlsxMDI0KjhdOw0KK3Vuc2lnbmVkIGNoYXIgaW5CdWZbUkVBRF9TSVpFXTsNCisNCitjb25zdCBjaGFyKiBIZWxwU3RyaW5nID0gDQorIlZpc3VhbE9uIEFBQyBlbmNvZGVyIFVzYWdlOlxuIg0KKyJ2b0FBQ0VuY1Rlc3QgLWlmIDxpbnB1dGZpbGUucGNtPiAtb2YgPG91dHB1dGZpbGUuYWFjPiAtc3IgPHNhbXBsZXJhdGU+IC1jaCA8Y2hhbm5lbD4gLWJyIDxiaXRyYXRlPiAtYWR0cyA8YWR0cz4gXG4iDQorIi1pZiBpbnB1dCBmaWxlIG5hbWUgXG4iDQorIi1vZiBvdXRwdXQgZmlsZSBuYW1lIFxuIg0KKyItc3IgaW5wdXQgcGNtIHNhbXBsZXJhdGUsIGRlZmF1bHQgNDQxMDAgXG4iDQorIi1jaCBpbnB1dCBwY20gY2hhbm5lbCwgZGVmYXVsdCAyIGNoYW5uZWwgXG4iDQorIi1iciBlbmNvZGVkIGFhYyBiaXRyYXRlLCBkZWZhdWx0IDY0MDAwICogKHNhbXBsZXJhdGUvMTAwKSpjaGFubmVsLzQ0MSg0ODApXG4iDQorIi1hZHRzIGFkZCBvciBubyBhZHRzIGhlYWRlciwgZGVmYXVsdCBhZGQgYWR0cyBoZWFkZXJcbiINCisiRm9yIGV4YW1wbGU6IFxuIg0KKyIuL3ZvQUFDRW5jVGVzdCAtaWYgcmF3LnBjbSAtb2YgcmF3LmFhYyAtc3IgNDQxMDAgLWNoIDIgLWJyIDEyODAwMFxuIjsNCisNCitzdGF0aWMgaW50IHBhcnNlY21kbGluZShpbnQgYXJnYywgY2hhciAqKmFyZ3YsY2hhciAgKippbnB1dF9maWxlbmFtZSwgY2hhciAgKipvdXRwdXRfZmlsZW5hbWUsIEFBQ0VOQ19QQVJBTSAqcGFyYW0pDQorew0KKwkvLyBub3RpY2UgdGhhdDoNCisJLy8gYml0UmF0ZS9uQ2hhbm5lbHMgPiA4MDAwDQorCS8vIGJpdFJhdGUvbkNoYW5uZWxzIDwgMTYwMDAwIA0KKwkvLyBiaXRSYXRlL25DaGFubmVscyA8IHNhbXBsZVJhdGUqNg0KKwlwYXJhbS0+YWR0c1VzZWQgPSAxOw0KKwlwYXJhbS0+Yml0UmF0ZSA9IDA7DQorCXBhcmFtLT5uQ2hhbm5lbHMgPSAyOw0KKwlwYXJhbS0+c2FtcGxlUmF0ZSA9IDQ0MTAwOw0KKw0KKwlpZihhcmdjIDwgNSB8fCBhcmdjID4gMTMpDQorCXsNCisJCXJldHVybiAtMTsNCisJfQ0KKw0KKwlhcmdjLS07DQorCWFyZ3YrKzsNCisJd2hpbGUgKGFyZ2MgPiAwKQ0KKwl7DQorCQlpZiAoIXN0cmNtcCgqYXJndiwgIi1pZiIpKQ0KKwkJew0KKwkJCWFyZ3YrKzsNCisJCQlhcmdjLS07DQorCQkJKmlucHV0X2ZpbGVuYW1lID0gKmFyZ3Y7IA0KKwkJfQ0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1vZiIpKQ0KKwkJew0KKwkJCWFyZ3YrKzsNCisJCQlhcmdjLS07DQorCQkJKm91dHB1dF9maWxlbmFtZSA9ICphcmd2Ow0KKwkJfQ0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1zciIpKQ0KKwkJew0KKwkJCWFyZ3YrKzsNCisJCQlhcmdjLS07DQorCQkJcGFyYW0tPnNhbXBsZVJhdGUgPSBhdG9pKCphcmd2KTsNCisJCX0NCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItY2giKSkNCisJCXsNCisJCQlhcmd2Kys7DQorCQkJYXJnYy0tOw0KKwkJCXBhcmFtLT5uQ2hhbm5lbHMgPSBhdG9pKCphcmd2KTsNCisJCX0NCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItYnIiKSkNCisJCXsNCisJCQlhcmd2Kys7DQorCQkJYXJnYy0tOw0KKwkJCXBhcmFtLT5iaXRSYXRlID0gYXRvaSgqYXJndik7DQorCQl9DQorCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItYWR0cyIpKQ0KKwkJew0KKwkJCWFyZ3YrKzsNCisJCQlhcmdjLS07DQorCQkJcGFyYW0tPmFkdHNVc2VkID0gYXRvaSgqYXJndik7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJcmV0dXJuIC0xOw0KKwkJfQ0KKw0KKwkJYXJndisrOw0KKwkJYXJnYy0tOw0KKwl9DQorDQorCWlmKHBhcmFtLT5iaXRSYXRlID09IDApDQorCXsNCisJCWludCBzY2FsZSA9IDQ0MTsNCisJCWlmKHBhcmFtLT5zYW1wbGVSYXRlJTgwMDAgPT0gMCkNCisJCQlzY2FsZSA9IDQ4MDsNCisJCXBhcmFtLT5iaXRSYXRlID0gNjQwKnBhcmFtLT5uQ2hhbm5lbHMqcGFyYW0tPnNhbXBsZVJhdGUvc2NhbGU7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBSZWFkRmlsZTJCdWYoRklMRSogaW5maWxlLHVuc2lnbmVkIGNoYXIqIGRlc3QsaW50IHJlYWRTaXplKQ0KK3sNCisJaW50IHJlYWRCeXRlcyA9IDA7DQorCXJlYWRCeXRlcyA9IGZyZWFkKGRlc3QsIDEsIHJlYWRTaXplLCBpbmZpbGUpOw0KKwlyZXR1cm4gcmVhZEJ5dGVzOw0KK30NCisNCit0eXBlZGVmIGludCAoVk9fQVBJICogVk9HRVRBVURJT0RFQ0FQSSkgKFZPX0FVRElPX0NPREVDQVBJICogcERlY0hhbmRsZSk7DQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQ0KK3sNCisJRklMRQkJCQkJCSppbmZpbGUsICpvdXRmaWxlOw0KKwlpbnQJCQkJCQkJdDEsIHQyOw0KKwlWT19BVURJT19DT0RFQ0FQSQkJCUF1ZGlvQVBJOw0KKwlWT19NRU1fT1BFUkFUT1IJCQkJbW9wZXI7DQorCVZPX0NPREVDX0lOSVRfVVNFUkRBVEEJCXVzZURhdGE7DQorCVZPX0hBTkRMRQkJCQkJaENvZGVjOw0KKwlWT19DT0RFQ0JVRkZFUgkJCQlpbkRhdGE7DQorCVZPX0NPREVDQlVGRkVSCQkJCW91dERhdGE7DQorCVZPX0FVRElPX09VVFBVVElORk8JCQlvdXRJbmZvOw0KKyAgICBpbnQJCQkJCQkJZmlyc3RXcml0ZSA9IDE7DQorCWludAkJCQkJCQllb2ZGaWxlID0gMDsNCisJaW50CQkJCQkJCSppbmZvPShpbnQqKWluQnVmOw0KKwlpbnQJCQkJCQkJYnl0ZXNMZWZ0LCBuUmVhZDsNCisJaW50CQkJCQkJCUVuY29kZXJkRnJhbWUgPSAwOw0KKwlpbnQJCQkJCQkJdG90YWwgPSAwOw0KKwlpbnQJCQkJCQkJaXNPdXRwdXQgPSAxOw0KKwlpbnQJCQkJCQkJcmV0dXJuQ29kZTsNCisJQUFDRU5DX1BBUkFNCQkJCWFhY3BhcmE7DQorCXZvaWQJCQkJCQkqaGFuZGxlOw0KKwl2b2lkCQkJCQkJKnBmdW5jOw0KKwlWT0dFVEFVRElPREVDQVBJCQkJcEdldEFQSTsNCisJY29uc3QgY2hhcgkJCQkJKmluZmlsZU5hbWUgPSBOVUxMOw0KKyAgICBjb25zdCBjaGFyCQkJCQkqb3V0ZmlsZU5hbWUgPSBOVUxMOw0KKw0KKwlyZXR1cm5Db2RlID0gcGFyc2VjbWRsaW5lKGFyZ2MsYXJndiwgJmluZmlsZU5hbWUsICZvdXRmaWxlTmFtZSwgJmFhY3BhcmEpOw0KKwlpZihyZXR1cm5Db2RlKQ0KKwl7DQorCQlwcmludGYoIiVzIiwgSGVscFN0cmluZyk7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBvcGVuIGlucHV0IGZpbGUgKi8NCisJaW5maWxlID0gZm9wZW4oaW5maWxlTmFtZSwgInJiIik7DQorCWlmICghaW5maWxlKSB7DQorCQlwcmludGYoIk9wZW4gaW5wdXQgZmlsZSBmYWlsLi4uIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJLyogb3BlbiBvdXRwdXQgZmlsZSAqLw0KKwlpZihpc091dHB1dCkNCisJew0KKwkJb3V0ZmlsZSA9IGZvcGVuKG91dGZpbGVOYW1lLCAid2IiKTsgDQorCQlpZiAoIW91dGZpbGUpIHsNCisJCQlwcmludGYoIk9wZW4gb3V0cHV0IGZpbGUgZmFpbC4uLiIpOw0KKwkJCXJldHVybiAtMTsNCisJCX0NCisJfQ0KKwkvLyBzZXQgbWVtb3J5IG9wZXJhdG9yczsNCisJbW9wZXIuQWxsb2MgPSBjbW5NZW1BbGxvYzsNCisJbW9wZXIuQ29weSA9IGNtbk1lbUNvcHk7DQorCW1vcGVyLkZyZWUgPSBjbW5NZW1GcmVlOw0KKwltb3Blci5TZXQgPSBjbW5NZW1TZXQ7DQorCW1vcGVyLkNoZWNrID0gY21uTWVtQ2hlY2s7DQorCXVzZURhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7DQorCXVzZURhdGEubWVtRGF0YSA9IChWT19QVFIpKCZtb3Blcik7DQorCS8vIG9wZW4gZW5jb2RlciBkbGw7DQorCWhhbmRsZSA9IGRsb3BlbigiL2RhdGEvbG9jYWwvdG1wL2xpYnZvQUFDRW5jdjcuc28iLCBSVExEX05PVyk7DQorCWlmKGhhbmRsZSA9PSAwKQ0KKwl7DQorCQlwcmludGYoIm9wZW4gZGxsIGVycm9yLi4uLi4uIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJLy8gR2V0IEFQSTsNCisJcGZ1bmMgPSBkbHN5bShoYW5kbGUsICJ2b0dldEFBQ0VuY0FQSSIpOwkNCisJaWYocGZ1bmMgPT0gMCkNCisJew0KKwkJcHJpbnRmKCJvcGVuIGZ1bmN0aW9uIGVycm9yLi4uLi4uIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisJcEdldEFQSSA9IChWT0dFVEFVRElPREVDQVBJKXBmdW5jOw0KKwlyZXR1cm5Db2RlICA9IHBHZXRBUEkoJkF1ZGlvQVBJKTsNCisJaWYocmV0dXJuQ29kZSkNCisJCXJldHVybiAtMTsNCisNCisNCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIEluaXQgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorCXJldHVybkNvZGUgPSBBdWRpb0FQSS5Jbml0KCZoQ29kZWMsIFZPX0FVRElPX0NvZGluZ0FBQywgJnVzZURhdGEpOw0KKwlpZihyZXR1cm5Db2RlIDwgMCkNCisJew0KKwkJcHJpbnRmKCIjIyMjIFZPSV9FcnJvcjI6ZmFpbCB0byBpbml0aWFsaXplIHRoZSBFbmNvZGVyciMjI1xuIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLlNldFBhcmFtKGhDb2RlYywgVk9fUElEX0FBQ19FTkNQQVJBTSwgJmFhY3BhcmEpOwkNCisJDQorCWluRGF0YS5CdWZmZXIgPSBpbkJ1ZjsNCisJYnl0ZXNMZWZ0ID0gUmVhZEZpbGUyQnVmKGluZmlsZSxpbkRhdGEuQnVmZmVyLFJFQURfU0laRSk7DQorDQorLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgRW5jb2RpbmcgU2VjdGlvbiAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorCQ0KKwlkbyB7DQorDQorCQlpbkRhdGEuTGVuZ3RoICAgID0gYnl0ZXNMZWZ0Ow0KKwkJb3V0RGF0YS5CdWZmZXIgICA9IG91dEJ1ZjsNCisJCW91dERhdGEuTGVuZ3RoID0gMTAyNCo4Ow0KKw0KKwkJdDEgPSBjbG9jaygpOw0KKwkJDQorCQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0SW5wdXREYXRhKGhDb2RlYywmaW5EYXRhKTsNCisJCQ0KKwkJZG8gew0KKwkJCW91dERhdGEuQnVmZmVyICAgPSBvdXRCdWY7DQorCQkJb3V0RGF0YS5MZW5ndGggPSAxMDI0Kjg7DQorDQorCQkJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLkdldE91dHB1dERhdGEoaENvZGVjLCZvdXREYXRhLCAmb3V0SW5mbyk7DQorDQorCQkJaWYocmV0dXJuQ29kZSA9PSAwKQ0KKwkJCQlFbmNvZGVyZEZyYW1lKys7DQorCQkJaWYocmV0dXJuQ29kZSA9PSBWT19FUlJfTElDRU5TRV9FUlJPUikNCisJCQkJYnJlYWs7DQorDQorI2lmIFZPX0FBQ19FX09VVFBVVA0KKwkJCWlmIChpc091dHB1dCAmJiByZXR1cm5Db2RlID09IDApDQorCQkJew0KKwkJCQlmd3JpdGUob3V0RGF0YS5CdWZmZXIsIDEsIG91dERhdGEuTGVuZ3RoLCBvdXRmaWxlKTsNCisJCQl9DQorI2VuZGlmDQorCQl9IHdoaWxlKHJldHVybkNvZGUgIT0gKFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwpKTsNCisNCisJCWlmKHJldHVybkNvZGUgPT0gVk9fRVJSX0xJQ0VOU0VfRVJST1IpDQorCQkJYnJlYWs7DQorDQorCQl0MiA9IGNsb2NrKCk7DQorCQl0b3RhbCArPSB0MiAtIHQxOw0KKw0KKwkJaWYgKCFlb2ZGaWxlKSB7DQorCQkJblJlYWQgPSBSZWFkRmlsZTJCdWYoaW5maWxlLCBpbkJ1ZixSRUFEX1NJWkUpOw0KKwkJCWJ5dGVzTGVmdCA9IG5SZWFkOw0KKwkJCWluRGF0YS5CdWZmZXIgPSBpbkJ1ZjsNCisJCQlpZiAoZmVvZihpbmZpbGUpKQ0KKwkJCQllb2ZGaWxlID0gMTsNCisJCX0NCisNCisJfSB3aGlsZSAoIWVvZkZpbGUgJiYgcmV0dXJuQ29kZSk7DQorDQorDQorLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIEVuZCBFbmNvZGluZyBTZWN0aW9uICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorCXJldHVybkNvZGUgPSBBdWRpb0FQSS5VbmluaXQoaENvZGVjKTsNCisNCisJZmNsb3NlKGluZmlsZSk7DQorCWlmIChvdXRmaWxlKQ0KKyAgICB7DQorICAgICAgICBmY2xvc2Uob3V0ZmlsZSk7DQorICAgIH0NCisJZGxjbG9zZShoYW5kbGUpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmM5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAJQUFDX0VfU0FNUExFUy5jCisJCitMT0NBTF9TUkNfRklMRVMgKz0gCVwKKwkuLi8uLi8uLi9Db21tb24vY21uTWVtb3J5LmMgCisKK0xPQ0FMX01PRFVMRSA6PSBUZXN0dm9BQUNFbmMKKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlidm9BQUNFbmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS8gXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vQ29tbW9uIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL0luY2x1ZGUgXAorCitMT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCisJCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9lY2xhaXIvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzVkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlCkBAIC0wLDAgKzEsNTUgQEAKKyMvKg0KKyMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyMqKg0KKyMqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyMqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjKioNCisjKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMqKg0KKyMqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyMqLw0KKw0KKyMgdGFyZ2V0Ng0KKyMgYXZhaWxhYmxlOiBwYywgdjQoYXJtdjQpLCB2NShhcm12NSksIHY1eChhcm12NSB4c2NhbGUpLCB2Nihhcm12NiksIHY3KGNvcnRleC1hOCBuZW9uKQ0KK1ZPVFQ6PSB2Nw0KKw0KKw0KKyMgbW9kdWxlIHR5cGUNCisjIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlDQorVk9NVDo9IGV4ZQ0KKw0KKw0KKyMgbW9kdWxlIG1hY3Jvcw0KKyMgcGxlYXNlIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBtYWNybyBkZWZpbml0aW9ucyBoZXJlIGZvciB5b3VyIG1vZHVsZSBpZiBuZWNlc3NhcnkuIA0KKyMgZS5nLiAtRFZJU1VBTE9OLCBtYWNybyBWSVNVQUxPTiBkZWZpbmVkIGZvciB5b3VyIG1vZHVsZSANCitWT01NOj0gI0FSTVY1RQ0KKw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCitWT1RBUkdFVDo9IHZvQUFDRW5jVGVzdHY3DQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsgDQorDQorIyBkZXBlbmRlbnQgbGlicmFyaWVzLg0KK1ZPREVQTElCUzo9LWxkbA0KKw0KKyMgbW9kdWxlIHNvdXJjZQ0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlDQoraW5jbHVkZSAuLi9tcy5taw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZA0KK1ZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi9SZWxlYXNlLw0KKw0KKw0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi9Ub29scy9kb2l0Lm1rIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU2FtcGxlQ29kZS9tcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFhNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9TYW1wbGVDb2RlL21zLm1rCkBAIC0wLDAgKzEsMjMgQEAKKyMvKg0KKyMqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyMqKg0KKyMqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyMqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjKioNCisjKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMqKg0KKyMqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyMqLw0KKw0KKyMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUNCitPQkpTOj1BQUNfRV9TQU1QTEVTLm8JY21uTWVtb3J5Lm8NCisJCQkNCisjIHBsZWFzZSBsaXN0IGFsbCBkaXJlY3RvcmllcyB0aGF0IGFsbCBzb3VyY2UgZmlsZXMgcmVsYXRpdmUgd2l0aCB5b3VyIG1vZHVsZSguaCAuYyAuY3BwKSBsb2NhdGUgDQorVk9TUkNESVI6PS4uLyAuLi8uLi8uLi8uLi9pbmNsdWRlICAuLi8uLi8uLi8uLi9Db21tb24NCisJCQkJCQ0KKwkJCQkNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2RvaXQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2RvaXQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhMGIwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZG9pdC5tawpAQCAtMCwwICsxLDEzMyBAQAorIy8qCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisjICoqCisjICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAqKgorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICoqCisjICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjICovCisKK1ZFUkJPU0U6PUAKKworCitWT01UID89IGxpYgorCitpZmVxICgkKFZPTVQpLCBsaWIpCitMSUJfU1RBVElDPSQoVk9UQVJHRVQpLmEKK0xJQl9EWU5BTUlDPSQoVk9UQVJHRVQpLnNvCitlbmRpZgorCitpZmVxICgkKFZPTVQpLCBleGUpCitUQVJHRVQ9JChWT1RBUkdFVCkKK2VuZGlmCisKK0NGTEFHUz0kKFZPQ0ZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpIAorQ1BQRkxBR1M9JChWT0NQUEZMQUdTKSAkKGFkZHByZWZpeCAtSSwgJChWT1NSQ0RJUikpIAoraWZuZXEgKCQoVk9UVCksIHBjKQorQVNGTEFHUz0kKFZPQVNGTEFHUykgJChhZGRwcmVmaXggLUksICQoVk9TUkNESVIpKSAKK2VuZGlmCisKK0xERkxBR1M6PSQoVk9MREZMQUdTKQorVk9URURFUFMrPSQoVk9ERVBMSUJTKQorVk9UTERFUFMrPSQoVk9ERVBMSUJTKQorVk9TVENMSUJTID89CisKK3ZwYXRoICUuYyAkKFZPU1JDRElSKQordnBhdGggJS5jcHAgJChWT1NSQ0RJUikKK2lmbmVxICgkKFZPVFQpLCBwYykKK3ZwYXRoICUucyAkKFZPU1JDRElSKQorZW5kaWYKKworaWZlcSAoJChWT1RUKSwgcGMpCitCTFRESVJTPSQoVk9SRUxESVIpL0xpbnV4L3N0YXRpYworQkxURElSRD0kKFZPUkVMRElSKS9MaW51eC9zaGFyZWQKK2Vsc2UKK0JMVERJUlM9JChWT1JFTERJUikvR29vZ2xlLyQoVk9OSikvbGliLyQoVk9UVCkKK0JMVERJUkQ9JChWT1JFTERJUikvR29vZ2xlLyQoVk9OSikvc28vJChWT1RUKQorZW5kaWYKKworCisuUFJFQ0lPVVM6ICQoT0JKRElSKS8lLm8KKworaWZlcSAoJChWT01UKSwgbGliKQorYWxsOiBta2RpcnMgJChMSUJfU1RBVElDKSAkKExJQl9EWU5BTUlDKQorbWtkaXJzOiAkKE9CSkRJUikgJChCTFRESVJTKSAkKEJMVERJUkQpCitlbHNlCithbGw6IG1rZGlycyAkKFRBUkdFVCkKK21rZGlyczogJChPQkpESVIpCitlbmRpZgorCiskKE9CSkRJUik6CisJQGlmIHRlc3QgISAtZCAkQDsgdGhlbiBcCisJCW1rZGlyIC1wICRAOyBcCisJZmk7CisKK2lmZXEgKCQoVk9NVCksIGxpYikKKyQoQkxURElSUyk6CisJQGlmIHRlc3QgISAtZCAkQDsgdGhlbiBcCisJCW1rZGlyIC1wICRAOyBcCisJZmk7CiskKEJMVERJUkQpOgorCUBpZiB0ZXN0ICEgLWQgJEA7IHRoZW4gXAorCQlta2RpciAtcCAkQDsgXAorCWZpOworZW5kaWYKKworCitpZmVxICgkKFZPTVQpLCBsaWIpCiskKExJQl9TVEFUSUMpOiQoT0JKUykKKwkkKEFSKSBjciAkQCAkKE9CSkRJUikvKi5vICQoVk9TVENMSUJTKQorCSQoUkFOTElCKSAkQAoraWZuZXEgKCQoVk9EQkcpLCB5ZXMpCisJIyQoU1RSSVApICRACitlbmRpZgorCiskKExJQl9EWU5BTUlDKTokKE9CSlMpCisJJChHRykgJChMREZMQUdTKSAtbyAkQCAkKE9CSkRJUikvKi5vIC1XbCwtLXdob2xlLWFyY2hpdmUgJChWT1NUQ0xJQlMpIC1XbCwtLW5vLXdob2xlLWFyY2hpdmUgJChWT1RMREVQUykgCitpZm5lcSAoJChWT0RCRyksIHllcykKKwkJJChTVFJJUCkgJEAKK2VuZGlmCisKK2Vsc2UKKworJChUQVJHRVQpOiQoT0JKUykKKwkkKEdHKSAkKExERkxBR1MpIC1vICRAICQoT0JKRElSKS8qLm8gLVdsLC0td2hvbGUtYXJjaGl2ZSAkKFZPU1RDTElCUykgLVdsLC0tbm8td2hvbGUtYXJjaGl2ZSAkKFZPVEVERVBTKQoraWZuZXEgKCQoVk9EQkcpLCB5ZXMpCisJJChTVFJJUCkgJEAKK2VuZGlmCisKK2VuZGlmCisKKworLlNVRkZJWEVTOiAuYyAuY3BwIC5zIC5vCisuYy5vOgorCSQoVkVSQk9TRSkgJChDQykgJChDRkxBR1MpIC1vICQoT0JKRElSKS8kQCAtYyAkPAorIyUuYzokKE9CSkRJUikvJS5vCisjCSQoVkVSQk9TRSkgJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQ8CisuY3BwLm86CisJJChWRVJCT1NFKSAkKEdHKSAkKENQUEZMQUdTKSAtbyAkKE9CSkRJUikvJEAgLWMgJDwKK2lmbmVxICgkKFZPVFQpLCBwYykKKy5zLm86CisJJChWRVJCT1NFKSAkKEFTKSAkKEFTRkxBR1MpIC1vICQoT0JKRElSKS8kQCAkPAorZW5kaWYKKworCisuUEhPTlk6IGNsZWFuIGRldmVsCitjbGVhbjoKK2lmZXEgKCQoVk9NVCksIGxpYikKKwktcm0gLWZyICQoT0JKRElSKSAuKi5zdyogJChWT1RBUkdFVCkuKgorZWxzZQorCS1ybSAtZnIgJChPQkpESVIpIC4qLnN3KiAkKFZPVEFSR0VUKQorZW5kaWYKKworZGV2ZWw6CisJY3AgLWEgJChMSUJfU1RBVElDKSAkKEJMVERJUlMpCisJY3AgLWEgJChMSUJfRFlOQU1JQykgJChCTFRESVJEKQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2VjbGFpci5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvVG9vbHMvZWNsYWlyLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODgzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1Rvb2xzL2VjbGFpci5tawpAQCAtMCwwICsxLDE3MiBAQAorIy8qCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisjICoqCisjICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAqKgorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICoqCisjICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjICovCisKKyMgc3BlY2lhbCBtYWNybyBkZWZpbml0aW9ucyBmb3IgYnVpbGRpbmcgCitWT1BSRURFRj0tRExJTlVYIC1EX0xJTlVYIAorCitWT1BSSiA/PSAKK1ZPTkogPz0gZWNsYWlyCitWT1RUID89IHY2CisjIGNvbnRyb2wgdGhlIHZlcnNpb24gdG8gcmVsZWFzZSBvdXQKKyMgYXZhaWxhYmxlOiBldmEoZXZhbHVhdGlvbiksIHJlbChyZWxlYXNlKQorVk9WRVI9CitpZmVxICgkKFZPVkVSKSwgZXZhKQorVk9QUkVERUYrPS1EX19WT1ZFUl9FVkFfXworZW5kaWYKKworIyBmb3IgZGVidWcgb3Igbm90OiB5ZXMgZm9yIGRlYnVnLCBhbnkgb3RoZXIgZm9yIHJlbGVhc2UKK1ZPREJHPz15ZQorCisjIGZvciBkZXRlY3RpbmcgbWVtb3J5IGxlYWsKK1ZPRE1MPQoraWZlcSAoJChWT0RNTCksIHllcykKK1ZPUFJFREVGKz0tRERNRU1MRUFLCitlbmRpZgorCitWT1BSRURFRis9LURfX1ZPVFRfQVJNX18gLURfX1ZPTkpfRUNMQUlSX18KK1RDUk9PVFBBVEg6PS9vcHQvZWNsYWlyCitHQ0NWRVI6PTQuNC4wCitUQ1BBVEg6PSQoVENST09UUEFUSCkvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS0kKEdDQ1ZFUikKK0NDVFBSRTo9JChUQ1BBVEgpL2Jpbi9hcm0tZWFiaS0KK0FTOj0kKENDVFBSRSlhcworQVI6PSQoQ0NUUFJFKWFyCitOTTo9JChDQ1RQUkUpbm0KK0NDOj0kKENDVFBSRSlnY2MKK0dHOj0kKENDVFBSRSlnKysKK0xEOj0kKENDVFBSRSlsZAorU0laRTo9JChDQ1RQUkUpc2l6ZQorU1RSSVA6PSQoQ0NUUFJFKXN0cmlwCitSQU5MSUI6PSQoQ0NUUFJFKXJhbmxpYgorT0JKQ09QWTo9JChDQ1RQUkUpb2JqY29weQorT0JKRFVNUDo9JChDQ1RQUkUpb2JqZHVtcAorUkVBREVMRjo9JChDQ1RQUkUpcmVhZGVsZgorU1RSSU5HUzo9JChDQ1RQUkUpc3RyaW5ncworCisjIHRhcmdldCBwcm9kdWN0IGRlcGVuZGN5CisjIGF2YWlsYWJsZTogZHJlYW0sIGdlbmVyaWMKK1ZPVFA6PXNhcHBoaXJlLW9wZW4KK0NDVExJQjo9JChUQ1JPT1RQQVRIKS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJChWT1RQKS9vYmovbGliCitDQ1RJTkM6PS1JJChUQ1JPT1RQQVRIKS9zeXN0ZW0vY29yZS9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2hhcmR3YXJlL3JpbC9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9kYWx2aWsvbGlibmF0aXZlaGVscGVyL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9kYWx2aWsvbGlibmF0aXZlaGVscGVyL2luY2x1ZGUvbmF0aXZlaGVscGVyIFwKKwktSSQoVENST09UUEFUSCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9mcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkgXAorCS1JJChUQ1JPT1RQQVRIKS9mcmFtZXdvcmtzL2Jhc2UvbGlicy9hdWRpb2ZsaW5nZXIgXAorCS1JJChUQ1JPT1RQQVRIKS9leHRlcm5hbC9za2lhL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJChWT1RQKS9vYmovaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJjL2FyY2gtYXJtL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGliYy9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKKwktSSQoVENST09UUEFUSCkvYmlvbmljL2xpYmMva2VybmVsL2NvbW1vbiBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJjL2tlcm5lbC9hcmNoLWFybSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJtL2luY2x1ZGUgXAorCS1JJChUQ1JPT1RQQVRIKS9iaW9uaWMvbGlibS9pbmNsdWRlL2FybSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJ0aHJlYWRfZGIvaW5jbHVkZSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJtL2FybSBcCisJLUkkKFRDUk9PVFBBVEgpL2Jpb25pYy9saWJtIFwKKwktSSQoVENST09UUEFUSCkvZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lIAorCSMtSSQoVENST09UUEFUSCkvb3V0L3RhcmdldC9wcm9kdWN0LyQoVk9UUCkvb2JqL1NIQVJFRF9MSUJSQVJJRVMvbGlibV9pbnRlcm1lZGlhdGVzCisKK0NDVENGTEFHUzo9LW1zb2Z0LWZsb2F0IC1tdGh1bWItaW50ZXJ3b3JrIC1mbm8tZXhjZXB0aW9ucyAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mdW53aW5kLXRhYmxlcyAtZnN0YWNrLXByb3RlY3RvciAtZm5vLXNob3J0LWVudW1zIC1mbWVzc2FnZS1sZW5ndGg9MCAtZmlubGluZS1mdW5jdGlvbnMgLWZpbmxpbmUtbGltaXQ9NjAwIC1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSAtZmdjc2UtYWZ0ZXItcmVsb2FkIC1mcmVydW4tY3NlLWFmdGVyLWxvb3AgLWZyZW5hbWUtcmVnaXN0ZXJzIC1mc3RyaWN0LWFsaWFzaW5nIC1mdW5zd2l0Y2gtbG9vcHMKKyMtZndpZGUtZXhlYy1jaGFyc2V0PWNoYXJzZXQ9VVRGLTMyIAorCisjIGZvciB0YXJnZXQgZXhlCitURUxERkxBR1M6PS1ub3N0ZGxpYiAtQmR5bmFtaWMgLVdsLC1ULCQoVENST09UUEFUSCkvYnVpbGQvY29yZS9hcm1lbGYueCAtV2wsLWR5bmFtaWMtbGlua2VyLC9zeXN0ZW0vYmluL2xpbmtlciAtV2wsLS1nYy1zZWN0aW9ucyAtV2wsLXosbm9jb3B5cmVsb2MgLVdsLC0tbm8tdW5kZWZpbmVkIC1XbCwtcnBhdGgtbGluaz0kKENDVExJQikgLUwkKENDVExJQikgCisKK1ZPVEVERVBTOj0kKENDVExJQikvY3J0YmVnaW5fZHluYW1pYy5vICQoQ0NUTElCKS9jcnRlbmRfYW5kcm9pZC5vICQoVENQQVRIKS9saWIvZ2NjL2FybS1lYWJpLyQoR0NDVkVSKS9pbnRlcndvcmsvbGliZ2NjLmEgLWxjIC1sbQorCisjIGZvciB0YXJnZXQgbGliCitUTExERkxBR1M6PS1ub3N0ZGxpYiAtV2wsLVQsJChUQ1JPT1RQQVRIKS9idWlsZC9jb3JlL2FybWVsZi54c2MgLVdsLC0tZ2Mtc2VjdGlvbnMgLVdsLC1zaGFyZWQsLUJzeW1ib2xpYyAtTCQoQ0NUTElCKSAtV2wsLS1uby13aG9sZS1hcmNoaXZlIC1XbCwtLW5vLXVuZGVmaW5lZCAkKFRDUEFUSCkvbGliL2djYy9hcm0tZWFiaS8kKEdDQ1ZFUikvaW50ZXJ3b3JrL2xpYmdjYy5hIAorCitWT1RMREVQUzo9LWxtIC1sYworCisKK2lmZXEgKCQoVk9UVCksIHY0KQorVk9DRkxBR1M6PS1tdHVuZT1hcm05dGRtaSAtbWFyY2g9YXJtdjR0CitWT0FTRkxBR1M6PS1tYXJjaD1hcm12NHQgLW1mcHU9c29mdGZwYQorZW5kaWYKKworaWZlcSAoJChWT1RUKSwgdjUpCitWT0NGTEFHUzo9LW1hcmNoPWFybXY1dGUKK1ZPQVNGTEFHUzo9LW1hcmNoPWFybXY1dGUgLW1mcHU9dmZwCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCB2NXgpCitWT0NGTEFHUzo9LW1hcmNoPWFybXY1dGUgLW10dW5lPXhzY2FsZQorVk9BU0ZMQUdTOj0tbWFyY2g9YXJtdjV0ZSAtbWZwdT12ZnAKK2VuZGlmCisKK2lmZXEgKCQoVk9UVCksIHY2KQorI1ZPQ0ZMQUdTOj0tbWFyY2g9YXJtdjYgLW10dW5lPWFybTExMzZqZi1zIAorI1ZPQVNGTEFHUzo9LW1hcmNoPWFybXY2CitWT0NGTEFHUzo9LW1hcmNoPWFybXY2aiAtbXR1bmU9YXJtMTEzNmpmLXMgLW1mcHU9dmZwIC1tZmxvYXQtYWJpPXNvZnRmcCAtbWFwY3MgLW10cGNzLWxlYWYtZnJhbWUgLW1sb25nLWNhbGxzCitWT0FTRkxBR1M6PS1tYXJjaD1hcm12NmogLW1jcHU9YXJtMTEzNmpmLXMgLW1mcHU9YXJtMTEzNmpmLXMgLW1mbG9hdC1hYmk9c29mdGZwIC1tYXBjcy1mbG9hdCAtbWFwY3MtcmVlbnRyYW50CitlbmRpZgorCisjCisjIGdsb2JhbCBsaW5rIG9wdGlvbnMKK1ZPTERGTEFHUzo9LVdsLC14LC1YLC0tYXMtbmVlZGVkCisKKworaWZlcSAoJChWT1RUKSwgdjcpCitWT0NGTEFHUys9LW1hcmNoPWFybXY3LWEgLW10dW5lPWNvcnRleC1hOCAtbWZwdT1uZW9uIC1tZmxvYXQtYWJpPXNvZnRmcAorVk9BU0ZMQUdTKz0tbWFyY2g9YXJtdjctYSAtbWNwdT1jb3J0ZXgtYTggLW1mcHU9bmVvbiAtbWZsb2F0LWFiaT1zb2Z0ZnAKK1ZPTERGTEFHUys9LVdsLC0tZml4LWNvcnRleC1hOAorZW5kaWYKKworI2dsb2JhbCBjb21waWxpbmcgb3B0aW9ucyBmb3IgQVJNIHRhcmdldAoraWZuZXEgKCQoVk9UVCksIHBjKQorVk9BU0ZMQUdTKz0tLXN0cmlwLWxvY2FsLWFic29sdXRlIC1SCitlbmRpZiAKKworCitpZmVxICgkKFZPREJHKSwgeWVzKQorVk9DRkxBR1MrPS1EX0RFQlVHIC1nCitlbHNlCitWT0NGTEFHUys9LUROREVCVUcgLU8zCitlbmRpZgorCitWT0NGTEFHUys9JChWT1BSRURFRikgJChWT01NKSAtV2FsbCAtZnNpZ25lZC1jaGFyIC1mb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tbGVhZGluZy11bmRlcnNjb3JlIC1mcGljIC1mUElDIC1waXBlIC1mdHJhY2VyIC1mZm9yY2UtYWRkciAtZm5vLWJvdW5kcy1jaGVjayAjLWZ2aXNpYmlsaXR5PWhpZGRlbiAjLWZ2aXNpYmlsaXR5LWlubGluZXMtaGlkZGVuICMjLWZ0cmVlLWxvb3AtbGluZWFyICAtbXRodW1iIC1ub3N0ZGluYyAgLWREIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMKKworCitpZm5lcSAoJChWT1RUKSwgcGMpCitWT0NGTEFHUys9JChDQ1RDRkxBR1MpICQoQ0NUSU5DKQorVk9DUFBGTEFHUzo9LWZuby1ydHRpICQoVk9DRkxBR1MpCisKK2lmZXEgKCQoVk9NVCksIGV4ZSkKK1ZPTERGTEFHUys9JChURUxERkxBR1MpCitlbmRpZgorCitpZmVxICgkKFZPTVQpLCBsaWIpCitWT0xERkxBR1MrPSQoVExMREZMQUdTKQorZW5kaWYKK2Vsc2UKK1ZPQ1BQRkxBR1M6PSQoVk9DRkxBR1MpCitpZmVxICgkKFZPTVQpLCBsaWIpCitWT0xERkxBR1MrPS1zaGFyZWQKK2VuZGlmCitlbmRpZgorCitpZmVxICgkKFZPREJHKSwgeWVzKQorI1ZPTERGTEFHUzo9CitlbmRpZgorCisjIHdoZXJlIHRvIHBsYWNlIG9iamVjdCBmaWxlcyAKK09CSkRJUj1vYmoKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9iYXNpY19vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTdmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljX29wLmgKQEAgLTAsMCArMSwxMTY2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliYXNpY29wMi5oDQorDQorCUNvbnRlbnQ6CUNvbnN0YW50cyAsIEdsb2JhbHMgYW5kIEJhc2ljIGFyaXRobWV0aWMgb3BlcmF0b3JzLg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19CQVNJQ19PUF9ICisjZGVmaW5lIF9fQkFTSUNfT1BfSA0KKworI2luY2x1ZGUgInR5cGVkZWYuaCIKKworI2RlZmluZSBNQVhfMzIgKFdvcmQzMikweDdmZmZmZmZmTAorI2RlZmluZSBNSU5fMzIgKFdvcmQzMikweDgwMDAwMDAwTAorCisjZGVmaW5lIE1BWF8xNiAoV29yZDE2KTB4N2ZmZgorI2RlZmluZSBNSU5fMTYgKFdvcmQxNikweDgwMDAKKyNkZWZpbmUgQUJTKGEpCSgoYSkgPj0gMCkgPyAoYSkgOiAoLShhKSkNCisNCisvKiBTaG9ydCBhYnMsICAgICAgICAgICAxICAgKi8NCisjZGVmaW5lIGFic19zKHgpICAgICAgICgoV29yZDE2KSgoKHgpICE9IE1JTl8xNikgPyAoKCh4KSA+PSAwKSA/ICh4KSA6ICgtKHgpKSkgOiBNQVhfMTYpKQ0KKw0KKy8qIDE2IGJpdCB2YXIxIC0+IE1TQiwgICAgIDIgKi8NCisjZGVmaW5lIExfZGVwb3NpdF9oKHgpICgoKFdvcmQzMikoeCkpIDw8IDE2KQ0KKw0KKw0KKy8qIDE2IGJpdCB2YXIxIC0+IExTQiwgICAgIDIgKi8NCisjZGVmaW5lIExfZGVwb3NpdF9sKHgpICgoV29yZDMyKSh4KSkNCisNCisNCisvKiBMb25nIGFicywgICAgICAgICAgICAgIDMgICovDQorI2RlZmluZSBMX2Ficyh4KSAoKCh4KSAhPSBNSU5fMzIpID8gKCgoeCkgPj0gMCkgPyAoeCkgOiAoLSh4KSkpIDogTUFYXzMyKQ0KKw0KKw0KKy8qIFNob3J0IG5lZ2F0ZSwgICAgICAgIDEgICAqLw0KKyNkZWZpbmUgbmVnYXRlKHZhcjEpICgoV29yZDE2KSgoKHZhcjEpID09IE1JTl8xNikgPyBNQVhfMTYgOiAoLSh2YXIxKSkpKQ0KKw0KKw0KKy8qIExvbmcgbmVnYXRlLCAgICAgMiAqLw0KKyNkZWZpbmUgTF9uZWdhdGUoTF92YXIxKSAoKChMX3ZhcjEpID09IChNSU5fMzIpKSA/IChNQVhfMzIpIDogKC0oTF92YXIxKSkpDQorDQorDQorI2RlZmluZSBNVUxISUdIKEEsQikgKGludCkoKChXb3JkNjQpKEEpKihXb3JkNjQpKEIpKSA+PiAzMikNCisjZGVmaW5lIGZpeG11bChhLCBiKSAoaW50KSgoKChXb3JkNjQpKGEpKihXb3JkNjQpKGIpKSA+PiAzMikgPDwgMSkNCisNCisNCisjaWYgIChTQVRSVUFURV9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpOw0KKyNlbHNlDQorV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpOw0KKyNlbmRpZg0KKw0KKy8qIFNob3J0IHNoaWZ0IGxlZnQsICAgIDEgICAqLw0KKyNpZiAoU0hMX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBTaG9ydCBzaGlmdCByaWdodCwgICAxICAgKi8NCisjaWYgKFNIUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHNociAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorI2lmIChMX01VTFRfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQzMiBMX211bHQoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBNc3UsICAxICAqLw0KKyNpZiAoTF9NU1VfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX21zdSAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQzMiBMX21zdSAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisgICAgDQorLyogTG9uZyBzdWIsICAgICAgICAyICovDQorI2lmIChMX1NVQl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOw0KKyNlbHNlDQorV29yZDMyIExfc3ViKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIExvbmcgc2hpZnQgbGVmdCwgMiAqLw0KKyNpZiAoTF9TSExfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX3NobCAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorLyogTG9uZyBzaGlmdCByaWdodCwgMiovDQorI2lmIChMX1NIUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMzIgTF9zaHIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBTaG9ydCBhZGQsICAgICAgICAgICAxICAgKi8NCisjaWYgKEFERF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBhZGQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorICAgIA0KKy8qIFNob3J0IHN1YiwgICAgICAgICAgIDEgICAqLw0KKyNpZiAoU1VCX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc3ViKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMTYgc3ViKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorLyogU2hvcnQgZGl2aXNpb24sICAgICAgIDE4ICAqLw0KKyNpZiAoRElWX1NfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBTaG9ydCBtdWx0LCAgICAgICAgICAxICAgKi8NCisjaWYgKE1VTFRfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorLyogU2hvcnQgbm9ybSwgICAgICAgICAgIDE1ICAqLw0KKyNpZiAoTk9STV9TX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSk7DQorI2Vsc2UNCitXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSk7DQorI2VuZGlmDQorDQorLyogTG9uZyBub3JtLCAgICAgICAgICAgIDMwICAqLw0KKyNpZiAoTk9STV9MX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKTsNCisjZWxzZQ0KK1dvcmQxNiBub3JtX2wgKFdvcmQzMiBMX3ZhcjEpOw0KKyNlbmRpZg0KKw0KKy8qIFJvdW5kLCAgICAgICAgICAgICAgIDEgICAqLw0KKyNpZiAoUk9VTkRfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiByb3VuZDE2KFdvcmQzMiBMX3ZhcjEpOw0KKyNlbHNlDQorV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSk7DQorI2VuZGlmDQorDQorLyogTWFjLCAgMSAgKi8NCisjaWYgKExfTUFDX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorI2lmIChMX0FERF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfYWRkIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsNCisjZWxzZQ0KK1dvcmQzMiBMX2FkZCAoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMik7DQorI2VuZGlmDQorDQorLyogRXh0cmFjdCBoaWdoLCAgICAgICAgMSAgICovDQorI2lmIChFWFRSQUNUX0hfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpOw0KKyNlbHNlDQorV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSk7DQorI2VuZGlmDQorDQorLyogRXh0cmFjdCBsb3csICAgICAgICAgMSAgICovDQorI2lmIChFWFRSQUNUX0xfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSk7DQorI2Vsc2UNCitXb3JkMTYgZXh0cmFjdF9sKFdvcmQzMiBMX3ZhcjEpOw0KKyNlbmRpZg0KKw0KKy8qIE11bHQgd2l0aCByb3VuZCwgMiAqLw0KKyNpZiAoTVVMVF9SX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbXVsdF9yKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMTYgbXVsdF9yKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorLyogU2hpZnQgcmlnaHQgd2l0aCByb3VuZCwgMiAgICAgICAgICAgKi8NCisjaWYgKFNIUl9SX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7DQorI2VuZGlmDQorDQorLyogTWFjIHdpdGggcm91bmRpbmcsMiAqLw0KKyNpZiAoTUFDX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZWxzZQ0KK1dvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsNCisjZW5kaWYNCisNCisvKiBNc3Ugd2l0aCByb3VuZGluZywyICovDQorI2lmIChNU1VfUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbHNlDQorV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKy8qIExvbmcgc2hpZnQgcmlnaHQgd2l0aCByb3VuZCwgIDMgICAgICAgICAgICAgKi8NCisjaWYgKExfU0hSX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7DQorI2Vsc2UNCitXb3JkMzIgTF9zaHJfciAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOw0KKyNlbmRpZg0KKw0KKyNpZiBBUk1WNF9JTkFTTQ0KK19faW5saW5lIFdvcmQzMiBBU01fTF9zaHIoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMzIgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJNT1YgJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTUiAlW3ZhcjJdIFxuIiANCisJCTpbcmVzdWx0XSI9ciIocmVzdWx0KQ0KKwkJOltMX3ZhcjFdInIiKExfdmFyMSksIFt2YXIyXSJyIih2YXIyKQ0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7CQ0KK30NCisgDQorX19pbmxpbmUgV29yZDMyIEFTTV9MX3NobChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIk1PVglyMiwgJVtMX3ZhcjFdIFxuIg0KKwkJIk1PVglyMywgIzB4N2ZmZmZmZmZcbiINCisJCSJNT1YJJVtyZXN1bHRdLCAlW0xfdmFyMV0sIEFTTCAlW3ZhcjJdIFxuIiANCisJCSJURVEJcjIsICVbcmVzdWx0XSwgQVNSICVbdmFyMl1cbiINCisJCSJFT1JORSAgJVtyZXN1bHRdLHIzLHIyLEFTUiMzMVxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQk6InIyIiwgInIzIg0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7CQ0KK30NCisNCitfX2lubGluZSBXb3JkMzIgQVNNX3NocihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIkNNUAklW3ZhcjJdLCAjMTVcbiINCisJCSJNT1ZHRSAgJVt2YXIyXSwgIzE1XG4iDQorCQkiTU9WCSVbcmVzdWx0XSwgJVtMX3ZhcjFdLCBBU1IgJVt2YXIyXVxuIg0KKwkJOltyZXN1bHRdIj1yIihyZXN1bHQpDQorCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW3ZhcjJdInIiKHZhcjIpIA0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7CQ0KK30gDQorDQorX19pbmxpbmUgV29yZDMyIEFTTV9zaGwoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMzIgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJDTVAJJVt2YXIyXSwgIzE2XG4iDQorCQkiTU9WR0UgICVbdmFyMl0sICMxNlxuIg0KKwkJIk1PViAgICAlW3Jlc3VsdF0sICVbTF92YXIxXSwgQVNMICVbdmFyMl1cbiINCisJCSJNT1YgICAgcjMsICMxXG4iDQorICAgICAgICAiTU9WICAgIHIyLCAlW3Jlc3VsdF0sIEFTUiAjMTVcbiINCisgICAgICAgICJSU0IgICAgcjMscjMscjMsTFNMICMxNSBcbiINCisgICAgICAgICJURVEgICAgcjIsICVbcmVzdWx0XSwgQVNSICMzMSBcbiINCisgICAgICAgICJFT1JORSAgJVtyZXN1bHRdLCByMywgJVtyZXN1bHRdLEFTUiAjMzEiDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCToicjIiLCAicjMiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsJDQorfSANCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgZGVmaW5pdGlvbnMgZm9yIGlubGluZSBiYXNpYyBhcml0aG1ldGljIG9wZXJhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmIChTQVRSVUFURV9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHNhdHVyYXRlKFdvcmQzMiBMX3ZhcjEpDQorew0KKyNpZiBBUk1WNVRFX1NBVA0KKwlXb3JkMTYgcmVzdWx0Ow0KKwlhc20gdm9sYXRpbGUgKA0KKwkJIk1PVgklW3Jlc3VsdF0sICVbTF92YXIxXVxuIg0KKwkJIk1PVglyMywgIzFcbiINCisJCSJNT1YJcjIsJVtMX3ZhcjFdLEFTUiMxNVxuIg0KKwkJIlJTQglyMywgcjMsIHIzLCBMU0wgIzE1XG4iDQorCQkiVEVRCXIyLCVbTF92YXIxXSxBU1IjMzFcbiIJDQorCQkiRU9STkUJJVtyZXN1bHRdLHIzLCVbTF92YXIxXSxBU1IjMzFcbiINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOltMX3ZhcjFdInIiKExfdmFyMSkNCisJCToicjIiLCAicjMiCQkJDQorCSk7DQorDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIA0KKyAgICAvL3Zhcl9vdXQgPSAoTF92YXIxID4gKFdvcmQzMikwWDAwMDA3ZmZmTCkgPyAoTUFYXzE2KSA6ICgoTF92YXIxIDwgKFdvcmQzMikweGZmZmY4MDAwTCkgPyAoTUlOXzE2KSA6ICgoV29yZDE2KUxfdmFyMSkpOw0KKw0KKyAgICBpZiAoTF92YXIxID4gMFgwMDAwN2ZmZkwpDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBNQVhfMTY7DQorICAgIH0NCisgICAgZWxzZSBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBNSU5fMTY7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKExfdmFyMSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogU2hvcnQgc2hpZnQgbGVmdCwgICAgMSAgICovDQorI2lmIChTSExfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzaGwgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfU0hMDQorCWlmKHZhcjI+PTApDQorCXsNCisJCXJldHVybiBBU01fc2hsKCB2YXIxLCB2YXIyKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiBBU01fc2hyKCB2YXIxLCAtdmFyMik7DQorCX0NCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIHJlc3VsdDsNCisNCisgICAgaWYgKHZhcjIgPCAwKQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gc2hyICh2YXIxLCAoV29yZDE2KS12YXIyKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHJlc3VsdCA9IChXb3JkMzIpIHZhcjEgKigoV29yZDMyKSAxIDw8IHZhcjIpOw0KKw0KKyAgICAgICAgaWYgKCh2YXIyID4gMTUgJiYgdmFyMSAhPSAwKSB8fCAocmVzdWx0ICE9IChXb3JkMzIpICgoV29yZDE2KSByZXN1bHQpKSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPiAwKSA/IE1BWF8xNiA6IE1JTl8xNik7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFyX291dCA9IGV4dHJhY3RfbChyZXN1bHQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAodmFyX291dCk7DQorI2VuZGlmDQorfQ0KKyNlbmRpZg0KKw0KKy8qIFNob3J0IHNoaWZ0IHJpZ2h0LCAgIDEgICAqLw0KKyNpZiAoU0hSX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2hyIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyNpZiBBUk1WNVRFX1NIUg0KKwlpZih2YXIyPj0wKQ0KKwl7DQorCQlyZXR1cm4gIEFTTV9zaHIoIHZhcjEsIHZhcjIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmV0dXJuICBBU01fc2hsKCB2YXIxLCAtdmFyMik7DQorCX0NCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgaWYgKHZhcjIgPCAwKQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gc2hsICh2YXIxLCAoV29yZDE2KS12YXIyKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmICh2YXIyID49IDE1KQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA8IDApID8gLTEgOiAwKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAodmFyMSA8IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikofigofnZhcjEpID4+IHZhcjIpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKHZhcjEgPj4gdmFyMik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorI2VuZGlmDQorfQ0KKyNlbmRpZg0KKw0KKw0KKyNpZiAoTF9NVUxUX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTF9NVUxUDQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iIA0KKwkJIlFBREQgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICVbcmVzdWx0XSBcbiIgDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbdmFyMV0iciIodmFyMSksIFt2YXIyXSJyIih2YXIyKQ0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDMyIExfdmFyX291dDsNCisNCisgICAgTF92YXJfb3V0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsNCisNCisgICAgaWYgKExfdmFyX291dCAhPSAoV29yZDMyKSAweDQwMDAwMDAwTCkNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0IDw8PSAxOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0ID0gTUFYXzMyOw0KKyAgICB9DQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorI2lmIChMX01TVV9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyNpZiBBUk1WNVRFX0xfTVNVDQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIlNNVUxCQiAlW3Jlc3VsdF0sICVbdmFyMV0sICVbdmFyMl0gXG4iIA0KKwkJIlFBREQgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICVbcmVzdWx0XSBcbiINCisJCSJRU1VCICVbcmVzdWx0XSwgJVtMX3ZhcjNdLCAlW3Jlc3VsdF1cbiINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOltMX3ZhcjNdInIiKExfdmFyMyksIFt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9wcm9kdWN0Ow0KKw0KKyAgICBMX3Byb2R1Y3QgPSBMX211bHQodmFyMSwgdmFyMik7DQorICAgIExfdmFyX291dCA9IExfc3ViKExfdmFyMywgTF9wcm9kdWN0KTsNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisjaWYgKExfU1VCX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9zdWIoV29yZDMyIExfdmFyMSwgV29yZDMyIExfdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTF9TVUINCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiUVNVQiAlW3Jlc3VsdF0sICVbTF92YXIxXSwgJVtMX3ZhcjJdXG4iDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpLCBbTF92YXIyXSJyIihMX3ZhcjIpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgLSBMX3ZhcjI7DQorDQorICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpICE9IDApDQorICAgIHsNCisgICAgICAgIGlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikNCisgICAgICAgIHsNCisgICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gTUlOXzMyIDogTUFYXzMyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorI2lmIChMX1NITF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfc2hsKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9MX1NITA0KKyAgICBpZih2YXIyPj0wKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gIEFTTV9MX3NobCggTF92YXIxLCB2YXIyKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHJldHVybiAgQVNNX0xfc2hyKCBMX3ZhcjEsIC12YXIyKTsNCisgICAgfQ0KKyNlbHNlDQorICAgIFdvcmQzMiBMX3Zhcl9vdXQgPSAwTDsNCisNCisgICAgaWYgKHZhcjIgPD0gMCkNCisgICAgew0KKyAgICAgICAgTF92YXIxID0gTF9zaHIoTF92YXIxLCAoV29yZDE2KS12YXIyKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGZvciAoOyB2YXIyID4gMDsgdmFyMi0tKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBNQVhfMzI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1JTl8zMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBMX3ZhcjEgPDw9IDE7DQorICAgICAgICAgICAgTF92YXJfb3V0ID0gTF92YXIxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAoTF92YXIxKTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorI2lmIChMX1NIUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTF9TSFINCisJaWYodmFyMj49MCkNCisJew0KKwkJcmV0dXJuIEFTTV9MX3NociggTF92YXIxLCB2YXIyKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCXJldHVybiBBU01fTF9zaGwoIExfdmFyMSwgLXZhcjIpOw0KKwl9DQorI2Vsc2UNCisgICAgV29yZDMyIExfdmFyX291dDsNCisNCisgICAgaWYgKHZhcjIgPCAwKQ0KKyAgICB7DQorICAgICAgICBMX3Zhcl9vdXQgPSBMX3NobCAoTF92YXIxLCAoV29yZDE2KS12YXIyKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGlmICh2YXIyID49IDMxKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIExfdmFyX291dCA9IChMX3ZhcjEgPCAwTCkgPyAtMSA6IDA7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKExfdmFyMSA8IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3Zhcl9vdXQgPSB+KCh+TF92YXIxKSA+PiB2YXIyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTF92YXJfb3V0ID0gTF92YXIxID4+IHZhcjI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogU2hvcnQgYWRkLCAgICAgICAgICAgMSAgICovDQorI2lmIChBRERfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBhZGQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfQUREDQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIkFERCAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIiANCisJCSJNT1YgIHIzLCAjMHgxXG4iDQorCQkiTU9WICByMiwgJVtyZXN1bHRdLCBBU1IgIzE1XG4iDQorCQkiUlNCICByMywgcjMsIHIzLCBMU0wsICMxNVxuIg0KKwkJIlRFUSAgcjIsICVbcmVzdWx0XSwgQVNSICMzMVxuIg0KKwkJIkVPUk5FICVbcmVzdWx0XSwgcjMsICVbcmVzdWx0XSwgQVNSICMzMSINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQk6InIyIiwgInIzIg0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3N1bTsNCisNCisgICAgTF9zdW0gPSAoV29yZDMyKSB2YXIxICsgdmFyMjsNCisgICAgdmFyX291dCA9IHNhdHVyYXRlKExfc3VtKTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogU2hvcnQgc3ViLCAgICAgICAgICAgMSAgICovDQorI2lmIChTVUJfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisjaWYgQVJNVjVURV9TVUINCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiTU9WICAgcjMsICMxXG4iDQorCQkiU1VCICAgJVtyZXN1bHRdLCAlW3ZhcjFdLCAlW3ZhcjJdIFxuIgkJDQorCQkiUlNCICAgcjMscjMscjMsTFNMIzE1XG4iDQorCQkiTU9WICAgcjIsICVbdmFyMV0sIEFTUiAjMTUgXG4iIA0KKwkJIlRFUSAgIHIyLCAlW3ZhcjFdLCBBU1IgIzMxIFxuIg0KKwkJIkVPUk5FICVbcmVzdWx0XSwgcjMsICVbcmVzdWx0XSwgQVNSICMzMSBcbiINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQk6InIyIiwgInIzIg0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX2RpZmY7DQorDQorICAgIExfZGlmZiA9IChXb3JkMzIpIHZhcjEgLSB2YXIyOw0KKyAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9kaWZmKTsNCisgICANCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogU2hvcnQgZGl2aXNpb24sICAgICAgIDE4ICAqLw0KKyNpZiAoRElWX1NfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBkaXZfcyAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQgPSAwOw0KKyAgICBXb3JkMTYgaXRlcmF0aW9uOw0KKyAgICBXb3JkMzIgTF9udW07DQorICAgIFdvcmQzMiBMX2Rlbm9tOw0KKw0KKyAgICB2YXJfb3V0ID0gTUFYXzE2Ow0KKyAgICBpZiAodmFyMSE9IHZhcjIpLy92YXIxIT0gdmFyMg0KKyAgICB7DQorICAgIAl2YXJfb3V0ID0gMDsNCisgICAgCUxfbnVtID0gKFdvcmQzMikgdmFyMTsNCisgICAgDQorICAgIAlMX2Rlbm9tID0gKFdvcmQzMikgdmFyMjsNCisgICAgCQ0KKwkJLy9yZXR1cm4gKExfbnVtPDwxNSkvdmFyMjsNCisNCisgICAgCWZvciAoaXRlcmF0aW9uID0gMDsgaXRlcmF0aW9uIDwgMTU7IGl0ZXJhdGlvbisrKQ0KKyAgICAJew0KKyAgICAJCXZhcl9vdXQgPDw9IDE7DQorICAgIAkJTF9udW0gPDw9IDE7DQorICAgIAkJDQorICAgIAkJaWYgKExfbnVtID49IExfZGVub20pDQorICAgIAkJew0KKyAgICAJCQlMX251bSAtPSBMX2Rlbm9tOw0KKyAgICAJCQl2YXJfb3V0Kys7DQorICAgIAkJfQ0KKyAgICAJfQ0KKyAgICB9DQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qIFNob3J0IG11bHQsICAgICAgICAgIDEgICAqLw0KKyNpZiAoTVVMVF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTVVMVA0KKwlXb3JkMzIgcmVzdWx0OyANCisJYXNtIHZvbGF0aWxlKCANCisJCSJTTVVMQkIgcjIsICVbdmFyMV0sICVbdmFyMl0gXG4iDQorCQkiTU9WCXIzLCAjMVxuIg0KKwkJIk1PVgklW3Jlc3VsdF0sIHIyLCBBU1IgIzE1XG4iDQorCQkiUlNCCXIzLCByMywgcjMsIExTTCAjMTVcbiINCisJCSJNT1YJcjIsICVbcmVzdWx0XSwgQVNSICMxNVxuIg0KKwkJIlRFUQlyMiwgJVtyZXN1bHRdLCBBU1IgIzMxXG4iDQorCQkiRU9STkUgICVbcmVzdWx0XSwgcjMsICVbcmVzdWx0XSwgQVNSICMzMSBcbiINCisJCTpbcmVzdWx0XSIrciIocmVzdWx0KQ0KKwkJOlt2YXIxXSJyIih2YXIxKSwgW3ZhcjJdInIiKHZhcjIpDQorCQk6InIyIiwgInIzIg0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3Byb2R1Y3Q7DQorDQorICAgIExfcHJvZHVjdCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7DQorICAgIExfcHJvZHVjdCA9IChMX3Byb2R1Y3QgJiAoV29yZDMyKSAweGZmZmY4MDAwTCkgPj4gMTU7DQorICAgIGlmIChMX3Byb2R1Y3QgJiAoV29yZDMyKSAweDAwMDEwMDAwTCkNCisgICAgICAgIExfcHJvZHVjdCA9IExfcHJvZHVjdCB8IChXb3JkMzIpIDB4ZmZmZjAwMDBMOw0KKyAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0KTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorDQorLyogU2hvcnQgbm9ybSwgICAgICAgICAgIDE1ICAqLw0KKyNpZiAoTk9STV9TX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSkNCit7DQorI2lmIEFSTVY1VEVfTk9STV9TDQorCVdvcmQxNiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIk1PViAgIHIyLCVbdmFyMV0gXG4iDQorCQkiQ01QICAgcjIsICMwXG4iDQorCQkiUlNCTFQgJVt2YXIxXSwgJVt2YXIxXSwgIzAgXG4iDQorCQkiQ0xaTkUgJVtyZXN1bHRdLCAlW3ZhcjFdXG4iDQorCQkiU1VCTkUgJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICMxN1xuIg0KKwkJIk1PVkVRICVbcmVzdWx0XSwgIzBcbiINCisJCSJDTVAgICByMiwgIy0xXG4iDQorCQkiTU9WRVEgJVtyZXN1bHRdLCAjMTVcbiIgDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbdmFyMV0iciIodmFyMSkNCisJCToicjIiDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgaWYgKHZhcjEgPT0gMCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMSA9PSAtMSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gMTU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyMSA9IChXb3JkMTYpfnZhcjE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAodmFyX291dCA9IDA7IHZhcjEgPCAweDQwMDA7IHZhcl9vdXQrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcjEgPDw9IDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAodmFyX291dCk7DQorI2VuZGlmDQorfQ0KKyNlbmRpZg0KKw0KKy8qIExvbmcgbm9ybSwgICAgICAgICAgICAzMCAgKi8NCisjaWYgKE5PUk1fTF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSkNCit7DQorI2lmIEFSTVY1VEVfTk9STV9MDQorCVdvcmQxNiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIkNNUCAgICAlW0xfdmFyMV0sICMwXG4iDQorCQkiQ0xaTkUgICVbcmVzdWx0XSwgJVtMX3ZhcjFdXG4iDQorCQkiU1VCTkUgICVbcmVzdWx0XSwgJVtyZXN1bHRdLCAjMVxuIiANCisJCSJNT1ZFUSAgJVtyZXN1bHRdLCAjMFxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W0xfdmFyMV0iciIoTF92YXIxKQ0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgLy9Xb3JkMTYgdmFyX291dDsNCisNCisgICAgLy9pZiAoTF92YXIxID09IDApDQorICAgIC8vew0KKyAgICAvLyAgICB2YXJfb3V0ID0gMDsNCisgICAgLy99DQorICAgIC8vZWxzZQ0KKyAgICAvL3sNCisgICAgLy8gICAgaWYgKExfdmFyMSA9PSAoV29yZDMyKSAweGZmZmZmZmZmTCkNCisgICAgLy8gICAgew0KKyAgICAvLyAgICAgICAgdmFyX291dCA9IDMxOw0KKyAgICAvLyAgICB9DQorICAgIC8vICAgIGVsc2UNCisgICAgLy8gICAgew0KKyAgICAvLyAgICAgICAgaWYgKExfdmFyMSA8IDApDQorICAgIC8vICAgICAgICB7DQorICAgIC8vICAgICAgICAgICAgTF92YXIxID0gfkxfdmFyMTsNCisgICAgLy8gICAgICAgIH0NCisgICAgLy8gICAgICAgIGZvciAodmFyX291dCA9IDA7IExfdmFyMSA8IChXb3JkMzIpIDB4NDAwMDAwMDBMOyB2YXJfb3V0KyspDQorICAgIC8vICAgICAgICB7DQorICAgIC8vICAgICAgICAgICAgTF92YXIxIDw8PSAxOw0KKyAgICAvLyAgICAgICAgfQ0KKyAgICAvLyAgICB9DQorICAgIC8vfQ0KKyAgICAvL3JldHVybiAodmFyX291dCk7DQorICBXb3JkMTYgYTE2Ow0KKyAgV29yZDE2IHIgPSAwIDsgICAgICAgDQorDQorICAgDQorICBpZiAoIExfdmFyMSA8IDAgKSB7DQorICAgIExfdmFyMSA9IH5MX3ZhcjE7IA0KKyAgfQ0KKw0KKyAgaWYgKDAgPT0gKExfdmFyMSAmIDB4N2ZmZjgwMDApKSB7DQorICAgIGExNiA9IGV4dHJhY3RfbChMX3ZhcjEpOw0KKyAgICByICs9IDE2Ow0KKyAgICAgICANCisgICAgaWYgKDAgPT0gKGExNiAmIDB4N2Y4MCkpIHsNCisgICAgICByICs9IDg7DQorICAgICAgICAgDQorICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDA3OCkpIHsNCisgICAgICAgIHIgKz0gNDsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNikpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwMSkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgICAgICAgICANCisgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNjApKSB7DQorICAgICAgICAgIHIgKz0gMjsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMTApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9IA0KKyAgICBlbHNlIHsgDQorICAgICAgICAgDQorICAgICAgaWYgKDAgPT0gKGExNiAmIDB4NzgwMCkpIHsNCisgICAgICAgIHIgKz0gNDsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDYwMCkpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDEwMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDQwMCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgICAgICAgICANCisgICAgICAgIGlmICgwID09IChhMTYgJiAweDYwMDApKSB7DQorICAgICAgICAgIHIgKz0gMjsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDEwMDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDQwMDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICBlbHNlIHsNCisgICAgYTE2ID0gZXh0cmFjdF9oKExfdmFyMSk7DQorICAgICAgIA0KKyAgICBpZiAoMCA9PSAoYTE2ICYgMHg3ZjgwKSkgew0KKyAgICAgIHIgKz0gODsNCisgICAgICAgICANCisgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgwMDc4KSkgew0KKyAgICAgICAgciArPSA0IDsNCisgICAgICAgICAgIA0KKyAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNikpIHsNCisgICAgICAgICAgciArPSAyOw0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwMSkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgaWYgKDAgPT0gKGExNiAmIDB4MDAwNCkpIHsNCisgICAgICAgICAgICByICs9IDE7DQorICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICB9DQorICAgICAgZWxzZSB7DQorICAgICAgICAgICANCisgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNjApKSB7DQorICAgICAgICAgIHIgKz0gMjsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwMTApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAwNDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgIA0KKyAgICAgIGlmICgwID09IChhMTYgJiAweDc4MDApKSB7DQorICAgICAgICByICs9IDQ7DQorICAgICAgICAgICANCisgICAgICAgIGlmICgwID09IChhMTYgJiAweDA2MDApKSB7DQorICAgICAgICAgIHIgKz0gMjsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDAxMDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgDQorICAgICAgICAgIGlmICgwID09IChhMTYgJiAweDA0MDApKSB7DQorICAgICAgICAgICAgciArPSAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgDQorICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg2MDAwKSkgew0KKyAgICAgICAgICByICs9IDI7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHgxMDAwKSkgew0KKyAgICAgICAgICAgIHIgKz0gMTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZiAoMCA9PSAoYTE2ICYgMHg0MDAwKSkgew0KKyAgICAgICAgICAgIHJldHVybiAxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICB9DQorICB9DQorICANCisgIHJldHVybiByIDsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogUm91bmQsICAgICAgICAgICAgICAgMSAgICovDQorI2lmIChST1VORF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IHJvdW5kMTYoV29yZDMyIExfdmFyMSkNCit7DQorI2lmIEFSTVY1VEVfUk9VTkQNCisJV29yZDE2IHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiTU9WICAgcjEsIzB4MDAwMDgwMDBcbiINCisJCSJRQUREICAlW3Jlc3VsdF0sICVbTF92YXIxXSwgcjFcbiINCisJCSJNT1YgICAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgQVNSICMxNiBcbiIgDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTpbTF92YXIxXSJyIihMX3ZhcjEpDQorCQk6InIxIg0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UgICANCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3JvdW5kZWQ7DQorDQorICAgIExfcm91bmRlZCA9IExfYWRkIChMX3ZhcjEsIChXb3JkMzIpIDB4MDAwMDgwMDBMKTsNCisgICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF9yb3VuZGVkKTsNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorLyogTWFjLCAgMSAgKi8NCisjaWYgKExfTUFDX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9tYWMgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorI2lmIEFSTVY1VEVfTF9NQUMNCisJV29yZDMyIHJlc3VsdDsgDQorCWFzbSB2b2xhdGlsZSggDQorCQkiU01VTEJCICVbcmVzdWx0XSwgJVt2YXIxXSwgJVt2YXIyXVxuIg0KKwkJIlFBREQJJVtyZXN1bHRdLCAlW3Jlc3VsdF0sICVbcmVzdWx0XVxuIg0KKwkJIlFBREQgICAlW3Jlc3VsdF0sICVbcmVzdWx0XSwgJVtMX3ZhcjNdXG4iDQorCQk6W3Jlc3VsdF0iK3IiKHJlc3VsdCkNCisJCTogW0xfdmFyM10iciIoTF92YXIzKSwgW3ZhcjFdInIiKHZhcjEpLCBbdmFyMl0iciIodmFyMikNCisJCSk7IA0KKwlyZXR1cm4gcmVzdWx0Ow0KKyNlbHNlDQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3Byb2R1Y3Q7DQorDQorICAgIExfcHJvZHVjdCA9IExfbXVsdCh2YXIxLCB2YXIyKTsNCisgICAgTF92YXJfb3V0ID0gTF9hZGQgKExfdmFyMywgTF9wcm9kdWN0KTsNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKyNlbmRpZg0KK30NCisjZW5kaWYNCisNCisjaWYgKExfQUREX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpDQorew0KKyNpZiBBUk1WNVRFX0xfQUREDQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIlFBREQgJVtyZXN1bHRdLCAlW0xfdmFyMV0sICVbTF92YXIyXVxuIg0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W0xfdmFyMV0iciIoTF92YXIxKSwgW0xfdmFyMl0iciIoTF92YXIyKQ0KKwkJKTsgDQorCXJldHVybiByZXN1bHQ7DQorI2Vsc2UNCisgICAgV29yZDMyIExfdmFyX291dDsNCisNCisgICAgTF92YXJfb3V0ID0gTF92YXIxICsgTF92YXIyOw0KKyAgICBpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSA9PSAwKQ0KKyAgICB7DQorICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpDQorICAgICAgICB7DQorICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDApID8gTUlOXzMyIDogTUFYXzMyOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisjZW5kaWYNCit9DQorI2VuZGlmDQorDQorDQorDQorI2lmIChNVUxUX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9wcm9kdWN0X2FycjsNCisNCisgICAgTF9wcm9kdWN0X2FyciA9IChXb3JkMzIpdmFyMSAqKFdvcmQzMil2YXIyOyAgICAgICAvKiBwcm9kdWN0ICovDQorICAgIExfcHJvZHVjdF9hcnIgKz0gKFdvcmQzMikweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLw0KKyAgICBMX3Byb2R1Y3RfYXJyID4+PSAxNTsgICAgICAgLyogc2hpZnQgKi8NCisNCisgICAgdmFyX291dCA9IHNhdHVyYXRlKExfcHJvZHVjdF9hcnIpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisjaWYgKFNIUl9SX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMTYgc2hyX3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMiA+IDE1KQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gMDsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBzaHIodmFyMSwgdmFyMik7DQorDQorICAgICAgICBpZiAodmFyMiA+IDApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCh2YXIxICYgKChXb3JkMTYpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJfb3V0Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKyNpZiAoTUFDX1JfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBtYWNfciAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIExfdmFyMyA9IExfbWFjIChMX3ZhcjMsIHZhcjEsIHZhcjIpOw0KKyAgICB2YXJfb3V0ID0gKFdvcmQxNikoKExfdmFyMyArIDB4ODAwMEwpID4+IDE2KTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorI2lmIChNU1VfUl9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IG1zdV9yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgTF92YXIzID0gTF9tc3UgKExfdmFyMywgdmFyMSwgdmFyMik7DQorICAgIHZhcl9vdXQgPSAoV29yZDE2KSgoTF92YXIzICsgMHg4MDAwTCkgPj4gMTYpOw0KKyAgICANCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorI2lmIChMX1NIUl9SX0lTX0lOTElORSkNCitfX2lubGluZSBXb3JkMzIgTF9zaHJfciAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMiA+IDMxKQ0KKyAgICB7DQorICAgICAgICBMX3Zhcl9vdXQgPSAwOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgTF92YXJfb3V0ID0gTF9zaHIoTF92YXIxLCB2YXIyKTsNCisNCisgICAgICAgIGlmICh2YXIyID4gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoKExfdmFyMSAmICgoV29yZDMyKSAxIDw8ICh2YXIyIC0gMSkpKSAhPSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTF92YXJfb3V0Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorI2lmIChFWFRSQUNUX0hfSVNfSU5MSU5FKQ0KK19faW5saW5lIFdvcmQxNiBleHRyYWN0X2ggKFdvcmQzMiBMX3ZhcjEpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgdmFyX291dCA9IChXb3JkMTYpIChMX3ZhcjEgPj4gMTYpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisjaWYgKEVYVFJBQ1RfTF9JU19JTkxJTkUpDQorX19pbmxpbmUgV29yZDE2IGV4dHJhY3RfbChXb3JkMzIgTF92YXIxKQ0KK3sNCisJcmV0dXJuIChXb3JkMTYpIExfdmFyMTsNCit9DQorI2VuZGlmDQorDQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljb3AyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL2Jhc2ljb3AyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkNWRiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvYmFzaWNvcDIuYwpAQCAtMCwwICsxLDE2MjQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJhc2ljb3AyLmMNCisNCisJQ29udGVudDoJQmFzaWMgYXJpdGhtZXRpYyBvcGVyYXRvcnMuIA0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBzYXR1cmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMaW1pdCB0aGUgMzIgYml0IGlucHV0IHRvIHRoZSByYW5nZSBvZiBhIDE2IGJpdCB3b3JkLiAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIVNBVFJVQVRFX0lTX0lOTElORSkNCitXb3JkMTYgc2F0dXJhdGUoV29yZDMyIExfdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBpZiAoTF92YXIxID4gMFgwMDAwN2ZmZkwpDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBNQVhfMTY7DQorICAgIH0NCisgICAgZWxzZSBpZiAoTF92YXIxIDwgKFdvcmQzMikgMHhmZmZmODAwMEwpDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSBNSU5fMTY7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKExfdmFyMSk7DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBQZXJmb3JtcyB0aGUgYWRkaXRpb24gKHZhcjErdmFyMikgd2l0aCBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1cmF0aW9uO3wNCisgfCAgICB0aGUgMTYgYml0IHJlc3VsdCBpcyBzZXQgYXQgKzMyNzY3IHdoZW4gb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0zMjc2OCAgIHwNCisgfCAgICB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIUFERF9JU19JTkxJTkUpDQorV29yZDE2IGFkZCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX3N1bTsNCisNCisgICAgTF9zdW0gPSAoV29yZDMyKXZhcjEgKyAoV29yZDMyKXZhcjI7DQorICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3N1bSk7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogc3ViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgUGVyZm9ybXMgdGhlIHN1YnRyYWN0aW9uICh2YXIxK3ZhcjIpIHdpdGggb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dS0gICB8DQorIHwgICAgcmF0aW9uOyB0aGUgMTYgYml0IHJlc3VsdCBpcyBzZXQgYXQgKzMyNzY3IHdoZW4gb3ZlcmZsb3cgb2NjdXJzIG9yIGF0ICB8DQorIHwgICAgLTMyNzY4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFTVUJfSVNfSU5MSU5FKQ0KK1dvcmQxNiBzdWIoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiBMX2RpZmY7DQorDQorICAgIExfZGlmZiA9IChXb3JkMzIpIHZhcjEgLSB2YXIyOw0KKyAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9kaWZmKTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBhYnNfcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBBYnNvbHV0ZSB2YWx1ZSBvZiB2YXIxOyBhYnNfcygtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKy8vV29yZDE2IGFic19zIChXb3JkMTYgdmFyMSkNCisvL3sNCisvLyAgICBXb3JkMTYgdmFyX291dDsNCisvLw0KKy8vICAgIGlmICh2YXIxID09IE1JTl8xNikNCisvLyAgICB7DQorLy8gICAgICAgIHZhcl9vdXQgPSBNQVhfMTY7DQorLy8gICAgfQ0KKy8vICAgIGVsc2UNCisvLyAgICB7DQorLy8gICAgICAgIGlmICh2YXIxIDwgMCkNCisvLyAgICAgICAgew0KKy8vICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpLXZhcjE7DQorLy8gICAgICAgIH0NCisvLyAgICAgICAgZWxzZQ0KKy8vICAgICAgICB7DQorLy8gICAgICAgICAgICB2YXJfb3V0ID0gdmFyMTsNCisvLyAgICAgICAgfQ0KKy8vICAgIH0NCisvLw0KKy8vICAgIHJldHVybiAodmFyX291dCk7DQorLy99DQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBzaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAxNiBiaXQgaW5wdXQgdmFyMSBsZWZ0IHZhcjIgcG9zaXRpb25zLlplcm8gZmlsbHwNCisgfCAgIHRoZSB2YXIyIExTQiBvZiB0aGUgcmVzdWx0LiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSBzaGlmdCAgIHwNCisgfCAgIHZhcjEgcmlnaHQgYnkgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHwNCisgfCAgIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIVNITF9JU19JTkxJTkUpDQorV29yZDE2IHNobCAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorICAgIFdvcmQzMiByZXN1bHQ7DQorDQorICAgIGlmICh2YXIyIDwgMCkNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjIgPCAtMTYpDQorICAgICAgICAgICAgdmFyMiA9IC0xNjsNCisgICAgICAgIHZhcl9vdXQgPSBzaHIgKHZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgcmVzdWx0ID0gKFdvcmQzMikgdmFyMSAqKChXb3JkMzIpIDEgPDwgdmFyMik7DQorDQorICAgICAgICBpZiAoKHZhcjIgPiAxNSAmJiB2YXIxICE9IDApIHx8IChyZXN1bHQgIT0gKFdvcmQzMikgKChXb3JkMTYpIHJlc3VsdCkpKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIC8vT3ZlcmZsb3cgPSAxOw0KKyAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA+IDApID8gTUFYXzE2IDogTUlOXzE2KTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gZXh0cmFjdF9sKHJlc3VsdCk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorLy8gZW5kDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBzaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEFyaXRobWV0aWNhbGx5IHNoaWZ0IHRoZSAxNiBiaXQgaW5wdXQgdmFyMSByaWdodCB2YXIyIHBvc2l0aW9ucyB3aXRoICAgIHwNCisgfCAgIHNpZ24gZXh0ZW5zaW9uLiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSBzaGlmdCB2YXIxIGxlZnQgYnkgIHwNCisgfCAgIC12YXIyIHdpdGggc2lnbiBleHRlbnNpb24uIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gY2FzZSBvZiB1bmRlcmZsb3dzIG9yIHwNCisgfCAgIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIVNIUl9JU19JTkxJTkUpDQorV29yZDE2IHNociAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIGlmICh2YXIyIDwgMCkNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjIgPCAtMTYpDQorICAgICAgICAgICAgdmFyMiA9IC0xNjsNCisgICAgICAgIHZhcl9vdXQgPSBzaGwgKHZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjIgPj0gMTUpDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFyX291dCA9IChXb3JkMTYpKCh2YXIxIDwgMCkgPyAtMSA6IDApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICh2YXIxIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcl9vdXQgPSAoV29yZDE2KSh+KCh+dmFyMSkgPj4gdmFyMikpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJfb3V0ID0gKFdvcmQxNikodmFyMSA+PiB2YXIyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBtdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBQZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSBieSB2YXIyIGFuZCBnaXZlcyBhIDE2IGJpdCByZXN1bHQgIHwNCisgfCAgICB3aGljaCBpcyBzY2FsZWQgaS5lLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICBtdWx0KHZhcjEsdmFyMikgPSBleHRyYWN0X2woTF9zaHIoKHZhcjEgdGltZXMgdmFyMiksMTUpKSBhbmQgIHwNCisgfCAgICAgICAgICAgICBtdWx0KC0zMjc2OCwtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIU1VTFRfSVNfSU5MSU5FKQ0KK1dvcmQxNiBtdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfcHJvZHVjdDsNCisNCisgICAgTF9wcm9kdWN0ID0gKFdvcmQzMikgdmFyMSAqKFdvcmQzMikgdmFyMjsNCisNCisgICAgTF9wcm9kdWN0ID0gKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4ZmZmZjgwMDBMKSA+PiAxNTsNCisNCisgICAgaWYgKExfcHJvZHVjdCAmIChXb3JkMzIpIDB4MDAwMTAwMDBMKQ0KKyAgICAgICAgTF9wcm9kdWN0ID0gTF9wcm9kdWN0IHwgKFdvcmQzMikgMHhmZmZmMDAwMEw7DQorDQorICAgIHZhcl9vdXQgPSBzYXR1cmF0ZShMX3Byb2R1Y3QpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfbXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgTF9tdWx0IGlzIHRoZSAzMiBiaXQgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB2YXIxIHRpbWVzIHZhcjIgICAgfA0KKyB8ICAgd2l0aCBvbmUgc2hpZnQgbGVmdCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICBMX211bHQodmFyMSx2YXIyKSA9IExfc2hsKCh2YXIxIHRpbWVzIHZhcjIpLDEpIGFuZCAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICBMX211bHQoLTMyNzY4LC0zMjc2OCkgPSAyMTQ3NDgzNjQ3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghTF9NVUxUX0lTX0lOTElORSkNCitXb3JkMzIgTF9tdWx0KFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorDQorICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7DQorDQorICAgIGlmIChMX3Zhcl9vdXQgIT0gKFdvcmQzMikgMHg0MDAwMDAwMEwpDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA8PD0gMTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA9IE1BWF8zMjsNCisgICAgfQ0KKyAgICAgICAgDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCit9DQorI2VuZGlmDQorLy8gZW5kDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBuZWdhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE5lZ2F0ZSB2YXIxIHdpdGggc2F0dXJhdGlvbiwgc2F0dXJhdGUgaW4gdGhlIGNhc2Ugd2hlcmUgaW5wdXQgaXMgLTMyNzY4OnwNCisgfCAgICAgICAgICAgICAgICBuZWdhdGUodmFyMSkgPSBzdWIoMCx2YXIxKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKy8vV29yZDE2IG5lZ2F0ZSAoV29yZDE2IHZhcjEpDQorLy97DQorLy8gICAgV29yZDE2IHZhcl9vdXQ7DQorLy8NCisvLyAgICB2YXJfb3V0ID0gKFdvcmQxNikoKHZhcjEgPT0gTUlOXzE2KSA/IE1BWF8xNiA6IC12YXIxKTsNCisvLw0KKy8vICAgIHJldHVybiAodmFyX291dCk7DQorLy99DQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBleHRyYWN0X2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiB0aGUgMTYgTVNCIG9mIExfdmFyMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyICkgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIUVYVFJBQ1RfSF9JU19JTkxJTkUpDQorV29yZDE2IGV4dHJhY3RfaCAoV29yZDMyIExfdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICB2YXJfb3V0ID0gKFdvcmQxNikgKExfdmFyMSA+PiAxNik7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogZXh0cmFjdF9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gdGhlIDE2IExTQiBvZiBMX3ZhcjEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMiApIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFFWFRSQUNUX0xfSVNfSU5MSU5FKQ0KK1dvcmQxNiBleHRyYWN0X2woV29yZDMyIExfdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICB2YXJfb3V0ID0gKFdvcmQxNikgTF92YXIxOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IHJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUm91bmQgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIDMyIGJpdCBpbnB1dCBudW1iZXIgaW50byB0aGUgTVMgMTYgYml0cyAgfA0KKyB8ICAgd2l0aCBzYXR1cmF0aW9uLiBTaGlmdCB0aGUgcmVzdWx0aW5nIGJpdHMgcmlnaHQgYnkgMTYgYW5kIHJldHVybiB0aGUgMTYgfA0KKyB8ICAgYml0IG51bWJlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgcm91bmQoTF92YXIxKSA9IGV4dHJhY3RfaChMX2FkZChMX3ZhcjEsMzI3NjgpKSAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIgKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIxIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghUk9VTkRfSVNfSU5MSU5FKQ0KK1dvcmQxNiByb3VuZDE2KFdvcmQzMiBMX3ZhcjEpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfcm91bmRlZDsNCisNCisgICAgTF9yb3VuZGVkID0gTF9hZGQgKExfdmFyMSwgKFdvcmQzMikgMHgwMDAwODAwMEwpOw0KKyAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3JvdW5kZWQpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisvLyBlbmQNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfbWFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgTXVsdGlwbHkgdmFyMSBieSB2YXIyIGFuZCBzaGlmdCB0aGUgcmVzdWx0IGxlZnQgYnkgMS4gQWRkIHRoZSAzMiBiaXQgICAgfA0KKyB8ICAgcmVzdWx0IHRvIExfdmFyMyB3aXRoIHNhdHVyYXRpb24sIHJldHVybiBhIDMyIGJpdCByZXN1bHQ6ICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICBMX21hYyhMX3ZhcjMsdmFyMSx2YXIyKSA9IExfYWRkKExfdmFyMyxMX211bHQodmFyMSx2YXIyKSkuICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMyAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTF9NU1VfSVNfSU5MSU5FKQ0KK1dvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDMyIExfdmFyX291dDsNCisgICAgV29yZDMyIExfcHJvZHVjdDsNCisNCisgICAgTF9wcm9kdWN0ID0gTF9tdWx0KHZhcjEsIHZhcjIpOw0KKyAgICBMX3Zhcl9vdXQgPSBMX2FkZCAoTF92YXIzLCBMX3Byb2R1Y3QpOw0KKw0KKyAgICByZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9tc3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBTdWJ0cmFjdCB0aGUgMzIgICB8DQorIHwgICBiaXQgcmVzdWx0IHRvIExfdmFyMyB3aXRoIHNhdHVyYXRpb24sIHJldHVybiBhIDMyIGJpdCByZXN1bHQ6ICAgICAgICAgICB8DQorIHwgICAgICAgIExfbXN1KExfdmFyMyx2YXIxLHZhcjIpID0gTF9zdWIoTF92YXIzLExfbXVsdCh2YXIxLHZhcjIpKS4gICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisjaWYgKCFMX01TVV9JU19JTkxJTkUpDQorV29yZDMyIExfbXN1IChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKyAgICBXb3JkMzIgTF9wcm9kdWN0Ow0KKw0KKyAgICBMX3Byb2R1Y3QgPSBMX211bHQodmFyMSwgdmFyMik7DQorICAgIExfdmFyX291dCA9IExfc3ViIChMX3ZhcjMsIExfcHJvZHVjdCk7DQorDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIDMyIGJpdHMgYWRkaXRpb24gb2YgdGhlIHR3byAzMiBiaXRzIHZhcmlhYmxlcyAoTF92YXIxK0xfdmFyMikgd2l0aCAgICAgIHwNCisgfCAgIG92ZXJmbG93IGNvbnRyb2wgYW5kIHNhdHVyYXRpb247IHRoZSByZXN1bHQgaXMgc2V0IGF0ICsyMTQ3NDgzNjQ3IHdoZW4gIHwNCisgfCAgIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMjE0NzQ4MzY0OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjIgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIUxfQUREX0lTX0lOTElORSkNCitXb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpDQorew0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgKyBMX3ZhcjI7DQorDQorICAgIGlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpID09IDApDQorICAgIHsNCisgICAgICAgIGlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikNCisgICAgICAgIHsNCisgICAgICAgICAgICBMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMCkgPyBNSU5fMzIgOiBNQVhfMzI7DQorICAgICAgICAgICAgLy9PdmVyZmxvdyA9IDE7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc3ViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgMzIgYml0cyBzdWJ0cmFjdGlvbiBvZiB0aGUgdHdvIDMyIGJpdHMgdmFyaWFibGVzIChMX3ZhcjEtTF92YXIyKSB3aXRoICAgfA0KKyB8ICAgb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjsgdGhlIHJlc3VsdCBpcyBzZXQgYXQgKzIxNDc0ODM2NDcgd2hlbiAgfA0KKyB8ICAgb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0yMTQ3NDgzNjQ4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMiAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTF9TVUJfSVNfSU5MSU5FKQ0KK1dvcmQzMiBMX3N1YihXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKQ0KK3sNCisgICAgV29yZDMyIExfdmFyX291dDsNCisNCisgICAgTF92YXJfb3V0ID0gTF92YXIxIC0gTF92YXIyOw0KKw0KKyAgICBpZiAoKChMX3ZhcjEgXiBMX3ZhcjIpICYgTUlOXzMyKSAhPSAwKQ0KKyAgICB7DQorICAgICAgICBpZiAoKExfdmFyX291dCBeIExfdmFyMSkgJiBNSU5fMzIpDQorICAgICAgICB7DQorICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IE1JTl8zMiA6IE1BWF8zMjsNCisgICAgICAgICAgICAvL092ZXJmbG93ID0gMTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKExfdmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9uZWdhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBOZWdhdGUgdGhlIDMyIGJpdCB2YXJpYWJsZSBMX3ZhcjEgd2l0aCBzYXR1cmF0aW9uOyBzYXR1cmF0ZSBpbiB0aGUgY2FzZSB8DQorIHwgICB3aGVyZSBpbnB1dCBpcyAtMjE0NzQ4MzY0OCAoMHg4MDAwIDAwMDApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisvL1dvcmQzMiBMX25lZ2F0ZSAoV29yZDMyIExfdmFyMSkNCisvL3sNCisvLyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKy8vDQorLy8gICAgTF92YXJfb3V0ID0gKExfdmFyMSA9PSBNSU5fMzIpID8gTUFYXzMyIDogLUxfdmFyMTsNCisvLw0KKy8vICAgIHJldHVybiAoTF92YXJfb3V0KTsNCisvL30NCisNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IG11bHRfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgU2FtZSBhcyBtdWx0IHdpdGggcm91bmRpbmcsIGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICBtdWx0X3IodmFyMSx2YXIyKSA9IGV4dHJhY3RfbChMX3NocigoKHZhcjEgKiB2YXIyKSArIDE2Mzg0KSwxNSkpIGFuZCAgfA0KKyB8ICAgICBtdWx0X3IoLTMyNzY4LC0zMjc2OCkgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghTVVMVF9SX0lTX0lOTElORSkNCitXb3JkMTYgbXVsdF9yIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisgICAgV29yZDMyIExfcHJvZHVjdF9hcnI7DQorDQorICAgIExfcHJvZHVjdF9hcnIgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOyAgICAgICAvKiBwcm9kdWN0ICovDQorICAgIExfcHJvZHVjdF9hcnIgKz0gKFdvcmQzMikgMHgwMDAwNDAwMEw7ICAgICAgLyogcm91bmQgKi8NCisgICAgTF9wcm9kdWN0X2FyciAmPSAoV29yZDMyKSAweGZmZmY4MDAwTDsNCisgICAgTF9wcm9kdWN0X2FyciA+Pj0gMTU7ICAgICAgIC8qIHNoaWZ0ICovDQorDQorICAgIGlmIChMX3Byb2R1Y3RfYXJyICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpICAgLyogc2lnbiBleHRlbmQgd2hlbiBuZWNlc3NhcnkgKi8NCisgICAgew0KKyAgICAgICAgTF9wcm9kdWN0X2FyciB8PSAoV29yZDMyKSAweGZmZmYwMDAwTDsNCisgICAgfQ0KKyAgICB2YXJfb3V0ID0gc2F0dXJhdGUoTF9wcm9kdWN0X2Fycik7DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9zaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMzIgYml0IGlucHV0IExfdmFyMSBsZWZ0IHZhcjIgcG9zaXRpb25zLiBaZXJvICB8DQorIHwgICBmaWxsIHRoZSB2YXIyIExTQiBvZiB0aGUgcmVzdWx0LiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSAgICB8DQorIHwgICBzaGlmdCBMX3ZhcjEgcmlnaHQgYnkgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiB8DQorIHwgICBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisjaWYgKCFMX1NITF9JU19JTkxJTkUpDQorV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQgPSAwTDsNCisNCisgICAgaWYgKHZhcjIgPD0gMCkNCisgICAgew0KKyAgICAgICAgTF92YXIxID0gTF9zaHIoTF92YXIxLCAoV29yZDE2KS12YXIyKTsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIGZvciAoOyB2YXIyID4gMDsgdmFyMi0tKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHJldHVybiBNQVhfMzI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1JTl8zMjsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBMX3ZhcjEgPDw9IDE7DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChMX3ZhcjEpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfc2hyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDMyIGJpdCBpbnB1dCBMX3ZhcjEgcmlnaHQgdmFyMiBwb3NpdGlvbnMgd2l0aCAgfA0KKyB8ICAgc2lnbiBleHRlbnNpb24uIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5IHNoaWZ0IExfdmFyMSBsZWZ0ICAgfA0KKyB8ICAgYnkgLXZhcjIgYW5kIHplcm8gZmlsbCB0aGUgLXZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIFNhdHVyYXRlIHRoZSByZXN1bHQgfA0KKyB8ICAgaW4gY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorI2lmICghTF9TSFJfSVNfSU5MSU5FKQ0KK1dvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMzIgTF92YXJfb3V0Ow0KKw0KKyAgICBpZiAodmFyMiA8IDApDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA9IExfc2hsIChMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjIgPj0gMzEpDQorICAgICAgICB7DQorICAgICAgICAgICAgTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IC0xIDogMDsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoTF92YXIxIDwgMCkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIExfdmFyX291dCA9IH4oKH5MX3ZhcjEpID4+IHZhcjIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjEgPj4gdmFyMjsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisgICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IHNocl9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgU2FtZSBhcyBzaHIodmFyMSx2YXIyKSBidXQgd2l0aCByb3VuZGluZy4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mfA0KKyB8ICAgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIC0gSWYgdmFyMiBpcyBncmVhdGVyIHRoYW4gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgIGlmIChzdWIoc2hsKHNocih2YXIxLHZhcjIpLDEpLHNocih2YXIxLHN1Yih2YXIyLDEpKSkpICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgIGlzIGVxdWFsIHRvIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgdGhlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgc2hyX3IodmFyMSx2YXIyKSA9IHNocih2YXIxLHZhcjIpICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgc2hyX3IodmFyMSx2YXIyKSA9IGFkZChzaHIodmFyMSx2YXIyKSwxKSAgICAgICAgICAgICAgfA0KKyB8ICAgIC0gSWYgdmFyMiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgc2hyX3IodmFyMSx2YXIyKSA9IHNocih2YXIxLHZhcjIpLiAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2lmICghU0hSX1JfSVNfSU5MSU5FKQ0KK1dvcmQxNiBzaHJfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisgICAgV29yZDE2IHZhcl9vdXQ7DQorDQorICAgIGlmICh2YXIyID4gMTUpDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSAwOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IHNociAodmFyMSwgdmFyMik7DQorDQorICAgICAgICBpZiAodmFyMiA+IDApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCh2YXIxICYgKChXb3JkMTYpIDEgPDwgKHZhcjIgLSAxKSkpICE9IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJfb3V0Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogbWFjX3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBNdWx0aXBseSB2YXIxIGJ5IHZhcjIgYW5kIHNoaWZ0IHRoZSByZXN1bHQgbGVmdCBieSAxLiBBZGQgdGhlIDMyIGJpdCAgICB8DQorIHwgICByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbi4gUm91bmQgdGhlIExTIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCAgICB8DQorIHwgICBpbnRvIHRoZSBNUyAxNiBiaXRzIHdpdGggc2F0dXJhdGlvbiBhbmQgc2hpZnQgdGhlIHJlc3VsdCByaWdodCBieSAxNi4gICB8DQorIHwgICBSZXR1cm4gYSAxNiBiaXQgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICBtYWNfcihMX3ZhcjMsdmFyMSx2YXIyKSA9IHJvdW5kKExfbWFjKExfdmFyMyx2YXIxLHZhcjIpKSAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgODAwMCA8PSBMX3Zhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisjaWYgKCFNQUNfUl9JU19JTkxJTkUpDQorV29yZDE2IG1hY19yIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgTF92YXIzID0gTF9tYWMgKExfdmFyMywgdmFyMSwgdmFyMik7DQorICAgIExfdmFyMyA9IExfYWRkIChMX3ZhcjMsIChXb3JkMzIpIDB4MDAwMDgwMDBMKTsNCisgICAgdmFyX291dCA9IGV4dHJhY3RfaCAoTF92YXIzKTsNCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBtc3VfciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIFN1YnRyYWN0IHRoZSAzMiAgIHwNCisgfCAgIGJpdCByZXN1bHQgdG8gTF92YXIzIHdpdGggc2F0dXJhdGlvbi4gUm91bmQgdGhlIExTIDE2IGJpdHMgb2YgdGhlIHJlcy0gIHwNCisgfCAgIHVsdCBpbnRvIHRoZSBNUyAxNiBiaXRzIHdpdGggc2F0dXJhdGlvbiBhbmQgc2hpZnQgdGhlIHJlc3VsdCByaWdodCBieSAgIHwNCisgfCAgIDE2LiBSZXR1cm4gYSAxNiBiaXQgcmVzdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgIG1zdV9yKExfdmFyMyx2YXIxLHZhcjIpID0gcm91bmQoTF9tc3UoTF92YXIzLHZhcjEsdmFyMikpICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjMgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCA4MDAwIDw9IExfdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIU1TVV9SX0lTX0lOTElORSkNCitXb3JkMTYgbXN1X3IgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBMX3ZhcjMgPSBMX21zdSAoTF92YXIzLCB2YXIxLCB2YXIyKTsNCisgICAgTF92YXIzID0gTF9hZGQgKExfdmFyMywgKFdvcmQzMikgMHgwMDAwODAwMEwpOw0KKyAgICB2YXJfb3V0ID0gZXh0cmFjdF9oIChMX3ZhcjMpOw0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRnVuY3Rpb24gTmFtZSA6IExfZGVwb3NpdF9oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgRGVwb3NpdCB0aGUgMTYgYml0IHZhcjEgaW50byB0aGUgMTYgTVMgYml0cyBvZiB0aGUgMzIgYml0IG91dHB1dC4gVGhlICAgfA0KKyB8ICAgMTYgTFMgYml0cyBvZiB0aGUgb3V0cHV0IGFyZSB6ZXJvZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KKyB8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDdmZmYgMDAwMC4gICAgICAgICAgICAgICAgfA0KKyB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorLy9Xb3JkMzIgTF9kZXBvc2l0X2ggKFdvcmQxNiB2YXIxKQ0KKy8vew0KKy8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorLy8NCisvLyAgICBMX3Zhcl9vdXQgPSAoV29yZDMyKSB2YXIxIDw8IDE2Ow0KKy8vDQorLy8gICAgcmV0dXJuIChMX3Zhcl9vdXQpOw0KKy8vfQ0KKw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogTF9kZXBvc2l0X2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBEZXBvc2l0IHRoZSAxNiBiaXQgdmFyMSBpbnRvIHRoZSAxNiBMUyBiaXRzIG9mIHRoZSAzMiBiaXQgb3V0cHV0LiBUaGUgICB8DQorIHwgICAxNiBNUyBiaXRzIG9mIHRoZSBvdXRwdXQgYXJlIHNpZ24gZXh0ZW5kZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweEZGRkYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisvL1dvcmQzMiBMX2RlcG9zaXRfbCAoV29yZDE2IHZhcjEpDQorLy97DQorLy8gICAgV29yZDMyIExfdmFyX291dDsNCisvLw0KKy8vICAgIExfdmFyX291dCA9IChXb3JkMzIpIHZhcjE7DQorLy8NCisvLyAgICByZXR1cm4gKExfdmFyX291dCk7DQorLy99DQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3Nocl9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFNhbWUgYXMgTF9zaHIoTF92YXIxLHZhcjIpIGJ1dCB3aXRoIHJvdW5kaW5nLiBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluICAgIHwNCisgfCAgIGNhc2Ugb2YgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAtIElmIHZhcjIgaXMgZ3JlYXRlciB0aGFuIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICBpZiAoTF9zdWIoTF9zaGwoTF9zaHIoTF92YXIxLHZhcjIpLDEpLExfc2hyKExfdmFyMSxzdWIodmFyMiwxKSkpKXwNCisgfCAgICAgICAgICBpcyBlcXVhbCB0byB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgIHRoZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9zaHIoTF92YXIxLHZhcjIpICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9hZGQoTF9zaHIoTF92YXIxLHZhcjIpLDEpICAgIHwNCisgfCAgICAtIElmIHZhcjIgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9zaHIoTF92YXIxLHZhcjIpLiAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKyNpZiAoIUxfU0hSX1JfSVNfSU5MSU5FKQ0KK1dvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorDQorICAgIGlmICh2YXIyID4gMzEpDQorICAgIHsNCisgICAgICAgIExfdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBMX3Zhcl9vdXQgPSBMX3NociAoTF92YXIxLCB2YXIyKTsNCisNCisgICAgICAgIGlmICh2YXIyID4gMCkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpZiAoKExfdmFyMSAmICgoV29yZDMyKSAxIDw8ICh2YXIyIC0gMSkpKSAhPSAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTF92YXJfb3V0Kys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAoTF92YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FicyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBBYnNvbHV0ZSB2YWx1ZSBvZiBMX3ZhcjE7IFNhdHVyYXRlIGluIGNhc2Ugd2hlcmUgdGhlIGlucHV0IGlzICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yMTQ3ODM2NDggIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKy8vV29yZDMyIExfYWJzIChXb3JkMzIgTF92YXIxKQ0KKy8vew0KKy8vICAgIFdvcmQzMiBMX3Zhcl9vdXQ7DQorLy8NCisvLyAgICBpZiAoTF92YXIxID09IE1JTl8zMikNCisvLyAgICB7DQorLy8gICAgICAgIExfdmFyX291dCA9IE1BWF8zMjsNCisvLyAgICB9DQorLy8gICAgZWxzZQ0KKy8vICAgIHsNCisvLyAgICAgICAgaWYgKExfdmFyMSA8IDApDQorLy8gICAgICAgIHsNCisvLyAgICAgICAgICAgIExfdmFyX291dCA9IC1MX3ZhcjE7DQorLy8gICAgICAgIH0NCisvLyAgICAgICAgZWxzZQ0KKy8vICAgICAgICB7DQorLy8gICAgICAgICAgICBMX3Zhcl9vdXQgPSBMX3ZhcjE7DQorLy8gICAgICAgIH0NCisvLyAgICB9DQorLy8NCisvLyAgICByZXR1cm4gKExfdmFyX291dCk7DQorLy99DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBub3JtX3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFByb2R1Y2VzIHRoZSBudW1iZXIgb2YgbGVmdCBzaGlmdCBuZWVkZWQgdG8gbm9ybWFsaXplIHRoZSAxNiBiaXQgdmFyaWEtIHwNCisgfCAgIGJsZSB2YXIxIGZvciBwb3NpdGl2ZSB2YWx1ZXMgb24gdGhlIGludGVydmFsIHdpdGggbWluaW11bSBvZiAxNjM4NCBhbmQgIHwNCisgfCAgIG1heGltdW0gb2YgMzI3NjcsIGFuZCBmb3IgbmVnYXRpdmUgdmFsdWVzIG9uIHRoZSBpbnRlcnZhbCB3aXRoIG1pbmltdW0gIHwNCisgfCAgIG9mIC0zMjc2OCBhbmQgbWF4aW11bSBvZiAtMTYzODQ7IGluIG9yZGVyIHRvIG5vcm1hbGl6ZSB0aGUgcmVzdWx0LCB0aGUgIHwNCisgfCAgIGZvbGxvd2luZyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgbm9ybV92YXIxID0gc2hsKHZhcjEsbm9ybV9zKHZhcjEpKS4gICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDAwMGYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIU5PUk1fU19JU19JTkxJTkUpDQorV29yZDE2IG5vcm1fcyAoV29yZDE2IHZhcjEpDQorew0KKyAgICBXb3JkMTYgdmFyX291dDsNCisNCisgICAgaWYgKHZhcjEgPT0gMCkNCisgICAgew0KKyAgICAgICAgdmFyX291dCA9IDA7DQorICAgIH0NCisgICAgZWxzZQ0KKyAgICB7DQorICAgICAgICBpZiAodmFyMSA9PSAtMSkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gMTU7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKHZhcjEgPCAwKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFyMSA9IChXb3JkMTYpfnZhcjE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGZvciAodmFyX291dCA9IDA7IHZhcjEgPCAweDQwMDA7IHZhcl9vdXQrKykNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhcjEgPDw9IDE7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHJldHVybiAodmFyX291dCk7DQorfQ0KKyNlbmRpZg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBGdW5jdGlvbiBOYW1lIDogZGl2X3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBQcm9kdWNlcyBhIHJlc3VsdCB3aGljaCBpcyB0aGUgZnJhY3Rpb25hbCBpbnRlZ2VyIGRpdmlzaW9uIG9mIHZhcjEgIGJ5ICB8DQorIHwgICB2YXIyOyB2YXIxIGFuZCB2YXIyIG11c3QgYmUgcG9zaXRpdmUgYW5kIHZhcjIgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsICB8DQorIHwgICB0byB2YXIxOyB0aGUgcmVzdWx0IGlzIHBvc2l0aXZlIChsZWFkaW5nIGJpdCBlcXVhbCB0byAwKSBhbmQgdHJ1bmNhdGVkICB8DQorIHwgICB0byAxNiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJZiB2YXIxID0gdmFyMiB0aGVuIGRpdih2YXIxLHZhcjIpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBDb21wbGV4aXR5IHdlaWdodCA6IDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXIxIDw9IHZhcjIgYW5kIHZhcjIgIT0gMC4gICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiB2YXIxIDw9IHZhcjIgPD0gMHgwMDAwIDdmZmYgYW5kIHZhcjIgIT0gMC4gICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorIHwgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorIHwgICAgICAgICAgICAgSXQncyBhIFExNSB2YWx1ZSAocG9pbnQgYmV0d2VlbiBiMTUgYW5kIGIxNCkuICAgICAgICAgICAgICAgICB8DQorIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCisjaWYgKCFESVZfU19JU19JTkxJTkUpDQorV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKyAgICBXb3JkMTYgdmFyX291dCA9IDA7DQorICAgIFdvcmQxNiBpdGVyYXRpb247DQorICAgIFdvcmQzMiBMX251bTsNCisgICAgV29yZDMyIExfZGVub207DQorDQorICAgIGlmICh2YXIxID09IDApDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSAwOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKHZhcjEgPT0gdmFyMikNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gTUFYXzE2Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIExfbnVtID0gTF9kZXBvc2l0X2wgKHZhcjEpOw0KKyAgICAgICAgICAgIExfZGVub20gPSBMX2RlcG9zaXRfbCAodmFyMik7DQorDQorICAgICAgICAgICAgZm9yIChpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCAxNTsgaXRlcmF0aW9uKyspDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YXJfb3V0IDw8PSAxOw0KKyAgICAgICAgICAgICAgICBMX251bSA8PD0gMTsNCisNCisgICAgICAgICAgICAgICAgaWYgKExfbnVtID49IExfZGVub20pDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIExfbnVtID0gTF9zdWIoTF9udW0sIExfZGVub20pOw0KKyAgICAgICAgICAgICAgICAgICAgdmFyX291dCA9IGFkZCAodmFyX291dCwgMSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICh2YXJfb3V0KTsNCit9DQorI2VuZGlmDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIEZ1bmN0aW9uIE5hbWUgOiBub3JtX2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFByb2R1Y2VzIHRoZSBudW1iZXIgb2YgbGVmdCBzaGlmdHMgbmVlZGVkIHRvIG5vcm1hbGl6ZSB0aGUgMzIgYml0IHZhcmlhLXwNCisgfCAgIGJsZSBMX3ZhcjEgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbiB0aGUgaW50ZXJ2YWwgd2l0aCBtaW5pbXVtIG9mICAgICAgICAgIHwNCisgfCAgIDEwNzM3NDE4MjQgYW5kIG1heGltdW0gb2YgMjE0NzQ4MzY0NywgYW5kIGZvciBuZWdhdGl2ZSB2YWx1ZXMgb24gdGhlIGluLXwNCisgfCAgIHRlcnZhbCB3aXRoIG1pbmltdW0gb2YgLTIxNDc0ODM2NDggYW5kIG1heGltdW0gb2YgLTEwNzM3NDE4MjQ7IGluIG9yZGVyIHwNCisgfCAgIHRvIG5vcm1hbGl6ZSB0aGUgcmVzdWx0LCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBtdXN0IGJlIGRvbmUgOiAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICBub3JtX0xfdmFyMSA9IExfc2hsKExfdmFyMSxub3JtX2woTF92YXIxKSkuICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCisgfCAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDAwMWYuICAgICAgICAgICAgICAgIHwNCisgfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KKyNpZiAoIU5PUk1fTF9JU19JTkxJTkUpDQorV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSkNCit7DQorICAgIFdvcmQxNiB2YXJfb3V0Ow0KKw0KKyAgICBpZiAoTF92YXIxID09IDApDQorICAgIHsNCisgICAgICAgIHZhcl9vdXQgPSAwOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgaWYgKExfdmFyMSA9PSAoV29yZDMyKSAweGZmZmZmZmZmTCkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YXJfb3V0ID0gMzE7DQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKExfdmFyMSA8IDApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBMX3ZhcjEgPSB+TF92YXIxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBmb3IgKHZhcl9vdXQgPSAwOyBMX3ZhcjEgPCAoV29yZDMyKSAweDQwMDAwMDAwTDsgdmFyX291dCsrKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgTF92YXIxIDw8PSAxOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gKHZhcl9vdXQpOw0KK30NCisjZW5kaWYNCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3Avb3Blcl8zMmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZhOWRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5jCkBAIC0wLDAgKzEsMzYxIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlvcGVyXzMyYi5jDQorDQorCUNvbnRlbnQ6CSAgVGhpcyBmaWxlIGNvbnRhaW5zIG9wZXJhdGlvbnMgaW4gZG91YmxlIHByZWNpc2lvbi4KKyANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAidHlwZWRlZi5oIgorI2luY2x1ZGUgImJhc2ljX29wLmgiCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBGdW5jdGlvbiBMX0V4dHJhY3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgRXh0cmFjdCBmcm9tIGEgMzIgYml0IGludGVnZXIgdHdvIDE2IGJpdCBEUEYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgTF8zMiAgICAgIDogMzIgYml0IGludGVnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAweDgwMDAgMDAwMCA8PSBMXzMyIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGhpICAgICAgICA6IGIxNiB0byBiMzEgb2YgTF8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgbG8gICAgICAgIDogKExfMzIgLSBoaTw8MTYpPj4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCit2b2lkIExfRXh0cmFjdCAoV29yZDMyIExfMzIsIFdvcmQxNiAqaGksIFdvcmQxNiAqbG8pCit7CisgICAgKmhpID0gZXh0cmFjdF9oIChMXzMyKTsKKyAgICAqbG8gPSBleHRyYWN0X2wgKExfbXN1IChMX3NociAoTF8zMiwgMSksICpoaSwgMTYzODQpKTsKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgRnVuY3Rpb24gTF9Db21wKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIENvbXBvc2UgZnJvbSB0d28gMTYgYml0IERQRiBhIDMyIGJpdCBpbnRlZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICBMXzMyID0gaGk8PDE2ICsgbG88PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBoaSAgICAgICAgbXNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGxvICAgICAgICBsc2YgKHdpdGggc2lnbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKgorICogICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMXzMyIDw9IDB4N2ZmZiBmZmYwLiAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworV29yZDMyIExfQ29tcCAoV29yZDE2IGhpLCBXb3JkMTYgbG8pCit7CisgICAgV29yZDMyIExfMzI7CisKKyAgICBMXzMyID0gTF9kZXBvc2l0X2ggKGhpKTsKKyAgICByZXR1cm4gKExfbWFjIChMXzMyLCBsbywgMSkpOyAgICAgICAvKiA9IGhpPDwxNiArIGxvPDwxICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gTXB5XzMyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgTXVsdGlwbHkgdHdvIDMyIGJpdCBpbnRlZ2VycyAoRFBGKS4gVGhlIHJlc3VsdCBpcyBkaXZpZGVkIGJ5IDIqKjMxICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIExfMzIgPSAoaGkxKmhpMik8PDEgKyAoIChoaTEqbG8yKT4+MTUgKyAobG8xKmhpMik+PjE1ICk8PDEgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBUaGlzIG9wZXJhdGlvbiBjYW4gYWxzbyBiZSB2aWV3ZWQgYXMgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHR3byBRMzEgICAgICAqCisgKiAgIG51bWJlciBhbmQgdGhlIHJlc3VsdCBpcyBhbHNvIGluIFEzMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBoaTEgICAgICAgICBoaSBwYXJ0IG9mIGZpcnN0IG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIGxvMSAgICAgICAgIGxvIHBhcnQgb2YgZmlyc3QgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgaGkyICAgICAgICAgaGkgcGFydCBvZiBzZWNvbmQgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBsbzIgICAgICAgICBsbyBwYXJ0IG9mIHNlY29uZCBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK1dvcmQzMiBNcHlfMzIgKFdvcmQxNiBoaTEsIFdvcmQxNiBsbzEsIFdvcmQxNiBoaTIsIFdvcmQxNiBsbzIpCit7CisgICAgV29yZDMyIExfMzI7CisKKyAgICBMXzMyID0gTF9tdWx0IChoaTEsIGhpMik7CisgICAgTF8zMiA9IExfbWFjIChMXzMyLCBtdWx0IChoaTEsIGxvMiksIDEpOworICAgIExfMzIgPSBMX21hYyAoTF8zMiwgbXVsdCAobG8xLCBoaTIpLCAxKTsKKworICAgIHJldHVybiAoTF8zMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb24gTXB5XzMyXzE2KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgTXVsdGlwbHkgYSAxNiBiaXQgaW50ZWdlciBieSBhIDMyIGJpdCAoRFBGKS4gVGhlIHJlc3VsdCBpcyBkaXZpZGVkICAgICAgKgorICogICBieSAyKioxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBMXzMyID0gKGhpMSpsbzIpPDwxICsgKChsbzEqbG8yKT4+MTUpPDwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgaGkgICAgICAgICAgaGkgcGFydCBvZiAzMiBiaXQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICBsbyAgICAgICAgICBsbyBwYXJ0IG9mIDMyIGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIG4gICAgICAgICAgIDE2IGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworV29yZDMyIE1weV8zMl8xNiAoV29yZDE2IGhpLCBXb3JkMTYgbG8sIFdvcmQxNiBuKQoreworICAgIFdvcmQzMiBMXzMyOworCisgICAgTF8zMiA9IExfbXVsdCAoaGksIG4pOworICAgIExfMzIgPSBMX21hYyAoTF8zMiwgbXVsdCAobG8sIG4pLCAxKTsKKworICAgIHJldHVybiAoTF8zMik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIEZ1bmN0aW9uIE5hbWUgOiBEaXZfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICBGcmFjdGlvbmFsIGludGVnZXIgZGl2aXNpb24gb2YgdHdvIDMyIGJpdCBudW1iZXJzLiAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIExfbnVtIC8gTF9kZW5vbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgTF9udW0gYW5kIExfZGVub20gbXVzdCBiZSBwb3NpdGl2ZSBhbmQgTF9udW0gPCBMX2Rlbm9tLiAgICAgICAqCisgKiAgICAgICAgICAgICBMX2Rlbm9tID0gZGVub21faGk8PDE2ICsgZGVub21fbG88PDEgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIGRlbm9tX2hpIGlzIGEgbm9ybWFsaXplIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgTF9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICoKKyAqICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPCBMX251bSA8IExfZGVub20gICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICBMX2Rlbm9tID0gZGVub21faGk8PDE2ICsgZGVub21fbG88PDEgICAgICAoRFBGKSAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgZGVub21faGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAxNiBiaXQgcG9zaXRpdmUgbm9ybWFsaXplZCBpbnRlZ2VyIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgICoKKyAqICAgICAgICAgICAgIHJhbmdlIDogMHg0MDAwIDwgaGkgPCAweDdmZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgZGVub21fbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAxNiBiaXQgcG9zaXRpdmUgaW50ZWdlciB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIHJhbmdlIDogMCA8IGxvIDwgMHg3ZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgTF9kaXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICoKKyAqICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gTF9kaXYgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIC0gZmluZCA9IDEvTF9kZW5vbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgIEZpcnN0IGFwcHJveGltYXRpb246IGFwcHJveCA9IDEgLyBkZW5vbV9oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgMS9MX2Rlbm9tID0gYXBwcm94ICogKDIuMCAtIExfZGVub20gKiBhcHByb3ggKSAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgLSAgcmVzdWx0ID0gTF9udW0gKiAoMS9MX2Rlbm9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworV29yZDMyIERpdl8zMiAoV29yZDMyIExfbnVtLCBXb3JkMzIgZGVub20pCit7CisgICAgV29yZDE2IGFwcHJveDsKKyAgICBXb3JkMzIgTF8zMjsKKyAgICAvKiBGaXJzdCBhcHByb3hpbWF0aW9uOiAxIC8gTF9kZW5vbSA9IDEvZGVub21faGkgKi8KKworICAgIGFwcHJveCA9IGRpdl9zICgoV29yZDE2KSAweDNmZmYsIGRlbm9tID4+IDE2KTsKKworICAgIC8qIDEvTF9kZW5vbSA9IGFwcHJveCAqICgyLjAgLSBMX2Rlbm9tICogYXBwcm94KSAqLworCisgICAgTF8zMiA9IExfbXB5X2xzIChkZW5vbSwgYXBwcm94KTsKKworICAgIExfMzIgPSBMX3N1YiAoKFdvcmQzMikgMHg3ZmZmZmZmZkwsIExfMzIpOworCisJTF8zMiA9IExfbXB5X2xzIChMXzMyLCBhcHByb3gpOworICAgIC8qIExfbnVtICogKDEvTF9kZW5vbSkgKi8KKworCUxfMzIgPSBNVUxISUdIKExfMzIsIExfbnVtKTsKKyAgICBMXzMyID0gTF9zaGwgKExfMzIsIDMpOworCisgICAgcmV0dXJuIChMXzMyKTsKK30KKw0KKy8qIQ0KKyANCisgIFxicmllZiAgY2FsY3VsYXRlcyB0aGUgbG9nIGR1YWxpcyB0aW1lcyA0IG9mIGFyZ3VtZW50IA0KKyAgICAgICAgICBpTG9nNCh4KSA9IChXb3JkMzIpKDQgKiBsb2codmFsdWUpL2xvZygyLjApKQ0KKw0KKyAgXHJldHVybiBpbG9nNCB2YWx1ZQ0KKyANCisqLw0KK1dvcmQxNiBpTG9nNChXb3JkMzIgdmFsdWUpDQorew0KKyAgV29yZDE2IGlMb2c0Ow0KKw0KKyAgaWYodmFsdWUgIT0gMCl7DQorICAgIFdvcmQzMiB0bXA7DQorICAgIFdvcmQxNiB0bXAxNjsNCisgICAgaUxvZzQgPSBub3JtX2wodmFsdWUpOw0KKyAgICB0bXAgPSAodmFsdWUgPDwgaUxvZzQpOw0KKyAgICB0bXAxNiA9IHJvdW5kMTYodG1wKTsNCisgICAgdG1wID0gTF9tdWx0KHRtcDE2LCB0bXAxNik7DQorICAgIHRtcDE2ID0gcm91bmQxNih0bXApOw0KKyAgICB0bXAgPSBMX211bHQodG1wMTYsIHRtcDE2KTsNCisgICAgdG1wMTYgPSByb3VuZDE2KHRtcCk7DQorDQorICAgIGlMb2c0ID0gKC0oaUxvZzQgPDwgMikgLSBub3JtX3ModG1wMTYpKSAtIDE7DQorICB9DQorICBlbHNlIHsNCisgICAgaUxvZzQgPSAtMTI4OyAvKiAtKElOVF9CSVRTKjQpOyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgfQ0KKw0KKyAgcmV0dXJuIGlMb2c0Ow0KK30NCisNCisjZGVmaW5lIHN0ZXAoc2hpZnQpIFwNCisgICAgaWYgKCgweDQwMDAwMDAwbCA+PiBzaGlmdCkgKyByb290IDw9IHZhbHVlKSAgICAgICBcDQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgdmFsdWUgLT0gKDB4NDAwMDAwMDBsID4+IHNoaWZ0KSArIHJvb3Q7ICAgICAgIFwNCisgICAgICAgIHJvb3QgPSAocm9vdCA+PiAxKSB8ICgweDQwMDAwMDAwbCA+PiBzaGlmdCk7ICBcDQorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgcm9vdCA9IHJvb3QgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgfQ0KKw0KK1dvcmQzMiByc3FydChXb3JkMzIgdmFsdWUsICAgICAvKiE8IE9wZXJhbmQgdG8gc3F1YXJlIHJvb3QgKDAuMCAuLi4gMSkgKi8NCisgICAgICAgICAgICAgV29yZDMyIGFjY3VyYWN5KSAgLyohPCBOdW1iZXIgb2YgdmFsaWQgYml0cyB0aGF0IHdpbGwgYmUgY2FsY3VsYXRlZCAqLw0KK3sNCisgICAgV29yZDMyIHJvb3QgPSAwOw0KKwlXb3JkMzIgc2NhbGU7DQorDQorCWlmKHZhbHVlIDwgMCkNCisJCXJldHVybiAwOw0KKw0KKwlzY2FsZSA9IG5vcm1fbCh2YWx1ZSk7DQorCWlmKHNjYWxlICYgMSkgc2NhbGUtLTsNCisNCisJdmFsdWUgPDw9IHNjYWxlOw0KKw0KKwlzdGVwKCAwKTsgc3RlcCggMik7IHN0ZXAoIDQpOyBzdGVwKCA2KTsNCisgICAgc3RlcCggOCk7IHN0ZXAoMTApOyBzdGVwKDEyKTsgc3RlcCgxNCk7DQorICAgIHN0ZXAoMTYpOyBzdGVwKDE4KTsgc3RlcCgyMCk7IHN0ZXAoMjIpOw0KKyAgICBzdGVwKDI0KTsgc3RlcCgyNik7IHN0ZXAoMjgpOyBzdGVwKDMwKTsNCisNCisgICAgc2NhbGUgPj49IDE7DQorCWlmIChyb290IDwgdmFsdWUpDQorICAgICAgICArK3Jvb3Q7DQorDQorCXJvb3QgPj49IHNjYWxlOw0KKyAgICByZXR1cm4gcm9vdCogNDYzMzQ7DQorfQ0KKw0KK3N0YXRpYyBjb25zdCBXb3JkMzIgcG93MlRhYmxlW1BPVzJfVEFCTEVfU0laRV0gPSB7DQorMHg3ZmZmZmZmZiwgMHg3ZmE3NjVhZCwgMHg3ZjRmMDhhZSwgMHg3ZWY2ZThkYSwgDQorMHg3ZTlmMDYwNiwgMHg3ZTQ3NjAwOSwgMHg3ZGVmZjZiNiwgMHg3ZDk4YzllNiwgDQorMHg3ZDQxZDk2ZSwgMHg3Y2ViMjUyMywgMHg3Yzk0YWNkZSwgMHg3YzNlNzA3MywgDQorMHg3YmU4NmZiOSwgMHg3YjkyYWE4OCwgMHg3YjNkMjBiNiwgMHg3YWU3ZDIxYSwgDQorMHg3YTkyYmU4YiwgMHg3YTNkZTVkZiwgMHg3OWU5NDdlZiwgMHg3OTk0ZTQ5MiwgDQorMHg3OTQwYmI5ZSwgMHg3OGVjY2NlYywgMHg3ODk5MTg1NCwgMHg3ODQ1OWRhYywgDQorMHg3N2YyNWNjZSwgMHg3NzlmNTU5MSwgMHg3NzRjODdjYywgMHg3NmY5ZjM1OSwgDQorMHg3NmE3OTgwZiwgMHg3NjU1NzVjOCwgMHg3NjAzOGM1YiwgMHg3NWIxZGJhMiwgDQorMHg3NTYwNjM3NCwgMHg3NTBmMjNhYiwgMHg3NGJlMWMyMCwgMHg3NDZkNGNhYywgDQorMHg3NDFjYjUyOCwgMHg3M2NjNTU2ZCwgMHg3MzdjMmQ1NSwgMHg3MzJjM2NiYSwgDQorMHg3MmRjODM3NCwgMHg3MjhkMDE1ZCwgMHg3MjNkYjY1MCwgMHg3MWVlYTIyNiwgDQorMHg3MTlmYzRiOSwgMHg3MTUxMWRlNCwgMHg3MTAyYWQ4MCwgMHg3MGI0NzM2OCwgDQorMHg3MDY2NmY3NiwgMHg3MDE4YTE4NSwgMHg2ZmNiMDk2ZiwgMHg2ZjdkYTcxMCwgDQorMHg2ZjMwN2E0MSwgMHg2ZWUzODJkZSwgMHg2ZTk2YzBjMywgMHg2ZTRhMzNjOSwgDQorMHg2ZGZkZGJjYywgMHg2ZGIxYjhhOCwgMHg2ZDY1Y2EzOCwgMHg2ZDFhMTA1NywgDQorMHg2Y2NlOGFlMSwgMHg2YzgzMzliMiwgMHg2YzM4MWNhNiwgMHg2YmVkMzM5OCwgDQorMHg2YmEyN2U2NiwgMHg2YjU3ZmNlOSwgMHg2YjBkYWVmZiwgMHg2YWMzOTQ4NSwgDQorMHg2YTc5YWQ1NiwgMHg2YTJmZjk0ZiwgMHg2OWU2Nzg0ZCwgMHg2OTlkMmEyYywgDQorMHg2OTU0MGVjOSwgMHg2OTBiMjYwMSwgMHg2OGMyNmZiMSwgMHg2ODc5ZWJiNiwgDQorMHg2ODMxOTllZCwgMHg2N2U5N2EzNCwgMHg2N2ExOGM2OCwgMHg2NzU5ZDA2NSwgDQorMHg2NzEyNDYwYiwgMHg2NmNhZWQzNSwgMHg2NjgzYzVjMywgMHg2NjNjY2Y5MiwgDQorMHg2NWY2MGE4MCwgMHg2NWFmNzY2YSwgMHg2NTY5MTMyZiwgMHg2NTIyZTBhZCwgDQorMHg2NGRjZGVjMywgMHg2NDk3MGQ0ZiwgMHg2NDUxNmMyZSwgMHg2NDBiZmI0MSwgDQorMHg2M2M2YmE2NCwgMHg2MzgxYTk3OCwgMHg2MzNjYzg1YiwgMHg2MmY4MTZlYiwgDQorMHg2MmIzOTUwOSwgMHg2MjZmNDI5MiwgMHg2MjJiMWY2NiwgMHg2MWU3MmI2NSwgDQorMHg2MWEzNjY2ZCwgMHg2MTVmZDA1ZiwgMHg2MTFjNjkxOSwgMHg2MGQ5MzA3YiwgDQorMHg2MDk2MjY2NSwgMHg2MDUzNGFiNywgMHg2MDEwOWQ1MSwgMHg1ZmNlMWUxMiwgDQorMHg1ZjhiY2NkYiwgMHg1ZjQ5YTk4YywgMHg1ZjA3YjQwNSwgMHg1ZWM1ZWMyNiwgDQorMHg1ZTg0NTFkMCwgMHg1ZTQyZTRlMywgMHg1ZTAxYTU0MCwgMHg1ZGMwOTJjNywgDQorMHg1ZDdmYWQ1OSwgMHg1ZDNlZjRkNywgMHg1Y2ZlNjkyMywgMHg1Y2JlMGExYywgDQorMHg1YzdkZDdhNCwgMHg1YzNkZDE5YywgMHg1YmZkZjdlNSwgMHg1YmJlNGE2MSwgDQorMHg1YjdlYzhmMiwgMHg1YjNmNzM3NywgMHg1YjAwNDlkNCwgMHg1YWMxNGJlYSwgDQorMHg1YTgyNzk5YSwgMHg1YTQzZDJjNiwgMHg1YTA1NTc1MSwgMHg1OWM3MDcxYywgDQorMHg1OTg4ZTIwOSwgMHg1OTRhZTdmYiwgMHg1OTBkMThkMywgMHg1OGNmNzQ3NCwgDQorMHg1ODkxZmFjMSwgMHg1ODU0YWI5YiwgMHg1ODE3ODZlNiwgMHg1N2RhOGM4MywgDQorMHg1NzlkYmM1NywgMHg1NzYxMTY0MiwgMHg1NzI0OWEyOSwgMHg1NmU4NDdlZiwgDQorMHg1NmFjMWY3NSwgMHg1NjcwMjBhMCwgMHg1NjM0NGI1MiwgMHg1NWY4OWY3MCwgDQorMHg1NWJkMWNkYiwgMHg1NTgxYzM3OCwgMHg1NTQ2OTMyOSwgMHg1NTBiOGJkNCwgDQorMHg1NGQwYWQ1YiwgMHg1NDk1ZjdhMSwgMHg1NDViNmE4YiwgMHg1NDIxMDVmZCwgDQorMHg1M2U2YzlkYiwgMHg1M2FjYjYwNywgMHg1MzcyY2E2OCwgMHg1MzM5MDZlMCwgDQorMHg1MmZmNmI1NSwgMHg1MmM1ZjdhYSwgMHg1MjhjYWJjMywgMHg1MjUzODc4NiwgDQorMHg1MjFhOGFkNywgMHg1MWUxYjU5YSwgMHg1MWE5MDdiNCwgMHg1MTcwODEwYiwgDQorMHg1MTM4MjE4MiwgMHg1MGZmZThmZSwgMHg1MGM3ZDc2NSwgMHg1MDhmZWM5YywgDQorMHg1MDU4Mjg4OCwgMHg1MDIwOGIwZSwgMHg0ZmU5MTQxMywgMHg0ZmIxYzM3YywgDQorMHg0ZjdhOTkzMCwgMHg0ZjQzOTUxNCwgMHg0ZjBjYjcwYywgMHg0ZWQ1ZmYwMCwgDQorMHg0ZTlmNmNkNCwgMHg0ZTY5MDA2ZSwgMHg0ZTMyYjliNCwgMHg0ZGZjOTg4YywgDQorMHg0ZGM2OWNkZCwgMHg0ZDkwYzY4YiwgMHg0ZDViMTU3ZSwgMHg0ZDI1ODk5YywgDQorMHg0Y2YwMjJjYSwgMHg0Y2JhZTBlZiwgMHg0Yzg1YzNmMSwgMHg0YzUwY2JiOCwgDQorMHg0YzFiZjgyOSwgMHg0YmU3NDkyYiwgMHg0YmIyYmVhNSwgMHg0YjdlNTg3ZCwgDQorMHg0YjRhMTY5YywgMHg0YjE1ZjhlNiwgMHg0YWUxZmY0MywgMHg0YWFlMjk5YiwgDQorMHg0YTdhNzdkNSwgMHg0YTQ2ZTlkNiwgMHg0YTEzN2Y4OCwgMHg0OWUwMzhkMCwgDQorMHg0OWFkMTU5OCwgMHg0OTdhMTVjNCwgMHg0OTQ3MzkzZiwgMHg0OTE0N2ZlZSwgDQorMHg0OGUxZTliYSwgMHg0OGFmNzY4YSwgMHg0ODdkMjY0NiwgMHg0ODRhZjhkNiwgDQorMHg0ODE4ZWUyMiwgMHg0N2U3MDYxMSwgMHg0N2I1NDA4YywgMHg0NzgzOWQ3YiwgDQorMHg0NzUyMWNjNiwgMHg0NzIwYmU1NSwgMHg0NmVmODIxMCwgMHg0NmJlNjdlMCwgDQorMHg0NjhkNmZhZSwgMHg0NjVjOTk2MSwgMHg0NjJiZTRlMiwgMHg0NWZiNTIxYSwgDQorMHg0NWNhZTBmMiwgMHg0NTlhOTE1MiwgMHg0NTZhNjMyMywgMHg0NTNhNTY0ZCwgDQorMHg0NTBhNmFiYiwgMHg0NGRhYTA1NCwgMHg0NGFhZjcwMiwgMHg0NDdiNmVhZCwgDQorMHg0NDRjMDc0MCwgMHg0NDFjYzBhMywgMHg0M2VkOWFjMCwgMHg0M2JlOTU4MCwgDQorMHg0MzhmYjBjYiwgMHg0MzYwZWM4ZCwgMHg0MzMyNDhhZSwgMHg0MzAzYzUxNywgDQorMHg0MmQ1NjFiNCwgMHg0MmE3MWU2YywgMHg0Mjc4ZmIyYiwgMHg0MjRhZjdkYSwgDQorMHg0MjFkMTQ2MiwgMHg0MWVmNTBhZSwgMHg0MWMxYWNhOCwgMHg0MTk0MjgzOSwgDQorMHg0MTY2YzM0YywgMHg0MTM5N2RjYywgMHg0MTBjNTdhMiwgMHg0MGRmNTBiOCwgDQorMHg0MGIyNjhmYSwgMHg0MDg1YTA1MSwgMHg0MDU4ZjZhOCwgMHg0MDJjNmJlOSANCit9Ow0KKw0KKy8qIQ0KKyANCisgIFxicmllZiBjYWxjdWxhdGVzIDIgXiAoeC95KSBmb3IgeDw9MCwgeSA+IDAsIHggPD0gMzI3NjggKiB5IA0KKyAgDQorICBhdm9pZHMgaW50ZWdlciBkaXZpc2lvbg0KKyAgDQorICBccmV0dXJuIA0KKyovDQorV29yZDMyIHBvdzJfeHkoV29yZDMyIHgsIFdvcmQzMiB5KQ0KK3sNCisgIFdvcmQzMiBpUGFydDsNCisgIFdvcmQzMiBmUGFydDsNCisgIFdvcmQzMiByZXM7DQorICBXb3JkMzIgdG1wLCB0bXAyOw0KKyAgV29yZDMyIHNoaWZ0LCBzaGlmdDI7DQorDQorICB0bXAyID0gLXg7DQorICBpUGFydCA9IHRtcDIgLyB5Ow0KKyAgZlBhcnQgPSB0bXAyIC0gaVBhcnQqeTsNCisgIGlQYXJ0ID0gbWluKGlQYXJ0LElOVF9CSVRTLTEpOw0KKw0KKyAgcmVzID0gcG93MlRhYmxlWyhQT1cyX1RBQkxFX1NJWkUqZlBhcnQpL3ldID4+IGlQYXJ0OyANCisgDQorICByZXR1cm4ocmVzKTsNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC9vcGVyXzMyYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTliYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL29wZXJfMzJiLmgKQEAgLTAsMCArMSw4OSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJb3Blcl8zMmIuaA0KKw0KKwlDb250ZW50OglEb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fT1BFUl8zMmJfSAorI2RlZmluZSBfX09QRVJfMzJiX0gKKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisNCisjZGVmaW5lIFBPVzJfVEFCTEVfQklUUyA4DQorI2RlZmluZSBQT1cyX1RBQkxFX1NJWkUgKDE8PFBPVzJfVEFCTEVfQklUUykNCisKK3ZvaWQgTF9FeHRyYWN0IChXb3JkMzIgTF8zMiwgV29yZDE2ICpoaSwgV29yZDE2ICpsbyk7CitXb3JkMzIgTF9Db21wIChXb3JkMTYgaGksIFdvcmQxNiBsbyk7CitXb3JkMzIgTXB5XzMyIChXb3JkMTYgaGkxLCBXb3JkMTYgbG8xLCBXb3JkMTYgaGkyLCBXb3JkMTYgbG8yKTsKK1dvcmQzMiBNcHlfMzJfMTYgKFdvcmQxNiBoaSwgV29yZDE2IGxvLCBXb3JkMTYgbik7CitXb3JkMzIgRGl2XzMyIChXb3JkMzIgTF9udW0sIFdvcmQzMiBkZW5vbSk7CitXb3JkMTYgaUxvZzQoV29yZDMyIHZhbHVlKTsNCitXb3JkMzIgcnNxcnQoV29yZDMyIHZhbHVlLCAgV29yZDMyIGFjY3VyYWN5KTsNCitXb3JkMzIgcG93Ml94eShXb3JkMzIgeCwgV29yZDMyIHkpOw0KKw0KK19faW5saW5lIFdvcmQzMiBMX21weV9scyhXb3JkMzIgTF92YXIyLCBXb3JkMTYgdmFyMSkNCit7DQorICAgIHVuc2lnbmVkIHNob3J0IHN3TG93MTsNCisgICAgV29yZDE2IHN3SGlnaDE7DQorICAgIFdvcmQzMiBsX3Zhcl9vdXQ7DQorDQorICAgIHN3TG93MSA9ICh1bnNpZ25lZCBzaG9ydCkoTF92YXIyKTsNCisgICAgc3dIaWdoMSA9IChXb3JkMTYpKExfdmFyMiA+PiAxNik7DQorDQorICAgIGxfdmFyX291dCA9IChsb25nKXN3TG93MSAqIChsb25nKXZhcjEgPj4gMTU7DQorICAgIA0KKyAgICBsX3Zhcl9vdXQgKz0gc3dIaWdoMSAqIHZhcjEgPDwgMTsNCisgICAgDQorICAgIHJldHVybihsX3Zhcl9vdXQpOw0KK30NCisNCitfX2lubGluZSBXb3JkMzIgTF9tcHlfd3goV29yZDMyIExfdmFyMiwgV29yZDE2IHZhcjEpDQorew0KKyNpZiBBUk1WNVRFX0xfTVBZX0xTDQorCVdvcmQzMiByZXN1bHQ7IA0KKwlhc20gdm9sYXRpbGUoIA0KKwkJIlNNVUxXQiAgJVtyZXN1bHRdLCAlW0xfdmFyMl0sICVbdmFyMV0gXG4iIA0KKwkJOltyZXN1bHRdIityIihyZXN1bHQpDQorCQk6W0xfdmFyMl0iciIoTF92YXIyKSwgW3ZhcjFdInIiKHZhcjEpDQorCQkpOyANCisJcmV0dXJuIHJlc3VsdDsNCisjZWxzZQ0KKyAgICB1bnNpZ25lZCBzaG9ydCBzd0xvdzE7DQorICAgIFdvcmQxNiBzd0hpZ2gxOw0KKyAgICBXb3JkMzIgbF92YXJfb3V0Ow0KKw0KKyAgICBzd0xvdzEgPSAodW5zaWduZWQgc2hvcnQpKExfdmFyMik7DQorICAgIHN3SGlnaDEgPSAoV29yZDE2KShMX3ZhcjIgPj4gMTYpOw0KKw0KKyAgICBsX3Zhcl9vdXQgPSAobG9uZylzd0xvdzEgKiAobG9uZyl2YXIxID4+IDE2OyAgICANCisgICAgbF92YXJfb3V0ICs9IHN3SGlnaDEgKiB2YXIxOw0KKyAgICANCisgICAgcmV0dXJuKGxfdmFyX291dCk7DQorI2VuZGlmDQorfQ0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYmFzaWNfb3AvdHlwZWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTYyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWYuaApAQCAtMCwwICsxLDYzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl0eXBlZGVmLmgNCisNCisJQ29udGVudDoJdHlwZSBkZWZpbmVkIGZvciBkZWZmZXJlbnQgcGFsdGZvcm0NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIHR5cGVkZWZfaAorI2RlZmluZSB0eXBlZGVmX2ggIiRJZCAkIgorCisjdW5kZWYgT1JJR0lOQUxfVFlQRURFRl9IIC8qIGRlZmluZSB0byBnZXQgIm9yaWdpbmFsIiBFVFNJIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdHlwZWRlZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmIE9SSUdJTkFMX1RZUEVERUZfSAorLyoKKyAqIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvZGUgZnJvbSB0aGUgRVRTSSBmaWxlIHR5cGVkZWYuaAorICovCisgICAKKyNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX1pUQ19fKQordHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKK3R5cGVkZWYgc2hvcnQgV29yZDE2OwordHlwZWRlZiBsb25nIFdvcmQzMjsKK3R5cGVkZWYgaW50IEZsYWc7CisKKyNlbGlmIGRlZmluZWQoX19zdW4pCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwordHlwZWRlZiBzaG9ydCBXb3JkMTY7Cit0eXBlZGVmIGxvbmcgV29yZDMyOwordHlwZWRlZiBpbnQgRmxhZzsKKworI2VsaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX3VuaXgpCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4OwordHlwZWRlZiBzaG9ydCBXb3JkMTY7Cit0eXBlZGVmIGludCBXb3JkMzI7Cit0eXBlZGVmIGludCBGbGFnOworCisjZW5kaWYKKyNlbHNlIC8qIG5vdCBvcmlnaW5hbCB0eXBlZGVmLmggKi8KKworLyoKKyAqIHVzZSAoaW1wcm92ZWQpIHR5cGUgZGVmaW5pdGlvbiBmaWxlIHR5cGRlZnMuaCBhbmQgYWRkIGEgIkZsYWciIHR5cGUKKyAqLw0KKyNpbmNsdWRlICJ0eXBlZGVmcy5oIgordHlwZWRlZiBpbnQgRmxhZzsKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9iYXNpY19vcC90eXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTZmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2Jhc2ljX29wL3R5cGVkZWZzLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXR5cGVkZWZzLmgNCisNCisJQ29udGVudDoJdHlwZSBkZWZpbmVkIG9yIGNvbnN0IGRlZmluZWQNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIHR5cGVkZWZzX2gKKyNkZWZpbmUgdHlwZWRlZnNfaCAiJElkICQiCisKKyNpZm5kZWYgQ0hBUl9CSVQNCisjZGVmaW5lIENIQVJfQklUICAgICAgOCAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGEgY2hhciAqLw0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgVk9BQUNfU0hSVF9NQVgNCisjZGVmaW5lIFZPQUFDX1NIUlRfTUFYICAgICgzMjc2NykgICAgICAgIC8qIG1heGltdW0gKHNpZ25lZCkgc2hvcnQgdmFsdWUgKi8NCisjZW5kaWYNCisKKyNpZm5kZWYgVk9BQUNfU0hSVF9NSU4NCisjZGVmaW5lIFZPQUFDX1NIUlRfTUlOICAgICgtMzI3NjgpICAgICAgICAvKiBtaW5pbXVtIChzaWduZWQpIHNob3J0IHZhbHVlICovDQorI2VuZGlmDQorCisvKiBEZWZpbmUgTlVMTCBwb2ludGVyIHZhbHVlICovDQorI2lmbmRlZiBOVUxMDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorI2RlZmluZSBOVUxMICAgIDANCisjZWxzZQ0KKyNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQ0KKyNlbmRpZg0KKyNlbmRpZgorCisjaWZuZGVmIGFzc2VydAorI2RlZmluZSBhc3NlcnQoX0V4cHJlc3Npb24pICAgICAoKHZvaWQpMCkKKyNlbmRpZgorDQorI2lmZGVmIExJTlVYDQorI2RlZmluZSBfX2lubGluZSBzdGF0aWMgX19pbmxpbmVfXw0KKyNlbmRpZg0KKworI2RlZmluZSBJTlRfQklUUyAgIDMyCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBDT05TVEFOVFMgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKy8qCisgKioqKioqKioqIGRlZmluZSBjaGFyIHR5cGUKKyAqLwordHlwZWRlZiBjaGFyIENoYXI7CisKKy8qCisgKioqKioqKioqIGRlZmluZSA4IGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMKKyAqLwordHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVV29yZDg7CisvKgorICoqKioqKioqKiBkZWZpbmUgMTYgYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cworICovCit0eXBlZGVmIHNob3J0IFdvcmQxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVVdvcmQxNjsKKworLyoKKyAqKioqKioqKiogZGVmaW5lIDMyIGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMKKyAqLwordHlwZWRlZiBsb25nIFdvcmQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVV29yZDMyOworCisNCisNCisjaWZkZWYgTElOVVgKK3R5cGVkZWYgbG9uZyBsb25nIFdvcmQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVXb3JkNjQ7CisjZWxzZQordHlwZWRlZiBfX2ludDY0IFdvcmQ2NDsNCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgVVdvcmQ2NDsKKyNlbmRpZgorCisjaWZuZGVmIG1pbg0KKyNkZWZpbmUgbWluKGEsYikgKCBhIDwgYiA/IGEgOiBiKQ0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgbWF4DQorI2RlZmluZSBtYXgoYSxiKSAoIGEgPiBiID8gYSA6IGIpDQorI2VuZGlmDQorDQorI2lmZGVmIEFSTV9JTkFTTQ0KKyNpZmRlZiBBUk1WNV9JTkFTTQ0KKyNkZWZpbmUgQVJNVjVFX0lOQVNNCTENCisjZW5kaWYNCisjZGVmaW5lIEFSTVY0X0lOQVNNCQkxDQorI2VuZGlmDQorCisjaWYgQVJNVjRfSU5BU00NCisJI2RlZmluZSBBUk1WNVRFX1NBVCAgICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfQUREICAgICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9TVUIgICAgICAgICAgIDENCisJI2RlZmluZSBBUk1WNVRFX1NITCAgICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfU0hSICAgICAgICAgICAxDQorCSNkZWZpbmUgQVJNVjVURV9MX1NITCAgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX0xfU0hSICAgICAgICAgMQ0KKyNlbmRpZi8vQVJNVjQNCisjaWYgQVJNVjVFX0lOQVNNDQorICAgICNkZWZpbmUgQVJNVjVURV9MX0FERCAgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX0xfU1VCICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfTF9NVUxUICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9MX01BQyAgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX0xfTVNVICAgICAgICAgMQ0KKyAgIA0KKyAgICANCisgICAgI2RlZmluZSBBUk1WNVRFX0RJVl9TICAgICAgICAgMQ0KKyAgICAjZGVmaW5lIEFSTVY1VEVfUk9VTkQgICAgICAgICAxDQorICAgICNkZWZpbmUgQVJNVjVURV9NVUxUICAgICAgICAgIDENCisgICAgDQorICAgICNkZWZpbmUgQVJNVjVURV9OT1JNX1MgICAgICAgIDENCisgICAgI2RlZmluZSBBUk1WNVRFX05PUk1fTCAgICAgICAgMQ0KKwkjZGVmaW5lIEFSTVY1VEVfTF9NUFlfTFMJICAxDQorI2VuZGlmCisNCisvL2Jhc2ljIG9wZXJhdGlvbiBmdW5jdGlvbnMgb3B0aW1pemF0aW9uIGZsYWdzDQorI2RlZmluZSBTQVRSVUFURV9JU19JTkxJTkUgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzYXR1cmF0ZSBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIFNITF9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgLy9kZWZpbmUgc2hsIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgU0hSX0lTX0lOTElORSAgICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgc2hyIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTF9NVUxUX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9tdWx0IGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTF9NU1VfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9tc3UgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBMX1NVQl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3N1YiBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIExfU0hMX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfc2hsIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTF9TSFJfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgTF9zaHIgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBBRERfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBhZGQgYXMgaW5saW5lIGZ1bmN0aW9uIC8vYWRkLCBpbmxpbmUgaXMgdGhlIGJlc3QNCisjZGVmaW5lIFNVQl9JU19JTkxJTkUgICAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIHN1YiBhcyBpbmxpbmUgZnVuY3Rpb24gLy9zdWIsIGlubGluZSBpcyB0aGUgYmVzdA0KKyNkZWZpbmUgRElWX1NfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZGl2X3MgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBNVUxUX0lTX0lOTElORSAgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBtdWx0IGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTk9STV9TX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbm9ybV9zIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTk9STV9MX0lTX0lOTElORSAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbm9ybV9sIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgUk9VTkRfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgcm91bmQgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBMX01BQ19JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX21hYyBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIExfQUREX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIExfYWRkIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgRVhUUkFDVF9IX0lTX0lOTElORSAgICAgICAgICAgICAxICAgLy9kZWZpbmUgZXh0cmFjdF9oIGFzIGlubGluZSBmdW5jdGlvbiANCisjZGVmaW5lIEVYVFJBQ1RfTF9JU19JTkxJTkUgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIGV4dHJhY3RfbCBhcyBpbmxpbmUgZnVuY3Rpb24gICAgICAgIC8vPz8/DQorI2RlZmluZSBNVUxUX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBtdWx0X3IgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBTSFJfUl9JU19JTkxJTkUgICAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBzaHJfciBhcyBpbmxpbmUgZnVuY3Rpb24NCisjZGVmaW5lIE1BQ19SX0lTX0lOTElORSAgICAgICAgICAgICAgICAgMSAgIC8vZGVmaW5lIG1hY19yIGFzIGlubGluZSBmdW5jdGlvbg0KKyNkZWZpbmUgTVNVX1JfSVNfSU5MSU5FICAgICAgICAgICAgICAgICAxICAgLy9kZWZpbmUgbXN1X3IgYXMgaW5saW5lIGZ1bmN0aW9uDQorI2RlZmluZSBMX1NIUl9SX0lTX0lOTElORSAgICAgICAgICAgICAgIDEgICAvL2RlZmluZSBMX3Nocl9yIGFzIGlubGluZSBmdW5jdGlvbg0KKw0KKyNkZWZpbmUgUFJFRklYCQkJCXZvQUFDRW5jDQorI2RlZmluZSBMSU5LMCh4LCB5LCB6KQkJTElOSzEoeCx5LHopDQorI2RlZmluZSBMSU5LMSh4LHkseikJCXgjI3kjI3oNCisjZGVmaW5lIEFERF9QUkVGSVgoZnVuYykJTElOSzAoUFJFRklYLCBfLCBmdW5jKQ0KKw0KKyNkZWZpbmUgIExfRXh0cmFjdAkJQUREX1BSRUZJWChMX0V4dHJhY3QpDQorI2RlZmluZSAgTF9Db21wCQkJQUREX1BSRUZJWChMX0NvbXApDQorI2RlZmluZSAgTXB5XzMyCQkJQUREX1BSRUZJWChNcHlfMzIpDQorI2RlZmluZSAgTXB5XzMyXzE2CQlBRERfUFJFRklYKE1weV8zMl8xNikNCisjZGVmaW5lICBEaXZfMzIJCQlBRERfUFJFRklYKERpdl8zMikNCisjZGVmaW5lICBpTG9nNAkJCUFERF9QUkVGSVgoaUxvZzQpDQorI2RlZmluZSAgcnNxcnQJCQlBRERfUFJFRklYKHJzcXJ0KQ0KKyNkZWZpbmUgIHBvdzJfeHkJCUFERF9QUkVGSVgocG93Ml94eSkNCisjZGVmaW5lICBMX21weV9scwkJQUREX1BSRUZJWChMX21weV9scykNCisjZGVmaW5lICBMX21weV93eAkJQUREX1BSRUZJWChMX21weV93eCkNCisNCisjZGVmaW5lIG1lbV9tYWxsb2MJCUFERF9QUkVGSVgobWVtX21hbGxvYykNCisjZGVmaW5lIG1lbV9mcmVlCQlBRERfUFJFRklYKG1lbV9mcmVlKQ0KKw0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjYzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNUUvTWFrZWZpbGUKQEAgLTAsMCArMSw1NSBAQAorIy8qDQorIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyoqDQorIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMqKg0KKyMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyoqDQorIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyovDQorDQorIyB0YXJnZXQ2DQorIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pDQorVk9UVDo9IHY1DQorDQorDQorIyBtb2R1bGUgdHlwZQ0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUNCitWT01UOj0gbGliDQorDQorDQorIyBtb2R1bGUgbWFjcm9zDQorIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4gDQorIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlIA0KK1ZPTU06PSAtREFSTVY1RSAtREFSTV9JTkFTTSAtREFSTVY1X0lOQVNNIA0KKw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCitWT1RBUkdFVDo9bGlidm9BQUNFbmN2NQ0KKw0KKw0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIA0KKw0KKyMgZGVwZW5kZW50IGxpYnJhcmllcy4NCitWT0RFUExJQlM6PSMtbGRsIC1sc3RkYysrIA0KKw0KKyMgbW9kdWxlIHNvdXJjZQ0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlDQoraW5jbHVkZSAuLi8uLi9tcy5taw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZA0KK1ZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi8uLi9SZWxlYXNlDQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2J1aWxkL2VjbGFpci9BUk1WNy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGNlMmMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUKQEAgLTAsMCArMSw1NSBAQAorIy8qDQorIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyoqDQorIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMqKg0KKyMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyoqDQorIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyovDQorDQorIyB0YXJnZXQ2DQorIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pDQorVk9UVDo9IHY3DQorDQorDQorIyBtb2R1bGUgdHlwZQ0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUNCitWT01UOj0gbGliDQorDQorDQorIyBtb2R1bGUgbWFjcm9zDQorIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4gDQorIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlIA0KK1ZPTU06PSAtREFSTVY1RSAtREFSTVY3TmVvbiAtREFSTV9JTkFTTSAtREFSTVY1X0lOQVNNIA0KKw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCitWT1RBUkdFVDo9bGlidm9BQUNFbmN2Nw0KKw0KKw0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIA0KKw0KKyMgZGVwZW5kZW50IGxpYnJhcmllcy4NCitWT0RFUExJQlM6PSMtbGRsIC1sc3RkYysrIA0KKw0KKyMgbW9kdWxlIHNvdXJjZQ0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlDQoraW5jbHVkZSAuLi8uLi9tcy5taw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZA0KK1ZPUkVMRElSOj0uLi8uLi8uLi8uLi8uLi8uLi9SZWxlYXNlDQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGRvaXQubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2RvaXQubWsgIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL21ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9lY2xhaXIvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiM2MxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvZWNsYWlyL21ha2VmaWxlCkBAIC0wLDAgKzEsNDAgQEAKKyMvKgorIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCisjKioKKyMqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjKioKKyMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjKioKKyMqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjKi8KKworIyBKdXN0IGFjdGluZyBhcyBGYXRoZXIgTWFrZWZpbGUgb2YgTW9kdWxlcworIyBwbGVhc2Uga2VlcCB0aGUgbmFtZSAnbWFrZWZpbGUnIHVuY2hhbmdlZAorIAorIyBNb2R1bGUgU3ViZGlycworVk9NU0Q6PSQoZGlyICQoc2hlbGwgZmluZCAuIC1uYW1lICdNYWtlZmlsZScpKQorCithbGw6CisJZm9yIGRpciBpbiAkKFZPTVNEKTsgXAorCQlkbyBcCisJCQkkKE1BS0UpIC1DICQkZGlyOyBcCisJCWRvbmUKKworLlBIT05ZOmNsZWFuIGRldmVsCitjbGVhbjoKKwlmb3IgZGlyIGluICQoVk9NU0QpOyBcCisJCWRvIFwKKwkJCSQoTUFLRSkgLUMgJCRkaXIgY2xlYW47IFwKKwkJZG9uZQorCitkZXZlbDoKKwlmb3IgZGlyIGluICQoVk9NU0QpOyBcCisJCWRvIFwKKwkJCSQoTUFLRSkgLUMgJCRkaXIgZGV2ZWw7IFwKKwkJZG9uZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9idWlsZC9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvbXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3ZWZiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvYnVpbGQvbXMubWsKQEAgLTAsMCArMSw0MiBAQAorIy8qDQorIyoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyoqDQorIyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyMqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMqKg0KKyMqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyoqDQorIyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyovDQorDQorDQorIyBwbGVhc2UgbGlzdCBhbGwgb2JqZWN0cyBuZWVkZWQgYnkgeW91ciB0YXJnZXQgaGVyZQ0KK09CSlM6PWJhc2ljb3AyLm8gb3Blcl8zMmIubyBhYWNfcm9tLm8gYWFjZW5jLm8gYWFjZW5jX2NvcmUubyBhZGpfdGhyLm8gXA0KKwkJCWJhbmRfbnJnLm8gYml0X2NudC5vIGJpdGJ1ZmZlci5vIGJpdGVuYy5vIGJsb2NrX3N3aXRjaC5vIGNoYW5uZWxfbWFwLm8gXA0KKwkJCWR5bl9iaXRzLm8gZ3JwX2RhdGEubyBpbnRlcmZhY2UubyBsaW5lX3BlLm8gbWVtYWxpZ24ubyBtc19zdGVyZW8ubyBcDQorCQkJcHJlX2VjaG9fY29udHJvbC5vIHBzeV9jb25maWd1cmF0aW9uLm8gcHN5X21haW4ubyBxY19tYWluLm8gcXVhbnRpemUubyBzZl9lc3RpbS5vIFwNCisJCQlzcHJlYWRpbmcubyBzdGF0X2JpdHMubyB0bnMubyB0cmFuc2Zvcm0ubw0KKwkJCQ0KKyMgcGxlYXNlIGxpc3QgYWxsIGRpcmVjdG9yaWVzIHRoYXQgYWxsIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB3aXRoIHlvdXIgbW9kdWxlKC5oIC5jIC5jcHApIGxvY2F0ZSANCitWT1NSQ0RJUjo9Li4vLi4vLi4vc3JjIFwNCisJCQkJCS4uLy4uLy4uL2luYyBcDQorCQkJCQkuLi8uLi8uLi9iYXNpY19vcFwNCisJCQkJCS4uLy4uLy4uLy4uLy4uL0luY2x1ZGUgDQorCQkJCQkNCitpZmVxICgkKFZPVFQpLCB2NSkNCitPQkpTKz0gQXV0b0NvcnJlbGF0aW9uX3Y1Lm8gYmFuZF9ucmdfdjUubyBDYWxjV2luZG93RW5lcmd5X3Y1Lm8gXA0KKwkJCQlQcmVQb3N0TURDVF92NS5vIFI0UjhGaXJzdF92NS5vIFJhZGl4NEZGVF92NS5vDQorVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY1RS8NCitlbmRpZgkNCisNCitpZmVxICgkKFZPVFQpLCB2NykNCitPQkpTKz0gQXV0b0NvcnJlbGF0aW9uX3Y1Lm8gYmFuZF9ucmdfdjUubyBDYWxjV2luZG93RW5lcmd5X3Y1Lm8gXA0KKwkJCSBQcmVQb3N0TURDVF92Ny5vIFI0UjhGaXJzdF92Ny5vIFJhZGl4NEZGVF92Ny5vDQorVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY1RS8NCitWT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjcvDQorZW5kaWYJCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvZG9jL3ZvQUFDRW5jb2RlclNESy5wZGYgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2RvYy92b0FBQ0VuY29kZXJTREsucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGQwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2RvYy92b0FBQ0VuY29kZXJTREsucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY19yb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQyOWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjX3JvbS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlhYWNfcm9tLmgNCisNCisJQ29udGVudDoJY29uc3RhbnQgdGFibGVzIA0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgUk9NX0gKKyNkZWZpbmUgUk9NX0gKKw0KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJ0bnNfcGFyYW0uaCIKKworLyoKKyAgbWRjdAorKi8KK2V4dGVybiBjb25zdCBpbnQgU2hvcnRXaW5kb3dTaW5lW0ZSQU1FX0xFTl9TSE9SVC8yXTsKK2V4dGVybiBjb25zdCBpbnQgTG9uZ1dpbmRvd0tCRFtGUkFNRV9MRU5fTE9ORy8yXTsNCisNCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBiaXRyZXZUYWJbMTcgKyAxMjldOw0KK2V4dGVybiBjb25zdCBpbnQgY29zc2ludGFiWzEyOCArIDEwMjRdOw0KKw0KKyNpZiBkZWZpbmVkIChBUk1WNUUpICYmICFkZWZpbmVkIChBUk1WN05lb24pDQorZXh0ZXJuIGNvbnN0IGludCB0d2lkVGFiNjRbKDQqNiArIDE2KjYpLzJdOw0KK2V4dGVybiBjb25zdCBpbnQgdHdpZFRhYjUxMlsoOCo2ICsgMzIqNiArIDEyOCo2KS8yXTsNCisjZWxzZQ0KK2V4dGVybiBjb25zdCBpbnQgdHdpZFRhYjY0WzQqNiArIDE2KjZdOw0KK2V4dGVybiBjb25zdCBpbnQgdHdpZFRhYjUxMls4KjYgKyAzMio2ICsgMTI4KjZdOworI2VuZGlmCisKKy8qCisgIGZvcm0gZmFjdG9yCisqLworZXh0ZXJuIGNvbnN0IFdvcmQzMiBmb3JtZmFjX3NxcnR0YWJsZVs5Nl07CisKKy8qCisgIHF1YW50aXplcgorKi8KK2V4dGVybiBjb25zdCBXb3JkMzIgbVRhYl8zXzRbNTEyXTsKK2V4dGVybiBjb25zdCBXb3JkMzIgbVRhYl80XzNbNTEyXTsKKy8qISAkMl57LVxmcmFje259ezE2fX0kIHRhYmxlICovCitleHRlcm4gY29uc3QgV29yZDE2IHBvdzJ0b21pbnVzTm92ZXIxNlsxN10gOworCitleHRlcm4gV29yZDMyIHNwZWNFeHBNYW50VGFibGVDb21iX2VuY1s0XVsxNF07CitleHRlcm4gY29uc3QgVVdvcmQ4IHNwZWNFeHBUYWJsZUNvbWJfZW5jWzRdWzE0XTsKKworZXh0ZXJuIGNvbnN0IFdvcmQxNiBxdWFudEJvcmRlcnNbNF1bNF07CisvL2V4dGVybiBjb25zdCBXb3JkMTYgcXVhbnRSZWNvblszXVs0XTsNCitleHRlcm4gY29uc3QgV29yZDE2IHF1YW50UmVjb25bNF1bM107CisKKy8qCisgIGh1ZmZtYW4KKyovCitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxXzJbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWIzXzRbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWI1XzZbOV1bOV07CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWI3XzhbOF1bOF07CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWI5XzEwWzEzXVsxM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2x0YWIxMVsxN11bMTddOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9sdGFic2NmWzEyMV07CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIxWzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMlszXVszXVszXVszXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjNbM11bM11bM11bM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI0WzNdWzNdWzNdWzNdOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNVs5XVs5XTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjZbOV1bOV07CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWI3WzhdWzhdOworZXh0ZXJuIGNvbnN0IFVXb3JkMTYgaHVmZl9jdGFiOFs4XVs4XTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjlbMTNdWzEzXTsKK2V4dGVybiBjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjEwWzEzXVsxM107CitleHRlcm4gY29uc3QgVVdvcmQxNiBodWZmX2N0YWIxMVsxN11bMTddOworZXh0ZXJuIGNvbnN0IFVXb3JkMzIgaHVmZl9jdGFic2NmWzEyMV07CisKKworCisvKgorICBtaXNjCisqLworZXh0ZXJuIGNvbnN0IGludCBzYW1wUmF0ZVRhYltOVU1fU0FNUExFX1JBVEVTXTsNCitleHRlcm4gY29uc3QgaW50IEJhbmR3aXRoQ29lZlRhYls4XVtOVU1fU0FNUExFX1JBVEVTXTsNCitleHRlcm4gY29uc3QgaW50IHJhdGVzWzhdOw0KK2V4dGVybiBjb25zdCBVV29yZDggc2ZCYW5kVG90YWxTaG9ydFtOVU1fU0FNUExFX1JBVEVTXTsNCitleHRlcm4gY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsTG9uZ1tOVU1fU0FNUExFX1JBVEVTXTsNCitleHRlcm4gY29uc3QgaW50IHNmQmFuZFRhYlNob3J0T2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdOw0KK2V4dGVybiBjb25zdCBzaG9ydCBzZkJhbmRUYWJTaG9ydFs3Nl07DQorZXh0ZXJuIGNvbnN0IGludCBzZkJhbmRUYWJMb25nT2Zmc2V0W05VTV9TQU1QTEVfUkFURVNdOw0KK2V4dGVybiBjb25zdCBzaG9ydCBzZkJhbmRUYWJMb25nWzMyNV07DQorCitleHRlcm4gY29uc3QgV29yZDMyIG1fbG9nMl90YWJsZVtJTlRfQklUU107CisKKy8qCisgIFROUworKi8KK2V4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmYzWzhdOw0KK2V4dGVybiBjb25zdCBXb3JkMzIgdG5zQ29lZmYzQm9yZGVyc1s4XTsNCitleHRlcm4gY29uc3QgV29yZDMyIHRuc0NvZWZmNFsxNl07DQorZXh0ZXJuIGNvbnN0IFdvcmQzMiB0bnNDb2VmZjRCb3JkZXJzWzE2XTsNCitleHRlcm4gY29uc3QgV29yZDMyIGludlNCRlsyNF07DQorZXh0ZXJuIGNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYkxvbmdbTUFYX1NGQl9MT05HICsgMV07DQorZXh0ZXJuIGNvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWFjZW5jX2NvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhMWQyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2FhY2VuY19jb3JlLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWFhY2VuY19jb3JlLmgNCisNCisJQ29udGVudDoJYWFjIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX2FhY2VuY19jb3JlX2hfCisjZGVmaW5lIF9hYWNlbmNfY29yZV9oXworCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIgorI2luY2x1ZGUgImNvbmZpZy5oIg0KKyNpbmNsdWRlICJiaXRlbmMuaCINCisNCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCINCisjaW5jbHVkZSAicHN5X21haW4uaCINCisjaW5jbHVkZSAicWNfbWFpbi5oIg0KKyNpbmNsdWRlICJwc3lfbWFpbi5oIg0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgIHN0cnVjdCB7CisgIFdvcmQzMiAgIHNhbXBsZVJhdGU7ICAgICAgICAgICAgLyogYXVkaW8gZmlsZSBzYW1wbGUgcmF0ZSAqLworICBXb3JkMzIgICBiaXRSYXRlOyAgICAgICAgICAgICAgIC8qIGVuY29kZXIgYml0IHJhdGUgaW4gYml0cy9zZWMgKi8KKyAgV29yZDE2ICAgbkNoYW5uZWxzSW47ICAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgb24gaW5wdXQgKDEsMikgKi8KKyAgV29yZDE2ICAgbkNoYW5uZWxzT3V0OyAgICAgICAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgb24gb3V0cHV0ICgxLDIpICovCisgIFdvcmQxNiAgIGJhbmRXaWR0aDsgICAgICAgICAgICAgLyogdGFyZ2V0ZWQgYXVkaW8gYmFuZHdpZHRoIGluIEh6ICovDQorICBXb3JkMTYgICBhZHRzVXNlZDsJCQkgIC8qIHdoZXRoZXIgd3JpdGUgYWR0cyBoZWFkZXIgKi8KK30gQUFDRU5DX0NPTkZJRzsKKw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisJDQorICBBQUNFTkNfQ09ORklHIGNvbmZpZzsgICAgIC8qIFdvcmQxNiBzaXplOiA4ICovDQorDQorICBFTEVNRU5UX0lORk8gZWxJbmZvOyAgICAgIC8qIFdvcmQxNiBzaXplOiA0ICovDQorDQorICBRQ19TVEFURSBxY0tlcm5lbDsgICAgICAgIC8qIFdvcmQxNiBzaXplOiA2ICsgNShQQURESU5HKSArIDcoRUxFTUVOVF9CSVRTKSArIDU0KEFESl9USFJfU1RBVEUpID0gNzIgKi8NCisgIFFDX09VVCAgIHFjT3V0OyAgICAgICAgICAgLyogV29yZDE2IHNpemU6IE1BWF9DSEFOTkVMUyo5MjAoUUNfT1VUX0NIQU5ORUwpICsgNShRQ19PVVRfRUxFTUVOVCkgKyA3ID0gOTMyIC8gMTg1MiAqLw0KKw0KKyAgUFNZX09VVCAgICBwc3lPdXQ7ICAgICAgICAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjE4NiArIDIgPSAxODggLyAzNzQgKi8NCisgIFBTWV9LRVJORUwgcHN5S2VybmVsOyAgICAgLyogV29yZDE2IHNpemU6ICAyNTg3IC8gNDQ5MSAqLw0KKw0KKyAgc3RydWN0IEJJVFNUUkVBTUVOQ09ERVJfSU5JVCBic2VJbml0OyAvKiBXb3JkMTYgc2l6ZTogNiAqLw0KKyAgc3RydWN0IEJJVF9CVUYgIGJpdFN0cmVhbTsgICAgICAgICAgICAvKiBXb3JkMTYgc2l6ZTogOCAqLw0KKyAgSEFORExFX0JJVF9CVUYgIGhCaXRTdHJlYW07DQorICBpbnQJCQkgIGluaXRPSzsNCisNCisgIHNob3J0CQkJKmludGJ1ZjsNCisgIHNob3J0CQkJKmVuY2J1ZjsNCisgIHNob3J0CQkJKmluYnVmOw0KKyAgaW50CQkJZW5jbGVuOw0KKyAgaW50CQkJaW5sZW47DQorICBpbnQJCQlpbnRsZW47DQorICBpbnQJCQl1c2VsZW5ndGg7DQorDQorICB2b2lkCQkJKmhDaGVjazsNCisgIFZPX01FTV9PUEVSQVRPUiAqdm9NZW1vcDsNCisgIFZPX01FTV9PUEVSQVRPUiB2b01lbW9wcmF0b3I7DQorDQorfUFBQ19FTkNPREVSOyAvKiBXb3JkMTYgc2l6ZTogMzgwOSAvIDY4NTEgKi8NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Z1bmN0aW9ubmFtZTogQWFjSW5pdERlZmF1bHRDb25maWcKK2Rlc2NyaXB0aW9uOiAgZ2l2ZXMgcmVhc29uYWJsZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KK3JldHVybnM6ICAgICAgLS0tCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEFhY0luaXREZWZhdWx0Q29uZmlnKEFBQ0VOQ19DT05GSUcgKmNvbmZpZyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Z1bmN0aW9ubmFtZTpBYWNFbmNPcGVuCitkZXNjcmlwdGlvbjogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgZW5jb2RlciBpbnN0YW5jZQorcmV0dXJuczogICAgIEFBQ0VOQ19PSyBpZiBzdWNjZXNzCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK1dvcmQxNiAgQWFjRW5jT3BlbiAoQUFDX0VOQ09ERVIJCQkJKmhBYWNFbmMsICAgICAgIC8qIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUsIGluaXRpYWxpemVkIG9uIHJldHVybiAqLworICAgICAgICAgICAgICAgICAgICBjb25zdCAgQUFDRU5DX0NPTkZJRyAgICAgY29uZmlnKTsgICAgICAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCisKK1dvcmQxNiBBYWNFbmNFbmNvZGUoQUFDX0VOQ09ERVIJCSAgICpoQWFjRW5jLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgKnRpbWVTaWduYWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkOCAgICAgICAqYW5jQnl0ZXMsICAgICAgLyohPCBwb2ludGVyIHRvIGFuY2lsbGFyeSBkYXRhIGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAqbnVtQW5jQnl0ZXMsICAgLyohPCBudW1iZXIgb2YgYW5jaWxsYXJ5IERhdGEgQnl0ZXMsIHNlbmQgYXMgZmlsbCBlbGVtZW50ICAqLworICAgICAgICAgICAgICAgICAgICBVV29yZDggICAgICAgICAgICAgKm91dEJ5dGVzLCAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICAgICpudW1PdXRCeXRlcyAgICAvKiE8IG51bWJlciBvZiBieXRlcyBpbiBvdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Z1bmN0aW9ubmFtZTpBYWNFbmNDbG9zZQorZGVzY3JpcHRpb246IGRlYWxsb2NhdGUgYW4gZW5jb2RlciBpbnN0YW5jZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIEFhY0VuY0Nsb3NlIChBQUNfRU5DT0RFUiogaEFhY0VuYywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOyAvKiBhbiBlbmNvZGVyIGhhbmRsZSAqLworCisjZW5kaWYgLyogX2FhY2VuY19oXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Roci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYWRqX3Roci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTdjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyLmgKQEAgLTAsMCArMSw1NyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYWRqX3Roci5oDQorDQorCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gZnVuY3Rpb24gDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0FESl9USFJfSAorI2RlZmluZSBfX0FESl9USFJfSAorCisjaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorCitXb3JkMTYgYml0czJwZShjb25zdCBXb3JkMTYgYml0cyk7CisKK1dvcmQzMiBBZGpUaHJOZXcoQURKX1RIUl9TVEFURSoqIHBoQWRqVGhyLAorICAgICAgICAgICAgICAgICBXb3JkMzIgbkVsZW1lbnRzKTsKKwordm9pZCBBZGpUaHJEZWxldGUoQURKX1RIUl9TVEFURSAqaEFkalRocik7CisKK3ZvaWQgQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAorICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBwZU1lYW4sCisgICAgICAgICAgICAgICAgV29yZDMyIGNoQml0cmF0ZSk7CisKK3ZvaWQgQWRqdXN0VGhyZXNob2xkcyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogQWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2hCaXREaXN0cmlidXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT0UsCisJCQkJCSAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCisJCQkJCSAgY29uc3QgV29yZDE2IG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWF4Qml0RmFjKTsKKwordm9pZCBBZGpUaHJVcGRhdGUoQVRTX0VMRU1FTlQgKkFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBkeW5CaXRzVXNlZCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyX2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Fkal90aHJfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZGQ0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9hZGpfdGhyX2RhdGEuaApAQCAtMCwwICsxLDY5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlhZGpfdGhyX2RhdGEuaA0KKw0KKwlDb250ZW50OglUaHJlc2hvbGQgY29tcGVuc2F0aW9uIHBhcmFtZXRlciANCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQURKX1RIUl9EQVRBX0gKKyNkZWZpbmUgX19BREpfVEhSX0RBVEFfSAorCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJsaW5lX3BlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIFdvcmQxNiBjbGlwU2F2ZUxvdywgY2xpcFNhdmVIaWdoOworICAgV29yZDE2IG1pbkJpdFNhdmUsIG1heEJpdFNhdmU7CisgICBXb3JkMTYgY2xpcFNwZW5kTG93LCBjbGlwU3BlbmRIaWdoOworICAgV29yZDE2IG1pbkJpdFNwZW5kLCBtYXhCaXRTcGVuZDsKK30gQlJFU19QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgVVdvcmQ4IG1vZGlmeU1pblNucjsKKyAgIFdvcmQxNiBzdGFydFNmYkwsIHN0YXJ0U2ZiUzsKK30gQUhfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV29yZDMyIG1heFJlZDsKKyAgV29yZDMyIHN0YXJ0UmF0aW8sIG1heFJhdGlvOworICBXb3JkMzIgcmVkUmF0aW9GYWM7CisgIFdvcmQzMiByZWRPZmZzOworfSBNSU5TTlJfQURBUFRfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzZXJ2b2lyIGNvbnRyb2wgKi8KKyAgV29yZDE2IHBlTWluLCBwZU1heDsKKyAgLyogY29uc3RhbnQgb2Zmc2V0IHRvIHBlICAgICAgICAgICAgICAgKi8KKyAgV29yZDE2ICBwZU9mZnNldDsKKyAgLyogYXZvaWQgaG9sZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgKi8KKyAgQUhfUEFSQU0gYWhQYXJhbTsKKyAgLyogcGFyYW10ZXJzIGZvciBhZGFwdGF0aW9uIG9mIG1pblNuciAqLworICBNSU5TTlJfQURBUFRfUEFSQU0gbWluU25yQWRhcHRQYXJhbTsKKyAgLyogdmFsdWVzIGZvciBjb3JyZWN0aW9uIG9mIHBlICovCisgIFdvcmQxNiBwZUxhc3Q7CisgIFdvcmQxNiBkeW5CaXRzTGFzdDsKKyAgV29yZDE2IHBlQ29ycmVjdGlvbkZhY3RvcjsKK30gQVRTX0VMRU1FTlQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgQlJFU19QQVJBTSAgIGJyZXNQYXJhbUxvbmcsIGJyZXNQYXJhbVNob3J0OyAvKiBXb3JkMTYgc2l6ZTogMio4ICovCisgIEFUU19FTEVNRU5UICBhZGpUaHJTdGF0ZUVsZW07ICAgICAgICAgICAgICAgLyogV29yZDE2IHNpemU6IDE5ICovCit9IEFESl9USFJfU1RBVEU7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmFuZF9ucmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JhbmRfbnJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg1MDlkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JhbmRfbnJnLmgKQEAgLTAsMCArMSw0NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYmFuZF9ucmcuaA0KKw0KKwlDb250ZW50OglCYW5kL0xpbmUgZW5lcmd5IGNhbGN1bGF0aW9ucyBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgX0JBTkRfTlJHX0gKKyNkZWZpbmUgX0JBTkRfTlJHX0gKKworI2luY2x1ZGUgInR5cGVkZWYuaCIKKworCit2b2lkIENhbGNCYW5kRW5lcmd5KGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5U3VtKTsKKworCit2b2lkIENhbGNCYW5kRW5lcmd5TVMoY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneU1pZFN1bSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTaWRlLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGVTdW0pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdF9jbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdF9jbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgzMTllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0X2NudC5oCkBAIC0wLDAgKzEsMTA2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliaXRfY250LmgNCisNCisJQ29udGVudDoJSHVmZm1hbiBCaXRjb3VudGVyICYgY29kZXIgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fQklUQ09VTlRfSAorI2RlZmluZSBfX0JJVENPVU5UX0gKKworI2luY2x1ZGUgImJpdGJ1ZmZlci5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIgorI2RlZmluZSBJTlZBTElEX0JJVENPVU5UIChNQVhfMTYvNCkKKworLyoKKyAgY29kZSBib29rIG51bWJlciB0YWJsZQorKi8KKworZW51bSBjb2RlQm9va05veworICBDT0RFX0JPT0tfWkVST19OTz0gICAgICAgICAgICAgICAwLAorICBDT0RFX0JPT0tfMV9OTz0gICAgICAgICAgICAgICAgICAxLAorICBDT0RFX0JPT0tfMl9OTz0gICAgICAgICAgICAgICAgICAyLAorICBDT0RFX0JPT0tfM19OTz0gICAgICAgICAgICAgICAgICAzLAorICBDT0RFX0JPT0tfNF9OTz0gICAgICAgICAgICAgICAgICA0LAorICBDT0RFX0JPT0tfNV9OTz0gICAgICAgICAgICAgICAgICA1LAorICBDT0RFX0JPT0tfNl9OTz0gICAgICAgICAgICAgICAgICA2LAorICBDT0RFX0JPT0tfN19OTz0gICAgICAgICAgICAgICAgICA3LAorICBDT0RFX0JPT0tfOF9OTz0gICAgICAgICAgICAgICAgICA4LAorICBDT0RFX0JPT0tfOV9OTz0gICAgICAgICAgICAgICAgICA5LAorICBDT0RFX0JPT0tfMTBfTk89ICAgICAgICAgICAgICAgIDEwLAorICBDT0RFX0JPT0tfRVNDX05PPSAgICAgICAgICAgICAgIDExLAorICBDT0RFX0JPT0tfUkVTX05PPSAgICAgICAgICAgICAgIDEyLAorICBDT0RFX0JPT0tfUE5TX05PPSAgICAgICAgICAgICAgIDEzCit9OworCisvKgorICBjb2RlIGJvb2sgaW5kZXggdGFibGUKKyovCisKK2VudW0gY29kZUJvb2tOZHh7CisgIENPREVfQk9PS19aRVJPX05EWD0wLAorICBDT0RFX0JPT0tfMV9ORFgsCisgIENPREVfQk9PS18yX05EWCwKKyAgQ09ERV9CT09LXzNfTkRYLAorICBDT0RFX0JPT0tfNF9ORFgsCisgIENPREVfQk9PS181X05EWCwKKyAgQ09ERV9CT09LXzZfTkRYLAorICBDT0RFX0JPT0tfN19ORFgsCisgIENPREVfQk9PS184X05EWCwKKyAgQ09ERV9CT09LXzlfTkRYLAorICBDT0RFX0JPT0tfMTBfTkRYLAorICBDT0RFX0JPT0tfRVNDX05EWCwKKyAgQ09ERV9CT09LX1JFU19ORFgsCisgIENPREVfQk9PS19QTlNfTkRYLAorICBOVU1CRVJfT0ZfQ09ERV9CT09LUworfTsKKworLyoKKyAgY29kZSBib29rIGxhdiB0YWJsZQorKi8KKworZW51bSBjb2RlQm9va0xhdnsKKyAgQ09ERV9CT09LX1pFUk9fTEFWPTAsCisgIENPREVfQk9PS18xX0xBVj0xLAorICBDT0RFX0JPT0tfMl9MQVY9MSwKKyAgQ09ERV9CT09LXzNfTEFWPTIsCisgIENPREVfQk9PS180X0xBVj0yLAorICBDT0RFX0JPT0tfNV9MQVY9NCwKKyAgQ09ERV9CT09LXzZfTEFWPTQsCisgIENPREVfQk9PS183X0xBVj03LAorICBDT0RFX0JPT0tfOF9MQVY9NywKKyAgQ09ERV9CT09LXzlfTEFWPTEyLAorICBDT0RFX0JPT0tfMTBfTEFWPTEyLAorICBDT0RFX0JPT0tfRVNDX0xBVj0xNiwKKyAgQ09ERV9CT09LX1NDRl9MQVY9NjAsCisgIENPREVfQk9PS19QTlNfTEFWPTYwCit9OworCitXb3JkMTYgYml0Q291bnQoY29uc3QgV29yZDE2ICphUXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG5vT2ZTcGVjTGluZXMsCisgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBtYXhWYWwsCisgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudEx1dCk7CisKK1dvcmQxNiBjb2RlVmFsdWVzKFdvcmQxNiAqdmFsdWVzLCBXb3JkMTYgd2lkdGgsIFdvcmQxNiBjb2RlQm9vaywgSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSk7CisKK1dvcmQxNiBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoV29yZDE2IGRlbHRhKTsKK1dvcmQxNiBjb2RlU2NhbGVmYWN0b3JEZWx0YShXb3JkMTYgc2NhbGVmYWN0b3IsIEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0pOworCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRidWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODUwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9iaXRidWZmZXIuaApAQCAtMCwwICsxLDg5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliaXRidWZmZXIuaA0KKw0KKwlDb250ZW50OglCaXQgQnVmZmVyIE1hbmFnZW1lbnQgc3RydWN0dXJlIGFuZCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEJJVEJVRkZFUl9ICisjZGVmaW5lIEJJVEJVRkZFUl9ICisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisKKworZW51bSBkaXJlY3Rpb24KK3sKKyAgZm9yd2FyZERpcmVjdGlvbiwKKyAgYmFja3dhcmREaXJlY3Rpb24KK307CisKKworLyohCisgICBUaGUgcG9pbnRlciAncFJlYWROZXh0JyBwb2ludHMgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHdvcmQsIHdoZXJlIGJpdHMgY2FuIGJlIHJlYWQgZnJvbS4gVGhlIHBvaW50ZXIKKyAgICdwV3JpdGVOZXh0JyBwb2ludHMgdG8gdGhlIG5leHQgYXZhaWxhYmxlIHdvcmQsIHdoZXJlIGJpdHMgY2FuIGJlIHdyaXR0ZW4gdG8uIFRoZSBwb2ludGVyIHBCaXRCdWZCYXNlCisgICBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBiaXRzdHJlYW0gYnVmZmVyIGFuZCB0aGUgcG9pbnRlciBwQml0QnVmRW5kIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBiaXRzdHJlYW0KKyAgIGJ1ZmZlci4gVGhlIHR3byBwb2ludGVycyBhcmUgdXNlZCBhcyBsb3dlci1ib3VuZCByZXNwZWN0aXZlbHkgdXBwZXItYm91bmQgYWRkcmVzcyBmb3IgdGhlIG1vZHVsbyBhZGRyZXNzaW5nCisgICBtb2RlLgorCisgICBUaGUgZWxlbWVudCBjbnRCaXRzIGNvbnRhaW5zIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGJpdHMgaW4gdGhlIGJpdCBidWZmZXIuIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWQgd2hlbgorICAgYml0cyBhcmUgd3JpdHRlbiB0byB0aGUgYml0c3RyZWFtIGJ1ZmZlciBhbmQgZGVjcmVtZW50ZWQgd2hlbiBiaXRzIGFyZSByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSBidWZmZXIuCisqLworc3RydWN0IEJJVF9CVUYKK3sKKyAgVVdvcmQ4ICpwQml0QnVmQmFzZTsgICAgICAgICAgLyohPCBwb2ludGVyIHBvaW50cyB0byBmaXJzdCBwb3NpdGlvbiBpbiBiaXRzdHJlYW0gYnVmZmVyICovCisgIFVXb3JkOCAqcEJpdEJ1ZkVuZDsgICAgICAgICAgIC8qITwgcG9pbnRlciBwb2ludHMgdG8gbGFzdCBwb3NpdGlvbiBpbiBiaXRzdHJlYW0gYnVmZmVyICovCisKKyAgVVdvcmQ4ICpwV3JpdGVOZXh0OyAgICAgICAgICAgLyohPCBwb2ludGVyIHBvaW50cyB0byBuZXh0IGF2YWlsYWJsZSB3b3JkIGluIGJpdHN0cmVhbSBidWZmZXIgdG8gd3JpdGUgKi8KKworICBVV29yZDMyIGNhY2hlOworCisgIFdvcmQxNiAgd0JpdFBvczsgICAgICAgICAgICAgIC8qITwgMzE8PXdCaXRQb3M8PTAqLworICBXb3JkMTYgIGNudEJpdHM7ICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBhdmFpbGFibGUgYml0cyBpbiB0aGUgYml0c3RyZWFtIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIGJpdHMgdG8gYml0c3RyZWFtIGJ1ZmZlciAgPT4gaW5jcmVtZW50IGNudEJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIGJpdHMgZnJvbSBiaXRzdHJlYW0gYnVmZmVyID0+IGRlY3JlbWVudCBjbnRCaXRzICovCisgIFdvcmQxNiAgc2l6ZTsgICAgICAgICAgICAgICAgIC8qITwgc2l6ZSBvZiBiaXRidWZmZXIgaW4gYml0cyAqLworICBXb3JkMTYgIGlzVmFsaWQ7ICAgICAgICAgICAgICAvKiE8IGluZGljYXRlcyB3aGV0aGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworfTsgLyogc2l6ZSBXb3JkMTY6IDggKi8KKworLyohIERlZmluZSBwb2ludGVyIHRvIGJpdCBidWZmZXIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBCSVRfQlVGICpIQU5ETEVfQklUX0JVRjsKKworCitIQU5ETEVfQklUX0JVRiBDcmVhdGVCaXRCdWZmZXIoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDggKnBCaXRCdWZCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgYml0QnVmU2l6ZSk7CisKKwordm9pZCBEZWxldGVCaXRCdWZmZXIoSEFORExFX0JJVF9CVUYgKmhCaXRCdWYpOworCisKK1dvcmQxNiBHZXRCaXRzQXZhaWwoSEFORExFX0JJVF9CVUYgaEJpdEJ1Zik7CisKKworV29yZDE2IFdyaXRlQml0cyhIQU5ETEVfQklUX0JVRiBoQml0QnVmLAorICAgICAgICAgICAgICAgICBXb3JkMzIgd3JpdGVWYWx1ZSwKKyAgICAgICAgICAgICAgICAgV29yZDE2IG5vQml0c1RvV3JpdGUpOworCit2b2lkIFJlc2V0Qml0QnVmKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgIFVXb3JkOCAqcEJpdEJ1ZkJhc2UsCisgICAgICAgICAgICAgICAgIFdvcmQxNiAgYml0QnVmU2l6ZSk7CisKKyNkZWZpbmUgR2V0TnJCaXRzQXZhaWxhYmxlKGhCaXRCdWYpICggKGhCaXRCdWYpLT5jbnRCaXRzKQorI2RlZmluZSBHZXROckJpdHNSZWFkKGhCaXRCdWYpICAgICAgICgoaEJpdEJ1ZiktPnNpemUtKGhCaXRCdWYpLT5jbnRCaXRzKQorCisjZW5kaWYgLyogQklUQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYml0ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1MTA1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2JpdGVuYy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJpdGVuYy5oDQorDQorCUNvbnRlbnQ6CUJpdHN0cmVhbSBlbmNvZGVyIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQklURU5DX0gKKyNkZWZpbmUgX0JJVEVOQ19ICisKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAidG5zLmgiCisjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIgIAorCitzdHJ1Y3QgQklUU1RSRUFNRU5DT0RFUl9JTklUCit7CisgIFdvcmQxNiBuQ2hhbm5lbHM7CisgIFdvcmQzMiBiaXRyYXRlOworICBXb3JkMzIgc2FtcGxlUmF0ZTsKKyAgV29yZDE2IHByb2ZpbGU7Cit9OworCisKKworV29yZDE2IFdyaXRlQml0c3RyZWFtIChIQU5ETEVfQklUX0JVRiBoQml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQgKnFjT3V0LAorICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUICpwc3lPdXQsCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZ2xvYlVzZWRCaXRzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICphbmNCeXRlcywNCisJCQkJCSAgIFdvcmQxNiBzYW1wbGVyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyNlbmRpZiAvKiBfQklURU5DX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Jsb2NrX3N3aXRjaC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvYmxvY2tfc3dpdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNTgxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2Jsb2NrX3N3aXRjaC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJsb2NrX3N3aXRjaC5oDQorDQorCUNvbnRlbnQ6CUJsb2NrIHN3aXRjaGluZyBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0JMT0NLX1NXSVRDSF9ICisjZGVmaW5lIF9CTE9DS19TV0lUQ0hfSAorCisjaW5jbHVkZSAidHlwZWRlZi5oIgorCisKKy8qKioqKioqKioqKioqKioqKiogRGVmaW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJMT0NLX1NXSVRDSElOR19JSVJfTEVOIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIG9mIEhpZ2hQYXNzLUZJUi1GaWx0ZXIgZm9yIEF0dGFjay1EZXRlY3Rpb24gKi8KKyNkZWZpbmUgQkxPQ0tfU1dJVENIX1dJTkRPV1MgVFJBTlNfRkFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygd2luZG93cyBmb3IgZW5lcmd5IGNhbGN1bGF0aW9uICovCisjZGVmaW5lIEJMT0NLX1NXSVRDSF9XSU5ET1dfTEVOIEZSQU1FX0xFTl9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW1hbCBncmFudWxhcml0eSBvZiBlbmVyZ3kgY2FsY3VsYXRpb24gKi8KKworCisKKy8qKioqKioqKioqKioqKioqKiogU3RydWN0dXJlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdHsKKyAgV29yZDMyIGludkF0dGFja1JhdGlvOworICBXb3JkMTYgd2luZG93U2VxdWVuY2U7CisgIFdvcmQxNiBuZXh0d2luZG93U2VxdWVuY2U7CisgIEZsYWcgYXR0YWNrOworICBGbGFnIGxhc3RhdHRhY2s7CisgIFdvcmQxNiBhdHRhY2tJbmRleDsKKyAgV29yZDE2IGxhc3RBdHRhY2tJbmRleDsKKyAgV29yZDE2IG5vT2ZHcm91cHM7CisgIFdvcmQxNiBncm91cExlbltUUkFOU19GQUNdOworICBXb3JkMzIgd2luZG93TnJnWzJdW0JMT0NLX1NXSVRDSF9XSU5ET1dTXTsgICAgIC8qIHRpbWUgc2lnbmFsIGVuZXJneSBpbiBTdWJ3aW5kb3dzIChsYXN0IGFuZCBjdXJyZW50KSAqLworICBXb3JkMzIgd2luZG93TnJnRlsyXVtCTE9DS19TV0lUQ0hfV0lORE9XU107ICAgIC8qIGZpbHRlcmVkIHRpbWUgc2lnbmFsIGVuZXJneSBpbiBzZWdtZW50cyAobGFzdCBhbmQgY3VycmVudCkgKi8KKyAgV29yZDMyIGlpclN0YXRlc1tCTE9DS19TV0lUQ0hJTkdfSUlSX0xFTl07ICAgICAvKiBmaWx0ZXIgZGVsYXktbGluZSAqLworICBXb3JkMzIgbWF4V2luZG93TnJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heCBlbmVyZ3kgaW4gc3Vid2luZG93cyAqLworICBXb3JkMzIgYWNjV2luZG93TnJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY3Vyc2l2ZWx5IGFjY3VtdWxhdGVkIHdpbmRvd05yZ0YgKi8KK31CTE9DS19TV0lUQ0hJTkdfQ09OVFJPTDsKKworCisKKworCitXb3JkMTYgSW5pdEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiBiaXRSYXRlLCBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKTsKKworV29yZDE2IEJsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAorCQkJCQkgIFdvcmQzMiAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQpOworCitXb3JkMTYgU3luY0Jsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBub09mQ2hhbm5lbHMpOworCisKKworI2VuZGlmICAvKiAjaWZuZGVmIF9CTE9DS19TV0lUQ0hfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY2hhbm5lbF9tYXAuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NoYW5uZWxfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhYThkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2NoYW5uZWxfbWFwLmgKQEAgLTAsMCArMSwzNyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJY2hhbm5lbF9tYXAuaA0KKw0KKwlDb250ZW50OgljaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfQ0hBTk5FTF9NQVBfSAorI2RlZmluZSBfQ0hBTk5FTF9NQVBfSAorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAicWNfZGF0YS5oIgorCitXb3JkMTYgSW5pdEVsZW1lbnRJbmZvIChXb3JkMTYgbkNoYW5uZWxzLCBFTEVNRU5UX0lORk8qIGVsSW5mbyk7CisKK1dvcmQxNiBJbml0RWxlbWVudEJpdHMoRUxFTUVOVF9CSVRTICplbGVtZW50Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdHJhdGVUb3QsCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhdmVyYWdlQml0c1RvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHN0YXRpY0JpdHNUb3QpOworCisjZW5kaWYgLyogQ0hBTk5FTF9NQVBfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjExYzhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvY29uZmlnLmgKQEAgLTAsMCArMSwzNiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJY29uZmlnLmgNCisNCisJQ29udGVudDoJYWFjIGVuY29kZXIgcGFyYW1ldGVyDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9BQUNFTkNfQ09ORklHX0hfDQorI2RlZmluZSBfQUFDRU5DX0NPTkZJR19IXw0KKw0KKyNkZWZpbmUgTUFYX0NIQU5ORUxTICAgICAgICAyDQorDQorI2RlZmluZSBBQUNFTkNfQkxPQ0tTSVpFICAgIDEwMjQgICAvKiEgZW5jb2RlciBvbmx5IHRha2VzIEJMT0NLU0laRSBzYW1wbGVzIGF0IGEgdGltZSAqLw0KKyNkZWZpbmUgQUFDRU5DX1RSQU5TX0ZBQyAgICA4ICAgICAgLyohIGVuY29kZXIgc2hvcnQgbG9uZyByYXRpbyAqLw0KKw0KKw0KKyNkZWZpbmUgTUFYQklUU19DT0VGCQk2MTQ0CisjZGVmaW5lIE1JTkJJVFNfQ09FRgkJNzQ0DQorDQorDQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZHluX2JpdHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2R5bl9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2OGZhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2R5bl9iaXRzLmgKQEAgLTAsMCArMSw4MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJZHluX2JpdHMuaA0KKw0KKwlDb250ZW50OglOb2lzZWxlc3MgY29kZXIgbW9kdWxlIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0RZTl9CSVRTX0gKKyNkZWZpbmUgX19EWU5fQklUU19ICisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJ0bnMuaCIKKyNpbmNsdWRlICJiaXRfY250LmgiCisKKworCisjZGVmaW5lIE1BWF9TRUNUSU9OUyAgICAgICAgICBNQVhfR1JPVVBFRF9TRkIKKyNkZWZpbmUgU0VDVF9FU0NfVkFMX0xPTkcgICAgMzEKKyNkZWZpbmUgU0VDVF9FU0NfVkFMX1NIT1JUICAgIDcKKyNkZWZpbmUgQ09ERV9CT09LX0JJVFMgICAgICAgIDQKKyNkZWZpbmUgU0VDVF9CSVRTX0xPTkcgICAgICAgIDUKKyNkZWZpbmUgU0VDVF9CSVRTX1NIT1JUICAgICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV29yZDE2IGNvZGVCb29rOworICBXb3JkMTYgc2ZiU3RhcnQ7CisgIFdvcmQxNiBzZmJDbnQ7CisgIFdvcmQxNiBzZWN0aW9uQml0czsKK30KK1NFQ1RJT05fSU5GTzsKKworCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV29yZDE2IGJsb2NrVHlwZTsKKyAgV29yZDE2IG5vT2ZHcm91cHM7CisgIFdvcmQxNiBzZmJDbnQ7CisgIFdvcmQxNiBtYXhTZmJQZXJHcm91cDsKKyAgV29yZDE2IHNmYlBlckdyb3VwOworICBXb3JkMTYgbm9PZlNlY3Rpb25zOworICBTRUNUSU9OX0lORk8gc2VjdGlvbkluZm9bTUFYX1NFQ1RJT05TXTsKKyAgV29yZDE2IHNpZGVJbmZvQml0czsgICAgICAgICAgICAgLyogc2VjdGlvbmluZyBiaXRzICAgICAgICovCisgIFdvcmQxNiBodWZmbWFuQml0czsgICAgICAgICAgICAgIC8qIGh1ZmZtYW4gICAgY29kZWQgYml0cyAqLworICBXb3JkMTYgc2NhbGVmYWNCaXRzOyAgICAgICAgICAgICAvKiBzY2FsZWZhYyAgIGNvZGVkIGJpdHMgKi8KKyAgV29yZDE2IGZpcnN0U2NmOyAgICAgICAgICAgICAgICAgLyogZmlyc3Qgc2NmIHRvIGJlIGNvZGVkICovCisgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HKihDT0RFX0JPT0tfRVNDX05EWCsxKV07CisgIFdvcmQxNiBtZXJnZUdhaW5Mb29rVXBbTUFYX1NGQl9MT05HXTsKK30KK1NFQ1RJT05fREFUQTsgLyogIFdvcmQxNiBzaXplOiAxMCArIDYwKE1BWF9TRUNUSU9OUykqNChTRUNUSU9OX0lORk8pICsgNTEoTUFYX1NGQl9MT05HKSoxMihDT0RFX0JPT0tfRVNDX05EWCsxKSArIDUxKE1BWF9TRkJfTE9ORykgPSA5MTMgKi8KKworCitXb3JkMTYgQkNJbml0KHZvaWQpOworCitXb3JkMTYgZHluQml0Q291bnQoY29uc3QgV29yZDE2ICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzY2FsZWZhYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9ncnBfZGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZ3JwX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY2NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvZ3JwX2RhdGEuaApAQCAtMCwwICsxLDQ0IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlncnBfZGF0YS5oDQorDQorCUNvbnRlbnQ6CVNob3J0IGJsb2NrIGdyb3VwaW5nIGZ1bmN0aW9uDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX0dSUF9EQVRBX0hfXworI2RlZmluZSBfX0dSUF9EQVRBX0hfXworI2luY2x1ZGUgInBzeV9kYXRhLmgiCisjaW5jbHVkZSAidHlwZWRlZnMuaCIKKwordm9pZAorZ3JvdXBTaG9ydERhdGEoV29yZDMyICAgICAgICAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAqdG1wU3BlY3RydW0sCisgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICpzZmJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3ksCisgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJFbmVyZ3lNUywKKyAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgKnNmYlNwcmVhZGVkRW5lcmd5LAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiQ250LAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqc2ZiTWluU25yLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqZ3JvdXBlZFNmYk9mZnNldCwKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAqZ3JvdXBlZFNmYk1pblNuciwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG5vT2ZHcm91cHMsCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpncm91cExlbik7CisKKyNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0MzM0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlpbnRlcmZhY2UuaA0KKw0KKwlDb250ZW50Oglwc3ljaG9hY2NvdXN0aWMvcXVhbnRpemVyIHN0cnVjdHVyZXMgYW5kIGludGVyZmFjZQ0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0lOVEVSRkFDRV9ICisjZGVmaW5lIF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiDQorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgInBzeV9kYXRhLmgiCisjaW5jbHVkZSAidHlwZWRlZnMuaCIKKworCitlbnVtCit7CisgIE1TX05PTkUgPSAwLAorICBNU19TT01FID0gMSwKKyAgTVNfQUxMICA9IDIKK307CisKK2VudW0KK3sKKyAgTVNfT04gPSAxCit9OworCitzdHJ1Y3QgVE9PTFNJTkZPIHsKKyAgV29yZDE2IG1zRGlnZXN0OworICBXb3JkMTYgbXNNYXNrW01BWF9HUk9VUEVEX1NGQl07Cit9OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV29yZDE2ICBzZmJDbnQ7CisgIFdvcmQxNiAgc2ZiUGVyR3JvdXA7CisgIFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXA7CisgIFdvcmQxNiAgd2luZG93U2VxdWVuY2U7CisgIFdvcmQxNiAgd2luZG93U2hhcGU7CisgIFdvcmQxNiAgZ3JvdXBpbmdNYXNrOworICBXb3JkMTYgIHNmYk9mZnNldHNbTUFYX0dST1VQRURfU0ZCKzFdOworICBXb3JkMTYgIG1kY3RTY2FsZTsgCisgIFdvcmQzMiAqc2ZiRW5lcmd5OyAKKyAgV29yZDMyICpzZmJTcHJlYWRlZEVuZXJneTsKKyAgV29yZDMyICpzZmJUaHJlc2hvbGQ7ICAgICAgIAorICBXb3JkMzIgKm1kY3RTcGVjdHJ1bTsgICAgICAgIAorICBXb3JkMzIgIHNmYkVuU3VtTFI7CisgIFdvcmQzMiAgc2ZiRW5TdW1NUzsKKyAgV29yZDMyIHNmYkRpc3RbTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDMyIHNmYkRpc3ROZXdbTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2ICBzZmJNaW5TbnJbTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2IG1pblNmTWF4UXVhbnRbTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2IG1pblNjZkNhbGN1bGF0ZWRbTUFYX0dST1VQRURfU0ZCXTsKKyAgV29yZDE2IHByZXZTY2ZMYXN0W01BWF9HUk9VUEVEX1NGQl07CisgIFdvcmQxNiBwcmV2U2NmTmV4dFtNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMTYgZGVsdGFQZUxhc3RbTUFYX0dST1VQRURfU0ZCXTsKKyAgVE5TX0lORk8gdG5zSW5mbzsKK30gUFNZX09VVF9DSEFOTkVMOyAvKiBXb3JkMTYgc2l6ZTogMTQgKyA2MChNQVhfR1JPVVBFRF9TRkIpICsgMTEyKFROU19JTkZPKSA9IDE4NiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBUT09MU0lORk8gdG9vbHNJbmZvOworICBXb3JkMTYgZ3JvdXBlZFNmYk9mZnNldFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQisxXTsgIC8qIHBsdXMgb25lIGZvciBsYXN0IGR1bW15IG9mZnNldCAhICovCisgIFdvcmQxNiBncm91cGVkU2ZiTWluU25yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKK30gUFNZX09VVF9FTEVNRU5UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIGluZm9ybWF0aW9uIHNoYXJlZCBieSBib3RoIGNoYW5uZWxzICAqLworICBQU1lfT1VUX0VMRU1FTlQgIHBzeU91dEVsZW1lbnQ7CisgIC8qIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGVhY2ggY2hhbm5lbCAqLworICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXTsKK31QU1lfT1VUOworCit2b2lkIEJ1aWxkSW50ZXJmYWNlKFdvcmQzMiAgICAgICAgICAgICAgICAgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICBTRkJfVEhSRVNIT0xEICAgICAgICAgICpzZmJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgKnNmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAgICAgICAgICAqc2ZiU3ByZWFkZWRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgIHNmYkVuZXJneVN1bUxSLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTRkJfRU5FUkdZX1NVTSAgICBzZmJFbmVyZ3lTdW1NUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgd2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgIG5vT2ZHcm91cHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgKmdyb3VwTGVuLAorICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICpwc3lPdXRDaCk7CisKKyNlbmRpZiAvKiBfSU5URVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL2xpbmVfcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ5MzhiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbGluZV9wZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWxpbmVfcGUuaA0KKw0KKwlDb250ZW50OglQZXJjZXB0dWFsIGVudHJvcGllIG1vZHVsZSBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19MSU5FX1BFX0gKKyNkZWZpbmUgX19MSU5FX1BFX0gKKworCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiIAorI2luY2x1ZGUgImludGVyZmFjZS5oIiAKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICBXb3JkMTYgc2ZiTGRFbmVyZ3lbTUFYX0dST1VQRURfU0ZCXTsgICAgIC8qIDQqbG9nKHNmYkVuZXJneSkvbG9nKDIpICovCisgICBXb3JkMTYgc2ZiTkxpbmVzNFtNQVhfR1JPVVBFRF9TRkJdOyAgICAgIC8qIDQqbnVtYmVyIG9mIHJlbGV2YW50IGxpbmVzIGluIHNmYiAqLworICAgV29yZDE2IHNmYlBlW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAvKiBwZSBmb3IgZWFjaCBzZmIgKi8KKyAgIFdvcmQxNiBzZmJDb25zdFBhcnRbTUFYX0dST1VQRURfU0ZCXTsgICAgLyogY29uc3RhbnQgcGFydCBmb3IgZWFjaCBzZmIgKi8KKyAgIFdvcmQxNiBzZmJOQWN0aXZlTGluZXNbTUFYX0dST1VQRURfU0ZCXTsgLyogbnVtYmVyIG9mIGFjdGl2ZSBsaW5lcyBpbiBzZmIgKi8KKyAgIFdvcmQxNiBwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYlBlICovCisgICBXb3JkMTYgY29uc3RQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1bSBvZiBzZmJDb25zdFBhcnQgKi8KKyAgIFdvcmQxNiBuQWN0aXZlTGluZXM7ICAgICAgICAgICAgICAgICAgICAgLyogc3VtIG9mIHNmYk5BY3RpdmVMaW5lcyAqLworfSBQRV9DSEFOTkVMX0RBVEE7IC8qIHNpemUgV29yZDE2OiAzMDMgKi8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICBQRV9DSEFOTkVMX0RBVEEgcGVDaGFubmVsRGF0YVtNQVhfQ0hBTk5FTFNdOworICAgV29yZDE2IHBlOworICAgV29yZDE2IGNvbnN0UGFydDsKKyAgIFdvcmQxNiBuQWN0aXZlTGluZXM7CisgICBXb3JkMTYgb2Zmc2V0OworICAgV29yZDE2IGFoRmxhZ1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07CisgICBXb3JkMzIgdGhyRXhwW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXTsKKyAgIFdvcmQzMiBzZmJQZUZhY3RvcnNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOworfSBQRV9EQVRBOyAvKiBzaXplIFdvcmQxNjogMzAzICsgNCArIDEyMCArIDI0MCA9IDY2NyAqLworCisKKworCit2b2lkIHByZXBhcmVTZmJQZShQRV9EQVRBICpwZURhdGEsCisgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVPZmZzZXQpOworCisKKworCisKK3ZvaWQgY2FsY1NmYlBlKFBFX0RBVEEgKnBlRGF0YSwKKyAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKTsKKworCisKKworI2VuZGlmIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbWVtYWxpZ24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21lbWFsaWduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzMDJhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21lbWFsaWduLmgKQEAgLTAsMCArMSwzNSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJbWVtYWxpZ24uaA0KKw0KKwlDb250ZW50OglNZW1vcnkgYWxsb2MgYWxpZ25tZW50cyBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX19WT19BQUNFTkNfTUVNX0FMSUdOX0hfXw0KKyNkZWZpbmUgX19WT19BQUNFTkNfTUVNX0FMSUdOX0hfXw0KKw0KKyNpbmNsdWRlICJ2b01lbS5oIg0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorDQorZXh0ZXJuIHZvaWQgKm1lbV9tYWxsb2MoVk9fTUVNX09QRVJBVE9SICpwTWVtb3AsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyIGFsaWdubWVudCwgdW5zaWduZWQgaW50IENvZGVjSUQpOw0KK2V4dGVybiB2b2lkIG1lbV9mcmVlKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB2b2lkICptZW1fcHRyLCB1bnNpZ25lZCBpbnQgQ29kZWNJRCk7DQorDQorI2VuZGlmCS8qIF9fVk9fTUVNX0FMSUdOX0hfXyAqLw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvbXNfc3RlcmVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0M2RlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL21zX3N0ZXJlby5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCW1zX3N0ZXJlby5oDQorDQorCUNvbnRlbnQ6CURlY2xhcmF0aW9uIE1TIHN0ZXJlbyBwcm9jZXNzaW5nIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX01TX1NURVJFT19IX18KKyNkZWZpbmUgX19NU19TVEVSRU9fSF9fCisjaW5jbHVkZSAidHlwZWRlZi5oIgorCit2b2lkIE1zU3RlcmVvUHJvY2Vzc2luZyhXb3JkMzIgICAgICAgKnNmYkVuZXJneUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYkVuZXJneVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgKnNmYkVuZXJneVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKm1kY3RTcGVjdHJ1bVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJUaHJlc2hvbGRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiU3ByZWFkZWRFbkxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqbXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wcmVfZWNob19jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmMzZlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3ByZV9lY2hvX2NvbnRyb2wuaApAQCAtMCwwICsxLDQyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwcmVfZWNob19jb250cm9sLmgNCisNCisJQ29udGVudDoJUHJlIGVjaG8gY29udHJvbCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fUFJFX0VDSE9fQ09OVFJPTF9ICisjZGVmaW5lIF9fUFJFX0VDSE9fQ09OVFJPTF9ICisKKyNpbmNsdWRlICJ0eXBlZGVmcy5oIgorCit2b2lkIEluaXRQcmVFY2hvQ29udHJvbChXb3JkMzIgKnBiVGhyZXNob2xkbm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcGJUaHJlc2hvbGRRdWlldCk7CisKKwordm9pZCBQcmVFY2hvQ29udHJvbChXb3JkMzIgKnBiVGhyZXNob2xkTm0xLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgIG1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcGJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1kY3RTY2FsZW5tMSk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uZmlndXJhdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbmZpZ3VyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2NmMjViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbmZpZ3VyYXRpb24uaApAQCAtMCwwICsxLDEwNyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcHN5X2NvbmZpZ3VyYXRpb24uaA0KKw0KKwlDb250ZW50OglQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1BTWV9DT05GSUdVUkFUSU9OX0gKKyNkZWZpbmUgX1BTWV9DT05GSUdVUkFUSU9OX0gKKw0KKyNpbmNsdWRlICJ0eXBlZGVmcy5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgInRucy5oIgorCit0eXBlZGVmIHN0cnVjdHsKKworICBXb3JkMTYgc2ZiQ250OworICBXb3JkMTYgc2ZiQWN0aXZlOyAgIC8qIG51bWJlciBvZiBzZiBiYW5kcyBjb250YWluaW5nIGVuZXJneSBhZnRlciBsb3dwYXNzICovCisgIFdvcmQxNiAqc2ZiT2Zmc2V0OworCisgIFdvcmQzMiBzZmJUaHJlc2hvbGRRdWlldFtNQVhfU0ZCX0xPTkddOworCisgIFdvcmQxNiBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7ICAgLyogcHJlZWNobyBjb250cm9sICovCisgIFdvcmQxNiBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7CisKKyAgV29yZDE2IGxvd3Bhc3NMaW5lOw0KKyAgV29yZDE2IHNhbXBSYXRlSWR4OworICBXb3JkMzIgY2xpcEVuZXJneTsgICAgICAgICAgICAgICAgIC8qIGZvciBsZXZlbCBkZXBlbmRlbmQgdG1uICovCisKKyAgV29yZDE2IHJhdGlvOworICBXb3JkMTYgc2ZiTWFza0xvd0ZhY3RvcltNQVhfU0ZCX0xPTkddOworICBXb3JkMTYgc2ZiTWFza0hpZ2hGYWN0b3JbTUFYX1NGQl9MT05HXTsKKworICBXb3JkMTYgc2ZiTWFza0xvd0ZhY3RvclNwckVuW01BWF9TRkJfTE9OR107CisgIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvclNwckVuW01BWF9TRkJfTE9OR107CisKKworICBXb3JkMTYgc2ZiTWluU25yW01BWF9TRkJfTE9OR107ICAgICAgIC8qIG1pbmltdW0gc25yIChmb3JtZXJseSBrbm93biBhcyBibWF4KSAqLworCisgIFROU19DT05GSUcgdG5zQ29uZjsKKworfVBTWV9DT05GSUdVUkFUSU9OX0xPTkc7IC8qV29yZDE2IHNpemU6IDggKyA1MiArIDEwMiArIDUxICsgNTEgKyA1MSArIDUxICsgNDcgPSA1MTUgKi8KKworCit0eXBlZGVmIHN0cnVjdHsKKworICBXb3JkMTYgc2ZiQ250OworICBXb3JkMTYgc2ZiQWN0aXZlOyAgIC8qIG51bWJlciBvZiBzZiBiYW5kcyBjb250YWluaW5nIGVuZXJneSBhZnRlciBsb3dwYXNzICovCisgIFdvcmQxNiAqc2ZiT2Zmc2V0OworCisgIFdvcmQzMiBzZmJUaHJlc2hvbGRRdWlldFtNQVhfU0ZCX1NIT1JUXTsKKworICBXb3JkMTYgbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yOyAgIC8qIHByZWVjaG8gY29udHJvbCAqLworICBXb3JkMTYgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yOworCisgIFdvcmQxNiBsb3dwYXNzTGluZTsNCisgIFdvcmQxNiBzYW1wUmF0ZUlkeDsKKyAgV29yZDMyIGNsaXBFbmVyZ3k7ICAgICAgICAgICAgICAgICAvKiBmb3IgbGV2ZWwgZGVwZW5kZW5kIHRtbiAqLworCisgIFdvcmQxNiByYXRpbzsKKyAgV29yZDE2IHNmYk1hc2tMb3dGYWN0b3JbTUFYX1NGQl9TSE9SVF07CisgIFdvcmQxNiBzZmJNYXNrSGlnaEZhY3RvcltNQVhfU0ZCX1NIT1JUXTsKKworICBXb3JkMTYgc2ZiTWFza0xvd0ZhY3RvclNwckVuW01BWF9TRkJfU0hPUlRdOworICBXb3JkMTYgc2ZiTWFza0hpZ2hGYWN0b3JTcHJFbltNQVhfU0ZCX1NIT1JUXTsKKworCisgIFdvcmQxNiBzZmJNaW5TbnJbTUFYX1NGQl9TSE9SVF07ICAgICAgIC8qIG1pbmltdW0gc25yIChmb3JtZXJseSBrbm93biBhcyBibWF4KSAqLworCisgIFROU19DT05GSUcgdG5zQ29uZjsKKworfVBTWV9DT05GSUdVUkFUSU9OX1NIT1JUOyAvKldvcmQxNiBzaXplOiA4ICsgMTYgKyAxNiArIDE2ICsgMTYgKyAxNiArIDE2ICsgMTYgKyA0NyA9IDE2NyAqLworDQorDQorLyogUmV0dXJucyB0aGUgc2FtcGxlIHJhdGUgaW5kZXggKi8NCitXb3JkMzIgR2V0U1JJbmRleChXb3JkMzIgc2FtcGxlUmF0ZSk7DQorCisKK1dvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpwc3lDb25mKTsKKworV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCAqcHN5Q29uZik7CisKKyNlbmRpZiAvKiBfUFNZX0NPTkZJR1VSQVRJT05fSCAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbnN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDU1YWIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2NvbnN0LmgKQEAgLTAsMCArMSw4MCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcHN5X2NvbnN0LmgNCisNCisJQ29udGVudDoJR2xvYmFsIHBzeWNob2Fjb3VzdGljIGNvbnN0YW50cyBzdHJ1Y3R1cmVzDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUFNZQ09OU1RfSAorI2RlZmluZSBfUFNZQ09OU1RfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiDQorCisjZGVmaW5lIFRSVUUgIDEKKyNkZWZpbmUgRkFMU0UgMAorCisjZGVmaW5lIEZSQU1FX0xFTl9MT05HICAgIEFBQ0VOQ19CTE9DS1NJWkUKKyNkZWZpbmUgVFJBTlNfRkFDICAgICAgICAgOAorI2RlZmluZSBGUkFNRV9MRU5fU0hPUlQgICAoRlJBTUVfTEVOX0xPTkcvVFJBTlNfRkFDKQ0KKw0KKworCisvKiBCbG9jayB0eXBlcyAqLworZW51bQoreworICBMT05HX1dJTkRPVyA9IDAsCisgIFNUQVJUX1dJTkRPVywKKyAgU0hPUlRfV0lORE9XLAorICBTVE9QX1dJTkRPVworfTsKKworLyogV2luZG93IHNoYXBlcyAqLworZW51bQoreworICBTSU5FX1dJTkRPVyA9IDAsCisgIEtCRF9XSU5ET1cgID0gMQorfTsKKworLyoKKyAgTVMgc3R1ZmYKKyovCitlbnVtCit7CisgIFNJX01TX01BU0tfTk9ORSA9IDAsCisgIFNJX01TX01BU0tfU09NRSA9IDEsCisgIFNJX01TX01BU0tfQUxMICA9IDIKK307CisKKyNkZWZpbmUgTUFYX05PX09GX0dST1VQUyA0CisjZGVmaW5lIE1BWF9TRkJfU0hPUlQgICAxNSAgLyogMTUgZm9yIGEgbWVtb3J5IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiwgbWF5YmUgMTYgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nICovCisjZGVmaW5lIE1BWF9TRkJfTE9ORyAgICA1MSAgLyogNTEgZm9yIGEgbWVtb3J5IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiwgbWF5YmUgNjQgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nICovCisjZGVmaW5lIE1BWF9TRkIgICAgICAgICAoTUFYX1NGQl9TSE9SVCA+IE1BWF9TRkJfTE9ORyA/IE1BWF9TRkJfU0hPUlQgOiBNQVhfU0ZCX0xPTkcpICAgLyogPSBNQVhfU0ZCX0xPTkcgKi8KKyNkZWZpbmUgTUFYX0dST1VQRURfU0ZCIChNQVhfTk9fT0ZfR1JPVVBTKk1BWF9TRkJfU0hPUlQgPiBNQVhfU0ZCX0xPTkcgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX05PX09GX0dST1VQUypNQVhfU0ZCX1NIT1JUIDogTUFYX1NGQl9MT05HKQorCisjZGVmaW5lIEJMT0NLX1NXSVRDSElOR19PRkZTRVQJCSAgICgxKjEwMjQrMyoxMjgrNjQrMTI4KQorI2RlZmluZSBCTE9DS19TV0lUQ0hJTkdfREFUQV9TSVpFICAgICAgICAgIEZSQU1FX0xFTl9MT05HCisJCQkJCQkJCQkJICAgIAorI2RlZmluZSBUUkFOU0ZPUk1fT0ZGU0VUX0xPTkcgICAgMAorI2RlZmluZSBUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUICAgNDQ4CisKKyNkZWZpbmUgTE9HX05PUk1fUENNICAgICAgICAgIC0xNQorDQorI2RlZmluZSBOVU1fU0FNUExFX1JBVEVTCTEyCisKKyNlbmRpZiAvKiBfUFNZQ09OU1RfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcHN5X2RhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxMmQ1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9kYXRhLmgKQEAgLTAsMCArMSw2NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcHN5X2RhdGEuaA0KKw0KKwlDb250ZW50OglQc3ljaG9hY291c3RpYyBkYXRhIGFuZCBzdHJ1Y3R1cmVzDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUFNZX0RBVEFfSAorI2RlZmluZSBfUFNZX0RBVEFfSAorCisjaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCisjaW5jbHVkZSAidG5zLmgiCisKKy8qCisgIHRoZSBzdHJ1Y3RzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyB1bmlvbnMKKyovCisKK3R5cGVkZWYgc3RydWN0eworICBXb3JkMzIgc2ZiTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKK31TRkJfVEhSRVNIT0xEOyAvKiBXb3JkMTYgc2l6ZTogMjYwICovCisKK3R5cGVkZWYgc3RydWN0eworICBXb3JkMzIgc2ZiTG9uZ1tNQVhfR1JPVVBFRF9TRkJdOworICBXb3JkMzIgc2ZiU2hvcnRbVFJBTlNfRkFDXVtNQVhfU0ZCX1NIT1JUXTsKK31TRkJfRU5FUkdZOyAvKiBXb3JkMTYgc2l6ZTogMjYwICovCisKK3R5cGVkZWYgc3RydWN0eworICBXb3JkMzIgc2ZiTG9uZzsKKyAgV29yZDMyIHNmYlNob3J0W1RSQU5TX0ZBQ107Cit9U0ZCX0VORVJHWV9TVU07IC8qIFdvcmQxNiBzaXplOiAxOCAqLworCisKK3R5cGVkZWYgc3RydWN0eworICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbDsgICAgICAgICAgLyogYmxvY2sgc3dpdGNoaW5nICovCisgIFdvcmQxNiAgICAgICAgICAgICAgICAgICAgKm1kY3REZWxheUJ1ZmZlcjsgICAgICAgICAgICAgICAvKiBtZGN0IGRlbGF5IGJ1ZmZlciBbQkxPQ0tfU1dJVENISU5HX09GRlNFVF0qLworICBXb3JkMzIgICAgICAgICAgICAgICAgICAgIHNmYlRocmVzaG9sZG5tMVtNQVhfU0ZCXTsgICAgICAgLyogUHJlRWNob0NvbnRyb2wgKi8KKyAgV29yZDE2ICAgICAgICAgICAgICAgICAgICBtZGN0U2NhbGVubTE7ICAgICAgICAgICAgICAgICAgIC8qIHNjYWxlIG9mIGxhc3QgYmxvY2sncyBtZGN0IChQcmVFY2hvQ29udHJvbCkgKi8KKworICBTRkJfVEhSRVNIT0xEICAgICAgICAgICAgIHNmYlRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYWRhcHQgICAgICAgICAgICovCisgIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiRW5lcmd5OyAgICAgICAgICAgICAgICAgICAgICAvKiBzZmIgRW5lcmd5ICAgICAgKi8KKyAgU0ZCX0VORVJHWSAgICAgICAgICAgICAgICBzZmJFbmVyZ3lNUzsKKyAgU0ZCX0VORVJHWV9TVU0gICAgICAgICAgICBzZmJFbmVyZ3lTdW07CisgIFNGQl9FTkVSR1lfU1VNICAgICAgICAgICAgc2ZiRW5lcmd5U3VtTVM7CisgIFNGQl9FTkVSR1kgICAgICAgICAgICAgICAgc2ZiU3ByZWFkZWRFbmVyZ3k7CisKKyAgV29yZDMyICAgICAgICAgICAgICAgICAgICAqbWRjdFNwZWN0cnVtOyAgICAgICAgICAgICAgICAgIC8qIG1kY3Qgc3BlY3RydW0gW0ZSQU1FX0xFTl9MT05HXSAqLworICBXb3JkMTYgICAgICAgICAgICAgICAgICAgIG1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgLyogc2NhbGUgb2YgbWRjdCAgICovCit9UFNZX0RBVEE7IC8qIFdvcmQxNiBzaXplOiA0ICsgODcgKyAxMDIgKyAzNjAgKyAzNjAgKyAzNjAgKyAxOCArIDE4ICsgMzYwID0gMTY2OSAqLworCisjZW5kaWYgLyogX1BTWV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3BzeV9tYWluLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGI4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9wc3lfbWFpbi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXBzeV9tYWluLmgNCisNCisJQ29udGVudDoJUHN5Y2hvYWNvdXN0aWMgbWFqb3IgZnVuY3Rpb24gYmxvY2sNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9QU1lNQUlOX0gKKyNkZWZpbmUgX1BTWU1BSU5fSAorCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAibWVtYWxpZ24uaCIKKworLyoKKyAgcHN5IGtlcm5lbAorKi8KK3R5cGVkZWYgc3RydWN0ICB7CisgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgIHBzeUNvbmZMb25nOyAgICAgICAgICAgLyogV29yZDE2IHNpemU6IDUxNSAqLworICBQU1lfQ09ORklHVVJBVElPTl9TSE9SVCBwc3lDb25mU2hvcnQ7ICAgICAgICAgIC8qIFdvcmQxNiBzaXplOiAxNjcgKi8KKyAgUFNZX0RBVEEgICAgICAgICAgICAgICAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdOyAvKiBXb3JkMTYgc2l6ZTogTUFYX0NIQU5ORUxTKjE2NjkqLworICBUTlNfREFUQSAgICAgICAgICAgICAgICB0bnNEYXRhW01BWF9DSEFOTkVMU107IC8qIFdvcmQxNiBzaXplOiBNQVhfQ0hBTk5FTFMqMjM1ICovCisgIFdvcmQzMiogICAgICAgICAgICAgICAgIHBTY3JhdGNoVG5zOw0KKyAgV29yZDE2CQkJCSAgc2FtcGxlUmF0ZUlkeDsKK31QU1lfS0VSTkVMOyAvKiBXb3JkMTYgc2l6ZTogMjU4NyAvIDQ0OTEgKi8KKworCitXb3JkMTYgUHN5TmV3KCBQU1lfS0VSTkVMICAqaFBzeSwgV29yZDMyIG5DaGFuLCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CitXb3JkMTYgUHN5RGVsZXRlKCBQU1lfS0VSTkVMICAqaFBzeSwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOworCitXb3JkMTYgUHN5T3V0TmV3KCBQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CitXb3JkMTYgUHN5T3V0RGVsZXRlKCBQU1lfT1VUICpoUHN5T3V0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7CisKK1dvcmQxNiBwc3lNYWluSW5pdCggUFNZX0tFUk5FTCAqaFBzeSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0bnNNYXNrLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoKTsKKworCitXb3JkMTYgcHN5TWFpbihXb3JkMTYgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCAgIC8qITwgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgICAgICAqZWxlbUluZm8sCisgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgICAgICAgKnRpbWVTaWduYWwsIC8qITwgaW50ZXJsZWF2ZWQgdGltZSBzaWduYWwgKi8gCisgICAgICAgICAgICAgICBQU1lfREFUQSAgICAgICAgICAgICAgICAgcHN5RGF0YVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgVE5TX0RBVEEgICAgICAgICAgICAgICAgIHRuc0RhdGFbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcqICBwc3lDb25mTG9uZywKKyAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUKiBwc3lDb25mU2hvcnQsCisgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICAgICAgICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICAgICAgICAgICpwU2NyYXRjaFRucywKKwkJCSAgIFdvcmQzMgkJCQkJc2FtcGxlUmF0ZSk7CisKKyNlbmRpZiAvKiBfUFNZTUFJTl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19kYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9xY19kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkNDA1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX2RhdGEuaApAQCAtMCwwICsxLDE0MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcWNfZGF0YS5oDQorDQorCUNvbnRlbnQ6CVF1YW50aXppbmcgJiBjb2Rpbmcgc3RydWN0dXJlcw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1FDX0RBVEFfSAorI2RlZmluZSBfUUNfREFUQV9ICisKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJkeW5fYml0cy5oIgorI2luY2x1ZGUgImFkal90aHJfZGF0YS5oIgorCisKKyNkZWZpbmUgTUFYX01PREVTIDEwCisKK3R5cGVkZWYgZW51bSB7CisgIE1PREVfSU5WQUxJRCA9IDAsCisgIE1PREVfMSwgICAgICAgIC8qIG1vbm8gICAgICAqLworICBNT0RFXzFfMSwgICAgICAvKiBkdWFsIG1vbm8gKi8KKyAgTU9ERV8yICAgICAgICAgLyogc3RlcmVvICAgICovCit9IEVOQ09ERVJfTU9ERTsKKwordHlwZWRlZiBlbnVtIHsKKyAgSURfU0NFPTAsICAgICAvKiBTaW5nbGUgQ2hhbm5lbCBFbGVtZW50ICAgKi8KKyAgSURfQ1BFPTEsICAgICAvKiBDaGFubmVsIFBhaXIgRWxlbWVudCAgICAgKi8KKyAgSURfQ0NFPTIsICAgICAvKiBDb3VwbGluZyBDaGFubmVsIEVsZW1lbnQgKi8KKyAgSURfTEZFPTMsICAgICAvKiBMRkUgQ2hhbm5lbCBFbGVtZW50ICAgICAgKi8KKyAgSURfRFNFPTQsICAgICAvKiBjdXJyZW50IG9uZSBEU0UgZWxlbWVudCBmb3IgYW5jaWxsYXJ5IGlzIHN1cHBvcnRlZCAqLworICBJRF9QQ0U9NSwKKyAgSURfRklMPTYsCisgIElEX0VORD03Cit9RUxFTUVOVF9UWVBFOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEVMRU1FTlRfVFlQRSBlbFR5cGU7CisgIFdvcmQxNiBpbnN0YW5jZVRhZzsKKyAgV29yZDE2IG5DaGFubmVsc0luRWw7CisgIFdvcmQxNiBDaGFubmVsSW5kZXhbTUFYX0NIQU5ORUxTXTsKK30gRUxFTUVOVF9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFdvcmQzMiBwYWRkaW5nUmVzdDsKK30gUEFERElORzsKKworCisvKiBRdWFudGl6aW5nICYgY29kaW5nIHN0YWdlICovCisKK3N0cnVjdCBRQ19JTklUeworICBFTEVNRU5UX0lORk8gKmVsSW5mbzsKKyAgV29yZDE2IG1heEJpdHM7ICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBiaXRzIGluIHJlc2Vydm9pciAgKi8KKyAgV29yZDE2IGF2ZXJhZ2VCaXRzOyAvKiBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHdlIHNob3VsZCB1c2UgKi8KKyAgV29yZDE2IGJpdFJlczsKKyAgV29yZDE2IG1lYW5QZTsKKyAgV29yZDMyIGNoQml0cmF0ZTsKKyAgV29yZDE2IG1heEJpdEZhYzsKKyAgV29yZDMyIGJpdHJhdGU7CisKKyAgUEFERElORyBwYWRkaW5nOworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV29yZDE2ICAgICAgICAgICpxdWFudFNwZWM7ICAgICAgIC8qIFtGUkFNRV9MRU5fTE9OR107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIFVXb3JkMTYgICAgICAgICAqbWF4VmFsdWVJblNmYjsgICAvKiBbTUFYX0dST1VQRURfU0ZCXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBXb3JkMTYgICAgICAgICAgKnNjZjsgICAgICAgICAgICAgLyogW01BWF9HUk9VUEVEX1NGQl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgV29yZDE2ICAgICAgICAgIGdsb2JhbEdhaW47CisgIFdvcmQxNiAgICAgICAgICBtZGN0U2NhbGU7CisgIFdvcmQxNiAgICAgICAgICBncm91cGluZ01hc2s7CisgIFNFQ1RJT05fREFUQSAgICBzZWN0aW9uRGF0YTsKKyAgV29yZDE2ICAgICAgICAgIHdpbmRvd1NoYXBlOworfSBRQ19PVVRfQ0hBTk5FTDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgV29yZDE2CQkgIGFkdHNVc2VkOw0KKyAgV29yZDE2ICAgICAgICAgIHN0YXRpY0JpdHNVc2VkOyAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCisgIFdvcmQxNiAgICAgICAgICBkeW5CaXRzVXNlZDsgICAgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLworICBXb3JkMTYgICAgICAgICAgcGU7CisgIFdvcmQxNiAgICAgICAgICBhbmNCaXRzVXNlZDsKKyAgV29yZDE2ICAgICAgICAgIGZpbGxCaXRzOworfSBRQ19PVVRfRUxFTUVOVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgUUNfT1VUX0NIQU5ORUwgIHFjQ2hhbm5lbFtNQVhfQ0hBTk5FTFNdOworICBRQ19PVVRfRUxFTUVOVCAgcWNFbGVtZW50OworICBXb3JkMTYgICAgICAgICAgdG90U3RhdGljQml0c1VzZWQ7IC8qIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMgKi8KKyAgV29yZDE2ICAgICAgICAgIHRvdER5bkJpdHNVc2VkOyAgICAvKiBmb3IgdmVyaWZpY2F0aW9uIHB1cnBvc2VzICovCisgIFdvcmQxNiAgICAgICAgICB0b3RBbmNCaXRzVXNlZDsgICAgLyogZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3NlcyAqLworICBXb3JkMTYgICAgICAgICAgdG90RmlsbEJpdHM7CisgIFdvcmQxNiAgICAgICAgICBhbGlnbkJpdHM7CisgIFdvcmQxNiAgICAgICAgICBiaXRSZXNUb3Q7CisgIFdvcmQxNiAgICAgICAgICBhdmVyYWdlQml0c1RvdDsKK30gUUNfT1VUOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFdvcmQzMiBjaEJpdHJhdGU7CisgIFdvcmQxNiBhdmVyYWdlQml0czsgICAgICAgICAgICAgICAvKiBicnV0dG8gLT4gbG9vayBhbmNpbGxhcnkuaCAqLworICBXb3JkMTYgbWF4Qml0czsKKyAgV29yZDE2IGJpdFJlc0xldmVsOworICBXb3JkMTYgbWF4Qml0UmVzQml0czsKKyAgV29yZDE2IHJlbGF0aXZlQml0czsgICAgICAgICAgICAvKiBCaXRzIHJlbGF0aXZlIHRvIHRvdGFsIEJpdHMgc2NhbGVkIGRvd24gYnkgMiAqLworfSBFTEVNRU5UX0JJVFM7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIC8qIHRoaXMgaXMgYmFzaWNhbGx5IHN0cnVjdCBRQ19JTklUICovCisgIFdvcmQxNiBhdmVyYWdlQml0c1RvdDsKKyAgV29yZDE2IG1heEJpdHNUb3Q7CisgIFdvcmQxNiBnbG9iU3RhdEJpdHM7CisgIFdvcmQxNiBuQ2hhbm5lbHM7CisgIFdvcmQxNiBiaXRSZXNUb3Q7CisKKyAgV29yZDE2IG1heEJpdEZhYzsKKworICBQQURESU5HICAgcGFkZGluZzsKKworICBFTEVNRU5UX0JJVFMgIGVsZW1lbnRCaXRzOworICBBREpfVEhSX1NUQVRFIGFkalRocjsKKworICBXb3JkMTYgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07CisgIFdvcmQxNiBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl07CisgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdOworfSBRQ19TVEFURTsKKworI2VuZGlmIC8qIF9RQ19EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX21haW4uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3FjX21haW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTEzOGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcWNfbWFpbi5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXFjX21haW4uaA0KKw0KKwlDb250ZW50OglRdWFudGl6aW5nICYgY29kaW5nIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1FDX01BSU5fSAorI2RlZmluZSBfUUNfTUFJTl9ICisKKyNpbmNsdWRlICJxY19kYXRhLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibWVtYWxpZ24uaCIKKworLyogUXVhbnRpemluZyAmIGNvZGluZyBzdGFnZSAqLworCitXb3JkMTYgUUNPdXROZXcoUUNfT1VUICpoUUMsIFdvcmQxNiBuQ2hhbm5lbHMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsKKwordm9pZCBRQ091dERlbGV0ZShRQ19PVVQgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOworCitXb3JkMTYgUUNOZXcoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOworCitXb3JkMTYgUUNJbml0KFFDX1NUQVRFICpoUUMsIAorICAgICAgICAgICAgICBzdHJ1Y3QgUUNfSU5JVCAqaW5pdCk7CisKK3ZvaWQgUUNEZWxldGUoUUNfU1RBVEUgKmhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOworCisKK1dvcmQxNiBRQ01haW4oUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgRUxFTUVOVF9CSVRTKiBlbEJpdHMsCisgICAgICAgICAgICAgIEFUU19FTEVNRU5UKiBhZGpUaHJTdGF0ZUVsZW1lbnQsCisgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLworICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgICAvKiBvdXQgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQqIHFjT3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgV29yZDE2IG5DaGFubmVscywKKwkJCSAgV29yZDE2IGFuY2lsbGFyeURhdGFCeXRlcyk7ICAgICAvKiByZXR1cm5zIGVycm9yIGNvZGUgICAgICAgKi8KKwordm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCk7CisKK1dvcmQxNiBGaW5hbGl6ZUJpdENvbnN1bXB0aW9uKFFDX1NUQVRFICpoUUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVQqIHFjT3V0KTsKKworV29yZDE2IEFkanVzdEJpdHJhdGUoUUNfU1RBVEUgKmhRQywKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUpOworCisjZW5kaWYgLyogX1FDX01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvcXVhbnRpemUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3F1YW50aXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhOTVlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3F1YW50aXplLmgKQEAgLTAsMCArMSw0MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcXVhbnRpemUuaA0KKw0KKwlDb250ZW50OglRdWFudGl6YXRpb24gZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfUVVBTlRJWkVfSF8KKyNkZWZpbmUgX1FVQU5USVpFX0hfCisjaW5jbHVkZSAidHlwZWRlZnMuaCIKKworLyogcXVhbnRpemluZyAqLworCisjZGVmaW5lIE1BWF9RVUFOVCA4MTkxCisKK3ZvaWQgUXVhbnRpemVTcGVjdHJ1bShXb3JkMTYgc2ZiQ250LCAKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LCBXb3JkMzIgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ2xvYmFsR2FpbiwgV29yZDE2ICpzY2FsZWZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpxdWFudGl6ZWRTcGVjdHJ1bSk7CisKK1dvcmQzMiBjYWxjU2ZiRGlzdChjb25zdCBXb3JkMzIgKnNwZWMsCisgICAgICAgICAgICAgICAgICAgV29yZDE2ICBzZmJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGdhaW4pOworCisjZW5kaWYgLyogX1FVQU5USVpFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zZl9lc3RpbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVlYzNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc2ZfZXN0aW0uaApAQCAtMCwwICsxLDQ2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlzZl9lc3RpbS5oDQorDQorCUNvbnRlbnQ6CVNjYWxlIGZhY3RvciBlc3RpbWF0aW9uIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19TRl9FU1RJTV9IX18KKyNkZWZpbmUgX19TRl9FU1RJTV9IX18KKy8qCisgICBTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbiAKKyAqLworI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKwordm9pZAorQ2FsY0Zvcm1GYWN0b3IoV29yZDE2ICAgICAgICAgIGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICBuQ2hhbm5lbHMpOworCit2b2lkCitFc3RpbWF0ZVNjYWxlRmFjdG9ycyhQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgIHFjT3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRm9ybUZhY3RvcltNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgIG5DaGFubmVscyk7CisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3NwcmVhZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Y2Y2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy9zcHJlYWRpbmcuaApAQCAtMCwwICsxLDMzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlzcHJlYWRpbmcuaA0KKw0KKwlDb250ZW50OglTcHJlYWRpbmcgb2YgZW5lcmd5IGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1NQUkVBRElOR19ICisjZGVmaW5lIF9TUFJFQURJTkdfSAorI2luY2x1ZGUgInR5cGVkZWZzLmgiCisNCisKK3ZvaWQgU3ByZWFkaW5nTWF4KGNvbnN0IFdvcmQxNiBwYkNudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0xvd0ZhY3RvciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnBiU3ByZWFkZWRFbmVyZ3kpOworCisjZW5kaWYgLyogI2lmbmRlZiBfU1BSRUFESU5HX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3N0YXRfYml0cy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvc3RhdF9iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5MGI5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3N0YXRfYml0cy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXN0YXRfYml0cy5oDQorDQorCUNvbnRlbnQ6CVN0YXRpYyBiaXQgY291bnRlciBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fU1RBVF9CSVRTX0gKKyNkZWZpbmUgX19TVEFUX0JJVFNfSAorCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKK1dvcmQxNiBjb3VudFN0YXRpY0JpdGRlbWFuZChQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbkNoYW5uZWxzLCANCisJCQkJCQkJV29yZDE2IGFkdHNVc2VkKTsKKworI2VuZGlmIC8qIF9fU1RBVF9CSVRTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Rucy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmY2NlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Rucy5oCkBAIC0wLDAgKzEsMTA4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl0bnMuaA0KKw0KKwlDb250ZW50OglUTlMgc3RydWN0dXJlcw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1ROU19ICisjZGVmaW5lIF9UTlNfSAorDQorI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKworCisKKyNkZWZpbmUgVE5TX01BWF9PUkRFUiAxMgorI2RlZmluZSBUTlNfTUFYX09SREVSX1NIT1JUIDUKKworI2RlZmluZSBGSUxURVJfRElSRUNUSU9OICAgIDAKKwordHlwZWRlZiBzdHJ1Y3R7IC8qc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLworICBXb3JkMTYgICAgIHRocmVzaE9uOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMICogMTAwKi8KKyAgV29yZDMyICAgICBscGNTdGFydEZyZXE7ICAgICAgICAgICAgLyogbG93ZXN0IGZyZXEgZm9yIGxwYyBUQUJVTCovCisgIFdvcmQzMiAgICAgbHBjU3RvcEZyZXE7ICAgICAgICAgICAgIC8qIFRBQlVMICovCisgIFdvcmQzMiAgICAgdG5zVGltZVJlc29sdXRpb247Cit9VE5TX0NPTkZJR19UQUJVTEFURUQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgeyAgIC8qYXNzaWduZWQgYXQgSW5pdFRpbWUqLworICBXb3JkMTYgdG5zQWN0aXZlOworICBXb3JkMTYgdG5zTWF4U2ZiOworCisgIFdvcmQxNiBtYXhPcmRlcjsgICAgICAgICAgICAgICAgLyogbWF4LiBvcmRlciBvZiB0bnMgZmlsdGVyICovCisgIFdvcmQxNiB0bnNTdGFydEZyZXE7ICAgICAgICAgICAgLyogbG93ZXN0IGZyZXEuIGZvciB0bnMgZmlsdGVyaW5nICovCisgIFdvcmQxNiBjb2VmUmVzOworCisgIFROU19DT05GSUdfVEFCVUxBVEVEIGNvbmZUYWI7CisKKyAgV29yZDMyIGFjZldpbmRvd1tUTlNfTUFYX09SREVSKzFdOworCisgIFdvcmQxNiB0bnNTdGFydEJhbmQ7CisgIFdvcmQxNiB0bnNTdGFydExpbmU7CisKKyAgV29yZDE2IHRuc1N0b3BCYW5kOworICBXb3JkMTYgdG5zU3RvcExpbmU7CisKKyAgV29yZDE2IGxwY1N0YXJ0QmFuZDsKKyAgV29yZDE2IGxwY1N0YXJ0TGluZTsKKworICBXb3JkMTYgbHBjU3RvcEJhbmQ7CisgIFdvcmQxNiBscGNTdG9wTGluZTsKKworICBXb3JkMTYgdG5zUmF0aW9QYXRjaExvd2VzdENiOworICBXb3JkMTYgdG5zTW9kaWZ5QmVnaW5DYjsKKworICBXb3JkMTYgdGhyZXNob2xkOyAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMICogMTAwICovCisKK31UTlNfQ09ORklHOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV29yZDE2IHRuc0FjdGl2ZTsKKyAgV29yZDMyIHBhcmNvcltUTlNfTUFYX09SREVSXTsKKyAgV29yZDE2IHByZWRpY3Rpb25HYWluOworfSBUTlNfU1VCQkxPQ0tfSU5GTzsgLyogV29yZDE2IHNpemU6IDI2ICovCisKK3R5cGVkZWYgc3RydWN0eworICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm9bVFJBTlNfRkFDXTsKK30gVE5TX0RBVEFfU0hPUlQ7CisKK3R5cGVkZWYgc3RydWN0eworICBUTlNfU1VCQkxPQ0tfSU5GTyBzdWJCbG9ja0luZm87Cit9IFROU19EQVRBX0xPTkc7CisKK3R5cGVkZWYgc3RydWN0eworICBUTlNfREFUQV9MT05HIHRuc0xvbmc7CisgIFROU19EQVRBX1NIT1JUIHRuc1Nob3J0OworfVROU19EQVRBX1JBVzsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQxNiBudW1PZlN1YmJsb2NrczsKKyAgVE5TX0RBVEFfUkFXIGRhdGFSYXc7Cit9VE5TX0RBVEE7IC8qIFdvcmQxNiBzaXplOiAxICsgOCoyNiArIDI2ID0gMjM1ICovCisKK3R5cGVkZWYgc3RydWN0eworICBXb3JkMTYgdG5zQWN0aXZlW1RSQU5TX0ZBQ107CisgIFdvcmQxNiBjb2VmUmVzW1RSQU5TX0ZBQ107CisgIFdvcmQxNiBsZW5ndGhbVFJBTlNfRkFDXTsKKyAgV29yZDE2IG9yZGVyW1RSQU5TX0ZBQ107CisgIFdvcmQxNiBjb2VmW1RSQU5TX0ZBQypUTlNfTUFYX09SREVSX1NIT1JUXTsKK31UTlNfSU5GTzsgLyogV29yZDE2IHNpemU6IDcyICovCisKKyNlbmRpZiAvKiBfVE5TX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3Ruc19mdW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Yjc1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfZnVuYy5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXRuc19mdW5jLmgNCisNCisJQ29udGVudDoJVE5TIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgICBUZW1wb3JhbCBub2lzZSBzaGFwaW5nCisgKi8KKyNpZm5kZWYgX1ROU19GVU5DX0gKKyNkZWZpbmUgX1ROU19GVU5DX0gNCisjaW5jbHVkZSAidHlwZWRlZi5oIgorI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisKK1dvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvbkxvbmcoV29yZDMyIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRuc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqcHN5Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKTsKKworV29yZDE2IEluaXRUbnNDb25maWd1cmF0aW9uU2hvcnQoV29yZDMyIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19DT05GSUcgKnRuc0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpwc3lDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKTsKKworV29yZDMyIFRuc0RldGVjdChUTlNfREFUQSogdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyB0QywKKyAgICAgICAgICAgICAgICAgV29yZDMyKiBwU2NyYXRjaFRucywKKyAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYk9mZnNldFtdLAorICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLAorICAgICAgICAgICAgICAgICBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsCisgICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgIFdvcmQzMiAqIHNmYkVuZXJneSk7CisKK3ZvaWQgVG5zU3luYyhUTlNfREFUQSAqdG5zRGF0YURlc3QsCisgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGFTcmMsCisgICAgICAgICAgICAgY29uc3QgVE5TX0NPTkZJRyB0QywKKyAgICAgICAgICAgICBjb25zdCBXb3JkMTYgc3ViQmxvY2tOdW1iZXIsCisgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJsb2NrVHlwZSk7CisKK1dvcmQxNiBUbnNFbmNvZGUoVE5TX0lORk8qIHRuc0luZm8sCisgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLAorICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZTZmIsCisgICAgICAgICAgICAgICAgIFROU19DT05GSUcgdEMsCisgICAgICAgICAgICAgICAgIFdvcmQxNiBsb3dQYXNzTGluZSwKKyAgICAgICAgICAgICAgICAgV29yZDMyKiBzcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgV29yZDE2IHN1YkJsb2NrTnVtYmVyLAorICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlKTsKKwordm9pZCBBcHBseVRuc011bHRUYWJsZVRvUmF0aW9zKFdvcmQxNiBzdGFydENiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wQ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX1NVQkJMT0NLX0lORk8gc3ViSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnRocmVzaG9sZHMpOworCisKKyNlbmRpZiAvKiBfVE5TX0ZVTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90bnNfcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjI2NmFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9pbmMvdG5zX3BhcmFtLmgKQEAgLTAsMCArMSw1MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdG5zX3BhcmFtLmgNCisNCisJQ29udGVudDoJVE5TIHBhcmFtZXRlcnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICAgVE5TIHBhcmFtZXRlcnMKKyAqLworI2lmbmRlZiBfVE5TX1BBUkFNX0gKKyNkZWZpbmUgX1ROU19QQVJBTV9ICisKKyNpbmNsdWRlICJ0bnMuaCIKKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQzMiBzYW1wbGluZ1JhdGU7CisgIFdvcmQxNiBtYXhCYW5kTG9uZzsKKyAgV29yZDE2IG1heEJhbmRTaG9ydDsKK31UTlNfTUFYX1RBQl9FTlRSWTsKKwordHlwZWRlZiBzdHJ1Y3R7CisgICAgV29yZDMyIGJpdFJhdGVGcm9tOworICAgIFdvcmQzMiBiaXRSYXRlVG87CisgICAgY29uc3QgVE5TX0NPTkZJR19UQUJVTEFURUQgKnBhcmFtTW9ub19Mb25nOyAgLyogY29udGFpbnMgVE5TIHBhcmFtZXRlcnMgKi8KKyAgICBjb25zdCBUTlNfQ09ORklHX1RBQlVMQVRFRCAqcGFyYW1Nb25vX1Nob3J0OworICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbVN0ZXJlb19Mb25nOworICAgIGNvbnN0IFROU19DT05GSUdfVEFCVUxBVEVEICpwYXJhbVN0ZXJlb19TaG9ydDsKK31UTlNfSU5GT19UQUI7CisKKwordm9pZCBHZXRUbnNQYXJhbShUTlNfQ09ORklHX1RBQlVMQVRFRCAqdG5zQ29uZmlnVGFiLCAKKyAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsIFdvcmQxNiBjaGFubmVscywgV29yZDE2IGJsb2NrVHlwZSk7CisKK3ZvaWQgR2V0VG5zTWF4QmFuZHMoV29yZDMyIHNhbXBsaW5nUmF0ZSwgV29yZDE2IGJsb2NrVHlwZSwgV29yZDE2KiB0bnNNYXhTZmIpOworCisjZW5kaWYgLyogX1ROU19QQVJBTV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvaW5jL3RyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjY5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL2luYy90cmFuc2Zvcm0uaApAQCAtMCwwICsxLDM2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl0cmFuc2Zvcm0uaA0KKw0KKwlDb250ZW50OglNRENUIFRyYW5zZm9ybSBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmICBfX1RSQU5TRk9STV9IX18KKyNkZWZpbmUgX19UUkFOU0ZPUk1fSF9fCisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisgICAgICAgICAgICAgICAgICAKK3ZvaWQgVHJhbnNmb3JtX1JlYWwoV29yZDE2ICptZGN0RGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LCAgICAgLyohIGNoYW5uZWwgaW5jcmVtZW50ICovCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcmVhbE91dCwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB3aW5kb3dTZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICApOworCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNfcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlMDM1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY19yb20uYwpAQCAtMCwwICsxLDIzNjMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWFhY19yb20uYw0KKw0KKwlDb250ZW50Ogljb25zdGFudCB0YWJsZXMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYWFjX3JvbS5oIg0KKw0KKyNpZiBkZWZpbmVkIChBUk1WNUUpICYmICFkZWZpbmVkIChBUk1WN05lb24pDQorDQorLyogDQorICogIFEzMCBmb3IgMTI4IGFuZCAxMDI0IA0KKyAqDQorICogZm9yIChpID0gMDsgaSA8IG51bS80OyBpKyspIHsNCisgKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOw0KKyAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7DQorICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsNCisgKiANCisgKiAgIGFuZ2xlID0gKG51bS8yIC0gMSAtIGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOw0KKyAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAzMCk7DQorICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDMwKTsNCisgKiB9DQorICovDQorY29uc3QgaW50IGNvc3NpbnRhYlsxMjggKyAxMDI0XSA9IHsNCisJLyogMTI4ICovDQorCTB4M2ZmZmVjNDMsIDB4MDAzMjQzZjEsIDB4MDE1ZmQ0ZDIsIDB4M2ZmYzM4ZDEsIDB4M2ZmOWMxM2EsIDB4MDFjNDU0ZjUsIDB4MDJmMWI3NTUsIDB4M2ZlZWE3NzYsIA0KKwkweDNmZTliOGE5LCAweDAzNTYyMDM4LCAweDA0ODMyNTlkLCAweDNmZDczYTRhLCAweDNmY2ZkNTBiLCAweDA0ZTc2N2M1LCAweDA2MTNlMWM1LCAweDNmYjVmNGVhLCANCisJMHgzZmFjMWE1YiwgMHgwNjc3ZWRiYiwgMHgwN2EzYWRmZiwgMHgzZjhhZGM3NywgMHgzZjdlOGUxZSwgMHgwODA3NzQ1NywgMHgwOTMyNGNhNywgMHgzZjU1Zjc5NiwgDQorCTB4M2Y0NzM3NTksIDB4MDk5NWJkZmQsIDB4MGFiZjgwNDMsIDB4M2YxNzRlNzAsIDB4M2YwNjFlOTUsIDB4MGIyMjhkNDIsIDB4MGM0YjBiOTQsIDB4M2VjZWVhYWQsIA0KKwkweDNlYmI0ZGRiLCAweDBjYWRhNGY1LCAweDBkZDRiMTlhLCAweDNlN2NkNzc4LCAweDNlNjZkMGI0LCAweDBlMzZjODJhLCAweDBmNWMzNWEzLCAweDNlMjEyMTc5LCANCisJMHgzZTA4YjQyYSwgMHgwZmJkYmE0MCwgMHgxMGUxNWI0ZSwgMHgzZGJiZDZkNCwgMHgzZGExMDZiZCwgMHgxMTQyM2VmMCwgMHgxMjYzZTY5OSwgMHgzZDRkMDcyOCwgDQorCTB4M2QyZmQ4NmMsIDB4MTJjNDFhNGYsIDB4MTNlMzliZTksIDB4M2NkNGMzOGIsIDB4M2NiNTNhYWEsIDB4MTQ0MzEwZGQsIDB4MTU2MDQwMTMsIDB4M2M1MzFlODgsIA0KKwkweDNjMzE0MDYwLCAweDE1YmVlNzhjLCAweDE2ZDk5ODY0LCAweDNiYzgyYzFmLCAweDNiYTNmZGU3LCAweDE3Mzc2M2M5LCAweDE4NGY2YWFiLCAweDNiMzQwMWJiLCANCisJMHgzYjBkODkwOSwgMHgxOGFjNGI4NywgMHgxOWMxN2Q0NCwgMHgzYTk2YjYzNiwgMHgzYTZkZjhmOCwgMHgxYTFkNjU0NCwgMHgxYjJmOTcxZSwgMHgzOWYwNjFkMiwgDQorCTB4MzljNTY2NGYsIDB4MWI4YTc4MTUsIDB4MWM5OTdmYzQsIDB4Mzk0MTFlMzMsIDB4MzkxM2ViMGUsIDB4MWNmMzRiYWYsIDB4MWRmZWZmNjcsIDB4Mzg4OTA2NjMsIA0KKwkweDM4NTlhMjkyLCAweDFlNTdhODZkLCAweDFmNWZkZWU2LCAweDM3YzgzNmMyLCAweDM3OTZhOTk2LCAweDFmYjc1NzVjLCAweDIwYmJlN2Q4LCAweDM2ZmVjZDBlLCANCisJMHgzNmNiMWUyYSwgMHgyMTEyMjI0MCwgMHgyMjEyZTQ5MiwgMHgzNjJjZTg1NSwgMHgzNWY3MWZiMSwgMHgyMjY3ZDNhMCwgMHgyMzY0YTAyZSwgMHgzNTUyYThmNCwgDQorCTB4MzUxYWNlZGQsIDB4MjNiODM2Y2EsIDB4MjRiMGU2OTksIDB4MzQ3MDMwOTUsIDB4MzQzNjRkYTYsIDB4MjUwMzE3ZGYsIDB4MjVmNzg0OTcsIDB4MzM4NWEyMjIsIA0KKwkweDMzNDliZjQ4LCAweDI2NDg0M2Q5LCAweDI3Mzg0N2M4LCAweDMyOTMyMWM3LCAweDMyNTU0ODQwLCAweDI3ODc4ODkzLCAweDI4NzJmZWI2LCAweDMxOThkNGVhLCANCisJMHgzMTU5MGUzZSwgMHgyOGMwYjRkMiwgMHgyOWE3NzhkYiwgMHgzMDk2ZTIyMywgMHgzMDU1MzgyOCwgMHgyOWYzOTg0YywgMHgyYWQ1ODZhMywgMHgyZjhkNzEzYSwgDQorCTB4MmY0OWVlMGYsIDB4MmIyMDAzYWMsIDB4MmJmY2Y5N2MsIDB4MmU3Y2FiMWMsIDB4MmUzNzU5MmMsIDB4MmM0NWM4YTAsIDB4MmQxZGEzZDUsIDB4MmQ2NGI5ZGEsIA0KKwkvKiAxMDI0ICovDQorCTB4M2ZmZmZmYjEsIDB4MDAwNjQ4N2YsIDB4MDAyYmZiNzQsIDB4M2ZmZmYwZTMsIDB4M2ZmZmU3MDUsIDB4MDAzODhjNmUsIDB4MDA1ZTNmNGMsIDB4M2ZmZmJhOWIsIA0KKwkweDNmZmZhNmRlLCAweDAwNmFkMDNiLCAweDAwOTA4MmVhLCAweDNmZmY1Y2Q4LCAweDNmZmYzZjNjLCAweDAwOWQxM2M1LCAweDAwYzJjNjJmLCAweDNmZmVkNzliLCANCisJMHgzZmZlYjAyMSwgMHgwMGNmNTZlZiwgMHgwMGY1MDhmYywgMHgzZmZlMmFlNSwgMHgzZmZkZjk4YywgMHgwMTAxOTk5OCwgMHgwMTI3NGIzMSwgMHgzZmZkNTZiNSwgDQorCTB4M2ZmZDFiN2UsIDB4MDEzM2RiYTMsIDB4MDE1OThjYjEsIDB4M2ZmYzViMGMsIDB4M2ZmYzE1ZjcsIDB4MDE2NjFjZjAsIDB4MDE4YmNkNWIsIDB4M2ZmYjM3ZWMsIA0KKwkweDNmZmFlOGY5LCAweDAxOTg1ZDYwLCAweDAxYmUwZDExLCAweDNmZjllZDUzLCAweDNmZjk5NDgzLCAweDAxY2E5Y2Q0LCAweDAxZjA0YmI0LCAweDNmZjg3YjQ0LCANCisJMHgzZmY4MTg5NiwgMHgwMWZjZGIyZSwgMHgwMjIyODkyNCwgMHgzZmY2ZTFiZiwgMHgzZmY2NzUzNCwgMHgwMjJmMTg0ZCwgMHgwMjU0YzU0NCwgMHgzZmY1MjBjNSwgDQorCTB4M2ZmNGFhNWQsIDB4MDI2MTU0MTQsIDB4MDI4NmZmZjMsIDB4M2ZmMzM4NTgsIDB4M2ZmMmI4MTMsIDB4MDI5MzhlNjIsIDB4MDJiOTM5MTQsIDB4M2ZmMTI4NzgsIA0KKwkweDNmZjA5ZTU2LCAweDAyYzVjNzFhLCAweDAyZWI3MDg2LCAweDNmZWVmMTI2LCAweDNmZWU1ZDI4LCAweDAyZjdmZTFjLCAweDAzMWRhNjJiLCAweDNmZWM5MjY1LCANCisJMHgzZmViZjQ4YiwgMHgwMzJhMzM0OSwgMHgwMzRmZDllNSwgMHgzZmVhMGMzNSwgMHgzZmU5NjQ4MCwgMHgwMzVjNjY4MiwgMHgwMzgyMGI5MywgMHgzZmU3NWU5OCwgDQorCTB4M2ZlNmFkMDgsIDB4MDM4ZTk3YTksIDB4MDNiNDNiMTcsIDB4M2ZlNDg5OTAsIDB4M2ZlM2NlMjYsIDB4MDNjMGM2OWUsIDB4MDNlNjY4NTIsIDB4M2ZlMThkMWYsIA0KKwkweDNmZTBjN2RhLCAweDAzZjJmMzQyLCAweDA0MTg5MzI2LCAweDNmZGU2OTQ1LCAweDNmZGQ5YTI3LCAweDA0MjUxZDc3LCAweDA0NGFiYjczLCAweDNmZGIxZTA2LCANCisJMHgzZmRhNDUwZiwgMHgwNDU3NDUxZCwgMHgwNDdjZTExYSwgMHgzZmQ3YWI2NCwgMHgzZmQ2Yzg5NCwgMHgwNDg5NmExNiwgMHgwNGFmMDNmYywgMHgzZmQ0MTE1ZiwgDQorCTB4M2ZkMzI0YjcsIDB4MDRiYjhjNDIsIDB4MDRlMTIzZmEsIDB4M2ZkMDRmZmMsIDB4M2ZjZjU5N2MsIDB4MDRlZGFiODMsIDB4MDUxMzQwZjYsIDB4M2ZjYzY3M2IsIA0KKwkweDNmY2I2NmU0LCAweDA1MWZjN2I5LCAweDA1NDU1YWQxLCAweDNmYzg1NzFmLCAweDNmYzc0Y2YzLCAweDA1NTFlMGM3LCAweDA1Nzc3MTZiLCAweDNmYzQxZmFjLCANCisJMHgzZmMzMGJhYSwgMHgwNTgzZjY4YywgMHgwNWE5ODRhNiwgMHgzZmJmYzBlMywgMHgzZmJlYTMwYywgMHgwNWI2MDhlYiwgMHgwNWRiOTQ2MywgMHgzZmJiM2FjNywgDQorCTB4M2ZiYTEzMWIsIDB4MDVlODE3YzMsIDB4MDYwZGEwODMsIDB4M2ZiNjhkNWIsIDB4M2ZiNTViZGMsIDB4MDYxYTIyZjcsIDB4MDYzZmE4ZTcsIDB4M2ZiMWI4YTIsIA0KKwkweDNmYjA3ZDUwLCAweDA2NGMyYTY3LCAweDA2NzFhZDcxLCAweDNmYWNiYzlmLCAweDNmYWI3NzdiLCAweDA2N2UyZGY1LCAweDA2YTNhZTAwLCAweDNmYTc5OTU0LCANCisJMHgzZmE2NGE1ZiwgMHgwNmIwMmQ4MSwgMHgwNmQ1YWE3NywgMHgzZmEyNGVjNiwgMHgzZmEwZjYwMCwgMHgwNmUyMjhlZSwgMHgwNzA3YTJiNywgMHgzZjljZGNmNywgDQorCTB4M2Y5YjdhNjIsIDB4MDcxNDIwMWIsIDB4MDczOTk2YTEsIDB4M2Y5NzQzZWIsIDB4M2Y5NWQ3ODcsIDB4MDc0NjEyZWIsIDB4MDc2Yjg2MTYsIDB4M2Y5MTgzYTUsIA0KKwkweDNmOTAwZDcyLCAweDA3NzgwMTNkLCAweDA3OWQ3MGY3LCAweDNmOGI5YzI4LCAweDNmOGExYzI5LCAweDA3YTllYWY1LCAweDA3Y2Y1NzI2LCAweDNmODU4ZDc5LCANCisJMHgzZjg0MDNhZSwgMHgwN2RiY2ZmMiwgMHgwODAxMzg4MywgMHgzZjdmNTc5YiwgMHgzZjdkYzQwNSwgMHgwODBkYjAxNiwgMHgwODMzMTRmMSwgMHgzZjc4ZmE5MiwgDQorCTB4M2Y3NzVkMzEsIDB4MDgzZjhiNDMsIDB4MDg2NGVjNGYsIDB4M2Y3Mjc2NjEsIDB4M2Y3MGNmMzgsIDB4MDg3MTYxNTksIDB4MDg5NmJlODAsIDB4M2Y2YmNiMGUsIA0KKwkweDNmNmExYTFjLCAweDA4YTMzMjNhLCAweDA4Yzg4YjY1LCAweDNmNjRmODliLCAweDNmNjMzZGUyLCAweDA4ZDRmZGM2LCAweDA4ZmE1MmRlLCAweDNmNWRmZjBlLCANCisJMHgzZjVjM2E4ZiwgMHgwOTA2YzNlMCwgMHgwOTJjMTRjZSwgMHgzZjU2ZGU2YSwgMHgzZjU1MTAyNiwgMHgwOTM4ODQ2OSwgMHgwOTVkZDExNiwgMHgzZjRmOTZiNCwgDQorCTB4M2Y0ZGJlYWMsIDB4MDk2YTNmNDIsIDB4MDk4Zjg3OTYsIDB4M2Y0ODI3ZjAsIDB4M2Y0NjQ2MjYsIDB4MDk5YmY0NGMsIDB4MDljMTM4MzEsIDB4M2Y0MDkyMjMsIA0KKwkweDNmM2VhNjk3LCAweDA5Y2RhMzY4LCAweDA5ZjJlMmM3LCAweDNmMzhkNTUyLCAweDNmMzZlMDA2LCAweDA5ZmY0Yzc4LCAweDBhMjQ4NzNhLCAweDNmMzBmMTgxLCANCisJMHgzZjJlZjI3NiwgMHgwYTMwZWY1ZSwgMHgwYTU2MjU2YywgMHgzZjI4ZTZiNiwgMHgzZjI2ZGRlYywgMHgwYTYyOGJmYSwgMHgwYTg3YmQzZCwgMHgzZjIwYjRmNSwgDQorCTB4M2YxZWEyNmUsIDB4MGE5NDIyMmYsIDB4MGFiOTRlOGYsIDB4M2YxODVjNDMsIDB4M2YxNjQwMDEsIDB4MGFjNWIxZGMsIDB4MGFlYWQ5NDQsIDB4M2YwZmRjYTUsIA0KKwkweDNmMGRiNmE5LCAweDBhZjczYWU1LCAweDBiMWM1ZDNkLCAweDNmMDczNjIxLCAweDNmMDUwNjZkLCAweDBiMjhiZDJhLCAweDBiNGRkYTVjLCAweDNlZmU2OGJjLCANCisJMHgzZWZjMmY1MCwgMHgwYjVhMzg4ZCwgMHgwYjdmNTA4MSwgMHgzZWY1NzQ3YiwgMHgzZWYzMzE1YSwgMHgwYjhiYWNmMCwgMHgwYmIwYmY4ZiwgMHgzZWVjNTk2NSwgDQorCTB4M2VlYTBjOGUsIDB4MGJiZDFhMzMsIDB4MGJlMjI3NjYsIDB4M2VlMzE3N2UsIDB4M2VlMGMwZjQsIDB4MGJlZTgwMzgsIDB4MGMxMzg3ZTksIDB4M2VkOWFlY2MsIA0KKwkweDNlZDc0ZTkxLCAweDBjMWZkZWUxLCAweDBjNDRlMGY5LCAweDNlZDAxZjU1LCAweDNlY2RiNTZhLCAweDBjNTEzNjEwLCAweDBjNzYzMjc4LCAweDNlYzY2OTIwLCANCisJMHgzZWMzZjU4NSwgMHgwYzgyODVhNSwgMHgwY2E3N2M0NywgMHgzZWJjOGMzMSwgMHgzZWJhMGVlOSwgMHgwY2IzY2Q4NCwgMHgwY2Q4YmU0NywgMHgzZWIyODg4ZiwgDQorCTB4M2ViMDAxOWMsIDB4MGNlNTBkOGMsIDB4MGQwOWY4NWIsIDB4M2VhODVlNDEsIDB4M2VhNWNkYTMsIDB4MGQxNjQ1YTAsIDB4MGQzYjJhNjQsIDB4M2U5ZTBkNGMsIA0KKwkweDNlOWI3MzA2LCAweDBkNDc3NWExLCAweDBkNmM1NDQzLCAweDNlOTM5NWI3LCAweDNlOTBmMWNhLCAweDBkNzg5ZDcxLCAweDBkOWQ3NWRiLCAweDNlODhmNzg4LCANCisJMHgzZTg2NDlmNSwgMHgwZGE5YmNmMiwgMHgwZGNlOGYwZCwgMHgzZTdlMzJjNiwgMHgzZTdiN2I5MCwgMHgwZGRhZDQwNiwgMHgwZGZmOWZiYSwgMHgzZTczNDc3OCwgDQorCTB4M2U3MDg2OWYsIDB4MGUwYmUyOGUsIDB4MGUzMGE3YzUsIDB4M2U2ODM1YTQsIDB4M2U2NTZiMmIsIDB4MGUzY2U4NmIsIDB4MGU2MWE3MGYsIDB4M2U1Y2ZkNTEsIA0KKwkweDNlNWEyOTM5LCAweDBlNmRlNTgwLCAweDBlOTI5ZDdhLCAweDNlNTE5ZTg2LCAweDNlNGVjMGQxLCAweDBlOWVkOWFmLCAweDBlYzM4YWU4LCAweDNlNDYxOTRhLCANCisJMHgzZTQzMzFmYSwgMHgwZWNmYzRkOSwgMHgwZWY0NmYzYiwgMHgzZTNhNmRhNCwgMHgzZTM3N2NiYiwgMHgwZjAwYTZkZiwgMHgwZjI1NGE1MywgMHgzZTJlOWI5YywgDQorCTB4M2UyYmExMWIsIDB4MGYzMTdmYTUsIDB4MGY1NjFjMTUsIDB4M2UyMmEzMzgsIDB4M2UxZjlmMjEsIDB4MGY2MjRmMGMsIDB4MGY4NmU0NjAsIDB4M2UxNjg0ODAsIA0KKwkweDNlMTM3NmQ1LCAweDBmOTMxNGY1LCAweDBmYjdhMzE3LCAweDNlMGEzZjdiLCAweDNlMDcyODNmLCAweDBmYzNkMTQzLCAweDBmZTg1ODFkLCAweDNkZmRkNDMyLCANCisJMHgzZGZhYjM2NSwgMHgwZmY0ODNkNywgMHgxMDE5MDM1MiwgMHgzZGYxNDJhYiwgMHgzZGVlMTg1MSwgMHgxMDI1MmM5NCwgMHgxMDQ5YTQ5YSwgMHgzZGU0OGFlZiwgDQorCTB4M2RlMTU3MDgsIDB4MTA1NWNiNWIsIDB4MTA3YTNiZDUsIDB4M2RkN2FkMDUsIDB4M2RkNDZmOTQsIDB4MTA4NjYwMGUsIDB4MTBhYWM4ZTYsIDB4M2RjYWE4ZjUsIA0KKwkweDNkYzc2MWZjLCAweDEwYjZlYTkwLCAweDEwZGI0YmFmLCAweDNkYmQ3ZWM3LCAweDNkYmEyZTQ4LCAweDEwZTc2YWMzLCAweDExMGJjNDEzLCAweDNkYjAyZTg0LCANCisJMHgzZGFjZDQ4MSwgMHgxMTE3ZTA4OCwgMHgxMTNjMzFmMywgMHgzZGEyYjgzNCwgMHgzZDlmNTRhZiwgMHgxMTQ4NGJjMiwgMHgxMTZjOTUzMSwgMHgzZDk1MWJkZSwgDQorCTB4M2Q5MWFlZDksIDB4MTE3OGFjNTMsIDB4MTE5Y2VkYWYsIDB4M2Q4NzU5OGMsIDB4M2Q4M2UzMDksIDB4MTFhOTAyMWQsIDB4MTFjZDNiNTAsIDB4M2Q3OTcxNDUsIA0KKwkweDNkNzVmMTQ3LCAweDExZDk0ZDAyLCAweDExZmQ3ZGY2LCAweDNkNmI2MzEzLCAweDNkNjdkOTliLCAweDEyMDk4Y2U1LCAweDEyMmRiNTgzLCAweDNkNWQyZWZlLCANCisJMHgzZDU5OWMwZSwgMHgxMjM5YzFhNywgMHgxMjVkZTFkYSwgMHgzZDRlZDUwZiwgMHgzZDRiMzhhYSwgMHgxMjY5ZWIyYiwgMHgxMjhlMDJkYywgMHgzZDQwNTU0ZSwgDQorCTB4M2QzY2FmNzYsIDB4MTI5YTA5NTQsIDB4MTJiZTE4NmMsIDB4M2QzMWFmYzUsIDB4M2QyZTAwN2MsIDB4MTJjYTFjMDMsIDB4MTJlZTIyNmMsIDB4M2QyMmU0N2MsIA0KKwkweDNkMWYyYmM1LCAweDEyZmEyMzFiLCAweDEzMWUyMGMwLCAweDNkMTNmMzdlLCAweDNkMTAzMTVhLCAweDEzMmExZTdlLCAweDEzNGUxMzQ4LCAweDNkMDRkY2QyLCANCisJMHgzZDAxMTE0NSwgMHgxMzVhMGUwZSwgMHgxMzdkZjllNywgMHgzY2Y1YTA4MiwgMHgzY2YxY2I4ZSwgMHgxMzg5ZjFhZiwgMHgxM2FkZDQ4MSwgMHgzY2U2M2U5OCwgDQorCTB4M2NlMjYwM2YsIDB4MTNiOWM5NDMsIDB4MTNkZGEyZjcsIDB4M2NkNmI3MWUsIDB4M2NkMmNmNjIsIDB4MTNlOTk0YWIsIDB4MTQwZDY1MmMsIDB4M2NjNzBhMWMsIA0KKwkweDNjYzMxOGZmLCAweDE0MTk1M2NiLCAweDE0M2QxYjAyLCAweDNjYjczNzljLCAweDNjYjMzZDIyLCAweDE0NDkwNjg1LCAweDE0NmNjNDVjLCAweDNjYTczZmE5LCANCisJMHgzY2EzM2JkMywgMHgxNDc4YWNiYywgMHgxNDljNjExZCwgMHgzYzk3MjI0YywgMHgzYzkzMTUxZCwgMHgxNGE4NDY1MiwgMHgxNGNiZjEyNywgMHgzYzg2ZGY4ZSwgDQorCTB4M2M4MmM5MDksIDB4MTRkN2QzMmEsIDB4MTRmYjc0NWUsIDB4M2M3Njc3N2IsIDB4M2M3MjU3YTIsIDB4MTUwNzUzMjcsIDB4MTUyYWVhYTMsIDB4M2M2NWVhMWMsIA0KKwkweDNjNjFjMGYxLCAweDE1MzZjNjJiLCAweDE1NWE1M2Q5LCAweDNjNTUzNzdiLCAweDNjNTEwNTAxLCAweDE1NjYyYzE4LCAweDE1ODlhZmUzLCAweDNjNDQ1ZmEyLCANCisJMHgzYzQwMjNkZCwgMHgxNTk1ODRkMywgMHgxNWI4ZmVhNCwgMHgzYzMzNjI5ZCwgMHgzYzJmMWQ4ZSwgMHgxNWM0ZDAzZSwgMHgxNWU4M2ZmZiwgMHgzYzIyNDA3NSwgDQorCTB4M2MxZGYyMWYsIDB4MTVmNDBlM2EsIDB4MTYxNzczZDYsIDB4M2MxMGY5MzUsIDB4M2MwY2ExOWIsIDB4MTYyMzNlYWMsIDB4MTY0NjlhMGQsIDB4M2JmZjhjZTgsIA0KKwkweDNiZmIyYzBjLCAweDE2NTI2MTc2LCAweDE2NzViMjg2LCAweDNiZWRmYjk5LCAweDNiZTk5MTdlLCAweDE2ODE3NjdjLCAweDE2YTRiZDI1LCAweDNiZGM0NTUyLCANCisJMHgzYmQ3ZDFmYSwgMHgxNmIwN2Q5ZiwgMHgxNmQzYjljYywgMHgzYmNhNmExZCwgMHgzYmM1ZWQ4ZCwgMHgxNmRmNzZjMywgMHgxNzAyYTg1ZSwgMHgzYmI4NmEwOCwgDQorCTB4M2JiM2U0NDAsIDB4MTcwZTYxY2MsIDB4MTczMTg4YmUsIDB4M2JhNjQ1MWIsIDB4M2JhMWI2MjAsIDB4MTczZDNlOWIsIDB4MTc2MDVhZDAsIDB4M2I5M2ZiNjMsIA0KKwkweDNiOGY2MzM3LCAweDE3NmMwZDE1LCAweDE3OGYxZTc2LCAweDNiODE4Y2ViLCAweDNiN2NlYjkwLCAweDE3OWFjZDFjLCAweDE3YmRkMzk0LCAweDNiNmVmOWJlLCANCisJMHgzYjZhNGYzOCwgMHgxN2M5N2U5MywgMHgxN2VjN2EwZCwgMHgzYjVjNDFlOCwgMHgzYjU3OGUzOSwgMHgxN2Y4MjE1ZSwgMHgxODFiMTFjNCwgMHgzYjQ5NjU3NCwgDQorCTB4M2I0NGE4YTAsIDB4MTgyNmI1NjEsIDB4MTg0OTlhOWQsIDB4M2IzNjY0NmUsIDB4M2IzMTllNzcsIDB4MTg1NTNhN2QsIDB4MTg3ODE0N2EsIDB4M2IyMzNlZTEsIA0KKwkweDNiMWU2ZmNhLCAweDE4ODNiMDk3LCAweDE4YTY3ZjNmLCAweDNiMGZmNGQ5LCAweDNiMGIxY2E2LCAweDE4YjIxNzkxLCAweDE4ZDRkYWQwLCAweDNhZmM4NjYzLCANCisJMHgzYWY3YTUxNiwgMHgxOGUwNmY1MCwgMHgxOTAzMjcwZiwgMHgzYWU4ZjM4YiwgMHgzYWU0MDkyNiwgMHgxOTBlYjdiNywgMHgxOTMxNjNlMSwgMHgzYWQ1M2M1YiwgDQorCTB4M2FkMDQ4ZTMsIDB4MTkzY2YwYTksIDB4MTk1ZjkxMjgsIDB4M2FjMTYwZTEsIDB4M2FiYzY0NTgsIDB4MTk2YjFhMDksIDB4MTk4ZGFlYzgsIDB4M2FhZDYxMjksIA0KKwkweDNhYTg1YjkyLCAweDE5OTkzM2JiLCAweDE5YmJiY2E2LCAweDNhOTkzZDNlLCAweDNhOTQyZTlkLCAweDE5YzczZGEzLCAweDE5ZTliYWEzLCAweDNhODRmNTJmLCANCisJMHgzYTdmZGQ4NiwgMHgxOWY1MzdhNCwgMHgxYTE3YThhNSwgMHgzYTcwODkwNiwgMHgzYTZiNjg1OSwgMHgxYTIzMjFhMiwgMHgxYTQ1ODY4ZSwgMHgzYTViZjhkMSwgDQorCTB4M2E1NmNmMjMsIDB4MWE1MGZiODEsIDB4MWE3MzU0NDIsIDB4M2E0NzQ0OWMsIDB4M2E0MjExZjAsIDB4MWE3ZWM1MjQsIDB4MWFhMTExYTYsIDB4M2EzMjZjNzQsIA0KKwkweDNhMmQzMGNkLCAweDFhYWM3ZTZmLCAweDFhY2ViZTlkLCAweDNhMWQ3MDY2LCAweDNhMTgyYmM4LCAweDFhZGEyNzQ2LCAweDFhZmM1YjBhLCAweDNhMDg1MDdmLCANCisJMHgzYTAzMDJlZCwgMHgxYjA3YmY4YywgMHgxYjI5ZTZkMiwgMHgzOWYzMGNjYywgMHgzOWVkYjY0OSwgMHgxYjM1NDcyNywgMHgxYjU3NjFkOCwgMHgzOWRkYTU1YSwgDQorCTB4MzlkODQ1ZTksIDB4MWI2MmJkZjgsIDB4MWI4NGNjMDEsIDB4MzljODFhMzYsIDB4MzljMmIxZGEsIDB4MWI5MDIzZTUsIDB4MWJiMjI1MzAsIDB4MzliMjZiNmQsIA0KKwkweDM5YWNmYTJiLCAweDFiYmQ3OGQyLCAweDFiZGY2ZDRhLCAweDM5OWM5OTBkLCAweDM5OTcxZWU3LCAweDFiZWFiY2ExLCAweDFjMGNhNDMyLCAweDM5ODZhMzI0LCANCisJMHgzOTgxMjAxZSwgMHgxYzE3ZWYzOSwgMHgxYzM5YzljZCwgMHgzOTcwODliZiwgMHgzOTZhZmRkYywgMHgxYzQ1MTA3YywgMHgxYzY2ZGRmZSwgMHgzOTVhNGNlYiwgDQorCTB4Mzk1NGI4MmUsIDB4MWM3MjIwNGYsIDB4MWM5M2UwYWIsIDB4Mzk0M2VjYjYsIDB4MzkzZTRmMjMsIDB4MWM5ZjFlOTYsIDB4MWNjMGQxYjYsIDB4MzkyZDY5MmYsIA0KKwkweDM5MjdjMmM5LCAweDFjY2MwYjM1LCAweDFjZWRiMTA2LCAweDM5MTZjMjYyLCAweDM5MTExMzJkLCAweDFjZjhlNjExLCAweDFkMWE3ZTdkLCAweDM4ZmZmODVlLCANCisJMHgzOGZhNDA1ZSwgMHgxZDI1YWYwZCwgMHgxZDQ3M2EwMCwgMHgzOGU5MGIzMSwgMHgzOGUzNGE2OSwgMHgxZDUyNjYwZiwgMHgxZDczZTM3NCwgMHgzOGQxZmFlOSwgDQorCTB4MzhjYzMxNWQsIDB4MWQ3ZjBhZmIsIDB4MWRhMDdhYmMsIDB4MzhiYWM3OTUsIDB4MzhiNGY1NDcsIDB4MWRhYjlkYjUsIDB4MWRjY2ZmYmYsIDB4MzhhMzcxNDIsIA0KKwkweDM4OWQ5NjM3LCAweDFkZDgxZTIxLCAweDFkZjk3MjVmLCAweDM4OGJmN2ZmLCAweDM4ODYxNDNiLCAweDFlMDQ4YzI0LCAweDFlMjVkMjgyLCAweDM4NzQ1YmRiLCANCisJMHgzODZlNmY2MCwgMHgxZTMwZTdhNCwgMHgxZTUyMjAwYywgMHgzODVjOWNlMywgMHgzODU2YTdiNiwgMHgxZTVkMzA4NCwgMHgxZTdlNWFlMiwgMHgzODQ0YmIyOCwgDQorCTB4MzgzZWJkNGMsIDB4MWU4OTY2YTgsIDB4MWVhYTgyZTksIDB4MzgyY2I2YjcsIDB4MzgyNmIwMzAsIDB4MWViNTg5ZjcsIDB4MWVkNjk4MDUsIDB4MzgxNDhmOWYsIA0KKwkweDM4MGU4MDcxLCAweDFlZTE5YTU0LCAweDFmMDI5YTFjLCAweDM3ZmM0NWVmLCAweDM3ZjYyZTFkLCAweDFmMGQ5N2E1LCAweDFmMmU4OTExLCAweDM3ZTNkOWI3LCANCisJMHgzN2RkYjk0NSwgMHgxZjM5ODFjZSwgMHgxZjVhNjRjYiwgMHgzN2NiNGIwNCwgMHgzN2M1MjFmNiwgMHgxZjY1NThiNSwgMHgxZjg2MmQyZCwgMHgzN2IyOTllNywgDQorCTB4MzdhYzY4NDEsIDB4MWY5MTFjM2QsIDB4MWZiMWUyMWQsIDB4Mzc5OWM2NmYsIDB4Mzc5MzhjMzQsIDB4MWZiY2NjNGQsIDB4MWZkZDgzODEsIDB4Mzc4MGQwYWEsIA0KKwkweDM3N2E4ZGRmLCAweDFmZTg2OGM4LCAweDIwMDkxMTNjLCAweDM3NjdiOGE5LCAweDM3NjE2ZDUxLCAweDIwMTNmMTk2LCAweDIwMzQ4YjM1LCAweDM3NGU3ZTdiLCANCisJMHgzNzQ4MmE5YSwgMHgyMDNmNjY5OSwgMHgyMDVmZjE0ZiwgMHgzNzM1MjIyZiwgMHgzNzJlYzVjOSwgMHgyMDZhYzdiOCwgMHgyMDhiNDM3MiwgMHgzNzFiYTNkNCwgDQorCTB4MzcxNTNlZWUsIDB4MjA5NjE0ZDksIDB4MjBiNjgxODEsIDB4MzcwMjAzN2MsIDB4MzZmYjk2MTgsIDB4MjBjMTRkZGYsIDB4MjBlMWFiNjMsIDB4MzZlODQxMzUsIA0KKwkweDM2ZTFjYjU4LCAweDIwZWM3MmIxLCAweDIxMGNjMGZjLCAweDM2Y2U1ZDEwLCAweDM2YzdkZWJkLCAweDIxMTc4MzM0LCAweDIxMzdjMjMyLCAweDM2YjQ1NzFiLCANCisJMHgzNmFkZDA1OCwgMHgyMTQyN2Y0ZCwgMHgyMTYyYWVlYSwgMHgzNjlhMmY2OSwgMHgzNjkzYTAzOCwgMHgyMTZkNjZlMiwgMHgyMThkODcwYiwgMHgzNjdmZTYwOCwgDQorCTB4MzY3OTRlNmUsIDB4MjE5ODM5ZDgsIDB4MjFiODRhNzksIDB4MzY2NTdiMDgsIDB4MzY1ZWRiMDksIDB4MjFjMmY4MTUsIDB4MjFlMmY5MWEsIDB4MzY0YWVlN2IsIA0KKwkweDM2NDQ0NjFiLCAweDIxZWRhMTdmLCAweDIyMGQ5MmQ0LCAweDM2MzA0MDcwLCAweDM2Mjk4ZmI0LCAweDIyMTgzNWZiLCAweDIyMzgxNzhkLCAweDM2MTU3MGY4LCANCisJMHgzNjBlYjdlMywgMHgyMjQyYjU2ZiwgMHgyMjYyODcyOSwgMHgzNWZhODAyMywgMHgzNWYzYmViYSwgMHgyMjZkMWZjMSwgMHgyMjhjZTE5MSwgMHgzNWRmNmUwMywgDQorCTB4MzVkOGE0NDksIDB4MjI5Nzc0ZDcsIDB4MjJiNzI2YTgsIDB4MzVjNDNhYTcsIDB4MzViZDY4YTEsIDB4MjJjMWI0OTYsIDB4MjJlMTU2NTUsIDB4MzVhOGU2MjEsIA0KKwkweDM1YTIwYmQzLCAweDIyZWJkZWU1LCAweDIzMGI3MDdlLCAweDM1OGQ3MDgxLCAweDM1ODY4ZGVmLCAweDIzMTVmM2E4LCAweDIzMzU3NTA5LCAweDM1NzFkOWQ5LCANCisJMHgzNTZhZWYwOCwgMHgyMzNmZjJjOCwgMHgyMzVmNjNkYywgMHgzNTU2MjIzOSwgMHgzNTRmMmYyYywgMHgyMzY5ZGMyOSwgMHgyMzg5M2NkZCwgMHgzNTNhNDliMiwgDQorCTB4MzUzMzRlNmYsIDB4MjM5M2FmYjIsIDB4MjNiMmZmZjMsIDB4MzUxZTUwNTYsIDB4MzUxNzRjZTAsIDB4MjNiZDZkNDgsIDB4MjNkY2FkMDMsIDB4MzUwMjM2MzYsIA0KKwkweDM0ZmIyYTkyLCAweDIzZTcxNGQzLCAweDI0MDY0M2Y0LCAweDM0ZTVmYjYzLCAweDM0ZGVlNzk1LCAweDI0MTBhNjM5LCAweDI0MmZjNGFkLCAweDM0Yzk5ZmVmLCANCisJMHgzNGMyODNmYiwgMHgyNDNhMjE1ZiwgMHgyNDU5MmYxMywgMHgzNGFkMjNlYiwgMHgzNGE1ZmZkNSwgMHgyNDYzODYyYywgMHgyNDgyODMwZCwgMHgzNDkwODc2OCwgDQorCTB4MzQ4OTViMzYsIDB4MjQ4Y2Q0ODcsIDB4MjRhYmMwODIsIDB4MzQ3M2NhNzksIDB4MzQ2Yzk2MmYsIDB4MjRiNjBjNTcsIDB4MjRkNGU3NTcsIDB4MzQ1NmVkMmYsIA0KKwkweDM0NGZiMGQxLCAweDI0ZGYyZDgxLCAweDI0ZmRmNzc1LCAweDM0MzllZjljLCAweDM0MzJhYjJlLCAweDI1MDgzN2VkLCAweDI1MjZmMGMxLCAweDM0MWNkMWQyLCANCisJMHgzNDE1ODU1OSwgMHgyNTMxMmI4MSwgMHgyNTRmZDMyMywgMHgzM2ZmOTNlMiwgMHgzM2Y4M2Y2MiwgMHgyNTVhMDgyMywgMHgyNTc4OWU4MCwgMHgzM2UyMzVkZiwgDQorCTB4MzNkYWQ5NWUsIDB4MjU4MmNkYmMsIDB4MjVhMTUyYzAsIDB4MzNjNGI3ZGIsIDB4MzNiZDUzNWMsIDB4MjVhYjdjMzAsIDB4MjVjOWVmY2EsIDB4MzNhNzE5ZTgsIA0KKwkweDMzOWZhZDcwLCAweDI1ZDQxMzY5LCAweDI1ZjI3NTg0LCAweDMzODk1YzE4LCAweDMzODFlN2FjLCAweDI1ZmM5MzRiLCAweDI2MWFlM2Q2LCAweDMzNmI3ZTdlLCANCisJMHgzMzY0MDIyMywgMHgyNjI0ZmJiZiwgMHgyNjQzM2FhNywgMHgzMzRkODEyZCwgMHgzMzQ1ZmNlNiwgMHgyNjRkNGNhYywgMHgyNjZiNzlkZCwgMHgzMzJmNjQzNSwgDQorCTB4MzMyN2Q4MDgsIDB4MjY3NTg1ZjgsIDB4MjY5M2ExNjEsIDB4MzMxMTI3YWIsIDB4MzMwOTkzOWMsIDB4MjY5ZGE3OGIsIDB4MjZiYmIxMTksIDB4MzJmMmNiYTEsIA0KKwkweDMyZWIyZmI1LCAweDI2YzViMTRjLCAweDI2ZTNhOGVjLCAweDMyZDQ1MDI5LCAweDMyY2NhYzY0LCAweDI2ZWRhMzIyLCAweDI3MGI4OGMyLCAweDMyYjViNTU3LCANCisJMHgzMmFlMDliZSwgMHgyNzE1N2NmNSwgMHgyNzMzNTA4MiwgMHgzMjk2ZmIzZCwgMHgzMjhmNDdkNSwgMHgyNzNkM2VhYywgMHgyNzViMDAxNCwgMHgzMjc4MjFlZSwgDQorCTB4MzI3MDY2YmMsIDB4Mjc2NGU4MmYsIDB4Mjc4Mjk3NjAsIDB4MzI1OTI5N2QsIDB4MzI1MTY2ODYsIDB4Mjc4Yzc5NjUsIDB4MjdhYTE2NGMsIDB4MzIzYTExZmUsIA0KKwkweDMyMzI0NzQ2LCAweDI3YjNmMjM1LCAweDI3ZDE3Y2MxLCAweDMyMWFkYjgzLCAweDMyMTMwOTBmLCAweDI3ZGI1Mjg4LCAweDI3ZjhjYWE1LCAweDMxZmI4NjIwLCANCisJMHgzMWYzYWJmNSwgMHgyODAyOWE0NSwgMHgyODFmZmZlMiwgMHgzMWRjMTFlOCwgMHgzMWQ0MzAwYiwgMHgyODI5Yzk1NCwgMHgyODQ3MWM1ZSwgMHgzMWJjN2VlZSwgDQorCTB4MzFiNDk1NjQsIDB4Mjg1MGRmOWQsIDB4Mjg2ZTIwMDIsIDB4MzE5Y2NkNDYsIDB4MzE5NGRjMTQsIDB4Mjg3N2RkMDcsIDB4Mjg5NTBhYjYsIDB4MzE3Y2ZkMDQsIA0KKwkweDMxNzUwNDJlLCAweDI4OWVjMTdhLCAweDI4YmJkYzYxLCAweDMxNWQwZTNiLCAweDMxNTUwZGM2LCAweDI4YzU4Y2RmLCAweDI4ZTI5NGViLCAweDMxM2QwMGZmLCANCisJMHgzMTM0ZjhmMSwgMHgyOGVjM2YxZSwgMHgyOTA5MzQzZSwgMHgzMTFjZDU2NCwgMHgzMTE0YzVjMCwgMHgyOTEyZDgxZiwgMHgyOTJmYmE0MCwgMHgzMGZjOGI3ZCwgDQorCTB4MzBmNDc0NDksIDB4MjkzOTU3YzksIDB4Mjk1NjI2ZGEsIDB4MzBkYzIzNWUsIDB4MzBkNDA0YTAsIDB4Mjk1ZmJlMDYsIDB4Mjk3Yzc5ZjUsIDB4MzBiYjlkMWMsIA0KKwkweDMwYjM3NmQ4LCAweDI5ODYwYWJkLCAweDI5YTJiMzc4LCAweDMwOWFmOGNhLCAweDMwOTJjYjA1LCAweDI5YWMzZGQ3LCAweDI5YzhkMzRkLCAweDMwN2EzNjdjLCANCisJMHgzMDcyMDEzYywgMHgyOWQyNTczYywgMHgyOWVlZDk1YiwgMHgzMDU5NTY0OCwgMHgzMDUxMTk5MSwgMHgyOWY4NTZkNSwgMHgyYTE0YzU4YiwgMHgzMDM4NTg0MCwgDQorCTB4MzAzMDE0MTgsIDB4MmExZTNjOGEsIDB4MmEzYTk3YzcsIDB4MzAxNzNjN2EsIDB4MzAwZWYwZTUsIDB4MmE0NDA4NDQsIDB4MmE2MDRmZjUsIDB4MmZmNjAzMGEsIA0KKwkweDJmZWRiMDBkLCAweDJhNjliOWVjLCAweDJhODVlZTAwLCAweDJmZDRhYzA0LCAweDJmY2M1MWE1LCAweDJhOGY1MTZiLCAweDJhYWI3MWQwLCAweDJmYjMzNzdjLCANCisJMHgyZmFhZDVjMSwgMHgyYWI0Y2VhOSwgMHgyYWQwZGI0ZSwgMHgyZjkxYTU4OSwgMHgyZjg5M2M3NSwgMHgyYWRhMzE4ZSwgMHgyYWY2MmE2MywgMHgyZjZmZjYzZCwgDQorCTB4MmY2Nzg1ZDcsIDB4MmFmZjdhMDUsIDB4MmIxYjVlZjgsIDB4MmY0ZTI5YWYsIDB4MmY0NWIxZmIsIDB4MmIyNGE3ZjYsIDB4MmI0MDc4ZjUsIDB4MmYyYzNmZjIsIA0KKwkweDJmMjNjMGY2LCAweDJiNDliYjRhLCAweDJiNjU3ODQ0LCAweDJmMGEzOTFkLCAweDJmMDFiMmRlLCAweDJiNmViM2VhLCAweDJiOGE1Y2NlLCAweDJlZTgxNTQzLCANCisJMHgyZWRmODdjNiwgMHgyYjkzOTFjMCwgMHgyYmFmMjY3ZCwgMHgyZWM1ZDQ3OSwgMHgyZWJkM2ZjNCwgMHgyYmI4NTRiNCwgMHgyYmQzZDUzYSwgMHgyZWEzNzZkNiwgDQorCTB4MmU5YWRhZWUsIDB4MmJkY2ZjYjAsIDB4MmJmODY4ZWQsIDB4MmU4MGZjNmUsIDB4MmU3ODU5NTgsIDB4MmMwMTg5OWUsIDB4MmMxY2UxODEsIDB4MmU1ZTY1NTYsIA0KKwkweDJlNTViYjE3LCAweDJjMjVmYjY2LCAweDJjNDEzZWRmLCAweDJlM2JiMWE0LCAweDJlMzMwMDQyLCAweDJjNGE1MWYzLCAweDJjNjU4MGYxLCAweDJlMThlMTZkLCANCisJMHgyZTEwMjhlZCwgMHgyYzZlOGQyZSwgMHgyYzg5YTc5ZiwgMHgyZGY1ZjRjNywgMHgyZGVkMzUyZiwgMHgyYzkyYWQwMSwgMHgyY2FkYjJkNSwgMHgyZGQyZWJjNywgDQorCTB4MmRjYTI1MWMsIDB4MmNiNmIxNTUsIDB4MmNkMWEyN2IsIDB4MmRhZmM2ODMsIDB4MmRhNmY4Y2EsIDB4MmNkYTlhMTQsIDB4MmNmNTc2N2MsIDB4MmQ4Yzg1MTAsIA0KKwkweDJkODNiMDRmLCAweDJjZmU2NzI4LCAweDJkMTkyZWMxLCAweDJkNjkyNzg0LCAweDJkNjA0YmMwLCAweDJkMjIxODdhLCAweDJkM2NjYjM0LCAweDJkNDVhZGY2DQorfTsNCisNCisNCitjb25zdCBpbnQgdHdpZFRhYjUxMlsoOCo2ICsgMzIqNiArIDEyOCo2KS8yXSA9IHsNCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzYjIwMTg3ZCwgDQorCTB4M2VjNTBjN2MsIDB4MzUzNjIzOGUsIDB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIA0KKwkweDE4N2QzYjIwLCAweDE4N2QzYjIwLCAweDM1MzYyMzhlLCAweGYzODQzZWM1LCANCisJMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhlNzgzM2IyMCwgDQorCTB4MjM4ZTM1MzYsIDB4YzEzYjBjN2MsIDB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIA0KKwkweGM0ZTBlNzgzLCAweGM0ZTAxODdkLCAweDBjN2MzZWM1LCAweGRjNzJjYWNhLCANCisNCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZmIxMDY0NSwgDQorCTB4M2ZlYzAzMjMsIDB4M2Y0ZTA5NjQsIDB4M2VjNTBjN2MsIDB4M2ZiMTA2NDUsIA0KKwkweDNkM2UxMjk0LCAweDNkM2UxMjk0LCAweDNmNGUwOTY0LCAweDM5ZGExYjVkLCANCisJMHgzYjIwMTg3ZCwgMHgzZWM1MGM3YywgMHgzNTM2MjM4ZSwgMHgzODcxMWUyYiwgDQorCTB4M2UxNDBmOGMsIDB4MmY2YjJhZmEsIDB4MzUzNjIzOGUsIDB4M2QzZTEyOTQsIA0KKwkweDI4OTkzMTc5LCAweDMxNzkyODk5LCAweDNjNDIxNThmLCAweDIwZTczNmU1LCANCisJMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyODk5MzE3OSwgDQorCTB4MzlkYTFiNWQsIDB4MGY4YzNlMTQsIDB4MjM4ZTM1MzYsIDB4Mzg3MTFlMmIsIA0KKwkweDA2NDUzZmIxLCAweDFlMmIzODcxLCAweDM2ZTUyMGU3LCAweGZjZGQzZmVjLCANCisJMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwgMHhmMzg0M2VjNSwgMHgxMjk0M2QzZSwgDQorCTB4MzM2NzI2MWYsIDB4ZWE3MTNjNDIsIDB4MGM3YzNlYzUsIDB4MzE3OTI4OTksIA0KKwkweGUxZDUzODcxLCAweDA2NDUzZmIxLCAweDJmNmIyYWZhLCAweGQ5ZTEzMzY3LCANCisJMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmOWJiM2ZiMSwgDQorCTB4MmFmYTJmNmIsIDB4Y2M5OTI2MWYsIDB4ZjM4NDNlYzUsIDB4Mjg5OTMxNzksIA0KKwkweGM3OGYxZTJiLCAweGVkNmMzZDNlLCAweDI2MWYzMzY3LCAweGMzYmUxNThmLCANCisJMHhlNzgzM2IyMCwgMHgyMzhlMzUzNiwgMHhjMTNiMGM3YywgMHhlMWQ1Mzg3MSwgDQorCTB4MjBlNzM2ZTUsIDB4YzAxNDAzMjMsIDB4ZGM3MjM1MzYsIDB4MWUyYjM4NzEsIA0KKwkweGMwNGZmOWJiLCAweGQ3NjczMTc5LCAweDFiNWQzOWRhLCAweGMxZWNmMDc0LCANCisJMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhjZTg3Mjg5OSwgDQorCTB4MTU4ZjNjNDIsIDB4YzkxYmRmMTksIDB4Y2FjYTIzOGUsIDB4MTI5NDNkM2UsIA0KKwkweGNlODdkNzY3LCAweGM3OGYxZTJiLCAweDBmOGMzZTE0LCAweGQ1MDZkMDk1LCANCisJMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwgMHhkYzcyY2FjYSwgMHhjMmMyMTI5NCwgDQorCTB4MDk2NDNmNGUsIDB4ZTRhM2M2MjYsIDB4YzEzYjBjN2MsIDB4MDY0NTNmYjEsIA0KKwkweGVkNmNjMmMyLCAweGMwNGYwNjQ1LCAweDAzMjMzZmVjLCAweGY2OWNjMGIyLCANCisNCisJMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgzZmZiMDE5MiwgDQorCTB4M2ZmZTAwYzksIDB4M2ZmNDAyNWIsIDB4M2ZlYzAzMjMsIDB4M2ZmYjAxOTIsIA0KKwkweDNmZDMwNGI1LCAweDNmZDMwNGI1LCAweDNmZjQwMjViLCAweDNmOWMwNzBkLCANCisJMHgzZmIxMDY0NSwgMHgzZmVjMDMyMywgMHgzZjRlMDk2NCwgMHgzZjg0MDdkNSwgDQorCTB4M2ZlMTAzZWMsIDB4M2VlYjBiYjYsIDB4M2Y0ZTA5NjQsIDB4M2ZkMzA0YjUsIA0KKwkweDNlNzEwZTA1LCAweDNmMGUwYWYxLCAweDNmYzMwNTdkLCAweDNkZTIxMDRmLCANCisJMHgzZWM1MGM3YywgMHgzZmIxMDY0NSwgMHgzZDNlMTI5NCwgMHgzZTcxMGUwNSwgDQorCTB4M2Y5YzA3MGQsIDB4M2M4NDE0ZDEsIDB4M2UxNDBmOGMsIDB4M2Y4NDA3ZDUsIA0KKwkweDNiYjYxNzA4LCAweDNkYWUxMTExLCAweDNmNmEwODljLCAweDNhZDIxOTM3LCANCisJMHgzZDNlMTI5NCwgMHgzZjRlMDk2NCwgMHgzOWRhMWI1ZCwgMHgzY2M1MTQxMywgDQorCTB4M2YyZjBhMmEsIDB4MzhjZjFkNzksIDB4M2M0MjE1OGYsIDB4M2YwZTBhZjEsIA0KKwkweDM3YWYxZjhiLCAweDNiYjYxNzA4LCAweDNlZWIwYmI2LCAweDM2N2MyMTkyLCANCisJMHgzYjIwMTg3ZCwgMHgzZWM1MGM3YywgMHgzNTM2MjM4ZSwgMHgzYTgyMTllZiwgDQorCTB4M2U5YzBkNDEsIDB4MzNkZTI1N2QsIDB4MzlkYTFiNWQsIDB4M2U3MTBlMDUsIA0KKwkweDMyNzQyNzVmLCAweDM5MmExY2M2LCAweDNlNDQwZWM5LCAweDMwZjgyOTM0LCANCisJMHgzODcxMWUyYiwgMHgzZTE0MGY4YywgMHgyZjZiMmFmYSwgMHgzN2FmMWY4YiwgDQorCTB4M2RlMjEwNGYsIDB4MmRjZTJjYjIsIDB4MzZlNTIwZTcsIDB4M2RhZTExMTEsIA0KKwkweDJjMjEyZTVhLCAweDM2MTIyMjNkLCAweDNkNzcxMWQzLCAweDJhNjUyZmYxLCANCisJMHgzNTM2MjM4ZSwgMHgzZDNlMTI5NCwgMHgyODk5MzE3OSwgMHgzNDUzMjRkYSwgDQorCTB4M2QwMjEzNTQsIDB4MjZjMDMyZWUsIDB4MzM2NzI2MWYsIDB4M2NjNTE0MTMsIA0KKwkweDI0ZGEzNDUzLCAweDMyNzQyNzVmLCAweDNjODQxNGQxLCAweDIyZTYzNWE1LCANCisJMHgzMTc5Mjg5OSwgMHgzYzQyMTU4ZiwgMHgyMGU3MzZlNSwgMHgzMDc2MjljZCwgDQorCTB4M2JmZDE2NGMsIDB4MWVkYzM4MTEsIDB4MmY2YjJhZmEsIDB4M2JiNjE3MDgsIA0KKwkweDFjYzYzOTJhLCAweDJlNWEyYzIxLCAweDNiNmMxN2MzLCAweDFhYTYzYTJmLCANCisJMHgyZDQxMmQ0MSwgMHgzYjIwMTg3ZCwgMHgxODdkM2IyMCwgMHgyYzIxMmU1YSwgDQorCTB4M2FkMjE5MzcsIDB4MTY0YzNiZmQsIDB4MmFmYTJmNmIsIDB4M2E4MjE5ZWYsIA0KKwkweDE0MTMzY2M1LCAweDI5Y2QzMDc2LCAweDNhMmYxYWE2LCAweDExZDMzZDc3LCANCisJMHgyODk5MzE3OSwgMHgzOWRhMWI1ZCwgMHgwZjhjM2UxNCwgMHgyNzVmMzI3NCwgDQorCTB4Mzk4MzFjMTIsIDB4MGQ0MTNlOWMsIDB4MjYxZjMzNjcsIDB4MzkyYTFjYzYsIA0KKwkweDBhZjEzZjBlLCAweDI0ZGEzNDUzLCAweDM4Y2YxZDc5LCAweDA4OWMzZjZhLCANCisJMHgyMzhlMzUzNiwgMHgzODcxMWUyYiwgMHgwNjQ1M2ZiMSwgMHgyMjNkMzYxMiwgDQorCTB4MzgxMTFlZGMsIDB4MDNlYzNmZTEsIDB4MjBlNzM2ZTUsIDB4MzdhZjFmOGIsIA0KKwkweDAxOTIzZmZiLCAweDFmOGIzN2FmLCAweDM3NGIyMDM5LCAweGZmMzczZmZlLCANCisJMHgxZTJiMzg3MSwgMHgzNmU1MjBlNywgMHhmY2RkM2ZlYywgMHgxY2M2MzkyYSwgDQorCTB4MzY3YzIxOTIsIDB4ZmE4MzNmYzMsIDB4MWI1ZDM5ZGEsIDB4MzYxMjIyM2QsIA0KKwkweGY4MmIzZjg0LCAweDE5ZWYzYTgyLCAweDM1YTUyMmU2LCAweGY1ZDYzZjJmLCANCisJMHgxODdkM2IyMCwgMHgzNTM2MjM4ZSwgMHhmMzg0M2VjNSwgMHgxNzA4M2JiNiwgDQorCTB4MzRjNjI0MzQsIDB4ZjEzNzNlNDQsIDB4MTU4ZjNjNDIsIDB4MzQ1MzI0ZGEsIA0KKwkweGVlZWYzZGFlLCAweDE0MTMzY2M1LCAweDMzZGUyNTdkLCAweGVjYWMzZDAyLCANCisJMHgxMjk0M2QzZSwgMHgzMzY3MjYxZiwgMHhlYTcxM2M0MiwgMHgxMTExM2RhZSwgDQorCTB4MzJlZTI2YzAsIDB4ZTgzZDNiNmMsIDB4MGY4YzNlMTQsIDB4MzI3NDI3NWYsIA0KKwkweGU2MTEzYTgyLCAweDBlMDUzZTcxLCAweDMxZjcyN2ZkLCAweGUzZWUzOTgzLCANCisJMHgwYzdjM2VjNSwgMHgzMTc5Mjg5OSwgMHhlMWQ1Mzg3MSwgMHgwYWYxM2YwZSwgDQorCTB4MzBmODI5MzQsIDB4ZGZjNzM3NGIsIDB4MDk2NDNmNGUsIDB4MzA3NjI5Y2QsIA0KKwkweGRkYzMzNjEyLCAweDA3ZDUzZjg0LCAweDJmZjEyYTY1LCAweGRiY2MzNGM2LCANCisJMHgwNjQ1M2ZiMSwgMHgyZjZiMmFmYSwgMHhkOWUxMzM2NywgMHgwNGI1M2ZkMywgDQorCTB4MmVlMzJiOGUsIDB4ZDgwMzMxZjcsIDB4MDMyMzNmZWMsIDB4MmU1YTJjMjEsIA0KKwkweGQ2MzMzMDc2LCAweDAxOTIzZmZiLCAweDJkY2UyY2IyLCAweGQ0NzIyZWUzLCANCisJMHgwMDAwNDAwMCwgMHgyZDQxMmQ0MSwgMHhkMmJmMmQ0MSwgMHhmZTZlM2ZmYiwgDQorCTB4MmNiMjJkY2UsIDB4ZDExZDJiOGUsIDB4ZmNkZDNmZWMsIDB4MmMyMTJlNWEsIA0KKwkweGNmOGEyOWNkLCAweGZiNGIzZmQzLCAweDJiOGUyZWUzLCAweGNlMDkyN2ZkLCANCisJMHhmOWJiM2ZiMSwgMHgyYWZhMmY2YiwgMHhjYzk5MjYxZiwgMHhmODJiM2Y4NCwgDQorCTB4MmE2NTJmZjEsIDB4Y2IzYTI0MzQsIDB4ZjY5YzNmNGUsIDB4MjljZDMwNzYsIA0KKwkweGM5ZWUyMjNkLCAweGY1MGYzZjBlLCAweDI5MzQzMGY4LCAweGM4YjUyMDM5LCANCisJMHhmMzg0M2VjNSwgMHgyODk5MzE3OSwgMHhjNzhmMWUyYiwgMHhmMWZiM2U3MSwgDQorCTB4MjdmZDMxZjcsIDB4YzY3ZDFjMTIsIDB4ZjA3NDNlMTQsIDB4Mjc1ZjMyNzQsIA0KKwkweGM1N2UxOWVmLCAweGVlZWYzZGFlLCAweDI2YzAzMmVlLCAweGM0OTQxN2MzLCANCisJMHhlZDZjM2QzZSwgMHgyNjFmMzM2NywgMHhjM2JlMTU4ZiwgMHhlYmVkM2NjNSwgDQorCTB4MjU3ZDMzZGUsIDB4YzJmZTEzNTQsIDB4ZWE3MTNjNDIsIDB4MjRkYTM0NTMsIA0KKwkweGMyNTIxMTExLCAweGU4ZjgzYmI2LCAweDI0MzQzNGM2LCAweGMxYmMwZWM5LCANCisJMHhlNzgzM2IyMCwgMHgyMzhlMzUzNiwgMHhjMTNiMGM3YywgMHhlNjExM2E4MiwgDQorCTB4MjJlNjM1YTUsIDB4YzBkMTBhMmEsIDB4ZTRhMzM5ZGEsIDB4MjIzZDM2MTIsIA0KKwkweGMwN2MwN2Q1LCAweGUzM2EzOTJhLCAweDIxOTIzNjdjLCAweGMwM2QwNTdkLCANCisJMHhlMWQ1Mzg3MSwgMHgyMGU3MzZlNSwgMHhjMDE0MDMyMywgMHhlMDc1MzdhZiwgDQorCTB4MjAzOTM3NGIsIDB4YzAwMjAwYzksIDB4ZGYxOTM2ZTUsIDB4MWY4YjM3YWYsIA0KKwkweGMwMDVmZTZlLCAweGRkYzMzNjEyLCAweDFlZGMzODExLCAweGMwMWZmYzE0LCANCisJMHhkYzcyMzUzNiwgMHgxZTJiMzg3MSwgMHhjMDRmZjliYiwgMHhkYjI2MzQ1MywgDQorCTB4MWQ3OTM4Y2YsIDB4YzA5NmY3NjQsIDB4ZDllMTMzNjcsIDB4MWNjNjM5MmEsIA0KKwkweGMwZjJmNTBmLCAweGQ4YTEzMjc0LCAweDFjMTIzOTgzLCAweGMxNjRmMmJmLCANCisJMHhkNzY3MzE3OSwgMHgxYjVkMzlkYSwgMHhjMWVjZjA3NCwgMHhkNjMzMzA3NiwgDQorCTB4MWFhNjNhMmYsIDB4YzI4OWVlMmQsIDB4ZDUwNjJmNmIsIDB4MTllZjNhODIsIA0KKwkweGMzM2JlYmVkLCAweGQzZGYyZTVhLCAweDE5MzczYWQyLCAweGM0MDNlOWI0LCANCisJMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgMHhkMWE2MmMyMSwgDQorCTB4MTdjMzNiNmMsIDB4YzVkMWU1NWEsIDB4ZDA5NTJhZmEsIDB4MTcwODNiYjYsIA0KKwkweGM2ZDZlMzNhLCAweGNmOGEyOWNkLCAweDE2NGMzYmZkLCAweGM3ZWZlMTI0LCANCisJMHhjZTg3Mjg5OSwgMHgxNThmM2M0MiwgMHhjOTFiZGYxOSwgMHhjZDhjMjc1ZiwgDQorCTB4MTRkMTNjODQsIDB4Y2E1YmRkMWEsIDB4Y2M5OTI2MWYsIDB4MTQxMzNjYzUsIA0KKwkweGNiYWRkYjI2LCAweGNiYWQyNGRhLCAweDEzNTQzZDAyLCAweGNkMTJkOTQwLCANCisJMHhjYWNhMjM4ZSwgMHgxMjk0M2QzZSwgMHhjZTg3ZDc2NywgMHhjOWVlMjIzZCwgDQorCTB4MTFkMzNkNzcsIDB4ZDAwZmQ1OWIsIDB4YzkxYjIwZTcsIDB4MTExMTNkYWUsIA0KKwkweGQxYTZkM2RmLCAweGM4NTExZjhiLCAweDEwNGYzZGUyLCAweGQzNGVkMjMyLCANCisJMHhjNzhmMWUyYiwgMHgwZjhjM2UxNCwgMHhkNTA2ZDA5NSwgMHhjNmQ2MWNjNiwgDQorCTB4MGVjOTNlNDQsIDB4ZDZjY2NmMDgsIDB4YzYyNjFiNWQsIDB4MGUwNTNlNzEsIA0KKwkweGQ4YTFjZDhjLCAweGM1N2UxOWVmLCAweDBkNDEzZTljLCAweGRhODNjYzIyLCANCisJMHhjNGUwMTg3ZCwgMHgwYzdjM2VjNSwgMHhkYzcyY2FjYSwgMHhjNDRhMTcwOCwgDQorCTB4MGJiNjNlZWIsIDB4ZGU2ZWM5ODQsIDB4YzNiZTE1OGYsIDB4MGFmMTNmMGUsIA0KKwkweGUwNzVjODUxLCAweGMzM2IxNDEzLCAweDBhMmEzZjJmLCAweGUyODdjNzMxLCANCisJMHhjMmMyMTI5NCwgMHgwOTY0M2Y0ZSwgMHhlNGEzYzYyNiwgMHhjMjUyMTExMSwgDQorCTB4MDg5YzNmNmEsIDB4ZTZjOWM1MmUsIDB4YzFlYzBmOGMsIDB4MDdkNTNmODQsIA0KKwkweGU4ZjhjNDRhLCAweGMxOGYwZTA1LCAweDA3MGQzZjljLCAweGViMmZjMzdjLCANCisJMHhjMTNiMGM3YywgMHgwNjQ1M2ZiMSwgMHhlZDZjYzJjMiwgMHhjMGYyMGFmMSwgDQorCTB4MDU3ZDNmYzMsIDB4ZWZiMWMyMWUsIDB4YzBiMjA5NjQsIDB4MDRiNTNmZDMsIA0KKwkweGYxZmJjMThmLCAweGMwN2MwN2Q1LCAweDAzZWMzZmUxLCAweGY0NGFjMTE1LCANCisJMHhjMDRmMDY0NSwgMHgwMzIzM2ZlYywgMHhmNjljYzBiMiwgMHhjMDJkMDRiNSwgDQorCTB4MDI1YjNmZjQsIDB4ZjhmM2MwNjQsIDB4YzAxNDAzMjMsIDB4MDE5MjNmZmIsIA0KKwkweGZiNGJjMDJkLCAweGMwMDUwMTkyLCAweDAwYzkzZmZlLCAweGZkYTVjMDBjCQ0KK307DQorDQorY29uc3QgaW50IHR3aWRUYWI2NFsoNCo2ICsgMTYqNikvMl0gPSB7DQorCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTJkNDEsIA0KKwkweDNiMjAxODdkLCAweDE4N2QzYjIwLCAweDAwMDA0MDAwLCAweDJkNDEyZDQxLCANCisJMHhkMmJmMmQ0MSwgMHhkMmJmMmQ0MSwgMHgxODdkM2IyMCwgMHhjNGUwZTc4MywgDQorDQorCTB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4M2VjNTBjN2MsIA0KKwkweDNmYjEwNjQ1LCAweDNkM2UxMjk0LCAweDNiMjAxODdkLCAweDNlYzUwYzdjLCANCisJMHgzNTM2MjM4ZSwgMHgzNTM2MjM4ZSwgMHgzZDNlMTI5NCwgMHgyODk5MzE3OSwgDQorCTB4MmQ0MTJkNDEsIDB4M2IyMDE4N2QsIDB4MTg3ZDNiMjAsIDB4MjM4ZTM1MzYsIA0KKwkweDM4NzExZTJiLCAweDA2NDUzZmIxLCAweDE4N2QzYjIwLCAweDM1MzYyMzhlLCANCisJMHhmMzg0M2VjNSwgMHgwYzdjM2VjNSwgMHgzMTc5Mjg5OSwgMHhlMWQ1Mzg3MSwgDQorCTB4MDAwMDQwMDAsIDB4MmQ0MTJkNDEsIDB4ZDJiZjJkNDEsIDB4ZjM4NDNlYzUsIA0KKwkweDI4OTkzMTc5LCAweGM3OGYxZTJiLCAweGU3ODMzYjIwLCAweDIzOGUzNTM2LCANCisJMHhjMTNiMGM3YywgMHhkYzcyMzUzNiwgMHgxZTJiMzg3MSwgMHhjMDRmZjliYiwgDQorCTB4ZDJiZjJkNDEsIDB4MTg3ZDNiMjAsIDB4YzRlMGU3ODMsIDB4Y2FjYTIzOGUsIA0KKwkweDEyOTQzZDNlLCAweGNlODdkNzY3LCAweGM0ZTAxODdkLCAweDBjN2MzZWM1LCANCisJMHhkYzcyY2FjYSwgMHhjMTNiMGM3YywgMHgwNjQ1M2ZiMSwgMHhlZDZjYzJjMiANCit9Ow0KKw0KKyNlbGlmIGRlZmluZWQgQVJNVjdOZW9uDQorLyogDQorICogIFEyOSBmb3IgMTI4IGFuZCAxMDI0IA0KKyAqDQorICogZm9yIChpID0gMDsgaSA8IG51bS80OyBpKyspIHsNCisgKiAgIGFuZ2xlID0gKGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOw0KKyAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAyOSk7DQorICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDI5KTsNCisgKiANCisgKiAgIGFuZ2xlID0gKG51bS8yIC0gMSAtIGkgKyAwLjEyNSkgKiBNX1BJIC8gbnVtOw0KKyAqICAgeCA9IGNvcyhhbmdsZSkgKiAoMSA8PCAyOSk7DQorICogICB4ID0gc2luKGFuZ2xlKSAqICgxIDw8IDI5KTsNCisgKiB9DQorICovDQorY29uc3QgaW50IGNvc3NpbnRhYlsxMjggKyAxMDI0XSA9IHsNCisJLyogMTI4ICovDQorCTB4MWZmZmY2MjEsIDB4MDAxOTIxZjksIDB4MDBhZmVhNjksIDB4MWZmZTFjNjgsIDB4MWZmY2UwOWQsIDB4MDBlMjJhN2EsIDB4MDE3OGRiYWEsIDB4MWZmNzUzYmIsIAorCTB4MWZmNGRjNTUsIDB4MDFhYjEwMWMsIDB4MDI0MTkyY2YsIDB4MWZlYjlkMjUsIDB4MWZlN2VhODUsIDB4MDI3M2IzZTIsIDB4MDMwOWYwZTIsIDB4MWZkYWZhNzUsIAorCTB4MWZkNjBkMmUsIDB4MDMzYmY2ZGQsIDB4MDNkMWQ3MDAsIDB4MWZjNTZlM2IsIDB4MWZiZjQ3MGYsIDB4MDQwM2JhMmIsIDB4MDQ5OTI2NTMsIDB4MWZhYWZiY2IsIAorCTB4MWZhMzliYWMsIDB4MDRjYWRlZmUsIDB4MDU1ZmMwMjIsIDB4MWY4YmE3MzgsIDB4MWY4MzBmNGEsIDB4MDU5MTQ2YTEsIDB4MDYyNTg1Y2EsIDB4MWY2Nzc1NTcsIAorCTB4MWY1ZGE2ZWQsIDB4MDY1NmQyN2EsIDB4MDZlYTU4Y2QsIDB4MWYzZTZiYmMsIDB4MWYzMzY4NWEsIDB4MDcxYjY0MTUsIDB4MDdhZTFhZDIsIDB4MWYxMDkwYmQsIAorCTB4MWYwNDVhMTUsIDB4MDdkZWRkMjAsIDB4MDg3MGFkYTcsIDB4MWVkZGViNmEsIDB4MWVkMDgzNWYsIDB4MDhhMTFmNzgsIDB4MDkzMWYzNGQsIDB4MWVhNjgzOTQsIAorCTB4MWU5N2VjMzYsIDB4MDk2MjBkMjcsIDB4MDlmMWNkZjUsIDB4MWU2YTYxYzUsIDB4MWU1YTlkNTUsIDB4MGEyMTg4NmUsIDB4MGFiMDIwMDksIDB4MWUyOThmNDQsIAorCTB4MWUxOGEwMzAsIDB4MGFkZjczYzYsIDB4MGI2Y2NjMzIsIDB4MWRlNDE2MGYsIDB4MWRkMWZlZjQsIDB4MGI5YmIxZTUsIDB4MGMyN2I1NTUsIDB4MWQ5YTAwZGUsIAorCTB4MWQ4NmM0ODQsIDB4MGM1NjI1YzMsIDB4MGNlMGJlYTIsIDB4MWQ0YjViMWIsIDB4MWQzNmZjN2MsIDB4MGQwZWIyYTIsIDB4MGQ5N2NiOGYsIDB4MWNmODMwZTksIAorCTB4MWNlMmIzMjgsIDB4MGRjNTNjMGEsIDB4MGU0Y2JmZTIsIDB4MWNhMDhmMWEsIDB4MWM4OWY1ODcsIDB4MGU3OWE1ZDcsIDB4MGVmZjdmYjMsIDB4MWM0NDgzMzEsIAorCTB4MWMyY2QxNDksIDB4MGYyYmQ0MzcsIDB4MGZhZmVmNzMsIDB4MWJlNDFiNjEsIDB4MWJjYjU0Y2IsIDB4MGZkYmFiYWUsIDB4MTA1ZGYzZWMsIDB4MWI3ZjY2ODcsIAorCTB4MWI2NThmMTUsIDB4MTA4OTExMjAsIDB4MTEwOTcyNDksIDB4MWIxNjc0MmEsIDB4MWFmYjhmZDksIDB4MTEzM2U5ZDAsIDB4MTFiMjUwMTcsIDB4MWFhOTU0N2EsIAorCTB4MWE4ZDY3NmUsIDB4MTFkYzFiNjUsIDB4MTI1ODczNGQsIDB4MWEzODE4NGEsIDB4MWExYjI2ZDMsIDB4MTI4MThiZWYsIDB4MTJmYmMyNGIsIDB4MTljMmQxMTEsIAorCTB4MTlhNGRmYTQsIDB4MTMyNDIxZWMsIDB4MTM5YzIzZTQsIDB4MTk0OTkwZTQsIDB4MTkyYWE0MjAsIDB4MTNjM2M0NGEsIDB4MTQzOTdmNWIsIDB4MThjYzZhNzUsIAorCTB4MThhYzg3MWYsIDB4MTQ2MDVhNjksIDB4MTRkM2JjNmQsIDB4MTg0YjcxMTIsIDB4MTgyYTljMTQsIDB4MTRmOWNjMjYsIDB4MTU2YWMzNTIsIDB4MTdjNmI4OWQsIAorCTB4MTdhNGY3MDgsIDB4MTU5MDAxZDYsIDB4MTVmZTdjYmUsIDB4MTczZTU1OGUsIDB4MTcxYmFjOTYsIDB4MTYyMmU0NTAsIDB4MTY4ZWQxZWIsIDB4MTZiMjVjZWQsDQorCS8qIDEwMjQgKi8NCisJMHgxZmZmZmZkOSwgMHgwMDAzMjQzZiwgMHgwMDE1ZmRiYSwgMHgxZmZmZjg3MiwgMHgxZmZmZjM4MiwgMHgwMDFjNDYzNywgMHgwMDJmMWZhNiwgMHgxZmZmZGQ0ZCwgDQorCTB4MWZmZmQzNmYsIDB4MDAzNTY4MWQsIDB4MDA0ODQxNzUsIDB4MWZmZmFlNmMsIDB4MWZmZjlmOWUsIDB4MDA0ZTg5ZTMsIDB4MDA2MTYzMTgsIDB4MWZmZjZiY2UsIA0KKwkweDFmZmY1ODExLCAweDAwNjdhYjc3LCAweDAwN2E4NDdlLCAweDFmZmYxNTcyLCAweDFmZmVmY2M2LCAweDAwODBjY2NjLCAweDAwOTNhNTk5LCAweDFmZmVhYjViLCANCisJMHgxZmZlOGRiZiwgMHgwMDk5ZWRkMiwgMHgwMGFjYzY1OCwgMHgxZmZlMmQ4NiwgMHgxZmZlMGFmYywgMHgwMGIzMGU3OCwgMHgwMGM1ZTZhZCwgMHgxZmZkOWJmNiwgDQorCTB4MWZmZDc0N2MsIDB4MDBjYzJlYjAsIDB4MDBkZjA2ODgsIDB4MWZmY2Y2YWEsIDB4MWZmY2NhNDEsIDB4MDBlNTRlNmEsIDB4MDBmODI1ZGEsIDB4MWZmYzNkYTIsIA0KKwkweDFmZmMwYzRiLCAweDAwZmU2ZDk3LCAweDAxMTE0NDkyLCAweDFmZmI3MGUwLCAweDFmZmIzYTlhLCAweDAxMTc4YzI3LCAweDAxMmE2MmEyLCAweDFmZmE5MDYzLCANCisJMHgxZmZhNTUyZSwgMHgwMTMwYWEwYSwgMHgwMTQzN2ZmYSwgMHgxZmY5OWMyYywgMHgxZmY5NWMwOSwgMHgwMTQ5YzczMSwgMHgwMTVjOWM4YSwgMHgxZmY4OTQzYywgDQorCTB4MWZmODRmMmIsIDB4MDE2MmUzOGQsIDB4MDE3NWI4NDMsIDB4MWZmNzc4OTMsIDB4MWZmNzJlOTQsIDB4MDE3YmZmMGUsIDB4MDE4ZWQzMTYsIDB4MWZmNjQ5MzIsIA0KKwkweDFmZjVmYTQ2LCAweDAxOTUxOWE1LCAweDAxYTdlY2YyLCAweDFmZjUwNjFiLCAweDFmZjRiMjQwLCAweDAxYWUzMzQxLCAweDAxYzEwNWM5LCAweDFmZjNhZjRjLCANCisJMHgxZmYzNTY4NCwgMHgwMWM3NGJkNSwgMHgwMWRhMWQ4YywgMHgxZmYyNDRjOCwgMHgxZmYxZTcxMywgMHgwMWUwNjM0ZiwgMHgwMWYzMzQyOSwgMHgxZmYwYzY4ZiwgDQorCTB4MWZmMDYzZWQsIDB4MDFmOTc5YTEsIDB4MDIwYzQ5OTMsIDB4MWZlZjM0YTMsIDB4MWZlZWNkMTQsIDB4MDIxMjhlYmIsIDB4MDIyNTVkYjksIDB4MWZlZDhmMDMsIA0KKwkweDFmZWQyMjg3LCAweDAyMmJhMjhmLCAweDAyM2U3MDhkLCAweDFmZWJkNWIyLCAweDFmZWI2NDRhLCAweDAyNDRiNTBiLCAweDAyNTc4MWZlLCAweDFmZWEwOGIwLCANCisJMHgxZmU5OTI1YywgMHgwMjVkYzYyMSwgMHgwMjcwOTFmZCwgMHgxZmU4MjdmZSwgMHgxZmU3YWNiZSwgMHgwMjc2ZDVjMSwgMHgwMjg5YTA3YiwgMHgxZmU2MzM5ZCwgDQorCTB4MWZlNWIzNzIsIDB4MDI4ZmUzZGQsIDB4MDJhMmFkNjksIDB4MWZlNDJiOTAsIDB4MWZlM2E2NzksIDB4MDJhOGYwNjMsIDB4MDJiYmI4YjYsIDB4MWZlMjBmZDYsIA0KKwkweDFmZTE4NWQ1LCAweDAyYzFmYjQ2LCAweDAyZDRjMjUzLCAweDFmZGZlMDcxLCAweDFmZGY1MTg2LCAweDAyZGIwNDc1LCAweDAyZWRjYTMyLCAweDFmZGQ5ZDY0LCANCisJMHgxZmRkMDk4ZSwgMHgwMmY0MGJlMiwgMHgwMzA2ZDA0MiwgMHgxZmRiNDZhZSwgMHgxZmRhYWRlZSwgMHgwMzBkMTE3YywgMHgwMzFmZDQ3NCwgMHgxZmQ4ZGM1MSwgDQorCTB4MWZkODNlYTgsIDB4MDMyNjE1MzQsIDB4MDMzOGQ2YjgsIDB4MWZkNjVlNGYsIDB4MWZkNWJiYmQsIDB4MDMzZjE2ZmIsIDB4MDM1MWQ3MDAsIDB4MWZkM2NjYWEsIA0KKwkweDFmZDMyNTMwLCAweDAzNTgxNmMxLCAweDAzNmFkNTNjLCAweDFmZDEyNzYzLCAweDFmZDA3YjAwLCAweDAzNzExNDc3LCAweDAzODNkMTVjLCAweDFmY2U2ZTdjLCANCisJMHgxZmNkYmQzMSwgMHgwMzhhMTAwZSwgMHgwMzljY2I1MSwgMHgxZmNiYTFmNSwgMHgxZmNhZWJjMywgMHgwM2EzMDk3NSwgMHgwM2I1YzMwYiwgMHgxZmM4YzFkMiwgDQorCTB4MWZjODA2YjksIDB4MDNiYzAwOWYsIDB4MDNjZWI4N2MsIDB4MWZjNWNlMTQsIDB4MWZjNTBlMTQsIDB4MDNkNGY1N2EsIDB4MDNlN2FiOTMsIDB4MWZjMmM2YmQsIA0KKwkweDFmYzIwMWQ3LCAweDAzZWRlN2Y5LCAweDA0MDA5YzQyLCAweDFmYmZhYmNkLCAweDFmYmVlMjAyLCAweDA0MDZkODBiLCAweDA0MTk4YTc4LCAweDFmYmM3ZDQ5LCANCisJMHgxZmJiYWU5OSwgMHgwNDFmYzVhMSwgMHgwNDMyNzYyOCwgMHgxZmI5M2IzMSwgMHgxZmI4Njc5YywgMHgwNDM4YjBhYywgMHgwNDRiNWY0MCwgMHgxZmI1ZTU4NywgDQorCTB4MWZiNTBkMGUsIDB4MDQ1MTk5MWQsIDB4MDQ2NDQ1YjIsIDB4MWZiMjdjNGUsIDB4MWZiMTllZjEsIDB4MDQ2YTdlZTMsIDB4MDQ3ZDI5NmYsIDB4MWZhZWZmODcsIA0KKwkweDFmYWUxZDQ3LCAweDA0ODM2MWYwLCAweDA0OTYwYTY3LCAweDFmYWI2ZjM1LCAweDFmYWE4ODEzLCAweDA0OWM0MjM1LCAweDA0YWVlODhiLCAweDFmYTdjYjVhLCANCisJMHgxZmE2ZGY1NiwgMHgwNGI1MWZhMSwgMHgwNGM3YzNjYiwgMHgxZmE0MTNmOCwgMHgxZmEzMjMxMywgMHgwNGNkZmEyNiwgMHgwNGUwOWMxOCwgMHgxZmEwNDkxMiwgDQorCTB4MWY5ZjUzNGMsIDB4MDRlNmQxYjQsIDB4MDRmOTcxNjMsIDB4MWY5YzZhYTksIDB4MWY5YjcwMDMsIDB4MDRmZmE2M2MsIDB4MDUxMjQzOWQsIDB4MWY5ODc4YzEsIA0KKwkweDFmOTc3OTNiLCAweDA1MTg3N2FmLCAweDA1MmIxMmI2LCAweDFmOTQ3MzViLCAweDFmOTM2ZWY2LCAweDA1MzE0NWZkLCAweDA1NDNkZTllLCAweDFmOTA1YTdhLCANCisJMHgxZjhmNTEzNywgMHgwNTRhMTExNywgMHgwNTVjYTc0OCwgMHgxZjhjMmUyMSwgMHgxZjhiMjAwMCwgMHgwNTYyZDhlZSwgMHgwNTc1NmNhMiwgMHgxZjg3ZWU1MiwgDQorCTB4MWY4NmRiNTUsIDB4MDU3YjlkNzMsIDB4MDU4ZTJlOWYsIDB4MWY4MzliMTAsIDB4MWY4MjgzMzYsIDB4MDU5NDVlOTUsIDB4MDVhNmVkMmUsIDB4MWY3ZjM0NWUsIA0KKwkweDFmN2UxN2E4LCAweDA1YWQxYzQ3LCAweDA1YmZhODQwLCAweDFmN2FiYTNlLCAweDFmNzk5OGFkLCAweDA1YzVkNjc4LCAweDA1ZDg1ZmM3LCAweDFmNzYyY2IyLCANCisJMHgxZjc1MDY0NywgMHgwNWRlOGQxOSwgMHgwNWYxMTNiMywgMHgxZjcxOGJiZiwgMHgxZjcwNjA3YSwgMHgwNWY3NDAxYywgMHgwNjA5YzNmNSwgMHgxZjZjZDc2NiwgDQorCTB4MWY2YmE3NDgsIDB4MDYwZmVmNzEsIDB4MDYyMjcwN2QsIDB4MWY2ODBmYWIsIDB4MWY2NmRhYjUsIDB4MDYyODliMDgsIDB4MDYzYjE5M2MsIDB4MWY2MzM0OTAsIA0KKwkweDFmNjFmYWMzLCAweDA2NDE0MmQzLCAweDA2NTNiZTIzLCAweDFmNWU0NjE5LCAweDFmNWQwNzc1LCAweDA2NTllNmMyLCAweDA2NmM1ZjI0LCAweDFmNTk0NDQ4LCANCisJMHgxZjU4MDBjZSwgMHgwNjcyODZjNiwgMHgwNjg0ZmMyZSwgMHgxZjU0MmYyMSwgMHgxZjUyZTZkMiwgMHgwNjhiMjJkMCwgMHgwNjlkOTUzMiwgMHgxZjRmMDZhNiwgDQorCTB4MWY0ZGI5ODMsIDB4MDZhM2JhZDAsIDB4MDZiNjJhMjIsIDB4MWY0OWNhZGMsIDB4MWY0ODc4ZTUsIDB4MDZiYzRlYjksIDB4MDZjZWJhZWUsIDB4MWY0NDdiYzQsIA0KKwkweDFmNDMyNGZiLCAweDA2ZDRkZTc5LCAweDA2ZTc0Nzg2LCAweDFmM2YxOTYzLCAweDFmM2RiZGM4LCAweDA2ZWQ2YTAzLCAweDA2ZmZjZmRkLCAweDFmMzlhM2JjLCANCisJMHgxZjM4NDM1MCwgMHgwNzA1ZjE0NywgMHgwNzE4NTNlMywgMHgxZjM0MWFkMiwgMHgxZjMyYjU5NSwgMHgwNzFlNzQzNiwgMHgwNzMwZDM4OCwgMHgxZjJlN2VhOSwgDQorCTB4MWYyZDE0OWQsIDB4MDczNmYyYzAsIDB4MDc0OTRlYmQsIDB4MWYyOGNmNDMsIDB4MWYyNzYwNjksIDB4MDc0ZjZjZDcsIDB4MDc2MWM1NzQsIDB4MWYyMzBjYTUsIA0KKwkweDFmMjE5OGZkLCAweDA3NjdlMjZjLCAweDA3N2EzNzlkLCAweDFmMWQzNmQyLCAweDFmMWJiZTVkLCAweDA3ODA1MzcwLCAweDA3OTJhNTJhLCAweDFmMTc0ZGNlLCANCisJMHgxZjE1ZDA4ZCwgMHgwNzk4YmZkMywgMHgwN2FiMGUwYSwgMHgxZjExNTE5YywgMHgxZjBmY2Y5MSwgMHgwN2IxMjc4NiwgMHgwN2MzNzIzMCwgMHgxZjBiNDI0MCwgDQorCTB4MWYwOWJiNmIsIDB4MDdjOThhN2EsIDB4MDdkYmQxOGMsIDB4MWYwNTFmYmUsIDB4MWYwMzk0MWYsIDB4MDdlMWU4YTEsIDB4MDdmNDJjMGUsIDB4MWVmZWVhMTksIA0KKwkweDFlZmQ1OWIzLCAweDA3ZmE0MWViLCAweDA4MGM4MWE5LCAweDFlZjhhMTU1LCAweDFlZjcwYzI4LCAweDA4MTI5NjRhLCAweDA4MjRkMjRkLCAweDFlZjI0NTc3LCANCisJMHgxZWYwYWI4NCwgMHgwODJhZTVhZCwgMHgwODNkMWRlYSwgMHgxZWViZDY4MiwgMHgxZWVhMzdjYSwgMHgwODQzMzAwNywgMHgwODU1NjQ3MywgMHgxZWU1NTQ3YSwgDQorCTB4MWVlM2IwZmUsIDB4MDg1Yjc1NDgsIDB4MDg2ZGE1ZDgsIDB4MWVkZWJmNjQsIDB4MWVkZDE3MjQsIDB4MDg3M2I1NjIsIDB4MDg4NWUyMDksIDB4MWVkODE3NDIsIA0KKwkweDFlZDY2YTQxLCAweDA4OGJmMDQ0LCAweDA4OWUxOGY5LCAweDFlZDE1YzFhLCAweDFlY2ZhYTU3LCAweDA4YTQyNWUxLCAweDA4YjY0YTk4LCAweDFlY2E4ZGVmLCANCisJMHgxZWM4ZDc2YywgMHgwOGJjNTYyYSwgMHgwOGNlNzZkOCwgMHgxZWMzYWNjNiwgMHgxZWMxZjE4NCwgMHgwOGQ0ODEwZiwgMHgwOGU2OWRhOCwgMHgxZWJjYjhhMywgDQorCTB4MWViYWY4YTMsIDB4MDhlY2E2ODEsIDB4MDhmZWJlZmIsIDB4MWViNWIxOGEsIDB4MWViM2VjY2QsIDB4MDkwNGM2NzMsIDB4MDkxNmRhYzIsIDB4MWVhZTk3N2YsIA0KKwkweDFlYWNjZTA3LCAweDA5MWNlMGQ0LCAweDA5MmVmMGVkLCAweDFlYTc2YTg3LCAweDFlYTU5YzU1LCAweDA5MzRmNTk2LCAweDA5NDcwMTZlLCAweDFlYTAyYWE3LCANCisJMHgxZTllNTdiYiwgMHgwOTRkMDRhYSwgMHgwOTVmMGMzNiwgMHgxZTk4ZDdlMiwgMHgxZTk3MDAzZSwgMHgwOTY1MGUwMSwgMHgwOTc3MTEzNiwgMHgxZTkxNzIzZSwgDQorCTB4MWU4Zjk1ZTMsIDB4MDk3ZDExOGQsIDB4MDk4ZjEwNjAsIDB4MWU4OWY5YmYsIDB4MWU4ODE4YWQsIDB4MDk5NTBmM2YsIDB4MDlhNzA5YTQsIDB4MWU4MjZlNjksIA0KKwkweDFlODA4OGEyLCAweDA5YWQwNzA3LCAweDA5YmVmY2Y0LCAweDFlN2FkMDQxLCAweDFlNzhlNWM3LCAweDA5YzRmOGQ4LCAweDA5ZDZlYTQwLCAweDFlNzMxZjRjLCANCisJMHgxZTcxMzAxZiwgMHgwOWRjZTRhMSwgMHgwOWVlZDE3YiwgMHgxZTZiNWI4ZiwgMHgxZTY5NjdiMSwgMHgwOWY0Y2E1NiwgMHgwYTA2YjI5NiwgMHgxZTYzODUwZSwgDQorCTB4MWU2MThjODAsIDB4MGEwY2E5ZTYsIDB4MGExZThkODEsIDB4MWU1YjliY2UsIDB4MWU1OTllOTEsIDB4MGEyNDgzNDMsIDB4MGEzNjYyMmUsIDB4MWU1MzlmZDQsIA0KKwkweDFlNTE5ZGVhLCAweDBhM2M1NjVlLCAweDBhNGUzMDhmLCAweDFlNGI5MTI2LCAweDFlNDk4YThlLCAweDBhNTQyMzI5LCAweDBhNjVmODk0LCAweDFlNDM2ZmM3LCANCisJMHgxZTQxNjQ4NSwgMHgwYTZiZTk5NSwgMHgwYTdkYmEyZiwgMHgxZTNiM2JiZCwgMHgxZTM5MmJkMSwgMHgwYTgzYTk5MywgMHgwYTk1NzU1MSwgMHgxZTMyZjUwZSwgDQorCTB4MWUzMGUwNzksIDB4MGE5YjYzMTUsIDB4MGFhZDI5ZWMsIDB4MWUyYTliYmQsIDB4MWUyODgyODEsIDB4MGFiMzE2MGMsIDB4MGFjNGQ3ZjEsIDB4MWUyMjJmZDEsIA0KKwkweDFlMjAxMWVlLCAweDBhY2FjMjZhLCAweDBhZGM3ZjUyLCAweDFlMTliMTRmLCAweDFlMTc4ZWM3LCAweDBhZTI2ODFmLCAweDBhZjQxZmZmLCAweDFlMTEyMDNiLCANCisJMHgxZTBlZjkxMCwgMHgwYWZhMDcxZCwgMHgwYjBiYjllYiwgMHgxZTA4N2M5YiwgMHgxZTA2NTBjZSwgMHgwYjExOWY1NiwgMHgwYjIzNGQwNywgMHgxZGZmYzY3NCwgDQorCTB4MWRmZDk2MDYsIDB4MGIyOTMwYmIsIDB4MGIzYWQ5NDMsIDB4MWRmNmZkY2MsIDB4MWRmNGM4YmYsIDB4MGI0MGJiM2UsIDB4MGI1MjVlOTIsIDB4MWRlZTIyYTksIA0KKwkweDFkZWJlOGZkLCAweDBiNTgzZWNmLCAweDBiNjlkY2U2LCAweDFkZTUzNTBmLCAweDFkZTJmNmM2LCAweDBiNmZiYjYyLCAweDBiODE1NDJmLCAweDFkZGMzNTA0LCANCisJMHgxZGQ5ZjIyMCwgMHgwYjg3MzBlNiwgMHgwYjk4YzQ1ZiwgMHgxZGQzMjI4ZSwgMHgxZGQwZGIxMCwgMHgwYjllOWY0ZCwgMHgwYmIwMmQ2OCwgMHgxZGM5ZmRiMiwgDQorCTB4MWRjN2IxOWIsIDB4MGJiNjA2OGEsIDB4MGJjNzhmM2IsIDB4MWRjMGM2NzYsIDB4MWRiZTc1YzgsIDB4MGJjZDY2OGUsIDB4MGJkZWU5Y2EsIDB4MWRiNzdjZGYsIA0KKwkweDFkYjUyNzljLCAweDBiZTRiZjRhLCAweDBiZjYzZDA3LCAweDFkYWUyMGY0LCAweDFkYWJjNzFkLCAweDBiZmMxMGFmLCAweDBjMGQ4OGUyLCAweDFkYTRiMmJhLCANCisJMHgxZGEyNTQ1MCwgMHgwYzEzNWFiMCwgMHgwYzI0Y2Q0ZSwgMHgxZDliMzIzNywgMHgxZDk4Y2YzYiwgMHgwYzJhOWQzZSwgMHgwYzNjMGEzZCwgMHgxZDkxOWY3MCwgDQorCTB4MWQ4ZjM3ZTUsIDB4MGM0MWQ4NGIsIDB4MGM1MzNmYTAsIDB4MWQ4N2ZhNmQsIDB4MWQ4NThlNTMsIDB4MGM1OTBiYzksIDB4MGM2YTZkNjgsIDB4MWQ3ZTQzMzIsIA0KKwkweDFkN2JkMjhiLCAweDBjNzAzN2E4LCAweDBjODE5Mzg4LCAweDFkNzQ3OWM1LCAweDFkNzIwNDkzLCAweDBjODc1YmRiLCAweDBjOThiMWYwLCAweDFkNmE5ZTJlLCANCisJMHgxZDY4MjQ3MiwgMHgwYzllNzg1NCwgMHgwY2FmYzg5NCwgMHgxZDYwYjA3MCwgMHgxZDVlMzIyYywgMHgwY2I1OGQwNCwgMHgwY2M2ZDc2NCwgMHgxZDU2YjA5NCwgDQorCTB4MWQ1NDJkYzksIDB4MGNjYzk5ZGUsIDB4MGNkZGRlNTMsIDB4MWQ0YzllOWYsIDB4MWQ0YTE3NGYsIDB4MGNlMzllZDIsIDB4MGNmNGRkNTIsIDB4MWQ0MjdhOTcsIA0KKwkweDFkM2ZlZWMzLCAweDBjZmE5YmQyLCAweDBkMGJkNDUyLCAweDFkMzg0NDgzLCAweDFkMzViNDJkLCAweDBkMTE5MGQxLCAweDBkMjJjMzQ3LCAweDFkMmRmYzY4LCANCisJMHgxZDJiNjc5MSwgMHgwZDI4N2RjMSwgMHgwZDM5YWEyMSwgMHgxZDIzYTI0ZSwgMHgxZDIxMDhmOCwgMHgwZDNmNjI5MiwgMHgwZDUwODhkMywgMHgxZDE5MzYzYSwgDQorCTB4MWQxNjk4NjcsIDB4MGQ1NjNmMzgsIDB4MGQ2NzVmNGUsIDB4MWQwZWI4MzMsIDB4MWQwYzE1ZTQsIDB4MGQ2ZDEzYTMsIDB4MGQ3ZTJkODUsIDB4MWQwNDI4M2YsIA0KKwkweDFkMDE4MTc2LCAweDBkODNkZmM2LCAweDBkOTRmMzY5LCAweDFjZjk4NjY2LCAweDFjZjZkYjI0LCAweDBkOWFhMzkzLCAweDBkYWJiMGVjLCAweDFjZWVkMmFkLCANCisJMHgxY2VjMjJmNCwgMHgwZGIxNWVmYywgMHgwZGMyNjYwMCwgMHgxY2U0MGQxYiwgMHgxY2UxNThlZCwgMHgwZGM4MTFmMywgMHgwZGQ5MTI5OCwgMHgxY2Q5MzViNywgDQorCTB4MWNkNjdkMTUsIDB4MGRkZWJjNjksIDB4MGRlZmI2YTUsIDB4MWNjZTRjODcsIDB4MWNjYjhmNzQsIDB4MGRmNTVlNTEsIDB4MGUwNjUyMTksIDB4MWNjMzUxOTIsIA0KKwkweDFjYzA5MDBmLCAweDBlMGJmNzljLCAweDBlMWNlNGU2LCAweDFjYjg0NGRmLCAweDFjYjU3ZWVlLCAweDBlMjI4ODNlLCAweDBlMzM2ZWZmLCAweDFjYWQyNjc1LCANCisJMHgxY2FhNWMxNywgMHgwZTM5MTAyNywgMHgwZTQ5ZjA1NSwgMHgxY2ExZjY1YiwgMHgxYzlmMjc5MiwgMHgwZTRmOGY0YiwgMHgwZTYwNjhkYiwgMHgxYzk2YjQ5NywgDQorCTB4MWM5M2UxNjUsIDB4MGU2NjA1OWEsIDB4MGU3NmQ4ODMsIDB4MWM4YjYxMzEsIDB4MWM4ODg5OTcsIDB4MGU3YzczMDgsIDB4MGU4ZDNmM2UsIDB4MWM3ZmZjMmYsIA0KKwkweDFjN2QyMDJmLCAweDBlOTJkNzg3LCAweDBlYTM5ZDAwLCAweDFjNzQ4NTk5LCAweDFjNzFhNTM1LCAweDBlYTkzMzA4LCAweDBlYjlmMWJhLCAweDFjNjhmZDc1LCANCisJMHgxYzY2MThhZSwgMHgwZWJmODU3ZCwgMHgwZWQwM2Q1ZSwgMHgxYzVkNjNjYSwgMHgxYzVhN2FhNCwgMHgwZWQ1Y2VkYSwgMHgwZWU2N2ZkZiwgMHgxYzUxYjhhMSwgDQorCTB4MWM0ZWNiMWMsIDB4MGVlYzBmMTAsIDB4MGVmY2I5MmYsIDB4MWM0NWZjMDAsIDB4MWM0MzBhMWQsIDB4MGYwMjQ2MTIsIDB4MGYxMmU5NDEsIDB4MWMzYTJkZWQsIA0KKwkweDFjMzczN2IwLCAweDBmMTg3M2QyLCAweDBmMjkxMDA2LCAweDFjMmU0ZTcyLCAweDFjMmI1M2RiLCAweDBmMmU5ODQyLCAweDBmM2YyZDcxLCAweDFjMjI1ZDk0LCANCisJMHgxYzFmNWVhNiwgMHgwZjQ0YjM1NCwgMHgwZjU1NDE3NSwgMHgxYzE2NWI1YiwgMHgxYzEzNTgxOCwgMHgwZjVhYzRmYywgMHgwZjZiNGMwMywgMHgxYzBhNDdjZiwgDQorCTB4MWMwNzQwMzgsIDB4MGY3MGNkMmEsIDB4MGY4MTRkMGUsIDB4MWJmZTIyZjgsIDB4MWJmYjE3MGYsIDB4MGY4NmNiZDMsIDB4MGY5NzQ0ODksIDB4MWJmMWVjZGIsIA0KKwkweDFiZWVkY2EyLCAweDBmOWNjMGU3LCAweDBmYWQzMjY1LCAweDFiZTVhNTgyLCAweDFiZTI5MGZiLCAweDBmYjJhYzVhLCAweDBmYzMxNjk3LCAweDFiZDk0Y2Y0LCANCisJMHgxYmQ2MzQyMSwgMHgwZmM4OGUxZSwgMHgwZmQ4ZjEwZiwgMHgxYmNjZTMzNywgMHgxYmM5YzYxYSwgMHgwZmRlNjYyNiwgMHgwZmVlYzFjMCwgMHgxYmMwNjg1NSwgDQorCTB4MWJiZDQ2ZjAsIDB4MGZmNDM0NjQsIDB4MTAwNDg4OWUsIDB4MWJiM2RjNTUsIDB4MWJiMGI2YTksIDB4MTAwOWY4Y2IsIDB4MTAxYTQ1OWEsIDB4MWJhNzNmM2QsIA0KKwkweDFiYTQxNTRkLCAweDEwMWZiMzRkLCAweDEwMmZmOGE4LCAweDFiOWE5MTE3LCAweDFiOTc2MmU0LCAweDEwMzU2M2RjLCAweDEwNDVhMWI5LCAweDFiOGRkMWVhLCANCisJMHgxYjhhOWY3NywgMHgxMDRiMGE2YywgMHgxMDViNDBjMSwgMHgxYjgxMDFiZSwgMHgxYjdkY2IwYywgMHgxMDYwYTZlZiwgMHgxMDcwZDViMSwgMHgxYjc0MjA5YiwgDQorCTB4MWI3MGU1YWMsIDB4MTA3NjM5NTgsIDB4MTA4NjYwN2UsIDB4MWI2NzJlODgsIDB4MWI2M2VmNWYsIDB4MTA4YmMxOWEsIDB4MTA5YmUxMTksIDB4MWI1YTJiOGUsIA0KKwkweDFiNTZlODJjLCAweDEwYTEzZmE2LCAweDEwYjE1Nzc1LCAweDFiNGQxN2I0LCAweDFiNDlkMDFjLCAweDEwYjZiMzcxLCAweDEwYzZjMzg1LCAweDFiM2ZmMzA0LCANCisJMHgxYjNjYTczNywgMHgxMGNjMWNlYywgMHgxMGRjMjUzYywgMHgxYjMyYmQ4NCwgMHgxYjJmNmQ4NSwgMHgxMGUxN2MwYiwgMHgxMGYxN2M4ZCwgMHgxYjI1NzczZCwgDQorCTB4MWIyMjIzMGUsIDB4MTBmNmQwYzAsIDB4MTEwNmM5NmEsIDB4MWIxODIwMzgsIDB4MWIxNGM3ZGEsIDB4MTEwYzFhZmUsIDB4MTExYzBiYzYsIDB4MWIwYWI4N2MsIA0KKwkweDFiMDc1YmYxLCAweDExMjE1YWI4LCAweDExMzE0Mzk1LCAweDFhZmQ0MDEyLCAweDFhZjlkZjVkLCAweDExMzY4ZmUxLCAweDExNDY3MGM4LCAweDFhZWZiNzAyLCANCisJMHgxYWVjNTIyNSwgMHgxMTRiYmE2YiwgMHgxMTViOTM1NCwgMHgxYWUyMWQ1NCwgMHgxYWRlYjQ1MSwgMHgxMTYwZGE0YiwgMHgxMTcwYWIyYSwgMHgxYWQ0NzMxMSwgDQorCTB4MWFkMTA1ZTksIDB4MTE3NWVmNzIsIDB4MTE4NWI4M2YsIDB4MWFjNmI4NDEsIDB4MWFjMzQ2ZjgsIDB4MTE4YWY5ZDQsIDB4MTE5YWJhODQsIDB4MWFiOGVjZWMsIA0KKwkweDFhYjU3Nzg0LCAweDExOWZmOTY0LCAweDExYWZiMWVlLCAweDFhYWIxMTFjLCAweDFhYTc5Nzk2LCAweDExYjRlZTE0LCAweDExYzQ5ZTZmLCAweDFhOWQyNGQ5LCANCisJMHgxYTk5YTczNywgMHgxMWM5ZDdkOSwgMHgxMWQ5N2ZmOSwgMHgxYThmMjgyYiwgMHgxYThiYTY3MCwgMHgxMWRlYjZhNCwgMHgxMWVlNTY4MiwgMHgxYTgxMWIxYiwgDQorCTB4MWE3ZDk1NDksIDB4MTFmMzhhNmEsIDB4MTIwMzIxZmEsIDB4MWE3MmZkYjIsIDB4MWE2ZjczY2EsIDB4MTIwODUzMWMsIDB4MTIxN2UyNTYsIDB4MWE2NGNmZjgsIA0KKwkweDFhNjE0MWZkLCAweDEyMWQxMGFmLCAweDEyMmM5Nzg5LCAweDFhNTY5MWY1LCAweDFhNTJmZmViLCAweDEyMzFjMzE2LCAweDEyNDE0MTg2LCAweDFhNDg0M2I0LCANCisJMHgxYTQ0YWQ5YiwgMHgxMjQ2NmE0NCwgMHgxMjU1ZTA0MSwgMHgxYTM5ZTUzZCwgMHgxYTM2NGIxNywgMHgxMjViMDYyYiwgMHgxMjZhNzNhYywgMHgxYTJiNzY5OCwgDQorCTB4MWEyN2Q4NjgsIDB4MTI2Zjk2YzEsIDB4MTI3ZWZiYmIsIDB4MWExY2Y3Y2UsIDB4MWExOTU1OTcsIDB4MTI4NDFiZjYsIDB4MTI5Mzc4NjEsIDB4MWEwZTY4ZTksIA0KKwkweDFhMGFjMmFjLCAweDEyOTg5NWMwLCAweDEyYTdlOTkxLCAweDE5ZmZjOWYxLCAweDE5ZmMxZmIxLCAweDEyYWQwNDEyLCAweDEyYmM0ZjQwLCAweDE5ZjExYWYwLCANCisJMHgxOWVkNmNhZiwgMHgxMmMxNjZkZSwgMHgxMmQwYTk2MCwgMHgxOWUyNWJlZSwgMHgxOWRlYTlhZSwgMHgxMmQ1YmUxOCwgMHgxMmU0ZjdlNSwgMHgxOWQzOGNmNCwgDQorCTB4MTljZmQ2YjgsIDB4MTJlYTA5YjQsIDB4MTJmOTNhYzIsIDB4MTljNGFlMGMsIDB4MTljMGYzZDYsIDB4MTJmZTQ5YTYsIDB4MTMwZDcxZWIsIDB4MTliNWJmM2YsIA0KKwkweDE5YjIwMTExLCAweDEzMTI3ZGUwLCAweDEzMjE5ZDUzLCAweDE5YTZjMDk2LCAweDE5YTJmZTczLCAweDEzMjZhNjU2LCAweDEzMzViY2VmLCAweDE5OTdiMjFiLCANCisJMHgxOTkzZWMwNCwgMHgxMzNhYzJmYywgMHgxMzQ5ZDBiMCwgMHgxOTg4OTNkNiwgMHgxOTg0YzljZSwgMHgxMzRlZDNjNSwgMHgxMzVkZDg4YywgMHgxOTc5NjVkMCwgDQorCTB4MTk3NTk3ZGEsIDB4MTM2MmQ4YTYsIDB4MTM3MWQ0NzYsIDB4MTk2YTI4MTUsIDB4MTk2NjU2MzIsIDB4MTM3NmQxOTEsIDB4MTM4NWM0NjEsIDB4MTk1YWRhYWIsIA0KKwkweDE5NTcwNGRmLCAweDEzOGFiZTdiLCAweDEzOTlhODQxLCAweDE5NGI3ZDllLCAweDE5NDdhM2ViLCAweDEzOWU5ZjU2LCAweDEzYWQ4MDBhLCAweDE5M2MxMGY3LCANCisJMHgxOTM4MzM1ZSwgMHgxM2IyNzQxNywgMHgxM2MxNGJiMCwgMHgxOTJjOTRiZiwgMHgxOTI4YjM0MywgMHgxM2M2M2NiMiwgMHgxM2Q1MGIyNiwgMHgxOTFkMDhmZiwgDQorCTB4MTkxOTIzYTMsIDB4MTNkOWY5MWIsIDB4MTNlOGJlNjAsIDB4MTkwZDZkYzEsIDB4MTkwOTg0ODgsIDB4MTNlZGE5NDQsIDB4MTNmYzY1NTMsIDB4MThmZGMzMTAsIA0KKwkweDE4ZjlkNWZhLCAweDE0MDE0ZDIzLCAweDE0MGZmZmYxLCAweDE4ZWUwOGY0LCAweDE4ZWExODA1LCAweDE0MTRlNGFhLCAweDE0MjM4ZTJmLCAweDE4ZGUzZjc3LCANCisJMHgxOGRhNGFiMiwgMHgxNDI4NmZjZSwgMHgxNDM3MTAwMSwgMHgxOGNlNjZhMywgMHgxOGNhNmUwYSwgMHgxNDNiZWU4MywgMHgxNDRhODU1YiwgMHgxOGJlN2U4MiwgDQorCTB4MThiYTgyMTcsIDB4MTQ0ZjYwYmQsIDB4MTQ1ZGVlMzAsIDB4MThhZTg3MWUsIDB4MThhYTg2ZTMsIDB4MTQ2MmM2NzAsIDB4MTQ3MTRhNzYsIDB4MTg5ZTgwODAsIA0KKwkweDE4OWE3Yzc4LCAweDE0NzYxZjhmLCAweDE0ODQ5YTFmLCAweDE4OGU2YWIyLCAweDE4OGE2MmUwLCAweDE0ODk2YzBmLCAweDE0OTdkZDIwLCAweDE4N2U0NWJlLCANCisJMHgxODdhM2EyNSwgMHgxNDljYWJlNCwgMHgxNGFiMTM2ZCwgMHgxODZlMTFhZiwgMHgxODZhMDI1MCwgMHgxNGFmZGYwMywgMHgxNGJlM2NmYSwgMHgxODVkY2U4ZSwgDQorCTB4MTg1OWJiNmMsIDB4MTRjMzA1NWUsIDB4MTRkMTU5YmMsIDB4MTg0ZDdjNjUsIDB4MTg0OTY1ODMsIDB4MTRkNjFlZWIsIDB4MTRlNDY5YTYsIDB4MTgzZDFiM2UsIA0KKwkweDE4MzkwMDllLCAweDE0ZTkyYjllLCAweDE0Zjc2Y2FkLCAweDE4MmNhYjI0LCAweDE4Mjg4Y2M4LCAweDE0ZmMyYjZhLCAweDE1MGE2MmM2LCAweDE4MWMyYzIwLCANCisJMHgxODE4MGEwYywgMHgxNTBmMWU0NSwgMHgxNTFkNGJlMywgMHgxODBiOWUzZCwgMHgxODA3Nzg3MywgMHgxNTIyMDQyMiwgMHgxNTMwMjdmYiwgMHgxN2ZiMDE4NSwgDQorCTB4MTdmNmQ4MDcsIDB4MTUzNGRjZjYsIDB4MTU0MmY3MDAsIDB4MTdlYTU2MDIsIDB4MTdlNjI4ZDMsIDB4MTU0N2E4YjUsIDB4MTU1NWI4ZTgsIDB4MTdkOTliYmUsIA0KKwkweDE3ZDU2YWUwLCAweDE1NWE2NzU0LCAweDE1Njg2ZGE3LCAweDE3YzhkMmM0LCAweDE3YzQ5ZTNiLCAweDE1NmQxOGM3LCAweDE1N2IxNTMyLCAweDE3YjdmYjFmLCANCisJMHgxN2IzYzJlYywgMHgxNTdmYmQwMywgMHgxNThkYWY3YywgMHgxN2E3MTRkNywgMHgxN2EyZDhmZSwgMHgxNTkyNTNmYiwgMHgxNWEwM2M3YSwgMHgxNzk2MWZmOSwgDQorCTB4MTc5MWUwN2IsIDB4MTVhNGRkYTUsIDB4MTViMmJjMjIsIDB4MTc4NTFjOGUsIDB4MTc4MGQ5NmYsIDB4MTViNzU5ZjUsIDB4MTVjNTJlNjcsIDB4MTc3NDBhYTEsIA0KKwkweDE3NmZjM2UzLCAweDE1YzljOGUwLCAweDE1ZDc5MzNmLCAweDE3NjJlYTNkLCAweDE3NWU5ZmUyLCAweDE1ZGMyYTVhLCAweDE1ZTllYTlkLCAweDE3NTFiYjZiLCANCisJMHgxNzRkNmQ3NywgMHgxNWVlN2U1OCwgMHgxNWZjMzQ3NywgMHgxNzQwN2UzNywgMHgxNzNjMmNhYywgMHgxNjAwYzRjZiwgMHgxNjBlNzBjMSwgMHgxNzJmMzJhYiwgDQorCTB4MTcyYWRkOGMsIDB4MTYxMmZkYjMsIDB4MTYyMDlmNzAsIDB4MTcxZGQ4ZDIsIDB4MTcxOTgwMjEsIDB4MTYyNTI4ZmEsIDB4MTYzMmMwNzgsIDB4MTcwYzcwYjcsIA0KKwkweDE3MDgxNDc3LCAweDE2Mzc0Njk3LCAweDE2NDRkM2QwLCAweDE2ZmFmYTY0LCAweDE2ZjY5YTk3LCAweDE2NDk1NjgwLCAweDE2NTZkOTZhLCAweDE2ZTk3NWU0LCANCisJMHgxNmU1MTI4ZSwgMHgxNjViNThhYSwgMHgxNjY4ZDEzZSwgMHgxNmQ3ZTM0MSwgMHgxNmQzN2M2NSwgMHgxNjZkNGQwYSwgMHgxNjdhYmIzZSwgMHgxNmM2NDI4OCwgDQorCTB4MTZjMWQ4MjcsIDB4MTY3ZjMzOTQsIDB4MTY4Yzk3NjAsIDB4MTZiNDkzYzIsIDB4MTZiMDI1ZTAsIDB4MTY5MTBjM2QsIDB4MTY5ZTY1OWEsIDB4MTZhMmQ2ZmINCit9Ow0KKw0KK2NvbnN0IGludCB0d2lkVGFiNTEyWzgqNiArIDMyKjYgKyAxMjgqNl0gPSB7DQorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIAorCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIAorCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIAorCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIAorCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmY2MjFlMywgMHgwMTkxZjY1ZiwgMHgxZmQ4OGRhNCwgMHgwMzIyZjRkOCwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgCisJMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgxZmE3NTU3ZiwgMHgwNGIyMDQxYywgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgCisJMHgxZjYyOTdkMCwgMHgwNjNlMmUwZiwgMHgxZjBhN2VmYywgMHgwN2M2N2U1ZiwgMHgxZTlmNDE1NywgMHgwOTRhMDMxNywgMHgxZTIxMjEwNSwgMHgwYWM3Y2QzYiwgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgCisJMHgxZDkwNmJjZiwgMHgwYzNlZjE1MywgMHgxY2VkN2FmNCwgMHgwZGFlODgwNSwgMHgxYzM4YjJmMiwgMHgwZjE1YWU5YywgMHgxYjcyODM0NSwgMHgxMDczODc5OSwgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHhmZTZlMDlhMSwgMHgxZmY2MjFlMywgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgCisJMHgxYTliNjYyOSwgMHgxMWM3M2IzYSwgMHgxOWIzZTA0OCwgMHgxMzBmZjdmZCwgMHgxOGJjODA2YiwgMHgxNDRjZjMyNSwgMHgxN2I1ZGYyMiwgMHgxNTdkNjkzNSwgCisJMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmNTM4MzJjNSwgMHgxZTIxMjEwNSwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlY2YwMDgwMywgMHgxOWIzZTA0OCwgCisJMHgwMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHhmY2RkMGIyOCwgMHgxZmQ4OGRhNCwgMHhmOWMxZDFmMSwgMHgxZjYyOTdkMCwgMHhmNmI1ZmNlOSwgMHgxZTlmNDE1NywgCisJMHgxNmEwOWU2NiwgMHgxNmEwOWU2NiwgMHgxNTdkNjkzNSwgMHgxN2I1ZGYyMiwgMHgxNDRjZjMyNSwgMHgxOGJjODA2YiwgMHgxMzBmZjdmZCwgMHgxOWIzZTA0OCwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNjRjMWZiOCwgMHgxMzBmZjdmZCwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgMHhlMWRlZGVmYiwgMHgwYWM3Y2QzYiwgCisJMHhmM2MxMGVhZCwgMHgxZDkwNmJjZiwgMHhmMGVhNTE2NCwgMHgxYzM4YjJmMiwgMHhlZTM4YzRjNiwgMHgxYTliNjYyOSwgMHhlYmIzMGNkYiwgMHgxOGJjODA2YiwgCisJMHgxMWM3M2IzYSwgMHgxYTliNjYyOSwgMHgxMDczODc5OSwgMHgxYjcyODM0NSwgMHgwZjE1YWU5YywgMHgxYzM4YjJmMiwgMHgwZGFlODgwNSwgMHgxY2VkN2FmNCwgCisJMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDA5ZGUxZCwgMHgwMTkxZjY1ZiwgMHhlMDI3NzI1YywgMHhmY2RkMGIyOCwgMHhlMGY1ODEwNCwgMHhmODM5ODFhMSwgCisJMHhlOTVmNjE5YSwgMHgxNmEwOWU2NiwgMHhlNzQzN2Y5NSwgMHgxNDRjZjMyNSwgMHhlNTY0OTlkNywgMHgxMWM3M2IzYSwgMHhlM2M3NGQwZSwgMHgwZjE1YWU5YywgCisJMHgwYzNlZjE1MywgMHgxZDkwNmJjZiwgMHgwYWM3Y2QzYiwgMHgxZTIxMjEwNSwgMHgwOTRhMDMxNywgMHgxZTlmNDE1NywgMHgwN2M2N2U1ZiwgMHgxZjBhN2VmYywgCisJMHhlMjZmOTQzMSwgMHhmM2MxMGVhZCwgMHhlNDhkN2NiYiwgMHhlZjhjNzg2NywgMHhlNzQzN2Y5NSwgMHhlYmIzMGNkYiwgMHhlYTgyOTZjYiwgMHhlODRhMjBkZSwgCisJMHhlMjZmOTQzMSwgMHgwYzNlZjE1MywgMHhlMTYwYmVhOSwgMHgwOTRhMDMxNywgMHhlMDlkNjgzMCwgMHgwNjNlMmUwZiwgMHhlMDI3NzI1YywgMHgwMzIyZjRkOCwgCisJMHgwNjNlMmUwZiwgMHgxZjYyOTdkMCwgMHgwNGIyMDQxYywgMHgxZmE3NTU3ZiwgMHgwMzIyZjRkOCwgMHgxZmQ4OGRhNCwgMHgwMTkxZjY1ZiwgMHgxZmY2MjFlMywgCisJMHhlZTM4YzRjNiwgMHhlNTY0OTlkNywgMHhmMjUxNzdmYiwgMHhlMzEyODUwYywgMHhmNmI1ZmNlOSwgMHhlMTYwYmVhOSwgMHhmYjRkZmJlNCwgMHhlMDU4YWE4MSwgCisKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmQ4ODYxLCAweDAwYzkwYWIwLCAweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZTljZGFkLCAweDAyNWFhNDEyLCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmY2MjE3LCAweDAwNjQ4NzQ4LCAweDFmZmQ4ODYxLCAweDAwYzkwYWIwLCAweDFmZmE3MmYwLCAweDAxMmQ4NjU3LCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFmZmE3MmYwLCAweDAxMmQ4NjU3LCAweDFmZTljZGFkLCAweDAyNWFhNDEyLCAweDFmY2UxNWZkLCAweDAzODZmMGI5LCAKKwkweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmYzI2NDcxLCAweDAzZWFjOWNiLCAweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmODc2NGZhLCAweDA1Nzg4NTExLCAKKwkweDFmZjYyMWUzLCAweDAxOTFmNjVmLCAweDFmZjA5NTY2LCAweDAxZjY1NmU4LCAweDFmZTljZGFkLCAweDAyNWFhNDEyLCAweDFmZTFjYWZkLCAweDAyYmVkYTAxLCAKKwkweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmNzU5OWE0LCAweDA1ZGI3Njc4LCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFlZjE3OGE0LCAweDA4MjdkYzA3LCAKKwkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlZDc0MGU3LCAweDA4ODhlOTMxLCAKKwkweDFmZDg4ZGE0LCAweDAzMjJmNGQ4LCAweDFmY2UxNWZkLCAweDAzODZmMGI5LCAweDFmYzI2NDcxLCAweDAzZWFjOWNiLCAweDFmYjU3OTcyLCAweDA0NGU3YzM0LCAKKwkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlNDI2YTRiLCAweDBhNjhmMTIxLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LCAweDFkNjk2MTc0LCAweDBjOWI5NTMyLCAKKwkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlNjI4OGVjLCAweDBhMDlhZTRhLCAweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LCAKKwkweDFmYTc1NTdmLCAweDA0YjIwNDFjLCAweDFmOTdmOTI1LCAweDA1MTU1ZGFjLCAweDFmODc2NGZhLCAweDA1Nzg4NTExLCAweDFmNzU5OWE0LCAweDA1ZGI3Njc4LCAKKwkweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjNjc4YjM1LCAweDBlYmNiYmFlLCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiM2U0ZDNmLCAweDEwYzk3MDRkLCAKKwkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFkNDEzNGQxLCAweDBjZjdiY2EyLCAweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjOTU0YjIxLCAweDBlNjMzNzRkLCAKKwkweDFmNjI5N2QwLCAweDA2M2UyZTBmLCAweDFmNGU2MDNiLCAweDA2YTBhODA5LCAweDFmMzhmM2FjLCAweDA3MDJlMDliLCAweDFmMjI1MmY3LCAweDA3NjRkM2Y5LCAKKwkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDE5ZWY0M2VmLCAweDEyYmVkYjI2LCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LCAweDE4N2M0MDEwLCAweDE0OWE0NDljLCAKKwkweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAweDFiMDkwYTU4LCAweDExMWViMzU0LCAKKwkweDFmMGE3ZWZjLCAweDA3YzY3ZTVmLCAweDFlZjE3OGE0LCAweDA4MjdkYzA3LCAweDFlZDc0MGU3LCAweDA4ODhlOTMxLCAweDFlYmJkOGM5LCAweDA4ZTlhMjIwLCAKKwkweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE2ZTc0NDU1LCAweDE2NTkxOTI2LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1MzI4MjkzLCAweDE3ZjhlY2UzLCAKKwkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDFhMjlhN2EwLCAweDEyNmQwNTRkLCAweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LCAKKwkweDFlOWY0MTU3LCAweDA5NGEwMzE3LCAweDFlODE3YmFiLCAweDA5YWEwODYxLCAweDFlNjI4OGVjLCAweDBhMDlhZTRhLCAweDFlNDI2YTRiLCAweDBhNjhmMTIxLCAKKwkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzNjA1OGIxLCAweDE5Nzc3ZWY1LCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLCAweDExNzM0ZDY0LCAweDFhZDJiYzllLCAKKwkweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE4M2IwZTBjLCAweDE0ZTZjYWJjLCAweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE3MmQwODM4LCAweDE2MTBiNzU1LCAKKwkweDFlMjEyMTA1LCAweDBhYzdjZDNiLCAweDFkZmVhZTYyLCAweDBiMjYzZWVmLCAweDFkZGIxM2I3LCAweDBiODQ0Mjk4LCAweDFkYjY1MjYyLCAweDBiZTFkNDk5LCAKKwkweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmNmUwY2E5LCAweDFjMDhjNDI2LCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBkNTM2NDE2LCAweDFkMTdlNzc0LCAKKwkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE0ZTZjYWJjLCAweDE4M2IwZTBjLCAKKwkweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDFkNjk2MTc0LCAweDBjOWI5NTMyLCAweDFkNDEzNGQxLCAweDBjZjdiY2EyLCAweDFkMTdlNzc0LCAweDBkNTM2NDE2LCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiMjYzZWVmLCAweDFkZmVhZTYyLCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLCAweDA4ZTlhMjIwLCAweDFlYmJkOGM5LCAKKwkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzYWZmYTI5LCAweDE5M2EyMjRhLCAweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLCAKKwkweDFjZWQ3YWY0LCAweDBkYWU4ODA1LCAweDFjYzFmMGY0LCAweDBlMDkyNGVjLCAweDFjOTU0YjIxLCAweDBlNjMzNzRkLCAweDFjNjc4YjM1LCAweDBlYmNiYmFlLCAKKwkweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA2YTBhODA5LCAweDFmNGU2MDNiLCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA0NGU3YzM0LCAweDFmYjU3OTcyLCAKKwkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDExMWViMzU0LCAweDFiMDkwYTU4LCAweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDBmYzVkMjZlLCAweDFiZDdjMGFjLCAKKwkweDFjMzhiMmYyLCAweDBmMTVhZTljLCAweDFjMDhjNDI2LCAweDBmNmUwY2E5LCAweDFiZDdjMGFjLCAweDBmYzVkMjZlLCAweDFiYTVhYTY3LCAweDEwMWNmYzg3LCAKKwkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAxZjY1NmU4LCAweDFmZjA5NTY2LCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLCAweGZmOWI3OGI4LCAweDFmZmY2MjE3LCAKKwkweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAweDBjZjdiY2EyLCAweDFkNDEzNGQxLCAKKwkweDFiNzI4MzQ1LCAweDEwNzM4Nzk5LCAweDFiM2U0ZDNmLCAweDEwYzk3MDRkLCAweDFiMDkwYTU4LCAweDExMWViMzU0LCAweDFhZDJiYzllLCAweDExNzM0ZDY0LCAKKwkweGZlNmUwOWExLCAweDFmZjYyMWUzLCAweGZkNDEyNWZmLCAweDFmZTFjYWZkLCAweGZjMTUzNjM1LCAweDFmYzI2NDcxLCAweGZhZWFhMjU0LCAweDFmOTdmOTI1LCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiODQ0Mjk4LCAweDFkZGIxM2I3LCAweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLCAKKwkweDFhOWI2NjI5LCAweDExYzczYjNhLCAweDFhNjMwOTFiLCAweDEyMWE3OTk5LCAweDFhMjlhN2EwLCAweDEyNmQwNTRkLCAweDE5ZWY0M2VmLCAweDEyYmVkYjI2LCAKKwkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY4OWIyYzA3LCAweDFmMjI1MmY3LCAweGY3NzcxNmNmLCAweDFlZDc0MGU3LCAweGY2NTVmNzlmLCAweDFlODE3YmFiLCAKKwkweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA4ODhlOTMxLCAweDFlZDc0MGU3LCAweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA3MDJlMDliLCAweDFmMzhmM2FjLCAKKwkweDE5YjNlMDQ4LCAweDEzMGZmN2ZkLCAweDE5Nzc3ZWY1LCAweDEzNjA1OGIxLCAweDE5M2EyMjRhLCAweDEzYWZmYTI5LCAweDE4ZmJjY2E0LCAweDEzZmVkOTUzLCAKKwkweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGY0MWUyYjY3LCAweDFkYjY1MjYyLCAweGYzMDg0MzVlLCAweDFkNDEzNGQxLCAweGYxZjZkYjE0LCAweDFjYzFmMGY0LCAKKwkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDAzZWFjOWNiLCAweDFmYzI2NDcxLCAKKwkweDE4YmM4MDZiLCAweDE0NGNmMzI1LCAweDE4N2M0MDEwLCAweDE0OWE0NDljLCAweDE4M2IwZTBjLCAweDE0ZTZjYWJjLCAweDE3ZjhlY2UzLCAweDE1MzI4MjkzLCAKKwkweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGVmZTMwMzc5LCAweDFiYTVhYTY3LCAweGVlZTE0Y2FjLCAweDFiMDkwYTU4LCAweGVkZTU4NjY3LCAweDFhNjMwOTFiLCAKKwkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAyNWFhNDEyLCAweDFmZTljZGFkLCAweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLCAKKwkweDE3YjVkZjIyLCAweDE1N2Q2OTM1LCAweDE3NzFlNzVmLCAweDE1Yzc3YmJlLCAweDE3MmQwODM4LCAweDE2MTBiNzU1LCAweDE2ZTc0NDU1LCAweDE2NTkxOTI2LCAKKwkweGVjZjAwODAzLCAweDE5YjNlMDQ4LCAweGVjMDEyNmFkLCAweDE4ZmJjY2E0LCAweGViMTkzNTQ0LCAweDE4M2IwZTBjLCAweGVhMzg4NDQyLCAweDE3NzFlNzVmLCAKKwkweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGZmMzZmNTUwLCAweDFmZmQ4ODYxLCAweGZlNmUwOWExLCAweDFmZjYyMWUzLCAweGZkYTU1YmVlLCAweDFmZTljZGFkLCAKKwkweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDE2NTkxOTI2LCAweDE2ZTc0NDU1LCAweDE2MTBiNzU1LCAweDE3MmQwODM4LCAweDE1Yzc3YmJlLCAweDE3NzFlNzVmLCAKKwkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU4OGUxOGExLCAweDE1Yzc3YmJlLCAweGU3YzRmMWY0LCAweDE0ZTZjYWJjLCAweGU3MDQzMzVjLCAweDEzZmVkOTUzLCAKKwkweGZjZGQwYjI4LCAweDFmZDg4ZGE0LCAweGZjMTUzNjM1LCAweDFmYzI2NDcxLCAweGZiNGRmYmU0LCAweDFmYTc1NTdmLCAweGZhODc3YWVmLCAweDFmODc2NGZhLCAKKwkweDE1N2Q2OTM1LCAweDE3YjVkZjIyLCAweDE1MzI4MjkzLCAweDE3ZjhlY2UzLCAweDE0ZTZjYWJjLCAweDE4M2IwZTBjLCAweDE0OWE0NDljLCAweDE4N2M0MDEwLCAKKwkweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGU1OWNmNmU1LCAweDEyMWE3OTk5LCAweGU0ZjZmNWE4LCAweDExMWViMzU0LCAweGU0NWE1NTk5LCAweDEwMWNmYzg3LCAKKwkweGY5YzFkMWYxLCAweDFmNjI5N2QwLCAweGY4ZmQxZjY1LCAweDFmMzhmM2FjLCAweGY4Mzk4MWExLCAweDFmMGE3ZWZjLCAweGY3NzcxNmNmLCAweDFlZDc0MGU3LCAKKwkweDE0NGNmMzI1LCAweDE4YmM4MDZiLCAweDEzZmVkOTUzLCAweDE4ZmJjY2E0LCAweDEzYWZmYTI5LCAweDE5M2EyMjRhLCAweDEzNjA1OGIxLCAweDE5Nzc3ZWY1LCAKKwkweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUzM2UwZjBjLCAweDBlMDkyNGVjLCAweGUyYmVjYjJmLCAweDBjZjdiY2EyLCAweGUyNDlhZDllLCAweDBiZTFkNDk5LCAKKwkweGY2YjVmY2U5LCAweDFlOWY0MTU3LCAweGY1ZjY1MWI2LCAweDFlNjI4OGVjLCAweGY1MzgzMmM1LCAweDFlMjEyMTA1LCAweGY0N2JiZDY4LCAweDFkZGIxM2I3LCAKKwkweDEzMGZmN2ZkLCAweDE5YjNlMDQ4LCAweDEyYmVkYjI2LCAweDE5ZWY0M2VmLCAweDEyNmQwNTRkLCAweDFhMjlhN2EwLCAweDEyMWE3OTk5LCAweDFhNjMwOTFiLCAKKwkweGUxZGVkZWZiLCAweDBhYzdjZDNiLCAweGUxN2U4NDU1LCAweDA5YWEwODYxLCAweGUxMjhiZjE5LCAweDA4ODhlOTMxLCAweGUwZGRhZDA5LCAweDA3NjRkM2Y5LCAKKwkweGYzYzEwZWFkLCAweDFkOTA2YmNmLCAweGYzMDg0MzVlLCAweDFkNDEzNGQxLCAweGYyNTE3N2ZiLCAweDFjZWQ3YWY0LCAweGYxOWNjOGIzLCAweDFjOTU0YjIxLCAKKwkweDExYzczYjNhLCAweDFhOWI2NjI5LCAweDExNzM0ZDY0LCAweDFhZDJiYzllLCAweDExMWViMzU0LCAweDFiMDkwYTU4LCAweDEwYzk3MDRkLCAweDFiM2U0ZDNmLCAKKwkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwNjgwNmRiLCAweDA1MTU1ZGFjLCAweGUwM2Q5YjhmLCAweDAzZWFjOWNiLCAweGUwMWUzNTAzLCAweDAyYmVkYTAxLCAKKwkweGYwZWE1MTY0LCAweDFjMzhiMmYyLCAweGYwM2EyZDkyLCAweDFiZDdjMGFjLCAweGVmOGM3ODY3LCAweDFiNzI4MzQ1LCAweGVlZTE0Y2FjLCAweDFiMDkwYTU4LCAKKwkweDEwNzM4Nzk5LCAweDFiNzI4MzQ1LCAweDEwMWNmYzg3LCAweDFiYTVhYTY3LCAweDBmYzVkMjZlLCAweDFiZDdjMGFjLCAweDBmNmUwY2E5LCAweDFjMDhjNDI2LCAKKwkweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMDA5ZGU5LCAweDAwNjQ4NzQ4LCAweGUwMDI3NzlmLCAweGZmMzZmNTUwLCAweGUwMGY2YTlhLCAweGZlMDlhOTE4LCAKKwkweGVlMzhjNGM2LCAweDFhOWI2NjI5LCAweGVkOTJmYWIzLCAweDFhMjlhN2EwLCAweGVjZjAwODAzLCAweDE5YjNlMDQ4LCAweGVjNTAwNWQ3LCAweDE5M2EyMjRhLCAKKwkweDBmMTVhZTljLCAweDFjMzhiMmYyLCAweDBlYmNiYmFlLCAweDFjNjc4YjM1LCAweDBlNjMzNzRkLCAweDFjOTU0YjIxLCAweDBlMDkyNGVjLCAweDFjYzFmMGY0LCAKKwkweGUwMjc3MjVjLCAweGZjZGQwYjI4LCAweGUwNGE4NjhlLCAweGZiYjE4M2NjLCAweGUwNzg5YjA2LCAweGZhODc3YWVmLCAweGUwYjE5ZmM1LCAweGY5NWY1N2Y3LCAKKwkweGViYjMwY2RiLCAweDE4YmM4MDZiLCAweGViMTkzNTQ0LCAweDE4M2IwZTBjLCAweGVhODI5NmNiLCAweDE3YjVkZjIyLCAweGU5ZWY0OGFiLCAweDE3MmQwODM4LCAKKwkweDBkYWU4ODA1LCAweDFjZWQ3YWY0LCAweDBkNTM2NDE2LCAweDFkMTdlNzc0LCAweDBjZjdiY2EyLCAweDFkNDEzNGQxLCAweDBjOWI5NTMyLCAweDFkNjk2MTc0LCAKKwkweGUwZjU4MTA0LCAweGY4Mzk4MWExLCAweGUxNDQyNzM3LCAweGY3MTY1ZGUwLCAweGUxOWQ3NzE0LCAweGY1ZjY1MWI2LCAweGUyMDE1MTllLCAweGY0ZDljMTExLCAKKwkweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGU4ZDJmN2M4LCAweDE2MTBiNzU1LCAweGU4NGEyMGRlLCAweDE1N2Q2OTM1LCAweGU3YzRmMWY0LCAweDE0ZTZjYWJjLCAKKwkweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweDBiZTFkNDk5LCAweDFkYjY1MjYyLCAweDBiODQ0Mjk4LCAweDFkZGIxM2I3LCAweDBiMjYzZWVmLCAweDFkZmVhZTYyLCAKKwkweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAweGUyZTgxODhjLCAweGYyYWM5YmVhLCAweGUzNmFiNGRmLCAweGYxOWNjOGIzLCAweGUzZjczYmRhLCAweGYwOTFmMzU3LCAKKwkweGU3NDM3Zjk1LCAweDE0NGNmMzI1LCAweGU2YzVkZGI2LCAweDEzYWZmYTI5LCAweGU2NGMxZmI4LCAweDEzMGZmN2ZkLCAweGU1ZDY1ODYwLCAweDEyNmQwNTRkLCAKKwkweDBhYzdjZDNiLCAweDFlMjEyMTA1LCAweDBhNjhmMTIxLCAweDFlNDI2YTRiLCAweDBhMDlhZTRhLCAweDFlNjI4OGVjLCAweDA5YWEwODYxLCAweDFlODE3YmFiLCAKKwkweGU0OGQ3Y2JiLCAweGVmOGM3ODY3LCAweGU1MmQ0MzYyLCAweGVlOGNiMjljLCAweGU1ZDY1ODYwLCAweGVkOTJmYWIzLCAweGU2ODg4MTBiLCAweGVjOWZhNzRmLCAKKwkweGU1NjQ5OWQ3LCAweDExYzczYjNhLCAweGU0ZjZmNWE4LCAweDExMWViMzU0LCAweGU0OGQ3Y2JiLCAweDEwNzM4Nzk5LCAweGU0MjgzZjU0LCAweDBmYzVkMjZlLCAKKwkweDA5NGEwMzE3LCAweDFlOWY0MTU3LCAweDA4ZTlhMjIwLCAweDFlYmJkOGM5LCAweDA4ODhlOTMxLCAweDFlZDc0MGU3LCAweDA4MjdkYzA3LCAweDFlZjE3OGE0LCAKKwkweGU3NDM3Zjk1LCAweGViYjMwY2RiLCAweGU4MDcxMzFkLCAweGVhY2Q3ZDZkLCAweGU4ZDJmN2M4LCAweGU5ZWY0OGFiLCAweGU5YTZlNmRhLCAweGU5MThiYmFiLCAKKwkweGUzYzc0ZDBlLCAweDBmMTVhZTljLCAweGUzNmFiNGRmLCAweDBlNjMzNzRkLCAweGUzMTI4NTBjLCAweDBkYWU4ODA1LCAweGUyYmVjYjJmLCAweDBjZjdiY2EyLCAKKwkweDA3YzY3ZTVmLCAweDFmMGE3ZWZjLCAweDA3NjRkM2Y5LCAweDFmMjI1MmY3LCAweDA3MDJlMDliLCAweDFmMzhmM2FjLCAweDA2YTBhODA5LCAweDFmNGU2MDNiLCAKKwkweGVhODI5NmNiLCAweGU4NGEyMGRlLCAweGViNjViYjY0LCAweGU3ODNiZmYwLCAweGVjNTAwNWQ3LCAweGU2YzVkZGI2LCAweGVkNDEyNGRhLCAweGU2MTBiYzExLCAKKwkweGUyNmY5NDMxLCAweDBjM2VmMTUzLCAweGUyMjRlYzQ5LCAweDBiODQ0Mjk4LCAweGUxZGVkZWZiLCAweDBhYzdjZDNiLCAweGUxOWQ3NzE0LCAweDBhMDlhZTRhLCAKKwkweDA2M2UyZTBmLCAweDFmNjI5N2QwLCAweDA1ZGI3Njc4LCAweDFmNzU5OWE0LCAweDA1Nzg4NTExLCAweDFmODc2NGZhLCAweDA1MTU1ZGFjLCAweDFmOTdmOTI1LCAKKwkweGVlMzhjNGM2LCAweGU1NjQ5OWQ3LCAweGVmMzY4ZmIzLCAweGU0YzFiMmMxLCAweGYwM2EyZDkyLCAweGU0MjgzZjU0LCAweGYxNDM0NDUyLCAweGUzOTg3NGNiLCAKKwkweGUxNjBiZWE5LCAweDA5NGEwMzE3LCAweGUxMjhiZjE5LCAweDA4ODhlOTMxLCAweGUwZjU4MTA0LCAweDA3YzY3ZTVmLCAweGUwYzcwYzU0LCAweDA3MDJlMDliLCAKKwkweDA0YjIwNDFjLCAweDFmYTc1NTdmLCAweDA0NGU3YzM0LCAweDFmYjU3OTcyLCAweDAzZWFjOWNiLCAweDFmYzI2NDcxLCAweDAzODZmMGI5LCAweDFmY2UxNWZkLCAKKwkweGYyNTE3N2ZiLCAweGUzMTI4NTBjLCAweGYzNjQ2YWNlLCAweGUyOTY5ZThjLCAweGY0N2JiZDY4LCAweGUyMjRlYzQ5LCAweGY1OTcwZWRmLCAweGUxYmQ5NWI1LCAKKwkweGUwOWQ2ODMwLCAweDA2M2UyZTBmLCAweGUwNzg5YjA2LCAweDA1Nzg4NTExLCAweGUwNThhYTgxLCAweDA0YjIwNDFjLCAweGUwM2Q5YjhmLCAweDAzZWFjOWNiLCAKKwkweDAzMjJmNGQ4LCAweDFmZDg4ZGE0LCAweDAyYmVkYTAxLCAweDFmZTFjYWZkLCAweDAyNWFhNDEyLCAweDFmZTljZGFkLCAweDAxZjY1NmU4LCAweDFmZjA5NTY2LCAKKwkweGY2YjVmY2U5LCAweGUxNjBiZWE5LCAweGY3ZDgyM2Y5LCAweGUxMGU4NzVjLCAweGY4ZmQxZjY1LCAweGUwYzcwYzU0LCAweGZhMjQ4OTg4LCAweGUwOGE2NjVjLCAKKwkweGUwMjc3MjVjLCAweDAzMjJmNGQ4LCAweGUwMTYzMjUzLCAweDAyNWFhNDEyLCAweGUwMDlkZTFkLCAweDAxOTFmNjVmLCAweGUwMDI3NzlmLCAweDAwYzkwYWIwLCAKKwkweDAxOTFmNjVmLCAweDFmZjYyMWUzLCAweDAxMmQ4NjU3LCAweDFmZmE3MmYwLCAweDAwYzkwYWIwLCAweDFmZmQ4ODYxLCAweDAwNjQ4NzQ4LCAweDFmZmY2MjE3LCAKKwkweGZiNGRmYmU0LCAweGUwNThhYTgxLCAweGZjNzkwZjQ3LCAweGUwMzFlYTAzLCAweGZkYTU1YmVlLCAweGUwMTYzMjUzLCAweGZlZDI3OWE5LCAweGUwMDU4ZDEwDQorfTsNCisNCitjb25zdCBpbnQgdHdpZFRhYjY0WzQqNiArIDE2KjZdID0gew0KKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDAwMDAwMDAwLCAweDIwMDAwMDAwLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDFkOTA2YmNmLCAweDBjM2VmMTUzLCAweDE2YTA5ZTY2LCAweDE2YTA5ZTY2LCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAKKwkweDIwMDAwMDAwLCAweDAwMDAwMDAwLCAweDBjM2VmMTUzLCAweDFkOTA2YmNmLCAweGU5NWY2MTlhLCAweDE2YTA5ZTY2LCAweGUyNmY5NDMxLCAweGYzYzEwZWFkLCAKKworCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWZkODhkYTQsIDB4MDMyMmY0ZDgsIDB4MWY2Mjk3ZDAsIDB4MDYzZTJlMGYsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIAorCTB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MWU5ZjQxNTcsIDB4MDk0YTAzMTcsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIAorCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIAorCTB4MWQ5MDZiY2YsIDB4MGMzZWYxNTMsIDB4MWMzOGIyZjIsIDB4MGYxNWFlOWMsIDB4MWE5YjY2MjksIDB4MTFjNzNiM2EsIDB4MThiYzgwNmIsIDB4MTQ0Y2YzMjUsIAorCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjBlYTUxNjQsIDB4MWMzOGIyZjIsIAorCTB4MDAwMDAwMDAsIDB4MjAwMDAwMDAsIDB4ZjljMWQxZjEsIDB4MWY2Mjk3ZDAsIDB4ZjNjMTBlYWQsIDB4MWQ5MDZiY2YsIDB4ZWUzOGM0YzYsIDB4MWE5YjY2MjksIAorCTB4MTZhMDllNjYsIDB4MTZhMDllNjYsIDB4MTQ0Y2YzMjUsIDB4MThiYzgwNmIsIDB4MTFjNzNiM2EsIDB4MWE5YjY2MjksIDB4MGYxNWFlOWMsIDB4MWMzOGIyZjIsIAorCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTNjNzRkMGUsIDB4MGYxNWFlOWMsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIDB4ZTAyNzcyNWMsIDB4ZmNkZDBiMjgsIAorCTB4ZTk1ZjYxOWEsIDB4MTZhMDllNjYsIDB4ZTU2NDk5ZDcsIDB4MTFjNzNiM2EsIDB4ZTI2Zjk0MzEsIDB4MGMzZWYxNTMsIDB4ZTA5ZDY4MzAsIDB4MDYzZTJlMGYsIAorCTB4MGMzZWYxNTMsIDB4MWQ5MDZiY2YsIDB4MDk0YTAzMTcsIDB4MWU5ZjQxNTcsIDB4MDYzZTJlMGYsIDB4MWY2Mjk3ZDAsIDB4MDMyMmY0ZDgsIDB4MWZkODhkYTQsIAorCTB4ZTI2Zjk0MzEsIDB4ZjNjMTBlYWQsIDB4ZTc0MzdmOTUsIDB4ZWJiMzBjZGIsIDB4ZWUzOGM0YzYsIDB4ZTU2NDk5ZDcsIDB4ZjZiNWZjZTksIDB4ZTE2MGJlYTkNCit9Ow0KKw0KKyNlbHNlCisKKy8qIA0KKyAqICBRMzAgZm9yIDEyOCBhbmQgMTAyNCANCisgKg0KKyAqIGZvciAoaSA9IDA7IGkgPCBudW0vNDsgaSsrKSB7DQorICogICBhbmdsZSA9IChpICsgMC4xMjUpICogTV9QSSAvIG51bTsNCisgKiAgIHggPSBjb3MoYW5nbGUpICogKDEgPDwgMzApOw0KKyAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAzMCk7DQorICogDQorICogICBhbmdsZSA9IChudW0vMiAtIDEgLSBpICsgMC4xMjUpICogTV9QSSAvIG51bTsNCisgKiAgIHggPSBjb3MoYW5nbGUpICogKDEgPDwgMzApOw0KKyAqICAgeCA9IHNpbihhbmdsZSkgKiAoMSA8PCAzMCk7DQorICogfQ0KKyAqLw0KK2NvbnN0IGludCBjb3NzaW50YWJbMTI4ICsgMTAyNF0gPSB7DQorCS8qIDEyOCAqLw0KKwkweDNmZmZlYzQzLCAweDAwMzI0M2YxLCAweDAxNWZkNGQyLCAweDNmZmMzOGQxLCAweDNmZjljMTNhLCAweDAxYzQ1NGY1LCAweDAyZjFiNzU1LCAweDNmZWVhNzc2LCANCisJMHgzZmU5YjhhOSwgMHgwMzU2MjAzOCwgMHgwNDgzMjU5ZCwgMHgzZmQ3M2E0YSwgMHgzZmNmZDUwYiwgMHgwNGU3NjdjNSwgMHgwNjEzZTFjNSwgMHgzZmI1ZjRlYSwgDQorCTB4M2ZhYzFhNWIsIDB4MDY3N2VkYmIsIDB4MDdhM2FkZmYsIDB4M2Y4YWRjNzcsIDB4M2Y3ZThlMWUsIDB4MDgwNzc0NTcsIDB4MDkzMjRjYTcsIDB4M2Y1NWY3OTYsIA0KKwkweDNmNDczNzU5LCAweDA5OTViZGZkLCAweDBhYmY4MDQzLCAweDNmMTc0ZTcwLCAweDNmMDYxZTk1LCAweDBiMjI4ZDQyLCAweDBjNGIwYjk0LCAweDNlY2VlYWFkLCANCisJMHgzZWJiNGRkYiwgMHgwY2FkYTRmNSwgMHgwZGQ0YjE5YSwgMHgzZTdjZDc3OCwgMHgzZTY2ZDBiNCwgMHgwZTM2YzgyYSwgMHgwZjVjMzVhMywgMHgzZTIxMjE3OSwgDQorCTB4M2UwOGI0MmEsIDB4MGZiZGJhNDAsIDB4MTBlMTViNGUsIDB4M2RiYmQ2ZDQsIDB4M2RhMTA2YmQsIDB4MTE0MjNlZjAsIDB4MTI2M2U2OTksIDB4M2Q0ZDA3MjgsIA0KKwkweDNkMmZkODZjLCAweDEyYzQxYTRmLCAweDEzZTM5YmU5LCAweDNjZDRjMzhiLCAweDNjYjUzYWFhLCAweDE0NDMxMGRkLCAweDE1NjA0MDEzLCAweDNjNTMxZTg4LCANCisJMHgzYzMxNDA2MCwgMHgxNWJlZTc4YywgMHgxNmQ5OTg2NCwgMHgzYmM4MmMxZiwgMHgzYmEzZmRlNywgMHgxNzM3NjNjOSwgMHgxODRmNmFhYiwgMHgzYjM0MDFiYiwgDQorCTB4M2IwZDg5MDksIDB4MThhYzRiODcsIDB4MTljMTdkNDQsIDB4M2E5NmI2MzYsIDB4M2E2ZGY4ZjgsIDB4MWExZDY1NDQsIDB4MWIyZjk3MWUsIDB4MzlmMDYxZDIsIA0KKwkweDM5YzU2NjRmLCAweDFiOGE3ODE1LCAweDFjOTk3ZmM0LCAweDM5NDExZTMzLCAweDM5MTNlYjBlLCAweDFjZjM0YmFmLCAweDFkZmVmZjY3LCAweDM4ODkwNjYzLCANCisJMHgzODU5YTI5MiwgMHgxZTU3YTg2ZCwgMHgxZjVmZGVlNiwgMHgzN2M4MzZjMiwgMHgzNzk2YTk5NiwgMHgxZmI3NTc1YywgMHgyMGJiZTdkOCwgMHgzNmZlY2QwZSwgDQorCTB4MzZjYjFlMmEsIDB4MjExMjIyNDAsIDB4MjIxMmU0OTIsIDB4MzYyY2U4NTUsIDB4MzVmNzFmYjEsIDB4MjI2N2QzYTAsIDB4MjM2NGEwMmUsIDB4MzU1MmE4ZjQsIA0KKwkweDM1MWFjZWRkLCAweDIzYjgzNmNhLCAweDI0YjBlNjk5LCAweDM0NzAzMDk1LCAweDM0MzY0ZGE2LCAweDI1MDMxN2RmLCAweDI1Zjc4NDk3LCAweDMzODVhMjIyLCANCisJMHgzMzQ5YmY0OCwgMHgyNjQ4NDNkOSwgMHgyNzM4NDdjOCwgMHgzMjkzMjFjNywgMHgzMjU1NDg0MCwgMHgyNzg3ODg5MywgMHgyODcyZmViNiwgMHgzMTk4ZDRlYSwgDQorCTB4MzE1OTBlM2UsIDB4MjhjMGI0ZDIsIDB4MjlhNzc4ZGIsIDB4MzA5NmUyMjMsIDB4MzA1NTM4MjgsIDB4MjlmMzk4NGMsIDB4MmFkNTg2YTMsIDB4MmY4ZDcxM2EsIA0KKwkweDJmNDllZTBmLCAweDJiMjAwM2FjLCAweDJiZmNmOTdjLCAweDJlN2NhYjFjLCAweDJlMzc1OTJjLCAweDJjNDVjOGEwLCAweDJkMWRhM2Q1LCAweDJkNjRiOWRhLCANCisJLyogMTAyNCAqLw0KKwkweDNmZmZmZmIxLCAweDAwMDY0ODdmLCAweDAwMmJmYjc0LCAweDNmZmZmMGUzLCAweDNmZmZlNzA1LCAweDAwMzg4YzZlLCAweDAwNWUzZjRjLCAweDNmZmZiYTliLCANCisJMHgzZmZmYTZkZSwgMHgwMDZhZDAzYiwgMHgwMDkwODJlYSwgMHgzZmZmNWNkOCwgMHgzZmZmM2YzYywgMHgwMDlkMTNjNSwgMHgwMGMyYzYyZiwgMHgzZmZlZDc5YiwgDQorCTB4M2ZmZWIwMjEsIDB4MDBjZjU2ZWYsIDB4MDBmNTA4ZmMsIDB4M2ZmZTJhZTUsIDB4M2ZmZGY5OGMsIDB4MDEwMTk5OTgsIDB4MDEyNzRiMzEsIDB4M2ZmZDU2YjUsIA0KKwkweDNmZmQxYjdlLCAweDAxMzNkYmEzLCAweDAxNTk4Y2IxLCAweDNmZmM1YjBjLCAweDNmZmMxNWY3LCAweDAxNjYxY2YwLCAweDAxOGJjZDViLCAweDNmZmIzN2VjLCANCisJMHgzZmZhZThmOSwgMHgwMTk4NWQ2MCwgMHgwMWJlMGQxMSwgMHgzZmY5ZWQ1MywgMHgzZmY5OTQ4MywgMHgwMWNhOWNkNCwgMHgwMWYwNGJiNCwgMHgzZmY4N2I0NCwgDQorCTB4M2ZmODE4OTYsIDB4MDFmY2RiMmUsIDB4MDIyMjg5MjQsIDB4M2ZmNmUxYmYsIDB4M2ZmNjc1MzQsIDB4MDIyZjE4NGQsIDB4MDI1NGM1NDQsIDB4M2ZmNTIwYzUsIA0KKwkweDNmZjRhYTVkLCAweDAyNjE1NDE0LCAweDAyODZmZmYzLCAweDNmZjMzODU4LCAweDNmZjJiODEzLCAweDAyOTM4ZTYyLCAweDAyYjkzOTE0LCAweDNmZjEyODc4LCANCisJMHgzZmYwOWU1NiwgMHgwMmM1YzcxYSwgMHgwMmViNzA4NiwgMHgzZmVlZjEyNiwgMHgzZmVlNWQyOCwgMHgwMmY3ZmUxYywgMHgwMzFkYTYyYiwgMHgzZmVjOTI2NSwgDQorCTB4M2ZlYmY0OGIsIDB4MDMyYTMzNDksIDB4MDM0ZmQ5ZTUsIDB4M2ZlYTBjMzUsIDB4M2ZlOTY0ODAsIDB4MDM1YzY2ODIsIDB4MDM4MjBiOTMsIDB4M2ZlNzVlOTgsIA0KKwkweDNmZTZhZDA4LCAweDAzOGU5N2E5LCAweDAzYjQzYjE3LCAweDNmZTQ4OTkwLCAweDNmZTNjZTI2LCAweDAzYzBjNjllLCAweDAzZTY2ODUyLCAweDNmZTE4ZDFmLCANCisJMHgzZmUwYzdkYSwgMHgwM2YyZjM0MiwgMHgwNDE4OTMyNiwgMHgzZmRlNjk0NSwgMHgzZmRkOWEyNywgMHgwNDI1MWQ3NywgMHgwNDRhYmI3MywgMHgzZmRiMWUwNiwgDQorCTB4M2ZkYTQ1MGYsIDB4MDQ1NzQ1MWQsIDB4MDQ3Y2UxMWEsIDB4M2ZkN2FiNjQsIDB4M2ZkNmM4OTQsIDB4MDQ4OTZhMTYsIDB4MDRhZjAzZmMsIDB4M2ZkNDExNWYsIA0KKwkweDNmZDMyNGI3LCAweDA0YmI4YzQyLCAweDA0ZTEyM2ZhLCAweDNmZDA0ZmZjLCAweDNmY2Y1OTdjLCAweDA0ZWRhYjgzLCAweDA1MTM0MGY2LCAweDNmY2M2NzNiLCANCisJMHgzZmNiNjZlNCwgMHgwNTFmYzdiOSwgMHgwNTQ1NWFkMSwgMHgzZmM4NTcxZiwgMHgzZmM3NGNmMywgMHgwNTUxZTBjNywgMHgwNTc3NzE2YiwgMHgzZmM0MWZhYywgDQorCTB4M2ZjMzBiYWEsIDB4MDU4M2Y2OGMsIDB4MDVhOTg0YTYsIDB4M2ZiZmMwZTMsIDB4M2ZiZWEzMGMsIDB4MDViNjA4ZWIsIDB4MDVkYjk0NjMsIDB4M2ZiYjNhYzcsIA0KKwkweDNmYmExMzFiLCAweDA1ZTgxN2MzLCAweDA2MGRhMDgzLCAweDNmYjY4ZDViLCAweDNmYjU1YmRjLCAweDA2MWEyMmY3LCAweDA2M2ZhOGU3LCAweDNmYjFiOGEyLCANCisJMHgzZmIwN2Q1MCwgMHgwNjRjMmE2NywgMHgwNjcxYWQ3MSwgMHgzZmFjYmM5ZiwgMHgzZmFiNzc3YiwgMHgwNjdlMmRmNSwgMHgwNmEzYWUwMCwgMHgzZmE3OTk1NCwgDQorCTB4M2ZhNjRhNWYsIDB4MDZiMDJkODEsIDB4MDZkNWFhNzcsIDB4M2ZhMjRlYzYsIDB4M2ZhMGY2MDAsIDB4MDZlMjI4ZWUsIDB4MDcwN2EyYjcsIDB4M2Y5Y2RjZjcsIA0KKwkweDNmOWI3YTYyLCAweDA3MTQyMDFiLCAweDA3Mzk5NmExLCAweDNmOTc0M2ViLCAweDNmOTVkNzg3LCAweDA3NDYxMmViLCAweDA3NmI4NjE2LCAweDNmOTE4M2E1LCANCisJMHgzZjkwMGQ3MiwgMHgwNzc4MDEzZCwgMHgwNzlkNzBmNywgMHgzZjhiOWMyOCwgMHgzZjhhMWMyOSwgMHgwN2E5ZWFmNSwgMHgwN2NmNTcyNiwgMHgzZjg1OGQ3OSwgDQorCTB4M2Y4NDAzYWUsIDB4MDdkYmNmZjIsIDB4MDgwMTM4ODMsIDB4M2Y3ZjU3OWIsIDB4M2Y3ZGM0MDUsIDB4MDgwZGIwMTYsIDB4MDgzMzE0ZjEsIDB4M2Y3OGZhOTIsIA0KKwkweDNmNzc1ZDMxLCAweDA4M2Y4YjQzLCAweDA4NjRlYzRmLCAweDNmNzI3NjYxLCAweDNmNzBjZjM4LCAweDA4NzE2MTU5LCAweDA4OTZiZTgwLCAweDNmNmJjYjBlLCANCisJMHgzZjZhMWExYywgMHgwOGEzMzIzYSwgMHgwOGM4OGI2NSwgMHgzZjY0Zjg5YiwgMHgzZjYzM2RlMiwgMHgwOGQ0ZmRjNiwgMHgwOGZhNTJkZSwgMHgzZjVkZmYwZSwgDQorCTB4M2Y1YzNhOGYsIDB4MDkwNmMzZTAsIDB4MDkyYzE0Y2UsIDB4M2Y1NmRlNmEsIDB4M2Y1NTEwMjYsIDB4MDkzODg0NjksIDB4MDk1ZGQxMTYsIDB4M2Y0Zjk2YjQsIA0KKwkweDNmNGRiZWFjLCAweDA5NmEzZjQyLCAweDA5OGY4Nzk2LCAweDNmNDgyN2YwLCAweDNmNDY0NjI2LCAweDA5OWJmNDRjLCAweDA5YzEzODMxLCAweDNmNDA5MjIzLCANCisJMHgzZjNlYTY5NywgMHgwOWNkYTM2OCwgMHgwOWYyZTJjNywgMHgzZjM4ZDU1MiwgMHgzZjM2ZTAwNiwgMHgwOWZmNGM3OCwgMHgwYTI0ODczYSwgMHgzZjMwZjE4MSwgDQorCTB4M2YyZWYyNzYsIDB4MGEzMGVmNWUsIDB4MGE1NjI1NmMsIDB4M2YyOGU2YjYsIDB4M2YyNmRkZWMsIDB4MGE2MjhiZmEsIDB4MGE4N2JkM2QsIDB4M2YyMGI0ZjUsIA0KKwkweDNmMWVhMjZlLCAweDBhOTQyMjJmLCAweDBhYjk0ZThmLCAweDNmMTg1YzQzLCAweDNmMTY0MDAxLCAweDBhYzViMWRjLCAweDBhZWFkOTQ0LCAweDNmMGZkY2E1LCANCisJMHgzZjBkYjZhOSwgMHgwYWY3M2FlNSwgMHgwYjFjNWQzZCwgMHgzZjA3MzYyMSwgMHgzZjA1MDY2ZCwgMHgwYjI4YmQyYSwgMHgwYjRkZGE1YywgMHgzZWZlNjhiYywgDQorCTB4M2VmYzJmNTAsIDB4MGI1YTM4OGQsIDB4MGI3ZjUwODEsIDB4M2VmNTc0N2IsIDB4M2VmMzMxNWEsIDB4MGI4YmFjZjAsIDB4MGJiMGJmOGYsIDB4M2VlYzU5NjUsIA0KKwkweDNlZWEwYzhlLCAweDBiYmQxYTMzLCAweDBiZTIyNzY2LCAweDNlZTMxNzdlLCAweDNlZTBjMGY0LCAweDBiZWU4MDM4LCAweDBjMTM4N2U5LCAweDNlZDlhZWNjLCANCisJMHgzZWQ3NGU5MSwgMHgwYzFmZGVlMSwgMHgwYzQ0ZTBmOSwgMHgzZWQwMWY1NSwgMHgzZWNkYjU2YSwgMHgwYzUxMzYxMCwgMHgwYzc2MzI3OCwgMHgzZWM2NjkyMCwgDQorCTB4M2VjM2Y1ODUsIDB4MGM4Mjg1YTUsIDB4MGNhNzdjNDcsIDB4M2ViYzhjMzEsIDB4M2ViYTBlZTksIDB4MGNiM2NkODQsIDB4MGNkOGJlNDcsIDB4M2ViMjg4OGYsIA0KKwkweDNlYjAwMTljLCAweDBjZTUwZDhjLCAweDBkMDlmODViLCAweDNlYTg1ZTQxLCAweDNlYTVjZGEzLCAweDBkMTY0NWEwLCAweDBkM2IyYTY0LCAweDNlOWUwZDRjLCANCisJMHgzZTliNzMwNiwgMHgwZDQ3NzVhMSwgMHgwZDZjNTQ0MywgMHgzZTkzOTViNywgMHgzZTkwZjFjYSwgMHgwZDc4OWQ3MSwgMHgwZDlkNzVkYiwgMHgzZTg4Zjc4OCwgDQorCTB4M2U4NjQ5ZjUsIDB4MGRhOWJjZjIsIDB4MGRjZThmMGQsIDB4M2U3ZTMyYzYsIDB4M2U3YjdiOTAsIDB4MGRkYWQ0MDYsIDB4MGRmZjlmYmEsIDB4M2U3MzQ3NzgsIA0KKwkweDNlNzA4NjlmLCAweDBlMGJlMjhlLCAweDBlMzBhN2M1LCAweDNlNjgzNWE0LCAweDNlNjU2YjJiLCAweDBlM2NlODZiLCAweDBlNjFhNzBmLCAweDNlNWNmZDUxLCANCisJMHgzZTVhMjkzOSwgMHgwZTZkZTU4MCwgMHgwZTkyOWQ3YSwgMHgzZTUxOWU4NiwgMHgzZTRlYzBkMSwgMHgwZTllZDlhZiwgMHgwZWMzOGFlOCwgMHgzZTQ2MTk0YSwgDQorCTB4M2U0MzMxZmEsIDB4MGVjZmM0ZDksIDB4MGVmNDZmM2IsIDB4M2UzYTZkYTQsIDB4M2UzNzdjYmIsIDB4MGYwMGE2ZGYsIDB4MGYyNTRhNTMsIDB4M2UyZTliOWMsIA0KKwkweDNlMmJhMTFiLCAweDBmMzE3ZmE1LCAweDBmNTYxYzE1LCAweDNlMjJhMzM4LCAweDNlMWY5ZjIxLCAweDBmNjI0ZjBjLCAweDBmODZlNDYwLCAweDNlMTY4NDgwLCANCisJMHgzZTEzNzZkNSwgMHgwZjkzMTRmNSwgMHgwZmI3YTMxNywgMHgzZTBhM2Y3YiwgMHgzZTA3MjgzZiwgMHgwZmMzZDE0MywgMHgwZmU4NTgxZCwgMHgzZGZkZDQzMiwgDQorCTB4M2RmYWIzNjUsIDB4MGZmNDgzZDcsIDB4MTAxOTAzNTIsIDB4M2RmMTQyYWIsIDB4M2RlZTE4NTEsIDB4MTAyNTJjOTQsIDB4MTA0OWE0OWEsIDB4M2RlNDhhZWYsIA0KKwkweDNkZTE1NzA4LCAweDEwNTVjYjViLCAweDEwN2EzYmQ1LCAweDNkZDdhZDA1LCAweDNkZDQ2Zjk0LCAweDEwODY2MDBlLCAweDEwYWFjOGU2LCAweDNkY2FhOGY1LCANCisJMHgzZGM3NjFmYywgMHgxMGI2ZWE5MCwgMHgxMGRiNGJhZiwgMHgzZGJkN2VjNywgMHgzZGJhMmU0OCwgMHgxMGU3NmFjMywgMHgxMTBiYzQxMywgMHgzZGIwMmU4NCwgDQorCTB4M2RhY2Q0ODEsIDB4MTExN2UwODgsIDB4MTEzYzMxZjMsIDB4M2RhMmI4MzQsIDB4M2Q5ZjU0YWYsIDB4MTE0ODRiYzIsIDB4MTE2Yzk1MzEsIDB4M2Q5NTFiZGUsIA0KKwkweDNkOTFhZWQ5LCAweDExNzhhYzUzLCAweDExOWNlZGFmLCAweDNkODc1OThjLCAweDNkODNlMzA5LCAweDExYTkwMjFkLCAweDExY2QzYjUwLCAweDNkNzk3MTQ1LCANCisJMHgzZDc1ZjE0NywgMHgxMWQ5NGQwMiwgMHgxMWZkN2RmNiwgMHgzZDZiNjMxMywgMHgzZDY3ZDk5YiwgMHgxMjA5OGNlNSwgMHgxMjJkYjU4MywgMHgzZDVkMmVmZSwgDQorCTB4M2Q1OTljMGUsIDB4MTIzOWMxYTcsIDB4MTI1ZGUxZGEsIDB4M2Q0ZWQ1MGYsIDB4M2Q0YjM4YWEsIDB4MTI2OWViMmIsIDB4MTI4ZTAyZGMsIDB4M2Q0MDU1NGUsIA0KKwkweDNkM2NhZjc2LCAweDEyOWEwOTU0LCAweDEyYmUxODZjLCAweDNkMzFhZmM1LCAweDNkMmUwMDdjLCAweDEyY2ExYzAzLCAweDEyZWUyMjZjLCAweDNkMjJlNDdjLCANCisJMHgzZDFmMmJjNSwgMHgxMmZhMjMxYiwgMHgxMzFlMjBjMCwgMHgzZDEzZjM3ZSwgMHgzZDEwMzE1YSwgMHgxMzJhMWU3ZSwgMHgxMzRlMTM0OCwgMHgzZDA0ZGNkMiwgDQorCTB4M2QwMTExNDUsIDB4MTM1YTBlMGUsIDB4MTM3ZGY5ZTcsIDB4M2NmNWEwODIsIDB4M2NmMWNiOGUsIDB4MTM4OWYxYWYsIDB4MTNhZGQ0ODEsIDB4M2NlNjNlOTgsIA0KKwkweDNjZTI2MDNmLCAweDEzYjljOTQzLCAweDEzZGRhMmY3LCAweDNjZDZiNzFlLCAweDNjZDJjZjYyLCAweDEzZTk5NGFiLCAweDE0MGQ2NTJjLCAweDNjYzcwYTFjLCANCisJMHgzY2MzMThmZiwgMHgxNDE5NTNjYiwgMHgxNDNkMWIwMiwgMHgzY2I3Mzc5YywgMHgzY2IzM2QyMiwgMHgxNDQ5MDY4NSwgMHgxNDZjYzQ1YywgMHgzY2E3M2ZhOSwgDQorCTB4M2NhMzNiZDMsIDB4MTQ3OGFjYmMsIDB4MTQ5YzYxMWQsIDB4M2M5NzIyNGMsIDB4M2M5MzE1MWQsIDB4MTRhODQ2NTIsIDB4MTRjYmYxMjcsIDB4M2M4NmRmOGUsIA0KKwkweDNjODJjOTA5LCAweDE0ZDdkMzJhLCAweDE0ZmI3NDVlLCAweDNjNzY3NzdiLCAweDNjNzI1N2EyLCAweDE1MDc1MzI3LCAweDE1MmFlYWEzLCAweDNjNjVlYTFjLCANCisJMHgzYzYxYzBmMSwgMHgxNTM2YzYyYiwgMHgxNTVhNTNkOSwgMHgzYzU1Mzc3YiwgMHgzYzUxMDUwMSwgMHgxNTY2MmMxOCwgMHgxNTg5YWZlMywgMHgzYzQ0NWZhMiwgDQorCTB4M2M0MDIzZGQsIDB4MTU5NTg0ZDMsIDB4MTViOGZlYTQsIDB4M2MzMzYyOWQsIDB4M2MyZjFkOGUsIDB4MTVjNGQwM2UsIDB4MTVlODNmZmYsIDB4M2MyMjQwNzUsIA0KKwkweDNjMWRmMjFmLCAweDE1ZjQwZTNhLCAweDE2MTc3M2Q2LCAweDNjMTBmOTM1LCAweDNjMGNhMTliLCAweDE2MjMzZWFjLCAweDE2NDY5YTBkLCAweDNiZmY4Y2U4LCANCisJMHgzYmZiMmMwYywgMHgxNjUyNjE3NiwgMHgxNjc1YjI4NiwgMHgzYmVkZmI5OSwgMHgzYmU5OTE3ZSwgMHgxNjgxNzY3YywgMHgxNmE0YmQyNSwgMHgzYmRjNDU1MiwgDQorCTB4M2JkN2QxZmEsIDB4MTZiMDdkOWYsIDB4MTZkM2I5Y2MsIDB4M2JjYTZhMWQsIDB4M2JjNWVkOGQsIDB4MTZkZjc2YzMsIDB4MTcwMmE4NWUsIDB4M2JiODZhMDgsIA0KKwkweDNiYjNlNDQwLCAweDE3MGU2MWNjLCAweDE3MzE4OGJlLCAweDNiYTY0NTFiLCAweDNiYTFiNjIwLCAweDE3M2QzZTliLCAweDE3NjA1YWQwLCAweDNiOTNmYjYzLCANCisJMHgzYjhmNjMzNywgMHgxNzZjMGQxNSwgMHgxNzhmMWU3NiwgMHgzYjgxOGNlYiwgMHgzYjdjZWI5MCwgMHgxNzlhY2QxYywgMHgxN2JkZDM5NCwgMHgzYjZlZjliZSwgDQorCTB4M2I2YTRmMzgsIDB4MTdjOTdlOTMsIDB4MTdlYzdhMGQsIDB4M2I1YzQxZTgsIDB4M2I1NzhlMzksIDB4MTdmODIxNWUsIDB4MTgxYjExYzQsIDB4M2I0OTY1NzQsIA0KKwkweDNiNDRhOGEwLCAweDE4MjZiNTYxLCAweDE4NDk5YTlkLCAweDNiMzY2NDZlLCAweDNiMzE5ZTc3LCAweDE4NTUzYTdkLCAweDE4NzgxNDdhLCAweDNiMjMzZWUxLCANCisJMHgzYjFlNmZjYSwgMHgxODgzYjA5NywgMHgxOGE2N2YzZiwgMHgzYjBmZjRkOSwgMHgzYjBiMWNhNiwgMHgxOGIyMTc5MSwgMHgxOGQ0ZGFkMCwgMHgzYWZjODY2MywgDQorCTB4M2FmN2E1MTYsIDB4MThlMDZmNTAsIDB4MTkwMzI3MGYsIDB4M2FlOGYzOGIsIDB4M2FlNDA5MjYsIDB4MTkwZWI3YjcsIDB4MTkzMTYzZTEsIDB4M2FkNTNjNWIsIA0KKwkweDNhZDA0OGUzLCAweDE5M2NmMGE5LCAweDE5NWY5MTI4LCAweDNhYzE2MGUxLCAweDNhYmM2NDU4LCAweDE5NmIxYTA5LCAweDE5OGRhZWM4LCAweDNhYWQ2MTI5LCANCisJMHgzYWE4NWI5MiwgMHgxOTk5MzNiYiwgMHgxOWJiYmNhNiwgMHgzYTk5M2QzZSwgMHgzYTk0MmU5ZCwgMHgxOWM3M2RhMywgMHgxOWU5YmFhMywgMHgzYTg0ZjUyZiwgDQorCTB4M2E3ZmRkODYsIDB4MTlmNTM3YTQsIDB4MWExN2E4YTUsIDB4M2E3MDg5MDYsIDB4M2E2YjY4NTksIDB4MWEyMzIxYTIsIDB4MWE0NTg2OGUsIDB4M2E1YmY4ZDEsIA0KKwkweDNhNTZjZjIzLCAweDFhNTBmYjgxLCAweDFhNzM1NDQyLCAweDNhNDc0NDljLCAweDNhNDIxMWYwLCAweDFhN2VjNTI0LCAweDFhYTExMWE2LCAweDNhMzI2Yzc0LCANCisJMHgzYTJkMzBjZCwgMHgxYWFjN2U2ZiwgMHgxYWNlYmU5ZCwgMHgzYTFkNzA2NiwgMHgzYTE4MmJjOCwgMHgxYWRhMjc0NiwgMHgxYWZjNWIwYSwgMHgzYTA4NTA3ZiwgDQorCTB4M2EwMzAyZWQsIDB4MWIwN2JmOGMsIDB4MWIyOWU2ZDIsIDB4MzlmMzBjY2MsIDB4MzllZGI2NDksIDB4MWIzNTQ3MjcsIDB4MWI1NzYxZDgsIDB4MzlkZGE1NWEsIA0KKwkweDM5ZDg0NWU5LCAweDFiNjJiZGY4LCAweDFiODRjYzAxLCAweDM5YzgxYTM2LCAweDM5YzJiMWRhLCAweDFiOTAyM2U1LCAweDFiYjIyNTMwLCAweDM5YjI2YjZkLCANCisJMHgzOWFjZmEyYiwgMHgxYmJkNzhkMiwgMHgxYmRmNmQ0YSwgMHgzOTljOTkwZCwgMHgzOTk3MWVlNywgMHgxYmVhYmNhMSwgMHgxYzBjYTQzMiwgMHgzOTg2YTMyNCwgDQorCTB4Mzk4MTIwMWUsIDB4MWMxN2VmMzksIDB4MWMzOWM5Y2QsIDB4Mzk3MDg5YmYsIDB4Mzk2YWZkZGMsIDB4MWM0NTEwN2MsIDB4MWM2NmRkZmUsIDB4Mzk1YTRjZWIsIA0KKwkweDM5NTRiODJlLCAweDFjNzIyMDRmLCAweDFjOTNlMGFiLCAweDM5NDNlY2I2LCAweDM5M2U0ZjIzLCAweDFjOWYxZTk2LCAweDFjYzBkMWI2LCAweDM5MmQ2OTJmLCANCisJMHgzOTI3YzJjOSwgMHgxY2NjMGIzNSwgMHgxY2VkYjEwNiwgMHgzOTE2YzI2MiwgMHgzOTExMTMyZCwgMHgxY2Y4ZTYxMSwgMHgxZDFhN2U3ZCwgMHgzOGZmZjg1ZSwgDQorCTB4MzhmYTQwNWUsIDB4MWQyNWFmMGQsIDB4MWQ0NzNhMDAsIDB4MzhlOTBiMzEsIDB4MzhlMzRhNjksIDB4MWQ1MjY2MGYsIDB4MWQ3M2UzNzQsIDB4MzhkMWZhZTksIA0KKwkweDM4Y2MzMTVkLCAweDFkN2YwYWZiLCAweDFkYTA3YWJjLCAweDM4YmFjNzk1LCAweDM4YjRmNTQ3LCAweDFkYWI5ZGI1LCAweDFkY2NmZmJmLCAweDM4YTM3MTQyLCANCisJMHgzODlkOTYzNywgMHgxZGQ4MWUyMSwgMHgxZGY5NzI1ZiwgMHgzODhiZjdmZiwgMHgzODg2MTQzYiwgMHgxZTA0OGMyNCwgMHgxZTI1ZDI4MiwgMHgzODc0NWJkYiwgDQorCTB4Mzg2ZTZmNjAsIDB4MWUzMGU3YTQsIDB4MWU1MjIwMGMsIDB4Mzg1YzljZTMsIDB4Mzg1NmE3YjYsIDB4MWU1ZDMwODQsIDB4MWU3ZTVhZTIsIDB4Mzg0NGJiMjgsIA0KKwkweDM4M2ViZDRjLCAweDFlODk2NmE4LCAweDFlYWE4MmU5LCAweDM4MmNiNmI3LCAweDM4MjZiMDMwLCAweDFlYjU4OWY3LCAweDFlZDY5ODA1LCAweDM4MTQ4ZjlmLCANCisJMHgzODBlODA3MSwgMHgxZWUxOWE1NCwgMHgxZjAyOWExYywgMHgzN2ZjNDVlZiwgMHgzN2Y2MmUxZCwgMHgxZjBkOTdhNSwgMHgxZjJlODkxMSwgMHgzN2UzZDliNywgDQorCTB4MzdkZGI5NDUsIDB4MWYzOTgxY2UsIDB4MWY1YTY0Y2IsIDB4MzdjYjRiMDQsIDB4MzdjNTIxZjYsIDB4MWY2NTU4YjUsIDB4MWY4NjJkMmQsIDB4MzdiMjk5ZTcsIA0KKwkweDM3YWM2ODQxLCAweDFmOTExYzNkLCAweDFmYjFlMjFkLCAweDM3OTljNjZmLCAweDM3OTM4YzM0LCAweDFmYmNjYzRkLCAweDFmZGQ4MzgxLCAweDM3ODBkMGFhLCANCisJMHgzNzdhOGRkZiwgMHgxZmU4NjhjOCwgMHgyMDA5MTEzYywgMHgzNzY3YjhhOSwgMHgzNzYxNmQ1MSwgMHgyMDEzZjE5NiwgMHgyMDM0OGIzNSwgMHgzNzRlN2U3YiwgDQorCTB4Mzc0ODJhOWEsIDB4MjAzZjY2OTksIDB4MjA1ZmYxNGYsIDB4MzczNTIyMmYsIDB4MzcyZWM1YzksIDB4MjA2YWM3YjgsIDB4MjA4YjQzNzIsIDB4MzcxYmEzZDQsIA0KKwkweDM3MTUzZWVlLCAweDIwOTYxNGQ5LCAweDIwYjY4MTgxLCAweDM3MDIwMzdjLCAweDM2ZmI5NjE4LCAweDIwYzE0ZGRmLCAweDIwZTFhYjYzLCAweDM2ZTg0MTM1LCANCisJMHgzNmUxY2I1OCwgMHgyMGVjNzJiMSwgMHgyMTBjYzBmYywgMHgzNmNlNWQxMCwgMHgzNmM3ZGViZCwgMHgyMTE3ODMzNCwgMHgyMTM3YzIzMiwgMHgzNmI0NTcxYiwgDQorCTB4MzZhZGQwNTgsIDB4MjE0MjdmNGQsIDB4MjE2MmFlZWEsIDB4MzY5YTJmNjksIDB4MzY5M2EwMzgsIDB4MjE2ZDY2ZTIsIDB4MjE4ZDg3MGIsIDB4MzY3ZmU2MDgsIA0KKwkweDM2Nzk0ZTZlLCAweDIxOTgzOWQ4LCAweDIxYjg0YTc5LCAweDM2NjU3YjA4LCAweDM2NWVkYjA5LCAweDIxYzJmODE1LCAweDIxZTJmOTFhLCAweDM2NGFlZTdiLCANCisJMHgzNjQ0NDYxYiwgMHgyMWVkYTE3ZiwgMHgyMjBkOTJkNCwgMHgzNjMwNDA3MCwgMHgzNjI5OGZiNCwgMHgyMjE4MzVmYiwgMHgyMjM4MTc4ZCwgMHgzNjE1NzBmOCwgDQorCTB4MzYwZWI3ZTMsIDB4MjI0MmI1NmYsIDB4MjI2Mjg3MjksIDB4MzVmYTgwMjMsIDB4MzVmM2JlYmEsIDB4MjI2ZDFmYzEsIDB4MjI4Y2UxOTEsIDB4MzVkZjZlMDMsIA0KKwkweDM1ZDhhNDQ5LCAweDIyOTc3NGQ3LCAweDIyYjcyNmE4LCAweDM1YzQzYWE3LCAweDM1YmQ2OGExLCAweDIyYzFiNDk2LCAweDIyZTE1NjU1LCAweDM1YThlNjIxLCANCisJMHgzNWEyMGJkMywgMHgyMmViZGVlNSwgMHgyMzBiNzA3ZSwgMHgzNThkNzA4MSwgMHgzNTg2OGRlZiwgMHgyMzE1ZjNhOCwgMHgyMzM1NzUwOSwgMHgzNTcxZDlkOSwgDQorCTB4MzU2YWVmMDgsIDB4MjMzZmYyYzgsIDB4MjM1ZjYzZGMsIDB4MzU1NjIyMzksIDB4MzU0ZjJmMmMsIDB4MjM2OWRjMjksIDB4MjM4OTNjZGQsIDB4MzUzYTQ5YjIsIA0KKwkweDM1MzM0ZTZmLCAweDIzOTNhZmIyLCAweDIzYjJmZmYzLCAweDM1MWU1MDU2LCAweDM1MTc0Y2UwLCAweDIzYmQ2ZDQ4LCAweDIzZGNhZDAzLCAweDM1MDIzNjM2LCANCisJMHgzNGZiMmE5MiwgMHgyM2U3MTRkMywgMHgyNDA2NDNmNCwgMHgzNGU1ZmI2MywgMHgzNGRlZTc5NSwgMHgyNDEwYTYzOSwgMHgyNDJmYzRhZCwgMHgzNGM5OWZlZiwgDQorCTB4MzRjMjgzZmIsIDB4MjQzYTIxNWYsIDB4MjQ1OTJmMTMsIDB4MzRhZDIzZWIsIDB4MzRhNWZmZDUsIDB4MjQ2Mzg2MmMsIDB4MjQ4MjgzMGQsIDB4MzQ5MDg3NjgsIA0KKwkweDM0ODk1YjM2LCAweDI0OGNkNDg3LCAweDI0YWJjMDgyLCAweDM0NzNjYTc5LCAweDM0NmM5NjJmLCAweDI0YjYwYzU3LCAweDI0ZDRlNzU3LCAweDM0NTZlZDJmLCANCisJMHgzNDRmYjBkMSwgMHgyNGRmMmQ4MSwgMHgyNGZkZjc3NSwgMHgzNDM5ZWY5YywgMHgzNDMyYWIyZSwgMHgyNTA4MzdlZCwgMHgyNTI2ZjBjMSwgMHgzNDFjZDFkMiwgDQorCTB4MzQxNTg1NTksIDB4MjUzMTJiODEsIDB4MjU0ZmQzMjMsIDB4MzNmZjkzZTIsIDB4MzNmODNmNjIsIDB4MjU1YTA4MjMsIDB4MjU3ODllODAsIDB4MzNlMjM1ZGYsIA0KKwkweDMzZGFkOTVlLCAweDI1ODJjZGJjLCAweDI1YTE1MmMwLCAweDMzYzRiN2RiLCAweDMzYmQ1MzVjLCAweDI1YWI3YzMwLCAweDI1YzllZmNhLCAweDMzYTcxOWU4LCANCisJMHgzMzlmYWQ3MCwgMHgyNWQ0MTM2OSwgMHgyNWYyNzU4NCwgMHgzMzg5NWMxOCwgMHgzMzgxZTdhYywgMHgyNWZjOTM0YiwgMHgyNjFhZTNkNiwgMHgzMzZiN2U3ZSwgDQorCTB4MzM2NDAyMjMsIDB4MjYyNGZiYmYsIDB4MjY0MzNhYTcsIDB4MzM0ZDgxMmQsIDB4MzM0NWZjZTYsIDB4MjY0ZDRjYWMsIDB4MjY2Yjc5ZGQsIDB4MzMyZjY0MzUsIA0KKwkweDMzMjdkODA4LCAweDI2NzU4NWY4LCAweDI2OTNhMTYxLCAweDMzMTEyN2FiLCAweDMzMDk5MzljLCAweDI2OWRhNzhiLCAweDI2YmJiMTE5LCAweDMyZjJjYmExLCANCisJMHgzMmViMmZiNSwgMHgyNmM1YjE0YywgMHgyNmUzYThlYywgMHgzMmQ0NTAyOSwgMHgzMmNjYWM2NCwgMHgyNmVkYTMyMiwgMHgyNzBiODhjMiwgMHgzMmI1YjU1NywgDQorCTB4MzJhZTA5YmUsIDB4MjcxNTdjZjUsIDB4MjczMzUwODIsIDB4MzI5NmZiM2QsIDB4MzI4ZjQ3ZDUsIDB4MjczZDNlYWMsIDB4Mjc1YjAwMTQsIDB4MzI3ODIxZWUsIA0KKwkweDMyNzA2NmJjLCAweDI3NjRlODJmLCAweDI3ODI5NzYwLCAweDMyNTkyOTdkLCAweDMyNTE2Njg2LCAweDI3OGM3OTY1LCAweDI3YWExNjRjLCAweDMyM2ExMWZlLCANCisJMHgzMjMyNDc0NiwgMHgyN2IzZjIzNSwgMHgyN2QxN2NjMSwgMHgzMjFhZGI4MywgMHgzMjEzMDkwZiwgMHgyN2RiNTI4OCwgMHgyN2Y4Y2FhNSwgMHgzMWZiODYyMCwgDQorCTB4MzFmM2FiZjUsIDB4MjgwMjlhNDUsIDB4MjgxZmZmZTIsIDB4MzFkYzExZTgsIDB4MzFkNDMwMGIsIDB4MjgyOWM5NTQsIDB4Mjg0NzFjNWUsIDB4MzFiYzdlZWUsIA0KKwkweDMxYjQ5NTY0LCAweDI4NTBkZjlkLCAweDI4NmUyMDAyLCAweDMxOWNjZDQ2LCAweDMxOTRkYzE0LCAweDI4NzdkZDA3LCAweDI4OTUwYWI2LCAweDMxN2NmZDA0LCANCisJMHgzMTc1MDQyZSwgMHgyODllYzE3YSwgMHgyOGJiZGM2MSwgMHgzMTVkMGUzYiwgMHgzMTU1MGRjNiwgMHgyOGM1OGNkZiwgMHgyOGUyOTRlYiwgMHgzMTNkMDBmZiwgDQorCTB4MzEzNGY4ZjEsIDB4MjhlYzNmMWUsIDB4MjkwOTM0M2UsIDB4MzExY2Q1NjQsIDB4MzExNGM1YzAsIDB4MjkxMmQ4MWYsIDB4MjkyZmJhNDAsIDB4MzBmYzhiN2QsIA0KKwkweDMwZjQ3NDQ5LCAweDI5Mzk1N2M5LCAweDI5NTYyNmRhLCAweDMwZGMyMzVlLCAweDMwZDQwNGEwLCAweDI5NWZiZTA2LCAweDI5N2M3OWY1LCAweDMwYmI5ZDFjLCANCisJMHgzMGIzNzZkOCwgMHgyOTg2MGFiZCwgMHgyOWEyYjM3OCwgMHgzMDlhZjhjYSwgMHgzMDkyY2IwNSwgMHgyOWFjM2RkNywgMHgyOWM4ZDM0ZCwgMHgzMDdhMzY3YywgDQorCTB4MzA3MjAxM2MsIDB4MjlkMjU3M2MsIDB4MjllZWQ5NWIsIDB4MzA1OTU2NDgsIDB4MzA1MTE5OTEsIDB4MjlmODU2ZDUsIDB4MmExNGM1OGIsIDB4MzAzODU4NDAsIA0KKwkweDMwMzAxNDE4LCAweDJhMWUzYzhhLCAweDJhM2E5N2M3LCAweDMwMTczYzdhLCAweDMwMGVmMGU1LCAweDJhNDQwODQ0LCAweDJhNjA0ZmY1LCAweDJmZjYwMzBhLCANCisJMHgyZmVkYjAwZCwgMHgyYTY5YjllYywgMHgyYTg1ZWUwMCwgMHgyZmQ0YWMwNCwgMHgyZmNjNTFhNSwgMHgyYThmNTE2YiwgMHgyYWFiNzFkMCwgMHgyZmIzMzc3YywgDQorCTB4MmZhYWQ1YzEsIDB4MmFiNGNlYTksIDB4MmFkMGRiNGUsIDB4MmY5MWE1ODksIDB4MmY4OTNjNzUsIDB4MmFkYTMxOGUsIDB4MmFmNjJhNjMsIDB4MmY2ZmY2M2QsIA0KKwkweDJmNjc4NWQ3LCAweDJhZmY3YTA1LCAweDJiMWI1ZWY4LCAweDJmNGUyOWFmLCAweDJmNDViMWZiLCAweDJiMjRhN2Y2LCAweDJiNDA3OGY1LCAweDJmMmMzZmYyLCANCisJMHgyZjIzYzBmNiwgMHgyYjQ5YmI0YSwgMHgyYjY1Nzg0NCwgMHgyZjBhMzkxZCwgMHgyZjAxYjJkZSwgMHgyYjZlYjNlYSwgMHgyYjhhNWNjZSwgMHgyZWU4MTU0MywgDQorCTB4MmVkZjg3YzYsIDB4MmI5MzkxYzAsIDB4MmJhZjI2N2QsIDB4MmVjNWQ0NzksIDB4MmViZDNmYzQsIDB4MmJiODU0YjQsIDB4MmJkM2Q1M2EsIDB4MmVhMzc2ZDYsIA0KKwkweDJlOWFkYWVlLCAweDJiZGNmY2IwLCAweDJiZjg2OGVkLCAweDJlODBmYzZlLCAweDJlNzg1OTU4LCAweDJjMDE4OTllLCAweDJjMWNlMTgxLCAweDJlNWU2NTU2LCANCisJMHgyZTU1YmIxNywgMHgyYzI1ZmI2NiwgMHgyYzQxM2VkZiwgMHgyZTNiYjFhNCwgMHgyZTMzMDA0MiwgMHgyYzRhNTFmMywgMHgyYzY1ODBmMSwgMHgyZTE4ZTE2ZCwgDQorCTB4MmUxMDI4ZWQsIDB4MmM2ZThkMmUsIDB4MmM4OWE3OWYsIDB4MmRmNWY0YzcsIDB4MmRlZDM1MmYsIDB4MmM5MmFkMDEsIDB4MmNhZGIyZDUsIDB4MmRkMmViYzcsIA0KKwkweDJkY2EyNTFjLCAweDJjYjZiMTU1LCAweDJjZDFhMjdiLCAweDJkYWZjNjgzLCAweDJkYTZmOGNhLCAweDJjZGE5YTE0LCAweDJjZjU3NjdjLCAweDJkOGM4NTEwLCANCisJMHgyZDgzYjA0ZiwgMHgyY2ZlNjcyOCwgMHgyZDE5MmVjMSwgMHgyZDY5Mjc4NCwgMHgyZDYwNGJjMCwgMHgyZDIyMTg3YSwgMHgyZDNjY2IzNCwgMHgyZDQ1YWRmNg0KK307CisKK2NvbnN0IGludCB0d2lkVGFiNTEyWzgqNiArIDMyKjYgKyAxMjgqNl0gPSB7DQorCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIA0KKwkweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDJkNDEzY2NjLCAweDJkNDEzY2NjLCAweDNiMjBkNzllLCAweDE4N2RlMmE2LCANCisJMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgzNTM2Y2M1MiwgMHgyMzhlNzY3MywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgDQorCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIA0KKwkweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCANCisJMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjNGRmMjg2MiwgMHgxODdkZTJhNiwgMHgwYzdjNWMxZSwgMHgzZWM1MmY5ZiwgMHhkYzcxODk4ZCwgMHhjYWM5MzNhZSwgDQorDQorCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIA0KKwkweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDNmYjExYjQ3LCAweDA2NDVlOWFmLCANCisJMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZDNlODJhZCwgMHgxMjk0MDYyZSwgMHgzZjRlYWFmZSwgMHgwOTY0MDgzNywgMHgzOWRhZjVlOCwgMHgxYjVkMTAwOSwgDQorCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIA0KKwkweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCANCisJMHgyODk5ZTY0YSwgMHgzMTc5MDBkNiwgMHgzMTc5MDBkNiwgMHgyODk5ZTY0YSwgMHgzYzQyNDIwOSwgMHgxNThmOWE3NSwgMHgyMGU3MGYzMiwgMHgzNmU1MDY4YSwgDQorCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIA0KKwkweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweDM4NzE2NWUzLCAweDFlMmI1ZDM4LCANCisJMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgxZTJiNWQzOCwgMHgzODcxNjVlMywgMHgzNmU1MDY4YSwgMHgyMGU3MGYzMiwgMHhmY2RjMTM0MiwgMHgzZmVjNDNjNiwgDQorCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIA0KKwkweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCANCisJMHhlMWQ0YTJjOCwgMHgzODcxNjVlMywgMHgwNjQ1ZTlhZiwgMHgzZmIxMWI0NywgMHgyZjZiYmU0NCwgMHgyYWZhZDI2OSwgMHhkOWUwMTAwNywgMHgzMzY3YzA4ZiwgDQorCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsIA0KKwkweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweGYzODNhM2UyLCAweDNlYzUyZjlmLCAweDI4OTllNjRhLCAweDMxNzkwMGQ2LCANCisJMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHhlZDZiZjlkMiwgMHgzZDNlODJhZCwgMHgyNjFmZWZmOSwgMHgzMzY3YzA4ZiwgMHhjM2JkYmRmNywgMHgxNThmOWE3NSwgDQorCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIA0KKwkweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweGRjNzE4OThkLCAweDM1MzZjYzUyLCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCANCisJMHhjMDRlZTRiOSwgMHhmOWJhMTY1MSwgMHhkNzY2MTliNiwgMHgzMTc5MDBkNiwgMHgxYjVkMTAwOSwgMHgzOWRhZjVlOCwgMHhjMWViMDIwOSwgMHhmMDczMDM0MywgDQorCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsIA0KKwkweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweGM5MWFmOTc2LCAweGRmMThmMGNlLCAweGNhYzkzM2FlLCAweDIzOGU3NjczLCAweDEyOTQwNjJlLCAweDNkM2U4MmFkLCANCisJMHhjZTg2ZmYyYSwgMHhkNzY2MTliNiwgMHhjNzhlOWExZCwgMHgxZTJiNWQzOCwgMHgwZjhjZmNiZCwgMHgzZTE0ZmRmNywgMHhkNTA1MmQ5NywgMHhkMDk0NDFiYywgDQorCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsIA0KKwkweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweGU0YTJlZmY3LCAweGM2MjUwYTE4LCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCANCisJMHhlZDZiZjlkMiwgMHhjMmMxN2Q1MywgMHhjMDRlZTRiOSwgMHgwNjQ1ZTlhZiwgMHgwMzIzZWNiZSwgMHgzZmVjNDNjNiwgMHhmNjliZjdjOSwgMHhjMGIxNTUwMiwgDQorDQorCTB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZmYjEwYzEsIDB4MDE5MjE1NWYsIA0KKwkweDNmZmVjNDJkLCAweDAwYzkwZThmLCAweDNmZjRlNWRmLCAweDAyNWIwY2FlLCAweDNmZWM0M2M2LCAweDAzMjNlY2JlLCAweDNmZmIxMGMxLCAweDAxOTIxNTVmLCANCisJMHgzZmQzOWI1YSwgMHgwNGI1NDgyNCwgMHgzZmQzOWI1YSwgMHgwNGI1NDgyNCwgMHgzZmY0ZTVkZiwgMHgwMjViMGNhZSwgMHgzZjljMmJmYSwgMHgwNzBkZTE3MSwgDQorCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2ZlYzQzYzYsIDB4MDMyM2VjYmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4M2Y4NGM4ZTEsIDB4MDdkNTkzOTUsIA0KKwkweDNmZTEyYWNiLCAweDAzZWNhZGNmLCAweDNlZWIzMzQ3LCAweDBiYjZlY2VmLCAweDNmNGVhYWZlLCAweDA5NjQwODM3LCAweDNmZDM5YjVhLCAweDA0YjU0ODI0LCANCisJMHgzZTcxZTc1OCwgMHgwZTA1YzEzNSwgMHgzZjBlYzlmNCwgMHgwYWYxMGEyMiwgMHgzZmMzOTVmOSwgMHgwNTdkYjQwMiwgMHgzZGUyZjE0NywgMHgxMDRmYjgwZSwgDQorCTB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2U3MWU3NTgsIDB4MGUwNWMxMzUsIA0KKwkweDNmOWMyYmZhLCAweDA3MGRlMTcxLCAweDNjODRkNDk2LCAweDE0ZDFlMjQyLCAweDNlMTRmZGY3LCAweDBmOGNmY2JkLCAweDNmODRjOGUxLCAweDA3ZDU5Mzk1LCANCisJMHgzYmI2Mjc2ZCwgMHgxNzA4ODUzMCwgMHgzZGFlODFjZSwgMHgxMTExZDI2MiwgMHgzZjZhZjJlMywgMHgwODljZjg2NywgMHgzYWQyYzJlNywgMHgxOTM3MmE2MywgDQorCTB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2Y0ZWFhZmUsIDB4MDk2NDA4MzcsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4M2NjNTExZDgsIDB4MTQxMzVjOTQsIA0KKwkweDNmMmZmMjQ5LCAweDBhMmFiYjU4LCAweDM4Y2YxNjY5LCAweDFkNzk3NzViLCAweDNjNDI0MjA5LCAweDE1OGY5YTc1LCAweDNmMGVjOWY0LCAweDBhZjEwYTIyLCANCisJMHgzN2FmODE1OCwgMHgxZjhiYTRkYiwgMHgzYmI2Mjc2ZCwgMHgxNzA4ODUzMCwgMHgzZWViMzM0NywgMHgwYmI2ZWNlZiwgMHgzNjdjOWE3ZCwgMHgyMTkyZTA5YSwgDQorCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2E4MjY5YTIsIDB4MTllZjc5NDMsIA0KKwkweDNlOWNjMDc2LCAweDBkNDE1MDEyLCAweDMzZGU4N2RlLCAweDI1N2RiNjRiLCAweDM5ZGFmNWU4LCAweDFiNWQxMDA5LCAweDNlNzFlNzU4LCAweDBlMDVjMTM1LCANCisJMHgzMjc0NDQ5MywgMHgyNzVmZjQ1MiwgMHgzOTJhOTY0MiwgMHgxY2M2NmU5OSwgMHgzZTQ0YTVlZSwgMHgwZWM5YTdmMiwgMHgzMGY4ODAxZiwgMHgyOTM0ODkzNywgDQorCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4M2UxNGZkZjcsIDB4MGY4Y2ZjYmQsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4MzdhZjgxNTgsIDB4MWY4YmE0ZGIsIA0KKwkweDNkZTJmMTQ3LCAweDEwNGZiODBlLCAweDJkY2U4OGE5LCAweDJjYjIzMjRiLCAweDM2ZTUwNjhhLCAweDIwZTcwZjMyLCAweDNkYWU4MWNlLCAweDExMTFkMjYyLCANCisJMHgyYzIxNmVhYSwgMHgyZTVhMTA2ZiwgMHgzNjEyMTRiMCwgMHgyMjNkNjZhOCwgMHgzZDc3YjE5MSwgMHgxMWQzNDQzZiwgMHgyYTY1MDUyNSwgMHgyZmYxZDljNiwgDQorCTB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4MzQ1MzRmNDAsIDB4MjRkYTBhOTksIA0KKwkweDNkMDJmNzU2LCAweDEzNTQxMGMyLCAweDI2YzBiMTYyLCAweDMyZWVmZGU5LCAweDMzNjdjMDhmLCAweDI2MWZlZmY5LCAweDNjYzUxMWQ4LCAweDE0MTM1Yzk0LCANCisJMHgyNGRhMGE5OSwgMHgzNDUzNGY0MCwgMHgzMjc0NDQ5MywgMHgyNzVmZjQ1MiwgMHgzYzg0ZDQ5NiwgMHgxNGQxZTI0MiwgMHgyMmU2OWFjNywgMHgzNWE1NzkzYywgDQorCTB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4M2M0MjQyMDksIDB4MTU4ZjlhNzUsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4MzA3NjFjMTcsIDB4MjljZDk1NzcsIA0KKwkweDNiZmQ1Y2M0LCAweDE2NGM3ZGRkLCAweDFlZGMxOTUyLCAweDM4MTE4ODRjLCAweDJmNmJiZTQ0LCAweDJhZmFkMjY5LCAweDNiYjYyNzZkLCAweDE3MDg4NTMwLCANCisJMHgxY2M2NmU5OSwgMHgzOTJhOTY0MiwgMHgyZTVhMTA2ZiwgMHgyYzIxNmVhYSwgMHgzYjZjYTRjNCwgMHgxN2MzYTkzMSwgMHgxYWE2YzgyYiwgMHgzYTJmY2VlOCwgDQorCTB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MmMyMTZlYWEsIDB4MmU1YTEwNmYsIA0KKwkweDNhZDJjMmU3LCAweDE5MzcyYTYzLCAweDE2NGM3ZGRkLCAweDNiZmQ1Y2M0LCAweDJhZmFkMjY5LCAweDJmNmJiZTQ0LCAweDNhODI2OWEyLCAweDE5ZWY3OTQzLCANCisJMHgxNDEzNWM5NCwgMHgzY2M1MTFkOCwgMHgyOWNkOTU3NywgMHgzMDc2MWMxNywgMHgzYTJmY2VlOCwgMHgxYWE2YzgyYiwgMHgxMWQzNDQzZiwgMHgzZDc3YjE5MSwgDQorCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4MzlkYWY1ZTgsIDB4MWI1ZDEwMDksIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4Mjc1ZmY0NTIsIDB4MzI3NDQ0OTMsIA0KKwkweDM5ODNlMWU3LCAweDFjMTI0OWQ4LCAweDBkNDE1MDEyLCAweDNlOWNjMDc2LCAweDI2MWZlZmY5LCAweDMzNjdjMDhmLCAweDM5MmE5NjQyLCAweDFjYzY2ZTk5LCANCisJMHgwYWYxMGEyMiwgMHgzZjBlYzlmNCwgMHgyNGRhMGE5OSwgMHgzNDUzNGY0MCwgMHgzOGNmMTY2OSwgMHgxZDc5Nzc1YiwgMHgwODljZjg2NywgMHgzZjZhZjJlMywgDQorCTB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MjIzZDY2YTgsIDB4MzYxMjE0YjAsIA0KKwkweDM4MTE4ODRjLCAweDFlZGMxOTUyLCAweDAzZWNhZGNmLCAweDNmZTEyYWNiLCAweDIwZTcwZjMyLCAweDM2ZTUwNjhhLCAweDM3YWY4MTU4LCAweDFmOGJhNGRiLCANCisJMHgwMTkyMTU1ZiwgMHgzZmZiMTBjMSwgMHgxZjhiYTRkYiwgMHgzN2FmODE1OCwgMHgzNzRiNTRjZSwgMHgyMDM5ZjkwZSwgMHhmZjM2ZjE3MSwgMHgzZmZlYzQyZCwgDQorCTB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4MzZlNTA2OGEsIDB4MjBlNzBmMzIsIDB4ZmNkYzEzNDIsIDB4M2ZlYzQzYzYsIDB4MWNjNjZlOTksIDB4MzkyYTk2NDIsIA0KKwkweDM2N2M5YTdkLCAweDIxOTJlMDlhLCAweGZhODI0YmZlLCAweDNmYzM5NWY5LCAweDFiNWQxMDA5LCAweDM5ZGFmNWU4LCAweDM2MTIxNGIwLCAweDIyM2Q2NmE4LCANCisJMHhmODJhNmM2YiwgMHgzZjg0YzhlMSwgMHgxOWVmNzk0MywgMHgzYTgyNjlhMiwgMHgzNWE1NzkzYywgMHgyMmU2OWFjNywgMHhmNWQ1NDRhOCwgMHgzZjJmZjI0OSwgDQorCTB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIDB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4MTcwODg1MzAsIDB4M2JiNjI3NmQsIA0KKwkweDM0YzYxMjM2LCAweDI0MzRmMzMyLCAweGYxMzY1ODBlLCAweDNlNDRhNWVlLCAweDE1OGY5YTc1LCAweDNjNDI0MjA5LCAweDM0NTM0ZjQwLCAweDI0ZGEwYTk5LCANCisJMHhlZWVlMmQ5ZSwgMHgzZGFlODFjZSwgMHgxNDEzNWM5NCwgMHgzY2M1MTFkOCwgMHgzM2RlODdkZSwgMHgyNTdkYjY0YiwgMHhlY2FiZWYzZSwgMHgzZDAyZjc1NiwgDQorCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4MzM2N2MwOGYsIDB4MjYxZmVmZjksIDB4ZWE3MDY1OGIsIDB4M2M0MjQyMDksIDB4MTExMWQyNjIsIDB4M2RhZTgxY2UsIA0KKwkweDMyZWVmZGU5LCAweDI2YzBiMTYyLCAweGU4M2M1NmNmLCAweDNiNmNhNGM0LCAweDBmOGNmY2JkLCAweDNlMTRmZGY3LCAweDMyNzQ0NDkzLCAweDI3NWZmNDUyLCANCisJMHhlNjEwODZiZCwgMHgzYTgyNjlhMiwgMHgwZTA1YzEzNSwgMHgzZTcxZTc1OCwgMHgzMWY3OTk0NywgMHgyN2ZkYjJhNiwgMHhlM2VkYjYyOCwgMHgzOTgzZTFlNywgDQorCTB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4MzE3OTAwZDYsIDB4Mjg5OWU2NGEsIDB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIDB4MGFmMTBhMjIsIDB4M2YwZWM5ZjQsIA0KKwkweDMwZjg4MDFmLCAweDI5MzQ4OTM3LCAweGRmYzYwNmYyLCAweDM3NGI1NGNlLCAweDA5NjQwODM3LCAweDNmNGVhYWZlLCAweDMwNzYxYzE3LCAweDI5Y2Q5NTc3LCANCisJMHhkZGMyOTk1OCwgMHgzNjEyMTRiMCwgMHgwN2Q1OTM5NSwgMHgzZjg0YzhlMSwgMHgyZmYxZDljNiwgMHgyYTY1MDUyNSwgMHhkYmNiMGNjZSwgMHgzNGM2MTIzNiwgDQorCTB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MmY2YmJlNDQsIDB4MmFmYWQyNjksIDB4ZDllMDEwMDcsIDB4MzM2N2MwOGYsIDB4MDRiNTQ4MjQsIDB4M2ZkMzliNWEsIA0KKwkweDJlZTNjZWJlLCAweDJiOGVmNzdjLCAweGQ4MDI0ZDVhLCAweDMxZjc5OTQ3LCAweDAzMjNlY2JlLCAweDNmZWM0M2M2LCAweDJlNWExMDZmLCAweDJjMjE2ZWFhLCANCisJMHhkNjMyNmE4OSwgMHgzMDc2MWMxNywgMHgwMTkyMTU1ZiwgMHgzZmZiMTBjMSwgMHgyZGNlODhhOSwgMHgyY2IyMzI0YiwgMHhkNDcxMDg4NCwgMHgyZWUzY2ViZSwgDQorCTB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIDB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4ZmU2ZGVhYTEsIDB4M2ZmYjEwYzEsIA0KKwkweDJjYjIzMjRiLCAweDJkY2U4OGE5LCAweGQxMWMzMTQyLCAweDJiOGVmNzdjLCAweGZjZGMxMzQyLCAweDNmZWM0M2M2LCAweDJjMjE2ZWFhLCAweDJlNWExMDZmLCANCisJMHhjZjg5ZTNlOSwgMHgyOWNkOTU3NywgMHhmYjRhYjdkYywgMHgzZmQzOWI1YSwgMHgyYjhlZjc3YywgMHgyZWUzY2ViZSwgMHhjZTA4NjZiOSwgMHgyN2ZkYjJhNiwgDQorCTB4ZjliYTE2NTEsIDB4M2ZiMTFiNDcsIDB4MmFmYWQyNjksIDB4MmY2YmJlNDQsIDB4Y2M5ODNmNzEsIDB4MjYxZmVmZjksIDB4ZjgyYTZjNmIsIDB4M2Y4NGM4ZTEsIA0KKwkweDJhNjUwNTI1LCAweDJmZjFkOWM2LCAweGNiMzllZGNhLCAweDI0MzRmMzMyLCAweGY2OWJmN2M5LCAweDNmNGVhYWZlLCAweDI5Y2Q5NTc3LCAweDMwNzYxYzE3LCANCisJMHhjOWVkZWI1MCwgMHgyMjNkNjZhOCwgMHhmNTBlZjVkZSwgMHgzZjBlYzlmNCwgMHgyOTM0ODkzNywgMHgzMGY4ODAxZiwgMHhjOGI0YWIzMiwgMHgyMDM5ZjkwZSwgDQorCTB4ZjM4M2EzZTIsIDB4M2VjNTJmOWYsIDB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZjFmYTNlY2IsIDB4M2U3MWU3NTgsIA0KKwkweDI3ZmRiMmE2LCAweDMxZjc5OTQ3LCAweGM2N2MxZTE5LCAweDFjMTI0OWQ4LCAweGYwNzMwMzQzLCAweDNlMTRmZGY3LCAweDI3NWZmNDUyLCAweDMyNzQ0NDkzLCANCisJMHhjNTdkOTY1ZSwgMHgxOWVmNzk0MywgMHhlZWVlMmQ5ZSwgMHgzZGFlODFjZSwgMHgyNmMwYjE2MiwgMHgzMmVlZmRlOSwgMHhjNDkzNWIzYywgMHgxN2MzYTkzMSwgDQorCTB4ZWQ2YmY5ZDIsIDB4M2QzZTgyYWQsIDB4MjYxZmVmZjksIDB4MzM2N2MwOGYsIDB4YzNiZGJkZjcsIDB4MTU4ZjlhNzUsIDB4ZWJlY2EzNmMsIDB4M2NjNTExZDgsIA0KKwkweDI1N2RiNjRiLCAweDMzZGU4N2RlLCAweGMyZmQwOGFhLCAweDEzNTQxMGMyLCAweGVhNzA2NThiLCAweDNjNDI0MjA5LCAweDI0ZGEwYTk5LCAweDM0NTM0ZjQwLCANCisJMHhjMjUxN2UzMiwgMHgxMTExZDI2MiwgMHhlOGY3N2FkMCwgMHgzYmI2Mjc2ZCwgMHgyNDM0ZjMzMiwgMHgzNGM2MTIzNiwgMHhjMWJiNWExMiwgMHgwZWM5YTdmMiwgDQorCTB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIDB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4ZTYxMDg2YmQsIDB4M2E4MjY5YTIsIA0KKwkweDIyZTY5YWM3LCAweDM1YTU3OTNjLCAweGMwZDAwZGI3LCAweDBhMmFiYjU4LCAweGU0YTJlZmY3LCAweDM5ZGFmNWU4LCAweDIyM2Q2NmE4LCAweDM2MTIxNGIwLCANCisJMHhjMDdiMzcxZiwgMHgwN2Q1OTM5NSwgMHhlMzM5OTE2NywgMHgzOTJhOTY0MiwgMHgyMTkyZTA5YSwgMHgzNjdjOWE3ZCwgMHhjMDNjNmEwNywgMHgwNTdkYjQwMiwgDQorCTB4ZTFkNGEyYzgsIDB4Mzg3MTY1ZTMsIDB4MjBlNzBmMzIsIDB4MzZlNTA2OGEsIDB4YzAxM2JjM2EsIDB4MDMyM2VjYmUsIDB4ZTA3NDViMjUsIDB4MzdhZjgxNTgsIA0KKwkweDIwMzlmOTBlLCAweDM3NGI1NGNlLCAweGMwMDEzYmQzLCAweDAwYzkwZThmLCAweGRmMThmMGNlLCAweDM2ZTUwNjhhLCAweDFmOGJhNGRiLCAweDM3YWY4MTU4LCANCisJMHhjMDA0ZWYzZiwgMHhmZTZkZWFhMSwgMHhkZGMyOTk1OCwgMHgzNjEyMTRiMCwgMHgxZWRjMTk1MiwgMHgzODExODg0YywgMHhjMDFlZDUzNSwgMHhmYzEzNTIzMSwgDQorCTB4ZGM3MTg5OGQsIDB4MzUzNmNjNTIsIDB4MWUyYjVkMzgsIDB4Mzg3MTY1ZTMsIDB4YzA0ZWU0YjksIDB4ZjliYTE2NTEsIDB4ZGIyNWY1NjcsIDB4MzQ1MzRmNDAsIA0KKwkweDFkNzk3NzViLCAweDM4Y2YxNjY5LCAweGMwOTUwZDFkLCAweGY3NjMwNzk5LCAweGQ5ZTAxMDA3LCAweDMzNjdjMDhmLCAweDFjYzY2ZTk5LCAweDM5MmE5NjQyLCANCisJMHhjMGYxMzYwYywgMHhmNTBlZjVkZSwgMHhkOGEwMGJhZSwgMHgzMjc0NDQ5MywgMHgxYzEyNDlkOCwgMHgzOTgzZTFlNywgMHhjMTYzM2Y4YSwgMHhmMmJlYWZlZSwgDQorCTB4ZDc2NjE5YjYsIDB4MzE3OTAwZDYsIDB4MWI1ZDEwMDksIDB4MzlkYWY1ZTgsIDB4YzFlYjAyMDksIDB4ZjA3MzAzNDMsIDB4ZDYzMjZhODksIDB4MzA3NjFjMTcsIA0KKwkweDFhYTZjODJiLCAweDNhMmZjZWU4LCAweGMyODg0ZTZmLCAweGVlMmNiYmMxLCAweGQ1MDUyZDk3LCAweDJmNmJiZTQ0LCAweDE5ZWY3OTQzLCAweDNhODI2OWEyLCANCisJMHhjMzNhZWUyOCwgMHhlYmVjYTM2YywgMHhkM2RlOTE1NiwgMHgyZTVhMTA2ZiwgMHgxOTM3MmE2MywgMHgzYWQyYzJlNywgMHhjNDAyYTMzYywgMHhlOWIzODIyMywgDQorCTB4ZDJiZWMzMzQsIDB4MmQ0MTNjY2MsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4YzRkZjI4NjIsIDB4ZTc4MjFkNWEsIDB4ZDFhNWVmOTEsIDB4MmMyMTZlYWEsIA0KKwkweDE3YzNhOTMxLCAweDNiNmNhNGM0LCAweGM1ZDAzMTE4LCAweGU1NTkzN2Q1LCAweGQwOTQ0MWJjLCAweDJhZmFkMjY5LCAweDE3MDg4NTMwLCAweDNiYjYyNzZkLCANCisJMHhjNmQ1NjliZSwgMHhlMzM5OTE2NywgMHhjZjg5ZTNlOSwgMHgyOWNkOTU3NywgMHgxNjRjN2RkZCwgMHgzYmZkNWNjNCwgMHhjN2VlNzdiNCwgMHhlMTIzZTZhZSwgDQorCTB4Y2U4NmZmMmEsIDB4Mjg5OWU2NGEsIDB4MTU4ZjlhNzUsIDB4M2M0MjQyMDksIDB4YzkxYWY5NzYsIDB4ZGYxOGYwY2UsIDB4Y2Q4YmJiNmQsIDB4Mjc1ZmY0NTIsIA0KKwkweDE0ZDFlMjQyLCAweDNjODRkNDk2LCAweGNhNWE4NmM0LCAweGRkMTk2NTM5LCAweGNjOTgzZjcxLCAweDI2MWZlZmY5LCAweDE0MTM1Yzk0LCAweDNjYzUxMWQ4LCANCisJMHhjYmFjYjBjMCwgMHhkYjI1ZjU2NywgMHhjYmFjYjBjMCwgMHgyNGRhMGE5OSwgMHgxMzU0MTBjMiwgMHgzZDAyZjc1NiwgMHhjZDExMDIxNywgMHhkOTNmNGU5ZSwgDQorCTB4Y2FjOTMzYWUsIDB4MjM4ZTc2NzMsIDB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzllZGViNTAsIDB4MjIzZDY2YTgsIA0KKwkweDExZDM0NDNmLCAweDNkNzdiMTkxLCAweGQwMGUyNjNhLCAweGQ1OWFmYWRiLCAweGM5MWFmOTc2LCAweDIwZTcwZjMyLCAweDExMTFkMjYyLCAweDNkYWU4MWNlLCANCisJMHhkMWE1ZWY5MSwgMHhkM2RlOTE1NiwgMHhjODUwN2VhOCwgMHgxZjhiYTRkYiwgMHgxMDRmYjgwZSwgMHgzZGUyZjE0NywgMHhkMzRkY2RiNSwgMHhkMjMxNzc1NywgDQorCTB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4MGY4Y2ZjYmQsIDB4M2UxNGZkZjcsIDB4ZDUwNTJkOTcsIDB4ZDA5NDQxYmMsIDB4YzZkNTY5YmUsIDB4MWNjNjZlOTksIA0KKwkweDBlYzlhN2YyLCAweDNlNDRhNWVlLCAweGQ2Y2I3NmM5LCAweGNmMDc3ZmUxLCAweGM2MjUwYTE4LCAweDFiNWQxMDA5LCAweDBlMDVjMTM1LCAweDNlNzFlNzU4LCANCisJMHhkOGEwMGJhZSwgMHhjZDhiYmI2ZCwgMHhjNTdkOTY1ZSwgMHgxOWVmNzk0MywgMHgwZDQxNTAxMiwgMHgzZTljYzA3NiwgMHhkYTgyNDliNSwgMHhjYzIxNzgyMiwgDQorCTB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIDB4ZGM3MTg5OGQsIDB4Y2FjOTMzYWUsIDB4YzQ0OWQ4OTMsIDB4MTcwODg1MzAsIA0KKwkweDBiYjZlY2VmLCAweDNlZWIzMzQ3LCAweGRlNmQxZjY2LCAweGM5ODM2NTgzLCAweGMzYmRiZGY3LCAweDE1OGY5YTc1LCAweDBhZjEwYTIyLCAweDNmMGVjOWY0LCANCisJMHhlMDc0NWIyNSwgMHhjODUwN2VhOCwgMHhjMzNhZWUyOCwgMHgxNDEzNWM5NCwgMHgwYTJhYmI1OCwgMHgzZjJmZjI0OSwgMHhlMjg2ODhhNSwgMHhjNzMwZTk5NywgDQorCTB4YzJjMTdkNTMsIDB4MTI5NDA2MmUsIDB4MDk2NDA4MzcsIDB4M2Y0ZWFhZmUsIDB4ZTRhMmVmZjcsIDB4YzYyNTBhMTgsIDB4YzI1MTdlMzIsIDB4MTExMWQyNjIsIA0KKwkweDA4OWNmODY3LCAweDNmNmFmMmUzLCAweGU2YzhkNTlkLCAweGM1MmQzZDE5LCAweGMxZWIwMjA5LCAweDBmOGNmY2JkLCAweDA3ZDU5Mzk1LCAweDNmODRjOGUxLCANCisJMHhlOGY3N2FkMCwgMHhjNDQ5ZDg5MywgMHhjMThlMThhOCwgMHgwZTA1YzEzNSwgMHgwNzBkZTE3MSwgMHgzZjljMmJmYSwgMHhlYjJlMWRiZSwgMHhjMzdiMmI2YSwgDQorCTB4YzEzYWQwNjEsIDB4MGM3YzVjMWUsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4ZWQ2YmY5ZDIsIDB4YzJjMTdkNTMsIDB4YzBmMTM2MGMsIDB4MGFmMTBhMjIsIA0KKwkweDA1N2RiNDAyLCAweDNmYzM5NWY5LCAweGVmYjA0N2YyLCAweGMyMWQwZWI5LCAweGMwYjE1NTAyLCAweDA5NjQwODM3LCAweDA0YjU0ODI0LCAweDNmZDM5YjVhLCANCisJMHhmMWZhM2VjYiwgMHhjMThlMThhOCwgMHhjMDdiMzcxZiwgMHgwN2Q1OTM5NSwgMHgwM2VjYWRjZiwgMHgzZmUxMmFjYiwgMHhmNDQ5MTMxMSwgMHhjMTE0Y2NiOSwgDQorCTB4YzA0ZWU0YjksIDB4MDY0NWU5YWYsIDB4MDMyM2VjYmUsIDB4M2ZlYzQzYzYsIDB4ZjY5YmY3YzksIDB4YzBiMTU1MDIsIDB4YzAyYzY0YTYsIDB4MDRiNTQ4MjQsIA0KKwkweDAyNWIwY2FlLCAweDNmZjRlNWRmLCAweGY4ZjIxZThmLCAweGMwNjNkNDA2LCAweGMwMTNiYzNhLCAweDAzMjNlY2JlLCAweDAxOTIxNTVmLCAweDNmZmIxMGMxLCANCisJMHhmYjRhYjdkYywgMHhjMDJjNjRhNiwgMHhjMDA0ZWYzZiwgMHgwMTkyMTU1ZiwgMHgwMGM5MGU4ZiwgMHgzZmZlYzQyZCwgMHhmZGE0ZjM1MiwgMHhjMDBiMWEyMQ0KK307DQorDQorY29uc3QgaW50IHR3aWRUYWI2NFs0KjYgKyAxNio2XSA9IHsNCisJMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgDQorCTB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MmQ0MTNjY2MsIDB4MmQ0MTNjY2MsIA0KKwkweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweGQyYmVjMzM0LCAweDJkNDEzY2NjLCAweDE4N2RlMmE2LCAweDNiMjBkNzllLCAweGM0ZGYyODYyLCAweGU3ODIxZDVhLCANCisNCisJMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgzZWM1MmY5ZiwgMHgwYzdjNWMxZSwgDQorCTB4M2ZiMTFiNDcsIDB4MDY0NWU5YWYsIDB4M2QzZTgyYWQsIDB4MTI5NDA2MmUsIDB4M2IyMGQ3OWUsIDB4MTg3ZGUyYTYsIDB4M2VjNTJmOWYsIDB4MGM3YzVjMWUsIA0KKwkweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDM1MzZjYzUyLCAweDIzOGU3NjczLCAweDNkM2U4MmFkLCAweDEyOTQwNjJlLCAweDI4OTllNjRhLCAweDMxNzkwMGQ2LCANCisJMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHgzYjIwZDc5ZSwgMHgxODdkZTJhNiwgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHgyMzhlNzY3MywgMHgzNTM2Y2M1MiwgDQorCTB4Mzg3MTY1ZTMsIDB4MWUyYjVkMzgsIDB4MDY0NWU5YWYsIDB4M2ZiMTFiNDcsIDB4MTg3ZGUyYTYsIDB4M2IyMGQ3OWUsIDB4MzUzNmNjNTIsIDB4MjM4ZTc2NzMsIA0KKwkweGYzODNhM2UyLCAweDNlYzUyZjlmLCAweDBjN2M1YzFlLCAweDNlYzUyZjlmLCAweDMxNzkwMGQ2LCAweDI4OTllNjRhLCAweGUxZDRhMmM4LCAweDM4NzE2NWUzLCANCisJMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHgyZDQxM2NjYywgMHgyZDQxM2NjYywgMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHhmMzgzYTNlMiwgMHgzZWM1MmY5ZiwgDQorCTB4Mjg5OWU2NGEsIDB4MzE3OTAwZDYsIDB4Yzc4ZTlhMWQsIDB4MWUyYjVkMzgsIDB4ZTc4MjFkNWEsIDB4M2IyMGQ3OWUsIDB4MjM4ZTc2NzMsIDB4MzUzNmNjNTIsIA0KKwkweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweGRjNzE4OThkLCAweDM1MzZjYzUyLCAweDFlMmI1ZDM4LCAweDM4NzE2NWUzLCAweGMwNGVlNGI5LCAweGY5YmExNjUxLCANCisJMHhkMmJlYzMzNCwgMHgyZDQxM2NjYywgMHgxODdkZTJhNiwgMHgzYjIwZDc5ZSwgMHhjNGRmMjg2MiwgMHhlNzgyMWQ1YSwgMHhjYWM5MzNhZSwgMHgyMzhlNzY3MywgDQorCTB4MTI5NDA2MmUsIDB4M2QzZTgyYWQsIDB4Y2U4NmZmMmEsIDB4ZDc2NjE5YjYsIDB4YzRkZjI4NjIsIDB4MTg3ZGUyYTYsIDB4MGM3YzVjMWUsIDB4M2VjNTJmOWYsIA0KKwkweGRjNzE4OThkLCAweGNhYzkzM2FlLCAweGMxM2FkMDYxLCAweDBjN2M1YzFlLCAweDA2NDVlOWFmLCAweDNmYjExYjQ3LCAweGVkNmJmOWQyLCAweGMyYzE3ZDUzIA0KK307DQorI2VuZGlmICAvL0FSTVY1RQ0KKw0KK2NvbnN0IGludCBTaG9ydFdpbmRvd1NpbmVbRlJBTUVfTEVOX1NIT1JULzJdID17ICANCisJMHgwMGM5N2ZmZiwgMHgwMjViN2ZmYSwgMHgwM2VkN2ZmMSwgMHgwNTdmN2ZlMiwgMHgwNzExN2ZjZSwgMHgwOGEyN2ZiNSwgMHgwYTMzN2Y5OCwgMHgwYmM0N2Y3NSwgDQorCTB4MGQ1NDdmNGUsIDB4MGVlNDdmMjIsIDB4MTA3MzdlZjAsIDB4MTIwMTdlYmEsIDB4MTM4ZjdlN2YsIDB4MTUxYzdlM2YsIDB4MTZhODdkZmIsIDB4MTgzMzdkYjEsIA0KKwkweDE5YmU3ZDYzLCAweDFiNDc3ZDBmLCAweDFjZDA3Y2I3LCAweDFlNTc3YzVhLCAweDFmZGQ3YmY5LCAweDIxNjI3YjkyLCAweDIyZTU3YjI3LCAweDI0Njc3YWI3LCANCisJMHgyNWU4N2E0MiwgMHgyNzY4NzljOSwgMHgyOGU1Nzk0YSwgMHgyYTYyNzhjOCwgMHgyYmRjNzg0MCwgMHgyZDU1NzdiNCwgMHgyZWNjNzcyMywgMHgzMDQyNzY4ZSwgDQorCTB4MzFiNTc1ZjQsIDB4MzMyNzc1NTYsIDB4MzQ5Nzc0YjMsIDB4MzYwNDc0MGIsIDB4Mzc3MDczNWYsIDB4MzhkOTcyYWYsIDB4M2E0MDcxZmEsIDB4M2JhNTcxNDEsIA0KKwkweDNkMDg3MDgzLCAweDNlNjg2ZmMyLCAweDNmYzY2ZWZiLCAweDQxMjE2ZTMxLCAweDQyN2E2ZDYyLCAweDQzZDE2YzhmLCAweDQ1MjQ2YmI4LCAweDQ2NzU2YWRkLCANCisJMHg0N2M0NjlmZCwgMHg0OTBmNjkxYSwgMHg0YTU4NjgzMiwgMHg0YjllNjc0NywgMHg0Y2UxNjY1NywgMHg0ZTIxNjU2NCwgMHg0ZjVlNjQ2YywgMHg1MDk4NjM3MSwgDQorCTB4NTFjZjYyNzIsIDB4NTMwMzYxNmYsIDB4NTQzMzYwNjgsIDB4NTU2MDVmNWUsIDB4NTY4YTVlNTAsIDB4NTdiMTVkM2UsIDB4NThkNDVjMjksIDB4NTlmNDViMTANCit9OworCitjb25zdCBpbnQgTG9uZ1dpbmRvd0tCRFtGUkFNRV9MRU5fTE9ORy8yXT17ICAKKwkweDAwMGE3ZmZmLCAweDAwMGU3ZmZmLCAweDAwMTI3ZmZmLCAweDAwMTU3ZmZmLCAweDAwMTk3ZmZmLCAweDAwMWM3ZmZmLCAweDAwMjA3ZmZmLCAweDAwMjM3ZmZmLCANCisJMHgwMDI2N2ZmZiwgMHgwMDJhN2ZmZiwgMHgwMDJkN2ZmZiwgMHgwMDMwN2ZmZiwgMHgwMDM0N2ZmZiwgMHgwMDM4N2ZmZiwgMHgwMDNiN2ZmZiwgMHgwMDNmN2ZmZiwgDQorCTB4MDA0MzdmZmYsIDB4MDA0NzdmZmYsIDB4MDA0YjdmZmYsIDB4MDA0ZjdmZmYsIDB4MDA1MzdmZmYsIDB4MDA1NzdmZmYsIDB4MDA1YjdmZmYsIDB4MDA2MDdmZmYsIA0KKwkweDAwNjQ3ZmZmLCAweDAwNjk3ZmZmLCAweDAwNmQ3ZmZmLCAweDAwNzI3ZmZmLCAweDAwNzc3ZmZmLCAweDAwN2M3ZmZmLCAweDAwODE3ZmZmLCAweDAwODY3ZmZmLCANCisJMHgwMDhiN2ZmZiwgMHgwMDkxN2ZmZiwgMHgwMDk2N2ZmZiwgMHgwMDljN2ZmZiwgMHgwMGExN2ZmZiwgMHgwMGE3N2ZmZiwgMHgwMGFkN2ZmZiwgMHgwMGIzN2ZmZiwgDQorCTB4MDBiOTdmZmYsIDB4MDBiZjdmZmYsIDB4MDBjNjdmZmYsIDB4MDBjYzdmZmYsIDB4MDBkMzdmZmYsIDB4MDBkYTdmZmYsIDB4MDBlMDdmZmYsIDB4MDBlNzdmZmYsIA0KKwkweDAwZWU3ZmZmLCAweDAwZjU3ZmZmLCAweDAwZmQ3ZmZmLCAweDAxMDQ3ZmZmLCAweDAxMGM3ZmZmLCAweDAxMTM3ZmZmLCAweDAxMWI3ZmZmLCAweDAxMjM3ZmZmLCANCisJMHgwMTJiN2ZmZiwgMHgwMTMzN2ZmZiwgMHgwMTNjN2ZmZSwgMHgwMTQ0N2ZmZSwgMHgwMTRkN2ZmZSwgMHgwMTU2N2ZmZSwgMHgwMTVmN2ZmZSwgMHgwMTY4N2ZmZSwgDQorCTB4MDE3MTdmZmUsIDB4MDE3YTdmZmUsIDB4MDE4MzdmZmUsIDB4MDE4ZDdmZmUsIDB4MDE5NzdmZmQsIDB4MDFhMTdmZmQsIDB4MDFhYjdmZmQsIDB4MDFiNTdmZmQsIA0KKwkweDAxYmY3ZmZkLCAweDAxY2E3ZmZkLCAweDAxZDQ3ZmZkLCAweDAxZGY3ZmZjLCAweDAxZWE3ZmZjLCAweDAxZjU3ZmZjLCAweDAyMDA3ZmZjLCAweDAyMGM3ZmZjLCANCisJMHgwMjE3N2ZmYywgMHgwMjIzN2ZmYiwgMHgwMjJmN2ZmYiwgMHgwMjNiN2ZmYiwgMHgwMjQ3N2ZmYiwgMHgwMjUzN2ZmYiwgMHgwMjYwN2ZmYSwgMHgwMjZkN2ZmYSwgDQorCTB4MDI3YTdmZmEsIDB4MDI4NzdmZmEsIDB4MDI5NDdmZjksIDB4MDJhMTdmZjksIDB4MDJhZjdmZjksIDB4MDJiYzdmZjksIDB4MDJjYTdmZjgsIDB4MDJkODdmZjgsIA0KKwkweDAyZTc3ZmY4LCAweDAyZjU3ZmY3LCAweDAzMDQ3ZmY3LCAweDAzMTI3ZmY3LCAweDAzMjE3ZmY2LCAweDAzMzE3ZmY2LCAweDAzNDA3ZmY1LCAweDAzNGY3ZmY1LCANCisJMHgwMzVmN2ZmNSwgMHgwMzZmN2ZmNCwgMHgwMzdmN2ZmNCwgMHgwMzhmN2ZmMywgMHgwM2EwN2ZmMywgMHgwM2IwN2ZmMiwgMHgwM2MxN2ZmMiwgMHgwM2QyN2ZmMSwgDQorCTB4MDNlMzdmZjEsIDB4MDNmNTdmZjAsIDB4MDQwNjdmZjAsIDB4MDQxODdmZWYsIDB4MDQyYTdmZWYsIDB4MDQzYzdmZWUsIDB4MDQ0ZjdmZWQsIDB4MDQ2MTdmZWQsIA0KKwkweDA0NzQ3ZmVjLCAweDA0ODc3ZmViLCAweDA0OWE3ZmViLCAweDA0YWU3ZmVhLCAweDA0YzE3ZmU5LCAweDA0ZDU3ZmU5LCAweDA0ZTk3ZmU4LCAweDA0ZmQ3ZmU3LCANCisJMHgwNTEyN2ZlNiwgMHgwNTI3N2ZlNSwgMHgwNTNiN2ZlNSwgMHgwNTUwN2ZlNCwgMHgwNTY2N2ZlMywgMHgwNTdiN2ZlMiwgMHgwNTkxN2ZlMSwgMHgwNWE3N2ZlMCwgDQorCTB4MDViZDdmZGYsIDB4MDVkMzdmZGUsIDB4MDVlYTdmZGQsIDB4MDYwMTdmZGMsIDB4MDYxODdmZGIsIDB4MDYyZjdmZGEsIDB4MDY0NjdmZDksIDB4MDY1ZTdmZDcsIA0KKwkweDA2NzY3ZmQ2LCAweDA2OGU3ZmQ1LCAweDA2YTY3ZmQ0LCAweDA2YmY3ZmQyLCAweDA2ZDg3ZmQxLCAweDA2ZjE3ZmQwLCAweDA3MGE3ZmNlLCAweDA3MjM3ZmNkLCANCisJMHgwNzNkN2ZjYywgMHgwNzU3N2ZjYSwgMHgwNzcxN2ZjOSwgMHgwNzhjN2ZjNywgMHgwN2E2N2ZjNSwgMHgwN2MxN2ZjNCwgMHgwN2RjN2ZjMiwgMHgwN2Y3N2ZjMCwgDQorCTB4MDgxMzdmYmYsIDB4MDgyZjdmYmQsIDB4MDg0YjdmYmIsIDB4MDg2NzdmYjksIDB4MDg4NDdmYjcsIDB4MDhhMDdmYjYsIDB4MDhiZDdmYjQsIDB4MDhkYTdmYjIsIA0KKwkweDA4Zjg3ZmFmLCAweDA5MTY3ZmFkLCAweDA5MzQ3ZmFiLCAweDA5NTI3ZmE5LCAweDA5NzA3ZmE3LCAweDA5OGY3ZmE1LCAweDA5YWU3ZmEyLCAweDA5Y2Q3ZmEwLCANCisJMHgwOWVjN2Y5ZCwgMHgwYTBjN2Y5YiwgMHgwYTJjN2Y5OCwgMHgwYTRjN2Y5NiwgMHgwYTZjN2Y5MywgMHgwYThkN2Y5MSwgMHgwYWFlN2Y4ZSwgMHgwYWNmN2Y4YiwgDQorCTB4MGFmMDdmODgsIDB4MGIxMjdmODUsIDB4MGIzMzdmODIsIDB4MGI1NTdmN2YsIDB4MGI3ODdmN2MsIDB4MGI5YTdmNzksIDB4MGJiZDdmNzYsIDB4MGJlMDdmNzMsIA0KKwkweDBjMDQ3ZjZmLCAweDBjMjc3ZjZjLCAweDBjNGI3ZjY5LCAweDBjNmY3ZjY1LCAweDBjOTM3ZjYxLCAweDBjYjg3ZjVlLCAweDBjZGQ3ZjVhLCAweDBkMDI3ZjU2LCANCisJMHgwZDI3N2Y1MywgMHgwZDRkN2Y0ZiwgMHgwZDczN2Y0YiwgMHgwZDk5N2Y0NywgMHgwZGJmN2Y0MywgMHgwZGU2N2YzZSwgMHgwZTBjN2YzYSwgMHgwZTM0N2YzNiwgDQorCTB4MGU1YjdmMzEsIDB4MGU4MzdmMmQsIDB4MGVhYTdmMjgsIDB4MGVkMzdmMjQsIDB4MGVmYjdmMWYsIDB4MGYyMzdmMWEsIDB4MGY0YzdmMTUsIDB4MGY3NTdmMTAsIA0KKwkweDBmOWY3ZjBiLCAweDBmYzg3ZjA2LCAweDBmZjI3ZjAxLCAweDEwMWM3ZWZiLCAweDEwNDc3ZWY2LCAweDEwNzE3ZWYwLCAweDEwOWM3ZWViLCAweDEwYzg3ZWU1LCANCisJMHgxMGYzN2VkZiwgMHgxMTFmN2VkYSwgMHgxMTRhN2VkNCwgMHgxMTc3N2VjZSwgMHgxMWEzN2VjNywgMHgxMWQwN2VjMSwgMHgxMWZkN2ViYiwgMHgxMjJhN2ViNCwgDQorCTB4MTI1NzdlYWUsIDB4MTI4NTdlYTcsIDB4MTJiMzdlYTAsIDB4MTJlMTdlOWEsIDB4MTMwZjdlOTMsIDB4MTMzZTdlOGMsIDB4MTM2ZDdlODQsIDB4MTM5YzdlN2QsIA0KKwkweDEzY2M3ZTc2LCAweDEzZmI3ZTZlLCAweDE0MmI3ZTY3LCAweDE0NWI3ZTVmLCAweDE0OGM3ZTU3LCAweDE0YmM3ZTRmLCAweDE0ZWQ3ZTQ3LCAweDE1MWU3ZTNmLCANCisJMHgxNTUwN2UzNywgMHgxNTgxN2UyZSwgMHgxNWIzN2UyNiwgMHgxNWU1N2UxZCwgMHgxNjE4N2UxNCwgMHgxNjRhN2UwYiwgMHgxNjdkN2UwMiwgMHgxNmIwN2RmOSwgDQorCTB4MTZlNDdkZjAsIDB4MTcxNzdkZTYsIDB4MTc0YjdkZGQsIDB4MTc3ZjdkZDMsIDB4MTdiMzdkYzksIDB4MTdlODdkYmYsIDB4MTgxZDdkYjUsIDB4MTg1MjdkYWIsIA0KKwkweDE4ODc3ZGExLCAweDE4YmM3ZDk2LCAweDE4ZjI3ZDhjLCAweDE5Mjg3ZDgxLCAweDE5NWU3ZDc2LCAweDE5OTU3ZDZiLCAweDE5Y2I3ZDYwLCAweDFhMDI3ZDU0LCANCisJMHgxYTM5N2Q0OSwgMHgxYTcxN2QzZCwgMHgxYWE4N2QzMSwgMHgxYWUwN2QyNiwgMHgxYjE4N2QxOSwgMHgxYjUwN2QwZCwgMHgxYjg5N2QwMSwgMHgxYmMyN2NmNCwgDQorCTB4MWJmYjdjZTgsIDB4MWMzNDdjZGIsIDB4MWM2ZDdjY2UsIDB4MWNhNzdjYzEsIDB4MWNlMTdjYjMsIDB4MWQxYjdjYTYsIDB4MWQ1NTdjOTgsIDB4MWQ4ZjdjOGEsIA0KKwkweDFkY2E3YzdjLCAweDFlMDU3YzZlLCAweDFlNDA3YzYwLCAweDFlN2I3YzUxLCAweDFlYjc3YzQzLCAweDFlZjM3YzM0LCAweDFmMmY3YzI1LCAweDFmNmI3YzE2LCANCisJMHgxZmE3N2MwNiwgMHgxZmU0N2JmNywgMHgyMDIxN2JlNywgMHgyMDVlN2JkNywgMHgyMDliN2JjNywgMHgyMGQ4N2JiNywgMHgyMTE2N2JhNiwgMHgyMTU0N2I5NiwgDQorCTB4MjE5MjdiODUsIDB4MjFkMDdiNzQsIDB4MjIwZTdiNjMsIDB4MjI0ZDdiNTIsIDB4MjI4YzdiNDAsIDB4MjJjYjdiMmUsIDB4MjMwYTdiMWMsIDB4MjM0OTdiMGEsIA0KKwkweDIzODk3YWY4LCAweDIzYzg3YWU2LCAweDI0MDg3YWQzLCAweDI0NDg3YWMwLCAweDI0ODk3YWFkLCAweDI0Yzk3YTlhLCAweDI1MGE3YTg2LCAweDI1NGI3YTczLCANCisJMHgyNThjN2E1ZiwgMHgyNWNkN2E0YiwgMHgyNjBlN2EzNiwgMHgyNjUwN2EyMiwgMHgyNjkxN2EwZCwgMHgyNmQzNzlmOCwgMHgyNzE1NzllMywgMHgyNzU3NzljZSwgDQorCTB4Mjc5YTc5YjgsIDB4MjdkYzc5YTMsIDB4MjgxZjc5OGQsIDB4Mjg2Mjc5NzcsIDB4MjhhNTc5NjAsIDB4MjhlODc5NGEsIDB4MjkyYjc5MzMsIDB4Mjk2Zjc5MWMsIA0KKwkweDI5YjI3OTA1LCAweDI5ZjY3OGVkLCAweDJhM2E3OGQ2LCAweDJhN2U3OGJlLCAweDJhYzI3OGE2LCAweDJiMDc3ODhkLCAweDJiNGI3ODc1LCAweDJiOTA3ODVjLCANCisJMHgyYmQ0Nzg0MywgMHgyYzE5NzgyYSwgMHgyYzVlNzgxMCwgMHgyY2E0NzdmNywgMHgyY2U5NzdkZCwgMHgyZDJlNzdjMywgMHgyZDc0NzdhOCwgMHgyZGJhNzc4ZSwgDQorCTB4MmRmZjc3NzMsIDB4MmU0NTc3NTgsIDB4MmU4Yjc3M2QsIDB4MmVkMjc3MjEsIDB4MmYxODc3MDYsIDB4MmY1ZTc2ZWEsIDB4MmZhNTc2Y2QsIDB4MmZlYzc2YjEsIA0KKwkweDMwMzI3Njk0LCAweDMwNzk3Njc3LCAweDMwYzA3NjVhLCAweDMxMDc3NjNkLCAweDMxNGU3NjFmLCAweDMxOTY3NjAxLCAweDMxZGQ3NWUzLCAweDMyMjU3NWM1LCANCisJMHgzMjZjNzVhNiwgMHgzMmI0NzU4OCwgMHgzMmZjNzU2OSwgMHgzMzQ0NzU0OSwgMHgzMzhjNzUyYSwgMHgzM2Q0NzUwYSwgMHgzNDFjNzRlYSwgMHgzNDY0NzRjYSwgDQorCTB4MzRhYzc0YTksIDB4MzRmNTc0ODgsIDB4MzUzZDc0NjcsIDB4MzU4NTc0NDYsIDB4MzVjZTc0MjQsIDB4MzYxNzc0MDMsIDB4MzY1ZjczZTEsIDB4MzZhODczYmUsIA0KKwkweDM2ZjE3MzljLCAweDM3M2E3Mzc5LCAweDM3ODM3MzU2LCAweDM3Y2M3MzMzLCAweDM4MTU3MzBmLCAweDM4NWU3MmVjLCAweDM4YTc3MmM4LCAweDM4ZjE3MmEzLCANCisJMHgzOTNhNzI3ZiwgMHgzOTgzNzI1YSwgMHgzOWNkNzIzNSwgMHgzYTE2NzIxMCwgMHgzYTYwNzFlYSwgMHgzYWE5NzFjNCwgMHgzYWYzNzE5ZSwgMHgzYjNjNzE3OCwgDQorCTB4M2I4NjcxNTEsIDB4M2JkMDcxMmIsIDB4M2MxOTcxMDQsIDB4M2M2MzcwZGMsIDB4M2NhZDcwYjUsIDB4M2NmNzcwOGQsIDB4M2Q0MDcwNjUsIDB4M2Q4YTcwM2MsIA0KKwkweDNkZDQ3MDE0LCAweDNlMWU2ZmViLCAweDNlNjg2ZmMyLCAweDNlYjE2Zjk4LCAweDNlZmI2ZjZmLCAweDNmNDU2ZjQ1LCAweDNmOGY2ZjFiLCAweDNmZDk2ZWYwLCANCisJMHg0MDIzNmVjNiwgMHg0MDZkNmU5YiwgMHg0MGI2NmU3MCwgMHg0MTAwNmU0NCwgMHg0MTRhNmUxOSwgMHg0MTk0NmRlZCwgMHg0MWRlNmRjMSwgMHg0MjI4NmQ5NCwgDQorCTB4NDI3MTZkNjgsIDB4NDJiYjZkM2IsIDB4NDMwNTZkMGQsIDB4NDM0ZjZjZTAsIDB4NDM5ODZjYjIsIDB4NDNlMjZjODQsIDB4NDQyYzZjNTYsIDB4NDQ3NTZjMjgsIA0KKwkweDQ0YmY2YmY5LCAweDQ1MDg2YmNhLCAweDQ1NTI2YjliLCAweDQ1OWI2YjZiLCAweDQ1ZTU2YjNjLCAweDQ2MmU2YjBjLCAweDQ2Nzg2YWRiLCAweDQ2YzE2YWFiLCANCisJMHg0NzBhNmE3YSwgMHg0NzUzNmE0OSwgMHg0NzljNmExOCwgMHg0N2U1NjllNywgMHg0ODJlNjliNSwgMHg0ODc3Njk4MywgMHg0OGMwNjk1MSwgMHg0OTA5NjkxZSwgDQorCTB4NDk1MjY4ZWMsIDB4NDk5YjY4YjksIDB4NDllMzY4ODUsIDB4NGEyYzY4NTIsIDB4NGE3NDY4MWUsIDB4NGFiZDY3ZWEsIDB4NGIwNTY3YjYsIDB4NGI0ZDY3ODIsIA0KKwkweDRiOTU2NzRkLCAweDRiZGU2NzE4LCAweDRjMjY2NmUzLCAweDRjNmQ2NmFlLCAweDRjYjU2Njc4LCAweDRjZmQ2NjQyLCAweDRkNDU2NjBjLCAweDRkOGM2NWQ2LCANCisJMHg0ZGQ0NjU5ZiwgMHg0ZTFiNjU2OCwgMHg0ZTYyNjUzMSwgMHg0ZWE5NjRmYSwgMHg0ZWYwNjRjMywgMHg0ZjM3NjQ4YiwgMHg0ZjdlNjQ1MywgMHg0ZmM1NjQxYiwgDQorCTB4NTAwYjYzZTIsIDB4NTA1MjYzYWEsIDB4NTA5ODYzNzEsIDB4NTBkZjYzMzgsIDB4NTEyNTYyZmUsIDB4NTE2YjYyYzUsIDB4NTFiMTYyOGIsIDB4NTFmNjYyNTEsIA0KKwkweDUyM2M2MjE3LCAweDUyODE2MWRjLCAweDUyYzc2MWEyLCAweDUzMGM2MTY3LCAweDUzNTE2MTJjLCAweDUzOTY2MGYxLCAweDUzZGI2MGI1LCAweDU0MjA2MDc5LCANCisJMHg1NDY0NjAzZCwgMHg1NGE5NjAwMSwgMHg1NGVkNWZjNSwgMHg1NTMxNWY4OCwgMHg1NTc1NWY0YiwgMHg1NWI5NWYwZSwgMHg1NWZjNWVkMSwgMHg1NjQwNWU5NCwgDQorCTB4NTY4MzVlNTYsIDB4NTZjNzVlMTgsIDB4NTcwYTVkZGEsIDB4NTc0ZDVkOWMsIDB4NTc4ZjVkNWUsIDB4NTdkMjVkMWYsIDB4NTgxNDVjZTAsIDB4NTg1NjVjYTEsIA0KKwkweDU4OTk1YzYyLCAweDU4ZGE1YzIzLCAweDU5MWM1YmUzLCAweDU5NWU1YmE0LCAweDU5OWY1YjY0LCAweDU5ZTA1YjI0LCAweDVhMjE1YWUzLCAweDVhNjI1YWEzCit9OworCisKKy8qCisgIGZvcm0gZmFjdG9yCisqLworLyogc3FydCgoKGkrKDE8PChGRl9TUVJUX0JJVFMtMikrMC41KS8yXjMxKSAqLworY29uc3QgV29yZDMyIGZvcm1mYWNfc3FydHRhYmxlWzk2XSA9IHsKKyAgMHgwMDA0MDdmOCwgMHgwMDA0MTdiOSwgMHgwMDA0MjczZiwgMHgwMDA0MzY4YywgMHgwMDA0NDVhMSwgMHgwMDA0NTQ4MywgMHgwMDA0NjMzMiwgMHgwMDA0NzFiMCwKKyAgMHgwMDA0ODAwMCwgMHgwMDA0OGUyMiwgMHgwMDA0OWMxYSwgMHgwMDA0YTllNywgMHgwMDA0Yjc4YywgMHgwMDA0YzUwYSwgMHgwMDA0ZDI2MywgMHgwMDA0ZGY5NiwKKyAgMHgwMDA0ZWNhNywgMHgwMDA0Zjk5NSwgMHgwMDA1MDY2MiwgMHgwMDA1MTMwZSwgMHgwMDA1MWY5YywgMHgwMDA1MmMwYSwgMHgwMDA1Mzg1YiwgMHgwMDA1NDQ5MCwKKyAgMHgwMDA1NTBhOCwgMHgwMDA1NWNhNSwgMHgwMDA1Njg4OCwgMHgwMDA1NzQ1MCwgMHgwMDA1ODAwMCwgMHgwMDA1OGI5NiwgMHgwMDA1OTcxNSwgMHgwMDA1YTI3YywKKyAgMHgwMDA1YWRjYywgMHgwMDA1YjkwNiwgMHgwMDA1YzQyYiwgMHgwMDA1Y2YzOSwgMHgwMDA1ZGEzMywgMHgwMDA1ZTUxOSwgMHgwMDA1ZWZlYSwgMHgwMDA1ZmFhOCwKKyAgMHgwMDA2MDU1MiwgMHgwMDA2MGZlYSwgMHgwMDA2MWE3MCwgMHgwMDA2MjRlMywgMHgwMDA2MmY0NSwgMHgwMDA2Mzk5NiwgMHgwMDA2NDNkNSwgMHgwMDA2NGUwNCwKKyAgMHgwMDA2NTgyMywgMHgwMDA2NjIzMSwgMHgwMDA2NmMzMCwgMHgwMDA2NzYxZiwgMHgwMDA2ODAwMCwgMHgwMDA2ODlkMSwgMHgwMDA2OTM5MywgMHgwMDA2OWQ0NywKKyAgMHgwMDA2YTZlZCwgMHgwMDA2YjA4NSwgMHgwMDA2YmExMCwgMHgwMDA2YzM4ZCwgMHgwMDA2Y2NmYywgMHgwMDA2ZDY1ZiwgMHgwMDA2ZGZiNSwgMHgwMDA2ZThmZSwKKyAgMHgwMDA2ZjIzYiwgMHgwMDA2ZmI2YywgMHgwMDA3MDQ5MCwgMHgwMDA3MGRhOSwgMHgwMDA3MTZiNiwgMHgwMDA3MWZiOCwgMHgwMDA3MjhhZSwgMHgwMDA3MzE5OSwKKyAgMHgwMDA3M2E3OSwgMHgwMDA3NDM0ZSwgMHgwMDA3NGMxOSwgMHgwMDA3NTRkOSwgMHgwMDA3NWQ4ZSwgMHgwMDA3NjYzYSwgMHgwMDA3NmVkYiwgMHgwMDA3Nzc3MiwKKyAgMHgwMDA3ODAwMCwgMHgwMDA3ODg4MywgMHgwMDA3OTBmZCwgMHgwMDA3OTk2ZSwgMHgwMDA3YTFkNSwgMHgwMDA3YWEzMywgMHgwMDA3YjI4OCwgMHgwMDA3YmFkNCwKKyAgMHgwMDA3YzMxOCwgMHgwMDA3Y2I1MiwgMHgwMDA3ZDM4NCwgMHgwMDA3ZGJhZCwgMHgwMDA3ZTNjZSwgMHgwMDA3ZWJlNiwgMHgwMDA3ZjNmNiwgMHgwMDA3ZmJmZQorfTsKKworCisKKy8qIQorICBcbmFtZSAgICBxdWFudGl6ZXIgYW5kIGludmVyc2UgcXVhbnRpemVyIHRhYmxlcworCisgIFxicmllZiAgIHRoZXNlIHRhYmxlcyBhcmUgdXNlZCBmb3IgdGhlIG5vbgorICAgICAgICAgICBsaW5lYXIgcXVhbnRpemVyIGFuZCBpbnZlcnNlIHF1YW50aXplcgorICAgICAgICAgICAKKyovCitjb25zdCBXb3JkMzIgbVRhYl8zXzRbNTEyXSA9IHsKKwkweDRjMWJmODI5LCAweDRjMzg4MGRlLCAweDRjNTUwNjAzLCAweDRjNzE4NzljLCAKKwkweDRjOGUwNWFhLCAweDRjYWE4MDMwLCAweDRjYzZmNzJmLCAweDRjZTM2YWFiLCAKKwkweDRjZmZkYWE0LCAweDRkMWM0NzFkLCAweDRkMzhiMDE5LCAweDRkNTUxNTlhLCAKKwkweDRkNzE3N2ExLCAweDRkOGRkNjMxLCAweDRkYWEzMTRiLCAweDRkYzY4OGYzLCAKKwkweDRkZTJkZDJhLCAweDRkZmYyZGYyLCAweDRlMWI3YjRkLCAweDRlMzdjNTNkLCAKKwkweDRlNTQwYmM1LCAweDRlNzA0ZWU2LCAweDRlOGM4ZWEzLCAweDRlYThjYWZkLCAKKwkweDRlYzUwM2Y3LCAweDRlZTEzOTkyLCAweDRlZmQ2YmQwLCAweDRmMTk5YWI0LCAKKwkweDRmMzVjNjQwLCAweDRmNTFlZTc1LCAweDRmNmUxMzU2LCAweDRmOGEzNGU0LCAKKwkweDRmYTY1MzIxLCAweDRmYzI2ZTEwLCAweDRmZGU4NWIyLCAweDRmZmE5YTBhLCAKKwkweDUwMTZhYjE4LCAweDUwMzJiOGUwLCAweDUwNGVjMzYyLCAweDUwNmFjYWExLCAKKwkweDUwODZjZWEwLCAweDUwYTJjZjVlLCAweDUwYmVjY2UwLCAweDUwZGFjNzI1LCAKKwkweDUwZjZiZTMxLCAweDUxMTJiMjA1LCAweDUxMmVhMmEzLCAweDUxNGE5MDBkLCAKKwkweDUxNjY3YTQ1LCAweDUxODI2MTRjLCAweDUxOWU0NTI0LCAweDUxYmEyNWNmLCAKKwkweDUxZDYwMzUwLCAweDUxZjFkZGE3LCAweDUyMGRiNGQ2LCAweDUyMjk4OGUwLCAKKwkweDUyNDU1OWM2LCAweDUyNjEyNzg5LCAweDUyN2NmMjJkLCAweDUyOThiOWIxLCAKKwkweDUyYjQ3ZTE5LCAweDUyZDAzZjY1LCAweDUyZWJmZDk4LCAweDUzMDdiOGI0LCAKKwkweDUzMjM3MGI5LCAweDUzM2YyNWFhLCAweDUzNWFkNzg5LCAweDUzNzY4NjU2LCAKKwkweDUzOTIzMjE1LCAweDUzYWRkYWM2LCAweDUzYzk4MDZiLCAweDUzZTUyMzA2LCAKKwkweDU0MDBjMjk4LCAweDU0MWM1ZjI0LCAweDU0MzdmOGFiLCAweDU0NTM4ZjJlLCAKKwkweDU0NmYyMmFmLCAweDU0OGFiMzMwLCAweDU0YTY0MGIzLCAweDU0YzFjYjM4LCAKKwkweDU0ZGQ1MmMyLCAweDU0ZjhkNzUzLCAweDU1MTQ1OGViLCAweDU1MmZkNzhkLCAKKwkweDU1NGI1MzM5LCAweDU1NjZjYmYzLCAweDU1ODI0MWJiLCAweDU1OWRiNDkyLCAKKwkweDU1YjkyNDdiLCAweDU1ZDQ5MTc3LCAweDU1ZWZmYjg3LCAweDU2MGI2MmFkLCAKKwkweDU2MjZjNmViLCAweDU2NDIyODQyLCAweDU2NWQ4NmI0LCAweDU2NzhlMjQyLCAKKwkweDU2OTQzYWVlLCAweDU2YWY5MGI5LCAweDU2Y2FlM2E0LCAweDU2ZTYzM2IyLCAKKwkweDU3MDE4MGU0LCAweDU3MWNjYjNiLCAweDU3MzgxMmI4LCAweDU3NTM1NzVlLCAKKwkweDU3NmU5OTJlLCAweDU3ODlkODI5LCAweDU3YTUxNDUwLCAweDU3YzA0ZGE2LCAKKwkweDU3ZGI4NDJiLCAweDU3ZjZiN2UxLCAweDU4MTFlOGM5LCAweDU4MmQxNmU2LCAKKwkweDU4NDg0MjM4LCAweDU4NjM2YWMwLCAweDU4N2U5MDgxLCAweDU4OTliMzdjLCAKKwkweDU4YjRkM2IxLCAweDU4Y2ZmMTIzLCAweDU4ZWIwYmQzLCAweDU5MDYyM2MyLCAKKwkweDU5MjEzOGYyLCAweDU5M2M0YjYzLCAweDU5NTc1YjE5LCAweDU5NzI2ODEyLCAKKwkweDU5OGQ3MjUzLCAweDU5YTg3OWRhLCAweDU5YzM3ZWFiLCAweDU5ZGU4MGM2LCAKKwkweDU5Zjk4MDJkLCAweDVhMTQ3Y2UwLCAweDVhMmY3NmUyLCAweDVhNGE2ZTM0LCAKKwkweDVhNjU2MmQ2LCAweDVhODA1NGNiLCAweDVhOWI0NDE0LCAweDVhYjYzMGIyLCAKKwkweDVhZDExYWE2LCAweDVhZWMwMWYxLCAweDViMDZlNjk2LCAweDViMjFjODk1LCAKKwkweDViM2NhN2VmLCAweDViNTc4NGE2LCAweDViNzI1ZWJjLCAweDViOGQzNjMxLCAKKwkweDViYTgwYjA2LCAweDViYzJkZDNlLCAweDViZGRhY2Q5LCAweDViZjg3OWQ4LCAKKwkweDVjMTM0NDNkLCAweDVjMmUwYzA5LCAweDVjNDhkMTNlLCAweDVjNjM5M2RjLCAKKwkweDVjN2U1M2U1LCAweDVjOTkxMTVhLCAweDVjYjNjYzNjLCAweDVjY2U4NDhkLCAKKwkweDVjZTkzYTRlLCAweDVkMDNlZDgwLCAweDVkMWU5ZTI0LCAweDVkMzk0YzNiLCAKKwkweDVkNTNmN2M3LCAweDVkNmVhMGM5LCAweDVkODk0NzQyLCAweDVkYTNlYjMzLCAKKwkweDVkYmU4YzllLCAweDVkZDkyYjg0LCAweDVkZjNjN2U1LCAweDVlMGU2MWMzLCAKKwkweDVlMjhmOTIwLCAweDVlNDM4ZGZjLCAweDVlNWUyMDU5LCAweDVlNzhiMDM3LCAKKwkweDVlOTMzZDk5LCAweDVlYWRjODdlLCAweDVlYzg1MGU5LCAweDVlZTJkNmRhLCAKKwkweDVlZmQ1YTUzLCAweDVmMTdkYjU0LCAweDVmMzI1OWUwLCAweDVmNGNkNWY2LCAKKwkweDVmNjc0Zjk5LCAweDVmODFjNmM4LCAweDVmOWMzYjg3LCAweDVmYjZhZGQ0LCAKKwkweDVmZDExZGIzLCAweDVmZWI4YjIzLCAweDYwMDVmNjI2LCAweDYwMjA1ZWJkLCAKKwkweDYwM2FjNGU5LCAweDYwNTUyOGFjLCAweDYwNmY4YTA1LCAweDYwODllOGY3LCAKKwkweDYwYTQ0NTgzLCAweDYwYmU5ZmE5LCAweDYwZDhmNzZiLCAweDYwZjM0Y2NhLCAKKwkweDYxMGQ5ZmM3LCAweDYxMjdmMDYyLCAweDYxNDIzZTllLCAweDYxNWM4YTdhLCAKKwkweDYxNzZkM2Y5LCAweDYxOTExYjFiLCAweDYxYWI1ZmUxLCAweDYxYzVhMjRkLCAKKwkweDYxZGZlMjVmLCAweDYxZmEyMDE4LCAweDYyMTQ1YjdhLCAweDYyMmU5NDg1LCAKKwkweDYyNDhjYjNiLCAweDYyNjJmZjlkLCAweDYyN2QzMWFiLCAweDYyOTc2MTY3LCAKKwkweDYyYjE4ZWQxLCAweDYyY2JiOWViLCAweDYyZTVlMmI2LCAweDYzMDAwOTMzLCAKKwkweDYzMWEyZDYyLCAweDYzMzQ0ZjQ1LCAweDYzNGU2ZWRkLCAweDYzNjg4YzJiLCAKKwkweDYzODJhNzMwLCAweDYzOWNiZmVjLCAweDYzYjZkNjYxLCAweDYzZDBlYTkwLCAKKwkweDYzZWFmYzdhLCAweDY0MDUwYzFmLCAweDY0MWYxOTgyLCAweDY0MzkyNGEyLCAKKwkweDY0NTMyZDgwLCAweDY0NmQzNDFmLCAweDY0ODczODdlLCAweDY0YTEzYTllLCAKKwkweDY0YmIzYTgxLCAweDY0ZDUzODI4LCAweDY0ZWYzMzkzLCAweDY1MDkyY2M0LCAKKwkweDY1MjMyM2JiLCAweDY1M2QxODc5LCAweDY1NTcwYjAwLCAweDY1NzBmYjUwLCAKKwkweDY1OGFlOTZiLCAweDY1YTRkNTUwLCAweDY1YmViZjAxLCAweDY1ZDhhNjgwLCAKKwkweDY1ZjI4YmNjLCAweDY2MGM2ZWU4LCAweDY2MjY0ZmQzLCAweDY2NDAyZThmLCAKKwkweDY2NWEwYjFjLCAweDY2NzNlNTdkLCAweDY2OGRiZGIwLCAweDY2YTc5M2I4LCAKKwkweDY2YzE2Nzk1LCAweDY2ZGIzOTQ5LCAweDY2ZjUwOGQ0LCAweDY3MGVkNjM2LCAKKwkweDY3MjhhMTcyLCAweDY3NDI2YTg3LCAweDY3NWMzMTc3LCAweDY3NzVmNjQzLCAKKwkweDY3OGZiOGViLCAweDY3YTk3OTcxLCAweDY3YzMzN2Q1LCAweDY3ZGNmNDE4LCAKKwkweDY3ZjZhZTNiLCAweDY4MTA2NjNmLCAweDY4MmExYzI1LCAweDY4NDNjZmVkLCAKKwkweDY4NWQ4MTk5LCAweDY4NzczMTI5LCAweDY4OTBkZTlmLCAweDY4YWE4OWZhLCAKKwkweDY4YzQzMzNkLCAweDY4ZGRkYTY3LCAweDY4Zjc3ZjdhLCAweDY5MTEyMjc3LCAKKwkweDY5MmFjMzVlLCAweDY5NDQ2MjMwLCAweDY5NWRmZWVlLCAweDY5Nzc5OTlhLCAKKwkweDY5OTEzMjMyLCAweDY5YWFjOGJhLCAweDY5YzQ1ZDMxLCAweDY5ZGRlZjk4LCAKKwkweDY5Zjc3ZmYwLCAweDZhMTEwZTNhLCAweDZhMmE5YTc3LCAweDZhNDQyNGE4LCAKKwkweDZhNWRhY2NjLCAweDZhNzczMmU2LCAweDZhOTBiNmY2LCAweDZhYWEzOGZkLCAKKwkweDZhYzNiOGZiLCAweDZhZGQzNmYyLCAweDZhZjZiMmUyLCAweDZiMTAyY2NkLCAKKwkweDZiMjlhNGIyLCAweDZiNDMxYTkyLCAweDZiNWM4ZTZmLCAweDZiNzYwMDRhLCAKKwkweDZiOGY3MDIyLCAweDZiYThkZGY5LCAweDZiYzI0OWQwLCAweDZiZGJiM2E3LCAKKwkweDZiZjUxYjgwLCAweDZjMGU4MTVhLCAweDZjMjdlNTM3LCAweDZjNDE0NzE4LCAKKwkweDZjNWFhNmZkLCAweDZjNzQwNGU3LCAweDZjOGQ2MGQ3LCAweDZjYTZiYWNlLCAKKwkweDZjYzAxMmNjLCAweDZjZDk2OGQyLCAweDZjZjJiY2UxLCAweDZkMGMwZWY5LCAKKwkweDZkMjU1ZjFkLCAweDZkM2VhZDRiLCAweDZkNTdmOTg1LCAweDZkNzE0M2NjLCAKKwkweDZkOGE4YzIxLCAweDZkYTNkMjgzLCAweDZkYmQxNmY1LCAweDZkZDY1OTc2LCAKKwkweDZkZWY5YTA4LCAweDZlMDhkOGFiLCAweDZlMjIxNTYwLCAweDZlM2I1MDI3LCAKKwkweDZlNTQ4OTAyLCAweDZlNmRiZmYxLCAweDZlODZmNGY1LCAweDZlYTAyODBlLCAKKwkweDZlYjk1OTNlLCAweDZlZDI4ODg1LCAweDZlZWJiNWUzLCAweDZmMDRlMTVhLCAKKwkweDZmMWUwYWVhLCAweDZmMzczMjk0LCAweDZmNTA1ODU5LCAweDZmNjk3YzM5LCAKKwkweDZmODI5ZTM1LCAweDZmOWJiZTRlLCAweDZmYjRkYzg1LCAweDZmY2RmOGQ5LCAKKwkweDZmZTcxMzRkLCAweDcwMDAyYmUwLCAweDcwMTk0MjkzLCAweDcwMzI1NzY3LCAKKwkweDcwNGI2YTVkLCAweDcwNjQ3Yjc2LCAweDcwN2Q4YWIxLCAweDcwOTY5ODExLCAKKwkweDcwYWZhMzk0LCAweDcwYzhhZDNkLCAweDcwZTFiNTBjLCAweDcwZmFiYjAxLCAKKwkweDcxMTNiZjFkLCAweDcxMmNjMTYxLCAweDcxNDVjMWNlLCAweDcxNWVjMDY0LCAKKwkweDcxNzdiZDI0LCAweDcxOTBiODBmLCAweDcxYTliMTI0LCAweDcxYzJhODY2LCAKKwkweDcxZGI5ZGQ0LCAweDcxZjQ5MTcwLCAweDcyMGQ4MzM5LCAweDcyMjY3MzMxLCAKKwkweDcyM2Y2MTU5LCAweDcyNTg0ZGIwLCAweDcyNzEzODM4LCAweDcyOGEyMGYxLCAKKwkweDcyYTMwN2RiLCAweDcyYmJlY2Y5LCAweDcyZDRkMDQ5LCAweDcyZWRiMWNlLCAKKwkweDczMDY5MTg3LCAweDczMWY2Zjc1LCAweDczMzg0Yjk4LCAweDczNTEyNWYzLCAKKwkweDczNjlmZTg0LCAweDczODJkNTRkLCAweDczOWJhYTRlLCAweDczYjQ3ZDg5LCAKKwkweDczY2Q0ZWZkLCAweDczZTYxZWFiLCAweDczZmVlYzk0LCAweDc0MTdiOGI4LCAKKwkweDc0MzA4MzE5LCAweDc0NDk0YmI2LCAweDc0NjIxMjkxLCAweDc0N2FkN2FhLCAKKwkweDc0OTM5YjAyLCAweDc0YWM1Yzk4LCAweDc0YzUxYzZmLCAweDc0ZGRkYTg2LCAKKwkweDc0ZjY5NmRlLCAweDc1MGY1MTc4LCAweDc1MjgwYTU0LCAweDc1NDBjMTc0LCAKKwkweDc1NTk3NmQ3LCAweDc1NzIyYTdlLCAweDc1OGFkYzY5LCAweDc1YTM4YzliLCAKKwkweDc1YmMzYjEyLCAweDc1ZDRlN2NmLCAweDc1ZWQ5MmQ0LCAweDc2MDYzYzIxLCAKKwkweDc2MWVlM2I2LCAweDc2Mzc4OTk0LCAweDc2NTAyZGJjLCAweDc2NjhkMDJlLCAKKwkweDc2ODE3MGViLCAweDc2OWEwZmYzLCAweDc2YjJhZDQ3LCAweDc2Y2I0OGU3LCAKKwkweDc2ZTNlMmQ1LCAweDc2ZmM3YjEwLCAweDc3MTUxMTlhLCAweDc3MmRhNjczLCAKKwkweDc3NDYzOTliLCAweDc3NWVjYjEzLCAweDc3Nzc1YWRjLCAweDc3OGZlOGY2LCAKKwkweDc3YTg3NTYxLCAweDc3YzEwMDFmLCAweDc3ZDk4OTMwLCAweDc3ZjIxMDk1LCAKKwkweDc4MGE5NjRkLCAweDc4MjMxYTViLCAweDc4M2I5Y2JkLCAweDc4NTQxZDc1LCAKKwkweDc4NmM5Yzg0LCAweDc4ODUxOWU5LCAweDc4OWQ5NWE2LCAweDc4YjYwZmJiLCAKKwkweDc4Y2U4ODI4LCAweDc4ZTZmZWVmLCAweDc4ZmY3NDBmLCAweDc5MTdlNzhhLCAKKwkweDc5MzA1OTVmLCAweDc5NDhjOTkwLCAweDc5NjEzODFkLCAweDc5NzlhNTA2LCAKKwkweDc5OTIxMDRjLCAweDc5YWE3OWYwLCAweDc5YzJlMWYxLCAweDc5ZGI0ODUyLCAKKwkweDc5ZjNhZDExLCAweDdhMGMxMDMxLCAweDdhMjQ3MWIwLCAweDdhM2NkMTkxLCAKKwkweDdhNTUyZmQzLCAweDdhNmQ4Yzc2LCAweDdhODVlNzdkLCAweDdhOWU0MGU2LCAKKwkweDdhYjY5OGIyLCAweDdhY2VlZWUzLCAweDdhZTc0Mzc4LCAweDdhZmY5NjczLCAKKwkweDdiMTdlN2QyLCAweDdiMzAzNzk5LCAweDdiNDg4NWM1LCAweDdiNjBkMjU5LCAKKwkweDdiNzkxZDU1LCAweDdiOTE2NmI5LCAweDdiYTlhZTg2LCAweDdiYzFmNGJjLCAKKwkweDdiZGEzOTVjLCAweDdiZjI3YzY2LCAweDdjMGFiZGRiLCAweDdjMjJmZGJiLCAKKwkweDdjM2IzYzA3LCAweDdjNTM3OGMwLCAweDdjNmJiM2U1LCAweDdjODNlZDc4LCAKKwkweDdjOWMyNTc5LCAweDdjYjQ1YmU5LCAweDdjY2M5MGM3LCAweDdjZTRjNDE0LCAKKwkweDdjZmNmNWQyLCAweDdkMTUyNjAwLCAweDdkMmQ1NDlmLCAweDdkNDU4MWIwLCAKKwkweDdkNWRhZDMyLCAweDdkNzVkNzI3LCAweDdkOGRmZjhmLCAweDdkYTYyNjZhLCAKKwkweDdkYmU0YmJhLCAweDdkZDY2ZjdkLCAweDdkZWU5MWI2LCAweDdlMDZiMjY0LCAKKwkweDdlMWVkMTg4LCAweDdlMzZlZjIyLCAweDdlNGYwYjM0LCAweDdlNjcyNWJkLCAKKwkweDdlN2YzZWJkLCAweDdlOTc1NjM2LCAweDdlYWY2YzI4LCAweDdlYzc4MDkzLCAKKwkweDdlZGY5Mzc4LCAweDdlZjdhNGQ3LCAweDdmMGZiNGIxLCAweDdmMjdjMzA3LCAKKwkweDdmM2ZjZmQ4LCAweDdmNTdkYjI1LCAweDdmNmZlNGVmLCAweDdmODdlZDM2LCAKKwkweDdmOWZmM2ZiLCAweDdmYjdmOTNlLCAweDdmY2ZmY2ZmLCAweDdmZTdmZjQwCit9OworCitjb25zdCBXb3JkMzIgbVRhYl80XzNbNTEyXT17CisJMHgzMmNiZmQ0YSwgMHgzMmVkZGQ3MCwgMHgzMzBmYzMzOSwgMHgzMzMxYWVhMywgCisJMHgzMzUzOWZhYywgMHgzMzc1OTY1MiwgMHgzMzk3OTI5NCwgMHgzM2I5OTQ3MCwgCisJMHgzM2RiOWJlNCwgMHgzM2ZkYThlZCwgMHgzNDFmYmI4YiwgMHgzNDQxZDNiYiwgCisJMHgzNDYzZjE3YywgMHgzNDg2MTRjYywgMHgzNGE4M2RhOCwgMHgzNGNhNmMxMCwgCisJMHgzNGVjYTAwMSwgMHgzNTBlZDk3OSwgMHgzNTMxMTg3NywgMHgzNTUzNWNmYSwgCisJMHgzNTc1YTZmZSwgMHgzNTk3ZjY4MywgMHgzNWJhNGI4NywgMHgzNWRjYTYwNywgCisJMHgzNWZmMDYwMywgMHgzNjIxNmI3OCwgMHgzNjQzZDY2NSwgMHgzNjY2NDZjNywgCisJMHgzNjg4YmM5ZSwgMHgzNmFiMzdlOCwgMHgzNmNkYjhhMiwgMHgzNmYwM2VjYiwgCisJMHgzNzEyY2E2MiwgMHgzNzM1NWI2NCwgMHgzNzU3ZjFkMSwgMHgzNzdhOGRhNSwgCisJMHgzNzlkMmVlMCwgMHgzN2JmZDU4MCwgMHgzN2UyODE4NCwgMHgzODA1MzJlOCwgCisJMHgzODI3ZTlhZCwgMHgzODRhYTVkMCwgMHgzODZkNjc0ZiwgMHgzODkwMmUyYSwgCisJMHgzOGIyZmE1ZCwgMHgzOGQ1Y2JlOSwgMHgzOGY4YTJjYSwgMHgzOTFiN2VmZiwgCisJMHgzOTNlNjA4OCwgMHgzOTYxNDc2MSwgMHgzOTg0MzM4YSwgMHgzOWE3MjUwMSwgCisJMHgzOWNhMWJjNCwgMHgzOWVkMTdkMSwgMHgzYTEwMTkyOCwgMHgzYTMzMWZjNiwgCisJMHgzYTU2MmJhYSwgMHgzYTc5M2NkMiwgMHgzYTljNTMzZCwgMHgzYWJmNmVlOSwgCisJMHgzYWUyOGZkNSwgMHgzYjA1YjVmZiwgMHgzYjI4ZTE2NSwgMHgzYjRjMTIwNiwgCisJMHgzYjZmNDdlMCwgMHgzYjkyODJmMiwgMHgzYmI1YzMzYSwgMHgzYmQ5MDhiNywgCisJMHgzYmZjNTM2OCwgMHgzYzFmYTM0OSwgMHgzYzQyZjg1YiwgMHgzYzY2NTI5YywgCisJMHgzYzg5YjIwOSwgMHgzY2FkMTZhMiwgMHgzY2QwODA2NSwgMHgzY2YzZWY1MSwgCisJMHgzZDE3NjM2NCwgMHgzZDNhZGM5YywgMHgzZDVlNWFmOCwgMHgzZDgxZGU3NywgCisJMHgzZGE1NjcxNywgMHgzZGM4ZjRkNiwgMHgzZGVjODdiNCwgMHgzZTEwMWZhZSwgCisJMHgzZTMzYmNjMywgMHgzZTU3NWVmMiwgMHgzZTdiMDYzYSwgMHgzZTllYjI5OCwgCisJMHgzZWMyNjQwYywgMHgzZWU2MWE5MywgMHgzZjA5ZDYyZCwgMHgzZjJkOTZkOCwgCisJMHgzZjUxNWM5MywgMHgzZjc1Mjc1YiwgMHgzZjk4ZjczMSwgMHgzZmJjY2MxMSwgCisJMHgzZmUwYTVmYywgMHg0MDA0ODRlZiwgMHg0MDI4NjhlYSwgMHg0MDRjNTFlOSwgCisJMHg0MDcwM2ZlZSwgMHg0MDk0MzJmNSwgMHg0MGI4MmFmZCwgMHg0MGRjMjgwNiwgCisJMHg0MTAwMmEwZCwgMHg0MTI0MzExMSwgMHg0MTQ4M2QxMiwgMHg0MTZjNGUwZCwgCisJMHg0MTkwNjQwMSwgMHg0MWI0N2VlZCwgMHg0MWQ4OWVjZiwgMHg0MWZjYzNhNywgCisJMHg0MjIwZWQ3MiwgMHg0MjQ1MWMzMCwgMHg0MjY5NGZkZSwgMHg0MjhkODg3ZCwgCisJMHg0MmIxYzYwOSwgMHg0MmQ2MDg4MywgMHg0MmZhNGZlOCwgMHg0MzFlOWMzNywgCisJMHg0MzQyZWQ3MCwgMHg0MzY3NDM5MCwgMHg0MzhiOWU5NiwgMHg0M2FmZmU4MiwgCisJMHg0M2Q0NjM1MSwgMHg0M2Y4Y2QwMywgMHg0NDFkM2I5NSwgMHg0NDQxYWYwOCwgCisJMHg0NDY2Mjc1OCwgMHg0NDhhYTQ4NywgMHg0NGFmMjY5MCwgMHg0NGQzYWQ3NSwgCisJMHg0NGY4MzkzMywgMHg0NTFjYzljOCwgMHg0NTQxNWYzNSwgMHg0NTY1Zjk3NywgCisJMHg0NThhOTg4ZCwgMHg0NWFmM2M3NiwgMHg0NWQzZTUzMSwgMHg0NWY4OTJiYywgCisJMHg0NjFkNDUxNiwgMHg0NjQxZmMzZSwgMHg0NjY2YjgzMiwgMHg0NjhiNzhmMiwgCisJMHg0NmIwM2U3YywgMHg0NmQ1MDhjZiwgMHg0NmY5ZDdlOSwgMHg0NzFlYWJjYSwgCisJMHg0NzQzODQ3MCwgMHg0NzY4NjFkOSwgMHg0NzhkNDQwNiwgMHg0N2IyMmFmMywgCisJMHg0N2Q3MTZhMSwgMHg0N2ZjMDcwZSwgMHg0ODIwZmMzOSwgMHg0ODQ1ZjYyMCwgCisJMHg0ODZhZjRjMywgMHg0ODhmZjgyMCwgMHg0OGI1MDAzNSwgMHg0OGRhMGQwMywgCisJMHg0OGZmMWU4NywgMHg0OTI0MzRjMCwgMHg0OTQ5NGZhZCwgMHg0OTZlNmY0ZCwgCisJMHg0OTkzOTM5ZiwgMHg0OWI4YmNhMiwgMHg0OWRkZWE1NCwgMHg0YTAzMWNiNCwgCisJMHg0YTI4NTNjMSwgMHg0YTRkOGY3YSwgMHg0YTcyY2ZkZSwgMHg0YTk4MTRlYiwgCisJMHg0YWJkNWVhMSwgMHg0YWUyYWNmZCwgMHg0YjA4MDAwMCwgMHg0YjJkNTdhOCwgCisJMHg0YjUyYjNmMywgMHg0Yjc4MTRlMSwgMHg0YjlkN2E3MCwgMHg0YmMyZTQ5ZiwgCisJMHg0YmU4NTM2ZSwgMHg0YzBkYzZkYiwgMHg0YzMzM2VlNCwgMHg0YzU4YmI4OSwgCisJMHg0YzdlM2NjOSwgMHg0Y2EzYzJhMiwgMHg0Y2M5NGQxNCwgMHg0Y2VlZGMxYywgCisJMHg0ZDE0NmZiYiwgMHg0ZDNhMDdlZiwgMHg0ZDVmYTRiNiwgMHg0ZDg1NDYxMSwgCisJMHg0ZGFhZWJmZCwgMHg0ZGQwOTY3OSwgMHg0ZGY2NDU4NSwgMHg0ZTFiZjkxZiwgCisJMHg0ZTQxYjE0NiwgMHg0ZTY3NmRmYSwgMHg0ZThkMmYzOCwgMHg0ZWIyZjUwMSwgCisJMHg0ZWQ4YmY1MiwgMHg0ZWZlOGUyYiwgMHg0ZjI0NjE4YSwgMHg0ZjRhMzk3MCwgCisJMHg0ZjcwMTVkOSwgMHg0Zjk1ZjZjNiwgMHg0ZmJiZGMzNiwgMHg0ZmUxYzYyNiwgCisJMHg1MDA3YjQ5NywgMHg1MDJkYTc4NywgMHg1MDUzOWVmNSwgMHg1MDc5OWFlMSwgCisJMHg1MDlmOWI0OCwgMHg1MGM1YTAyYSwgMHg1MGViYTk4NSwgMHg1MTExYjc1YSwgCisJMHg1MTM3YzlhNiwgMHg1MTVkZTA2OSwgMHg1MTgzZmJhMiwgMHg1MWFhMWI0ZiwgCisJMHg1MWQwM2Y3MCwgMHg1MWY2NjgwMywgMHg1MjFjOTUwOCwgMHg1MjQyYzY3ZCwgCisJMHg1MjY4ZmM2MiwgMHg1MjhmMzZiNSwgMHg1MmI1NzU3NSwgMHg1MmRiYjhhMiwgCisJMHg1MzAyMDAzYSwgMHg1MzI4NGMzYywgMHg1MzRlOWNhOCwgMHg1Mzc0ZjE3YywgCisJMHg1MzliNGFiNywgMHg1M2MxYTg1OCwgMHg1M2U4MGE1ZiwgMHg1NDBlNzBjYSwgCisJMHg1NDM0ZGI5OCwgMHg1NDViNGFjOCwgMHg1NDgxYmU1YSwgMHg1NGE4MzY0YiwgCisJMHg1NGNlYjI5YywgMHg1NGY1MzM0YywgMHg1NTFiYjg1OCwgMHg1NTQyNDFjMSwgCisJMHg1NTY4Y2Y4NSwgMHg1NThmNjFhMywgMHg1NWI1ZjgxYiwgMHg1NWRjOTJlYiwgCisJMHg1NjAzMzIxMiwgMHg1NjI5ZDU5MCwgMHg1NjUwN2Q2MywgMHg1Njc3Mjk4YSwgCisJMHg1NjlkZGEwNSwgMHg1NmM0OGVkMywgMHg1NmViNDdmMiwgMHg1NzEyMDU2MiwgCisJMHg1NzM4YzcyMSwgMHg1NzVmOGQyZiwgMHg1Nzg2NTc4YSwgMHg1N2FkMjYzMywgCisJMHg1N2QzZjkyNywgMHg1N2ZhZDA2NiwgMHg1ODIxYWJlZiwgMHg1ODQ4OGJjMCwgCisJMHg1ODZmNmZkYSwgMHg1ODk2NTgzYiwgMHg1OGJkNDRlMiwgMHg1OGU0MzVjZSwgCisJMHg1OTBiMmFmZiwgMHg1OTMyMjQ3MywgMHg1OTU5MjIyOSwgMHg1OTgwMjQyMCwgCisJMHg1OWE3MmE1OSwgMHg1OWNlMzRkMCwgMHg1OWY1NDM4NywgMHg1YTFjNTY3YiwgCisJMHg1YTQzNmRhYywgMHg1YTZhODkxOSwgMHg1YTkxYThjMSwgMHg1YWI4Y2NhMywgCisJMHg1YWRmZjRiZSwgMHg1YjA3MjExMSwgMHg1YjJlNTE5YywgMHg1YjU1ODY1ZSwgCisJMHg1YjdjYmY1NCwgMHg1YmEzZmM4MCwgMHg1YmNiM2RkZiwgMHg1YmYyODM3MSwgCisJMHg1YzE5Y2QzNSwgMHg1YzQxMWIyYSwgMHg1YzY4NmQ0ZiwgMHg1YzhmYzNhNCwgCisJMHg1Y2I3MWUyNywgMHg1Y2RlN2NkNywgMHg1ZDA1ZGZiNCwgMHg1ZDJkNDZiZCwgCisJMHg1ZDU0YjFmMCwgMHg1ZDdjMjE0ZSwgMHg1ZGEzOTRkNCwgMHg1ZGNiMGM4MywgCisJMHg1ZGYyODg1OSwgMHg1ZTFhMDg1NiwgMHg1ZTQxOGM3OCwgMHg1ZTY5MTRiZSwgCisJMHg1ZTkwYTEyOSwgMHg1ZWI4MzFiNywgMHg1ZWRmYzY2NywgMHg1ZjA3NWYzOCwgCisJMHg1ZjJlZmMyOSwgMHg1ZjU2OWQzYSwgMHg1ZjdlNDI2YSwgMHg1ZmE1ZWJiNywgCisJMHg1ZmNkOTkyMSwgMHg1ZmY1NGFhOCwgMHg2MDFkMDA0YSwgMHg2MDQ0YmEwNiwgCisJMHg2MDZjNzdkYywgMHg2MDk0MzljYSwgMHg2MGJiZmZkMCwgMHg2MGUzYzllZSwgCisJMHg2MTBiOTgyMSwgMHg2MTMzNmE2YSwgMHg2MTViNDBjOCwgMHg2MTgzMWIzOSwgCisJMHg2MWFhZjliZCwgMHg2MWQyZGM1MywgMHg2MWZhYzJmYSwgMHg2MjIyYWRiMiwgCisJMHg2MjRhOWM3OSwgMHg2MjcyOGY0ZiwgMHg2MjlhODYzMywgMHg2MmMyODEyMywgCisJMHg2MmVhODAyMCwgMHg2MzEyODMyOSwgMHg2MzNhOGEzYywgMHg2MzYyOTU1OSwgCisJMHg2MzhhYTQ3ZiwgMHg2M2IyYjdhZCwgMHg2M2RhY2VlMiwgMHg2NDAyZWExZSwgCisJMHg2NDJiMDk2MCwgMHg2NDUzMmNhNiwgMHg2NDdiNTNmMSwgMHg2NGEzN2YzZiwgCisJMHg2NGNiYWU4ZiwgMHg2NGYzZTFlMiwgMHg2NTFjMTkzNSwgMHg2NTQ0NTQ4OCwgCisJMHg2NTZjOTNkYiwgMHg2NTk0ZDcyYywgMHg2NWJkMWU3YiwgMHg2NWU1NjljNywgCisJMHg2NjBkYjkwZiwgMHg2NjM2MGM1MywgMHg2NjVlNjM5MSwgMHg2Njg2YmVjOSwgCisJMHg2NmFmMWRmYSwgMHg2NmQ3ODEyMywgMHg2NmZmZTg0NCwgMHg2NzI4NTM1YiwgCisJMHg2NzUwYzI2OCwgMHg2Nzc5MzU2YiwgMHg2N2ExYWM2MiwgMHg2N2NhMjc0YywgCisJMHg2N2YyYTYyOSwgMHg2ODFiMjhmOSwgMHg2ODQzYWZiOSwgMHg2ODZjM2E2YSwgCisJMHg2ODk0YzkwYiwgMHg2OGJkNWI5YiwgMHg2OGU1ZjIxOSwgMHg2OTBlOGM4NCwgCisJMHg2OTM3MmFkZCwgMHg2OTVmY2QyMSwgMHg2OTg4NzM1MCwgMHg2OWIxMWQ2YSwgCisJMHg2OWQ5Y2I2ZCwgMHg2YTAyN2Q1YSwgMHg2YTJiMzMyZiwgMHg2YTUzZWNlYiwgCisJMHg2YTdjYWE4ZCwgMHg2YWE1NmMxNiwgMHg2YWNlMzE4NCwgMHg2YWY2ZmFkNiwgCisJMHg2YjFmYzgwYywgMHg2YjQ4OTkyNSwgMHg2YjcxNmUyMCwgMHg2YjlhNDZmZCwgCisJMHg2YmMzMjNiYiwgMHg2YmVjMDQ1OCwgMHg2YzE0ZThkNSwgMHg2YzNkZDEzMCwgCisJMHg2YzY2YmQ2OSwgMHg2YzhmYWQ4MCwgMHg2Y2I4YTE3MiwgMHg2Y2UxOTk0MCwgCisJMHg2ZDBhOTRlOSwgMHg2ZDMzOTQ2ZCwgMHg2ZDVjOTdjYSwgMHg2ZDg1OWVmZiwgCisJMHg2ZGFlYWEwZCwgMHg2ZGQ3YjhmMSwgMHg2ZTAwY2JhZCwgMHg2ZTI5ZTIzZSwgCisJMHg2ZTUyZmNhNCwgMHg2ZTdjMWFkZiwgMHg2ZWE1M2NlZSwgMHg2ZWNlNjJjZiwgCisJMHg2ZWY3OGM4MywgMHg2ZjIwYmEwOSwgMHg2ZjQ5ZWI1ZiwgMHg2ZjczMjA4NSwgCisJMHg2ZjljNTk3YiwgMHg2ZmM1OTY0MCwgMHg2ZmVlZDZkMywgMHg3MDE4MWIzMywgCisJMHg3MDQxNjM2MCwgMHg3MDZhYWY1OSwgMHg3MDkzZmYxZCwgMHg3MGJkNTJhYiwgCisJMHg3MGU2YWEwNCwgMHg3MTEwMDUyNSwgMHg3MTM5NjQwZiwgMHg3MTYyYzZjMSwgCisJMHg3MThjMmQzYSwgMHg3MWI1OTc3YSwgMHg3MWRmMDU3ZiwgMHg3MjA4Nzc0OSwgCisJMHg3MjMxZWNkOCwgMHg3MjViNjYyYSwgMHg3Mjg0ZTMzZiwgMHg3MmFlNjQxNywgCisJMHg3MmQ3ZThiMCwgMHg3MzAxNzEwYSwgMHg3MzJhZmQyNCwgMHg3MzU0OGNmZSwgCisJMHg3MzdlMjA5NywgMHg3M2E3YjdlZSwgMHg3M2QxNTMwMywgMHg3M2ZhZjFkNSwgCisJMHg3NDI0OTQ2MiwgMHg3NDRlM2FhYywgMHg3NDc3ZTRiMCwgMHg3NGExOTI2ZSwgCisJMHg3NGNiNDNlNiwgMHg3NGY0ZjkxNywgMHg3NTFlYjIwMSwgMHg3NTQ4NmVhMSwgCisJMHg3NTcyMmVmOSwgMHg3NTliZjMwNywgMHg3NWM1YmFjYSwgMHg3NWVmODY0MiwgCisJMHg3NjE5NTU2ZiwgMHg3NjQzMjg0ZiwgMHg3NjZjZmVlMiwgMHg3Njk2ZDkyOCwgCisJMHg3NmMwYjcxZiwgMHg3NmVhOThjNywgMHg3NzE0N2UyMCwgMHg3NzNlNjcyOCwgCisJMHg3NzY4NTNkZiwgMHg3NzkyNDQ0NSwgMHg3N2JjMzg1OCwgMHg3N2U2MzAxOSwgCisJMHg3ODEwMmI4NSwgMHg3ODNhMmE5ZSwgMHg3ODY0MmQ2MiwgMHg3ODhlMzNkMSwgCisJMHg3OGI4M2RlOSwgMHg3OGUyNGJhYiwgMHg3OTBjNWQxNSwgMHg3OTM2NzIyOCwgCisJMHg3OTYwOGFlMSwgMHg3OThhYTc0MiwgMHg3OWI0Yzc0OCwgMHg3OWRlZWFmNCwgCisJMHg3YTA5MTI0NSwgMHg3YTMzM2QzYSwgMHg3YTVkNmJkMiwgMHg3YTg3OWUwZSwgCisJMHg3YWIxZDNlYywgMHg3YWRjMGQ2YiwgMHg3YjA2NGE4YywgMHg3YjMwOGI0ZCwgCisJMHg3YjVhY2ZhZSwgMHg3Yjg1MTdhZSwgMHg3YmFmNjM0YywgMHg3YmQ5YjI4OSwgCisJMHg3YzA0MDU2MywgMHg3YzJlNWJkYSwgMHg3YzU4YjVlYywgMHg3YzgzMTM5YiwgCisJMHg3Y2FkNzRlNCwgMHg3Y2Q3ZDljNywgMHg3ZDAyNDI0NCwgMHg3ZDJjYWU1YSwgCisJMHg3ZDU3MWUwOSwgMHg3ZDgxOTE0ZiwgMHg3ZGFjMDgyZCwgMHg3ZGQ2ODJhMSwgCisJMHg3ZTAxMDBhYywgMHg3ZTJiODI0YiwgMHg3ZTU2MDc4MCwgMHg3ZTgwOTA0OCwgCisJMHg3ZWFiMWNhNSwgMHg3ZWQ1YWM5NCwgMHg3ZjAwNDAxNSwgMHg3ZjJhZDcyOSwgCisJMHg3ZjU1NzFjZCwgMHg3ZjgwMTAwMywgMHg3ZmFhYjFjOCwgMHg3ZmQ1NTcxZAorfTsKKworDQorY29uc3QgV29yZDMyIGludlNCRlsyNF0gPSB7DQorICAweDNGRkQzNEZDLCAweDJEM0Y4MDAwLCAweDI0RjE4QzdFLCAweDFGRkU5QTdFLCANCisgIDB4MUM5REYxMEMsIDB4MUExRjg1MUEsIDB4MTgyRkU5OTQsIDB4MTY5RkMwMDAsIA0KKyAgMHgxNTU0MkFBQSwgMHgxNDNDMzFDMiwgMHgxMzRCMUI2QywgMHgxMjc5MjBCRSwgDQorICAweDExQkYyRkNDLCAweDExMUE3NDlFLCAweDEwODVGQzQyLCAweDBGRkZBN0JFLCANCisgIDB4MEY4NTU4MTgsIDB4MEYxNEVFNTYsIDB4MEVBRTZBNzgsIDB4MEU0RUY4ODYsIA0KKyAgMHgwREY2OTg4MCwgMHgwREE0OTU2OCwgMHgwRDU3ODU0MiwgMHgwRDEwMUQwQw0KK307DQorCitjb25zdCBXb3JkMTYgcG93MnRvbWludXNOb3ZlcjE2WzE3XSA9IHsKKyAgMHg3ZmZmLCAweDdhOTMsIDB4NzU2MCwgMHg3MDY2LAorICAweDZiYTIsIDB4NjcxMiwgMHg2MmI0LCAweDVlODQsCisgIDB4NWE4MiwgMHg1NmFjLCAweDUyZmYsIDB4NGY3YiwKKyAgMHg0YzFjLCAweDQ4ZTIsIDB4NDVjYiwgMHg0MmQ1LAorICAweDQwMDAKK307DQorDQorY29uc3QgV29yZDE2IHNpZGVJbmZvVGFiTG9uZ1tNQVhfU0ZCX0xPTkcgKyAxXSA9IHsNCisgIDksIDksIDksIDksIDksIDksIDksIDksIDksIA0KKyAgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgDQorICA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCANCisgIDksIDksIDksIDksIDE0LCAxNCwgMTQsIDE0LCANCisgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCANCisgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCANCisgIDE0LCAxNCwgMTQNCit9Ow0KKw0KK2NvbnN0IFdvcmQxNiBzaWRlSW5mb1RhYlNob3J0W01BWF9TRkJfU0hPUlQgKyAxXSA9IHsNCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDEwLCAxMCwgDQorICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEzLCAxMw0KK307CisKK1dvcmQzMiBzcGVjRXhwTWFudFRhYmxlQ29tYl9lbmNbNF1bMTRdID0KK3sKKyAgezB4NDAwMDAwMDAsICAweDUwYTI4YmU2LCAgMHg2NTk3ZmE5NSwgIDB4NDAwMDAwMDAsIAorICAgMHg1MGEyOGJlNiwgIDB4NjU5N2ZhOTUsICAweDQwMDAwMDAwLCAgMHg1MGEyOGJlNiwgCisgICAweDY1OTdmYTk1LCAgMHg0MDAwMDAwMCwgIDB4NTBhMjhiZTYsICAweDY1OTdmYTk1LCAKKyAgIDB4NDAwMDAwMDAsICAweDUwYTI4YmU2fSwgCisKKyAgezB4NGMxYmY4MjksICAweDVmZTQ0MzVlLCAgMHg3OGQwZGY5YywgIDB4NGMxYmY4MjksIAorICAgMHg1ZmU0NDM1ZSwgIDB4NzhkMGRmOWMsICAweDRjMWJmODI5LCAgMHg1ZmU0NDM1ZSwgCisgICAweDc4ZDBkZjljLCAgMHg0YzFiZjgyOSwgIDB4NWZlNDQzNWUsICAweDc4ZDBkZjljLCAKKyAgIDB4NGMxYmY4MjksICAweDVmZTQ0MzVlfSwgCisKKyAgezB4NWE4Mjc5OWEsICAweDcyMDhmODFkLCAgMHg0N2Q2NmIwZiwgIDB4NWE4Mjc5OWEsIAorICAgMHg3MjA4ZjgxZCwgIDB4NDdkNjZiMGYsICAweDVhODI3OTlhLCAgMHg3MjA4ZjgxZCwgCisgICAweDQ3ZDY2YjBmLCAgMHg1YTgyNzk5YSwgIDB4NzIwOGY4MWQsICAweDQ3ZDY2YjBmLCAKKyAgIDB4NWE4Mjc5OWEsICAweDcyMDhmODFkfSwgCisKKyAgezB4NmJhMjdlNjUsICAweDQzY2UzZTRiLCAgMHg1NTZlMDQyNCwgIDB4NmJhMjdlNjUsIAorICAgMHg0M2NlM2U0YiwgIDB4NTU2ZTA0MjQsICAweDZiYTI3ZTY1LCAgMHg0M2NlM2U0YiwgCisgICAweDU1NmUwNDI0LCAgMHg2YmEyN2U2NSwgIDB4NDNjZTNlNGIsICAweDU1NmUwNDI0LCAKKyAgIDB4NmJhMjdlNjUsICAweDQzY2UzZTRifQorfTsKKworY29uc3QgIFVXb3JkOCBzcGVjRXhwVGFibGVDb21iX2VuY1s0XVsxNF0gPQoreworICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAorICB7MSwgMiwgMywgNSwgNiwgNywgOSwgMTAsIDExLCAxMywgMTQsIDE1LCAxNywgMTh9LAorICB7MSwgMiwgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxMywgMTQsIDE2LCAxNywgMTh9LAorICB7MSwgMywgNCwgNSwgNywgOCwgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxNywgMTl9Cit9OworCitjb25zdCBXb3JkMTYgcXVhbnRCb3JkZXJzWzRdWzRdID0gew0KKyAgLyogcG93KDEuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovDQorICB7MHgwNDAwLCAweDBlZTcsIDB4MWM4NiwgMHgyYzBkfSwNCisgIC8qIHBvdygyLjAtMC40MDU0LCA0LzMpLzE2ICogcG93KDIsICgwLi4zKS80KSAqLw0KKyAgezB4MDRjMiwgMHgxMWI5LCAweDIxZWIsIDB4MzQ2M30sDQorICAvKiBwb3coMy4wLTAuNDA1NCwgNC8zKS8xNiAqIHBvdygyLCAoMC4uMykvNCkgKi8NCisgIHsweDA1YTgsIDB4MTUxNCwgMHgyODU2LCAweDNlNGN9LA0KKyAgLyogcG93KDQuMC0wLjQwNTQsIDQvMykvMTYgKiBwb3coMiwgKDAuLjMpLzQpICovDQorICB7MHgwNmJhLCAweDE5MTEsIDB4MmZmOCwgMHg0YTE2fSwNCit9Ow0KKworY29uc3QgV29yZDE2IHF1YW50UmVjb25bNF1bM10gPSB7DQorICB7MHgwODAwLCAweDE0MjksIDB4MjI5ZH0sDQorICB7MHgwOTgzLCAweDE3ZjksIDB4MjkyYX0sDQorICB7MHgwYjUwLCAweDFjODIsIDB4MzBmNH0sDQorICB7MHgwZDc0LCAweDIxZTcsIDB4M2EzN30sDQorfTsKKworY29uc3QgaW50IHNhbXBSYXRlVGFiW05VTV9TQU1QTEVfUkFURVNdID0gew0KKyAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCANCisJMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCAgODAwMA0KK307CisKKworY29uc3QgaW50CXJhdGVzWzhdID0gewkJDQorCTE2MCwgMjQwLCAzMjAsIDQwMCwgNDgwLCA1NjAsIDY0MCwgMA0KK307DQorCitjb25zdCBpbnQgQmFuZHdpdGhDb2VmVGFiWzhdW05VTV9TQU1QTEVfUkFURVNdID0geworCXsgNzAwMCwgIDcwMDAsICA0NjY2LCAgMzUwMCwgIDM1MDAsICAyODAwLCAgMjgwMCwgIDI4MDAsICAyODAwLCAgMjAwMCwgIDIwMDAsICAyMDAwfSwKKwl7MTIwMDAsIDEyMDAwLCAgODAwMCwgIDYwMDAsICA2MDAwLCAgNjAwMCwgIDQwMDAsICA0MDAwLCAgNDAwMCwgIDMwMDAsICAzMDAwLCAgMzAwMH0sCisJezE4MDAwLCAxODAwMCwgMTIwMDAsICA5MDAwLCAgOTAwMCwgIDkwMDAsICA3MDAwLCAgNzAwMCwgIDcwMDAsICA1MDAwLCAgNTAwMCwgIDUwMDB9LAorCXsyMDAwMCwgMjAwMDAsIDE2MDAwLCAxMjAwMCwgMTIwMDAsIDEyMDAwLCAgOTAwMCwgIDkwMDAsICA5MDAwLCAgNjAwMCwgIDYwMDAsICA2MDAwfSwKKwl7MjAwMDAsIDIwMDAwLCAxODY2NiwgMTQwMDAsIDE0MDAwLCAxNDAwMCwgMTAwMDAsIDEwMDAwLCAxMDAwMCwgIDcwMDAsICA3MDAwLCAgNzAwMH0sCisJezIwMDAwLCAyMDAwMCwgMjAwMDAsIDE2MDAwLCAxNjAwMCwgMTYwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsICA4MDAwLCAgODAwMCwgIDgwMDB9LAorCXsyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAxNTAwMCwgMTUwMDAsIDE1MDAwLCAxMDAwMCwgMTAwMDAsIDEwMDAwfSwKKwl7MjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMCwgMjAwMDAsIDIwMDAwLCAyMDAwMH0KK307CisKKworLyogdG90YWwgbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcyBpbiBvbmUgd2luZG93ICovDQorY29uc3QgVVdvcmQ4IHNmQmFuZFRvdGFsU2hvcnRbTlVNX1NBTVBMRV9SQVRFU10gPSB7DQorICAgIDEyLCAxMiwgMTIsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUNCit9Ow0KKw0KK2NvbnN0IFVXb3JkOCBzZkJhbmRUb3RhbExvbmdbTlVNX1NBTVBMRV9SQVRFU10gPSB7DQorICAgIDQxLCA0MSwgNDcsIDQ5LCA0OSwgNTEsIDQ3LCA0NywgNDMsIDQzLCA0MywgNDANCit9Ow0KKw0KKy8qIHNjYWxlIGZhY3RvciBiYW5kIHRhYmxlcyAqLw0KK2NvbnN0IGludCBzZkJhbmRUYWJTaG9ydE9mZnNldFtOVU1fU0FNUExFX1JBVEVTXSA9IHswLCAwLCAwLCAxMywgMTMsIDEzLCAyOCwgMjgsIDQ0LCA0NCwgNDQsIDYwfTsNCisNCitjb25zdCBzaG9ydCBzZkJhbmRUYWJTaG9ydFs3Nl0gPSB7DQorCS8qIHNob3J0IGJsb2NrIDY0LCA4OCwgOTYga0h6IFsxM10gICovDQorCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAzMiwgIDQwLCAgNDgsICA2NCwgIDkyLCAxMjgsDQorDQorCS8qIHNob3J0IGJsb2NrIDMyLCA0NCwgNDgga0h6IFsxNV0gICovDQorCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjgsICAzNiwgIDQ0LCAgNTYsICA2OCwgIDgwLCAgOTYsIDExMiwgMTI4LA0KKw0KKwkvKiBzaG9ydCBibG9jayAyMiwgMjQga0h6IFsxNl0gICovDQorCTAsICAgNCwgICA4LCAgMTIsICAxNiwgIDIwLCAgMjQsICAyOCwgIDM2LCAgNDQsICA1MiwgIDY0LCAgNzYsICA5MiwgMTA4LCAxMjgsDQorDQorCS8qIHNob3J0IGJsb2NrIDExLCAxMiwgMTYga0h6IFsxNl0gKi8NCisJMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICA0MCwgIDQ4LCAgNjAsICA3MiwgIDg4LCAxMDgsIDEyOCwNCisNCisJLyogc2hvcnQgYmxvY2sgOCBrSHogWzE2XSAqLw0KKwkwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzNiwgIDQ0LCAgNTIsICA2MCwgIDcyLCAgODgsIDEwOCwgMTI4DQorfTsNCisNCitjb25zdCBpbnQgc2ZCYW5kVGFiTG9uZ09mZnNldFtOVU1fU0FNUExFX1JBVEVTXSA9IHswLCAwLCA0MiwgOTAsIDkwLCAxNDAsIDE5MiwgMTkyLCAyNDAsIDI0MCwgMjQwLCAyODR9Ow0KKw0KK2NvbnN0IHNob3J0IHNmQmFuZFRhYkxvbmdbMzI1XSA9IHsNCisJLyogbG9uZyBibG9jayA4OCwgOTYga0h6IFs0Ml0gICovDQorCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgICA1MiwNCisJIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwgMTA4LCAxMjAsIDEzMiwgMTQ0LCAxNTYsIDE3MiwgMTg4LCAgMjEyLA0KKwkyNDAsIDI3NiwgMzIwLCAzODQsIDQ0OCwgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDgzMiwgODk2LCA5NjAsIDEwMjQsDQorDQorCS8qIGxvbmcgYmxvY2sgNjQga0h6IFs0OF0gICovDQorCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICAgNjQsDQorCSA3MiwgIDgwLCAgODgsIDEwMCwgMTEyLCAxMjQsIDE0MCwgMTU2LCAxNzIsIDE5MiwgMjE2LCAyNDAsIDI2OCwgMzA0LCAzNDQsICAzODQsDQorCTQyNCwgNDY0LCA1MDQsIDU0NCwgNTg0LCA2MjQsIDY2NCwgNzA0LCA3NDQsIDc4NCwgODI0LCA4NjQsIDkwNCwgOTQ0LCA5ODQsIDEwMjQsDQorDQorCS8qIGxvbmcgYmxvY2sgNDQsIDQ4IGtIeiBbNTBdICovDQorCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICAgODAsICA4OCwNCisJIDk2LCAxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwgMjQwLCAyNjQsIDI5MiwgMzIwLCAzNTIsIDM4NCwgIDQxNiwgNDQ4LA0KKwk0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCAxMDI0LA0KKw0KKwkvKiBsb25nIGJsb2NrIDMyIGtIeiBbNTJdICovDQorCSAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICAgODAsICA4OCwgIDk2LA0KKwkxMDgsIDEyMCwgMTMyLCAxNDQsIDE2MCwgMTc2LCAxOTYsIDIxNiwgMjQwLCAyNjQsIDI5MiwgMzIwLCAzNTIsIDM4NCwgNDE2LCAgNDQ4LCA0ODAsIDUxMiwNCisJNTQ0LCA1NzYsIDYwOCwgNjQwLCA2NzIsIDcwNCwgNzM2LCA3NjgsIDgwMCwgODMyLCA4NjQsIDg5NiwgOTI4LCA5NjAsIDk5MiwgMTAyNCwNCisNCisJLyogbG9uZyBibG9jayAyMiwgMjQga0h6IFs0OF0gKi8NCisJICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LCAgNDAsICA0NCwgIDUyLCAgNjAsICA2OCwgICA3NiwNCisJIDg0LCAgOTIsIDEwMCwgMTA4LCAxMTYsIDEyNCwgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODgsIDIwNCwgMjIwLCAyNDAsIDI2MCwgIDI4NCwNCisJMzA4LCAzMzYsIDM2NCwgMzk2LCA0MzIsIDQ2OCwgNTA4LCA1NTIsIDYwMCwgNjUyLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MCwgMTAyNCwNCisNCisJLyogbG9uZyBibG9jayAxMSwgMTIsIDE2IGtIeiBbNDRdICovDQorCSAgMCwgICA4LCAgMTYsICAyNCwgIDMyLCAgNDAsICA0OCwgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsIDEwMCwgIDExMiwgMTI0LA0KKwkxMzYsIDE0OCwgMTYwLCAxNzIsIDE4NCwgMTk2LCAyMTIsIDIyOCwgMjQ0LCAyNjAsIDI4MCwgMzAwLCAzMjAsICAzNDQsIDM2OCwNCisJMzk2LCA0MjQsIDQ1NiwgNDkyLCA1MzIsIDU3MiwgNjE2LCA2NjQsIDcxNiwgNzcyLCA4MzIsIDg5NiwgOTYwLCAxMDI0LA0KKw0KKwkvKiBsb25nIGJsb2NrIDgga0h6IFs0MV0gICovDQorCSAgMCwgIDEyLCAgMjQsICAzNiwgIDQ4LCAgNjAsICA3MiwgIDg0LCAgOTYsIDEwOCwgMTIwLCAxMzIsICAxNDQsIDE1NiwNCisJMTcyLCAxODgsIDIwNCwgMjIwLCAyMzYsIDI1MiwgMjY4LCAyODgsIDMwOCwgMzI4LCAzNDgsIDM3MiwgIDM5NiwgNDIwLA0KKwk0NDgsIDQ3NiwgNTA4LCA1NDQsIDU4MCwgNjIwLCA2NjQsIDcxMiwgNzY0LCA4MjAsIDg4MCwgOTQ0LCAxMDI0DQorfTsNCisKKy8qCisgIHRoZXNlIHRhYmxlcyBhcmUgdXNlZCBvbmx5IGZvciBjb3VudGluZyBhbmQgCisgIGFyZSBzdG9yZWQgaW4gcGFja2VkIGZvcm1hdAorKi8KK2NvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMV8yWzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeworICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fSwKKyAgICAgIHsweDBhMDgsMHgwNzA2LDB4MGEwOH0sCisgICAgICB7MHgwYjA5LDB4MDkwOCwweDBiMDl9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwYTA4LDB4MDcwNiwweDBhMDd9LAorICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKKyAgICAgIHsweDA5MDcsMHgwNzA2LDB4MGEwOH0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDBiMDksMHgwOTA3LDB4MGIwOH0sCisgICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDh9LAorICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwN30sCisgICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9LAorICAgICAgezB4MDkwNywweDA3MDYsMHgwOTA4fQorICAgIH0sCisgICAgeworICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKKyAgICAgIHsweDA1MDUsMHgwMTAzLDB4MDUwNX0sCisgICAgICB7MHgwNzA2LDB4MDUwNSwweDA3MDZ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwOTA4LDB4MDcwNiwweDA5MDd9LAorICAgICAgezB4MDcwNiwweDA1MDUsMHgwNzA2fSwKKyAgICAgIHsweDA5MDgsMHgwNzA2LDB4MDkwOH0KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9LAorICAgICAgezB4MDkwOCwweDA3MDYsMHgwOTA4fSwKKyAgICAgIHsweDBiMDgsMHgwOTA3LDB4MGIwOX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDBhMDgsMHgwNzA2LDB4MDkwN30sCisgICAgICB7MHgwNzA2LDB4MDUwNCwweDA3MDZ9LAorICAgICAgezB4MDkwOCwweDA3MDYsMHgwYTA3fQorICAgIH0sCisgICAgeworICAgICAgezB4MGIwOSwweDA5MDcsMHgwYjA5fSwKKyAgICAgIHsweDBhMDcsMHgwNzA2LDB4MDkwOH0sCisgICAgICB7MHgwYjA5LDB4MDkwNywweDBiMDl9CisgICAgfQorICB9Cit9OworCisKK2NvbnN0IFVXb3JkMTYgaHVmZl9sdGFiM180WzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeworICAgICAgezB4MDEwNCwweDA0MDUsMHgwODA4fSwKKyAgICAgIHsweDA0MDUsMHgwNTA0LDB4MDgwOH0sCisgICAgICB7MHgwOTA5LDB4MDkwOCwweDBhMGJ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwNDA1LDB4MDYwNSwweDA5MDh9LAorICAgICAgezB4MDYwNSwweDA2MDQsMHgwOTA4fSwKKyAgICAgIHsweDA5MDgsMHgwOTA3LDB4MGEwYX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA5MDksMHgwYTA4LDB4MGQwYn0sCisgICAgICB7MHgwOTA4LDB4MDkwOCwweDBiMGF9LAorICAgICAgezB4MGIwYiwweDBhMGEsMHgwYzBifQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDA0MDQsMHgwNjA1LDB4MGEwOH0sCisgICAgICB7MHgwNjA0LDB4MDcwNCwweDBhMDh9LAorICAgICAgezB4MGEwOCwweDBhMDgsMHgwYzBhfQorICAgIH0sCisgICAgeworICAgICAgezB4MDUwNCwweDA3MDQsMHgwYjA4fSwKKyAgICAgIHsweDA2MDQsMHgwNzA0LDB4MGEwN30sCisgICAgICB7MHgwOTA4LDB4MDkwNywweDBiMDl9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwOTA4LDB4MGEwOCwweDBkMGF9LAorICAgICAgezB4MDgwNywweDA5MDcsMHgwYzA5fSwKKyAgICAgIHsweDBhMGEsMHgwYjA5LDB4MGMwYX0KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwODA4LDB4MGEwOCwweDBmMGJ9LAorICAgICAgezB4MDkwOCwweDBiMDcsMHgwZjBhfSwKKyAgICAgIHsweDBkMGIsMHgwZTBhLDB4MTAwY30KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDA4MDgsMHgwYTA3LDB4MGUwYX0sCisgICAgICB7MHgwOTA3LDB4MGEwNywweDBlMDl9LAorICAgICAgezB4MGMwYSwweDBjMDksMHgwZjBifQorICAgIH0sCisgICAgeworICAgICAgezB4MGIwYiwweDBjMGEsMHgxMDBjfSwKKyAgICAgIHsweDBhMGEsMHgwYjA5LDB4MGYwYn0sCisgICAgICB7MHgwYzBiLDB4MGMwYSwweDBmMGJ9CisgICAgfQorICB9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjVfNls5XVs5XT0KK3sKKyAgezB4MGQwYiwweDBjMGEsMHgwYjA5LDB4MGIwOSwweDBhMDksMHgwYjA5LDB4MGIwOSwweDBjMGEsMHgwZDBifSwKKyAgezB4MGMwYSwweDBiMDksMHgwYTA4LDB4MDkwNywweDA4MDcsMHgwOTA3LDB4MGEwOCwweDBiMDksMHgwYzBhfSwKKyAgezB4MGMwOSwweDBhMDgsMHgwOTA2LDB4MDgwNiwweDA3MDYsMHgwODA2LDB4MDkwNiwweDBhMDgsMHgwYjA5fSwKKyAgezB4MGIwOSwweDA5MDcsMHgwODA2LDB4MDUwNCwweDA0MDQsMHgwNTA0LDB4MDgwNiwweDA5MDcsMHgwYjA5fSwKKyAgezB4MGEwOSwweDA4MDcsMHgwNzA2LDB4MDQwNCwweDAxMDQsMHgwNDA0LDB4MDcwNiwweDA4MDcsMHgwYjA5fSwKKyAgezB4MGIwOSwweDA5MDcsMHgwODA2LDB4MDUwNCwweDA0MDQsMHgwNTA0LDB4MDgwNiwweDA5MDcsMHgwYjA5fSwKKyAgezB4MGIwOSwweDBhMDgsMHgwOTA2LDB4MDgwNiwweDA3MDYsMHgwODA2LDB4MDkwNiwweDBhMDgsMHgwYjA5fSwKKyAgezB4MGMwYSwweDBiMDksMHgwYTA4LDB4MDkwNywweDA4MDcsMHgwOTA3LDB4MGEwNywweDBiMDgsMHgwYzBhfSwKKyAgezB4MGQwYiwweDBjMGEsMHgwYzA5LDB4MGIwOSwweDBhMDksMHgwYTA5LDB4MGIwOSwweDBjMGEsMHgwZDBifQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2x0YWI3XzhbOF1bOF09Cit7CisgIHsweDAxMDUsMHgwMzA0LDB4MDYwNSwweDA3MDYsMHgwODA3LDB4MDkwOCwweDBhMDksMHgwYjBhfSwKKyAgezB4MDMwNCwweDA0MDMsMHgwNjA0LDB4MDcwNSwweDA4MDYsMHgwODA3LDB4MDkwNywweDA5MDh9LAorICB7MHgwNjA1LDB4MDYwNCwweDA3MDQsMHgwODA1LDB4MDgwNiwweDA5MDcsMHgwOTA3LDB4MGEwOH0sCisgIHsweDA3MDYsMHgwNzA1LDB4MDgwNSwweDA4MDYsMHgwOTA2LDB4MDkwNywweDBhMDgsMHgwYTA4fSwKKyAgezB4MDgwNywweDA4MDYsMHgwOTA2LDB4MDkwNiwweDBhMDcsMHgwYTA3LDB4MGEwOCwweDBiMDl9LAorICB7MHgwOTA4LDB4MDgwNywweDA5MDYsMHgwOTA3LDB4MGEwNywweDBhMDgsMHgwYjA4LDB4MGIwYX0sCisgIHsweDBhMDksMHgwOTA3LDB4MDkwNywweDBhMDgsMHgwYTA4LDB4MGIwOCwweDBjMDksMHgwYzA5fSwKKyAgezB4MGIwYSwweDBhMDgsMHgwYTA4LDB4MGEwOCwweDBiMDksMHgwYjA5LDB4MGMwOSwweDBjMGF9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfbHRhYjlfMTBbMTNdWzEzXT0KK3sKKyAgezB4MDEwNiwweDAzMDUsMHgwNjA2LDB4MDgwNiwweDA5MDcsMHgwYTA4LDB4MGEwOSwweDBiMGEsMHgwYjBhLDB4MGMwYSwweDBjMGIsMHgwZDBiLDB4MGQwY30sCisgIHsweDAzMDUsMHgwNDA0LDB4MDYwNCwweDA3MDUsMHgwODA2LDB4MDgwNywweDA5MDcsMHgwYTA4LDB4MGEwOCwweDBhMDksMHgwYjBhLDB4MGMwYSwweDBjMGJ9LAorICB7MHgwNjA2LDB4MDYwNCwweDA3MDUsMHgwODA1LDB4MDgwNiwweDA5MDYsMHgwYTA3LDB4MGEwOCwweDBhMDgsMHgwYjA5LDB4MGMwOSwweDBjMGEsMHgwYzBhfSwKKyAgezB4MDgwNiwweDA3MDUsMHgwODA1LDB4MDkwNSwweDA5MDYsMHgwYTA3LDB4MGEwNywweDBiMDgsMHgwYjA4LDB4MGIwOSwweDBjMDksMHgwYzBhLDB4MGQwYX0sCisgIHsweDA5MDcsMHgwODA2LDB4MDkwNiwweDA5MDYsMHgwYTA2LDB4MGEwNywweDBiMDcsMHgwYjA4LDB4MGIwOCwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGF9LAorICB7MHgwYTA4LDB4MDkwNywweDA5MDYsMHgwYTA3LDB4MGIwNywweDBiMDcsMHgwYjA4LDB4MGMwOCwweDBiMDgsMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBifSwKKyAgezB4MGIwOSwweDA5MDcsMHgwYTA3LDB4MGIwNywweDBiMDcsMHgwYjA4LDB4MGMwOCwweDBjMDksMHgwYzA5LDB4MGMwOSwweDBkMGEsMHgwZDBhLDB4MGQwYn0sCisgIHsweDBiMDksMHgwYTA4LDB4MGEwOCwweDBiMDgsMHgwYjA4LDB4MGMwOCwweDBjMDksMHgwZDA5LDB4MGQwOSwweDBkMGEsMHgwZDBhLDB4MGQwYiwweDBkMGJ9LAorICB7MHgwYjA5LDB4MGEwOCwweDBhMDgsMHgwYjA4LDB4MGIwOCwweDBiMDgsMHgwYzA5LDB4MGMwOSwweDBkMGEsMHgwZDBhLDB4MGUwYSwweDBkMGIsMHgwZTBifSwKKyAgezB4MGIwYSwweDBhMDksMHgwYjA5LDB4MGIwOSwweDBjMDksMHgwYzA5LDB4MGMwOSwweDBjMGEsMHgwZDBhLDB4MGQwYSwweDBlMGIsMHgwZTBiLDB4MGUwY30sCisgIHsweDBjMGEsMHgwYjA5LDB4MGIwOSwweDBjMDksMHgwYzA5LDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBlMGIsMHgwZTBiLDB4MGUwYiwweDBmMGN9LAorICB7MHgwYzBiLDB4MGIwYSwweDBjMDksMHgwYzBhLDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBkMGIsMHgwZTBiLDB4MGUwYiwweDBmMGIsMHgwZjBjfSwKKyAgezB4MGQwYiwweDBjMGEsMHgwYzBhLDB4MGMwYSwweDBkMGEsMHgwZDBhLDB4MGQwYSwweDBkMGIsMHgwZTBiLDB4MGUwYywweDBlMGMsMHgwZTBjLDB4MGYwY30KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9sdGFiMTFbMTddWzE3XT0KK3sKKyAgezB4MDAwNCwweDAwMDUsMHgwMDA2LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwYywweDAwMGIsMHgwMDBjLDB4MDAwYywweDAwMGF9LAorICB7MHgwMDA1LDB4MDAwNCwweDAwMDUsMHgwMDA2LDB4MDAwNywweDAwMDcsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwOH0sCisgIHsweDAwMDYsMHgwMDA1LDB4MDAwNSwweDAwMDYsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKKyAgezB4MDAwNywweDAwMDYsMHgwMDA2LDB4MDAwNiwweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAorICB7MHgwMDA4LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwNywweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCisgIHsweDAwMDgsMHgwMDA3LDB4MDAwNywweDAwMDcsMHgwMDA3LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDA4fSwKKyAgezB4MDAwOSwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMDh9LAorICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwOH0sCisgIHsweDAwMGEsMHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGIsMHgwMDA4fSwKKyAgezB4MDAwYSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMDh9LAorICB7MHgwMDBiLDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwOSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYSwweDAwMGIsMHgwMDBiLDB4MDAwOH0sCisgIHsweDAwMGIsMHgwMDBhLDB4MDAwOSwweDAwMDksMHgwMDBhLDB4MDAwOSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA4fSwKKyAgezB4MDAwYiwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMDl9LAorICB7MHgwMDBiLDB4MDAwYSwweDAwMDksMHgwMDA5LDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwOX0sCisgIHsweDAwMGIsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDA5fSwKKyAgezB4MDAwYywweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBhLDB4MDAwYSwweDAwMGEsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBiLDB4MDAwYiwweDAwMGIsMHgwMDBjLDB4MDAwYywweDAwMDl9LAorICB7MHgwMDA5LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA4LDB4MDAwOCwweDAwMDgsMHgwMDA5LDB4MDAwNX0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9sdGFic2NmWzEyMV09Cit7CisgIDB4MDAxMiwKKyAgMHgwMDEyLAorICAweDAwMTIsCisgIDB4MDAxMiwKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEyLAorICAweDAwMTMsCisgIDB4MDAxMiwKKyAgMHgwMDExLAorICAweDAwMTEsCisgIDB4MDAxMCwKKyAgMHgwMDExLAorICAweDAwMTAsCisgIDB4MDAxMCwKKyAgMHgwMDEwLAorICAweDAwMTAsCisgIDB4MDAwZiwKKyAgMHgwMDBmLAorICAweDAwMGUsCisgIDB4MDAwZSwKKyAgMHgwMDBlLAorICAweDAwMGUsCisgIDB4MDAwZSwKKyAgMHgwMDBlLAorICAweDAwMGQsCisgIDB4MDAwZCwKKyAgMHgwMDBjLAorICAweDAwMGMsCisgIDB4MDAwYywKKyAgMHgwMDBiLAorICAweDAwMGMsCisgIDB4MDAwYiwKKyAgMHgwMDBhLAorICAweDAwMGEsCisgIDB4MDAwYSwKKyAgMHgwMDA5LAorICAweDAwMDksCisgIDB4MDAwOCwKKyAgMHgwMDA4LAorICAweDAwMDgsCisgIDB4MDAwNywKKyAgMHgwMDA2LAorICAweDAwMDYsCisgIDB4MDAwNSwKKyAgMHgwMDA0LAorICAweDAwMDMsCisgIDB4MDAwMSwKKyAgMHgwMDA0LAorICAweDAwMDQsCisgIDB4MDAwNSwKKyAgMHgwMDA2LAorICAweDAwMDYsCisgIDB4MDAwNywKKyAgMHgwMDA3LAorICAweDAwMDgsCisgIDB4MDAwOCwKKyAgMHgwMDA5LAorICAweDAwMDksCisgIDB4MDAwYSwKKyAgMHgwMDBhLAorICAweDAwMGEsCisgIDB4MDAwYiwKKyAgMHgwMDBiLAorICAweDAwMGIsCisgIDB4MDAwYiwKKyAgMHgwMDBjLAorICAweDAwMGMsCisgIDB4MDAwZCwKKyAgMHgwMDBkLAorICAweDAwMGQsCisgIDB4MDAwZSwKKyAgMHgwMDBlLAorICAweDAwMTAsCisgIDB4MDAwZiwKKyAgMHgwMDEwLAorICAweDAwMGYsCisgIDB4MDAxMiwKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMywKKyAgMHgwMDEzLAorICAweDAwMTMsCisgIDB4MDAxMworfTsKKworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjFbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7CisgICAgICB7MHgwN2Y4LDB4MDFmMSwweDA3ZmR9LAorICAgICAgezB4MDNmNSwweDAwNjgsMHgwM2YwfSwKKyAgICAgIHsweDA3ZjcsMHgwMWVjLDB4MDdmNX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAzZjEsMHgwMDcyLDB4MDNmNH0sCisgICAgICB7MHgwMDc0LDB4MDAxMSwweDAwNzZ9LAorICAgICAgezB4MDFlYiwweDAwNmMsMHgwM2Y2fQorICAgIH0sCisgICAgeworICAgICAgezB4MDdmYywweDAxZTEsMHgwN2YxfSwKKyAgICAgIHsweDAxZjAsMHgwMDYxLDB4MDFmNn0sCisgICAgICB7MHgwN2YyLDB4MDFlYSwweDA3ZmJ9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDFmMiwweDAwNjksMHgwMWVkfSwKKyAgICAgIHsweDAwNzcsMHgwMDE3LDB4MDA2Zn0sCisgICAgICB7MHgwMWU2LDB4MDA2NCwweDAxZTV9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMDY3LDB4MDAxNSwweDAwNjJ9LAorICAgICAgezB4MDAxMiwweDAwMDAsMHgwMDE0fSwKKyAgICAgIHsweDAwNjUsMHgwMDE2LDB4MDA2ZH0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAxZTksMHgwMDYzLDB4MDFlNH0sCisgICAgICB7MHgwMDZiLDB4MDAxMywweDAwNzF9LAorICAgICAgezB4MDFlMywweDAwNzAsMHgwMWYzfQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDA3ZmUsMHgwMWU3LDB4MDdmM30sCisgICAgICB7MHgwMWVmLDB4MDA2MCwweDAxZWV9LAorICAgICAgezB4MDdmMCwweDAxZTIsMHgwN2ZhfQorICAgIH0sCisgICAgeworICAgICAgezB4MDNmMywweDAwNmEsMHgwMWU4fSwKKyAgICAgIHsweDAwNzUsMHgwMDEwLDB4MDA3M30sCisgICAgICB7MHgwMWY0LDB4MDA2ZSwweDAzZjd9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwN2Y2LDB4MDFlMCwweDA3Zjl9LAorICAgICAgezB4MDNmMiwweDAwNjYsMHgwMWY1fSwKKyAgICAgIHsweDA3ZmYsMHgwMWY3LDB4MDdmNH0KKyAgICB9CisgIH0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiMlszXVszXVszXVszXT0KK3sKKyAgeworICAgIHsKKyAgICAgIHsweDAxZjMsMHgwMDZmLDB4MDFmZH0sCisgICAgICB7MHgwMGViLDB4MDAyMywweDAwZWF9LAorICAgICAgezB4MDFmNywweDAwZTgsMHgwMWZhfQorICAgIH0sCisgICAgeworICAgICAgezB4MDBmMiwweDAwMmQsMHgwMDcwfSwKKyAgICAgIHsweDAwMjAsMHgwMDA2LDB4MDAyYn0sCisgICAgICB7MHgwMDZlLDB4MDAyOCwweDAwZTl9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMWY5LDB4MDA2NiwweDAwZjh9LAorICAgICAgezB4MDBlNywweDAwMWIsMHgwMGYxfSwKKyAgICAgIHsweDAxZjQsMHgwMDZiLDB4MDFmNX0KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwMGVjLDB4MDAyYSwweDAwNmN9LAorICAgICAgezB4MDAyYywweDAwMGEsMHgwMDI3fSwKKyAgICAgIHsweDAwNjcsMHgwMDFhLDB4MDBmNX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwMjQsMHgwMDA4LDB4MDAxZn0sCisgICAgICB7MHgwMDA5LDB4MDAwMCwweDAwMDd9LAorICAgICAgezB4MDAxZCwweDAwMGIsMHgwMDMwfQorICAgIH0sCisgICAgeworICAgICAgezB4MDBlZiwweDAwMWMsMHgwMDY0fSwKKyAgICAgIHsweDAwMWUsMHgwMDBjLDB4MDAyOX0sCisgICAgICB7MHgwMGYzLDB4MDAyZiwweDAwZjB9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDFmYywweDAwNzEsMHgwMWYyfSwKKyAgICAgIHsweDAwZjQsMHgwMDIxLDB4MDBlNn0sCisgICAgICB7MHgwMGY3LDB4MDA2OCwweDAxZjh9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMGVlLDB4MDAyMiwweDAwNjV9LAorICAgICAgezB4MDAzMSwweDAwMDIsMHgwMDI2fSwKKyAgICAgIHsweDAwZWQsMHgwMDI1LDB4MDA2YX0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAxZmIsMHgwMDcyLDB4MDFmZX0sCisgICAgICB7MHgwMDY5LDB4MDAyZSwweDAwZjZ9LAorICAgICAgezB4MDFmZiwweDAwNmQsMHgwMWY2fQorICAgIH0KKyAgfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2N0YWIzWzNdWzNdWzNdWzNdPQoreworICB7CisgICAgeworICAgICAgezB4MDAwMCwweDAwMDksMHgwMGVmfSwKKyAgICAgIHsweDAwMGIsMHgwMDE5LDB4MDBmMH0sCisgICAgICB7MHgwMWViLDB4MDFlNiwweDAzZjJ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMDBhLDB4MDAzNSwweDAxZWZ9LAorICAgICAgezB4MDAzNCwweDAwMzcsMHgwMWU5fSwKKyAgICAgIHsweDAxZWQsMHgwMWU3LDB4MDNmM30KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAxZWUsMHgwM2VkLDB4MWZmYX0sCisgICAgICB7MHgwMWVjLDB4MDFmMiwweDA3Zjl9LAorICAgICAgezB4MDdmOCwweDAzZjgsMHgwZmY4fQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDAwMDgsMHgwMDM4LDB4MDNmNn0sCisgICAgICB7MHgwMDM2LDB4MDA3NSwweDAzZjF9LAorICAgICAgezB4MDNlYiwweDAzZWMsMHgwZmY0fQorICAgIH0sCisgICAgeworICAgICAgezB4MDAxOCwweDAwNzYsMHgwN2Y0fSwKKyAgICAgIHsweDAwMzksMHgwMDc0LDB4MDNlZn0sCisgICAgICB7MHgwMWYzLDB4MDFmNCwweDA3ZjZ9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMWU4LDB4MDNlYSwweDFmZmN9LAorICAgICAgezB4MDBmMiwweDAxZjEsMHgwZmZifSwKKyAgICAgIHsweDAzZjUsMHgwN2YzLDB4MGZmY30KKyAgICB9CisgIH0sCisgIHsKKyAgICB7CisgICAgICB7MHgwMGVlLDB4MDNmNywweDdmZmV9LAorICAgICAgezB4MDFmMCwweDA3ZjUsMHg3ZmZkfSwKKyAgICAgIHsweDFmZmIsMHgzZmZhLDB4ZmZmZn0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwZjEsMHgwM2YwLDB4M2ZmY30sCisgICAgICB7MHgwMWVhLDB4MDNlZSwweDNmZmJ9LAorICAgICAgezB4MGZmNiwweDBmZmEsMHg3ZmZjfQorICAgIH0sCisgICAgeworICAgICAgezB4MDdmMiwweDBmZjUsMHhmZmZlfSwKKyAgICAgIHsweDAzZjQsMHgwN2Y3LDB4N2ZmYn0sCisgICAgICB7MHgwZmY3LDB4MGZmOSwweDdmZmF9CisgICAgfQorICB9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjRbM11bM11bM11bM109Cit7CisgIHsKKyAgICB7CisgICAgICB7MHgwMDA3LDB4MDAxNiwweDAwZjZ9LAorICAgICAgezB4MDAxOCwweDAwMDgsMHgwMGVmfSwKKyAgICAgIHsweDAxZWYsMHgwMGYzLDB4MDdmOH0KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwMTksMHgwMDE3LDB4MDBlZH0sCisgICAgICB7MHgwMDE1LDB4MDAwMSwweDAwZTJ9LAorICAgICAgezB4MDBmMCwweDAwNzAsMHgwM2YwfQorICAgIH0sCisgICAgeworICAgICAgezB4MDFlZSwweDAwZjEsMHgwN2ZhfSwKKyAgICAgIHsweDAwZWUsMHgwMGU0LDB4MDNmMn0sCisgICAgICB7MHgwN2Y2LDB4MDNlZiwweDA3ZmR9CisgICAgfQorICB9LAorICB7CisgICAgeworICAgICAgezB4MDAwNSwweDAwMTQsMHgwMGYyfSwKKyAgICAgIHsweDAwMDksMHgwMDA0LDB4MDBlNX0sCisgICAgICB7MHgwMGY0LDB4MDBlOCwweDAzZjR9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwMDA2LDB4MDAwMiwweDAwZTd9LAorICAgICAgezB4MDAwMywweDAwMDAsMHgwMDZifSwKKyAgICAgIHsweDAwZTMsMHgwMDY5LDB4MDFmM30KKyAgICB9LAorICAgIHsKKyAgICAgIHsweDAwZWIsMHgwMGU2LDB4MDNmNn0sCisgICAgICB7MHgwMDZlLDB4MDA2YSwweDAxZjR9LAorICAgICAgezB4MDNlYywweDAxZjAsMHgwM2Y5fQorICAgIH0KKyAgfSwKKyAgeworICAgIHsKKyAgICAgIHsweDAwZjUsMHgwMGVjLDB4MDdmYn0sCisgICAgICB7MHgwMGVhLDB4MDA2ZiwweDAzZjd9LAorICAgICAgezB4MDdmOSwweDAzZjMsMHgwZmZmfQorICAgIH0sCisgICAgeworICAgICAgezB4MDBlOSwweDAwNmQsMHgwM2Y4fSwKKyAgICAgIHsweDAwNmMsMHgwMDY4LDB4MDFmNX0sCisgICAgICB7MHgwM2VlLDB4MDFmMiwweDA3ZjR9CisgICAgfSwKKyAgICB7CisgICAgICB7MHgwN2Y3LDB4MDNmMSwweDBmZmV9LAorICAgICAgezB4MDNlZCwweDAxZjEsMHgwN2Y1fSwKKyAgICAgIHsweDA3ZmUsMHgwM2Y1LDB4MDdmY30KKyAgICB9CisgIH0KK307Citjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjVbOV1bOV09Cit7CisgIHsweDFmZmYsMHgwZmY3LDB4MDdmNCwweDA3ZTgsMHgwM2YxLDB4MDdlZSwweDA3ZjksMHgwZmY4LDB4MWZmZH0sCisgIHsweDBmZmQsMHgwN2YxLDB4MDNlOCwweDAxZTgsMHgwMGYwLDB4MDFlYywweDAzZWUsMHgwN2YyLDB4MGZmYX0sCisgIHsweDBmZjQsMHgwM2VmLDB4MDFmMiwweDAwZTgsMHgwMDcwLDB4MDBlYywweDAxZjAsMHgwM2VhLDB4MDdmM30sCisgIHsweDA3ZWIsMHgwMWViLDB4MDBlYSwweDAwMWEsMHgwMDA4LDB4MDAxOSwweDAwZWUsMHgwMWVmLDB4MDdlZH0sCisgIHsweDAzZjAsMHgwMGYyLDB4MDA3MywweDAwMGIsMHgwMDAwLDB4MDAwYSwweDAwNzEsMHgwMGYzLDB4MDdlOX0sCisgIHsweDA3ZWYsMHgwMWVlLDB4MDBlZiwweDAwMTgsMHgwMDA5LDB4MDAxYiwweDAwZWIsMHgwMWU5LDB4MDdlY30sCisgIHsweDA3ZjYsMHgwM2ViLDB4MDFmMywweDAwZWQsMHgwMDcyLDB4MDBlOSwweDAxZjEsMHgwM2VkLDB4MDdmN30sCisgIHsweDBmZjYsMHgwN2YwLDB4MDNlOSwweDAxZWQsMHgwMGYxLDB4MDFlYSwweDAzZWMsMHgwN2Y4LDB4MGZmOX0sCisgIHsweDFmZmMsMHgwZmZjLDB4MGZmNSwweDA3ZWEsMHgwM2YzLDB4MDNmMiwweDA3ZjUsMHgwZmZiLDB4MWZmZX0KK307CisKK2NvbnN0IFVXb3JkMTYgaHVmZl9jdGFiNls5XVs5XT0KK3sKKyAgezB4MDdmZSwweDAzZmQsMHgwMWYxLDB4MDFlYiwweDAxZjQsMHgwMWVhLDB4MDFmMCwweDAzZmMsMHgwN2ZkfSwKKyAgezB4MDNmNiwweDAxZTUsMHgwMGVhLDB4MDA2YywweDAwNzEsMHgwMDY4LDB4MDBmMCwweDAxZTYsMHgwM2Y3fSwKKyAgezB4MDFmMywweDAwZWYsMHgwMDMyLDB4MDAyNywweDAwMjgsMHgwMDI2LDB4MDAzMSwweDAwZWIsMHgwMWY3fSwKKyAgezB4MDFlOCwweDAwNmYsMHgwMDJlLDB4MDAwOCwweDAwMDQsMHgwMDA2LDB4MDAyOSwweDAwNmIsMHgwMWVlfSwKKyAgezB4MDFlZiwweDAwNzIsMHgwMDJkLDB4MDAwMiwweDAwMDAsMHgwMDAzLDB4MDAyZiwweDAwNzMsMHgwMWZhfSwKKyAgezB4MDFlNywweDAwNmUsMHgwMDJiLDB4MDAwNywweDAwMDEsMHgwMDA1LDB4MDAyYywweDAwNmQsMHgwMWVjfSwKKyAgezB4MDFmOSwweDAwZWUsMHgwMDMwLDB4MDAyNCwweDAwMmEsMHgwMDI1LDB4MDAzMywweDAwZWMsMHgwMWYyfSwKKyAgezB4MDNmOCwweDAxZTQsMHgwMGVkLDB4MDA2YSwweDAwNzAsMHgwMDY5LDB4MDA3NCwweDAwZjEsMHgwM2ZhfSwKKyAgezB4MDdmZiwweDAzZjksMHgwMWY2LDB4MDFlZCwweDAxZjgsMHgwMWU5LDB4MDFmNSwweDAzZmIsMHgwN2ZjfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2N0YWI3WzhdWzhdPQoreworICB7MHgwMDAwLDB4MDAwNSwweDAwMzcsMHgwMDc0LDB4MDBmMiwweDAxZWIsMHgwM2VkLDB4MDdmN30sCisgIHsweDAwMDQsMHgwMDBjLDB4MDAzNSwweDAwNzEsMHgwMGVjLDB4MDBlZSwweDAxZWUsMHgwMWY1fSwKKyAgezB4MDAzNiwweDAwMzQsMHgwMDcyLDB4MDBlYSwweDAwZjEsMHgwMWU5LDB4MDFmMywweDAzZjV9LAorICB7MHgwMDczLDB4MDA3MCwweDAwZWIsMHgwMGYwLDB4MDFmMSwweDAxZjAsMHgwM2VjLDB4MDNmYX0sCisgIHsweDAwZjMsMHgwMGVkLDB4MDFlOCwweDAxZWYsMHgwM2VmLDB4MDNmMSwweDAzZjksMHgwN2ZifSwKKyAgezB4MDFlZCwweDAwZWYsMHgwMWVhLDB4MDFmMiwweDAzZjMsMHgwM2Y4LDB4MDdmOSwweDA3ZmN9LAorICB7MHgwM2VlLDB4MDFlYywweDAxZjQsMHgwM2Y0LDB4MDNmNywweDA3ZjgsMHgwZmZkLDB4MGZmZX0sCisgIHsweDA3ZjYsMHgwM2YwLDB4MDNmMiwweDAzZjYsMHgwN2ZhLDB4MDdmZCwweDBmZmMsMHgwZmZmfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2N0YWI4WzhdWzhdPQoreworICB7MHgwMDBlLDB4MDAwNSwweDAwMTAsMHgwMDMwLDB4MDA2ZiwweDAwZjEsMHgwMWZhLDB4MDNmZX0sCisgIHsweDAwMDMsMHgwMDAwLDB4MDAwNCwweDAwMTIsMHgwMDJjLDB4MDA2YSwweDAwNzUsMHgwMGY4fSwKKyAgezB4MDAwZiwweDAwMDIsMHgwMDA2LDB4MDAxNCwweDAwMmUsMHgwMDY5LDB4MDA3MiwweDAwZjV9LAorICB7MHgwMDJmLDB4MDAxMSwweDAwMTMsMHgwMDJhLDB4MDAzMiwweDAwNmMsMHgwMGVjLDB4MDBmYX0sCisgIHsweDAwNzEsMHgwMDJiLDB4MDAyZCwweDAwMzEsMHgwMDZkLDB4MDA3MCwweDAwZjIsMHgwMWY5fSwKKyAgezB4MDBlZiwweDAwNjgsMHgwMDMzLDB4MDA2YiwweDAwNmUsMHgwMGVlLDB4MDBmOSwweDAzZmN9LAorICB7MHgwMWY4LDB4MDA3NCwweDAwNzMsMHgwMGVkLDB4MDBmMCwweDAwZjYsMHgwMWY2LDB4MDFmZH0sCisgIHsweDAzZmQsMHgwMGYzLDB4MDBmNCwweDAwZjcsMHgwMWY3LDB4MDFmYiwweDAxZmMsMHgwM2ZmfQorfTsKKworY29uc3QgVVdvcmQxNiBodWZmX2N0YWI5WzEzXVsxM109Cit7CisgIHsweDAwMDAsMHgwMDA1LDB4MDAzNywweDAwZTcsMHgwMWRlLDB4MDNjZSwweDAzZDksMHgwN2M4LDB4MDdjZCwweDBmYzgsMHgwZmRkLDB4MWZlNCwweDFmZWN9LAorICB7MHgwMDA0LDB4MDAwYywweDAwMzUsMHgwMDcyLDB4MDBlYSwweDAwZWQsMHgwMWUyLDB4MDNkMSwweDAzZDMsMHgwM2UwLDB4MDdkOCwweDBmY2YsMHgwZmQ1fSwKKyAgezB4MDAzNiwweDAwMzQsMHgwMDcxLDB4MDBlOCwweDAwZWMsMHgwMWUxLDB4MDNjZiwweDAzZGQsMHgwM2RiLDB4MDdkMCwweDBmYzcsMHgwZmQ0LDB4MGZlNH0sCisgIHsweDAwZTYsMHgwMDcwLDB4MDBlOSwweDAxZGQsMHgwMWUzLDB4MDNkMiwweDAzZGMsMHgwN2NjLDB4MDdjYSwweDA3ZGUsMHgwZmQ4LDB4MGZlYSwweDFmZGJ9LAorICB7MHgwMWRmLDB4MDBlYiwweDAxZGMsMHgwMWU2LDB4MDNkNSwweDAzZGUsMHgwN2NiLDB4MDdkZCwweDA3ZGMsMHgwZmNkLDB4MGZlMiwweDBmZTcsMHgxZmUxfSwKKyAgezB4MDNkMCwweDAxZTAsMHgwMWU0LDB4MDNkNiwweDA3YzUsMHgwN2QxLDB4MDdkYiwweDBmZDIsMHgwN2UwLDB4MGZkOSwweDBmZWIsMHgxZmUzLDB4MWZlOX0sCisgIHsweDA3YzQsMHgwMWU1LDB4MDNkNywweDA3YzYsMHgwN2NmLDB4MDdkYSwweDBmY2IsMHgwZmRhLDB4MGZlMywweDBmZTksMHgxZmU2LDB4MWZmMywweDFmZjd9LAorICB7MHgwN2QzLDB4MDNkOCwweDAzZTEsMHgwN2Q0LDB4MDdkOSwweDBmZDMsMHgwZmRlLDB4MWZkZCwweDFmZDksMHgxZmUyLDB4MWZlYSwweDFmZjEsMHgxZmY2fSwKKyAgezB4MDdkMiwweDAzZDQsMHgwM2RhLDB4MDdjNywweDA3ZDcsMHgwN2UyLDB4MGZjZSwweDBmZGIsMHgxZmQ4LDB4MWZlZSwweDNmZjAsMHgxZmY0LDB4M2ZmMn0sCisgIHsweDA3ZTEsMHgwM2RmLDB4MDdjOSwweDA3ZDYsMHgwZmNhLDB4MGZkMCwweDBmZTUsMHgwZmU2LDB4MWZlYiwweDFmZWYsMHgzZmYzLDB4M2ZmNCwweDNmZjV9LAorICB7MHgwZmUwLDB4MDdjZSwweDA3ZDUsMHgwZmM2LDB4MGZkMSwweDBmZTEsMHgxZmUwLDB4MWZlOCwweDFmZjAsMHgzZmYxLDB4M2ZmOCwweDNmZjYsMHg3ZmZjfSwKKyAgezB4MGZlOCwweDA3ZGYsMHgwZmM5LDB4MGZkNywweDBmZGMsMHgxZmRjLDB4MWZkZiwweDFmZWQsMHgxZmY1LDB4M2ZmOSwweDNmZmIsMHg3ZmZkLDB4N2ZmZX0sCisgIHsweDFmZTcsMHgwZmNjLDB4MGZkNiwweDBmZGYsMHgxZmRlLDB4MWZkYSwweDFmZTUsMHgxZmYyLDB4M2ZmYSwweDNmZjcsMHgzZmZjLDB4M2ZmZCwweDdmZmZ9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjEwWzEzXVsxM109Cit7CisgIHsweDAwMjIsMHgwMDA4LDB4MDAxZCwweDAwMjYsMHgwMDVmLDB4MDBkMywweDAxY2YsMHgwM2QwLDB4MDNkNywweDAzZWQsMHgwN2YwLDB4MDdmNiwweDBmZmR9LAorICB7MHgwMDA3LDB4MDAwMCwweDAwMDEsMHgwMDA5LDB4MDAyMCwweDAwNTQsMHgwMDYwLDB4MDBkNSwweDAwZGMsMHgwMWQ0LDB4MDNjZCwweDAzZGUsMHgwN2U3fSwKKyAgezB4MDAxYywweDAwMDIsMHgwMDA2LDB4MDAwYywweDAwMWUsMHgwMDI4LDB4MDA1YiwweDAwY2QsMHgwMGQ5LDB4MDFjZSwweDAxZGMsMHgwM2Q5LDB4MDNmMX0sCisgIHsweDAwMjUsMHgwMDBiLDB4MDAwYSwweDAwMGQsMHgwMDI0LDB4MDA1NywweDAwNjEsMHgwMGNjLDB4MDBkZCwweDAxY2MsMHgwMWRlLDB4MDNkMywweDAzZTd9LAorICB7MHgwMDVkLDB4MDAyMSwweDAwMWYsMHgwMDIzLDB4MDAyNywweDAwNTksMHgwMDY0LDB4MDBkOCwweDAwZGYsMHgwMWQyLDB4MDFlMiwweDAzZGQsMHgwM2VlfSwKKyAgezB4MDBkMSwweDAwNTUsMHgwMDI5LDB4MDA1NiwweDAwNTgsMHgwMDYyLDB4MDBjZSwweDAwZTAsMHgwMGUyLDB4MDFkYSwweDAzZDQsMHgwM2UzLDB4MDdlYn0sCisgIHsweDAxYzksMHgwMDVlLDB4MDA1YSwweDAwNWMsMHgwMDYzLDB4MDBjYSwweDAwZGEsMHgwMWM3LDB4MDFjYSwweDAxZTAsMHgwM2RiLDB4MDNlOCwweDA3ZWN9LAorICB7MHgwMWUzLDB4MDBkMiwweDAwY2IsMHgwMGQwLDB4MDBkNywweDAwZGIsMHgwMWM2LDB4MDFkNSwweDAxZDgsMHgwM2NhLDB4MDNkYSwweDA3ZWEsMHgwN2YxfSwKKyAgezB4MDFlMSwweDAwZDQsMHgwMGNmLDB4MDBkNiwweDAwZGUsMHgwMGUxLDB4MDFkMCwweDAxZDYsMHgwM2QxLDB4MDNkNSwweDAzZjIsMHgwN2VlLDB4MDdmYn0sCisgIHsweDAzZTksMHgwMWNkLDB4MDFjOCwweDAxY2IsMHgwMWQxLDB4MDFkNywweDAxZGYsMHgwM2NmLDB4MDNlMCwweDAzZWYsMHgwN2U2LDB4MDdmOCwweDBmZmF9LAorICB7MHgwM2ViLDB4MDFkZCwweDAxZDMsMHgwMWQ5LDB4MDFkYiwweDAzZDIsMHgwM2NjLDB4MDNkYywweDAzZWEsMHgwN2VkLDB4MDdmMywweDA3ZjksMHgwZmY5fSwKKyAgezB4MDdmMiwweDAzY2UsMHgwMWU0LDB4MDNjYiwweDAzZDgsMHgwM2Q2LDB4MDNlMiwweDAzZTUsMHgwN2U4LDB4MDdmNCwweDA3ZjUsMHgwN2Y3LDB4MGZmYn0sCisgIHsweDA3ZmEsMHgwM2VjLDB4MDNkZiwweDAzZTEsMHgwM2U0LDB4MDNlNiwweDAzZjAsMHgwN2U5LDB4MDdlZiwweDBmZjgsMHgwZmZlLDB4MGZmYywweDBmZmZ9Cit9OworCitjb25zdCBVV29yZDE2IGh1ZmZfY3RhYjExWzE3XVsxN109Cit7CisgIHsweDAwMDAsMHgwMDA2LDB4MDAxOSwweDAwM2QsMHgwMDljLDB4MDBjNiwweDAxYTcsMHgwMzkwLDB4MDNjMiwweDAzZGYsMHgwN2U2LDB4MDdmMywweDBmZmIsMHgwN2VjLDB4MGZmYSwweDBmZmUsMHgwMzhlfSwKKyAgezB4MDAwNSwweDAwMDEsMHgwMDA4LDB4MDAxNCwweDAwMzcsMHgwMDQyLDB4MDA5MiwweDAwYWYsMHgwMTkxLDB4MDFhNSwweDAxYjUsMHgwMzllLDB4MDNjMCwweDAzYTIsMHgwM2NkLDB4MDdkNiwweDAwYWV9LAorICB7MHgwMDE3LDB4MDAwNywweDAwMDksMHgwMDE4LDB4MDAzOSwweDAwNDAsMHgwMDhlLDB4MDBhMywweDAwYjgsMHgwMTk5LDB4MDFhYywweDAxYzEsMHgwM2IxLDB4MDM5NiwweDAzYmUsMHgwM2NhLDB4MDA5ZH0sCisgIHsweDAwM2MsMHgwMDE1LDB4MDAxNiwweDAwMWEsMHgwMDNiLDB4MDA0NCwweDAwOTEsMHgwMGE1LDB4MDBiZSwweDAxOTYsMHgwMWFlLDB4MDFiOSwweDAzYTEsMHgwMzkxLDB4MDNhNSwweDAzZDUsMHgwMDk0fSwKKyAgezB4MDA5YSwweDAwMzYsMHgwMDM4LDB4MDAzYSwweDAwNDEsMHgwMDhjLDB4MDA5YiwweDAwYjAsMHgwMGMzLDB4MDE5ZSwweDAxYWIsMHgwMWJjLDB4MDM5ZiwweDAzOGYsMHgwM2E5LDB4MDNjZiwweDAwOTN9LAorICB7MHgwMGJmLDB4MDAzZSwweDAwM2YsMHgwMDQzLDB4MDA0NSwweDAwOWUsMHgwMGE3LDB4MDBiOSwweDAxOTQsMHgwMWEyLDB4MDFiYSwweDAxYzMsMHgwM2E2LDB4MDNhNywweDAzYmIsMHgwM2Q0LDB4MDA5Zn0sCisgIHsweDAxYTAsMHgwMDhmLDB4MDA4ZCwweDAwOTAsMHgwMDk4LDB4MDBhNiwweDAwYjYsMHgwMGM0LDB4MDE5ZiwweDAxYWYsMHgwMWJmLDB4MDM5OSwweDAzYmYsMHgwM2I0LDB4MDNjOSwweDAzZTcsMHgwMGE4fSwKKyAgezB4MDFiNiwweDAwYWIsMHgwMGE0LDB4MDBhYSwweDAwYjIsMHgwMGMyLDB4MDBjNSwweDAxOTgsMHgwMWE0LDB4MDFiOCwweDAzOGMsMHgwM2E0LDB4MDNjNCwweDAzYzYsMHgwM2RkLDB4MDNlOCwweDAwYWR9LAorICB7MHgwM2FmLDB4MDE5MiwweDAwYmQsMHgwMGJjLDB4MDE4ZSwweDAxOTcsMHgwMTlhLDB4MDFhMywweDAxYjEsMHgwMzhkLDB4MDM5OCwweDAzYjcsMHgwM2QzLDB4MDNkMSwweDAzZGIsMHgwN2RkLDB4MDBiNH0sCisgIHsweDAzZGUsMHgwMWE5LDB4MDE5YiwweDAxOWMsMHgwMWExLDB4MDFhYSwweDAxYWQsMHgwMWIzLDB4MDM4YiwweDAzYjIsMHgwM2I4LDB4MDNjZSwweDAzZTEsMHgwM2UwLDB4MDdkMiwweDA3ZTUsMHgwMGI3fSwKKyAgezB4MDdlMywweDAxYmIsMHgwMWE4LDB4MDFhNiwweDAxYjAsMHgwMWIyLDB4MDFiNywweDAzOWIsMHgwMzlhLDB4MDNiYSwweDAzYjUsMHgwM2Q2LDB4MDdkNywweDAzZTQsMHgwN2Q4LDB4MDdlYSwweDAwYmF9LAorICB7MHgwN2U4LDB4MDNhMCwweDAxYmQsMHgwMWI0LDB4MDM4YSwweDAxYzQsMHgwMzkyLDB4MDNhYSwweDAzYjAsMHgwM2JjLDB4MDNkNywweDA3ZDQsMHgwN2RjLDB4MDdkYiwweDA3ZDUsMHgwN2YwLDB4MDBjMX0sCisgIHsweDA3ZmIsMHgwM2M4LDB4MDNhMywweDAzOTUsMHgwMzlkLDB4MDNhYywweDAzYWUsMHgwM2M1LDB4MDNkOCwweDAzZTIsMHgwM2U2LDB4MDdlNCwweDA3ZTcsMHgwN2UwLDB4MDdlOSwweDA3ZjcsMHgwMTkwfSwKKyAgezB4MDdmMiwweDAzOTMsMHgwMWJlLDB4MDFjMCwweDAzOTQsMHgwMzk3LDB4MDNhZCwweDAzYzMsMHgwM2MxLDB4MDNkMiwweDA3ZGEsMHgwN2Q5LDB4MDdkZiwweDA3ZWIsMHgwN2Y0LDB4MDdmYSwweDAxOTV9LAorICB7MHgwN2Y4LDB4MDNiZCwweDAzOWMsMHgwM2FiLDB4MDNhOCwweDAzYjMsMHgwM2I5LDB4MDNkMCwweDAzZTMsMHgwM2U1LDB4MDdlMiwweDA3ZGUsMHgwN2VkLDB4MDdmMSwweDA3ZjksMHgwN2ZjLDB4MDE5M30sCisgIHsweDBmZmQsMHgwM2RjLDB4MDNiNiwweDAzYzcsMHgwM2NjLDB4MDNjYiwweDAzZDksMHgwM2RhLDB4MDdkMywweDA3ZTEsMHgwN2VlLDB4MDdlZiwweDA3ZjUsMHgwN2Y2LDB4MGZmYywweDBmZmYsMHgwMTlkfSwKKyAgezB4MDFjMiwweDAwYjUsMHgwMGExLDB4MDA5NiwweDAwOTcsMHgwMDk1LDB4MDA5OSwweDAwYTAsMHgwMGEyLDB4MDBhYywweDAwYTksMHgwMGIxLDB4MDBiMywweDAwYmIsMHgwMGMwLDB4MDE4ZiwweDAwMDR9Cit9OworCitjb25zdCBVV29yZDMyIGh1ZmZfY3RhYnNjZlsxMjFdPQoreworICAweDAwMDNmZmU4LAorICAweDAwMDNmZmU2LAorICAweDAwMDNmZmU3LAorICAweDAwMDNmZmU1LAorICAweDAwMDdmZmY1LAorICAweDAwMDdmZmYxLAorICAweDAwMDdmZmVkLAorICAweDAwMDdmZmY2LAorICAweDAwMDdmZmVlLAorICAweDAwMDdmZmVmLAorICAweDAwMDdmZmYwLAorICAweDAwMDdmZmZjLAorICAweDAwMDdmZmZkLAorICAweDAwMDdmZmZmLAorICAweDAwMDdmZmZlLAorICAweDAwMDdmZmY3LAorICAweDAwMDdmZmY4LAorICAweDAwMDdmZmZiLAorICAweDAwMDdmZmY5LAorICAweDAwMDNmZmU0LAorICAweDAwMDdmZmZhLAorICAweDAwMDNmZmUzLAorICAweDAwMDFmZmVmLAorICAweDAwMDFmZmYwLAorICAweDAwMDBmZmY1LAorICAweDAwMDFmZmVlLAorICAweDAwMDBmZmYyLAorICAweDAwMDBmZmYzLAorICAweDAwMDBmZmY0LAorICAweDAwMDBmZmYxLAorICAweDAwMDA3ZmY2LAorICAweDAwMDA3ZmY3LAorICAweDAwMDAzZmY5LAorICAweDAwMDAzZmY1LAorICAweDAwMDAzZmY3LAorICAweDAwMDAzZmYzLAorICAweDAwMDAzZmY2LAorICAweDAwMDAzZmYyLAorICAweDAwMDAxZmY3LAorICAweDAwMDAxZmY1LAorICAweDAwMDAwZmY5LAorICAweDAwMDAwZmY3LAorICAweDAwMDAwZmY2LAorICAweDAwMDAwN2Y5LAorICAweDAwMDAwZmY0LAorICAweDAwMDAwN2Y4LAorICAweDAwMDAwM2Y5LAorICAweDAwMDAwM2Y3LAorICAweDAwMDAwM2Y1LAorICAweDAwMDAwMWY4LAorICAweDAwMDAwMWY3LAorICAweDAwMDAwMGZhLAorICAweDAwMDAwMGY4LAorICAweDAwMDAwMGY2LAorICAweDAwMDAwMDc5LAorICAweDAwMDAwMDNhLAorICAweDAwMDAwMDM4LAorICAweDAwMDAwMDFhLAorICAweDAwMDAwMDBiLAorICAweDAwMDAwMDA0LAorICAweDAwMDAwMDAwLAorICAweDAwMDAwMDBhLAorICAweDAwMDAwMDBjLAorICAweDAwMDAwMDFiLAorICAweDAwMDAwMDM5LAorICAweDAwMDAwMDNiLAorICAweDAwMDAwMDc4LAorICAweDAwMDAwMDdhLAorICAweDAwMDAwMGY3LAorICAweDAwMDAwMGY5LAorICAweDAwMDAwMWY2LAorICAweDAwMDAwMWY5LAorICAweDAwMDAwM2Y0LAorICAweDAwMDAwM2Y2LAorICAweDAwMDAwM2Y4LAorICAweDAwMDAwN2Y1LAorICAweDAwMDAwN2Y0LAorICAweDAwMDAwN2Y2LAorICAweDAwMDAwN2Y3LAorICAweDAwMDAwZmY1LAorICAweDAwMDAwZmY4LAorICAweDAwMDAxZmY0LAorICAweDAwMDAxZmY2LAorICAweDAwMDAxZmY4LAorICAweDAwMDAzZmY4LAorICAweDAwMDAzZmY0LAorICAweDAwMDBmZmYwLAorICAweDAwMDA3ZmY0LAorICAweDAwMDBmZmY2LAorICAweDAwMDA3ZmY1LAorICAweDAwMDNmZmUyLAorICAweDAwMDdmZmQ5LAorICAweDAwMDdmZmRhLAorICAweDAwMDdmZmRiLAorICAweDAwMDdmZmRjLAorICAweDAwMDdmZmRkLAorICAweDAwMDdmZmRlLAorICAweDAwMDdmZmQ4LAorICAweDAwMDdmZmQyLAorICAweDAwMDdmZmQzLAorICAweDAwMDdmZmQ0LAorICAweDAwMDdmZmQ1LAorICAweDAwMDdmZmQ2LAorICAweDAwMDdmZmYyLAorICAweDAwMDdmZmRmLAorICAweDAwMDdmZmU3LAorICAweDAwMDdmZmU4LAorICAweDAwMDdmZmU5LAorICAweDAwMDdmZmVhLAorICAweDAwMDdmZmViLAorICAweDAwMDdmZmU2LAorICAweDAwMDdmZmUwLAorICAweDAwMDdmZmUxLAorICAweDAwMDdmZmUyLAorICAweDAwMDdmZmUzLAorICAweDAwMDdmZmU0LAorICAweDAwMDdmZmU1LAorICAweDAwMDdmZmQ3LAorICAweDAwMDdmZmVjLAorICAweDAwMDdmZmY0LAorICAweDAwMDdmZmYzCit9OworCitjb25zdCBXb3JkMzIgbV9sb2cyX3RhYmxlW0lOVF9CSVRTXSA9IHsKKyAgMHgwMDAwMDAwMCwweDRhZTAwZDAwLDB4MjkzNGYwODAsMHgxNWMwMWEzZiwgCisgIDB4MGIzMWZiODAsMHgwNWFlYjRlMCwweDAyZGNmMmQwLDB4MDE2ZmU1MGMsIAorICAweDAwYjg0ZTIzLDB4MDA1YzNlMTAsMHgwMDJlMjRjYSwweDAwMTcxM2Q2LAorICAweDAwMGI4YTQ3LDB4MDAwNWM1M2IsMHgwMDAyZTJhMywweDAwMDE3MTUzLAorICAweDAwMDBiOGFhLDB4MDAwMDVjNTUsMHgwMDAwMmUyYiwweDAwMDAxNzE1LAorICAweDAwMDAwYjhiLDB4MDAwMDA1YzUsMHgwMDAwMDJlMywweDAwMDAwMTcxLCAKKyAgMHgwMDAwMDBiOSwweDAwMDAwMDVjLDB4MDAwMDAwMmUsMHgwMDAwMDAxNywKKyAgMHgwMDAwMDAwYywweDAwMDAwMDA2LDB4MDAwMDAwMDMsMHgwMDAwMDAwMQorfTsKKworCisvKgorICAzIGJpdCByZXNvbHV0aW9uCisqLworY29uc3QgV29yZDMyIHRuc0NvZWZmM1s4XSA9Cit7CisgIDB4ODFmMWQxZDQsCisgIDB4OTEyNjE0N2MsCisgIDB4YWRiOTIyZjcsCisgIDB4ZDQzOGFmMDksCisgIDB4MDAwMDAwMDAsCisgIDB4Mzc4OTgwODcsCisgIDB4NjQxMzBkZmEsCisgIDB4N2NjYTZmZmIsCit9OworCitjb25zdCBXb3JkMzIgdG5zQ29lZmYzQm9yZGVyc1s4XSA9Cit7CisgIDB4ODAwMDAwMDAsICAvKiAtNCAqLworICAweDg3YjgyNmRlLCAgLyogLTMgKi8KKyAgMHg5ZGYyNDE1MywgIC8qIC0yICovCisgIDB4YmZmZmZmZTUsICAvKiAtMSAqLworICAweGU5YzVlNTc4LCAgLyogIDAgKi8KKyAgMHgxYzdiOTBmMCwgIC8qICAxICovCisgIDB4NGZjZTgzYWEsICAvKiAgMiAqLworICAweDczNTJmMmM0LCAgLyogIDMgKi8KK307CisKKworLyoKKyAgNCBiaXQgcmVzb2x1dGlvbgorKi8KKworY29uc3QgV29yZDMyIHRuc0NvZWZmNFsxNl0gPQoreworICAweDgwOGJjODRiLAorICAweDg0ZTJlNTdkLAorICAweDhkNmI0OWZiLAorICAweDk5ZGE5MjA3LAorICAweGE5YzQ1NzA3LAorICAweGJjOWRkZTc4LAorICAweGQxYzJkNGZjLAorICAweGU4N2FlNTM5LAorICAweDAwMDAwMDAwLAorICAweDFhOWNkOWMwLAorICAweDM0MGZmMjNiLAorICAweDRiM2M4YmY3LAorICAweDVmMWY1ZTgwLAorICAweDZlZDllYjg0LAorICAweDc5YmMzODgwLAorICAweDdmNGM3ZTg5Cit9OworCitjb25zdCBXb3JkMzIgdG5zQ29lZmY0Qm9yZGVyc1sxNl09Cit7CisgIDB4ODAwMDAwMDAsICAvKiAtOCAqLworICAweDgyMmRlZmVmLCAgLyogLTcgKi8KKyAgMHg4OGE0YmZlNSwgIC8qIC02ICovCisgIDB4OTMyYzE1OWMsICAvKiAtNSAqLworICAweGExNjgyN2MxLCAgLyogLTQgKi8KKyAgMHhiMmRjZGUyNiwgIC8qIC0zICovCisgIDB4YzZmMjBiOTEsICAvKiAtMiAqLworICAweGRjZjg5YzY0LCAgLyogLTEgKi8KKyAgMHhmNDMwOGNlMSwgIC8qICAwICovCisgIDB4MGQ2MTMwNTQsICAvKiAgMSAqLworICAweDI3OGRkZTgwLCAgLyogIDIgKi8KKyAgMHg0MDAwMDAxYiwgIC8qICAzICovCisgIDB4NTVhNjEyN2MsICAvKiAgNCAqLworICAweDY3OGRkZThmLCAgLyogIDUgKi8KKyAgMHg3NGVmMGVkOCwgIC8qICA2ICovCisgIDB4N2QzM2YwZGIgICAvKiAgNyAqLworfTsKKworCitjb25zdCB1bnNpZ25lZCBjaGFyIGJpdHJldlRhYlsxNyArIDEyOV0gPSANCit7DQorLyogNjQgKi8NCisweDAxLCAweDA4LCAweDAyLCAweDA0LCAweDAzLCAweDBjLCAweDA1LCAweDBhLCAweDA3LCAweDBlLCAweDBiLCAweDBkLCAweDAwLCAweDA2LCAweDA5LCAweDBmLA0KKzB4MDAsDQorDQorLyogNTEyICovDQorMHgwMSwgMHg0MCwgMHgwMiwgMHgyMCwgMHgwMywgMHg2MCwgMHgwNCwgMHgxMCwgMHgwNSwgMHg1MCwgMHgwNiwgMHgzMCwgMHgwNywgMHg3MCwgMHgwOSwgMHg0OCwNCisweDBhLCAweDI4LCAweDBiLCAweDY4LCAweDBjLCAweDE4LCAweDBkLCAweDU4LCAweDBlLCAweDM4LCAweDBmLCAweDc4LCAweDExLCAweDQ0LCAweDEyLCAweDI0LA0KKzB4MTMsIDB4NjQsIDB4MTUsIDB4NTQsIDB4MTYsIDB4MzQsIDB4MTcsIDB4NzQsIDB4MTksIDB4NGMsIDB4MWEsIDB4MmMsIDB4MWIsIDB4NmMsIDB4MWQsIDB4NWMsDQorMHgxZSwgMHgzYywgMHgxZiwgMHg3YywgMHgyMSwgMHg0MiwgMHgyMywgMHg2MiwgMHgyNSwgMHg1MiwgMHgyNiwgMHgzMiwgMHgyNywgMHg3MiwgMHgyOSwgMHg0YSwNCisweDJiLCAweDZhLCAweDJkLCAweDVhLCAweDJlLCAweDNhLCAweDJmLCAweDdhLCAweDMxLCAweDQ2LCAweDMzLCAweDY2LCAweDM1LCAweDU2LCAweDM3LCAweDc2LA0KKzB4MzksIDB4NGUsIDB4M2IsIDB4NmUsIDB4M2QsIDB4NWUsIDB4M2YsIDB4N2UsIDB4NDMsIDB4NjEsIDB4NDUsIDB4NTEsIDB4NDcsIDB4NzEsIDB4NGIsIDB4NjksDQorMHg0ZCwgMHg1OSwgMHg0ZiwgMHg3OSwgMHg1MywgMHg2NSwgMHg1NywgMHg3NSwgMHg1YiwgMHg2ZCwgMHg1ZiwgMHg3ZCwgMHg2NywgMHg3MywgMHg2ZiwgMHg3YiwNCisweDAwLCAweDA4LCAweDE0LCAweDFjLCAweDIyLCAweDJhLCAweDM2LCAweDNlLCAweDQxLCAweDQ5LCAweDU1LCAweDVkLCAweDYzLCAweDZiLCAweDc3LCAweDdmLA0KKzB4MDAsDQorfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FhY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MmFlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmMuYwpAQCAtMCwwICsxLDQ5NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYWFjZW5jLmMNCisNCisJQ29udGVudDoJYWFjIGVuY29kZXIgaW50ZXJmYWNlIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInZvQUFDLmgiDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYWFjZW5jX2NvcmUuaCINCisjaW5jbHVkZSAiYWFjX3JvbS5oIg0KKyNpbmNsdWRlICJjbW5NZW1vcnkuaCINCisjaW5jbHVkZSAibWVtYWxpZ24uaCINCisNCisvKioNCisqIEluaXQgdGhlIGF1ZGlvIGNvZGVjIG1vZHVsZSBhbmQgcmV0dXJuIGNvZGVjIGhhbmRsZQ0KKyogXHBhcmFtIHBoQ29kZWMgW09VVF0gUmV0dXJuIHRoZSB2aWRlbyBjb2RlYyBoYW5kbGUNCisqIFxwYXJhbSB2VHlwZQlbSU5dIFRoZSBjb2RlYyB0eXBlIGlmIHRoZSBtb2R1bGUgc3VwcG9ydCBtdWx0aSBjb2RlYy4NCisqIFxwYXJhbSBwVXNlckRhdGEJW0lOXSBUaGUgaW5pdCBwYXJhbS4gSXQgaXMgbWVtb3J5IG9wZXJhdG9yIG9yIGFsbG9jZWQgbWVtb3J5DQorKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisqLw0KK1ZPX1UzMiBWT19BUEkgdm9BQUNFbmNJbml0KFZPX0hBTkRMRSAqIHBoQ29kZWMsVk9fQVVESU9fQ09ESU5HVFlQRSB2VHlwZSwgVk9fQ09ERUNfSU5JVF9VU0VSREFUQSAqcFVzZXJEYXRhKQ0KK3sNCisJQUFDX0VOQ09ERVIqaEFhY0VuYzsNCisJQUFDRU5DX0NPTkZJRyBjb25maWc7DQorCWludCBlcnJvcjsNCisNCisjaWZkZWYgVVNFX0RFQVVMVF9NRU0NCisJVk9fTUVNX09QRVJBVE9SIHZvTWVtb3ByYXRvcjsNCisjZW5kaWYNCisJVk9fTUVNX09QRVJBVE9SICpwTWVtT1A7DQorCWludCBpbnRlck1lbTsNCisNCisJaW50ZXJNZW0gPSAwOw0KKwllcnJvciA9IDA7DQorCQ0KKwkvKiBpbml0IHRoZSBtZW1vcnkgb3BlcmF0b3IgKi8NCisJaWYocFVzZXJEYXRhID09IE5VTEwgfHwgcFVzZXJEYXRhLT5tZW1mbGFnICE9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1IgfHwgcFVzZXJEYXRhLT5tZW1EYXRhID09IE5VTEwgKQ0KKwl7DQorI2lmZGVmIFVTRV9ERUFVTFRfTUVNDQorCQl2b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsNCisJCXZvTWVtb3ByYXRvci5Db3B5ID0gY21uTWVtQ29weTsNCisJCXZvTWVtb3ByYXRvci5GcmVlID0gY21uTWVtRnJlZTsNCisJCXZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7DQorCQl2b01lbW9wcmF0b3IuQ2hlY2sgPSBjbW5NZW1DaGVjazsNCisNCisJCWludGVyTWVtID0gMTsNCisNCisJCXBNZW1PUCA9ICZ2b01lbW9wcmF0b3I7DQorI2Vsc2UNCisJCSpwaENvZGVjID0gTlVMTDsNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorI2VuZGlmDQorCX0NCisJZWxzZQ0KKwl7DQorCQlwTWVtT1AgPSAoVk9fTUVNX09QRVJBVE9SICopcFVzZXJEYXRhLT5tZW1EYXRhOw0KKwl9DQorDQorCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIGhhbmRsZSAqLw0KKwloQWFjRW5jID0gKEFBQ19FTkNPREVSKiltZW1fbWFsbG9jKHBNZW1PUCwgc2l6ZW9mKEFBQ19FTkNPREVSKSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOw0KKwlpZihOVUxMID09IGhBYWNFbmMpDQorCXsNCisJCWVycm9yID0gMTsNCisJfQ0KKw0KKwlpZighZXJyb3IpDQorCXsNCisJCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIGludHJhIG1lbW9yeSAqLw0KKwkJaEFhY0VuYy0+aW50YnVmID0gKHNob3J0ICopbWVtX21hbGxvYyhwTWVtT1AsIEFBQ0VOQ19CTE9DS1NJWkUqTUFYX0NIQU5ORUxTKnNpemVvZihzaG9ydCksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsNCisJCWlmKE5VTEwgPT0gaEFhY0VuYy0+aW50YnVmKQ0KKwkJew0KKwkJCWVycm9yID0gMTsNCisJCX0NCisJfQ0KKw0KKwlpZiAoIWVycm9yKSB7CisJCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIHBzeWNob2Fjb3VzdGljICovCisJCWVycm9yID0gKFBzeU5ldygmaEFhY0VuYy0+cHN5S2VybmVsLCBNQVhfQ0hBTk5FTFMsIHBNZW1PUCkgfHwKKwkJCVBzeU91dE5ldygmaEFhY0VuYy0+cHN5T3V0LCBwTWVtT1ApKTsKKwl9DQorDQorCWlmICghZXJyb3IpIHsKKwkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgcXVhbnRpemF0aW9uIGVsZW1lbnRzICovCisJCWVycm9yID0gUUNPdXROZXcoJmhBYWNFbmMtPnFjT3V0LE1BWF9DSEFOTkVMUywgcE1lbU9QKTsKKwl9DQorDQorCWlmICghZXJyb3IpIHsKKwkJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgcXVhbnRpemF0aW9uIHN0YXRlICovCisJCWVycm9yID0gUUNOZXcoJmhBYWNFbmMtPnFjS2VybmVsLCBwTWVtT1ApOworCX0KKworCS8qIHVuaW5pdCB0aGUgYWFjIGVuY29kZXIgaWYgZXJyb3IgaXMgbm96ZXJvICovCisJaWYoZXJyb3IpCisJeworCQlBYWNFbmNDbG9zZShoQWFjRW5jLCBwTWVtT1ApOworCQlpZihoQWFjRW5jKQorCQl7CisJCQltZW1fZnJlZShwTWVtT1AsIGhBYWNFbmMsIFZPX0lOREVYX0VOQ19BQUMpOworCQkJaEFhY0VuYyA9IE5VTEw7CisJCX0JCQorCQkqcGhDb2RlYyA9IE5VTEw7CisJCXJldHVybiBWT19FUlJfT1VUT0ZfTUVNT1JZOworCX0NCisNCisJLyogaW5pdCB0aGUgYWFjIGVuY29kZXIgbWVtb3J5IG9wZXJhdG9yICAqLw0KKyNpZmRlZiBVU0VfREVBVUxUX01FTQ0KKwlpZihpbnRlck1lbSkNCisJew0KKwkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkFsbG9jID0gY21uTWVtQWxsb2M7DQorCQloQWFjRW5jLT52b01lbW9wcmF0b3IuQ29weSA9IGNtbk1lbUNvcHk7DQorCQloQWFjRW5jLT52b01lbW9wcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7DQorCQloQWFjRW5jLT52b01lbW9wcmF0b3IuU2V0ID0gY21uTWVtU2V0Ow0KKwkJaEFhY0VuYy0+dm9NZW1vcHJhdG9yLkNoZWNrID0gY21uTWVtQ2hlY2s7DQorDQorCQlwTWVtT1AgPSAmaEFhY0VuYy0+dm9NZW1vcHJhdG9yOw0KKwl9DQorI2VuZGlmDQorCS8qIGluaXQgdGhlIGFhYyBlbmNvZGVyIGRlZmF1bHQgcGFyYW1ldGVyICAqLw0KKwlpZihoQWFjRW5jLT5pbml0T0sgPT0gMCkNCisJew0KKwkJIEFBQ0VOQ19DT05GSUcgY29uZmlnOw0KKwkJIGNvbmZpZy5hZHRzVXNlZCA9IDE7DQorCQkgY29uZmlnLmJpdFJhdGUgPSAxMjgwMDA7DQorCQkgY29uZmlnLm5DaGFubmVsc0luID0gMjsNCisJCSBjb25maWcubkNoYW5uZWxzT3V0ID0gMjsNCisJCSBjb25maWcuc2FtcGxlUmF0ZSA9IDQ0MTAwOw0KKwkJIGNvbmZpZy5iYW5kV2lkdGggPSAyMDAwMDsNCisNCisJCSBBYWNFbmNPcGVuKGhBYWNFbmMsIGNvbmZpZyk7DQorCX0NCisNCisJaEFhY0VuYy0+dm9NZW1vcCA9IHBNZW1PUDsNCisNCisJKnBoQ29kZWMgPSBoQWFjRW5jOw0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKg0KKyogU2V0IGlucHV0IGF1ZGlvIGRhdGEuDQorKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisqIFxwYXJhbSBwSW5wdXQgW0lOXSBUaGUgaW5wdXQgYnVmZmVyIHBhcmFtLg0KKyogXHBhcmFtIHBPdXRCdWZmZXIgW09VVF0gVGhlIG91dHB1dCBidWZmZXIgaW5mby4NCisqIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKyovDQorVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY1NldElucHV0RGF0YShWT19IQU5ETEUgaENvZGVjLCBWT19DT0RFQ0JVRkZFUiAqIHBJbnB1dCkNCit7DQorCUFBQ19FTkNPREVSICpoQWFjRW5jOw0KKwlpbnQgIGxlbmd0aDsNCisNCisJaWYoTlVMTCA9PSBoQ29kZWMgfHwgTlVMTCA9PSBwSW5wdXQgfHwgTlVMTCA9PSBwSW5wdXQtPkJ1ZmZlcikNCisJew0KKwkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsNCisJfQ0KKwkNCisJaEFhY0VuYyA9IChBQUNfRU5DT0RFUiAqKWhDb2RlYzsNCisJDQorCS8qIGluaXQgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8NCisJaEFhY0VuYy0+aW5idWYgPSAoc2hvcnQgKilwSW5wdXQtPkJ1ZmZlcjsNCisJaEFhY0VuYy0+aW5sZW4gPSBwSW5wdXQtPkxlbmd0aCAvIHNpemVvZihzaG9ydCk7DQorCWhBYWNFbmMtPnVzZWxlbmd0aCA9IDA7DQorDQorCWhBYWNFbmMtPmVuY2J1ZiA9IGhBYWNFbmMtPmluYnVmOw0KKwloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbmxlbjsNCisJDQorCS8qIHJlYnVpbGQgaW50cmEgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8NCisJaWYoaEFhY0VuYy0+aW50bGVuKQ0KKwl7DQorCQlsZW5ndGggPSBtaW4oaEFhY0VuYy0+Y29uZmlnLm5DaGFubmVsc0luKkFBQ0VOQ19CTE9DS1NJWkUgLSBoQWFjRW5jLT5pbnRsZW4sIGhBYWNFbmMtPmlubGVuKTsNCisJCWhBYWNFbmMtPnZvTWVtb3AtPkNvcHkoVk9fSU5ERVhfRU5DX0FBQywgaEFhY0VuYy0+aW50YnVmICsgaEFhY0VuYy0+aW50bGVuLCANCisJCQloQWFjRW5jLT5pbmJ1ZiwgbGVuZ3RoKnNpemVvZihzaG9ydCkpOw0KKw0KKwkJaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+aW50YnVmOw0KKwkJaEFhY0VuYy0+ZW5jbGVuID0gaEFhY0VuYy0+aW50bGVuICsgbGVuZ3RoOw0KKw0KKwkJaEFhY0VuYy0+aW5idWYgKz0gbGVuZ3RoOw0KKwkJaEFhY0VuYy0+aW5sZW4gLT0gbGVuZ3RoOw0KKwl9DQorCQ0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKg0KKyogR2V0IHRoZSBvdXR1dCBhdWRpbyBkYXRhDQorKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisqIFxwYXJhbSBwT3V0QnVmZmVyIFtPVVRdIFRoZSBvdXRwdXQgYXVkaW8gZGF0YQ0KKyogXHBhcmFtIHBPdXRJbmZvIFtPVVRdIFRoZSBkZWMgbW9kdWxlIGZpbGxlZCBhdWRpbyBmb3JtYXQgYW5kIHVzZWQgdGhlIGlucHV0IHNpemUuDQorKgkJCQkJCSBwT3V0SW5mby0+SW5wdXRVc2VkIGlzIHRvdGFsIHVzZWQgdGhlIGlucHV0IHNpemUuDQorKiBccmV0dmFsICBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorKgkJCVZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwuIFRoZSBpbnB1dCB3YXMgZmluaXNoZWQgb3IgdGhlIGlucHV0IGRhdGEgd2FzIG5vdCBlbm91Z2h0Lg0KKyovDQorVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0dldE91dHB1dERhdGEoVk9fSEFORExFIGhDb2RlYywgVk9fQ09ERUNCVUZGRVIgKiBwT3V0cHV0LCBWT19BVURJT19PVVRQVVRJTkZPICogcE91dEluZm8pDQorew0KKwlBQUNfRU5DT0RFUiogaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopaENvZGVjOw0KKwlXb3JkMTYgbnVtQW5jRGF0YUJ5dGVzPTA7DQorCVdvcmQzMiAgaW5idWZsZW47DQorCWludCByZXQsIGxlbmd0aDsNCisJaWYoTlVMTCA9PSBoQWFjRW5jKQ0KKwkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsNCisNCisJIGluYnVmbGVuID0gQUFDRU5DX0JMT0NLU0laRSpoQWFjRW5jLT5jb25maWcubkNoYW5uZWxzSW47DQorDQorCSAvKiBjaGVjayB0aGUgaW5wdXQgcGNtIGJ1ZmZlciBhbmQgbGVuZ3RoKi8NCisJIGlmKE5VTEwgPT0gaEFhY0VuYy0+ZW5jYnVmIHx8IGhBYWNFbmMtPmVuY2xlbiA8IGluYnVmbGVuKQ0KKwkgew0KKwkJbGVuZ3RoID0gaEFhY0VuYy0+ZW5jbGVuOwkJDQorCQlpZihoQWFjRW5jLT5pbnRsZW4gPT0gMCkNCisJCXsJDQorCQkJaEFhY0VuYy0+dm9NZW1vcC0+Q29weShWT19JTkRFWF9FTkNfQUFDLCBoQWFjRW5jLT5pbnRidWYsIA0KKwkJCQloQWFjRW5jLT5lbmNidWYsIGxlbmd0aCpzaXplb2Yoc2hvcnQpKTsJCQ0KKwkJCWhBYWNFbmMtPnVzZWxlbmd0aCArPSBsZW5ndGgqc2l6ZW9mKHNob3J0KTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQloQWFjRW5jLT51c2VsZW5ndGggKz0gKGxlbmd0aCAtIGhBYWNFbmMtPmludGxlbikqc2l6ZW9mKHNob3J0KTsNCisJCX0NCisNCisJCWhBYWNFbmMtPmludGxlbiA9IGxlbmd0aDsNCisNCisJCXBPdXRwdXQtPkxlbmd0aCA9IDA7DQorCQlpZihwT3V0SW5mbykNCisJCQlwT3V0SW5mby0+SW5wdXRVc2VkID0gaEFhY0VuYy0+dXNlbGVuZ3RoOw0KKwkJcmV0dXJuIFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEw7CQ0KKwkgfQ0KKw0KKwkgLyogY2hlY2sgdGhlIG91dHB1dCBhYWMgYnVmZmVyIGFuZCBsZW5ndGgqLw0KKwkgaWYoTlVMTCA9PSBwT3V0cHV0IHx8IE5VTEwgPT0gcE91dHB1dC0+QnVmZmVyIHx8IHBPdXRwdXQtPkxlbmd0aCA8ICg2MTQ0LzgpKmhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNPdXQvKHNpemVvZihXb3JkMzIpKSkNCisJCSByZXR1cm4gVk9fRVJSX09VVFBVVF9CVUZGRVJfU01BTEw7DQorDQorCSAvKiBhYWMgZW5jb2RlciBjb3JlIGZ1bmN0aW9uICovDQorCSBBYWNFbmNFbmNvZGUoIGhBYWNFbmMsDQorCQkJKFdvcmQxNiopaEFhY0VuYy0+ZW5jYnVmLA0KKwkJCU5VTEwsDQorCQkJJm51bUFuY0RhdGFCeXRlcywNCisJCQlwT3V0cHV0LT5CdWZmZXIsDQorCQkJJnBPdXRwdXQtPkxlbmd0aCk7DQorDQorCSAvKiB1cGRhdGUgdGhlIGlucHV0IHBjbSBidWZmZXIgYW5kIGxlbmd0aCovDQorCSBpZihoQWFjRW5jLT5pbnRsZW4pDQorCSB7DQorCQlsZW5ndGggPSBpbmJ1ZmxlbiAtIGhBYWNFbmMtPmludGxlbjsJCQ0KKwkJaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+aW5idWY7DQorCQloQWFjRW5jLT5lbmNsZW4gPSBoQWFjRW5jLT5pbmxlbjsNCisJCWhBYWNFbmMtPnVzZWxlbmd0aCArPSBsZW5ndGgqc2l6ZW9mKHNob3J0KTsNCisJCWhBYWNFbmMtPmludGxlbiA9IDA7DQorCSB9DQorCSBlbHNlDQorCSB7DQorCQkgaEFhY0VuYy0+ZW5jYnVmID0gaEFhY0VuYy0+ZW5jYnVmICsgaW5idWZsZW47DQorCQkgaEFhY0VuYy0+ZW5jbGVuID0gaEFhY0VuYy0+ZW5jbGVuIC0gaW5idWZsZW47DQorCQkgaEFhY0VuYy0+dXNlbGVuZ3RoICs9IGluYnVmbGVuKnNpemVvZihzaG9ydCk7DQorCSB9CSANCisNCisJIC8qIHVwZGF0ZSB0aGUgb3V0cHV0IGFhYyBpbmZvcm1hdGlvbiAqLw0KKwlpZihwT3V0SW5mbykNCisJew0KKwkJcE91dEluZm8tPkZvcm1hdC5DaGFubmVscyA9IGhBYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNPdXQ7DQorCQlwT3V0SW5mby0+Rm9ybWF0LlNhbXBsZVJhdGUgPSBoQWFjRW5jLT5jb25maWcuc2FtcGxlUmF0ZTsNCisJCXBPdXRJbmZvLT5Gb3JtYXQuU2FtcGxlQml0cyA9IDE2Ow0KKwkJcE91dEluZm8tPklucHV0VXNlZCA9IGhBYWNFbmMtPnVzZWxlbmd0aDsNCisJfQ0KKw0KKwkgcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioNCisqIFVuaW5pdCB0aGUgQ29kZWMuDQorKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisqIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKyovDQorVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY1VuaW5pdChWT19IQU5ETEUgaENvZGVjKQ0KK3sNCisJQUFDX0VOQ09ERVIqIGhBYWNFbmMgPSAoQUFDX0VOQ09ERVIqKWhDb2RlYzsNCisJDQorCWlmKE5VTEwgIT0gaEFhY0VuYykNCisJew0KKwkJLyogY2xvc2UgdGhlIGFhYyBlbmNvZGVyICovDQorCQlBYWNFbmNDbG9zZShoQWFjRW5jLCBoQWFjRW5jLT52b01lbW9wKTsNCisNCisJCS8qIGZyZWUgdGhlIGFhYyBlbmNvZGVyIGhhbmRsZSovDQorCQltZW1fZnJlZShoQWFjRW5jLT52b01lbW9wLCBoQWFjRW5jLCBWT19JTkRFWF9FTkNfQUFDKTsNCisJCWhBYWNFbmMgPSBOVUxMOw0KKwl9CQ0KKw0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKg0KKyogU2V0IHRoZSBwYXJhbSBmb3Igc3BlY2lhbCB0YXJnZXQuDQorKiBccGFyYW0gaENvZGVjIFtJTl1dIFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbi4NCisqIFxwYXJhbSB1UGFyYW1JRCBbSU5dIFRoZSBwYXJhbSBJRC4NCisqIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZSBkZXBlbmQgb24gdGhlIElEPg0KKyogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorKi8NCitWT19VMzIgVk9fQVBJIHZvQUFDRW5jU2V0UGFyYW0oVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpDQorew0KKwlBQUNFTkNfQ09ORklHIGNvbmZpZzsNCisJQUFDRU5DX1BBUkFNKiBwQUFDX3BhcmFtOw0KKwlWT19BVURJT19GT1JNQVQgKnBXQVZfRm9ybWF0Ow0KKwlBQUNfRU5DT0RFUiogaEFhY0VuYyA9IChBQUNfRU5DT0RFUiopaENvZGVjOw0KKwlpbnQgcmV0LCBpLCBiaXRyYXRlLCB0bXA7DQorCWludCBTYW1wbGVSYXRlSWR4Ow0KKw0KKwlpZihOVUxMID09IGhBYWNFbmMpDQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwkNCisJc3dpdGNoKHVQYXJhbUlEKQ0KKwl7DQorCWNhc2UgVk9fUElEX0FBQ19FTkNQQVJBTTogIC8qIGluaXQgYWFjIGVuY29kZXIgcGFyYW1ldGVyKi8NCisJCUFhY0luaXREZWZhdWx0Q29uZmlnKCZjb25maWcpOw0KKwkJaWYocERhdGEgPT0gTlVMTCkNCisJCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKwkJcEFBQ19wYXJhbSA9IChBQUNFTkNfUEFSQU0qKXBEYXRhOw0KKwkJY29uZmlnLmFkdHNVc2VkID0gcEFBQ19wYXJhbS0+YWR0c1VzZWQ7DQorCQljb25maWcuYml0UmF0ZSA9IHBBQUNfcGFyYW0tPmJpdFJhdGU7DQorCQljb25maWcubkNoYW5uZWxzSW4gPSBwQUFDX3BhcmFtLT5uQ2hhbm5lbHM7DQorCQljb25maWcubkNoYW5uZWxzT3V0ID0gcEFBQ19wYXJhbS0+bkNoYW5uZWxzOw0KKwkJY29uZmlnLnNhbXBsZVJhdGUgPSBwQUFDX3BhcmFtLT5zYW1wbGVSYXRlOw0KKw0KKwkJLyogY2hlY2sgdGhlIGNoYW5uZWwgKi8NCisJCWlmKGNvbmZpZy5uQ2hhbm5lbHNJbjwgMSAgfHwgY29uZmlnLm5DaGFubmVsc0luID4gTUFYX0NIQU5ORUxTICB8fA0KKyAgICAgICAgICAgICBjb25maWcubkNoYW5uZWxzT3V0IDwgMSB8fCBjb25maWcubkNoYW5uZWxzT3V0ID4gTUFYX0NIQU5ORUxTIHx8IGNvbmZpZy5uQ2hhbm5lbHNJbiA8IGNvbmZpZy5uQ2hhbm5lbHNPdXQpDQorCQkJIHJldHVybiBWT19FUlJfQVVESU9fVU5TQ0hBTk5FTDsNCisNCisJCS8qIGNoZWNrIHRoZSBzYW1wbGVyYXRlICovDQorCQlyZXQgPSAtMTsNCisJCWZvcihpID0gMDsgaSA8IE5VTV9TQU1QTEVfUkFURVM7IGkrKykNCisJCXsNCisJCQlpZihjb25maWcuc2FtcGxlUmF0ZSA9PSBzYW1wUmF0ZVRhYltpXSkNCisJCQl7DQorCQkJCXJldCA9IDA7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJCWlmKHJldCA8IDApDQorCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNTQU1QTEVSQVRFOw0KKw0KKwkJU2FtcGxlUmF0ZUlkeCA9IGk7DQorDQorCQl0bXAgPSA0NDE7DQorCQlpZihjb25maWcuc2FtcGxlUmF0ZSU4MDAwID09IDApIA0KKwkJCXRtcCA9NDgwOw0KKwkJLyogY2hlY2sgdGhlIGJpdHJhdGUgKi8NCisJCWlmKGNvbmZpZy5iaXRSYXRlIT0wICYmIChjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0IDwgNDAwMCkgfHwNCisgICAgICAgICAgIChjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKSB8fCANCisJCSAgIChjb25maWcuYml0UmF0ZSA+IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dCkpDQorCQl7DQorCQkJY29uZmlnLmJpdFJhdGUgPSA2NDAqY29uZmlnLnNhbXBsZVJhdGUvdG1wKmNvbmZpZy5uQ2hhbm5lbHNPdXQ7DQorDQorCQkJaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA8IDQwMDApDQorCQkJCWNvbmZpZy5iaXRSYXRlID0gNDAwMCAqIGNvbmZpZy5uQ2hhbm5lbHNPdXQ7DQorCQkJZWxzZSBpZihjb25maWcuYml0UmF0ZSA+IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dCkNCisJCQkJY29uZmlnLmJpdFJhdGUgPSBjb25maWcuc2FtcGxlUmF0ZSo2KmNvbmZpZy5uQ2hhbm5lbHNPdXQ7DQorCQkJZWxzZSBpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0ID4gMTYwMDAwKQ0KKwkJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5uQ2hhbm5lbHNPdXQqMTYwMDAwOw0KKwkJfQ0KKw0KKwkJLyogY2hlY2sgdGhlIGJhbmR3aWR0aCAqLw0KKwkJYml0cmF0ZSA9IGNvbmZpZy5iaXRSYXRlIC8gY29uZmlnLm5DaGFubmVsc091dDsNCisJCWJpdHJhdGUgPSBiaXRyYXRlICogdG1wIC8gY29uZmlnLnNhbXBsZVJhdGU7DQorDQorCQlmb3IgKGkgPSAwOyByYXRlc1tpXTsgaSsrKQ0KKwkJew0KKwkJCWlmIChyYXRlc1tpXSA+PSBiaXRyYXRlKQ0KKwkJCQlicmVhazsNCisJCX0NCisNCisJCWNvbmZpZy5iYW5kV2lkdGggPSBCYW5kd2l0aENvZWZUYWJbaV1bU2FtcGxlUmF0ZUlkeF07DQorDQorCQkvKiBpbml0IGFhYyBlbmNvZGVyIGNvcmUgKi8NCisJCXJldCA9IEFhY0VuY09wZW4oaEFhY0VuYywgY29uZmlnKTsNCisJCWlmKHJldCkgDQorCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNGRUFUVVJFOw0KKwkJYnJlYWs7DQorCWNhc2UgVk9fUElEX0FVRElPX0ZPUk1BVDoJLyogaW5pdCBwY20gY2hhbm5lbCBhbmQgc2FtcGxlcmF0ZSovDQorCQlBYWNJbml0RGVmYXVsdENvbmZpZygmY29uZmlnKTsNCisJCWlmKHBEYXRhID09IE5VTEwpDQorCQkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsNCisJCXBXQVZfRm9ybWF0ID0gKFZPX0FVRElPX0ZPUk1BVCopcERhdGE7DQorCQljb25maWcuYWR0c1VzZWQgPSAxOw0KKwkJY29uZmlnLm5DaGFubmVsc0luID0gcFdBVl9Gb3JtYXQtPkNoYW5uZWxzOw0KKwkJY29uZmlnLm5DaGFubmVsc091dCA9IHBXQVZfRm9ybWF0LT5DaGFubmVsczsNCisJCWNvbmZpZy5zYW1wbGVSYXRlID0gcFdBVl9Gb3JtYXQtPlNhbXBsZVJhdGU7DQorDQorCQkvKiBjaGVjayB0aGUgY2hhbm5lbCAqLw0KKwkJaWYoY29uZmlnLm5DaGFubmVsc0luPCAxICB8fCBjb25maWcubkNoYW5uZWxzSW4gPiBNQVhfQ0hBTk5FTFMgIHx8DQorICAgICAgICAgICAgIGNvbmZpZy5uQ2hhbm5lbHNPdXQgPCAxIHx8IGNvbmZpZy5uQ2hhbm5lbHNPdXQgPiBNQVhfQ0hBTk5FTFMgfHwgY29uZmlnLm5DaGFubmVsc0luIDwgY29uZmlnLm5DaGFubmVsc091dCkNCisJCQkgcmV0dXJuIFZPX0VSUl9BVURJT19VTlNDSEFOTkVMOw0KKw0KKwkJLyogY2hlY2sgdGhlIHNhbXBsZWJpdHMgKi8NCisJCWlmKHBXQVZfRm9ybWF0LT5TYW1wbGVCaXRzICE9IDE2KQ0KKwkJew0KKwkJCXJldHVybiBWT19FUlJfQVVESU9fVU5TRkVBVFVSRTsNCisJCX0NCisNCisJCS8qIGNoZWNrIHRoZSBzYW1wbGVyYXRlICovDQorCQlyZXQgPSAtMTsNCisJCWZvcihpID0gMDsgaSA8IE5VTV9TQU1QTEVfUkFURVM7IGkrKykNCisJCXsNCisJCQlpZihjb25maWcuc2FtcGxlUmF0ZSA9PSBzYW1wUmF0ZVRhYltpXSkNCisJCQl7DQorCQkJCXJldCA9IDA7DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCX0NCisJCWlmKHJldCA8IDApDQorCQkJcmV0dXJuIFZPX0VSUl9BVURJT19VTlNTQU1QTEVSQVRFOw0KKw0KKwkJU2FtcGxlUmF0ZUlkeCA9IGk7DQorDQorCQkvKiB1cGRhdGUgdGhlIGJpdHJhdGVzICovDQorCQl0bXAgPSA0NDE7DQorCQlpZihjb25maWcuc2FtcGxlUmF0ZSU4MDAwID09IDApIA0KKwkJCXRtcCA9NDgwOw0KKw0KKwkJY29uZmlnLmJpdFJhdGUgPSA2NDAqY29uZmlnLnNhbXBsZVJhdGUvdG1wKmNvbmZpZy5uQ2hhbm5lbHNPdXQ7DQorDQorCQlpZihjb25maWcuYml0UmF0ZS9jb25maWcubkNoYW5uZWxzT3V0IDwgNDAwMCkNCisJCQljb25maWcuYml0UmF0ZSA9IDQwMDAgKiBjb25maWcubkNoYW5uZWxzT3V0Ow0KKwkJZWxzZSBpZihjb25maWcuYml0UmF0ZSA+IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dCkNCisJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5zYW1wbGVSYXRlKjYqY29uZmlnLm5DaGFubmVsc091dDsNCisJCWVsc2UgaWYoY29uZmlnLmJpdFJhdGUvY29uZmlnLm5DaGFubmVsc091dCA+IDE2MDAwMCkNCisJCQljb25maWcuYml0UmF0ZSA9IGNvbmZpZy5uQ2hhbm5lbHNPdXQqMTYwMDAwOw0KKw0KKwkJLyogY2hlY2sgdGhlIGJhbmR3aWR0aCAqLw0KKwkJYml0cmF0ZSA9IGNvbmZpZy5iaXRSYXRlIC8gY29uZmlnLm5DaGFubmVsc091dDsNCisJCWJpdHJhdGUgPSBiaXRyYXRlICogdG1wIC8gY29uZmlnLnNhbXBsZVJhdGU7DQorDQorCQlmb3IgKGkgPSAwOyByYXRlc1tpXTsgaSsrKQ0KKwkJew0KKwkJCWlmIChyYXRlc1tpXSA+PSBiaXRyYXRlKQ0KKwkJCQlicmVhazsNCisJCX0NCisNCisJCWNvbmZpZy5iYW5kV2lkdGggPSBCYW5kd2l0aENvZWZUYWJbaV1bU2FtcGxlUmF0ZUlkeF07DQorCQkNCisJCS8qIGluaXQgYWFjIGVuY29kZXIgY29yZSAqLw0KKwkJcmV0ID0gQWFjRW5jT3BlbihoQWFjRW5jLCBjb25maWcpOw0KKwkJaWYocmV0KSANCisJCQlyZXR1cm4gVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkU7DQorCQlicmVhazsNCisJZGVmYXVsdDoNCisJCXJldHVybiBWT19FUlJfV1JPTkdfUEFSQU1fSUQ7DQorCX0NCisNCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioNCisqIEdldCB0aGUgcGFyYW0gZm9yIHNwZWNpYWwgdGFyZ2V0Lg0KKyogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uDQorKiBccGFyYW0gdVBhcmFtSUQgW0lOXSBUaGUgcGFyYW0gSUQuDQorKiBccGFyYW0gcERhdGEgW0lOXSBUaGUgcGFyYW0gdmFsdWUgZGVwZW5kIG9uIHRoZSBJRD4NCisqIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKyovDQorVk9fVTMyIFZPX0FQSSB2b0FBQ0VuY0dldFBhcmFtKFZPX0hBTkRMRSBoQ29kZWMsIFZPX1MzMiB1UGFyYW1JRCwgVk9fUFRSIHBEYXRhKQ0KK3sNCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioNCisgKiBHZXQgYXVkaW8gY29kZWMgQVBJIGludGVyZmFjZQ0KKyAqIFxwYXJhbSBwRW5jSGFuZGxlIFtvdXRdIFJldHVybiB0aGUgQUFDIEVuY29kZXIgaGFuZGxlLg0KKyAqIFxyZXR2YWwgVk9fRVJSX09LIFN1Y2NlZWRlZC4NCisgKi8NCitWT19TMzIgVk9fQVBJIHZvR2V0QUFDRW5jQVBJKFZPX0FVRElPX0NPREVDQVBJICogcERlY0hhbmRsZSkNCit7DQorCWlmKHBEZWNIYW5kbGUgPT0gTlVMTCkNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCQkNCisJcERlY0hhbmRsZS0+SW5pdCA9IHZvQUFDRW5jSW5pdDsNCisJcERlY0hhbmRsZS0+U2V0SW5wdXREYXRhID0gdm9BQUNFbmNTZXRJbnB1dERhdGE7DQorCXBEZWNIYW5kbGUtPkdldE91dHB1dERhdGEgPSB2b0FBQ0VuY0dldE91dHB1dERhdGE7DQorCXBEZWNIYW5kbGUtPlNldFBhcmFtID0gdm9BQUNFbmNTZXRQYXJhbTsNCisJcERlY0hhbmRsZS0+R2V0UGFyYW0gPSB2b0FBQ0VuY0dldFBhcmFtOw0KKwlwRGVjSGFuZGxlLT5VbmluaXQgPSB2b0FBQ0VuY1VuaW5pdDsNCisNCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hYWNlbmNfY29yZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY0NzVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWFjZW5jX2NvcmUuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYWFjZW5jX2NvcmUuYw0KKw0KKwlDb250ZW50OglhYWMgZW5jb2RlciBjb3JlIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiYWFjZW5jX2NvcmUuaCIKKyNpbmNsdWRlICJiaXRlbmMuaCIKKworI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAicHN5X21haW4uaCIKKyNpbmNsdWRlICJxY19tYWluLmgiCisjaW5jbHVkZSAicHN5X21haW4uaCIKKyNpbmNsdWRlICJjaGFubmVsX21hcC5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEFhY0luaXREZWZhdWx0Q29uZmlnCisqIGRlc2NyaXB0aW9uOiAgZ2l2ZXMgcmVhc29uYWJsZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFhY0luaXREZWZhdWx0Q29uZmlnKEFBQ0VOQ19DT05GSUcgKmNvbmZpZykKK3sKKyAgLyogZGVmYXVsdCBjb25maWd1cmF0aW9ucyAqLworICBjb25maWctPmFkdHNVc2VkICAgICAgICA9IDE7CisgIGNvbmZpZy0+bkNoYW5uZWxzSW4gICAgID0gMjsKKyAgY29uZmlnLT5uQ2hhbm5lbHNPdXQgICAgPSAyOworICBjb25maWctPmJpdFJhdGUgICAgICAgICA9IDEyODAwMDsgICAgICAgICAgICAgICAgICAgICAgCisgIGNvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEFhY0VuY09wZW4KKyogZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCisqIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2ICBBYWNFbmNPcGVuKCAgQUFDX0VOQ09ERVIqICAgICAgaEFhY0VuYywgICAgICAgIC8qIHBvaW50ZXIgdG8gYW4gZW5jb2RlciBoYW5kbGUsIGluaXRpYWxpemVkIG9uIHJldHVybiAqLworICAgICAgICAgICAgICAgICAgICAgY29uc3QgIEFBQ0VOQ19DT05GSUcgICAgIGNvbmZpZyAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICApCit7CisgIFdvcmQzMiBpOw0KKyAgV29yZDMyIGVycm9yID0gMDsKKyAgV29yZDE2IHByb2ZpbGUgPSAxOw0KKworICBFTEVNRU5UX0lORk8gKmVsSW5mbyA9IE5VTEw7CisgICAKKyAgaWYgKGhBYWNFbmM9PTApIHsKKyAgICBlcnJvcj0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICAgCisgIGlmICghZXJyb3IpIHsKKyAgICBoQWFjRW5jLT5jb25maWcgPSBjb25maWc7CisgIH0KKworICBpZiAoIWVycm9yKSB7CisgICAgZXJyb3IgPSBJbml0RWxlbWVudEluZm8gKGNvbmZpZy5uQ2hhbm5lbHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoQWFjRW5jLT5lbEluZm8pOworICB9CisNCisgIGlmICghZXJyb3IpIHsKKyAgICBlbEluZm8gPSAmaEFhY0VuYy0+ZWxJbmZvOworICB9CisKKyAgaWYgKCFlcnJvcikgeworICAgIC8qIHVzZSBvciBub3QgdG5zIHRvb2wgZm9yIGxvbmcgYW5kIHNob3J0IGJsb2NrICovCisJIFdvcmQxNiB0bnNNYXNrPTM7ICAgICAgCisKKwkvKiBpbml0IGVuY29kZXIgcHN5Y2hvYWNvdXN0aWMgKi8KKyAgICBlcnJvciA9IHBzeU1haW5Jbml0KCZoQWFjRW5jLT5wc3lLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5iaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgZWxJbmZvLT5uQ2hhbm5lbHNJbkVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdG5zTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy5iYW5kV2lkdGgpOworICB9CisKKyAvKiB1c2Ugb3Igbm90IGFkdHMgaGVhZGVyICovCisgIGlmKCFlcnJvcikgew0KKwkgIGhBYWNFbmMtPnFjT3V0LnFjRWxlbWVudC5hZHRzVXNlZCA9IGNvbmZpZy5hZHRzVXNlZDsNCisgIH0KKworICAvKiBpbml0IGVuY29kZXIgcXVhbnRpemF0aW9uICovCisgIGlmICghZXJyb3IpIHsKKyAgICBzdHJ1Y3QgUUNfSU5JVCBxY0luaXQ7CisKKyAgICAvKnFjSW5pdC5jaGFubmVsTWFwcGluZyA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsqLworICAgIHFjSW5pdC5lbEluZm8gPSAmaEFhY0VuYy0+ZWxJbmZvOworCisgICAgcWNJbml0Lm1heEJpdHMgPSAoV29yZDE2KSAoTUFYQklUU19DT0VGKmVsSW5mby0+bkNoYW5uZWxzSW5FbCk7CisgICAgcWNJbml0LmJpdFJlcyA9IHFjSW5pdC5tYXhCaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcWNJbml0LmF2ZXJhZ2VCaXRzID0gKFdvcmQxNikgKChjb25maWcuYml0UmF0ZSAqIEZSQU1FX0xFTl9MT05HKSAvIGNvbmZpZy5zYW1wbGVSYXRlKTsKKworICAgIHFjSW5pdC5wYWRkaW5nLnBhZGRpbmdSZXN0ID0gY29uZmlnLnNhbXBsZVJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIHFjSW5pdC5tZWFuUGUgPSAoV29yZDE2KSAoKDEwICogRlJBTUVfTEVOX0xPTkcgKiBoQWFjRW5jLT5jb25maWcuYmFuZFdpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy5zYW1wbGVSYXRlPj4xKSk7CisKKyAgICBxY0luaXQubWF4Qml0RmFjID0gKFdvcmQxNikgKCgxMDAgKiAoTUFYQklUU19DT0VGLU1JTkJJVFNfQ09FRikqIGVsSW5mby0+bkNoYW5uZWxzSW5FbCkvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFjSW5pdC5hdmVyYWdlQml0cz9xY0luaXQuYXZlcmFnZUJpdHM6MSkpOworCisgICAgcWNJbml0LmJpdHJhdGUgPSBjb25maWcuYml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBlcnJvciA9IFFDSW5pdCgmaEFhY0VuYy0+cWNLZXJuZWwsICZxY0luaXQpOworICB9CisKKyAgLyogaW5pdCBiaXRzdHJlYW0gZW5jb2RlciAqLworICBpZiAoIWVycm9yKSB7CisgICAgaEFhY0VuYy0+YnNlSW5pdC5uQ2hhbm5lbHMgICA9IGVsSW5mby0+bkNoYW5uZWxzSW5FbDsgICAgICAgICAgICAgICAgCisgICAgaEFhY0VuYy0+YnNlSW5pdC5iaXRyYXRlICAgICA9IGNvbmZpZy5iaXRSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaEFhY0VuYy0+YnNlSW5pdC5zYW1wbGVSYXRlICA9IGNvbmZpZy5zYW1wbGVSYXRlOyAgICAgICAgICAgICAgICAgICAgCisgICAgaEFhY0VuYy0+YnNlSW5pdC5wcm9maWxlICAgICA9IHByb2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICByZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBBYWNFbmNFbmNvZGUKKyogZGVzY3JpcHRpb246ICBlbmNvZGUgcGNtIHRvIGFhYyBkYXRhIGNvcmUgZnVuY3Rpb24KKyogcmV0dXJuczogICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgQWFjRW5jRW5jb2RlKEFBQ19FTkNPREVSICphYWNFbmMsCQkvKiE8IGFuIGVuY29kZXIgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwgICAgICAgICAvKiE8IEJMT0NLU0laRSpuQ2hhbm5lbHMgYXVkaW8gc2FtcGxlcywgaW50ZXJsZWF2ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVVdvcmQ4ICphbmNCeXRlcywgICAgIC8qITwgcG9pbnRlciB0byBhbmNpbGxhcnkgZGF0YSBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm51bUFuY0J5dGVzLAkJLyohPCBudW1iZXIgb2YgYW5jaWxsYXJ5IERhdGEgQnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICpvdXRCeXRlcywgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyIChtdXN0IGJlIGxhcmdlIE1JTkJJVFNfQ09FRi84Kk1BWF9DSEFOTkVMUyBieXRlcykgKi8KKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICpudW1PdXRCeXRlcyAgICAgICAgIC8qITwgbnVtYmVyIG9mIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgYWZ0ZXIgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgICAgICAgICApCit7CisgIEVMRU1FTlRfSU5GTyAqZWxJbmZvID0gJmFhY0VuYy0+ZWxJbmZvOworICBXb3JkMTYgZ2xvYlVzZWRCaXRzOworICBXb3JkMTYgYW5jRGF0YUJ5dGVzLCBhbmNEYXRhQnl0ZXNMZWZ0OworICAKKyAgYW5jRGF0YUJ5dGVzID0gYW5jRGF0YUJ5dGVzTGVmdCA9ICpudW1BbmNCeXRlczsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qIGluaXQgb3V0cHV0IGFhYyBkYXRhIGJ1ZmZlciBhbmQgbGVuZ3RoICovCisgIGFhY0VuYy0+aEJpdFN0cmVhbSA9IENyZWF0ZUJpdEJ1ZmZlcigmYWFjRW5jLT5iaXRTdHJlYW0sIG91dEJ5dGVzLCAqbnVtT3V0Qnl0ZXMpOworCisgIC8qIHBzeWNob2Fjb3VzdGljIHByb2Nlc3MgKi8KKyAgcHN5TWFpbihhYWNFbmMtPmNvbmZpZy5uQ2hhbm5lbHNPdXQsICAgIAorICAgICAgICAgIGVsSW5mbywKKyAgICAgICAgICB0aW1lU2lnbmFsLAorICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC5wc3lEYXRhW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKKyAgICAgICAgICAmYWFjRW5jLT5wc3lLZXJuZWwudG5zRGF0YVtlbEluZm8tPkNoYW5uZWxJbmRleFswXV0sCisgICAgICAgICAgJmFhY0VuYy0+cHN5S2VybmVsLnBzeUNvbmZMb25nLAorICAgICAgICAgICZhYWNFbmMtPnBzeUtlcm5lbC5wc3lDb25mU2hvcnQsCisgICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LnBzeU91dENoYW5uZWxbZWxJbmZvLT5DaGFubmVsSW5kZXhbMF1dLAorICAgICAgICAgICZhYWNFbmMtPnBzeU91dC5wc3lPdXRFbGVtZW50LAorICAgICAgICAgIGFhY0VuYy0+cHN5S2VybmVsLnBTY3JhdGNoVG5zLAorCQkgIGFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGUpOworCisgIC8qIGFkanVzdCBiaXRyYXRlIGFuZCBmcmFtZSBsZW5ndGggKi8KKyAgQWRqdXN0Qml0cmF0ZSgmYWFjRW5jLT5xY0tlcm5lbCwKKyAgICAgICAgICAgICAgICBhYWNFbmMtPmNvbmZpZy5iaXRSYXRlLAorICAgICAgICAgICAgICAgIGFhY0VuYy0+Y29uZmlnLnNhbXBsZVJhdGUpOworICAgIAorICAvKiBxdWFudGl6YXRpb24gYW5kIGNvZGluZyBwcm9jZXNzICovCisgIFFDTWFpbigmYWFjRW5jLT5xY0tlcm5lbCwgICAgICAgICAKKyAgICAgICAgICZhYWNFbmMtPnFjS2VybmVsLmVsZW1lbnRCaXRzLAorICAgICAgICAgJmFhY0VuYy0+cWNLZXJuZWwuYWRqVGhyLmFkalRoclN0YXRlRWxlbSwKKyAgICAgICAgICZhYWNFbmMtPnBzeU91dC5wc3lPdXRDaGFubmVsW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKKyAgICAgICAgICZhYWNFbmMtPnBzeU91dC5wc3lPdXRFbGVtZW50LAorICAgICAgICAgJmFhY0VuYy0+cWNPdXQucWNDaGFubmVsW2VsSW5mby0+Q2hhbm5lbEluZGV4WzBdXSwKKyAgICAgICAgICZhYWNFbmMtPnFjT3V0LnFjRWxlbWVudCwKKyAgICAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbCwKKwkJIG1pbihhbmNEYXRhQnl0ZXNMZWZ0LGFuY0RhdGFCeXRlcykpOworCisgIGFuY0RhdGFCeXRlc0xlZnQgPSBhbmNEYXRhQnl0ZXNMZWZ0IC0gYW5jRGF0YUJ5dGVzOworCisgIGdsb2JVc2VkQml0cyA9IEZpbmFsaXplQml0Q29uc3VtcHRpb24oJmFhY0VuYy0+cWNLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmFhY0VuYy0+cWNPdXQpOworCisgIC8qIHdyaXRlIGJpdHN0cmVhbSBwcm9jZXNzICovCisgIFdyaXRlQml0c3RyZWFtKGFhY0VuYy0+aEJpdFN0cmVhbSwJCQkJIAorICAgICAgICAgICAgICAgICAqZWxJbmZvLAorICAgICAgICAgICAgICAgICAmYWFjRW5jLT5xY091dCwKKyAgICAgICAgICAgICAgICAgJmFhY0VuYy0+cHN5T3V0LAorICAgICAgICAgICAgICAgICAmZ2xvYlVzZWRCaXRzLAkJCQkgCisgICAgICAgICAgICAgICAgIGFuY0J5dGVzLA0KKwkJCQkgYWFjRW5jLT5wc3lLZXJuZWwuc2FtcGxlUmF0ZUlkeCk7CisKKyAgdXBkYXRlQml0cmVzKCZhYWNFbmMtPnFjS2VybmVsLAorICAgICAgICAgICAgICAgJmFhY0VuYy0+cWNPdXQpOworCisgIC8qIHdyaXRlIG91dCB0aGUgYml0c3RyZWFtICovCisgICpudW1PdXRCeXRlcyA9IEdldEJpdHNBdmFpbChhYWNFbmMtPmhCaXRTdHJlYW0pID4+IDM7DQorCisgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOkFhY0VuY0Nsb3NlCisqIGRlc2NyaXB0aW9uOiBkZWFsbG9jYXRlIGFuIGVuY29kZXIgaW5zdGFuY2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFhY0VuY0Nsb3NlIChBQUNfRU5DT0RFUiogaEFhY0VuYywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIGlmIChoQWFjRW5jKSB7ICAKKyAgICBRQ0RlbGV0ZSgmaEFhY0VuYy0+cWNLZXJuZWwsIHBNZW1PUCk7CisKKyAgICBRQ091dERlbGV0ZSgmaEFhY0VuYy0+cWNPdXQsIHBNZW1PUCk7CisKKyAgICBQc3lEZWxldGUoJmhBYWNFbmMtPnBzeUtlcm5lbCwgcE1lbU9QKTsKKworICAgIFBzeU91dERlbGV0ZSgmaEFhY0VuYy0+cHN5T3V0LCBwTWVtT1ApOworCisgICAgRGVsZXRlQml0QnVmZmVyKCZoQWFjRW5jLT5oQml0U3RyZWFtKTsKKworCWlmKGhBYWNFbmMtPmludGJ1ZikKKwl7CisJCW1lbV9mcmVlKHBNZW1PUCwgaEFhY0VuYy0+aW50YnVmLCBWT19JTkRFWF9FTkNfQUFDKTsKKwkJaEFhY0VuYy0+aW50YnVmID0gTlVMTDsKKwl9CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Fkal90aHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGJkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYWRqX3Roci5jCkBAIC0wLDAgKzEsMTIyMyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYWRqX3Roci5jDQorDQorCUNvbnRlbnQ6CVRocmVzaG9sZCBjb21wZW5zYXRpb24gZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiCisjaW5jbHVkZSAiYWRqX3Rocl9kYXRhLmgiCisjaW5jbHVkZSAiYWRqX3Roci5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJsaW5lX3BlLmgiCisKKworI2RlZmluZSAgbWluU25yTGltaXQgICAgMHg2NjY2IC8qIDEgZEIgKi8KKyNkZWZpbmUgIFBFQklUU19DT0VGCTB4MTcwYSAvKiAwLjE4KigxIDw8IDE1KSovDQorDQorI2RlZmluZSAgSE9MRV9USFJfTE9ORwkweDI4NzMJLyogMC4zMTYqKDEgPDwgMTUpICovDQorI2RlZmluZSAgSE9MRV9USFJfU0hPUlQgMHg0MDAwICAvKiAwLjUgICooMSA8PCAxNSkgKi8NCisNCisjZGVmaW5lICBNU19USFJTUFJFQURfQ09FRiAweDczMzMgIC8qIDAuOSAqICgxIDw8IDE1KSAqLw0KKw0KKyNkZWZpbmUJIE1JTl9TTlJfQ09FRgkgICAweDY1MWYgIC8qIDMuMTYqICgxIDw8ICgxNSAtIDIpKSAqLw0KKworLyogdmFsdWVzIGZvciBhdm9pZCBob2xlIGZsYWcgKi8KK2VudW0gX2F2b2lkX2hvbGVfc3RhdGUgeworICBOT19BSCAgICAgICAgICAgICAgPTAsCisgIEFIX0lOQUNUSVZFICAgICAgICA9MSwKKyAgQUhfQUNUSVZFICAgICAgICAgID0yCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpiaXRzMnBlCisqIGRlc2NyaXB0aW9uOiBjb252ZXJ0IGZyb20gYml0cyB0byBwZQorKgkJCSAgIHBlID0gMS4xOCpkZXNpcmVkQml0cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBiaXRzMnBlKGNvbnN0IFdvcmQxNiBiaXRzKSB7CisgIHJldHVybiAoYml0cyArICgoUEVCSVRTX0NPRUYgKiBiaXRzKSA+PiAxNSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpjYWxjVGhyZXNoRXhwCisqIGRlc2NyaXB0aW9uOiBsb3VkbmVzcyBjYWxjdWxhdGlvbiAodGhyZXNob2xkIHRvIHRoZSBwb3dlciBvZiByZWRFeHApCisqCQkJICAgdGhyKG4pXjAuMjUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjYWxjVGhyZXNoRXhwKFdvcmQzMiB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzKQoreworICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwOw0KKyAgV29yZDMyICpwdGhyRXhwLCAqcHNmYlRocmU7CisgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOw0KKwkgZm9yKHNmYkdycCA9IDA7IHNmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDsgc2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApCSANCisJICBwdGhyRXhwID0gJih0aHJFeHBbY2hdW3NmYkdycF0pOw0KKwkgIHBzZmJUaHJlID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkICsgc2ZiR3JwOw0KKwkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKwkJKnB0aHJFeHAgPSByc3FydChyc3FydCgqcHNmYlRocmUsSU5UX0JJVFMpLElOVF9CSVRTKTsNCisJCXB0aHJFeHArKzsgcHNmYlRocmUrKzsKKyAgICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTphZGFwdE1pblNucgorKiBkZXNjcmlwdGlvbjogcmVkdWNlIG1pblNuciByZXF1aXJlbWVudHMgZm9yIGJhbmRzIHdpdGggcmVsYXRpdmUgbG93IGVuZXJnaWVzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWRhcHRNaW5TbnIoUFNZX09VVF9DSEFOTkVMICAgICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICBNSU5TTlJfQURBUFRfUEFSQU0gKm1zYVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBuQ2hhbm5lbHMpCit7CisgIFdvcmQxNiBjaCwgc2ZiLCBzZmJPZmZzLCBzaGlmdDsKKyAgV29yZDMyIG5TZmIsIGF2Z0VuOworICBXb3JkMTYgbG9nX2F2Z0VuID0gMDsKKyAgV29yZDMyIHN0YXJ0UmF0aW9feF9hdmdFbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKworICAgIC8qIGNhbGMgYXZlcmFnZSBlbmVyZ3kgcGVyIHNjYWxlZmFjdG9yIGJhbmQgKi8KKyAgICBhdmdFbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBuU2ZiID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBmb3IgKHNmYk9mZnM9MDsgc2ZiT2Zmczxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYk9mZnMrPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CisgICAgICBmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgIGF2Z0VuID0gTF9hZGQoYXZnRW4sIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJPZmZzK3NmYl0pOworICAgICAgICBuU2ZiID0gblNmYiArIDE7CisgICAgICB9CisgICAgfQorICAgICAKKyAgICBpZiAoblNmYiA+IDApIHsKKwkgIGF2Z0VuID0gYXZnRW4gLyBuU2ZiOw0KKworICAgICAgbG9nX2F2Z0VuID0gaUxvZzQoYXZnRW4pOworICAgICAgc3RhcnRSYXRpb194X2F2Z0VuID0gZml4bXVsKG1zYVBhcmFtLT5zdGFydFJhdGlvLCBhdmdFbik7CisgICAgfQorCisgICAgCisgICAgLyogcmVkdWNlIG1pblNuciByZXF1aXJlbWVudCBieSBtaW5TbnJebWluU25yUmVkIGRlcGVuZGVudCBvbiBhdmdFbi9zZmJFbiAqLworICAgIGZvciAoc2ZiT2Zmcz0wOyBzZmJPZmZzPHBzeU91dENoYW4tPnNmYkNudDsgc2ZiT2Zmcys9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgaWYgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJPZmZzK3NmYl0gPCBzdGFydFJhdGlvX3hfYXZnRW4pIHsKKyAgICAgICAgICBXb3JkMTYgZGJSYXRpbywgbWluU25yUmVkOworICAgICAgICAgIFdvcmQzMiBzbnJSZWQ7CisgICAgICAgICAgV29yZDE2IG5ld01pblNucjsKKyAgICAgICAgICAKKyAgICAgICAgICBkYlJhdGlvID0gbG9nX2F2Z0VuIC0gbG9nU2ZiRW5lcmd5W2NoXVtzZmJPZmZzK3NmYl07CisgICAgICAgICAgZGJSYXRpbyA9IGRiUmF0aW8gKyAoZGJSYXRpbyA8PCAxKTsKKworICAgICAgICAgIG1pblNuclJlZCA9IDExMCAtICgoZGJSYXRpbyArIChkYlJhdGlvIDw8IDEpKSA+PiAyKTsKKyAgICAgICAgICBtaW5TbnJSZWQgPSBtYXgobWluU25yUmVkLCAyMCk7IC8qIDExMDogKDAuMzc1KHJlZE9mZnMpKzEpKjgwLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6IDAuMDAzNzUocmVkUmF0aW9GYWMpKjgwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOiAwLjI1KG1heFJlZCkgKiA4MCAqLworCisgICAgICAgICAgc25yUmVkID0gbWluU25yUmVkICogaUxvZzQoKHBzeU91dENoYW4tPnNmYk1pblNucltzZmJPZmZzK3NmYl0gPDwgMTYpKTsgCisgICAgICAgICAgLyogCisgICAgICAgICAgICAgc25yUmVkSSBzaSBub3cgc2NhbGVkIGJ5IDgwIChtaW5TbnJSZWQpIGFuZCA0IChmZnJfaUxvZzQpCisgICAgICAgICAgKi8KKyAgICAgICAgCisgICAgICAgICAgbmV3TWluU25yID0gcm91bmQxNihwb3cyX3h5KHNuclJlZCw4MCo0KSk7CisgICAgICAgICAKKyAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJNaW5TbnJbc2ZiT2ZmcytzZmJdID0gbWluKG5ld01pblNuciwgbWluU25yTGltaXQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTppbml0QXZvaWRIb2xlRmxhZworKiBkZXNjcmlwdGlvbjogZGV0ZXJtaW5lIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgbm90IG5lY2Vzc2FyeSByZXNwLiBwb3NzaWJsZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaXRBdm9pZEhvbGVGbGFnKFdvcmQxNiBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhfUEFSQU0gKmFoUGFyYW0pCit7CisgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnAsIHNoaWZ0OworICBXb3JkMzIgdGhyZXNob2xkOworICBXb3JkMzIqIHBzZmJTcHJlYWRFbjsKKworICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICAgCisgICAgaWYgKHBzeU91dENoYW4tPndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKKyAgICAgICAgIHBzZmJTcHJlYWRFbiA9IHBzeU91dENoYW4tPnNmYlNwcmVhZGVkRW5lcmd5ICsgc2ZiR3JwOw0KKwkJIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKwkJCSpwc2ZiU3ByZWFkRW4gPSAqcHNmYlNwcmVhZEVuID4+IDE7ICAvKiAwLjUgKi8NCisJCQkrK3BzZmJTcHJlYWRFbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7DQorCQlwc2ZiU3ByZWFkRW4gPSBwc3lPdXRDaGFuLT5zZmJTcHJlYWRlZEVuZXJneSArIHNmYkdycDsKKyAgICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgICpwc2ZiU3ByZWFkRW4gPSAoKnBzZmJTcHJlYWRFbiA+PiAxKSArICgqcHNmYlNwcmVhZEVuID4+IDMpOyAgLyogMC42MyAqLw0KKwkJICArK3BzZmJTcHJlYWRFbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIGluY3JlYXNlIG1pblNuciBmb3IgbG9jYWwgcGVha3MsIGRlY3JlYXNlIGl0IGZvciB2YWxsZXlzICovCisgIGlmIChhaFBhcmFtLT5tb2RpZnlNaW5TbnIpIHsKKyAgICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgICAgICAKKyAgICAgIGlmIChwc3lPdXRDaGFuLT53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCisgICAgICAgIHRocmVzaG9sZCA9IEhPTEVfVEhSX0xPTkc7CisgICAgICBlbHNlCisgICAgICAgIHRocmVzaG9sZCA9IEhPTEVfVEhSX1NIT1JUOworCisgICAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApeworICAgICAgICBXb3JkMTYgKnBzZmJNaW5TbnIgPSBwc3lPdXRDaGFuLT5zZmJNaW5TbnIgKyBzZmJHcnA7DQorCQlmb3IgKHNmYj0wOyBzZmI8cHN5T3V0Q2hhbi0+bWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICAgICAgV29yZDMyIHNmYkVuLCBzZmJFbm0xLCBzZmJFbnAxLCBhdmdFbjsKKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoc2ZiID4gMCkKKyAgICAgICAgICAgIHNmYkVubTEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYi0xXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZmJFbm0xID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycF07CisgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKHNmYiA8IChwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cC0xKSkKKyAgICAgICAgICAgIHNmYkVucDEgPSBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiR3JwK3NmYisxXTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBzZmJFbnAxID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOworICAgICAgICAgIGF2Z0VuID0gKHNmYkVubTEgKyBzZmJFbnAxKSA+PiAxOworICAgICAgICAgIHNmYkVuID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKHNmYkVuID4gYXZnRW4gJiYgYXZnRW4gPiAwKSB7CisgICAgICAgICAgICBXb3JkMzIgdG1wTWluU25yOworICAgICAgICAgICAgc2hpZnQgPSBub3JtX2woc2ZiRW4pOw0KKwkJCXRtcE1pblNuciA9IERpdl8zMihMX21weV9scyhhdmdFbiwgbWluU25yTGltaXQpIDw8IHNoaWZ0LCBzZmJFbiA8PCBzaGlmdCApOworICAgICAgICAgICAgdG1wTWluU25yID0gbWF4KHRtcE1pblNuciwgSE9MRV9USFJfTE9ORyk7ICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0bXBNaW5TbnIgPSBtYXgodG1wTWluU25yLCB0aHJlc2hvbGQpOworICAgICAgICAgICAgKnBzZmJNaW5TbnIgPSBtaW4oKnBzZmJNaW5TbnIsIHRtcE1pblNucik7CisgICAgICAgICAgfQorICAgICAgICAgIC8qIHZhbGxleSA/ICovCisgICAgICAgICAgICAgCisgICAgICAgICAgaWYgKChzZmJFbiA8IChhdmdFbiA+PiAxKSkgJiYgKHNmYkVuID4gMCkpIHsKKyAgICAgICAgICAgIFdvcmQzMiB0bXBNaW5TbnI7CisgICAgICAgICAgICBXb3JkMzIgbWluU25yRW4gPSBMX21weV93eChhdmdFbiwgKnBzZmJNaW5TbnIpOyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgCisgICAgICAgICAgICBpZihtaW5TbnJFbiA8IHNmYkVuKSB7DQorCQkJICBzaGlmdCA9IG5vcm1fbChzZmJFbik7CisgICAgICAgICAgICAgIHRtcE1pblNuciA9IERpdl8zMiggbWluU25yRW4gPDwgc2hpZnQsIHNmYkVuPDxzaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgdG1wTWluU25yID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wTWluU25yID0gbWluKG1pblNuckxpbWl0LCB0bXBNaW5TbnIpOworCisgICAgICAgICAgICAqcHNmYk1pblNuciA9CisgICAgICAgICAgICAgIChtaW4oKHRtcE1pblNuciA+PiAgMiksIG11bHQoKnBzZmJNaW5TbnIsIE1JTl9TTlJfQ09FRikpIDw8IDIpOworICAgICAgICAgIH0NCisJCSAgcHNmYk1pblNucisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogc3RlcmVvOiBhZGFwdCB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgc2ZiTWluU25yIG9mIG1pZCBhbmQKKyAgICAgc2lkZSBjaGFubmVscyAqLworICAgCisgIGlmIChuQ2hhbm5lbHMgPT0gMikgeworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbk0gPSAmcHN5T3V0Q2hhbm5lbFswXTsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5TID0gJnBzeU91dENoYW5uZWxbMV07CisgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW5NLT5zZmJDbnQ7IHNmYisrKSB7CisgICAgICBpZiAocHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFza1tzZmJdKSB7CisgICAgICAgIFdvcmQzMiBzZmJFbk0gPSBwc3lPdXRDaGFuTS0+c2ZiRW5lcmd5W3NmYl07CisgICAgICAgIFdvcmQzMiBzZmJFblMgPSBwc3lPdXRDaGFuUy0+c2ZiRW5lcmd5W3NmYl07CisgICAgICAgIFdvcmQzMiBtYXhTZmJFbiA9IG1heChzZmJFbk0sIHNmYkVuUyk7CisgICAgICAgIFdvcmQzMiBtYXhUaHIgPSBMX21weV93eChtYXhTZmJFbiwgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdKSA+PiAxOyAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgaWYobWF4VGhyID49IHNmYkVuTSkgeworICAgICAgICAgIHBzeU91dENoYW5NLT5zZmJNaW5TbnJbc2ZiXSA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBzaGlmdCA9IG5vcm1fbChzZmJFbk0pOyANCisJCSAgcHN5T3V0Q2hhbk0tPnNmYk1pblNucltzZmJdID0gbWluKG1heChwc3lPdXRDaGFuTS0+c2ZiTWluU25yW3NmYl0sIA0KKwkJCSAgcm91bmQxNihEaXZfMzIobWF4VGhyPDxzaGlmdCwgc2ZiRW5NIDw8IHNoaWZ0KSkpLCBtaW5TbnJMaW1pdCk7CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICBpZihtYXhUaHIgPj0gc2ZiRW5TKSB7CisgICAgICAgICAgcHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdID0gTUFYXzE2OworICAgICAgICB9CisgICAgICAgIGVsc2Ugew0KKwkJICBzaGlmdCA9IG5vcm1fbChzZmJFblMpOworICAgICAgICAgIHBzeU91dENoYW5TLT5zZmJNaW5TbnJbc2ZiXSA9IG1pbihtYXgocHN5T3V0Q2hhblMtPnNmYk1pblNucltzZmJdLCANCisJCQkgIHJvdW5kMTYoRGl2XzMyKG1heFRociA8PCBzaGlmdCwgc2ZiRW5TIDw8IHNoaWZ0KSkpLCBtaW5TbnJMaW1pdCk7CisgICAgICAgIH0KKworICAgICAgICAgCisgICAgICAgIGlmIChzZmJFbk0gPiBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKKyAgICAgICAgICBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuUywgTVNfVEhSU1BSRUFEX0NPRUYpOworICAgICAgICAgCisgICAgICAgIGlmIChzZmJFblMgPiBwc3lPdXRDaGFuUy0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSkKKyAgICAgICAgICBwc3lPdXRDaGFuTS0+c2ZiU3ByZWFkZWRFbmVyZ3lbc2ZiXSA9IExfbXB5X2xzKHNmYkVuTSwgTVNfVEhSU1BSRUFEX0NPRUYpOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgLyogaW5pdCBhaEZsYWcgKDA6IG5vIGFoIG5lY2Vzc2FyeSwgMTogYWggcG9zc2libGUsIDI6IGFoIGFjdGl2ZSAqLworICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworICAgIGZvcihzZmJHcnAgPSAwO3NmYkdycCA8IHBzeU91dENoYW4tPnNmYkNudDtzZmJHcnArPSBwc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisgICAgICBXb3JkMTYgKnBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOw0KKwkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBzeU91dENoYW4tPnNmYlNwcmVhZGVkRW5lcmd5W3NmYkdycCtzZmJdID4gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdKSB8fAorICAgICAgICAgICAgKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJHcnArc2ZiXSA8PSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl0pIHx8CisgICAgICAgICAgICAocHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYkdycCtzZmJdID09IE1BWF8xNikpIHsKKyAgICAgICAgICAqcGFoRmxhZysrID0gTk9fQUg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgKnBhaEZsYWcrKyA9IEFIX0lOQUNUSVZFOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKHNmYj1wc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiPHBzeU91dENoYW4tPnNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAqcGFoRmxhZysrID0gTk9fQUg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpjYWxjUGVOb0FICisqIGRlc2NyaXB0aW9uOiBzdW0gdGhlIHBlIGRhdGEgb25seSBmb3IgYmFuZHMgd2hlcmUgYXZvaWQgaG9sZSBpcyBpbmFjdGl2ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNhbGNQZU5vQUgoV29yZDE2ICAgICAgICAgICpwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpjb25zdFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqbkFjdGl2ZUxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICBQRV9EQVRBICAgICAgICAgKnBlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICBhaEZsYWdbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMpCit7CisgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7DQorICBpbnQgaXBlLCBpY29uc3RQYXJ0LCBpbkFjdGl2ZUxpbmVzOworCisgIGlwZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpY29uc3RQYXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaW5BY3RpdmVMaW5lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgUEVfQ0hBTk5FTF9EQVRBICpwZUNoYW5EYXRhID0gJnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CisgICAgZm9yKHNmYkdycCA9IDA7c2ZiR3JwIDwgcHN5T3V0Q2hhbi0+c2ZiQ250O3NmYkdycCs9IHBzeU91dENoYW4tPnNmYlBlckdyb3VwKXsKKyAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgIAorICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSA8IEFIX0FDVElWRSkgeworICAgICAgICAgIGlwZSA9IGlwZSArIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdOworICAgICAgICAgIGljb25zdFBhcnQgPSBpY29uc3RQYXJ0ICsgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOworICAgICAgICAgIGluQWN0aXZlTGluZXMgPSBpbkFjdGl2ZUxpbmVzICsgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9DQorCisgICpwZSA9IHNhdHVyYXRlKGlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqY29uc3RQYXJ0ID0gc2F0dXJhdGUoaWNvbnN0UGFydCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICpuQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShpbkFjdGl2ZUxpbmVzKTsgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpyZWR1Y2VUaHJlc2hvbGRzCisqIGRlc2NyaXB0aW9uOiBhcHBseSByZWR1Y3Rpb24gZm9ybXVsYQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJlZHVjZVRocmVzaG9sZHMoUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICB0aHJFeHBbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgICByZWRWYWwpCit7CisgIFdvcmQzMiBzZmJUaHJSZWR1Y2VkOworICBXb3JkMzIgKnBzZmJFbiwgKnBzZmJUaHI7ICAgICANCisgIFdvcmQxNiBjaCwgc2ZiLCBzZmJHcnA7DQorCisgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgZm9yKHNmYkdycD0wOyBzZmJHcnA8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJHcnArPXBzeU91dENoYW4tPnNmYlBlckdyb3VwKSB7CisgCSAgcHNmYkVuICA9IHBzeU91dENoYW4tPnNmYkVuZXJneSArIHNmYkdycDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgIHBzZmJUaHIgPSBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGQgKyBzZmJHcnA7DQorCSAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworICAgICAgICAgCisgICAgICAgIGlmICgqcHNmYkVuID4gKnBzZmJUaHIpIHsKKyAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVkdWN0aW9uIGZvcm11bGEgKi8KKyAgICAgICAgICBXb3JkMzIgdG1wID0gdGhyRXhwW2NoXVtzZmJHcnArc2ZiXSArIHJlZFZhbDsKKyAgICAgICAgICB0bXAgPSBmaXhtdWwodG1wLCB0bXApOworICAgICAgICAgIHNmYlRoclJlZHVjZWQgPSBmaXhtdWwodG1wLCB0bXApOworICAgICAgICAgIC8qIGF2b2lkIGhvbGVzICovCisgICAgICAgICAgdG1wID0gTF9tcHlfbHMoKnBzZmJFbiwgcHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYkdycCtzZmJdKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoKHNmYlRoclJlZHVjZWQgPiB0bXApICYmIAorICAgICAgICAgICAgICAoYWhGbGFnW2NoXVtzZmJHcnArc2ZiXSAhPSBOT19BSCkpeworICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IG1heCh0bXAsICpwc2ZiVGhyKTsKKyAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiR3JwK3NmYl0gPSBBSF9BQ1RJVkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgfQorCQkgICpwc2ZiVGhyID0gc2ZiVGhyUmVkdWNlZDsKKyAgICAgICAgfQ0KKw0KKwkJcHNmYkVuKys7ICBwc2ZiVGhyKys7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6Y29ycmVjdFRocmVzaAorKiBkZXNjcmlwdGlvbjogaWYgcGUgZGlmZmVyZW5jZSBkZWx0YVBlIGJldHdlZW4gZGVzaXJlZCBwZSBhbmQgcmVhbCBwZSBpcyBzbWFsbCBlbm91Z2gsCisqICAgICAgICAgICAgIHRoZSBkaWZmZXJlbmNlIGNhbiBiZSBkaXN0cmlidXRlZCBhbW9uZyB0aGUgc2NhbGUgZmFjdG9yIGJhbmRzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvcnJlY3RUaHJlc2goUFNZX09VVF9DSEFOTkVMICBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICAqcGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgIHRockV4cFtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgICAgcmVkVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICAgICBkZWx0YVBlKQoreworICBXb3JkMTYgY2gsIHNmYiwgc2ZiR3JwLHNoaWZ0OworICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW47CisgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YTsKKyAgV29yZDMyIGRlbHRhU2ZiUGU7CisgIFdvcmQzMiBub3JtRmFjdG9yOw0KKyAgV29yZDMyICpwc2ZiUGVGYWN0b3JzOw0KKyAgV29yZDE2ICpwc2ZiTkFjdGl2ZUxpbmVzLCAqcGFoRmxhZzsKKyAgV29yZDMyIHNmYkVuLCBzZmJUaHI7CisgIFdvcmQzMiBzZmJUaHJSZWR1Y2VkOworCisgIC8qIGZvciBlYWNoIHNmYiBjYWxjIHJlbGF0aXZlIGZhY3RvcnMgZm9yIHBlIGNoYW5nZXMgKi8KKyAgbm9ybUZhY3RvciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworICAgIHBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKKyAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApeworICAgICAgcHNmYlBlRmFjdG9ycyA9IHBlRGF0YS0+c2ZiUGVGYWN0b3JzW2NoXSArIHNmYkdycDsNCisJICBwc2ZiTkFjdGl2ZUxpbmVzID0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzICsgc2ZiR3JwOw0KKwkgIHBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOw0KKwkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgV29yZDMyIHJlZFRockV4cCA9IHRockV4cFtjaF1bc2ZiR3JwK3NmYl0gKyByZWRWYWw7CisgICAgICAgICAgICAgCisgICAgICAgIGlmICgoKCpwYWhGbGFnIDwgQUhfQUNUSVZFKSB8fCAoZGVsdGFQZSA+IDApKSAmJiAocmVkVGhyRXhwID4gMCkgKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9ICgqcHNmYk5BY3RpdmVMaW5lcykgKiAoMHg3ZmZmZmZmZiAvIHJlZFRockV4cCk7CisgICAgICAgICAgbm9ybUZhY3RvciA9IExfYWRkKG5vcm1GYWN0b3IsICpwc2ZiUGVGYWN0b3JzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAqcHNmYlBlRmFjdG9ycyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9DQorCQlwc2ZiUGVGYWN0b3JzKys7IA0KKwkJcGFoRmxhZysrOyBwc2ZiTkFjdGl2ZUxpbmVzKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAKKyAgLyogY2FsY3VsYXRlIG5ldyB0aHJlc2hvbGRzICovCisgIGZvcihjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworICAgIHBlQ2hhbkRhdGEgPSAmcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXTsKKyAgICBmb3Ioc2ZiR3JwID0gMDtzZmJHcnAgPCBwc3lPdXRDaGFuLT5zZmJDbnQ7c2ZiR3JwKz0gcHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApeworICAgICAgcHNmYlBlRmFjdG9ycyA9IHBlRGF0YS0+c2ZiUGVGYWN0b3JzW2NoXSArIHNmYkdycDsNCisJICBwc2ZiTkFjdGl2ZUxpbmVzID0gcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzICsgc2ZiR3JwOw0KKwkgIHBhaEZsYWcgPSBhaEZsYWdbY2hdICsgc2ZiR3JwOw0KKwkgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgLyogcGUgZGlmZmVyZW5jZSBmb3IgdGhpcyBzZmIgKi8KKyAgICAgICAgZGVsdGFTZmJQZSA9ICpwc2ZiUGVGYWN0b3JzICogZGVsdGFQZTsKKworCQkvKiB0aHIzKG4pID0gdGhyMihuKSoyXmRlbHRhU2ZiUGUvYihuKSAqLyAgICAgICAgIAorICAgICAgICBpZiAoKnBzZmJOQWN0aXZlTGluZXMgPiAwKSB7CisgICAgICAgICAgLyogbmV3IHRocmVzaG9sZCAqLworICAgICAgICAgIFdvcmQzMiB0aHJGYWN0b3I7CisgICAgICAgICAgc2ZiRW4gID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYkdycCtzZmJdOworICAgICAgICAgIHNmYlRociA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXTsKKworICAgICAgICAgICBpZihkZWx0YVNmYlBlID49IDApeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgcmVkdWNlIHRocmVzaG9sZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRockZhY3RvciA9IHBvdzJfeHkoTF9uZWdhdGUoZGVsdGFTZmJQZSksIChub3JtRmFjdG9yKiAoKnBzZmJOQWN0aXZlTGluZXMpKSk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IExfbXB5X2xzKHNmYlRociwgcm91bmQxNih0aHJGYWN0b3IpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICBpbmNyZWFzZSB0aHJlc2hvbGQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICB0aHJGYWN0b3IgPSBwb3cyX3h5KGRlbHRhU2ZiUGUsIChub3JtRmFjdG9yICogKCpwc2ZiTkFjdGl2ZUxpbmVzKSkpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHRockZhY3RvciA+IHNmYlRocikgeworICAgICAgICAgICAgICBzaGlmdCA9IG5vcm1fbCh0aHJGYWN0b3IpOw0KKwkJCSAgc2ZiVGhyUmVkdWNlZCA9IERpdl8zMiggc2ZiVGhyIDw8IHNoaWZ0LCB0aHJGYWN0b3I8PHNoaWZ0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAvKiBhdm9pZCBob2xlICovCisgICAgICAgICAgc2ZiRW4gPSBMX21weV9scyhzZmJFbiwgcHN5T3V0Q2hhbi0+c2ZiTWluU25yW3NmYkdycCtzZmJdKTsKKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoKHNmYlRoclJlZHVjZWQgPiBzZmJFbikgJiYKKyAgICAgICAgICAgICAgKCpwYWhGbGFnID09IEFIX0lOQUNUSVZFKSkgeworICAgICAgICAgICAgc2ZiVGhyUmVkdWNlZCA9IG1heChzZmJFbiwgc2ZiVGhyKTsKKyAgICAgICAgICAgICpwYWhGbGFnID0gQUhfQUNUSVZFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIH0KKworICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJHcnArc2ZiXSA9IHNmYlRoclJlZHVjZWQ7ICAKKyAgICAgICAgfQ0KKw0KKwkJcGFoRmxhZysrOyBwc2ZiTkFjdGl2ZUxpbmVzKys7IHBzZmJQZUZhY3RvcnMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpyZWR1Y2VNaW5TbnIKKyogZGVzY3JpcHRpb246IGlmIHRoZSBkZXNpcmVkIHBlIGNhbiBub3QgYmUgcmVhY2hlZCwgcmVkdWNlIHBlIGJ5IHJlZHVjaW5nIG1pblNucgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHJlZHVjZU1pblNucihQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgUEVfREFUQSAgICAgICAgICpwZURhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgIGRlc2lyZWRQZSkKK3sKKyAgV29yZDE2IGNoLCBzZmIsIHNmYlN1YldpbjsKKyAgV29yZDE2IGRlbHRhUGU7CisKKyAgLyogc3RhcnQgYXQgaGlnaGVzdCBmcmVxIGRvd24gdG8gMCAqLworICBzZmJTdWJXaW4gPSBwc3lPdXRDaGFubmVsWzBdLm1heFNmYlBlckdyb3VwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgd2hpbGUgKHBlRGF0YS0+cGUgPiBkZXNpcmVkUGUgJiYgc2ZiU3ViV2luID4gMCkgeworICAgICAgIAorICAgIHNmYlN1YldpbiA9IHNmYlN1YldpbiAtIDE7CisgICAgLyogbG9vcCBvdmVyIGFsbCBzdWJ3aW5kb3dzICovCisgICAgZm9yIChzZmI9c2ZiU3ViV2luOyBzZmI8cHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQ7CisgICAgICAgIHNmYis9cHN5T3V0Q2hhbm5lbFswXS5zZmJQZXJHcm91cCkgeworICAgICAgLyogbG9vcCBvdmVyIGFsbCBjaGFubmVscyAqLworCQlQRV9DSEFOTkVMX0RBVEEqIHBlQ2hhbiA9IHBlRGF0YS0+cGVDaGFubmVsRGF0YTsNCisJCVBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2ggPSBwc3lPdXRDaGFubmVsOw0KKwkJZm9yIChjaD0wOyBjaDxuQ2hhbm5lbHM7IGNoKyspIHsgICAgICAgICAgIAorICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJdICE9IE5PX0FIICYmCisgICAgICAgICAgICBwc3lPdXRDaC0+c2ZiTWluU25yW3NmYl0gPCBtaW5TbnJMaW1pdCkgeworICAgICAgICAgIHBzeU91dENoLT5zZmJNaW5TbnJbc2ZiXSA9IG1pblNuckxpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgcHN5T3V0Q2gtPnNmYlRocmVzaG9sZFtzZmJdID0KKyAgICAgICAgICAgIExfbXB5X2xzKHBzeU91dENoLT5zZmJFbmVyZ3lbc2ZiXSwgcHN5T3V0Q2gtPnNmYk1pblNucltzZmJdKTsKKworICAgICAgICAgIC8qIGNhbGMgbmV3IHBlICovCisgICAgICAgICAgZGVsdGFQZSA9ICgocGVDaGFuLT5zZmJOTGluZXM0W3NmYl0gKyAocGVDaGFuLT5zZmJOTGluZXM0W3NmYl0gPj4gMSkpID4+IDIpIC0KKyAgICAgICAgICAgICAgcGVDaGFuLT5zZmJQZVtzZmJdOworICAgICAgICAgIHBlRGF0YS0+cGUgPSBwZURhdGEtPnBlICsgZGVsdGFQZTsKKyAgICAgICAgICBwZUNoYW4tPnBlID0gcGVDaGFuLT5wZSArIGRlbHRhUGU7CQkgIAorICAgICAgICB9DQorCQlwZUNoYW4gKz0gMTsgcHN5T3V0Q2ggKz0gMTsKKyAgICAgIH0KKyAgICAgIC8qIHN0b3AgaWYgZW5vdWdoIGhhcyBiZWVuIHNhdmVkICovCisgICAgICAgCisgICAgICBpZiAocGVEYXRhLT5wZSA8PSBkZXNpcmVkUGUpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTphbGxvd01vcmVIb2xlcworKiBkZXNjcmlwdGlvbjogaWYgdGhlIGRlc2lyZWQgcGUgY2FuIG5vdCBiZSByZWFjaGVkLCBzb21lIG1vcmUgc2NhbGVmYWN0b3IgYmFuZHMgIAorKiAgICAgICAgICAgICAgaGF2ZSB0byBiZSBxdWFudGl6ZWQgdG8gemVybworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFsbG93TW9yZUhvbGVzKFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAqcGVEYXRhLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgYWhGbGFnW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFIX1BBUkFNICAqYWhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBkZXNpcmVkUGUpCit7CisgIFdvcmQxNiBjaCwgc2ZiOworICBXb3JkMTYgYWN0UGUsIHNoaWZ0OworCisgIGFjdFBlID0gcGVEYXRhLT5wZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qIGZvciBNUyBhbGxvdyBob2xlIGluIHRoZSBjaGFubmVsIHdpdGggbGVzcyBlbmVyZ3kgKi8KKyAgICAgCisgIGlmIChuQ2hhbm5lbHM9PTIgJiYKKyAgICAgIHBzeU91dENoYW5uZWxbMF0ud2luZG93U2VxdWVuY2U9PXBzeU91dENoYW5uZWxbMV0ud2luZG93U2VxdWVuY2UpIHsKKyAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5MID0gJnBzeU91dENoYW5uZWxbMF07CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuUiA9ICZwc3lPdXRDaGFubmVsWzFdOworICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuTC0+c2ZiQ250OyBzZmIrKykgeworICAgICAgV29yZDMyIG1pbkVuOworICAgICAgIAorICAgICAgaWYgKHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2tbc2ZiXSkgeworICAgICAgICAvKiBhbGxvdyBob2xlIGluIHNpZGUgY2hhbm5lbCA/ICovCisgICAgICAgIG1pbkVuID0gTF9tcHlfbHMocHN5T3V0Q2hhbkwtPnNmYkVuZXJneVtzZmJdLCAobWluU25yTGltaXQgKiBwc3lPdXRDaGFuTC0+c2ZiTWluU25yW3NmYl0pID4+IDE2KTsKKyAgICAgICAgICAgCisgICAgICAgIGlmIChhaEZsYWdbMV1bc2ZiXSAhPSBOT19BSCAmJgorICAgICAgICAgICAgbWluRW4gPiBwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0pIHsKKyAgICAgICAgICBhaEZsYWdbMV1bc2ZiXSA9IE5PX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBwc3lPdXRDaGFuUi0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5SLT5zZmJFbmVyZ3lbc2ZiXSk7CisgICAgICAgICAgYWN0UGUgPSBhY3RQZSAtIHBlRGF0YS0+cGVDaGFubmVsRGF0YVsxXS5zZmJQZVtzZmJdOworICAgICAgICB9CisgICAgICAgIC8qIGFsbG93IGhvbGUgaW4gbWlkIGNoYW5uZWwgPyAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgbWluRW4gPSBMX21weV9scyhwc3lPdXRDaGFuUi0+c2ZiRW5lcmd5W3NmYl0sIChtaW5TbnJMaW1pdCAqIHBzeU91dENoYW5SLT5zZmJNaW5TbnJbc2ZiXSkgPj4gMTYpOworICAgICAgICAgICAgIAorICAgICAgICAgIGlmIChhaEZsYWdbMF1bc2ZiXSE9IE5PX0FIICYmCisgICAgICAgICAgICAgIG1pbkVuID4gcHN5T3V0Q2hhbkwtPnNmYkVuZXJneVtzZmJdKSB7CisgICAgICAgICAgICBhaEZsYWdbMF1bc2ZiXSA9IE5PX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwc3lPdXRDaGFuTC0+c2ZiVGhyZXNob2xkW3NmYl0gPSBMX2FkZChwc3lPdXRDaGFuTC0+c2ZiRW5lcmd5W3NmYl0sIHBzeU91dENoYW5MLT5zZmJFbmVyZ3lbc2ZiXSk7CisgICAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhWzBdLnNmYlBlW3NmYl07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKQorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIHN1YnNlcXVlbnRseSBlcmFzZSBiYW5kcyAqLyAgIAorICBpZiAoYWN0UGUgPiBkZXNpcmVkUGUpIHsKKyAgICBXb3JkMTYgc3RhcnRTZmJbMl07CisgICAgV29yZDMyIGF2Z0VuLCBtaW5FbjsKKyAgICBXb3JkMTYgYWhDbnQ7CisgICAgV29yZDE2IGVuSWR4OworICAgIFdvcmQxNiBlbkRpZmY7CisgICAgV29yZDMyIGVuWzRdOworICAgIFdvcmQxNiBtaW5TZmIsIG1heFNmYjsKKyAgICBGbGFnICAgZG9uZTsKKworICAgIC8qIGRvIG5vdCBnbyBiZWxvdyBzdGFydFNmYiAqLworICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAKKyAgICAgIGlmIChwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCisgICAgICAgIHN0YXJ0U2ZiW2NoXSA9IGFoUGFyYW0tPnN0YXJ0U2ZiTDsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RhcnRTZmJbY2hdID0gYWhQYXJhbS0+c3RhcnRTZmJTOworICAgIH0KKworICAgIGF2Z0VuID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIG1pbkVuID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGFoQ250ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvciAoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgICBmb3IgKHNmYj1zdGFydFNmYltjaF07IHNmYjxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYisrKSB7CisgICAgICAgICAgIAorICAgICAgICBpZiAoKGFoRmxhZ1tjaF1bc2ZiXSAhPSBOT19BSCkgJiYKKyAgICAgICAgICAgIChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtzZmJdKSkgeworICAgICAgICAgIG1pbkVuID0gbWluKG1pbkVuLCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSk7CisgICAgICAgICAgYXZnRW4gPSBMX2FkZChhdmdFbiwgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W3NmYl0pOworICAgICAgICAgIGFoQ250Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgIAorICAgIGlmKGFoQ250KSB7CisgICAgICBXb3JkMzIgaWFoQ250OworICAgICAgc2hpZnQgPSBub3JtX2woYWhDbnQpOw0KKwkgIGlhaENudCA9IERpdl8zMiggMSA8PCBzaGlmdCwgYWhDbnQgPDwgc2hpZnQgKTsKKyAgICAgIGF2Z0VuID0gZml4bXVsKGF2Z0VuLCBpYWhDbnQpOworICAgIH0KKworICAgIGVuRGlmZiA9IGlMb2c0KGF2Z0VuKSAtIGlMb2c0KG1pbkVuKTsKKyAgICAvKiBjYWxjIHNvbWUgZW5lcmd5IGJvcmRlcnMgYmV0d2VlbiBtaW5FbiBhbmQgYXZnRW4gKi8KKyAgICBmb3IgKGVuSWR4PTA7IGVuSWR4PDQ7IGVuSWR4KyspIHsKKyAgICAgIFdvcmQzMiBlbkZhYzsKKyAgICAgIGVuRmFjID0gKCg2LShlbklkeCA8PCAxKSkgKiBlbkRpZmYpOworICAgICAgZW5bZW5JZHhdID0gZml4bXVsKGF2Z0VuLCBwb3cyX3h5KExfbmVnYXRlKGVuRmFjKSw3KjQpKTsKKyAgICB9CisKKyAgICAvKiBzdGFydCB3aXRoIGxvd2VzdCBlbmVyZ3kgYm9yZGVyIGF0IGhpZ2hlc3Qgc2ZiICovCisgICAgbWF4U2ZiID0gcHN5T3V0Q2hhbm5lbFswXS5zZmJDbnQgLSAxOworICAgIG1pblNmYiA9IHN0YXJ0U2ZiWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgCisgICAgaWYgKG5DaGFubmVscyA9PSAyKSB7CisgICAgICBtYXhTZmIgPSBtYXgobWF4U2ZiLCAocHN5T3V0Q2hhbm5lbFsxXS5zZmJDbnQgLSAxKSk7CisgICAgICBtaW5TZmIgPSBtaW4obWluU2ZiLCBzdGFydFNmYlsxXSk7CisgICAgfQorCisgICAgc2ZiID0gbWF4U2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGVuSWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBkb25lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgCisgICAgICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSAmcHN5T3V0Q2hhbm5lbFtjaF07CisgICAgICAgICAgIAorICAgICAgICBpZiAoc2ZiPj1zdGFydFNmYltjaF0gJiYgc2ZiPHBzeU91dENoYW4tPnNmYkNudCkgeworICAgICAgICAgIC8qIHNmYiBlbmVyZ3kgYmVsb3cgYm9yZGVyID8gKi8KKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZiAoYWhGbGFnW2NoXVtzZmJdICE9IE5PX0FIICYmIHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdIDwgZW5bZW5JZHhdKXsKKyAgICAgICAgICAgIC8qIGFsbG93IGhvbGUgKi8KKyAgICAgICAgICAgIGFoRmxhZ1tjaF1bc2ZiXSA9IE5PX0FIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiXSA9IExfYWRkKHBzeU91dENoYW4tPnNmYkVuZXJneVtzZmJdLCBwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbc2ZiXSk7CisgICAgICAgICAgICBhY3RQZSA9IGFjdFBlIC0gcGVEYXRhLT5wZUNoYW5uZWxEYXRhW2NoXS5zZmJQZVtzZmJdOworICAgICAgICAgIH0KKyAgICAgICAgICAgCisgICAgICAgICAgaWYgKGFjdFBlIDwgZGVzaXJlZFBlKSB7CisgICAgICAgICAgICBkb25lID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBzZmIgPSBzZmIgLSAxOworICAgICAgIAorICAgICAgaWYgKHNmYiA8IG1pblNmYikgeworICAgICAgICAvKiByZXN0YXJ0IHdpdGggbmV4dCBlbmVyZ3kgYm9yZGVyICovCisgICAgICAgIHNmYiA9IG1heFNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBlbklkeCA9IGVuSWR4ICsgMTsKKyAgICAgICAgIAorICAgICAgICBpZiAoZW5JZHggLSA0ID49IDApCisgICAgICAgICAgZG9uZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTphZGFwdFRocmVzaG9sZHNUb1BlCisqIGRlc2NyaXB0aW9uOiB0d28gZ3Vlc3NlcyBmb3IgdGhlIHJlZHVjdGlvbiB2YWx1ZSBhbmQgb25lIGZpbmFsIGNvcnJlY3Rpb24gb2YgdGhlCisqICAgICAgICAgICAgICB0aHJlc2hvbGRzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYWRhcHRUaHJlc2hvbGRzVG9QZShQU1lfT1VUX0NIQU5ORUwgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UICAgICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneVtNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFX0RBVEEgICAgICAgICAgICAqcGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICBkZXNpcmVkUGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIX1BBUkFNICAgICAgICAgICAqYWhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSkKK3sKKyAgV29yZDE2IG5vUmVkUGUsIHJlZFBlLCByZWRQZU5vQUg7CisgIFdvcmQxNiBjb25zdFBhcnQsIGNvbnN0UGFydE5vQUg7CisgIFdvcmQxNiBuQWN0aXZlTGluZXMsIG5BY3RpdmVMaW5lc05vQUg7CisgIFdvcmQxNiBkZXNpcmVkUGVOb0FIOworICBXb3JkMzIgcmVkVmFsLCBhdmdUaHJFeHA7CisgIFdvcmQzMiBpdGVyOworCisgIGNhbGNUaHJlc2hFeHAocGVEYXRhLT50aHJFeHAsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisKKyAgYWRhcHRNaW5TbnIocHN5T3V0Q2hhbm5lbCwgbG9nU2ZiRW5lcmd5LCBtc2FQYXJhbSwgbkNoYW5uZWxzKTsKKworICBpbml0QXZvaWRIb2xlRmxhZyhwZURhdGEtPmFoRmxhZywgcHN5T3V0Q2hhbm5lbCwgcHN5T3V0RWxlbWVudCwgbkNoYW5uZWxzLCBhaFBhcmFtKTsKKworICBub1JlZFBlID0gcGVEYXRhLT5wZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGNvbnN0UGFydCA9IHBlRGF0YS0+Y29uc3RQYXJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgbkFjdGl2ZUxpbmVzID0gcGVEYXRhLT5uQWN0aXZlTGluZXM7ICAgICAgIAorCisgIC8qIGZpcnN0IGd1ZXNzIG9mIHJlZHVjdGlvbiB2YWx1ZSB0XjAuMjUgPSAyXigoYS1wZW4pLzQqYikgKi8KKyAgYXZnVGhyRXhwID0gcG93Ml94eSgoY29uc3RQYXJ0IC0gbm9SZWRQZSksIChuQWN0aXZlTGluZXMgPDwgMikpOworICAKKyAgLyogcjEgPSAyXigoYS1wZXIpLzQqYikgLSB0XjAuMjUgKi8KKyAgcmVkVmFsID0gcG93Ml94eSgoY29uc3RQYXJ0IC0gZGVzaXJlZFBlKSwgKG5BY3RpdmVMaW5lcyA8PCAyKSkgLSBhdmdUaHJFeHA7CisKKyAgLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KKyAgcmVkdWNlVGhyZXNob2xkcyhwc3lPdXRDaGFubmVsLCBwZURhdGEtPmFoRmxhZywgcGVEYXRhLT50aHJFeHAsIG5DaGFubmVscywgcmVkVmFsKTsKKworICAvKiBwZSBhZnRlciBmaXJzdCBndWVzcyAqLworICBjYWxjU2ZiUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworICByZWRQZSA9IHBlRGF0YS0+cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgaXRlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBkbyB7CisgICAgLyogcGUgZm9yIGJhbmRzIHdoZXJlIGF2b2lkIGhvbGUgaXMgaW5hY3RpdmUgKi8KKyAgICBjYWxjUGVOb0FIKCZyZWRQZU5vQUgsICZjb25zdFBhcnROb0FILCAmbkFjdGl2ZUxpbmVzTm9BSCwKKyAgICAgICAgICAgICAgIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisKKyAgICBkZXNpcmVkUGVOb0FIID0gZGVzaXJlZFBlIC0ocmVkUGUgLSByZWRQZU5vQUgpOworICAgICAKKyAgICBpZiAoZGVzaXJlZFBlTm9BSCA8IDApIHsKKyAgICAgIGRlc2lyZWRQZU5vQUggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIC8qIHNlY29uZCBndWVzcyAqLworICAgICAKKyAgICBpZiAobkFjdGl2ZUxpbmVzTm9BSCA+IDApIHsKKwkJCisJCWF2Z1RockV4cCA9IHBvdzJfeHkoKGNvbnN0UGFydE5vQUggLSByZWRQZU5vQUgpLCAobkFjdGl2ZUxpbmVzTm9BSCA8PCAyKSk7CisJCQorCQlyZWRWYWwgPSAocmVkVmFsICsgcG93Ml94eSgoY29uc3RQYXJ0Tm9BSCAtIGRlc2lyZWRQZU5vQUgpLCAobkFjdGl2ZUxpbmVzTm9BSCA8PCAyKSkpIC0gYXZnVGhyRXhwOworCQkKKwkJLyogcmVkdWNlIHRocmVzaG9sZHMgKi8KKwkJcmVkdWNlVGhyZXNob2xkcyhwc3lPdXRDaGFubmVsLCBwZURhdGEtPmFoRmxhZywgcGVEYXRhLT50aHJFeHAsIG5DaGFubmVscywgcmVkVmFsKTsKKyAgICB9CisKKyAgICBjYWxjU2ZiUGUocGVEYXRhLCBwc3lPdXRDaGFubmVsLCBuQ2hhbm5lbHMpOworICAgIHJlZFBlID0gcGVEYXRhLT5wZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBpdGVyID0gaXRlcisxOworICAgICAgIAorICB9IHdoaWxlICgoMjAgKiBhYnNfcyhyZWRQZSAtIGRlc2lyZWRQZSkgPiBkZXNpcmVkUGUpICYmIChpdGVyIDwgMikpOworCisgICAKKyAgaWYgKCgxMDAgKiByZWRQZSA8IDExNSAqIGRlc2lyZWRQZSkpIHsKKyAgICBjb3JyZWN0VGhyZXNoKHBzeU91dENoYW5uZWwsIHBlRGF0YS0+YWhGbGFnLCBwZURhdGEsIHBlRGF0YS0+dGhyRXhwLCByZWRWYWwsCisgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIGRlc2lyZWRQZSAtIHJlZFBlKTsKKyAgfQorICBlbHNlIHsKKyAgICBXb3JkMTYgZGVzaXJlZFBlMTA1ID0gKDEwNSAqIGRlc2lyZWRQZSkgLyAxMDA7CisgICAgcmVkdWNlTWluU25yKHBzeU91dENoYW5uZWwsIHBlRGF0YSwgcGVEYXRhLT5haEZsYWcsCisgICAgICAgICAgICAgICAgIG5DaGFubmVscywgZGVzaXJlZFBlMTA1KTsKKyAgICBhbGxvd01vcmVIb2xlcyhwc3lPdXRDaGFubmVsLCBwc3lPdXRFbGVtZW50LCBwZURhdGEsIHBlRGF0YS0+YWhGbGFnLAorICAgICAgICAgICAgICAgICAgIGFoUGFyYW0sIG5DaGFubmVscywgZGVzaXJlZFBlMTA1KTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjYWxjQml0U2F2ZQorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgcGVyY2VudGFnZSBvZiBiaXQgc2F2ZSwgc2VlIGZpZ3VyZSBiZWxvdworKiByZXR1cm5zOgorKiBpbnB1dDogICAgICAgIHBhcmFtZXRlcnMgYW5kIGJpdHJlcy1mdWxsbmVzcworKiBvdXRwdXQ6ICAgICAgIHBlcmNlbnRhZ2Ugb2YgYml0IHNhdmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBjYWxjQml0U2F2ZShXb3JkMTYgZmlsbExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2xpcExvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbWluQml0U2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heEJpdFNhdmUpCit7CisgIFdvcmQxNiBiaXRzYXZlID0gMDsKKworICBmaWxsTGV2ZWwgPSBtYXgoZmlsbExldmVsLCBjbGlwTG93KTsKKyAgZmlsbExldmVsID0gbWluKGZpbGxMZXZlbCwgY2xpcEhpZ2gpOworCisgIGlmKGNsaXBIaWdoLWNsaXBMb3cpDQorICBiaXRzYXZlID0gKG1heEJpdFNhdmUgLSAoKChtYXhCaXRTYXZlLW1pbkJpdFNhdmUpKihmaWxsTGV2ZWwtY2xpcExvdykpLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaXBIaWdoLWNsaXBMb3cpKSk7CisKKyAgcmV0dXJuIChiaXRzYXZlKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjYWxjQml0U3BlbmQKKyogZGVzY3JpcHRpb246ICBDYWxjdWxhdGVzIHBlcmNlbnRhZ2Ugb2YgYml0IHNwZW5kLCBzZWUgZmlndXJlIGJlbG93CisqIHJldHVybnM6CisqIGlucHV0OiAgICAgICAgcGFyYW1ldGVycyBhbmQgYml0cmVzLWZ1bGxuZXNzCisqIG91dHB1dDogICAgICAgcGVyY2VudGFnZSBvZiBiaXQgc3BlbmQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBjYWxjQml0U3BlbmQoV29yZDE2IGZpbGxMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjbGlwTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGNsaXBIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1pbkJpdFNwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heEJpdFNwZW5kKQoreworICBXb3JkMTYgYml0c3BlbmQgPSAxOworCisgIGZpbGxMZXZlbCA9IG1heChmaWxsTGV2ZWwsIGNsaXBMb3cpOworICBmaWxsTGV2ZWwgPSBtaW4oZmlsbExldmVsLCBjbGlwSGlnaCk7CisKKyAgaWYoY2xpcEhpZ2gtY2xpcExvdykNCisgIGJpdHNwZW5kID0gKG1pbkJpdFNwZW5kICsgKChtYXhCaXRTcGVuZCAtIG1pbkJpdFNwZW5kKSooZmlsbExldmVsIC0gY2xpcExvdykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpcEhpZ2gtY2xpcExvdykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcmV0dXJuIChiaXRzcGVuZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGFkanVzdFBlTWluTWF4KCkKKyogZGVzY3JpcHRpb246ICBhZGp1c3RzIHBlTWluIGFuZCBwZU1heCBwYXJhbWV0ZXJzIG92ZXIgdGltZQorKiByZXR1cm5zOgorKiBpbnB1dDogICAgICAgIGN1cnJlbnQgcGUsIHBlTWluLCBwZU1heAorKiBvdXRwdXQ6ICAgICAgIGFkanVzdGVkIHBlTWluL3BlTWF4CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFkanVzdFBlTWluTWF4KGNvbnN0IFdvcmQxNiBjdXJyUGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAqcGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAqcGVNYXgpCit7CisgIFdvcmQxNiBtaW5GYWNIaSwgbWF4RmFjSGksIG1pbkZhY0xvLCBtYXhGYWNMbzsKKyAgV29yZDE2IGRpZmY7CisgIFdvcmQxNiBtaW5EaWZmID0gZXh0cmFjdF9sKGN1cnJQZSAvIDYpOworICBtaW5GYWNIaSA9IDMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtYXhGYWNIaSA9IDEwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtaW5GYWNMbyA9IDE0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtYXhGYWNMbyA9IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGRpZmYgPSBjdXJyUGUgLSAqcGVNYXggOworICAgCisgIGlmIChkaWZmID4gMCkgeworICAgICpwZU1pbiA9ICpwZU1pbiArICgoZGlmZiAqIG1pbkZhY0hpKSAvIDEwMCk7CisgICAgKnBlTWF4ID0gKnBlTWF4ICsgKChkaWZmICogbWF4RmFjSGkpIC8gMTAwKTsKKyAgfSBlbHNlIHsKKyAgICBkaWZmID0gKnBlTWluIC0gY3VyclBlOworICAgICAKKyAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICpwZU1pbiA9ICpwZU1pbiAtICgoZGlmZiAqIG1pbkZhY0xvKSAvIDEwMCk7CisgICAgICAqcGVNYXggPSAqcGVNYXggLSAoKGRpZmYgKiBtYXhGYWNMbykgLyAxMDApOworICAgIH0gZWxzZSB7CisgICAgICAqcGVNaW4gPSAqcGVNaW4gKyAoKGN1cnJQZSAtICpwZU1pbikgKiBtaW5GYWNIaSAvIDEwMCk7CisgICAgICAqcGVNYXggPSAqcGVNYXggLSAoKCpwZU1heCAtIGN1cnJQZSkgKiBtYXhGYWNMbyAvIDEwMCk7CisgICAgfQorICB9CisKKyAgIAorICBpZiAoKCpwZU1heCAtICpwZU1pbikgPCBtaW5EaWZmKSB7CisgICAgV29yZDE2IHBhcnRMbywgcGFydEhpOworCisgICAgcGFydExvID0gbWF4KDAsIChjdXJyUGUgLSAqcGVNaW4pKTsKKyAgICBwYXJ0SGkgPSBtYXgoMCwgKCpwZU1heCAtIGN1cnJQZSkpOworCisgICAgKnBlTWF4ID0gY3VyclBlICsgKChwYXJ0SGkgKiBtaW5EaWZmKSAvIChwYXJ0TG8gKyBwYXJ0SGkpKTsKKyAgICAqcGVNaW4gPSBjdXJyUGUgLSAoKHBhcnRMbyAqIG1pbkRpZmYpIC8gKHBhcnRMbyArIHBhcnRIaSkpOworICAgICpwZU1pbiA9IG1heCgwLCAqcGVNaW4pOworICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEJpdHJlc0NhbGNCaXRGYWMKKyogZGVzY3JpcHRpb246ICBjYWxjdWxhdGVzIGZhY3RvciBvZiBzcGVuZGluZyBiaXRzIGZvciBvbmUgZnJhbWUKKyogICAgICAgICAgICAgICAgMS4wIDogdGFrZSBhbGwgZnJhbWUgZHlucGFydCBiaXRzCisqICAgICAgICAgICAgICAgID4xLjAgOiB0YWtlIGFsbCBmcmFtZSBkeW5wYXJ0IGJpdHMgKyBiaXRyZXMKKyogICAgICAgICAgICAgICAgPDEuMCA6IHB1dCBiaXRzIGluIGJpdHJlc2Vydm9pcgorKiAgcmV0dXJuczogICAgICBCaXRGYWMqMTAwCisqICBpbnB1dDogICAgICAgIGJpdHJlcy1mdWxsbmVzcywgcGUsIGJsb2NrVHlwZSwgcGFyYW1ldGVyLXNldHRpbmdzCisqICBvdXRwdXQ6CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgYml0cmVzQ2FsY0JpdEZhYyggY29uc3QgV29yZDE2ICAgYml0cmVzQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgbWF4Qml0cmVzQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBhdmdCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBtYXhCaXRGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFESl9USFJfU1RBVEUgKkFkalRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTX0VMRU1FTlQgICAqYWRqVGhyQ2hhbikKK3sKKyAgQlJFU19QQVJBTSAqYnJlc1BhcmFtOworICBXb3JkMTYgcGV4OworICBXb3JkMTYgZmlsbExldmVsOworICBXb3JkMTYgYml0U2F2ZSwgYml0U3BlbmQsIGJpdHJlc0ZhYzsKKworICBmaWxsTGV2ZWwgPSBleHRyYWN0X2woKDEwMCogYml0cmVzQml0cykgLyBtYXhCaXRyZXNCaXRzKTsKKworICBpZiAod2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKQorICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1Mb25nKTsKKyAgZWxzZQorICAgIGJyZXNQYXJhbSA9ICYoQWRqVGhyLT5icmVzUGFyYW1TaG9ydCk7CisKKyAgcGV4ID0gbWF4KHBlLCBhZGpUaHJDaGFuLT5wZU1pbik7CisgIHBleCA9IG1pbihwZXgsYWRqVGhyQ2hhbi0+cGVNYXgpOworCisgIGJpdFNhdmUgPSBjYWxjQml0U2F2ZShmaWxsTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBicmVzUGFyYW0tPmNsaXBTYXZlTG93LCBicmVzUGFyYW0tPmNsaXBTYXZlSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+bWluQml0U2F2ZSwgYnJlc1BhcmFtLT5tYXhCaXRTYXZlKTsKKworICBiaXRTcGVuZCA9IGNhbGNCaXRTcGVuZChmaWxsTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+Y2xpcFNwZW5kTG93LCBicmVzUGFyYW0tPmNsaXBTcGVuZEhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZXNQYXJhbS0+bWluQml0U3BlbmQsIGJyZXNQYXJhbS0+bWF4Qml0U3BlbmQpOworCisgIGlmKGFkalRockNoYW4tPnBlTWF4ICE9IGFkalRockNoYW4tPnBlTWluKQ0KKwliaXRyZXNGYWMgPSAoMTAwIC0gYml0U2F2ZSkgKyBleHRyYWN0X2woKChiaXRTcGVuZCArIGJpdFNhdmUpICogKHBleCAtIGFkalRockNoYW4tPnBlTWluKSkgLworICAgICAgICAgICAgICAgICAgICAoYWRqVGhyQ2hhbi0+cGVNYXggLSBhZGpUaHJDaGFuLT5wZU1pbikpOworICBlbHNlCisJYml0cmVzRmFjID0gMHg3ZmZmOworICAgICAgICAgICAgICAgCisgIGJpdHJlc0ZhYyA9IG1pbihiaXRyZXNGYWMsCisgICAgICAgICAgICAgICAgICAgICgxMDAtMzAgKyBleHRyYWN0X2woKDEwMCAqIGJpdHJlc0JpdHMpIC8gYXZnQml0cykpKTsKKworICBiaXRyZXNGYWMgPSBtaW4oYml0cmVzRmFjLCBtYXhCaXRGYWMpOworCisgIGFkanVzdFBlTWluTWF4KHBlLCAmYWRqVGhyQ2hhbi0+cGVNaW4sICZhZGpUaHJDaGFuLT5wZU1heCk7CisKKyAgcmV0dXJuIGJpdHJlc0ZhYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEFkalRockluaXQKKyogZGVzY3JpcHRpb246ICBpbml0IHRocmVzaG9sZHMgcGFyYW1ldGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQWRqVGhySW5pdChBREpfVEhSX1NUQVRFICpoQWRqVGhyLAorICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgIG1lYW5QZSwKKyAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICBjaEJpdHJhdGUpCit7CisgIEFUU19FTEVNRU5UKiBhdHNFbGVtID0gJmhBZGpUaHItPmFkalRoclN0YXRlRWxlbTsKKyAgTUlOU05SX0FEQVBUX1BBUkFNICptc2FQYXJhbSA9ICZhdHNFbGVtLT5taW5TbnJBZGFwdFBhcmFtOworCisgIC8qIGNvbW1vbiBmb3IgYWxsIGVsZW1lbnRzOiAqLworICAvKiBwYXJhbWV0ZXJzIGZvciBiaXRyZXMgY29udHJvbCAqLworICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLmNsaXBTYXZlTG93ICAgPSAgMjA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUhpZ2ggID0gIDk1OyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcubWluQml0U2F2ZSAgICA9ICAtNTsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1heEJpdFNhdmUgICAgPSAgMzA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU3BlbmRMb3cgID0gIDIwOyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbUxvbmcuY2xpcFNwZW5kSGlnaCA9ICA5NTsgICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1Mb25nLm1pbkJpdFNwZW5kICAgPSAtMTA7ICAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5tYXhCaXRTcGVuZCAgID0gIDQwOyAgICAgICAgICAgICAgICAgICAgCisKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQuY2xpcFNhdmVMb3cgICA9ICAyMDsgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTYXZlSGlnaCAgPSAgNzU7ICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5taW5CaXRTYXZlICAgID0gICAwOyAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWF4Qml0U2F2ZSAgICA9ICAyMDsgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0LmNsaXBTcGVuZExvdyAgPSAgMjA7ICAgICAgICAgICAgICAgICAgIAorICBoQWRqVGhyLT5icmVzUGFyYW1TaG9ydC5jbGlwU3BlbmRIaWdoID0gIDc1OyAgICAgICAgICAgICAgICAgICAKKyAgaEFkalRoci0+YnJlc1BhcmFtU2hvcnQubWluQml0U3BlbmQgICA9IC01OyAgICAgICAgICAgICAgICAgICAgCisgIGhBZGpUaHItPmJyZXNQYXJhbVNob3J0Lm1heEJpdFNwZW5kICAgPSAgNTA7ICAgICAgICAgICAgICAgICAgIAorCisgIC8qIHNwZWNpZmljIGZvciBlYWNoIGVsZW1lbnQ6ICovCisKKyAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzIGNvbnRyb2wgKi8KKyAgYXRzRWxlbS0+cGVNaW4gPSBleHRyYWN0X2woKCg4MCptZWFuUGUpIC8gMTAwKSk7CisgIGF0c0VsZW0tPnBlTWF4ID0gZXh0cmFjdF9sKCgoMTIwKm1lYW5QZSkgLyAxMDApKTsKKworICAvKiBhZGRpdGlvbmFsIHBlIG9mZnNldCB0byBjb3JyZWN0IHBlMmJpdHMgZm9yIGxvdyBiaXRyYXRlcyAqLworICBhdHNFbGVtLT5wZU9mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaWYgKGNoQml0cmF0ZSA8IDMyMDAwKSB7CisgICAgYXRzRWxlbS0+cGVPZmZzZXQgPSBtYXgoNTAsICgxMDAgLSBleHRyYWN0X2woKDEwMCAqIGNoQml0cmF0ZSkgLyAzMjAwMCkpKTsKKyAgfQorCisgIC8qIGF2b2lkIGhvbGUgcGFyYW1ldGVycyAqLworICBpZiAoY2hCaXRyYXRlID4gMjAwMDApIHsKKyAgICBhdHNFbGVtLT5haFBhcmFtLm1vZGlmeU1pblNuciA9IFRSVUU7CisgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYkwgPSAxNTsKKyAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiUyA9IDM7CisgIH0KKyAgZWxzZSB7CisgICAgYXRzRWxlbS0+YWhQYXJhbS5tb2RpZnlNaW5TbnIgPSBGQUxTRTsKKyAgICBhdHNFbGVtLT5haFBhcmFtLnN0YXJ0U2ZiTCA9IDA7CisgICAgYXRzRWxlbS0+YWhQYXJhbS5zdGFydFNmYlMgPSAwOworICB9CisKKyAgLyogbWluU25yIGFkYXB0YXRpb24gKi8KKyAgLyogbWF4aW11bSByZWR1Y3Rpb24gb2YgbWluU25yIGdvZXMgZG93biB0byBtaW5TbnJebWF4UmVkICovCisgIG1zYVBhcmFtLT5tYXhSZWQgPSAweDIwMDAwMDAwOyAgICAgLyogKjAuMjVmIC8gICAgICAgICAgICAgICAgICAgICAgICAKKyAgLyogc3RhcnQgYWRhcHRhdGlvbiBvZiBtaW5TbnIgZm9yIGF2Z0VuL3NmYkVuID4gc3RhcnRSYXRpbyAqLworICBtc2FQYXJhbS0+c3RhcnRSYXRpbyA9IDB4MGNjY2NjY2Q7IC8qIDEwICovICAgICAgICAgICAgICAgICAgICAgICAgCisgIC8qIG1heGltdW0gbWluU25yIHJlZHVjdGlvbiB0byBtaW5TbnJebWF4UmVkIGlzIHJlYWNoZWQgZm9yCisgICAgIGF2Z0VuL3NmYkVuID49IG1heFJhdGlvICovCisgIG1zYVBhcmFtLT5tYXhSYXRpbyA9ICAweDAwMjBjNDljOyAvKiAxMDAwICovICAgICAgICAgICAgICAgICAgICAgICAgIAorICAvKiBoZWxwZXIgdmFyaWFibGVzIHRvIGludGVycG9sYXRlIG1pblNuciByZWR1Y3Rpb24gZm9yCisgICAgIGF2Z0VuL3NmYkVuIGJldHdlZW4gc3RhcnRSYXRpbyBhbmQgbWF4UmF0aW8gKi8KKworICBtc2FQYXJhbS0+cmVkUmF0aW9GYWMgPSAweGZiMzMzMzMzOyAvKiAtMC43NS8yMCAqLyAgICAgICAgIAorCisgIG1zYVBhcmFtLT5yZWRPZmZzID0gMHgzMDAwMDAwMDsgIC8qIG1zYVBhcmFtLT5yZWRSYXRpb0ZhYyAqIDEwKmxvZzEwKG1zYVBhcmFtLT5zdGFydFJhdGlvKSAqLyAgCisKKyAgICAgICAKKyAgLyogcGUgY29ycmVjdGlvbiAqLworICBhdHNFbGVtLT5wZUxhc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYXRzRWxlbS0+ZHluQml0c0xhc3QgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGF0c0VsZW0tPnBlQ29ycmVjdGlvbkZhY3RvciA9IDEwMDsgLyogMS4wICovICAgICAgICAgICAgICAgICAgICAgICAgIAorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjYWxjUGVDb3JyZWN0aW9uCisqIGRlc2NyaXB0aW9uOiAgY2FsY3VsYXRlcyB0aGUgZGVzaXJlZCBwZXJjZXB0dWFsIGVudHJvcHkgZmFjdG9yCisqCQkJCUl0IGlzIGJldHdlZW4gMC44NSBhbmQgMS4xNQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjYWxjUGVDb3JyZWN0aW9uKFdvcmQxNiAqY29ycmVjdGlvbkZhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHBlQWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVMYXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IGJpdHNMYXN0KSAKK3sKKyAgV29yZDMyIHBlQWN0MTAwID0gMTAwICogcGVBY3Q7CisgIFdvcmQzMiBwZUxhc3QxMDAgPSAxMDAgKiBwZUxhc3Q7CisgIFdvcmQxNiBwZUJpdHNMYXN0ID0gYml0czJwZShiaXRzTGFzdCk7CisgICAgICAgICAgIAorICBpZiAoKGJpdHNMYXN0ID4gMCkgJiYKKyAgICAgIChwZUFjdDEwMCA8ICgxNTAgKiBwZUxhc3QpKSAmJiAgKHBlQWN0MTAwID4gKDcwICogcGVMYXN0KSkgJiYKKyAgICAgICgoMTIwICogcGVCaXRzTGFzdCkgPiBwZUxhc3QxMDAgKSAmJiAoKCA2NSAqIHBlQml0c0xhc3QpIDwgcGVMYXN0MTAwKSkKKyAgICB7CisgICAgICBXb3JkMTYgbmV3RmFjID0gKDEwMCAqIHBlTGFzdCkgLyBwZUJpdHNMYXN0OworICAgICAgLyogZGVhZCB6b25lICovCisgICAgICAgCisgICAgICBpZiAobmV3RmFjIDwgMTAwKSB7CisgICAgICAgIG5ld0ZhYyA9IG1pbigoKDExMCAqIG5ld0ZhYykgLyAxMDApLCAxMDApOworICAgICAgICBuZXdGYWMgPSBtYXgobmV3RmFjLCA4NSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgbmV3RmFjID0gbWF4KCgoOTAgKiBuZXdGYWMpIC8gMTAwKSwgMTAwKTsKKyAgICAgICAgbmV3RmFjID0gbWluKG5ld0ZhYywgMTE1KTsKKyAgICAgIH0KKyAgICAgICAgIAorICAgICAgaWYgKChuZXdGYWMgPiAxMDAgJiYgKmNvcnJlY3Rpb25GYWMgPCAxMDApIHx8CisgICAgICAgICAgKG5ld0ZhYyA8IDEwMCAmJiAqY29ycmVjdGlvbkZhYyA+IDEwMCkpIHsKKyAgICAgICAgKmNvcnJlY3Rpb25GYWMgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgICAgLyogZmFzdGVyIGFkYXB0YXRpb24gdG93YXJkcyAxLjAsIHNsb3dlciBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uICovCisgICAgICAgICAgICAgCisgICAgICBpZiAoKCpjb3JyZWN0aW9uRmFjIDwgMTAwICYmIG5ld0ZhYyA8ICpjb3JyZWN0aW9uRmFjKSB8fAorICAgICAgICAgICgqY29ycmVjdGlvbkZhYyA+IDEwMCAmJiBuZXdGYWMgPiAqY29ycmVjdGlvbkZhYykpCisgICAgICAgICpjb3JyZWN0aW9uRmFjID0gKDg1ICogKmNvcnJlY3Rpb25GYWMgKyAxNSAqIG5ld0ZhYykgLyAxMDA7CisgICAgICBlbHNlCisgICAgICAgICpjb3JyZWN0aW9uRmFjID0gKDcwICogKmNvcnJlY3Rpb25GYWMgKyAzMCAqIG5ld0ZhYykgLyAxMDA7CisgICAgICAqY29ycmVjdGlvbkZhYyA9IG1pbigqY29ycmVjdGlvbkZhYywgMTE1KTsKKyAgICAgICpjb3JyZWN0aW9uRmFjID0gbWF4KCpjb3JyZWN0aW9uRmFjLCA4NSk7CisgICAgfQorICBlbHNlIHsKKyAgICAqY29ycmVjdGlvbkZhYyA9IDEwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBBZGp1c3RUaHJlc2hvbGRzCisqIGRlc2NyaXB0aW9uOiAgQWRqdXN0IHRocmVzaG9sZHMgdG8gdGhlIGRlc2lyZWQgYml0cmF0ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQWRqdXN0VGhyZXNob2xkcyhBREpfVEhSX1NUQVRFICAgKmFkalRoclN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIEFUU19FTEVNRU5UICAgICAqQWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKmNoQml0RGlzdHJpYnV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgIHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0VMRU1FTlQgICpxY09FLAorCQkJCQkgIEVMRU1FTlRfQklUUwkgICplbEJpdHMsCisJCQkJCSAgY29uc3QgV29yZDE2ICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICBtYXhCaXRGYWMpCit7CisgIFBFX0RBVEEgcGVEYXRhOyAgCisgIFdvcmQxNiBub1JlZFBlLCBncmFudGVkUGUsIGdyYW50ZWRQZUNvcnI7CisgIFdvcmQxNiBjdXJXaW5kb3dTZXF1ZW5jZTsKKyAgV29yZDE2IGJpdEZhY3RvcjsKKyAgV29yZDE2IGF2Z0JpdHMgPSAoZWxCaXRzLT5hdmVyYWdlQml0cyAtIChxY09FLT5zdGF0aWNCaXRzVXNlZCArIHFjT0UtPmFuY0JpdHNVc2VkKSk7CisgIFdvcmQxNiBiaXRyZXNCaXRzID0gZWxCaXRzLT5iaXRSZXNMZXZlbDsgCisgIFdvcmQxNiBtYXhCaXRyZXNCaXRzID0gZWxCaXRzLT5tYXhCaXRzOworICBXb3JkMTYgc2lkZUluZm9CaXRzID0gKHFjT0UtPnN0YXRpY0JpdHNVc2VkICsgcWNPRS0+YW5jQml0c1VzZWQpOworICBXb3JkMTYgY2g7CisgICAKKyAgcHJlcGFyZVNmYlBlKCZwZURhdGEsIHBzeU91dENoYW5uZWwsIGxvZ1NmYkVuZXJneSwgc2ZiTlJlbGV2YW50TGluZXMsIG5DaGFubmVscywgQWRqVGhyU3RhdGVFbGVtZW50LT5wZU9mZnNldCk7CisgICAKKyAgLyogcGUgd2l0aG91dCByZWR1Y3Rpb24gKi8KKyAgY2FsY1NmYlBlKCZwZURhdGEsIHBzeU91dENoYW5uZWwsIG5DaGFubmVscyk7CisgIG5vUmVkUGUgPSBwZURhdGEucGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKworICBjdXJXaW5kb3dTZXF1ZW5jZSA9IExPTkdfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgCisgIGlmIChuQ2hhbm5lbHMgPT0gMikgeworICAgICAgIAorICAgIGlmICgocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSA9PSBTSE9SVF9XSU5ET1cpIHx8CisgICAgICAgIChwc3lPdXRDaGFubmVsWzFdLndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykpIHsKKyAgICAgIGN1cldpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgY3VyV2luZG93U2VxdWVuY2UgPSBwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlOyAgICAgICAgICAgICAgICAgCisgIH0KKworCisgIC8qIGJpdCBmYWN0b3IgKi8KKyAgYml0RmFjdG9yID0gYml0cmVzQ2FsY0JpdEZhYyhiaXRyZXNCaXRzLCBtYXhCaXRyZXNCaXRzLCBub1JlZFBlKzUqc2lkZUluZm9CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cldpbmRvd1NlcXVlbmNlLCBhdmdCaXRzLCBtYXhCaXRGYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqVGhyU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50KTsKKworICAvKiBkZXNpcmVkIHBlICovCisgIGdyYW50ZWRQZSA9ICgoYml0RmFjdG9yICogYml0czJwZShhdmdCaXRzKSkgLyAxMDApOworCisgIC8qIGNvcnJlY3Rpb24gb2YgcGUgdmFsdWUgKi8KKyAgY2FsY1BlQ29ycmVjdGlvbigmKEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yKSwgCisgICAgICAgICAgICAgICAgICAgbWluKGdyYW50ZWRQZSwgbm9SZWRQZSksCisgICAgICAgICAgICAgICAgICAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QsIAorICAgICAgICAgICAgICAgICAgIEFkalRoclN0YXRlRWxlbWVudC0+ZHluQml0c0xhc3QpOworICBncmFudGVkUGVDb3JyID0gKGdyYW50ZWRQZSAqIEFkalRoclN0YXRlRWxlbWVudC0+cGVDb3JyZWN0aW9uRmFjdG9yKSAvIDEwMDsKKworICAgICAKKyAgaWYgKGdyYW50ZWRQZUNvcnIgPCBub1JlZFBlICYmIG5vUmVkUGUgPiBwZURhdGEub2Zmc2V0KSB7CisgICAgLyogY2FsYyB0aHJlc2hvbGQgbmVjZXNzYXJ5IGZvciBkZXNpcmVkIHBlICovCisgICAgYWRhcHRUaHJlc2hvbGRzVG9QZShwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1NmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBncmFudGVkUGVDb3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgJkFkalRoclN0YXRlRWxlbWVudC0+YWhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZBZGpUaHJTdGF0ZUVsZW1lbnQtPm1pblNuckFkYXB0UGFyYW0pOworICB9CisKKyAgLyogY2FsY3VsYXRlIHJlbGF0aXZlIGRpc3RyaWJ1dGlvbiAqLworICBmb3IgKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIFdvcmQxNiBwZU9mZnNEaWZmID0gcGVEYXRhLnBlIC0gcGVEYXRhLm9mZnNldDsKKyAgICBjaEJpdERpc3RyaWJ1dGlvbltjaF0gPSAyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAKKyAgICBpZiAocGVPZmZzRGlmZiA+IDApIHsKKyAgICAgIFdvcmQzMiB0ZW1wID0gMTAwMCAtIChuQ2hhbm5lbHMgKiAyMDApOworICAgICAgY2hCaXREaXN0cmlidXRpb25bY2hdID0gY2hCaXREaXN0cmlidXRpb25bY2hdICsNCisJCSAgKHRlbXAgKiBwZURhdGEucGVDaGFubmVsRGF0YVtjaF0ucGUpIC8gcGVPZmZzRGlmZjsKKyAgICB9CisgIH0KKworICAvKiBzdG9yZSBwZSAqLworICBxY09FLT5wZSA9IG5vUmVkUGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgLyogdXBkYXRlIGxhc3QgcGUgKi8KKyAgQWRqVGhyU3RhdGVFbGVtZW50LT5wZUxhc3QgPSBncmFudGVkUGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQWRqVGhyVXBkYXRlCisqIGRlc2NyaXB0aW9uOiAgc2F2ZSBkeW5CaXRzVXNlZCBmb3IgY29ycmVjdGlvbiBvZiBiaXRzMnBlIHJlbGF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBBZGpUaHJVcGRhdGUoQVRTX0VMRU1FTlQgKkFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBkeW5CaXRzVXNlZCkKK3sKKyAgQWRqVGhyU3RhdGVFbGVtZW50LT5keW5CaXRzTGFzdCA9IGR5bkJpdHNVc2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQXV0b0NvcnJlbGF0aW9uX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZWRkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL0F1dG9Db3JyZWxhdGlvbl92NS5zCkBAIC0wLDAgKzEsMTY3IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCitACUZpbGU6CQlBdXRvQ29ycmVsYXRpb25fdjUucw0KK0ANCitACUNvbnRlbnQ6CUF1dG9Db3JyZWxhdGlvbiBmdW5jdGlvbiBhcm12NSBhc3NlbWJsZQ0KK0ANCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KKw0KKw0KKwkuc2VjdGlvbiAudGV4dAkNCisJLmdsb2JhbAlBdXRvQ29ycmVsYXRpb24NCisNCitBdXRvQ29ycmVsYXRpb246DQorCXN0bWRiICAgICBzcCEsIHtyNCAtIHIxMSwgbHJ9DQorDQorICBzdWIgICAgIHIxMywgcjEzLCAjMjAgICAgICAgICAgICAgICAgICAgICANCisNCisgIG1vdiAgICAgcjUsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByNywgcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHI5LCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjIsIHIyLCBsc2wgIzE2ICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMCwgIzAgICAgICAgICAgDQorICBtb3YgICAgIHI0LCByMiwgYXNyICMxNiAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBibGUgICAgIEwxMzYgICAgICAgIA0KKwkNCisJY21wICAgICByNCwgIzggDQorCW1vdgkJICByMiwgIzAgDQorICBibHQgICAgIEwxMzMgICANCisNCisJc3ViICAgICByMTIsIHI0LCAjOCAgICAgICAgICAgICAgICANCitMMTMyOiAgDQorICBsZHIgICAgIHI2LCBbcjUsIHIyXSAgDQorCWFkZAkJICByMiwgcjIsICM0DQorCXNtdWxiYiAgcjMsIHI2LCByNg0KKwlsZHIgICAgIHIxLCBbcjUsIHIyXSANCisJc211bHR0CXIxMCwgcjYsIHI2DQorCW1vdgkJICByMywgcjMsIGFzciAjOQ0KKwlzbXVsYmIJcjYsIHIxLCByMQ0KKwltb3YJCSAgcjEwLCByMTAsIGFzciAjOQ0KKwlxYWRkCSAgcjAsIHIwLCByMw0KKwlzbXVsdHQJcjExLCByMSwgcjENCisJYWRkICAgICByMiwgcjIsICM0DQorCXFhZGQJICByMCwgcjAsIHIxMA0KKwltb3YJCSAgcjYsIHI2LCBhc3IgIzkNCisJbW92CQkgIHIxMSwgcjExLCBhc3IgIzkNCisJbGRyCQkgIHIxLCBbcjUsIHIyXQ0KKwlxYWRkCSAgcjAsIHIwLCByNg0KKwlzbXVsYmIJcjEwLCByMSwgcjENCisJc211bHR0CXI2LCByMSwgcjENCisJcWFkZAkgIHIwLCByMCwgcjExDQorCW1vdgkJICByMTAsIHIxMCwgYXNyICM5DQorCW1vdgkJICByNiwgcjYsIGFzciAjOQ0KKwlxYWRkCSAgcjAsIHIwLCByMTANCisJYWRkICAgICByMiwgcjIsICM0DQorCWFkZCAgICAgcjgsIHI4LCAjNg0KKw0KKwlxYWRkCSAgcjAsIHIwLCByNg0KKwljbXAgICAgIHI4LCByMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBibHQgICAgIEwxMzIJICAgICAgICAgICAgICAgICAgDQorTDEzMzogICAgICAgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHI2LCBbcjUsIHIyXSAgICAgICAgICAgICAgICAgICAgICANCisgIG11bCAgICAgcjEwLCByNiwgcjYgICANCisJYWRkICAgICByMiwgcjIsICMyICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIxLCByMTAsIGFzciAjOSAgICAgICAgICAgICAgICAgICAgDQorICBxYWRkICAgIHIwLCByMCwgcjENCitMMTM0OiAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGFkZCAgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByOCwgcjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBibHQgICAgIEwxMzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzNTogICAgICAgICAgICAgICAgICAgICAgICANCitMMTM2OiAgICAgICAgICAgICAgICAgICAgICAgICANCisgIHN0ciAgICAgcjAsIFtyNywgIzBdICAgICAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByMCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBiZXEgICAgIEwxMzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzNzogICAgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIyLCByOSwgbHNsICMxNiAgICAgICAgICAgICAgICAgICANCisJbW92ICAgICByOCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMiwgcjIsIGFzciAjMTYgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHIyLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJsZSAgICAgTDEzMTkgICAgICAgICAgICAgICAgICAgICAgICAgICANCitMMTM4OiAgICAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzk6ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgc3ViICAgICByNCwgcjQsICMxICAgICAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIxNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjMsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBibGUgICAgIEwxMzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTA6ICAgICAgICAgICAgICAgICAgICAgICANCisgIGNtcCAgICAgcjQsICM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgYWRkbHQgICByNiwgcjUsIHI4LCBsc2wgIzEgICAgICAgICAgICAgICAgDQorICBibHQgICAgIEwxMzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTE6ICAgICAgICAgICAgICAgICAgICAgICAgDQorICBhZGQgICAgIHI2LCByNSwgcjgsIGxzbCAjMSAgICAgICAgICAgICAgICANCisgIHN1YiAgICAgcjEyLCByNCwgIzYgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgc3RyICAgICByOCwgW3IxMywgIzhdICAgICAgICAgICAgICAgICAgICAgDQorICBzdHIgICAgIHI3LCBbcjEzLCAjNF0gICAgICAgICAgICAgICAgICAgICANCitMMTMxMjogICAgICAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjEsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByNywgW3I2LCByMV0gICAgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHIxMCwgW3I1LCByMV0gIA0KKyAgYWRkICAgICByOCwgcjEsIHI2IA0KKwlhZGQgICAgIHI5LCByNSwgcjEgICAgICAgICAgICAgICAgICAgICAgIA0KKwltdWwgICAgIHI3LCByMTAsIHI3DQorICBsZHJzaCAgIHIxLCBbcjgsICMyXSANCisJbGRyc2ggICByMTAsIFtyOCwgIzRdICAgDQorICBhZGQgICAgIHI3LCByMTQsIHI3LCBhc3IgIzkgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjAsIFtyOSwgIzJdICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjExLCBbcjksICM0XSAgICAgICAgICAgICAgICAgICANCisgIG11bCAgICAgcjEsIHIwLCByMSAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByMTQsIFtyOCwgIzZdICAgICAgICAgICAgICAgICAgICAgDQorICBtdWwgICAgIHIxMCwgcjExLCByMTAgICAgICAgICAgDQorCWFkZCAgICAgcjcsIHI3LCByMSwgYXNyICM5ICAgICAgICAgICAgDQorICBsZHJzaCAgIHI4LCBbcjgsICM4XSANCisJYWRkICAgICByMywgcjMsICM1DQorCWxkcnNoICAgcjExLCBbcjksICM2XSAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByMSwgW3I5LCAjOF0gICAgICAgICAgICAgICAgICAgICAgDQorICBtdWwgICAgIHIxNCwgcjExLCByMTQgICAgICAgICAgICAgICAgICAgICANCisgIGFkZCAgICAgcjcsIHI3LCByMTAsIGFzciAjOSAgICAgICANCisgIG11bCAgICAgcjEsIHIxLCByOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBhZGQgICAgIHIxNCwgcjcsIHIxNCwgYXNyICM5ICAgICAgICAgICAgICANCisJY21wICAgICByMywgcjEyIA0KKyAgYWRkICAgICByMTQsIHIxNCwgcjEsIGFzciAjOSAgICAgICAgICAgICAgDQorICBibGUgICAgIEwxMzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTM6ICAgICAgICAgICAgICAgICAgICAgICAgDQorICBsZHIgICAgIHI4LCBbcjEzLCAjOF0gICAgICAgICAgICAgICAgICAgICANCisgIGxkciAgICAgcjcsIFtyMTMsICM0XSAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzE0OiAgICAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzE1OiAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbW92ICAgICByMTIsIHIzLCBsc2wgIzEgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHI5LCBbcjYsIHIxMl0gICAgICAgICAgICAgICAgICAgICANCisgIGxkcnNoICAgcjEyLCBbcjUsIHIxMl0gICAgICAgICAgICAgICAgICAgIA0KKyAgYWRkICAgICByMywgcjMsICMxICAgICAgICAgICAgICAgICAgICAgICAgDQorICBjbXAgICAgIHIzLCByNCAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIG11bCAgICAgcjEyLCByMTIsIHI5ICAgICAgICAgICAgICAgICAgICAgIA0KKyAgYWRkICAgICByMTQsIHIxNCwgcjEyLCBhc3IgIzkgICAgICAgICAgICAgDQorICBibHQgICAgIEwxMzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTY6ICAgICAgICAgICAgICAgICAgICAgICAgDQorTDEzMTc6ICAgICAgICAgICAgICAgICAgICAgICAgDQorICBzdHIgICAgIHIxNCwgW3I3LCArcjgsIGxzbCAjMl0gICAgICAgICAgICANCisgIGFkZCAgICAgcjgsIHI4LCAjMSAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByOCwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBibHQgICAgIEwxMzkgICANCisJICAgICAgICAgICAgICAgICAgICAgICAgIA0KK0wxMzE5Og0KK0wxMzIwOg0KKwlhZGQgICAgIHIxMywgcjEzLCAjMjAgICAgICAgICAgICAgICAgICAgIA0KKwlsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30NCisNCisJQEVORFAgIEAgfEF1dG9Db3JyZWxhdGlvbnwNCisJLmVuZA0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9DYWxjV2luZG93RW5lcmd5X3Y1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5N2U5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvQ2FsY1dpbmRvd0VuZXJneV92NS5zCkBAIC0wLDAgKzEsMTEyIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCitACUZpbGU6CQlDYWxjV2luZG93RW5lcmd5X3Y1LnMNCitADQorQAlDb250ZW50OglDYWxjV2luZG93RW5lcmd5IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorCQ0KKwkuZ2xvYmFsCUNhbGNXaW5kb3dFbmVyZ3kNCisNCitDYWxjV2luZG93RW5lcmd5Og0KKwlzdG1kYiAgIHNwISwge3I0IC0gcjExLCBscn0NCisJc3ViICAgICByMTMsIHIxMywgIzIwIA0KKw0KKyAgbW92ICAgICByMywgcjMsIGxzbCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWxkciAgICAgcjEwLCBbcjAsICMxNjhdICAgICAgICAgICAgICAgICAgICBAIHN0YXRlczAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXTsNCisgIG1vdiAgICAgcjMsIHIzLCBhc3IgIzE2IA0KKwlsZHIgICAgIHIxMSwgW3IwLCAjMTcyXSAgICAgICAgICAgICAgICAgICAgQCBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07DQorDQorCW1vdiAgICAgcjIsIHIyLCBsc2wgIzE2DQorCWxkciAgICAgcjEyLCBoaVBhc3NDb2VmZiAgICAgICAgICAgICAgICAgICBAIENvZWZmMCA9IGhpUGFzc0NvZWZmWzBdOyAgICAgIA0KKyAgbW92ICAgICByMiwgcjIsIGFzciAjMTYNCisJbGRyICAgICByMTQsIGhpUGFzc0NvZWZmICsgNAkJCSAgICAgICAgIEAgQ29lZmYxID0gaGlQYXNzQ29lZmZbMV07DQorCQ0KKwltb3YJCQlyOCwgIzAJCQkJCQkJICAgICAgICAgICAgICAgQCB3PTANCisJbW92CQkJcjUsICMwCQkJCQkJCSAgICAgICAgICAgICAgIEAgd09mZnNldCA9IDA7DQorCQ0KK0JMT0NLX0JFR0lOOg0KKwltb3YJCQlyNiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgYWNjdVVFID0gMDsgDQorCW1vdgkJCXI3LCAjMAkJCQkJCQkJICAgICAgICAgICAgIEAgYWNjdUZFID0gMDsgDQorCW1vdgkJCXI0LCAjMAkJCQkJCQkgICAgICAgICAgICAgICBAIGk9MA0KKwkJICAgICAgICAgICAgICAgICAgIA0KKwlzdHIJCQlyOCwgW3IxMywgIzRdCQ0KKwlzdHIJCQlyMCwgW3IxMywgIzhdCQ0KKwlzdHIJCQlyMywgW3IxMywgIzEyXQ0KKwkNCitFTkVSR1lfQkVHOgkNCisJbW92ICAgICByOSwgcjUsIGxzbCAjMSAgDQorCWxkcnNoICAgcjksIFtyMSwgcjldCQkJCQkJCQkJCQlAIHRlbXBVbmZpbHRlcmVkID0gdGltZVNpZ25hbFt0aWR4XTsNCisNCisJYWRkCQkJcjUsIHI1LCByMgkJCQkJCQkJCQkJCUAgdGlkeCA9IHRpZHggKyBjaEluY3JlbWVudDsNCisJDQorCXNtdWx3YglyMywgcjE0LCByOQkJCQkJCQkJCQkJCUAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsJDQorCXNtdWxsCQlyMCwgcjgsIHIxMiwgcjExCQkJCQkJCQkJQCBhY2N1MiA9IGZpeG11bCggQ29lZmYwLCBzdGF0ZXMxICk7DQorCQ0KKwltb3YJCQlyMywgcjMsIGxzbCAjMQ0KKwltb3YJCQlyOCwgcjgsIGxzbCAjMQ0KKw0KKwlzdWIJCQlyMCwgcjMsIHIxMAkJCQkJCQkJCQkJCUAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlczA7CQ0KKwlzdWIJCQlyOCwJcjAsIHI4CQkJCQkJCQkJCQkJQCBvdXQgPSBhY2N1MyAtIGFjY3UyOw0KKw0KKwltb3YJCSAgcjEwLCByMwkJCQkJCQkJCQkJCQkJQCBzdGF0ZXMwID0gYWNjdTE7DQorCW1vdgkJICByMTEsIHI4CQkJCQkJCQkJCQkJCQlAIHN0YXRlczEgPSBvdXQ7ICANCisJDQorCW11bAkJICByMywgcjksIHI5CQ0KKwltb3YgICAgIHI4LCByOCwgYXNyICMxNg0KKwkNCisJYWRkCQkgIHI0LCByNCwgIzENCisJYWRkICAgICByNiwgcjYsIHIzLCBhc3IgIzcNCisNCisJbXVsCQkgIHI5LCByOCwgcjgJDQorCWxkcgkJICByMywgW3IxMywgIzEyXQ0KKw0KKwlhZGQJCSAgcjcsIHI3LCByOSwgYXNyICM3DQorCQkNCisJY21wICAgICByNCwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBibHQgICAgIEVORVJHWV9CRUcgICAgICAgDQorCQ0KKwlsZHIJCSAgcjAsIFtyMTMsICM4XQ0KKwlsZHIJCSAgcjgsIFtyMTMsICM0XQ0KKwkNCitFTkVSR1lfRU5EOg0KKwlhZGQJCSAgcjQsIHIwLCByOCwgbHNsICMyDQorDQorCXN0ciAgICAgcjYsIFtyNCwgIzcyXSAgICAgICAgIA0KKwlhZGQJCSAgcjgsIHI4LCAjMQkgICAgICAgICAgIA0KKyAgc3RyICAgICByNywgW3I0LCAjMTM2XSAgICAgICAgICAgICAgICAgICANCisNCisJY21wCQkgIHI4LCAjOA0KKwlibHQJCSAgQkxPQ0tfQkVHSU4gICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorQkxPQ0tfRU5EOg0KKwlzdHIgICAgIHIxMCwgW3IwLCAjMTY4XSAgICAgICAgICAgICAgICAgICAgDQorICBzdHIgICAgIHIxMSwgW3IwLCAjMTcyXSAgICAgICAgICAgICAgICAgICAgDQorICBtb3YgICAgIHIwLCAjMSAgICAgICAgICAgIA0KKwkgICAgICAgICAgICAgICAgDQorICBhZGQgICAgIHIxMywgcjEzLCAjMjAgICANCisJbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9ICAgICAgICAgICAgICAgICAgDQorDQoraGlQYXNzQ29lZmY6DQorCS53b3JkIDB4YmVjOGI0MzkNCisJLndvcmQJMHg2MDlkNDk1Mg0KKwkJDQorCUBFTkRQDQorCS5lbmQNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1ByZVBvc3RNRENUX3Y1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkM2VkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUHJlUG9zdE1EQ1RfdjUucwpAQCAtMCwwICsxLDEzMSBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorQAlGaWxlOgkJUHJlUG9zdE1EQ1RfdjUucw0KK0ANCitACUNvbnRlbnQ6CXByZW1kY3QgYW5kIHBvc3RtZGN0IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUHJlTURDVA0KKw0KK1ByZU1EQ1Q6DQorCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0NCisJDQorCWFkZCAgICAgICAgIHI5LCByMCwgcjEsIGxzbCAjMg0KKwlzdWIgICAgICAgICByMywgcjksICM4DQorDQorCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyDQorCWJlcSAgICAgICAgIFByZU1EQ1RfRU5EDQorCQ0KK1ByZU1EQ1RfTE9PUDoNCisJbGRyCQkJCQlyOCwgW3IyXSwgIzQNCisJbGRyCQkJCQlyOSwgW3IyXSwgIzQNCisJDQorCWxkcmQJCQkJcjQsIFtyMF0NCisJbGRyZAkJCQlyNiwgW3IzXQ0KKwkNCisJc211bGwJCQkJcjE0LCByMTEsIHI0LCByOAkJCQkJQCBNVUxISUdIKHRyMSwgY29zYSkNCisJc211bGwgICAgCQkJcjEwLCByMTIsIHI3LCByOAkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkNCisJCQ0KKwlzbXVsbAkJCQlyMTQsIHI4LCByNywgcjkJCQkJCQlAIE1VTEhJR0godGkxLCBzaW5hKQ0KKwlzbXVsbAkJCQlyNywgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQkNCisJCQ0KKwlhZGQJCQkJCXIxMSwgcjExLCByOAkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQAkNCisJc3ViCQkJCQlyNywgcjEyLCByMTAJCQkJCQlAIE1VTEhJR0godGkxLCBjb3NhKSAtIE1VTEhJR0godHIxLCBzaW5hKQ0KKwkNCisJbGRyCQkJCQlyOCwgW3IyXSwgIzQNCisJbGRyCQkJCQlyOSwgW3IyXSwgIzQNCisJDQorCXNtdWxsCQkJCXIxNCwgcjQsIHI2LCByOAkJCQkJCUAgTVVMSElHSCh0cjIsIGNvc2EpDQorCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNSwgcjgJCQkJCUAgTVVMSElHSCh0aTIsIGNvc2EpDQorCQkNCisJc211bGwJCQkJcjE0LCByOCwgcjUsIHI5CQkJCQkJQCBNVUxISUdIKHRpMiwgc2luYSkNCisJc211bGwJCQkJcjUsIHIxMCwgcjYsIHI5CQkJCQkJQCBNVUxISUdIKHRyMiwgc2luYSkNCisJDQorCWFkZAkJCQkJcjgsIHI4LCByNA0KKwlzdWIJCQkJCXI5LCByMTIsIHIxMA0KKwkNCisJbW92CQkJCQlyNiwgcjExCQkNCisNCisJc3RyZAkJCQlyNiwgW3IwXQkNCisJc3RyZAkJCQlyOCwgW3IzXQ0KKwkNCisJc3VicwkJCQlyMSwgcjEsICMxDQorCXN1YgkJCQkJcjMsIHIzLCAjOA0KKwlhZGQgCQkJCXIwLCByMCwgIzgNCisJYm5lCQkJCQlQcmVNRENUX0xPT1ANCisNCitQcmVNRENUX0VORDoNCisJbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKwlARU5EUCAgQCB8UHJlTURDVHwNCisJDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUG9zdE1EQ1QNCisNCitQb3N0TURDVDoNCisJc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwkNCisJYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyDQorCXN1YiAgICAgICAgIHIzLCByOSwgIzgNCisNCisJbW92cyAgICAgICAgcjEsIHIxLCBhc3IgIzINCisJYmVxICAgICAgICAgUG9zdE1EQ1RfRU5EDQorCQ0KK1Bvc3RNRENUX0xPT1A6DQorCWxkcgkJCQkJcjgsIFtyMl0sICM0CQkJCQkNCisJbGRyCQkJCQlyOSwgW3IyXSwgIzQNCisJDQorCWxkcmQJCQkJcjQsIFtyMF0NCisJbGRyZAkJCQlyNiwgW3IzXQ0KKwkNCisJc211bGwJCQkJcjE0LCByMTEsIHI0LCByOAkJCQkJQCBNVUxISUdIKHRyMSwgY29zYSkNCisJc211bGwgICAgCQkJcjEwLCByMTIsIHI1LCByOAkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkNCisJCQ0KKwlzbXVsbAkJCQlyMTQsIHI4LCByNSwgcjkJCQkJCQlAIE1VTEhJR0godGkxLCBzaW5hKQ0KKwlzbXVsbAkJCQlyNSwgcjEwLCByNCwgcjkJCQkJCQlAIE1VTEhJR0godHIxLCBzaW5hKQkNCisJCQ0KKwlhZGQJCQkJCXI0LCByMTEsIHI4CQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpQAkNCisJc3ViCQkJCQlyMTEsIHIxMCwgcjEyCQkJCQkJQCBNVUxISUdIKHRpMSwgY29zYSkgLSBNVUxISUdIKHRyMSwgc2luYSlADQorCQ0KKwlsZHIJCQkJCXI4LCBbcjJdLCAjNAkJCQkJCUANCisJbGRyCQkJCQlyOSwgW3IyXSwgIzQNCisJDQorCXNtdWxsCQkJCXIxNCwgcjUsIHI2LCByOAkJCQkJCUAgTVVMSElHSCh0cjIsIGNvc2EpDQorCXNtdWxsICAgIAkJCXIxMCwgcjEyLCByNywgcjgJCQkJCUAgTVVMSElHSCh0aTIsIGNvc2EpDQorCQkNCisJc211bGwJCQkJcjE0LCByOCwgcjcsIHI5CQkJCQkJQCBNVUxISUdIKHRpMiwgc2luYSkNCisJc211bGwJCQkJcjcsIHIxMCwgcjYsIHI5CQkJCQkJQCBNVUxISUdIKHRyMiwgc2luYSkNCisJDQorCWFkZAkJCQkJcjYsIHI4LCByNQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdHIyKSArIE1VTEhJR0goc2luYiwgdGkyKUANCisJc3ViCQkJCQlyNSwgcjEwLCByMTIJCQkJCQlAIE1VTEhJR0goc2luYiwgdHIyKSAtIE1VTEhJR0goY29zYiwgdGkyKUANCisJDQorCW1vdgkJCQkJcjcsIHIxMQkJCQkNCisNCisJc3RyZAkJCQlyNCwgW3IwXQ0KKwlzdHJkCQkJCXI2LCBbcjNdDQorCQ0KKwlzdWJzCQkJCXIxLCByMSwgIzENCisJc3ViCQkJCQlyMywgcjMsICM4DQorCWFkZCAJCQkJcjAsIHIwLCAjOA0KKwlibmUJCQkJCVBvc3RNRENUX0xPT1ANCisNCitQb3N0TURDVF9FTkQ6DQorCWxkbWlhICAgICAgIHNwISwge3I0IC0gcjExLCBwY30NCisJQEVORFAgIEAgfFBvc3RNRENUfA0KKwkuZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY1RS9SNFI4Rmlyc3RfdjUucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwZGFmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUjRSOEZpcnN0X3Y1LnMKQEAgLTAsMCArMSwyNTIgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCVI0UjhGaXJzdF92NS5zDQorQA0KK0AJQ29udGVudDoJUmFkaXg4Rmlyc3QgYW5kIFJhZGl4NEZpcnN0IGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUmFkaXg0Rmlyc3QNCisNCitSYWRpeDRGaXJzdDoNCisJc3RtZGIgICAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwkNCisJbW92cwkJCQlyMTAsIHIxDQorCW1vdgkJCQkJcjExLCByMA0KKwliZXEJCQkJCVJhZGl4NEZpcnN0X0VORA0KKwkJDQorUmFkaXg0Rmlyc3RfTE9PUDoNCisJbGRyZAkJCQlyMCwgW3IxMV0NCisJbGRyZAkJCQlyMiwgW3IxMSwgIzhdDQorCWxkcmQJCQkJcjQsIFtyMTEsICMxNl0NCisJbGRyZAkJCQlyNiwgW3IxMSwgIzI0XQ0KKwkNCisJYWRkCQkJCQlyOCwgcjAsIHIyDQorCWFkZAkJCQkJcjksIHIxLCByMw0KKwkNCisJc3ViCQkJCQlyMCwgcjAsIHIyDQorCXN1YgkJCQkJcjEsIHIxLCByMw0KKwkNCisJYWRkCQkJCQlyMiwgcjQsIHI2DQorCWFkZAkJCQkJcjMsIHI1LCByNw0KKwkNCisJc3ViCQkJCQlyNCwgcjQsIHI2DQorCXN1YgkJCQkJcjUsIHI1LCByNw0KKwkNCisJYWRkCQkJCQlyNiwgcjgsIHIyDQorCWFkZAkJCQkJcjcsIHI5LCByMw0KKwkNCisJc3ViCQkJCQlyOCwgcjgsIHIyDQorCXN1YgkJCQkJcjksIHI5LCByMw0KKwkNCisJYWRkCQkJCQlyMiwgcjAsIHI1DQorCXN1YgkJCQkJcjMsIHIxLCByNA0KKwkNCisJc3ViCQkJCQlyMCwgcjAsIHI1DQorCWFkZAkJCQkJcjEsIHIxLCByNA0KKwkNCisJc3RyZAkJCQlyNiwgW3IxMV0NCisJc3RyZAkJCQlyMiwgW3IxMSwgIzhdDQorCXN0cmQJCQkJcjgsIFtyMTEsICMxNl0NCisJc3RyZAkJCQlyMCwgW3IxMSwgIzI0XQ0KKwkNCisJc3VicwkJCQlyMTAsIHIxMCwgIzENCisJYWRkCQkJCQlyMTEsIHIxMSwgIzMyDQorCWJuZQkJCQkJUmFkaXg0Rmlyc3RfTE9PUA0KKw0KK1JhZGl4NEZpcnN0X0VORDoNCisJbGRtaWEgICAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKwlARU5EUCAgQCB8UmFkaXg0Rmlyc3R8DQorCQ0KKwkuc2VjdGlvbiAudGV4dA0KKwkuZ2xvYmFsCVJhZGl4OEZpcnN0DQorDQorUmFkaXg4Rmlyc3Q6DQorCXN0bWRiICAgICAgIHNwISwge3I0IC0gcjExLCBscn0NCisJc3ViICAgICAgICAgc3AsIHNwLCAjMHgyNA0KKwkNCisJbW92CQkJCSAgcjEyLCByMQ0KKwltb3YJCQkJCXIxNCwgcjANCisJY21wCQkJCQlyMTIsICMwDQorCWJlcQkJCQkJUmFkaXg4Rmlyc3RfRU5EDQorCQ0KK1JhZGl4OEZpcnN0X0xPT1A6DQorCWxkcmQJCQkJcjAsIFtyMTRdCQkNCisJbGRyZAkJCQlyMiwgW3IxNCwgIzhdDQorCWxkcmQJCQkJcjQsIFtyMTQsICMxNl0NCisJbGRyZAkJCQlyNiwgW3IxNCwgIzI0XQ0KKwkNCisJYWRkCQkJCQlyOCwgcjAsIHIyCQkJCQlAIHIwID0gYnVmWzBdICsgYnVmWzJdQA0KKwlhZGQJCQkJCXI5LCByMSwgcjMJCQkJCUAgaTAgPSBidWZbMV0gKyBidWZbM11ADQorCQ0KKwlzdWIJCQkJCXIwLCByMCwgcjIJCQkJCUAgcjEgPSBidWZbMF0gLSBidWZbMl1ADQorCXN1YgkJCQkJcjEsIHIxLCByMwkJCQkJQCBpMSA9IGJ1ZlsxXSAtIGJ1ZlszXUANCisJDQorCWFkZAkJCQkJcjIsIHI0LCByNgkJCQkJQAlyMiA9IGJ1Zls0XSArIGJ1Zls2XUANCisJYWRkCQkJCQlyMywgcjUsIHI3CQkJCQlAIGkyID0gYnVmWzVdICsgYnVmWzddQA0KKwkNCisJc3ViCQkJCQlyNCwgcjQsIHI2CQkJCQlACXIzID0gYnVmWzRdIC0gYnVmWzZdQA0KKwlzdWIJCQkJCXI1LCByNSwgcjcJCQkJCUAgaTMgPSBidWZbNV0gLSBidWZbN11ADQorCQ0KKwlhZGQJCQkJCXI2LCByOCwgcjIJCQkJCUAgcjQgPSAocjAgKyByMikgPj4gMUANCisJYWRkCQkJCQlyNywgcjksIHIzCQkJCQlAIGk0ID0gKGkwICsgaTIpID4+IDFADQorCQ0KKwlzdWIJCQkJCXI4LCByOCwgcjIJCQkJCUAJcjUgPSAocjAgLSByMikgPj4gMUANCisJc3ViCQkJCQlyOSwgcjksIHIzCQkJCQlAIGk1ID0gKGkwIC0gaTIpID4+IDFADQorCQ0KKwlzdWIJCQkJCXIyLCByMCwgcjUJCQkJCUAgcjYgPSAocjEgLSBpMykgPj4gMUANCisJYWRkCQkJCQlyMywgcjEsIHI0CQkJCQlAIGk2ID0gKGkxICsgcjMpID4+IDFADQorCQ0KKwlhZGQJCQkJCXIwLCByMCwgcjUJCQkJCUAgcjcgPSAocjEgKyBpMykgPj4gMUANCisJc3ViCQkJCQlyMSwgcjEsIHI0CQkJCQlAIGk3ID0gKGkxIC0gcjMpID4+IDFADQorCQ0KKwltb3YJCQkJCXI2LCByNiwgYXNyICMxCQkJQA0KKwltb3YJCQkJCXI3LCByNywgYXNyICMxCQkJQA0KKwkNCisJbW92CQkJCQlyOCwgcjgsIGFzciAjMQ0KKwltb3YJCQkJCXI5LCByOSwgYXNyICMxDQorCQ0KKwltb3YJCQkJCXIyLCByMiwgYXNyICMxDQorCW1vdgkJCQkJcjMsIHIzLCBhc3IgIzENCisJDQorCW1vdgkJCQkJcjAsIHIwLCBhc3IgIzENCisJbW92CQkJCQlyMSwgcjEsIGFzciAjMQkNCisJDQorCXN0cgkJCQkJcjYsIFtzcF0NCisJc3RyCQkJCQlyNywgW3NwLCAjNF0NCisJDQorCXN0cgkJCQkJcjgsIFtzcCwgIzhdDQorCXN0cgkJCQkJcjksIFtzcCwgIzEyXQ0KKwkNCisJc3RyCQkJCQlyMiwgW3NwLCAjMTZdDQorCXN0cgkJCQkJcjMsIFtzcCwgIzIwXQkNCisJDQorCXN0cgkJCQkJcjAsIFtzcCwgIzI0XQ0KKwlzdHIJCQkJCXIxLCBbc3AsICMyOF0JDQorCQ0KKwlsZHJkCQkJCXIyLCBbcjE0LCAjMzJdCQkNCisJbGRyZAkJCQlyNCwgW3IxNCwgIzQwXQ0KKwlsZHJkCQkJCXI2LCBbcjE0LCAjNDhdDQorCWxkcmQJCQkJcjgsIFtyMTQsICM1Nl0NCisJDQorCWFkZAkJCQkJcjAsIHIyLCByNAkJCQkJQCByMCA9IGJ1ZlsgOF0gKyBidWZbMTBdQA0KKwlhZGQJCQkJCXIxLCByMywgcjUJCQkJCUAgaTAgPSBidWZbIDldICsgYnVmWzExXUANCisJDQorCXN1YgkJCQkJcjIsIHIyLCByNAkJCQkJQCByMSA9IGJ1ZlsgOF0gLSBidWZbMTBdQA0KKwlzdWIJCQkJCXIzLCByMywgcjUJCQkJCUAgaTEgPSBidWZbIDldIC0gYnVmWzExXUANCisJDQorCWFkZAkJCQkJcjQsIHI2LCByOAkJCQkJQCByMiA9IGJ1ZlsxMl0gKyBidWZbMTRdQA0KKwlhZGQJCQkJCXI1LCByNywgcjkJCQkJCUAgaTIgPSBidWZbMTNdICsgYnVmWzE1XUANCisJDQorCXN1YgkJCQkJcjYsIHI2LCByOAkJCQkJQCByMyA9IGJ1ZlsxMl0gLSBidWZbMTRdQA0KKwlzdWIJCQkJCXI3LCByNywgcjkJCQkJCUAJaTMgPSBidWZbMTNdIC0gYnVmWzE1XUANCisJDQorCWFkZAkJCQkJcjgsIHIwLCByNAkJCQkJQCB0MCA9IChyMCArIHIyKQ0KKwlhZGQJCQkJCXI5LCByMSwgcjUJCQkJCUAgdDEgPSAoaTAgKyBpMikNCisJDQorCXN1YgkJCQkJcjAsIHIwLCByNAkJCQkJQCB0MiA9IChyMCAtIHIyKQ0KKwlzdWIJCQkJCXIxLCByMSwgcjUJCQkJCUAgdDMgPSAoaTAgLSBpMikNCisJDQorCW1vdgkJCQkJcjgsIHI4LCBhc3IgIzENCisJbGRyCQkJCQlyNCwgW3NwXQ0KKwkNCisJbW92CQkJCQlyOSwgcjksIGFzciAjMQ0KKwlsZHIJCQkJCXI1LCBbc3AsICM0XQ0KKwkNCisJbW92CQkJCQlyMCwgcjAsIGFzciAjMQkJDQorCW1vdgkJCQkJcjEsIHIxLCBhc3IgIzENCisJDQorCWFkZAkJCQkJcjEwLCByNCwgcjgJCQkJCUAgYnVmWyAwXSA9IHI0ICsgdDBADQorCWFkZAkJCQkJcjExLCByNSwgcjkJCQkJCUAgYnVmWyAxXSA9IGk0ICsgdDFADQorCQ0KKwlzdWIJCQkJCXI0LCAgcjQsIHI4CQkJCQlAIGJ1ZlsgOF0gPSByNCAtIHQwQA0KKwlzdWIJCQkJCXI1LCAgcjUsIHI5CQkJCQlACWJ1ZlsgOV0gPSBpNCAtIHQxQA0KKwkNCisgCXN0cmQJCQkJcjEwLCBbcjE0XQ0KKyAJc3RyZAkJCQlyNCwgIFtyMTQsICMzMl0NCisgCQ0KKyAJbGRyCQkJCQlyMTAsIFtzcCwgIzhdDQorIAlsZHIJCQkJCXIxMSwgW3NwLCAjMTJdDQorIAkNCisgCWFkZAkJCQkJcjQsIHIxMCwgcjEJCQkJCUAgYnVmWyA0XSA9IHI1ICsgdDNADQorIAlzdWIJCQkJCXI1LCByMTEsIHIwCQkJCQlACWJ1ZlsgNV0gPSBpNSAtIHQyQA0KKyAJDQorIAlzdWIJCQkJCXIxMCwgcjEwLCByMQkJCQlAIGJ1ZlsxMl0gPSByNSAtIHQzQA0KKyAJYWRkCQkJCQlyMTEsIHIxMSwgcjAJCQkJQCBidWZbMTNdID0gaTUgKyB0MkANCisgCQ0KKyAJc3RyZAkJCQlyNCwgIFtyMTQsICMxNl0NCisgCXN0cmQJCQkJcjEwLCBbcjE0LCAjNDhdDQorIAkNCisgCXN1YgkJCQkJcjAsIHIyLCByNwkJCQkJQCByMCA9IHIxIC0gaTNADQorIAlhZGQJCQkJCXIxLCByMywgcjYJCQkJCUAgaTAgPSBpMSArIHIzQA0KKyANCisgIGxkcgkJCQkJcjExLCBEQVRBVGFiDQorIAkNCisgCWFkZAkJCQkJcjIsIHIyLCByNwkJCQkJQCByMiA9IHIxICsgaTNADQorIAlzdWIJCQkJCXIzLCByMywgcjYJCQkJCUAgaTIgPSBpMSAtIHIzQA0KKyAJDQorCXN1YgkJCQkJcjQsIHIwLCByMQkJCQkJQCByMCAtIGkwDQorCWFkZAkJCQkJcjUsIHIwLCByMQkJCQkJQCByMCArIGkwDQorCQ0KKwlzdWIJCQkJCXIwLCByMiwgcjMJCQkJCUAgcjIgLSBpMg0KKwlhZGQJCQkJCXIxLCByMiwgcjMJCQkJCUAgcjIgKyBpMg0KKwkNCisJc211bGwJCQkJcjgsIHI2LCByNCwgcjExCQkJCQkJCQkNCisJc211bGwJCQkJcjksIHI3LCByNSwgcjExCQkJCQkJCQkNCisJDQorCWxkcgkJCQkJcjIsIFtzcCwgIzE2XQ0KKwlsZHIJCQkJCXIzLCBbc3AsICMyMF0NCisJDQorCXNtdWxsCQkJCXI4LCByNCwgcjAsIHIxMQkJCQkJCQkJDQorCXNtdWxsCQkJCXI5LCByNSwgcjEsIHIxMQkJCQkJCQkJDQorCQ0KKwlsZHIJCQkJCXIxMCwgW3NwLCAjMjRdDQorCWxkcgkJCQkJcjExLCBbc3AsICMyOF0NCisJDQorCXN1YgkJCQkJcjgsIHIyLCByNg0KKwlzdWIJCQkJCXI5LCByMywgcjcNCisJDQorCWFkZAkJCQkJcjIsIHIyLCByNg0KKwlhZGQJCQkJCXIzLCByMywgcjcNCisJDQorCWFkZAkJCQkJcjYsIHIxMCwgcjUNCisJc3ViCQkJCQlyNywgcjExLCByNA0KKwkNCisJc3ViCQkJCQlyMCwgcjEwLCByNQ0KKwlhZGQJCQkJCXIxLCByMTEsIHI0DQorCQ0KKwlzdHJkCQkJCXI2LCBbcjE0LCAjOF0NCisJc3RyZAkJCQlyOCwgW3IxNCwgIzI0XQ0KKwlzdHJkCQkJCXIwLCBbcjE0LCAjNDBdDQorCXN0cmQJCQkJcjIsIFtyMTQsICM1Nl0NCisJDQorCXN1YnMJCQkJcjEyLCByMTIsICMxDQorCWFkZAkJCQkJcjE0LCByMTQsICM2NA0KKwkNCisJYm5lCQkJCQlSYWRpeDhGaXJzdF9MT09QDQorCQ0KK1JhZGl4OEZpcnN0X0VORDoNCisJYWRkICAgICAgICAgc3AsIHNwLCAjMHgyNA0KKwlsZG1pYSAgICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorCQ0KK0RBVEFUYWI6DQorCS53b3JkICAgICAgIDB4NWE4Mjc5OWENCisJDQorCUBFTkRQICBAIHxSYWRpeDhGaXJzdHwNCisJLmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvUmFkaXg0RkZUX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOGU1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL1JhZGl4NEZGVF92NS5zCkBAIC0wLDAgKzEsMTY5IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCitACUZpbGU6CQlSYWRpeDRGRlRfdjUucw0KK0ANCitACUNvbnRlbnQ6CVJhZGl4NEZGVCBhcm12NSBhc3NlbWJsZQ0KK0ANCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KKwkuc2VjdGlvbiAudGV4dA0KKwkuZ2xvYmFsCVJhZGl4NEZGVA0KKw0KK1JhZGl4NEZGVDoNCisJc3RtZGIgICAgIHNwISwge3I0IC0gcjExLCBscn0NCisJc3ViICAgICAgIHNwLCBzcCwgIzMyICAgICAgICAgICAgICAgICAgICAgDQorDQorCW1vdgkJCXIxLCByMSwgYXNyICMyDQorCWNtcCAgICAgcjEsICMwICAgICAgIA0KKwliZXEgICAgIFJhZGl4NEZGVF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICANCitSYWRpeDRGRlRfTE9PUDE6ICAgICAgICAgIA0KKwltb3YgICAgIHIxNCwgcjAgICAgICAgICAgCQkJCQkJCUAgeHB0ciA9IGJ1ZkAgICAgICAgICAgDQorCW1vdgkJcjEwLCByMSAJCQkJCQkJCQkJCQlAIGkgPSBudW1ADQorCW1vdiAgICAgcjksIHIyLCBsc2wgIzMgIAkJCQkJCQlAIHN0ZXAgPSAyKmJnbkANCisJY21wICAgICByMTAsICMwICANCisJc3RyCQlyMCwgW3NwXSANCisJc3RyCQlyMSwgW3NwLCAjNF0gICAgICANCisJc3RyCQlyMiwgW3NwLCAjOF0NCisJc3RyCQlyMywgW3NwLCAjMTJdICANCisJYmVxICAgICBSYWRpeDRGRlRfTE9PUDFfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgDQorICAgICANCitSYWRpeDRGRlRfTE9PUDI6ICAgICAgICAgICAgICAgICAgICAgICANCisJbW92ICAgICByMTIsIHIzCQkJCSAgICAgICAgCQkJCUAgY3NwdHIgPSB0d2lkVGFiQA0KKwltb3YJCXIxMSwgcjIJCQkJCQkJCQkJCQlAIGogPSBiZ24NCisJY21wICAgICByMTEsICMwICAgICAgICANCisJc3RyCQlyMTAsIFtzcCwgIzE2XQ0KKwliZXEgICAgIFJhZGl4NEZGVF9MT09QMl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgDQorCSANCitSYWRpeDRGRlRfTE9PUDM6ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJc3RyCQkJcjExLCBbc3AsICMyMF0JIA0KKwkNCisJbGRyZAkJcjAsIFtyMTQsICMwXQkJCQkJCQkJCUAgcjAgPSB4cHRyWzBdQCByMSA9IHhwdHJbMV1ADQorCWFkZAkJCXIxNCwgcjE0LCByOSAJIAkJCQkJCQkJQCB4cHRyICs9IHN0ZXBADQorCQ0KKwlsZHJkCQlyMTAsCVtyMTQsICMwXSAgCQkJCQkgCQkJQCByMiA9IHhwdHJbMF1AIHIzID0geHB0clsxXUAJDQorCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMF1ADQorCQ0KKwlzbXVsd3QJcjQsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkNCisJc211bHd0CXIzLCByMTEsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDEpDQorCQ0KKwlzbWxhd2IJcjIsIHIxMSwgcjgsIHI0CQkJCQkJCQlAIHIyID0gTF9tcHlfd3goY29zeCwgdDApICsgTF9tcHlfd3goc2lueCwgdDEpQA0KKwlzbXVsd2IJcjUsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChzaW54LCB0MCkNCisJDQorCW1vdgkJCXIxMCwgcjAsIGFzciAjMgkJCQkJCQkJQCB0MCA9IHIwID4+IDJADQorCW1vdgkJCXIxMSwgcjEsIGFzciAjMgkJCQkJCQkJQAl0MSA9IHIxID4+IDJADQorCQkNCisJc3ViCQkJcjMsIHIzLCByNQkJCQkJCQkJCQlAIHIzID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQA0KKwlhZGQgICAgIHIxNCwgcjE0LCByOSAJIAkJCQkJCQkJQCB4cHRyICs9IHN0ZXBADQorCQ0KKwlzdWIJCQlyMCwgcjEwLCByMgkJCQkJCQkJCQlAIHIwID0gdDAgLSByMkANCisJc3ViCQkJcjEsIHIxMSwgcjMJCQkJCQkJCQkgIEAgcjEgPSB0MSAtIHIzQA0KKwkNCisJYWRkCQkJcjIsIHIxMCwgcjIJCQkJCQkJCQkJQCByMiA9IHQwICsgcjJADQorCWFkZAkJCXIzLCByMTEsIHIzCQkJCQkJCQkJCUAgcjMgPSB0MSArIHIzQA0KKwkNCisJc3RyCQkJcjIsIFtzcCwgIzI0XQ0KKwlzdHIJCQlyMywgW3NwLCAjMjhdDQorCQ0KKwlsZHJkCQlyMTAsIFtyMTQsICMwXQkJCQkJCQkJQCByNCA9IHhwdHJbMF1AIHI1ID0geHB0clsxXUANCisJbGRyCQkJcjgsIFtyMTJdLCAjNAkJCQkJCQkJCUAgY29zeHNpbnggPSBjc3B0clsxXUANCisJDQorCXNtdWx3dAlyNiwgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KGNvc3gsIHQwKQ0KKwlzbXVsd3QJcjUsIHIxMSwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MSkNCisJDQorCXNtbGF3YglyNCwgcjExLCByOCwgcjYJCQkJCQkJCUAgcjQgPSBMX21weV93eChjb3N4LCB0MCkgKyBMX21weV93eChzaW54LCB0MSlADQorCXNtdWx3YglyNywgcjEwLCByOAkJCQkJCQkJCQlAIExfbXB5X3d4KHNpbngsIHQwKQ0KKwkNCisJYWRkCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBADQorCXN1YgkJCXI1LCByNSwgcjcJCQkJCQkJCQkJQCByNSA9IExfbXB5X3d4KGNvc3gsIHQxKSAtIExfbXB5X3d4KHNpbngsIHQwKUANCisJCQ0KKwlsZHJkCQlyMTAsIFtyMTRdCQkJCQkJCQkJCUAgcjYgPSB4cHRyWzBdQCByNyA9IHhwdHJbMV1ADQorCWxkcgkJCXI4LCBbcjEyXSwgIzQJCQkJCQkJCQlAIGNvc3hzaW54ID0gY3NwdHJbMV1ADQorCQ0KKwlzbXVsd3QJcjIsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChjb3N4LCB0MCkNCisJc211bHd0CXI3LCByMTEsIHI4CQkJCQkJCQkJCUAgTF9tcHlfd3goY29zeCwgdDEpDQorCQ0KKwlzbWxhd2IJcjYsIHIxMSwgcjgsIHIyCQkJCQkJCQlAIHI0ID0gTF9tcHlfd3goY29zeCwgdDApICsgTF9tcHlfd3goc2lueCwgdDEpQA0KKwlzbXVsd2IJcjMsIHIxMCwgcjgJCQkJCQkJCQkJQCBMX21weV93eChzaW54LCB0MCkNCisJDQorCW1vdgkJCXIxMCwgcjQJCQkJCQkJCQkJCQlAIHQwID0gcjRADQorCW1vdgkJCXIxMSwgcjUJCQkJCQkJCQkJCQlAIHQxID0gcjVACQ0KKwkNCisJc3ViCQkJcjcsIHI3LCByMwkJCQkJCQkJCQlAIHI1ID0gTF9tcHlfd3goY29zeCwgdDEpIC0gTF9tcHlfd3goc2lueCwgdDApQA0KKwkNCisNCisJYWRkCQkJcjQsICByMTAsIHI2CQkJCQkJCQkJQAlyNCA9IHQwICsgcjZACQ0KKwlzdWIJCQlyNSwgcjcsIHIxMQkJCQkJCQkJCQlAIHI1ID0gcjcgLSB0MUANCisJDQorCXN1YgkJCXI2LCByMTAsIHI2CQkJCQkJCQkJCUAgcjYgPSB0MCAtIHI2QA0KKwlhZGQJCQlyNywgcjcsIHIxMQkJCQkJCQkJCQlAIHI3ID0gcjcgKyB0MUANCisJDQorCWxkcgkJCXIyLCBbc3AsICMyNF0NCisJbGRyCQkJcjMsIFtzcCwgIzI4XQ0KKwkNCisJYWRkCQkJcjEwLCByMCwgcjUJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjAgKyByNUANCisJYWRkCQkJcjExLCByMSwgcjYJCQkJCQkJCQkJQCB4cHRyWzBdID0gcjEgKyByNg0KKwkNCisJc3RyZAkJcjEwLCBbcjE0XQkJCQkJCQkJCQkNCisJc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBADQorCQ0KKwlzdWIJCQlyMTAsIHIyLCByNAkJCQkJCQkJCQlACXhwdHJbMF0gPSByMiAtIHI0QA0KKwlzdWIJCQlyMTEsIHIzLCByNwkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMyAtIHI3QA0KKwkNCisJc3RyZAkJcjEwLCBbcjE0XQkJCQkNCisJc3ViCQkJcjE0LCByMTQsIHI5CQkJCQkJCQkJQCB4cHRyIC09IHN0ZXBADQorCQ0KKwlzdWIJCQlyMTAsIHIwLCByNQkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMCAtIHI1QA0KKwlzdWIJCQlyMTEsIHIxLCByNgkJCQkJCQkJCQlAIHhwdHJbMF0gPSByMSAtIHI2DQorCQ0KKwlzdHJkCQlyMTAsIFtyMTRdCQkJCQkJCQkJCQ0KKwlzdWIJCQlyMTQsIHIxNCwgcjkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEANCisJDQorCWFkZAkJCXIxMCwgcjIsIHI0CQkJCQkJCQkJCUAJeHB0clswXSA9IHIyIC0gcjRADQorCWFkZAkJCXIxMSwgcjMsIHI3CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIzIC0gcjdADQorCQ0KKwlzdHJkCQlyMTAsIFtyMTRdCQkJCQ0KKwlhZGQJCQlyMTQsIHIxNCwgIzgJCQkJCQkJCQlAIHhwdHIgKz0gMkANCisJDQorCWxkcgkJCXIxMSwgW3NwLCAjMjBdDQorCXN1YnMJCXIxMSwgcjExLCAjMQ0KKwlibmUJCQlSYWRpeDRGRlRfTE9PUDMJDQorCSANCitSYWRpeDRGRlRfTE9PUDJfRU5EOiAgICAgICAgICAgDQorCWxkcgkJCXIxMCwgW3NwLCAjMTZdDQorCWxkcgkJCXIzLCBbc3AsICMxMl0NCisJbGRyCQkJcjIsIFtzcCwgIzhdDQorCXJzYgkJCXI4LCByOSwgcjksIGxzbCAjMiAgIA0KKwlzdWIJCQlyMTAsIHIxMCwgIzENCisJYWRkCQkJcjE0LCByMTQsIHI4CQkgICAgICANCisJY21wCQkJcjEwLCAjMCAgDQorCWJoaSAgICAgUmFkaXg0RkZUX0xPT1AyICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICANCitSYWRpeDRGRlRfTE9PUDFfRU5EOiAgICAgICAgICAgICAgIA0KKwlsZHIgICAgIHIwLCBbc3BdICAgIA0KKwlsZHIJCXIxLCBbc3AsICM0XQ0KKwlhZGQgICAgIHIzLCByMywgcjgsIGFzciAjMQ0KKwltb3YgICAgIHIyLCByMiwgbHNsICMyIA0KKwltb3ZzICAgIHIxLCByMSwgYXNyICMyIA0KKwlibmUgICAgIFJhZGl4NEZGVF9MT09QMSAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICANCitSYWRpeDRGRlRfRU5EOiAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlhZGQgICAgIHNwLCBzcCwgIzMyICAgICAgICAgICAgICAgICAgDQorCWxkbWlhICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKwkJDQorCUBFTkRQICBAIHxSYWRpeDRGRlR8DQorCS5lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjVFL2JhbmRfbnJnX3Y1LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2M2RmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNUUvYmFuZF9ucmdfdjUucwpAQCAtMCwwICsxLDIwNCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCisNCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorQAlGaWxlOgkJYmFuZF9ucmdfdjUucw0KK0ANCitACUNvbnRlbnQ6CUNhbGNCYW5kRW5lcmd5IGFuZCBDYWxjQmFuZEVuZXJneU1TIGZ1bmN0aW9uIGFybXY1IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorDQorCS5nbG9iYWwJQ2FsY0JhbmRFbmVyZ3kNCisNCitDYWxjQmFuZEVuZXJneToNCisJc3RtZGIgICBzcCEsIHtyNCAtIHIxMSwgbHJ9CQ0KKyAgICAgICAgICAgICAgICAgICANCisgIG1vdiAgICAgcjIsIHIyLCBsc2wgIzE2ICAgICAgICAgICAgICAgICAgIA0KKwlsZHIgICAgIHIxMiwgW3IxMywgIzM2XQ0KKwltb3YJCQlyOSwgIzANCisgIG1vdiAgICAgcjUsIHIyLCBhc3IgIzE2ICAgIA0KKwltb3YJCQlyNCwgIzAgICAgICAgICAgICAgICANCisgIGNtcCAgICAgcjUsICMwCQ0KKwlibGUgICAgIEwyMTIgDQorDQorTDIyOg0KKyAgbW92ICAgICByMiwgcjQsIGxzbCAjMSAgICAgICAgICAgICAgICAgICAgDQorICBsZHJzaCAgIHIxMCwgW3IxLCByMl0gICAgICAgICAgICAgICAgICAgICANCisgIGFkZCAgICAgcjExLCByMSwgcjIgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgbGRyc2ggICByMiwgW3IxMSwgIzJdICAgIA0KKwltb3YgICAgIHIxNCwgIzAgICAgICAgICAgICAgICAgIA0KKyAgY21wICAgICByMTAsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBiZ2UgICAgIEwyOCANCisJDQorTDIzOg0KKwlsZHIgICAgIHIxMSwgW3IwLCArcjEwLCBsc2wgIzJdCQ0KKyAgYWRkICAgICByMTAsIHIxMCwgIzEgICAgDQorCWxkciAgICAgcjYsIFtyMCwgK3IxMCwgbHNsICMyXQkNCisJc211bGwgICByMTEsIHI3LCByMTEsIHIxMQ0KKwlhZGQgICAgIHIxMCwgcjEwLCAjMSANCisJc211bGwJICByNiwgcjgsIHI2LCByNg0KKwlsZHIgICAgIHIxMSwgW3IwLCArcjEwLCBsc2wgIzJdDQorCXFhZGQJICByMTQsIHIxNCwgcjcNCisJYWRkICAgICByMTAsIHIxMCwgIzENCisJc211bGwJICByMTEsIHI3LCByMTEsIHIxMQ0KKwlsZHIgICAgIHI2LCBbcjAsICtyMTAsIGxzbCAjMl0NCisJcWFkZAkgIHIxNCwgcjE0LCByOA0KKwlzbXVsbAkgIHI2LCByOCwgcjYsIHI2DQorICBhZGQgICAgIHIxMCwgcjEwLCAjMSANCisJcWFkZAkgIHIxNCwgcjE0LCByNw0KKwljbXAgICAgIHIxMCwgcjINCisJcWFkZAkgIHIxNCwgcjE0LCByOA0KKwlibHQgICAgIEwyMyAgIA0KKw0KK0wyODoJDQorCXFhZGQJICByMTQsIHIxNCwgcjE0DQorCXN0ciAgICAgcjE0LCBbcjMsICtyNCwgbHNsICMyXQ0KKwlhZGQgICAgIHI0LCByNCwgIzEgDQorCXFhZGQJICByOSwgcjksIHIxNA0KKwljbXAgICAgIHI0LCByNSAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorICBibHQgICAgIEwyMiAgICAgICAJDQorDQorTDIxMjoJDQorCXN0ciAgICAgcjksIFtyMTIsICMwXSAgICAgICAgICAgICAgICAgICAgIA0KKwlsZG1pYSAgIHNwISwge3I0IC0gcjExLCBwY30NCisJDQorCUBFTkRQICA7IHxDYWxjQmFuZEVuZXJneXwNCisJDQorCS5nbG9iYWwJQ2FsY0JhbmRFbmVyZ3lNUw0KKw0KK0NhbGNCYW5kRW5lcmd5TVM6DQorCXN0bWRiICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwlzdWIgICAgIHIxMywgcjEzLCAjMjQNCisJDQorCW1vdiAgICAgcjEyLCAjMCANCisgIG1vdiAgICAgcjMsIHIzLCBsc2wgIzE2ICANCisgIG1vdiAgICAgcjE0LCAjMCANCisJbW92ICAgICByMywgcjMsIGFzciAjMTYgICAgICANCisJY21wICAgICByMywgIzAgICAgICAgICAgDQorCW1vdgkJICByNCwgIzAgICAgICAgICAgICAgICAgICANCisgIGJsZSAgICAgTDMxNSAgICANCisJDQorTDMyOgkNCisJbW92CQkgIHI1LCByNCwgbHNsICMxDQorCW1vdgkJICByNiwgIzANCisJbGRyc2ggICByMTAsIFtyMiwgcjVdDQorCWFkZCAgICAgcjUsIHIyLCByNQ0KKwltb3YJCSAgcjcsICMwDQorCWxkcnNoCSAgcjExLCBbcjUsICMyXSAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljbXAgICAgIHIxMCwgcjExICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGJnZSAgICAgTDM5ICAgIA0KKw0KKwlzdHIJCSAgcjMsIFtyMTMsICM0XQ0KKwlzdHIJCSAgcjQsIFtyMTMsICM4XQ0KKwlzdHIJCSAgcjEyLCBbcjEzLCAjMTJdDQorCXN0cgkJICByMTQsIFtyMTMsICMxNl0NCisNCitMMzM6CQ0KKwlsZHIgICAgIHI4LCBbcjAsICtyMTAsIGxzbCAjMl0gICAgICAgICAgICAgICAgICAgIA0KKwlsZHIgICAgIHI5LCBbcjEsICtyMTAsIGxzbCAjMl0NCisJbW92CQkgIHI4LCByOCwgYXNyICMxDQorCWFkZAkJICByMTAsIHIxMCwgIzENCisJbW92CQkgIHI5LCByOSwgYXNyICMxDQorDQorCWxkciAgICAgcjEyLCBbcjAsICtyMTAsIGxzbCAjMl0gICAgICAgICAgDQorCWFkZAkJICByNSwgcjgsIHI5CSAgICAgICAgICANCisJbGRyICAgICByMTQsIFtyMSwgK3IxMCwgbHNsICMyXQ0KKwlzdWIJCSAgcjgsIHI4LCByOQ0KKw0KKwlzbXVsbCAgIHI1LCByMywgcjUsIHI1IA0KKwltb3YJCSAgcjEyLCByMTIsIGFzciAjMQ0KKwlzbXVsbCAgIHI4LCByNCwgcjgsIHI4IA0KKwltb3YJCSAgcjE0LCByMTQsIGFzciAjMQ0KKw0KKwlxYWRkCSAgcjYsIHI2LCByMw0KKwlhZGQJCSAgcjUsIHIxMiwgcjE0DQorCXFhZGQJICByNywgcjcsIHI0DQorCXN1YgkJICByOCwgcjEyLCByMTQNCisNCisJc211bGwgICByNSwgcjMsIHI1LCByNSANCisJYWRkCQkgIHIxMCwgcjEwLCAjMQ0KKwlzbXVsbCAgIHI4LCByNCwgcjgsIHI4IA0KKwkJDQorCXFhZGQJICByNiwgcjYsIHIzDQorCXFhZGQJICByNywgcjcsIHI0DQorDQorCWxkciAgICAgcjgsIFtyMCwgK3IxMCwgbHNsICMyXSAgICAgICAgICAgICAgICAgICAgDQorCWxkciAgICAgcjksIFtyMSwgK3IxMCwgbHNsICMyXQ0KKwltb3YJCSAgcjgsIHI4LCBhc3IgIzENCisJYWRkCQkgIHIxMCwgcjEwLCAjMQ0KKwltb3YJCSAgcjksIHI5LCBhc3IgIzENCisNCisJbGRyICAgICByMTIsIFtyMCwgK3IxMCwgbHNsICMyXSAgICAgICAgICANCisJYWRkCQkgIHI1LCByOCwgcjkJICAgICAgICAgIA0KKwlsZHIgICAgIHIxNCwgW3IxLCArcjEwLCBsc2wgIzJdDQorCXN1YgkJICByOCwgcjgsIHI5DQorDQorCXNtdWxsICAgcjUsIHIzLCByNSwgcjUgDQorCW1vdgkJICByMTIsIHIxMiwgYXNyICMxDQorCXNtdWxsICAgcjgsIHI0LCByOCwgcjggDQorCW1vdgkJICByMTQsIHIxNCwgYXNyICMxDQorDQorCXFhZGQJICByNiwgcjYsIHIzDQorCWFkZAkJICByNSwgcjEyLCByMTQNCisJcWFkZAkgIHI3LCByNywgcjQNCisJc3ViCQkgIHI4LCByMTIsIHIxNA0KKw0KKwlzbXVsbCAgIHI1LCByMywgcjUsIHI1IA0KKwlhZGQJCSAgcjEwLCByMTAsICMxDQorCXNtdWxsICAgcjgsIHI0LCByOCwgcjggDQorCQkNCisJcWFkZAkgIHI2LCByNiwgcjMNCisJcWFkZAkgIHI3LCByNywgcjQNCisNCisJY21wICAgICByMTAsIHIxMQ0KKwkNCisJYmx0CQkgIEwzMw0KKw0KKwlsZHIJCSAgcjMsIFtyMTMsICM0XQ0KKwlsZHIJCSAgcjQsIFtyMTMsICM4XQkNCisJbGRyCQkgIHIxMiwgW3IxMywgIzEyXQ0KKwlsZHIJCSAgcjE0LCBbcjEzLCAjMTZdDQorTDM5OgkNCisJcWFkZAkgIHI2LCByNiwgcjYNCisJcWFkZAkgIHI3LCByNywgcjcJDQorCQ0KKwlsZHIJCSAgcjgsIFtyMTMsICM2MF0NCisJbGRyCQkgIHI5LCBbcjEzLCAjNjhdDQorDQorCXFhZGQJICByMTIsIHIxMiwgcjYNCisJcWFkZAkgIHIxNCwgcjE0LCByNw0KKwkNCisJc3RyCQkgIHI2LCBbcjgsICtyNCwgbHNsICMyXSAgICAgICANCisJc3RyICAgICByNywgW3I5LCArcjQsIGxzbCAjMl0gICAgDQorCQ0KKwlhZGQJCSAgcjQsIHI0LCAjMQ0KKwljbXAJCSAgcjQsIHIzDQorCWJsdCAgICAgTDMyICAgICAgICAgICAgDQorDQorTDMxNToNCisJbGRyCQkgIHI4LCBbcjEzLCAjNjRdDQorCWxkcgkJICByOSwgW3IxMywgIzcyXQ0KKwlzdHIJCSAgcjEyLCBbcjgsICMwXQ0KKwlzdHIJCSAgcjE0LCBbcjksICMwXQ0KKw0KKwlhZGQgICAgIHIxMywgcjEzLCAjMjQNCisJbGRtaWEgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorCUBFTkRQICA7IHxDYWxjQmFuZEVuZXJneU1TfA0KKw0KKwkuZW5kDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1ByZVBvc3RNRENUX3Y3LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUHJlUG9zdE1EQ1RfdjcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdkY2JhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1ByZVBvc3RNRENUX3Y3LnMKQEAgLTAsMCArMSwxMzUgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCVByZVBvc3RNRENUX3Y3LnMNCitADQorQAlDb250ZW50OglwcmVtZGN0IGFuZCBwb3N0bWRjdCBmdW5jdGlvbiBhcm12NyBhc3NlbWJsZQ0KK0ANCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KKw0KKwkuc2VjdGlvbiAudGV4dA0KKwkuZ2xvYmFsCVByZU1EQ1QNCisNCitQcmVNRENUOg0KKwlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwkNCisJYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyDQorCXN1YiAgICAgICAgIHIzLCByOSwgIzMyDQorDQorCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyDQorCWJlcSAgICAgICAgIFByZU1EQ1RfRU5ECQ0KKwkNCitQcmVNRENUX0xPT1A6DQorCVZMRDQuSTMyCQkJe2QwLCBkMiwgZDQsIGQ2fSwgW3IyXSEJCQkJQCBjb3NhID0gKmNzcHRyKytAIHNpbmEgPSAqY3NwdHIrK0ANCisJVkxENC5JMzIJCQl7ZDEsIGQzLCBkNSwgZDd9LCBbcjJdIQkJCQlAIGNvc2IgPSAqY3NwdHIrK0Agc2luYiA9ICpjc3B0cisrQA0KKwlWTEQyLkkzMgkJCXtkOCwgZDksIGQxMCwgZDExfSwgW3IwXQkJCUAgdHIxID0gKihidWYwICsgMClAIHRpMiA9ICooYnVmMCArIDEpQA0KKwlWTEQyLkkzMgkJCXtkMTMsIGQxNX0sIFtyM10hCQkJCQlAIHRyMiA9ICooYnVmMSAtIDEpQCB0aTEgPSAqKGJ1ZjEgKyAwKUANCisJVkxEMi5JMzIJCQl7ZDEyLCBkMTR9LCBbcjNdIQkJCQkJQCB0cjIgPSAqKGJ1ZjEgLSAxKUAgdGkxID0gKihidWYxICsgMClADQorCQkNCisJVlJFVjY0LjMyCQkJUTgsIFE3CQ0KKwlWUkVWNjQuMzIJCQlROSwgUTYNCisNCisJDQorCVZRRE1VTEguUzMyCQlRMTAsIFEwLCBRNAkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkNCisJVlFETVVMSC5TMzIJCVExMSwgUTEsIFE4CQkJCQkJCQlAIE1VTEhJR0goc2luYSwgdGkxKQ0KKwlWUURNVUxILlMzMgkJUTEyLCBRMCwgUTgJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0aTEpDQorCVZRRE1VTEguUzMyCQlRMTMsIFExLCBRNAkJCQkJCQkJQCBNVUxISUdIKHNpbmEsIHRyMSkNCisJCQ0KKwlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUANCisJVlNVQi5TMzIJCQlRMSwgUTEyLCBRMTMJCQkJCQlAICpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRpMSkgLSBNVUxISUdIKHNpbmEsIHRyMSlADQorCQ0KKwlWU1QyLkkzMgkJCXtkMCwgZDEsIGQyLCBkM30sIFtyMF0hDQorCXN1YgkJCQkJCXIzLCByMywgIzMyDQorCQ0KKwlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTkJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikNCisJVlFETVVMSC5TMzIJCVExMSwgUTMsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0aTIpDQorCVZRRE1VTEguUzMyCQlRMTIsIFEyLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdGkyKQ0KKwlWUURNVUxILlMzMgkJUTEzLCBRMywgUTkJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikNCisJCQ0KKwlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0cjIpICsgTVVMSElHSChzaW5hLCB0aTIpQA0KKwlWU1VCLlMzMgkJCVExLCBRMTIsIFExMwkJCQkJCQkJCUAgTVVMSElHSChjb3NhLCB0aTIpIC0gTVVMSElHSChzaW5hLCB0cjIpQA0KKwkNCisJVlJFVjY0LjMyCQkJUTMsIFExDQorCVZSRVY2NC4zMgkJCVEyLCBRMA0KKwkJDQorCVZTVDIuSTMyCQl7ZDUsIGQ3fSwgW3IzXSEJDQorCVZTVDIuSTMyCQl7ZDQsIGQ2fSwgW3IzXSEgDQorCQ0KKwlzdWJzICAgICAJCXIxLCByMSwgIzQNCisJc3ViCQkgIAkJcjMsIHIzLCAjNjQJDQorCWJuZSAgICAgICAJUHJlTURDVF9MT09QDQorCQ0KK1ByZU1EQ1RfRU5EOg0KKwlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQ0KKwlARU5EUCAgQCB8UHJlTURDVHwNCisNCisJLnNlY3Rpb24gLnRleHQNCisJLmdsb2JhbAlQb3N0TURDVA0KKw0KK1Bvc3RNRENUOg0KKwlzdG1kYiAgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKwkNCisJYWRkICAgICAgICAgcjksIHIwLCByMSwgbHNsICMyDQorCXN1YiAgICAgICAgIHIzLCByOSwgIzMyDQorDQorCW1vdnMgICAgICAgIHIxLCByMSwgYXNyICMyDQorCWJlcSAgICAgICAgIFBvc3RNRENUX0VORA0KKwkNCitQb3N0TURDVF9MT09QOg0KKwlWTEQ0LkkzMgkJCXtkMCwgZDIsIGQ0LCBkNn0sIFtyMl0hCQkJCUAgY29zYSA9ICpjc3B0cisrQCBzaW5hID0gKmNzcHRyKytADQorCVZMRDQuSTMyCQkJe2QxLCBkMywgZDUsIGQ3fSwgW3IyXSEJCQkJQCBjb3NiID0gKmNzcHRyKytAIHNpbmIgPSAqY3NwdHIrK0ANCisJVkxEMi5JMzIJCQl7ZDgsIGQ5LCBkMTAsIGQxMX0sIFtyMF0JCQlAIHRyMSA9ICooemJ1ZjEgKyAwKUAgdGkxID0gKih6YnVmMSArIDEpQA0KKwlWTEQyLkkzMgkJCXtkMTMsIGQxNX0sIFtyM10hCQkJCQkJCUAgdHIyID0gKih6YnVmMiAtIDEpQCB0aTIgPSAqKHpidWYyICsgMClADQorCVZMRDIuSTMyCQkJe2QxMiwgZDE0fSwgW3IzXSEJCQkJCQkJQCB0cjIgPSAqKHpidWYyIC0gMSlAIHRpMiA9ICooemJ1ZjIgKyAwKUAJDQorDQorCVZSRVY2NC4zMgkJCVE4LCBRNgkNCisJVlJFVjY0LjMyCQkJUTksIFE3CQkJDQorCQ0KKwlWUURNVUxILlMzMgkJUTEwLCBRMCwgUTQJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2EsIHRyMSkNCisJVlFETVVMSC5TMzIJCVExMSwgUTEsIFE1CQkJCQkJCQkJCUAgTVVMSElHSChzaW5hLCB0aTEpDQorCVZRRE1VTEguUzMyCQlRMTIsIFEwLCBRNQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYSwgdGkxKQ0KKwlWUURNVUxILlMzMgkJUTEzLCBRMSwgUTQJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmEsIHRyMSkNCisJCQ0KKwlWQURELlMzMgkJCVEwLCBRMTAsIFExMQkJCQkJCQkJCUAgKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKUANCisJVlNVQi5TMzIJCQlRNSwgUTEzLCBRMTIJCQkJCQkJCQlAICpidWYxLS0gPSBNVUxISUdIKHNpbmEsIHRyMSkgLSBNVUxISUdIKGNvc2EsIHRpMSlADQorCQ0KKwlWUURNVUxILlMzMgkJUTEwLCBRMiwgUTgJCQkJCQkJCQkJQCBNVUxISUdIKGNvc2IsIHRyMikNCisJVlFETVVMSC5TMzIJCVExMSwgUTMsIFE5CQkJCQkJCQkJCUAgTVVMSElHSChzaW5iLCB0aTIpDQorCVZRRE1VTEguUzMyCQlRMTIsIFEyLCBROQkJCQkJCQkJCQlAIE1VTEhJR0goY29zYiwgdGkyKQ0KKwlWUURNVUxILlMzMgkJUTEzLCBRMywgUTgJCQkJCQkJCQkJQCBNVUxISUdIKHNpbmIsIHRyMikNCisJCQ0KKwlWQURELlMzMgkJCVE0LCBRMTAsIFExMQkJCQkJCQkJCUAgKmJ1ZjEtLSA9IE1VTEhJR0goY29zYSwgdHIyKSArIE1VTEhJR0goc2luYSwgdGkyKUANCisJVlNVQi5TMzIJCQlRMSwgUTEzLCBRMTIJCQkJCQkJCQlAICpidWYwKysgPSBNVUxISUdIKHNpbmEsIHRyMikgLSBNVUxISUdIKGNvc2EsIHRpMilACQ0KKwkNCisJVlJFVjY0LjMyCQkJUTIsIFE0DQorCVZSRVY2NC4zMgkJCVEzLCBRNQkNCisJDQorCXN1YgkJCQkJCXIzLCByMywgIzMyCQ0KKwlWU1QyLkkzMgkJCXtkMCwgZDEsIGQyLCBkM30sIFtyMF0hDQorCQkNCisJVlNUMi5JMzIJCQl7ZDUsIGQ3fSwgW3IzXSEJDQorCVZTVDIuSTMyCQkJe2Q0LCBkNn0sIFtyM10hIA0KKwkNCisJc3VicyAgICAgCQkJcjEsIHIxLCAjNA0KKwlzdWIJCSAgCQkJcjMsIHIzLCAjNjQJCQ0KKwlibmUgICAgICAgCVBvc3RNRENUX0xPT1ANCisNCitQb3N0TURDVF9FTkQ6DQorCWxkbWlhICAgICBzcCEsIHtyNCAtIHIxMSwgcGN9DQorDQorCUBFTkRQICAJCUAgfFBvc3RNRENUfA0KKwkuZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1I0UjhGaXJzdF92Ny5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZWU2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9hc20vQVJNVjcvUjRSOEZpcnN0X3Y3LnMKQEAgLTAsMCArMSwxNDYgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorDQorQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KK0AJRmlsZToJCVI0UjhGaXJzdF92Ny5zDQorQA0KK0AJQ29udGVudDoJUmFkaXg4Rmlyc3QgYW5kIFJhZGl4NEZpcnN0IGZ1bmN0aW9uIGFybXY3IGFzc2VtYmxlDQorQA0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADQorDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUmFkaXg4Rmlyc3QNCisNCitSYWRpeDhGaXJzdDoNCisJc3RtZGIgICAgIAkJc3AhLCB7cjQgLSByMTEsIGxyfQ0KKw0KKwlsZHIgICAgICAgCQlyMywgU1FSVDFfMg0KKwljbXAgICAgICAgCQlyMSwgIzANCisJDQorCVZEVVAuSTMyICAJCVExNSwgcjMJDQorCWJlcSAgICAgICAJCVJhZGl4OEZpcnN0X0VORA0KKwkNCitSYWRpeDhGaXJzdF9MT09QOg0KKwlWTEQxLkkzMgkJCXtkMCwgZDEsIGQyLCBkM30sCVtyMF0hDQorCVZMRDEuSTMyCQkJe2Q4LCBkOSwgZDEwLCBkMTF9LAlbcjBdIQ0KKwkJDQorCVZBREQuUzMyCQkJZDQsIGQwLCBkMQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUBpMCA9IGJ1ZlsxXSArIGJ1ZlszXUANCisJVlNVQi5TMzIJCQlkNSwgZDAsIGQxCQlAIHIxID0gYnVmWzBdIC0gYnVmWzJdQGkxID0gYnVmWzFdIC0gYnVmWzNdQAkNCisJVlNVQi5TMzIJCQlkNywgZDIsIGQzCQlAIHIyID0gYnVmWzRdIC0gYnVmWzZdQGkyID0gYnVmWzVdIC0gYnVmWzddQAkNCisJVkFERC5TMzIJCQlkNiwgZDIsIGQzCQlAIHIzID0gYnVmWzRdICsgYnVmWzZdQGkzID0gYnVmWzVdICsgYnVmWzddQA0KKwlWUkVWNjQuSTMyCQkJZDcsIGQ3CQ0KKwkNCisJVkFERC5TMzIJCQlRMCwgUTIsIFEzCQlAIHI0ID0gKHIwICsgcjIpQGk0ID0gKGkwICsgaTIpQGk2ID0gKGkxICsgcjMpQHI3ID0gKHIxICsgaTMpDQorCVZTVUIuUzMyCQkJUTEsIFEyLCBRMwkJQCByNSA9IChyMCAtIHIyKUBpNSA9IChpMCAtIGkyKUByNiA9IChyMSAtIGkzKUBpNyA9IChpMSAtIHIzKUANCisNCisJVlJFVjY0LkkzMgkJCWQzLCBkMwkNCisNCisJVkFERC5TMzIJCQlkNCwgZDgsIGQ5CQlAIHIwID0gYnVmWyA4XSArIGJ1ZlsxMF1AaTAgPSBidWZbIDldICsgYnVmWzExXUANCisJVlNVQi5TMzIJCQlkNywgZDEwLCBkMTEJQCByMSA9IGJ1ZlsxMl0gLSBidWZbMTRdQGkxID0gYnVmWzEzXSAtIGJ1ZlsxNV1ACQ0KKwlWQURELlMzMgkJCWQ2LCBkMTAsIGQxMQlAIHIyID0gYnVmWzEyXSArIGJ1ZlsxNF1AaTIgPSBidWZbMTNdICsgYnVmWzE1XUANCisJVlJFVjY0LkkzMgkJCWQ3LCBkNwkNCisJVlNVQi5TMzIJCQlkNSwgZDgsIGQ5CQlAIHIzID0gYnVmWyA4XSAtIGJ1ZlsxMF1AaTMgPSBidWZbIDldIC0gYnVmWzExXUANCisJDQorCVZUUk4uMzIJCQkJZDEsIGQzCQ0KKwkNCisJVkFERC5TMzIJCQlRNCwgUTIsIFEzCQlAIHQwID0gKHIwICsgcjIpID4+IDFAdDEgPSAoaTAgKyBpMikgPj4gMUBpMCA9IGkxICsgcjNAcjIgPSByMSArIGkzQA0KKwlWU1VCLlMzMgkJCVE1LCBRMiwgUTMJCUAgdDIgPSAocjAgLSByMikgPj4gMUB0MyA9IChpMCAtIGkyKSA+PiAxQHIwID0gcjEgLSBpM0BpMiA9IGkxIC0gcjNADQorCQ0KKwlWUkVWNjQuSTMyCQkJZDMsIGQzDQorCQ0KKwlWU0hSLlMzMgkJCWQ4LCBkOCwgIzEJCSANCisJVlNIUi5TMzIJCQlRMCwgUTAsICMxDQorCVZSRVY2NC5JMzIJCQlkMTAsIGQxMA0KKwlWVFJOLjMyCQkJCWQxMSwgZDkNCisJVlNIUi5TMzIJCQlRMSwgUTEsICMxDQorCVZTSFIuUzMyCQkJZDEwLCBkMTAsICMxDQorCVZSRVY2NC5JMzIJCQlkOSwgZDkNCisJDQorCXN1YiAgICAgICAJCQlyMCwgcjAsICMweDQwDQorCQ0KKwlWQURELlMzMgkJCWQxMiwgZDAsIGQ4DQorCVZTVUIuUzMyCQkJZDE2LCBkMCwgZDgJDQorCVZBREQuUzMyCQkJZDE0LCBkMiwgZDEwDQorCVZTVUIuUzMyCQkJZDE4LCBkMiwgZDEwDQorCQ0KKwlWU1VCLlMzMgkJCWQ0LCBkMTEsIGQ5DQorCVZBREQuUzMyCQkJZDUsIGQxMSwgZDkNCisJDQorCVZSRVY2NC5JMzIJCQlkMTgsIGQxOA0KKwkNCisJVlFETVVMSC5TMzIJCQlRMywgUTIsIFExNQ0KKwlWVFJOLjMyCQkJCWQxNCwgZDE4DQorCVZUUk4uMzIJCQkJZDYsIGQ3DQorCVZSRVY2NC5JMzIJCQlkMTgsIGQxOAkNCisJDQorCVZTVUIuUzMyCQkJZDE1LCBkMywgZDYNCisJVlJFVjY0LkkzMgkJCWQ3LCBkNw0KKwlWQURELlMzMgkJCWQxOSwgZDMsIGQ2DQorCVZBREQuUzMyCQkJZDEzLCBkMSwgZDcNCisJVlNVQi5TMzIJCQlkMTcsIGQxLCBkNw0KKwkNCisJVlJFVjY0LkkzMgkJCWQxNywgZDE3DQorCVZUUk4uMzIJCQkJZDEzLCBkMTcNCisJVlJFVjY0LkkzMgkJCWQxNywgZDE3DQorCQ0KKwlzdWJzICAgICAgIAkJCXIxLCByMSwgIzEJDQorCQ0KKwlWU1QxLkkzMgkJCXtkMTIsIGQxMywgZDE0LCBkMTV9LCBbcjBdIQ0KKwlWU1QxLkkzMgkJCXtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjBdIQkNCisJYm5lICAgICAgIAkJCVJhZGl4OEZpcnN0X0xPT1ANCisJDQorUmFkaXg4Rmlyc3RfRU5EOg0KKwlsZG1pYSAgICAgc3AhLCB7cjQgLSByMTEsIHBjfQkNCitTUVJUMV8yOg0KKwkud29yZCAgICAgIDB4MmQ0MTNjY2QNCisJDQorCUBFTkRQICBAIHxSYWRpeDhGaXJzdHwNCisJDQorCS5zZWN0aW9uIC50ZXh0DQorCS5nbG9iYWwJUmFkaXg0Rmlyc3QNCisNCitSYWRpeDRGaXJzdDoNCisJc3RtZGIgICAgIAlzcCEsIHtyNCAtIHIxMSwgbHJ9DQorDQorCWNtcCAgICAgICAJcjEsICMwDQorCWJlcSAgICAgICAJUmFkaXg0Rmlyc3RfRU5EDQorCQ0KK1JhZGl4NEZpcnN0X0xPT1A6DQorCVZMRDEuSTMyCQkJe2QwLCBkMSwgZDIsIGQzfSwgW3IwXQkJCQkJDQorCQ0KKwlWQURELlMzMgkJCWQ0LCBkMCwgZDEJCQkJCQkJQCByMCA9IGJ1ZlswXSArIGJ1ZlsyXUAgcjEgPSBidWZbMV0gKyBidWZbM11ACQkNCisJVlNVQi5TMzIJCQlkNSwgZDAsIGQxCQkJCQkJCUAgcjIgPSBidWZbMF0gLSBidWZbMl1AIHIzID0gYnVmWzFdIC0gYnVmWzNdQA0KKwlWU1VCLlMzMgkJCWQ3LCBkMiwgZDMJCQkJCQkJQCByNCA9IGJ1Zls0XSArIGJ1Zls2XUAgcjUgPSBidWZbNV0gKyBidWZbN11ADQorCVZBREQuUzMyCQkJZDYsIGQyLCBkMwkJCQkJCQlAIHI2ID0gYnVmWzRdIC0gYnVmWzZdQCByNyA9IGJ1Zls1XSAtIGJ1Zls3XUANCisJDQorCVZSRVY2NC5JMzIJCWQ3LCBkNwkJCQkJCQkJCUAgDQorCQ0KKwlWQURELlMzMgkJCVE0LCBRMiwgUTMNCisJVlNVQi5TMzIJCQlRNSwgUTIsIFEzDQorCQ0KKwlWUkVWNjQuSTMyCQlkMTEsIGQxMQ0KKwlWVFJOLjMyCQkJCWQ5LCBkMTENCisJc3VicyAgICAgICAJCXIxLCByMSwgIzEJDQorCVZSRVY2NC5JMzIJCWQxMSwgZDExDQorCVZTVDEuSTMyCQkJe2Q4LCBkOSwgZDEwLCBkMTF9LCBbcjBdIQ0KKw0KKwlibmUgICAgICAgCQlSYWRpeDRGaXJzdF9MT09QDQorCQ0KK1JhZGl4NEZpcnN0X0VORDoNCisJbGRtaWEgICAgCQlzcCEsIHtyNCAtIHIxMSwgcGN9DQorDQorCUBFTkRQICBAIHxSYWRpeDRGaXJzdHwNCisJLmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SYWRpeDRGRlRfdjcucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2FzbS9BUk1WNy9SYWRpeDRGRlRfdjcucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWE4NDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYXNtL0FSTVY3L1JhZGl4NEZGVF92Ny5zCkBAIC0wLDAgKzEsMTQzIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEANCitACUZpbGU6CQlSYWRpeDRGRlRfdjcucw0KK0ANCitACUNvbnRlbnQ6CVJhZGl4NEZGVCBhcm12NyBhc3NlbWJsZQ0KK0ANCitAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQA0KKw0KKwkuc2VjdGlvbiAudGV4dA0KKwkuZ2xvYmFsCVJhZGl4NEZGVA0KKw0KK1JhZGl4NEZGVDoNCisJc3RtZGIgICAgc3AhLCB7cjQgLSByMTEsIGxyfQ0KKw0KKwltb3YJCQlyMSwgcjEsIGFzciAjMg0KKwljbXAgICAgIAlyMSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWJlcSAgICAgCVJhZGl4NEZGVF9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgDQorUmFkaXg0RkZUX0xPT1AxOiAgICAgICAgICAgICAgICAgICAgICAgICANCisJbW92ICAgICAJcjUsIHIyLCBsc2wgIzEgIA0KKwltb3YgICAgIAlyOCwgcjAgICAgICAgICAgDQorCW1vdiAgICAgCXI3LCByMSAgDQorCW1vdiAgICAgCXI1LCByNSwgbHNsICMyICAgDQorCWNtcCAgICAgCXIxLCAjMCAgICAgICAgICANCisJcnNiZXEgICAJcjEyLCByNSwgcjUsIGxzbCAjMiANCisJYmVxICAgICAJUmFkaXg0RkZUX0xPT1AxX0VORCAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlyc2IgICAgIAlyMTIsIHI1LCByNSwgbHNsICMyICAgDQorCSANCitSYWRpeDRGRlRfTE9PUDI6ICAgICAgICAgICAgICAgICAgICAgICAgDQorCW1vdiAgICAgCXI2LCByMyANCisJbW92ICAgICAJcjQsIHIyICANCisJY21wICAgICAJcjIsICMwICAgICAgICANCisJYmVxICAgICAJUmFkaXg0RkZUX0xPT1AyX0VORCAgICAgICAgIA0KKyAgDQorUmFkaXg0RkZUX0xPT1AzOiAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCUByMCA9IHhwdHJbMF1ADQorCUByMSA9IHhwdHJbMV1ADQorCVZMRDIuSTMyCQkJe0QwLCBEMSwgRDIsIEQzfSwgW3I4XQkJCQkNCisJVkxEMi5JMzIJCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSEJCUAgY29zeCA9IGNzcHRyWzBdQCBzaW54ID0gY3NwdHJbMV1ADQorCQ0KKwlhZGQJCQkJCXI4LCByOCwgcjUJCQkJCQkJCQkJQCB4cHRyICs9IHN0ZXBACQ0KKwlWTEQyLkkzMgkJCXtENCwgRDUsIEQ2LEQ3fSwgW3I4XQkJCQkJQCByMiA9IHhwdHJbMF1AIHIzID0geHB0clsxXUANCisJDQorCVZRRE1VTEguUzMyCQlRMTAsIFEyLCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApDQorCVZRRE1VTEguUzMyCQlRMTEsIFEzLCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDEpDQorCVZRRE1VTEguUzMyCQlRMTIsIFEzLCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpDQorCVZRRE1VTEguUzMyCQlRMTMsIFEyLCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDApDQorCQkNCisJVkFERC5TMzIJCQlRMiwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSkNCisJVlNVQi5TMzIJCQlRMywgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCkNCisJDQorCWFkZAkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgKz0gc3RlcEANCisJVlNIUi5TMzIJCQlRMTAsIFEwLCAjMgkJCQkJCQkJCQlAIHQwID0gcjAgPj4gMkANCisJVlNIUi5TMzIJCQlRMTEsIFExLCAjMgkJCQkJCQkJCQlAIHQxID0gcjEgPj4gMkANCisJDQorCVZTVUIuUzMyCQkJUTAsCVExMCwgUTIJCQkJCQkJCQkJQCByMCA9IHQwIC0gcjJADQorCVZTVUIuUzMyCQkJUTEsCVExMSwgUTMJCQkJCQkJCQkJQCByMSA9IHQxIC0gcjNADQorCVZBREQuUzMyCQkJUTIsIFExMCwgUTIJCQkJCQkJCQkJQCByMiA9IHQwICsgcjJADQorCVZBREQuUzMyCQkJUTMsIFExMSwgUTMJCQkJCQkJCQkJQCByMyA9IHQxICsgcjNADQorCQkNCisJVkxEMi5JMzIJCQl7RDgsIEQ5LCBEMTAsIEQxMX0sIFtyOF0JDQorCVZMRDIuSTMyCQkJe0QyOCwgRDI5LCBEMzAsIEQzMX0sIFtyNl0hCQ0KKwlhZGQJCQkJCQlyOCwgcjgsIHI1DQorDQorCVZRRE1VTEguUzMyCQlRMTAsIFE0LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApDQorCVZRRE1VTEguUzMyCQlRMTEsIFE1LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDEpDQorCVZRRE1VTEguUzMyCQlRMTIsIFE1LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpDQorCVZRRE1VTEguUzMyCQlRMTMsIFE0LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDApDQorCQkNCisJVkFERC5TMzIJCQlROCwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSkNCisJVlNVQi5TMzIJCQlROSwgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCkJDQorCQ0KKwlWTEQyLkkzMgkJe0QxMiwgRDEzLCBEMTQsIEQxNX0sIFtyOF0JDQorCVZMRDIuSTMyCQl7RDI4LCBEMjksIEQzMCwgRDMxfSwgW3I2XSENCisJDQorCVZRRE1VTEguUzMyCQlRMTAsIFE2LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApDQorCVZRRE1VTEguUzMyCQlRMTEsIFE3LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDEpDQorCVZRRE1VTEguUzMyCQlRMTIsIFE3LCBRMTQJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpDQorCVZRRE1VTEguUzMyCQlRMTMsIFE2LCBRMTUJCQkJCQkJCQlAIE1VTEhJR0goc2lueCwgdDApDQorCQkNCisJVkFERC5TMzIJCQlRNiwgUTEwLCBRMTEJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSkNCisJVlNVQi5TMzIJCQlRNywgUTEyLCBRMTMJCQkJCQkJCQlAIE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCkJCQ0KKwkNCisJVkFERC5TMzIJCQlRNCwgUTgsIFE2CQkJCQkJCQkJCUAgcjQgPSB0MCArIHI2QA0KKwlWU1VCLlMzMgkJCVE1LCBRNywgUTkJCQkJCQkJCQkJQCByNSA9IHI3IC0gdDFADQorCVZTVUIuUzMyCQkJUTYsIFE4LCBRNgkJCQkJCQkJCQlAIHI2ID0gdDAgLSByNkANCisJVkFERC5TMzIJCQlRNywgUTcsIFE5CQkJCQkJCQkJCUAgcjcgPSByNyArIHQxQA0KKwkNCisJVkFERC5TMzIJCQlROCwgUTAsIFE1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwICsgcjVADQorCVZBREQuUzMyCQkJUTksIFExLCBRNgkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMSArIHI2QA0KKwlWU1QyLkkzMgkJCXtEMTYsIEQxNywgRDE4LCBEMTl9LCBbcjhdDQorCQ0KKwlWU1VCLlMzMgkJCVExMCwgUTIsIFE0CQkJCQkJCQkJCUAgeHB0clswXSA9IHIyIC0gcjRADQorCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEANCisJVlNVQi5TMzIJCQlRMTEsIFEzLCBRNwkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMyAtIHI3QA0KKwlWU1QyLkkzMgkJCXtEMjAsIEQyMSwgRDIyLCBEMjN9LCBbcjhdDQorCQkNCisJVlNVQi5TMzIJCQlROCwgUTAsIFE1CQkJCQkJCQkJCUAgeHB0clswXSA9IHIwIC0gcjVADQorCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEANCisJVlNVQi5TMzIJCQlROSwgUTEsIFE2CQkJCQkJCQkJCUAgeHB0clsxXSA9IHIxIC0gcjZADQorCVZTVDIuSTMyCQkJe0QxNiwgRDE3LCBEMTgsIEQxOX0sIFtyOF0NCisJCQ0KKwlWQURELlMzMgkJCVExMCwgUTIsIFE0CQkJCQkJCQkJCUAgeHB0clswXSA9IHIyICsgcjRADQorCXN1YgkJCQkJcjgsIHI4LCByNQkJCQkJCQkJCQlAIHhwdHIgLT0gc3RlcEANCisJVkFERC5TMzIJCQlRMTEsIFEzLCBRNwkJCQkJCQkJCQlAIHhwdHJbMV0gPSByMyArIHI3QA0KKwlWU1QyLkkzMgkJCXtEMjAsIEQyMSwgRDIyLCBEMjN9LCBbcjhdIQ0KKwkJDQorCXN1YnMgICAgCQkJcjQsIHI0LCAjNCANCisJYm5lICAgICAJCQlSYWRpeDRGRlRfTE9PUDMgDQorCSAgICAgICAgICAgICAgICAgICAgICAgICANCitSYWRpeDRGRlRfTE9PUDJfRU5EOiAgICAgICAgICAgICAgICAgICAgICAgICANCisJYWRkICAgICAJCQlyOCwgcjgsIHIxMiAgICANCisJc3ViICAgIAkJCQlyNywgcjcsICMxICAgICANCisJY21wCQkJCQlyNywgIzANCisJYmhpICAgICAJCQlSYWRpeDRGRlRfTE9PUDIgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KK1JhZGl4NEZGVF9MT09QMV9FTkQ6ICAgICAgICAgICAgICAgICAgICAgICAgDQorCWFkZCAgICAgCQkJcjMsIHIxMiwgcjMgICAgDQorCW1vdiAgICAgCQkJcjIsIHIyLCBsc2wgIzIgDQorCW1vdnMgICAgCQkJcjEsIHIxLCBhc3IgIzIgDQorCWJuZSAgICAgCQkJUmFkaXg0RkZUX0xPT1AxICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KK1JhZGl4NEZGVF9FTkQ6ICAgICAgICANCisJbGRtaWEgICAJCQlzcCEsIHtyNCAtIHIxMSwgcGN9DQorCQkNCisJQEVORFAgIEAgfFJhZGl4NEZGVHwNCisJLmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JhbmRfbnJnLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NmM0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iYW5kX25yZy5jCkBAIC0wLDAgKzEsMTAyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliYW5kX25yZy5jDQorDQorCUNvbnRlbnQ6CUJhbmQvTGluZSBlbmVyZ3kgY2FsY3VsYXRpb25zIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJiYW5kX25yZy5oIgorCisjaWZuZGVmIEFSTVY1RQ0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBDYWxjQmFuZEVuZXJneQorKiBkZXNjcmlwdGlvbjogICBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgQ2FsY0JhbmRFbmVyZ3koY29uc3QgV29yZDMyICptZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqYmFuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTdW0pCit7CisgIFdvcmQzMiBpLCBqOworICBXb3JkMzIgYWNjdVN1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGk9MDsgaTxudW1CYW5kczsgaSsrKSB7CisgICAgV29yZDMyIGFjY3UgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvciAoaj1iYW5kT2Zmc2V0W2ldOyBqPGJhbmRPZmZzZXRbaSsxXTsgaisrKQorICAgICAgYWNjdSA9IExfYWRkKGFjY3UsIE1VTEhJR0gobWRjdFNwZWN0cnVtW2pdLCBtZGN0U3BlY3RydW1bal0pKTsNCisNCisJYWNjdSA9IExfYWRkKGFjY3UsIGFjY3UpOworICAgIGFjY3VTdW0gPSBMX2FkZChhY2N1U3VtLCBhY2N1KTsKKyAgICBiYW5kRW5lcmd5W2ldID0gYWNjdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKyAgKmJhbmRFbmVyZ3lTdW0gPSBhY2N1U3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBDYWxjQmFuZEVuZXJneU1TCisqIGRlc2NyaXB0aW9uOiAgIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYWRkIG9yIG1pbnVzIHJpZ2h0IGNoYW5uZWwKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIENhbGNCYW5kRW5lcmd5TVMoY29uc3QgV29yZDMyICptZGN0U3BlY3RydW1MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpiYW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgbnVtQmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpiYW5kRW5lcmd5TWlkLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneU1pZFN1bSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKmJhbmRFbmVyZ3lTaWRlLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqYmFuZEVuZXJneVNpZGVTdW0pCit7CisKKyAgV29yZDMyIGksIGo7CisgIFdvcmQzMiBhY2N1TWlkU3VtID0gMDsgICAgICAgIAorICBXb3JkMzIgYWNjdVNpZGVTdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorIAorCisgIGZvcihpPTA7IGk8bnVtQmFuZHM7IGkrKykgeworICAgIFdvcmQzMiBhY2N1TWlkID0gMDsKKyAgICBXb3JkMzIgYWNjdVNpZGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBmb3IgKGo9YmFuZE9mZnNldFtpXTsgajxiYW5kT2Zmc2V0W2krMV07IGorKykgeworICAgICAgV29yZDMyIHNwZWNtLCBzcGVjczsgCisgICAgICBXb3JkMzIgbCwgcjsKKworICAgICAgbCA9IG1kY3RTcGVjdHJ1bUxlZnRbal0gPj4gMTsKKyAgICAgIHIgPSBtZGN0U3BlY3RydW1SaWdodFtqXSA+PiAxOworICAgICAgc3BlY20gPSBsICsgcjsKKyAgICAgIHNwZWNzID0gbCAtIHI7CisgICAgICBhY2N1TWlkID0gTF9hZGQoYWNjdU1pZCwgTVVMSElHSChzcGVjbSwgc3BlY20pKTsKKyAgICAgIGFjY3VTaWRlID0gTF9hZGQoYWNjdVNpZGUsIE1VTEhJR0goc3BlY3MsIHNwZWNzKSk7CisgICAgfQorICAgIA0KKwlhY2N1TWlkID0gTF9hZGQoYWNjdU1pZCwgYWNjdU1pZCk7DQorCWFjY3VTaWRlID0gTF9hZGQoYWNjdVNpZGUsIGFjY3VTaWRlKTsNCisJYmFuZEVuZXJneU1pZFtpXSA9IGFjY3VNaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGFjY3VNaWRTdW0gPSBMX2FkZChhY2N1TWlkU3VtLCBhY2N1TWlkKTsKKyAgICBiYW5kRW5lcmd5U2lkZVtpXSA9IGFjY3VTaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYWNjdVNpZGVTdW0gPSBMX2FkZChhY2N1U2lkZVN1bSwgYWNjdVNpZGUpOworICAgIAorICB9CisgICpiYW5kRW5lcmd5TWlkU3VtID0gYWNjdU1pZFN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAqYmFuZEVuZXJneVNpZGVTdW0gPSBhY2N1U2lkZVN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0X2NudC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0X2NudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODM3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRfY250LmMKQEAgLTAsMCArMSw4ODUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWJpdF9jbnQuYw0KKw0KKwlDb250ZW50OglIdWZmbWFuIEJpdGNvdW50ZXIgJiBjb2RlciBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYml0X2NudC5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworI2RlZmluZSBISV9MVEFCKGEpIChhPj44KQorI2RlZmluZSBMT19MVEFCKGEpIChhICYgMHhmZikKKworI2RlZmluZSBFWFBBTkQoYSkgICgoKChXb3JkMzIpKGEmMHhmZjAwKSkgPDwgOCl8KFdvcmQzMikoYSYweGZmKSkgCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50MV8yXzNfNF81XzZfN184XzlfMTBfMTEKKyogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDEtMTEgCisqIHJldHVybnM6ICAgICAgCisqIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisqIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyAxLTExCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKK3sKKyAgV29yZDMyIHQwLHQxLHQyLHQzLGk7CisgIFdvcmQzMiBiYzFfMixiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTA7CisgIFdvcmQxNiBiYzExLHNjOw0KKyAgCisgIGJjMV8yPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzNfND0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM1XzY9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjN184PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKKyAgICAKKyAgICB0MD0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgCisgICAgdDE9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIHQyPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICB0Mz0gdmFsdWVzW2krM107ICAgICAgICAgICAgICAgICAgICAgCisgIAorICAgIC8qIDEsMiAqLworCisgICAgYmMxXzIgPSBiYzFfMiArIEVYUEFORChodWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOyAgICAgICAgICAgICAgCisKKyAgICAvKiA1LDYgKi8KKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIHQwPUFCUyh0MCk7CisgICAgdDE9QUJTKHQxKTsKKyAgICB0Mj1BQlModDIpOworICAgIHQzPUFCUyh0Myk7CisKKyAgICAKKyAgICBiYzNfNCA9IGJjM180ICsgRVhQQU5EKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzlfMTAgPSBiYzlfMTAgKyBFWFBBTkQoaHVmZl9sdGFiOV8xMFt0Ml1bdDNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07CisgICAgYmMxMSA9IGJjMTEgKyBodWZmX2x0YWIxMVt0Ml1bdDNdOworICAgCisgICAgICAgICAgIAorICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCkgKyAodDI+MCkgKyAodDM+MCk7CisgIH0KKyAgCisgIGJpdENvdW50WzFdPWV4dHJhY3RfaChiYzFfMik7CisgIGJpdENvdW50WzJdPWV4dHJhY3RfbChiYzFfMik7CisgIGJpdENvdW50WzNdPWV4dHJhY3RfaChiYzNfNCkgKyBzYzsKKyAgYml0Q291bnRbNF09ZXh0cmFjdF9sKGJjM180KSArIHNjOworICBiaXRDb3VudFs1XT1leHRyYWN0X2goYmM1XzYpOworICBiaXRDb3VudFs2XT1leHRyYWN0X2woYmM1XzYpOworICBiaXRDb3VudFs3XT1leHRyYWN0X2goYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzhdPWV4dHJhY3RfbChiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTBdPWV4dHJhY3RfbChiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzExXT1iYzExICsgc2M7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50M180XzVfNl83XzhfOV8xMF8xMQorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgMy0xMSAKKyogcmV0dXJuczogICAgICAKKyogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDMtMTEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjb3VudDNfNF81XzZfN184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQoreworICBXb3JkMzIgdDAsdDEsdDIsdDMsIGk7CisgIFdvcmQzMiBiYzNfNCxiYzVfNixiYzdfOCxiYzlfMTA7CisgIFdvcmQxNiBiYzExLHNjOworICAgIAorICBiYzNfND0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM1XzY9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjN184PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzlfMTA9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvcihpPTA7aTx3aWR0aDtpKz00KXsKKworICAgIHQwPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICB0MT0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgCisgICAgdDI9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgIAorICAgIHQzPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICAvKgorICAgICAgNSw2CisgICAgKi8KKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0MCs0XVt0MSs0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBiYzVfNiA9IGJjNV82ICsgRVhQQU5EKGh1ZmZfbHRhYjVfNlt0Mis0XVt0Mys0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIHQwPUFCUyh0MCk7CisgICAgdDE9QUJTKHQxKTsKKyAgICB0Mj1BQlModDIpOworICAgIHQzPUFCUyh0Myk7CisKKworICAgIGJjM180ID0gYmMzXzQgKyBFWFBBTkQoaHVmZl9sdGFiM180W3QwXVt0MV1bdDJdW3QzXSk7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjN184ID0gYmM3XzggKyBFWFBBTkQoaHVmZl9sdGFiN184W3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QyXVt0M10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKKyAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QyXVt0M107CisKKyAgICAgICAgICAgCisgICAgc2MgPSBzYyArICh0MD4wKSArICh0MT4wKSArICh0Mj4wKSArICh0Mz4wKTsgICAKKyAgfQ0KKyAgCisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiaXRDb3VudFszXT1leHRyYWN0X2goYmMzXzQpICsgc2M7CisgIGJpdENvdW50WzRdPWV4dHJhY3RfbChiYzNfNCkgKyBzYzsKKyAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKKyAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKKyAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOworICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMV09YmMxMSArIHNjOworICAKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudDVfNl83XzhfOV8xMF8xMQorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNS0xMSAKKyogcmV0dXJuczogICAgICAKKyogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDUtMTEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY291bnQ1XzZfN184XzlfMTBfMTEoY29uc3QgV29yZDE2ICp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkKK3sKKworICBXb3JkMzIgdDAsdDEsaTsKKyAgV29yZDMyIGJjNV82LGJjN184LGJjOV8xMDsKKyAgV29yZDE2IGJjMTEsc2M7DQorCisgIGJjNV82PTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiYzdfOD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYmM5XzEwPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7CisKKyAgICB0MCA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgCisgICAgdDEgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgIAorCisgICAgYmM1XzYgPSBiYzVfNiArIEVYUEFORChodWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOyAgICAgICAgICAgICAgICAgIAorCisgICAgdDA9QUJTKHQwKTsKKyAgICB0MT1BQlModDEpOworICAgICAKKyAgICBiYzdfOCA9IGJjN184ICsgRVhQQU5EKGh1ZmZfbHRhYjdfOFt0MF1bdDFdKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgYmM5XzEwID0gYmM5XzEwICsgRVhQQU5EKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgIAorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsKKyAgICAKKyAgICAgICAKKyAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOworICB9CisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYml0Q291bnRbNV09ZXh0cmFjdF9oKGJjNV82KTsKKyAgYml0Q291bnRbNl09ZXh0cmFjdF9sKGJjNV82KTsKKyAgYml0Q291bnRbN109ZXh0cmFjdF9oKGJjN184KSArIHNjOworICBiaXRDb3VudFs4XT1leHRyYWN0X2woYmM3XzgpICsgc2M7CisgIGJpdENvdW50WzldPWV4dHJhY3RfaChiYzlfMTApICsgc2M7CisgIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMV09YmMxMSArIHNjOworICAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnQ3XzhfOV8xMF8xMQorKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZXMgNy0xMSAKKyogcmV0dXJuczogICAgICAKKyogaW5wdXQ6ICAgICAgICBxdWFudGl6ZWQgc3BlY3RydW0KKyogb3V0cHV0OiAgICAgICBiaXRDb3VudCBmb3IgdGFibGVzIDctMTEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBjb3VudDdfOF85XzEwXzExKGNvbnN0IFdvcmQxNiAqdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KQoreworICBXb3JkMzIgdDAsdDEsIGk7CisgIFdvcmQzMiBiYzdfOCxiYzlfMTA7CisgIFdvcmQxNiBiYzExLHNjOworICAgIAorICBiYzdfOD0wOyAgICAgICAgICAgICAgICAgICAgICAgCisgIGJjOV8xMD0wOyAgICAgICAgICAgICAgICAgICAgICAKKyAgYmMxMT0wOyAgICAgICAgICAgICAgICAgICAgICAgIAorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yKGk9MDtpPHdpZHRoO2krPTIpeworCisgICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsKKyAgICB0MT1BQlModmFsdWVzW2krMV0pOworCisgICAgYmM3XzggPSBiYzdfOCArIEVYUEFORChodWZmX2x0YWI3XzhbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgIAorICAgIGJjOV8xMCA9IGJjOV8xMCArIEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAKKyAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwXVt0MV07CisgICAKKyAgICAgICAKKyAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOworICB9CisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgCisgIGJpdENvdW50WzddPWV4dHJhY3RfaChiYzdfOCkgKyBzYzsKKyAgYml0Q291bnRbOF09ZXh0cmFjdF9sKGJjN184KSArIHNjOworICBiaXRDb3VudFs5XT1leHRyYWN0X2goYmM5XzEwKSArIHNjOworICBiaXRDb3VudFsxMF09ZXh0cmFjdF9sKGJjOV8xMCkgKyBzYzsKKyAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsKKyAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudDlfMTBfMTEKKyogZGVzY3JpcHRpb246ICBjb3VudHMgdGFibGVzIDktMTEgCisqIHJldHVybnM6ICAgICAgCisqIGlucHV0OiAgICAgICAgcXVhbnRpemVkIHNwZWN0cnVtCisqIG91dHB1dDogICAgICAgYml0Q291bnQgZm9yIHRhYmxlcyA5LTExCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvdW50OV8xMF8xMShjb25zdCBXb3JkMTYgKnZhbHVlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkNCit7DQorDQorICBXb3JkMzIgdDAsdDEsaTsgIA0KKyAgV29yZDMyIGJjOV8xMDsNCisgIFdvcmQxNiBiYzExLHNjOw0KKw0KKyAgYmM5XzEwPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBiYzExPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIHNjPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKyAgZm9yKGk9MDtpPHdpZHRoO2krPTIpew0KKw0KKyAgICB0MD1BQlModmFsdWVzW2krMF0pOw0KKyAgICB0MT1BQlModmFsdWVzW2krMV0pOw0KKyAgICANCisNCisgICAgYmM5XzEwICs9IEVYUEFORChodWZmX2x0YWI5XzEwW3QwXVt0MV0pOyAgICAgICAgICAgDQorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsNCisNCisgICAgICAgDQorICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7DQorICB9DQorICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzJdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbM109SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzVdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbNl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzhdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbOV09ZXh0cmFjdF9oKGJjOV8xMCkgKyBzYzsNCisgIGJpdENvdW50WzEwXT1leHRyYWN0X2woYmM5XzEwKSArIHNjOw0KKyAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsNCisgIA0KK30KKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudDExCisqIGRlc2NyaXB0aW9uOiAgY291bnRzIHRhYmxlIDExIAorKiByZXR1cm5zOiAgICAgIAorKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZSAxMQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgc3RhdGljIHZvaWQgY291bnQxMShjb25zdCBXb3JkMTYgKnZhbHVlcywNCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICpiaXRDb3VudCkNCit7DQorICBXb3JkMzIgdDAsdDEsaTsNCisgIFdvcmQxNiBiYzExLHNjOyAgDQorDQorICBiYzExPTA7ICAgICAgICAgICAgICAgICAgICAgICAgDQorICBzYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBmb3IoaT0wO2k8d2lkdGg7aSs9Mil7DQorICAgIHQwPUFCUyh2YWx1ZXNbaSswXSk7DQorICAgIHQxPUFCUyh2YWx1ZXNbaSsxXSk7DQorICAgIGJjMTEgPSBiYzExICsgaHVmZl9sdGFiMTFbdDBdW3QxXTsNCisNCisgICAgICAgDQorICAgIHNjID0gc2MgKyAodDA+MCkgKyAodDE+MCk7DQorICB9DQorDQorICBiaXRDb3VudFsxXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICANCisgIGJpdENvdW50WzNdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFs0XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICANCisgIGJpdENvdW50WzZdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFs3XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICANCisgIGJpdENvdW50WzldPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgDQorICBiaXRDb3VudFsxMF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgIA0KKyAgYml0Q291bnRbMTFdPWJjMTEgKyBzYzsNCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudEVzYworKiBkZXNjcmlwdGlvbjogIGNvdW50cyB0YWJsZSAxMSAod2l0aCBFc2MpIAorKiByZXR1cm5zOiAgICAgIAorKiBpbnB1dDogICAgICAgIHF1YW50aXplZCBzcGVjdHJ1bQorKiBvdXRwdXQ6ICAgICAgIGJpdENvdW50IGZvciB0YWJsZXMgMTEgKHdpdGggRXNjKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvdW50RXNjKGNvbnN0IFdvcmQxNiAqdmFsdWVzLA0KKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgd2lkdGgsDQorICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpiaXRDb3VudCkNCit7DQorICBXb3JkMzIgdDAsdDEsdDAwLHQwMSxpOw0KKyAgV29yZDE2IGJjMTEsZWMsc2M7ICANCisNCisgIGJjMTE9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgc2M9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICBlYz0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgIGZvcihpPTA7aTx3aWR0aDtpKz0yKXsNCisgICAgdDA9QUJTKHZhbHVlc1tpKzBdKTsNCisgICAgdDE9QUJTKHZhbHVlc1tpKzFdKTsNCisgICAgDQorICAgICAgIA0KKyAgICBzYyA9IHNjICsgKHQwPjApICsgKHQxPjApOw0KKw0KKyAgICB0MDAgPSBtaW4odDAsMTYpOw0KKyAgICB0MDEgPSBtaW4odDEsMTYpOw0KKyAgICBiYzExID0gYmMxMSArIGh1ZmZfbHRhYjExW3QwMF1bdDAxXTsNCisgICAgDQorICAgICANCisgICAgaWYodDAgPj0gMTYpew0KKyAgICAgIGVjID0gZWMgKyA1Ow0KKyAgICAgIHdoaWxlKHN1Yih0MD0odDAgPj4gMSksIDE2KSA+PSAwKSB7DQorICAgICAgICBlYyA9IGVjICsgMjsNCisgICAgICB9DQorICAgIH0NCisgICAgDQorICAgICANCisgICAgaWYodDEgPj0gMTYpew0KKyAgICAgIGVjID0gZWMgKyA1Ow0KKyAgICAgIHdoaWxlKHN1Yih0MT0odDEgPj4gMSksIDE2KSA+PSAwKSB7DQorICAgICAgICBlYyA9IGVjICsgMjsNCisgICAgICB9DQorICAgIH0NCisgIH0NCisgIGJpdENvdW50WzFdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbMl09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFszXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzRdPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbNV09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs2XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzddPUlOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgIA0KKyAgYml0Q291bnRbOF09SU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgDQorICBiaXRDb3VudFs5XT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgICANCisgIGJpdENvdW50WzEwXT1JTlZBTElEX0JJVENPVU5UOyAgICAgICAgIA0KKyAgYml0Q291bnRbMTFdPWJjMTEgKyBzYyArIGVjOw0KK30KKworCit0eXBlZGVmIHZvaWQgKCpDT1VOVF9GVU5DVElPTikoY29uc3QgV29yZDE2ICp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKmJpdENvdW50KTsKKworc3RhdGljIENPVU5UX0ZVTkNUSU9OIGNvdW50RnVuY1RhYmxlW0NPREVfQk9PS19FU0NfTEFWKzFdID0KKyAgeworCisgICAgY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMSwgIC8qIDAgICovCisgICAgY291bnQxXzJfM180XzVfNl83XzhfOV8xMF8xMSwgIC8qIDEgICovCisgICAgY291bnQzXzRfNV82XzdfOF85XzEwXzExLCAgICAgIC8qIDIgICovCisgICAgY291bnQ1XzZfN184XzlfMTBfMTEsICAgICAgICAgIC8qIDMgICovCisgICAgY291bnQ1XzZfN184XzlfMTBfMTEsICAgICAgICAgIC8qIDQgICovCisgICAgY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgIC8qIDUgICovCisgICAgY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgIC8qIDYgICovCisgICAgY291bnQ3XzhfOV8xMF8xMSwgICAgICAgICAgICAgIC8qIDcgICovCisgICAgY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDggICovCisgICAgY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDkgICovCisgICAgY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDEwICovCisgICAgY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDExICovCisgICAgY291bnQ5XzEwXzExLCAgICAgICAgICAgICAgICAgIC8qIDEyICovCisgICAgY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDEzICovCisgICAgY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE0ICovCisgICAgY291bnQxMSwgICAgICAgICAgICAgICAgICAgICAgIC8qIDE1ICovCisgICAgY291bnRFc2MgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2ICovCisgIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBiaXRDb3VudAorKiBkZXNjcmlwdGlvbjogIGNvdW50IGJpdHMgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBiaXRDb3VudChjb25zdCBXb3JkMTYgKnZhbHVlcywKKyAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHdpZHRoLAorICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbWF4VmFsLAorICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAqYml0Q291bnQpCit7CisgIC8qCisgICAgY2hlY2sgaWYgd2UgY2FuIHVzZSBjb2RlYm9vayAwCisgICovCisgICAgIAorICBpZihtYXhWYWwgPT0gMCkKKyAgICBiaXRDb3VudFswXSA9IDA7CisgIGVsc2UKKyAgICBiaXRDb3VudFswXSA9IElOVkFMSURfQklUQ09VTlQ7CisKKyAgbWF4VmFsID0gbWluKG1heFZhbCwgQ09ERV9CT09LX0VTQ19MQVYpOworICBjb3VudEZ1bmNUYWJsZVttYXhWYWxdKHZhbHVlcyx3aWR0aCxiaXRDb3VudCk7CisKKyAgcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY29kZVZhbHVlcworKiBkZXNjcmlwdGlvbjogIHdyaXRlIGh1ZmZ1bSBiaXRzIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgY29kZVZhbHVlcyhXb3JkMTYgKnZhbHVlcywgV29yZDE2IHdpZHRoLCBXb3JkMTYgY29kZUJvb2ssIEhBTkRMRV9CSVRfQlVGIGhCaXRzdHJlYW0pDQorew0KKw0KKyAgV29yZDMyIGksIHQwLCB0MSwgdDIsIHQzLCB0MDAsIHQwMTsNCisgIFdvcmQxNiBjb2RlV29yZCwgY29kZUxlbmd0aDsNCisgIFdvcmQxNiBzaWduLCBzaWduTGVuZ3RoOw0KKw0KKyAgIA0KKyAgc3dpdGNoIChjb2RlQm9vaykgew0KKyAgICBjYXNlIENPREVfQk9PS19aRVJPX05POg0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS18xX05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsNCisgICAgICAgIHQwICAgICAgICAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSAgICAgICAgID0gdmFsdWVzW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDIgICAgICAgICA9IHZhbHVlc1tpKzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQzICAgICAgICAgPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiMVt0MCsxXVt0MSsxXVt0MisxXVt0MysxXTsgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiMV8yW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdKTsgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLCBjb2RlV29yZCwgY29kZUxlbmd0aCk7ICAgICAgICANCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzJfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9NCkgew0KKyAgICAgICAgdDAgICAgICAgICA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MiAgICAgICAgID0gdmFsdWVzW2krMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDMgICAgICAgICA9IHZhbHVlc1tpKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIyW3QwKzFdW3QxKzFdW3QyKzFdW3QzKzFdOyAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWIxXzJbdDArMV1bdDErMV1bdDIrMV1bdDMrMV0pOyAgICAgIA0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS18zX05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsNCisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQwICE9IDApew0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQwIDwgMCl7DQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQwPS10MDsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQxICE9IDApew0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQxIDwgMCl7DQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQxPS10MTsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQyICE9IDApew0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQyIDwgMCl7DQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQyPS10MjsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgdDMgPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGlmKHQzICE9IDApew0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7DQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7IA0KKyAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQzIDwgMCl7DQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQzPS10MzsNCisgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjNbdDBdW3QxXVt0Ml1bdDNdOyAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOyAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS180X05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTQpIHsNCisgICAgICAgIHNpZ249MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDAgPSB2YWx1ZXNbaSswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQwICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOw0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyANCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDA9LXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgfQ0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQxICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOw0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyANCisgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MSA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MT0tdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDIgPSB2YWx1ZXNbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQyICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOw0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyANCisgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MiA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0Mj0tdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDMgPSB2YWx1ZXNbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICANCisgICAgICAgIGlmKHQzICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOw0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyANCisgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MyA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0Mz0tdDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjRbdDBdW3QxXVt0Ml1bdDNdOyAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjNfNFt0MF1bdDFdW3QyXVt0M10pOyAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgIGNhc2UgQ09ERV9CT09LXzVfTk86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9MikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQxICAgICAgICAgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiNVt0MCs0XVt0MSs0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiNV82W3QwKzRdW3QxKzRdKTsgICAgICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisNCisgICAgY2FzZSBDT0RFX0JPT0tfNl9OTzoNCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7DQorICAgICAgICB0MCAgICAgICAgID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDEgICAgICAgICA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI2W3QwKzRdW3QxKzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWI1XzZbdDArNF1bdDErNF0pOyAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS183X05POg0KKyAgICAgIGZvcihpPTA7IGk8d2lkdGg7IGkrPTIpew0KKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDAgIT0gMCl7DQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsNCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgDQorICAgICAgICAgICANCisgICAgICAgICAgaWYodDAgPCAwKXsNCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDA9LXQwOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgaWYodDEgIT0gMCl7DQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsNCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgDQorICAgICAgICAgICANCisgICAgICAgICAgaWYodDEgPCAwKXsNCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDE9LXQxOw0KKyAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBjb2RlV29yZCAgID0gaHVmZl9jdGFiN1t0MF1bdDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IEhJX0xUQUIoaHVmZl9sdGFiN184W3QwXVt0MV0pOyAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLGNvZGVXb3JkLGNvZGVMZW5ndGgpOw0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sc2lnbixzaWduTGVuZ3RoKTsNCisgICAgICB9DQorICAgICAgYnJlYWs7DQorDQorICAgIGNhc2UgQ09ERV9CT09LXzhfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mikgew0KKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHNpZ25MZW5ndGg9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MCA9IHZhbHVlc1tpKzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgaWYodDAgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQwIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQwPS10MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgdDEgPSB2YWx1ZXNbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGlmKHQxICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbkxlbmd0aCA9IHNpZ25MZW5ndGggKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBpZih0MSA8IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MT0tdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWI4W3QwXVt0MV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBjb2RlTGVuZ3RoID0gTE9fTFRBQihodWZmX2x0YWI3XzhbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7DQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxzaWduLHNpZ25MZW5ndGgpOw0KKyAgICAgIH0NCisgICAgICBicmVhazsNCisNCisgICAgY2FzZSBDT0RFX0JPT0tfOV9OTzoNCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7DQorICAgICAgICBzaWduPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBpZih0MCAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDA9LXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgaWYodDEgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQxPS10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjlbdDBdW3QxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBISV9MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS18xMF9OTzoNCisgICAgICBmb3IoaT0wOyBpPHdpZHRoOyBpKz0yKSB7DQorICAgICAgICBzaWduPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgc2lnbkxlbmd0aD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBpZih0MCAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgc2lnbiA9IHNpZ24gPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICBzaWdufD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDA9LXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgaWYodDEgIT0gMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHQxPS10MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYjEwW3QwXVt0MV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGNvZGVMZW5ndGggPSBMT19MVEFCKGh1ZmZfbHRhYjlfMTBbdDBdW3QxXSk7ICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBjYXNlIENPREVfQk9PS19FU0NfTk86DQorICAgICAgZm9yKGk9MDsgaTx3aWR0aDsgaSs9Mikgew0KKyAgICAgICAgc2lnbj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBzaWduTGVuZ3RoPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIHQwID0gdmFsdWVzW2krMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIGlmKHQwICE9IDApeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ25MZW5ndGggPSBzaWduTGVuZ3RoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHNpZ24gPSBzaWduIDw8IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgaWYodDAgPCAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgc2lnbnw9MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICB0MD0tdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MSA9IHZhbHVlc1tpKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBpZih0MSAhPSAwKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduTGVuZ3RoID0gc2lnbkxlbmd0aCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBzaWduID0gc2lnbiA8PCAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIGlmKHQxIDwgMCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHNpZ258PTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgdDE9LXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICB0MDAgPSBtaW4odDAsMTYpOw0KKyAgICAgICAgdDAxID0gbWluKHQxLDE2KTsNCisNCisgICAgICAgIGNvZGVXb3JkICAgPSBodWZmX2N0YWIxMVt0MDBdW3QwMV07ICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgY29kZUxlbmd0aCA9IGh1ZmZfbHRhYjExW3QwMF1bdDAxXTsgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSxjb2RlV29yZCxjb2RlTGVuZ3RoKTsNCisgICAgICAgIFdyaXRlQml0cyhoQml0c3RyZWFtLHNpZ24sc2lnbkxlbmd0aCk7DQorICAgICAgICAgDQorICAgICAgICBpZih0MCA+PSAxNil7DQorICAgICAgICAgIFdvcmQxNiBuLCBwOw0KKyAgICAgICAgICBuPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHA9dDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgd2hpbGUoc3ViKHA9KHAgPj4gMSksIDE2KSA+PSAwKXsNCisgICAgICAgICAgICAgDQorICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsNCisgICAgICAgICAgICBuID0gbiArIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsNCisgICAgICAgICAgbiA9IG4gKyA0Ow0KKyAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwodDAgLSAoMSA8PCBuKSksbik7DQorICAgICAgICB9DQorICAgICAgICAgDQorICAgICAgICBpZih0MSA+PSAxNil7DQorICAgICAgICAgIFdvcmQxNiBuLCBwOw0KKyAgICAgICAgICBuPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIHA9dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgd2hpbGUoc3ViKHA9KHAgPj4gMSksIDE2KSA+PSAwKXsNCisgICAgICAgICAgICAgDQorICAgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMSwxKTsNCisgICAgICAgICAgICBuID0gbiArIDE7DQorICAgICAgICAgIH0NCisgICAgICAgICAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sMCwxKTsNCisgICAgICAgICAgbiA9IG4gKyA0Ow0KKyAgICAgICAgICBXcml0ZUJpdHMoaEJpdHN0cmVhbSwodDEgLSAoMSA8PCBuKSksbik7DQorICAgICAgICB9DQorICAgICAgfQ0KKyAgICAgIGJyZWFrOw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICAgIGJyZWFrOw0KKyAgfQ0KKyAgcmV0dXJuKDApOw0KK30KKworV29yZDE2IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShXb3JkMTYgZGVsdGEpCit7CisgIHJldHVybihodWZmX2x0YWJzY2ZbZGVsdGErQ09ERV9CT09LX1NDRl9MQVZdKTsKK30KKworV29yZDE2IGNvZGVTY2FsZWZhY3RvckRlbHRhKFdvcmQxNiBkZWx0YSwgSEFORExFX0JJVF9CVUYgaEJpdHN0cmVhbSkKK3sKKyAgV29yZDMyIGNvZGVXb3JkOyAKKyAgV29yZDE2IGNvZGVMZW5ndGg7CisgIAorICAgCisgIGlmKGRlbHRhID4gQ09ERV9CT09LX1NDRl9MQVYgfHwgZGVsdGEgPCAtQ09ERV9CT09LX1NDRl9MQVYpCisgICAgcmV0dXJuKDEpOworICAKKyAgY29kZVdvcmQgICA9IGh1ZmZfY3RhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsgICAgICAgICAgICAKKyAgY29kZUxlbmd0aCA9IGh1ZmZfbHRhYnNjZltkZWx0YSArIENPREVfQk9PS19TQ0ZfTEFWXTsgICAgICAgICAgICAKKyAgV3JpdGVCaXRzKGhCaXRzdHJlYW0sY29kZVdvcmQsY29kZUxlbmd0aCk7CisgIHJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYml0YnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0OGYwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGJ1ZmZlci5jCkBAIC0wLDAgKzEsMTcyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQliaXRidWZmZXIuYw0KKw0KKwlDb250ZW50OglCaXQgQnVmZmVyIE1hbmFnZW1lbnQgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpdGJ1ZmZlci5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogdXBkYXRlQml0QnVmV29yZFB0cgorKiBkZXNjcmlwdGlvbjogIHVwZGF0ZSBCaXQgQnVmZmVyIHBvaW50ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgdXBkYXRlQml0QnVmV29yZFB0cihIQU5ETEVfQklUX0JVRiBoQml0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDggKipwQml0QnVmV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgY250KQoreworICAqcEJpdEJ1ZldvcmQgKz0gY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmKCpwQml0QnVmV29yZCA+IGhCaXRCdWYtPnBCaXRCdWZFbmQpIHsKKyAgICAqcEJpdEJ1ZldvcmQgLT0gKGhCaXRCdWYtPnBCaXRCdWZFbmQgLSBoQml0QnVmLT5wQml0QnVmQmFzZSArIDEpOyAgICAgICAgICAgICAgICAgICAKKyAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZigqcEJpdEJ1ZldvcmQgPCBoQml0QnVmLT5wQml0QnVmQmFzZSkgeworICAgICpwQml0QnVmV29yZCArPSAoaEJpdEJ1Zi0+cEJpdEJ1ZkVuZCAtIGhCaXRCdWYtPnBCaXRCdWZCYXNlICsgMSk7ICAgICAgICAgICAgICAgICAgIAorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENyZWF0ZUJpdEJ1ZmZlcgorKiBkZXNjcmlwdGlvbjogIGNyZWF0ZSBhbmQgaW5pdCBCaXQgQnVmZmVyIE1hbmFnZW1lbnQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSEFORExFX0JJVF9CVUYgQ3JlYXRlQml0QnVmZmVyKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQ4ICpwQml0QnVmQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIGJpdEJ1ZlNpemUpCit7CisgIGFzc2VydChiaXRCdWZTaXplKjggPD0gMzI3NjgpOworCisgIGhCaXRCdWYtPnBCaXRCdWZCYXNlID0gcEJpdEJ1ZkJhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoQml0QnVmLT5wQml0QnVmRW5kICA9IHBCaXRCdWZCYXNlICsgYml0QnVmU2l6ZSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGhCaXRCdWYtPnBXcml0ZU5leHQgID0gcEJpdEJ1ZkJhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGhCaXRCdWYtPmNhY2hlICAgICAgID0gMDsKKyAgCisgIGhCaXRCdWYtPndCaXRQb3MgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoQml0QnVmLT5jbnRCaXRzICAgICA9IDA7ICAgCisgIAorICBoQml0QnVmLT5zaXplICAgICAgICA9IChiaXRCdWZTaXplIDw8IDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoQml0QnVmLT5pc1ZhbGlkICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICByZXR1cm4gaEJpdEJ1ZjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IERlbGV0ZUJpdEJ1ZmZlcgorKiBkZXNjcmlwdGlvbjogIHVuaW5pdCBCaXQgQnVmZmVyIE1hbmFnZW1lbnQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBEZWxldGVCaXRCdWZmZXIoSEFORExFX0JJVF9CVUYgKmhCaXRCdWYpCit7CisgIGlmKCpoQml0QnVmKQ0KKwkoKmhCaXRCdWYpLT5pc1ZhbGlkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgKmhCaXRCdWYgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBSZXNldEJpdEJ1ZgorKiBkZXNjcmlwdGlvbjogIHJlc2V0IEJpdCBCdWZmZXIgTWFuYWdlbWVudAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFJlc2V0Qml0QnVmKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYsCisgICAgICAgICAgICAgICAgIFVXb3JkOCAqcEJpdEJ1ZkJhc2UsCisgICAgICAgICAgICAgICAgIFdvcmQxNiAgYml0QnVmU2l6ZSkKK3sKKyAgaEJpdEJ1Zi0+cEJpdEJ1ZkJhc2UgPSBwQml0QnVmQmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGhCaXRCdWYtPnBCaXRCdWZFbmQgID0gcEJpdEJ1ZkJhc2UgKyBiaXRCdWZTaXplIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaEJpdEJ1Zi0+cFdyaXRlTmV4dCAgPSBwQml0QnVmQmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgaEJpdEJ1Zi0+d0JpdFBvcyAgICAgPSAwOyAgICAKKyAgaEJpdEJ1Zi0+Y250Qml0cyAgICAgPSAwOyAgICAKKyAgCisgIGhCaXRCdWYtPmNhY2hlCSAgID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENvcHlCaXRCdWYKKyogZGVzY3JpcHRpb246ICBjb3B5IEJpdCBCdWZmZXIgTWFuYWdlbWVudAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIENvcHlCaXRCdWYoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZlNyYywKKyAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0QnVmRHN0KQoreworICAqaEJpdEJ1ZkRzdCA9ICpoQml0QnVmU3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEdldEJpdHNBdmFpbAorKiBkZXNjcmlwdGlvbjogIGdldCBhdmFpbGFibGUgYml0cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgR2V0Qml0c0F2YWlsKEhBTkRMRV9CSVRfQlVGIGhCaXRCdWYpCit7CisgIHJldHVybiBoQml0QnVmLT5jbnRCaXRzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogV3JpdGVCaXRzCisqIGRlc2NyaXB0aW9uOiAgd3JpdGUgYml0cyB0byB0aGUgYnVmZmVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBXcml0ZUJpdHMoSEFORExFX0JJVF9CVUYgaEJpdEJ1ZiwKKyAgICAgICAgICAgICAgICAgV29yZDMyIHdyaXRlVmFsdWUsCisgICAgICAgICAgICAgICAgIFdvcmQxNiBub0JpdHNUb1dyaXRlKQoreworICBXb3JkMTYgd0JpdFBvczsKKworICBhc3NlcnQobm9CaXRzVG9Xcml0ZSA8PSAoV29yZDE2KXNpemVvZihXb3JkMzIpKjgpOworCisgIGlmKG5vQml0c1RvV3JpdGUgPT0gMCkKKwkgIHJldHVybiBub0JpdHNUb1dyaXRlOworCisgIGhCaXRCdWYtPmNudEJpdHMgKz0gbm9CaXRzVG9Xcml0ZTsgICAKKworICB3Qml0UG9zID0gaEJpdEJ1Zi0+d0JpdFBvczsKKyAgd0JpdFBvcyArPSBub0JpdHNUb1dyaXRlOworICB3cml0ZVZhbHVlIDw8PSAzMiAtIHdCaXRQb3M7CQorICB3cml0ZVZhbHVlIHw9IGhCaXRCdWYtPmNhY2hlOworICAKKyAgd2hpbGUgKHdCaXRQb3MgPj0gOCkgCisgIHsKKwkgIFVXb3JkOCB0bXA7CisJICB0bXAgPSAoVVdvcmQ4KSgod3JpdGVWYWx1ZSA+PiAyNCkgJiAweEZGKTsKKwkgIAorCSAgKmhCaXRCdWYtPnBXcml0ZU5leHQrKyA9IHRtcDsJCQorCSAgd3JpdGVWYWx1ZSA8PD0gODsKKwkgIHdCaXRQb3MgLT0gODsKKyAgfQorICAKKyAgaEJpdEJ1Zi0+d0JpdFBvcyA9IHdCaXRQb3M7CisgIGhCaXRCdWYtPmNhY2hlID0gd3JpdGVWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcmV0dXJuIG5vQml0c1RvV3JpdGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2JpdGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGMyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9iaXRlbmMuYwpAQCAtMCwwICsxLDY5MCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJYml0ZW5jLmMNCisNCisJQ29udGVudDoJQml0c3RyZWFtIGVuY29kZXIgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImJpdGVuYy5oIgorI2luY2x1ZGUgImJpdF9jbnQuaCIKKyNpbmNsdWRlICJkeW5fYml0cy5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UuaCIKKworCitzdGF0aWMgY29uc3QgIFdvcmQxNiBnbG9iYWxHYWluT2Zmc2V0ID0gMTAwOworc3RhdGljIGNvbnN0ICBXb3JkMTYgaWNzUmVzZXJ2ZWRCaXQgICA9IDA7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGVuY29kZVNwZWN0cmFsRGF0YQorKiBkZXNjcmlwdGlvbjogIGVuY29kZSBzcGVjdHJhbCBkYXRhCisqIHJldHVybnM6ICAgICAgc3BlY3RyYWwgYml0cyB1c2VkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMzIgZW5jb2RlU3BlY3RyYWxEYXRhKFdvcmQxNiAgICAgICAgICAgICAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9EQVRBICAgICAgICpzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICAgICAgaEJpdFN0cmVhbSkKK3sKKyAgV29yZDE2IGksc2ZiOworICBXb3JkMTYgZGJnVmFsOworICBTRUNUSU9OX0lORk8qIHBzZWN0aW9uaW5mbzsKKyAgZGJnVmFsID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IoaT0wOyBpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7IGkrKykgeworICAgIHBzZWN0aW9uaW5mbyA9ICYoc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldKTsNCisJLyoKKyAgICAgICBodWZmZW5jb2RlIHNwZWN0cmFsIGRhdGEgZm9yIHRoaXMgc2VjdGlvbgorICAgICovCisgICAgZm9yKHNmYj1wc2VjdGlvbmluZm8tPnNmYlN0YXJ0OworICAgICAgICBzZmI8cHNlY3Rpb25pbmZvLT5zZmJTdGFydCtwc2VjdGlvbmluZm8tPnNmYkNudDsKKyAgICAgICAgc2ZiKyspIHsKKyAgICAgIGNvZGVWYWx1ZXMocXVhbnRTcGVjdHJ1bStzZmJPZmZzZXRbc2ZiXSwKKyAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdLAorICAgICAgICAgICAgICAgICBwc2VjdGlvbmluZm8tPmNvZGVCb29rLAorICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKKyAgICB9CisgIH0KKworICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmVuY29kZUdsb2JhbEdhaW4KKyogZGVzY3JpcHRpb246IGVuY29kZXMgR2xvYmFsIEdhaW4gKGNvbW1vbiBzY2FsZSBmYWN0b3IpCisqIHJldHVybnM6ICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVuY29kZUdsb2JhbEdhaW4oV29yZDE2IGdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dOb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2NhbGVmYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCit7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAoKGdsb2JhbEdhaW4gLSBzY2FsZWZhYykgKyBnbG9iYWxHYWluT2Zmc2V0LShsb2dOb3JtIDw8IDIpKSwgOCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6ZW5jb2RlSWNzSW5mbworKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBJY3MgSW5mbworKiByZXR1cm5zOiAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGVuY29kZUljc0luZm8oV29yZDE2IGJsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ3JvdXBpbmdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbSkKK3sKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saWNzUmVzZXJ2ZWRCaXQsMSk7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLGJsb2NrVHlwZSwyKTsKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sd2luZG93U2hhcGUsMSk7CisKKyAgIAorICBzd2l0Y2goYmxvY2tUeXBlKXsKKyAgICBjYXNlIExPTkdfV0lORE9XOgorICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsNik7CisKKyAgICAgIC8qIE5vIHByZWRpY3RvciBkYXRhIHByZXNlbnQgKi8KKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSE9SVF9XSU5ET1c6CisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsNCk7CisKKyAgICAgIC8qCisgICAgICBXcml0ZSBncm91cGluZyBiaXRzCisgICAgICAqLworICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZ3JvdXBpbmdNYXNrLFRSQU5TX0ZBQy0xKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBlbmNvZGVTZWN0aW9uRGF0YQorKiBkZXNjcmlwdGlvbjogIGVuY29kZSBzZWN0aW9uIGRhdGEgKGNvbW1vbiBIdWZmbWFuIGNvZGVib29rcyBmb3IgYWRqYWNlbnQKKyogICAgICAgICAgICAgICBTRkIncykKKyogcmV0dXJuczogICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMzIgZW5jb2RlU2VjdGlvbkRhdGEoU0VDVElPTl9EQVRBICpzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSkKK3sKKyAgV29yZDE2IHNlY3RFc2NhcGVWYWw9MCxzZWN0TGVuQml0cz0wOworICBXb3JkMTYgc2VjdExlbjsKKyAgV29yZDE2IGk7CisgIFdvcmQxNiBkYmdWYWw9R2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOworICAgICAgIAorCisgICAKKyAgc3dpdGNoKHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUpCisgIHsKKyAgICBjYXNlIExPTkdfV0lORE9XOgorICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICBzZWN0RXNjYXBlVmFsID0gU0VDVF9FU0NfVkFMX0xPTkc7ICAgICAgICAgICAgICAgICAKKyAgICAgIHNlY3RMZW5CaXRzICAgPSBTRUNUX0JJVFNfTE9ORzsgICAgICAgICAgICAgICAgICAgIAorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgIHNlY3RFc2NhcGVWYWwgPSBTRUNUX0VTQ19WQUxfU0hPUlQ7ICAgICAgICAgICAgICAgIAorICAgICAgc2VjdExlbkJpdHMgICA9IFNFQ1RfQklUU19TSE9SVDsgICAgICAgICAgICAgICAgICAgCisgICAgICBicmVhazsKKyAgfQorCisgIGZvcihpPTA7aTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zO2krKykgeworICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXS5jb2RlQm9vayw0KTsKKyAgICBzZWN0TGVuID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW2ldLnNmYkNudDsgICAgICAgIAorCisgICAgd2hpbGUoc2VjdExlbiA+PSBzZWN0RXNjYXBlVmFsKSB7CisgICAgICAgCisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxzZWN0RXNjYXBlVmFsLHNlY3RMZW5CaXRzKTsKKyAgICAgIHNlY3RMZW4gPSBzZWN0TGVuIC0gc2VjdEVzY2FwZVZhbDsKKyAgICB9CisgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sc2VjdExlbixzZWN0TGVuQml0cyk7CisgIH0KKyAgcmV0dXJuKEdldEJpdHNBdmFpbChoQml0U3RyZWFtKS1kYmdWYWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZW5jb2RlU2NhbGVGYWN0b3JEYXRhCisqIGRlc2NyaXB0aW9uOiAgZW5jb2RlIERQQ00gY29kZWQgc2NhbGUgZmFjdG9ycworKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQzMiBlbmNvZGVTY2FsZUZhY3RvckRhdGEoVVdvcmQxNiAgICAgICAgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgICAqc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAqc2NhbGVmYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiAgaEJpdFN0cmVhbSkKK3sKKyAgV29yZDE2IGksaixsYXN0VmFsU2NmLGRlbHRhU2NmOworICBXb3JkMTYgZGJnVmFsID0gR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pOworICBTRUNUSU9OX0lORk8qIHBzZWN0aW9uaW5mbzsgCisKKyAgbGFzdFZhbFNjZj1zY2FsZWZhY1tzZWN0aW9uRGF0YS0+Zmlyc3RTY2ZdOyAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yKGk9MDtpPHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnM7aSsrKXsKKyAgICBwc2VjdGlvbmluZm8gPSAmKHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mb1tpXSk7IAorICAgIGlmIChwc2VjdGlvbmluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PKXsKKyAgICAgIGZvciAoaj1wc2VjdGlvbmluZm8tPnNmYlN0YXJ0OworICAgICAgICAgICBqPHBzZWN0aW9uaW5mby0+c2ZiU3RhcnQrcHNlY3Rpb25pbmZvLT5zZmJDbnQ7IGorKyl7CisgICAgICAgICAKKyAgICAgICAgaWYobWF4VmFsdWVJblNmYltqXSA9PSAwKSB7CisgICAgICAgICAgZGVsdGFTY2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGRlbHRhU2NmID0gbGFzdFZhbFNjZiAtIHNjYWxlZmFjW2pdOworICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY1tqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgIGlmKGNvZGVTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmLGhCaXRTdHJlYW0pKXsKKyAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorICByZXR1cm4oR2V0Qml0c0F2YWlsKGhCaXRTdHJlYW0pLWRiZ1ZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmVuY29kZU1zSW5mbworKiBkZXNjcmlwdGlvbjogZW5jb2RlcyBNUy1TdGVyZW8gSW5mbworKiByZXR1cm5zOiAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBlbmNvZGVNU0luZm8oV29yZDE2ICAgICAgICAgIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgZ3JwU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBtYXhTZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgIG1zRGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICpqc0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGICBoQml0U3RyZWFtKQoreworICBXb3JkMTYgc2ZiLCBzZmJPZmY7CisKKyAgIAorICBzd2l0Y2gobXNEaWdlc3QpCisgIHsKKyAgICBjYXNlIE1TX05PTkU6CisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxTSV9NU19NQVNLX05PTkUsMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTVNfQUxMOgorICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sU0lfTVNfTUFTS19BTEwsMik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTVNfU09NRToKKyAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLFNJX01TX01BU0tfU09NRSwyKTsKKyAgICAgIGZvcihzZmJPZmYgPSAwOyBzZmJPZmYgPCBzZmJDbnQ7IHNmYk9mZis9Z3JwU2ZiKSB7CisgICAgICAgIGZvcihzZmI9MDsgc2ZiPG1heFNmYjsgc2ZiKyspIHsKKyAgICAgICAgICAgICAKKyAgICAgICAgICBpZihqc0ZsYWdzW3NmYk9mZitzZmJdICYgTVNfT04pIHsKKyAgICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZW5jb2RlVG5zRGF0YQorKiBkZXNjcmlwdGlvbjogIGVuY29kZSBUTlMgZGF0YSAoZmlsdGVyIG9yZGVyLCBjb2VmZnMsIC4uKQorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZW5jb2RlVG5zRGF0YShUTlNfSU5GTyB0bnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKSB7CisgIFdvcmQxNiBpLGs7CisgIEZsYWcgdG5zUHJlc2VudDsKKyAgV29yZDE2IG51bU9mV2luZG93czsKKyAgV29yZDE2IGNvZWZCaXRzOworICBGbGFnIGlzU2hvcnQ7CisKKyAgICAgICAKKyAgaWYgKGJsb2NrVHlwZT09MikgeworICAgIGlzU2hvcnQgPSAxOworICAgIG51bU9mV2luZG93cyA9IFRSQU5TX0ZBQzsKKyAgfQorICBlbHNlIHsKKyAgICBpc1Nob3J0ID0gMDsKKyAgICBudW1PZldpbmRvd3MgPSAxOworICB9CisKKyAgdG5zUHJlc2VudD0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgIAorICAgIGlmICh0bnNJbmZvLnRuc0FjdGl2ZVtpXSkgeworICAgICAgdG5zUHJlc2VudD0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgIAorICBpZiAodG5zUHJlc2VudD09MCkgeworICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7CisgIH0KKyAgZWxzZXsgLyogdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuKi8KKyAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwxLDEpOyAvKmRhdGFfcHJlc2VudCAqLworICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICAgCisgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLnRuc0FjdGl2ZVtpXSwoaXNTaG9ydD8xOjIpKTsKKyAgICAgICAKKyAgICAgIGlmICh0bnNJbmZvLnRuc0FjdGl2ZVtpXSkgeworICAgICAgICAgCisgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCgodG5zSW5mby5jb2VmUmVzW2ldIC0gNCk9PTA/MTowKSwxKTsKKyAgICAgICAgIAorICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLmxlbmd0aFtpXSwoaXNTaG9ydD80OjYpKTsKKyAgICAgICAgIAorICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLm9yZGVyW2ldLChpc1Nob3J0PzM6NSkpOworICAgICAgICAgCisgICAgICAgIGlmICh0bnNJbmZvLm9yZGVyW2ldKXsKKyAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgRklMVEVSX0RJUkVDVElPTiwgMSk7CisgICAgICAgICAgIAorICAgICAgICAgIGlmKHRuc0luZm8uY29lZlJlc1tpXSA9PSA0KSB7CisgICAgICAgICAgICBjb2VmQml0cyA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3Ioaz0wOyBrPHRuc0luZm8ub3JkZXJbaV07IGsrKykgeworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPiAzIHx8CisgICAgICAgICAgICAgICAgICB0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdIDwgLTQpIHsKKyAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvZWZCaXRzID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby5vcmRlcltpXTsgaysrKSB7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAodG5zSW5mby5jb2VmW2kqVE5TX01BWF9PUkRFUl9TSE9SVCtrXSA+IDEgfHwKKyAgICAgICAgICAgICAgICAgIHRuc0luZm8uY29lZltpKlROU19NQVhfT1JERVJfU0hPUlQra10gPCAtMikgeworICAgICAgICAgICAgICAgIGNvZWZCaXRzID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCB0bnNJbmZvLmNvZWZSZXNbaV0gLSBjb2VmQml0cywgMSk7IC8qY29lZl9jb21wcmVzKi8KKyAgICAgICAgICBmb3IgKGs9MDsgazx0bnNJbmZvLm9yZGVyW2ldOyBrKysgKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgV29yZDE2IHJtYXNrW10gPSB7MCwxLDMsNywxNX07CisgICAgICAgICAgICAgCisgICAgICAgICAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSx0bnNJbmZvLmNvZWZbaSpUTlNfTUFYX09SREVSX1NIT1JUK2tdICYgcm1hc2tbY29lZkJpdHNdLGNvZWZCaXRzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZW5jb2RlR2FpbkNvbnRyb2xEYXRhCisqIGRlc2NyaXB0aW9uOiAgdW5zdXBwb3J0ZWQKKyogcmV0dXJuczogICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVuY29kZUdhaW5Db250cm9sRGF0YShIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKQoreworICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwwLDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogZW5jb2RlUHVsc2VEYXRhCisqIGRlc2NyaXB0aW9uOiAgbm90IHN1cHBvcnRlZCB5ZXQgKGR1bW15KQorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgZW5jb2RlUHVsc2VEYXRhKEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0pCit7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLDAsMSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFdyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0KKyogZGVzY3JpcHRpb246ICBtYW5hZ2VtZW50IG9mIHdyaXRlIHByb2Nlc3Mgb2YgaW5kaXZpZHVhbCBjaGFubmVsIHN0cmVhbQorKiByZXR1cm5zOiAgICAgIG5vbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3dyaXRlSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0oRmxhZyAgIGNvbW1vbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ3JvdXBpbmdNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNjZltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDE2ICptYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHF1YW50U3BlY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfSU5GTyB0bnNJbmZvKQoreworICBXb3JkMTYgbG9nTm9ybTsKKworICBsb2dOb3JtID0gTE9HX05PUk1fUENNIC0gKG1kY3RTY2FsZSArIDEpOworCisgIGVuY29kZUdsb2JhbEdhaW4oZ2xvYmFsR2FpbiwgbG9nTm9ybSxzY2Zbc2VjdGlvbkRhdGEtPmZpcnN0U2NmXSwgaEJpdFN0cmVhbSk7CisKKyAgIAorICBpZighY29tbW9uV2luZG93KSB7CisgICAgZW5jb2RlSWNzSW5mbyhzZWN0aW9uRGF0YS0+YmxvY2tUeXBlLCB3aW5kb3dTaGFwZSwgZ3JvdXBpbmdNYXNrLCBzZWN0aW9uRGF0YSwgaEJpdFN0cmVhbSk7CisgIH0KKworICBlbmNvZGVTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgaEJpdFN0cmVhbSk7CisKKyAgZW5jb2RlU2NhbGVGYWN0b3JEYXRhKG1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworCisgIGVuY29kZVB1bHNlRGF0YShoQml0U3RyZWFtKTsKKworICBlbmNvZGVUbnNEYXRhKHRuc0luZm8sIHNlY3Rpb25EYXRhLT5ibG9ja1R5cGUsIGhCaXRTdHJlYW0pOworCisgIGVuY29kZUdhaW5Db250cm9sRGF0YShoQml0U3RyZWFtKTsKKworICBlbmNvZGVTcGVjdHJhbERhdGEoc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWMsCisgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogd3JpdGVTaW5nbGVDaGFubmVsRWxlbWVudAorKiBkZXNjcmlwdGlvbjogIHdyaXRlIHNpbmdsZSBjaGFubmVsIGVsZW1lbnQgdG8gYml0c3RyZWFtCisqIHJldHVybnM6ICAgICAgbm9uZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IHdyaXRlU2luZ2xlQ2hhbm5lbEVsZW1lbnQoV29yZDE2IGluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfSU5GTyB0bnNJbmZvKQoreworICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxJRF9TQ0UsMyk7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLGluc3RhbmNlVGFnLDQpOworICB3cml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtKDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT53aW5kb3dTaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPmdyb3VwaW5nTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5zY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsLT5tYXhWYWx1ZUluU2ZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbC0+Z2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwtPnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHFjT3V0Q2hhbm5lbC0+c2VjdGlvbkRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgIHJldHVybigwKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiB3cml0ZUNoYW5uZWxQYWlyRWxlbWVudAorKiBkZXNjcmlwdGlvbjoKKyogcmV0dXJuczogICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgd3JpdGVDaGFubmVsUGFpckVsZW1lbnQoV29yZDE2IGluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbXNEaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtc0ZsYWdzW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCBxY091dENoYW5uZWxbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9CSVRfQlVGIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19JTkZPIHRuc0luZm9bMl0pCit7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX0NQRSwzKTsKKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0saW5zdGFuY2VUYWcsNCk7CisgIFdyaXRlQml0cyhoQml0U3RyZWFtLDEsMSk7IC8qIGNvbW1vbiB3aW5kb3cgKi8KKworICBlbmNvZGVJY3NJbmZvKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YS5ibG9ja1R5cGUsCisgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLndpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5ncm91cGluZ01hc2ssCisgICAgICAgICAgICAgICAgJihxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEpLAorICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworCisgIGVuY29kZU1TSW5mbyhxY091dENoYW5uZWxbMF0uc2VjdGlvbkRhdGEuc2ZiQ250LAorICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhLnNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLnNlY3Rpb25EYXRhLm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgbXNEaWdlc3QsCisgICAgICAgICAgICAgICBtc0ZsYWdzLAorICAgICAgICAgICAgICAgaEJpdFN0cmVhbSk7CisKKyAgd3JpdGVJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5tZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLndpbmRvd1NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5ncm91cGluZ01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFswXS5zY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLmdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzBdLnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHFjT3V0Q2hhbm5lbFswXS5zZWN0aW9uRGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNJbmZvWzBdKTsKKworICB3cml0ZUluZGl2aWR1YWxDaGFubmVsU3RyZWFtKDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0ud2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLmdyb3VwaW5nTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzZXRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsWzFdLnNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0ubWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0uZ2xvYmFsR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbMV0ucXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocWNPdXRDaGFubmVsWzFdLnNlY3Rpb25EYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm9bMV0pOworCisgIHJldHVybigwKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiB3cml0ZUZpbGxFbGVtZW50CisqIGRlc2NyaXB0aW9uOiAgd3JpdGUgZmlsbCBlbGVtZW50cyB0byBiaXRzdHJlYW0KKyogcmV0dXJuczogICAgICBub25lCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdyaXRlRmlsbEVsZW1lbnQoIGNvbnN0IFVXb3JkOCAqYW5jQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG90RmlsbEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfQklUX0JVRiBoQml0U3RyZWFtKQoreworICBXb3JkMTYgaTsKKyAgV29yZDE2IGNudCxlc2NfY291bnQ7CisKKyAgLyoKKyAgICBXcml0ZSBmaWxsIEVsZW1lbnQocyk6CisgICAgYW1vdW50IG9mIGEgZmlsbCBlbGVtZW50IGNhbiBiZSA3K1gqOCBCaXRzLCBYIGVsZW1lbnQgb2YgWzAuLjI3MF0KKyAgKi8KKyAgICAKKyAgd2hpbGUodG90RmlsbEJpdHMgPj0gKDMrNCkpIHsKKyAgICBjbnQgPSBtaW4oKCh0b3RGaWxsQml0cyAtICgzKzQpKSA+PiAzKSwgKCgxPDw0KS0xKSk7CisKKyAgICBXcml0ZUJpdHMoaEJpdFN0cmVhbSxJRF9GSUwsMyk7CisgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sY250LDQpOworCisgICAgdG90RmlsbEJpdHMgPSB0b3RGaWxsQml0cyAtICgzKzQpOworCisgICAgIAorICAgIGlmICgoY250ID09ICgxPDw0KS0xKSkgeworCisgICAgICBlc2NfY291bnQgPSBtaW4oICgodG90RmlsbEJpdHMgPj4gMykgLSAoKDE8PDQpLTEpKSwgKDE8PDgpLTEpOworICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sZXNjX2NvdW50LDgpOworICAgICAgdG90RmlsbEJpdHMgPSAodG90RmlsbEJpdHMgLSA4KTsKKyAgICAgIGNudCA9IGNudCArIChlc2NfY291bnQgLSAxKTsKKyAgICB9CisKKyAgICBmb3IoaT0wO2k8Y250O2krKykgeworICAgICAgIAorICAgICAgaWYoYW5jQnl0ZXMpCisgICAgICAgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAqYW5jQnl0ZXMrKyw4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCw4KTsKKyAgICAgIHRvdEZpbGxCaXRzID0gdG90RmlsbEJpdHMgLSA4OworICAgIH0KKyAgfQorfQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFdyaXRlQml0U3RyZWFtCisqIGRlc2NyaXB0aW9uOiAgbWFpbiBmdW5jdGlvbiBvZiB3cml0ZSBiaXRzdGVhbSBwcm9jZXNzCisqIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBXcml0ZUJpdHN0cmVhbSAoSEFORExFX0JJVF9CVUYgaEJpdFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgRUxFTUVOVF9JTkZPIGVsSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUICpxY091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVCAqcHN5T3V0LAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmdsb2JVc2VkQml0cywJCQkJCSAgIAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVV29yZDggKmFuY0J5dGVzLA0KKwkJCQkJICAgV29yZDE2IHNhbXBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICApIC8qIHJldHVybnMgZXJyb3IgY29kZSAqLworeworICBXb3JkMTYgYml0TWFya1VwOworICBXb3JkMTYgZWxlbWVudFVzZWRCaXRzOworICBXb3JkMTYgZnJhbWVCaXRzPTA7DQorDQorICAvKiAgIHN0cnVjdCBiaXRidWZmZXIgYnNXcml0ZUNvcHk7ICovDQorICBiaXRNYXJrVXAgPSBHZXRCaXRzQXZhaWwoaEJpdFN0cmVhbSk7IA0KKyAgaWYocWNPdXQtPnFjRWxlbWVudC5hZHRzVXNlZCkgIC8qICB3cml0ZSBhZHRzIGhlYWRlciovDQorICB7DQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDB4RkZGLCAxMik7IC8qIDEyIGJpdCBTeW5jd29yZCAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAxLCAxKTsgLyogSUQgPT0gMCBmb3IgTVBFRzQgQUFDLCAxIGZvciBNUEVHMiBBQUMgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMik7IC8qIGxheWVyID09IDAgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMSwgMSk7IC8qIHByb3RlY3Rpb24gYWJzZW50ICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDEsIDIpOyAvKiBwcm9maWxlICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIHNhbXBpbmRleCwgNCk7IC8qIHNhbXBsaW5nIHJhdGUgKi8NCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMCwgMSk7IC8qIHByaXZhdGUgYml0ICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIGVsSW5mby5uQ2hhbm5lbHNJbkVsLCAzKTsgLyogY2guIGNvbmZpZyAobXVzdCBiZSA+IDApICovDQorCQkJCQkJCQkgICAvKiBzaW1wbHkgdXNpbmcgbnVtQ2hhbm5lbHMgb25seSB3b3JrcyBmb3INCisJCQkJCQkJCQk2IGNoYW5uZWxzIG9yIGxlc3MsIGVsc2UgYSBjaGFubmVsDQorCQkJCQkJCQkJY29uZmlndXJhdGlvbiBzaG91bGQgYmUgd3JpdHRlbiAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogb3JpZ2luYWwvY29weSAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogaG9tZSAqLwkgIA0KKwkgIA0KKwkgIC8qIFZhcmlhYmxlIEFEVFMgaGVhZGVyICovDQorCSAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sIDAsIDEpOyAvKiBjb3B5ci4gaWQuIGJpdCAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAxKTsgLyogY29weXIuIGlkLiBzdGFydCAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAqZ2xvYlVzZWRCaXRzID4+IDMsIDEzKTsNCisJICBXcml0ZUJpdHMoaEJpdFN0cmVhbSwgMHg3RkYsIDExKTsgLyogYnVmZmVyIGZ1bGxuZXNzICgweDdGRiBmb3IgVkJSKSAqLw0KKwkgIFdyaXRlQml0cyhoQml0U3RyZWFtLCAwLCAyKTsgLyogcmF3IGRhdGEgYmxvY2tzICgwKzE9MSkgKi8gIA0KKyAgfQ0KKworICAqZ2xvYlVzZWRCaXRzPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICB7CisKKyAgICBXb3JkMTYgKnNmYk9mZnNldFsyXTsKKyAgICBUTlNfSU5GTyB0bnNJbmZvWzJdOworICAgIGVsZW1lbnRVc2VkQml0cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIHN3aXRjaCAoZWxJbmZvLmVsVHlwZSkgeworCisgICAgICBjYXNlIElEX1NDRTogICAgICAvKiBzaW5nbGUgY2hhbm5lbCAqLworICAgICAgICBzZmJPZmZzZXRbMF0gPSBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0uc2ZiT2Zmc2V0czsKKyAgICAgICAgdG5zSW5mb1swXSA9IHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS50bnNJbmZvOworCisgICAgICAgIHdyaXRlU2luZ2xlQ2hhbm5lbEVsZW1lbnQoZWxJbmZvLmluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPnFjQ2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQml0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0luZm9bMF0pOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJRF9DUEU6ICAgICAvKiBjaGFubmVsIHBhaXIgKi8KKyAgICAgICAgeworICAgICAgICAgIFdvcmQxNiBtc0RpZ2VzdDsKKyAgICAgICAgICBXb3JkMTYgKm1zRmxhZ3MgPSBwc3lPdXQtPnBzeU91dEVsZW1lbnQudG9vbHNJbmZvLm1zTWFzazsKKyAgICAgICAgICBtc0RpZ2VzdCA9IHBzeU91dC0+cHN5T3V0RWxlbWVudC50b29sc0luZm8ubXNEaWdlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgc2ZiT2Zmc2V0WzBdID0KKyAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0Q2hhbm5lbFtlbEluZm8uQ2hhbm5lbEluZGV4WzBdXS5zZmJPZmZzZXRzOworICAgICAgICAgIHNmYk9mZnNldFsxXSA9CisgICAgICAgICAgICBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFsxXV0uc2ZiT2Zmc2V0czsKKworICAgICAgICAgIHRuc0luZm9bMF09CisgICAgICAgICAgICBwc3lPdXQtPnBzeU91dENoYW5uZWxbZWxJbmZvLkNoYW5uZWxJbmRleFswXV0udG5zSW5mbzsKKyAgICAgICAgICB0bnNJbmZvWzFdPQorICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMV1dLnRuc0luZm87CisgICAgICAgICAgd3JpdGVDaGFubmVsUGFpckVsZW1lbnQoZWxJbmZvLmluc3RhbmNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNDaGFubmVsW2VsSW5mby5DaGFubmVsSW5kZXhbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybigxKTsKKworICAgICAgfSAgIC8qIHN3aXRjaCAqLworCisgICAgZWxlbWVudFVzZWRCaXRzID0gZWxlbWVudFVzZWRCaXRzIC0gYml0TWFya1VwOworICAgIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsKKyAgICBmcmFtZUJpdHMgPSBmcmFtZUJpdHMgKyBlbGVtZW50VXNlZEJpdHMgKyBiaXRNYXJrVXA7CisKKyAgfQorCisgIHdyaXRlRmlsbEVsZW1lbnQoTlVMTCwKKyAgICAgICAgICAgICAgICAgICBxY091dC0+dG90RmlsbEJpdHMsIAorICAgICAgICAgICAgICAgICAgIGhCaXRTdHJlYW0pOworCisgIFdyaXRlQml0cyhoQml0U3RyZWFtLElEX0VORCwzKTsKKworICAvKiBieXRlIGFsaWduZW1lbnQgKi8KKyAgV3JpdGVCaXRzKGhCaXRTdHJlYW0sMCwgKDggLSAoaEJpdFN0cmVhbS0+Y250Qml0cyAmIDcpKSAmIDcpOyAgICAgICAgICAKKyAgCisgICpnbG9iVXNlZEJpdHMgPSAqZ2xvYlVzZWRCaXRzLSBiaXRNYXJrVXA7CisgIGJpdE1hcmtVcCA9IEdldEJpdHNBdmFpbChoQml0U3RyZWFtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICpnbG9iVXNlZEJpdHMgPSAqZ2xvYlVzZWRCaXRzICsgYml0TWFya1VwOworICBmcmFtZUJpdHMgPSBmcmFtZUJpdHMgKyAqZ2xvYlVzZWRCaXRzOworCisgICAKKyAgaWYgKGZyYW1lQml0cyAhPSAgKHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCtxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQgKworICAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnRvdEZpbGxCaXRzICsgcWNPdXQtPmFsaWduQml0cykpIHsKKyAgICByZXR1cm4oLTEpOworICB9CisgIHJldHVybigwKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvYmxvY2tfc3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwNTRmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2Jsb2NrX3N3aXRjaC5jCkBAIC0wLDAgKzEsNDMxIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlibG9ja19zd2l0Y2guYw0KKw0KKwlDb250ZW50OglCbG9jayBzd2l0Y2hpbmcgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKyNpbmNsdWRlICJwc3lfY29uc3QuaCIKKyNpbmNsdWRlICJibG9ja19zd2l0Y2guaCIKKworCisjZGVmaW5lIEVORVJHWV9TSElGVCAoOCAtIDEpCisKKy8qKioqKioqKioqKioqKioqIGludGVybmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2CitJSVJGaWx0ZXIoY29uc3QgV29yZDE2IGluLCBjb25zdCBXb3JkMzIgY29lZmZbXSwgV29yZDMyIHN0YXRlc1tdKTsKKworc3RhdGljIFdvcmQzMgorU3JjaE1heFdpdGhJbmRleChjb25zdCBXb3JkMzIgKmluLCBXb3JkMTYgKmluZGV4LCBXb3JkMTYgbik7CisKKworV29yZDMyCitDYWxjV2luZG93RW5lcmd5KEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKKyAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAorICAgICAgICAgICAgICAgICBXb3JkMTYgd2luZG93TGVuKTsKKworCisKKy8qKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qCisgIElJUiBoaWdoIHBhc3MgY29lZmZzCisqLworV29yZDMyIGhpUGFzc0NvZWZmW0JMT0NLX1NXSVRDSElOR19JSVJfTEVOXSA9IHsKKyAgMHhiZWM4YjQzOSwgMHg2MDlkNDk1MiAgLyogLTAuNTA5NWYsIDAuNzU0OGYgKi8gCit9OworCitzdGF0aWMgY29uc3QgV29yZDMyIGFjY1dpbmRvd05yZ0ZhYyA9IDB4MjY2NjY2NjY7ICAgICAgICAgICAgICAgICAgIC8qIGZhY3RvciBmb3IgYWNjdW11bGF0aW5nIGZpbHRlcmVkIHdpbmRvdyBlbmVyZ2llcyAwLjMgKi8KK3N0YXRpYyBjb25zdCBXb3JkMzIgb25lTWludXNBY2NXaW5kb3dOcmdGYWMgPSAweDU5OTk5OTlhOwkJCS8qIDAuNyAqLworc3RhdGljIGNvbnN0IFdvcmQzMiBpbnZBdHRhY2tSYXRpb0hpZ2hCciA9IDB4MGNjY2NjY2Q7ICAgICAgICAgICAgICAvKiBpbnZlcnRlZCBsb3dlciByYXRpbyBsaW1pdCBmb3IgYXR0YWNrcyAwLjEqLworc3RhdGljIGNvbnN0IFdvcmQzMiBpbnZBdHRhY2tSYXRpb0xvd0JyID0gIDB4MDcyYjAyMGM7ICAgICAgICAgICAgICAvKiAwLjA1NiAqLworc3RhdGljIGNvbnN0IFdvcmQzMiBtaW5BdHRhY2tOcmcgPSAweDAwMDAxZTg0OyAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGVuZXJneSBmb3IgYXR0YWNrcyAxZSs2ICovCisKKworLyoqKioqKioqKioqKioqKioqKiBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBJbml0QmxvY2tTd2l0Y2hpbmcKKyogZGVzY3JpcHRpb246ICBpbml0IEJsb2NrIFN3aXRjaGluZyBwYXJhbWV0ZXIuCisqIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IEluaXRCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYml0UmF0ZSwgY29uc3QgV29yZDE2IG5DaGFubmVscykKK3sKKyAgLyogc2VsZWN0IGF0dGFja1JhdGlvICovCisgICAgICAgICAgIAorICBpZiAoKHN1YihuQ2hhbm5lbHMsMSk9PTAgJiYgTF9zdWIoYml0UmF0ZSwgMjQwMDApID4gMCkgfHwgCisgICAgICAoc3ViKG5DaGFubmVscywxKT4wICYmIGJpdFJhdGUgPiAobkNoYW5uZWxzICogMTYwMDApKSkgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+aW52QXR0YWNrUmF0aW8gPSBpbnZBdHRhY2tSYXRpb0hpZ2hCcjsKKyAgfQorICBlbHNlICB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5pbnZBdHRhY2tSYXRpbyA9IGludkF0dGFja1JhdGlvTG93QnI7CisgIH0KKworICByZXR1cm4oVFJVRSk7Cit9CisKK3N0YXRpYyBXb3JkMTYgc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtUUkFOU19GQUNdW01BWF9OT19PRl9HUk9VUFNdID0geworICAvKiBBdHRhY2sgaW4gV2luZG93IDAgKi8gezEsICAzLCAgMywgIDF9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDEgKi8gezEsICAxLCAgMywgIDN9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDIgKi8gezIsICAxLCAgMywgIDJ9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDMgKi8gezMsICAxLCAgMywgIDF9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDQgKi8gezMsICAxLCAgMSwgIDN9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDUgKi8gezMsICAyLCAgMSwgIDJ9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDYgKi8gezMsICAzLCAgMSwgIDF9LAorICAvKiBBdHRhY2sgaW4gV2luZG93IDcgKi8gezMsICAzLCAgMSwgIDF9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQmxvY2tTd2l0Y2hpbmcKKyogZGVzY3JpcHRpb246ICBkZXRlY3QgdGhpcyBmcmFtZSB3aGV0aGVyIHRoZXJlIGlzIGFuIGF0dGFjaworKiByZXR1cm5zOiAgICAgIFRSVUUgaWYgc3VjY2VzcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBCbG9ja1N3aXRjaGluZyhCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqdGltZVNpZ25hbCwKKwkJCQkJICBXb3JkMzIgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQpCit7CisgIFdvcmQzMiBpLCB3OworICBXb3JkMzIgZW5NMSwgZW5NYXg7CisKKyAgLyogUmVzZXQgZ3JvdXBpbmcgaW5mbyAqLworICBmb3IgKGk9MDsgaTxUUkFOU19GQUM7IGkrKykgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5baV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworCisgIC8qIFNlYXJjaCBmb3IgcG9zaXRpb24gYW5kIGFtcGxpdHVkZSBvZiBhdHRhY2sgaW4gbGFzdCBmcmFtZSAoMSB3aW5kb3dzIGRlbGF5KSAqLworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPm1heFdpbmRvd05yZyA9IFNyY2hNYXhXaXRoSW5kZXgoICZibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ1swXVtCTE9DS19TV0lUQ0hfV0lORE9XUy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TV0lUQ0hfV0lORE9XUyk7CisKKyAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2tJbmRleCA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4OyAgIAorCisgIC8qIFNldCBncm91cGluZyBpbmZvICovCisgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IE1BWF9OT19PRl9HUk9VUFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGk9MDsgaTxNQVhfTk9fT0ZfR1JPVVBTOyBpKyspIHsKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuW2ldID0gc3VnZ2VzdGVkR3JvdXBpbmdUYWJsZVtibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4XVtpXTsgIAorICB9DQorCQorICAvKiBpZiB0aGUgc2FtcGxlcmF0ZSBpcyBsZXNzIHRoYW4gMTYwMDAsIGl0IHNob3VsZCBiZSBhbGwgdGhlIHNob3J0IGJsb2NrLCBhdm9pZCBwcmUmcG9zdCBlY2hvICovCisgIGlmKHNhbXBsZVJhdGUgPj0gMTYwMDApIHsKKwkgIC8qIFNhdmUgY3VycmVudCB3aW5kb3cgZW5lcmd5IGFzIGxhc3Qgd2luZG93IGVuZXJneSAqLworCSAgZm9yICh3PTA7IHc8QkxPQ0tfU1dJVENIX1dJTkRPV1M7IHcrKykgeworCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnWzBdW3ddID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMV1bd107ICAgICAgICAgICAgIAorCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlswXVt3XSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XTsgICAgICAgICAgIAorCSAgfQorCisKKwkgIC8qIENhbGN1bGF0ZSB1bmZpbHRlcmVkIGFuZCBmaWx0ZXJlZCBlbmVyZ2llcyBpbiBzdWJ3aW5kb3dzIGFuZCBjb21iaW5lIHRvIHNlZ21lbnRzICovCisJICBDYWxjV2luZG93RW5lcmd5KGJsb2NrU3dpdGNoaW5nQ29udHJvbCwgdGltZVNpZ25hbCwgY2hJbmNyZW1lbnQsIEJMT0NLX1NXSVRDSF9XSU5ET1dfTEVOKTsKKworCSAgLyogcmVzZXQgYXR0YWNrICovCisJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IEZBTFNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKwkgIGVuTWF4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgIGVuTTEgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMF1bQkxPQ0tfU1dJVENIX1dJTkRPV1MtMV07ICAgICAgICAgICAKKworCSAgZm9yICh3PTA7IHc8QkxPQ0tfU1dJVENIX1dJTkRPV1M7IHcrKykgeworCQkgIFdvcmQzMiBlbk0xX1RtcCwgYWNjV2luZG93TnJnX1RtcCwgd2luZG93TnJnRl9UbXA7CisJCSAgV29yZDE2IGVuTTFfU2hmLCBhY2NXaW5kb3dOcmdfU2hmLCB3aW5kb3dOcmdGX1NoZjsKKworCQkgIGFjY1dpbmRvd05yZ19TaGYgPSBub3JtX2woYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcpOworCQkgIGVuTTFfU2hmID0gbm9ybV9sKGVuTTEpOworCQkgIHdpbmRvd05yZ0ZfU2hmID0gbm9ybV9sKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XSk7CisKKwkJICBhY2NXaW5kb3dOcmdfVG1wID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgPDwgYWNjV2luZG93TnJnX1NoZjsKKwkJICBlbk0xX1RtcCA9IGVuTTEgPDwgZW5NMV9TaGY7CisJCSAgd2luZG93TnJnRl9UbXAgPSBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd05yZ0ZbMV1bd10gPDwgd2luZG93TnJnRl9TaGY7CisKKwkJICAvKiBhIHNsaWRpbmcgYXZlcmFnZSBvZiB0aGUgcHJldmlvdXMgZW5lcmdpZXMgKi8KKwkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmFjY1dpbmRvd05yZyA9IChmaXhtdWwob25lTWludXNBY2NXaW5kb3dOcmdGYWMsIGFjY1dpbmRvd05yZ19UbXApID4+IGFjY1dpbmRvd05yZ19TaGYpICsKKwkJCSAgKGZpeG11bChhY2NXaW5kb3dOcmdGYWMsIGVuTTFfVG1wKSA+PiBlbk0xX1NoZik7CisKKworCQkgIC8qIGlmIHRoZSBlbmVyZ3kgd2l0aCB0aGUgcmF0aW8gaXMgYmlnZ2VyIHRoYW4gdGhlIGF2ZXJhZ2UsIGFuZCB0aGUgYXR0YWNrIGFuZCBzaG9ydCBibG9jayAgKi8KKwkJICBpZiAoKGZpeG11bCh3aW5kb3dOcmdGX1RtcCwgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5pbnZBdHRhY2tSYXRpbykgPj4gd2luZG93TnJnRl9TaGYpID4KKwkJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hY2NXaW5kb3dOcmcgKSB7CisJCQkJICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdEF0dGFja0luZGV4ID0gdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgIH0KKwkJICBlbk0xID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdGWzFdW3ddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgIGVuTWF4ID0gbWF4KGVuTWF4LCBlbk0xKTsKKwkgIH0KKworCSAgaWYgKGVuTWF4IDwgbWluQXR0YWNrTnJnKSB7CisJCSAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2sgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkgIH0KKyAgfQorICBlbHNlCisgIHsKKwkgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrID0gVFJVRTsKKyAgfQorCisgIC8qIENoZWNrIGlmIGF0dGFjayBzcHJlYWRzIG92ZXIgZnJhbWUgYm9yZGVyICovICAgICAKKyAgaWYgKCghYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5hdHRhY2spICYmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2spKSB7CisgICAgIAorICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFja0luZGV4ID09IFRSQU5TX0ZBQy0xKSB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmF0dGFjayA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmxhc3RhdHRhY2sgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgIGVsc2UgeworICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bGFzdGF0dGFjayA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrOyAgICAgICAgICAgCisgIH0KKworICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID0gIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlOyAgICAKKworICAgICAKKyAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+YXR0YWNrKSB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2UgPSBTSE9SVF9XSU5ET1c7CisgIH0KKyAgZWxzZSB7CisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2UgPSBMT05HX1dJTkRPVzsKKyAgfQorCisgIC8qIHVwZGF0ZSBzaG9ydCBibG9jayBncm91cCAqLyAKKyAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgeworICAgICAKKyAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dTZXF1ZW5jZT09IExPTkdfV0lORE9XKSB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID0gU1RBUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgIAorICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID09IFNUT1BfV0lORE9XKSB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID0gU0hPUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bm9PZkdyb3VwcyA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5ncm91cExlblswXSA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmdyb3VwTGVuWzFdID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+Z3JvdXBMZW5bMl0gPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorCisgIC8qIHVwZGF0ZSBibG9jayB0eXBlICovICAKKyAgaWYgKGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+bmV4dHdpbmRvd1NlcXVlbmNlID09IExPTkdfV0lORE9XKSB7CisgICAgIAorICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2wtPndpbmRvd1NlcXVlbmNlID09IFNIT1JUX1dJTkRPVykgeworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5uZXh0d2luZG93U2VxdWVuY2UgPSBTVE9QX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisKKyAgcmV0dXJuKFRSVUUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBTcmNoTWF4V2l0aEluZGV4CisqIGRlc2NyaXB0aW9uOiAgc2VhcmNoIGZvciB0aGUgYmlnZ2VzdCB2YWx1ZSBpbiBhbiBhcnJheQorKiByZXR1cm5zOiAgICAgIHRoZSBtYXggdmFsdWUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDMyIFNyY2hNYXhXaXRoSW5kZXgoY29uc3QgV29yZDMyIGluW10sIFdvcmQxNiAqaW5kZXgsIFdvcmQxNiBuKQoreworICBXb3JkMzIgbWF4OworICBXb3JkMzIgaSwgaWR4OworCisgIC8qIFNlYXJjaCBtYXhpbXVtIHZhbHVlIGluIGFycmF5IGFuZCByZXR1cm4gaW5kZXggYW5kIHZhbHVlICovCisgIG1heCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgIAorICAgIGlmIChpbltpKzFdICA+IG1heCkgeworICAgICAgbWF4ID0gaW5baSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGlkeCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisgICppbmRleCA9IGlkeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHJldHVybihtYXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQ2FsY1dpbmRvd0VuZXJneQorKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZSB0aGUgZW5lcmd5IGJlZm9yZSBpaXItZmlsdGVyIGFuZCBhZnRlciBpcnItZmlsdGVyCisqIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBBUk1WNUUNCitXb3JkMzIgQ2FsY1dpbmRvd0VuZXJneShCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoSW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdpbmRvd0xlbikKK3sKKyAgV29yZDMyIHcsIGksIHdPZmZzZXQsIHRpZHgsIGNoOworICBXb3JkMzIgYWNjdVVFLCBhY2N1RkU7CisgIFdvcmQzMiB0ZW1wVW5maWx0ZXJlZDsKKyAgV29yZDMyIHRlbXBGaWx0ZXJlZDsNCisgIFdvcmQzMiBzdGF0ZXMwLCBzdGF0ZXMxOw0KKyAgV29yZDMyIENvZWZmMCwgQ29lZmYxOw0KKw0KKworICBzdGF0ZXMwID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMF07DQorICBzdGF0ZXMxID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sLT5paXJTdGF0ZXNbMV07DQorICBDb2VmZjAgPSBoaVBhc3NDb2VmZlswXTsNCisgIENvZWZmMSA9IGhpUGFzc0NvZWZmWzFdOworICB0aWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yICh3PTA7IHcgPCBCTE9DS19TV0lUQ0hfV0lORE9XUzsgdysrKSB7CisKKyAgICBhY2N1VUUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYWNjdUZFID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgZm9yKGk9MDsgaTx3aW5kb3dMZW47IGkrKykgeworCSAgV29yZDMyIGFjY3UxLCBhY2N1MiwgYWNjdTM7DQorCSAgV29yZDMyIG91dDsNCisJICB0ZW1wVW5maWx0ZXJlZCA9IHRpbWVTaWduYWxbdGlkeF07CisgICAgICB0aWR4ID0gdGlkeCArIGNoSW5jcmVtZW50OworDQorCSAgYWNjdTEgPSBMX21weV9scyhDb2VmZjEsIHRlbXBVbmZpbHRlcmVkKTsNCisJICBhY2N1MiA9IGZpeG11bCggQ29lZmYwLCBzdGF0ZXMxICk7DQorCSAgYWNjdTMgPSBhY2N1MSAtIHN0YXRlczA7DQorCSAgb3V0ID0gYWNjdTMgLSBhY2N1MjsNCisNCisJICBzdGF0ZXMwID0gYWNjdTE7ICAgICAgICAgICAgIA0KKwkgIHN0YXRlczEgPSBvdXQ7ICAgICAgICAgICAgICAgDQorDQorICAgICAgdGVtcEZpbHRlcmVkID0gZXh0cmFjdF9oKG91dCk7CSAgCisgICAgICBhY2N1VUUgKz0gKHRlbXBVbmZpbHRlcmVkICogdGVtcFVuZmlsdGVyZWQpID4+IEVORVJHWV9TSElGVDsKKyAgICAgIGFjY3VGRSArPSAodGVtcEZpbHRlcmVkICogdGVtcEZpbHRlcmVkKSA+PiBFTkVSR1lfU0hJRlQ7CisgICAgfQorCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sLT53aW5kb3dOcmdbMV1bd10gPSBhY2N1VUU7ICAgICAgICAgICAgIAorICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbC0+d2luZG93TnJnRlsxXVt3XSA9IGFjY3VGRTsgICAgICAgICAgICAKKworICB9DQorDQorICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1swXSA9IHN0YXRlczA7DQorICBibG9ja1N3aXRjaGluZ0NvbnRyb2wtPmlpclN0YXRlc1sxXSA9IHN0YXRlczE7CisKKyAgcmV0dXJuKFRSVUUpOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBJSVJGaWx0ZXIKKyogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGlpci1maWx0ZXIgZm9yIGFuIGFycmF5CisqIHJldHVybnM6ICAgICAgdGhlIHJlc3VsdCBhZnRlciBpaXItZmlsdGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBJSVJGaWx0ZXIoY29uc3QgV29yZDE2IGluLCBjb25zdCBXb3JkMzIgY29lZmZbXSwgV29yZDMyIHN0YXRlc1tdKQoreworICBXb3JkMzIgYWNjdTEsIGFjY3UyLCBhY2N1MzsKKyAgV29yZDMyIG91dDsKKworICBhY2N1MSA9IExfbXB5X2xzKGNvZWZmWzFdLCBpbik7CisgIGFjY3UzID0gYWNjdTEgLSBzdGF0ZXNbMF07CisgIGFjY3UyID0gZml4bXVsKCBjb2VmZlswXSwgc3RhdGVzWzFdICk7CisgIG91dCA9IGFjY3UzIC0gYWNjdTI7CisKKyAgc3RhdGVzWzBdID0gYWNjdTE7ICAgICAgICAgICAgIAorICBzdGF0ZXNbMV0gPSBvdXQ7ICAgICAgICAgICAgICAgCisKKyAgcmV0dXJuIHJvdW5kMTYob3V0KTsKK30KKworCitzdGF0aWMgV29yZDE2IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlWzRdWzRdID0geworICAvKiAgICAgICAgICAgICAgICAgTE9OR19XSU5ET1cgICBTVEFSVF9XSU5ET1cgIFNIT1JUX1dJTkRPVyAgU1RPUF9XSU5ET1cgKi8KKyAgLyogTE9OR19XSU5ET1cgICove0xPTkdfV0lORE9XLCAgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNUT1BfV0lORE9XfSwKKyAgLyogU1RBUlRfV0lORE9XICove1NUQVJUX1dJTkRPVywgU1RBUlRfV0lORE9XLCBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPV30sCisgIC8qIFNIT1JUX1dJTkRPVyAqL3tTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU0hPUlRfV0lORE9XLCBTSE9SVF9XSU5ET1d9LAorICAvKiBTVE9QX1dJTkRPVyAgKi97U1RPUF9XSU5ET1csICBTSE9SVF9XSU5ET1csIFNIT1JUX1dJTkRPVywgU1RPUF9XSU5ET1d9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBTeW5jQmxvY2tTd2l0Y2hpbmcKKyogZGVzY3JpcHRpb246ICB1cGRhdGUgYmxvY2sgdHlwZSBhbmQgZ3JvdXAgdmFsdWUKKyogcmV0dXJuczogICAgICBUUlVFIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgU3luY0Jsb2NrU3dpdGNoaW5nKEJMT0NLX1NXSVRDSElOR19DT05UUk9MICpibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTE9DS19TV0lUQ0hJTkdfQ09OVFJPTCAqYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCit7CisgIFdvcmQxNiBpOworICBXb3JkMTYgcGF0Y2hUeXBlID0gTE9OR19XSU5ET1c7ICAgICAgICAgICAgICAgIAorCisgICAKKyAgaWYgKG5DaGFubmVscyA9PSAxKSB7IC8qIE1vbm8gKi8KKyAgICBpZiAoYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2UgIT0gU0hPUlRfV0lORE9XKSB7CisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ub09mR3JvdXBzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlblswXSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIGZvciAoaT0xOyBpPFRSQU5TX0ZBQzsgaSsrKSB7CisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbExlZnQtPmdyb3VwTGVuW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgeyAvKiBTdGVyZW8gY29tbW9uIFdpbmRvdyAqLworICAgIHBhdGNoVHlwZSA9IHN5bmNocm9uaXplZEJsb2NrVHlwZVRhYmxlW3BhdGNoVHlwZV1bYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2VdOyAgICAgICAgCisgICAgcGF0Y2hUeXBlID0gc3luY2hyb25pemVkQmxvY2tUeXBlVGFibGVbcGF0Y2hUeXBlXVtibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+d2luZG93U2VxdWVuY2VdOyAgICAgICAKKworICAgIC8qIFNldCBzeW5jaHJvbml6ZWQgQmxvY2t0eXBlICovCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+d2luZG93U2VxdWVuY2UgPSBwYXRjaFR5cGU7ICAgICAgICAgICAgICAgCisgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPndpbmRvd1NlcXVlbmNlID0gcGF0Y2hUeXBlOyAgICAgICAgICAgICAgCisKKyAgICAvKiBTeW5jaHJvbml6ZSBncm91cGluZyBpbmZvICovICAgICAKKyAgICBpZihwYXRjaFR5cGUgIT0gU0hPUlRfV0lORE9XKSB7IC8qIExvbmcgQmxvY2tzICovCisgICAgICAvKiBTZXQgZ3JvdXBpbmcgaW5mbyAqLworICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPm5vT2ZHcm91cHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5bMF0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuWzBdID0gMTsgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBmb3IgKGk9MTsgaTxUUkFOU19GQUM7IGkrKykgeworICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+Z3JvdXBMZW5baV0gPSAwOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAKKyAgICAgIGlmIChibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5tYXhXaW5kb3dOcmcgPiBibG9ja1N3aXRjaGluZ0NvbnRyb2xSaWdodC0+bWF4V2luZG93TnJnKSB7CisgICAgICAgIC8qIExlZnQgQ2hhbm5lbCB3aW5zICovCisgICAgICAgIGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwczsgICAgICAgICAgCisgICAgICAgIGZvciAoaT0wOyBpPFRSQU5TX0ZBQzsgaSsrKSB7CisgICAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sUmlnaHQtPmdyb3VwTGVuW2ldID0gYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+Z3JvdXBMZW5baV07ICAgICAgCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAvKiBSaWdodCBDaGFubmVsIHdpbnMgKi8KKyAgICAgICAgYmxvY2tTd2l0Y2hpbmdDb250cm9sTGVmdC0+bm9PZkdyb3VwcyA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ub09mR3JvdXBzOyAgICAgICAgICAKKyAgICAgICAgZm9yIChpPTA7IGk8VFJBTlNfRkFDOyBpKyspIHsKKyAgICAgICAgICBibG9ja1N3aXRjaGluZ0NvbnRyb2xMZWZ0LT5ncm91cExlbltpXSA9IGJsb2NrU3dpdGNoaW5nQ29udHJvbFJpZ2h0LT5ncm91cExlbltpXTsgICAgICAKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSAvKmVuZGlmIE1vbm8gb3IgU3RlcmVvICovCisKKyAgcmV0dXJuKFRSVUUpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvY2hhbm5lbF9tYXAuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2NoYW5uZWxfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MjkzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2NoYW5uZWxfbWFwLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWNoYW5uZWxfbWFwLmMNCisNCisJQ29udGVudDoJY2hhbm5lbCBtYXBwaW5nIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjaGFubmVsX21hcC5oIgorI2luY2x1ZGUgImJpdGVuYy5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgInFjX2RhdGEuaCIKKworc3RhdGljIGNvbnN0IFdvcmQxNiBtYXhDaGFubmVsQml0cyA9IE1BWEJJVFNfQ09FRjsKKworc3RhdGljIFdvcmQxNiBpbml0RWxlbWVudChFTEVNRU5UX0lORk8qIGVsSW5mbywgRUxFTUVOVF9UWVBFIGVsVHlwZSkKK3sKKyAgV29yZDE2IGVycm9yPTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZWxJbmZvLT5lbFR5cGU9ZWxUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgc3dpdGNoKGVsSW5mby0+ZWxUeXBlKSB7CisKKyAgICBjYXNlIElEX1NDRToKKyAgICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0xOyAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPTA7ICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIGVsSW5mby0+aW5zdGFuY2VUYWc9MDsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBicmVhazsKKworICAgIGNhc2UgSURfQ1BFOgorCisgICAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MjsgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBlbEluZm8tPkNoYW5uZWxJbmRleFsxXT0xOyAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgZWxJbmZvLT5pbnN0YW5jZVRhZz0wOyAgICAgICAgICAgICAgICAgICAgCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBlcnJvcj0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworCitXb3JkMTYgSW5pdEVsZW1lbnRJbmZvIChXb3JkMTYgbkNoYW5uZWxzLCBFTEVNRU5UX0lORk8qIGVsSW5mbykKK3sKKyAgV29yZDE2IGVycm9yOworICBlcnJvciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHN3aXRjaChuQ2hhbm5lbHMpIHsKKworICAgIGNhc2UgMTogCisgICAgICBpbml0RWxlbWVudChlbEluZm8sIElEX1NDRSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGluaXRFbGVtZW50KGVsSW5mbywgSURfQ1BFKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yPTQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIHJldHVybiBlcnJvcjsKK30KKworCitXb3JkMTYgSW5pdEVsZW1lbnRCaXRzKEVMRU1FTlRfQklUUyAqZWxlbWVudEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBiaXRyYXRlVG90LAorICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYXZlcmFnZUJpdHNUb3QsCisgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGF0aWNCaXRzVG90KQoreworICBXb3JkMTYgZXJyb3I7CisgIGVycm9yID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgc3dpdGNoKGVsSW5mby5uQ2hhbm5lbHNJbkVsKSB7CisgICAgY2FzZSAxOgorICAgICAgZWxlbWVudEJpdHMtPmNoQml0cmF0ZSA9IGJpdHJhdGVUb3Q7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICBlbGVtZW50Qml0cy0+YXZlcmFnZUJpdHMgPSBhdmVyYWdlQml0c1RvdCAtIHN0YXRpY0JpdHNUb3Q7CisgICAgICBlbGVtZW50Qml0cy0+bWF4Qml0cyA9IG1heENoYW5uZWxCaXRzOyAgICAgICAgICAgICAgICAgICAKKworICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSBtYXhDaGFubmVsQml0cyAtIGF2ZXJhZ2VCaXRzVG90OworICAgICAgZWxlbWVudEJpdHMtPm1heEJpdFJlc0JpdHMgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAtIChlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyAmIDcpOyAKKyAgICAgIGVsZW1lbnRCaXRzLT5iaXRSZXNMZXZlbCA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzOyAgIAorICAgICAgZWxlbWVudEJpdHMtPnJlbGF0aXZlQml0cyAgPSAweDQwMDA7IC8qIDEuMGYvMiAqLyAgICAgICAgCisgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgIGVsZW1lbnRCaXRzLT5jaEJpdHJhdGUgICA9IGJpdHJhdGVUb3QgPj4gMTsKKyAgICAgIGVsZW1lbnRCaXRzLT5hdmVyYWdlQml0cyA9IGF2ZXJhZ2VCaXRzVG90IC0gc3RhdGljQml0c1RvdDsKKyAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRzICAgICA9IG1heENoYW5uZWxCaXRzIDw8IDE7CisKKyAgICAgIGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzID0gKG1heENoYW5uZWxCaXRzIDw8IDEpIC0gYXZlcmFnZUJpdHNUb3Q7CisgICAgICBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0cyA9IGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzIC0gKGVsZW1lbnRCaXRzLT5tYXhCaXRSZXNCaXRzICYgNyk7ICAgCisgICAgICBlbGVtZW50Qml0cy0+Yml0UmVzTGV2ZWwgPSBlbGVtZW50Qml0cy0+bWF4Qml0UmVzQml0czsgICAgIAorICAgICAgZWxlbWVudEJpdHMtPnJlbGF0aXZlQml0cyA9IDB4NDAwMDsgLyogMS4wZi8yICovICAgICAgICAgICAKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGVycm9yID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKyAgcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZHluX2JpdHMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlYWNjYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2R5bl9iaXRzLmMKQEAgLTAsMCArMSw1NDUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWR5bl9iaXRzLmMNCisNCisJQ29udGVudDoJTm9pc2VsZXNzIGNvZGVyIG1vZHVsZSBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorI2luY2x1ZGUgImR5bl9iaXRzLmgiCisjaW5jbHVkZSAiYml0X2NudC5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBidWlsZEJpdExvb2tVcAorKiBkZXNjcmlwdGlvbjogIGNvdW50IGJpdHMgdXNpbmcgYWxsIHBvc3NpYmxlIHRhYmxlcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorYnVpbGRCaXRMb29rVXAoY29uc3QgV29yZDE2ICpxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYiwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgY29uc3QgVVdvcmQxNiAqc2ZiTWF4LAorICAgICAgICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgICAgICAgICBTRUNUSU9OX0lORk8gKiBzZWN0aW9uSW5mbykKK3sKKyAgV29yZDMyIGk7CisKKyAgZm9yIChpPTA7IGk8bWF4U2ZiOyBpKyspIHsKKyAgICBXb3JkMTYgc2ZiV2lkdGgsIG1heFZhbDsKKworICAgIHNlY3Rpb25JbmZvW2ldLnNmYkNudCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBzZWN0aW9uSW5mb1tpXS5zZmJTdGFydCA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgc2VjdGlvbkluZm9baV0uc2VjdGlvbkJpdHMgPSBJTlZBTElEX0JJVENPVU5UOyAgICAgICAgICAgICAgIAorICAgIHNlY3Rpb25JbmZvW2ldLmNvZGVCb29rID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBzZmJXaWR0aCA9IHNmYk9mZnNldFtpICsgMV0gLSBzZmJPZmZzZXRbaV07ICAgICAgICAgICAgICAKKyAgICBtYXhWYWwgPSBzZmJNYXhbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgYml0Q291bnQocXVhbnRTcGVjdHJ1bSArIHNmYk9mZnNldFtpXSwgc2ZiV2lkdGgsIG1heFZhbCwgYml0TG9va1VwW2ldKTsKKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBmaW5kQmVzdEJvb2sKKyogZGVzY3JpcHRpb246ICBlc3NlbnRpYWwgaGVscGVyIGZ1bmN0aW9ucworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2CitmaW5kQmVzdEJvb2soY29uc3QgV29yZDE2ICpiYywgV29yZDE2ICpib29rKQoreworICBXb3JkMzIgbWluQml0cywgajsKKyAgbWluQml0cyA9IElOVkFMSURfQklUQ09VTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yIChqPTA7IGo8PUNPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKKyAgICAgCisgICAgaWYgKGJjW2pdIDwgbWluQml0cykgeworICAgICAgbWluQml0cyA9IGJjW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICpib29rID0gajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisgIHJldHVybiBleHRyYWN0X2wobWluQml0cyk7Cit9CisKK3N0YXRpYyBXb3JkMTYKK2ZpbmRNaW5NZXJnZUJpdHMoY29uc3QgV29yZDE2ICpiYzEsIGNvbnN0IFdvcmQxNiAqYmMyKQoreworICBXb3JkMzIgbWluQml0cywgaiwgc3VtOworICBtaW5CaXRzID0gSU5WQUxJRF9CSVRDT1VOVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGo9MDsgajw9Q09ERV9CT09LX0VTQ19ORFg7IGorKykgeworICAgIHN1bSA9IGJjMVtqXSArIGJjMltqXTsKKyAgICBpZiAoc3VtIDwgbWluQml0cykgeworICAgICAgbWluQml0cyA9IHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgcmV0dXJuIGV4dHJhY3RfbChtaW5CaXRzKTsKK30KKworc3RhdGljIHZvaWQKK21lcmdlQml0TG9va1VwKFdvcmQxNiAqYmMxLCBjb25zdCBXb3JkMTYgKmJjMikKK3sKKyAgV29yZDMyIGo7CisKKyAgZm9yIChqPTA7IGo8PUNPREVfQk9PS19FU0NfTkRYOyBqKyspIHsKKyAgICBiYzFbal0gPSBtaW4oYmMxW2pdICsgYmMyW2pdLCBJTlZBTElEX0JJVENPVU5UKTsKKyAgfQorfQorCitzdGF0aWMgV29yZDE2CitmaW5kTWF4TWVyZ2UoY29uc3QgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddLAorICAgICAgICAgICAgIGNvbnN0IFNFQ1RJT05fSU5GTyAqc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYiwgV29yZDE2ICptYXhOZHgpCit7CisgIFdvcmQzMiBpLCBtYXhNZXJnZUdhaW47CisgIG1heE1lcmdlR2FpbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoaT0wOyBpK3NlY3Rpb25JbmZvW2ldLnNmYkNudCA8IG1heFNmYjsgaSArPSBzZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKKyAgICAgCisgICAgaWYgKG1lcmdlR2Fpbkxvb2tVcFtpXSA+IG1heE1lcmdlR2FpbikgeworICAgICAgbWF4TWVyZ2VHYWluID0gbWVyZ2VHYWluTG9va1VwW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICptYXhOZHggPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisgIHJldHVybiBleHRyYWN0X2wobWF4TWVyZ2VHYWluKTsKK30KKworCisKK3N0YXRpYyBXb3JkMTYKK0NhbGNNZXJnZUdhaW4oY29uc3QgU0VDVElPTl9JTkZPICpzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2lkZUluZm9UYWIsCisgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuZHgxLAorICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgbmR4MikKK3sKKyAgV29yZDMyIFNwbGl0Qml0czsKKyAgV29yZDMyIE1lcmdlQml0czsKKyAgV29yZDMyIE1lcmdlR2FpbjsKKworICAvKgorICAgIEJpdCBhbW91bnQgZm9yIHNwbGl0dGVkIHNlY3Rpb25zCisgICovCisgIFNwbGl0Qml0cyA9IHNlY3Rpb25JbmZvW25keDFdLnNlY3Rpb25CaXRzICsgc2VjdGlvbkluZm9bbmR4Ml0uc2VjdGlvbkJpdHM7CisKKyAgTWVyZ2VCaXRzID0gc2lkZUluZm9UYWJbc2VjdGlvbkluZm9bbmR4MV0uc2ZiQ250ICsgc2VjdGlvbkluZm9bbmR4Ml0uc2ZiQ250XSArCisgICAgICAgICAgICAgICAgICBmaW5kTWluTWVyZ2VCaXRzKGJpdExvb2tVcFtuZHgxXSwgYml0TG9va1VwW25keDJdKTsKKyAgTWVyZ2VHYWluID0gKFNwbGl0Qml0cyAtIE1lcmdlQml0cyk7CisKKyAgcmV0dXJuIGV4dHJhY3RfbChNZXJnZUdhaW4pOworfQorCisvKgorICBzZWN0aW9uaW5nIFN0YWdlIDA6ZmluZCBtaW5pbXVtIGNvZGJvb2tzCisqLworCitzdGF0aWMgdm9pZAorZ21TdGFnZTAoU0VDVElPTl9JTkZPICogc2VjdGlvbkluZm8sCisgICAgICAgICBXb3JkMTYgYml0TG9va1VwW01BWF9TRkJfTE9OR11bQ09ERV9CT09LX0VTQ19ORFggKyAxXSwKKyAgICAgICAgIGNvbnN0IFdvcmQxNiBtYXhTZmIpCit7CisgIFdvcmQzMiBpOworCisgIGZvciAoaT0wOyBpPG1heFNmYjsgaSsrKSB7CisgICAgLyogU2lkZS1JbmZvIGJpdHMgd2lsbCBiZSBjYWxjdWxhdGVkIGluIFN0YWdlIDEhICAqLworICAgICAKKyAgICBpZiAoc2VjdGlvbkluZm9baV0uc2VjdGlvbkJpdHMgPT0gSU5WQUxJRF9CSVRDT1VOVCkgeworICAgICAgc2VjdGlvbkluZm9baV0uc2VjdGlvbkJpdHMgPSBmaW5kQmVzdEJvb2soYml0TG9va1VwW2ldLCAmKHNlY3Rpb25JbmZvW2ldLmNvZGVCb29rKSk7CisgICAgfQorICB9Cit9CisKKy8qCisgIHNlY3Rpb25pbmcgU3RhZ2UgMTptZXJnZSBhbGwgY29ubmVjdGVkIHJlZ2lvbnMgd2l0aCB0aGUgc2FtZSBjb2RlIGJvb2sgYW5kCisgIGNhbGN1bGF0ZSBzaWRlIGluZm8KKyovCisKK3N0YXRpYyB2b2lkCitnbVN0YWdlMShTRUNUSU9OX0lORk8gKiBzZWN0aW9uSW5mbywKKyAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICAgY29uc3QgV29yZDE2IG1heFNmYiwKKyAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2lkZUluZm9UYWIpCit7CisgIFNFQ1RJT05fSU5GTyAqIHNlY3Rpb25JbmZvX3M7DQorICBTRUNUSU9OX0lORk8gKiBzZWN0aW9uSW5mb19lOw0KKyAgV29yZDMyIG1lcmdlU3RhcnQsIG1lcmdlRW5kOworICBtZXJnZVN0YXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGRvIHsKKworICAgIHNlY3Rpb25JbmZvX3MgPSBzZWN0aW9uSW5mbyArIG1lcmdlU3RhcnQ7DQorCWZvciAobWVyZ2VFbmQ9bWVyZ2VTdGFydCsxOyBtZXJnZUVuZDxtYXhTZmI7IG1lcmdlRW5kKyspIHsKKyAgICAgIHNlY3Rpb25JbmZvX2UgPSBzZWN0aW9uSW5mbyArIG1lcmdlRW5kOyAKKyAgICAgIGlmIChzZWN0aW9uSW5mb19zLT5jb2RlQm9vayAhPSBzZWN0aW9uSW5mb19lLT5jb2RlQm9vaykKKyAgICAgICAgYnJlYWs7CisgICAgICBzZWN0aW9uSW5mb19zLT5zZmJDbnQgKz0gMTsKKyAgICAgIHNlY3Rpb25JbmZvX3MtPnNlY3Rpb25CaXRzICs9IHNlY3Rpb25JbmZvX2UtPnNlY3Rpb25CaXRzOworCisgICAgICBtZXJnZUJpdExvb2tVcChiaXRMb29rVXBbbWVyZ2VTdGFydF0sIGJpdExvb2tVcFttZXJnZUVuZF0pOworICAgIH0KKworICAgIHNlY3Rpb25JbmZvX3MtPnNlY3Rpb25CaXRzICs9IHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvX3MtPnNmYkNudF07CisgICAgc2VjdGlvbkluZm9bbWVyZ2VFbmQgLSAxXS5zZmJTdGFydCA9IHNlY3Rpb25JbmZvX3MtPnNmYlN0YXJ0OyAgICAgIC8qIHNwZWVkIHVwIHByZXYgc2VhcmNoICovICAKKworICAgIG1lcmdlU3RhcnQgPSBtZXJnZUVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgIAorICB9IHdoaWxlIChtZXJnZVN0YXJ0IC0gbWF4U2ZiIDwgMCk7Cit9CisKKy8qCisgIHNlY3Rpb25pbmcgU3RhZ2UgMjpncmVlZHkgbWVyZ2UgYWxnb3JpdGhtLCBtZXJnZSBjb25uZWN0ZWQgc2VjdGlvbnMgd2l0aAorICBtYXhpbXVtIGJpdCBnYWluIHVudGlsIG5vIG1vcmUgZ2FpbiBpcyBwb3NzaWJsZQorKi8KK3N0YXRpYyB2b2lkCitnbVN0YWdlMihTRUNUSU9OX0lORk8gKnNlY3Rpb25JbmZvLAorICAgICAgICAgV29yZDE2IG1lcmdlR2Fpbkxvb2tVcFtNQVhfU0ZCX0xPTkddLAorICAgICAgICAgV29yZDE2IGJpdExvb2tVcFtNQVhfU0ZCX0xPTkddW0NPREVfQk9PS19FU0NfTkRYICsgMV0sCisgICAgICAgICBjb25zdCBXb3JkMTYgbWF4U2ZiLAorICAgICAgICAgY29uc3QgV29yZDE2ICpzaWRlSW5mb1RhYikKK3sKKyAgV29yZDE2IGk7CisKKyAgZm9yIChpPTA7IGkrc2VjdGlvbkluZm9baV0uc2ZiQ250PG1heFNmYjsgaSs9c2VjdGlvbkluZm9baV0uc2ZiQ250KSB7CisgICAgbWVyZ2VHYWluTG9va1VwW2ldID0gQ2FsY01lcmdlR2FpbihzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdExvb2tVcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpICsgc2VjdGlvbkluZm9baV0uc2ZiQ250KSk7CisgIH0KKworICB3aGlsZSAoVFJVRSkgeworICAgIFdvcmQxNiBtYXhNZXJnZUdhaW4sIG1heE5keCwgbWF4TmR4TmV4dCwgbWF4TmR4TGFzdDsKKworICAgIG1heE1lcmdlR2FpbiA9IGZpbmRNYXhNZXJnZShtZXJnZUdhaW5Mb29rVXAsIHNlY3Rpb25JbmZvLCBtYXhTZmIsICZtYXhOZHgpOworCisgICAgIAorICAgIGlmIChtYXhNZXJnZUdhaW4gPD0gMCkKKyAgICAgIGJyZWFrOworCisKKyAgICBtYXhOZHhOZXh0ID0gbWF4TmR4ICsgc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJDbnQ7CisKKyAgICBzZWN0aW9uSW5mb1ttYXhOZHhdLnNmYkNudCA9IHNlY3Rpb25JbmZvW21heE5keF0uc2ZiQ250ICsgc2VjdGlvbkluZm9bbWF4TmR4TmV4dF0uc2ZiQ250OworICAgIHNlY3Rpb25JbmZvW21heE5keF0uc2VjdGlvbkJpdHMgPSBzZWN0aW9uSW5mb1ttYXhOZHhdLnNlY3Rpb25CaXRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uSW5mb1ttYXhOZHhOZXh0XS5zZWN0aW9uQml0cyAtIG1heE1lcmdlR2Fpbik7CisKKworICAgIG1lcmdlQml0TG9va1VwKGJpdExvb2tVcFttYXhOZHhdLCBiaXRMb29rVXBbbWF4TmR4TmV4dF0pOworCisgICAgIAorICAgIGlmIChtYXhOZHggIT0gMCkgeworICAgICAgbWF4TmR4TGFzdCA9IHNlY3Rpb25JbmZvW21heE5keCAtIDFdLnNmYlN0YXJ0OworICAgICAgbWVyZ2VHYWluTG9va1VwW21heE5keExhc3RdID0gQ2FsY01lcmdlR2FpbihzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlSW5mb1RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4TGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TmR4KTsKKyAgICB9CisgICAgbWF4TmR4TmV4dCA9IG1heE5keCArIHNlY3Rpb25JbmZvW21heE5keF0uc2ZiQ250OworCisgICAgc2VjdGlvbkluZm9bbWF4TmR4TmV4dCAtIDFdLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9bbWF4TmR4XS5zZmJTdGFydDsgICAgICAgICAgICAgCisKKyAgICAgCisgICAgaWYgKG1heE5keE5leHQgLSBtYXhTZmIgPCAwKSB7CisgICAgICBtZXJnZUdhaW5Mb29rVXBbbWF4TmR4XSA9IENhbGNNZXJnZUdhaW4oc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGVJbmZvVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE5keCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhOZHhOZXh0KTsKKyAgICB9CisgIH0KK30KKworLyoKKyAgY291bnQgYml0cyB1c2VkIGJ5IHRoZSBub2lzZWxlc3MgY29kZXIKKyovCitzdGF0aWMgdm9pZAorbm9pc2VsZXNzQ291bnRlcihTRUNUSU9OX0RBVEEgKnNlY3Rpb25EYXRhLAorICAgICAgICAgICAgICAgICBXb3JkMTYgbWVyZ2VHYWluTG9va1VwW01BWF9TRkJfTE9OR10sCisgICAgICAgICAgICAgICAgIFdvcmQxNiBiaXRMb29rVXBbTUFYX1NGQl9MT05HXVtDT0RFX0JPT0tfRVNDX05EWCArIDFdLAorICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgYmxvY2tUeXBlKQoreworICBXb3JkMzIgZ3JwTmR4LCBpOworICBXb3JkMTYgKnNpZGVJbmZvVGFiID0gTlVMTDsKKyAgU0VDVElPTl9JTkZPICpzZWN0aW9uSW5mbzsKKworICAvKgorICAgIHVzZSBhcHByb3ByaWF0ZSBzaWRlIGluZm8gdGFibGUKKyAgKi8gICAKKyAgc3dpdGNoIChibG9ja1R5cGUpCisgIHsKKyAgICBjYXNlIExPTkdfV0lORE9XOgorICAgIGNhc2UgU1RBUlRfV0lORE9XOgorICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICBzaWRlSW5mb1RhYiA9IHNpZGVJbmZvVGFiTG9uZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgc2lkZUluZm9UYWIgPSBzaWRlSW5mb1RhYlNob3J0OworICAgICAgYnJlYWs7CisgIH0KKworCisgIHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIAorICBpZiAoc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwID09IDApCisgICAgcmV0dXJuOworCisgIC8qCisgICAgbG9vcCB0cm91Z2ggZ3JvdXBzCisgICovCisgIGZvciAoZ3JwTmR4PTA7IGdycE5keDxzZWN0aW9uRGF0YS0+c2ZiQ250OyBncnBOZHgrPXNlY3Rpb25EYXRhLT5zZmJQZXJHcm91cCkgeworCisgICAgc2VjdGlvbkluZm8gPSBzZWN0aW9uRGF0YS0+c2VjdGlvbkluZm8gKyBzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOworCisgICAgYnVpbGRCaXRMb29rVXAocXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0ICsgZ3JwTmR4LAorICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5TZmIgKyBncnBOZHgsCisgICAgICAgICAgICAgICAgICAgYml0TG9va1VwLAorICAgICAgICAgICAgICAgICAgIHNlY3Rpb25JbmZvKTsKKworICAgIC8qCisgICAgICAgMC5TdGFnZQorICAgICovCisgICAgZ21TdGFnZTAoc2VjdGlvbkluZm8sIGJpdExvb2tVcCwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwKTsKKworICAgIC8qCisgICAgICAgMS5TdGFnZQorICAgICovCisgICAgZ21TdGFnZTEoc2VjdGlvbkluZm8sIGJpdExvb2tVcCwgc2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwLCBzaWRlSW5mb1RhYik7CisKKworICAgIC8qCisgICAgICAgMi5TdGFnZQorICAgICovCisgICAgZ21TdGFnZTIoc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgbWVyZ2VHYWluTG9va1VwLAorICAgICAgICAgICAgIGJpdExvb2tVcCwKKyAgICAgICAgICAgICBzZWN0aW9uRGF0YS0+bWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgc2lkZUluZm9UYWIpOworCisKKyAgICAvKgorICAgICAgIGNvbXByZXNzIG91dHB1dCwgY2FsY3VsYXRlIHRvdGFsIGh1ZmYgYW5kIHNpZGUgYml0cworICAgICovCisgICAgZm9yIChpPTA7IGk8c2VjdGlvbkRhdGEtPm1heFNmYlBlckdyb3VwOyBpKz1zZWN0aW9uSW5mb1tpXS5zZmJDbnQpIHsKKyAgICAgIGZpbmRCZXN0Qm9vayhiaXRMb29rVXBbaV0sICYoc2VjdGlvbkluZm9baV0uY29kZUJvb2spKTsKKyAgICAgIHNlY3Rpb25JbmZvW2ldLnNmYlN0YXJ0ID0gc2VjdGlvbkluZm9baV0uc2ZiU3RhcnQgKyBncnBOZHg7CisKKyAgICAgIHNlY3Rpb25EYXRhLT5odWZmbWFuQml0cyA9IChzZWN0aW9uRGF0YS0+aHVmZm1hbkJpdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uSW5mb1tpXS5zZWN0aW9uQml0cyAtIHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvW2ldLnNmYkNudF0pKTsKKyAgICAgIHNlY3Rpb25EYXRhLT5zaWRlSW5mb0JpdHMgPSAoc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyArIHNpZGVJbmZvVGFiW3NlY3Rpb25JbmZvW2ldLnNmYkNudF0pOworICAgICAgc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvW3NlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnNdID0gc2VjdGlvbkluZm9baV07ICAgICAgICAgICAgIAorICAgICAgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucyA9IHNlY3Rpb25EYXRhLT5ub09mU2VjdGlvbnMgKyAxOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9ubmFtZTogc2NmQ291bnQKKyogcmV0dXJucyAgICAgOiAtLS0KKyogZGVzY3JpcHRpb24gOiBjb3VudCBiaXRzIHVzZWQgYnkgc2NhbGVmYWN0b3JzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzY2ZDb3VudChjb25zdCBXb3JkMTYgKnNjYWxlZmFjR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RBVEEgKiBzZWN0aW9uRGF0YSkKKworeworICBTRUNUSU9OX0lORk8gKnBzZWN0aW9uSW5mbzsNCisgIFNFQ1RJT05fSU5GTyAqcHNlY3Rpb25JbmZvbTsNCisNCisgIC8qIGNvdW50ZXIgKi8KKyAgV29yZDMyIGkgPSAwOyAvKiBzZWN0aW9uIGNvdW50ZXIgKi8KKyAgV29yZDMyIGogPSAwOyAvKiBzZmIgY291bnRlciAqLworICBXb3JkMzIgayA9IDA7IC8qIGN1cnJlbnQgc2VjdGlvbiBhdXhpbGlhcnkgY291bnRlciAqLworICBXb3JkMzIgbSA9IDA7IC8qIG90aGVyIHNlY3Rpb24gYXV4aWxpYXJ5IGNvdW50ZXIgKi8KKyAgV29yZDMyIG4gPSAwOyAvKiBvdGhlciBzZmIgYXV4aWxpYXJ5IGNvdW50ZXIgKi8KKworICAvKiBmdXJ0aGVyIHZhcmlhYmxlcyAqLworICBXb3JkMzIgbGFzdFZhbFNjZiAgICAgPSAwOworICBXb3JkMzIgZGVsdGFTY2YgICAgICAgPSAwOworICBGbGFnIGZvdW5kICAgICAgICAgICAgPSAwOworICBXb3JkMzIgc2NmU2tpcENvdW50ZXIgPSAwOyAgICAgICAgICAgCisgICAgICAgICAKKworICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgCisgIGlmIChzY2FsZWZhY0dhaW4gPT0gTlVMTCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGxhc3RWYWxTY2YgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzZWN0aW9uRGF0YS0+Zmlyc3RTY2YgPSAwOyAgICAgICAgDQorICAKKyAgcHNlY3Rpb25JbmZvID0gc2VjdGlvbkRhdGEtPnNlY3Rpb25JbmZvOworICBmb3IgKGk9MDsgaTxzZWN0aW9uRGF0YS0+bm9PZlNlY3Rpb25zOyBpKyspIHsKKyAgICAgCisgICAgaWYgKHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pIHsKKyAgICAgIHNlY3Rpb25EYXRhLT5maXJzdFNjZiA9IHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQ7ICAgICAgCisgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW3NlY3Rpb25EYXRhLT5maXJzdFNjZl07ICAgICAgICAgICAgICAgICAgCisgICAgICBicmVhazsKKyAgICB9DQorCXBzZWN0aW9uSW5mbyArPSAxOworICB9DQorCisgIHBzZWN0aW9uSW5mbyA9IHNlY3Rpb25EYXRhLT5zZWN0aW9uSW5mbzsKKyAgZm9yIChpPTA7IGk8c2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9uczsgaSsrLCBwc2VjdGlvbkluZm8gKz0gMSkgeworICAgICAgIAorICAgIGlmIChwc2VjdGlvbkluZm8tPmNvZGVCb29rICE9IENPREVfQk9PS19aRVJPX05PCisgICAgICAgICYmIHBzZWN0aW9uSW5mby0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykgeworICAgICAgZm9yIChqID0gcHNlY3Rpb25JbmZvLT5zZmJTdGFydDsKKyAgICAgICAgICAgaiA8IChwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQpOyBqKyspIHsKKyAgICAgICAgLyogY2hlY2sgaWYgd2UgY2FuIHJlcGVhdCB0aGUgbGFzdCB2YWx1ZSB0byBzYXZlIGJpdHMgKi8KKyAgICAgICAgIAorICAgICAgICBpZiAobWF4VmFsdWVJblNmYltqXSA9PSAwKSB7CisgICAgICAgICAgZm91bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICAgIGlmIChzY2ZTa2lwQ291bnRlciA9PSAwKSB7CisgICAgICAgICAgICAvKiBlbmQgb2Ygc2VjdGlvbiAqLworICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGogLSAoKHBzZWN0aW9uSW5mby0+c2ZiU3RhcnQgKyBwc2VjdGlvbkluZm8tPnNmYkNudCkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgIGZvdW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgZm9yIChrID0gaiArIDE7IGsgPCBwc2VjdGlvbkluZm8tPnNmYlN0YXJ0ICsgcHNlY3Rpb25JbmZvLT5zZmJDbnQ7IGsrKykgeworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobWF4VmFsdWVJblNmYltrXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICBpbnQgdG1wID0gTF9hYnMoc2NhbGVmYWNHYWluW2tdIC0gbGFzdFZhbFNjZik7CisJCQkJICBmb3VuZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBpZiAoIHRtcCA8IENPREVfQk9PS19TQ0ZfTEFWKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgYml0cyAqLworICAgICAgICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBzYXZlIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOworICAgICAgICAgICAgICAgICAgICBsYXN0VmFsU2NmID0gc2NhbGVmYWNHYWluW2pdOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGNvdW50IHNjYWxlZmFjdG9yIHNraXAgKi8KKyAgICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IHNjZlNraXBDb3VudGVyICsgMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCQkJDQorCQkJcHNlY3Rpb25JbmZvbSA9IHBzZWN0aW9uSW5mbyArIDE7CisgICAgICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBuZXh0IG1heFZhbHVlSW5TZmJbXSAhPSAwIGluIGFsbCBvdGhlciBzZWN0aW9ucyAqLworICAgICAgICAgICAgZm9yIChtID0gaSArIDE7IChtIDwgc2VjdGlvbkRhdGEtPm5vT2ZTZWN0aW9ucykgJiYgKGZvdW5kID09IDApOyBtKyspIHsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGlmICgocHNlY3Rpb25JbmZvbS0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1pFUk9fTk8pICYmCisgICAgICAgICAgICAgICAgICAocHNlY3Rpb25JbmZvbS0+Y29kZUJvb2sgIT0gQ09ERV9CT09LX1BOU19OTykpIHsKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSBwc2VjdGlvbkluZm9tLT5zZmJTdGFydDsKKyAgICAgICAgICAgICAgICAgICAgIG4gPCAocHNlY3Rpb25JbmZvbS0+c2ZiU3RhcnQgKyBwc2VjdGlvbkluZm9tLT5zZmJDbnQpOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIGlmIChtYXhWYWx1ZUluU2ZiW25dICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAoIChhYnNfcyhzY2FsZWZhY0dhaW5bbl0gLSBsYXN0VmFsU2NmKSA8IENPREVfQk9PS19TQ0ZfTEFWKSkgeworICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIGRlbHRhU2NmID0gKGxhc3RWYWxTY2YgLSBzY2FsZWZhY0dhaW5bal0pOworICAgICAgICAgICAgICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgLyogY291bnQgc2NhbGVmYWN0b3Igc2tpcCAqLworICAgICAgICAgICAgICAgICAgc2NmU2tpcENvdW50ZXIgPSBzY2ZTa2lwQ291bnRlciArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9DQorDQorCQkJICBwc2VjdGlvbkluZm9tICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZm91bmQgPT0gMCkgeworICAgICAgICAgICAgICBkZWx0YVNjZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBzY2ZTa2lwQ291bnRlciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRlbHRhU2NmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHNjZlNraXBDb3VudGVyID0gc2NmU2tpcENvdW50ZXIgLSAxOworICAgICAgICAgIH0NCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgZGVsdGFTY2YgPSBsYXN0VmFsU2NmIC0gc2NhbGVmYWNHYWluW2pdOworICAgICAgICAgIGxhc3RWYWxTY2YgPSBzY2FsZWZhY0dhaW5bal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIHNlY3Rpb25EYXRhLT5zY2FsZWZhY0JpdHMgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKGRlbHRhU2NmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCit0eXBlZGVmIFdvcmQxNiAoKmxvb2tVcFRhYmxlKVtDT0RFX0JPT0tfRVNDX05EWCArIDFdOworCisKK1dvcmQxNgorZHluQml0Q291bnQoY29uc3QgV29yZDE2ICAqcXVhbnRTcGVjdHJ1bSwKKyAgICAgICAgICAgIGNvbnN0IFVXb3JkMTYgKm1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzY2FsZWZhYywKKyAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIGJsb2NrVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKKyAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICBjb25zdCBXb3JkMTYgICpzZmJPZmZzZXQsCisgICAgICAgICAgICBTRUNUSU9OX0RBVEEgICpzZWN0aW9uRGF0YSkKK3sKKyAgc2VjdGlvbkRhdGEtPmJsb2NrVHlwZSAgICAgID0gYmxvY2tUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgCisgIHNlY3Rpb25EYXRhLT5zZmJDbnQgICAgICAgICA9IHNmYkNudDsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBzZWN0aW9uRGF0YS0+c2ZiUGVyR3JvdXAgICAgPSBzZmJQZXJHcm91cDsgICAgICAgICAgIAorICBpZihzZmJQZXJHcm91cCkKKwlzZWN0aW9uRGF0YS0+bm9PZkdyb3VwcyAgID0gc2ZiQ250L3NmYlBlckdyb3VwOyAKKyAgZWxzZQorCXNlY3Rpb25EYXRhLT5ub09mR3JvdXBzICAgPSAweDdmZmY7CisgIHNlY3Rpb25EYXRhLT5tYXhTZmJQZXJHcm91cCA9IG1heFNmYlBlckdyb3VwOyAgICAgICAgICAgICAgICAgIAorCisgIG5vaXNlbGVzc0NvdW50ZXIoc2VjdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEtPm1lcmdlR2Fpbkxvb2tVcCwKKyAgICAgICAgICAgICAgICAgICAobG9va1VwVGFibGUpc2VjdGlvbkRhdGEtPmJpdExvb2tVcCwKKyAgICAgICAgICAgICAgICAgICBxdWFudFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCisgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGJsb2NrVHlwZSk7CisKKyAgc2NmQ291bnQoc2NhbGVmYWMsCisgICAgICAgICAgIG1heFZhbHVlSW5TZmIsCisgICAgICAgICAgIHNlY3Rpb25EYXRhKTsKKworCisgIHJldHVybiAoc2VjdGlvbkRhdGEtPmh1ZmZtYW5CaXRzICsgc2VjdGlvbkRhdGEtPnNpZGVJbmZvQml0cyArIA0KKwkgICAgICBzZWN0aW9uRGF0YS0+c2NhbGVmYWNCaXRzKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvZ3JwX2RhdGEuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2dycF9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkOWE3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2dycF9kYXRhLmMKQEAgLTAsMCArMSwxODggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWdycF9kYXRhLmMNCisNCisJQ29udGVudDoJU2hvcnQgYmxvY2sgZ3JvdXBpbmcgZnVuY3Rpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiZ3JwX2RhdGEuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGdyb3VwU2hvcnREYXRhCisqIGRlc2NyaXB0aW9uOiAgZ3JvdXAgc2hvcnQgZGF0YSBmb3IgbmV4dCBxdWFudGl6YXRpb24gYW5kIGNvZGluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2dyb3VwU2hvcnREYXRhKFdvcmQzMiAgICAgICAgKm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgKnRtcFNwZWN0cnVtLAorICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAqc2ZiVGhyZXNob2xkLAorICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgU0ZCX0VORVJHWSAgICAqc2ZiRW5lcmd5TVMsCisgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICpzZmJTcHJlYWRlZEVuZXJneSwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgIHNmYkNudCwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgKnNmYk1pblNuciwKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJPZmZzZXQsCisgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICptYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgKmdyb3VwZWRTZmJNaW5TbnIsCisgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICBub09mR3JvdXBzLAorICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAqZ3JvdXBMZW4pCit7CisgIFdvcmQzMiBpLCBqOworICBXb3JkMzIgbGluZTsKKyAgV29yZDMyIHNmYjsKKyAgV29yZDMyIGdycDsKKyAgV29yZDMyIHduZDsKKyAgV29yZDMyIG9mZnNldDsKKyAgV29yZDMyIGhpZ2hlc3RTZmI7CisKKyAgLyogZm9yIHNob3J0OiByZWdyb3VwIGFuZCAgKi8KKyAgLyogY3VtdWxhdGUgZW5lcmdpZXMgdW5kIHRocmVzaG9sZHMgZ3JvdXAtd2lzZSAuICovCisgIAorICAvKiBjYWxjdWxhdGUgc2ZiQ250ICovCisgIGhpZ2hlc3RTZmIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yICh3bmQ9MDsgd25kPFRSQU5TX0ZBQzsgd25kKyspIHsKKyAgICBmb3IgKHNmYj1zZmJDbnQgLSAxOyBzZmI+PWhpZ2hlc3RTZmI7IHNmYi0tKSB7CisgICAgICBmb3IgKGxpbmU9KHNmYk9mZnNldFtzZmIgKyAxXSAtIDEpOyBsaW5lPj1zZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7CisgICAgICAgIAorICAgICAgICBpZiAobWRjdFNwZWN0cnVtW3duZCpGUkFNRV9MRU5fU0hPUlQrbGluZV0gIT0gMCkgYnJlYWs7IAorICAgICAgfQorICAgICAgCisgICAgICBpZiAobGluZSA+PSBzZmJPZmZzZXRbc2ZiXSkgYnJlYWs7CisgICAgfQorICAgIGhpZ2hlc3RTZmIgPSBtYXgoaGlnaGVzdFNmYiwgc2ZiKTsKKyAgfQorICAKKyAgaWYgKGhpZ2hlc3RTZmIgPCAwKSB7CisgICAgaGlnaGVzdFNmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICAqbWF4U2ZiUGVyR3JvdXAgPSBoaWdoZXN0U2ZiICsgMTsKKworICAvKiBjYWxjdWxhdGUgc2ZiT2Zmc2V0ICovCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gb2Zmc2V0ICsgc2ZiT2Zmc2V0W3NmYl0gKiBncm91cExlbltncnBdOworICAgICAgaSArPSAxOworICAgIH0KKyAgICBvZmZzZXQgKz0gZ3JvdXBMZW5bZ3JwXSAqIEZSQU1FX0xFTl9TSE9SVDsKKyAgfQorICBncm91cGVkU2ZiT2Zmc2V0W2ldID0gRlJBTUVfTEVOX0xPTkc7ICAgICAgICAgICAgICAgICAgCisgIGkgKz0gMTsKKworICAvKiBjYWxjdWxhdGUgbWluU25yICovCisgIGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGdycCA9IDA7IGdycCA8IG5vT2ZHcm91cHM7IGdycCsrKSB7CisgICAgZm9yIChzZmIgPSAwOyBzZmIgPCBzZmJDbnQ7IHNmYisrKSB7CisgICAgICBncm91cGVkU2ZiTWluU25yW2ldID0gc2ZiTWluU25yW3NmYl07ICAgICAgICAgICAgICAKKyAgICAgIGkgKz0gMTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGdyb3VwTGVuW2dycF0gKiBGUkFNRV9MRU5fU0hPUlQ7CisgIH0KKworCisgIC8qIHN1bSB1cCBzZmJUaHJlc2hvbGRzICovCisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgeworICAgICAgV29yZDMyIHRocmVzaCA9IHNmYlRocmVzaG9sZC0+c2ZiU2hvcnRbd25kXVtzZmJdOyAgICAgICAgICAKKyAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICB0aHJlc2ggPSBMX2FkZCh0aHJlc2gsIHNmYlRocmVzaG9sZC0+c2ZiU2hvcnRbd25kK2pdW3NmYl0pOworICAgICAgfQorICAgICAgc2ZiVGhyZXNob2xkLT5zZmJMb25nW2ldID0gdGhyZXNoOyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGkgKz0gMTsKKyAgICB9CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICAvKiBzdW0gdXAgc2ZiRW5lcmdpZXMgbGVmdC9yaWdodCAqLworICB3bmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGZvciAoZ3JwID0gMDsgZ3JwIDwgbm9PZkdyb3VwczsgZ3JwKyspIHsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IHNmYkNudDsgc2ZiKyspIHsKKyAgICAgIFdvcmQzMiBlbmVyZ3kgPSBzZmJFbmVyZ3ktPnNmYlNob3J0W3duZF1bc2ZiXTsgICAgICAgICAgICAgCisgICAgICBmb3IgKGo9MTsgajxncm91cExlbltncnBdOyBqKyspIHsKKyAgICAgICAgZW5lcmd5ID0gTF9hZGQoZW5lcmd5LCBzZmJFbmVyZ3ktPnNmYlNob3J0W3duZCtqXVtzZmJdKTsKKyAgICAgIH0KKyAgICAgIHNmYkVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBpICs9IDE7CisgICAgfQorICAgIHduZCArPSBncm91cExlbltncnBdOworICB9CisKKyAgLyogc3VtIHVwIHNmYkVuZXJnaWVzIG1pZC9zaWRlICovCisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgeworICAgICAgV29yZDMyIGVuZXJneSA9IHNmYkVuZXJneU1TLT5zZmJTaG9ydFt3bmRdW3NmYl07ICAgICAgICAgICAKKyAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYkVuZXJneU1TLT5zZmJTaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICB9CisgICAgICBzZmJFbmVyZ3lNUy0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaSArPSAxOworICAgIH0KKyAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKKyAgfQorCisgIC8qIHN1bSB1cCBzZmJTcHJlYWRlZEVuZXJnaWVzICovCisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgeworICAgICAgV29yZDMyIGVuZXJneSA9IHNmYlNwcmVhZGVkRW5lcmd5LT5zZmJTaG9ydFt3bmRdW3NmYl07ICAgICAKKyAgICAgIGZvciAoaj0xOyBqPGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICBlbmVyZ3kgPSBMX2FkZChlbmVyZ3ksIHNmYlNwcmVhZGVkRW5lcmd5LT5zZmJTaG9ydFt3bmQral1bc2ZiXSk7CisgICAgICB9CisgICAgICBzZmJTcHJlYWRlZEVuZXJneS0+c2ZiTG9uZ1tpXSA9IGVuZXJneTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgaSArPSAxOworICAgIH0KKyAgICB3bmQgKz0gZ3JvdXBMZW5bZ3JwXTsKKyAgfQorCisgIC8qIHJlLWdyb3VwIHNwZWN0cnVtICovCisgIHduZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgc2ZiQ250OyBzZmIrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IGdyb3VwTGVuW2dycF07IGorKykgeworICAgICAgICBXb3JkMTYgbGluZU9mZnNldCA9IEZSQU1FX0xFTl9TSE9SVCAqICh3bmQgKyBqKTsKKyAgICAgICAgZm9yIChsaW5lID0gbGluZU9mZnNldCArIHNmYk9mZnNldFtzZmJdOyBsaW5lIDwgbGluZU9mZnNldCArIHNmYk9mZnNldFtzZmIrMV07IGxpbmUrKykgeworICAgICAgICAgIHRtcFNwZWN0cnVtW2ldID0gbWRjdFNwZWN0cnVtW2xpbmVdOyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICBpID0gaSArIDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgd25kICs9IGdyb3VwTGVuW2dycF07CisgIH0KKworICBmb3IoaT0wO2k8RlJBTUVfTEVOX0xPTkc7aSs9NCkgeworICAgIG1kY3RTcGVjdHJ1bVtpXSA9IHRtcFNwZWN0cnVtW2ldOyAgDQorCW1kY3RTcGVjdHJ1bVtpKzFdID0gdG1wU3BlY3RydW1baSsxXTsgIA0KKwltZGN0U3BlY3RydW1baSsyXSA9IHRtcFNwZWN0cnVtW2krMl07ICANCisJbWRjdFNwZWN0cnVtW2krM10gPSB0bXBTcGVjdHJ1bVtpKzNdOyAgCQorICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0YjFkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlpbnRlcmZhY2UuYw0KKw0KKwlDb250ZW50OglJbnRlcmZhY2UgcHN5Y2hvYWNjb3VzdGljL3F1YW50aXplciBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBCdWlsZEludGVyZmFjZQorKiBkZXNjcmlwdGlvbjogIHVwZGF0ZSBvdXRwdXQgcGFyYW1ldGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCdWlsZEludGVyZmFjZShXb3JkMzIgICAgICAgICAgICAgICAgICAqZ3JvdXBlZE1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIG1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgU0ZCX1RIUkVTSE9MRCAgICAgICAgICAgKmdyb3VwZWRTZmJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgIFNGQl9FTkVSR1kgICAgICAgICAgICAgICpncm91cGVkU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICBTRkJfRU5FUkdZICAgICAgICAgICAgICAqZ3JvdXBlZFNmYlNwcmVhZGVkRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTRkJfRU5FUkdZX1NVTSAgICAgc2ZiRW5lcmd5U3VtTFIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNGQl9FTkVSR1lfU1VNICAgICBzZmJFbmVyZ3lTdW1NUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIHdpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAgd2luZG93U2hhcGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICBncm91cGVkU2ZiQ250LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAqZ3JvdXBlZFNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgICAgICAgICAqZ3JvdXBlZFNmYk1pblNuciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICAgICAgICAgICAgIG5vT2ZHcm91cHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgICAgICAgICAgICpncm91cExlbiwKKyAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICAgICAgKnBzeU91dENoKQoreworICBXb3JkMzIgajsKKyAgV29yZDMyIGdycDsgCisgIFdvcmQzMiBtYXNrOw0KKyAgV29yZDE2ICp0bXBWOworCisgIC8qCisgIGNvcHkgdmFsdWVzIHRvIHBzeU91dAorICAqLworICBwc3lPdXRDaC0+bWF4U2ZiUGVyR3JvdXAgICAgPSBtYXhTZmJQZXJHcm91cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwc3lPdXRDaC0+c2ZiQ250ICAgICAgICAgICAgPSBncm91cGVkU2ZiQ250OyAgIAorICBpZihub09mR3JvdXBzKQorCXBzeU91dENoLT5zZmJQZXJHcm91cCAgICAgPSBncm91cGVkU2ZiQ250LyBub09mR3JvdXBzOworICBlbHNlCisJcHN5T3V0Q2gtPnNmYlBlckdyb3VwICAgICA9IDB4N2ZmZjsKKyAgcHN5T3V0Q2gtPndpbmRvd1NlcXVlbmNlICAgID0gd2luZG93U2VxdWVuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcHN5T3V0Q2gtPndpbmRvd1NoYXBlICAgICAgID0gd2luZG93U2hhcGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcHN5T3V0Q2gtPm1kY3RTY2FsZSAgICAgICAgID0gbWRjdFNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcHN5T3V0Q2gtPm1kY3RTcGVjdHJ1bSAgICAgID0gZ3JvdXBlZE1kY3RTcGVjdHJ1bTsKKyAgcHN5T3V0Q2gtPnNmYkVuZXJneSAgICAgICAgID0gZ3JvdXBlZFNmYkVuZXJneS0+c2ZiTG9uZzsKKyAgcHN5T3V0Q2gtPnNmYlRocmVzaG9sZCAgICAgID0gZ3JvdXBlZFNmYlRocmVzaG9sZC0+c2ZiTG9uZzsKKyAgcHN5T3V0Q2gtPnNmYlNwcmVhZGVkRW5lcmd5ID0gZ3JvdXBlZFNmYlNwcmVhZGVkRW5lcmd5LT5zZmJMb25nOworICAKKyAgdG1wViA9IHBzeU91dENoLT5zZmJPZmZzZXRzOw0KKyAgZm9yKGo9MDsgajxncm91cGVkU2ZiQ250ICsgMTsgaisrKSB7CisgICAgICAqdG1wVisrID0gZ3JvdXBlZFNmYk9mZnNldFtqXTsKKyAgfQorICANCisgIHRtcFYgPSBwc3lPdXRDaC0+c2ZiTWluU25yOworICBmb3Ioaj0wO2o8Z3JvdXBlZFNmYkNudDsgaisrKSB7CisJICAqdG1wVisrID0gICBncm91cGVkU2ZiTWluU25yW2pdOworICB9CisgIAorICAvKiBnZW5lcmF0ZSBncm91cGluZyBtYXNrICovCisgIG1hc2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgZm9yIChncnAgPSAwOyBncnAgPCBub09mR3JvdXBzOyBncnArKykgeworICAgIG1hc2sgPSBtYXNrIDw8IDE7CisgICAgZm9yIChqPTE7IGo8Z3JvdXBMZW5bZ3JwXTsgaisrKSB7CisgICAgICBtYXNrID0gbWFzayA8PCAxOworICAgICAgbWFzayB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisgIHBzeU91dENoLT5ncm91cGluZ01hc2sgPSBtYXNrOyAKKyAgCisgIGlmICh3aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpIHsKKyAgICBwc3lPdXRDaC0+c2ZiRW5TdW1MUiA9ICBzZmJFbmVyZ3lTdW1MUi5zZmJMb25nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHBzeU91dENoLT5zZmJFblN1bU1TID0gIHNmYkVuZXJneVN1bU1TLnNmYkxvbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKyAgZWxzZSB7CisgICAgV29yZDMyIGk7CisgICAgV29yZDMyIGFjY3VTdW1NUz0wOworICAgIFdvcmQzMiBhY2N1U3VtTFI9MDsgICAgICAgIA0KKwlXb3JkMzIgKnBTdW1NUyA9IHNmYkVuZXJneVN1bU1TLnNmYlNob3J0Ow0KKwlXb3JkMzIgKnBTdW1MUiA9IHNmYkVuZXJneVN1bUxSLnNmYlNob3J0OworCisgICAgZm9yIChpPVRSQU5TX0ZBQzsgaTsgaS0tKSB7CisgICAgICBhY2N1U3VtTFIgPSBMX2FkZChhY2N1U3VtTFIsICpwU3VtTFIpOyBwU3VtTFIrKzsKKyAgICAgIGFjY3VTdW1NUyA9IExfYWRkKGFjY3VTdW1NUywgKnBTdW1NUyk7IHBTdW1NUysrOworICAgIH0KKyAgICBwc3lPdXRDaC0+c2ZiRW5TdW1NUyA9IGFjY3VTdW1NUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHBzeU91dENoLT5zZmJFblN1bUxSID0gYWNjdVN1bUxSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2xpbmVfcGUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL2xpbmVfcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTU3NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbGluZV9wZS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlsaW5lX3BlLmMNCisNCisJQ29udGVudDoJUGVyY2VwdHVhbCBlbnRyb3BpZSBtb2R1bGUgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJsaW5lX3BlLmgiCisKKworc3RhdGljIGNvbnN0IFdvcmQxNiAgQzFfSSA9IDEyOyAgICAvKiBsb2coOC4wKS9sb2coMikgKjQgICAgICAgICAqLworc3RhdGljIGNvbnN0IFdvcmQzMiAgQzJfSSA9IDEwODMwOyAvKiBsb2coMi41KS9sb2coMikgKiAxMDI0ICogNCAqIDIgKi8KK3N0YXRpYyBjb25zdCBXb3JkMTYgIEMzX0kgPSA1NzM7ICAgLyogKDEtQzIvQzEpICoxMDI0ICAgICAgICAgICAgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogcHJlcGFyZVNmYlBlCisqIGRlc2NyaXB0aW9uOiAgY29uc3RhbnRzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgc3VjY2Vzc2l2ZSBwZSBjYWxjdWxhdGlvbnMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByZXBhcmVTZmJQZShQRV9EQVRBICpwZURhdGEsCisgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgcGVPZmZzZXQpCit7CisgIFdvcmQzMiBzZmJHcnAsIHNmYjsKKyAgV29yZDMyIGNoOyAgICAgCisKKyAgZm9yKGNoPTA7IGNoPG5DaGFubmVsczsgY2grKykgeworICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9ICZwc3lPdXRDaGFubmVsW2NoXTsKKyAgICBQRV9DSEFOTkVMX0RBVEEgKnBlQ2hhbkRhdGE9JnBlRGF0YS0+cGVDaGFubmVsRGF0YVtjaF07CisgICAgZm9yKHNmYkdycD0wO3NmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApeworICAgICAgZm9yIChzZmI9MDsgc2ZiPHBzeU91dENoYW4tPm1heFNmYlBlckdyb3VwOyBzZmIrKykgeworCSAgICBwZUNoYW5EYXRhLT5zZmJOTGluZXM0W3NmYkdycCtzZmJdID0gc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdOyAgICAgICAgICAKKyAgICAgICAgc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdID0gc2ZiTlJlbGV2YW50TGluZXNbY2hdW3NmYkdycCtzZmJdID4+IDI7ICAgIAorCSAgICBwZUNoYW5EYXRhLT5zZmJMZEVuZXJneVtzZmJHcnArc2ZiXSA9IGxvZ1NmYkVuZXJneVtjaF1bc2ZiR3JwK3NmYl07ICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcGVEYXRhLT5vZmZzZXQgPSBwZU9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNhbGNTZmJQZQorKiBkZXNjcmlwdGlvbjogIGNvbnN0UGFydCBpcyBzZmJQZSB3aXRob3V0IHRoZSB0aHJlc2hvbGQgcGFydCBuKmxkKHRocikgb3IgbipDMypsZCh0aHIpCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjYWxjU2ZiUGUoUEVfREFUQSAqcGVEYXRhLAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCit7CisgIFdvcmQzMiBjaDsKKyAgV29yZDMyIHNmYkdycCwgc2ZiOworICBXb3JkMzIgbkxpbmVzNDsKKyAgV29yZDMyIGxkVGhyLCBsZFJhdGlvOw0KKyAgV29yZDMyIHBlLCBjb25zdFBhcnQsIG5BY3RpdmVMaW5lczsKKworICBwZURhdGEtPnBlID0gcGVEYXRhLT5vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwZURhdGEtPmNvbnN0UGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBwZURhdGEtPm5BY3RpdmVMaW5lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IoY2g9MDsgY2g8bkNoYW5uZWxzOyBjaCsrKSB7CisgICAgUFNZX09VVF9DSEFOTkVMICpwc3lPdXRDaGFuID0gJnBzeU91dENoYW5uZWxbY2hdOworICAgIFBFX0NIQU5ORUxfREFUQSAqcGVDaGFuRGF0YSA9ICZwZURhdGEtPnBlQ2hhbm5lbERhdGFbY2hdOworICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5ID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5OworICAgIGNvbnN0IFdvcmQzMiAqc2ZiVGhyZXNob2xkID0gcHN5T3V0Q2hhbi0+c2ZiVGhyZXNob2xkOworCisgICAgcGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgY29uc3RQYXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgbkFjdGl2ZUxpbmVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBmb3Ioc2ZiR3JwPTA7IHNmYkdycDxwc3lPdXRDaGFuLT5zZmJDbnQ7IHNmYkdycCs9cHN5T3V0Q2hhbi0+c2ZiUGVyR3JvdXApIHsKKyAgICAgIGZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKyAgICAgICAgV29yZDMyIG5yZyA9IHNmYkVuZXJneVtzZmJHcnArc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBXb3JkMzIgdGhyZXMgPSBzZmJUaHJlc2hvbGRbc2ZiR3JwK3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIFdvcmQzMiBzZmJMREVuID0gcGVDaGFuRGF0YS0+c2ZiTGRFbmVyZ3lbc2ZiR3JwK3NmYl07DQorCisgICAgICAgIGlmIChucmcgPiB0aHJlcykgeworICAgICAgICAgIGxkVGhyID0gaUxvZzQodGhyZXMpOworCisgICAgICAgICAgbGRSYXRpbyA9IHNmYkxERW4gLSBsZFRocjsKKworICAgICAgICAgIG5MaW5lczQgPSBwZUNoYW5EYXRhLT5zZmJOTGluZXM0W3NmYkdycCtzZmJdOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIAorICAgICAgICAgIC8qIHNmYlBlID0gbmwqbG9nMihlbi90aHIpKi8KKwkJICBpZiAobGRSYXRpbyA+PSBDMV9JKSB7CisgICAgICAgICAgICBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXSA9IChuTGluZXM0KmxkUmF0aW8gKyA4KSA+PiA0OworICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gKChuTGluZXM0KnNmYkxERW4pKSA+PiA0OworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKwkJICAvKiBzZmJQZSA9IG5sKihjMiArIGMzKmxvZzIoZW4vdGhyKSkqLworICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiUGVbc2ZiR3JwK3NmYl0gPSBleHRyYWN0X2woKExfbXB5X3d4KA0KKyAgICAgICAgICAgICAgICAgICAgKEMyX0kgKyBDM19JICogbGRSYXRpbyAqIDIpIDw8IDQsIG5MaW5lczQpICsgNCkgPj4gMyk7DQorICAgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdID0gZXh0cmFjdF9sKCggTF9tcHlfd3goDQorICAgICAgICAgICAgICAgICAgICAoQzJfSSArIEMzX0kgKiBzZmJMREVuICogMikgPDwgNCwgbkxpbmVzNCkgKyA0KSA+PiAzKTsNCisgICAgICAgICAgICBuTGluZXM0ID0gKG5MaW5lczQgKiBDM19JICsgKDEwMjQ8PDEpKSA+PiAxMDsKKyAgICAgICAgICB9CisgICAgICAgICAgcGVDaGFuRGF0YS0+c2ZiTkFjdGl2ZUxpbmVzW3NmYkdycCtzZmJdID0gbkxpbmVzNCA+PiAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYlBlW3NmYkdycCtzZmJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYkNvbnN0UGFydFtzZmJHcnArc2ZiXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIHBlQ2hhbkRhdGEtPnNmYk5BY3RpdmVMaW5lc1tzZmJHcnArc2ZiXSA9IDA7ICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIHBlID0gcGUgKyBwZUNoYW5EYXRhLT5zZmJQZVtzZmJHcnArc2ZiXTsKKyAgICAgICAgY29uc3RQYXJ0ID0gY29uc3RQYXJ0ICsgcGVDaGFuRGF0YS0+c2ZiQ29uc3RQYXJ0W3NmYkdycCtzZmJdOworICAgICAgICBuQWN0aXZlTGluZXMgPSBuQWN0aXZlTGluZXMgKyBwZUNoYW5EYXRhLT5zZmJOQWN0aXZlTGluZXNbc2ZiR3JwK3NmYl07CisgICAgICB9CisgICAgfQorCQ0KKwlwZUNoYW5EYXRhLT5wZSA9IHNhdHVyYXRlKHBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICBwZUNoYW5EYXRhLT5jb25zdFBhcnQgPSBzYXR1cmF0ZShjb25zdFBhcnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgcGVDaGFuRGF0YS0+bkFjdGl2ZUxpbmVzID0gc2F0dXJhdGUobkFjdGl2ZUxpbmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCisgICAgCisJcGUgKz0gcGVEYXRhLT5wZTsKKwlwZURhdGEtPnBlID0gc2F0dXJhdGUocGUpOyAKKyAgICBjb25zdFBhcnQgKz0gcGVEYXRhLT5jb25zdFBhcnQ7CisJcGVEYXRhLT5jb25zdFBhcnQgPSBzYXR1cmF0ZShjb25zdFBhcnQpOyAKKyAgICBuQWN0aXZlTGluZXMgKz0gcGVEYXRhLT5uQWN0aXZlTGluZXM7CisJcGVEYXRhLT5uQWN0aXZlTGluZXMgPSBzYXR1cmF0ZShuQWN0aXZlTGluZXMpOworICB9IAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbWVtYWxpZ24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21lbWFsaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyMDM1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21lbWFsaWduLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUZpbGU6CQltZW1fYWxpZ24uYworCisJQ29udGVudDoJTWVtb3J5IGFsbG9jIGFsaWdubWVudHMgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUJIm1lbWFsaWduLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBtZW1fbWFsbG9jCisqIGRlc2NyaXB0aW9uOiAgbWFsbG9jIHRoZSBhbGlnbm1lbnRzIG1lbW9yeSAKKyogcmV0dXJuczogICAgICB0aGUgcG9pbnQgb2YgdGhlIG1lbW9yeQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKgorbWVtX21hbGxvYyhWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgYWxpZ25tZW50LCB1bnNpZ25lZCBpbnQgQ29kZWNJRCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgKm1lbV9wdHI7CisJVk9fTUVNX0lORk8gTWVtSW5mbzsKKworCWlmICghYWxpZ25tZW50KSB7CisKKwkJTWVtSW5mby5GbGFnID0gMDsKKwkJTWVtSW5mby5TaXplID0gc2l6ZSArIDE7CisJCXJldCA9IHBNZW1vcC0+QWxsb2MoQ29kZWNJRCwgJk1lbUluZm8pOworCQlpZihyZXQgIT0gMCkKKwkJCXJldHVybiAwOworCQltZW1fcHRyID0gKHVuc2lnbmVkIGNoYXIgKilNZW1JbmZvLlZCdWZmZXI7CisKKwkJcE1lbW9wLT5TZXQoQ29kZWNJRCwgbWVtX3B0ciwgMCwgc2l6ZSArIDEpOworCisJCSptZW1fcHRyID0gKHVuc2lnbmVkIGNoYXIpMTsKKworCQlyZXR1cm4gKCh2b2lkICopKG1lbV9wdHIrMSkpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGNoYXIgKnRtcDsKKworCQlNZW1JbmZvLkZsYWcgPSAwOworCQlNZW1JbmZvLlNpemUgPSBzaXplICsgYWxpZ25tZW50OworCQlyZXQgPSBwTWVtb3AtPkFsbG9jKENvZGVjSUQsICZNZW1JbmZvKTsKKwkJaWYocmV0ICE9IDApCisJCQlyZXR1cm4gMDsKKworCQl0bXAgPSAodW5zaWduZWQgY2hhciAqKU1lbUluZm8uVkJ1ZmZlcjsKKworCQlwTWVtb3AtPlNldChDb2RlY0lELCB0bXAsIDAsIHNpemUgKyBhbGlnbm1lbnQpOworCisJCW1lbV9wdHIgPQorCQkJKHVuc2lnbmVkIGNoYXIgKikgKCh1bnNpZ25lZCBpbnQpICh0bXAgKyBhbGlnbm1lbnQgLSAxKSAmCisJCQkJCSh+KCh1bnNpZ25lZCBpbnQpIChhbGlnbm1lbnQgLSAxKSkpKTsKKworCQlpZiAobWVtX3B0ciA9PSB0bXApCisJCQltZW1fcHRyICs9IGFsaWdubWVudDsKKworCQkqKG1lbV9wdHIgLSAxKSA9ICh1bnNpZ25lZCBjaGFyKSAobWVtX3B0ciAtIHRtcCk7CisKKwkJcmV0dXJuICgodm9pZCAqKW1lbV9wdHIpOworCX0KKworCXJldHVybigwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogbWVtX2ZyZWUKKyogZGVzY3JpcHRpb246ICBmcmVlIHRoZSBtZW1vcnkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCittZW1fZnJlZShWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdm9pZCAqbWVtX3B0ciwgdW5zaWduZWQgaW50IENvZGVjSUQpCit7CisKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwlpZiAobWVtX3B0ciA9PSAwKQorCQlyZXR1cm47CisKKwlwdHIgPSBtZW1fcHRyOworCisJcHRyIC09ICoocHRyIC0gMSk7CisKKwlwTWVtb3AtPkZyZWUoQ29kZWNJRCwgcHRyKTsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvbXNfc3RlcmVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzZDA3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL21zX3N0ZXJlby5jCkBAIC0wLDAgKzEsMTM5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQltc19zdGVyZW8uYw0KKw0KKwlDb250ZW50OglNUyBzdGVyZW8gcHJvY2Vzc2luZyBmdW5jdGlvbg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInBzeV9jb25zdC5oIgorI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBNc1N0ZXJlb1Byb2Nlc3NpbmcKKyogZGVzY3JpcHRpb246ICBkZXRlY3QgdXNlIG1zIHN0ZXJlbyBvciBub3QKKyoJCQkJaWYgKChtaW4odGhyTG4sIHRoclJuKSptaW4odGhyTG4sIHRoclJuKSkvKGVuTW4qZW5TbikpIAorKgkJCQk+PSAoKHRockxuICp0aHJSbikvKGVuTG4qZW5SbikpIHRoZW4gbXMgc3RlcmVvCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNc1N0ZXJlb1Byb2Nlc3NpbmcoV29yZDMyICAgICAgICpzZmJFbmVyZ3lMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJFbmVyZ3lSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqc2ZiRW5lcmd5TWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpzZmJFbmVyZ3lTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICptZGN0U3BlY3RydW1MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICptZGN0U3BlY3RydW1SaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiVGhyZXNob2xkTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqc2ZiVGhyZXNob2xkUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgKnNmYlNwcmVhZGVkRW5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJTcHJlYWRlZEVuUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgKm1zRGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICptc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQpIHsKKyAgV29yZDMyIHRlbXA7CisgIFdvcmQzMiBzZmIsc2Zib2ZmcywgajsgCisgIFdvcmQzMiBtc01hc2tUcnVlU29tZXdoZXJlID0gMDsKKyAgV29yZDMyIG1zTWFza0ZhbHNlU29tZXdoZXJlID0gMDsKKworICBmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrPXNmYlBlckdyb3VwKSB7CisgICAgZm9yIChzZmJvZmZzPTA7c2Zib2ZmczxtYXhTZmJQZXJHcm91cDtzZmJvZmZzKyspIHsKKworICAgICAgV29yZDMyIHRlbXA7CisgICAgICBXb3JkMzIgcG5scixwbm1zOworICAgICAgV29yZDMyIG1pblRocmVzaG9sZDsKKyAgICAgIFdvcmQzMiB0aHJMLCB0aHJSLCBucmdMLCBucmdSOworICAgICAgV29yZDMyIGlkeCwgc2hpZnQ7CisKKyAgICAgIGlkeCA9IHNmYiArIHNmYm9mZnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgdGhyTCA9IHNmYlRocmVzaG9sZExlZnRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgdGhyUiA9IHNmYlRocmVzaG9sZFJpZ2h0W2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbnJnTCA9IHNmYkVuZXJneUxlZnRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbnJnUiA9IHNmYkVuZXJneVJpZ2h0W2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICBtaW5UaHJlc2hvbGQgPSBtaW4odGhyTCwgdGhyUik7CisKKyAgICAgIG5yZ0wgPSBtYXgobnJnTCx0aHJMKSArIDE7CisgICAgICBzaGlmdCA9IG5vcm1fbChucmdMKTsNCisJICBucmdMID0gRGl2XzMyKHRockwgPDwgc2hpZnQsIG5yZ0wgPDwgc2hpZnQpOworICAgICAgbnJnUiA9IG1heChucmdSLHRoclIpICsgMTsKKyAgICAgIHNoaWZ0ID0gbm9ybV9sKG5yZ1IpOw0KKwkgIG5yZ1IgPSBEaXZfMzIodGhyUiA8PCBzaGlmdCwgbnJnUiA8PCBzaGlmdCk7CisKKwkgIHBubHIgPSBmaXhtdWwobnJnTCwgbnJnUik7CisKKyAgICAgIG5yZ0wgPSBzZmJFbmVyZ3lNaWRbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIG5yZ1IgPSBzZmJFbmVyZ3lTaWRlW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgbnJnTCA9IG1heChucmdMLG1pblRocmVzaG9sZCkgKyAxOworICAgICAgc2hpZnQgPSBub3JtX2wobnJnTCk7DQorCSAgbnJnTCA9IERpdl8zMihtaW5UaHJlc2hvbGQgPDwgc2hpZnQsIG5yZ0wgPDwgc2hpZnQpOworCisgICAgICBucmdSID0gbWF4KG5yZ1IsbWluVGhyZXNob2xkKSArIDE7CisgICAgICBzaGlmdCA9IG5vcm1fbChucmdSKTsNCisJICBucmdSID0gRGl2XzMyKG1pblRocmVzaG9sZCA8PCBzaGlmdCwgbnJnUiA8PCBzaGlmdCk7CisKKyAgICAgIHBubXMgPSBmaXhtdWwobnJnTCwgbnJnUik7CisKKyAgICAgIHRlbXAgPSAocG5sciArIDEpIC8gKChwbm1zID4+IDgpICsgMSk7CisKKyAgICAgIHRlbXAgPSBwbm1zIC0gcG5scjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGlmKCB0ZW1wID4gMCApeworCisgICAgICAgIG1zTWFza1tpZHhdID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIG1zTWFza1RydWVTb21ld2hlcmUgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgZm9yIChqPXNmYk9mZnNldFtpZHhdOyBqPHNmYk9mZnNldFtpZHgrMV07IGorKykgeworICAgICAgICAgIFdvcmQzMiBsZWZ0LCByaWdodDsKKyAgICAgICAgICBsZWZ0ICA9IChtZGN0U3BlY3RydW1MZWZ0W2pdID4+ICAxKTsKKyAgICAgICAgICByaWdodCA9IChtZGN0U3BlY3RydW1SaWdodFtqXSA+PiAxKTsKKyAgICAgICAgICBtZGN0U3BlY3RydW1MZWZ0W2pdID0gIGxlZnQgKyByaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgIG1kY3RTcGVjdHJ1bVJpZ2h0W2pdID0gIGxlZnQgLSByaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHNmYlRocmVzaG9sZExlZnRbaWR4XSA9IG1pblRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNmYlRocmVzaG9sZFJpZ2h0W2lkeF0gPSBtaW5UaHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNmYkVuZXJneUxlZnRbaWR4XSA9IHNmYkVuZXJneU1pZFtpZHhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHNmYkVuZXJneVJpZ2h0W2lkeF0gPSBzZmJFbmVyZ3lTaWRlW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAgc2ZiU3ByZWFkZWRFblJpZ2h0W2lkeF0gPSBtaW4oc2ZiU3ByZWFkZWRFbkxlZnRbaWR4XSxzZmJTcHJlYWRlZEVuUmlnaHRbaWR4XSkgPj4gMTsgIAorICAgICAgICBzZmJTcHJlYWRlZEVuTGVmdFtpZHhdID0gc2ZiU3ByZWFkZWRFblJpZ2h0W2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBtc01hc2tbaWR4XSAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBtc01hc2tGYWxzZVNvbWV3aGVyZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICggbXNNYXNrVHJ1ZVNvbWV3aGVyZSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYobXNNYXNrRmFsc2VTb21ld2hlcmUgKSB7CisgICAgICAgICptc0RpZ2VzdCA9IFNJX01TX01BU0tfU09NRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX0FMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAqbXNEaWdlc3QgPSBTSV9NU19NQVNLX05PTkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3ByZV9lY2hvX2NvbnRyb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkyMTZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHJlX2VjaG9fY29udHJvbC5jCkBAIC0wLDAgKzEsMTEzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwcmVfZWNob19jb250cm9sLmMNCisNCisJQ29udGVudDoJUHJlIGVjaG8gY29udHJvbCBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisKKyNpbmNsdWRlICJvcGVyXzMyYi5oIgorI2luY2x1ZGUgInByZV9lY2hvX2NvbnRyb2wuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpJbml0UHJlRWNob0NvbnRyb2wgCisqIGRlc2NyaXB0aW9uOiBpbml0IHByZSBlY2hvIGNvbnRyb2wgcGFyYW1ldGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgSW5pdFByZUVjaG9Db250cm9sKFdvcmQzMiAqcGJUaHJlc2hvbGRObTEsCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KQoreworICBXb3JkMTYgcGI7CisKKyAgZm9yKHBiPTA7IHBiPG51bVBiOyBwYisrKSB7CisgICAgcGJUaHJlc2hvbGRObTFbcGJdID0gcGJUaHJlc2hvbGRRdWlldFtwYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTpQcmVFY2hvQ29udHJvbCAKKyogZGVzY3JpcHRpb246IHVwZGF0ZSBzaHJlc2hvbGQgdG8gYXZvaWQgcHJlIGVjaG8KKyoJCQkgICB0aHIobikgPSBtYXgocnBtaW4qdGhycShuKSwgbWluKHRocnEobiksIHJwZWxldip0aHJxMShuKSkpCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUHJlRWNob0NvbnRyb2woV29yZDMyICpwYlRocmVzaG9sZE5tMSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1QYiwKKyAgICAgICAgICAgICAgICAgICAgV29yZDMyICBtYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBiVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtZGN0U2NhbGVubTEpCit7CisgIFdvcmQzMiBpOworICBXb3JkMzIgdG1wVGhyZXNob2xkMSwgdG1wVGhyZXNob2xkMjsKKyAgV29yZDMyIHNjYWxpbmc7CisKKyAgLyogbWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yIGlzIGhhcmQgY29kZWQgdG8gMiAqLworICAodm9pZCltYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3I7CisKKyAgc2NhbGluZyA9ICgobWRjdFNjYWxlIC0gbWRjdFNjYWxlbm0xKSA8PCAxKTsKKyAgIAorICBpZiAoIHNjYWxpbmcgPiAwICkgeworICAgIGZvcihpID0gMDsgaSA8IG51bVBiOyBpKyspIHsKKyAgICAgIHRtcFRocmVzaG9sZDEgPSBwYlRocmVzaG9sZE5tMVtpXSA+PiAoc2NhbGluZy0xKTsKKyAgICAgIHRtcFRocmVzaG9sZDIgPSBMX21weV9scyhwYlRocmVzaG9sZFtpXSwgbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yKTsKKworICAgICAgLyogY29weSB0aHJlc2hvbGRzIHRvIGludGVybmFsIG1lbW9yeSAqLworICAgICAgcGJUaHJlc2hvbGRObTFbaV0gPSBwYlRocmVzaG9sZFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgICAKKyAgICAgIGlmKHBiVGhyZXNob2xkW2ldID4gdG1wVGhyZXNob2xkMSkgeworICAgICAgICBwYlRocmVzaG9sZFtpXSA9IHRtcFRocmVzaG9sZDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICB9CisgICAgICAgCisgICAgICBpZih0bXBUaHJlc2hvbGQyID4gcGJUaHJlc2hvbGRbaV0pIHsKKyAgICAgICAgcGJUaHJlc2hvbGRbaV0gPSB0bXBUaHJlc2hvbGQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorCisgICAgfQorICB9CisgIGVsc2UgeworICAgIHNjYWxpbmcgPSAtc2NhbGluZzsKKyAgICBmb3IoaSA9IDA7IGkgPCBudW1QYjsgaSsrKSB7CisKKyAgICAgIHRtcFRocmVzaG9sZDEgPSBwYlRocmVzaG9sZE5tMVtpXSA8PCAxOworICAgICAgdG1wVGhyZXNob2xkMiA9IExfbXB5X2xzKHBiVGhyZXNob2xkW2ldLCBtaW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IpOworCisgICAgICAvKiBjb3B5IHRocmVzaG9sZHMgdG8gaW50ZXJuYWwgbWVtb3J5ICovCisgICAgICBwYlRocmVzaG9sZE5tMVtpXSA9IHBiVGhyZXNob2xkW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgIAorICAgICAgaWYoKChwYlRocmVzaG9sZFtpXSA+PiBzY2FsaW5nKSA+IHRtcFRocmVzaG9sZDEpKSB7CisgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMSA8PCBzY2FsaW5nOworICAgICAgfQorICAgICAgIAorICAgICAgaWYodG1wVGhyZXNob2xkMiA+IHBiVGhyZXNob2xkW2ldKSB7CisgICAgICAgIHBiVGhyZXNob2xkW2ldID0gdG1wVGhyZXNob2xkMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0KKworICAgIH0KKyAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfY29uZmlndXJhdGlvbi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZlMDBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcHN5X2NvbmZpZ3VyYXRpb24uYwpAQCAtMCwwICsxLDUwNSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcHN5X2NvbmZpZ3VyYXRpb24uYw0KKw0KKwlDb250ZW50OglQc3ljaG9hY2NvdXN0aWMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKyNpbmNsdWRlICJwc3lfY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgImFkal90aHIuaCIKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisKKworCisjZGVmaW5lIEJBUkNfU0NBTEUJMTAwIC8qIGludGVnZXIgYmFyYyB2YWx1ZXMgYXJlIHNjYWxlZCB3aXRoIDEwMCAqLworI2RlZmluZSBMT0cyXzEwMDAJMzAxIC8qIGxvZzIqMTAwMCAqLw0KKyNkZWZpbmUgUEkyXzEwMDAJMTU3MSAvKiBwaS8yKjEwMDAqLw0KKyNkZWZpbmUgQVRBTl9DT0VGMQkzNTYwIC8qIDEwMDAvMC4yODA4NzJmKi8NCisjZGVmaW5lIEFUQU5fQ09FRjIJMjgxIC8qIDEwMDAqMC4yODA4NzJmKi8NCisKKwordHlwZWRlZiBzdHJ1Y3R7CisgIFdvcmQzMiBzYW1wbGVSYXRlOworICBjb25zdCBVV29yZDggKnBhcmFtTG9uZzsKKyAgY29uc3QgVVdvcmQ4ICpwYXJhbVNob3J0OworfVNGQl9JTkZPX1RBQjsKKworc3RhdGljIGNvbnN0IFdvcmQxNiBBQlNfTEVWID0gMjA7CitzdGF0aWMgY29uc3QgV29yZDE2IEJBUkNfVEhSX1FVSUVUW10gPSB7MTUsIDEwLCAgNywgIDIsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsICA1LCAxMCwgMjAsIDMwfTsKKworCisKK3N0YXRpYyBjb25zdCBXb3JkMTYgbWF4X2JhcmsgPSAyNDsgLyogbWF4aW11bSBiYXJrLXZhbHVlICovCitzdGF0aWMgY29uc3QgV29yZDE2IG1hc2tMb3cgID0gMzA7IC8qIGluIDFkQi9iYXJrICovCitzdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoID0gMTU7IC8qIGluIDEqZEIvYmFyayAqLworc3RhdGljIGNvbnN0IFdvcmQxNiBjX3JhdGlvICA9IDB4MDAyOTsgLyogcG93KDEwLjBmLCAtKDI5LjBmLzEwLjBmKSkgKi8KKworc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrTG93U3ByRW5Mb25nID0gMzA7ICAgICAgIC8qIGluIDFkQi9iYXJrICovCitzdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoU3ByRW5Mb25nID0gMjA7ICAgICAgLyogaW4gMWRCL2JhcmsgKi8KK3N0YXRpYyBjb25zdCBXb3JkMTYgbWFza0hpZ2hTcHJFbkxvbmdMb3dCciA9IDE1OyAvKiBpbiAxZEIvYmFyayAqLworc3RhdGljIGNvbnN0IFdvcmQxNiBtYXNrTG93U3ByRW5TaG9ydCA9IDIwOyAgICAgIC8qIGluIDFkQi9iYXJrICovCitzdGF0aWMgY29uc3QgV29yZDE2IG1hc2tIaWdoU3ByRW5TaG9ydCA9IDE1OyAgICAgLyogaW4gMWRCL2JhcmsgKi8NCitzdGF0aWMgY29uc3QgV29yZDE2IGNfbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gMHgwMTQ4OyAgICAvKiAwLjAxICooMSA8PCAxNSkqLw0KK3N0YXRpYyBjb25zdCBXb3JkMzIgY19tYXhzbnIgPSAweDY2NjY2NjY2OwkJIC8qIHVwcGVyIGxpbWl0IGlzIC0xIGRCICovDQorc3RhdGljIGNvbnN0IFdvcmQzMiBjX21pbnNuciA9IDB4MDA2MjRkZDM7CQkgLyogbG93ZXIgbGltaXQgaXMgLTI1IGRCICovDQorDQorc3RhdGljIGNvbnN0IFdvcmQzMiBjX21heENsaXBFbmVyZ3lMb25nID0gMHg3NzM1OTQwMDsgIC8qIDIuMGU5ZiovDQorc3RhdGljIGNvbnN0IFdvcmQzMiBjX21heENsaXBFbmVyZ3lTaG9ydCA9IDB4MDFkY2Q2NTA7IC8qIDIuMGU5Zi8oQUFDRU5DX1RSQU5TX0ZBQypBQUNFTkNfVFJBTlNfRkFDKSovDQorDQorDQorV29yZDMyIEdldFNSSW5kZXgoV29yZDMyIHNhbXBsZVJhdGUpDQorew0KKyAgICBpZiAoOTIwMTcgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDA7DQorICAgIGlmICg3NTEzMiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gMTsNCisgICAgaWYgKDU1NDI2IDw9IHNhbXBsZVJhdGUpIHJldHVybiAyOw0KKyAgICBpZiAoNDYwMDkgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDM7DQorICAgIGlmICgzNzU2NiA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNDsNCisgICAgaWYgKDI3NzEzIDw9IHNhbXBsZVJhdGUpIHJldHVybiA1Ow0KKyAgICBpZiAoMjMwMDQgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDY7DQorICAgIGlmICgxODc4MyA8PSBzYW1wbGVSYXRlKSByZXR1cm4gNzsNCisgICAgaWYgKDEzODU2IDw9IHNhbXBsZVJhdGUpIHJldHVybiA4Ow0KKyAgICBpZiAoMTE1MDIgPD0gc2FtcGxlUmF0ZSkgcmV0dXJuIDk7DQorICAgIGlmICg5MzkxIDw9IHNhbXBsZVJhdGUpIHJldHVybiAxMDsNCisNCisgICAgcmV0dXJuIDExOw0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGF0YW5fMTAwMAorKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgMTAwMCphdGFuKHgvMTAwMCkKKyogICAgICAgICAgICAgICBiYXNlZCBvbiBhdGFuIGFwcHJveCBmb3IgeCA+IDAJCQkJCisqCQkJCWF0YW4oeCkgPSB4LygoZmxvYXQpMS4wZisoZmxvYXQpMC4yODA4NzJmKngqeCkgIGlmIHggPCAxDQorKgkJCQkJCT0gcGkvMiAtIHgvKChmbG9hdCkwLjI4MDg3MmYgK3gqeCkJICAgIGlmIHggPj0gMQ0KKyogcmV0dXJuOiAgICAgICAxMDAwKmF0YW4oeC8xMDAwKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgYXRhbl8xMDAwKFdvcmQzMiB2YWwpIAoreworICBXb3JkMzIgeTsKKworICAgCisgIGlmKExfc3ViKHZhbCwgMTAwMCkgPCAwKSB7CisgICAgeSA9IGV4dHJhY3RfbCgoKDEwMDAgKiB2YWwpIC8gKDEwMDAgKyAoKHZhbCAqIHZhbCkgLyBBVEFOX0NPRUYxKSkpKTsKKyAgfQorICBlbHNlIHsKKyAgICB5ID0gUEkyXzEwMDAgLSAoKDEwMDAgKiB2YWwpIC8gKEFUQU5fQ09FRjIgKyAoKHZhbCAqIHZhbCkgLyAxMDAwKSkpOworICB9CisKKyAgcmV0dXJuIGV4dHJhY3RfbCh5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQmFyY0xpbmVWYWx1ZQorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZXMgYmFyYyB2YWx1ZSBmb3Igb25lIGZyZXF1ZW5jeSBsaW5lCisqIHJldHVybnM6ICAgICAgYmFyYyB2YWx1ZSBvZiBsaW5lICogQkFSQ19TQ0FMRQorKiBpbnB1dDogICAgICAgIG51bWJlciBvZiBsaW5lcyBpbiB0cmFuc2Zvcm0sIGluZGV4IG9mIGxpbmUgdG8gY2hlY2ssIEZzCisqIG91dHB1dDoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBCYXJjTGluZVZhbHVlKFdvcmQxNiBub09mTGluZXMsIFdvcmQxNiBmZnRMaW5lLCBXb3JkMzIgc2FtcGxpbmdGcmVxKQoreworICBXb3JkMzIgY2VudGVyX2ZyZXEsIHRlbXAsIGJ2YWxGRlRMaW5lOworCisgIC8qIGNlbnRlciBmcmVxdWVuY3kgb2YgZmZ0IGxpbmUgKi8KKyAgY2VudGVyX2ZyZXEgPSAoZmZ0TGluZSAqIHNhbXBsaW5nRnJlcSkgLyAobm9PZkxpbmVzIDw8IDEpOworICB0ZW1wID0gIGF0YW5fMTAwMCgoY2VudGVyX2ZyZXEgPDwgMikgLyAoMyoxMCkpOworICBidmFsRkZUTGluZSA9IAorICAgICgyNjYwMCAqIGF0YW5fMTAwMCgoY2VudGVyX2ZyZXEqNzYpIC8gMTAwKSArIDcqdGVtcCp0ZW1wKSAvICgyKjEwMDAqMTAwMCAvIEJBUkNfU0NBTEUpOworICAKKyAgcmV0dXJuIHNhdHVyYXRlKGJ2YWxGRlRMaW5lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGluaXRUaHJRdWlldAorKiBkZXNjcmlwdGlvbjogIGluaXQgdGhyZWRob2xkIGluIHF1aWV0CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGluaXRUaHJRdWlldChXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYkJhcmNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwYlRocmVzaG9sZFF1aWV0KSB7CisgIFdvcmQxNiBpOworICBXb3JkMTYgYmFyY1RoclF1aWV0OworCisgIGZvcihpPTA7IGk8bnVtUGI7IGkrKykgeworICAgIFdvcmQxNiBidjEsIGJ2MjsKKworICAgICAKKyAgICBpZiAoaT4wKQorICAgICAgYnYxID0gKHBiQmFyY1ZhbFtpXSArIHBiQmFyY1ZhbFtpLTFdKSA+PiAxOworICAgIGVsc2UKKyAgICAgIGJ2MSA9IHBiQmFyY1ZhbFtpXSA+PiAxOworCisgICAgIAorICAgIGlmIChpIDwgKG51bVBiIC0gMSkpCisgICAgICBidjIgPSAocGJCYXJjVmFsW2ldICsgcGJCYXJjVmFsW2krMV0pID4+IDE7CisgICAgZWxzZSB7CisgICAgICBidjIgPSBwYkJhcmNWYWxbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKworICAgIGJ2MSA9IG1pbigoYnYxIC8gQkFSQ19TQ0FMRSksIG1heF9iYXJrKTsKKyAgICBidjIgPSBtaW4oKGJ2MiAvIEJBUkNfU0NBTEUpLCBtYXhfYmFyayk7CisKKyAgICBiYXJjVGhyUXVpZXQgPSBtaW4oQkFSQ19USFJfUVVJRVRbYnYxXSwgQkFSQ19USFJfUVVJRVRbYnYyXSk7CisKKyAgICAKKyAgICAvKgorICAgICAgd2UgY2FsY3VsYXRlIAorICAgICAgcG93KDEwLjBmLChmbG9hdCkoYmFyY1RoclF1aWV0IC0gQUJTX0xFVikqMC4xKSooZmxvYXQpQUJTX0xPVyoocGJPZmZzZXRbaSsxXSAtIHBiT2Zmc2V0W2ldKTsKKyAgICAqLworCisgICAgcGJUaHJlc2hvbGRRdWlldFtpXSA9IHBvdzJfeHkoKCgoYmFyY1RoclF1aWV0IC0gQUJTX0xFVikgKiAxMDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HMl8xMDAwKigxNCsyKkxPR19OT1JNX1BDTSkpLCBMT0cyXzEwMDApICogKHBiT2Zmc2V0W2krMV0gLSBwYk9mZnNldFtpXSk7CisgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogaW5pdFNwcmVhZGluZworKiBkZXNjcmlwdGlvbjogIGluaXQgZW5lcmd5IHNwcmVhZGluZyBwYXJhbWV0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdFNwcmVhZGluZyhXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiQmFyY1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiTWFza0xvRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiTWFza0hpRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBiTWFza0xvRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcGJNYXNrSGlGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBibG9ja1R5cGUpCit7CisgIFdvcmQxNiBpOworICBXb3JkMTYgbWFza0xvd1NwckVuLCBtYXNrSGlnaFNwckVuOworCisgICAKKyAgaWYgKHN1YihibG9ja1R5cGUsIFNIT1JUX1dJTkRPVykgIT0gMCkgeworICAgIG1hc2tMb3dTcHJFbiA9IG1hc2tMb3dTcHJFbkxvbmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgIAorICAgIGlmIChiaXRyYXRlID4gMjIwMDApCisgICAgICBtYXNrSGlnaFNwckVuID0gbWFza0hpZ2hTcHJFbkxvbmc7CisgICAgZWxzZQorICAgICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5Mb25nTG93QnI7CisgIH0KKyAgZWxzZSB7CisgICAgbWFza0xvd1NwckVuID0gbWFza0xvd1NwckVuU2hvcnQ7ICAgICAgICAgICAgCisgICAgbWFza0hpZ2hTcHJFbiA9IG1hc2tIaWdoU3ByRW5TaG9ydDsgICAgICAgICAgCisgIH0KKworICBmb3IoaT0wOyBpPG51bVBiOyBpKyspIHsKKyAgICAgCisgICAgaWYgKGkgPiAwKSB7CisgICAgICBXb3JkMzIgZGJWYWw7CisgICAgICBXb3JkMTYgZGJhcmsgPSBwYkJhcmNWYWx1ZVtpXSAtIHBiQmFyY1ZhbHVlW2ktMV07CisKKyAgICAgIC8qCisgICAgICAgIHdlIGNhbHVsYXRlIHBvdygxMC4wZiwgLTAuMSpkYlZhbC9CQVJDX1NDQUxFKSAKKyAgICAgICovCisgICAgICBkYlZhbCA9IChtYXNrSGlnaCAqIGRiYXJrKTsKKyAgICAgIHBiTWFza0hpRmFjdG9yW2ldID0gcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwgKFdvcmQzMilMT0cyXzEwMDApKTsgICAgICAgICAgICAgLyogMC4zMDEgbG9nMTAoMikgKi8KKyAgICAgICAKKyAgICAgIGRiVmFsID0gKG1hc2tMb3cgKiBkYmFyayk7CisgICAgICBwYk1hc2tMb0ZhY3RvcltpLTFdID0gcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOyAKKyAgICAgICAKKyAgICAgIAorICAgICAgZGJWYWwgPSAobWFza0hpZ2hTcHJFbiAqIGRiYXJrKTsKKyAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSAgcm91bmQxNihwb3cyX3h5KExfbmVnYXRlKGRiVmFsKSwoV29yZDMyKUxPRzJfMTAwMCkpOyAKKyAgICAgIGRiVmFsID0gKG1hc2tMb3dTcHJFbiAqIGRiYXJrKTsKKyAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5baS0xXSA9IHJvdW5kMTYocG93Ml94eShMX25lZ2F0ZShkYlZhbCksKFdvcmQzMilMT0cyXzEwMDApKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwYk1hc2tIaUZhY3RvcltpXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgCisgICAgICBwYk1hc2tMb0ZhY3RvcltudW1QYi0xXSA9IDA7ICAgICAgICAgICAgICAgCisKKyAgICAgIHBiTWFza0hpRmFjdG9yU3ByRW5baV0gPSAwOyAgICAgICAgICAgICAgICAKKyAgICAgIHBiTWFza0xvRmFjdG9yU3ByRW5bbnVtUGItMV0gPSAwOyAgICAgICAgICAKKyAgICB9CisgIH0KKworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBpbml0QmFyY1ZhbHVlcworKiBkZXNjcmlwdGlvbjogIGluaXQgYmFyayB2YWx1ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbml0QmFyY1ZhbHVlcyhXb3JkMTYgIG51bVBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgIHNhbXBsaW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpwYkJ2YWwpCit7CisgIFdvcmQxNiBpOworICBXb3JkMTYgcGJCdmFsMCwgcGJCdmFsMTsKKworICBwYkJ2YWwwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IoaT0wOyBpPG51bVBiOyBpKyspeworICAgIHBiQnZhbDEgPSBCYXJjTGluZVZhbHVlKG51bUxpbmVzLCBwYk9mZnNldFtpKzFdLCBzYW1wbGluZ0ZyZXF1ZW5jeSk7CisgICAgcGJCdmFsW2ldID0gKHBiQnZhbDAgKyBwYkJ2YWwxKSA+PiAxOworICAgIHBiQnZhbDAgPSBwYkJ2YWwxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGluaXRNaW5TbnIKKyogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgbWluIHNuciBwYXJhbWV0ZXIKKyoJCQkJbWluU25yKG4pID0gMS8oMl5zZmJQZW1pbihuKS93KG4pIC0gMS41KQ0KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaW5pdE1pblNucihjb25zdCBXb3JkMzIgIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICBudW1MaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICpzZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqcGJCYXJjVmFsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgIHNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICpzZmJNaW5TbnIpCit7CisgIFdvcmQxNiBzZmI7CisgIFdvcmQxNiBiYXJjV2lkdGg7CisgIFdvcmQxNiBwZVBlcldpbmRvdzsKKyAgV29yZDMyIHBlUGFydDsKKyAgV29yZDMyIHNucjsKKyAgV29yZDE2IHBiVmFsMCwgcGJWYWwxLCBzaGlmdDsKKworICAvKiByZWxhdGl2ZSBudW1iZXIgb2YgYWN0aXZlIGJhcmtzICovCisKKworICBwZVBlcldpbmRvdyA9IGJpdHMycGUoZXh0cmFjdF9sKChiaXRyYXRlICogbnVtTGluZXMpIC8gc2FtcGxlcmF0ZSkpOworCisgIHBiVmFsMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIGZvciAoc2ZiPTA7IHNmYjxzZmJBY3RpdmU7IHNmYisrKSB7CisKKyAgICBwYlZhbDEgPSAocGJCYXJjVmFsW3NmYl0gPDwgMSkgLSBwYlZhbDA7CisgICAgYmFyY1dpZHRoID0gcGJWYWwxIC0gcGJWYWwwOworICAgIHBiVmFsMCA9IHBiVmFsMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIC8qIGFsbG93IGF0IGxlYXN0IDIuNCUgb2YgcGUgZm9yIGVhY2ggYWN0aXZlIGJhcmMgKi8NCisJcGVQYXJ0ID0gKChwZVBlcldpbmRvdyAqIDI0KSAqIChtYXhfYmFyayAqIGJhcmNXaWR0aCkpIC8KKyAgICAgICAgKHBiQmFyY1ZhbFtzZmJBY3RpdmUtMV0gKiAoc2ZiT2Zmc2V0W3NmYisxXSAtIHNmYk9mZnNldFtzZmJdKSk7CisgICAKKyAgICAgIAorICAgIHBlUGFydCA9IG1pbihwZVBhcnQsIDg0MDApOyAKKyAgICBwZVBhcnQgPSBtYXgocGVQYXJ0LCAxNDAwKTsKKworICAgIC8qIG1pblNucihuKSA9IDEvKDJec2ZiUGVtaW4obikvdyhuKSAtIDEuNSkqLw0KKwkvKiB3ZSBhZGQgYW4gb2Zmc2V0IG9mIDJeMTYgdG8gdGhlIHBvdyBmdW5jdGlvbnMgKi8KKwkvKiAweGMwMDAgPSAxLjUqKDEgPDwgMTUpKi8NCisgICAgICAKKyAgICBzbnIgPSBwb3cyX3h5KChwZVBhcnQgLSAxNioxMDAwKSwxMDAwKSAtIDB4MDAwMGMwMDA7CisgICAgICAKKyAgICBpZihzbnIgPiAweDAwMDA4MDAwKQ0KKwl7DQorCQlzaGlmdCA9IG5vcm1fbChzbnIpOw0KKwkJc25yID0gRGl2XzMyKDB4MDAwMDgwMDAgPDwgc2hpZnQsIHNuciA8PCBzaGlmdCk7ICAKKwl9CisJZWxzZQorCXsKKwkJc25yID0gMHg3ZmZmZmZmZjsKKwl9CisgICAgICAKKyAgICAvKiB1cHBlciBsaW1pdCBpcyAtMSBkQiAqLworICAgIHNuciA9IG1pbihzbnIsIGNfbWF4c25yKTsKKyAgICAvKiBsb3dlciBsaW1pdCBpcyAtMjUgZEIgKi8KKyAgICBzbnIgPSBtYXgoc25yLCBjX21pbnNucik7CisgICAgc2ZiTWluU25yW3NmYl0gPSByb3VuZDE2KHNucik7CisgIH0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogSW5pdFBzeUNvbmZpZ3VyYXRpb25Mb25nCisqIGRlc2NyaXB0aW9uOiAgaW5pdCBsb25nIGJsb2NrIHBzeWNob2Fjb3VzdGljIGNvbmZpZ3VyYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhXb3JkMzIgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBzeUNvbmYpCit7CisgIFdvcmQzMiBzYW1wbGVyYXRlaW5kZXg7DQorICBXb3JkMTYgc2ZiQmFyY1ZhbFtNQVhfU0ZCX0xPTkddOw0KKyAgV29yZDE2IHNmYjsKKworICAvKgorICAgIGluaXQgc2ZiIHRhYmxlCisgICovDQorICBzYW1wbGVyYXRlaW5kZXggPSBHZXRTUkluZGV4KHNhbXBsZXJhdGUpOyAgDQorICBwc3lDb25mLT5zZmJDbnQgPSBzZkJhbmRUb3RhbExvbmdbc2FtcGxlcmF0ZWluZGV4XTsNCisgIHBzeUNvbmYtPnNmYk9mZnNldCA9IHNmQmFuZFRhYkxvbmcgKyBzZkJhbmRUYWJMb25nT2Zmc2V0W3NhbXBsZXJhdGVpbmRleF07DQorICBwc3lDb25mLT5zYW1wUmF0ZUlkeCA9IHNhbXBsZXJhdGVpbmRleDsKKworICAvKgorICAgIGNhbGN1bGF0ZSBiYXJjIHZhbHVlcyBmb3IgZWFjaCBwYgorICAqLworICBpbml0QmFyY1ZhbHVlcyhwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCisgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgIHNmYkJhcmNWYWwpOworCisgIC8qCisgICAgaW5pdCB0aHJlc2hvbGRzIGluIHF1aWV0CisgICovCisgIGluaXRUaHJRdWlldChwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAorICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiVGhyZXNob2xkUXVpZXQpOworCisgIC8qCisgICAgY2FsY3VsYXRlIHNwcmVhZGluZyBmdW5jdGlvbgorICAqLworICBpbml0U3ByZWFkaW5nKHBzeUNvbmYtPnNmYkNudCwKKyAgICAgICAgICAgICAgICBzZmJCYXJjVmFsLAorICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0hpZ2hGYWN0b3IsCisgICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWFza0xvd0ZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICBMT05HX1dJTkRPVyk7CisKKyAgLyoKKyAgICBpbml0IHJhdGlvCisgICovCisgIHBzeUNvbmYtPnJhdGlvID0gY19yYXRpbzsgICAgICAKKworICBwc3lDb25mLT5tYXhBbGxvd2VkSW5jcmVhc2VGYWN0b3IgPSAyOyAgICAgICAgICAgICAgCisgIHBzeUNvbmYtPm1pblJlbWFpbmluZ1RocmVzaG9sZEZhY3RvciA9IGNfbWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yOyAgICAvKiAwLjAxICooMSA8PCAxNSkqLyAgCisKKyAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9IGNfbWF4Q2xpcEVuZXJneUxvbmc7ICAgICAgICAgICAgICAgICAgIAorICBwc3lDb25mLT5sb3dwYXNzTGluZSA9IGV4dHJhY3RfbCgoYmFuZHdpZHRoPDwxKSAqIEZSQU1FX0xFTl9MT05HIC8gc2FtcGxlcmF0ZSk7CisKKyAgZm9yIChzZmIgPSAwOyBzZmIgPCBwc3lDb25mLT5zZmJDbnQ7IHNmYisrKSB7CisgICAgaWYgKHN1Yihwc3lDb25mLT5zZmJPZmZzZXRbc2ZiXSwgcHN5Q29uZi0+bG93cGFzc0xpbmUpID49IDApCisgICAgICBicmVhazsKKyAgfQorICBwc3lDb25mLT5zZmJBY3RpdmUgPSBzZmI7ICAgICAgICAgICAgICAgICAKKworICAvKgorICAgIGNhbGN1bGF0ZSBtaW5TbnIKKyAgKi8KKyAgaW5pdE1pblNucihiaXRyYXRlLAorICAgICAgICAgICAgIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0W3BzeUNvbmYtPnNmYkNudF0sCisgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgIHNmYkJhcmNWYWwsCisgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiQWN0aXZlLAorICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1pblNucik7CisKKworICByZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0CisqIGRlc2NyaXB0aW9uOiAgaW5pdCBzaG9ydCBibG9jayBwc3ljaG9hY291c3RpYyBjb25maWd1cmF0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBJbml0UHN5Q29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBzeUNvbmYpIA0KK3sKKyAgV29yZDMyIHNhbXBsZXJhdGVpbmRleDsKKyAgV29yZDE2IHNmYkJhcmNWYWxbTUFYX1NGQl9TSE9SVF07CisgIFdvcmQxNiBzZmI7CisgIC8qCisgICAgaW5pdCBzZmIgdGFibGUKKyAgKi8KKyAgc2FtcGxlcmF0ZWluZGV4ID0gR2V0U1JJbmRleChzYW1wbGVyYXRlKTsgIA0KKyAgcHN5Q29uZi0+c2ZiQ250ID0gc2ZCYW5kVG90YWxTaG9ydFtzYW1wbGVyYXRlaW5kZXhdOw0KKyAgcHN5Q29uZi0+c2ZiT2Zmc2V0ID0gc2ZCYW5kVGFiU2hvcnQgKyBzZkJhbmRUYWJTaG9ydE9mZnNldFtzYW1wbGVyYXRlaW5kZXhdOworICBwc3lDb25mLT5zYW1wUmF0ZUlkeCA9IHNhbXBsZXJhdGVpbmRleDsKKyAgLyoKKyAgICBjYWxjdWxhdGUgYmFyYyB2YWx1ZXMgZm9yIGVhY2ggcGIKKyAgKi8KKyAgaW5pdEJhcmNWYWx1ZXMocHN5Q29uZi0+c2ZiQ250LAorICAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk9mZnNldFtwc3lDb25mLT5zZmJDbnRdLAorICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICBzZmJCYXJjVmFsKTsKKworICAvKgorICAgIGluaXQgdGhyZXNob2xkcyBpbiBxdWlldAorICAqLworICBpbml0VGhyUXVpZXQocHN5Q29uZi0+c2ZiQ250LAorICAgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKKyAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYlRocmVzaG9sZFF1aWV0KTsKKworICAvKgorICAgIGNhbGN1bGF0ZSBzcHJlYWRpbmcgZnVuY3Rpb24KKyAgKi8KKyAgaW5pdFNwcmVhZGluZyhwc3lDb25mLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKKyAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrTG93RmFjdG9yLAorICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgIHBzeUNvbmYtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwKKyAgICAgICAgICAgICAgICBwc3lDb25mLT5zZmJNYXNrSGlnaEZhY3RvclNwckVuLAorICAgICAgICAgICAgICAgIGJpdHJhdGUsCisgICAgICAgICAgICAgICAgU0hPUlRfV0lORE9XKTsKKworICAvKgorICAgIGluaXQgcmF0aW8KKyAgKi8KKyAgcHN5Q29uZi0+cmF0aW8gPSBjX3JhdGlvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHBzeUNvbmYtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgcHN5Q29uZi0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yID0gY19taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgCisKKyAgcHN5Q29uZi0+Y2xpcEVuZXJneSA9IGNfbWF4Q2xpcEVuZXJneVNob3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHBzeUNvbmYtPmxvd3Bhc3NMaW5lID0gZXh0cmFjdF9sKCgoYmFuZHdpZHRoIDw8IDEpICogRlJBTUVfTEVOX1NIT1JUKSAvIHNhbXBsZXJhdGUpOworIAorICBmb3IgKHNmYiA9IDA7IHNmYiA8IHBzeUNvbmYtPnNmYkNudDsgc2ZiKyspIHsKKyAgICAgCisgICAgaWYgKHBzeUNvbmYtPnNmYk9mZnNldFtzZmJdID49IHBzeUNvbmYtPmxvd3Bhc3NMaW5lKQorICAgICAgYnJlYWs7CisgIH0KKyAgcHN5Q29uZi0+c2ZiQWN0aXZlID0gc2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIC8qCisgICAgY2FsY3VsYXRlIG1pblNucgorICAqLworICBpbml0TWluU25yKGJpdHJhdGUsCisgICAgICAgICAgICAgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXRbcHN5Q29uZi0+c2ZiQ250XSwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgc2ZiQmFyY1ZhbCwKKyAgICAgICAgICAgICBwc3lDb25mLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgcHN5Q29uZi0+c2ZiTWluU25yKTsKKworICByZXR1cm4oMCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3BzeV9tYWluLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDZhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9wc3lfbWFpbi5jCkBAIC0wLDAgKzEsODEwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlwc3lfbWFpbi5jDQorDQorCUNvbnRlbnQ6CVBzeWNob2Fjb3VzdGljIG1ham9yIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAiYmxvY2tfc3dpdGNoLmgiCisjaW5jbHVkZSAidHJhbnNmb3JtLmgiCisjaW5jbHVkZSAic3ByZWFkaW5nLmgiCisjaW5jbHVkZSAicHJlX2VjaG9fY29udHJvbC5oIgorI2luY2x1ZGUgImJhbmRfbnJnLmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJwc3lfZGF0YS5oIgorI2luY2x1ZGUgIm1zX3N0ZXJlby5oIgorI2luY2x1ZGUgImludGVyZmFjZS5oIgorI2luY2x1ZGUgInBzeV9tYWluLmgiCisjaW5jbHVkZSAiZ3JwX2RhdGEuaCIKKyNpbmNsdWRlICJ0bnNfZnVuYy5oIgorI2luY2x1ZGUgIm1lbWFsaWduLmgiCisKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzdGFydCAgICAgICBzaG9ydCAgICAgICBzdG9wICovCitzdGF0aWMgV29yZDE2IGJsb2NrVHlwZTJ3aW5kb3dTaGFwZVtdID0ge0tCRF9XSU5ET1csU0lORV9XSU5ET1csU0lORV9XSU5ET1csS0JEX1dJTkRPV307CisKKy8qCisgIGZvcndhcmQgZGVmaW5pdGlvbnMKKyovCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaExvbmcoUFNZX0RBVEEqIHBzeURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0RBVEEqIHRuc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAqaFBzeUNvbmZMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFROU19EQVRBICp0bnNEYXRhMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2gpOworCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaExvbmdNUyAoUFNZX0RBVEEgIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcpOworCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaFNob3J0KFBTWV9EQVRBKiBwc3lEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwU2NyYXRjaFRucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2gpOworCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaFNob3J0TVMgKFBTWV9EQVRBICBwc3lEYXRhW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpoUHN5Q29uZlNob3J0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUHN5TmV3CisqIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5Y2hvYWNvdXN0aWMKKyogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCisqIGlucHV0OiAgICAgICAgcG9pbnRlciB0byBhIHBzeWNoIGhhbmRsZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgUHN5TmV3KFBTWV9LRVJORUwgKmhQc3ksIFdvcmQzMiBuQ2hhbiwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIFdvcmQxNiBpOw0KKyAgV29yZDMyICptZGN0U3BlY3RydW07DQorICBXb3JkMzIgKnNjcmF0Y2hUTlM7DQorICBXb3JkMTYgKm1kY3REZWxheUJ1ZmZlcjsNCisgIA0KKyAgbWRjdFNwZWN0cnVtID0gKFdvcmQzMiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbiAqIEZSQU1FX0xFTl9MT05HICogc2l6ZW9mKFdvcmQzMiksIDMyLCBWT19JTkRFWF9FTkNfQUFDKTsNCisgIGlmKE5VTEwgPT0gbWRjdFNwZWN0cnVtKQ0KKwkgIHJldHVybiAxOw0KKw0KKyAgc2NyYXRjaFROUyA9IChXb3JkMzIgKiltZW1fbWFsbG9jKHBNZW1PUCwgbkNoYW4gKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMzIpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7DQorICBpZihOVUxMID09IHNjcmF0Y2hUTlMpDQorICB7DQorCSAgcmV0dXJuIDE7DQorICB9DQorDQorICBtZGN0RGVsYXlCdWZmZXIgPSAoV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFuICogQkxPQ0tfU1dJVENISU5HX09GRlNFVCAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7DQorICBpZihOVUxMID09IG1kY3REZWxheUJ1ZmZlcikNCisgIHsNCisJICByZXR1cm4gMTsKKyAgfQ0KKw0KKyAgZm9yIChpPTA7IGk8bkNoYW47IGkrKyl7CisgICAgaFBzeS0+cHN5RGF0YVtpXS5tZGN0RGVsYXlCdWZmZXIgPSBtZGN0RGVsYXlCdWZmZXIgKyBpKkJMT0NLX1NXSVRDSElOR19PRkZTRVQ7ICAgICAgCisgICAgaFBzeS0+cHN5RGF0YVtpXS5tZGN0U3BlY3RydW0gPSBtZGN0U3BlY3RydW0gKyBpKkZSQU1FX0xFTl9MT05HOworICB9CisKKyAgaFBzeS0+cFNjcmF0Y2hUbnMgPSBzY3JhdGNoVE5TOworCisgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBQc3lEZWxldGUKKyogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3ljaG9hY291c3RpYworKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFBzeURlbGV0ZShQU1lfS0VSTkVMICAqaFBzeSwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIFdvcmQzMiBuY2g7DQorDQorICBpZihoUHN5KQ0KKyAgew0KKwlpZihoUHN5LT5wc3lEYXRhWzBdLm1kY3REZWxheUJ1ZmZlcikNCisJCW1lbV9mcmVlKHBNZW1PUCwgaFBzeS0+cHN5RGF0YVswXS5tZGN0RGVsYXlCdWZmZXIsIFZPX0lOREVYX0VOQ19BQUMpOw0KKyAgICAgIA0KKyAgICBpZihoUHN5LT5wc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSkNCisJCW1lbV9mcmVlKHBNZW1PUCwgaFBzeS0+cHN5RGF0YVswXS5tZGN0U3BlY3RydW0sIFZPX0lOREVYX0VOQ19BQUMpOw0KKw0KKyAgICBmb3IgKG5jaD0wOyBuY2g8TUFYX0NIQU5ORUxTOyBuY2grKyl7DQorCSAgaFBzeS0+cHN5RGF0YVtuY2hdLm1kY3REZWxheUJ1ZmZlciA9IE5VTEw7ICAgICAgDQorCSAgaFBzeS0+cHN5RGF0YVtuY2hdLm1kY3RTcGVjdHJ1bSA9IE5VTEw7DQorCX0NCisNCisJaWYoaFBzeS0+cFNjcmF0Y2hUbnMpDQorCXsNCisJCW1lbV9mcmVlKHBNZW1PUCwgaFBzeS0+cFNjcmF0Y2hUbnMsIFZPX0lOREVYX0VOQ19BQUMpOw0KKwkJaFBzeS0+cFNjcmF0Y2hUbnMgPSBOVUxMOw0KKwl9DQorICB9DQorCisgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBQc3lPdXROZXcKKyogZGVzY3JpcHRpb246ICBhbGxvY2F0ZXMgbWVtb3J5IGZvciBwc3lPdXQgc3RydWMKKyogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCisqIGlucHV0OiAgICAgICAgcG9pbnRlciB0byBhIHBzeWNoIGhhbmRsZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgUHN5T3V0TmV3KFBTWV9PVVQgKmhQc3lPdXQsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQoreworICBwTWVtT1AtPlNldChWT19JTkRFWF9FTkNfQUFDLCBoUHN5T3V0LCAwLCBzaXplb2YoUFNZX09VVCkpOworICAvKgorICAgIGFsbG9jIHNvbWUgbW9yZSBzdHVmZiwgdGJkCisgICovCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUHN5T3V0RGVsZXRlCisqIGRlc2NyaXB0aW9uOiAgYWxsb2NhdGVzIG1lbW9yeSBmb3IgcHN5Y2hvYWNvdXN0aWMKKyogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBQc3lPdXREZWxldGUoUFNZX09VVCAqaFBzeU91dCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIGhQc3lPdXQ9TlVMTDsKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IHBzeU1haW5Jbml0CisqIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcHN5Y2hvYWNvdXN0aWMKKyogcmV0dXJuczogICAgICBhbiBlcnJvciBjb2RlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworV29yZDE2IHBzeU1haW5Jbml0KFBTWV9LRVJORUwgKmhQc3ksCisgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgV29yZDMyIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgV29yZDE2IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0bnNNYXNrLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiBiYW5kd2lkdGgpCit7CisgIFdvcmQxNiBjaCwgZXJyOworICBXb3JkMzIgY2hhbm5lbEJpdFJhdGUgPSBiaXRSYXRlL2NoYW5uZWxzOworCisgIGVyciA9IEluaXRQc3lDb25maWd1cmF0aW9uTG9uZyhjaGFubmVsQml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGhQc3ktPnBzeUNvbmZMb25nKSk7DQorDQorICBpZiAoIWVycikgeworICAgICAgaFBzeS0+c2FtcGxlUmF0ZUlkeCA9IGhQc3ktPnBzeUNvbmZMb25nLnNhbXBSYXRlSWR4Ow0KKwkgIGVyciA9IEluaXRUbnNDb25maWd1cmF0aW9uTG9uZyhiaXRSYXRlLCBzYW1wbGVSYXRlLCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZMb25nLnRuc0NvbmYsICZoUHN5LT5wc3lDb25mTG9uZywgdG5zTWFzayYyKTsKKyAgfQorCisgIGlmICghZXJyKQorICAgIGVyciA9IEluaXRQc3lDb25maWd1cmF0aW9uU2hvcnQoY2hhbm5lbEJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZTaG9ydCk7CisgIGlmICghZXJyKSB7CisgICAgZXJyID0gSW5pdFRuc0NvbmZpZ3VyYXRpb25TaG9ydChiaXRSYXRlLCBzYW1wbGVSYXRlLCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoUHN5LT5wc3lDb25mU2hvcnQudG5zQ29uZiwgJmhQc3ktPnBzeUNvbmZTaG9ydCwgdG5zTWFzayYxKTsKKyAgfQorCisgIGlmICghZXJyKQorICAgIGZvcihjaD0wO2NoIDwgY2hhbm5lbHM7Y2grKyl7CisgIAorICAgICAgSW5pdEJsb2NrU3dpdGNoaW5nKCZoUHN5LT5wc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSwgY2hhbm5lbHMpOworCisgICAgICBJbml0UHJlRWNob0NvbnRyb2woaFBzeS0+cHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkbm0xLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhQc3ktPnBzeUNvbmZMb25nLnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5LT5wc3lDb25mTG9uZy5zZmJUaHJlc2hvbGRRdWlldCk7CisgICAgICBoUHN5LT5wc3lEYXRhW2NoXS5tZGN0U2NhbGVubTEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisJcmV0dXJuKGVycik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBwc3lNYWluCisqIGRlc2NyaXB0aW9uOiAgcHN5Y2hvYWNvdXN0aWMgbWFpbiBmdW5jdGlvbgorKiByZXR1cm5zOiAgICAgIGFuIGVycm9yIGNvZGUKKyoKKyogICAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgZW5vdWdoIGlucHV0IGRhdGEgaXMgaW4gdGhlIG1vZHVsbyBidWZmZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworV29yZDE2IHBzeU1haW4oV29yZDE2ICAgICAgICAgICAgICAgICAgIG5DaGFubmVscywKKyAgICAgICAgICAgICAgIEVMRU1FTlRfSU5GTyAgICAgICAgICAgICplbGVtSW5mbywKKyAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAgICAgICAgICp0aW1lU2lnbmFsLCAKKyAgICAgICAgICAgICAgIFBTWV9EQVRBICAgICAgICAgICAgICAgICBwc3lEYXRhW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICBUTlNfREFUQSAgICAgICAgICAgICAgICAgdG5zRGF0YVtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fTE9ORyAgKmhQc3lDb25mTG9uZywKKyAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX1NIT1JUICpoUHN5Q29uZlNob3J0LAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMICAgICAgICAgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAgICAgICAgICpwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgV29yZDMyICAgICAgICAgICAgICAgICAgKnBTY3JhdGNoVG5zLAorCQkJICAgV29yZDMyCQkJCSAgIHNhbXBsZVJhdGUpCit7CisgIFdvcmQxNiBtYXhTZmJQZXJHcm91cFtNQVhfQ0hBTk5FTFNdOworICBXb3JkMTYgbWRjdFNjYWxpbmdBcnJheVtNQVhfQ0hBTk5FTFNdOworCisgIFdvcmQxNiBjaDsgICAvKiBjb3VudHMgdGhyb3VnaCBjaGFubmVscyAgICAgICAgICAqLworICBXb3JkMTYgc2ZiOyAgLyogY291bnRzIHRocm91Z2ggc2NhbGVmYWN0b3IgYmFuZHMgKi8KKyAgV29yZDE2IGxpbmU7IC8qIGNvdW50cyB0aHJvdWdoIGxpbmVzICAgICAgICAgICAgICovCisgIFdvcmQxNiBjaGFubmVsczsKKyAgV29yZDE2IG1heFNjYWxlOworCisgIGNoYW5uZWxzID0gZWxlbUluZm8tPm5DaGFubmVsc0luRWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBtYXhTY2FsZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAvKiBibG9jayBzd2l0Y2hpbmcgKi8NCisgIGZvcihjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICBCbG9ja1N3aXRjaGluZygmcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgIHRpbWVTaWduYWwrZWxlbUluZm8tPkNoYW5uZWxJbmRleFtjaF0sCisJCQkJICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMpOworICB9CisKKyAgLyogc3luY2ggbGVmdCBhbmQgcmlnaHQgYmxvY2sgdHlwZSAqLworICBTeW5jQmxvY2tTd2l0Y2hpbmcoJnBzeURhdGFbMF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbMV0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworCisgIC8qIHRyYW5zZm9ybQorICAgICBhbmQgZ2V0IG1heFNjYWxlIChtYXggbWRjdFNjYWxpbmcpIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgZm9yKGNoPTA7IGNoPGNoYW5uZWxzOyBjaCsrKSB7CisgICAgVHJhbnNmb3JtX1JlYWwocHN5RGF0YVtjaF0ubWRjdERlbGF5QnVmZmVyLAorICAgICAgICAgICAgICAgICAgIHRpbWVTaWduYWwrZWxlbUluZm8tPkNoYW5uZWxJbmRleFtjaF0sCisgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAmKG1kY3RTY2FsaW5nQXJyYXlbY2hdKSwKKyAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOworICAgIG1heFNjYWxlID0gbWF4KG1heFNjYWxlLCBtZGN0U2NhbGluZ0FycmF5W2NoXSk7CisgIH0KKworICAvKiBjb21tb24gc2NhbGluZyBmb3IgYWxsIGNoYW5uZWxzICovCisgIGZvciAoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKKyAgICBXb3JkMTYgc2NhbGVEaWZmID0gbWF4U2NhbGUgLSBtZGN0U2NhbGluZ0FycmF5W2NoXTsKKyAgICAgCisgICAgaWYgKHNjYWxlRGlmZiA+IDApIHsKKyAgICAgIFdvcmQzMiAqU3BlY3RydW0gPSBwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW07CisJICBmb3IobGluZT0wOyBsaW5lPEZSQU1FX0xFTl9MT05HOyBsaW5lKyspIHsKKyAgICAgICAgKlNwZWN0cnVtID0gKCpTcGVjdHJ1bSkgPj4gc2NhbGVEaWZmOworCQlTcGVjdHJ1bSsrOworICAgICAgfQorICAgIH0KKyAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUgPSBtYXhTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIGZvciAoY2g9MDsgY2g8Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgCisgICAgaWYocHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykgeworICAgICAgLyogdXBkYXRlIGxvbmcgYmxvY2sgcGFyYW1ldGVyICovCisJICBhZHZhbmNlUHN5Y2hMb25nKCZwc3lEYXRhW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hUbnMsCisgICAgICAgICAgICAgICAgICAgICAgICZ0bnNEYXRhWzEgLSBjaF0sCisgICAgICAgICAgICAgICAgICAgICAgIGNoKTsKKworICAgICAgLyogZGV0ZXJtaW5lIG1heFNmYiAqLworICAgICAgZm9yIChzZmI9aFBzeUNvbmZMb25nLT5zZmJDbnQtMTsgc2ZiPj0wOyBzZmItLSkgeworICAgICAgICBmb3IgKGxpbmU9aFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiKzFdIC0gMTsgbGluZT49aFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXTsgbGluZS0tKSB7CisgICAgICAgICAgIAorICAgICAgICAgIGlmIChwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW1bbGluZV0gIT0gMCkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmUgPj0gaFBzeUNvbmZMb25nLT5zZmJPZmZzZXRbc2ZiXSkgYnJlYWs7CisgICAgICB9CisgICAgICBtYXhTZmJQZXJHcm91cFtjaF0gPSBzZmIgKyAxOworCisgICAgICAvKiBDYWxjIGJhbmR3aXNlIGVuZXJnaWVzIGZvciBtaWQgYW5kIHNpZGUgY2hhbm5lbAorICAgICAgICAgRG8gaXQgb25seSBpZiAyIGNoYW5uZWxzIGV4aXN0ICovCisgICAgICAgCisgICAgICBpZiAoY2ggPT0gMSkKKyAgICAgICAgYWR2YW5jZVBzeWNoTG9uZ01TKHBzeURhdGEsIGhQc3lDb25mTG9uZyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYWR2YW5jZVBzeWNoU2hvcnQoJnBzeURhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRuc0RhdGFbMSAtIGNoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoKTsKKworICAgICAgLyogQ2FsYyBiYW5kd2lzZSBlbmVyZ2llcyBmb3IgbWlkIGFuZCBzaWRlIGNoYW5uZWwKKyAgICAgICAgIERvIGl0IG9ubHkgaWYgMiBjaGFubmVscyBleGlzdCAqLworICAgICAgIAorICAgICAgaWYgKGNoID09IDEpCisgICAgICAgIGFkdmFuY2VQc3ljaFNob3J0TVMgKHBzeURhdGEsIGhQc3lDb25mU2hvcnQpOworICAgIH0KKyAgfQorCisgIC8qIGdyb3VwIHNob3J0IGRhdGEgKi8KKyAgZm9yKGNoPTA7IGNoPGNoYW5uZWxzOyBjaCsrKSB7CisgICAgIAorICAgIGlmIChwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgPT0gU0hPUlRfV0lORE9XKSB7CisgICAgICBncm91cFNob3J0RGF0YShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaFRucywKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneU1TLAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlNwcmVhZGVkRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiTWluU25yLAorICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk9mZnNldFtjaF0sCisgICAgICAgICAgICAgICAgICAgICAmbWF4U2ZiUGVyR3JvdXBbY2hdLAorICAgICAgICAgICAgICAgICAgICAgcHN5T3V0RWxlbWVudC0+Z3JvdXBlZFNmYk1pblNucltjaF0sCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbik7CisgICAgfQorICB9CisKKworI2lmIChNQVhfQ0hBTk5FTFM+MSkKKyAgLyoKKyAgICBzdGVyZW8gUHJvY2Vzc2luZworICAqLworICBpZiAoY2hhbm5lbHMgPT0gMikgeworICAgIHBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc0RpZ2VzdCA9IE1TX05PTkU7ICAgICAgICAgICAgICAgICAKKyAgICBtYXhTZmJQZXJHcm91cFswXSA9IG1heFNmYlBlckdyb3VwWzFdID0gbWF4KG1heFNmYlBlckdyb3VwWzBdLCBtYXhTZmJQZXJHcm91cFsxXSk7CisKKyAgICAgCisgICAgaWYgKHBzeURhdGFbMF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlICE9IFNIT1JUX1dJTkRPVykKKyAgICAgIE1zU3RlcmVvUHJvY2Vzc2luZyhwc3lEYXRhWzBdLnNmYkVuZXJneS5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5TVMuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlRocmVzaG9sZC5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiVGhyZXNob2xkLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2KikmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JkMTYqKXBzeU91dEVsZW1lbnQtPnRvb2xzSW5mby5tc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQpOworICAgICAgZWxzZQorICAgICAgICBNc1N0ZXJlb1Byb2Nlc3NpbmcocHN5RGF0YVswXS5zZmJFbmVyZ3kuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYkVuZXJneU1TLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYkVuZXJneU1TLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiVGhyZXNob2xkLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzBdLnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhWzFdLnNmYlNwcmVhZGVkRW5lcmd5LnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2KikmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zRGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdvcmQxNiopcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvLm1zTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMqaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2Kilwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiT2Zmc2V0WzBdKTsKKyAgfQorCisjZW5kaWYgLyogKE1BWF9DSEFOTkVMUz4xKSAqLworCisgIC8qCisgICAgYnVpbGQgb3V0cHV0CisgICovCisgIGZvcihjaD0wO2NoPGNoYW5uZWxzO2NoKyspIHsKKyAgICAgCisgICAgaWYgKHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSAhPSBTSE9SVF9XSU5ET1cpCisgICAgICBCdWlsZEludGVyZmFjZShwc3lEYXRhW2NoXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5tZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiVGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJTcHJlYWRlZEVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLnNmYkVuZXJneVN1bU1TLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgICAgYmxvY2tUeXBlMndpbmRvd1NoYXBlW3BzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZV0sCisgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgbWF4U2ZiUGVyR3JvdXBbY2hdLAorICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJNaW5TbnIsCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcywKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbY2hdLmJsb2NrU3dpdGNoaW5nQ29udHJvbC5ncm91cExlbiwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lPdXRDaGFubmVsW2NoXSk7CisgICAgZWxzZQorICAgICAgQnVpbGRJbnRlcmZhY2UocHN5RGF0YVtjaF0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0ubWRjdFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGFbY2hdLnNmYlRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICZwc3lEYXRhW2NoXS5zZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVtjaF0uc2ZiU3ByZWFkZWRFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5zZmJFbmVyZ3lTdW0sCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5zZmJFbmVyZ3lTdW1NUywKKyAgICAgICAgICAgICAgICAgICAgIFNIT1JUX1dJTkRPVywKKyAgICAgICAgICAgICAgICAgICAgIFNJTkVfV0lORE9XLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wubm9PZkdyb3VwcypoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LT5ncm91cGVkU2ZiT2Zmc2V0W2NoXSwKKyAgICAgICAgICAgICAgICAgICAgIG1heFNmYlBlckdyb3VwW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQtPmdyb3VwZWRTZmJNaW5TbnJbY2hdLAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0uYmxvY2tTd2l0Y2hpbmdDb250cm9sLm5vT2ZHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICBwc3lEYXRhW2NoXS5ibG9ja1N3aXRjaGluZ0NvbnRyb2wuZ3JvdXBMZW4sCisgICAgICAgICAgICAgICAgICAgICAmcHN5T3V0Q2hhbm5lbFtjaF0pOworICB9CisKKyAgcmV0dXJuKDApOyAvKiBubyBlcnJvciAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogYWR2YW5jZVBzeWNoTG9uZworKiBkZXNjcmlwdGlvbjogIHBzeWNob2Fjb3VzdGljIGZvciBsb25nIGJsb2NrcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBXb3JkMTYgYWR2YW5jZVBzeWNoTG9uZyhQU1lfREFUQSogcHN5RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMKiBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcFNjcmF0Y2hUbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEqIHRuc0RhdGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBjaCkKK3sKKyAgV29yZDMyIGk7CisgIFdvcmQzMiBub3JtRW5lcmd5U2hpZnQgPSAocHN5RGF0YS0+bWRjdFNjYWxlICsgMSkgPDwgMTsgLyogaW4gcmVmZXJlbmNlIGNvZGUsIG1kY3Qgc3BlY3RydW0gbXVzdCBiZSBtdWx0aXBpZWQgd2l0aCAyLCBzbyArMSAqLworICBXb3JkMzIgY2xpcEVuZXJneSA9IGhQc3lDb25mTG9uZy0+Y2xpcEVuZXJneSA+PiBub3JtRW5lcmd5U2hpZnQ7DQorICBXb3JkMzIgKmRhdGEwLCAqZGF0YTEsIHRkYXRhOworCisgIC8qIGxvdyBwYXNzICovCisgIGRhdGEwID0gcHN5RGF0YS0+bWRjdFNwZWN0cnVtICsgaFBzeUNvbmZMb25nLT5sb3dwYXNzTGluZTsNCisgIGZvcihpPWhQc3lDb25mTG9uZy0+bG93cGFzc0xpbmU7IGk8RlJBTUVfTEVOX0xPTkc7IGkrKykgeworICAgICpkYXRhMCsrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgLyogQ2FsYyBzZmItYmFuZHdpc2UgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCAqLworICBDYWxjQmFuZEVuZXJneSggcHN5RGF0YS0+bWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nKTsKKworICAvKgorICAgIFROUyBkZXRlY3QKKyAgKi8KKyAgVG5zRGV0ZWN0KHRuc0RhdGEsCisgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYsCisgICAgICAgICAgICBwU2NyYXRjaFRucywKKyAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKWhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0LAorICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSwKKyAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nKTsKKworICAvKiAgVG5zU3luYyAqLyAgIAorICBpZiAoY2ggPT0gMSkgeworICAgIFRuc1N5bmModG5zRGF0YSwKKyAgICAgICAgICAgIHRuc0RhdGEyLAorICAgICAgICAgICAgaFBzeUNvbmZMb25nLT50bnNDb25mLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7CisgIH0KKworICAvKiAgVG5zIEVuY29kZXIgKi8gCisgIFRuc0VuY29kZSgmcHN5T3V0Q2hhbm5lbC0+dG5zSW5mbywKKyAgICAgICAgICAgIHRuc0RhdGEsCisgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+dG5zQ29uZiwKKyAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+bG93cGFzc0xpbmUsCisgICAgICAgICAgICBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgcHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlKTsKKworICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbiAqLworICBkYXRhMCA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nOw0KKyAgZGF0YTEgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZzsNCisgIGZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7CisgICAgdGRhdGEgPSBMX21weV9scygqZGF0YTArKywgaFBzeUNvbmZMb25nLT5yYXRpbyk7CisgICAgKmRhdGExKysgPSBtaW4odGRhdGEsIGNsaXBFbmVyZ3kpOw0KKyAgfQorCisgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8gICAKKyAgaWYgKHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlIT0wKSB7CisgICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mTG9uZy0+dG5zQ29uZi50bnNTdGFydEJhbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+c2ZiT2Zmc2V0K3Ruc1N0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nK3Ruc1N0YXJ0QmFuZCwKKyAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJMb25nKTsKKyAgICANCisJZGF0YTAgPSBwc3lEYXRhLT5zZmJFbmVyZ3kuc2ZiTG9uZzsNCisJdGRhdGEgPSBwc3lEYXRhLT5zZmJFbmVyZ3lTdW0uc2ZiTG9uZzsNCisJZm9yIChpPTA7IGk8dG5zU3RhcnRCYW5kOyBpKyspCisgICAgICB0ZGF0YSArPSAqZGF0YTArKzsNCisNCisJcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYkxvbmcgPSB0ZGF0YTsKKyAgfQorCisKKyAgLyogc3ByZWFkaW5nIGVuZXJneSAqLworICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZMb25nLT5zZmJDbnQsCisgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmcpOworCisgIC8qIHRocmVzaG9sZCBpbiBxdWlldCAqLworICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJMb25nOw0KKyAgZGF0YTEgPSBoUHN5Q29uZkxvbmctPnNmYlRocmVzaG9sZFF1aWV0Ow0KKyAgZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pCisgIHsNCisJICAqZGF0YTAgPSBtYXgoKmRhdGEwLCAoKmRhdGExID4+IG5vcm1FbmVyZ3lTaGlmdCkpOw0KKwkgIGRhdGEwKys7IGRhdGExKys7DQorICB9CisKKyAgLyogcHJlZWNobyBjb250cm9sICovICAgCisgIGlmIChwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UgPT0gU1RPUF9XSU5ET1cpIHsKKyAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZG5tMTsNCisJZm9yIChpPWhQc3lDb25mTG9uZy0+c2ZiQ250OyBpOyBpLS0pIHsNCisgICAgICAqZGF0YTArKyA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgfQ0KKyAgICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIFByZUVjaG9Db250cm9sKCBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTEsCisgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgIGhQc3lDb25mTG9uZy0+bWF4QWxsb3dlZEluY3JlYXNlRmFjdG9yLAorICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5taW5SZW1haW5pbmdUaHJlc2hvbGRGYWN0b3IsCisgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiTG9uZywKKyAgICAgICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSk7CisgIHBzeURhdGEtPm1kY3RTY2FsZW5tMSA9IHBzeURhdGEtPm1kY3RTY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIAorICBpZiAocHN5RGF0YS0+YmxvY2tTd2l0Y2hpbmdDb250cm9sLndpbmRvd1NlcXVlbmNlPT0gU1RBUlRfV0lORE9XKSB7CisgICAgZGF0YTAgPSBwc3lEYXRhLT5zZmJUaHJlc2hvbGRubTE7DQorCWZvciAoaT1oUHN5Q29uZkxvbmctPnNmYkNudDsgaTsgaS0tKSB7CisgICAgICAqZGF0YTArKyA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgcHN5RGF0YS0+bWRjdFNjYWxlbm0xID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICAvKiBhcHBseSB0bnMgbXVsdCB0YWJsZSBvbiBjYiB0aHJlc2hvbGRzICovCisgIEFwcGx5VG5zTXVsdFRhYmxlVG9SYXRpb3MoaFBzeUNvbmZMb25nLT50bnNDb25mLnRuc1JhdGlvUGF0Y2hMb3dlc3RDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnRuc0NvbmYudG5zU3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYkxvbmcpOworCisKKyAgLyogc3ByZWFkZWQgZW5lcmd5ICovCisgIGRhdGEwID0gcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZzsNCisgIGRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYkxvbmc7DQorICBmb3IgKGk9aFBzeUNvbmZMb25nLT5zZmJDbnQ7IGk7IGktLSkgeworICAgIC8vcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiTG9uZ1tpXSA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJMb25nW2ldOyAgICAgICANCisJICAqZGF0YTArKyA9ICpkYXRhMSsrOworICB9CisKKyAgLyogc3ByZWFkaW5nIGVuZXJneSAqLworICBTcHJlYWRpbmdNYXgoaFBzeUNvbmZMb25nLT5zZmJDbnQsCisgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwgCisgICAgICAgICAgICAgICBoUHN5Q29uZkxvbmctPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJTcHJlYWRlZEVuZXJneS5zZmJMb25nKTsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaExvbmdNUworKiBkZXNjcmlwdGlvbjogICB1cGRhdGUgbWRjdC1lbmVyZ2llcyBmb3IgbGVmdCBhZGQgb3IgbWludXMgcmlnaHQgY2hhbm5lbCAKKyoJCQkJZm9yIGxvbmcgYmxvY2sKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBhZHZhbmNlUHN5Y2hMb25nTVMgKFBTWV9EQVRBIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQU1lfQ09ORklHVVJBVElPTl9MT05HICpoUHN5Q29uZkxvbmcpCit7CisgIENhbGNCYW5kRW5lcmd5TVMocHN5RGF0YVswXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5tZGN0U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZMb25nLT5zZmJBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgcHN5RGF0YVswXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzBdLnNmYkVuZXJneVN1bU1TLnNmYkxvbmcsCisgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5zZmJFbmVyZ3lNUy5zZmJMb25nLAorICAgICAgICAgICAgICAgICAgICZwc3lEYXRhWzFdLnNmYkVuZXJneVN1bU1TLnNmYkxvbmcpOworCisgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBhZHZhbmNlUHN5Y2hTaG9ydAorKiBkZXNjcmlwdGlvbjogIHBzeWNob2Fjb3VzdGljIGZvciBzaG9ydCBibG9ja3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaFNob3J0KFBTWV9EQVRBKiBwc3lEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfREFUQSogdG5zRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCogcHN5T3V0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwU2NyYXRjaFRucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE5TX0RBVEEgKnRuc0RhdGEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgY2gpCit7CisgIFdvcmQzMiB3OworICBXb3JkMzIgbm9ybUVuZXJneVNoaWZ0ID0gKHBzeURhdGEtPm1kY3RTY2FsZSArIDEpIDw8IDE7IC8qIGluIHJlZmVyZW5jZSBjb2RlLCBtZGN0IHNwZWN0cnVtIG11c3QgYmUgbXVsdGlwaWVkIHdpdGggMiwgc28gKzEgKi8KKyAgV29yZDMyIGNsaXBFbmVyZ3kgPSBoUHN5Q29uZlNob3J0LT5jbGlwRW5lcmd5ID4+IG5vcm1FbmVyZ3lTaGlmdDsKKyAgV29yZDMyIHdPZmZzZXQgPSAwOyAgICAgDQorICBXb3JkMzIgKmRhdGEwLCAqZGF0YTE7CisKKyAgZm9yKHcgPSAwOyB3IDwgVFJBTlNfRkFDOyB3KyspIHsKKyAgICBXb3JkMzIgaSwgdGRhdGE7CisKKyAgICAvKiBsb3cgcGFzcyAqLworICAgIGRhdGEwID0gcHN5RGF0YS0+bWRjdFNwZWN0cnVtICsgd09mZnNldCArIGhQc3lDb25mU2hvcnQtPmxvd3Bhc3NMaW5lOw0KKwlmb3IoaT1oUHN5Q29uZlNob3J0LT5sb3dwYXNzTGluZTsgaTxGUkFNRV9MRU5fU0hPUlQ7IGkrKyl7CisgICAgICAqZGF0YTArKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICAvKiBDYWxjIHNmYi1iYW5kd2lzZSBtZGN0LWVuZXJnaWVzIGZvciBsZWZ0IGFuZCByaWdodCBjaGFubmVsICovCisgICAgQ2FsY0JhbmRFbmVyZ3koIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddLAorICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YS0+c2ZiRW5lcmd5U3VtLnNmYlNob3J0W3ddKTsKKyAgICAvKgorICAgICAgIFROUworICAgICovCisgICAgVG5zRGV0ZWN0KHRuc0RhdGEsCisgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnRuc0NvbmYsCisgICAgICAgICAgICAgIHBTY3JhdGNoVG5zLAorICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KiloUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQsCisgICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XSk7CisKKyAgICAvKiAgVG5zU3luYyAqLworICAgIGlmIChjaCA9PSAxKSB7CisgICAgICBUbnNTeW5jKHRuc0RhdGEsCisgICAgICAgICAgICAgIHRuc0RhdGEyLAorICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLAorICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICBwc3lEYXRhLT5ibG9ja1N3aXRjaGluZ0NvbnRyb2wud2luZG93U2VxdWVuY2UpOworICAgIH0KKworICAgIFRuc0VuY29kZSgmcHN5T3V0Q2hhbm5lbC0+dG5zSW5mbywKKyAgICAgICAgICAgICAgdG5zRGF0YSwKKyAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+c2ZiQ250LAorICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT50bnNDb25mLAorICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5sb3dwYXNzTGluZSwKKyAgICAgICAgICAgICAgcHN5RGF0YS0+bWRjdFNwZWN0cnVtK3dPZmZzZXQsCisgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgIHBzeURhdGEtPmJsb2NrU3dpdGNoaW5nQ29udHJvbC53aW5kb3dTZXF1ZW5jZSk7CisKKyAgICAvKiBmaXJzdCBwYXJ0IG9mIHRocmVzaG9sZCBjYWxjdWxhdGlvbiAqLworICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddOw0KKwlkYXRhMSA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XTsNCisJZm9yIChpPWhQc3lDb25mU2hvcnQtPnNmYkNudDsgaTsgaS0tKSB7CisgICAgICB0ZGF0YSA9IExfbXB5X2xzKCpkYXRhMSsrLCBoUHN5Q29uZlNob3J0LT5yYXRpbyk7CisgICAgICAqZGF0YTArKyA9IG1pbih0ZGF0YSwgY2xpcEVuZXJneSk7DQorICAgIH0KKworICAgIC8qIENhbGMgc2ZiLWJhbmR3aXNlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgYWdhaW4gKi8gICAgIAorICAgIGlmICh0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmUgIT0gMCkgeworICAgICAgV29yZDE2IHRuc1N0YXJ0QmFuZCA9IGhQc3lDb25mU2hvcnQtPnRuc0NvbmYudG5zU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIENhbGNCYW5kRW5lcmd5KCBwc3lEYXRhLT5tZGN0U3BlY3RydW0rd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJPZmZzZXQrdG5zU3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgIChoUHN5Q29uZlNob3J0LT5zZmJBY3RpdmUgLSB0bnNTdGFydEJhbmQpLAorICAgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XSt0bnNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgJnBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJTaG9ydFt3XSk7DQorCisgICAgICB0ZGF0YSA9IHBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJTaG9ydFt3XTsNCisJICBkYXRhMCA9IHBzeURhdGEtPnNmYkVuZXJneS5zZmJTaG9ydFt3XTsNCisJICBmb3IgKGk9dG5zU3RhcnRCYW5kOyBpOyBpLS0pCisgICAgICAgIHRkYXRhICs9ICpkYXRhMCsrOw0KKw0KKwkgIHBzeURhdGEtPnNmYkVuZXJneVN1bS5zZmJTaG9ydFt3XSA9IHRkYXRhOworICAgIH0KKworICAgIC8qIHNwcmVhZGluZyAqLworICAgIFNwcmVhZGluZ01heChoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tMb3dGYWN0b3IsCisgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tIaWdoRmFjdG9yLAorICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd10pOworCisKKyAgICAvKiB0aHJlc2hvbGQgaW4gcXVpZXQgKi8KKyAgICBkYXRhMCA9IHBzeURhdGEtPnNmYlRocmVzaG9sZC5zZmJTaG9ydFt3XTsNCisJZGF0YTEgPSBoUHN5Q29uZlNob3J0LT5zZmJUaHJlc2hvbGRRdWlldDsNCisJZm9yIChpPWhQc3lDb25mU2hvcnQtPnNmYkNudDsgaTsgaS0tKQorICAgIHsNCisJCSpkYXRhMCA9IG1heCgqZGF0YTAsICgqZGF0YTEgPj4gbm9ybUVuZXJneVNoaWZ0KSk7DQorDQorCQlkYXRhMCsrOyBkYXRhMSsrOw0KKwl9DQorCisKKyAgICAvKiBwcmVlY2hvICovICAgICAKKyAgICBQcmVFY2hvQ29udHJvbCggcHN5RGF0YS0+c2ZiVGhyZXNob2xkbm0xLAorICAgICAgICAgICAgICAgICAgICBoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPm1heEFsbG93ZWRJbmNyZWFzZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+bWluUmVtYWluaW5nVGhyZXNob2xkRmFjdG9yLAorICAgICAgICAgICAgICAgICAgICBwc3lEYXRhLT5zZmJUaHJlc2hvbGQuc2ZiU2hvcnRbd10sCisgICAgICAgICAgICAgICAgICAgIHBzeURhdGEtPm1kY3RTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgdz09MCA/IHBzeURhdGEtPm1kY3RTY2FsZW5tMSA6IHBzeURhdGEtPm1kY3RTY2FsZSk7CisKKyAgICAvKiBhcHBseSB0bnMgbXVsdCB0YWJsZSBvbiBjYiB0aHJlc2hvbGRzICovCisgICAgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyggaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNSYXRpb1BhdGNoTG93ZXN0Q2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBzeUNvbmZTaG9ydC0+dG5zQ29uZi50bnNTdGFydEJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bd10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YS0+c2ZiVGhyZXNob2xkLnNmYlNob3J0W3ddKTsKKworICAgIC8qIHNwcmVhZGVkIGVuZXJneSAqLworICAgIGRhdGEwID0gcHN5RGF0YS0+c2ZiU3ByZWFkZWRFbmVyZ3kuc2ZiU2hvcnRbd107DQorCWRhdGExID0gcHN5RGF0YS0+c2ZiRW5lcmd5LnNmYlNob3J0W3ddOw0KKwlmb3IgKGk9aFBzeUNvbmZTaG9ydC0+c2ZiQ250OyBpOyBpLS0pIHsKKwkgICpkYXRhMCsrID0gKmRhdGExKys7CisgICAgfQorICAgIFNwcmVhZGluZ01heChoUHN5Q29uZlNob3J0LT5zZmJDbnQsCisgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tMb3dGYWN0b3JTcHJFbiwgCisgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk1hc2tIaWdoRmFjdG9yU3ByRW4sCisgICAgICAgICAgICAgICAgIHBzeURhdGEtPnNmYlNwcmVhZGVkRW5lcmd5LnNmYlNob3J0W3ddKTsKKworICAgIHdPZmZzZXQgKz0gRlJBTUVfTEVOX1NIT1JUOworICB9IC8qIGZvciBUUkFOU19GQUMgKi8KKworICBwc3lEYXRhLT5tZGN0U2NhbGVubTEgPSBwc3lEYXRhLT5tZGN0U2NhbGU7ICAgICAgICAgICAgICAKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGFkdmFuY2VQc3ljaFNob3J0TVMKKyogZGVzY3JpcHRpb246ICAgdXBkYXRlIG1kY3QtZW5lcmdpZXMgZm9yIGxlZnQgYWRkIG9yIG1pbnVzIHJpZ2h0IGNoYW5uZWwgCisqCQkJCWZvciBzaG9ydCBibG9jaworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGFkdmFuY2VQc3ljaFNob3J0TVMgKFBTWV9EQVRBIHBzeURhdGFbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKmhQc3lDb25mU2hvcnQpCit7CisgIFdvcmQzMiB3LCB3T2Zmc2V0OworICB3T2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3Iodz0wOyB3PFRSQU5TX0ZBQzsgdysrKSB7CisgICAgQ2FsY0JhbmRFbmVyZ3lNUyhwc3lEYXRhWzBdLm1kY3RTcGVjdHJ1bSt3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVsxXS5tZGN0U3BlY3RydW0rd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIGhQc3lDb25mU2hvcnQtPnNmYkFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMF0uc2ZiRW5lcmd5TVMuc2ZiU2hvcnRbd10sCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVswXS5zZmJFbmVyZ3lTdW1NUy5zZmJTaG9ydFt3XSwKKyAgICAgICAgICAgICAgICAgICAgIHBzeURhdGFbMV0uc2ZiRW5lcmd5TVMuc2ZiU2hvcnRbd10sCisgICAgICAgICAgICAgICAgICAgICAmcHN5RGF0YVsxXS5zZmJFbmVyZ3lTdW1NUy5zZmJTaG9ydFt3XSk7CisgICAgd09mZnNldCArPSBGUkFNRV9MRU5fU0hPUlQ7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3FjX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTY4MDIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcWNfbWFpbi5jCkBAIC0wLDAgKzEsNTgwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlxY19tYWluLmMNCisNCisJQ29udGVudDoJUXVhbnRpemluZyAmIGNvZGluZyBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAicWNfbWFpbi5oIgorI2luY2x1ZGUgInF1YW50aXplLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYWRqX3Roci5oIgorI2luY2x1ZGUgInNmX2VzdGltLmgiCisjaW5jbHVkZSAic3RhdF9iaXRzLmgiCisjaW5jbHVkZSAiYml0X2NudC5oIgorI2luY2x1ZGUgImR5bl9iaXRzLmgiCisjaW5jbHVkZSAiY2hhbm5lbF9tYXAuaCIKKyNpbmNsdWRlICJtZW1hbGlnbi5oIgorCisKK3R5cGVkZWYgZW51bXsKKyAgRlJBTUVfTEVOX0JZVEVTX01PRFVMTyA9ICAxLAorICBGUkFNRV9MRU5fQllURVNfSU5UICAgID0gIDIKK31GUkFNRV9MRU5fUkVTVUxUX01PREU7CisKK3N0YXRpYyBjb25zdCBXb3JkMTYgbWF4RmlsbEVsZW1CaXRzID0gNyArIDI3MCo4OworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdGF0aWMgV29yZDE2IGNhbGNNYXhWYWx1ZUluU2ZiKFdvcmQxNiBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiT2Zmc2V0W01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBxdWFudFNwZWN0cnVtW0ZSQU1FX0xFTl9MT05HXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiBtYXhWYWx1ZVtNQVhfR1JPVVBFRF9TRkJdKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY2FsY0ZyYW1lTGVuCisqIGRlc2NyaXB0aW9uOiBlc3RpbWF0ZSB0aGUgZnJhbWUgbGVuZ3RoIGFjY29yZGluZyB0aGUgYml0cmF0ZXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBjYWxjRnJhbWVMZW4oV29yZDMyIGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9SRVNVTFRfTU9ERSBtb2RlKQoreworCisgIFdvcmQzMiByZXN1bHQ7CisgIFdvcmQzMiBxdW90OworCisgIHJlc3VsdCA9IChGUkFNRV9MRU5fTE9ORyA+PiAzKSAqIGJpdFJhdGU7CisgIHF1b3QgPSByZXN1bHQgLyBzYW1wbGVSYXRlOworCisgICAKKyAgaWYgKG1vZGUgPT0gRlJBTUVfTEVOX0JZVEVTX01PRFVMTykgeworICAgIHJlc3VsdCAtPSBxdW90ICogc2FtcGxlUmF0ZTsKKyAgfQorICBlbHNlIHsgLyogRlJBTUVfTEVOX0JZVEVTX0lOVCAqLworICAgIHJlc3VsdCA9IHF1b3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgZnVuY3Rpb24gbmFtZTpmcmFtZVBhZGRpbmcKKyogIGRlc2NyaXB0aW9uOiBDYWxjdWxhdGVzIGlmIHBhZGRpbmcgaXMgbmVlZGVkIGZvciBhY3R1YWwgZnJhbWUKKyogIHJldHVybnM6IHBhZGRpbmdPbiBvciBub3QgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgZnJhbWVQYWRkaW5nKFdvcmQzMiBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnBhZGRpbmdSZXN0KQoreworICBXb3JkMTYgcGFkZGluZ09uOworICBXb3JkMTYgZGlmZmVyZW5jZTsKKworICBwYWRkaW5nT24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBkaWZmZXJlbmNlID0gY2FsY0ZyYW1lTGVuKCBiaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5fQllURVNfTU9EVUxPICk7CisgICpwYWRkaW5nUmVzdCA9ICpwYWRkaW5nUmVzdCAtIGRpZmZlcmVuY2U7CisKKyAgIAorICBpZiAoKnBhZGRpbmdSZXN0IDw9IDAgKSB7CisgICAgcGFkZGluZ09uID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICpwYWRkaW5nUmVzdCA9ICpwYWRkaW5nUmVzdCArIHNhbXBsZVJhdGU7CisgIH0KKworICByZXR1cm4gcGFkZGluZ09uOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUUNPdXROZXcKKyogZGVzY3JpcHRpb246IGluaXQgcWNvdXQgcGFyYW1ldGVyCisqIHJldHVybnM6ICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1dvcmQxNiBRQ091dE5ldyhRQ19PVVQgKmhRQywgV29yZDE2IG5DaGFubmVscywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgIFdvcmQzMiBpOw0KKyAgV29yZDE2ICpxdWFudFNwZWM7DQorICBXb3JkMTYgKnNjZjsNCisgIFVXb3JkMTYgKm1heFZhbHVlSW5TZmI7CQorCQ0KKyAgcXVhbnRTcGVjID0gKFdvcmQxNiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbm5lbHMgKiBGUkFNRV9MRU5fTE9ORyAqIHNpemVvZihXb3JkMTYpLCAzMiwgVk9fSU5ERVhfRU5DX0FBQyk7DQorICBpZihOVUxMID09IHF1YW50U3BlYykNCisJICByZXR1cm4gMTsKKyAgc2NmID0gKFdvcmQxNiAqKW1lbV9tYWxsb2MocE1lbU9QLCBuQ2hhbm5lbHMgKiBNQVhfR1JPVVBFRF9TRkIgKiBzaXplb2YoV29yZDE2KSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOyAgICAgDQorICBpZihOVUxMID09IHNjZikNCisgIHsNCisJICByZXR1cm4gMTsNCisgIH0KKyAgbWF4VmFsdWVJblNmYiA9IChVV29yZDE2ICopbWVtX21hbGxvYyhwTWVtT1AsIG5DaGFubmVscyAqIE1BWF9HUk9VUEVEX1NGQiAqIHNpemVvZihVV29yZDE2KSwgMzIsIFZPX0lOREVYX0VOQ19BQUMpOw0KKyAgaWYoTlVMTCA9PSBtYXhWYWx1ZUluU2ZiKQ0KKyAgew0KKwkgIHJldHVybiAxOw0KKyAgfQ0KKw0KKyAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKKyAgICBoUUMtPnFjQ2hhbm5lbFtpXS5xdWFudFNwZWMgPSBxdWFudFNwZWMgKyBpKkZSQU1FX0xFTl9MT05HOworICAgIAorICAgIGhRQy0+cWNDaGFubmVsW2ldLm1heFZhbHVlSW5TZmIgPSBtYXhWYWx1ZUluU2ZiICsgaSpNQVhfR1JPVVBFRF9TRkI7CisgICAgCisgICAgaFFDLT5xY0NoYW5uZWxbaV0uc2NmID0gc2NmICsgaSpNQVhfR1JPVVBFRF9TRkI7CisgIH0KKyAKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBRQ091dERlbGV0ZQorKiBkZXNjcmlwdGlvbjogdW5pbnQgcWNvdXQgcGFyYW1ldGVyCisqIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBRQ091dERlbGV0ZShRQ19PVVQqIGhRQywgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApCit7CisgICBXb3JkMzIgaTsNCisgICBpZihoUUMpDQorICAgew0KKyAgICAgIGlmKGhRQy0+cWNDaGFubmVsWzBdLnF1YW50U3BlYyk7DQorCQkgbWVtX2ZyZWUocE1lbU9QLCBoUUMtPnFjQ2hhbm5lbFswXS5xdWFudFNwZWMsIFZPX0lOREVYX0VOQ19BQUMpOw0KKyAgICANCisgICAgICBpZihoUUMtPnFjQ2hhbm5lbFswXS5tYXhWYWx1ZUluU2ZiKQ0KKwkJICBtZW1fZnJlZShwTWVtT1AsIGhRQy0+cWNDaGFubmVsWzBdLm1heFZhbHVlSW5TZmIsIFZPX0lOREVYX0VOQ19BQUMpOw0KKyAgICANCisJICBpZihoUUMtPnFjQ2hhbm5lbFswXS5zY2YpDQorCQkgIG1lbV9mcmVlKHBNZW1PUCwgaFFDLT5xY0NoYW5uZWxbMF0uc2NmLCBWT19JTkRFWF9FTkNfQUFDKTsNCisNCisJICBmb3IgKGk9MDsgaTxNQVhfQ0hBTk5FTFM7IGkrKykgew0KKwkJICBoUUMtPnFjQ2hhbm5lbFtpXS5xdWFudFNwZWMgPSBOVUxMOw0KKwkJICANCisJCSAgaFFDLT5xY0NoYW5uZWxbaV0ubWF4VmFsdWVJblNmYiA9IE5VTEw7DQorCQkgIA0KKwkJICBoUUMtPnFjQ2hhbm5lbFtpXS5zY2YgPSBOVUxMOw0KKwkgIH0NCisgICB9IAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFFDTmV3CisqIGRlc2NyaXB0aW9uOiBzZXQgUUMgdG8gemVybworKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFFDTmV3KFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQoreworICBwTWVtT1AtPlNldChWT19JTkRFWF9FTkNfQUFDLCBoUUMsMCxzaXplb2YoUUNfU1RBVEUpKTsKKworICByZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFFDRGVsZXRlCisqIGRlc2NyaXB0aW9uOiB1bmludCBxY291dCBwYXJhbWV0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFFDRGVsZXRlKFFDX1NUQVRFICpoUUMsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQoreworIAorICAvKiAKKyAgICAgbm90aGluZyB0byBkbworICAqLworICBoUUM9TlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBRQ0luaXQKKyogZGVzY3JpcHRpb246IGluaXQgUUQgcGFyYW1ldGVyCisqIHJldHVybnM6ICAgICAwIGlmIHN1Y2Nlc3MKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitXb3JkMTYgUUNJbml0KFFDX1NUQVRFICpoUUMsCisgICAgICAgICAgICAgIHN0cnVjdCBRQ19JTklUICppbml0KQoreworICBoUUMtPm5DaGFubmVscyAgICAgICA9IGluaXQtPmVsSW5mby0+bkNoYW5uZWxzSW5FbDsgICAgICAgICAgICAgIAorICBoUUMtPm1heEJpdHNUb3QgICAgICA9IGluaXQtPm1heEJpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBoUUMtPmJpdFJlc1RvdCAgICAgICA9IHN1Yihpbml0LT5iaXRSZXMsIGluaXQtPmF2ZXJhZ2VCaXRzKTsKKyAgaFFDLT5hdmVyYWdlQml0c1RvdCAgPSBpbml0LT5hdmVyYWdlQml0czsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaFFDLT5tYXhCaXRGYWMgICAgICAgPSBpbml0LT5tYXhCaXRGYWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBoUUMtPnBhZGRpbmcucGFkZGluZ1Jlc3QgPSBpbml0LT5wYWRkaW5nLnBhZGRpbmdSZXN0OyAgICAgICAgICAgIAorCisgIGhRQy0+Z2xvYlN0YXRCaXRzICAgID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBJRF9FTkQgKi8gCisKKyAgLyogY2hhbm5lbCBlbGVtZW50cyBpbml0ICovCisgIEluaXRFbGVtZW50Qml0cygmaFFDLT5lbGVtZW50Qml0cywKKyAgICAgICAgICAgICAgICAgICppbml0LT5lbEluZm8sCisgICAgICAgICAgICAgICAgICBpbml0LT5iaXRyYXRlLAorICAgICAgICAgICAgICAgICAgaW5pdC0+YXZlcmFnZUJpdHMsCisgICAgICAgICAgICAgICAgICBoUUMtPmdsb2JTdGF0Qml0cyk7CisKKyAgLyogdGhyZXNob2xkIHBhcmFtZXRlciBpbml0ICovCisgIEFkalRockluaXQoJmhRQy0+YWRqVGhyLAorICAgICAgICAgICAgIGluaXQtPm1lYW5QZSwKKyAgICAgICAgICAgICBoUUMtPmVsZW1lbnRCaXRzLmNoQml0cmF0ZSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAKKyogZnVuY3Rpb24gbmFtZTogUUNNYWluCisqIGRlc2NyaXB0aW9uOiAgcXVhbnRpemF0aW9uIGFuZCBjb2RpbmcgdGhlIHNwZWN0cnVtCisqIHJldHVybnM6ICAgICAgMCBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IFFDTWFpbihRQ19TVEFURSogaFFDLCAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIEVMRU1FTlRfQklUUyogZWxCaXRzLAorICAgICAgICAgICAgICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtZW50LAorICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgIC8qIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZSAqLworICAgICAgICAgICAgICBQU1lfT1VUX0VMRU1FTlQqIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICBxY091dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwgICAgLyogb3V0ICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIFFDX09VVF9FTEVNRU5UKiBxY091dEVsZW1lbnQsCisgICAgICAgICAgICAgIFdvcmQxNiBuQ2hhbm5lbHMsCisJCQkgIFdvcmQxNiBhbmNpbGxhcnlEYXRhQnl0ZXMpICAgICAgCit7CisgIFdvcmQxNiBtYXhDaER5bkJpdHNbTUFYX0NIQU5ORUxTXTsKKyAgV29yZDE2IGNoQml0RGlzdHJpYnV0aW9uW01BWF9DSEFOTkVMU107ICAKKyAgV29yZDMyIGNoOworICAgCisgIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAgCisgIGlmIChlbEJpdHMtPmJpdFJlc0xldmVsID4gZWxCaXRzLT5tYXhCaXRSZXNCaXRzKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCA9IGNvdW50U3RhdGljQml0ZGVtYW5kKHBzeU91dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCANCisJCQkJCQkJCQkJCQkJICBxY091dEVsZW1lbnQtPmFkdHNVc2VkKTsKKworICAgCisgIGlmIChhbmNpbGxhcnlEYXRhQnl0ZXMpIHsKKyAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gNyArIChhbmNpbGxhcnlEYXRhQnl0ZXMgPDwgMyk7CisgICAgIAorICAgIGlmIChhbmNpbGxhcnlEYXRhQnl0ZXMgPj0gMTUpCisgICAgICBxY091dEVsZW1lbnQtPmFuY0JpdHNVc2VkID0gcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCArIDg7CisgIH0KKyAgZWxzZSB7CisgICAgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCA9IDA7IAorICB9CisKKyAgQ2FsY0Zvcm1GYWN0b3IoaFFDLT5sb2dTZmJGb3JtRmFjdG9yLCBoUUMtPnNmYk5SZWxldmFudExpbmVzLCBoUUMtPmxvZ1NmYkVuZXJneSwgcHN5T3V0Q2hhbm5lbCwgbkNoYW5uZWxzKTsKKworICAvKmFkanVzdCB0aHJlc2hvbGRzIGZvciB0aGUgZGVzaXJlZCBiaXRyYXRlICovCisgIEFkanVzdFRocmVzaG9sZHMoJmhRQy0+YWRqVGhyLAorICAgICAgICAgICAgICAgICAgIGFkalRoclN0YXRlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgIHBzeU91dEVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY2hCaXREaXN0cmlidXRpb24sCisgICAgICAgICAgICAgICAgICAgaFFDLT5sb2dTZmJFbmVyZ3ksCisgICAgICAgICAgICAgICAgICAgaFFDLT5zZmJOUmVsZXZhbnRMaW5lcywgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgcWNPdXRFbGVtZW50LAorCQkJCSAgIGVsQml0cywKKwkJCQkgICBuQ2hhbm5lbHMsCisJCQkJICAgaFFDLT5tYXhCaXRGYWMpOworCisgIC8qZXN0aW1hdGUgc2NhbGUgZmFjdG9ycyAqLworICBFc3RpbWF0ZVNjYWxlRmFjdG9ycyhwc3lPdXRDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+bG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmxvZ1NmYkZvcm1GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGhRQy0+c2ZiTlJlbGV2YW50TGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscyk7CisKKyAgLyogY29uZGl0aW9uIHRvIHByZXZlbnQgZW1wdHkgYml0cmVzZXJ2b2lyICovCisgIGZvciAoY2ggPSAwOyBjaCA8IG5DaGFubmVsczsgY2grKykgeworICAgIFdvcmQzMiBtYXhEeW5CaXRzOworICAgIG1heER5bkJpdHMgPSBlbEJpdHMtPmF2ZXJhZ2VCaXRzICsgZWxCaXRzLT5iaXRSZXNMZXZlbCAtIDc7IC8qIC03IGJlYy4gb2YgYWxpZ24gYml0cyAqLworICAgIG1heER5bkJpdHMgPSBtYXhEeW5CaXRzIC0gcWNPdXRFbGVtZW50LT5zdGF0aWNCaXRzVXNlZCArIHFjT3V0RWxlbWVudC0+YW5jQml0c1VzZWQ7CisgICAgbWF4Q2hEeW5CaXRzW2NoXSA9IGV4dHJhY3RfbChjaEJpdERpc3RyaWJ1dGlvbltjaF0gKiBtYXhEeW5CaXRzIC8gMTAwMCk7CisgIH0KKworICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3IgKGNoID0gMDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspIHsKKyAgICBXb3JkMzIgY2hEeW5CaXRzOworICAgIEZsYWcgICBjb25zdHJhaW50c0Z1bGZpbGxlZDsKKyAgICBXb3JkMzIgaXRlcjsKKyAgICBpdGVyID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgZG8geworICAgICAgY29uc3RyYWludHNGdWxmaWxsZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgICAgUXVhbnRpemVTcGVjdHJ1bShwc3lPdXRDaGFubmVsW2NoXS5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ubWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uc2NmLAorICAgICAgICAgICAgICAgICAgICAgICBxY091dENoYW5uZWxbY2hdLnF1YW50U3BlYyk7CisgICAgICAgCisgICAgICBpZiAoY2FsY01heFZhbHVlSW5TZmIocHN5T3V0Q2hhbm5lbFtjaF0uc2ZiQ250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLm1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYk9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5xdWFudFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS5tYXhWYWx1ZUluU2ZiKSA+IE1BWF9RVUFOVCkgeworICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorCisgICAgICBjaER5bkJpdHMgPSBkeW5CaXRDb3VudChxY091dENoYW5uZWxbY2hdLnF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0ubWF4VmFsdWVJblNmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0uc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0ud2luZG93U2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS5tYXhTZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLnNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0uc2ZiT2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLnNlY3Rpb25EYXRhKTsKKyAgICAgICAKKyAgICAgIGlmIChjaER5bkJpdHMgPj0gbWF4Q2hEeW5CaXRzW2NoXSkgeworICAgICAgICBjb25zdHJhaW50c0Z1bGZpbGxlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgICAgIAorICAgICAgaWYgKCFjb25zdHJhaW50c0Z1bGZpbGxlZCkgeworICAgICAgICBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gPSBxY091dENoYW5uZWxbY2hdLmdsb2JhbEdhaW4gKyAxOworICAgICAgfQorCisgICAgICBpdGVyID0gaXRlciArIDE7CisgICAgICAgCisgICAgfSB3aGlsZSghY29uc3RyYWludHNGdWxmaWxsZWQpOworCisgICAgcWNPdXRFbGVtZW50LT5keW5CaXRzVXNlZCA9IHFjT3V0RWxlbWVudC0+ZHluQml0c1VzZWQgKyBjaER5bkJpdHM7CisKKyAgICBxY091dENoYW5uZWxbY2hdLm1kY3RTY2FsZSAgICA9IHBzeU91dENoYW5uZWxbY2hdLm1kY3RTY2FsZTsgICAgICAgICAKKyAgICBxY091dENoYW5uZWxbY2hdLmdyb3VwaW5nTWFzayA9IHBzeU91dENoYW5uZWxbY2hdLmdyb3VwaW5nTWFzazsgICAgICAKKyAgICBxY091dENoYW5uZWxbY2hdLndpbmRvd1NoYXBlICA9IHBzeU91dENoYW5uZWxbY2hdLndpbmRvd1NoYXBlOyAgICAgICAKKyAgfQorCisgIC8qIHNhdmUgZHluQml0c1VzZWQgZm9yIGNvcnJlY3Rpb24gb2YgYml0czJwZSByZWxhdGlvbiAqLworICBBZGpUaHJVcGRhdGUoYWRqVGhyU3RhdGVFbGVtZW50LCBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkKTsKKworICB7CisgICAgV29yZDE2IGJpdFJlc1NwYWNlID0gZWxCaXRzLT5tYXhCaXRSZXNCaXRzIC0gZWxCaXRzLT5iaXRSZXNMZXZlbDsKKyAgICBXb3JkMTYgZGVsdGFCaXRSZXMgPSBlbEJpdHMtPmF2ZXJhZ2VCaXRzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChxY091dEVsZW1lbnQtPnN0YXRpY0JpdHNVc2VkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBxY091dEVsZW1lbnQtPmR5bkJpdHNVc2VkICsgcWNPdXRFbGVtZW50LT5hbmNCaXRzVXNlZCk7CisKKyAgICBxY091dEVsZW1lbnQtPmZpbGxCaXRzID0gbWF4KDAsIChkZWx0YUJpdFJlcyAtIGJpdFJlc1NwYWNlKSk7CisgIH0KKworICByZXR1cm4gMDsgLyogT0sgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNhbGNNYXhWYWx1ZUluU2ZiCisqIGRlc2NyaXB0aW9uOiAgc2VhcmNoIHRoZSBtYXggU3BlY3RydW0gaW4gb25lIHNmYgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgY2FsY01heFZhbHVlSW5TZmIoV29yZDE2IHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzZmJPZmZzZXRbTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHF1YW50U3BlY3RydW1bRlJBTUVfTEVOX0xPTkddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVV29yZDE2IG1heFZhbHVlW01BWF9HUk9VUEVEX1NGQl0pCit7CisgIFdvcmQxNiBzZmJPZmZzLCBzZmI7CisgIFdvcmQxNiBtYXhWYWx1ZUFsbDsKKworICBtYXhWYWx1ZUFsbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkgeworICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgbWF4U2ZiUGVyR3JvdXA7IHNmYisrKSB7CisgICAgICBXb3JkMTYgbGluZTsKKyAgICAgIFdvcmQxNiBtYXhUaGlzU2ZiOworICAgICAgbWF4VGhpc1NmYiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIGZvciAobGluZSA9IHNmYk9mZnNldFtzZmJPZmZzK3NmYl07IGxpbmUgPCBzZmJPZmZzZXRbc2ZiT2ZmcytzZmIrMV07IGxpbmUrKykgeworICAgICAgICBXb3JkMTYgYWJzVmFsOworICAgICAgICBhYnNWYWwgPSBhYnNfcyhxdWFudFNwZWN0cnVtW2xpbmVdKTsKKyAgICAgICAgbWF4VGhpc1NmYiA9IG1heChtYXhUaGlzU2ZiLCBhYnNWYWwpOworICAgICAgfQorCisgICAgICBtYXhWYWx1ZVtzZmJPZmZzK3NmYl0gPSBtYXhUaGlzU2ZiOyAgICAgICAgICAgICAgICAKKyAgICAgIG1heFZhbHVlQWxsID0gbWF4KG1heFZhbHVlQWxsLCBtYXhUaGlzU2ZiKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1heFZhbHVlQWxsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogdXBkYXRlQml0cmVzCisqIGRlc2NyaXB0aW9uOiB1cGRhdGUgYml0cmVzZXJ2b2lyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB1cGRhdGVCaXRyZXMoUUNfU1RBVEUqIHFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgIHFjT3V0KQorICAgICAgICAgICAgICAgICAgCit7CisgIEVMRU1FTlRfQklUUyAqZWxCaXRzOworIAorICBxY0tlcm5lbC0+Yml0UmVzVG90ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZWxCaXRzID0gJnFjS2VybmVsLT5lbGVtZW50Qml0czsKKworICAgCisgIGlmIChlbEJpdHMtPmF2ZXJhZ2VCaXRzID4gMCkgeworICAgIC8qIGNvbnN0YW50IGJpdHJhdGUgKi8KKyAgICBXb3JkMTYgYml0c1VzZWQ7CisgICAgYml0c1VzZWQgPSAocWNPdXQtPnFjRWxlbWVudC5zdGF0aWNCaXRzVXNlZCArIHFjT3V0LT5xY0VsZW1lbnQuZHluQml0c1VzZWQpICsKKyAgICAgICAgICAgICAgICAgICAocWNPdXQtPnFjRWxlbWVudC5hbmNCaXRzVXNlZCArIHFjT3V0LT5xY0VsZW1lbnQuZmlsbEJpdHMpOworICAgIGVsQml0cy0+Yml0UmVzTGV2ZWwgPSBlbEJpdHMtPmJpdFJlc0xldmVsICsgKGVsQml0cy0+YXZlcmFnZUJpdHMgLSBiaXRzVXNlZCk7CisgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IHFjS2VybmVsLT5iaXRSZXNUb3QgKyBlbEJpdHMtPmJpdFJlc0xldmVsOworICB9CisgIGVsc2UgeworICAgIC8qIHZhcmlhYmxlIGJpdHJhdGUgKi8KKyAgICBlbEJpdHMtPmJpdFJlc0xldmVsID0gZWxCaXRzLT5tYXhCaXRzOyAgICAgICAgICAgCisgICAgcWNLZXJuZWwtPmJpdFJlc1RvdCA9IHFjS2VybmVsLT5tYXhCaXRzVG90OyAgICAgIAorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogRmluYWxpemVCaXRDb25zdW1wdGlvbgorKiBkZXNjcmlwdGlvbjogY291bnQgYml0cyB1c2VkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IEZpbmFsaXplQml0Q29uc3VtcHRpb24oUUNfU1RBVEUgKnFjS2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiBxY091dCkKK3sKKyAgV29yZDMyIG5GdWxsRmlsbEVsZW07DQorICBXb3JkMzIgdG90RmlsbEJpdHM7DQorICBXb3JkMTYgZGlmZkJpdHM7ICAKKyAgV29yZDE2IGJpdHNVc2VkOworCisgIHRvdEZpbGxCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBxY091dC0+dG90U3RhdGljQml0c1VzZWQgPSBxY0tlcm5lbC0+Z2xvYlN0YXRCaXRzOyAgICAgCisgIHFjT3V0LT50b3RTdGF0aWNCaXRzVXNlZCArPSBxY091dC0+cWNFbGVtZW50LnN0YXRpY0JpdHNVc2VkOworICBxY091dC0+dG90RHluQml0c1VzZWQgICAgPSBxY091dC0+cWNFbGVtZW50LmR5bkJpdHNVc2VkOworICBxY091dC0+dG90QW5jQml0c1VzZWQgICAgPSBxY091dC0+cWNFbGVtZW50LmFuY0JpdHNVc2VkOworICBxY091dC0+dG90RmlsbEJpdHMgICAgICAgPSBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzOworICAgCisgIGlmIChxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzKSB7CisgICAgdG90RmlsbEJpdHMgKz0gcWNPdXQtPnFjRWxlbWVudC5maWxsQml0czsKKyAgfQorCisgIG5GdWxsRmlsbEVsZW0gPSAobWF4KChxY091dC0+dG90RmlsbEJpdHMgLSAxKSwgMCkgLyBtYXhGaWxsRWxlbUJpdHMpICogbWF4RmlsbEVsZW1CaXRzOw0KKyAgCisgIHFjT3V0LT50b3RGaWxsQml0cyA9IHFjT3V0LT50b3RGaWxsQml0cyAtIG5GdWxsRmlsbEVsZW07CisKKyAgLyogY2hlY2sgZmlsbCBlbGVtZW50cyAqLworICAgCisgIGlmIChxY091dC0+dG90RmlsbEJpdHMgPiAwKSB7CisgICAgLyogbWluaW11bSBGaWxsZWxlbWVudCBjb250YWlucyA3IChUQUcgKyBieXRlIGNudCkgYml0cyAqLworICAgIHFjT3V0LT50b3RGaWxsQml0cyA9IG1heCg3LCBxY091dC0+dG90RmlsbEJpdHMpOworICAgIC8qIGZpbGwgZWxlbWVudCBzaXplIGVxdWFscyBuKjggKyA3ICovCisgICAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzICsgKCg4IC0gKChxY091dC0+dG90RmlsbEJpdHMgLSA3KSAmIDB4MDAwNykpICYgMHgwMDA3KTsgICAgIAorICB9CisKKyAgcWNPdXQtPnRvdEZpbGxCaXRzID0gcWNPdXQtPnRvdEZpbGxCaXRzICsgbkZ1bGxGaWxsRWxlbTsKKworICAvKiBub3cgZGlzdHJpYnV0ZSBleHRyYSBmaWxsYml0cyBhbmQgYWxpZ25iaXRzIG92ZXIgY2hhbm5lbCBlbGVtZW50cyAqLworICBxY091dC0+YWxpZ25CaXRzID0gNyAtICgocWNPdXQtPnRvdER5bkJpdHNVc2VkICsgcWNPdXQtPnRvdFN0YXRpY0JpdHNVc2VkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT50b3RBbmNCaXRzVXNlZCArIHFjT3V0LT50b3RGaWxsQml0cyAtIDEpICYgMHgwMDA3KTsgICAgICAgICAgICAgCisKKyAgICAgCisgIGlmICggKHFjT3V0LT5hbGlnbkJpdHMgKyBxY091dC0+dG90RmlsbEJpdHMgLSB0b3RGaWxsQml0cyA9PSA4KSAmJgorICAgICAgIChxY091dC0+dG90RmlsbEJpdHMgPiA4KSkKKyAgICBxY091dC0+dG90RmlsbEJpdHMgPSBxY091dC0+dG90RmlsbEJpdHMgLSA4OworCisgICAKKyAgZGlmZkJpdHMgPSBxY091dC0+YWxpZ25CaXRzICsgcWNPdXQtPnRvdEZpbGxCaXRzIC0gdG90RmlsbEJpdHM7CisgICAKKyAgaWYoZGlmZkJpdHM+PTApIHsKKyAgICBxY091dC0+cWNFbGVtZW50LmZpbGxCaXRzICs9IGRpZmZCaXRzOworICB9CisKKyAgYml0c1VzZWQgPSBxY091dC0+dG90RHluQml0c1VzZWQgKyBxY091dC0+dG90U3RhdGljQml0c1VzZWQgKyBxY091dC0+dG90QW5jQml0c1VzZWQ7CisgIGJpdHNVc2VkID0gYml0c1VzZWQgKyBxY091dC0+dG90RmlsbEJpdHMgKyBxY091dC0+YWxpZ25CaXRzOworICAgCisgIGlmIChiaXRzVXNlZCA+IHFjS2VybmVsLT5tYXhCaXRzVG90KSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBiaXRzVXNlZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEFkanVzdEJpdHJhdGUKKyogZGVzY3JpcHRpb246ICBhZGp1c3RzIGZyYW1lbGVuZ3RoIHZpYSBwYWRkaW5nIG9uIGEgZnJhbWUgdG8gZnJhbWUgYmFzaXMsCisqICAgICAgICAgICAgICAgdG8gYWNoaWV2ZSBhIGJpdHJhdGUgdGhhdCBkZW1hbmRzIGEgbm9uIGJ5dGUgYWxpZ25lZAorKiAgICAgICAgICAgICAgIGZyYW1lbGVuZ3RoCisqIHJldHVybjogICAgICAgZXJyb3Jjb2RlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDE2IEFkanVzdEJpdHJhdGUoUUNfU1RBVEUgICAgICAgICpoUUMsCisgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgICAgICAgICAgIGJpdFJhdGUsICAgIC8qIHRvdGFsIGJpdHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAgICAgc2FtcGxlUmF0ZSkgLyogb3V0cHV0IHNhbXBsaW5nIHJhdGUgKi8KK3sKKyAgV29yZDE2IHBhZGRpbmdPbjsKKyAgV29yZDE2IGZyYW1lTGVuOworICBXb3JkMTYgY29kZUJpdHM7CisgIFdvcmQxNiBjb2RlQml0c0xhc3Q7CisKKyAgLyogRG8gd2UgbmVlZCBhIGV4dHJhIHBhZGRpbmcgYnl0ZT8gKi8KKyAgcGFkZGluZ09uID0gZnJhbWVQYWRkaW5nKGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhRQy0+cGFkZGluZy5wYWRkaW5nUmVzdCk7CisKKyAgLyogZnJhbWUgbGVuZ3RoICovCisgIGZyYW1lTGVuID0gcGFkZGluZ09uICsgY2FsY0ZyYW1lTGVuKGJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTl9CWVRFU19JTlQpOworCisgIGZyYW1lTGVuID0gZnJhbWVMZW4gPDwgMzsKKyAgY29kZUJpdHNMYXN0ID0gaFFDLT5hdmVyYWdlQml0c1RvdCAtIGhRQy0+Z2xvYlN0YXRCaXRzOworICBjb2RlQml0cyAgICAgPSBmcmFtZUxlbiAtIGhRQy0+Z2xvYlN0YXRCaXRzOworCisgIC8qIGNhbGN1bGF0ZSBiaXRzIGZvciBldmVyeSBjaGFubmVsIGVsZW1lbnQgKi8gICAKKyAgaWYgKGNvZGVCaXRzICE9IGNvZGVCaXRzTGFzdCkgeworICAgIFdvcmQxNiB0b3RhbEJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyA9IChoUUMtPmVsZW1lbnRCaXRzLnJlbGF0aXZlQml0cyAqIGNvZGVCaXRzKSA+PiAxNjsgLyogcmVsYXRpdmVCaXRzIHdhcyBzY2FsZWQgZG93biBieSAyICovCisgICAgdG90YWxCaXRzICs9IGhRQy0+ZWxlbWVudEJpdHMuYXZlcmFnZUJpdHM7CisKKyAgICBoUUMtPmVsZW1lbnRCaXRzLmF2ZXJhZ2VCaXRzID0gaFFDLT5lbGVtZW50Qml0cy5hdmVyYWdlQml0cyArIChjb2RlQml0cyAtIHRvdGFsQml0cyk7CisgIH0KKworICBoUUMtPmF2ZXJhZ2VCaXRzVG90ID0gZnJhbWVMZW47ICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9xdWFudGl6ZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcXVhbnRpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVmMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvcXVhbnRpemUuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJcXVhbnRpemUuYw0KKw0KKwlDb250ZW50OglxdWFudGl6YXRpb24gZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKyNpbmNsdWRlICJxdWFudGl6ZS5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworI2RlZmluZSBNQU5UX0RJR0lUUyA5CisjZGVmaW5lIE1BTlRfU0laRSAgICgxPDxNQU5UX0RJR0lUUykKKworc3RhdGljIGNvbnN0IFdvcmQzMiBYUk9VTkQgPSAweDMzZTQyNWFmOyAvKiBmaW5hbCByb3VuZGluZyBjb25zdGFudCAoLTAuMDk0NmYrIDAuNWYpICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6cG93MzQgCisqIGRlc2NyaXB0aW9uOiBjYWxjdWxhdGUgJHhee1xmcmFjezN9ezR9fSwgZm9yIDAuNSA8IHggPCAxLjAkLiAgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK19faW5saW5lIFdvcmQzMiBwb3czNChXb3JkMzIgeCkKK3sKKyAgLyogaW5kZXggdGFibGUgdXNpbmcgTUFOVF9ESUdJVFMgYml0cywgYnV0IG1hc2sgb3V0IHRoZSBzaWduIGJpdCBhbmQgdGhlIE1TQgorICAgICB3aGljaCBpcyBhbHdheXMgb25lICovICAgCisgIHJldHVybiBtVGFiXzNfNFsoeCA+PiAoSU5UX0JJVFMtMi1NQU5UX0RJR0lUUykpICYgKE1BTlRfU0laRS0xKV07Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6cXVhbnRpemVTaW5nbGVMaW5lIAorKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHNwZWN0cnVtICAKKyogICAgICAgICAgICAgIHF1YVNwZWN0cnVtID0gbWRjdFNwZWN0cnVtXjMvNCoyXigtKDMvMTYpKmdhaW4pICAgIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IHF1YW50aXplU2luZ2xlTGluZShjb25zdCBXb3JkMTYgZ2FpbiwgY29uc3QgV29yZDMyIGFic1NwZWN0cnVtKQoreworICBXb3JkMzIgZSwgbWludXNGaW5hbEV4cCwgZmluYWxTaGlmdDsKKyAgV29yZDMyIHg7CisgIFdvcmQxNiBxdWEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAKKyAgaWYgKGFic1NwZWN0cnVtKSB7CisgICAgZSA9IG5vcm1fbChhYnNTcGVjdHJ1bSk7CisgICAgeCA9IHBvdzM0KGFic1NwZWN0cnVtIDw8IGUpOworCisgICAgLyogY2FsY3VsYXRlIHRoZSBmaW5hbCBmcmFjdGlvbmFsIGV4cG9uZW50IHRpbWVzIDE2ICh3YXMgMyooNCplICsgZ2FpbikgKyAoSU5UX0JJVFMtMSkqMTYpICovCisgICAgbWludXNGaW5hbEV4cCA9IChlIDw8IDIpICsgZ2FpbjsKKyAgICBtaW51c0ZpbmFsRXhwID0gKG1pbnVzRmluYWxFeHAgPDwgMSkgKyBtaW51c0ZpbmFsRXhwOworICAgIG1pbnVzRmluYWxFeHAgPSBtaW51c0ZpbmFsRXhwICsgKChJTlRfQklUUy0xKSA8PCA0KTsKKworICAgIC8qIHNlcGFyYXRlIHRoZSBleHBvbmVudCBpbnRvIGEgc2hpZnQsIGFuZCBhIG11bHRpcGx5ICovCisgICAgZmluYWxTaGlmdCA9IG1pbnVzRmluYWxFeHAgPj4gNDsKKyAgICAgCisgICAgaWYgKGZpbmFsU2hpZnQgPCBJTlRfQklUUykgeworICAgICAgeCA9IExfbXB5X3d4KHgsIHBvdzJ0b21pbnVzTm92ZXIxNlttaW51c0ZpbmFsRXhwICYgMTVdKTsKKworICAgICAgeCArPSBYUk9VTkQgPj4gKElOVF9CSVRTIC0gZmluYWxTaGlmdCk7CisKKyAgICAgIC8qIHNoaWZ0IGFuZCBxdWFudGl6ZSAqLw0KKwkgIGZpbmFsU2hpZnQtLTsNCisNCisJICBpZihmaW5hbFNoaWZ0ID49IDApDQorCQkgIHggPj49IGZpbmFsU2hpZnQ7DQorCSAgZWxzZQ0KKwkJICB4IDw8PSAoLWZpbmFsU2hpZnQpOw0KKwkJDQorCSAgcXVhID0gc2F0dXJhdGUoeCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHF1YTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6cXVhbnRpemVMaW5lcyAKKyogZGVzY3JpcHRpb246IHF1YW50aXplcyBzcGVjdHJ1bSBsaW5lcyAgCisqICAgICAgICAgICAgICBxdWFTcGVjdHJ1bSA9IG1kY3RTcGVjdHJ1bV4zLzQqMl4oLSgzLzE2KSpnYWluKSAgICAKKyogIGlucHV0OiBnbG9iYWwgZ2FpbiwgbnVtYmVyIG9mIGxpbmVzIHRvIHByb2Nlc3MsIHNwZWN0cmFsIGRhdGEgICAgICAgICAKKyogIG91dHB1dDogcXVhbnRpemVkIHNwZWN0cnVtCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHF1YW50aXplTGluZXMoY29uc3QgV29yZDE2IGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnF1YVNwZWN0cnVtKQoreworICBXb3JkMzIgbGluZTsKKyAgV29yZDMyIG0gPSBnYWluJjM7CisgIFdvcmQzMiBnID0gKGdhaW4gPj4gMikgKyA0Ow0KKyAgV29yZDMyIG1kY3RTcGVMOw0KKyAgV29yZDE2ICpwcXVhdDsKKyAgICAvKiBnYWluJjMgKi8NCisNCisgIHBxdWF0ID0gcXVhbnRCb3JkZXJzW21dOw0KKw0KKyAgZyArPSAxNjsNCisgIA0KKyAgaWYoZyA+PSAwKQ0KKyAgew0KKwlmb3IgKGxpbmU9MDsgbGluZTxub09mTGluZXM7IGxpbmUrKykgeworCSAgV29yZDMyIHF1YTsKKwkgIHF1YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICANCisJICBtZGN0U3BlTCA9IG1kY3RTcGVjdHJ1bVtsaW5lXTsNCisJCisJICBpZiAobWRjdFNwZUwpIHsKKwkJV29yZDMyIHNhOworCQlXb3JkMzIgc2FTaGZ0OworCisgICAgICAgIHNhID0gTF9hYnMobWRjdFNwZUwpOworICAgICAgICAvL3NhU2hmdCA9IExfc2hyKHNhLCAxNiArIGcpOw0KKwkgICAgc2FTaGZ0ID0gc2EgPj4gZzsKKworICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsKKyAgICAgICAgIAorICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFsxXSkgeworICAgICAgICAgICAgIAorICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDEgOiAtMTsKKwkJICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDIgOiAtMjsKKwkJCX0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoc2FTaGZ0IDwgcHF1YXRbM10pIHsKKyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcXVhID0gbWRjdFNwZUw+MCA/IDMgOiAtMzsKKwkJCSAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWEgPSBxdWFudGl6ZVNpbmdsZUxpbmUoZ2Fpbiwgc2EpOworICAgICAgICAgICAgICAgIC8qIGFkanVzdCB0aGUgc2lnbi4gU2luY2UgMCA8IHF1YSA8IDEsIHRoaXMgY2Fubm90IG92ZXJmbG93LiAqLworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG1kY3RTcGVMIDwgMCkKKyAgICAgICAgICAgICAgICAgIHF1YSA9IC1xdWE7CisJCQkgIH0KKwkJCX0KKwkJICB9CisJCX0KKwkgIH0KKyAgICAgIHF1YVNwZWN0cnVtW2xpbmVdID0gcXVhIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl9DQorICB9DQorICBlbHNlDQorICB7DQorCWZvciAobGluZT0wOyBsaW5lPG5vT2ZMaW5lczsgbGluZSsrKSB7DQorCSAgV29yZDMyIHF1YTsNCisJICBxdWEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgIA0KKwkgIG1kY3RTcGVMID0gbWRjdFNwZWN0cnVtW2xpbmVdOw0KKwkNCisJICBpZiAobWRjdFNwZUwpIHsNCisJCVdvcmQzMiBzYTsNCisJCVdvcmQzMiBzYVNoZnQ7DQorDQorICAgICAgICBzYSA9IExfYWJzKG1kY3RTcGVMKTsNCisgICAgICAgIHNhU2hmdCA9IHNhIDw8IGc7DQorDQorICAgICAgICBpZiAoc2FTaGZ0ID4gcHF1YXRbMF0pIHsNCisgICAgICAgICANCisgICAgICAgICAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7DQorICAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAxIDogLTE7DQorCQkgIH0NCisgICAgICAgICAgZWxzZSB7DQorICAgICAgICAgICANCisgICAgICAgICAgICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsNCisgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAyIDogLTI7DQorCQkJfQ0KKyAgICAgICAgICAgIGVsc2Ugew0KKyAgICAgICAgICAgICANCisgICAgICAgICAgICAgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgew0KKyAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIHF1YSA9IG1kY3RTcGVMPjAgPyAzIDogLTM7DQorCQkJICB9DQorICAgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsNCisgICAgICAgICAgICAgICAgLyogYWRqdXN0IHRoZSBzaWduLiBTaW5jZSAwIDwgcXVhIDwgMSwgdGhpcyBjYW5ub3Qgb3ZlcmZsb3cuICovDQorICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIGlmIChtZGN0U3BlTCA8IDApDQorICAgICAgICAgICAgICAgICAgcXVhID0gLXF1YTsNCisJCQkgIH0NCisJCQl9DQorCQkgIH0NCisJCX0NCisJICB9DQorICAgICAgcXVhU3BlY3RydW1bbGluZV0gPSBxdWEgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9CSAgDQorICB9CisKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTppcXVhbnRpemVMaW5lcyAKKyogZGVzY3JpcHRpb246IGlxdWFudGl6ZXMgc3BlY3RydW0gbGluZXMgd2l0aG91dCBzaWduCisqICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gPSBpcXVhU3BlY3RydW1eNC8zICoyXigwLjI1KmdhaW4pIAorKiBpbnB1dDogZ2xvYmFsIGdhaW4sIG51bWJlciBvZiBsaW5lcyB0byBwcm9jZXNzLHF1YW50aXplZCBzcGVjdHJ1bSAgICAgICAgCisqIG91dHB1dDogc3BlY3RyYWwgZGF0YQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpcXVhbnRpemVMaW5lcyhjb25zdCBXb3JkMTYgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBub09mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnF1YW50U3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKm1kY3RTcGVjdHJ1bSkKK3sKKyAgV29yZDMyICAgaXF1YW50aXplcm1vZDsKKyAgV29yZDMyICAgaXF1YW50aXplcnNoaWZ0OworICBXb3JkMzIgICBsaW5lOworCisgIGlxdWFudGl6ZXJtb2QgPSBnYWluICYgMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaXF1YW50aXplcnNoaWZ0ID0gZ2FpbiA+PiAyOworCisgIGZvciAobGluZT0wOyBsaW5lPG5vT2ZMaW5lczsgbGluZSsrKSB7CisgICAgIAorICAgIGlmKCBxdWFudFNwZWN0cnVtW2xpbmVdICE9IDAgKSB7CisgICAgICBXb3JkMzIgYWNjdTsKKyAgICAgIFdvcmQzMiBleDsKKwkgIFdvcmQzMiB0YWJJbmRleDsKKyAgICAgIFdvcmQzMiBzcGVjRXhwOworICAgICAgV29yZDMyIHMsdDsKKworICAgICAgYWNjdSA9IHF1YW50U3BlY3RydW1bbGluZV07CisKKyAgICAgIGV4ID0gbm9ybV9sKGFjY3UpOworICAgICAgYWNjdSA9IGFjY3UgPDwgZXg7CisgICAgICBzcGVjRXhwID0gSU5UX0JJVFMtMSAtIGV4OworCisgICAgICB0YWJJbmRleCA9IChhY2N1ID4+IChJTlRfQklUUy0yLU1BTlRfRElHSVRTKSkgJiAofk1BTlRfU0laRSk7ICAgICAgICAKKworICAgICAgLyogY2FsY3VsYXRlICJtYW50aXNzYSIgXjQvMyAqLworICAgICAgcyA9IG1UYWJfNF8zW3RhYkluZGV4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIC8qIGdldCBhcHByb3BlcmlhdGUgZXhwb25lbnQgbXVsdGlwbGllciBmb3Igc3BlY0V4cF4zLzQgY29tYmluZWQgd2l0aCBzY2ZNb2QgKi8KKyAgICAgIHQgPSBzcGVjRXhwTWFudFRhYmxlQ29tYl9lbmNbaXF1YW50aXplcm1vZF1bc3BlY0V4cF07ICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAvKiBtdWx0aXBseSAibWFudGlzc2EiIF40LzMgd2l0aCBleHBvbmVudCBtdWx0aXBsaWVyICovCisgICAgICBhY2N1ID0gTVVMSElHSChzLCB0KTsKKworICAgICAgLyogZ2V0IGFwcHJvcGVyaWF0ZSBleHBvbmVudCBzaGlmdGVyICovCisgICAgICBzcGVjRXhwID0gc3BlY0V4cFRhYmxlQ29tYl9lbmNbaXF1YW50aXplcm1vZF1bc3BlY0V4cF07ICAgICAgICAgICAgICAgICAgICAKKworICAgICAgc3BlY0V4cCArPSBpcXVhbnRpemVyc2hpZnQgKyAxOw0KKwkgIGlmKHNwZWNFeHAgPj0gMCkNCisJCSAgbWRjdFNwZWN0cnVtW2xpbmVdID0gYWNjdSA8PCBzcGVjRXhwOw0KKwkgIGVsc2UNCisJCSAgbWRjdFNwZWN0cnVtW2xpbmVdID0gYWNjdSA+PiAoLXNwZWNFeHApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG1kY3RTcGVjdHJ1bVtsaW5lXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogUXVhbnRpemVTcGVjdHJ1bQorKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIHRoZSBlbnRpcmUgc3BlY3RydW0KKyogcmV0dXJuczoKKyogaW5wdXQ6IG51bWJlciBvZiBzY2FsZWZhY3RvciBiYW5kcyB0byBiZSBxdWFudGl6ZWQsIC4uLgorKiBvdXRwdXQ6IHF1YW50aXplZCBzcGVjdHJ1bQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFF1YW50aXplU3BlY3RydW0oV29yZDE2IHNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbWF4U2ZiUGVyR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqbWRjdFNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBnbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NhbGVmYWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcXVhbnRpemVkU3BlY3RydW0pCit7CisgIFdvcmQzMiBzZmJPZmZzLCBzZmI7CisKKyAgZm9yKHNmYk9mZnM9MDtzZmJPZmZzPHNmYkNudDtzZmJPZmZzKz1zZmJQZXJHcm91cCkgeworICAgIFdvcmQzMiBzZmJOZXh0IDsKKyAgICBmb3IgKHNmYiA9IDA7IHNmYiA8IG1heFNmYlBlckdyb3VwOyBzZmIgPSBzZmJOZXh0KSB7CisgICAgICBXb3JkMTYgc2NhbGVmYWN0b3IgPSBzY2FsZWZhY3RvcnNbc2ZiT2ZmcytzZmJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAvKiBjb2FsZXNjZSBzZmJzIHdpdGggdGhlIHNhbWUgc2NhbGVmYWN0b3IgKi8KKyAgICAgIGZvciAoc2ZiTmV4dCA9IHNmYisxOworICAgICAgICAgICBzZmJOZXh0IDwgbWF4U2ZiUGVyR3JvdXAgJiYgc2NhbGVmYWN0b3IgPT0gc2NhbGVmYWN0b3JzW3NmYk9mZnMrc2ZiTmV4dF07CisgICAgICAgICAgIHNmYk5leHQrKykgOworCisgICAgICBxdWFudGl6ZUxpbmVzKGdsb2JhbEdhaW4gLSBzY2FsZWZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiTmV4dF0gLSBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgICBtZGN0U3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0pOworICAgIH0KKyAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOmNhbGNTZmJEaXN0IAorKiBkZXNjcmlwdGlvbjogcXVhbnRpemVzIGFuZCByZXF1YW50aXplcyBsaW5lcyB0byBjYWxjdWxhdGUgZGlzdG9ydGlvbgorKiBpbnB1dDogIG51bWJlciBvZiBsaW5lcyB0byBiZSBxdWFudGl6ZWQsIC4uLgorKiBvdXRwdXQ6IGRpc3RvcnRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworV29yZDMyIGNhbGNTZmJEaXN0KGNvbnN0IFdvcmQzMiAqc3BlYywKKyAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLAorICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgZ2FpbikKK3sKKyAgV29yZDMyIGxpbmU7CisgIFdvcmQzMiBkaXN0OworICBXb3JkMzIgbSA9IGdhaW4mMzsKKyAgV29yZDMyIGcgPSAoZ2FpbiA+PiAyKSArIDQ7DQorICBXb3JkMzIgZzIgPSAoZyA8PCAxKSArIDE7DQorICBXb3JkMTYgKnBxdWF0LCAqcmVwcXVhdDsNCisgICAgLyogZ2FpbiYzICovCisNCisgIHBxdWF0ID0gcXVhbnRCb3JkZXJzW21dOw0KKyAgcmVwcXVhdCA9IHF1YW50UmVjb25bbV07CisJDQorICBkaXN0ID0gMDsgIA0KKyAgZyArPSAxNjsNCisgIGlmKGcyIDwgMCAmJiBnID49IDApDQorICB7CSAgCisJICBnMiA9IC1nMjsNCisJICBmb3IobGluZT0wOyBsaW5lPHNmYldpZHRoOyBsaW5lKyspIHsJCSAgCisJCSAgaWYgKHNwZWNbbGluZV0pIHsJCQkgIAorCQkJICBXb3JkMzIgZGlmZjsKKwkJCSAgV29yZDMyIGRpc3RTaW5nbGU7CisJCQkgIFdvcmQzMiBzYTsKKwkJCSAgV29yZDMyIHNhU2hmdDsKKwkJCSAgc2EgPSBMX2FicyhzcGVjW2xpbmVdKTsKKwkJCSAgLy9zYVNoZnQgPSByb3VuZDE2KExfc2hyKHNhLCBnKSk7CisJCQkgIC8vc2FTaGZ0ID0gTF9zaHIoc2EsIDE2K2cpOw0KKwkJCSAgc2FTaGZ0ID0gc2EgPj4gZzsNCisKKwkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzBdKSB7DQorCQkJCSAgZGlzdFNpbmdsZSA9IChzYVNoZnQgKiBzYVNoZnQpID4+IGcyOw0KKwkJCSAgfQ0KKwkJCSAgZWxzZSB7DQorCQkJCSAgDQorCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzFdKSB7DQorCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzBdOw0KKwkJCQkJICBkaXN0U2luZ2xlID0gKGRpZmYgKiBkaWZmKSA+PiBnMjsNCisJCQkJICB9DQorCQkJCSAgZWxzZSB7DQorCQkJCQkgIA0KKwkJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMl0pIHsNCisJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzFdOw0KKwkJCQkJCSAgZGlzdFNpbmdsZSA9IChkaWZmICogZGlmZikgPj4gZzI7DQorCQkJCQkgIH0NCisJCQkJCSAgZWxzZSB7DQorCQkJCQkJICANCisJCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgew0KKwkJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzJdOw0KKwkJCQkJCQkgIGRpc3RTaW5nbGUgPSAoZGlmZiAqIGRpZmYpID4+IGcyOw0KKwkJCQkJCSAgfQ0KKwkJCQkJCSAgZWxzZSB7DQorCQkJCQkJCSAgV29yZDE2IHF1YSA9IHF1YW50aXplU2luZ2xlTGluZShnYWluLCBzYSk7DQorCQkJCQkJCSAgV29yZDMyIGlxdmFsLCBkaWZmMzI7DQorCQkJCQkJCSAgLyogbm93IHRoYXQgd2UgaGF2ZSBxdWFudGl6ZWQgeCwgcmUtcXVhbnRpemUgaXQuICovDQorCQkJCQkJCSAgaXF1YW50aXplTGluZXMoZ2FpbiwgMSwgJnF1YSwgJmlxdmFsKTsNCisJCQkJCQkJICBkaWZmMzIgPSBzYSAtIGlxdmFsOw0KKwkJCQkJCQkgIGRpc3RTaW5nbGUgPSBmaXhtdWwoZGlmZjMyLCBkaWZmMzIpOw0KKwkJCQkJCSAgfQ0KKwkJCQkJICB9DQorCQkJCSAgfQ0KKwkJCSAgfQ0KKwkJCSAgDQorCQkJICBkaXN0ID0gTF9hZGQoZGlzdCwgZGlzdFNpbmdsZSk7DQorCQkgIH0KKwkgIH0NCisgIH0NCisgIGVsc2UNCisgIHsNCisJICBmb3IobGluZT0wOyBsaW5lPHNmYldpZHRoOyBsaW5lKyspIHsJCSAgDQorCQkgIGlmIChzcGVjW2xpbmVdKSB7CQkJICANCisJCQkgIFdvcmQzMiBkaWZmOw0KKwkJCSAgV29yZDMyIGRpc3RTaW5nbGU7DQorCQkJICBXb3JkMzIgc2E7DQorCQkJICBXb3JkMzIgc2FTaGZ0Ow0KKwkJCSAgc2EgPSBMX2FicyhzcGVjW2xpbmVdKTsNCisJCQkgIC8vc2FTaGZ0ID0gcm91bmQxNihMX3NocihzYSwgZykpOw0KKwkJCSAgc2FTaGZ0ID0gTF9zaHIoc2EsIGcpOw0KKw0KKwkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzBdKSB7DQorCQkJCSAgZGlzdFNpbmdsZSA9IExfc2hsKChzYVNoZnQgKiBzYVNoZnQpLCBnMik7DQorCQkJICB9DQorCQkJICBlbHNlIHsNCisJCQkJICANCisJCQkJICBpZiAoc2FTaGZ0IDwgcHF1YXRbMV0pIHsNCisJCQkJCSAgZGlmZiA9IHNhU2hmdCAtIHJlcHF1YXRbMF07DQorCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7DQorCQkJCSAgfQ0KKwkJCQkgIGVsc2Ugew0KKwkJCQkJICANCisJCQkJCSAgaWYgKHNhU2hmdCA8IHBxdWF0WzJdKSB7DQorCQkJCQkJICBkaWZmID0gc2FTaGZ0IC0gcmVwcXVhdFsxXTsNCisJCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7DQorCQkJCQkgIH0NCisJCQkJCSAgZWxzZSB7DQorCQkJCQkJICANCisJCQkJCQkgIGlmIChzYVNoZnQgPCBwcXVhdFszXSkgew0KKwkJCQkJCQkgIGRpZmYgPSBzYVNoZnQgLSByZXBxdWF0WzJdOw0KKwkJCQkJCQkgIGRpc3RTaW5nbGUgPSBMX3NobCgoZGlmZiAqIGRpZmYpLCBnMik7DQorCQkJCQkJICB9DQorCQkJCQkJICBlbHNlIHsNCisJCQkJCQkJICBXb3JkMTYgcXVhID0gcXVhbnRpemVTaW5nbGVMaW5lKGdhaW4sIHNhKTsNCisJCQkJCQkJICBXb3JkMzIgaXF2YWwsIGRpZmYzMjsNCisJCQkJCQkJICAvKiBub3cgdGhhdCB3ZSBoYXZlIHF1YW50aXplZCB4LCByZS1xdWFudGl6ZSBpdC4gKi8NCisJCQkJCQkJICBpcXVhbnRpemVMaW5lcyhnYWluLCAxLCAmcXVhLCAmaXF2YWwpOw0KKwkJCQkJCQkgIGRpZmYzMiA9IHNhIC0gaXF2YWw7DQorCQkJCQkJCSAgZGlzdFNpbmdsZSA9IGZpeG11bChkaWZmMzIsIGRpZmYzMik7DQorCQkJCQkJICB9DQorCQkJCQkgIH0NCisJCQkJICB9DQorCQkJICB9DQorCQkJICBkaXN0ID0gTF9hZGQoZGlzdCwgZGlzdFNpbmdsZSk7DQorCQkgIH0NCisJICB9CSAgDQorICB9CisKKyAgcmV0dXJuIGRpc3Q7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zZl9lc3RpbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRiMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc2ZfZXN0aW0uYwpAQCAtMCwwICsxLDg4MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJc2ZfZXN0aW0uYw0KKw0KKwlDb250ZW50OglTY2FsZSBmYWN0b3IgZXN0aW1hdGlvbiBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCIKKyNpbmNsdWRlICJzZl9lc3RpbS5oIgorI2luY2x1ZGUgInF1YW50aXplLmgiCisjaW5jbHVkZSAiYml0X2NudC5oIgorI2luY2x1ZGUgImFhY19yb20uaCIKKworc3RhdGljIGNvbnN0IFdvcmQxNiBNQVhfU0NGX0RFTFRBID0gNjA7CisKKy8qIQorY29uc3RhbnRzIHJlZmVyZW5jZSBpbiBjb21tZW50cyAKKworIEMwID0gNi43NWY7CisgQzEgPSAtNjkuMzMyOTVmOyAgIC0xNi8zKmxvZyhNQVhfUVVBTlQrMC41LWxvZ0NvbikvbG9nKDIpIAorIEMyID0gNC4wZjsKKyBDMyA9IDIuNjY2NjY2NjZmOworIAorICBQRV9DMSA9IDMuMGY7ICAgICAgICBsb2coOC4wKS9sb2coMikgCisgIFBFX0MyID0gMS4zMjE5MjgxZjsgIGxvZygyLjUpL2xvZygyKSAKKyAgUEVfQzMgPSAwLjU1OTM1NzNmOyAgMS1DMi9DMSAKKyAgCisqLworCisjZGVmaW5lIEZGX1NRUlRfQklUUyAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBGRl9TUVJUX1RBQkxFX1NJWkUgICAgICAgICAgICAgICgxPDxGRl9TUVJUX0JJVFMgLSAxPDwoRkZfU1FSVF9CSVRTLTIpKQorI2RlZmluZSBDT0VGMDhfMzEJCTB4NjY2NjY2NjYJCS8qIDAuOCooMSA8PCAzMSkgKi8NCisjZGVmaW5lIFBFX0MxXzgJCQkyNAkJCQkvKiBQRV9DMSo4ICovDQorI2RlZmluZSBQRV9DMl8xNgkJMjEJCQkJLyogUEVfQzIqOC9QRV9DMyAqLw0KKyNkZWZpbmUgUEVfU0NBTEUJCTB4MDU5YQkJCS8qIDAuNyAqICgxIDw8ICgxNSAtIDEgLSAzKSkqLw0KKw0KKyNkZWZpbmUgU0NBTEVfRVNUSU1BVEVfQ09FRgkweDU1NTUJCS8qICg4Ljg1ODUvKDQqbG9nMigxMCkpKSAqICgxIDw8IDE1KSovDQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGZvcm1mYWNfc3FydAorKiBkZXNjcmlwdGlvbjogIGNhbGN1bGF0ZXMgc3FydCh4KS8yNTYgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworX19pbmxpbmUgV29yZDMyIGZvcm1mYWNfc3FydChXb3JkMzIgeCkKK3sKKwlXb3JkMzIgeTsKKwlXb3JkMzIgcHJlc2hpZnQsIHBvc3RzaGlmdDsKKwkKKwkKKwlpZiAoeD09MCkgcmV0dXJuIDA7CisJcHJlc2hpZnQgID0gbm9ybV9sKHgpIC0gKElOVF9CSVRTLTEtRkZfU1FSVF9CSVRTKTsKKwlwb3N0c2hpZnQgPSBwcmVzaGlmdCA+PiAxOworCXByZXNoaWZ0ICA9IHBvc3RzaGlmdCA8PCAxOworCXBvc3RzaGlmdCA9IHBvc3RzaGlmdCArIDg7CSAgLyogc3FydC8yNTYgKi8KKwlpZihwcmVzaGlmdCA+PSAwKQ0KKwkJeSA9IHggPDwgcHJlc2hpZnQ7ICAgICAgICAvKiBub3cgMS80IDw9IHkgPCAxICovDQorCWVsc2UNCisJCXkgPSB4ID4+ICgtcHJlc2hpZnQpOw0KKwl5ID0gZm9ybWZhY19zcXJ0dGFibGVbeS0zMl07DQorCQ0KKwlpZihwb3N0c2hpZnQgPj0gMCkNCisJCXkgPSB5ID4+IHBvc3RzaGlmdDsNCisJZWxzZQ0KKwkJeSA9IHkgPDwgKC1wb3N0c2hpZnQpOw0KKwkNCisJcmV0dXJuIHk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBDYWxjRm9ybUZhY3RvckNoYW5uZWwKKyogZGVzY3JpcHRpb246ICBjYWxjdWxhdGUgdGhlIGZvcm0gZmFjdG9yIG9uZSBjaGFubmVsCisqCQkJCWZmYWMobikgPSBzcXJ0KGFicyhYKGspKSArIHNxcnQoYWJzKFgoaysxKSkgKyAuLi4uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK0NhbGNGb3JtRmFjdG9yQ2hhbm5lbChXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJOUmVsZXZhbnRMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4pCit7CisJV29yZDMyIHNmYncsIHNmYncxOw0KKwlXb3JkMzIgaSwgajsKKwlXb3JkMzIgc2ZiT2Zmcywgc2ZiLCBzaGlmdDsKKwkNCisJc2ZidyA9IHNmYncxID0gMDsNCisJZm9yIChzZmJPZmZzPTA7IHNmYk9mZnM8cHN5T3V0Q2hhbi0+c2ZiQ250OyBzZmJPZmZzKz1wc3lPdXRDaGFuLT5zZmJQZXJHcm91cCl7CisJCWZvciAoc2ZiPTA7IHNmYjxwc3lPdXRDaGFuLT5tYXhTZmJQZXJHcm91cDsgc2ZiKyspIHsKKwkJCWkgPSBzZmJPZmZzK3NmYjsgICAgICAKKwkJCQorCQkJaWYgKHBzeU91dENoYW4tPnNmYkVuZXJneVtpXSA+IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtpXSkgeworCQkJCVdvcmQzMiBhY2N1LCBhdmdGb3JtRmFjdG9yLGlTZmJXaWR0aDsNCisJCQkJV29yZDMyICptZGN0U3BlYzsKKwkJCQlzZmJ3ID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpKzFdIC0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsNCisJCQkJaVNmYldpZHRoID0gaW52U0JGWyhzZmJ3ID4+IDIpIC0gMV07DQorCQkJCW1kY3RTcGVjID0gcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtICsgcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsKKwkJCQlhY2N1ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCS8qIGNhbGMgc3VtIG9mIHNxcnQoc3BlYykgKi8KKwkJCQlmb3IgKGo9c2Zidzsgajsgai0tKSB7DQorCQkJCQlhY2N1ICs9IGZvcm1mYWNfc3FydChMX2FicygqbWRjdFNwZWMpKTsgbWRjdFNwZWMrKzsNCisJCQkJfQorCQkJCWxvZ1NmYkZvcm1GYWN0b3JbaV0gPSBpTG9nNChhY2N1KTsKKwkJCQlsb2dTZmJFbmVyZ3lbaV0gPSBpTG9nNChwc3lPdXRDaGFuLT5zZmJFbmVyZ3lbaV0pOworCQkJCWF2Z0Zvcm1GYWN0b3IgPSBmaXhtdWwocnNxcnQocHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W2ldLElOVF9CSVRTKSwgaVNmYldpZHRoKTsKKwkJCQlhdmdGb3JtRmFjdG9yID0gcnNxcnQoKFdvcmQzMilhdmdGb3JtRmFjdG9yLElOVF9CSVRTKSA+PiAxMDsKKwkJCQkvKiByZXN1bHQgaXMgbXVsdGlwbGllZCBieSA0ICovCisJCQkJaWYoYXZnRm9ybUZhY3RvcikKKwkJCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSBhY2N1IC8gYXZnRm9ybUZhY3RvcjsKKwkJCQllbHNlCisJCQkJCXNmYk5SZWxldmFudExpbmVzW2ldID0gMHg3ZmZmOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogc2V0IG51bWJlciBvZiBsaW5lcyB0byB6ZXJvICovCisJCQkJc2ZiTlJlbGV2YW50TGluZXNbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBpbXByb3ZlU2NmCisqIGRlc2NyaXB0aW9uOiAgZmluZCBiZXR0ZXIgc2NhbGVmYWN0b3Igd2l0aCBhbmFseXNpcyBieSBzeW50aGVzaXMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGltcHJvdmVTY2YoV29yZDMyICpzcGVjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIHNmYldpZHRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgIHRocmVzaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBtaW5TY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpkaXN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm1pblNjZkNhbGN1bGF0ZWQpCit7CisJV29yZDMyIGNudDsKKwlXb3JkMzIgc2ZiRGlzdDsKKwlXb3JkMzIgc2NmQmVzdDsKKwlXb3JkMzIgdGhyZXNoMTI1ID0gTF9hZGQodGhyZXNoLCAodGhyZXNoID4+IDIpKTsKKwkKKwlzY2ZCZXN0ID0gc2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkKKwkvKiBjYWxjIHJlYWwgZGlzdG9ydGlvbiAqLworCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKKwkqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsgICAgIA0KKwlpZighc2ZiRGlzdCkNCisJICByZXR1cm4gc2NmQmVzdDsKKwkKKwlpZiAoc2ZiRGlzdCA+IHRocmVzaDEyNSkgeworCQlXb3JkMzIgc2NmRXN0aW1hdGVkOworCQlXb3JkMzIgc2ZiRGlzdEJlc3Q7CisJCXNjZkVzdGltYXRlZCA9IHNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCisJCWNudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl3aGlsZSAoc2ZiRGlzdCA+IHRocmVzaDEyNSAmJiAoY250IDwgMykpIHsKKwkJCQorCQkJc2NmID0gc2NmICsgMTsKKwkJCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKKwkJCQorCQkJaWYgKHNmYkRpc3QgPCBzZmJEaXN0QmVzdCkgeworCQkJCXNjZkJlc3QgPSBzY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCXNmYkRpc3RCZXN0ID0gc2ZiRGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJfQorCQkJY250ID0gY250ICsgMTsKKwkJfQorCQljbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJc2NmID0gc2NmRXN0aW1hdGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXNmYkRpc3QgPSBzZmJEaXN0QmVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl3aGlsZSAoKHNmYkRpc3QgPiB0aHJlc2gxMjUpICYmIChjbnQgPCAxKSAmJiAoc2NmID4gbWluU2NmKSkgeworCQkJCisJCQlzY2YgPSBzY2YgLSAxOworCQkJc2ZiRGlzdCA9IGNhbGNTZmJEaXN0KHNwZWMsIHNmYldpZHRoLCBzY2YpOworCQkJCisJCQlpZiAoc2ZiRGlzdCA8IHNmYkRpc3RCZXN0KSB7CisJCQkJc2NmQmVzdCA9IHNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl9CisJCQkqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWNudCA9IGNudCArIDE7CisJCX0NCisJCSpkaXN0ID0gc2ZiRGlzdEJlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCX0KKwllbHNlIHsKKwkJV29yZDMyIHNmYkRpc3RCZXN0OyAKKwkJV29yZDMyIHNmYkRpc3RBbGxvd2VkOworCQlXb3JkMzIgdGhyZXNoMDggPSBmaXhtdWwoQ09FRjA4XzMxLCB0aHJlc2gpOworCQlzZmJEaXN0QmVzdCA9IHNmYkRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCisJCWlmIChzZmJEaXN0IDwgdGhyZXNoMDgpCisJCQlzZmJEaXN0QWxsb3dlZCA9IHNmYkRpc3Q7CisJCWVsc2UKKwkJCXNmYkRpc3RBbGxvd2VkID0gdGhyZXNoMDg7CisJCWZvciAoY250PTA7IGNudDwzOyBjbnQrKykgeworCQkJc2NmID0gc2NmICsgMTsKKwkJCXNmYkRpc3QgPSBjYWxjU2ZiRGlzdChzcGVjLCBzZmJXaWR0aCwgc2NmKTsKKwkJCQorCQkJaWYgKGZpeG11bChDT0VGMDhfMzEsc2ZiRGlzdCkgPCBzZmJEaXN0QWxsb3dlZCkgeworCQkJCSptaW5TY2ZDYWxjdWxhdGVkID0gc2NmQmVzdCArIDE7CisJCQkJc2NmQmVzdCA9IHNjZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJc2ZiRGlzdEJlc3QgPSBzZmJEaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl9CisJCX0KKwkJKmRpc3QgPSBzZmJEaXN0QmVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJfQorCQorCS8qIHJldHVybiBiZXN0IHNjYWxlZmFjdG9yICovCisJcmV0dXJuIHNjZkJlc3Q7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnRTaW5nbGVTY2ZCaXRzCisqIGRlc2NyaXB0aW9uOiAgY291bnQgc2luZ2xlIHNjZiBiaXRzIGluIGh1ZmZ1bQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMTYgY291bnRTaW5nbGVTY2ZCaXRzKFdvcmQxNiBzY2YsIFdvcmQxNiBzY2ZMZWZ0LCBXb3JkMTYgc2NmUmlnaHQpCit7CisJV29yZDE2IHNjZkJpdHM7CisJCisJc2NmQml0cyA9IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZMZWZ0IC0gc2NmKSArCisJCWJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2YgLSBzY2ZSaWdodCk7CisJCisJcmV0dXJuIHNjZkJpdHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY2FsY1NpbmdsZVNwZWNQZQorKiBkZXNjcmlwdGlvbjogIGxkUmF0aW8gPSBsb2cyKGVuKG4pKSAtIDAsMzc1KnNjZkdhaW4obikKKyoJCQkJbmJpdHMgPSAwLjcqbkxpbmVzKmxkUmF0aW9uIGZvciBsZFJhdGlvbiA+PSBjMQorKgkJCQluYml0cyA9IDAuNypuTGluZXMqKGMyICsgYzMqbGRSYXRpbykgZm9yIGxkUmF0aW9uIDwgYzEgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQxNiBjYWxjU2luZ2xlU3BlY1BlKFdvcmQxNiBzY2YsIFdvcmQxNiBzZmJDb25zdFBlUGFydCwgV29yZDE2IG5MaW5lcykKK3sKKwlXb3JkMzIgc3BlY1BlOworCVdvcmQzMiBsZFJhdGlvOworCVdvcmQzMiBzY2YzOworCQorCWxkUmF0aW8gPSBzZmJDb25zdFBlUGFydCA8PCAzOyAvKiAgKHNmYkNvbnN0UGVQYXJ0IC0wLjM3NSpzY2YpKjggKi8KKwlzY2YzID0gc2NmICsgc2NmICsgc2NmOworCWxkUmF0aW8gPSBsZFJhdGlvIC0gc2NmMzsKKyAgICAKKwlpZiAobGRSYXRpbyA8IFBFX0MxXzgpIHsKKwkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8gCisJCWxkUmF0aW8gPSAobGRSYXRpbyArIFBFX0MyXzE2KSA+PiAxOworCX0KKwlzcGVjUGUgPSBuTGluZXMgKiBsZFJhdGlvOworCXNwZWNQZSA9IChzcGVjUGUgKiBQRV9TQ0FMRSkgPj4gMTQ7CisJCisJcmV0dXJuIHNhdHVyYXRlKHNwZWNQZSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBjb3VudFNjZkJpdHNEaWZmCisqIGRlc2NyaXB0aW9uOiAgY291bnQgZGlmZmVyZW50IHNjZiBiaXRzIHVzZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNvdW50U2NmQml0c0RpZmYoV29yZDE2ICpzY2ZPbGQsIFdvcmQxNiAqc2NmTmV3LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc2ZiQ250LCBXb3JkMTYgc3RhcnRTZmIsIFdvcmQxNiBzdG9wU2ZiKQoreworCVdvcmQzMiBzY2ZCaXRzRGlmZjsKKwlXb3JkMzIgc2ZiLCBzZmJMYXN0OworCVdvcmQzMiBzZmJQcmV2LCBzZmJOZXh0OworCQorCXNjZkJpdHNEaWZmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzZmIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCisJLyogc2VhcmNoIGZvciBmaXJzdCByZWxldmFudCBzZmIgKi8KKwlzZmJMYXN0ID0gc3RhcnRTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJd2hpbGUgKHNmYkxhc3QgPCBzdG9wU2ZiICYmIHNjZk9sZFtzZmJMYXN0XSA9PSBWT0FBQ19TSFJUX01JTikgeworCQkKKwkJc2ZiTGFzdCA9IHNmYkxhc3QgKyAxOworCX0KKwkvKiBzZWFyY2ggZm9yIHByZXZpb3VzIHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLworCXNmYlByZXYgPSBzdGFydFNmYiAtIDE7CisJd2hpbGUgKChzZmJQcmV2Pj0wKSAmJiBzY2ZPbGRbc2ZiUHJldl0gPT0gVk9BQUNfU0hSVF9NSU4pIHsKKwkJCisJCXNmYlByZXYgPSBzZmJQcmV2IC0gMTsKKwl9CisJCisJaWYgKHNmYlByZXY+PTApIHsKKwkJc2NmQml0c0RpZmYgKz0gYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk5ld1tzZmJQcmV2XSAtIHNjZk5ld1tzZmJMYXN0XSkgLQorCQkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJQcmV2XSAtIHNjZk9sZFtzZmJMYXN0XSk7CisJfQorCS8qIG5vdyBsb29wIHRocm91Z2ggYWxsIHNmYnMgYW5kIGNvdW50IGRpZmZzIG9mIHJlbGV2YW50IHNmYnMgKi8KKwlmb3IgKHNmYj1zZmJMYXN0KzE7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworCQkKKwkJaWYgKHNjZk9sZFtzZmJdICE9IFZPQUFDX1NIUlRfTUlOKSB7CisJCQlzY2ZCaXRzRGlmZiArPSBiaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmTmV3W3NmYkxhc3RdIC0gc2NmTmV3W3NmYl0pIC0KKwkJCQliaXRDb3VudFNjYWxlZmFjdG9yRGVsdGEoc2NmT2xkW3NmYkxhc3RdIC0gc2NmT2xkW3NmYl0pOworCQkJc2ZiTGFzdCA9IHNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCX0KKwl9CisJLyogc2VhcmNoIGZvciBuZXh0IHJlbGV2YW50IHNmYiBhbmQgY291bnQgZGlmZiAqLworCXNmYk5leHQgPSBzdG9wU2ZiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwl3aGlsZSAoc2ZiTmV4dCA8IHNmYkNudCAmJiBzY2ZPbGRbc2ZiTmV4dF0gPT0gVk9BQUNfU0hSVF9NSU4pIHsKKwkJCisJCXNmYk5leHQgPSBzZmJOZXh0ICsgMTsKKwl9CisJCisJaWYgKHNmYk5leHQgPCBzZmJDbnQpCisJCXNjZkJpdHNEaWZmICs9IGJpdENvdW50U2NhbGVmYWN0b3JEZWx0YShzY2ZOZXdbc2ZiTGFzdF0gLSBzY2ZOZXdbc2ZiTmV4dF0pIC0KKwkJYml0Q291bnRTY2FsZWZhY3RvckRlbHRhKHNjZk9sZFtzZmJMYXN0XSAtIHNjZk9sZFtzZmJOZXh0XSk7CisJCisJcmV0dXJuIHNhdHVyYXRlKHNjZkJpdHNEaWZmKTsKK30KKworc3RhdGljIFdvcmQxNiBjYWxjU3BlY1BlRGlmZihXb3JkMTYgKnNjZk9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2ZOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiTlJlbGV2YW50TGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdGFydFNmYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzdG9wU2ZiKQoreworCVdvcmQzMiBzcGVjUGVEaWZmOworCVdvcmQzMiBzZmI7CisJCisJc3BlY1BlRGlmZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQorCS8qIGxvb3AgdGhyb3VnaCBhbGwgc2ZicyBhbmQgY291bnQgcGUgZGlmZmVyZW5jZSAqLworCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKwkJCisJCQorCQlpZiAoc2NmT2xkW3NmYl0gIT0gVk9BQUNfU0hSVF9NSU4pIHsKKwkJCVdvcmQzMiBsZFJhdGlvT2xkLCBsZFJhdGlvTmV3OworCQkJV29yZDMyIHNjZjM7CisJCQkKKwkJCQorCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYl0gPT0gTUlOXzE2KSB7CisJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiXSA9ICgobG9nU2ZiRW5lcmd5W3NmYl0gLQorCQkJCQlsb2dTZmJGb3JtRmFjdG9yW3NmYl0pICsgMTEtOCo0KzMpID4+IDI7CisJCQl9CisJCQkKKwkJCQorCQkJbGRSYXRpb09sZCA9IHNmYkNvbnN0UGVQYXJ0W3NmYl0gPDwgMzsKKwkJCXNjZjMgPSBzY2ZPbGRbc2ZiXSArIHNjZk9sZFtzZmJdICsgc2NmT2xkW3NmYl07CisJCQlsZFJhdGlvT2xkID0gbGRSYXRpb09sZCAtIHNjZjM7CisJCQlsZFJhdGlvTmV3ID0gc2ZiQ29uc3RQZVBhcnRbc2ZiXSA8PCAzOworCQkJc2NmMyA9IHNjZk5ld1tzZmJdICsgc2NmTmV3W3NmYl0gKyBzY2ZOZXdbc2ZiXTsKKwkJCWxkUmF0aW9OZXcgPSBsZFJhdGlvTmV3IC0gc2NmMzsKKwkJCQorCQkJaWYgKGxkUmF0aW9PbGQgPCBQRV9DMV84KSB7CisJCQkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8KKwkJCQlsZFJhdGlvT2xkID0gKGxkUmF0aW9PbGQgKyBQRV9DMl8xNikgPj4gMTsKKwkJCX0KKwkJCQorCQkJaWYgKGxkUmF0aW9OZXcgPCBQRV9DMV84KSB7CisJCQkJLyogMjEgOiAyKjgqUEVfQzIsIDIqUEVfQzMgfiAxKi8KKwkJCQlsZFJhdGlvTmV3ID0gKGxkUmF0aW9OZXcgKyBQRV9DMl8xNikgPj4gMTsKKwkJCX0KKwkJCQorCQkJc3BlY1BlRGlmZiArPSAgc2ZiTlJlbGV2YW50TGluZXNbc2ZiXSAqIChsZFJhdGlvTmV3IC0gbGRSYXRpb09sZCk7CisJCX0KKwl9CisJCisJc3BlY1BlRGlmZiA9IChzcGVjUGVEaWZmICogUEVfU0NBTEUpID4+IDE0OworCQorCXJldHVybiBzYXR1cmF0ZShzcGVjUGVEaWZmKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGFzc2ltaWxhdGVTaW5nbGVTY2YKKyogZGVzY3JpcHRpb246ICBzZWFyY2hlZCBmb3Igc2luZ2xlIHNjYWxlZmFjdG9yIGJhbmRzLCB3aGVyZSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2FpbmVkCisqCQkJCWJ5IHVzaW5nIGEgc21hbGxlciBzY2ZnYWluKG4pIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZXN0aW1hdGVkIGluY3JlYXNlZAorKgkJCQliaXQgZGVtYW5kCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgYXNzaW1pbGF0ZVNpbmdsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2NmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptaW5TY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqc2ZiRGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqc2ZiTlJlbGV2YW50TGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmQ2FsY3VsYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxhZyAgICByZXN0YXJ0T25TdWNjZXNzKQoreworCVdvcmQzMiBzZmJMYXN0LCBzZmJBY3QsIHNmYk5leHQsIHNjZkFjdCwgc2NmTWluOworCVdvcmQxNiAqc2NmTGFzdCwgKnNjZk5leHQ7CisJV29yZDMyIHNmYlBlT2xkLCBzZmJQZU5ldzsKKwlXb3JkMzIgc2ZiRGlzdE5ldzsKKwlXb3JkMzIgajsKKwlGbGFnICAgc3VjY2VzczsKKwlXb3JkMTYgZGVsdGFQZSwgZGVsdGFQZU5ldywgZGVsdGFQZVRtcDsKKwlXb3JkMTYgKnByZXZTY2ZMYXN0ID0gcHN5T3V0Q2hhbi0+cHJldlNjZkxhc3Q7CisJV29yZDE2ICpwcmV2U2NmTmV4dCA9IHBzeU91dENoYW4tPnByZXZTY2ZOZXh0OworCVdvcmQxNiAqZGVsdGFQZUxhc3QgPSBwc3lPdXRDaGFuLT5kZWx0YVBlTGFzdDsKKwlGbGFnICAgdXBkYXRlTWluU2NmQ2FsY3VsYXRlZDsKKwkKKwlzdWNjZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlkZWx0YVBlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkKKwlmb3Ioaj0wO2o8cHN5T3V0Q2hhbi0+c2ZiQ250O2orKyl7CisJCXByZXZTY2ZMYXN0W2pdID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJcHJldlNjZk5leHRbal0gPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlkZWx0YVBlTGFzdFtqXSA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJfQ0KKwkKKwlzZmJMYXN0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzZmJBY3QgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzZmJOZXh0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzY2ZMYXN0ID0gMDsKKwlzY2ZOZXh0ID0gMDsKKwlzY2ZNaW4gPSBNQVhfMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlkbyB7CisJCS8qIHNlYXJjaCBmb3IgbmV3IHJlbGV2YW50IHNmYiAqLworCQlzZmJOZXh0ID0gc2ZiTmV4dCArIDE7CisJCXdoaWxlIChzZmJOZXh0IDwgcHN5T3V0Q2hhbi0+c2ZiQ250ICYmIHNjZltzZmJOZXh0XSA9PSBNSU5fMTYpIHsKKwkJCQorCQkJc2ZiTmV4dCA9IHNmYk5leHQgKyAxOworCQl9CisJCQorCQlpZiAoKHNmYkxhc3Q+PTApICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKKwkJCS8qIHJlbGV2YW50IHNjZnMgdG8gdGhlIGxlZnQgYW5kIHRvIHRoZSByaWdodCAqLworCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXNjZkxhc3QgPSBzY2YgKyBzZmJMYXN0OworCQkJc2NmTmV4dCA9IHNjZiArIHNmYk5leHQ7CisJCQlzY2ZNaW4gID0gbWluKCpzY2ZMYXN0LCAqc2NmTmV4dCk7CisJCX0KKwkJZWxzZSB7CisJCQkKKwkJCWlmIChzZmJMYXN0ID09IC0xICYmIChzZmJBY3Q+PTApICYmIHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKKwkJCQkvKiBmaXJzdCByZWxldmFudCBzY2YgKi8KKwkJCQlzY2ZBY3QgID0gc2NmW3NmYkFjdF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQlzY2ZMYXN0ID0gJnNjZkFjdDsKKwkJCQlzY2ZOZXh0ID0gc2NmICsgc2ZiTmV4dDsKKwkJCQlzY2ZNaW4gID0gKnNjZk5leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCX0KKwkJCWVsc2UgeworCQkJCQorCQkJCWlmICgoc2ZiTGFzdD49MCkgJiYgKHNmYkFjdD49MCkgJiYgc2ZiTmV4dCA9PSBwc3lPdXRDaGFuLT5zZmJDbnQpIHsKKwkJCQkJLyogbGFzdCByZWxldmFudCBzY2YgKi8KKwkJCQkJc2NmQWN0ICA9IHNjZltzZmJBY3RdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQlzY2ZMYXN0ID0gc2NmICsgc2ZiTGFzdDsKKwkJCQkJc2NmTmV4dCA9ICZzY2ZBY3Q7CisJCQkJCXNjZk1pbiAgPSAqc2NmTGFzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCWlmIChzZmJBY3Q+PTApCisJCQlzY2ZNaW4gPSBtYXgoc2NmTWluLCBtaW5TY2Zbc2ZiQWN0XSk7CisJCQorCQlpZiAoKHNmYkFjdCA+PSAwKSAmJiAKKwkJCShzZmJMYXN0Pj0wIHx8IHNmYk5leHQgPCBwc3lPdXRDaGFuLT5zZmJDbnQpICYmIAorCQkJc2NmQWN0ID4gc2NmTWluICYmIAorCQkJKCpzY2ZMYXN0ICE9IHByZXZTY2ZMYXN0W3NmYkFjdF0gfHwgCisJCQkqc2NmTmV4dCAhPSBwcmV2U2NmTmV4dFtzZmJBY3RdIHx8IAorCQkJZGVsdGFQZSA8IGRlbHRhUGVMYXN0W3NmYkFjdF0pKSB7CisJCQlzdWNjZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCisJCQkvKiBlc3RpbWF0ZSByZXF1aXJlZCBiaXRzIGZvciBhY3R1YWwgc2NmICovCQkJCisJCQlpZiAoc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9PSBNSU5fMTYpIHsKKwkJCQlzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gbG9nU2ZiRW5lcmd5W3NmYkFjdF0gLQorCQkJCQlsb2dTZmJGb3JtRmFjdG9yW3NmYkFjdF0gKyAxMS04KjQ7IC8qIDQqbG9nMig2Ljc1KSAtIDMyICovCisJCQkJCisJCQkJaWYgKHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPCAwKQorCQkJCQlzZmJDb25zdFBlUGFydFtzZmJBY3RdID0gc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSArIDM7CisJCQkJc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSA9IHNmYkNvbnN0UGVQYXJ0W3NmYkFjdF0gPj4gMjsKKwkJCX0KKwkJCQorCQkJc2ZiUGVPbGQgPSBjYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCwgc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSwgc2ZiTlJlbGV2YW50TGluZXNbc2ZiQWN0XSkgKworCQkJCWNvdW50U2luZ2xlU2NmQml0cyhzY2ZBY3QsICpzY2ZMYXN0LCAqc2NmTmV4dCk7CisJCQlkZWx0YVBlTmV3ID0gZGVsdGFQZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJdXBkYXRlTWluU2NmQ2FsY3VsYXRlZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRvIHsKKwkJCQlzY2ZBY3QgPSBzY2ZBY3QgLSAxOworCQkJCS8qIGNoZWNrIG9ubHkgaWYgdGhlIHNhbWUgY2hlY2sgd2FzIG5vdCBkb25lIGJlZm9yZSAqLworCQkJCQorCQkJCWlmIChzY2ZBY3QgPCBtaW5TY2ZDYWxjdWxhdGVkW3NmYkFjdF0pIHsKKwkJCQkJc2ZiUGVOZXcgPSBjYWxjU2luZ2xlU3BlY1BlKHNjZkFjdCwgc2ZiQ29uc3RQZVBhcnRbc2ZiQWN0XSwgc2ZiTlJlbGV2YW50TGluZXNbc2ZiQWN0XSkgKworCQkJCQkJY291bnRTaW5nbGVTY2ZCaXRzKHNjZkFjdCwgKnNjZkxhc3QsICpzY2ZOZXh0KTsKKwkJCQkJLyogdXNlIG5ldyBzY2YgaWYgbm8gaW5jcmVhc2UgaW4gcGUgYW5kIAorCQkJCQlxdWFudGl6YXRpb24gZXJyb3IgaXMgc21hbGxlciAqLworCQkJCQlkZWx0YVBlVG1wID0gZGVsdGFQZSArIHNmYlBlTmV3IC0gc2ZiUGVPbGQ7CisJCQkJCQorCQkJCQlpZiAoZGVsdGFQZVRtcCA8IDEwKSB7CisJCQkJCQlzZmJEaXN0TmV3ID0gY2FsY1NmYkRpc3QocHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtKworCQkJCQkJCXBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiQWN0XSwKKwkJCQkJCQkocHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJBY3QrMV0gLSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYkFjdF0pLAorCQkJCQkJCXNjZkFjdCk7CisJCQkJCQlpZiAoc2ZiRGlzdE5ldyA8IHNmYkRpc3Rbc2ZiQWN0XSkgeworCQkJCQkJCS8qIHN1Y2Nlc3MsIHJlcGxhY2Ugc2NmIGJ5IG5ldyBvbmUgKi8KKwkJCQkJCQlzY2Zbc2ZiQWN0XSA9IHNjZkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJc2ZiRGlzdFtzZmJBY3RdID0gc2ZiRGlzdE5ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJCWRlbHRhUGVOZXcgPSBkZWx0YVBlVG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQlzdWNjZXNzID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQl9CisJCQkJCQkvKiBtYXJrIGFzIGFscmVhZHkgY2hlY2tlZCAqLworCQkJCQkJCisJCQkJCQlpZiAodXBkYXRlTWluU2NmQ2FsY3VsYXRlZCkgeworCQkJCQkJCW1pblNjZkNhbGN1bGF0ZWRbc2ZiQWN0XSA9IHNjZkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCXVwZGF0ZU1pblNjZkNhbGN1bGF0ZWQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJfSB3aGlsZSAoc2NmQWN0ID4gc2NmTWluKTsKKwkJCWRlbHRhUGUgPSBkZWx0YVBlTmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJLyogc2F2ZSBwYXJhbWV0ZXJzIHRvIGF2b2lkIG11bHRpcGxlIGNvbXB1dGF0aW9ucyBvZiB0aGUgc2FtZSBzZmIgKi8KKwkJCXByZXZTY2ZMYXN0W3NmYkFjdF0gPSAqc2NmTGFzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJcHJldlNjZk5leHRbc2ZiQWN0XSA9ICpzY2ZOZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlkZWx0YVBlTGFzdFtzZmJBY3RdID0gZGVsdGFQZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCQkKKwkJaWYgKHN1Y2Nlc3MgJiYgcmVzdGFydE9uU3VjY2VzcykgeworCQkJLyogc3RhcnQgYWdhaW4gYXQgZmlyc3Qgc2ZiICovCisJCQlzZmJMYXN0ID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXNmYkFjdCAgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJc2ZiTmV4dCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzY2ZMYXN0ID0gMDsKKwkJCXNjZk5leHQgPSAwOworCQkJc2NmTWluICA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzdWNjZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCQllbHNlIHsKKwkJCS8qIHNoaWZ0IHNmYnMgZm9yIG5leHQgYmFuZCAqLworCQkJc2ZiTGFzdCA9IHNmYkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlzZmJBY3QgID0gc2ZiTmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCQkKKyAgfSB3aGlsZSAoc2ZiTmV4dCA8IHBzeU91dENoYW4tPnNmYkNudCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBhc3NpbWlsYXRlTXVsdGlwbGVTY2YKKyogZGVzY3JpcHRpb246ICBzY2FsZWZhY3RvciBkaWZmZXJlbmNlIHJlZHVjdGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGFzc2ltaWxhdGVNdWx0aXBsZVNjZihQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzY2YsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWluU2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqc2ZiRGlzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkVuZXJneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmxvZ1NmYkZvcm1GYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpzZmJOUmVsZXZhbnRMaW5lcykKK3sKKwlXb3JkMzIgc2ZiLCBzdGFydFNmYiwgc3RvcFNmYiwgc2NmTWluLCBzY2ZNYXgsIHNjZkFjdDsKKwlGbGFnICAgcG9zc2libGVSZWdpb25Gb3VuZDsKKwlXb3JkMzIgZGVsdGFTY2ZCaXRzOworCVdvcmQzMiBkZWx0YVNwZWNQZTsKKwlXb3JkMzIgZGVsdGFQZSwgZGVsdGFQZU5ldzsKKwlXb3JkMzIgc2ZiQ250OworCVdvcmQzMiAqc2ZiRGlzdE5ldyA9IHBzeU91dENoYW4tPnNmYkRpc3ROZXc7CisJV29yZDE2ICpzY2ZUbXAgPSBwc3lPdXRDaGFuLT5wcmV2U2NmTGFzdDsKKworCWRlbHRhUGUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzZmJDbnQgPSBwc3lPdXRDaGFuLT5zZmJDbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCisJLyogY2FsYyBtaW4gYW5kIG1heCBzY2FsZmFjdG9ycyAqLworCXNjZk1pbiA9IE1BWF8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlzY2ZNYXggPSBNSU5fMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJZm9yIChzZmI9MDsgc2ZiPHNmYkNudDsgc2ZiKyspIHsKKwkJCisJCWlmIChzY2Zbc2ZiXSAhPSBNSU5fMTYpIHsKKwkJCXNjZk1pbiA9IG1pbihzY2ZNaW4sIHNjZltzZmJdKTsKKwkJCXNjZk1heCA9IG1heChzY2ZNYXgsIHNjZltzZmJdKTsKKwkJfQorCX0KKwkKKwlpZiAoc2NmTWF4ICE9ICBNSU5fMTYpIHsKKwkJCisJCXNjZkFjdCA9IHNjZk1heDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCisJCWRvIHsKKwkJCXNjZkFjdCA9IHNjZkFjdCAtIDE7CisJCQlmb3IgKHNmYj0wOyBzZmI8c2ZiQ250OyBzZmIrKykgeworCQkJCXNjZlRtcFtzZmJdID0gc2NmW3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCX0KKwkJCXN0b3BTZmIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZG8geworCQkJCXNmYiA9IHN0b3BTZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkKKwkJCQl3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBNSU5fMTYgfHwgc2NmW3NmYl0gPD0gc2NmQWN0KSkgeworCQkJCQlzZmIgPSBzZmIgKyAxOworCQkJCX0KKwkJCQlzdGFydFNmYiA9IHNmYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJc2ZiID0gc2ZiICsgMTsKKwkJCQkKKwkJCQl3aGlsZSAoc2ZiIDwgc2ZiQ250ICYmIChzY2Zbc2ZiXSA9PSBNSU5fMTYgfHwgc2NmW3NmYl0gPiBzY2ZBY3QpKSB7CisJCQkJCXNmYiA9IHNmYiArIDE7CisJCQkJfQorCQkJCXN0b3BTZmIgPSBzZmI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkKKwkJCQlwb3NzaWJsZVJlZ2lvbkZvdW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCisJCQkJaWYgKHN0YXJ0U2ZiIDwgc2ZiQ250KSB7CisJCQkJCXBvc3NpYmxlUmVnaW9uRm91bmQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCWZvciAoc2ZiPXN0YXJ0U2ZiOyBzZmI8c3RvcFNmYjsgc2ZiKyspIHsKKwkJCQkJCQorCQkJCQkJaWYgKHNjZltzZmJdIT1NSU5fMTYpIHsKKwkJCQkJCQkKKwkJCQkJCQlpZiAoc2NmQWN0IDwgbWluU2NmW3NmYl0pIHsKKwkJCQkJCQkJcG9zc2libGVSZWdpb25Gb3VuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCQorCQkJCWlmIChwb3NzaWJsZVJlZ2lvbkZvdW5kKSB7IC8qIHJlZ2lvbiBmb3VuZCAqLworCQkJCQkKKwkJCQkJLyogcmVwbGFjZSBzY2ZzIGluIHJlZ2lvbiBieSBzY2ZBY3QgKi8KKwkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworCQkJCQkJCisJCQkJCQlpZiAoc2NmVG1wW3NmYl0hPU1JTl8xNikKKwkJCQkJCQlzY2ZUbXBbc2ZiXSA9IHNjZkFjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCX0KKwkJCQkJCisJCQkJCS8qIGVzdGltYXRlIGNoYW5nZSBpbiBiaXQgZGVtYW5kIGZvciBuZXcgc2NmcyAqLworCQkJCQlkZWx0YVNjZkJpdHMgPSBjb3VudFNjZkJpdHNEaWZmKHNjZixzY2ZUbXAsc2ZiQ250LHN0YXJ0U2ZiLHN0b3BTZmIpOworCQkJCQlkZWx0YVNwZWNQZSA9IGNhbGNTcGVjUGVEaWZmKHNjZiwgc2NmVG1wLCBzZmJDb25zdFBlUGFydCwKKwkJCQkJCWxvZ1NmYkVuZXJneSwgbG9nU2ZiRm9ybUZhY3Rvciwgc2ZiTlJlbGV2YW50TGluZXMsIAorCQkJCQkJc3RhcnRTZmIsIHN0b3BTZmIpOworCQkJCQlkZWx0YVBlTmV3ID0gZGVsdGFQZSArIGRlbHRhU2NmQml0cyArIGRlbHRhU3BlY1BlOworCQkJCQkKKwkJCQkJCisJCQkJCWlmIChkZWx0YVBlTmV3IDwgMTApIHsKKwkJCQkJCVdvcmQzMiBkaXN0T2xkU3VtLCBkaXN0TmV3U3VtOworCQkJCQkJCisJCQkJCQkvKiBxdWFudGl6ZSBhbmQgY2FsYyBzdW0gb2YgbmV3IGRpc3RvcnRpb24gKi8KKwkJCQkJCWRpc3RPbGRTdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQlkaXN0TmV3U3VtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworCQkJCQkJCQorCQkJCQkJCWlmIChzY2ZUbXBbc2ZiXSAhPSBNSU5fMTYpIHsKKwkJCQkJCQkJZGlzdE9sZFN1bSA9IExfYWRkKGRpc3RPbGRTdW0sIHNmYkRpc3Rbc2ZiXSk7CisJCQkJCQkJCQorCQkJCQkJCQlzZmJEaXN0TmV3W3NmYl0gPSBjYWxjU2ZiRGlzdChwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0gKworCQkJCQkJCQkJcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tzZmJdLCAKKwkJCQkJCQkJCShwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW3NmYisxXSAtIHBzeU91dENoYW4tPnNmYk9mZnNldHNbc2ZiXSksCisJCQkJCQkJCQlzY2ZBY3QpOworCQkJCQkJCQkKKwkJCQkJCQkJCisJCQkJCQkJCWlmIChzZmJEaXN0TmV3W3NmYl0gPiBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRbc2ZiXSkgeworCQkJCQkJCQkJZGlzdE5ld1N1bSA9IGRpc3RPbGRTdW0gPDwgMTsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQl9CisJCQkJCQkJCWRpc3ROZXdTdW0gPSBMX2FkZChkaXN0TmV3U3VtLCBzZmJEaXN0TmV3W3NmYl0pOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJaWYgKGRpc3ROZXdTdW0gPCBkaXN0T2xkU3VtKSB7CisJCQkJCQkJZGVsdGFQZSA9IGRlbHRhUGVOZXc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJZm9yIChzZmI9c3RhcnRTZmI7IHNmYjxzdG9wU2ZiOyBzZmIrKykgeworCQkJCQkJCQkKKwkJCQkJCQkJaWYgKHNjZltzZmJdIT1NSU5fMTYpIHsKKwkJCQkJCQkJCXNjZltzZmJdID0gc2NmQWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJCQkJCQlzZmJEaXN0W3NmYl0gPSBzZmJEaXN0TmV3W3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfSAgICAgICAgCisJCQl9IHdoaWxlIChzdG9wU2ZiIDw9IHNmYkNudCk7ICAgICAgCisJCX0gd2hpbGUgKHNjZkFjdCA+IHNjZk1pbik7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEVzdGltYXRlU2NhbGVGYWN0b3JzQ2hhbm5lbAorKiBkZXNjcmlwdGlvbjogIGVzdGltYXRlIHNjYWxlIGZhY3RvcnMgZm9yIG9uZSBjaGFubmVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK0VzdGltYXRlU2NhbGVGYWN0b3JzQ2hhbm5lbChQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICAgICpnbG9iYWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqbG9nU2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICAqbG9nU2ZiRm9ybUZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgKnNmYk5SZWxldmFudExpbmVzKQoreworCVdvcmQzMiBpLCBqOworCVdvcmQzMiB0aHJlc2gsIGVuZXJneTsKKwlXb3JkMzIgZW5lcmd5UGFydCwgdGhyZXNob2xkUGFydDsKKwlXb3JkMzIgc2NmSW50LCBtaW5TY2YsIG1heFNjZiwgbWF4QWxsb3dlZFNjZiwgbGFzdFNmOworCVdvcmQzMiBtYXhTcGVjOworCVdvcmQzMiAqc2ZiRGlzdCA9IHBzeU91dENoYW4tPnNmYkRpc3Q7CisJV29yZDE2ICptaW5TZk1heFF1YW50ID0gcHN5T3V0Q2hhbi0+bWluU2ZNYXhRdWFudDsKKwlXb3JkMTYgKm1pblNjZkNhbGN1bGF0ZWQgPSBwc3lPdXRDaGFuLT5taW5TY2ZDYWxjdWxhdGVkOworCQorCQorCWZvciAoaT0wOyBpPHBzeU91dENoYW4tPnNmYkNudDsgaSsrKSB7CisJCVdvcmQzMiBzYmZ3aXRoLCBzYmZTdGFydDsNCisJCVdvcmQzMiAqbWRjdFNwZWM7CisJCXRocmVzaCA9IHBzeU91dENoYW4tPnNmYlRocmVzaG9sZFtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZW5lcmd5ID0gcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5W2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkNCisJCXNiZlN0YXJ0ID0gcHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsNCisJCXNiZndpdGggPSBwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV0gLSBzYmZTdGFydDsNCisJCW1kY3RTcGVjID0gcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtK3NiZlN0YXJ0Ow0KKwkJCisJCW1heFNwZWMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJLyogbWF4aW11bSBvZiBzcGVjdHJ1bSAqLworCQlmb3IgKGo9c2Jmd2l0aDsgajsgai0tICkgew0KKwkJCVdvcmQzMiBhYnNTcGVjID0gTF9hYnMoKm1kY3RTcGVjKTsgbWRjdFNwZWMrKzsNCisJCQltYXhTcGVjIHw9IGFic1NwZWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJfQorCQkKKwkJLyogc2NmcyB3aXRob3V0IGVuZXJneSBvciB3aXRoIHRocmVzaD5lbmVyZ3kgYXJlIG1hcmtlZCB3aXRoIE1JTl8xNiAqLworCQlzY2ZbaV0gPSBNSU5fMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCW1pblNmTWF4UXVhbnRbaV0gPSBNSU5fMTY7ICAgIAorCQkKKwkJaWYgKChtYXhTcGVjID4gMCkgJiYgKGVuZXJneSA+IHRocmVzaCkpIHsKKwkJCQorCQkJZW5lcmd5UGFydCA9IGxvZ1NmYkZvcm1GYWN0b3JbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXRocmVzaG9sZFBhcnQgPSBpTG9nNCh0aHJlc2gpOyAgCisJCQkvKiAtMjAgPSA0KmxvZzIoNi43NSkgLSAzMiAqLw0KKwkJCXNjZkludCA9ICgodGhyZXNob2xkUGFydCAtIGVuZXJneVBhcnQgLSAyMCkgKiBTQ0FMRV9FU1RJTUFURV9DT0VGKSA+PiAxNTsKKwkJCQorCQkJbWluU2ZNYXhRdWFudFtpXSA9IGlMb2c0KG1heFNwZWMpIC0gNjg7IC8qIDY4ICAtMTYvMypsb2coTUFYX1FVQU5UKzAuNS1sb2dDb24pL2xvZygyKSArIDEgKi8KKwkJCQorCQkJCisJCQlpZiAobWluU2ZNYXhRdWFudFtpXSA+IHNjZkludCkgeworCQkJCXNjZkludCA9IG1pblNmTWF4UXVhbnRbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJfQorCQkJCisJCQkvKiBmaW5kIGJldHRlciBzY2FsZWZhY3RvciB3aXRoIGFuYWx5c2lzIGJ5IHN5bnRoZXNpcyAqLworCQkJc2NmSW50ID0gaW1wcm92ZVNjZihwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0rc2JmU3RhcnQsDQorCQkJCXNiZndpdGgsDQorCQkJCXRocmVzaCwgc2NmSW50LCBtaW5TZk1heFF1YW50W2ldLCANCisJCQkJJnNmYkRpc3RbaV0sICZtaW5TY2ZDYWxjdWxhdGVkW2ldKTsKKwkJCQorCQkJc2NmW2ldID0gc2NmSW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfQorCX0KKwkKKwkKKwkvKiBzY2FsZWZhY3RvciBkaWZmZXJlY2UgcmVkdWN0aW9uICAqLworCXsKKwkJV29yZDE2IHNmYkNvbnN0UGVQYXJ0W01BWF9HUk9VUEVEX1NGQl07CisJCWZvcihpPTA7aTxwc3lPdXRDaGFuLT5zZmJDbnQ7aSsrKSB7CisJCQlzZmJDb25zdFBlUGFydFtpXSA9IE1JTl8xNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJCQorCQlhc3NpbWlsYXRlU2luZ2xlU2NmKHBzeU91dENoYW4sIHNjZiwgCisJCQltaW5TZk1heFF1YW50LCBzZmJEaXN0LCBzZmJDb25zdFBlUGFydCwgbG9nU2ZiRW5lcmd5LAorCQkJbG9nU2ZiRm9ybUZhY3Rvciwgc2ZiTlJlbGV2YW50TGluZXMsIG1pblNjZkNhbGN1bGF0ZWQsIDEpOworCQkKKwkJYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW4sIHNjZiwgCisJCQltaW5TZk1heFF1YW50LCBzZmJEaXN0LCBzZmJDb25zdFBlUGFydCwgbG9nU2ZiRW5lcmd5LAorCQkJbG9nU2ZiRm9ybUZhY3Rvciwgc2ZiTlJlbGV2YW50TGluZXMpOworCX0KKworCS8qIGdldCBtYXggc2NhbGVmYWMgZm9yIGdsb2JhbCBnYWluICovCisJbWF4U2NmID0gTUlOXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJbWluU2NmID0gTUFYXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJZm9yIChpPTA7IGk8cHN5T3V0Q2hhbi0+c2ZiQ250OyBpKyspIHsKKwkJCisJCWlmIChtYXhTY2YgPCBzY2ZbaV0pIHsKKwkJCW1heFNjZiA9IHNjZltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCX0KKwkJCisJCWlmICgoc2NmW2ldICE9IE1JTl8xNikgJiYgKG1pblNjZiA+IHNjZltpXSkpIHsKKwkJCW1pblNjZiA9IHNjZltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCX0KKwl9CisJLyogbGltaXQgc2NmIGRlbHRhICovCisJbWF4QWxsb3dlZFNjZiA9IG1pblNjZiArIE1BWF9TQ0ZfREVMVEE7CisJZm9yKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgeworCQkKKwkJaWYgKChzY2ZbaV0gIT0gTUlOXzE2KSAmJiAobWF4QWxsb3dlZFNjZiA8IHNjZltpXSkpIHsKKwkJCXNjZltpXSA9IG1heEFsbG93ZWRTY2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCX0KKwl9CisJLyogbmV3IG1heFNjZiBpZiBhbnkgc2NmIGhhcyBiZWVuIGxpbWl0ZWQgKi8KKwkKKwlpZiAobWF4QWxsb3dlZFNjZiA8IG1heFNjZikgeworCQltYXhTY2YgPSBtYXhBbGxvd2VkU2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJfQorCQorCS8qIGNhbGMgbG9vcCBzY2FsZWZhY3RvcnMgKi8KKwkKKwlpZiAobWF4U2NmID4gTUlOXzE2KSB7CisJCSpnbG9iYWxHYWluID0gbWF4U2NmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJbGFzdFNmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkKKwkJZm9yKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgeworCQkJCisJCQlpZiAoc2NmW2ldID09IE1JTl8xNikgeworCQkJCXNjZltpXSA9IGxhc3RTZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCS8qIHNldCBiYW5kIGV4cGxpY2l0ZWx5IHRvIHplcm8gKi8KKwkJCQlmb3IgKGo9cHN5T3V0Q2hhbi0+c2ZiT2Zmc2V0c1tpXTsgajxwc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2krMV07IGorKykgeworCQkJCQlwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW1bal0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJc2NmW2ldID0gbWF4U2NmIC0gc2NmW2ldOworCQkJCWxhc3RTZiA9IHNjZltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJfQorCQl9CisJfQorCWVsc2V7CisJCSpnbG9iYWxHYWluID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJLyogc2V0IHNwZWN0cnVtIGV4cGxpY2l0ZWx5IHRvIHplcm8gKi8KKwkJZm9yKGk9MDsgaTxwc3lPdXRDaGFuLT5zZmJDbnQ7IGkrKykgeworCQkJc2NmW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWZvciAoaj1wc3lPdXRDaGFuLT5zZmJPZmZzZXRzW2ldOyBqPHBzeU91dENoYW4tPnNmYk9mZnNldHNbaSsxXTsgaisrKSB7CisJCQkJcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtW2pdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQl9CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQ2FsY0Zvcm1GYWN0b3IKKyogZGVzY3JpcHRpb246ICBlc3RpbWF0ZSBGb3JtIGZhY3RvcnMgZm9yIGFsbCBjaGFubmVsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorQ2FsY0Zvcm1GYWN0b3IoV29yZDE2IGxvZ1NmYkZvcm1GYWN0b3JbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgV29yZDE2IHNmYk5SZWxldmFudExpbmVzW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgIFdvcmQxNiBsb2dTZmJFbmVyZ3lbTUFYX0NIQU5ORUxTXVtNQVhfR1JPVVBFRF9TRkJdLAorICAgICAgICAgICAgICAgUFNZX09VVF9DSEFOTkVMIHBzeU91dENoYW5uZWxbTUFYX0NIQU5ORUxTXSwKKyAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBuQ2hhbm5lbHMpCit7CisJV29yZDE2IGo7CisJCisJZm9yIChqPTA7IGo8bkNoYW5uZWxzOyBqKyspIHsKKwkJQ2FsY0Zvcm1GYWN0b3JDaGFubmVsKGxvZ1NmYkZvcm1GYWN0b3Jbal0sIHNmYk5SZWxldmFudExpbmVzW2pdLCBsb2dTZmJFbmVyZ3lbal0sICZwc3lPdXRDaGFubmVsW2pdKTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogRXN0aW1hdGVTY2FsZUZhY3RvcnMKKyogZGVzY3JpcHRpb246ICBlc3RpbWF0ZSBzY2FsZSBmYWN0b3JzIGZvciBhbGwgY2hhbm5lbAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCBwc3lPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgcWNPdXRDaGFubmVsW01BWF9DSEFOTkVMU10sCisgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgICAgbG9nU2ZiRW5lcmd5W01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBsb2dTZmJGb3JtRmFjdG9yW01BWF9DSEFOTkVMU11bTUFYX0dST1VQRURfU0ZCXSwKKyAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lc1tNQVhfQ0hBTk5FTFNdW01BWF9HUk9VUEVEX1NGQl0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgICAgbkNoYW5uZWxzKQoreworCVdvcmQxNiBqOworCQorCWZvciAoaj0wOyBqPG5DaGFubmVsczsgaisrKSB7CisJCUVzdGltYXRlU2NhbGVGYWN0b3JzQ2hhbm5lbCgmcHN5T3V0Q2hhbm5lbFtqXSwKKwkJCXFjT3V0Q2hhbm5lbFtqXS5zY2YsCisJCQkmKHFjT3V0Q2hhbm5lbFtqXS5nbG9iYWxHYWluKSwKKwkJCWxvZ1NmYkVuZXJneVtqXSwKKwkJCWxvZ1NmYkZvcm1GYWN0b3Jbal0sCisJCQlzZmJOUmVsZXZhbnRMaW5lc1tqXSk7CisJfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3NwcmVhZGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmM3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy9zcHJlYWRpbmcuYwpAQCAtMCwwICsxLDUyIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlzcHJlYWRpbmcuYw0KKw0KKwlDb250ZW50OglTcHJlYWRpbmcgb2YgZW5lcmd5IGZ1bmN0aW9uDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAic3ByZWFkaW5nLmgiDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBTcHJlYWRpbmdNYXgKKyogZGVzY3JpcHRpb246ICBzcHJlYWRpbmcgdGhlIGVuZXJneQorKgkJCQkgaGlnaGVyIGZyZXF1ZW5jaWVzIHRocihuKSA9IG1heCh0aHIobiksIHNoKG4pKnRocihuLTEpKQorKgkJCQkgbG93ZXIgZnJlcXVlbmNpZXMgIHRocihuKSA9IG1heCh0aHIobiksIHNsKG4pKnRocihuKzEpKQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCit2b2lkIFNwcmVhZGluZ01heChjb25zdCBXb3JkMTYgcGJDbnQsDQorICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2ICptYXNrTG93RmFjdG9yLA0KKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiAqbWFza0hpZ2hGYWN0b3IsDQorICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpwYlNwcmVhZGVkRW5lcmd5KQ0KK3sNCisgIFdvcmQzMiBpOw0KKw0KKyAgLyogc2xvcGUgdG8gaGlnaGVyIGZyZXF1ZW5jaWVzICovDQorICBmb3IgKGk9MTsgaTxwYkNudDsgaSsrKSB7DQorICAgIHBiU3ByZWFkZWRFbmVyZ3lbaV0gPSBtYXgocGJTcHJlYWRlZEVuZXJneVtpXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExfbXB5X2xzKHBiU3ByZWFkZWRFbmVyZ3lbaS0xXSwgbWFza0hpZ2hGYWN0b3JbaV0pKTsNCisgIH0NCisgIC8qIHNsb3BlIHRvIGxvd2VyIGZyZXF1ZW5jaWVzICovDQorICBmb3IgKGk9cGJDbnQgLSAyOyBpPj0wOyBpLS0pIHsNCisgICAgcGJTcHJlYWRlZEVuZXJneVtpXSA9IG1heChwYlNwcmVhZGVkRW5lcmd5W2ldLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTF9tcHlfbHMocGJTcHJlYWRlZEVuZXJneVtpKzFdLCBtYXNrTG93RmFjdG9yW2ldKSk7DQorICB9DQorfQ0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3N0YXRfYml0cy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvc3RhdF9iaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2MTA0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvc3JjL3N0YXRfYml0cy5jCkBAIC0wLDAgKzEsMjM3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQlzdGF0X2JpdHMuYw0KKw0KKwlDb250ZW50OglTdGF0aWMgYml0IGNvdW50ZXIgZnVuY3Rpb25zDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInN0YXRfYml0cy5oIgorI2luY2x1ZGUgImJpdGVuYy5oIgorI2luY2x1ZGUgInRucy5oIgorCisKK3R5cGVkZWYgZW51bSB7CisgIFNJX0lEX0JJVFMgICAgICAgICAgICAgICAgPSgzKSwKKyAgU0lfRklMTF9DT1VOVF9CSVRTICAgICAgICA9KDQpLAorICBTSV9GSUxMX0VTQ19DT1VOVF9CSVRTICAgID0oOCksCisgIFNJX0ZJTExfRVhURU5USU9OX0JJVFMgICAgPSg0KSwKKyAgU0lfRklMTF9OSUJCTEVfQklUUyAgICAgICA9KDQpLAorICBTSV9TQ0VfQklUUyAgICAgICAgICAgICAgID0oNCksCisgIFNJX0NQRV9CSVRTICAgICAgICAgICAgICAgPSg1KSwKKyAgU0lfQ1BFX01TX01BU0tfQklUUyAgICAgICA9KDIpICwKKyAgU0lfSUNTX0lORk9fQklUU19MT05HICAgICA9KDErMisxKzYrMSksCisgIFNJX0lDU19JTkZPX0JJVFNfU0hPUlQgICAgPSgxKzIrMSs0KzcpLAorICBTSV9JQ1NfQklUUyAgICAgICAgICAgICAgID0oOCsxKzErMSkKK30gU0lfQklUUzsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IGNvdW50TXNNYXNrQml0cworKiBkZXNjcmlwdGlvbjogICBjb3VudCBtcyBzdGVyZW8gYml0cyBkZW1hbmQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNvdW50TXNNYXNrQml0cyhXb3JkMTYgICBzZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBzZmJQZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgIG1heFNmYlBlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRPT0xTSU5GTyAqdG9vbHNJbmZvKQoreworICBXb3JkMTYgbXNCaXRzLCBzZmJPZmYsIHNmYjsKKyAgbXNCaXRzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAKKyAgc3dpdGNoKHRvb2xzSW5mby0+bXNEaWdlc3QpIHsKKyAgICBjYXNlIE1TX05PTkU6CisgICAgY2FzZSBNU19BTEw6CisgICAgICBicmVhazsKKworICAgIGNhc2UgTVNfU09NRToKKyAgICAgIGZvcihzZmJPZmY9MDsgc2ZiT2ZmPHNmYkNudDsgc2ZiT2ZmKz1zZmJQZXJHcm91cCkKKyAgICAgICAgZm9yKHNmYj0wOyBzZmI8bWF4U2ZiUGVyR3JvdXA7IHNmYisrKQorICAgICAgICAgIG1zQml0cyArPSAxOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuKG1zQml0cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogdG5zQ291bnQKKyogZGVzY3JpcHRpb246ICAgY291bnQgdG5zIGJpdCBkZW1hbmQgIGNvcmUgZnVuY3Rpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IHRuc0NvdW50KFROU19JTkZPICp0bnNJbmZvLCBXb3JkMTYgYmxvY2tUeXBlKQoreworCisgIFdvcmQzMiBpLCBrOworICBGbGFnIHRuc1ByZXNlbnQ7CisgIFdvcmQzMiBudW1PZldpbmRvd3M7CisgIFdvcmQzMiBjb3VudDsKKyAgV29yZDMyIGNvZWZCaXRzOw0KKyAgV29yZDE2ICpwdGNvZWY7CisKKyAgY291bnQgPSAwOyAgICAgICANCisgIAorICBpZiAoYmxvY2tUeXBlID09IDIpCisgICAgbnVtT2ZXaW5kb3dzID0gODsKKyAgZWxzZQorICAgIG51bU9mV2luZG93cyA9IDE7CisgIHRuc1ByZXNlbnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICBmb3IgKGk9MDsgaTxudW1PZldpbmRvd3M7IGkrKykgeworICAgICAKKyAgICBpZiAodG5zSW5mby0+dG5zQWN0aXZlW2ldIT0wKSB7CisgICAgICB0bnNQcmVzZW50ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKyAgIAorICBpZiAodG5zUHJlc2VudCkgeworICAgIC8qIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiovCisgICAgLypjb3VudCArPSAxOyAqLworICAgIGZvciAoaT0wOyBpPG51bU9mV2luZG93czsgaSsrKSB7CisgICAgICAgCisgICAgICBpZiAoYmxvY2tUeXBlID09IDIpCisgICAgICAgIGNvdW50ICs9IDE7CisgICAgICBlbHNlCisgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgCisgICAgICBpZiAodG5zSW5mby0+dG5zQWN0aXZlW2ldKSB7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAKKyAgICAgICAgaWYgKGJsb2NrVHlwZSA9PSAyKSB7CisgICAgICAgICAgY291bnQgKz0gNDsKKyAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGNvdW50ICs9IDY7CisgICAgICAgICAgY291bnQgKz0gNTsKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgIGlmICh0bnNJbmZvLT5vcmRlcltpXSkgeworICAgICAgICAgIGNvdW50ICs9IDE7IC8qZGlyZWN0aW9uKi8KKyAgICAgICAgICBjb3VudCArPSAxOyAvKmNvZWZfY29tcHJlc3Npb24gKi8JCisgICAgICAgICAgIAorICAgICAgICAgIGlmICh0bnNJbmZvLT5jb2VmUmVzW2ldID09IDQpIHsKKyAgICAgICAgICAgIHB0Y29lZiA9IHRuc0luZm8tPmNvZWYgKyBpKlROU19NQVhfT1JERVJfU0hPUlQ7DQorCQkJY29lZkJpdHMgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvcihrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV07IGsrKykgeworICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKChwdGNvZWZba10gPiAzKSB8fCAocHRjb2VmW2tdIDwgLTQpKSB7CisgICAgICAgICAgICAgICAgY29lZkJpdHMgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29lZkJpdHMgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHB0Y29lZiA9IHRuc0luZm8tPmNvZWYgKyBpKlROU19NQVhfT1JERVJfU0hPUlQ7DQorCQkJZm9yKGs9MDsgazx0bnNJbmZvLT5vcmRlcltpXTsgaysrKSB7CisgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICBpZiAoKHB0Y29lZltrXSA+IDEpIHx8IChwdGNvZWZba10gPCAtMikpIHsKKyAgICAgICAgICAgICAgICBjb2VmQml0cyA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChrPTA7IGs8dG5zSW5mby0+b3JkZXJbaV07IGsrKyApIHsKKyAgICAgICAgICAgIGNvdW50ICs9IGNvZWZCaXRzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQ0KKyAgCisgIHJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnRUbnNCaXRzCisqIGRlc2NyaXB0aW9uOiAgIGNvdW50IHRucyBiaXQgZGVtYW5kICAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IGNvdW50VG5zQml0cyhUTlNfSU5GTyAqdG5zSW5mbyxXb3JkMTYgYmxvY2tUeXBlKQoreworICByZXR1cm4odG5zQ291bnQodG5zSW5mbywgYmxvY2tUeXBlKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogY291bnRTdGF0aWNCaXRkZW1hbmQKKyogZGVzY3JpcHRpb246ICAgY291bnQgc3RhdGljIGJpdCBkZW1hbmQgaW5jbHVkZSB0bnMgIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBjb3VudFN0YXRpY0JpdGRlbWFuZChQU1lfT1VUX0NIQU5ORUwgcHN5T3V0Q2hhbm5lbFtNQVhfQ0hBTk5FTFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9PVVRfRUxFTUVOVCAqcHN5T3V0RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsIA0KKwkJCQkJCQlXb3JkMTYgYWR0c1VzZWQpCit7CisgIFdvcmQzMiBzdGF0Qml0czsKKyAgV29yZDMyIGNoOworICAKKyAgc3RhdEJpdHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorICAvKiBpZiBhZHRzIHVzZWQsIGFkZCA1NiBiaXRzICovCisgIGlmKGFkdHNVc2VkKSBzdGF0Qml0cyArPSA1NjsKKworICAgCisgIHN3aXRjaCAoY2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICBzdGF0Qml0cyArPSBTSV9JRF9CSVRTK1NJX1NDRV9CSVRTK1NJX0lDU19CSVRTOworICAgICAgc3RhdEJpdHMgKz0gY291bnRUbnNCaXRzKCYocHN5T3V0Q2hhbm5lbFswXS50bnNJbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKTsKKyAgICAgICAKKyAgICAgIHN3aXRjaChwc3lPdXRDaGFubmVsWzBdLndpbmRvd1NlcXVlbmNlKXsKKyAgICAgICAgY2FzZSBMT05HX1dJTkRPVzoKKyAgICAgICAgY2FzZSBTVEFSVF9XSU5ET1c6CisgICAgICAgIGNhc2UgU1RPUF9XSU5ET1c6CisgICAgICAgICAgc3RhdEJpdHMgKz0gU0lfSUNTX0lORk9fQklUU19MT05HOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNIT1JUX1dJTkRPVzoKKyAgICAgICAgICBzdGF0Qml0cyArPSBTSV9JQ1NfSU5GT19CSVRTX1NIT1JUOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgc3RhdEJpdHMgKz0gU0lfSURfQklUUytTSV9DUEVfQklUUysyKlNJX0lDU19CSVRTOworCisgICAgICBzdGF0Qml0cyArPSBTSV9DUEVfTVNfTUFTS19CSVRTOworICAgICAgc3RhdEJpdHMgKz0gY291bnRNc01hc2tCaXRzKHBzeU91dENoYW5uZWxbMF0uc2ZiQ250LAorCQkJCQkJCQkgIHBzeU91dENoYW5uZWxbMF0uc2ZiUGVyR3JvdXAsCisJCQkJCQkJCSAgcHN5T3V0Q2hhbm5lbFswXS5tYXhTZmJQZXJHcm91cCwKKwkJCQkJCQkJICAmcHN5T3V0RWxlbWVudC0+dG9vbHNJbmZvKTsKKyAgICAgICAKKyAgICAgIHN3aXRjaCAocHN5T3V0Q2hhbm5lbFswXS53aW5kb3dTZXF1ZW5jZSkgeworICAgICAgICBjYXNlIExPTkdfV0lORE9XOgorICAgICAgICBjYXNlIFNUQVJUX1dJTkRPVzoKKyAgICAgICAgY2FzZSBTVE9QX1dJTkRPVzoKKyAgICAgICAgICBzdGF0Qml0cyArPSBTSV9JQ1NfSU5GT19CSVRTX0xPTkc7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0hPUlRfV0lORE9XOgorICAgICAgICAgIHN0YXRCaXRzICs9IFNJX0lDU19JTkZPX0JJVFNfU0hPUlQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBmb3IoY2g9MDsgY2g8MjsgY2grKykKKyAgICAgICAgc3RhdEJpdHMgKz0gY291bnRUbnNCaXRzKCYocHN5T3V0Q2hhbm5lbFtjaF0udG5zSW5mbyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsW2NoXS53aW5kb3dTZXF1ZW5jZSk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBzdGF0Qml0czsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90bnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQ4OTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdG5zLmMKQEAgLTAsMCArMSw5MzIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXRucy5jDQorDQorCUNvbnRlbnQ6CURlZmluaXRpb24gVE5TIHRvb2xzIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJhc3NlcnQuaCIKKyNpbmNsdWRlICJhYWNfcm9tLmgiCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAidG5zLmgiCisjaW5jbHVkZSAidG5zX3BhcmFtLmgiCisjaW5jbHVkZSAicHN5X2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJ0bnNfZnVuYy5oIgorCisjZGVmaW5lIFROU19NT0RJRllfQkVHSU4gICAgICAgICAyNjAwICAvKiBIeiAqLworI2RlZmluZSBSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIgMzgwICAgLyogSHogKi8KKyNkZWZpbmUgVE5TX0dBSU5fVEhSRVNICQkJIDE0MSAgIC8qIDEuNDEqMTAwICovDQorI2RlZmluZSBOT1JNX0NPRUYJCQkJIDB4MDI4ZjVjMjgNCisKK3N0YXRpYyBjb25zdCBXb3JkMzIgVE5TX1BBUkNPUl9USFJFU0ggPSAweDBjY2NjY2NkOyAvKiAwLjEqKDEgPDwgMzEpICovDQorLyogTGltaXQgYmFuZHMgdG8gPiAyLjAga0h6ICovDQorc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01pbkJhbmROdW1iZXJMb25nWzEyXSA9DQoreyAxMSwgMTIsIDE1LCAxNiwgMTcsIDIwLCAyNSwgMjYsIDI0LCAyOCwgMzAsIDMxIH07DQorc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01pbkJhbmROdW1iZXJTaG9ydFsxMl0gPQ0KK3sgMiwgMiwgMiwgMywgMywgNCwgNiwgNiwgOCwgMTAsIDEwLCAxMiB9Ow0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisvKiBNYWluL0xvdyBQcm9maWxlIFROUyBQYXJhbWV0ZXJzICAgICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0bnNNYXhCYW5kc0xvbmdNYWluTG93WzEyXSA9DQoreyAzMSwgMzEsIDM0LCA0MCwgNDIsIDUxLCA0NiwgNDYsIDQyLCA0MiwgNDIsIDM5IH07DQorDQorc3RhdGljIHVuc2lnbmVkIHNob3J0IHRuc01heEJhbmRzU2hvcnRNYWluTG93WzEyXSA9DQoreyA5LCA5LCAxMCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCB9OworCisKK3N0YXRpYyB2b2lkIENhbGNXZWlnaHRlZFNwZWN0cnVtKGNvbnN0IFdvcmQzMiBzcGVjdHJ1bVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHdlaWdodGVkU3BlY3RydW1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiogc2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2KiBzZmJPZmZzZXQsIFdvcmQxNiBscGNTdGFydExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbHBjU3RvcExpbmUsIFdvcmQxNiBscGNTdGFydEJhbmQsV29yZDE2IGxwY1N0b3BCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpwV29yazMyKTsKKworCisKK3ZvaWQgQXV0b0NvcnJlbGF0aW9uKGNvbnN0IFdvcmQxNiBpbnB1dFtdLCBXb3JkMzIgY29ycltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBzYW1wbGVzLCBXb3JkMTYgY29yckNvZWZmKTsKK3N0YXRpYyBXb3JkMTYgQXV0b1RvUGFyY29yKFdvcmQzMiB3b3JrQnVmZmVyW10sIFdvcmQzMiByZWZsQ29lZmZbXSwgV29yZDE2IG51bU9mQ29lZmYpOworCitzdGF0aWMgV29yZDE2IENhbGNUbnNGaWx0ZXIoY29uc3QgV29yZDE2KiBzaWduYWwsIGNvbnN0IFdvcmQzMiB3aW5kb3dbXSwgV29yZDE2IG51bU9mTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IHRuc09yZGVyLCBXb3JkMzIgcGFyY29yW10pOworCisKK3N0YXRpYyB2b2lkIFBhcmNvcjJJbmRleChjb25zdCBXb3JkMzIgcGFyY29yW10sIFdvcmQxNiBpbmRleFtdLCBXb3JkMTYgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZik7CisKK3N0YXRpYyB2b2lkIEluZGV4MlBhcmNvcihjb25zdCBXb3JkMTYgaW5kZXhbXSwgV29yZDMyIHBhcmNvcltdLCBXb3JkMTYgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGJpdHNQZXJDb2VmZik7CisKKworCitzdGF0aWMgdm9pZCBBbmFseXNpc0ZpbHRlckxhdHRpY2UoY29uc3QgV29yZDMyIHNpZ25hbFtdLCBXb3JkMTYgbnVtT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMzIgcGFyQ29lZmZbXSwgV29yZDE2IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBvdXRwdXRbXSk7CisKKworLyoqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEZyZXFUb0JhbmRXaXRoUm91bmRpbmcKKyogZGVzY3JpcHRpb246ICBSZXRyaWV2ZSBpbmRleCBvZiBuZWFyZXN0IGJhbmQgYm9yZGVyCisqIHJldHVybnQ6CQlpbmRleAorKgorKi8KK3N0YXRpYyBXb3JkMTYgRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhXb3JkMzIgZnJlcSwgICAgICAgICAgICAgICAgICAgLyohPCBmcmVxdWVuY3kgaW4gSGVydHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgZnMsICAgICAgICAgICAgICAgICAgICAgLyohPCBTYW1wbGluZyBmcmVxdWVuY3kgaW4gSGVydHogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZCYW5kcywgICAgICAgICAgICAgLyohPCB0b3RhbCBudW1iZXIgb2YgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKmJhbmRTdGFydE9mZnNldCkgLyohPCB0YWJsZSBvZiBiYW5kIGJvcmRlcnMgKi8KK3sKKyAgV29yZDMyIGxpbmVOdW1iZXIsIGJhbmQ7CisgIFdvcmQzMiB0ZW1wLCBzaGlmdDsKKworICAvKiAgYXNzZXJ0KGZyZXEgPj0gMCk7ICAqLworICBzaGlmdCA9IG5vcm1fbChmcyk7CisgIGxpbmVOdW1iZXIgPSAoZXh0cmFjdF9sKGZpeG11bCgoYmFuZFN0YXJ0T2Zmc2V0W251bU9mQmFuZHNdIDw8IDIpLERpdl8zMihmcmVxIDw8IHNoaWZ0LGZzIDw8IHNoaWZ0KSkpICsgMSkgPj4gMTsKKyAKKyAgLyogZnJlcSA+IGZzLzIgKi8KKyAgdGVtcCA9IGxpbmVOdW1iZXIgLSBiYW5kU3RhcnRPZmZzZXRbbnVtT2ZCYW5kc10gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmICh0ZW1wID49IDApCisgICAgcmV0dXJuIG51bU9mQmFuZHM7CisKKyAgLyogZmluZCBiYW5kIHRoZSBsaW5lIG51bWJlciBsaWVzIGluICovCisgIGZvciAoYmFuZD0wOyBiYW5kPG51bU9mQmFuZHM7IGJhbmQrKykgeworICAgIHRlbXAgPSBiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKHRlbXAgPiAwKSBicmVhazsKKyAgfQorCisgIHRlbXAgPSAobGluZU51bWJlciAtIGJhbmRTdGFydE9mZnNldFtiYW5kXSk7CisgIHRlbXAgPSAodGVtcCAtIChiYW5kU3RhcnRPZmZzZXRbYmFuZCArIDFdIC0gbGluZU51bWJlcikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIGlmICggdGVtcCA+IDAgKQorICB7CisgICAgYmFuZCA9IGJhbmQgKyAxOworICB9CisKKyAgcmV0dXJuIGV4dHJhY3RfbChiYW5kKTsKK30KKworCisvKioKKyoKKyogZnVuY3Rpb24gbmFtZTogSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nCisqIGRlc2NyaXB0aW9uOiAgRmlsbCBUTlNfQ09ORklHIHN0cnVjdHVyZSB3aXRoIHNlbnNpYmxlIGNvbnRlbnQgZm9yIGxvbmcgYmxvY2tzCisqIHJldHVybnM6CQkwIGlmIHN1Y2Nlc3MKKyoKKyovCitXb3JkMTYgSW5pdFRuc0NvbmZpZ3VyYXRpb25Mb25nKFdvcmQzMiBiaXRSYXRlLCAgICAgICAgICAvKiE8IGJpdHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHNhbXBsZVJhdGUsICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBjaGFubmVscywgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBjaGFubmVscyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0QywgICAgICAgICAgICAgLyohPCBUTlMgQ29uZmlnIHN0cnVjdCAobW9kaWZpZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OX0xPTkcgKnBDLCAvKiE8IHBzeSBjb25maWcgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBhY3RpdmUpICAgICAgICAgICAgICAvKiE8IHRucyBhY3RpdmUgZmxhZyAqLworeworCisgIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbDsKKyAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB0Qy0+dG5zU3RhcnRGcmVxID0gMTI3NTsKKyAgdEMtPmNvZWZSZXMgICAgICA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIAorICAvKiB0byBhdm9pZCBpbnRlZ2VyIGRpdmlzaW9uICovCisgIGlmICggc3ViKGNoYW5uZWxzLDIpID09IDAgKSB7IAorICAgIGJpdHJhdGVQZXJDaGFubmVsID0gYml0UmF0ZSA+PiAxOyAgICAKKyAgfQorICBlbHNlIHsKKyAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IGJpdFJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorCisgIHRDLT50bnNNYXhTZmIgPSB0bnNNYXhCYW5kc0xvbmdNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07CisKKyAgdEMtPnRuc0FjdGl2ZSA9IGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAvKiBub3cgY2FsYyBiYW5kIGFuZCBsaW5lIGJvcmRlcnMgKi8KKyAgdEMtPnRuc1N0b3BCYW5kID0gbWluKHBDLT5zZmJDbnQsIHRDLT50bnNNYXhTZmIpOworICB0Qy0+dG5zU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdG9wQmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHRDLT50bnNTdGFydEJhbmQgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKHRDLT50bnNTdGFydEZyZXEsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOworCisgIHRDLT50bnNNb2RpZnlCZWdpbkNiID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhUTlNfTU9ESUZZX0JFR0lOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgV29yZDE2KilwQy0+c2ZiT2Zmc2V0KTsKKworICB0Qy0+dG5zUmF0aW9QYXRjaExvd2VzdENiID0gRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhSQVRJT19QQVRDSF9MT1dFUl9CT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDLT5zZmJDbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOworCisKKyAgdEMtPnRuc1N0YXJ0TGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPnRuc1N0YXJ0QmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzTG9uZ01haW5Mb3dbcEMtPnNhbXBSYXRlSWR4XTsKKyAgdEMtPmxwY1N0b3BCYW5kID0gbWluKHRDLT5scGNTdG9wQmFuZCwgcEMtPnNmYkFjdGl2ZSk7CisKKyAgdEMtPmxwY1N0b3BMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RvcEJhbmRdOyAgIA0KKyAgDQorICB0Qy0+bHBjU3RhcnRCYW5kID0gdG5zTWluQmFuZE51bWJlckxvbmdbcEMtPnNhbXBSYXRlSWR4XTsKKworICB0Qy0+bHBjU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgcmV0dXJuKDApOworfQorCisvKioKKyoKKyogZnVuY3Rpb24gbmFtZTogSW5pdFRuc0NvbmZpZ3VyYXRpb25TaG9ydAorKiBkZXNjcmlwdGlvbjogIEZpbGwgVE5TX0NPTkZJRyBzdHJ1Y3R1cmUgd2l0aCBzZW5zaWJsZSBjb250ZW50IGZvciBzaG9ydCBibG9ja3MKKyogcmV0dXJuczoJCTAgaWYgc3VjY2VzcworKgorKi8KK1dvcmQxNiBJbml0VG5zQ29uZmlndXJhdGlvblNob3J0KFdvcmQzMiBiaXRSYXRlLCAgICAgICAgICAgICAgLyohPCBiaXRyYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgc2FtcGxlUmF0ZSwgICAgICAgICAgIC8qITwgU2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTlNfQ09ORklHICp0QywgICAgICAgICAgICAgIC8qITwgVE5TIENvbmZpZyBzdHJ1Y3QgKG1vZGlmaWVkKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT05fU0hPUlQgKnBDLCAvKiE8IHBzeSBjb25maWcgc3RydWN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYWN0aXZlKSAgICAgICAgICAgICAgIC8qITwgdG5zIGFjdGl2ZSBmbGFnICovCit7CisgIFdvcmQzMiBiaXRyYXRlUGVyQ2hhbm5lbDsKKyAgdEMtPm1heE9yZGVyICAgICA9IFROU19NQVhfT1JERVJfU0hPUlQ7CisgIHRDLT50bnNTdGFydEZyZXEgPSAyNzUwOworICB0Qy0+Y29lZlJlcyAgICAgID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIC8qIHRvIGF2b2lkIGludGVnZXIgZGl2aXNpb24gKi8KKyAgaWYgKCBzdWIoY2hhbm5lbHMsMikgPT0gMCApIHsKKyAgICBiaXRyYXRlUGVyQ2hhbm5lbCA9IExfc2hyKGJpdFJhdGUsMSk7ICAgIAorICB9CisgIGVsc2UgeworICAgIGJpdHJhdGVQZXJDaGFubmVsID0gYml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgdEMtPnRuc01heFNmYiA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07CisKKyAgdEMtPnRuc0FjdGl2ZSA9IGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAvKiBub3cgY2FsYyBiYW5kIGFuZCBsaW5lIGJvcmRlcnMgKi8KKyAgdEMtPnRuc1N0b3BCYW5kID0gbWluKHBDLT5zZmJDbnQsIHRDLT50bnNNYXhTZmIpOworICB0Qy0+dG5zU3RvcExpbmUgPSBwQy0+c2ZiT2Zmc2V0W3RDLT50bnNTdG9wQmFuZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHRDLT50bnNTdGFydEJhbmQ9RnJlcVRvQmFuZFdpdGhSb3VuZGluZyh0Qy0+dG5zU3RhcnRGcmVxLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CisKKyAgdEMtPnRuc01vZGlmeUJlZ2luQ2IgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKFROU19NT0RJRllfQkVHSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBXb3JkMTYqKXBDLT5zZmJPZmZzZXQpOworCisgIHRDLT50bnNSYXRpb1BhdGNoTG93ZXN0Q2IgPSBGcmVxVG9CYW5kV2l0aFJvdW5kaW5nKFJBVElPX1BBVENIX0xPV0VSX0JPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEMtPnNmYkNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFdvcmQxNiopcEMtPnNmYk9mZnNldCk7CisKKworICB0Qy0+dG5zU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+dG5zU3RhcnRCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHRDLT5scGNTdG9wQmFuZCA9IHRuc01heEJhbmRzU2hvcnRNYWluTG93W3BDLT5zYW1wUmF0ZUlkeF07DQorCisgIHRDLT5scGNTdG9wQmFuZCA9IG1pbih0Qy0+bHBjU3RvcEJhbmQsIHBDLT5zZmJBY3RpdmUpOworCisgIHRDLT5scGNTdG9wTGluZSA9IHBDLT5zZmJPZmZzZXRbdEMtPmxwY1N0b3BCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgdEMtPmxwY1N0YXJ0QmFuZCA9IHRuc01pbkJhbmROdW1iZXJTaG9ydFtwQy0+c2FtcFJhdGVJZHhdOw0KKworICB0Qy0+bHBjU3RhcnRMaW5lID0gcEMtPnNmYk9mZnNldFt0Qy0+bHBjU3RhcnRCYW5kXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHRDLT50aHJlc2hvbGQgPSBUTlNfR0FJTl9USFJFU0g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgIHJldHVybigwKTsKK30KKworLyoqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFRuc0RldGVjdAorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSBUTlMgZmlsdGVyIGFuZCBkZWNpZGUgb24gVE5TIHVzYWdlIAorKiByZXR1cm5zOgkJMCBpZiBzdWNjZXNzCisqCisqLworV29yZDMyIFRuc0RldGVjdChUTlNfREFUQSogdG5zRGF0YSwgICAgICAgIC8qITwgdG5zIGRhdGEgc3RydWN0dXJlIChtb2RpZmllZCkgKi8KKyAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyB0QywgICAgICAgICAgICAvKiE8IHRucyBjb25maWcgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgIFdvcmQzMiogcFNjcmF0Y2hUbnMsICAgICAgLyohPCBwb2ludGVyIHRvIHNjcmF0Y2ggc3BhY2UgKi8KKyAgICAgICAgICAgICAgICAgY29uc3QgV29yZDE2IHNmYk9mZnNldFtdLCAvKiE8IHNjYWxlZmFjdG9yIHNpemUgYW5kIHRhYmxlICovCisgICAgICAgICAgICAgICAgIFdvcmQzMiogc3BlY3RydW0sICAgICAgICAgLyohPCBzcGVjdHJhbCBkYXRhICovCisgICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwgICAgLyohPCBzdWJibG9jayBudW0gKi8KKyAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSwgICAgICAgICAvKiE8IGJsb2NrdHlwZSAobG9uZyBvciBzaG9ydCkgKi8KKyAgICAgICAgICAgICAgICAgV29yZDMyICogc2ZiRW5lcmd5KSAgICAgICAvKiE8IHNmYi13aXNlIGVuZXJneSAqLworeworCisgIFdvcmQzMiAgcHJlZGljdGlvbkdhaW47CisgIFdvcmQzMiAgdGVtcDsKKyAgV29yZDMyKiBwV29yazMyID0gJnBTY3JhdGNoVG5zW3N1YkJsb2NrTnVtYmVyID4+IDhdOworICBXb3JkMTYqIHBXZWlnaHRlZFNwZWN0cnVtID0gKFdvcmQxNiAqKSZwU2NyYXRjaFRuc1tzdWJCbG9ja051bWJlciA+PiA4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZiAodEMudG5zQWN0aXZlKSB7CisgICAgQ2FsY1dlaWdodGVkU3BlY3RydW0oc3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcFdlaWdodGVkU3BlY3RydW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRW5lcmd5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdGFydExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RvcExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdEMubHBjU3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrMzIpOworCisgICAgdGVtcCA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCB0ZW1wICE9IDAgKSB7CisgICAgICAgIHByZWRpY3Rpb25HYWluID0gQ2FsY1Ruc0ZpbHRlciggJnBXZWlnaHRlZFNwZWN0cnVtW3RDLmxwY1N0YXJ0TGluZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEMuYWNmV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmxwY1N0b3BMaW5lIC0gdEMubHBjU3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucGFyY29yKTsKKworCisgICAgICAgIHRlbXAgPSBwcmVkaWN0aW9uR2FpbiAtIHRDLnRocmVzaG9sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoIHRlbXAgPiAwICkgeworICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiA9IHByZWRpY3Rpb25HYWluOyAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZXsKKworICAgICAgICBwcmVkaWN0aW9uR2FpbiA9IENhbGNUbnNGaWx0ZXIoICZwV2VpZ2h0ZWRTcGVjdHJ1bVt0Qy5scGNTdGFydExpbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRDLmFjZldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5scGNTdG9wTGluZSAtIHRDLmxwY1N0YXJ0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0ucGFyY29yKTsKKworICAgICAgICB0ZW1wID0gcHJlZGljdGlvbkdhaW4gLSB0Qy50aHJlc2hvbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoIHRlbXAgPiAwICkgeworICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAxOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmUgPSAwOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9CisKKyAgICAgICAgdG5zRGF0YS0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnByZWRpY3Rpb25HYWluID0gcHJlZGljdGlvbkdhaW47ICAgICAKKyAgICB9CisKKyAgfQorICBlbHNleworCisgICAgdGVtcCA9IGJsb2NrVHlwZSAtIFNIT1JUX1dJTkRPVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCB0ZW1wICE9IDAgKSB7CisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm8ucHJlZGljdGlvbkdhaW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0udG5zQWN0aXZlID0gMDsgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl0ucHJlZGljdGlvbkdhaW4gPSAwOyAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorCisgIHJldHVybigwKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogVG5zU3luYworKiBkZXNjcmlwdGlvbjogdXBkYXRlIHRucyBwYXJhbWV0ZXIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBUbnNTeW5jKFROU19EQVRBICp0bnNEYXRhRGVzdCwKKyAgICAgICAgICAgICBjb25zdCBUTlNfREFUQSAqdG5zRGF0YVNyYywKKyAgICAgICAgICAgICBjb25zdCBUTlNfQ09ORklHIHRDLAorICAgICAgICAgICAgIGNvbnN0IFdvcmQxNiBzdWJCbG9ja051bWJlciwKKyAgICAgICAgICAgICBjb25zdCBXb3JkMTYgYmxvY2tUeXBlKQoreworICAgVE5TX1NVQkJMT0NLX0lORk8gKnNiSW5mb0Rlc3Q7CisgICBjb25zdCBUTlNfU1VCQkxPQ0tfSU5GTyAqc2JJbmZvU3JjOworICAgV29yZDMyIGksIHRlbXA7CisKKyAgIHRlbXAgPSAgYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBpZiAoIHRlbXAgIT0gMCApIHsKKyAgICAgIHNiSW5mb0Rlc3QgPSAmdG5zRGF0YURlc3QtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHNiSW5mb1NyYyAgPSAmdG5zRGF0YVNyYy0+ZGF0YVJhdy50bnNMb25nLnN1YkJsb2NrSW5mbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIH0KKyAgIGVsc2UgeworICAgICAgc2JJbmZvRGVzdCA9ICZ0bnNEYXRhRGVzdC0+ZGF0YVJhdy50bnNTaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdOyAgICAgICAgICAgICAgICAgICAgIAorICAgICAgc2JJbmZvU3JjICA9ICZ0bnNEYXRhU3JjLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl07ICAgICAgICAgICAgICAgICAgICAgIAorICAgfQorCisgICBpZiAoMTAwKmFic19zKHNiSW5mb0Rlc3QtPnByZWRpY3Rpb25HYWluIC0gc2JJbmZvU3JjLT5wcmVkaWN0aW9uR2FpbikgPAorICAgICAgICgzICogc2JJbmZvRGVzdC0+cHJlZGljdGlvbkdhaW4pKSB7CisgICAgICBzYkluZm9EZXN0LT50bnNBY3RpdmUgPSBzYkluZm9TcmMtPnRuc0FjdGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBmb3IgKCBpPTA7IGk8IHRDLm1heE9yZGVyOyBpKyspIHsKKyAgICAgICAgc2JJbmZvRGVzdC0+cGFyY29yW2ldID0gc2JJbmZvU3JjLT5wYXJjb3JbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0KKyAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFRuc0VuY29kZQorKiBkZXNjcmlwdGlvbjogZG8gVE5TIGZpbHRlcmluZworKiByZXR1cm5zOiAgICAgMCBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1dvcmQxNiBUbnNFbmNvZGUoVE5TX0lORk8qIHRuc0luZm8sICAgICAvKiE8IHRucyBpbmZvIHN0cnVjdHVyZSAobW9kaWZpZWQpICovCisgICAgICAgICAgICAgICAgIFROU19EQVRBKiB0bnNEYXRhLCAgICAgLyohPCB0bnMgZGF0YSBzdHJ1Y3R1cmUgKG1vZGlmaWVkKSAqLworICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZTZmIsICAgICAgIC8qITwgbnVtYmVyIG9mIHNjYWxlIGZhY3RvciBiYW5kcyAqLworICAgICAgICAgICAgICAgICBUTlNfQ09ORklHIHRDLCAgICAgICAgIC8qITwgdG5zIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgV29yZDE2IGxvd1Bhc3NMaW5lLCAgICAvKiE8IGxvd3Bhc3MgbGluZSAqLworICAgICAgICAgICAgICAgICBXb3JkMzIqIHNwZWN0cnVtLCAgICAgIC8qITwgc3BlY3RyYWwgZGF0YSAobW9kaWZpZWQpICovCisgICAgICAgICAgICAgICAgIFdvcmQxNiBzdWJCbG9ja051bWJlciwgLyohPCBzdWJibG9jayBudW0gKi8KKyAgICAgICAgICAgICAgICAgV29yZDE2IGJsb2NrVHlwZSkgICAgICAvKiE8IGJsb2NrdHlwZSAobG9uZyBvciBzaG9ydCkgKi8KK3sKKyAgV29yZDMyIGk7CisgIFdvcmQzMiB0ZW1wX3M7CisgIFdvcmQzMiB0ZW1wOw0KKyAgVE5TX1NVQkJMT0NLX0lORk8gKnBzdWJCbG9ja0luZm87CisKKyAgdGVtcF9zID0gYmxvY2tUeXBlIC0gU0hPUlRfV0lORE9XOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgaWYgKCB0ZW1wX3MgIT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBwc3ViQmxvY2tJbmZvID0gJnRuc0RhdGEtPmRhdGFSYXcudG5zTG9uZy5zdWJCbG9ja0luZm87DQorCWlmIChwc3ViQmxvY2tJbmZvLT50bnNBY3RpdmUgPT0gMCkgeworICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgUGFyY29yMkluZGV4KHBzdWJCbG9ja0luZm8tPnBhcmNvciwKKyAgICAgICAgICAgICAgICAgICB0bnNJbmZvLT5jb2VmLAorICAgICAgICAgICAgICAgICAgIHRDLm1heE9yZGVyLAorICAgICAgICAgICAgICAgICAgIHRDLmNvZWZSZXMpOworCisgICAgICBJbmRleDJQYXJjb3IodG5zSW5mby0+Y29lZiwKKyAgICAgICAgICAgICAgICAgICBwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCisgICAgICAgICAgICAgICAgICAgdEMubWF4T3JkZXIsCisgICAgICAgICAgICAgICAgICAgdEMuY29lZlJlcyk7CisKKyAgICAgIGZvciAoaT10Qy5tYXhPcmRlciAtIDE7IGk+PTA7IGktLSkgIHsKKyAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSAtIFROU19QQVJDT1JfVEhSRVNIOyAgICAgICAgIAorICAgICAgICBpZiAoIHRlbXAgPiAwICkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSArIFROU19QQVJDT1JfVEhSRVNIOyAgICAgICAgIAorICAgICAgICBpZiAoIHRlbXAgPCAwICkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSA9IGkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCisgICAgICB0bnNJbmZvLT50bnNBY3RpdmVbc3ViQmxvY2tOdW1iZXJdID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICBmb3IgKGk9c3ViQmxvY2tOdW1iZXIrMTsgaTxUUkFOU19GQUM7IGkrKykgeworICAgICAgICB0bnNJbmZvLT50bnNBY3RpdmVbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgfQorICAgICAgdG5zSW5mby0+Y29lZlJlc1tzdWJCbG9ja051bWJlcl0gPSB0Qy5jb2VmUmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXSA9IG51bU9mU2ZiIC0gdEMudG5zU3RhcnRCYW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgICAgIEFuYWx5c2lzRmlsdGVyTGF0dGljZSgmKHNwZWN0cnVtW3RDLnRuc1N0YXJ0TGluZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaW4odEMudG5zU3RvcExpbmUsbG93UGFzc0xpbmUpIC0gdEMudG5zU3RhcnRMaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zSW5mby0+b3JkZXJbc3ViQmxvY2tOdW1iZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3BlY3RydW1bdEMudG5zU3RhcnRMaW5lXSkpOworCisgICAgfQorICB9ICAgICAvKiBpZiAoYmxvY2tUeXBlIT1TSE9SVF9XSU5ET1cpICovCisgIGVsc2UgLypzaG9ydCBibG9jayovIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgcHN1YkJsb2NrSW5mbyA9ICZ0bnNEYXRhLT5kYXRhUmF3LnRuc1Nob3J0LnN1YkJsb2NrSW5mb1tzdWJCbG9ja051bWJlcl07DQorCWlmIChwc3ViQmxvY2tJbmZvLT50bnNBY3RpdmUgPT0gMCkgeworICAgICAgdG5zSW5mby0+dG5zQWN0aXZlW3N1YkJsb2NrTnVtYmVyXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgcmV0dXJuKDApOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgUGFyY29yMkluZGV4KHBzdWJCbG9ja0luZm8tPnBhcmNvciwKKyAgICAgICAgICAgICAgICAgICAmdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcipUTlNfTUFYX09SREVSX1NIT1JUXSwKKyAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKKyAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKKworICAgICAgSW5kZXgyUGFyY29yKCZ0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyKlROU19NQVhfT1JERVJfU0hPUlRdLAorICAgICAgICAgICAgICAgICAgIHBzdWJCbG9ja0luZm8tPnBhcmNvciwKKyAgICAgICAgICAgICAgICAgICB0Qy5tYXhPcmRlciwKKyAgICAgICAgICAgICAgICAgICB0Qy5jb2VmUmVzKTsKKyAgICAgIGZvciAoaT0odEMubWF4T3JkZXIgLSAxKTsgaT49MDsgaS0tKSAgeworICAgICAgICB0ZW1wID0gcHN1YkJsb2NrSW5mby0+cGFyY29yW2ldIC0gVE5TX1BBUkNPUl9USFJFU0g7ICAgIAorICAgICAgICAgaWYgKCB0ZW1wID4gMCApCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdGVtcCA9IHBzdWJCbG9ja0luZm8tPnBhcmNvcltpXSArIFROU19QQVJDT1JfVEhSRVNIOyAgICAKKyAgICAgICAgaWYgKCB0ZW1wIDwgMCApCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB0bnNJbmZvLT5vcmRlcltzdWJCbG9ja051bWJlcl0gPSBpICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICAgIHRuc0luZm8tPnRuc0FjdGl2ZVtzdWJCbG9ja051bWJlcl0gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHRuc0luZm8tPmNvZWZSZXNbc3ViQmxvY2tOdW1iZXJdID0gdEMuY29lZlJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHRuc0luZm8tPmxlbmd0aFtzdWJCbG9ja051bWJlcl0gPSBudW1PZlNmYiAtIHRDLnRuc1N0YXJ0QmFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKKyAgICAgIEFuYWx5c2lzRmlsdGVyTGF0dGljZSgmKHNwZWN0cnVtW3RDLnRuc1N0YXJ0TGluZV0pLCAodEMudG5zU3RvcExpbmUgLSB0Qy50bnNTdGFydExpbmUpLAorICAgICAgICAgICAgICAgICBwc3ViQmxvY2tJbmZvLT5wYXJjb3IsCisgICAgICAgICAgICAgICAgIHRuc0luZm8tPm9yZGVyW3N1YkJsb2NrTnVtYmVyXSwKKyAgICAgICAgICAgICAgICAgJihzcGVjdHJ1bVt0Qy50bnNTdGFydExpbmVdKSk7CisKKyAgICB9CisgIH0KKworICByZXR1cm4oMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IG1fcG93Ml9jb3JkaWMKKyogZGVzY3JpcHRpb246IEl0ZXJhdGl2ZSBwb3dlciBmdW5jdGlvbgorKgorKglDYWxjdWxhdGVzIHBvdygyLjAseC0xLjAqKHNjYWxlKzEpKSB3aXRoIElOVF9CSVRTIGJpdCBwcmVjaXNpb24KKyoJdXNpbmcgbW9kaWZpZWQgY29yZGljIGFsZ29yaXRobQorKiByZXR1cm5zOiAgICAgdGhlIHJlc3VsdCBvZiBwb3cyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBXb3JkMzIgbV9wb3cyX2NvcmRpYyhXb3JkMzIgeCwgV29yZDE2IHNjYWxlKQoreworICBXb3JkMzIgazsKKworICBXb3JkMzIgYWNjdV95ID0gMHg0MDAwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgYWNjdV95ID0gTF9zaHIoYWNjdV95LHNjYWxlKTsKKworICBmb3Ioaz0xOyBrPElOVF9CSVRTOyBrKyspIHsKKyAgICBjb25zdCBXb3JkMzIgeiA9IG1fbG9nMl90YWJsZVtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICB3aGlsZShMX3N1Yih4LHopID49IDApIHsKKyAgICAgICAKKyAgICAgIHggPSBMX3N1Yih4LCB6KTsKKyAgICAgIGFjY3VfeSA9IExfYWRkKGFjY3VfeSwgKGFjY3VfeSA+PiBrKSk7CisgICAgfQorICB9CisgIHJldHVybihhY2N1X3kpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBDYWxjV2VpZ2h0ZWRTcGVjdHJ1bQorKiBkZXNjcmlwdGlvbjogQ2FsY3VsYXRlIHdlaWdodGVkIHNwZWN0cnVtIGZvciBMUEMgY2FsY3VsYXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgQ2FsY1dlaWdodGVkU3BlY3RydW0oY29uc3QgV29yZDMyICBzcGVjdHJ1bVtdLCAgICAgICAgIC8qITwgaW5wdXQgc3BlY3RydW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgd2VpZ2h0ZWRTcGVjdHJ1bVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgICpzZmJFbmVyZ3ksICAgICAgICAgIC8qITwgc2ZiIGVuZXJnaWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkMTYgKnNmYk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBscGNTdG9wTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICAgICAgbHBjU3RhcnRCYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAgICAgICBscGNTdG9wQmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAgICAgICAqcFdvcmszMikKK3sKKyAgICAjZGVmaW5lIElOVF9CSVRTX1NDQUwgMTw8KElOVF9CSVRTLzIpCisKKyAgICBXb3JkMzIgaSwgc2ZiLCBzaGlmdDsKKyAgICBXb3JkMzIgbWF4U2hpZnQ7CisgICAgV29yZDMyIHRtcF9zLCB0bXAyX3M7CisgICAgV29yZDMyIHRtcCwgdG1wMjsKKyAgICBXb3JkMzIgbWF4V1M7CisgICAgV29yZDMyIHRuc1NmYk1lYW5bTUFYX1NGQl07ICAgIC8qIGxlbmd0aCBbbHBjU3RvcEJhbmQtbHBjU3RhcnRCYW5kXSBzaG91bGQgYmUgc3VmZmljaWVudCBoZXJlICovCisKKyAgICBtYXhXUyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgICAgLyogY2FsYyAxLjAqMl4tSU5UX0JJVFMvMi9zcXJ0KGVuKSAqLworICAgIGZvciggc2ZiID0gbHBjU3RhcnRCYW5kOyBzZmIgPCBscGNTdG9wQmFuZDsgc2ZiKyspIHsKKworICAgICAgdG1wMiA9IHNmYkVuZXJneVtzZmJdIC0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIGlmKCB0bXAyID4gMCkgeworICAgICAgICB0bXAgPSByc3FydChzZmJFbmVyZ3lbc2ZiXSwgSU5UX0JJVFMpOworCQlpZih0bXAgPiBJTlRfQklUU19TQ0FMKSANCisJCXsNCisJCQlzaGlmdCA9ICBub3JtX2wodG1wKTsNCisJCQl0bXAgPSBEaXZfMzIoIElOVF9CSVRTX1NDQUwgPDwgc2hpZnQsIHRtcCA8PCBzaGlmdCApOyAKKwkJfQorCQllbHNlCisJCXsKKwkJCXRtcCA9IDB4N2ZmZmZmZmY7IAorCQl9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgdG1wID0gMHg3ZmZmZmZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIH0gCisgICAgICB0bnNTZmJNZWFuW3NmYl0gPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorCisgICAgLyogc3ByZWFkIG5vcm1hbGl6ZWQgdmFsdWVzIGZyb20gc2ZicyB0byBsaW5lcyAqLworICAgIHNmYiA9IGxwY1N0YXJ0QmFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHRtcCA9IHRuc1NmYk1lYW5bc2ZiXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGZvciAoIGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspeworICAgICAgdG1wX3MgPSBzZmJPZmZzZXRbc2ZiICsgMV0gLSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgaWYgKCB0bXBfcyA9PSAwICkgeworICAgICAgICBzZmIgPSBzZmIgKyAxOworICAgICAgICB0bXAyX3MgPSBzZmIgKyAxIC0gbHBjU3RvcEJhbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAodG1wMl9zIDw9IDApIHsKKyAgICAgICAgICB0bXAgPSB0bnNTZmJNZWFuW3NmYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcFdvcmszMltpXSA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAvKmZpbHRlciBkb3duKi8KKyAgICBmb3IgKGk9KGxwY1N0b3BMaW5lIC0gMik7IGk+PWxwY1N0YXJ0TGluZTsgaS0tKXsKKyAgICAgICAgcFdvcmszMltpXSA9IChwV29yazMyW2ldICsgcFdvcmszMltpICsgMV0pID4+IDE7CisgICAgfQorICAgIC8qIGZpbHRlciB1cCAqLworICAgIGZvciAoaT0obHBjU3RhcnRMaW5lICsgMSk7IGk8bHBjU3RvcExpbmU7IGkrKyl7CisgICAgICAgcFdvcmszMltpXSA9IChwV29yazMyW2ldICsgcFdvcmszMltpIC0gMV0pID4+IDE7CisgICAgfQorCisgICAgLyogd2VpZ2h0IGFuZCBub3JtYWxpemUgKi8KKyAgICBmb3IgKGk9bHBjU3RhcnRMaW5lOyBpPGxwY1N0b3BMaW5lOyBpKyspeworICAgICAgcFdvcmszMltpXSA9IE1VTEhJR0gocFdvcmszMltpXSwgc3BlY3RydW1baV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIG1heFdTIHw9IExfYWJzKHBXb3JrMzJbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgbWF4U2hpZnQgPSBub3JtX2wobWF4V1MpOworDQorCW1heFNoaWZ0ID0gMTYgLSBtYXhTaGlmdDsNCisgICAgaWYobWF4U2hpZnQgPj0gMCkNCisJew0KKwkJZm9yIChpPWxwY1N0YXJ0TGluZTsgaTxscGNTdG9wTGluZTsgaSsrKXsNCisJCQl3ZWlnaHRlZFNwZWN0cnVtW2ldID0gcFdvcmszMltpXSA+PiBtYXhTaGlmdDsNCisJCX0NCisgICAgfQ0KKwllbHNlDQorCXsNCisJCW1heFNoaWZ0ID0gLW1heFNoaWZ0Ow0KKwkJZm9yIChpPWxwY1N0YXJ0TGluZTsgaTxscGNTdG9wTGluZTsgaSsrKXsNCisJCQl3ZWlnaHRlZFNwZWN0cnVtW2ldID0gc2F0dXJhdGUocFdvcmszMltpXSA8PCBtYXhTaGlmdCk7DQorCQl9DQorCX0KK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IENhbGNUbnNGaWx0ZXIKKyogZGVzY3JpcHRpb246ICBMUEMgY2FsY3VsYXRpb24gZm9yIG9uZSBUTlMgZmlsdGVyCisqIHJldHVybnM6ICAgICAgcHJlZGljdGlvbiBnYWluCisqIGlucHV0OiAgICAgICAgc2lnbmFsIHNwZWN0cnVtLCBhY2Ygd2luZG93LCBuby4gb2Ygc3BlY3RyYWwgbGluZXMsCisqICAgICAgICAgICAgICAgIG1heC4gVE5TIG9yZGVyLCBwdHIuIHRvIHJlZmxlY3Rpb24gb2NlZmZpY2llbnRzCisqIG91dHB1dDogICAgICAgcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKyooaGFsZikgd2luZG93IHNpemUgbXVzdCBiZSBsYXJnZXIgdGhhbiB0bnNPcmRlciAhISoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFdvcmQxNiBDYWxjVG5zRmlsdGVyKGNvbnN0IFdvcmQxNiAqc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmQzMiB3aW5kb3dbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtT2ZMaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdG5zT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHBhcmNvcltdKQoreworICBXb3JkMzIgcGFyY29yV29ya0J1ZmZlclsyKlROU19NQVhfT1JERVIrMV07CisgIFdvcmQzMiBwcmVkaWN0aW9uR2FpbjsKKyAgV29yZDMyIGk7CisgIFdvcmQzMiB0bnNPcmRlclBsdXMxID0gdG5zT3JkZXIgKyAxOworCisgIGFzc2VydCh0bnNPcmRlciA8PSBUTlNfTUFYX09SREVSKTsgICAgICAvKiByZW1vdmUgYXNzZXJ0cyBsYXRlcj8gKGJ0ZykgKi8KKworICBmb3IoaT0wO2k8dG5zT3JkZXI7aSsrKSB7CisgICAgcGFyY29yW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICBBdXRvQ29ycmVsYXRpb24oc2lnbmFsLCBwYXJjb3JXb3JrQnVmZmVyLCBudW1PZkxpbmVzLCB0bnNPcmRlclBsdXMxKTsKKworICAvKiBlYXJseSByZXR1cm4gaWYgc2lnbmFsIGlzIHZlcnkgbG93OiBzaWduYWwgcHJlZGljdGlvbiBvZmYsIHdpdGggemVybyBwYXJjb3IgY29lZmZzICovCisgIGlmIChwYXJjb3JXb3JrQnVmZmVyWzBdID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgcHJlZGljdGlvbkdhaW4gPSBBdXRvVG9QYXJjb3IocGFyY29yV29ya0J1ZmZlciwgcGFyY29yLCB0bnNPcmRlcik7CisKKyAgcmV0dXJuKHByZWRpY3Rpb25HYWluKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IEF1dG9Db3JyZWxhdGlvbgorKiBkZXNjcmlwdGlvbjogIGNhbGMuIGF1dG9jb3JyZWxhdGlvbiAoYWNmKQorKiByZXR1cm5zOiAgICAgIC0KKyogaW5wdXQ6ICAgICAgICBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBpbnB1dCB2YWx1ZXMsIG5vLiBvZiBhY2YgdmFsdWVzCisqIG91dHB1dDogICAgICAgYWNmIHZhbHVlcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIEFSTVY1RQ0KK3ZvaWQgQXV0b0NvcnJlbGF0aW9uKGNvbnN0IFdvcmQxNgkJIGlucHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICAgICAgIGNvcnJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAgICAgY29yckNvZWZmKSB7CisgIFdvcmQzMiBpLCBqLCBpc2FtcGxlczsKKyAgV29yZDMyIGFjY3U7CisgIFdvcmQzMiBzY2Y7CisKKyAgc2NmID0gMTAgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisNCisgIGlzYW1wbGVzID0gc2FtcGxlczsKKyAgLyogY2FsYyBmaXJzdCBjb3JyQ29lZjogIFJbMF0gPSBzdW0geyB0W2ldICogdFtpXSB9IDsgaSA9IDAuLk4tMSAqLworICBhY2N1ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKKyAgICBhY2N1ID0gTF9hZGQoYWNjdSwgKChpbnB1dFtqXSAqIGlucHV0W2pdKSA+PiBzY2YpKTsNCisgIH0KKyAgY29yclswXSA9IGFjY3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAvKiBlYXJseSB0ZXJtaW5hdGlvbiBpZiBhbGwgY29yciBjb2VmZnMgYXJlIGxpa2VseSBnb2luZyB0byBiZSB6ZXJvICovCisgIGlmKGNvcnJbMF0gPT0gMCkgcmV0dXJuIDsKKworICAvKiBjYWxjIGFsbCBvdGhlciBjb3JyQ29lZjogIFJbal0gPSBzdW0geyB0W2ldICogdFtpK2pdIH0gOyBpID0gMC4uKE4tai0xKSwgaj0xLi5wICovCisgIGZvcihpPTE7IGk8Y29yckNvZWZmOyBpKyspIHsKKyAgICBpc2FtcGxlcyA9IGlzYW1wbGVzIC0gMTsKKyAgICBhY2N1ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBmb3Ioaj0wOyBqPGlzYW1wbGVzOyBqKyspIHsKKyAgICAgIGFjY3UgPSBMX2FkZChhY2N1LCAoKGlucHV0W2pdICogaW5wdXRbaitpXSkgPj4gc2NmKSk7DQorICAgIH0KKyAgICBjb3JyW2ldID0gYWNjdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorfSAgICAKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogQXV0b1RvUGFyY29yCisqIGRlc2NyaXB0aW9uOiAgY29udmVyc2lvbiBhdXRvY29ycmVsYXRpb24gdG8gcmVmbGVjdGlvbiBjb2VmZmljaWVudHMKKyogcmV0dXJuczogICAgICBwcmVkaWN0aW9uIGdhaW4KKyogaW5wdXQ6ICAgICAgICA8b3JkZXIrMT4gaW5wdXQgdmFsdWVzLCBuby4gb2Ygb3V0cHV0IHZhbHVlcyAoPW9yZGVyKSwKKyogICAgICAgICAgICAgICBwdHIuIHRvIHdvcmtidWZmZXIgKHJlcXVpcmVkIHNpemU6IDIqb3JkZXIpCisqIG91dHB1dDogICAgICAgPG9yZGVyPiByZWZsZWN0aW9uIGNvZWZmaWNpZW50cworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgV29yZDE2IEF1dG9Ub1BhcmNvcihXb3JkMzIgd29ya0J1ZmZlcltdLCBXb3JkMzIgcmVmbENvZWZmW10sIFdvcmQxNiBudW1PZkNvZWZmKSB7CisKKyAgV29yZDMyIGksIGosIHNoaWZ0OworICBXb3JkMzIgKnBXb3JrQnVmZmVyOyAvKiB0ZW1wIHBvaW50ZXIgKi8KKyAgV29yZDMyIHByZWRpY3Rpb25HYWluID0gMDsKKyAgV29yZDMyIG51bSwgZGVub207CisgIFdvcmQzMiB0ZW1wLCB3b3JrQnVmZmVyMDsKKyAgIAorCisgIG51bSA9IHdvcmtCdWZmZXJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIHRlbXAgPSB3b3JrQnVmZmVyW251bU9mQ29lZmZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgZm9yKGk9MDsgaTxudW1PZkNvZWZmLTE7IGkrKykgeworICAgIHdvcmtCdWZmZXJbaSArIG51bU9mQ29lZmZdID0gd29ya0J1ZmZlcltpICsgMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisgIHdvcmtCdWZmZXJbaSArIG51bU9mQ29lZmZdID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgCisgIGZvcihpPTA7IGk8bnVtT2ZDb2VmZjsgaSsrKSB7CisgICAgV29yZDMyIHJlZmM7CisKKyAgICAgCisgICAgaWYgKHdvcmtCdWZmZXJbMF0gPCBMX2Ficyh3b3JrQnVmZmVyW2kgKyBudW1PZkNvZWZmXSkpIHsKKyAgICAgIHJldHVybiAwIDsKKyAgICB9CisJc2hpZnQgPSBub3JtX2wod29ya0J1ZmZlclswXSk7DQorCXdvcmtCdWZmZXIwID0gRGl2XzMyKDEgPDwgc2hpZnQsIHdvcmtCdWZmZXJbMF0gPDwgc2hpZnQpOworICAgIC8qIGNhbGN1bGF0ZSByZWZjID0gLXdvcmtCdWZmZXJbbnVtT2ZDb2VmZitpXSAvIHdvcmtCdWZmZXJbMF07IC0xIDw9IHJlZmMgPCAxICovCisJcmVmYyA9IExfbmVnYXRlKGZpeG11bCh3b3JrQnVmZmVyW251bU9mQ29lZmYgKyBpXSwgd29ya0J1ZmZlcjApKTsKKworICAgIHJlZmxDb2VmZltpXSA9IHJlZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBwV29ya0J1ZmZlciA9ICYod29ya0J1ZmZlcltudW1PZkNvZWZmXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIGZvcihqPWk7IGo8bnVtT2ZDb2VmZjsgaisrKSB7CisgICAgICBXb3JkMzIgYWNjdTEsIGFjY3UyOworICAgICAgYWNjdTEgPSBMX2FkZChwV29ya0J1ZmZlcltqXSwgZml4bXVsKHJlZmMsIHdvcmtCdWZmZXJbaiAtIGldKSk7CisgICAgICBhY2N1MiA9IExfYWRkKHdvcmtCdWZmZXJbaiAtIGldLCBmaXhtdWwocmVmYywgcFdvcmtCdWZmZXJbal0pKTsKKyAgICAgIHBXb3JrQnVmZmVyW2pdID0gYWNjdTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIHdvcmtCdWZmZXJbaiAtIGldID0gYWNjdTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KKworICBkZW5vbSA9IE1VTEhJR0god29ya0J1ZmZlclswXSwgTk9STV9DT0VGKTsKKyAgIAorICBpZiAoZGVub20gIT0gMCkgeworICAgIFdvcmQzMiB0ZW1wOw0KKwlzaGlmdCA9IG5vcm1fbChkZW5vbSk7DQorCXRlbXAgPSBEaXZfMzIoMSA8PCBzaGlmdCwgZGVub20gPDwgc2hpZnQpOworICAgIHByZWRpY3Rpb25HYWluID0gZml4bXVsKG51bSwgdGVtcCk7CisgIH0KKworICByZXR1cm4gZXh0cmFjdF9sKHByZWRpY3Rpb25HYWluKTsKK30KKworCisKK3N0YXRpYyBXb3JkMTYgU2VhcmNoMyhXb3JkMzIgcGFyY29yKQoreworICBXb3JkMzIgaW5kZXggPSAwOworICBXb3JkMzIgaTsKKyAgV29yZDMyIHRlbXA7CisgICAKKyAgZm9yIChpPTA7aTw4O2krKykgeworICAgIHRlbXAgPSBMX3N1YiggcGFyY29yLCB0bnNDb2VmZjNCb3JkZXJzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICh0ZW1wID4gMCkKKyAgICAgIGluZGV4PWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICByZXR1cm4gZXh0cmFjdF9sKGluZGV4IC0gNCk7Cit9CisKK3N0YXRpYyBXb3JkMTYgU2VhcmNoNChXb3JkMzIgcGFyY29yKQoreworICBXb3JkMzIgaW5kZXggPSAwOworICBXb3JkMzIgaTsKKyAgV29yZDMyIHRlbXA7CisgICAKKworICBmb3IgKGk9MDtpPDE2O2krKykgeworICAgIHRlbXAgPSBMX3N1YihwYXJjb3IsIHRuc0NvZWZmNEJvcmRlcnNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmICh0ZW1wID4gMCkKKyAgICAgIGluZGV4PWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQorICByZXR1cm4gZXh0cmFjdF9sKGluZGV4IC0gOCk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb25uYW1lOiBQYXJjb3IySW5kZXgKKyogZGVzY3JpcHRpb246ICBxdWFudGl6YXRpb24gaW5kZXggZm9yIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFBhcmNvcjJJbmRleChjb25zdCBXb3JkMzIgcGFyY29yW10sICAgLyohPCBwYXJjb3IgY29lZmZpY2llbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGluZGV4W10sICAgICAgICAgIC8qITwgcXVhbnRpemVkIGNvZWZmIGluZGljZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb3JkZXIsICAgICAgICAgICAgLyohPCBmaWx0ZXIgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKSB7ICAgLyohPCBxdWFudGl6ZXIgcmVzb2x1dGlvbiAqLworICBXb3JkMzIgaTsKKyAgV29yZDMyIHRlbXA7CisKKyAgZm9yKGk9MDsgaTxvcmRlcjsgaSsrKSB7CisgICAgdGVtcCA9IGJpdHNQZXJDb2VmZiAtIDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAodGVtcCA9PSAwKSB7CisgICAgICBpbmRleFtpXSA9IFNlYXJjaDMocGFyY29yW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfSAKKyAgICBlbHNlIHsKKyAgICAgIGluZGV4W2ldID0gU2VhcmNoNChwYXJjb3JbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9ubmFtZTogSW5kZXgyUGFyY29yCisqIGRlc2NyaXB0aW9uOiAgSW52ZXJzZSBxdWFudGl6YXRpb24gZm9yIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEluZGV4MlBhcmNvcihjb25zdCBXb3JkMTYgaW5kZXhbXSwgIC8qITwgcXVhbnRpemVkIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQzMiBwYXJjb3JbXSwgICAgICAgLyohPCBwdHIuIHRvIHJlZmxlY3Rpb24gY29lZmZpY2llbnRzIChvdXRwdXQpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9yZGVyLCAgICAgICAgICAvKiE8IG5vLiBvZiBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgYml0c1BlckNvZWZmKSAgIC8qITwgcXVhbnRpemVyIHJlc29sdXRpb24gKi8KK3sKKyAgV29yZDMyIGk7CisgIFdvcmQzMiB0ZW1wOworCisgIGZvciAoaT0wOyBpPG9yZGVyOyBpKyspIHsKKyAgICB0ZW1wID0gYml0c1BlckNvZWZmIC0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIHRlbXAgPT0gMCApIHsKKyAgICAgICAgcGFyY29yW2ldID0gdG5zQ29lZmY0W2luZGV4W2ldICsgOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBhcmNvcltpXSA9IHRuc0NvZWZmM1tpbmRleFtpXSArIDRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgfQorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbm5hbWU6IEZJUkxhdHRpY2UKKyogZGVzY3JpcHRpb246ICBpbiBwbGFjZSBsYXR0aWNlIGZpbHRlcmluZyBvZiBzcGVjdHJhbCBkYXRhCisqIHJldHVybnM6CQlwb2ludGVyIHRvIG1vZGlmaWVkIGRhdGEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFdvcmQzMiBGSVJMYXR0aWNlKFdvcmQxNiBvcmRlciwgICAgICAgICAgIC8qITwgZmlsdGVyIG9yZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIHgsICAgICAgICAgICAgICAgLyohPCBzcGVjdHJhbCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyICpzdGF0ZV9wYXIsICAgICAgLyohPCBmaWx0ZXIgc3RhdGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZDMyICpjb2VmX3BhcikgLyohPCBmaWx0ZXIgY29lZmZpY2llbnRzICovCit7CisgICBXb3JkMzIgaTsKKyAgIFdvcmQzMiBhY2N1LHRtcCx0bXBTYXZlOworCisgICB4ID0geCA+PiAxOworICAgdG1wU2F2ZSA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICBmb3IgKGk9MDsgaTwob3JkZXIgLSAxKTsgaSsrKSB7CisKKyAgICAgdG1wID0gTF9hZGQoZml4bXVsKGNvZWZfcGFyW2ldLCB4KSwgc3RhdGVfcGFyW2ldKTsKKyAgICAgeCAgID0gTF9hZGQoZml4bXVsKGNvZWZfcGFyW2ldLCBzdGF0ZV9wYXJbaV0pLCB4KTsKKworICAgICBzdGF0ZV9wYXJbaV0gPSB0bXBTYXZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICB0bXBTYXZlID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9CisKKyAgLyogbGFzdCBzdGFnZTogb25seSBuZWVkIGhhbGYgb3BlcmF0aW9ucyAqLworICBhY2N1ID0gZml4bXVsKHN0YXRlX3BhcltvcmRlciAtIDFdLCBjb2VmX3Bhclsob3JkZXIgLSAxKV0pOworICBzdGF0ZV9wYXJbKG9yZGVyIC0gMSldID0gdG1wU2F2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgeCA9IExfYWRkKGFjY3UsIHgpOworICB4ID0gTF9hZGQoeCwgeCk7CisKKyAgcmV0dXJuIHg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbm5hbWU6IEFuYWx5c2lzRmlsdGVyTGF0dGljZQorKiBkZXNjcmlwdGlvbjogIGZpbHRlcnMgc3BlY3RyYWwgbGluZXMgd2l0aCBUTlMgZmlsdGVyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIEFuYWx5c2lzRmlsdGVyTGF0dGljZShjb25zdCAgV29yZDMyIHNpZ25hbFtdLCAgLyohPCBpbnB1dCBzcGVjdHJ1bSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1PZkxpbmVzLCAgICAgICAvKiE8IG5vLiBvZiBsaW5lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICBXb3JkMzIgcGFyQ29lZmZbXSwvKiE8IFBBUkMgY29lZmZpY2llbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG9yZGVyLCAgICAgICAgICAgIC8qITwgZmlsdGVyIG9yZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDMyIG91dHB1dFtdKSAgICAgICAgIC8qITwgZmlsdGVyZWQgc2lnbmFsIHZhbHVlcyAqLworeworCisgIFdvcmQzMiBzdGF0ZV9wYXJbVE5TX01BWF9PUkRFUl07CisgIFdvcmQzMiBqOworCisgIGZvciAoIGo9MDsgajxUTlNfTUFYX09SREVSOyBqKysgKSB7CisgICAgc3RhdGVfcGFyW2pdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgIH0KKworICBmb3Ioaj0wOyBqPG51bU9mTGluZXM7IGorKykgeworICAgIG91dHB1dFtqXSA9IEZJUkxhdHRpY2Uob3JkZXIsc2lnbmFsW2pdLHN0YXRlX3BhcixwYXJDb2VmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbm5hbWU6IEFwcGx5VG5zTXVsdFRhYmxlVG9SYXRpb3MKKyogZGVzY3JpcHRpb246ICBDaGFuZ2UgdGhyZXNob2xkcyBhY2NvcmRpbmcgdG8gdG5zCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQXBwbHlUbnNNdWx0VGFibGVUb1JhdGlvcyhXb3JkMTYgc3RhcnRDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgc3RvcENiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFROU19TVUJCTE9DS19JTkZPIHN1YkluZm8sIC8qITwgVE5TIHN1YmJsb2NrIGluZm8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMzIgKnRocmVzaG9sZHMpICAgICAgICAvKiE8IHRocmVzaG9sZHMgKG1vZGlmaWVkKSAqLworeworICBXb3JkMzIgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBpZiAoc3ViSW5mby50bnNBY3RpdmUpIHsKKyAgICBmb3IoaT1zdGFydENiOyBpPHN0b3BDYjsgaSsrKSB7CisgICAgICAvKiB0aHJlc2hvbGRzW2ldICogMC4yNSAqLworICAgICAgdGhyZXNob2xkc1tpXSA9ICh0aHJlc2hvbGRzW2ldID4+IDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL3NyYy90cmFuc2Zvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjE3YjVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9zcmMvdHJhbnNmb3JtLmMKQEAgLTAsMCArMSw2NzIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXRyYW5zZm9ybS5jDQorDQorCUNvbnRlbnQ6CU1EQ1QgVHJhbnNmb3JtIGZ1bmN0aW9uc3MNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAicHN5X2NvbnN0LmgiCisjaW5jbHVkZSAidHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiYWFjX3JvbS5oIgorDQorDQorI2RlZmluZSBMU19UUkFOUyAoKEZSQU1FX0xFTl9MT05HLUZSQU1FX0xFTl9TSE9SVCkvMikgLyogNDQ4ICovDQorI2RlZmluZSBTUVJUMV8yIDB4NWE4Mjc5OWEJLyogc3FydCgxLzIpIGluIFEzMSAqLw0KKyNkZWZpbmUgc3dhcDIocDAscDEpIFwNCisJdCA9IHAwOyB0MSA9ICooJihwMCkrMSk7CVwNCisJcDAgPSBwMTsgKigmKHAwKSsxKSA9ICooJihwMSkrMSk7CVwNCisJcDEgPSB0OyAqKCYocDEpKzEpID0gdDEJDQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFNodWZmbGUKKyogZGVzY3JpcHRpb246ICBTaHVmZmxlIHBvaW50cyBwcmVwYXJlZCBmdW5jdGlvbiBmb3IgZmZ0CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgU2h1ZmZsZShpbnQgKmJ1ZiwgaW50IG51bSwgY29uc3QgdW5zaWduZWQgY2hhciogYml0VGFiKQ0KK3sNCisgICAgaW50ICpwYXJ0MCwgKnBhcnQxOw0KKwlpbnQgaSwgajsNCisJaW50IHQsIHQxOw0KKw0KKwlwYXJ0MCA9IGJ1ZjsNCisgICAgcGFydDEgPSBidWYgKyBudW07DQorCQ0KKwl3aGlsZSAoKGkgPSAqYml0VGFiKyspICE9IDApIHsNCisgICAgICAgIGogPSAqYml0VGFiKys7DQorDQorICAgICAgICBzd2FwMihwYXJ0MFs0KmkrMF0sIHBhcnQwWzQqaiswXSk7CQ0KKyAgICAgICAgc3dhcDIocGFydDBbNCppKzJdLCBwYXJ0MVs0KmorMF0pOwkNCisgICAgICAgIHN3YXAyKHBhcnQxWzQqaSswXSwgcGFydDBbNCpqKzJdKTsJDQorICAgICAgICBzd2FwMihwYXJ0MVs0KmkrMl0sIHBhcnQxWzQqaisyXSk7CQ0KKyAgICB9DQorDQorICAgIGRvIHsNCisgICAgICAgIHN3YXAyKHBhcnQwWzQqaSsyXSwgcGFydDFbNCppKzBdKTsJDQorICAgIH0gd2hpbGUgKChpID0gKmJpdFRhYisrKSAhPSAwKTsNCit9DQorDQorI2lmICFkZWZpbmVkKEFSTVY1RSkgJiYgIWRlZmluZWQoQVJNVjdOZW9uKQ0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFJhZGl4NEZpcnN0CisqIGRlc2NyaXB0aW9uOiAgUmFkaXggNCBwb2ludCBwcmVwYXJlZCBmdW5jdGlvbiBmb3IgZmZ0CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB2b2lkIFJhZGl4NEZpcnN0KGludCAqYnVmLCBpbnQgbnVtKQ0KK3sNCisgICAgaW50IHIwLCByMSwgcjIsIHIzOw0KKwlpbnQgcjQsIHI1LCByNiwgcjc7DQorCQ0KKwlmb3IgKDsgbnVtICE9IDA7IG51bS0tKSANCisJew0KKwkJcjAgPSBidWZbMF0gKyBidWZbMl07DQorCQlyMSA9IGJ1ZlsxXSArIGJ1ZlszXTsNCisJCXIyID0gYnVmWzBdIC0gYnVmWzJdOw0KKwkJcjMgPSBidWZbMV0gLSBidWZbM107DQorCQlyNCA9IGJ1Zls0XSArIGJ1Zls2XTsNCisJCXI1ID0gYnVmWzVdICsgYnVmWzddOw0KKwkJcjYgPSBidWZbNF0gLSBidWZbNl07DQorCQlyNyA9IGJ1Zls1XSAtIGJ1Zls3XTsNCisNCisJCWJ1ZlswXSA9IHIwICsgcjQ7DQorCQlidWZbMV0gPSByMSArIHI1Ow0KKwkJYnVmWzRdID0gcjAgLSByNDsNCisJCWJ1Zls1XSA9IHIxIC0gcjU7DQorCQlidWZbMl0gPSByMiArIHI3Ow0KKwkJYnVmWzNdID0gcjMgLSByNjsNCisJCWJ1Zls2XSA9IHIyIC0gcjc7DQorCQlidWZbN10gPSByMyArIHI2Ow0KKw0KKwkJYnVmICs9IDg7DQorCX0NCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFJhZGl4OEZpcnN0CisqIGRlc2NyaXB0aW9uOiAgUmFkaXggOCBwb2ludCBwcmVwYXJlZCBmdW5jdGlvbiBmb3IgZmZ0CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB2b2lkIFJhZGl4OEZpcnN0KGludCAqYnVmLCBpbnQgbnVtKQ0KK3sNCisgICBpbnQgcjAsIHIxLCByMiwgcjM7DQorICAgaW50IGkwLCBpMSwgaTIsIGkzOw0KKyAgIGludCByNCwgcjUsIHI2LCByNzsNCisgICBpbnQgaTQsIGk1LCBpNiwgaTc7DQorICAgaW50IHQwLCB0MSwgdDIsIHQzOw0KKw0KKwlmb3IgKCA7IG51bSAhPSAwOyBudW0tLSkgDQorCXsNCisJCXIwID0gYnVmWzBdICsgYnVmWzJdOw0KKwkJaTAgPSBidWZbMV0gKyBidWZbM107DQorCQlyMSA9IGJ1ZlswXSAtIGJ1ZlsyXTsNCisJCWkxID0gYnVmWzFdIC0gYnVmWzNdOw0KKwkJcjIgPSBidWZbNF0gKyBidWZbNl07DQorCQlpMiA9IGJ1Zls1XSArIGJ1Zls3XTsNCisJCXIzID0gYnVmWzRdIC0gYnVmWzZdOw0KKwkJaTMgPSBidWZbNV0gLSBidWZbN107DQorDQorCQlyNCA9IChyMCArIHIyKSA+PiAxOw0KKwkJaTQgPSAoaTAgKyBpMikgPj4gMTsNCisJCXI1ID0gKHIwIC0gcjIpID4+IDE7DQorCQlpNSA9IChpMCAtIGkyKSA+PiAxOw0KKwkJcjYgPSAocjEgLSBpMykgPj4gMTsNCisJCWk2ID0gKGkxICsgcjMpID4+IDE7DQorCQlyNyA9IChyMSArIGkzKSA+PiAxOw0KKwkJaTcgPSAoaTEgLSByMykgPj4gMTsNCisNCisJCXIwID0gYnVmWyA4XSArIGJ1ZlsxMF07DQorCQlpMCA9IGJ1ZlsgOV0gKyBidWZbMTFdOw0KKwkJcjEgPSBidWZbIDhdIC0gYnVmWzEwXTsNCisJCWkxID0gYnVmWyA5XSAtIGJ1ZlsxMV07DQorCQlyMiA9IGJ1ZlsxMl0gKyBidWZbMTRdOw0KKwkJaTIgPSBidWZbMTNdICsgYnVmWzE1XTsNCisJCXIzID0gYnVmWzEyXSAtIGJ1ZlsxNF07DQorCQlpMyA9IGJ1ZlsxM10gLSBidWZbMTVdOw0KKw0KKwkJdDAgPSAocjAgKyByMikgPj4gMTsNCisJCXQxID0gKGkwICsgaTIpID4+IDE7DQorCQl0MiA9IChyMCAtIHIyKSA+PiAxOw0KKwkJdDMgPSAoaTAgLSBpMikgPj4gMTsNCisNCisJCWJ1ZlsgMF0gPSByNCArIHQwOw0KKwkJYnVmWyAxXSA9IGk0ICsgdDE7DQorCQlidWZbIDhdID0gcjQgLSB0MDsNCisJCWJ1ZlsgOV0gPSBpNCAtIHQxOw0KKwkJYnVmWyA0XSA9IHI1ICsgdDM7DQorCQlidWZbIDVdID0gaTUgLSB0MjsNCisJCWJ1ZlsxMl0gPSByNSAtIHQzOw0KKwkJYnVmWzEzXSA9IGk1ICsgdDI7DQorDQorCQlyMCA9IHIxIC0gaTM7DQorCQlpMCA9IGkxICsgcjM7DQorCQlyMiA9IHIxICsgaTM7DQorCQlpMiA9IGkxIC0gcjM7DQorDQorCQl0MCA9IE1VTEhJR0goU1FSVDFfMiwgcjAgLSBpMCk7DQorCQl0MSA9IE1VTEhJR0goU1FSVDFfMiwgcjAgKyBpMCk7DQorCQl0MiA9IE1VTEhJR0goU1FSVDFfMiwgcjIgLSBpMik7DQorCQl0MyA9IE1VTEhJR0goU1FSVDFfMiwgcjIgKyBpMik7DQorDQorCQlidWZbIDZdID0gcjYgLSB0MDsNCisJCWJ1ZlsgN10gPSBpNiAtIHQxOw0KKwkJYnVmWzE0XSA9IHI2ICsgdDA7DQorCQlidWZbMTVdID0gaTYgKyB0MTsNCisJCWJ1ZlsgMl0gPSByNyArIHQzOw0KKwkJYnVmWyAzXSA9IGk3IC0gdDI7DQorCQlidWZbMTBdID0gcjcgLSB0MzsNCisJCWJ1ZlsxMV0gPSBpNyArIHQyOw0KKw0KKwkJYnVmICs9IDE2Ow0KKwl9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBSYWRpeDRGRlQKKyogZGVzY3JpcHRpb246ICBSYWRpeCA0IHBvaW50IGZmdCBjb3JlIGZ1bmN0aW9uCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB2b2lkIFJhZGl4NEZGVChpbnQgKmJ1ZiwgaW50IG51bSwgaW50IGJnbiwgaW50ICp0d2lkVGFiKQ0KK3sNCisJaW50IHIwLCByMSwgcjIsIHIzOw0KKwlpbnQgcjQsIHI1LCByNiwgcjc7DQorCWludCB0MCwgdDE7DQorCWludCBzaW54LCBjb3N4Ow0KKwlpbnQgaSwgaiwgc3RlcDsNCisJaW50ICp4cHRyLCAqY3NwdHI7DQorDQorCWZvciAobnVtID4+PSAyOyBudW0gIT0gMDsgbnVtID4+PSAyKSANCisJew0KKwkJc3RlcCA9IDIqYmduOw0KKwkJeHB0ciA9IGJ1ZjsNCisNCisgICAgCWZvciAoaSA9IG51bTsgaSAhPSAwOyBpLS0pIA0KKwkJew0KKwkJCWNzcHRyID0gdHdpZFRhYjsNCisNCisJCQlmb3IgKGogPSBiZ247IGogIT0gMDsgai0tKSANCisJCQl7DQorCQkJCXIwID0geHB0clswXTsNCisJCQkJcjEgPSB4cHRyWzFdOw0KKwkJCQl4cHRyICs9IHN0ZXA7DQorCQkJCQ0KKwkJCQl0MCA9IHhwdHJbMF07DQorCQkJCXQxID0geHB0clsxXTsJCQkJDQorCQkJCWNvc3ggPSBjc3B0clswXTsNCisJCQkJc2lueCA9IGNzcHRyWzFdOw0KKwkJCQlyMiA9IE1VTEhJR0goY29zeCwgdDApICsgTVVMSElHSChzaW54LCB0MSk7CQkvKiBjb3MqYnIgKyBzaW4qYmkgKi8NCisJCQkJcjMgPSBNVUxISUdIKGNvc3gsIHQxKSAtIE1VTEhJR0goc2lueCwgdDApOwkJLyogY29zKmJpIC0gc2luKmJyICovDQorCQkJCXhwdHIgKz0gc3RlcDsNCisNCisJCQkJdDAgPSByMCA+PiAyOw0KKwkJCQl0MSA9IHIxID4+IDI7DQorCQkJCXIwID0gdDAgLSByMjsNCisJCQkJcjEgPSB0MSAtIHIzOw0KKwkJCQlyMiA9IHQwICsgcjI7DQorCQkJCXIzID0gdDEgKyByMzsNCisJCQkJDQorCQkJCXQwID0geHB0clswXTsNCisJCQkJdDEgPSB4cHRyWzFdOw0KKwkJCQljb3N4ID0gY3NwdHJbMl07DQorCQkJCXNpbnggPSBjc3B0clszXTsNCisJCQkJcjQgPSBNVUxISUdIKGNvc3gsIHQwKSArIE1VTEhJR0goc2lueCwgdDEpOwkJLyogY29zKmNyICsgc2luKmNpICovDQorCQkJCXI1ID0gTVVMSElHSChjb3N4LCB0MSkgLSBNVUxISUdIKHNpbngsIHQwKTsJCS8qIGNvcypjaSAtIHNpbipjciAqLw0KKwkJCQl4cHRyICs9IHN0ZXA7DQorCQkJCQ0KKwkJCQl0MCA9IHhwdHJbMF07DQorCQkJCXQxID0geHB0clsxXTsNCisJCQkJY29zeCA9IGNzcHRyWzRdOw0KKwkJCQlzaW54ID0gY3NwdHJbNV07DQorCQkJCXI2ID0gTVVMSElHSChjb3N4LCB0MCkgKyBNVUxISUdIKHNpbngsIHQxKTsJCS8qIGNvcypjciArIHNpbipjaSAqLw0KKwkJCQlyNyA9IE1VTEhJR0goY29zeCwgdDEpIC0gTVVMSElHSChzaW54LCB0MCk7CQkvKiBjb3MqY2kgLSBzaW4qY3IgKi8NCisJCQkJY3NwdHIgKz0gNjsNCisNCisJCQkJdDAgPSByNDsNCisJCQkJdDEgPSByNTsNCisJCQkJcjQgPSB0MCArIHI2Ow0KKwkJCQlyNSA9IHI3IC0gdDE7DQorCQkJCXI2ID0gdDAgLSByNjsNCisJCQkJcjcgPSByNyArIHQxOw0KKw0KKwkJCQl4cHRyWzBdID0gcjAgKyByNTsNCisJCQkJeHB0clsxXSA9IHIxICsgcjY7DQorCQkJCXhwdHIgLT0gc3RlcDsNCisNCisJCQkJeHB0clswXSA9IHIyIC0gcjQ7DQorCQkJCXhwdHJbMV0gPSByMyAtIHI3Ow0KKwkJCQl4cHRyIC09IHN0ZXA7DQorDQorCQkJCXhwdHJbMF0gPSByMCAtIHI1Ow0KKwkJCQl4cHRyWzFdID0gcjEgLSByNjsNCisJCQkJeHB0ciAtPSBzdGVwOw0KKw0KKwkJCQl4cHRyWzBdID0gcjIgKyByNDsNCisJCQkJeHB0clsxXSA9IHIzICsgcjc7DQorCQkJCXhwdHIgKz0gMjsNCisJCQl9DQorCQkJeHB0ciArPSAzKnN0ZXA7DQorCQl9DQorCQl0d2lkVGFiICs9IDMqc3RlcDsNCisJCWJnbiA8PD0gMjsNCisJfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFByZU1EQ1QKKyogZGVzY3JpcHRpb246ICBwcmVwYXJlIE1EQ1QgcHJvY2VzcyBmb3IgbmV4dCBGRlQgY29tcHV0ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitzdGF0aWMgdm9pZCBQcmVNRENUKGludCAqYnVmMCwgaW50IG51bSwgY29uc3QgaW50ICpjc3B0cikNCit7DQorCWludCBpOw0KKwlpbnQgdHIxLCB0aTEsIHRyMiwgdGkyOw0KKwlpbnQgY29zYSwgc2luYSwgY29zYiwgc2luYjsNCisJaW50ICpidWYxOw0KKwkNCisJYnVmMSA9IGJ1ZjAgKyBudW0gLSAxOw0KKw0KKwlmb3IoaSA9IG51bSA+PiAyOyBpICE9IDA7IGktLSkNCisJew0KKwkJY29zYSA9ICpjc3B0cisrOwkNCisJCXNpbmEgPSAqY3NwdHIrKzsJDQorCQljb3NiID0gKmNzcHRyKys7CQ0KKwkJc2luYiA9ICpjc3B0cisrOwkJDQorDQorCQl0cjEgPSAqKGJ1ZjAgKyAwKTsNCisJCXRpMiA9ICooYnVmMCArIDEpOw0KKwkJdHIyID0gKihidWYxIC0gMSk7DQorCQl0aTEgPSAqKGJ1ZjEgKyAwKTsNCisJCQ0KKwkJKmJ1ZjArKyA9IE1VTEhJR0goY29zYSwgdHIxKSArIE1VTEhJR0goc2luYSwgdGkxKTsNCisJCSpidWYwKysgPSBNVUxISUdIKGNvc2EsIHRpMSkgLSBNVUxISUdIKHNpbmEsIHRyMSk7CQkNCisJCQ0KKwkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdGkyKSAtIE1VTEhJR0goc2luYiwgdHIyKTsJCQ0KKwkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdHIyKSArIE1VTEhJR0goc2luYiwgdGkyKTsNCisJfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IFBvc3RNRENUCisqIGRlc2NyaXB0aW9uOiAgIHBvc3QgTURDVCBwcm9jZXNzIGFmdGVyIG5leHQgRkZUIGZvciBNRENUCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyB2b2lkIFBvc3RNRENUKGludCAqYnVmMCwgaW50IG51bSwgY29uc3QgaW50ICpjc3B0cikNCit7DQorCWludCBpOw0KKwlpbnQgdHIxLCB0aTEsIHRyMiwgdGkyOw0KKwlpbnQgY29zYSwgc2luYSwgY29zYiwgc2luYjsNCisJaW50ICpidWYxOw0KKw0KKwlidWYxID0gYnVmMCArIG51bSAtIDE7DQorCQ0KKwlmb3IoaSA9IG51bSA+PiAyOyBpICE9IDA7IGktLSkNCisJew0KKwkJY29zYSA9ICpjc3B0cisrOwkNCisJCXNpbmEgPSAqY3NwdHIrKzsJDQorCQljb3NiID0gKmNzcHRyKys7CQ0KKwkJc2luYiA9ICpjc3B0cisrOw0KKw0KKwkJdHIxID0gKihidWYwICsgMCk7DQorCQl0aTEgPSAqKGJ1ZjAgKyAxKTsNCisJCXRpMiA9ICooYnVmMSArIDApOw0KKwkJdHIyID0gKihidWYxIC0gMSk7DQorDQorCQkqYnVmMCsrID0gTVVMSElHSChjb3NhLCB0cjEpICsgTVVMSElHSChzaW5hLCB0aTEpOw0KKwkJKmJ1ZjEtLSA9IE1VTEhJR0goc2luYSwgdHIxKSAtIE1VTEhJR0goY29zYSwgdGkxKTsJCQ0KKwkJDQorCQkqYnVmMCsrID0gTVVMSElHSChzaW5iLCB0cjIpIC0gTVVMSElHSChjb3NiLCB0aTIpOw0KKwkJKmJ1ZjEtLSA9IE1VTEhJR0goY29zYiwgdHIyKSArIE1VTEhJR0goc2luYiwgdGkyKTsJDQorCX0NCit9DQorI2VuZGlmDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogTWRjdF9Mb25nCisqIGRlc2NyaXB0aW9uOiAgdGhlIGxvbmcgYmxvY2sgbWRjdCwgaW5jbHVkZSBsb25nX3N0YXJ0IGJsb2NrLCBlbmRfbG9uZyBibG9jaworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCit2b2lkIE1kY3RfTG9uZyhpbnQgKmJ1ZikNCit7DQorCVByZU1EQ1QoYnVmLCAxMDI0LCBjb3NzaW50YWIgKyAxMjgpOw0KKw0KKwlTaHVmZmxlKGJ1ZiwgNTEyLCBiaXRyZXZUYWIgKyAxNyk7DQorCVJhZGl4OEZpcnN0KGJ1ZiwgNTEyID4+IDMpOwkJCQkJCQ0KKwlSYWRpeDRGRlQoYnVmLCA1MTIgPj4gMywgOCwgKGludCAqKXR3aWRUYWI1MTIpOw0KKw0KKwlQb3N0TURDVChidWYsIDEwMjQsIGNvc3NpbnRhYiArIDEyOCk7CQ0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBNZGN0X1Nob3J0CisqIGRlc2NyaXB0aW9uOiAgdGhlIHNob3J0IGJsb2NrIG1kY3QgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3ZvaWQgTWRjdF9TaG9ydChpbnQgKmJ1ZikNCit7DQorCVByZU1EQ1QoYnVmLCAxMjgsIGNvc3NpbnRhYik7DQorDQorCVNodWZmbGUoYnVmLCA2NCwgYml0cmV2VGFiKTsNCisJUmFkaXg0Rmlyc3QoYnVmLCA2NCA+PiAyKTsJCQkJCQkNCisJUmFkaXg0RkZUKGJ1ZiwgNjQgPj4gMiwgNCwgKGludCAqKXR3aWRUYWI2NCk7CQ0KKw0KKwlQb3N0TURDVChidWYsIDEyOCwgY29zc2ludGFiKTsJDQorfQ0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogc2hpZnRNZGN0RGVsYXlCdWZmZXIKKyogZGVzY3JpcHRpb246ICAgIHRoZSBtZGN0IGRlbGF5IGJ1ZmZlciBoYXMgYSBzaXplIG9mIDE2MDAsCisqICBzbyB0aGUgY2FsY3VsYXRpb24gb2YgTE9ORyxTVE9QIG11c3QgYmUgIHNwaWx0IGluIHR3byAKKyogIHBhc3NlcyB3aXRoIDEwMjQgc2FtcGxlcyBhbmQgYSBtaWQgc2hpZnQsCisqICB0aGUgU0hPUlQgdHJhbnNmb3JtcyBjYW4gYmUgY29tcGxldGVkIGluIHRoZSBkZWxheSBidWZmZXIsCisqICBhbmQgYWZ0ZXJ3YXJkcyBhIHNoaWZ0CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgc2hpZnRNZGN0RGVsYXlCdWZmZXIoV29yZDE2ICptZGN0RGVsYXlCdWZmZXIsIC8qISBzdGFydCBvZiBtZGN0IGRlbGF5IGJ1ZmZlciAqLworCQkJCQkJCQkgV29yZDE2ICp0aW1lU2lnbmFsLCAgICAgIC8qISBwb2ludGVyIHRvIG5ldyB0aW1lIHNpZ25hbCBzYW1wbGVzLCBpbnRlcmxlYXZlZCAqLworCQkJCQkJCQkgV29yZDE2IGNoSW5jcmVtZW50ICAgICAgIC8qISBudW1iZXIgb2YgY2hhbm5lbHMgKi8KKwkJCQkJCQkJICkKK3sKKwlXb3JkMzIgaTsKKwlXb3JkMTYgKnNyQnVmID0gbWRjdERlbGF5QnVmZmVyOworCVdvcmQxNiAqZHNCdWYgPSBtZGN0RGVsYXlCdWZmZXIrRlJBTUVfTEVOX0xPTkc7CisKKwlmb3IoaSA9IDA7IGkgPCBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULUZSQU1FX0xFTl9MT05HOyBpKz0gOCkKKwl7CisJCSpzckJ1ZisrID0gKmRzQnVmKys7CSAqc3JCdWYrKyA9ICpkc0J1ZisrOworCQkqc3JCdWYrKyA9ICpkc0J1ZisrOwkgKnNyQnVmKysgPSAqZHNCdWYrKzsKKwkJKnNyQnVmKysgPSAqZHNCdWYrKzsJICpzckJ1ZisrID0gKmRzQnVmKys7CisJCSpzckJ1ZisrID0gKmRzQnVmKys7CSAqc3JCdWYrKyA9ICpkc0J1ZisrOworCX0KKworCXNyQnVmID0gbWRjdERlbGF5QnVmZmVyICsgQkxPQ0tfU1dJVENISU5HX09GRlNFVC1GUkFNRV9MRU5fTE9ORzsKKwlkc0J1ZiA9IHRpbWVTaWduYWw7CisKKwlmb3IoaT0wOyBpPEZSQU1FX0xFTl9MT05HOyBpKz04KQorCXsgICAKKwkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OworCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CisJCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKKwkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OworCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CisJCSpzckJ1ZisrID0gKmRzQnVmOyBkc0J1ZiArPSBjaEluY3JlbWVudDsKKwkJKnNyQnVmKysgPSAqZHNCdWY7IGRzQnVmICs9IGNoSW5jcmVtZW50OworCQkqc3JCdWYrKyA9ICpkc0J1ZjsgZHNCdWYgKz0gY2hJbmNyZW1lbnQ7CisJfQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUKKyogZGVzY3JpcHRpb246ICBDYWxjdWxhdGUgbWF4IHBvc3NpYmxlIHNjYWxlIGZhY3RvciBmb3IgaW5wdXQgdmVjdG9yIG9mIHNob3J0cworKiByZXR1cm5zOiAgICAgIE1heGltdW0gc2NhbGUgZmFjdG9yCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3N0YXRpYyBXb3JkMTYgZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKGNvbnN0IFdvcmQxNiAqdmVjdG9yLCAvKiE8IFBvaW50ZXIgdG8gaW5wdXQgdmVjdG9yICovDQorCQkJCQkJCQkJCQkJV29yZDE2IGxlbiwgICAgICAgICAgIC8qITwgTGVuZ3RoIG9mIGlucHV0IHZlY3RvciAqLw0KKwkJCQkJCQkJCQkJCVdvcmQxNiBzdHJpZGUpICAgICAgICAvKiE8IFN0cmlkZSBvZiBpbnB1dCB2ZWN0b3IgKi8NCit7DQorCVdvcmQxNiBtYXhWYWwgPSAwOw0KKwlXb3JkMTYgYWJzVmFsOw0KKwlXb3JkMTYgaTsNCisNCisJZm9yKGk9MDsgaTxsZW47IGkrKyl7DQorCQlhYnNWYWwgPSBhYnNfcyh2ZWN0b3JbaSpzdHJpZGVdKTsNCisJCW1heFZhbCB8PSBhYnNWYWw7DQorCX0NCisNCisJcmV0dXJuKCBtYXhWYWwgPyBub3JtX3MobWF4VmFsKSA6IDE1KTsNCit9DQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBmdW5jdGlvbiBuYW1lOiBUcmFuc2Zvcm1fUmVhbAorKiBkZXNjcmlwdGlvbjogIENhbGN1bGF0ZSB0cmFuc2Zvcm0gZmlsdGVyIGZvciBpbnB1dCB2ZWN0b3Igb2Ygc2hvcnRzCisqIHJldHVybnM6ICAgICAgVFJVRSBpZiBzdWNjZXNzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBUcmFuc2Zvcm1fUmVhbChXb3JkMTYgKm1kY3REZWxheUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICp0aW1lU2lnbmFsLAorICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2hJbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIFdvcmQzMiAqcmVhbE91dCwKKyAgICAgICAgICAgICAgICAgICAgV29yZDE2ICptZGN0U2NhbGUsCisgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBibG9ja1R5cGUKKyAgICAgICAgICAgICAgICAgICAgKQoreworCVdvcmQzMiBpLHc7CisJV29yZDMyIHRpbWVTaWduYWxTYW1wbGU7CisJV29yZDMyIHdzMSx3czI7CisJV29yZDE2ICpkY3RJbjAsICpkY3RJbjE7DQorCVdvcmQzMiAqb3V0RGF0YTAsICpvdXREYXRhMTsNCisJV29yZDMyICp3aW5QdHI7CisKKwlXb3JkMzIgZGVsYXlCdWZmZXJTZix0aW1lU2lnbmFsU2YsbWluU2Y7CisJV29yZDMyIGhlYWRSb29tPTA7CisJCisJc3dpdGNoKGJsb2NrVHlwZSl7CisJCQorCQkKKwljYXNlIExPTkdfV0lORE9XOgorCQkvKgorCQl3ZSBhY2Nlc3MgQkxPQ0tfU1dJVENISU5HX09GRlNFVCAoMTYwMCApIGRlbGF5IGJ1ZmZlciBzYW1wbGVzICsgNDQ4IG5ldyB0aW1lU2lnbmFsIHNhbXBsZXMKKwkJYW5kIGdldCB0aGUgYmlnZ2VzdCBzY2FsZSBmYWN0b3IgZm9yIG5leHQgY2FsY3VsYXRlIG1vcmUgcHJlY2lzZQorCQkqLworCQlkZWxheUJ1ZmZlclNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcixCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULDEpOworCQl0aW1lU2lnbmFsU2YgID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKHRpbWVTaWduYWwsMipGUkFNRV9MRU5fTE9ORy1CTE9DS19TV0lUQ0hJTkdfT0ZGU0VULGNoSW5jcmVtZW50KTsKKwkJbWluU2YgPSBtaW4oZGVsYXlCdWZmZXJTZix0aW1lU2lnbmFsU2YpOworCQltaW5TZiA9IG1pbihtaW5TZiwxNCk7CisJCQorCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7CisJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMjsKKwkJCisJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIGxhc3QgYnVmZmVyKi8KKwkJd2luUHRyID0gKGludCAqKUxvbmdXaW5kb3dLQkQ7CisJCWZvcihpPTA7aTxGUkFNRV9MRU5fTE9ORy8yO2krKyl7CisJCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7IAorCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKKwkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQl3aW5QdHIgKys7CisJCQkvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8KKwkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7CisJCX0KKwkJCisJCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKKwkJCisJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLworCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7CisJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7IAorCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKKwkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsgICAgCisJCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjArKykgPDwgbWluU2Y7CisJCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOworCQkJdGltZVNpZ25hbFNhbXBsZSA9ICgqZGN0SW4xLS0pIDw8IG1pblNmOworCQkJd3MyID0gdGltZVNpZ25hbFNhbXBsZSAqICgqd2luUHRyID4+IDE2KTsKKwkJCXdpblB0cisrOworCQkJLyogc2hpZnQgMiB0byBhdm9pZCBvdmVyZmxvdyBuZXh0ICovCisJCQkqb3V0RGF0YTAtLSA9IC0oKHdzMSA+PiAyKSArICh3czIgPj4gMikpOyAKKwkJfQorCisJCU1kY3RfTG9uZyhyZWFsT3V0KTsNCisJCS8qIHVwZGF0ZSBzY2FsZSBmYWN0b3IgKi8NCisJCW1pblNmID0gMTQgLSBtaW5TZjsKKwkJKm1kY3RTY2FsZT1taW5TZjsgCisJCWJyZWFrOworCQkKKwljYXNlIFNUQVJUX1dJTkRPVzoKKwkJLyoKKwkJd2UgYWNjZXNzIEJMT0NLX1NXSVRDSElOR19PRkZTRVQgKDE2MDAgKSBkZWxheSBidWZmZXIgc2FtcGxlcyArIG5vIHRpbWVTaWduYWwgc2FtcGxlcworCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCisJCSovCisJCW1pblNmID0gZ2V0U2NhbGVmYWN0b3JPZlNob3J0VmVjdG9yU3RyaWRlKG1kY3REZWxheUJ1ZmZlcixCTE9DS19TV0lUQ0hJTkdfT0ZGU0VULDEpOworCQltaW5TZiA9IG1pbihtaW5TZiwxNCk7CisKKwkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyOworCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7CisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzI7IAkJCisJCXdpblB0ciA9IChpbnQgKilMb25nV2luZG93S0JEOworCisJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIGxhc3QgYnVmZmVyKi8KKwkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKKwkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7CisJCQl0aW1lU2lnbmFsU2FtcGxlID0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7CisJCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOworCQkJd2luUHRyICsrOworCQkJKm91dERhdGEwKysgPSAod3MxID4+IDIpIC0gKHdzMiA+PiAyKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLw0KKwkJfQorCQkKKwkJc2hpZnRNZGN0RGVsYXlCdWZmZXIobWRjdERlbGF5QnVmZmVyLHRpbWVTaWduYWwsY2hJbmNyZW1lbnQpOworCQkKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7IAorCQlmb3IoaT0wO2k8TFNfVFJBTlM7aSsrKXsKKwkJCSpvdXREYXRhMC0tID0gLW1kY3REZWxheUJ1ZmZlcltpXSA8PCAoMTUgLSAyICsgbWluU2YpOyAgCisJCX0KKwkJCisJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLworCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXIgKyBMU19UUkFOUzsKKwkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyICsgRlJBTUVfTEVOX0xPTkcgLSAxIC0gTFNfVFJBTlM7CisJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9MT05HLzIgLSAxIC1MU19UUkFOUzsgCisJCXdpblB0ciA9IChpbnQgKilTaG9ydFdpbmRvd1NpbmU7CisJCWZvcihpPTA7aTxGUkFNRV9MRU5fU0hPUlQvMjtpKyspeworCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjArKykgPDwgbWluU2Y7CisJCQl3czEgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOworCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7CisJCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOworCQkJd2luUHRyKys7CisJCQkqb3V0RGF0YTAtLSA9ICAtKCh3czEgPj4gMikgKyAod3MyID4+IDIpKTsgIC8qIHNoaWZ0IDIgdG8gYXZvaWQgb3ZlcmZsb3cgbmV4dCAqLw0KKwkJfQorCisJCU1kY3RfTG9uZyhyZWFsT3V0KTsKKwkJLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLworCQltaW5TZiA9IDE0IC0gbWluU2Y7CisJCSptZGN0U2NhbGU9IG1pblNmOworCQlicmVhazsKKwkJCisJY2FzZSBTVE9QX1dJTkRPVzoKKwkJLyoKKwkJd2UgYWNjZXNzIEJMT0NLX1NXSVRDSElOR19PRkZTRVQtTFNfVFJBTlMgKDE2MDAtNDQ4ICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyA0NDggbmV3IHRpbWVTaWduYWwgc2FtcGxlcworCQlhbmQgZ2V0IHRoZSBiaWdnZXN0IHNjYWxlIGZhY3RvciBmb3IgbmV4dCBjYWxjdWxhdGUgbW9yZSBwcmVjaXNlCisJCSovCisJCWRlbGF5QnVmZmVyU2YgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUobWRjdERlbGF5QnVmZmVyK0xTX1RSQU5TLEJMT0NLX1NXSVRDSElOR19PRkZTRVQtTFNfVFJBTlMsMSk7CisJCXRpbWVTaWduYWxTZiAgPSBnZXRTY2FsZWZhY3Rvck9mU2hvcnRWZWN0b3JTdHJpZGUodGltZVNpZ25hbCwyKkZSQU1FX0xFTl9MT05HLUJMT0NLX1NXSVRDSElOR19PRkZTRVQsY2hJbmNyZW1lbnQpOworCQltaW5TZiA9IG1pbihkZWxheUJ1ZmZlclNmLHRpbWVTaWduYWxTZik7ICAgIAorCQltaW5TZiA9IG1pbihtaW5TZiwxMyk7CisJCQorCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yOworCQlkY3RJbjEgPSBtZGN0RGVsYXlCdWZmZXIgKyBGUkFNRV9MRU5fTE9ORyAtIDE7CisJCWZvcihpPTA7aTxMU19UUkFOUztpKyspeworCQkJKm91dERhdGEwKysgPSAtKCpkY3RJbjEtLSkgPDwgKDE1IC0gMiArIG1pblNmKTsgICAgCisJCX0KKwkJCisJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIGxhc3QgYnVmZmVyKi8KKwkJZGN0SW4wID0gbWRjdERlbGF5QnVmZmVyICsgTFNfVFJBTlM7CisJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMSAtIExTX1RSQU5TOworCQlvdXREYXRhMCA9IHJlYWxPdXQgKyBGUkFNRV9MRU5fTE9ORy8yICsgTFNfVFJBTlM7IAorCQl3aW5QdHIgPSAoaW50ICopU2hvcnRXaW5kb3dTaW5lOworCQlmb3IoaT0wO2k8RlJBTUVfTEVOX1NIT1JULzI7aSsrKXsKKwkJCXRpbWVTaWduYWxTYW1wbGUgPSAoKmRjdEluMCsrKSA8PCBtaW5TZjsKKwkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7CisJCQl0aW1lU2lnbmFsU2FtcGxlPSAoKmRjdEluMS0tKSA8PCBtaW5TZjsKKwkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQl3aW5QdHIrKzsKKwkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8NCisJCX0KKwkJCisJCXNoaWZ0TWRjdERlbGF5QnVmZmVyKG1kY3REZWxheUJ1ZmZlcix0aW1lU2lnbmFsLGNoSW5jcmVtZW50KTsKKwkJCisJCS8qIGFkZCB3aW5kb3dzIGFuZCBwcmUgYWRkIGZvciBtZGN0IHRvIG5ldyBidWZmZXIqLworCQlkY3RJbjAgPSBtZGN0RGVsYXlCdWZmZXI7CisJCWRjdEluMSA9IG1kY3REZWxheUJ1ZmZlciArIEZSQU1FX0xFTl9MT05HIC0gMTsKKwkJb3V0RGF0YTAgPSByZWFsT3V0ICsgRlJBTUVfTEVOX0xPTkcvMiAtIDE7IAorCQl3aW5QdHIgPSAoaW50ICopTG9uZ1dpbmRvd0tCRDsKKwkJZm9yKGk9MDtpPEZSQU1FX0xFTl9MT05HLzI7aSsrKXsKKwkJCXRpbWVTaWduYWxTYW1wbGU9ICgqZGN0SW4wKyspIDw8IG1pblNmOworCQkJd3MxID0gdGltZVNpZ25hbFNhbXBsZSAqKCp3aW5QdHIgJiAweGZmZmYpOworCQkJdGltZVNpZ25hbFNhbXBsZT0gKCpkY3RJbjEtLSkgPDwgbWluU2Y7CisJCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgPj4gMTYpOworCQkJKm91dERhdGEwLS0gPSAgLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8NCisJCQl3aW5QdHIrKzsNCisJCX0KKwkJCisJCU1kY3RfTG9uZyhyZWFsT3V0KTsKKwkJbWluU2YgPSAxNCAtIG1pblNmOworCQkqbWRjdFNjYWxlPSBtaW5TZjsgLyogdXBkYXRlIHNjYWxlIGZhY3RvciAqLworCQlicmVhazsKKwkJCisJY2FzZSBTSE9SVF9XSU5ET1c6CisJCS8qCisJCXdlIGFjY2VzcyBCTE9DS19TV0lUQ0hJTkdfT0ZGU0VUICgxNjAwICkgZGVsYXkgYnVmZmVyIHNhbXBsZXMgKyBubyBuZXcgdGltZVNpZ25hbCBzYW1wbGVzCisJCWFuZCBnZXQgdGhlIGJpZ2dlc3Qgc2NhbGUgZmFjdG9yIGZvciBuZXh0IGNhbGN1bGF0ZSBtb3JlIHByZWNpc2UKKwkJKi8JCQorCQltaW5TZiA9IGdldFNjYWxlZmFjdG9yT2ZTaG9ydFZlY3RvclN0cmlkZShtZGN0RGVsYXlCdWZmZXIrVFJBTlNGT1JNX09GRlNFVF9TSE9SVCw5KkZSQU1FX0xFTl9TSE9SVCwxKTsKKwkJbWluU2YgPSBtaW4obWluU2YsMTApOworCQkKKwkJCisJCWZvcih3PTA7dzxUUkFOU19GQUM7dysrKXsKKwkJCWRjdEluMCA9IG1kY3REZWxheUJ1ZmZlcit3KkZSQU1FX0xFTl9TSE9SVCtUUkFOU0ZPUk1fT0ZGU0VUX1NIT1JUOworCQkJZGN0SW4xID0gbWRjdERlbGF5QnVmZmVyK3cqRlJBTUVfTEVOX1NIT1JUK1RSQU5TRk9STV9PRkZTRVRfU0hPUlQgKyBGUkFNRV9MRU5fU0hPUlQtMTsKKwkJCW91dERhdGEwID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yOyAKKwkJCW91dERhdGExID0gcmVhbE91dCArIEZSQU1FX0xFTl9TSE9SVC8yIC0gMTsgCisKKwkJCXdpblB0ciA9IChpbnQgKilTaG9ydFdpbmRvd1NpbmU7CisJCQlmb3IoaT0wO2k8RlJBTUVfTEVOX1NIT1JULzI7aSsrKXsKKwkJCQl0aW1lU2lnbmFsU2FtcGxlPSAqZGN0SW4wIDw8IG1pblNmOworCQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7CisJCQkJdGltZVNpZ25hbFNhbXBsZT0gKmRjdEluMSA8PCBtaW5TZjsKKwkJCQl3czIgPSB0aW1lU2lnbmFsU2FtcGxlICogKCp3aW5QdHIgJiAweGZmZmYpOworCQkJCSpvdXREYXRhMCsrID0gKHdzMSA+PiAyKSAtICh3czIgPj4gMik7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8NCisJCQkJCisJCQkJdGltZVNpZ25hbFNhbXBsZT0gKihkY3RJbjAgKyBGUkFNRV9MRU5fU0hPUlQpIDw8IG1pblNmOworCQkJCXdzMSA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciAmIDB4ZmZmZik7CisJCQkJdGltZVNpZ25hbFNhbXBsZT0gKihkY3RJbjEgKyBGUkFNRV9MRU5fU0hPUlQpIDw8IG1pblNmOworCQkJCXdzMiA9IHRpbWVTaWduYWxTYW1wbGUgKiAoKndpblB0ciA+PiAxNik7CisJCQkJKm91dERhdGExLS0gPSAgLSgod3MxID4+IDIpICsgKHdzMiA+PiAyKSk7ICAvKiBzaGlmdCAyIHRvIGF2b2lkIG92ZXJmbG93IG5leHQgKi8NCisNCisJCQkJd2luUHRyKys7DQorCQkJCWRjdEluMCsrOw0KKwkJCQlkY3RJbjEtLTsNCisJCQl9CisKKwkJCU1kY3RfU2hvcnQocmVhbE91dCk7CisJCQlyZWFsT3V0ICs9IEZSQU1FX0xFTl9TSE9SVDsKKwkJfQorCQkNCisJCW1pblNmID0gMTEgLSBtaW5TZjsKKwkJKm1kY3RTY2FsZSA9IG1pblNmOyAvKiB1cGRhdGUgc2NhbGUgZmFjdG9yICovCisJCQorCQlzaGlmdE1kY3REZWxheUJ1ZmZlcihtZGN0RGVsYXlCdWZmZXIsdGltZVNpZ25hbCxjaEluY3JlbWVudCk7CisJCWJyZWFrOworICB9Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQU1STkJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQU1STkJEZWNvZGVyLmNwcAppbmRleCA3NzI4NTk3Li5mYjMwMGRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FNUk5CRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BTVJOQkRlY29kZXIuY3BwCkBAIC0xMTcsNyArMTE3LDggQEAKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMpKSB7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgQ0hFQ0soc2Vla1RpbWVVcyA+PSAwKTsKIAogICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FNUk5CRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FNUk5CRW5jb2Rlci5jcHAKaW5kZXggZjM0OTY3MS4uOTRhNzlhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BTVJOQkVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQU1STkJFbmNvZGVyLmNwcApAQCAtMjksOCArMjksOSBAQAogc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNhbXBsZXNQZXJGcmFtZSA9IDE2MDsKIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gODAwMDsKIAotQU1STkJFbmNvZGVyOjpBTVJOQkVuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpCitBTVJOQkVuY29kZXI6OkFNUk5CRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQogICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCiAgICAgICBtRW5jU3RhdGUoTlVMTCksCkBAIC02OSw3ICs3MCwxMCBAQAogfQogCiBzdGF0dXNfdCBBTVJOQkVuY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBMT0dXKCJDYWxsIHN0YXJ0KCkgd2hlbiBlbmNvZGVyIGFscmVhZHkgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQogCiAgICAgbUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7CiAgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigzMikpOwpAQCAtNzgsNyArODIsNyBAQAogICAgICAgICAgICAgICAgICZtRW5jU3RhdGUsICZtU2lkU3RhdGUsIGZhbHNlIC8qIGR0eF9lbmFibGUgKi8pLAogICAgICAgICAgICAgIDApOwogCi0gICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICBtU291cmNlLT5zdGFydChwYXJhbXMpOwogCiAgICAgbUFuY2hvclRpbWVVcyA9IDA7CiAgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CkBAIC05Niw3ICsxMDAsMTAgQEAKIH0KIAogc3RhdHVzX3QgQU1STkJFbmNvZGVyOjpzdG9wKCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RvcCgpIHdoZW4gZW5jb2RlciBoYXMgbm90IHN0YXJ0ZWQuIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CiAKICAgICBpZiAobUlucHV0QnVmZmVyKSB7CiAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMTE5LDI4ICsxMjYsMTYgQEAKIHNwPE1ldGFEYXRhPiBBTVJOQkVuY29kZXI6OmdldEZvcm1hdCgpIHsKICAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKLSAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLQotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscykpOwotICAgIENIRUNLX0VRKG51bUNoYW5uZWxzLCAxKTsKLQotICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpOwotICAgIENIRUNLX0VRKHNhbXBsZVJhdGUsIGtTYW1wbGVSYXRlKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKICAgICB9CiAKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQU1STkJFbmNvZGVyIik7CisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBTVJOQkVuY29kZXIiKTsKIAotICAgIHJldHVybiBtZXRhOworICAgIHJldHVybiBtTWV0YTsKIH0KIAogc3RhdHVzX3QgQU1STkJFbmNvZGVyOjpyZWFkKApAQCAtMTUwLDcgKzE0NSwxMCBAQAogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIENIRUNLKG9wdGlvbnMgPT0gTlVMTCB8fCAhb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSk7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgQ0hFQ0sob3B0aW9ucyA9PSBOVUxMIHx8ICFvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSk7CisgICAgYm9vbCByZWFkRnJvbVNvdXJjZSA9IGZhbHNlOworICAgIGludDY0X3Qgd2FsbENsb2NrVGltZVVzID0gLTE7CiAKICAgICB3aGlsZSAobU51bUlucHV0U2FtcGxlcyA8IGtOdW1TYW1wbGVzUGVyRnJhbWUpIHsKICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7CkBAIC0xNzAsMTIgKzE2OCwxNyBAQAogCiAgICAgICAgICAgICBzaXplX3QgYWxpZ24gPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpICUgc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgQ0hFQ0tfRVEoYWxpZ24sIDApOworICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSB0cnVlOwogCiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleURyaWZ0VGltZSwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICB3YWxsQ2xvY2tUaW1lVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlBbmNob3JUaW1lLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWFkRnJvbVNvdXJjZSA9IGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IGNvcHkgPQpAQCAtMjIxLDggKzIyNCwxNCBAQAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIHJlcyk7CiAKICAgICAvLyBFYWNoIGZyYW1lIG9mIDE2MCBzYW1wbGVzIGlzIDIwbXMgbG9uZy4KKyAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gbU51bUZyYW1lc091dHB1dCAqIDIwMDAwTEw7CiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoCi0gICAgICAgICAgICBrS2V5VGltZSwgbUFuY2hvclRpbWVVcyArIG1OdW1GcmFtZXNPdXRwdXQgKiAyMDAwMCk7CisgICAgICAgICAgICBrS2V5VGltZSwgbUFuY2hvclRpbWVVcyArIG1lZGlhVGltZVVzKTsKKworICAgIGlmIChyZWFkRnJvbVNvdXJjZSAmJiB3YWxsQ2xvY2tUaW1lVXMgIT0gLTEpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwKKyAgICAgICAgICAgIG1lZGlhVGltZVVzIC0gd2FsbENsb2NrVGltZVVzKTsKKyAgICB9CiAKICAgICArK21OdW1GcmFtZXNPdXRwdXQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BTVJXQkRlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FNUldCRGVjb2Rlci5jcHAKaW5kZXggYzE3YzEwMC4uMmEyMTQ3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FNUldCRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FNUldCRGVjb2Rlci5jcHAKQEAgLTEzNSw3ICsxMzUsOCBAQAogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAKICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FNUldCRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQU1SV0JFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJmMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FNUldCRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFNUldCRW5jb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkFNUldCRW5jb2Rlci5oIgorI2luY2x1ZGUgInZvQU1SV0IuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAzMjA7CitzdGF0aWMgY29uc3QgaW50MzJfdCBrQml0c1BlclNhbXBsZSA9IDE2Oworc3RhdGljIGNvbnN0IGludDMyX3Qga0lucHV0QnVmZmVyU2l6ZSA9IChrQml0c1BlclNhbXBsZSAvIDgpICoga051bVNhbXBsZXNQZXJGcmFtZTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGVSYXRlID0gMTYwMDA7CitzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQ2hhbm5lbHMgPSAxOworCitBTVJXQkVuY29kZXI6OkFNUldCRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtQnVmZmVyR3JvdXAoTlVMTCksCisgICAgICBtSW5wdXRCdWZmZXIoTlVMTCksCisgICAgICBtRW5jb2RlckhhbmRsZShOVUxMKSwKKyAgICAgIG1BcGlIYW5kbGUoTlVMTCksCisgICAgICBtTWVtT3BlcmF0b3IoTlVMTCksCisgICAgICBtQW5jaG9yVGltZVVzKDApLAorICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKKyAgICAgIG1OdW1JbnB1dFNhbXBsZXMoMCkgeworfQorCitzdGF0aWMgVk9BTVJXQk1PREUgcGlja01vZGVGcm9tQml0UmF0ZShpbnQzMl90IGJwcykgeworICAgIENIRUNLKGJwcyA+PSAwKTsKKyAgICBpZiAoYnBzIDw9IDY2MDApIHsKKyAgICAgICAgcmV0dXJuIFZPQU1SV0JfTUQ2NjsKKyAgICB9IGVsc2UgaWYgKGJwcyA8PSA4ODUwKSB7CisgICAgICAgIHJldHVybiBWT0FNUldCX01EODg1OworICAgIH0gZWxzZSBpZiAoYnBzIDw9IDEyNjUwKSB7CisgICAgICAgIHJldHVybiBWT0FNUldCX01EMTI2NTsKKyAgICB9IGVsc2UgaWYgKGJwcyA8PSAxNDI1MCkgeworICAgICAgICByZXR1cm4gVk9BTVJXQl9NRDE0MjU7CisgICAgfSBlbHNlIGlmIChicHMgPD0gMTU4NTApIHsKKyAgICAgICAgcmV0dXJuIFZPQU1SV0JfTUQxNTg1OworICAgIH0gZWxzZSBpZiAoYnBzIDw9IDE4MjUwKSB7CisgICAgICAgIHJldHVybiBWT0FNUldCX01EMTgyNTsKKyAgICB9IGVsc2UgaWYgKGJwcyA8PSAxOTg1MCkgeworICAgICAgICByZXR1cm4gVk9BTVJXQl9NRDE5ODU7CisgICAgfSBlbHNlIGlmIChicHMgPD0gMjMwNTApIHsKKyAgICAgICAgcmV0dXJuIFZPQU1SV0JfTUQyMzA1OworICAgIH0KKyAgICByZXR1cm4gVk9BTVJXQl9NRDIzODU7Cit9CisKK3N0YXR1c190IEFNUldCRW5jb2Rlcjo6aW5pdENoZWNrKCkgeworICAgIENIRUNLKG1BcGlIYW5kbGUgPT0gTlVMTCAmJiBtRW5jb2RlckhhbmRsZSA9PSBOVUxMKTsKKyAgICBDSEVDSyhtTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmbUJpdFJhdGUpKTsKKworICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7CisgICAgQ0hFQ0sobUFwaUhhbmRsZSk7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbU1lbU9wZXJhdG9yID0gbmV3IFZPX01FTV9PUEVSQVRPUjsKKyAgICBDSEVDSyhtTWVtT3BlcmF0b3IgIT0gTlVMTCk7CisgICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOworICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7CisgICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKKyAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7CisKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOworICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOworICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOworICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPkluaXQoJm1FbmNvZGVySGFuZGxlLCBWT19BVURJT19Db2RpbmdBTVJXQiwgJnVzZXJEYXRhKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdCBBTVJXQiBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIENvbmZpZ3VyZSBBTVJXQiBlbmNvZGVyJAorICAgIFZPQU1SV0JNT0RFIG1vZGUgPSBwaWNrTW9kZUZyb21CaXRSYXRlKG1CaXRSYXRlKTsKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0obUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9NT0RFLCAgJm1vZGUpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgQU1SV0IgZW5jb2RlciBtb2RlIHRvICVkIiwgbW9kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFZPQU1SV0JGUkFNRVRZUEUgdHlwZSA9IFZPQU1SV0JfUkZDMzI2NzsKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0obUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEUsICZ0eXBlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK0FNUldCRW5jb2Rlcjo6fkFNUldCRW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQU1SV0JFbmNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RhcnQoKSB3aGVuIGVuY29kZXIgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKworICAgIC8vIFRoZSBsYXJnZXN0IGJ1ZmZlciBzaXplIGlzIGhlYWRlciArIDQ3NyBiaXRzCisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcigxMDI0KSk7CisKKyAgICBDSEVDS19FUShPSywgaW5pdENoZWNrKCkpOworCisgICAgbU51bUZyYW1lc091dHB1dCA9IDA7CisgICAgbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQU1SV0JFbmNvZGVyOjpzdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgIG1CdWZmZXJHcm91cCA9IE5VTEw7CisKKworICAgIENIRUNLX0VRKFZPX0VSUl9OT05FLCBtQXBpSGFuZGxlLT5VbmluaXQobUVuY29kZXJIYW5kbGUpKTsKKyAgICBtRW5jb2RlckhhbmRsZSA9IE5VTEw7CisKKyAgICBkZWxldGUgbUFwaUhhbmRsZTsKKyAgICBtQXBpSGFuZGxlID0gTlVMTDsKKworICAgIGRlbGV0ZSBtTWVtT3BlcmF0b3I7CisgICAgbU1lbU9wZXJhdG9yOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBBTVJXQkVuY29kZXI6OmdldEZvcm1hdCgpIHsKKyAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQU1SV0JFbmNvZGVyIik7CisKKyAgICByZXR1cm4gbU1ldGE7Cit9CisKK3N0YXR1c190IEFNUldCRW5jb2Rlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisgICAgc3RhdHVzX3QgZXJyOworCisgICAgKm91dCA9IE5VTEw7CisKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgQ0hFQ0sob3B0aW9ucyA9PSBOVUxMIHx8ICFvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSk7CisgICAgYm9vbCByZWFkRnJvbVNvdXJjZSA9IGZhbHNlOworICAgIGludDY0X3Qgd2FsbENsb2NrVGltZVVzID0gLTE7CisKKyAgICB3aGlsZSAobU51bUlucHV0U2FtcGxlcyA8IGtOdW1TYW1wbGVzUGVyRnJhbWUpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsIG9wdGlvbnMpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1OdW1JbnB1dFNhbXBsZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtc2V0KCZtSW5wdXRGcmFtZVttTnVtSW5wdXRTYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoa051bVNhbXBsZXNQZXJGcmFtZSAtIG1OdW1JbnB1dFNhbXBsZXMpKTsKKyAgICAgICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2l6ZV90IGFsaWduID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAlIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIENIRUNLX0VRKGFsaWduLCAwKTsKKworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlEcmlmdFRpbWUsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgd2FsbENsb2NrVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5QW5jaG9yVGltZSwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICBtQW5jaG9yVGltZVVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb3B5ID0KKyAgICAgICAgICAgIChrTnVtU2FtcGxlc1BlckZyYW1lIC0gbU51bUlucHV0U2FtcGxlcykgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgaWYgKGNvcHkgPiBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBjb3B5ID0gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgmbUlucHV0RnJhbWVbbU51bUlucHV0U2FtcGxlc10sCisgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgIGNvcHkpOworCisgICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBjb3B5LAorICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKKworICAgICAgICBpZiAobUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBtTnVtSW5wdXRTYW1wbGVzICs9IGNvcHkgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmIChtTnVtSW5wdXRTYW1wbGVzID49IGtOdW1TYW1wbGVzUGVyRnJhbWUpIHsKKyAgICAgICAgICAgIG1OdW1JbnB1dFNhbXBsZXMgJT0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gR2V0IGEgd2hvbGUgaW5wdXQgZnJhbWUgNjQwIGJ5dGVzCisgICAgICAgIH0KKyAgICB9CisKKyAgICBWT19DT0RFQ0JVRkZFUiBpbnB1dERhdGE7CisgICAgbWVtc2V0KCZpbnB1dERhdGEsIDAsIHNpemVvZihpbnB1dERhdGEpKTsKKyAgICBpbnB1dERhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIqKSBtSW5wdXRGcmFtZTsKKyAgICBpbnB1dERhdGEuTGVuZ3RoID0ga0lucHV0QnVmZmVyU2l6ZTsKKyAgICBDSEVDSyhWT19FUlJfTk9ORSA9PSBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsJmlucHV0RGF0YSkpOworCisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlcjsKKyAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpLCBPSyk7CisgICAgdWludDhfdCAqb3V0UHRyID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKTsKKworICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7CisgICAgbWVtc2V0KCZvdXRwdXREYXRhLCAwLCBzaXplb2Yob3V0cHV0RGF0YSkpOworICAgIFZPX0FVRElPX09VVFBVVElORk8gb3V0cHV0SW5mbzsKKyAgICBtZW1zZXQoJm91dHB1dEluZm8sIDAsIHNpemVvZihvdXRwdXRJbmZvKSk7CisKKyAgICBWT19VMzIgcmV0ID0gVk9fRVJSX05PTkU7CisgICAgb3V0cHV0RGF0YS5CdWZmZXIgPSBvdXRQdHI7CisgICAgb3V0cHV0RGF0YS5MZW5ndGggPSBidWZmZXItPnNpemUoKTsKKyAgICByZXQgPSBtQXBpSGFuZGxlLT5HZXRPdXRwdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmb3V0cHV0RGF0YSwgJm91dHB1dEluZm8pOworICAgIENIRUNLKHJldCA9PSBWT19FUlJfTk9ORSB8fCByZXQgPT0gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCk7CisKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBvdXRwdXREYXRhLkxlbmd0aCk7CisgICAgKyttTnVtRnJhbWVzT3V0cHV0OworCisgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IG1OdW1GcmFtZXNPdXRwdXQgKiAyMDAwMExMOworICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCBtQW5jaG9yVGltZVVzICsgbWVkaWFUaW1lVXMpOworICAgIGlmIChyZWFkRnJvbVNvdXJjZSAmJiB3YWxsQ2xvY2tUaW1lVXMgIT0gLTEpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleURyaWZ0VGltZSwgbWVkaWFUaW1lVXMgLSB3YWxsQ2xvY2tUaW1lVXMpOworICAgIH0KKworICAgICpvdXQgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkzMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMjAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKyAJCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCUFNUldCRW5jb2Rlci5jcHAgXAorCXNyYy9hdXRvY29yci5jIFwKKwlzcmMvYXpfaXNwLmMgXAorCXNyYy9iaXRzLmMgXAorCXNyYy9jMnQ2NGZ4LmMgXAorCXNyYy9jNHQ2NGZ4LmMgXAorCXNyYy9jb252b2x2ZS5jIFwKKwlzcmMvY29yX2hfeC5jIFwKKwlzcmMvZGVjaW01NC5jIFwKKwlzcmMvZGVlbXBoLmMgXAorCXNyYy9kdHguYyBcCisJc3JjL2dfcGl0Y2guYyBcCisJc3JjL2dwY2xpcC5jIFwKKwlzcmMvaG9taW5nLmMgXAorCXNyYy9ocDQwMC5jIFwKKwlzcmMvaHA1MC5jIFwKKwlzcmMvaHA2ay5jIFwKKwlzcmMvaHBfd3NwLmMgXAorCXNyYy9pbnRfbHBjLmMgXAorCXNyYy9pc3BfYXouYyBcCisJc3JjL2lzcF9pc2YuYyBcCisJc3JjL2xhZ193aW5kLmMgXAorCXNyYy9sZXZpbnNvbi5jIFwKKwlzcmMvbG9nMi5jIFwKKwlzcmMvbHBfZGVjMi5jIFwKKwlzcmMvbWF0aF9vcC5jIFwKKwlzcmMvb3Blcl8zMmIuYyBcCisJc3JjL3BfbWVkX29sLmMgXAorCXNyYy9waXRfc2hycC5jIFwKKwlzcmMvcGl0Y2hfZjQuYyBcCisJc3JjL3ByZWRfbHQ0LmMgXAorCXNyYy9wcmVlbXBoLmMgXAorCXNyYy9xX2dhaW4yLmMgXAorCXNyYy9xX3B1bHNlLmMgXAorCXNyYy9xaXNmX25zLmMgXAorCXNyYy9xcGlzZl8ycy5jIFwKKwlzcmMvcmFuZG9tLmMgXAorCXNyYy9yZXNpZHUuYyBcCisJc3JjL3NjYWxlLmMgXAorCXNyYy9zdHJlYW0uYyBcCisJc3JjL3N5bl9maWx0LmMgXAorCXNyYy91cGR0X3Rhci5jIFwKKwlzcmMvdXRpbC5jIFwKKwlzcmMvdm9BTVJXQkVuYy5jIFwKKwlzcmMvdm9pY2VmYWMuYyBcCisJc3JjL3diX3ZhZC5jIFwKKwlzcmMvd2VpZ2h0X2EuYyBcCisJc3JjL21lbV9hbGlnbi5jCisKKworaWZlcSAoJChWT1RUKSwgdjUpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorCXNyYy9hc20vQVJNVjVFL2NvbnZvbHZlX29wdC5zIFwKKwlzcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMgXAorCXNyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIFwKKwlzcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucyBcCisJc3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMKKworZW5kaWYKKworaWZlcSAoJChWT1RUKSwgdjcpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorCXNyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zIFwKKwlzcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMgXAorCXNyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zIFwKKwlzcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucyBcCisJc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKKworZW5kaWYKKworTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9CisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZSBcCisJJChMT0NBTF9QQVRIKS9zcmMgXAorCSQoTE9DQUxfUEFUSCkvaW5jCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFZPX0NGTEFHUykKKworaWZlcSAoJChWT1RUKSwgdjUpCitMT0NBTF9DRkxBR1MgKz0gLURBUk0gLURBU01fT1BUCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNUUKK2VuZGlmCisKK2lmZXEgKCQoVk9UVCksIHY3KQorTE9DQUxfQ0ZMQUdTICs9IC1EQVJNIC1EQVJNVjcgLURBU01fT1BUCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNUUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMvYXNtL0FSTVY3CitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyZDNjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKQEAgLTAsMCArMSwzNjQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorI2lmZGVmIExJTlVYDQorI2luY2x1ZGUgPGRsZmNuLmg+DQorI2VuZGlmDQorDQorI2luY2x1ZGUgICAgICA8c3RkaW8uaD4NCisjaW5jbHVkZSAgICAgIDxzdGRsaWIuaD4NCisjaW5jbHVkZSAgICAgIDx0aW1lLmg+DQorI2luY2x1ZGUgICAgICAidm9BTVJXQi5oIg0KKyNpbmNsdWRlICAgICAgImNtbk1lbW9yeS5oIg0KKw0KKyNkZWZpbmUgVk9BTVJXQl9SRkMzMjY3X0hFQURFUl9JTkZPICIjIUFNUi1XQlxuIg0KKw0KKyNkZWZpbmUgIElOUFVUX1NJWkUgICA2NDANCisjZGVmaW5lICBPVVRQVVRfU0laRSAgMTAyNA0KK3Vuc2lnbmVkIGNoYXIgIElucHV0QnVmW0lOUFVUX1NJWkVdOw0KK3Vuc2lnbmVkIGNoYXIgIE91dHB1dEJ1ZltPVVRQVVRfU0laRV07DQorDQordm9pZCB1c2FnZSAodm9pZCkgew0KKwlwcmludGYgKCJBTVJfV0IgRW5jb2RlciBIRUxQICAgRGlzcGxheXMgdGhpcyB0ZXh0XG4iKTsNCisJcHJpbnRmICgiXG4iKTsNCisJcHJpbnRmICgiVXNhZ2U6XG4iKTsNCisJcHJpbnRmICgiQU1SV0JFbmMgW29wdGlvbnNdIElucHV0X2ZpbGUgb3V0cHV0X2ZpbGUgXG4iKTsNCisJcHJpbnRmICgiXG4iKTsNCisJcHJpbnRmICgiT3B0aW9ucyArTSogK0YqICtEVFggXG4iKTsNCisJcHJpbnRmICgiU3VwcG9ydCBcbiIpOw0KKwlwcmludGYgKCJPcHRpb25zICtNKiBmb3Igc2V0aW5nIGNvbXByZXNzaW9uIGJpdHJhdGUgbW9kZSwgZGVmYXVsdCBpcyAyMy44NWticHNcbiIpOw0KKwlwcmludGYgKCIgK00wID0gNi42a2JwcyBcbiIpOw0KKwlwcmludGYgKCIgK00xID0gOC44NWticHMgXG4iKTsNCisJcHJpbnRmICgiICtNMiA9IDEyLjY1a2JwcyBcbiIpOw0KKwlwcmludGYgKCIgK00zID0gMTQuMjVrYnBzIFxuIik7DQorCXByaW50ZiAoIiArTTQgPSAxNS41OGticHMgXG4iKTsNCisJcHJpbnRmICgiICtNNSA9IDE4LjI1a2JwcyBcbiIpOw0KKwlwcmludGYgKCIgK002ID0gMTkuODVrYnBzIFxuIik7DQorCXByaW50ZiAoIiArTTcgPSAyMy4wNWticHMgXG4iKTsNCisJcHJpbnRmICgiICtNOCA9IDIzLjg1a2JwcyBcbiIpOw0KKwlwcmludGYgKCJcbiIpOw0KKwlwcmludGYgKCJPcHRpb25zICtGKiBmb3Igc2V0dGluZyBvdXRwdXQgZnJhbWUgVHlwZSwgZGVmYXVsdCBpcyBSRkMzMjY3IFxuIik7DQorCXByaW50ZiAoIitGMCBmb3IgQU1SX1dCIERlZnVhbHQgYml0IGV4dGVybiBzaG9ydCBkYXRhIGZyYW1lIHR5cGUgXG4iKTsNCisJcHJpbnRmICgiK0YxIGZvciBBTVJfV0JfSVRVIGJpdCBleHRlcm4gc2hvcnQgZGF0YSBmcmFtZSB0eXBlIFxuIik7DQorCXByaW50ZiAoIitGMiBmb3IgUkZDMzI2N1xuICIpOw0KKwlwcmludGYgKCJcbiIpOw0KKwlwcmludGYgKCJPcHRpb25zICtEVFggZW5hYmxlIERUWCBtb2RlLCBkZWZhdWx0IGlzIGRpc2FibGUuXG4iKTsNCisJcHJpbnRmICgiRmlsZSBuYW1lcywgaW5wdXQgcmF3IFBDTSBkYXRhLCBhbmQgb3V0cHV0IGlzIEFNUl9XQiBiaXQtc3RyZWFtIGZpbGUuXG4iKTsNCisJcHJpbnRmICgiXG4iKTsNCit9DQorDQoraW50ICBHZXROZXh0QnVmKEZJTEUqIGluRmlsZSx1bnNpZ25lZCBjaGFyKiBkc3QsaW50IHNpemUpDQorew0KKwlpbnQgc2l6ZTIgPSAoaW50KWZyZWFkKGRzdCwgc2l6ZW9mKHNpZ25lZCBjaGFyKSwgc2l6ZSxpbkZpbGUpOw0KKwlyZXR1cm4gc2l6ZTI7DQorfQ0KKw0KK3R5cGVkZWYgaW50IChWT19BUEkgKiBWT0dFVEFVRElPRU5DQVBJKSAoVk9fQVVESU9fQ09ERUNBUEkgKiBwRW5jSGFuZGxlKTsNCisNCitpbnQgZW5jb2RlKA0KKwkJICAgaW50IG1vZGUsIA0KKwkJICAgc2hvcnQgICBhbGxvd19kdHgsDQorCQkgICBWT0FNUldCRlJBTUVUWVBFIGZyYW1lVHlwZSwNCisJCSAgIGNvbnN0IGNoYXIqIHNyY2ZpbGUsIA0KKwkJICAgY29uc3QgY2hhciogZHN0ZmlsZQ0KKwkJICAgKQ0KK3sNCisJaW50CQkJcmV0ID0gMDsNCisJaW50ICAgICAgICAgcmV0dXJuQ29kZTsNCisJRklMRQkJKmZzcmMgPSBOVUxMOw0KKwlGSUxFCQkqZmRzdCA9IE5VTEw7DQorCWludCAgICAgICAgIGZyYW1lbnVtID0gMDsNCisJaW50ICAgICAgICAgZW9mRmlsZSA9IDA7DQorCWludCAgICAgICAgIHNpemUxID0gMDsNCisJaW50ICAgICAgICAgUmVsZW5zOw0KKw0KKwlWT19BVURJT19DT0RFQ0FQSSAgICAgICBBdWRpb0FQSTsNCisJVk9fTUVNX09QRVJBVE9SICAgICAgICAgbW9wZXI7DQorCVZPX0NPREVDX0lOSVRfVVNFUkRBVEEgIHVzZURhdGE7DQorCVZPX0hBTkRMRSAgICAgICAgICAgICAgIGhDb2RlYzsNCisJVk9fQ09ERUNCVUZGRVIgICAgICAgICAgaW5EYXRhOw0KKwlWT19DT0RFQ0JVRkZFUiAgICAgICAgICBvdXREYXRhOw0KKwlWT19BVURJT19PVVRQVVRJTkZPICAgICBvdXRGb3JtYXQ7DQorDQorCXVuc2lnbmVkIGNoYXIgKmluQnVmID0gSW5wdXRCdWY7DQorCXVuc2lnbmVkIGNoYXIgKm91dEJ1ZiA9IE91dHB1dEJ1ZjsNCisNCisNCisjaWZkZWYgTElOVVgNCisJdm9pZCAgKmhhbmRsZSA9IE5VTEw7DQorCXZvaWQgICpwZnVuYzsNCisJVk9HRVRBVURJT0VOQ0FQSSBwR2V0QVBJOw0KKyNlbmRpZg0KKw0KKwljbG9ja190ICAgc3RhcnQsIGZpbmlzaDsNCisJZG91YmxlICAgIGR1cmF0aW9uID0gMC4wOw0KKw0KKwlpZiAoKGZzcmMgPSBmb3BlbiAoc3JjZmlsZSwgInJiIikpID09IE5VTEwpDQorCXsNCisJCXJldCA9IC0xOw0KKwkJZ290byBzYWZlX2V4aXQ7DQorCX0NCisNCisJaWYgKChmZHN0ID0gZm9wZW4gKGRzdGZpbGUsICJ3YiIpKSA9PSBOVUxMKQ0KKwl7DQorCQlyZXQgPSAtMTsNCisJCWdvdG8gc2FmZV9leGl0Ow0KKwl9DQorDQorCW1vcGVyLkFsbG9jID0gY21uTWVtQWxsb2M7DQorCW1vcGVyLkNvcHkgPSBjbW5NZW1Db3B5Ow0KKwltb3Blci5GcmVlID0gY21uTWVtRnJlZTsNCisJbW9wZXIuU2V0ID0gY21uTWVtU2V0Ow0KKwltb3Blci5DaGVjayA9IGNtbk1lbUNoZWNrOw0KKw0KKwl1c2VEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOw0KKwl1c2VEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSgmbW9wZXIpOw0KKw0KKyNpZmRlZiBMSU5VWA0KKwloYW5kbGUgPSBkbG9wZW4oIi9kYXRhL2xvY2FsL3RtcC92b0FNUldCRW5jLnNvIiwgUlRMRF9OT1cpOw0KKwlpZihoYW5kbGUgPT0gMCkNCisJew0KKwkJcHJpbnRmKCJvcGVuIGRsbCBlcnJvci4uLi4uLiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorDQorCXBmdW5jID0gZGxzeW0oaGFuZGxlLCAidm9HZXRBTVJXQkVuY0FQSSIpOwkNCisJaWYocGZ1bmMgPT0gMCkNCisJew0KKwkJcHJpbnRmKCJvcGVuIGZ1bmN0aW9uIGVycm9yLi4uLi4uIik7DQorCQlyZXR1cm4gLTE7DQorCX0NCisNCisJcEdldEFQSSA9IChWT0dFVEFVRElPRU5DQVBJKXBmdW5jOw0KKw0KKwlyZXR1cm5Db2RlICA9IHBHZXRBUEkoJkF1ZGlvQVBJKTsNCisJaWYocmV0dXJuQ29kZSkNCisJew0KKwkJcHJpbnRmKCJnZXQgQVBJcyBlcnJvci4uLi4uLiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorI2Vsc2UNCisJcmV0ID0gdm9HZXRBTVJXQkVuY0FQSSgmQXVkaW9BUEkpOw0KKwlpZihyZXQpDQorCXsNCisJCXJldCA9IC0xOw0KKwkJcHJpbnRmKCJnZXQgQVBJcyBlcnJvci4uLi4uLiIpOw0KKwkJZ290byBzYWZlX2V4aXQ7DQorCX0NCisjZW5kaWYgDQorDQorCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgSW5pdCBFbmNvZGluZyBTZWN0aW9uICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisJcmV0ID0gQXVkaW9BUEkuSW5pdCgmaENvZGVjLCBWT19BVURJT19Db2RpbmdBTVJXQiwgJnVzZURhdGEpOw0KKw0KKwlpZihyZXQpDQorCXsNCisJCXJldCA9IC0xOw0KKwkJcHJpbnRmKCJBUElzIGluaXQgZXJyb3IuLi4uLi4iKTsNCisJCWdvdG8gc2FmZV9leGl0Ow0KKwl9DQorDQorCVJlbGVucyA9IEdldE5leHRCdWYoZnNyYyxJbnB1dEJ1ZixJTlBVVF9TSVpFKTsNCisJaWYoUmVsZW5zIT1JTlBVVF9TSVpFICYmICFmZW9mKGZzcmMpKQ0KKwl7DQorCQlyZXQgPSAtMTsgLy9JbnZhbGlkIG1hZ2ljIG51bWJlcg0KKwkJcHJpbnRmKCJnZXQgbmV4dCBidWZmZXIgZXJyb3IuLi4uLi4iKTsNCisJCWdvdG8gc2FmZV9leGl0Ow0KKwl9DQorDQorCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgc2V0IGVuY29kZSBNb2RlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorCXJldCA9IEF1ZGlvQVBJLlNldFBhcmFtKGhDb2RlYywgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJmZyYW1lVHlwZSk7DQorCXJldCA9IEF1ZGlvQVBJLlNldFBhcmFtKGhDb2RlYywgVk9fUElEX0FNUldCX01PREUsICZtb2RlKTsNCisJcmV0ID0gQXVkaW9BUEkuU2V0UGFyYW0oaENvZGVjLCBWT19QSURfQU1SV0JfRFRYLCAmYWxsb3dfZHR4KTsNCisNCisJaWYoZnJhbWVUeXBlID09IFZPQU1SV0JfUkZDMzI2NykNCisJew0KKwkJLyogd3JpdGUgUkZDMzI2NyBIZWFkZXIgaW5mbyB0byBpbmRpY2F0ZSBzaW5nbGUgY2hhbm5lbCBBTVIgZmlsZSBzdG9yYWdlIGZvcm1hdCAqLw0KKwkJc2l6ZTEgPSAoaW50KXN0cmxlbihWT0FNUldCX1JGQzMyNjdfSEVBREVSX0lORk8pOw0KKwkJbWVtY3B5KG91dEJ1ZiwgVk9BTVJXQl9SRkMzMjY3X0hFQURFUl9JTkZPLCBzaXplMSk7DQorCQlvdXRCdWYgKz0gc2l6ZTE7DQorCX0NCisNCisJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICBFbmNvZGluZyBTZWN0aW9uICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisJcHJpbnRmKCIgXG4gLS0tLS0tLS0tLS0tLS0tLSBSdW5uaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAiKTsNCisNCisJZG97DQorCQlpbkRhdGEuQnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKilpbkJ1ZjsNCisJCWluRGF0YS5MZW5ndGggPSBSZWxlbnM7DQorCQlvdXREYXRhLkJ1ZmZlciA9IG91dEJ1ZjsNCisNCisJCXN0YXJ0ID0gY2xvY2soKTsNCisNCisJCS8qIGRlY29kZSBvbmUgYW1yIGJsb2NrICovDQorCQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuU2V0SW5wdXREYXRhKGhDb2RlYywmaW5EYXRhKTsNCisNCisJCWRvIHsNCisJCQlyZXR1cm5Db2RlID0gQXVkaW9BUEkuR2V0T3V0cHV0RGF0YShoQ29kZWMsJm91dERhdGEsICZvdXRGb3JtYXQpOw0KKwkJCWlmKHJldHVybkNvZGUgPT0gMCkNCisJCQl7DQorCQkJCWZyYW1lbnVtKys7DQorCQkJCXByaW50ZigiIEZyYW1lcyBwcm9jZXNzZWQ6ICVoZFxyIiwgZnJhbWVudW0pOw0KKwkJCQlpZihmcmFtZW51bSA9PSAxKQ0KKwkJCQl7DQorCQkJCQlmd3JpdGUoT3V0cHV0QnVmLCAxLCBvdXREYXRhLkxlbmd0aCArIHNpemUxLCBmZHN0KTsNCisJCQkJCWZmbHVzaChmZHN0KTsJDQorCQkJCX0NCisJCQkJZWxzZQ0KKwkJCQl7DQorCQkJCQlmd3JpdGUob3V0RGF0YS5CdWZmZXIsIDEsIG91dERhdGEuTGVuZ3RoLCBmZHN0KTsNCisJCQkJCWZmbHVzaChmZHN0KTsNCisJCQkJfQ0KKwkJCX0NCisJCQllbHNlIGlmKHJldHVybkNvZGUgPT0gVk9fRVJSX0xJQ0VOU0VfRVJST1IpDQorCQkJew0KKwkJICAgICAgICBwcmludGYoIkVuY29kZXIgdGltZSByZWFjaCB1cHBlciBsaW1pdC4uLi4uLiIpOw0KKwkJICAgICAgICBnb3RvIHNhZmVfZXhpdDsNCisJCQl9DQorCQl9IHdoaWxlKHJldHVybkNvZGUgIT0gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCk7DQorDQorCQlmaW5pc2ggPSBjbG9jaygpOw0KKwkJZHVyYXRpb24gKz0gZmluaXNoIC0gc3RhcnQ7DQorDQorCQlpZiAoIWVvZkZpbGUpIHsNCisJCQlSZWxlbnMgPSBHZXROZXh0QnVmKGZzcmMsIElucHV0QnVmLCBJTlBVVF9TSVpFKTsNCisJCQlpbkJ1ZiA9IElucHV0QnVmOw0KKwkJCWlmIChmZW9mKGZzcmMpICYmIFJlbGVucyA9PSAwKQ0KKwkJCQllb2ZGaWxlID0gMTsNCisJCX0NCisJfSB3aGlsZSAoIWVvZkZpbGUgJiYgcmV0dXJuQ29kZSk7DQorCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgRW5kIEVuY29kaW5nIFNlY3Rpb24gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK3NhZmVfZXhpdDoNCisJcmV0dXJuQ29kZSA9IEF1ZGlvQVBJLlVuaW5pdChoQ29kZWMpOw0KKw0KKwlwcmludGYoICJcbiUyLjVmIHNlY29uZHNcbiIsIChkb3VibGUpZHVyYXRpb24vQ0xPQ0tTX1BFUl9TRUMpOw0KKw0KKwlpZiAoZnNyYykNCisJCWZjbG9zZShmc3JjKTsNCisJaWYgKGZkc3QpDQorCQlmY2xvc2UoZmRzdCk7DQorDQorI2lmZGVmIExJTlVYDQorCWRsY2xvc2UoaGFuZGxlKTsNCisjZW5kaWYNCisNCisJcmV0dXJuIHJldDsNCit9DQorDQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSAgLy8gZm9yIGdjYyBjb21waWxlcjsNCit7DQorCWludCAgICAgbW9kZSwgcjsNCisJaW50ICAgICBhcmcsIGZpbGVuYW1lPTA7DQorCWNoYXIgICAgKmluRmlsZU5hbWUgPSBOVUxMOw0KKwljaGFyICAgICpvdXRGaWxlTmFtZSA9IE5VTEw7DQorCXNob3J0ICAgYWxsb3dfZHR4Ow0KKwlWT0FNUldCRlJBTUVUWVBFIGZyYW1lVHlwZTsNCisNCisJcHJpbnRmKCJcbiIpOw0KKwlwcmludGYoIioqKioqKioqKioqKioqKioqKioqKioqKkFkYXB0aXZlIE11bHRpLVJhdGUgV2lkZSBCYW5kIEVuY29kZXIgKEFNUi1XQikqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsNCisJcHJpbnRmKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkRFRklOSVRJT05TOioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOw0KKwlwcmludGYoIkFNUi1XQiBlbmNvZGVyIHNjaGVtZSBpcyBiYXNlZCBvbiB0aGUgcHJpbmNpcGxlIG9mIEFsZ2VicmFpYyBDb2RlIEV4Y2l0ZWQgTGluZWFyIFByZWRpY3Rpb24gYWxnb3JpdGhtXG4iKTsNCisJcHJpbnRmKCJUaGUgQU1SLVdCIGVuY29kZXIgY29tcHJlc3Npb24gTU9OTyBsaW5lciBQQ00gc3BlZWNoIGlucHV0IGRhdGEgYXQgMTZrSHogc2FtcGxpbmcgcmF0ZVxuIik7DQorCXByaW50ZigidG8gb25lIG9mIG5pbmUgZGF0YSByYXRlIG1vZGVzLTYuNjAsIDguODUsIDEyLjY1LCAxNC4yNSwgMTUuODUsIDE4LjI1LCAxOS4yNSwgMjMuMDUgYW5kIDIzLjg1a2Jwcy5cbiIpOw0KKwlwcmludGYoIlRoZSBlbmNvZGVyIHN1cHBvcnRzIG91dHB1dCBmb3JtYXQgQU1SV0IgSVRVLCBBTVJXQiBSRkMzMjY3LlxuIik7DQorCXByaW50ZigiXG4iKTsNCisNCisJLypFbmNvZGVyIERlZmF1bHQgc2V0dGluZyAqLw0KKwltb2RlID0gVk9BTVJXQl9NRDIzODU7DQorCWFsbG93X2R0eCA9IDA7DQorCWZyYW1lVHlwZSA9IFZPQU1SV0JfUkZDMzI2NzsNCisNCisJaWYoYXJnYyA8IDMpew0KKwkJdXNhZ2UoKTsNCisJCXJldHVybiAwOw0KKwl9ZWxzZXsNCisJCWZvciAoYXJnID0gMTsgYXJnIDwgYXJnYzsgYXJnKyspIHsNCisJCQlpZiAoYXJndiBbYXJnXSBbMF0gPT0gJysnKSB7DQorCQkJCWlmKGFyZ3ZbYXJnXVsxXSA9PSAnTScpDQorCQkJCXsNCisJCQkJCXN3aXRjaChhcmd2W2FyZ11bMl0pDQorCQkJCQl7DQorCQkJCQljYXNlICcwJzogbW9kZSA9IFZPQU1SV0JfTUQ2NjsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzEnOiBtb2RlID0gVk9BTVJXQl9NRDg4NTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzInOiBtb2RlID0gVk9BTVJXQl9NRDEyNjU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICczJzogbW9kZSA9IFZPQU1SV0JfTUQxNDI1Ow0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSAnNCc6IG1vZGUgPSBWT0FNUldCX01EMTU4NTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzUnOiBtb2RlID0gVk9BTVJXQl9NRDE4MjU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQljYXNlICc2JzogbW9kZSA9IFZPQU1SV0JfTUQxOTg1Ow0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJY2FzZSAnNyc6IG1vZGUgPSBWT0FNUldCX01EMjMwNTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzgnOiBtb2RlID0gVk9BTVJXQl9NRDIzODU7DQorCQkJCQkJYnJlYWs7DQorCQkJCQlkZWZhdWx0Og0KKwkJCQkJCXVzYWdlKCk7DQorCQkJCQkJcHJpbnRmICgiSW52YWxpZCBwYXJhbWV0ZXIgJyVzJy5cbiIsIGFyZ3YgW2FyZ10pOw0KKwkJCQkJCWJyZWFrOw0KKwkJCQkJfQ0KKwkJCQl9ZWxzZSBpZihhcmd2W2FyZ11bMV0gPT0gJ0YnKQ0KKwkJCQl7DQorCQkJCQlzd2l0Y2goYXJndlthcmddWzJdKQ0KKwkJCQkJew0KKwkJCQkJY2FzZSAnMCc6IGZyYW1lVHlwZSA9IFZPQU1SV0JfREVGQVVMVDsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzEnOiBmcmFtZVR5cGUgPSBWT0FNUldCX0lUVTsNCisJCQkJCQlicmVhazsNCisJCQkJCWNhc2UgJzInOiBmcmFtZVR5cGUgPSBWT0FNUldCX1JGQzMyNjcgOw0KKwkJCQkJCWJyZWFrOyANCisJCQkJCWRlZmF1bHQ6DQorCQkJCQkJdXNhZ2UoKTsNCisJCQkJCQlwcmludGYgKCJJbnZhbGlkIHBhcmFtZXRlciAnJXMnLlxuIiwgYXJndiBbYXJnXSk7DQorCQkJCQkJYnJlYWs7DQorDQorDQorCQkJCQl9DQorCQkJCX1lbHNlIGlmKHN0cmNtcCAoYXJndlthcmddLCAiK0RUWCIpID09IDApDQorCQkJCXsNCisJCQkJCWFsbG93X2R0eCA9IDE7DQorCQkJCX0NCisNCisJCQl9IGVsc2Ugew0KKwkJCQlzd2l0Y2ggKGZpbGVuYW1lKSB7DQorCQkJCQkJY2FzZSAwOiANCisJCQkJCQkJaW5GaWxlTmFtZSAgPSBhcmd2W2FyZ107DQorCQkJCQkJCWJyZWFrOw0KKwkJCQkJCWNhc2UgMTogDQorCQkJCQkJCW91dEZpbGVOYW1lID0gYXJndlthcmddOyANCisJCQkJCQkJYnJlYWs7DQorCQkJCQkJZGVmYXVsdDoNCisJCQkJCQkJdXNhZ2UgKCk7DQorCQkJCQkJCWZwcmludGYgKHN0ZGVyciwgIkludmFsaWQgcGFyYW1ldGVyICclcycuXG4iLCBhcmd2IFthcmddKTsNCisJCQkJCQkJcmV0dXJuIDA7DQorCQkJCX0NCisJCQkJZmlsZW5hbWUrKzsNCisJCQl9DQorCQl9DQorCX0NCisNCisJciA9IGVuY29kZShtb2RlLCBhbGxvd19kdHgsIGZyYW1lVHlwZSwgaW5GaWxlTmFtZSwgb3V0RmlsZU5hbWUpOw0KKwlpZihyKQ0KKwl7DQorCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiAlZFxuIiwgcik7DQorCX0NCisJcmV0dXJuIHI7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZGIxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gCUFNUldCX0VfU0FNUExFLmMKKwkKK0xPQ0FMX1NSQ19GSUxFUyArPSAJXAorCS4uLy4uLy4uL0NvbW1vbi9jbW5NZW1vcnkuYyAKKworTE9DQUxfTU9EVUxFIDo9IFRlc3R2b0FNUldCRW5jCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYnZvQU1SV0JFbmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChMT0NBTF9QQVRIKS8gXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vQ29tbW9uIFwKKwkkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL0luY2x1ZGUgXAorCitMT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCisJCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL2VjbGFpci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWI4NzZhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvZWNsYWlyL01ha2VmaWxlCkBAIC0wLDAgKzEsNTYgQEAKKyMvKg0KKyMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisjICoqDQorIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMgKioNCisjICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjICoqDQorIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisjICovDQorDQorIyB0YXJnZXQ2DQorIyBhdmFpbGFibGU6IHBjLCB2NChhcm12NCksIHY1KGFybXY1KSwgdjV4KGFybXY1IHhzY2FsZSksIHY2KGFybXY2KSwgdjcoY29ydGV4LWE4IG5lb24pDQorVk9UVDo9IHY2DQorDQorDQorIyBtb2R1bGUgdHlwZQ0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIHR5cGUgb2YgeW91ciBtb2R1bGU6IGxpYiBvciBleGUNCitWT01UOj0gZXhlDQorDQorDQorIyBtb2R1bGUgbWFjcm9zDQorIyBwbGVhc2UgYXBwZW5kIHRoZSBhZGRpdGlvbmFsIG1hY3JvIGRlZmluaXRpb25zIGhlcmUgZm9yIHlvdXIgbW9kdWxlIGlmIG5lY2Vzc2FyeS4gDQorIyBlLmcuIC1EVklTVUFMT04sIG1hY3JvIFZJU1VBTE9OIGRlZmluZWQgZm9yIHlvdXIgbW9kdWxlIA0KK1ZPTU06PSAjQVJNVjVFDQorDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB5b3VyIG1vZHVsZQ0KK1ZPVEFSR0VUOj0gdm9BTVJXQkVuY19UZXN0DQorDQorDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIGcxLm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi9Ub29scy9lY2xhaXIubWsgDQorDQorIyBkZXBlbmRlbnQgbGlicmFyaWVzLg0KK1ZPREVQTElCUzo9LWxkbA0KKw0KKw0KKyMgbW9kdWxlIHNvdXJjZQ0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBtcy5tayB3aGljaCBzcGVjaWZpZXMgYWxsIHNvdXJjZSBpbmZvIG9mIHlvdXIgbW9kdWxlDQoraW5jbHVkZSAuLi9tcy5taw0KKw0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgd2hlcmUgaXMgdGhlIHZvUmVsZWFzZSBvbiB5b3VyIFBDLCByZWxhdGl2ZSBwYXRoIGlzIHN1Z2dlc3RlZA0KK1ZPUkVMRElSOj0uLi8NCisNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9tcy5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL21zLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTg5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9tcy5tawpAQCAtMCwwICsxLDI0IEBACisjLyoNCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyAqKg0KKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjICoqDQorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyAqKg0KKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyAqLw0KKyMgcGxlYXNlIGxpc3QgYWxsIG9iamVjdHMgbmVlZGVkIGJ5IHlvdXIgdGFyZ2V0IGhlcmUNCitPQkpTOj1BTVJXQl9FX1NBTVBMRS5vIGNtbk1lbW9yeS5vDQorCQkJDQorIyBwbGVhc2UgbGlzdCBhbGwgZGlyZWN0b3JpZXMgdGhhdCBhbGwgc291cmNlIGZpbGVzIHJlbGF0aXZlIHdpdGggeW91ciBtb2R1bGUoLmggLmMgLmNwcCkgbG9jYXRlIA0KK1ZPU1JDRElSOj0uLi8gXA0KKyAgICAgICAgICAuLi8uLi8uLi8uLi9Db21tb24gXA0KKwkgIC4uLy4uLy4uLy4uL0luY2x1ZGUNCisJCQkJCQ0KKwkJCQkNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZSBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjVFL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZmRhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY1RS9NYWtlZmlsZQpAQCAtMCwwICsxLDUzIEBACisjLyoNCisjICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorIyAqKg0KKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorIyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorIyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisjICoqDQorIyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIyAqKg0KKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyMgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisjICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyMgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorIyAqLw0KKw0KKyMgdGFyZ2V0IHR5cGUNCisjIGF2YWlsYWJsZTogcGMsIHY0KGFybXY0KSwgdjUoYXJtdjUpLCB2NXgoYXJtdjUgeHNjYWxlKSwgdjYoYXJtdjYpLCB2Nyhjb3J0ZXgtYTggbmVvbikNCitWT1RUOj0gdjUNCisNCisNCisjIG1vZHVsZSB0eXBlDQorIyBwbGVhc2Ugc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIG1vZHVsZTogbGliIG9yIGV4ZQ0KK1ZPTVQ6PSBsaWINCisNCisNCisjIG1vZHVsZSBtYWNyb3MNCisjIHBsZWFzZSBhcHBlbmQgdGhlIGFkZGl0aW9uYWwgbWFjcm8gZGVmaW5pdGlvbnMgaGVyZSBmb3IgeW91ciBtb2R1bGUgaWYgbmVjZXNzYXJ5LiANCitpZmVxICgkKFZPVFQpLCB2NSkNCitWT01NOj0tREFSTSAtREFTTV9PUFQNCitlbmRpZg0KKw0KKyMgcGxlYXNlIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCitWT1RBUkdFVDo9IGxpYnZvQU1SV0JFbmN2NQ0KKw0KKw0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBnMS5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZWNsYWlyLm1rIA0KKw0KKyMgZGVwZW5kZW50IGxpYnJhcmllcy4NCitWT0RFUExJQlM6PS1sZGwgLWxzdGRjKysgLWxjdXRpbHMNCisNCisjIG1vZHVsZSBzb3VyY2UNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgbXMubWsgd2hpY2ggc3BlY2lmaWVzIGFsbCBzb3VyY2UgaW5mbyBvZiB5b3VyIG1vZHVsZQ0KK2luY2x1ZGUgLi4vbXMubWsNCisNCisNCisjIHBsZWFzZSBzcGVjaWZ5IHdoZXJlIGlzIHRoZSB2b1JlbGVhc2Ugb24geW91ciBQQywgcmVsYXRpdmUgcGF0aCBpcyBzdWdnZXN0ZWQNCitWT1JFTERJUjo9Li4vLi4vLi4vLi4vLi4vLi4vUmVsZWFzZQ0KKw0KKyMgcGxlYXNlIG1vZGlmeSBoZXJlIHRvIGJlIHN1cmUgdG8gc2VlIHRoZSBkb2l0Lm1rDQoraW5jbHVkZSAuLi8uLi8uLi8uLi8uLi9Ub29scy9kb2l0Lm1rIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvQVJNVjcvTWFrZWZpbGUgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY3L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODY0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL0FSTVY3L01ha2VmaWxlCkBAIC0wLDAgKzEsNTMgQEAKKyMvKg0KKyMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisjICoqDQorIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMgKioNCisjICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjICoqDQorIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisjICovDQorDQorIyB0YXJnZXQgdHlwZQ0KKyMgYXZhaWxhYmxlOiBwYywgdjQoYXJtdjQpLCB2NShhcm12NSksIHY1eChhcm12NSB4c2NhbGUpLCB2Nihhcm12NiksIHY3KGNvcnRleC1hOCBuZW9uKQ0KK1ZPVFQ6PSB2Nw0KKw0KKw0KKyMgbW9kdWxlIHR5cGUNCisjIHBsZWFzZSBzcGVjaWZ5IHRoZSB0eXBlIG9mIHlvdXIgbW9kdWxlOiBsaWIgb3IgZXhlDQorVk9NVDo9IGxpYg0KKw0KKw0KKyMgbW9kdWxlIG1hY3Jvcw0KKyMgcGxlYXNlIGFwcGVuZCB0aGUgYWRkaXRpb25hbCBtYWNybyBkZWZpbml0aW9ucyBoZXJlIGZvciB5b3VyIG1vZHVsZSBpZiBuZWNlc3NhcnkuIA0KK2lmZXEgKCQoVk9UVCksIHY3KQ0KK1ZPTU06PS1EQVJNIC1EQVJNVjcgLURBU01fT1BUDQorZW5kaWYNCisNCisjIHBsZWFzZSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlDQorVk9UQVJHRVQ6PSBsaWJ2b0FNUldCRW5jdjcNCisNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZzEubWsNCitpbmNsdWRlIC4uLy4uLy4uLy4uLy4uL1Rvb2xzL2VjbGFpci5tayANCisNCisjIGRlcGVuZGVudCBsaWJyYXJpZXMuDQorVk9ERVBMSUJTOj0tbGRsIC1sc3RkYysrIC1sY3V0aWxzDQorDQorIyBtb2R1bGUgc291cmNlDQorIyBwbGVhc2UgbW9kaWZ5IGhlcmUgdG8gYmUgc3VyZSB0byBzZWUgdGhlIG1zLm1rIHdoaWNoIHNwZWNpZmllcyBhbGwgc291cmNlIGluZm8gb2YgeW91ciBtb2R1bGUNCitpbmNsdWRlIC4uL21zLm1rDQorDQorDQorIyBwbGVhc2Ugc3BlY2lmeSB3aGVyZSBpcyB0aGUgdm9SZWxlYXNlIG9uIHlvdXIgUEMsIHJlbGF0aXZlIHBhdGggaXMgc3VnZ2VzdGVkDQorVk9SRUxESVI6PS4uLy4uLy4uLy4uLy4uLy4uL1JlbGVhc2UNCisNCisjIHBsZWFzZSBtb2RpZnkgaGVyZSB0byBiZSBzdXJlIHRvIHNlZSB0aGUgZG9pdC5taw0KK2luY2x1ZGUgLi4vLi4vLi4vLi4vLi4vVG9vbHMvZG9pdC5tayANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL21ha2VmaWxlIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDczYTFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2J1aWxkL2VjbGFpci9tYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjLyoKKyMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyMgKioKKyMgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjICoqCisjICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgKioKKyMgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgKi8KKyMgSnVzdCBhY3RpbmcgYXMgRmF0aGVyIE1ha2VmaWxlIG9mIE1vZHVsZXMKKyMgcGxlYXNlIGtlZXAgdGhlIG5hbWUgJ21ha2VmaWxlJyB1bmNoYW5nZWQKKyAKKyMgTW9kdWxlIFN1YmRpcnMKK1ZPTVNEOj0kKGRpciAkKHNoZWxsIGZpbmQgLiAtbmFtZSAnTWFrZWZpbGUnKSkKKworYWxsOgorCWZvciBkaXIgaW4gJChWT01TRCk7IFwKKwkJZG8gXAorCQkJJChNQUtFKSAtQyAkJGRpcjsgXAorCQlkb25lCisKKy5QSE9OWTpjbGVhbiBkZXZlbAorY2xlYW46CisJZm9yIGRpciBpbiAkKFZPTVNEKTsgXAorCQlkbyBcCisJCQkkKE1BS0UpIC1DICQkZGlyIGNsZWFuOyBcCisJCWRvbmUKKworZGV2ZWw6CisJZm9yIGRpciBpbiAkKFZPTVNEKTsgXAorCQlkbyBcCisJCQkkKE1BS0UpIC1DICQkZGlyIGRldmVsOyBcCisJCWRvbmUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9idWlsZC9lY2xhaXIvbXMubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL21zLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjYyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvYnVpbGQvZWNsYWlyL21zLm1rCkBAIC0wLDAgKzEsNDMgQEAKKyMvKg0KKyMgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisjICoqDQorIyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMgKioNCisjICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisjICoqDQorIyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorIyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyMgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorIyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorIyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisjICovDQorIyBwbGVhc2UgbGlzdCBhbGwgZGlyZWN0b3JpZXMgdGhhdCBhbGwgc291cmNlIGZpbGVzIHJlbGF0aXZlIHdpdGggeW91ciBtb2R1bGUoLmggLmMgLmNwcCkgbG9jYXRlIA0KK1ZPU1JDRElSOj0uLi8uLi8uLi9pbmMgXA0KKyAgICAgICAgICAuLi8uLi8uLi9zcmMgXA0KKwkgIC4uLy4uLy4uLy4uLy4uL0luY2x1ZGUgDQorDQorIyBwbGVhc2UgbGlzdCBhbGwgb2JqZWN0cyBuZWVkZWQgYnkgeW91ciB0YXJnZXQgaGVyZQ0KK09CSlM6PSBhdXRvY29yci5vIGF6X2lzcC5vIGJpdHMubyBjMnQ2NGZ4Lm8gYzR0NjRmeC5vIGNvbnZvbHZlLm8gY29yX2hfeC5vIGRlY2ltNTQubyBcDQorICAgICAgIGRlZW1waC5vIGR0eC5vIGdfcGl0Y2gubyBncGNsaXAubyBob21pbmcubyBocDQwMC5vIGhwNTAubyBocDZrLm8gaHBfd3NwLm8gXA0KKyAgICAgICBpbnRfbHBjLm8gaXNwX2F6Lm8gaXNwX2lzZi5vIGxhZ193aW5kLm8gbGV2aW5zb24ubyBsb2cyLm8gbHBfZGVjMi5vIG1hdGhfb3AubyBtZW1fYWxpZ24ubyBcDQorICAgICAgIG9wZXJfMzJiLm8gcF9tZWRfb2wubyBwaXRfc2hycC5vIHBpdGNoX2Y0Lm8gcHJlZF9sdDQubyBwcmVlbXBoLm8gcV9nYWluMi5vIHFfcHVsc2UubyBcDQorICAgICAgIHFpc2ZfbnMubyBxcGlzZl8ycy5vIHJhbmRvbS5vIHJlc2lkdS5vIHNjYWxlLm8gc3RyZWFtLm8gc3luX2ZpbHQubyB1cGR0X3Rhci5vIHV0aWwubyBcDQorICAgICAgIHZvQU1SV0JFbmMubyB2b2ljZWZhYy5vIHdiX3ZhZC5vIHdlaWdodF9hLm8NCisJCQkNCisNCitpZmVxICgkKFZPVFQpLCB2NSkNCitPQkpTICs9IGNvcl9oX3ZlY19vcHQubyBEZWVtcGhfMzJfb3B0Lm8gRG90X3Bfb3B0Lm8gRmlsdF82a183a19vcHQubyByZXNpZHVfYXNtX29wdC5vIFwNCisgICAgICAgc2NhbGVfc2lnX29wdC5vIFN5bl9maWx0XzMyX29wdC5vIHN5bl9maWx0X29wdC5vIHByZWRfbHQ0XzFfb3B0Lm8gY29udm9sdmVfb3B0Lm8gXA0KKyAgICAgICBOb3JtX0NvcnJfb3B0Lm8NCitWT1NSQ0RJUis9IC4uLy4uLy4uL3NyYy9hc20vQVJNVjVFDQorZW5kaWYNCisNCitpZmVxICgkKFZPVFQpLCB2NykNCitPQkpTKz0gY29yX2hfdmVjX25lb24ubyBEZWVtcGhfMzJfbmVvbi5vIERvdF9wX25lb24ubyBGaWx0XzZrXzdrX25lb24ubyByZXNpZHVfYXNtX25lb24ubyBcDQorICAgICAgIHNjYWxlX3NpZ19uZW9uLm8gU3luX2ZpbHRfMzJfbmVvbi5vIHN5bl9maWx0X25lb24ubyBwcmVkX2x0NF8xX25lb24ubyBjb252b2x2ZV9uZW9uLm8gXA0KKyAgICAgICBOb3JtX0NvcnJfbmVvbi5vDQorVk9TUkNESVIrPSAuLi8uLi8uLi9zcmMvYXNtL0FSTVY3DQorZW5kaWYNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYWRlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2FjZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiMzhhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYWNlbHAuaApAQCAtMCwwICsxLDUyMSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEFDRUxQLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICBGdW5jdGlvbgkJCSAJCQkgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpZm5kZWYgX19BQ0VMUF9IX18NCisjZGVmaW5lIF9fQUNFTFBfSF9fDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiY29kX21haW4uaCINCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgTFBDIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorV29yZDE2IG1lZGlhbjUoV29yZDE2IHhbXSk7DQorDQordm9pZCBBdXRvY29ycigNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogSW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IExQQyBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHJfaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiBBdXRvY29ycmVsYXRpb25zICAobXNiKSAgICAgICAgICAgKi8NCisJCVdvcmQxNiByX2xbXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgIDogQXV0b2NvcnJlbGF0aW9ucyAgKGxzYikgICAgICAgICAgICovDQorCSAgICAgKTsNCisNCit2b2lkIExhZ193aW5kb3coDQorCQlXb3JkMTYgcl9oW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBBdXRvY29ycmVsYXRpb25zICAobXNiKSAgICAgICAgICAqLw0KKwkJV29yZDE2IHJfbFtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogQXV0b2NvcnJlbGF0aW9ucyAgKGxzYikgICAgICAgICAgKi8NCisJICAgICAgICk7DQorDQordm9pZCBJbml0X0xldmluc29uKA0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgIDpzdGF0aWMgbWVtb3J5ICgxOCB3b3JkcykgKi8NCisJCSk7DQorDQordm9pZCBMZXZpbnNvbigNCisJCVdvcmQxNiBSaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IFJoW00rMV0gVmVjdG9yIG9mIGF1dG9jb3JyZWxhdGlvbnMgKG1zYikgKi8NCisJCVdvcmQxNiBSbFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IFJsW00rMV0gVmVjdG9yIG9mIGF1dG9jb3JyZWxhdGlvbnMgKGxzYikgKi8NCisJCVdvcmQxNiBBW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExMiA6IEFbTV0gICAgTFBDIGNvZWZmaWNpZW50cyAgKG0gPSAxNikgICAgICAgKi8NCisJCVdvcmQxNiByY1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IHJjW01dICAgUmVmbGVjdGlvbiBjb2VmZmljaWVudHMuICAgICAgICAgKi8NCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6c3RhdGljIG1lbW9yeSAoMTggd29yZHMpICAgICAgICAgICAgICAgICAgKi8NCisJICAgICApOw0KKw0KK3ZvaWQgQXpfaXNwKA0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogcHJlZGljdG9yIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IEltbWl0dGFuY2Ugc3BlY3RyYWwgcGFpcnMgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgb2xkX2lzcFtdICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBvbGQgaXNwW10gKGluIGNhc2Ugbm90IGZvdW5kIE0gcm9vdHMpICAqLw0KKwkgICApOw0KKw0KK3ZvaWQgSXNwX0F6KA0KKwkJV29yZDE2IGlzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogSW1taXR0YW5jZSBzcGVjdHJhbCBwYWlycyAgICAgICAgICAgICovDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTIgOiBwcmVkaWN0b3IgY29lZmZpY2llbnRzIChvcmRlciA9IE0pICAgKi8NCisJCVdvcmQxNiBtLA0KKwkJV29yZDE2IGFkYXB0aXZlX3NjYWxpbmcgICAgICAgICAgICAgICAvKiAoaSkgMCAgIDogYWRhcHRpdmUgc2NhbGluZyBkaXNhYmxlZCAqLw0KKwkJLyogICAgIDEgICA6IGFkYXB0aXZlIHNjYWxpbmcgZW5hYmxlZCAgKi8NCisJICAgKTsNCisNCit2b2lkIElzcF9pc2YoDQorCQlXb3JkMTYgaXNwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpc3BbbV0gKHJhbmdlOiAtMTw9dmFsPDEpICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaXNmW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBpc2ZbbV0gbm9ybWFsaXplZCAocmFuZ2U6IDAuMDw9dmFsPD0wLjUpICovDQorCQlXb3JkMTYgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICApOw0KKw0KK3ZvaWQgSXNmX2lzcCgNCisJCVdvcmQxNiBpc2ZbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGlzZlttXSBub3JtYWxpemVkIChyYW5nZTogMC4wPD12YWw8PTAuNSkgKi8NCisJCVdvcmQxNiBpc3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IGlzcFttXSAocmFuZ2U6IC0xPD12YWw8MSkgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IExQQyBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICk7DQorDQordm9pZCBJbnRfaXNwKA0KKwkJV29yZDE2IGlzcF9vbGRbXSwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzcHMgZnJvbSBwYXN0IGZyYW1lICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGlzcF9uZXdbXSwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzcHMgZnJvbSBwcmVzZW50IGZyYW1lICAgICAgICAgICAqLw0KKwkJV29yZDE2IGZyYWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIGZvciAzIGZpcnN0IHN1YmZyIChRMTUpICAqLw0KKwkJV29yZDE2IEF6W10gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IExQIGNvZWZmaWNpZW50cyBpbiA0IHN1YmZyYW1lcyAgICAqLw0KKwkgICAgKTsNCisNCit2b2lkIFdlaWdodF9hKA0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdICBMUEMgY29lZmZpY2llbnRzICAgICAgICAgICAgICovDQorCQlXb3JkMTYgYXBbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTIgOiBTcGVjdHJhbCBleHBhbmRlZCBMUEMgY29lZmZpY2llbnRzICAgKi8NCisJCVdvcmQxNiBnYW1tYSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IFNwZWN0cmFsIGV4cGFuc2lvbiBmYWN0b3IuICAgICAgICAgICAqLw0KKwkJV29yZDE2IG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogTFBDIG9yZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKTsNCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgaXNmIHF1YW50aXplcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQordm9pZCBRcGlzZl8yc180NmIoDQorCQlXb3JkMTYgKiBpc2YxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogcGFzdF9pc2ZxLCAgICAgICAgICAgICAgICAgICAvKiAoaW8pUTE1IDogcGFzdCBJU0YgcXVhbnRpemVyICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBuYl9zdXJ2ICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG51bWJlciBvZiBzdXJ2aXZvciAoMSwgMiwgMyBvciA0KSAgICAqLw0KKwkJKTsNCisNCit2b2lkIFFwaXNmXzJzXzM2YigNCisJCVdvcmQxNiAqIGlzZjEsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1IDogcXVhbnRpemVkIElTRiAgICAgICAgICAgICAgICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBwYXN0X2lzZnEsICAgICAgICAgICAgICAgICAgIC8qIChpbylRMTUgOiBwYXN0IElTRiBxdWFudGl6ZXIgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGluZGljZSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgICA6IHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG5iX3N1cnYgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbnVtYmVyIG9mIHN1cnZpdm9yICgxLCAyLCAzIG9yIDQpICAgICovDQorCQkpOw0KKw0KK3ZvaWQgRHBpc2ZfMnNfNDZiKA0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXplZCBJU0YgaW4gZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogcGFzdF9pc2ZxLCAgICAgICAgICAgICAgICAgICAvKiBpLzAgICA6IHBhc3QgSVNGIHF1YW50aXplciAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZm9sZCwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBwYXN0IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZfYnVmLCAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogaXNmIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBiZmksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBCYWQgZnJhbWUgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZW5jX2RlYw0KKwkJKTsNCisNCit2b2lkIERwaXNmXzJzXzM2YigNCisJCVdvcmQxNiAqIGluZGljZSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBxdWFudGl6ZWQgSVNGIGluIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIHBhc3RfaXNmcSwgICAgICAgICAgICAgICAgICAgLyogaS8wICAgOiBwYXN0IElTRiBxdWFudGl6ZXIgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZvbGQsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGFzdCBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX2J1ZiwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzZiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgYmZpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogQmFkIGZyYW1lIGluZGljYXRvciAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGVuY19kZWMNCisJCSk7DQorDQordm9pZCBRaXNmX25zKA0KKwkJV29yZDE2ICogaXNmMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaW5kaWNlICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKTsNCisNCit2b2lkIERpc2ZfbnMoDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX3EgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAgKi8NCisJICAgICk7DQorDQorV29yZDE2IFN1Yl9WUSggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogcmV0dXJuIHF1YW50aXphdGlvbiBpbmRleCAgICAgKi8NCisJCVdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgcmVzaWR1YWwgdmVjdG9yICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZGljbywgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHF1YW50aXphdGlvbiBjb2RlYm9vayAgICAgICAgICovDQorCQlXb3JkMTYgZGltLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogZGltZW50aW9uIG9mIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiBkaWNvX3NpemUsICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaXplIG9mIHF1YW50aXphdGlvbiBjb2RlYm9vayAqLw0KKwkJV29yZDMyICogZGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGVycm9yIG9mIHF1YW50aXphdGlvbiAgICAgICAgICovDQorCSAgICAgKTsNCisNCit2b2lkIFJlb3JkZXJfaXNmKA0KKwkJV29yZDE2ICogaXNmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSBRMTU6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2IG1pbl9kaXN0LCAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1ICA6IG1pbmltdW0gZGlzdGFuY2UgdG8ga2VlcCAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgICA6IG51bWJlciBvZiBJU0YgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJKTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQordm9pZCBJbml0X0RlY2ltXzEyazgoDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogbWVtb3J5ICgyKk5CX0NPRUZfRE9XTikgc2V0IHRvIHplcm9zICovDQorCQkpOw0KK3ZvaWQgRGVjaW1fMTJrOCgNCisJCVdvcmQxNiBzaWcxNmtbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgdG8gZG93bnNhbXBsaW5nICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorCQlXb3JkMTYgc2lnMTJrOFtdLCAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogZGVjaW1hdGVkIHNpZ25hbCAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKDIqTkJfQ09FRl9ET1dOKSAqLw0KKwkgICAgICAgKTsNCisNCit2b2lkIEluaXRfSFA1MF8xMms4KFdvcmQxNiBtZW1bXSk7DQordm9pZCBIUDUwXzEyazgoDQorCQlXb3JkMTYgc2lnbmFsW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBzaWduYWwgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ2h0IG9mIHNpZ25hbCAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWx0ZXIgbWVtb3J5IFs2XSAgICovDQorCSAgICAgICk7DQordm9pZCBJbml0X0hQNDAwXzEyazgoV29yZDE2IG1lbVtdKTsNCit2b2lkIEhQNDAwXzEyazgoDQorCQlXb3JkMTYgc2lnbmFsW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBzaWduYWwgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ2h0IG9mIHNpZ25hbCAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWx0ZXIgbWVtb3J5IFs2XSAgICovDQorCSAgICAgICApOw0KKw0KK3ZvaWQgSW5pdF9GaWx0XzZrXzdrKFdvcmQxNiBtZW1bXSk7DQordm9pZCBGaWx0XzZrXzdrKA0KKwkJV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHNpZ25hbCAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgbGVuZ3RoIG9mIGlucHV0ICAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKHNpemU9MzApICAgICAgICAqLw0KKwkgICAgICAgKTsNCit2b2lkIEZpbHRfNmtfN2tfYXNtKA0KKwkJV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHNpZ25hbCAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgbGVuZ3RoIG9mIGlucHV0ICAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKHNpemU9MzApICAgICAgICAqLw0KKwkgICAgICAgKTsNCisNCit2b2lkIExQX0RlY2ltMigNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBzaWduYWwgdG8gcHJvY2VzcyAgICAgICAgICovDQorCQlXb3JkMTYgbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IG1lbW9yeSAoc2l6ZT0zKSAgICAgICAgICAgKi8NCisJICAgICAgKTsNCisNCit2b2lkIFByZWVtcGgoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogcHJlZW1waGFzaXMgY29lZmZpY2llbnQgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGxlbmdodCBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKTsNCit2b2lkIFByZWVtcGgyKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IHByZWVtcGhhc2lzIGNvZWZmaWNpZW50ICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh4Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICApOw0KK3ZvaWQgRGVlbXBoKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogaW5wdXQgc2lnbmFsIG92ZXJ3cml0dGVuIGJ5IHRoZSBvdXRwdXQgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGRlZW1waGFzaXMgZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgKTsNCit2b2lkIERlZW1waDIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogZGVlbXBoYXNpcyBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHlbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKTsNCit2b2lkIERlZW1waF8zMigNCisJCVdvcmQxNiB4X2hpW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAoYml0MzEuLjE2KSAqLw0KKwkJV29yZDE2IHhfbG9bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQxNS4uNCkgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICh4MTYpICAgICAgKi8NCisJCVdvcmQxNiBtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGRlZW1waGFzaXMgZmFjdG9yICAgICAgICAqLw0KKwkJV29yZDE2IEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHlbLTFdKSAgICAgICAgICAgKi8NCisJICAgICAgKTsNCisNCit2b2lkIERlZW1waF8zMl9hc20oDQorCQlXb3JkMTYgeF9oaVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDMxLi4xNikgKi8NCisJCVdvcmQxNiB4X2xvW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAoYml0MTUuLjQpICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAoeDE2KSAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHlbLTFdKSAgICAgICAgICAgKi8NCisJICAgICAgKTsNCisNCit2b2lkIENvbnZvbHZlKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSAgICA6IGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAxMiBiaXRzOiBvdXRwdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICApOw0KKw0KK3ZvaWQgQ29udm9sdmVfYXNtKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSAgICA6IGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAxMiBiaXRzOiBvdXRwdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICApOw0KKw0KK3ZvaWQgUmVzaWR1KA0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3BlZWNoICh2YWx1ZXMgeFstbS4uLTFdIGFyZSBuZWVkZWQgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcmVzaWR1YWwgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJKTsNCisNCit2b2lkIFJlc2lkdV9vcHQoDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzcGVlY2ggKHZhbHVlcyB4Wy1tLi4tMV0gYXJlIG5lZWRlZCAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiByZXNpZHVhbCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQkpOw0KKw0KK3ZvaWQgU3luX2ZpbHQoDQorCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8NCisJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IG1lbVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLw0KKwlXb3JkMTYgdXBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiAwPW5vIHVwZGF0ZSwgMT11cGRhdGUgb2YgbWVtb3J5LiAgICAgICAgICovDQorCSk7DQorDQordm9pZCBTeW5fZmlsdF9hc20oDQorCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8NCisJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWx0ZXJpbmcuICAgKi8NCisJKTsNCisNCit2b2lkIFN5bl9maWx0XzMyKA0KKwlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgKi8NCisJV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICovDQorCVdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KSAgICAqLw0KKwlXb3JkMTYgUW5ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGMgc2NhbGluZyA9IDAobWluKSB0byA4KG1heCkgKi8NCisJV29yZDE2IHNpZ19oaVtdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGhpZ2ggICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBzaWdfbG9bXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBsb3cgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgbGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgKi8NCisJKTsNCisNCit2b2lkIFN5bl9maWx0XzMyX2FzbSgNCisJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovDQorCVdvcmQxNiBtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRbmV3OiBleGNpdGF0aW9uIChleGNbaV0gPj4gUW5ldykgICAgKi8NCisJV29yZDE2IFFuZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpICovDQorCVdvcmQxNiBzaWdfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgc2lnX2xvW10sICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAvMTYgOiBzeW50aGVzaXMgbG93ICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDE2IGxnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICovDQorCSk7DQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2ggcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK1dvcmQxNiBQaXRjaF9vbCggICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IG9wZW4gbG9vcCBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHNpZ25hbCB1c2VkIHRvIGNvbXB1dGUgdGhlIG9wZW4gbG9vcCBwaXRjaCAqLw0KKy8qIHNpZ25hbFstcGl0X21heF0gdG8gc2lnbmFsWy0xXSBzaG91bGQgYmUga25vd24gKi8NCisgICAgIFdvcmQxNiBwaXRfbWluLCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBtaW5pbXVtIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBwaXRfbWF4LCAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBtYXhpbXVtIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBMX2ZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBsZW5ndGggb2YgZnJhbWUgdG8gY29tcHV0ZSBwaXRjaCAgICAgICAgICAgKi8NCispOw0KKw0KK1dvcmQxNiBQaXRjaF9tZWRfb2woICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IG9wZW4gbG9vcCBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHdzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHNpZ25hbCB1c2VkIHRvIGNvbXB1dGUgdGhlIG9wZW4gbG9vcCBwaXRjaCAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3c3BbLXBpdF9tYXhdIHRvIHdzcFstMV0gc2hvdWxkIGJlIGtub3duICAgKi8NCisgICAgIENvZGVyX1N0YXRlICpzdCwgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogZ2xvYmFsIGNvZGVjIHN0cnVjdHVyZSAqLw0KKyAgICAgV29yZDE2IExfZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGxlbmd0aCBvZiBmcmFtZSB0byBjb21wdXRlIHBpdGNoICAgICAgICAgICAqLw0KKyk7DQorDQorV29yZDE2IE1lZF9vbGFnKCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCA6IG1lZGlhbiBvZiAgNSBwcmV2aW91cyBvcGVuLWxvb3AgbGFncyAgICAgICAqLw0KKyAgICAgV29yZDE2IHByZXZfb2xfbGFnLCAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCAgOiBwcmV2aW91cyBvcGVuLWxvb3AgbGFnICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBvbGRfb2xfbGFnWzVdDQorKTsNCisNCit2b2lkIEluaXRfSHBfd3NwKFdvcmQxNiBtZW1bXSk7DQordm9pZCBzY2FsZV9tZW1fSHBfd3NwKFdvcmQxNiBtZW1bXSwgV29yZDE2IGV4cCk7DQordm9pZCBIcF93c3AoDQorICAgICBXb3JkMTYgd3NwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHdzcFtdICBzaWduYWwgICAgICAgKi8NCisgICAgIFdvcmQxNiBocF93c3BbXSwgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogaHlwYXNzIHdzcFtdICAgICAgICAqLw0KKyAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBsZW5naHQgb2Ygc2lnbmFsICAgICovDQorICAgICBXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGZpbHRlciBtZW1vcnkgWzldICAgKi8NCispOw0KKw0KK1dvcmQxNiBQaXRjaF9mcjQoICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcGl0Y2ggcGVyaW9kLiAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaW1wdWxzZSByZXNwb25zZSBvZiBzeW50aC93Z3QgZmlsdGVycyAqLw0KKyAgICAgV29yZDE2IHQwX21pbiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBpbiB0aGUgc2VhcmNoZWQgcmFuZ2UuICAqLw0KKyAgICAgV29yZDE2IHQwX21heCwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWF4aW11bSB2YWx1ZSBpbiB0aGUgc2VhcmNoZWQgcmFuZ2UuICAqLw0KKyAgICAgV29yZDE2ICogcGl0X2ZyYWMsICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogY2hvc2VuIGZyYWN0aW9uICgwLCAxLCAyIG9yIDMpLiAgICAgICAqLw0KKyAgICAgV29yZDE2IGlfc3ViZnIsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5kaWNhdG9yIGZvciBmaXJzdCBzdWJmcmFtZS4gICAgICAgICAqLw0KKyAgICAgV29yZDE2IHQwX2ZyMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBmb3IgcmVzb2x1dGlvbiAxLzIgICAgICAqLw0KKyAgICAgV29yZDE2IHQwX2ZyMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBmb3IgcmVzb2x1dGlvbiAxICAgICAgICAqLw0KKyAgICAgV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogTGVuZ3RoIG9mIHN1YmZyYW1lICAgICAgICAgICAgICAgICAgICAqLw0KKyk7DQordm9pZCBQcmVkX2x0NCgNCisgICAgIFdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBleGNpdGF0aW9uIGJ1ZmZlciAqLw0KKyAgICAgV29yZDE2IFQwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGludGVnZXIgcGl0Y2ggbGFnICovDQorICAgICBXb3JkMTYgZnJhYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogZnJhY3Rpb24gb2YgbGFnICAgKi8NCisgICAgIFdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzdWJmcmFtZSBzaXplICAgICAqLw0KKyk7DQorDQordm9pZCBwcmVkX2x0NF9hc20oDQorICAgICBXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogZXhjaXRhdGlvbiBidWZmZXIgKi8NCisgICAgIFdvcmQxNiBUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAqLw0KKyAgICAgV29yZDE2IGZyYWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyAgICovDQorICAgICBXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc3ViZnJhbWUgc2l6ZSAgICAgKi8NCispOw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgIGdhaW4gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCitXb3JkMTYgR19waXRjaCggICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNCA6IEdhaW4gb2YgcGl0Y2ggbGFnIHNhdHVyYXRlZCB0byAxLjIgICAqLw0KKyAgICAgV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogUGl0Y2ggdGFyZ2V0LiAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgeTFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBmaWx0ZXJlZCBhZGFwdGl2ZSBjb2RlYm9vay4gICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBnX2NvZWZmW10sICAgICAgICAgICAgICAgICAgICAgLyogOiBDb3JyZWxhdGlvbnMgbmVlZCBmb3IgZ2FpbiBxdWFudGl6YXRpb24uICovDQorICAgICBXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIDogTGVuZ3RoIG9mIHN1YmZyYW1lLiAgICAgICAgICAgICAgICAgICovDQorKTsNCit2b2lkIEluaXRfUV9nYWluMigNCisgICAgIFdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0ICA6c3RhdGljIG1lbW9yeSAoMiB3b3JkcykgICAgICAqLw0KKyk7DQorV29yZDE2IFFfZ2FpbjIoICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBpbmRleCBvZiBxdWFudGl6YXRpb24uICAgICAgICAqLw0KKyAgICAgV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUV94bjpUYXJnZXQgdmVjdG9yLiAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgeTFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRX3huOkFkYXB0aXZlIGNvZGVib29rLiAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBRX3huLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6eG4gYW5kIHkxIGZvcm1hdCAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHkyW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTkgIDpGaWx0ZXJlZCBpbm5vdmF0aXZlIHZlY3Rvci4gICovDQorICAgICBXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBROSAgOklubm92YXRpdmUgdmVjdG9yLiAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBnX2NvZWZmW10sICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6Q29ycmVsYXRpb25zIDx4biB5MT4gPHkxIHkxPiAqLw0KKy8qIENvbXB1dGUgaW4gR19waXRjaCgpLiAgICAgICAgKi8NCisgICAgIFdvcmQxNiBMX3N1YmZyLCAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6U3ViZnJhbWUgbGVuZ2h0LiAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IG5iaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbnVtYmVyIG9mIGJpdHMgKDYgb3IgNykgICAgICovDQorICAgICBXb3JkMTYgKiBnYWluX3BpdCwgICAgICAgICAgICAgICAgICAgIC8qIChpL28pUTE0OlBpdGNoIGdhaW4uICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQzMiAqIGdhaW5fY29kLCAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNiA6Q29kZSBnYWluLiAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGdwX2NsaXAsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogR3AgQ2xpcHBpbmcgZmxhZyAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOnN0YXRpYyBtZW1vcnkgKDIgd29yZHMpICAgICAgKi8NCispOw0KKw0KK3ZvaWQgSW5pdF9EX2dhaW4yKA0KKyAgICAgV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgIDpzdGF0aWMgbWVtb3J5ICg0IHdvcmRzKSAgICAgICovDQorKTsNCit2b2lkIERfZ2FpbjIoDQorICAgICBXb3JkMTYgaW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOmluZGV4IG9mIHF1YW50aXphdGlvbi4gICAgICAgKi8NCisgICAgIFdvcmQxNiBuYml0cywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG51bWJlciBvZiBiaXRzICg2IG9yIDcpICAgICAqLw0KKyAgICAgV29yZDE2IGNvZGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTkgIDpJbm5vdmF0aXZlIHZlY3Rvci4gICAgICAgICAgICovDQorICAgICBXb3JkMTYgTF9zdWJmciwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOlN1YmZyYW1lIGxlbmdodC4gICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqIGdhaW5fcGl0LCAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNCA6UGl0Y2ggZ2Fpbi4gICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDMyICogZ2Fpbl9jb2QsICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE2IDpDb2RlIGdhaW4uICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgYmZpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOmJhZCBmcmFtZSBpbmRpY2F0b3IgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBwcmV2X2JmaSwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDogUHJldmlvdXMgQkYgaW5kaWNhdG9yICAgICAgKi8NCisgICAgIFdvcmQxNiBzdGF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDogU3RhdGUgb2YgQkZIICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB1bnVzYWJsZV9mcmFtZSwgICAgICAgICAgICAgICAgLyogKGkpIDogVUYgaW5kaWNhdG9yICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB2YWRfaGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICAgICAgOm51bWJlciBvZiBub24tc3BlZWNoIGZyYW1lcyAgKi8NCisgICAgIFdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6c3RhdGljIG1lbW9yeSAoNCB3b3JkcykgICAgICAqLw0KKyk7DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgYWNlbHAgcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3ZvaWQgY29yX2hfeCgNCisgICAgIFdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlciAqLw0KKyAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgZG5bXSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSA8MTJiaXQgOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgaFtdICAgICAgICAgKi8NCispOw0KK3ZvaWQgQUNFTFBfMnQ2NF9meCgNCisgICAgIFdvcmQxNiBkbltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDwxMmIgOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCB4W10gYW5kIEhbXSAgICAgICovDQorICAgICBXb3JkMTYgY25bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogcmVzaWR1YWwgYWZ0ZXIgbG9uZyB0ZXJtIHByZWRpY3Rpb24gICAgICAgICAqLw0KKyAgICAgV29yZDE2IEhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8NCisgICAgIFdvcmQxNiBjb2RlW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFE5IDogYWxnZWJyYWljIChmaXhlZCkgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgICovDQorICAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGZpbHRlcmVkIGZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2ICogaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgOiBpbmRleCAoMTIpOiA1KzErNSsxID0gMTEgYml0cy4gICAgICAgICAgICAgICAgICAgICAqLw0KKyk7DQorDQordm9pZCBBQ0VMUF80dDY0X2Z4KA0KKyAgICAgV29yZDE2IGRuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgPDEyYiA6IGNvcnJlbGF0aW9uIGJldHdlZW4gdGFyZ2V0IHhbXSBhbmQgSFtdICAgICAgKi8NCisgICAgIFdvcmQxNiBjbltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDwxMmIgOiByZXNpZHVhbCBhZnRlciBsb25nIHRlcm0gcHJlZGljdGlvbiAgICAgICAgICovDQorICAgICBXb3JkMTYgSFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTI6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlciAqLw0KKyAgICAgV29yZDE2IGNvZGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTkgOiBhbGdlYnJhaWMgKGZpeGVkKSBjb2RlYm9vayBleGNpdGF0aW9uICAgICAgICAgKi8NCisgICAgIFdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFE5IDogZmlsdGVyZWQgZml4ZWQgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgbmJiaXRzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA6IDIwLCAzNiwgNDQsIDUyLCA2NCwgNzIgb3IgODggYml0cyAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHNlcl9zaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgOiBiaXQgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBfaW5kZXhbXSAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIDogaW5kZXggKDIwKTogNSs1KzUrNSA9IDIwIGJpdHMuICAgICAgICAgICAgICAgICAgICovDQorCQkJCQkgICAvKiAobykgOiBpbmRleCAoMzYpOiA5KzkrOSs5ID0gMzYgYml0cy4gICAgICAgICAgICAgICAgICAgKi8NCisJCQkJCSAgIC8qIChvKSA6IGluZGV4ICg0NCk6IDEzKzkrMTMrOSA9IDQ0IGJpdHMuICAgICAgICAgICAgICAgICAqLw0KKwkJCQkJICAgLyogKG8pIDogaW5kZXggKDUyKTogMTMrMTMrMTMrMTMgPSA1MiBiaXRzLiAgICAgICAgICAgICAgICovDQorCQkJCQkgICAvKiAobykgOiBpbmRleCAoNjQpOiAyKzIrMisyKzE0KzE0KzE0KzE0ID0gNjQgYml0cy4gICAgICAgKi8NCisJCQkJCSAgIC8qIChvKSA6IGluZGV4ICg3Mik6IDEwKzIrMTArMisxMCsxNCsxMCsxNCA9IDcyIGJpdHMuICAgICAqLw0KKwkJCQkJICAgLyogKG8pIDogaW5kZXggKDg4KTogMTErMTErMTErMTErMTErMTErMTErMTEgPSA4OCBiaXRzLiAgICovDQorKTsNCisNCit2b2lkIFBpdF9zaHJwKA0KKyAgICAgV29yZDE2ICogeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IGltcHVsc2UgcmVzcG9uc2UgKG9yIGFsZ2VicmFpYyBjb2RlKSAqLw0KKyAgICAgV29yZDE2IHBpdF9sYWcsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IHNoYXJwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBpdGNoIHNoYXJwZW5pbmcgZmFjdG9yIChRMTUpICAgICAgICAqLw0KKyAgICAgV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHN1YmZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyk7DQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG90aGVycyBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3ZvaWQgQ29weSgNCisgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBpbnB1dCB2ZWN0b3IgICAqLw0KKyAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICA6IG91dHB1dCB2ZWN0b3IgICovDQorICAgICBXb3JkMTYgTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogdmVjdG9yIGxlbmd0aCAgKi8NCispOw0KK3ZvaWQgU2V0X3plcm8oDQorICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IHZlY3RvciB0byBjbGVhciAgICAgKi8NCisgICAgIFdvcmQxNiBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogbGVuZ3RoIG9mIHZlY3RvciAgICAqLw0KKyk7DQordm9pZCBVcGR0X3RhcigNCisgICAgIFdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICA6IG9sZCB0YXJnZXQgKGZvciBwaXRjaCBzZWFyY2gpICAgICAqLw0KKyAgICAgV29yZDE2ICogeDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTAgIDogbmV3IHRhcmdldCAoZm9yIGNvZGVib29rIHNlYXJjaCkgICovDQorICAgICBXb3JkMTYgKiB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBmaWx0ZXJlZCBhZGFwdGl2ZSBjb2RlYm9vayB2ZWN0b3IgKi8NCisgICAgIFdvcmQxNiBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNCA6IGFkYXB0aXZlIGNvZGVib29rIGdhaW4gICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3ViZnJhbWUgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovDQorKTsNCitXb3JkMTYgdm9pY2VfZmFjdG9yKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IGZhY3RvciAoLTE9dW52b2ljZWQgdG8gMT12b2ljZWQpICovDQorICAgICBXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRX2V4YzogcGl0Y2ggZXhjaXRhdGlvbiAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IFFfZXhjLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBnYWluX3BpdCwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNCA6IGdhaW4gb2YgcGl0Y2ggICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBROSAgOiBGaXhlZCBjb2RlYm9vayBleGNpdGF0aW9uICAgICAgICAqLw0KKyAgICAgV29yZDE2IGdhaW5fY29kZSwgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogZ2FpbiBvZiBjb2RlICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHN1YmZyYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICovDQorKTsNCit2b2lkIFNjYWxlX3NpZygNCisgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBzaWduYWwgdG8gc2NhbGUgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHNpemUgb2YgeFtdICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZXhwb25lbnQ6IHggPSByb3VuZCh4IDw8IGV4cCkgKi8NCispOw0KKw0KK3ZvaWQgU2NhbGVfc2lnX29wdCgNCisgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBzaWduYWwgdG8gc2NhbGUgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHNpemUgb2YgeFtdICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogZXhwb25lbnQ6IHggPSByb3VuZCh4IDw8IGV4cCkgKi8NCispOw0KKw0KK1dvcmQxNiBSYW5kb20oV29yZDE2ICogc2VlZCk7DQorDQordm9pZCBJbml0X2dwX2NsaXAoDQorICAgICBXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSA6IG1lbW9yeSBvZiBnYWluIG9mIHBpdGNoIGNsaXBwaW5nIGFsZ29yaXRobSAqLw0KKyk7DQorV29yZDE2IEdwX2NsaXAoDQorICAgICBXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorKTsNCit2b2lkIEdwX2NsaXBfdGVzdF9pc2YoDQorICAgICBXb3JkMTYgaXNmW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogaXNmIHZhbHVlcyAoaW4gZnJlcXVlbmN5IGRvbWFpbikgICAgICAgICAgICovDQorICAgICBXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorKTsNCit2b2lkIEdwX2NsaXBfdGVzdF9nYWluX3BpdCgNCisgICAgIFdvcmQxNiBnYWluX3BpdCwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBnYWluIG9mIHF1YW50aXplZCBwaXRjaCAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBtZW1vcnkgb2YgZ2FpbiBvZiBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCispOw0KKw0KKw0KKyNlbmRpZiAgIC8vX19BQ0VMUF9IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Jhc2ljX29wLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2Jhc2ljX29wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZjg2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYmFzaWNfb3AuaApAQCAtMCwwICsxLDEwOTQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorI2lmbmRlZiBfX0JBU0lDX09QX0hfXw0KKyNkZWZpbmUgX19CQVNJQ19PUF9IX18NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisNCisjZGVmaW5lIE1BWF8zMiAoV29yZDMyKTB4N2ZmZmZmZmZMDQorI2RlZmluZSBNSU5fMzIgKFdvcmQzMikweDgwMDAwMDAwTA0KKw0KKyNkZWZpbmUgTUFYXzE2IChXb3JkMTYpKzMyNzY3CS8qIDB4N2ZmZiAqLw0KKyNkZWZpbmUgTUlOXzE2IChXb3JkMTYpLTMyNzY4CS8qIDB4ODAwMCAqLw0KKw0KKw0KKyNpZmRlZiBMSU5VWA0KKyNkZWZpbmUgIHN0YXRpY192byAgc3RhdGljIF9faW5saW5lX18NCisjZWxzZQ0KKyNkZWZpbmUgIHN0YXRpY192byAgc3RhdGljIF9faW5saW5lDQorI2VuZGlmIA0KKw0KKyNkZWZpbmUgc2F0dXJhdGUoTF92YXIxKSAoKChMX3ZhcjEpID4gMFgwMDAwN2ZmZkwpID8gKE1BWF8xNik6ICgoKExfdmFyMSkgPCAoV29yZDMyKSAweGZmZmY4MDAwTCkgPyAoTUlOXzE2KTogKChMX3ZhcjEpICYgMHhmZmZmKSkpDQorDQorI2RlZmluZSBhYnNfcyh4KSAgICAgICAoKFdvcmQxNikoKCh4KSAhPSBNSU5fMTYpID8gKCgoeCkgPj0gMCkgPyAoeCkgOiAoLSh4KSkpIDogTUFYXzE2KSkgIC8qIFNob3J0IGFicywgICAgICAgICAgIDEgICAqLw0KKyNkZWZpbmUgTF9kZXBvc2l0X2goeCkgKCgoV29yZDMyKSh4KSkgPDwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNiBiaXQgdmFyMSAtPiBNU0IsICAgICAyICovDQorI2RlZmluZSBMX2RlcG9zaXRfbCh4KSAoKFdvcmQzMikoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2IGJpdCB2YXIxIC0+IExTQiwgICAgIDIgKi8NCisjZGVmaW5lIExfYWJzKHgpICgoKHgpICE9IE1JTl8zMikgPyAoKCh4KSA+PSAwKSA/ICh4KSA6ICgtKHgpKSkgOiBNQVhfMzIpICAgICAgICAgICAgICAgICAgLyogTG9uZyBhYnMsICAgICAgICAgICAgICAzKi8NCisjZGVmaW5lIG5lZ2F0ZSh2YXIxKSAoKFdvcmQxNikoKCh2YXIxKSA9PSBNSU5fMTYpID8gTUFYXzE2IDogKC0odmFyMSkpKSkgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgbmVnYXRlLCAgICAgICAgMSovDQorI2RlZmluZSBMX25lZ2F0ZShMX3ZhcjEpICgoKExfdmFyMSkgPT0gKE1JTl8zMikpID8gKE1BWF8zMikgOiAoLShMX3ZhcjEpKSkgICAgICAgICAgICAgICAgIC8qIExvbmcgbmVnYXRlLCAgICAgMiovDQorDQorDQorI2RlZmluZSBleHRyYWN0X2goYSkJCQkoKFdvcmQxNikoYSA+PiAxNikpDQorI2RlZmluZSBleHRyYWN0X2woeCkgICAgICAgICAgICAJKFdvcmQxNikoKHgpKQ0KKyNkZWZpbmUgYWRkMShhLGIpCQkJKGEgKyBiKQ0KKyNkZWZpbmUgdm9fTF9tc3UoYSxiLGMpCQkJKCBhIC0gKCggYiAqIGMgKSA8PCAxKSApDQorI2RlZmluZSB2b19tdWx0MzIoYSwgYikgICAgICAgICAoKGEpICogKGIpKQ0KKyNkZWZpbmUgdm9fbXVsdChhLGIpCQkJKCggYSAqIGIgKSA+PiAxNSApDQorI2RlZmluZQl2b19MX211bHQoYSxiKQkgICAgCQkoKChhKSAqIChiKSkgPDwgMSkNCisjZGVmaW5lIHZvX3Nocl9yKHZhcjEsIHZhcjIpICAgCQkoKHZhcjErKChXb3JkMTYpKDFMPDwodmFyMi0xKSkpKT4+dmFyMikNCisjZGVmaW5lIHZvX3N1YihhLGIpCQkJKGEgLSBiKQ0KKyNkZWZpbmUgdm9fTF9kZXBvc2l0X2goYSkJCSgoV29yZDMyKSgoYSkgPDwgMTYpKQ0KKyNkZWZpbmUgdm9fcm91bmQoYSkJCQkoKGEgKyAweDAwMDA4MDAwKSA+PiAxNikNCisjZGVmaW5lIHZvX2V4dHJhY3RfbChhKQkJCSgoV29yZDE2KShhKSkNCisjZGVmaW5lIHZvX0xfYWRkKGEsYikJCQkoYSArIGIpDQorI2RlZmluZSB2b19MX3N1YihhLGIpCQkJKGEgLSBiKQ0KKyNkZWZpbmUgdm9fbXVsdF9yKGEsYikJCQkoKCggYSAqIGIgKSArIDB4NDAwMCApID4+IDE1ICkNCisjZGVmaW5lIHZvX25lZ2F0ZShhKQkJICAgICAgICAoLWEpDQorI2RlZmluZSB2b19MX3Nocl9yKExfdmFyMSwgdmFyMikgICAgICAgICgoTF92YXIxKygoV29yZDMyKSgxTDw8KHZhcjItMSkpKSk+PnZhcjIpDQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQcm90b3R5cGVzIGZvciBiYXNpYyBhcml0aG1ldGljIG9wZXJhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KK3N0YXRpY192byBXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwkJCQkvKiBTaG9ydCBhZGQsMSAqLw0KK3N0YXRpY192byBXb3JkMTYgc3ViIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOwkJCQkvKiBTaG9ydCBzdWIsMSAqLw0KK3N0YXRpY192byBXb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgc2hpZnQgbGVmdCwgICAgMSAgICovDQorc3RhdGljX3ZvIFdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBzaGlmdCByaWdodCwgICAxICAgKi8NCitzdGF0aWNfdm8gV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IG11bHQsICAgICAgICAgIDEgICAqLw0KK3N0YXRpY192byBXb3JkMzIgTF9tdWx0IChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9uZyBtdWx0LCAgICAgICAgICAgMSAgICovDQorc3RhdGljX3ZvIFdvcmQxNiB2b3JvdW5kIChXb3JkMzIgTF92YXIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZCwgICAgICAgICAgICAgICAxICAgKi8NCitzdGF0aWNfdm8gV29yZDMyIExfbWFjIChXb3JkMzIgTF92YXIzLCBXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAgICAgICAgICAgIAkvKiBNYWMsICAxICAqLw0KK3N0YXRpY192byBXb3JkMzIgTF9tc3UgKFdvcmQzMiBMX3ZhcjMsIFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMik7ICAgCQkvKiBNc3UsICAxICAqLw0KK3N0YXRpY192byBXb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpOyAgIAkJIAkvKiBMb25nIGFkZCwgICAgICAgIDIgKi8NCitzdGF0aWNfdm8gV29yZDMyIExfc3ViIChXb3JkMzIgTF92YXIxLCBXb3JkMzIgTF92YXIyKTsgICAJCQkvKiBMb25nIHN1YiwgICAgICAgIDIgKi8NCitzdGF0aWNfdm8gV29yZDE2IG11bHRfciAoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKTsgICAgICAJCSAJLyogTXVsdCB3aXRoIHJvdW5kLCAyICovDQorc3RhdGljX3ZvIFdvcmQzMiBMX3NobDIoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOyAgICAgICAgICAgICAJCS8qIHZhcjIgPiAwKi8NCitzdGF0aWNfdm8gV29yZDMyIExfc2hsIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMik7ICAgIAkgCSAJLyogTG9uZyBzaGlmdCBsZWZ0LCAyICovDQorc3RhdGljX3ZvIFdvcmQzMiBMX3NociAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOyAgICAJIAkgCS8qIExvbmcgc2hpZnQgcmlnaHQsIDIqLw0KK3N0YXRpY192byBXb3JkMzIgTF9zaHJfciAoV29yZDMyIExfdmFyMSwgV29yZDE2IHZhcjIpOyAJCQkJLyogTG9uZyBzaGlmdCByaWdodCB3aXRoIHJvdW5kLCAgMyAgICovDQorc3RhdGljX3ZvIFdvcmQxNiBub3JtX3MgKFdvcmQxNiB2YXIxKTsgICAgICAgICAgICAgCQkJCS8qIFNob3J0IG5vcm0sICAgICAgICAgICAxNSAgKi8NCitzdGF0aWNfdm8gV29yZDE2IGRpdl9zIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpOyAJCQkJLyogU2hvcnQgZGl2aXNpb24sICAgICAgIDE4ICAqLw0KK3N0YXRpY192byBXb3JkMTYgbm9ybV9sIChXb3JkMzIgTF92YXIxKTsgICAgICAgICAgIAkJCQkvKiBMb25nIG5vcm0sICAgICAgICAgICAgMzAgICovICAgDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IGFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgUGVyZm9ybXMgdGhlIGFkZGl0aW9uICh2YXIxK3ZhcjIpIHdpdGggb3ZlcmZsb3cgY29udHJvbCBhbmQgc2F0dXJhdGlvbjt8DQorfCAgICB0aGUgMTYgYml0IHJlc3VsdCBpcyBzZXQgYXQgKzMyNzY3IHdoZW4gb3ZlcmZsb3cgb2NjdXJzIG9yIGF0IC0zMjc2OCAgIHwNCit8ICAgIHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KK3N0YXRpY192byBXb3JkMTYgYWRkIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dDsNCisJV29yZDMyIExfc3VtOw0KKwlMX3N1bSA9IChXb3JkMzIpIHZhcjEgKyB2YXIyOw0KKwl2YXJfb3V0ID0gc2F0dXJhdGUgKExfc3VtKTsNCisJcmV0dXJuICh2YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogc3ViICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBQZXJmb3JtcyB0aGUgc3VidHJhY3Rpb24gKHZhcjErdmFyMikgd2l0aCBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1LSAgIHwNCit8ICAgIHJhdGlvbjsgdGhlIDE2IGJpdCByZXN1bHQgaXMgc2V0IGF0ICszMjc2NyB3aGVuIG92ZXJmbG93IG9jY3VycyBvciBhdCAgfA0KK3wgICAgLTMyNzY4IHdoZW4gdW5kZXJmbG93IG9jY3Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQxNiBzdWIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQxNiB2YXJfb3V0Ow0KKwlXb3JkMzIgTF9kaWZmOw0KKwlMX2RpZmYgPSAoV29yZDMyKSB2YXIxIC0gdmFyMjsNCisJdmFyX291dCA9IHNhdHVyYXRlIChMX2RpZmYpOw0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBzaGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDE2IGJpdCBpbnB1dCB2YXIxIGxlZnQgdmFyMiBwb3NpdGlvbnMuWmVybyBmaWxsfA0KK3wgICB0aGUgdmFyMiBMU0Igb2YgdGhlIHJlc3VsdC4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgICB8DQorfCAgIHZhcjEgcmlnaHQgYnkgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHwNCit8ICAgdW5kZXJmbG93cyBvciBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgc2hsIChXb3JkMTYgdmFyMSwgV29yZDE2IHZhcjIpDQorew0KKwlXb3JkMTYgdmFyX291dDsNCisJV29yZDMyIHJlc3VsdDsNCisJaWYgKHZhcjIgPCAwKQ0KKwl7DQorCQlpZiAodmFyMiA8IC0xNikNCisJCQl2YXIyID0gLTE2Ow0KKwkJdmFyX291dCA9IHZhcjEgPj4gKChXb3JkMTYpLXZhcjIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJcmVzdWx0ID0gKFdvcmQzMikgdmFyMSAqKChXb3JkMzIpIDEgPDwgdmFyMik7DQorCQlpZiAoKHZhcjIgPiAxNSAmJiB2YXIxICE9IDApIHx8IChyZXN1bHQgIT0gKFdvcmQzMikgKChXb3JkMTYpIHJlc3VsdCkpKQ0KKwkJew0KKwkJCXZhcl9vdXQgPSAoV29yZDE2KSgodmFyMSA+IDApID8gTUFYXzE2IDogTUlOXzE2KTsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQl2YXJfb3V0ID0gZXh0cmFjdF9sIChyZXN1bHQpOw0KKwkJfQ0KKwl9DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IHNociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMTYgYml0IGlucHV0IHZhcjEgcmlnaHQgdmFyMiBwb3NpdGlvbnMgd2l0aCAgICB8DQorfCAgIHNpZ24gZXh0ZW5zaW9uLiBJZiB2YXIyIGlzIG5lZ2F0aXZlLCBhcml0aG1ldGljYWxseSBzaGlmdCB2YXIxIGxlZnQgYnkgIHwNCit8ICAgLXZhcjIgd2l0aCBzaWduIGV4dGVuc2lvbi4gU2F0dXJhdGUgdGhlIHJlc3VsdCBpbiBjYXNlIG9mIHVuZGVyZmxvd3Mgb3IgfA0KK3wgICBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQxNiBzaHIgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQxNiB2YXJfb3V0Ow0KKwlpZiAodmFyMiA8IDApDQorCXsNCisJCWlmICh2YXIyIDwgLTE2KQ0KKwkJCXZhcjIgPSAtMTY7DQorCQl2YXJfb3V0ID0gc2hsKHZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJaWYgKHZhcjIgPj0gMTUpDQorCQl7DQorCQkJdmFyX291dCA9IChXb3JkMTYpKCh2YXIxIDwgMCkgPyAtMSA6IDApOw0KKwkJfQ0KKwkJZWxzZQ0KKwkJew0KKwkJCWlmICh2YXIxIDwgMCkNCisJCQl7DQorCQkJCXZhcl9vdXQgPSAoV29yZDE2KSh+KCh+dmFyMSkgPj4gdmFyMikpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQl2YXJfb3V0ID0gKFdvcmQxNikodmFyMSA+PiB2YXIyKTsNCisJCQl9DQorCQl9DQorCX0NCisJcmV0dXJuICh2YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogbXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBQZXJmb3JtcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdmFyMSBieSB2YXIyIGFuZCBnaXZlcyBhIDE2IGJpdCByZXN1bHQgIHwNCit8ICAgIHdoaWNoIGlzIHNjYWxlZCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgbXVsdCh2YXIxLHZhcjIpID0gZXh0cmFjdF9sKExfc2hyKCh2YXIxIHRpbWVzIHZhcjIpLDE1KSkgYW5kICB8DQorfCAgICAgICAgICAgICBtdWx0KC0zMjc2OCwtMzI3NjgpID0gMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDE2IG11bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQxNiB2YXJfb3V0Ow0KKwlXb3JkMzIgTF9wcm9kdWN0Ow0KKwlMX3Byb2R1Y3QgPSAoV29yZDMyKSB2YXIxICooV29yZDMyKSB2YXIyOw0KKwlMX3Byb2R1Y3QgPSAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHhmZmZmODAwMEwpID4+IDE1Ow0KKwlpZiAoTF9wcm9kdWN0ICYgKFdvcmQzMikgMHgwMDAxMDAwMEwpDQorCQlMX3Byb2R1Y3QgPSBMX3Byb2R1Y3QgfCAoV29yZDMyKSAweGZmZmYwMDAwTDsNCisJdmFyX291dCA9IHNhdHVyYXRlIChMX3Byb2R1Y3QpOw0KKwlyZXR1cm4gKHZhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX211bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgTF9tdWx0IGlzIHRoZSAzMiBiaXQgcmVzdWx0IG9mIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB2YXIxIHRpbWVzIHZhcjIgICAgfA0KK3wgICB3aXRoIG9uZSBzaGlmdCBsZWZ0IGkuZS46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgTF9tdWx0KHZhcjEsdmFyMikgPSBMX3NobCgodmFyMSB0aW1lcyB2YXIyKSwxKSBhbmQgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgIExfbXVsdCgtMzI3NjgsLTMyNzY4KSA9IDIxNDc0ODM2NDcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQzMiBMX211bHQgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQ7DQorCUxfdmFyX291dCA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7DQorCWlmIChMX3Zhcl9vdXQgIT0gKFdvcmQzMikgMHg0MDAwMDAwMEwpDQorCXsNCisJCUxfdmFyX291dCAqPSAyOw0KKwl9DQorCWVsc2UNCisJew0KKwkJTF92YXJfb3V0ID0gTUFYXzMyOw0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogcm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJvdW5kIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5wdXQgbnVtYmVyIGludG8gdGhlIE1TIDE2IGJpdHMgIHwNCit8ICAgd2l0aCBzYXR1cmF0aW9uLiBTaGlmdCB0aGUgcmVzdWx0aW5nIGJpdHMgcmlnaHQgYnkgMTYgYW5kIHJldHVybiB0aGUgMTYgfA0KK3wgICBiaXQgbnVtYmVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgIHJvdW5kKExfdmFyMSkgPSBleHRyYWN0X2goTF9hZGQoTF92YXIxLDMyNzY4KSkgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIgKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQxNiB2b3JvdW5kIChXb3JkMzIgTF92YXIxKQ0KK3sNCisJV29yZDE2IHZhcl9vdXQ7DQorCVdvcmQzMiBMX3JvdW5kZWQ7DQorCUxfcm91bmRlZCA9IExfYWRkIChMX3ZhcjEsIChXb3JkMzIpIDB4MDAwMDgwMDBMKTsNCisJdmFyX291dCA9IGV4dHJhY3RfaCAoTF9yb3VuZGVkKTsNCisJcmV0dXJuICh2YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9tYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIEFkZCB0aGUgMzIgYml0ICAgIHwNCit8ICAgcmVzdWx0IHRvIExfdmFyMyB3aXRoIHNhdHVyYXRpb24sIHJldHVybiBhIDMyIGJpdCByZXN1bHQ6ICAgICAgICAgICAgICAgfA0KK3wgICAgICAgIExfbWFjKExfdmFyMyx2YXIxLHZhcjIpID0gTF9hZGQoTF92YXIzLExfbXVsdCh2YXIxLHZhcjIpKS4gICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQzMiBMX21hYyAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDMyIExfdmFyX291dDsNCisJV29yZDMyIExfcHJvZHVjdDsNCisJTF9wcm9kdWN0ID0gKCh2YXIxICogdmFyMikgPDwgMSk7DQorCUxfdmFyX291dCA9IExfYWRkIChMX3ZhcjMsIExfcHJvZHVjdCk7DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogTF9tc3UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE11bHRpcGx5IHZhcjEgYnkgdmFyMiBhbmQgc2hpZnQgdGhlIHJlc3VsdCBsZWZ0IGJ5IDEuIFN1YnRyYWN0IHRoZSAzMiAgIHwNCit8ICAgYml0IHJlc3VsdCB0byBMX3ZhcjMgd2l0aCBzYXR1cmF0aW9uLCByZXR1cm4gYSAzMiBiaXQgcmVzdWx0OiAgICAgICAgICAgfA0KK3wgICAgICAgIExfbXN1KExfdmFyMyx2YXIxLHZhcjIpID0gTF9zdWIoTF92YXIzLExfbXVsdCh2YXIxLHZhcjIpKS4gICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIzICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyX291dCA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQzMiBMX21zdSAoV29yZDMyIExfdmFyMywgV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDMyIExfdmFyX291dDsNCisJV29yZDMyIExfcHJvZHVjdDsNCisJTF9wcm9kdWN0ID0gKHZhcjEgKiB2YXIyKTw8MTsNCisJTF92YXJfb3V0ID0gTF9zdWIgKExfdmFyMywgTF9wcm9kdWN0KTsNCisJcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX2FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMzIgYml0cyBhZGRpdGlvbiBvZiB0aGUgdHdvIDMyIGJpdHMgdmFyaWFibGVzIChMX3ZhcjErTF92YXIyKSB3aXRoICAgICAgfA0KK3wgICBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1cmF0aW9uOyB0aGUgcmVzdWx0IGlzIHNldCBhdCArMjE0NzQ4MzY0NyB3aGVuICB8DQorfCAgIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMjE0NzQ4MzY0OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjIgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9hZGQgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpDQorew0KKwlXb3JkMzIgTF92YXJfb3V0Ow0KKwlMX3Zhcl9vdXQgPSBMX3ZhcjEgKyBMX3ZhcjI7DQorCWlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpID09IDApDQorCXsNCisJCWlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikNCisJCXsNCisJCQlMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMCkgPyBNSU5fMzIgOiBNQVhfMzI7DQorCQl9DQorCX0NCisJcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3N1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMzIgYml0cyBzdWJ0cmFjdGlvbiBvZiB0aGUgdHdvIDMyIGJpdHMgdmFyaWFibGVzIChMX3ZhcjEtTF92YXIyKSB3aXRoICAgfA0KK3wgICBvdmVyZmxvdyBjb250cm9sIGFuZCBzYXR1cmF0aW9uOyB0aGUgcmVzdWx0IGlzIHNldCBhdCArMjE0NzQ4MzY0NyB3aGVuICB8DQorfCAgIG92ZXJmbG93IG9jY3VycyBvciBhdCAtMjE0NzQ4MzY0OCB3aGVuIHVuZGVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjEgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3ZhcjIgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXIzIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9zdWIgKFdvcmQzMiBMX3ZhcjEsIFdvcmQzMiBMX3ZhcjIpDQorew0KKwlXb3JkMzIgTF92YXJfb3V0Ow0KKwlMX3Zhcl9vdXQgPSBMX3ZhcjEgLSBMX3ZhcjI7DQorCWlmICgoKExfdmFyMSBeIExfdmFyMikgJiBNSU5fMzIpICE9IDApDQorCXsNCisJCWlmICgoTF92YXJfb3V0IF4gTF92YXIxKSAmIE1JTl8zMikNCisJCXsNCisJCQlMX3Zhcl9vdXQgPSAoTF92YXIxIDwgMEwpID8gTUlOXzMyIDogTUFYXzMyOw0KKwkJfQ0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogbXVsdF9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFNhbWUgYXMgbXVsdCB3aXRoIHJvdW5kaW5nLCBpLmUuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICBtdWx0X3IodmFyMSx2YXIyKSA9IGV4dHJhY3RfbChMX3NocigoKHZhcjEgKiB2YXIyKSArIDE2Mzg0KSwxNSkpIGFuZCAgfA0KK3wgICAgIG11bHRfcigtMzI3NjgsLTMyNzY4KSA9IDMyNzY3LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcl9vdXQgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQxNiBtdWx0X3IgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQxNiB2YXJfb3V0Ow0KKwlXb3JkMzIgTF9wcm9kdWN0X2FycjsNCisJTF9wcm9kdWN0X2FyciA9IChXb3JkMzIpIHZhcjEgKihXb3JkMzIpIHZhcjI7ICAgICAgIC8qIHByb2R1Y3QgKi8NCisJTF9wcm9kdWN0X2FyciArPSAoV29yZDMyKSAweDAwMDA0MDAwTDsgICAgICAvKiByb3VuZCAqLw0KKwlMX3Byb2R1Y3RfYXJyICY9IChXb3JkMzIpIDB4ZmZmZjgwMDBMOw0KKwlMX3Byb2R1Y3RfYXJyID4+PSAxNTsgICAgICAgLyogc2hpZnQgKi8NCisJaWYgKExfcHJvZHVjdF9hcnIgJiAoV29yZDMyKSAweDAwMDEwMDAwTCkgICAvKiBzaWduIGV4dGVuZCB3aGVuIG5lY2Vzc2FyeSAqLw0KKwl7DQorCQlMX3Byb2R1Y3RfYXJyIHw9IChXb3JkMzIpIDB4ZmZmZjAwMDBMOw0KKwl9DQorCXZhcl9vdXQgPSBzYXR1cmF0ZSAoTF9wcm9kdWN0X2Fycik7DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IExfc2hsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBBcml0aG1ldGljYWxseSBzaGlmdCB0aGUgMzIgYml0IGlucHV0IExfdmFyMSBsZWZ0IHZhcjIgcG9zaXRpb25zLiBaZXJvICB8DQorfCAgIGZpbGwgdGhlIHZhcjIgTFNCIG9mIHRoZSByZXN1bHQuIElmIHZhcjIgaXMgbmVnYXRpdmUsIGFyaXRobWV0aWNhbGx5ICAgIHwNCit8ICAgc2hpZnQgTF92YXIxIHJpZ2h0IGJ5IC12YXIyIHdpdGggc2lnbiBleHRlbnNpb24uIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gfA0KK3wgICBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIxICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IExfdmFyMyA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBMX3Zhcl9vdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3Zhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMzIgTF9zaGwgKFdvcmQzMiBMX3ZhcjEsIFdvcmQxNiB2YXIyKQ0KK3sNCisJV29yZDMyIExfdmFyX291dCA9IDBMOw0KKwlpZiAodmFyMiA8PSAwKQ0KKwl7DQorCQlpZiAodmFyMiA8IC0zMikNCisJCQl2YXIyID0gLTMyOw0KKwkJTF92YXJfb3V0ID0gKExfdmFyMSA+PiAoV29yZDE2KS12YXIyKTsNCisJfQ0KKwllbHNlDQorCXsNCisJCWZvciAoOyB2YXIyID4gMDsgdmFyMi0tKQ0KKwkJew0KKwkJCWlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkNCisJCQl7DQorCQkJCUxfdmFyX291dCA9IE1BWF8zMjsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJCWVsc2UNCisJCQl7DQorCQkJCWlmIChMX3ZhcjEgPCAoV29yZDMyKSAweGMwMDAwMDAwTCkNCisJCQkJew0KKwkJCQkJLy9PdmVyZmxvdyA9IDE7DQorCQkJCQlMX3Zhcl9vdXQgPSBNSU5fMzI7DQorCQkJCQlicmVhazsNCisJCQkJfQ0KKwkJCX0NCisJCQlMX3ZhcjEgKj0gMjsNCisJCQlMX3Zhcl9vdXQgPSBMX3ZhcjE7DQorCQl9DQorCX0NCisJcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisNCitzdGF0aWNfdm8gV29yZDMyIExfc2hsMihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQgPSAwTDsNCisNCisJZm9yICg7IHZhcjIgPiAwOyB2YXIyLS0pDQorCXsNCisJCWlmIChMX3ZhcjEgPiAoV29yZDMyKSAwWDNmZmZmZmZmTCkNCisJCXsNCisJCQlMX3Zhcl9vdXQgPSBNQVhfMzI7DQorCQkJYnJlYWs7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJaWYgKExfdmFyMSA8IChXb3JkMzIpIDB4YzAwMDAwMDBMKQ0KKwkJCXsNCisJCQkJTF92YXJfb3V0ID0gTUlOXzMyOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorCQlMX3ZhcjEgPDw9MSA7DQorCQlMX3Zhcl9vdXQgPSBMX3ZhcjE7DQorCX0NCisJcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3NociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQXJpdGhtZXRpY2FsbHkgc2hpZnQgdGhlIDMyIGJpdCBpbnB1dCBMX3ZhcjEgcmlnaHQgdmFyMiBwb3NpdGlvbnMgd2l0aCAgfA0KK3wgICBzaWduIGV4dGVuc2lvbi4gSWYgdmFyMiBpcyBuZWdhdGl2ZSwgYXJpdGhtZXRpY2FsbHkgc2hpZnQgTF92YXIxIGxlZnQgICB8DQorfCAgIGJ5IC12YXIyIGFuZCB6ZXJvIGZpbGwgdGhlIC12YXIyIExTQiBvZiB0aGUgcmVzdWx0LiBTYXR1cmF0ZSB0aGUgcmVzdWx0IHwNCit8ICAgaW4gY2FzZSBvZiB1bmRlcmZsb3dzIG9yIG92ZXJmbG93cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyMSAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDgwMDAgMDAwMCA8PSBMX3ZhcjMgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ZmZmZiA4MDAwIDw9IHZhcjEgPD0gMHgwMDAwIDdmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF92YXJfb3V0IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDMyIExfc2hyIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQ7DQorCWlmICh2YXIyIDwgMCkNCisJew0KKwkJaWYgKHZhcjIgPCAtMzIpDQorCQkJdmFyMiA9IC0zMjsNCisJCUxfdmFyX291dCA9IExfc2hsMihMX3ZhcjEsIChXb3JkMTYpLXZhcjIpOw0KKwl9DQorCWVsc2UNCisJew0KKwkJaWYgKHZhcjIgPj0gMzEpDQorCQl7DQorCQkJTF92YXJfb3V0ID0gKExfdmFyMSA8IDBMKSA/IC0xIDogMDsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlpZiAoTF92YXIxIDwgMCkNCisJCQl7DQorCQkJCUxfdmFyX291dCA9IH4oKH5MX3ZhcjEpID4+IHZhcjIpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKwkJCQlMX3Zhcl9vdXQgPSBMX3ZhcjEgPj4gdmFyMjsNCisJCQl9DQorCQl9DQorCX0NCisJcmV0dXJuIChMX3Zhcl9vdXQpOw0KK30NCisNCisvKl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIEZ1bmN0aW9uIE5hbWUgOiBMX3Nocl9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQdXJwb3NlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgU2FtZSBhcyBMX3NocihMX3ZhcjEsdmFyMikgYnV0IHdpdGggcm91bmRpbmcuIFNhdHVyYXRlIHRoZSByZXN1bHQgaW4gICAgfA0KK3wgICBjYXNlIG9mIHVuZGVyZmxvd3Mgb3Igb3ZlcmZsb3dzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAtIElmIHZhcjIgaXMgZ3JlYXRlciB0aGFuIHplcm8gOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgIGlmIChMX3N1YihMX3NobChMX3NocihMX3ZhcjEsdmFyMiksMSksTF9zaHIoTF92YXIxLHN1Yih2YXIyLDEpKSkpfA0KK3wgICAgICAgICAgaXMgZXF1YWwgdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgIHRoZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgTF9zaHJfcihMX3ZhcjEsdmFyMikgPSBMX3NocihMX3ZhcjEsdmFyMikgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgIExfc2hyX3IoTF92YXIxLHZhcjIpID0gTF9hZGQoTF9zaHIoTF92YXIxLHZhcjIpLDEpICAgIHwNCit8ICAgIC0gSWYgdmFyMiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICBMX3Nocl9yKExfdmFyMSx2YXIyKSA9IExfc2hyKExfdmFyMSx2YXIyKS4gICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgTF92YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gdmFyMSA8PSAweDdmZmYgZmZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweGZmZmYgODAwMCA8PSB2YXIxIDw9IDB4MDAwMCA3ZmZmLiAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgT3V0cHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICBub25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBSZXR1cm4gVmFsdWUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcl9vdXQgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorDQorc3RhdGljX3ZvIFdvcmQzMiBMX3Nocl9yIChXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQzMiBMX3Zhcl9vdXQ7DQorCWlmICh2YXIyID4gMzEpDQorCXsNCisJCUxfdmFyX291dCA9IDA7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlMX3Zhcl9vdXQgPSBMX3NociAoTF92YXIxLCB2YXIyKTsNCisJCWlmICh2YXIyID4gMCkNCisJCXsNCisJCQlpZiAoKExfdmFyMSAmICgoV29yZDMyKSAxIDw8ICh2YXIyIC0gMSkpKSAhPSAwKQ0KKwkJCXsNCisJCQkJTF92YXJfb3V0Kys7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiAoTF92YXJfb3V0KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogbm9ybV9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUHVycG9zZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFByb2R1Y2VzIHRoZSBudW1iZXIgb2YgbGVmdCBzaGlmdCBuZWVkZWQgdG8gbm9ybWFsaXplIHRoZSAxNiBiaXQgdmFyaWEtIHwNCit8ICAgYmxlIHZhcjEgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbiB0aGUgaW50ZXJ2YWwgd2l0aCBtaW5pbXVtIG9mIDE2Mzg0IGFuZCAgfA0KK3wgICBtYXhpbXVtIG9mIDMyNzY3LCBhbmQgZm9yIG5lZ2F0aXZlIHZhbHVlcyBvbiB0aGUgaW50ZXJ2YWwgd2l0aCBtaW5pbXVtICB8DQorfCAgIG9mIC0zMjc2OCBhbmQgbWF4aW11bSBvZiAtMTYzODQ7IGluIG9yZGVyIHRvIG5vcm1hbGl6ZSB0aGUgcmVzdWx0LCB0aGUgIHwNCit8ICAgZm9sbG93aW5nIG9wZXJhdGlvbiBtdXN0IGJlIGRvbmUgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgIG5vcm1fdmFyMSA9IHNobCh2YXIxLG5vcm1fcyh2YXIxKSkuICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgQ29tcGxleGl0eSB3ZWlnaHQgOiAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHhmZmZmIDgwMDAgPD0gdmFyMSA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIE91dHB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXJfb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXJfb3V0IDw9IDB4MDAwMCAwMDBmLiAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgbm9ybV9zIChXb3JkMTYgdmFyMSkNCit7DQorCVdvcmQxNiB2YXJfb3V0ID0gMDsNCisJaWYgKHZhcjEgPT0gMCkNCisJew0KKwkJdmFyX291dCA9IDA7DQorCX0NCisJZWxzZQ0KKwl7DQorCQlpZiAodmFyMSA9PSAtMSkNCisJCXsNCisJCQl2YXJfb3V0ID0gMTU7DQorCQl9DQorCQllbHNlDQorCQl7DQorCQkJaWYgKHZhcjEgPCAwKQ0KKwkJCXsNCisJCQkJdmFyMSA9IChXb3JkMTYpfnZhcjE7DQorCQkJfQ0KKwkJCWZvciAodmFyX291dCA9IDA7IHZhcjEgPCAweDQwMDA7IHZhcl9vdXQrKykNCisJCQl7DQorCQkJCXZhcjEgPDw9IDE7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IGRpdl9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQcm9kdWNlcyBhIHJlc3VsdCB3aGljaCBpcyB0aGUgZnJhY3Rpb25hbCBpbnRlZ2VyIGRpdmlzaW9uIG9mIHZhcjEgIGJ5ICB8DQorfCAgIHZhcjI7IHZhcjEgYW5kIHZhcjIgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgdmFyMiBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgIHwNCit8ICAgdG8gdmFyMTsgdGhlIHJlc3VsdCBpcyBwb3NpdGl2ZSAobGVhZGluZyBiaXQgZXF1YWwgdG8gMCkgYW5kIHRydW5jYXRlZCAgfA0KK3wgICB0byAxNiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIElmIHZhcjEgPSB2YXIyIHRoZW4gZGl2KHZhcjEsdmFyMikgPSAzMjc2Ny4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBDb21wbGV4aXR5IHdlaWdodCA6IDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgSW5wdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICB2YXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgIDE2IGJpdCBzaG9ydCBzaWduZWQgaW50ZWdlciAoV29yZDE2KSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgfA0KK3wgICAgICAgICAgICAgcmFuZ2UgOiAweDAwMDAgMDAwMCA8PSB2YXIxIDw9IHZhcjIgYW5kIHZhcjIgIT0gMC4gICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIHZhcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMTYgYml0IHNob3J0IHNpZ25lZCBpbnRlZ2VyIChXb3JkMTYpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSB8DQorfCAgICAgICAgICAgICByYW5nZSA6IHZhcjEgPD0gdmFyMiA8PSAweDAwMDAgN2ZmZiBhbmQgdmFyMiAhPSAwLiAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgN2ZmZi4gICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgSXQncyBhIFExNSB2YWx1ZSAocG9pbnQgYmV0d2VlbiBiMTUgYW5kIGIxNCkuICAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KKw0KK3N0YXRpY192byBXb3JkMTYgZGl2X3MgKFdvcmQxNiB2YXIxLCBXb3JkMTYgdmFyMikNCit7DQorCVdvcmQxNiB2YXJfb3V0ID0gMDsNCisJV29yZDE2IGl0ZXJhdGlvbjsNCisJV29yZDMyIExfbnVtOw0KKwlXb3JkMzIgTF9kZW5vbTsNCisJaWYgKCh2YXIxIDwgMCkgfHwgKHZhcjIgPCAwKSkNCisJew0KKwkJdmFyX291dCA9IE1BWF8xNjsNCisJCXJldHVybiB2YXJfb3V0Ow0KKwl9DQorCWlmICh2YXIyID09IDApDQorCXsNCisJCXZhcl9vdXQgPSBNQVhfMTY7DQorCQlyZXR1cm4gdmFyX291dDsNCisJfQ0KKwlpZiAodmFyMSA9PSAwKQ0KKwl7DQorCQl2YXJfb3V0ID0gMDsNCisJfQ0KKwllbHNlDQorCXsNCisJCWlmICh2YXIxID09IHZhcjIpDQorCQl7DQorCQkJdmFyX291dCA9IE1BWF8xNjsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlMX251bSA9IExfZGVwb3NpdF9sICh2YXIxKTsNCisJCQlMX2Rlbm9tID0gTF9kZXBvc2l0X2wodmFyMik7DQorCQkJZm9yIChpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCAxNTsgaXRlcmF0aW9uKyspDQorCQkJew0KKwkJCQl2YXJfb3V0IDw8PSAxOw0KKwkJCQlMX251bSA8PD0gMTsNCisJCQkJaWYgKExfbnVtID49IExfZGVub20pDQorCQkJCXsNCisJCQkJCUxfbnVtIC09IExfZGVub207ICAgICAgDQorCQkJCQl2YXJfb3V0ICs9IDE7ICAgICAgICAgIA0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IG5vcm1fbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBQcm9kdWNlcyB0aGUgbnVtYmVyIG9mIGxlZnQgc2hpZnRzIG5lZWRlZCB0byBub3JtYWxpemUgdGhlIDMyIGJpdCB2YXJpYS18DQorfCAgIGJsZSBMX3ZhcjEgZm9yIHBvc2l0aXZlIHZhbHVlcyBvbiB0aGUgaW50ZXJ2YWwgd2l0aCBtaW5pbXVtIG9mICAgICAgICAgIHwNCit8ICAgMTA3Mzc0MTgyNCBhbmQgbWF4aW11bSBvZiAyMTQ3NDgzNjQ3LCBhbmQgZm9yIG5lZ2F0aXZlIHZhbHVlcyBvbiB0aGUgaW4tfA0KK3wgICB0ZXJ2YWwgd2l0aCBtaW5pbXVtIG9mIC0yMTQ3NDgzNjQ4IGFuZCBtYXhpbXVtIG9mIC0xMDczNzQxODI0OyBpbiBvcmRlciB8DQorfCAgIHRvIG5vcm1hbGl6ZSB0aGUgcmVzdWx0LCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbiBtdXN0IGJlIGRvbmUgOiAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgIG5vcm1fTF92YXIxID0gTF9zaGwoTF92YXIxLG5vcm1fbChMX3ZhcjEpKS4gICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIENvbXBsZXhpdHkgd2VpZ2h0IDogMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBJbnB1dHMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIExfdmFyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgMzIgYml0IGxvbmcgc2lnbmVkIGludGVnZXIgKFdvcmQzMikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlICB8DQorfCAgICAgICAgICAgICByYW5nZSA6IDB4ODAwMCAwMDAwIDw9IHZhcjEgPD0gMHg3ZmZmIGZmZmYuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBPdXRwdXRzIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgIG5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgdmFyX291dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAxNiBiaXQgc2hvcnQgc2lnbmVkIGludGVnZXIgKFdvcmQxNikgd2hvc2UgdmFsdWUgZmFsbHMgaW4gdGhlIHwNCit8ICAgICAgICAgICAgIHJhbmdlIDogMHgwMDAwIDAwMDAgPD0gdmFyX291dCA8PSAweDAwMDAgMDAxZi4gICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitzdGF0aWNfdm8gV29yZDE2IG5vcm1fbCAoV29yZDMyIExfdmFyMSkNCit7DQorCVdvcmQxNiB2YXJfb3V0ID0gMDsNCisJaWYgKExfdmFyMSAhPSAwKQ0KKwl7DQorCQl2YXJfb3V0ID0gMzE7DQorCQlpZiAoTF92YXIxICE9IChXb3JkMzIpIDB4ZmZmZmZmZmZMKQ0KKwkJew0KKwkJCUxfdmFyMSBePSAoTF92YXIxID4+MzEpOw0KKwkJCWZvciAodmFyX291dCA9IDA7IExfdmFyMSA8IChXb3JkMzIpIDB4NDAwMDAwMDBMOyB2YXJfb3V0KyspDQorCQkJew0KKwkJCQlMX3ZhcjEgPDw9IDE7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybiAodmFyX291dCk7DQorfQ0KKw0KKyNlbmRpZiAvL19fQkFTSUNfT1BfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iaXRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2JpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE0NmRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iaXRzLmgKQEAgLTAsMCArMSw5MiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgQklUUy5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorKiAgICAgICBOdW1iZXIgb2YgYml0cyBmb3IgZGlmZmVyZW50IG1vZGVzCQkJICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaWZuZGVmIF9fQklUU19IX18NCisjZGVmaW5lIF9fQklUU19IX18NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImNvZF9tYWluLmgiDQorDQorI2RlZmluZSBOQkJJVFNfN2sgICAgIDEzMiAgICAgICAgICAgICAgICAgIC8qIDYuNjBrICAqLw0KKyNkZWZpbmUgTkJCSVRTXzlrICAgICAxNzcgICAgICAgICAgICAgICAgICAvKiA4Ljg1ayAgKi8NCisjZGVmaW5lIE5CQklUU18xMmsgICAgMjUzICAgICAgICAgICAgICAgICAgLyogMTIuNjVrICovDQorI2RlZmluZSBOQkJJVFNfMTRrICAgIDI4NSAgICAgICAgICAgICAgICAgIC8qIDE0LjI1ayAqLw0KKyNkZWZpbmUgTkJCSVRTXzE2ayAgICAzMTcgICAgICAgICAgICAgICAgICAvKiAxNS44NWsgKi8NCisjZGVmaW5lIE5CQklUU18xOGsgICAgMzY1ICAgICAgICAgICAgICAgICAgLyogMTguMjVrICovDQorI2RlZmluZSBOQkJJVFNfMjBrICAgIDM5NyAgICAgICAgICAgICAgICAgIC8qIDE5Ljg1ayAqLw0KKyNkZWZpbmUgTkJCSVRTXzIzayAgICA0NjEgICAgICAgICAgICAgICAgICAvKiAyMy4wNWsgKi8NCisjZGVmaW5lIE5CQklUU18yNGsgICAgNDc3ICAgICAgICAgICAgICAgICAgLyogMjMuODVrICovDQorDQorI2RlZmluZSBOQkJJVFNfU0lEICAgIDM1DQorI2RlZmluZSBOQl9CSVRTX01BWCAgIE5CQklUU18yNGsNCisNCisjZGVmaW5lIEJJVF8wICAgICAoV29yZDE2KS0xMjcNCisjZGVmaW5lIEJJVF8xICAgICAoV29yZDE2KTEyNw0KKyNkZWZpbmUgQklUXzBfSVRVIChXb3JkMTYpMHgwMDdGDQorI2RlZmluZSBCSVRfMV9JVFUgKFdvcmQxNikweDAwODENCisNCisjZGVmaW5lIFNJWkVfTUFYMSAgKDMrTkJfQklUU19NQVgpICAgICAgICAgIC8qIHNlcmlhbCBzaXplIG1heCAqLw0KKyNkZWZpbmUgVFhfRlJBTUVfVFlQRSAoV29yZDE2KTB4NmIyMQ0KKyNkZWZpbmUgUlhfRlJBTUVfVFlQRSAoV29yZDE2KTB4NmIyMA0KKw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgbmJfb2ZfYml0c1tOVU1fT0ZfTU9ERVNdID0gew0KKwlOQkJJVFNfN2ssDQorCU5CQklUU185aywNCisJTkJCSVRTXzEyaywNCisJTkJCSVRTXzE0aywNCisJTkJCSVRTXzE2aywNCisJTkJCSVRTXzE4aywNCisJTkJCSVRTXzIwaywNCisJTkJCSVRTXzIzaywNCisJTkJCSVRTXzI0aywNCisJTkJCSVRTX1NJRA0KK307DQorDQorLyp0eXBlZGVmIHN0cnVjdA0KK3sNCitXb3JkMTYgc2lkX3VwZGF0ZV9jb3VudGVyOw0KK1dvcmQxNiBzaWRfaGFuZG92ZXJfZGVidDsNCitXb3JkMTYgcHJldl9mdDsNCit9IFRYX1N0YXRlOw0KKyovDQorDQorLy90eXBlZGVmIHN0cnVjdA0KKy8vew0KKy8vCVdvcmQxNiBwcmV2X2Z0Ow0KKy8vCVdvcmQxNiBwcmV2X21vZGU7DQorLy99IFJYX1N0YXRlOw0KKw0KK2ludCBQYWNrQml0cyhXb3JkMTYgcHJtc1tdLCBXb3JkMTYgY29kaW5nX21vZGUsIFdvcmQxNiBtb2RlLCBDb2Rlcl9TdGF0ZSAqc3QpOw0KKw0KKw0KK3ZvaWQgUGFybV9zZXJpYWwoDQorCQlXb3JkMTYgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGFyYW1ldGVyIHZhbHVlICovDQorCQlXb3JkMTYgbm9fb2ZfYml0cywgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbnVtYmVyIG9mIGJpdHMgICovDQorCQlXb3JkMTYgKiogcHJtcw0KKwkJKTsNCisNCisNCisjZW5kaWYgIC8vX19CSVRTX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY25zdC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9jbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkYmQ4OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY25zdC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBDTlNULkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgQ29kZWMgY29uc3RhbnQgcGFyYW1ldGVycyAoY29kZXIgYW5kIGRlY29kZXIpICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaWZuZGVmIF9fQ05TVF9IX18NCisjZGVmaW5lIF9fQ05TVF9IX18NCisNCisjZGVmaW5lIExfRlJBTUUxNmsgICAzMjAgICAgICAgICAgICAgICAgICAgLyogRnJhbWUgc2l6ZSBhdCAxNmtIeiAgICAgICAgICAgICAgICAgICAgICAgICovDQorI2RlZmluZSBMX0ZSQU1FICAgICAgMjU2ICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgTF9TVUJGUjE2ayAgIDgwICAgICAgICAgICAgICAgICAgICAvKiBTdWJmcmFtZSBzaXplIGF0IDE2a0h6ICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisjZGVmaW5lIExfU1VCRlIgICAgICA2NCAgICAgICAgICAgICAgICAgICAgLyogU3ViZnJhbWUgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorI2RlZmluZSBOQl9TVUJGUiAgICAgNCAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzdWJmcmFtZSBwZXIgZnJhbWUgICAgICAgICAgICAgICAqLw0KKw0KKyNkZWZpbmUgTF9ORVhUICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAvKiBPdmVyaGVhZCBpbiBMUCBhbmFseXNpcyAgICAgICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIExfV0lORE9XICAgICAzODQgICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgaW4gTFAgYW5hbHlzaXMgICAgICAgICAgICAgICAgICovDQorI2RlZmluZSBMX1RPVEFMICAgICAgMzg0ICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIHNpemUgb2Ygc3BlZWNoIGJ1ZmZlci4gICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgTSAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAvKiBPcmRlciBvZiBMUCBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIE0xNmsgICAgICAgICAyMA0KKw0KKyNkZWZpbmUgTF9GSUxUMTZrICAgIDE1ICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBvZiBkb3duLXNhbXBsaW5nIGZpbHRlciAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIExfRklMVCAgICAgICAxMiAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgb2YgdXAtc2FtcGxpbmcgZmlsdGVyICAgICAgICAgICAgICAgICovDQorDQorI2RlZmluZSBHUF9DTElQICAgICAgMTU1NjUgICAgICAgICAgICAgICAgIC8qIFBpdGNoIGdhaW4gY2xpcHBpbmcgPSAwLjk1IFExNCAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgUElUX1NIQVJQICAgIDI3ODUzICAgICAgICAgICAgICAgICAvKiBwaXRjaCBzaGFycGVuaW5nIGZhY3RvciA9IDAuODUgUTE1ICAgICAgICAgKi8NCisNCisjZGVmaW5lIFBJVF9NSU4gICAgICAzNCAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSBwaXRjaCBsYWcgd2l0aCByZXNvbHV0aW9uIDEvNCAgICAgICovDQorI2RlZmluZSBQSVRfRlIyICAgICAgMTI4ICAgICAgICAgICAgICAgICAgIC8qIE1pbmltdW0gcGl0Y2ggbGFnIHdpdGggcmVzb2x1dGlvbiAxLzIgICAgICAqLw0KKyNkZWZpbmUgUElUX0ZSMV85YiAgIDE2MCAgICAgICAgICAgICAgICAgICAvKiBNaW5pbXVtIHBpdGNoIGxhZyB3aXRoIHJlc29sdXRpb24gMSAgICAgICAgKi8NCisjZGVmaW5lIFBJVF9GUjFfOGIgICA5MiAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSBwaXRjaCBsYWcgd2l0aCByZXNvbHV0aW9uIDEgICAgICAgICovDQorI2RlZmluZSBQSVRfTUFYICAgICAgMjMxICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgTF9JTlRFUlBPTCAgICgxNisxKSAgICAgICAgICAgICAgICAvKiBMZW5ndGggb2YgZmlsdGVyIGZvciBpbnRlcnBvbGF0aW9uICAgICAgICAgKi8NCisNCisjZGVmaW5lIE9QTF9ERUNJTSAgICAyICAgICAgICAgICAgICAgICAgICAgLyogRGVjaW1hdGlvbiBpbiBvcGVuLWxvb3AgcGl0Y2ggYW5hbHlzaXMgICAgICovDQorDQorI2RlZmluZSBQUkVFTVBIX0ZBQyAgMjIyODIgICAgICAgICAgICAgICAgIC8qIHByZWVtcGhhc2lzIGZhY3RvciAoMC42OCBpbiBRMTUpICAgICAgICAgICAqLw0KKyNkZWZpbmUgR0FNTUExICAgICAgIDMwMTQ3ICAgICAgICAgICAgICAgICAvKiBXZWlnaHRpbmcgZmFjdG9yIChudW1lcmF0b3IpICgwLjkyIGluIFExNSkgKi8NCisjZGVmaW5lIFRJTFRfRkFDICAgICAyMjI4MiAgICAgICAgICAgICAgICAgLyogdGlsdCBmYWN0b3IgKGRlbm9taW5hdG9yKSAoMC42OCBpbiBRMTUpICAgICovDQorDQorI2RlZmluZSBRX01BWCAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxpbmcgbWF4IGZvciBzaWduYWwgKHNlZSBzeW5fZmlsdF8zMikgICAqLw0KKw0KKyNkZWZpbmUgUkFORE9NX0lOSVRTRUVEICAyMTg0NSAgICAgICAgICAgICAvKiBvd24gcmFuZG9tIGluaXQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisjZGVmaW5lIExfTUVBTkJVRiAgICAgICAgMw0KKyNkZWZpbmUgT05FX1BFUl9NRUFOQlVGIDEwOTIzDQorDQorI2RlZmluZSBNT0RFXzdrICAgICAgIDANCisjZGVmaW5lIE1PREVfOWsgICAgICAgMQ0KKyNkZWZpbmUgTU9ERV8xMmsgICAgICAyDQorI2RlZmluZSBNT0RFXzE0ayAgICAgIDMNCisjZGVmaW5lIE1PREVfMTZrICAgICAgNA0KKyNkZWZpbmUgTU9ERV8xOGsgICAgICA1DQorI2RlZmluZSBNT0RFXzIwayAgICAgIDYNCisjZGVmaW5lIE1PREVfMjNrICAgICAgNw0KKyNkZWZpbmUgTU9ERV8yNGsgICAgICA4DQorI2RlZmluZSBNUkRUWCAgICAgICAgIDkNCisjZGVmaW5lIE5VTV9PRl9NT0RFUyAgMTAgICAgICAgICAgICAgICAgICAgLyogc2VlIGJpdHMuaCBmb3IgYml0cyBkZWZpbml0aW9uICAgICAgICAgICAgICovDQorDQorI2RlZmluZSBFSEZfTUFTSyAoV29yZDE2KTB4MDAwOCAgICAgICAgICAgIC8qIGhvbWluZyBmcmFtZSBwYXR0ZXJuICAgICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKyNlbmRpZiAvL19fQ05TVF9IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2NvZF9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkNTc4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY29kX21haW4uaApAQCAtMCwwICsxLDEwMyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIENPRF9NQUlOLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICBTdGF0aWMgbWVtb3J5IGluIHRoZSBlbmNvZGVyCQkJCSAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisjaWZuZGVmIF9fQ09EX01BSU5fSF9fDQorI2RlZmluZSBfX0NPRF9NQUlOX0hfXw0KKw0KKyNpbmNsdWRlICJjbnN0LmgiICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlciBjb25zdGFudCBwYXJhbWV0ZXJzICovDQorDQorI2luY2x1ZGUgIndiX3ZhZC5oIg0KKyNpbmNsdWRlICJkdHguaCINCisjaW5jbHVkZSAic3RyZWFtLmgiDQorI2luY2x1ZGUgInZvQU1SV0IuaCINCisNCit0eXBlZGVmIHN0cnVjdA0KK3sNCisgICAgV29yZDE2IG1lbV9kZWNpbVsyICogTF9GSUxUMTZrXTsgICAgICAgLyogc3BlZWNoIGRlY2ltYXRlZCBmaWx0ZXIgbWVtb3J5ICovDQorICAgIFdvcmQxNiBtZW1fc2lnX2luWzZdOyAgICAgICAgICAgICAgICAgIC8qIGhwNTAgZmlsdGVyIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgbWVtX3ByZWVtcGg7ICAgICAgICAgICAgICAgICAgICAvKiBzcGVlY2ggcHJlZW1waCBmaWx0ZXIgbWVtb3J5ICovDQorICAgIFdvcmQxNiBvbGRfc3BlZWNoW0xfVE9UQUwgLSBMX0ZSQU1FXTsgIC8qIG9sZCBzcGVlY2ggdmVjdG9yIGF0IDEyLjhrSHogKi8NCisgICAgV29yZDE2IG9sZF93c3BbUElUX01BWCAvIE9QTF9ERUNJTV07ICAgLyogb2xkIGRlY2ltYXRlZCB3ZWlnaHRlZCBzcGVlY2ggdmVjdG9yICovDQorICAgIFdvcmQxNiBvbGRfZXhjW1BJVF9NQVggKyBMX0lOVEVSUE9MXTsgIC8qIG9sZCBleGNpdGF0aW9uIHZlY3RvciAqLw0KKyAgICBXb3JkMTYgbWVtX2xldmluc29uW00gKyAyXTsgICAgICAgICAgICAvKiBsZXZpbnNvbiByb3V0aW5lIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgaXNwb2xkW01dOyAgICAgICAgICAgICAgICAgICAgICAvKiBvbGQgaXNwIChpbW1pdHRhbmNlIHNwZWN0cmFsIHBhaXJzKSAqLw0KKyAgICBXb3JkMTYgaXNwb2xkX3FbTV07ICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6ZWQgb2xkIGlzcCAqLw0KKyAgICBXb3JkMTYgcGFzdF9pc2ZxW01dOyAgICAgICAgICAgICAgICAgICAvKiBwYXN0IGlzZiBxdWFudGl6ZXIgKi8NCisgICAgV29yZDE2IG1lbV93c3A7ICAgICAgICAgICAgICAgICAgICAgICAgLyogd3NwIHZlY3RvciBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV9kZWNpbTJbM107ICAgICAgICAgICAgICAgICAgLyogd3NwIGRlY2ltYXRpb24gZmlsdGVyIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgbWVtX3cwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgdmVjdG9yIG1lbW9yeSAqLw0KKyAgICBXb3JkMTYgbWVtX3N5bltNXTsgICAgICAgICAgICAgICAgICAgICAvKiBzeW50aGVzaXMgbWVtb3J5ICovDQorICAgIFdvcmQxNiB0aWx0X2NvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbHQgb2YgY29kZSAqLw0KKyAgICBXb3JkMTYgb2xkX3dzcF9tYXg7ICAgICAgICAgICAgICAgICAgICAvKiBvbGQgd3NwIG1heGltdW0gdmFsdWUgKi8NCisgICAgV29yZDE2IG9sZF93c3Bfc2hpZnQ7ICAgICAgICAgICAgICAgICAgLyogb2xkIHdzcCBzaGlmdCAqLw0KKyAgICBXb3JkMTYgUV9vbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbGQgc2NhbGluZyBmYWN0b3IgKi8NCisgICAgV29yZDE2IFFfbWF4WzJdOyAgICAgICAgICAgICAgICAgICAgICAgLyogb2xkIG1heGltdW0gc2NhbGluZyBmYWN0b3IgKi8NCisgICAgV29yZDE2IGdwX2NsaXBbMl07ICAgICAgICAgICAgICAgICAgICAgLyogZ2FpbiBvZiBwaXRjaCBjbGlwcGluZyBtZW1vcnkgKi8NCisgICAgV29yZDE2IHF1YV9nYWluWzRdOyAgICAgICAgICAgICAgICAgICAgLyogZ2FpbiBxdWFudGl6ZXIgbWVtb3J5ICovDQorDQorICAgIFdvcmQxNiBvbGRfVDBfbWVkOw0KKyAgICBXb3JkMTYgb2xfZ2FpbjsNCisgICAgV29yZDE2IGFkYV93Ow0KKyAgICBXb3JkMTYgb2xfd2dodF9mbGc7DQorICAgIFdvcmQxNiBvbGRfb2xfbGFnWzVdOw0KKyAgICBXb3JkMTYgaHBfd3NwX21lbVs5XTsNCisgICAgV29yZDE2IG9sZF9ocF93c3BbTF9GUkFNRSAvIE9QTF9ERUNJTSArIChQSVRfTUFYIC8gT1BMX0RFQ0lNKV07DQorICAgIFZhZFZhcnMgKnZhZFN0Ow0KKyAgICBkdHhfZW5jU3RhdGUgKmR0eF9lbmNTdDsNCisgICAgV29yZDE2IGZpcnN0X2ZyYW1lOw0KKyAgICBXb3JkMTYgaXNmb2xkW01dOyAgICAgICAgICAgICAgICAgICAgICAvKiBvbGQgaXNmIChmcmVxdWVuY3kgZG9tYWluKSAqLw0KKyAgICBXb3JkMzIgTF9nY190aHJlczsgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZm9yIG5vaXNlIGVuaGFuY2VyICovDQorICAgIFdvcmQxNiBtZW1fc3luX2hpW01dOyAgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVkIHN5bnRoZXNpcyBtZW1vcnkgKE1TQikgKi8NCisgICAgV29yZDE2IG1lbV9zeW5fbG9bTV07ICAgICAgICAgICAgICAgICAgLyogbW9kaWZpZWQgc3ludGhlc2lzIG1lbW9yeSAoTFNCKSAqLw0KKyAgICBXb3JkMTYgbWVtX2RlZW1waDsgICAgICAgICAgICAgICAgICAgICAvKiBzcGVlY2ggZGVlbXBoIGZpbHRlciBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV9zaWdfb3V0WzZdOyAgICAgICAgICAgICAgICAgLyogaHA1MCBmaWx0ZXIgbWVtb3J5IGZvciBzeW50aGVzaXMgKi8NCisgICAgV29yZDE2IG1lbV9ocDQwMFs2XTsgICAgICAgICAgICAgICAgICAgLyogaHA0MDAgZmlsdGVyIG1lbW9yeSBmb3Igc3ludGhlc2lzICovDQorICAgIFdvcmQxNiBtZW1fb3ZlcnNhbXBbMiAqIExfRklMVF07ICAgICAgIC8qIHN5bnRoZXNpcyBvdmVyc2FtcGxlZCBmaWx0ZXIgbWVtb3J5ICovDQorICAgIFdvcmQxNiBtZW1fc3luX2hmW01dOyAgICAgICAgICAgICAgICAgIC8qIEhGIHN5bnRoZXNpcyBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV9oZlsyICogTF9GSUxUMTZrXTsgICAgICAgICAgLyogSEYgYmFuZC1wYXNzIGZpbHRlciBtZW1vcnkgKi8NCisgICAgV29yZDE2IG1lbV9oZjJbMiAqIExfRklMVDE2a107ICAgICAgICAgLyogSEYgYmFuZC1wYXNzIGZpbHRlciBtZW1vcnkgKi8NCisgICAgV29yZDE2IHNlZWQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmFuZG9tIG1lbW9yeSBmb3IgSEYgZ2VuZXJhdGlvbiAqLw0KKyAgICBXb3JkMTYgdmFkX2hpc3Q7DQorICAgIFdvcmQxNiBnYWluX2FscGhhOw0KKyAgICAvKiAgVFhfU3RhdGUgc3RydWN0dXJlICAqLw0KKwlXb3JkMTYgc2lkX3VwZGF0ZV9jb3VudGVyOw0KKyAgICBXb3JkMTYgc2lkX2hhbmRvdmVyX2RlYnQ7DQorICAgIFdvcmQxNiBwcmV2X2Z0Ow0KKwlXb3JkMTYgYWxsb3dfZHR4Ow0KKwkvKnNvbWUgaW5wdXQvb3V0cHV0IGJ1ZmZlciBwYXJhbWV0ZXJzICovDQorCXVuc2lnbmVkIGNoYXIgICAgICAgKmlucHV0U3RyZWFtOw0KKwlpbnQJCQkgICAgICAgIGlucHV0U2l6ZTsNCisJVk9BTVJXQk1PREUgIAkJbW9kZTsNCisJVk9BTVJXQkZSQU1FVFlQRQlmcmFtZVR5cGU7DQorCXVuc2lnbmVkIHNob3J0ICAgICAgKm91dHB1dFN0cmVhbTsNCisJaW50CQkJICAgICAgICBvdXRwdXRTaXplOw0KKwlGcmFtZVN0cmVhbSAgICAgICAgICpzdHJlYW07DQorCVZPX01FTV9PUEVSQVRPUiAgICAgKnB2b01lbW9wOw0KKwlWT19NRU1fT1BFUkFUT1IgICAgIHZvTWVtb3ByYXRvcjsNCisJVk9fUFRSICAgICAgICAgICAgICBoQ2hlY2s7DQorfSBDb2Rlcl9TdGF0ZTsNCisNCit0eXBlZGVmIHZvaWQqIEhBTVJFTkM7DQorDQorI2VuZGlmICAvL19fQ09EX01BSU5fSF9fDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9kdHguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZHR4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyYzJkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZHR4LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBEVFguSAkJCQkJICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgIFN0YXRpYyBtZW1vcnksIGNvbnN0YW50cyBhbmQgZnJhbWV0eXBlcyBmb3IgdGhlIERUWCAJCSAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX0RUWF9IX18NCisjZGVmaW5lIF9fRFRYX0hfXw0KKw0KKyNkZWZpbmUgRFRYX01BWF9FTVBUWV9USFJFU0ggNTANCisjZGVmaW5lIERUWF9ISVNUX1NJWkUgOA0KKyNkZWZpbmUgRFRYX0hJU1RfU0laRV9NSU5fT05FIDcNCisjZGVmaW5lIERUWF9FTEFQU0VEX0ZSQU1FU19USFJFU0ggKDI0ICsgNyAtMSkNCisjZGVmaW5lIERUWF9IQU5HX0NPTlNUIDcgICAgICAgICAgICAgICAgICAgLyogeWllbGRzIGVpZ2h0IGZyYW1lcyBvZiBTUCBIQU5HT1ZFUiAgKi8NCisjZGVmaW5lIElOVl9NRURfVEhSRVNIIDE0NTY0DQorI2RlZmluZSBJU0ZfR0FQICAxMjggICAgICAgICAgICAgICAgICAgICAgIC8qIDUwICovDQorI2RlZmluZSBPTkVfTUlOVVNfSVNGX0dBUCAxNjM4NCAtIElTRl9HQVANCisjZGVmaW5lIElTRl9HQVAgICAxMjgNCisjZGVmaW5lIElTRl9ESVRIX0dBUCAgIDQ0OA0KKyNkZWZpbmUgSVNGX0ZBQ1RPUl9MT1cgMjU2DQorI2RlZmluZSBJU0ZfRkFDVE9SX1NURVAgMg0KKyNkZWZpbmUgR0FJTl9USFIgMTgwDQorI2RlZmluZSBHQUlOX0ZBQ1RPUiA3NQ0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICBXb3JkMTYgaXNmX2hpc3RbTSAqIERUWF9ISVNUX1NJWkVdOw0KKyAgICBXb3JkMTYgbG9nX2VuX2hpc3RbRFRYX0hJU1RfU0laRV07DQorICAgIFdvcmQxNiBoaXN0X3B0cjsNCisgICAgV29yZDE2IGxvZ19lbl9pbmRleDsNCisgICAgV29yZDE2IGNuZ19zZWVkOw0KKyAgICAvKiBEVFggaGFuZGxlciBzdHVmZiAqLw0KKyAgICBXb3JkMTYgZHR4SGFuZ292ZXJDb3VudDsNCisgICAgV29yZDE2IGRlY0FuYUVsYXBzZWRDb3VudDsNCisgICAgV29yZDMyIERbMjhdOw0KKyAgICBXb3JkMzIgc3VtRFtEVFhfSElTVF9TSVpFXTsNCit9IGR0eF9lbmNTdGF0ZTsNCisNCisjZGVmaW5lIFNQRUVDSCAwDQorI2RlZmluZSBEVFggMQ0KKyNkZWZpbmUgRFRYX01VVEUgMg0KKw0KKyNkZWZpbmUgVFhfU1BFRUNIIDANCisjZGVmaW5lIFRYX1NJRF9GSVJTVCAxDQorI2RlZmluZSBUWF9TSURfVVBEQVRFIDINCisjZGVmaW5lIFRYX05PX0RBVEEgMw0KKw0KKyNkZWZpbmUgUlhfU1BFRUNIX0dPT0QgMA0KKyNkZWZpbmUgUlhfU1BFRUNIX1BST0JBQkxZX0RFR1JBREVEIDENCisjZGVmaW5lIFJYX1NQRUVDSF9MT1NUIDINCisjZGVmaW5lIFJYX1NQRUVDSF9CQUQgMw0KKyNkZWZpbmUgUlhfU0lEX0ZJUlNUIDQNCisjZGVmaW5lIFJYX1NJRF9VUERBVEUgNQ0KKyNkZWZpbmUgUlhfU0lEX0JBRCA2DQorI2RlZmluZSBSWF9OT19EQVRBIDcNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqIERFRklOSVRJT04gT0YgREFUQSBUWVBFUw0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitXb3JkMTYgZHR4X2VuY19pbml0KGR0eF9lbmNTdGF0ZSAqKiBzdCwgV29yZDE2IGlzZl9pbml0W10sIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsNCitXb3JkMTYgZHR4X2VuY19yZXNldChkdHhfZW5jU3RhdGUgKiBzdCwgV29yZDE2IGlzZl9pbml0W10pOw0KK3ZvaWQgZHR4X2VuY19leGl0KGR0eF9lbmNTdGF0ZSAqKiBzdCwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOw0KKw0KK1dvcmQxNiBkdHhfZW5jKA0KKyAgICAgZHR4X2VuY1N0YXRlICogc3QsICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgaXNmW01dLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIG8gICA6IENOIElTRiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqIGV4YzIsICAgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogQ04gZXhjaXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2ICoqIHBybXMNCispOw0KKw0KK1dvcmQxNiBkdHhfYnVmZmVyKA0KKyAgICAgZHR4X2VuY1N0YXRlICogc3QsICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgaXNmX25ld1tdLCAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IGlzZiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQzMiBlbnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogcmVzaWR1YWwgZW5lcmd5IChpbiBMX0ZSQU1FKSAgICAqLw0KKyAgICAgV29yZDE2IGNvZGVjX21vZGUNCispOw0KKw0KK3ZvaWQgdHhfZHR4X2hhbmRsZXIoZHR4X2VuY1N0YXRlICogc3QsICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3QgICAgICAgICAgICovDQorICAgICBXb3JkMTYgdmFkX2ZsYWcsICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHZhZCBkZWNpc2lvbiAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqIHVzZWRNb2RlICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogbW9kZSBjaGFuZ2VkIG9yIG5vdCAgICAqLw0KKyk7DQorDQordm9pZCBRaXNmX25zKA0KKyAgICAgV29yZDE2ICogaXNmMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKyAgICAgV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgV29yZDE2ICogaW5kaWNlICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAqLw0KKyk7DQorDQorDQordm9pZCBEaXNmX25zKA0KKyAgICAgV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAgKi8NCisgICAgIFdvcmQxNiAqIGlzZl9xICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgICovDQorKTsNCisNCisjZW5kaWYgIC8vX19EVFhfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ncmlkMTAwLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZ3JpZDEwMC50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlZTE4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvZ3JpZDEwMC50YWIKQEAgLTAsMCArMSw1MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogIFRhYmxlIGZvciBhel9pc3AoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBWZWN0b3IgZ3JpZFtdIGlzIGluIFExNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIGdyaWRbMF0gPSAxLjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBncmlkW2dyaWRfcG9pbnRzKzFdID0gLTEuMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogZm9yIChpID0gMTsgaSA8IGdyaWRfcG9pbnRzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgZ3JpZFtpXSA9IGNvcygoNi4yODMxODUzMDcqaSkvKDIuMCpncmlkX3BvaW50cykpOyAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKiBWZXJzaW9uIDEwMSBwb2ludHMgKi8NCisNCisjZGVmaW5lICAgR1JJRF9QT0lOVFMgICAgIDEwMA0KKw0KK2NvbnN0IFdvcmQxNiB2b2dyaWRbR1JJRF9QT0lOVFMrMV0gPXsNCisgICAgMzI3NjcsICAgICAzMjc1MSwgICAgIDMyNzAzLCAgICAgMzI2MjIsICAgICAzMjUwOSwgICAgIDMyMzY0LA0KKyAgICAzMjE4NywgICAgIDMxOTc4LCAgICAgMzE3MzgsICAgICAzMTQ2NiwgICAgIDMxMTY0LCAgICAgMzA4MzAsDQorICAgIDMwNDY2LCAgICAgMzAwNzIsICAgICAyOTY0OSwgICAgIDI5MTk2LCAgICAgMjg3MTQsICAgICAyODIwNCwNCisgICAgMjc2NjYsICAgICAyNzEwMSwgICAgIDI2NTA5LCAgICAgMjU4OTEsICAgICAyNTI0OCwgICAgIDI0NTc5LA0KKyAgICAyMzg4NiwgICAgIDIzMTcwLCAgICAgMjI0MzEsICAgICAyMTY2OSwgICAgIDIwODg3LCAgICAgMjAwODMsDQorICAgIDE5MjYwLCAgICAgMTg0MTgsICAgICAxNzU1NywgICAgIDE2NjgwLCAgICAgMTU3ODYsICAgICAxNDg3NiwNCisgICAgMTM5NTEsICAgICAxMzAxMywgICAgIDEyMDYyLCAgICAgMTEwOTksICAgICAxMDEyNSwgICAgICA5MTQxLA0KKyAgICAgODE0OSwgICAgICA3MTQ4LCAgICAgIDYxNDAsICAgICAgNTEyNiwgICAgICA0MTA2LCAgICAgIDMwODMsDQorICAgICAyMDU3LCAgICAgIDEwMjksICAgICAgICAgMCwgICAgIC0xMDI5LCAgICAgLTIwNTcsICAgICAtMzA4MywNCisgICAgLTQxMDYsICAgICAtNTEyNiwgICAgIC02MTQwLCAgICAgLTcxNDgsICAgICAtODE0OSwgICAgIC05MTQxLA0KKyAgIC0xMDEyNSwgICAgLTExMDk5LCAgICAtMTIwNjIsICAgIC0xMzAxMywgICAgLTEzOTUxLCAgICAtMTQ4NzYsDQorICAgLTE1Nzg2LCAgICAtMTY2ODAsICAgIC0xNzU1NywgICAgLTE4NDE4LCAgICAtMTkyNjAsICAgIC0yMDA4MywNCisgICAtMjA4ODcsICAgIC0yMTY2OSwgICAgLTIyNDMxLCAgICAtMjMxNzAsICAgIC0yMzg4NiwgICAgLTI0NTc5LA0KKyAgIC0yNTI0OCwgICAgLTI1ODkxLCAgICAtMjY1MDksICAgIC0yNzEwMSwgICAgLTI3NjY2LCAgICAtMjgyMDQsDQorICAgLTI4NzE0LCAgICAtMjkxOTYsICAgIC0yOTY0OSwgICAgLTMwMDcyLCAgICAtMzA0NjYsICAgIC0zMDgzMCwNCisgICAtMzExNjQsICAgIC0zMTQ2NiwgICAgLTMxNzM4LCAgICAtMzE5NzgsICAgIC0zMjE4NywgICAgLTMyMzY0LA0KKyAgIC0zMjUwOSwgICAgLTMyNjIyLCAgICAtMzI3MDMsICAgIC0zMjc1MSwgICAgLTMyNzYwfTsNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hhbV93aW5kLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaGFtX3dpbmQudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZjg2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hhbV93aW5kLnRhYgpAQCAtMCwwICsxLDczIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qIEhhbW1pbmdfY29zIHdpbmRvdyBmb3IgTFBDIGFuYWx5c2lzLiAgICAgICAgICAgICAgICAgKi8NCisvKiAgIENyZWF0ZSB3aXRoIGZ1bmN0aW9uIGhhbW1fY29zKHdpbmRvdywzODQtMTI4LDEyOCkgICovDQorDQorI2RlZmluZSBMX1dJTkRPVyAzODQNCisNCitjb25zdCBXb3JkMTYgdm9fd2luZG93W0xfV0lORE9XXSA9IHsNCisgICAgMjYyMSwgICAgMjYyMiwgICAgMjYyNiwgICAgMjYzMiwgICAgMjY0MCwgICAgMjY1MCwgICAgMjY2MiwgICAgMjY3NywNCisgICAgMjY5NCwgICAgMjcxNCwgICAgMjczNSwgICAgMjc1OSwgICAgMjc4NSwgICAgMjgxNCwgICAgMjg0NCwgICAgMjg3NywNCisgICAgMjkxMiwgICAgMjk0OSwgICAgMjk4OSwgICAgMzAzMSwgICAgMzA3NSwgICAgMzEyMSwgICAgMzE2OSwgICAgMzIyMCwNCisgICAgMzI3MywgICAgMzMyOCwgICAgMzM4NSwgICAgMzQ0NCwgICAgMzUwNiwgICAgMzU2OSwgICAgMzYzNSwgICAgMzcwMywNCisgICAgMzc3MywgICAgMzg0NSwgICAgMzkxOSwgICAgMzk5NiwgICAgNDA3NCwgICAgNDE1NSwgICAgNDIzNywgICAgNDMyMSwNCisgICAgNDQwOCwgICAgNDQ5NiwgICAgNDU4NywgICAgNDY4MCwgICAgNDc3NCwgICAgNDg3MCwgICAgNDk2OSwgICAgNTA2OSwNCisgICAgNTE3MSwgICAgNTI3NSwgICAgNTM4MSwgICAgNTQ4OSwgICAgNTU5OSwgICAgNTcxMCwgICAgNTgyNCwgICAgNTkzOSwNCisgICAgNjA1NiwgICAgNjE3NCwgICAgNjI5NSwgICAgNjQxNywgICAgNjU0MSwgICAgNjY2NiwgICAgNjc5MywgICAgNjkyMiwNCisgICAgNzA1MiwgICAgNzE4NSwgICAgNzMxOCwgICAgNzQ1MywgICAgNzU5MCwgICAgNzcyOCwgICAgNzg2OCwgICAgODAwOSwNCisgICAgODE1MiwgICAgODI5NiwgICAgODQ0MiwgICAgODU4OSwgICAgODczNywgICAgODg4NywgICAgOTAzOCwgICAgOTE5MSwNCisgICAgOTM0NCwgICAgOTQ5OSwgICAgOTY1NSwgICAgOTgxMywgICAgOTk3MSwgICAxMDEzMSwgICAxMDI5MiwgICAxMDQ1NCwNCisgICAxMDYxNywgICAxMDc4MSwgICAxMDk0NiwgICAxMTExMywgICAxMTI4MCwgICAxMTQ0OCwgICAxMTYxNywgICAxMTc4NywNCisgICAxMTk1OCwgICAxMjEzMCwgICAxMjMwMywgICAxMjQ3NiwgICAxMjY1MCwgICAxMjgyNSwgICAxMzAwMSwgICAxMzE3OCwNCisgICAxMzM1NSwgICAxMzUzMywgICAxMzcxMSwgICAxMzg5MCwgICAxNDA3MCwgICAxNDI1MCwgICAxNDQzMSwgICAxNDYxMiwNCisgICAxNDc5MywgICAxNDk3NSwgICAxNTE1OCwgICAxNTM0MSwgICAxNTUyNCwgICAxNTcwOCwgICAxNTg5MSwgICAxNjA3NiwNCisgICAxNjI2MCwgICAxNjQ0NSwgICAxNjYyOSwgICAxNjgxNCwgICAxNjk5OSwgICAxNzE4NSwgICAxNzM3MCwgICAxNzU1NSwNCisgICAxNzc0MCwgICAxNzkyNiwgICAxODExMSwgICAxODI5NiwgICAxODQ4MSwgICAxODY2NiwgICAxODg1MSwgICAxOTAzNiwNCisgICAxOTIyMSwgICAxOTQwNSwgICAxOTU4OSwgICAxOTc3MywgICAxOTk1NiwgICAyMDEzOSwgICAyMDMyMiwgICAyMDUwNCwNCisgICAyMDY4NiwgICAyMDg2NywgICAyMTA0OCwgICAyMTIyOSwgICAyMTQwOCwgICAyMTU4OCwgICAyMTc2NywgICAyMTk0NSwNCisgICAyMjEyMiwgICAyMjI5OSwgICAyMjQ3NSwgICAyMjY1MSwgICAyMjgyNSwgICAyMjk5OSwgICAyMzE3MiwgICAyMzM0NCwNCisgICAyMzUxNiwgICAyMzY4NiwgICAyMzg1NiwgICAyNDAyNSwgICAyNDE5MiwgICAyNDM1OSwgICAyNDUyNSwgICAyNDY4OSwNCisgICAyNDg1MywgICAyNTAxNiwgICAyNTE3NywgICAyNTMzNywgICAyNTQ5NiwgICAyNTY1NCwgICAyNTgxMSwgICAyNTk2NywNCisgICAyNjEyMSwgICAyNjI3NCwgICAyNjQyNiwgICAyNjU3NiwgICAyNjcyNSwgICAyNjg3MywgICAyNzAxOSwgICAyNzE2NCwNCisgICAyNzMwOCwgICAyNzQ1MCwgICAyNzU5MCwgICAyNzcyOSwgICAyNzg2NywgICAyODAwMywgICAyODEzNywgICAyODI3MCwNCisgICAyODQwMSwgICAyODUzMSwgICAyODY1OSwgICAyODc4NSwgICAyODkxMCwgICAyOTAzMywgICAyOTE1NCwgICAyOTI3NCwNCisgICAyOTM5MSwgICAyOTUwNywgICAyOTYyMiwgICAyOTczNCwgICAyOTg0NSwgICAyOTk1MywgICAzMDA2MCwgICAzMDE2NSwNCisgICAzMDI2OCwgICAzMDM3MCwgICAzMDQ2OSwgICAzMDU2NiwgICAzMDY2MiwgICAzMDc1NSwgICAzMDg0NywgICAzMDkzNiwNCisgICAzMTAyNCwgICAzMTEwOSwgICAzMTE5MywgICAzMTI3NCwgICAzMTM1NCwgICAzMTQzMSwgICAzMTUwNiwgICAzMTU3OSwNCisgICAzMTY1MSwgICAzMTcxOSwgICAzMTc4NiwgICAzMTg1MSwgICAzMTkxNCwgICAzMTk3NCwgICAzMjAzMiwgICAzMjA4OCwNCisgICAzMjE0MiwgICAzMjE5NCwgICAzMjI0MywgICAzMjI5MSwgICAzMjMzNiwgICAzMjM3OSwgICAzMjQxOSwgICAzMjQ1OCwNCisgICAzMjQ5NCwgICAzMjUyOCwgICAzMjU2MCwgICAzMjU4OSwgICAzMjYxNywgICAzMjY0MiwgICAzMjY2NCwgICAzMjY4NSwNCisgICAzMjcwMywgICAzMjcxOSwgICAzMjczMywgICAzMjc0NCwgICAzMjc1MywgICAzMjc2MCwgICAzMjc2NCwgICAzMjc2NywNCisgICAzMjc2NywgICAzMjc2NSwgICAzMjc1NywgICAzMjc0NSwgICAzMjcyNywgICAzMjcwNSwgICAzMjY3OCwgICAzMjY0NiwNCisgICAzMjYwOSwgICAzMjU2NywgICAzMjUyMCwgICAzMjQ2OCwgICAzMjQxMSwgICAzMjM0OSwgICAzMjI4MywgICAzMjIxMSwNCisgICAzMjEzNSwgICAzMjA1NCwgICAzMTk2OCwgICAzMTg3NywgICAzMTc4MSwgICAzMTY4MSwgICAzMTU3NSwgICAzMTQ2NSwNCisgICAzMTM1MSwgICAzMTIzMSwgICAzMTEwNywgICAzMDk3OCwgICAzMDg0NCwgICAzMDcwNiwgICAzMDU2MywgICAzMDQxNSwNCisgICAzMDI2MywgICAzMDEwNiwgICAyOTk0NSwgICAyOTc3OSwgICAyOTYwOSwgICAyOTQzNCwgICAyOTI1NSwgICAyOTA3MSwNCisgICAyODg4MywgICAyODY5MSwgICAyODQ5NCwgICAyODI5MywgICAyODA4NywgICAyNzg3OCwgICAyNzY2NCwgICAyNzQ0NiwNCisgICAyNzIyNCwgICAyNjk5NywgICAyNjc2NywgICAyNjUzMywgICAyNjI5NCwgICAyNjA1MiwgICAyNTgwNiwgICAyNTU1NSwNCisgICAyNTMwMSwgICAyNTA0MywgICAyNDc4MiwgICAyNDUxNiwgICAyNDI0NywgICAyMzk3NCwgICAyMzY5OCwgICAyMzQxOCwNCisgICAyMzEzNCwgICAyMjg0NywgICAyMjU1NywgICAyMjI2MywgICAyMTk2NSwgICAyMTY2NSwgICAyMTM2MSwgICAyMTA1NCwNCisgICAyMDc0MywgICAyMDQzMCwgICAyMDExMywgICAxOTc5NCwgICAxOTQ3MSwgICAxOTE0NiwgICAxODgxNywgICAxODQ4NiwNCisgICAxODE1MiwgICAxNzgxNSwgICAxNzQ3NiwgICAxNzEzNCwgICAxNjc4OSwgICAxNjQ0MiwgICAxNjA5MiwgICAxNTc0MCwNCisgICAxNTM4NSwgICAxNTAyOCwgICAxNDY2OSwgICAxNDMwOCwgICAxMzk0NCwgICAxMzU3OSwgICAxMzIxMSwgICAxMjg0MSwNCisgICAxMjQ3MCwgICAxMjA5NiwgICAxMTcyMSwgICAxMTM0NCwgICAxMDk2NSwgICAxMDU4NCwgICAxMDIwMiwgICAgOTgxOSwNCisgICAgOTQzMywgICAgOTA0NywgICAgODY1OSwgICAgODI3MCwgICAgNzg3OSwgICAgNzQ4OCwgICAgNzA5NSwgICAgNjcwMSwNCisgICAgNjMwNiwgICAgNTkxMCwgICAgNTUxNCwgICAgNTExNiwgICAgNDcxOCwgICAgNDMxOSwgICAgMzkxOSwgICAgMzUxOSwNCisgICAgMzExOCwgICAgMjcxNiwgICAgMjMxNSwgICAgMTkxMywgICAgMTUxMCwgICAgMTEwOCwgICAgIDcwNSwgICAgIDMwMn07DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ob21pbmcudGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ob21pbmcudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjNkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2hvbWluZy50YWIKQEAgLTAsMCArMSwxMjMgQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorDQorI2RlZmluZSBESEZfUEFSTVNfTUFYIDMyICAgICAgICAgICAgICAgLyogaG9taW5nIGZyYW1lIHBhdHRlcm4gICovDQorI2RlZmluZSBOVU1fT0ZfU1BNT0RFUyA5DQorDQorI2RlZmluZSBQUk1MIDE1DQorI2RlZmluZSBQUk1OXzdrIE5CQklUU183ay9QUk1MICsgMQ0KKyNkZWZpbmUgUFJNTl85ayBOQkJJVFNfOWsvUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMTJrIE5CQklUU18xMmsvUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMTRrIE5CQklUU18xNGsvUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMTZrIE5CQklUU18xNmsvUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMThrIE5CQklUU18xOGsvUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMjBrIE5CQklUU18yMGsvUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMjNrIE5CQklUU18yM2svUFJNTCArIDENCisjZGVmaW5lIFBSTU5fMjRrIE5CQklUU18yNGsvUFJNTCArIDENCisNCitzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NN2tbUFJNTl83a10gPQ0KK3sNCisgIDMxNjgsIDI5OTU0LCAyOTIxMywgMTYxMjEsIA0KKwk2NCwgMTM0NDAsIDMwNjI0LCAxNjQzMCwgDQorIDE5MDA4DQorfTsNCisNCitzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NOWtbUFJNTl85a10gPQ0KK3sNCisgICAzMTY4LCAzMTY2NSwgIDk5NDMsIDkxMjMsIA0KKyAgMTU1OTksICA0MzU4LCAyMDI0OCwgMjA0OCwgDQorICAxNzA0MCwgMjc3ODcsIDE2ODE2LCAxMzg4OA0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTEya1tQUk1OXzEya10gPQ0KK3sNCisgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMjgsIA0KKyAgMzY0NywgIDgxMjksIDMwOTMwLCAyNzkyNiwgDQorIDE4ODgwLCAxMjMxOSwgICA0OTYsICAxMDQyLCANCisgIDQwNjEsIDIwNDQ2LCAyNTYyOSwgMjgwNjksIA0KKyAxMzk0OA0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTE0a1tQUk1OXzE0a10gPQ0KK3sNCisgICAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzMSwgDQorICAgMjQ4MTUsICAgNjU1LCAyNjYxNiwgMjY3NjQsIA0KKyAgICA3MjM4LCAxOTEzNiwgIDYxNDQsICAgIDg4LCANCisJNDE1OCwgMjU3MzMsIDMwNTY3LCAzMDQ5NCwgDQorCTIyMSwgMjAzMjEsIDE3ODIzDQorfTsNCisNCitzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NMTZrW1BSTU5fMTZrXSA9DQorew0KKyAgICAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTMxLCANCisgICAyNDgxNSwgICA3MDAsICAzODI0LCAgNzI3MSwgDQorICAgMjY0MDAsICA5NTI4LCAgNjU5NCwgMjYxMTIsIA0KKyAgICAgMTA4LCAgMjA2OCwgMTI4NjcsIDE2MzE3LCANCisgICAyMzAzNSwgMjQ2MzIsICA3NTI4LCAgMTc1MiwgDQorICAgIDY3NTksIDI0NTc2DQorfTsNCisNCitzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NMThrW1BSTU5fMThrXSA9DQorew0KKyAgICAgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzNSwgDQorCTE0Nzg3LCAxNDQyMywgMzA0NzcsIDI0OTI3LCANCisJMjUzNDUsIDMwMTU0LCAgIDkxNiwgIDU3MjgsIA0KKwkxODk3OCwgIDIwNDgsICAgNTI4LCAxNjQ0OSwgDQorCSAyNDM2LCAgMzU4MSwgMjM1MjcsIDI5NDc5LCANCisJIDgyMzcsIDE2ODEwLCAyNzA5MSwgMTkwNTIsIA0KKwkgICAgMA0KK307DQorDQorc3RhdGljIGNvbnN0IFdvcmQxNiBkZmhfTTIwa1tQUk1OXzIwa10gPQ0KK3sNCisgICAgIDMxNjgsIDMxNjY1LCAgOTk0MywgIDkxMjksIA0KKwkgODYzNywgMzE4MDcsIDI0NjQ2LCAgIDczNiwgDQorCTI4NjQzLCAgMjk3NywgIDI1NjYsIDI1NTY0LCANCisJMTI5MzAsIDEzOTYwLCAgMjA0OCwgICA4MzQsIA0KKwkgMzI3MCwgIDQxMDAsIDI2OTIwLCAxNjIzNywgDQorCTMxMjI3LCAxNzY2NywgMTUwNTksIDIwNTg5LCANCisJMzAyNDksIDI5MTIzLCAwDQorfTsNCisNCitzdGF0aWMgY29uc3QgV29yZDE2IGRmaF9NMjNrW1BSTU5fMjNrXSA9DQorew0KKwkgMzE2OCwgMzE2NjUsICA5OTQzLCAgOTEzMiwgDQorCTE2NzQ4LCAgMzIwMiwgMjgxNzksIDE2MzE3LCANCisJMzA1OTAsIDE1ODU3LCAxOTk2MCwgIDg4MTgsIA0KKwkyMTcxMSwgMjE1MzgsICA0MjYwLCAxNjY5MCwgDQorCTIwMjI0LCAgMzY2NiwgIDQxOTQsICA5NDk3LCANCisJMTYzMjAsIDE1Mzg4LCAgNTc1NSwgMzE1NTEsIA0KKwkxNDA4MCwgIDM1NzQsIDE1OTMyLCAgICA1MCwgDQorCTIzMzkyLCAyNjA1MywgMzEyMTYNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgZGZoX00yNGtbUFJNTl8yNGtdID0NCit7DQorCSAzMTY4LCAzMTY2NSwgIDk5NDMsICA5MTM0LCANCisJMjQ3NzYsICA1ODU3LCAxODQ3NSwgMjg1MzUsIA0KKwkyOTY2MiwgMTQzMjEsIDE2NzI1LCAgNDM5NiwgDQorCTI5MzUzLCAxMDAwMywgMTcwNjgsIDIwNTA0LCANCisJICA3MjAsICAgICAwLCAgODQ2NSwgMTI1ODEsIA0KKwkyODg2MywgMjQ3NzQsICA5NzA5LCAyNjA0MywgDQorCSA3OTQxLCAyNzY0OSwgMTM5NjUsIDE1MjM2LCANCisJMTgwMjYsIDIyMDQ3LCAxNjY4MSwgIDM5NjgNCit9Ow0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaXNwX2lzZi50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2lzcF9pc2YudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjBlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2lzcF9pc2YudGFiCkBAIC0wLDAgKzEsNjIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgfCBUYWJsZXMgZm9yIGZ1bmN0aW9uIElzZl9pc3AoKSBhbmQgSXNwX2lzZigpICAgICAgICAgfA0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qIHRhYmxlIG9mIGNvcyh4KSBpbiBRMTUgKi8NCisNCitjb25zdCBzdGF0aWMgV29yZDE2IHRhYmxlWzEyOV0gPSB7DQorICAzMjc2NywNCisgIDMyNzU4LCAgMzI3MjksICAzMjY3OSwgIDMyNjEwLCAgMzI1MjIsICAzMjQxMywgIDMyMjg2LCAgMzIxMzgsDQorICAzMTk3MiwgIDMxNzg2LCAgMzE1ODEsICAzMTM1NywgIDMxMTE0LCAgMzA4NTMsICAzMDU3MiwgIDMwMjc0LA0KKyAgMjk5NTcsICAyOTYyMiwgIDI5MjY5LCAgMjg4OTksICAyODUxMSwgIDI4MTA2LCAgMjc2ODQsICAyNzI0NiwNCisgIDI2NzkxLCAgMjYzMjAsICAyNTgzMywgIDI1MzMwLCAgMjQ4MTIsICAyNDI3OSwgIDIzNzMyLCAgMjMxNzAsDQorICAyMjU5NSwgIDIyMDA2LCAgMjE0MDMsICAyMDc4OCwgIDIwMTYwLCAgMTk1MjAsICAxODg2OCwgIDE4MjA1LA0KKyAgMTc1MzEsICAxNjg0NiwgIDE2MTUxLCAgMTU0NDcsICAxNDczMywgIDE0MDEwLCAgMTMyNzksICAxMjU0MCwNCisgIDExNzkzLCAgMTEwMzksICAxMDI3OSwgICA5NTEyLCAgIDg3NDAsICAgNzk2MiwgICA3MTgwLCAgIDYzOTMsDQorICAgNTYwMiwgICA0ODA4LCAgIDQwMTEsICAgMzIxMiwgICAyNDExLCAgIDE2MDgsICAgIDgwNCwgICAgICAwLA0KKyAgIC04MDQsICAtMTYwOCwgIC0yNDExLCAgLTMyMTIsICAtNDAxMSwgIC00ODA4LCAgLTU2MDIsICAtNjM5MywNCisgIC03MTgwLCAgLTc5NjIsICAtODc0MCwgIC05NTEyLCAtMTAyNzksIC0xMTAzOSwgLTExNzkzLCAtMTI1NDAsDQorIC0xMzI3OSwgLTE0MDEwLCAtMTQ3MzMsIC0xNTQ0NywgLTE2MTUxLCAtMTY4NDYsIC0xNzUzMSwgLTE4MjA1LA0KKyAtMTg4NjgsIC0xOTUyMCwgLTIwMTYwLCAtMjA3ODgsIC0yMTQwMywgLTIyMDA2LCAtMjI1OTUsIC0yMzE3MCwNCisgLTIzNzMyLCAtMjQyNzksIC0yNDgxMiwgLTI1MzMwLCAtMjU4MzMsIC0yNjMyMCwgLTI2NzkxLCAtMjcyNDYsDQorIC0yNzY4NCwgLTI4MTA2LCAtMjg1MTEsIC0yODg5OSwgLTI5MjY5LCAtMjk2MjIsIC0yOTk1NywgLTMwMjc0LA0KKyAtMzA1NzIsIC0zMDg1MywgLTMxMTE0LCAtMzEzNTcsIC0zMTU4MSwgLTMxNzg2LCAtMzE5NzIsIC0zMjEzOCwNCisgLTMyMjg2LCAtMzI0MTMsIC0zMjUyMiwgLTMyNjEwLCAtMzI2NzksIC0zMjcyOSwgLTMyNzU4LCAtMzI3Njh9Ow0KKw0KKy8qIHNsb3BlIGluIFExMSB1c2VkIHRvIGNvbXB1dGUgeSA9IGFjb3MoeCkgKi8NCisNCitjb25zdCBzdGF0aWMgV29yZDE2IHNsb3BlWzEyOF0gPSB7IA0KKyAtMjYyMTQsIC05MDM5LCAtNTI0MywgLTM3OTksIC0yOTc5LCAtMjQwNSwgLTIwNjQsIC0xNzcxLA0KKyAtMTU3OSwgLTE0MDksIC0xMjc5LCAtMTE3MCwgLTEwNzksIC0xMDA0LCAtOTMzLCAtODgwLA0KKyAtODI3LCAtNzgzLCAtNzQzLCAtNzA4LCAtNjc2LCAtNjQ3LCAtNjIxLCAtNTk5LA0KKyAtNTc2LCAtNTU3LCAtNTM4LCAtNTIxLCAtNTA2LCAtNDkyLCAtNDc5LCAtNDY2LA0KKyAtNDU2LCAtNDQ1LCAtNDM1LCAtNDI2LCAtNDE3LCAtNDEwLCAtNDAyLCAtMzk1LA0KKyAtMzg5LCAtMzgzLCAtMzc3LCAtMzcyLCAtMzY3LCAtMzYzLCAtMzU5LCAtMzU1LA0KKyAtMzUxLCAtMzQ4LCAtMzQ1LCAtMzQyLCAtMzQwLCAtMzM3LCAtMzM1LCAtMzMzLA0KKyAtMzMxLCAtMzMwLCAtMzI5LCAtMzI4LCAtMzI3LCAtMzI2LCAtMzI2LCAtMzI2LA0KKyAtMzI2LCAtMzI2LCAtMzI2LCAtMzI3LCAtMzI4LCAtMzI5LCAtMzMwLCAtMzMxLA0KKyAtMzMzLCAtMzM1LCAtMzM3LCAtMzQwLCAtMzQyLCAtMzQ1LCAtMzQ4LCAtMzUxLA0KKyAtMzU1LCAtMzU5LCAtMzYzLCAtMzY3LCAtMzcyLCAtMzc3LCAtMzgzLCAtMzg5LA0KKyAtMzk1LCAtNDAyLCAtNDEwLCAtNDE3LCAtNDI2LCAtNDM1LCAtNDQ1LCAtNDU2LA0KKyAtNDY2LCAtNDc5LCAtNDkyLCAtNTA2LCAtNTIxLCAtNTM4LCAtNTU3LCAtNTc2LA0KKyAtNTk5LCAtNjIxLCAtNjQ3LCAtNjc2LCAtNzA4LCAtNzQzLCAtNzgzLCAtODI3LA0KKyAtODgwLCAtOTMzLCAtMTAwNCwgLTEwNzksIC0xMTcwLCAtMTI3OSwgLTE0MDksIC0xNTc5LA0KKyAtMTc3MSwgLTIwNjQsIC0yNDA1LCAtMjk3OSwgLTM3OTksIC01MjQzLCAtOTAzOSwgLTI2MjE0fTsNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xhZ193aW5kLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbGFnX3dpbmQudGFiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzVkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xhZ193aW5kLnRhYgpAQCAtMCwwICsxLDgxIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorIHwgVGFibGUgb2YgbGFnX3dpbmRvdyBmb3IgYXV0b2NvcnJlbGF0aW9uLiAgICAgICAgICAgIHwNCisgfCBub2lzZSBmbG9vciA9IDEuMDAwMSAgID0gKDAuOTk5OSAgb24gclsxXSAuLnJbMTZdKSAgfA0KKyB8IEJhbmR3aWR0aCBleHBhbnNpb24gPSA2MCBIeiAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgU2FtcGxpbmcgZnJlcXVlbmN5ICA9IDEyODAwIEh6ICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IFNwZWNpYWwgZG91YmxlIHByZWNpc2lvbiBmb3JtYXQuIFNlZSAibWF0aF9vcC5jIiAgICB8DQorIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFswXSA9ICAxLjAwMDAwMDAwICAgIChub3Qgc3RvcmVkKSAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzFdID0gIDAuOTk5NDY2NDIgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbMl0gPSAgMC45OTgxNjY4MCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFszXSA9ICAwLjk5NjAwNDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzRdID0gIDAuOTkyOTg1MTMgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbNV0gPSAgMC45ODkxMTY1NSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFs2XSA9ICAwLjk4NDQwODgwICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzddID0gIDAuOTc4ODczOTcgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbOF0gPSAgMC45NzI1MjYxOSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFs5XSA9ICAwLjk2NTM4MTg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzEwXT0gIDAuOTU3NDU5MDMgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbMTFdPSAgMC45NDg3Nzc5NyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFsxMl09ICAwLjkzOTM2MDM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzEzXT0gIDAuOTI5MjI5ODYgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIHwgbGFnX3dpbmRbMTRdPSAgMC45MTg0MTE1NSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCisgfCBsYWdfd2luZFsxNV09ICAwLjkwNjkzMjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KKyB8IGxhZ193aW5kWzE2XT0gIDAuODk0ODE5NjggICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2RlZmluZSBNIDE2DQorDQorc3RhdGljIFdvcmQxNiB2b2xhZ19oW01dID0gew0KKyAgICAgIDMyNzUwLA0KKyAgICAgIDMyNzA3LA0KKyAgICAgIDMyNjM3LA0KKyAgICAgIDMyNTM4LA0KKyAgICAgIDMyNDExLA0KKyAgICAgIDMyMjU3LA0KKyAgICAgIDMyMDc1LA0KKyAgICAgIDMxODY3LA0KKyAgICAgIDMxNjMzLA0KKyAgICAgIDMxMzc0LA0KKyAgICAgIDMxMDg5LA0KKyAgICAgIDMwNzgwLA0KKyAgICAgIDMwNDQ5LA0KKyAgICAgIDMwMDk0LA0KKyAgICAgIDI5NzE4LA0KKyAgICAgIDI5MzIxfTsNCisNCitzdGF0aWMgV29yZDE2IHZvbGFnX2xbTV0gPSB7DQorICAgICAgMTY4OTYsDQorICAgICAgMzA0NjQsDQorICAgICAgIDI0OTYsDQorICAgICAgIDQ0ODAsDQorICAgICAgMTIxNjAsDQorICAgICAgIDM1MjAsDQorICAgICAgMjQzMjAsDQorICAgICAgMjQxOTIsDQorICAgICAgMjA3MzYsDQorICAgICAgICA1NzYsDQorICAgICAgMTgyNDAsDQorICAgICAgMzE0ODgsDQorICAgICAgICAxMjgsDQorICAgICAgMTY3MDQsDQorICAgICAgMTE1MjAsDQorICAgICAgMTQ3ODR9Ow0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiZGJlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMi5oCkBAIC0wLDAgKzEsNjIgQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgICBGaWxlICAgICAgICAgICAgIDogbG9nMi5oDQorKiAgICAgIFB1cnBvc2UgICAgICAgICAgOiBDb21wdXRlcyBsb2cyKExfeCkNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKyNpZm5kZWYgX19MT0cyX0hfXw0KKyNkZWZpbmUgX19MT0cyX0hfXw0KKyANCisvKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorIA0KKy8qDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgICAgICAgICAgICAgICAgICAgIERFRklOSVRJT04gT0YgREFUQSBUWVBFUw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisgDQorLyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgREVDTEFSQVRJT04gT0YgUFJPVE9UWVBFUw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCit2b2lkIExvZzIgKA0KKwkJV29yZDMyIExfeCwgICAgICAgIC8qIChpKSA6IGlucHV0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqZXhwb25lbnQsICAvKiAobykgOiBJbnRlZ2VyIHBhcnQgb2YgTG9nMi4gICAocmFuZ2U6IDA8PXZhbDw9MzApICovDQorCQlXb3JkMTYgKmZyYWN0aW9uICAgLyogKG8pIDogRnJhY3Rpb25hbCBwYXJ0IG9mIExvZzIuIChyYW5nZTogMDw9dmFsPDEpKi8NCisJICApOw0KKw0KK3ZvaWQgTG9nMl9ub3JtICgNCisJCVdvcmQzMiBMX3gsICAgICAgICAgLyogKGkpIDogaW5wdXQgdmFsdWUgKG5vcm1hbGl6ZWQpICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGV4cCwgICAgICAgICAvKiAoaSkgOiBub3JtX2wgKExfeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKmV4cG9uZW50LCAgIC8qIChvKSA6IEludGVnZXIgcGFydCBvZiBMb2cyLiAgIChyYW5nZTogMDw9dmFsPD0zMCkgKi8NCisJCVdvcmQxNiAqZnJhY3Rpb24gICAgLyogKG8pIDogRnJhY3Rpb25hbCBwYXJ0IG9mIExvZzIuIChyYW5nZTogMDw9dmFsPDEpICAqLw0KKwkgICAgICAgKTsNCisNCisjZW5kaWYgIC8vX19MT0cyX0hfXw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMl90YWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMl90YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzYxYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sb2cyX3RhYi5oCkBAIC0wLDAgKzEsMzUgQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgIEZpbGUgICAgICAgICAgICAgOiBsb2cyLnRhYg0KKyogICAgICBQdXJwb3NlICAgICAgICAgIDogVGFibGUgZm9yIHJvdXRpbmUgTG9nMigpLg0KKyogICAgICAkSWQgJA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorc3RhdGljIGNvbnN0IFdvcmQxNiB0YWJsZVszM10gPQ0KK3sNCisgICAgMCwgMTQ1NSwgMjg2NiwgNDIzNiwgNTU2OCwgNjg2MywgODEyNCwgOTM1MiwgMTA1NDksIDExNzE2LA0KKyAgICAxMjg1NSwgMTM5NjcsIDE1MDU0LCAxNjExNywgMTcxNTYsIDE4MTcyLCAxOTE2NywgMjAxNDIsIDIxMDk3LCAyMjAzMywNCisgICAgMjI5NTEsIDIzODUyLCAyNDczNSwgMjU2MDMsIDI2NDU1LCAyNzI5MSwgMjgxMTMsIDI4OTIyLCAyOTcxNiwgMzA0OTcsDQorICAgIDMxMjY2LCAzMjAyMywgMzI3NjcNCit9Ow0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWFpbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlN2M2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWFpbi5oCkBAIC0wLDAgKzEsNDUgQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBNQUlOLkgJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgTWFpbiBmdW5jdGlvbnMJCQkJCQkJICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaWZuZGVmIF9fTUFJTl9IX18NCisjZGVmaW5lIF9fTUFJTl9IX18NCisNCit2b2lkIGNvZGVyKA0KKyAgICAgV29yZDE2ICogbW9kZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6ICB1c2VkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgc3BlZWNoMTZrW10sICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogIDMyMCBuZXcgc3BlZWNoIHNhbXBsZXMgKGF0IDE2IGtIeikgICAgKi8NCisgICAgIFdvcmQxNiBwcm1zW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiAgb3V0cHV0IHBhcmFtZXRlcnMgICAgICAgICAgICovDQorICAgICBXb3JkMTYgKiBzZXJfc2l6ZSwgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogIGJpdCByYXRlIG9mIHRoZSB1c2VkIG1vZGUgICAqLw0KKyAgICAgdm9pZCAqc3BlX3N0YXRlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gICA6ICBTdGF0ZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICBXb3JkMTYgYWxsb3dfZHR4ICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogIERUWCBPTi9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCispOw0KKw0KKw0KKw0KK3ZvaWQgUmVzZXRfZW5jb2Rlcih2b2lkICpzdCwgV29yZDE2IHJlc2V0X2FsbCk7DQorDQorDQorV29yZDE2IGVuY29kZXJfaG9taW5nX2ZyYW1lX3Rlc3QoV29yZDE2IGlucHV0X2ZyYW1lW10pOw0KKw0KKyNlbmRpZiAvL19fTUFJTl9IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21hdGhfb3AuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWF0aF9vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTI5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21hdGhfb3AuaApAQCAtMCwwICsxLDU1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgTUFUSF9PUC5ICSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgIE1hdGhlbWF0aWNhbCBvcGVyYXRpb25zCQkJCQkgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNpZm5kZWYgX19NQVRIX09QX0hfXw0KKyNkZWZpbmUgX19NQVRIX09QX0hfXw0KKw0KK1dvcmQzMiBJc3FydCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTMxIDogb3V0cHV0IHZhbHVlIChyYW5nZTogMDw9dmFsPDEpICAgICAgICAgKi8NCisJCVdvcmQzMiBMX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICA6IGlucHV0IHZhbHVlICAocmFuZ2U6IDA8PXZhbDw9N2ZmZmZmZmYpICovDQorCSAgICApOw0KKw0KK3ZvaWQgSXNxcnRfbigNCisJCVdvcmQzMiAqIGZyYWMsICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgUTMxOiBub3JtYWxpemVkIHZhbHVlICgxLjAgPCBmcmFjIDw9IDAuNSkgKi8NCisJCVdvcmQxNiAqIGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICAgOiBleHBvbmVudCAodmFsdWUgPSBmcmFjIHggMl5leHBvbmVudCkgKi8NCisJICAgICk7DQorDQorV29yZDMyIFBvdzIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMCAgOiByZXN1bHQgICAgICAgKHJhbmdlOiAwPD12YWw8PTB4N2ZmZmZmZmYpICovDQorCQlXb3JkMTYgZXhwb25hbnQsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBJbnRlZ2VyIHBhcnQuICAgICAgKHJhbmdlOiAwPD12YWw8PTMwKSAgICovDQorCQlXb3JkMTYgZnJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBGcmFjdGlvbm5hbCBwYXJ0LiAgKHJhbmdlOiAwLjA8PXZhbDwxLjApICovDQorCSAgICk7DQorDQorV29yZDMyIERvdF9wcm9kdWN0MTIoICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMzE6IG5vcm1hbGl6ZWQgcmVzdWx0ICgxIDwgdmFsIDw9IC0xKSAqLw0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB4IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeSB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IHZlY3RvciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiBleHBvbmVudCBvZiByZXN1bHQgKDAuLiszMCkgICAgICAgKi8NCisJCSk7DQorDQorV29yZDMyIERvdF9wcm9kdWN0MTJfYXNtKCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTMxOiBub3JtYWxpemVkIHJlc3VsdCAoMSA8IHZhbCA8PSAtMSkgKi8NCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAxMmJpdHM6IHkgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgOiB2ZWN0b3IgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgIDogZXhwb25lbnQgb2YgcmVzdWx0ICgwLi4rMzApICAgICAgICovDQorCQkpOw0KKyNlbmRpZiAvL19fTUFUSF9PUF9IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21lbV9hbGlnbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tZW1fYWxpZ24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRkZWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tZW1fYWxpZ24uaApAQCAtMCwwICsxLDM1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQltZW1fYWxpZ24uaA0KKw0KKwlDb250ZW50OglNZW1vcnkgYWxsb2MgYWxpZ25tZW50cyBmdW5jdGlvbnMNCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZm5kZWYgX19WT19NRU1fQUxJR05fSF9fDQorI2RlZmluZSBfX1ZPX01FTV9BTElHTl9IX18NCisNCisjaW5jbHVkZSAidm9NZW0uaCINCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKw0KK2V4dGVybiB2b2lkICptZW1fbWFsbG9jKFZPX01FTV9PUEVSQVRPUiAqcE1lbW9wLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciBhbGlnbm1lbnQsIHVuc2lnbmVkIGludCBDb2RlY0lEKTsNCitleHRlcm4gdm9pZCBtZW1fZnJlZShWT19NRU1fT1BFUkFUT1IgKnBNZW1vcCwgdm9pZCAqbWVtX3B0ciwgdW5zaWduZWQgaW50IENvZGVjSUQpOw0KKw0KKyNlbmRpZgkvKiBfX1ZPX01FTV9BTElHTl9IX18gKi8NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21pbWVfaW8udGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmM4NmExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYgpAQCAtMCwwICsxLDM2OCBAQAorDQorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKw0KK3N0YXRpYyBVV29yZDggdG9jX2J5dGVbMTZdID0gezB4MDQsIDB4MEMsIDB4MTQsIDB4MUMsIDB4MjQsIDB4MkMsIDB4MzQsIDB4M0MsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NCwgMHg0QywgMHg1NCwgMHg1QywgMHg2NCwgMHg2QywgMHg3NCwgMHg3Q307DQorDQorLyogbnVtYmVyIG9mIHNwZWVjaCBiaXRzIGZvciBhbGwgbW9kZXMgKi8NCitzdGF0aWMgV29yZDE2IHVucGFja2VkX3NpemVbMTZdID0gezEzMiwgIDE3NywgMjUzLCAyODUsIDMxNywgMzY1LCAzOTcsIDQ2MSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3NywgICAzNSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMH07DQorDQorLyogc2l6ZSBvZiBwYWNrZWQgZnJhbWUgZm9yIGVhY2ggbW9kZSwgZXhjbHVkaW5nIFRPQyBieXRlICovDQorc3RhdGljIFdvcmQxNiBwYWNrZWRfc2l6ZVsxNl0gPSB7MTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTAsIDU4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLCAgNSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH07DQorDQorLyogbnVtYmVyIG9mIHVudXNlZCBzcGVlY2ggYml0cyBpbiBwYWNrZWQgZm9ybWF0IGZvciBlYWNoIG1vZGUgKi8NCitzdGF0aWMgV29yZDE2IHVudXNlZF9zaXplWzE2XSA9IHs0LCA3LCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsNCisNCisvKiBzb3J0aW5nIHRhYmxlcyBmb3IgYWxsIG1vZGVzICovDQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzY2MFsxMzJdID0gew0KKyAgICAgMCwgICA1LCAgIDYsICAgNywgIDYxLCAgODQsIDEwNywgMTMwLCAgNjIsICA4NSwNCisgICAgIDgsICAgNCwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNTgsICA4MSwgMTA0LCAxMjcsDQorICAgIDYwLCAgODMsIDEwNiwgMTI5LCAxMDgsIDEzMSwgMTI4LCAgNDEsICA0MiwgIDgwLA0KKyAgIDEyNiwgICAxLCAgIDMsICA1NywgMTAzLCAgODIsIDEwNSwgIDU5LCAgIDIsICA2MywNCisgICAxMDksIDExMCwgIDg2LCAgMTksICAyMiwgIDIzLCAgNjQsICA4NywgIDE4LCAgMjAsDQorICAgIDIxLCAgMTcsICAxMywgIDg4LCAgNDMsICA4OSwgIDY1LCAxMTEsICAxNCwgIDI0LA0KKyAgICAyNSwgIDI2LCAgMjcsICAyOCwgIDE1LCAgMTYsICA0NCwgIDkwLCAgNjYsIDExMiwNCisgICAgIDksICAxMSwgIDEwLCAgMTIsICA2NywgMTEzLCAgMjksICAzMCwgIDMxLCAgMzIsDQorICAgIDM0LCAgMzMsICAzNSwgIDM2LCAgNDUsICA1MSwgIDY4LCAgNzQsICA5MSwgIDk3LA0KKyAgIDExNCwgMTIwLCAgNDYsICA2OSwgIDkyLCAxMTUsICA1MiwgIDc1LCAgOTgsIDEyMSwNCisgICAgNDcsICA3MCwgIDkzLCAxMTYsICA1MywgIDc2LCAgOTksIDEyMiwgIDQ4LCAgNzEsDQorICAgIDk0LCAxMTcsICA1NCwgIDc3LCAxMDAsIDEyMywgIDQ5LCAgNzIsICA5NSwgMTE4LA0KKyAgICA1NSwgIDc4LCAxMDEsIDEyNCwgIDUwLCAgNzMsICA5NiwgMTE5LCAgNTYsICA3OSwNCisgICAxMDIsIDEyNQ0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0Xzg4NVsxNzddID0gew0KKyAgICAgMCwgICA0LCAgIDYsICAgNywgICA1LCAgIDMsICA0NywgIDQ4LCAgNDksIDExMiwNCisgICAxMTMsIDExNCwgIDc1LCAxMDYsIDE0MCwgMTcxLCAgODAsIDExMSwgMTQ1LCAxNzYsDQorICAgIDc3LCAxMDgsIDE0MiwgMTczLCAgNzgsIDEwOSwgMTQzLCAxNzQsICA3OSwgMTEwLA0KKyAgIDE0NCwgMTc1LCAgNzYsIDEwNywgMTQxLCAxNzIsICA1MCwgMTE1LCAgNTEsICAgMiwNCisgICAgIDEsICA4MSwgMTE2LCAxNDYsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsDQorICAgIDE2LCAgMjUsICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LA0KKyAgICAxNSwgIDUyLCAxMTcsICAzMSwgIDgyLCAxNDcsICAgOSwgIDMzLCAgMTEsICA4MywNCisgICAxNDgsICA1MywgMTE4LCAgMjgsICAyNywgIDg0LCAxNDksICAzNCwgIDM1LCAgMjksDQorICAgIDQ2LCAgMzIsICAzMCwgIDU0LCAxMTksICAzNywgIDM2LCAgMzksICAzOCwgIDQwLA0KKyAgICA4NSwgMTUwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU1LCAgNjAsICA2NSwNCisgICAgNzAsICA4NiwgIDkxLCAgOTYsIDEwMSwgMTIwLCAxMjUsIDEzMCwgMTM1LCAxNTEsDQorICAgMTU2LCAxNjEsIDE2NiwgIDU2LCAgODcsIDEyMSwgMTUyLCAgNjEsICA5MiwgMTI2LA0KKyAgIDE1NywgIDY2LCAgOTcsIDEzMSwgMTYyLCAgNzEsIDEwMiwgMTM2LCAxNjcsICA1NywNCisgICAgODgsIDEyMiwgMTUzLCAgNjIsICA5MywgMTI3LCAxNTgsICA2NywgIDk4LCAxMzIsDQorICAgMTYzLCAgNzIsIDEwMywgMTM3LCAxNjgsICA1OCwgIDg5LCAxMjMsIDE1NCwgIDYzLA0KKyAgICA5NCwgMTI4LCAxNTksICA2OCwgIDk5LCAxMzMsIDE2NCwgIDczLCAxMDQsIDEzOCwNCisgICAxNjksICA1OSwgIDkwLCAxMjQsIDE1NSwgIDY0LCAgOTUsIDEyOSwgMTYwLCAgNjksDQorICAgMTAwLCAxMzQsIDE2NSwgIDc0LCAxMDUsIDEzOSwgMTcwDQorfTsNCisNCitzdGF0aWMgV29yZDE2IHNvcnRfMTI2NVsyNTNdID0gew0KKyAgICAgMCwgICA0LCAgIDYsICA5MywgMTQzLCAxOTYsIDI0NiwgICA3LCAgIDUsICAgMywNCisgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsDQorICAgIDk0LCAxNDQsIDE5NywgMjQ3LCAgOTksIDE0OSwgMjAyLCAyNTIsICA5NiwgMTQ2LA0KKyAgIDE5OSwgMjQ5LCAgOTcsIDE0NywgMjAwLCAyNTAsIDEwMCwgMjAzLCAgOTgsIDE0OCwNCisgICAyMDEsIDI1MSwgIDk1LCAxNDUsIDE5OCwgMjQ4LCAgNTIsICAgMiwgICAxLCAxMDEsDQorICAgMjA0LCAxNTUsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LA0KKyAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywNCisgICAxNTYsICAzMSwgMTAyLCAyMDUsICAgOSwgIDMzLCAgMTEsIDEwMywgMjA2LCAgNTQsDQorICAgMTU3LCAgMjgsICAyNywgMTA0LCAyMDcsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLA0KKyAgICAzMCwgIDU1LCAxNTgsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxMDUsIDIwOCwNCisgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxMDYsIDE1OSwgMjA5LCAgNTcsDQorICAgIDY2LCAgNzUsICA4NCwgMTA3LCAxMTYsIDEyNSwgMTM0LCAxNjAsIDE2OSwgMTc4LA0KKyAgIDE4NywgMjEwLCAyMTksIDIyOCwgMjM3LCAgNTgsIDEwOCwgMTYxLCAyMTEsICA2MiwNCisgICAxMTIsIDE2NSwgMjE1LCAgNjcsIDExNywgMTcwLCAyMjAsICA3MSwgMTIxLCAxNzQsDQorICAgMjI0LCAgNzYsIDEyNiwgMTc5LCAyMjksICA4MCwgMTMwLCAxODMsIDIzMywgIDg1LA0KKyAgIDEzNSwgMTg4LCAyMzgsICA4OSwgMTM5LCAxOTIsIDI0MiwgIDU5LCAxMDksIDE2MiwNCisgICAyMTIsICA2MywgMTEzLCAxNjYsIDIxNiwgIDY4LCAxMTgsIDE3MSwgMjIxLCAgNzIsDQorICAgMTIyLCAxNzUsIDIyNSwgIDc3LCAxMjcsIDE4MCwgMjMwLCAgODEsIDEzMSwgMTg0LA0KKyAgIDIzNCwgIDg2LCAxMzYsIDE4OSwgMjM5LCAgOTAsIDE0MCwgMTkzLCAyNDMsICA2MCwNCisgICAxMTAsIDE2MywgMjEzLCAgNjQsIDExNCwgMTY3LCAyMTcsICA2OSwgMTE5LCAxNzIsDQorICAgMjIyLCAgNzMsIDEyMywgMTc2LCAyMjYsICA3OCwgMTI4LCAxODEsIDIzMSwgIDgyLA0KKyAgIDEzMiwgMTg1LCAyMzUsICA4NywgMTM3LCAxOTAsIDI0MCwgIDkxLCAxNDEsIDE5NCwNCisgICAyNDQsICA2MSwgMTExLCAxNjQsIDIxNCwgIDY1LCAxMTUsIDE2OCwgMjE4LCAgNzAsDQorICAgMTIwLCAxNzMsIDIyMywgIDc0LCAxMjQsIDE3NywgMjI3LCAgNzksIDEyOSwgMTgyLA0KKyAgIDIzMiwgIDgzLCAxMzMsIDE4NiwgMjM2LCAgODgsIDEzOCwgMTkxLCAyNDEsICA5MiwNCisgICAxNDIsIDE5NSwgMjQ1ICAgICAgICAgICAgICAgICAgICAgICAgIA0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzE0MjVbMjg1XSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAxMDEsIDE1OSwgMjIwLCAyNzgsICAgNywgICA1LCAgIDMsDQorICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLA0KKyAgIDEwMiwgMTYwLCAyMjEsIDI3OSwgMTA3LCAxNjUsIDIyNiwgMjg0LCAxMDQsIDE2MiwNCisgICAyMjMsIDI4MSwgMTA1LCAxNjMsIDIyNCwgMjgyLCAxMDgsIDIyNywgMTA2LCAxNjQsDQorICAgMjI1LCAyODMsIDEwMywgMTYxLCAyMjIsIDI4MCwgIDUyLCAgIDIsICAgMSwgMTA5LA0KKyAgIDIyOCwgMTcxLCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwNCisgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsDQorICAgMTcyLCAgMzEsIDExMCwgMjI5LCAgIDksICAzMywgIDExLCAxMTEsIDIzMCwgIDU0LA0KKyAgIDE3MywgIDI4LCAgMjcsIDExMiwgMjMxLCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwNCisgICAgMzAsICA1NSwgMTc0LCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTEzLCAyMzIsDQorICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTE0LCAxNzUsIDIzMywgIDYyLA0KKyAgIDEyMCwgMTgxLCAyMzksICA3NSwgMTMzLCAxOTQsIDI1MiwgIDU3LCAxMTUsIDE3NiwNCisgICAyMzQsICA2MywgMTIxLCAxODIsIDI0MCwgIDcwLCAxMjgsIDE4OSwgMjQ3LCAgNzYsDQorICAgMTM0LCAxOTUsIDI1MywgIDgzLCAxNDEsIDIwMiwgMjYwLCAgOTIsIDE1MCwgMjExLA0KKyAgIDI2OSwgIDg0LCAxNDIsIDIwMywgMjYxLCAgOTMsIDE1MSwgMjEyLCAyNzAsICA4NSwNCisgICAxNDMsIDIwNCwgMjYyLCAgOTQsIDE1MiwgMjEzLCAyNzEsICA4NiwgMTQ0LCAyMDUsDQorICAgMjYzLCAgOTUsIDE1MywgMjE0LCAyNzIsICA2NCwgMTIyLCAxODMsIDI0MSwgIDc3LA0KKyAgIDEzNSwgMTk2LCAyNTQsICA2NSwgMTIzLCAxODQsIDI0MiwgIDc4LCAxMzYsIDE5NywNCisgICAyNTUsICA4NywgMTQ1LCAyMDYsIDI2NCwgIDk2LCAxNTQsIDIxNSwgMjczLCAgNTgsDQorICAgMTE2LCAxNzcsIDIzNSwgIDY2LCAxMjQsIDE4NSwgMjQzLCAgNzEsIDEyOSwgMTkwLA0KKyAgIDI0OCwgIDc5LCAxMzcsIDE5OCwgMjU2LCAgODgsIDE0NiwgMjA3LCAyNjUsICA5NywNCisgICAxNTUsIDIxNiwgMjc0LCAgNTksIDExNywgMTc4LCAyMzYsICA2NywgMTI1LCAxODYsDQorICAgMjQ0LCAgNzIsIDEzMCwgMTkxLCAyNDksICA4MCwgMTM4LCAxOTksIDI1NywgIDg5LA0KKyAgIDE0NywgMjA4LCAyNjYsICA5OCwgMTU2LCAyMTcsIDI3NSwgIDYwLCAxMTgsIDE3OSwNCisgICAyMzcsICA2OCwgMTI2LCAxODcsIDI0NSwgIDczLCAxMzEsIDE5MiwgMjUwLCAgODEsDQorICAgMTM5LCAyMDAsIDI1OCwgIDkwLCAxNDgsIDIwOSwgMjY3LCAgOTksIDE1NywgMjE4LA0KKyAgIDI3NiwgIDYxLCAxMTksIDE4MCwgMjM4LCAgNjksIDEyNywgMTg4LCAyNDYsICA3NCwNCisgICAxMzIsIDE5MywgMjUxLCAgODIsIDE0MCwgMjAxLCAyNTksICA5MSwgMTQ5LCAyMTAsDQorICAgMjY4LCAxMDAsIDE1OCwgMjE5LCAyNzcNCit9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF8xNTg1WzMxN10gPSB7DQorICAgICAwLCAgIDQsICAgNiwgMTA5LCAxNzUsIDI0NCwgMzEwLCAgIDcsICAgNSwgICAzLA0KKyAgICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwNCisgICAxMTAsIDE3NiwgMjQ1LCAzMTEsIDExNSwgMTgxLCAyNTAsIDMxNiwgMTEyLCAxNzgsDQorICAgMjQ3LCAzMTMsIDExMywgMTc5LCAyNDgsIDMxNCwgMTE2LCAyNTEsIDExNCwgMTgwLA0KKyAgIDI0OSwgMzE1LCAxMTEsIDE3NywgMjQ2LCAzMTIsICA1MiwgICAyLCAgIDEsIDExNywNCisgICAyNTIsIDE4NywgIDE5LCAgMjEsICAxMiwgIDE3LCAgMTgsICAyMCwgIDE2LCAgMjUsDQorICAgIDEzLCAgMTAsICAxNCwgIDI0LCAgMjMsICAyMiwgIDI2LCAgIDgsICAxNSwgIDUzLA0KKyAgIDE4OCwgIDMxLCAxMTgsIDI1MywgICA5LCAgMzMsICAxMSwgMTE5LCAyNTQsICA1NCwNCisgICAxODksICAyOCwgIDI3LCAxMjAsIDI1NSwgIDM0LCAgMzUsICAyOSwgIDQ2LCAgMzIsDQorICAgIDMwLCAgNTUsIDE5MCwgIDM3LCAgMzYsICAzOSwgIDM4LCAgNDAsIDEyMSwgMjU2LA0KKyAgICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNTYsIDEyMiwgMTkxLCAyNTcsICA2MywNCisgICAxMjksIDE5OCwgMjY0LCAgNzYsIDE0MiwgMjExLCAyNzcsICA4OSwgMTU1LCAyMjQsDQorICAgMjkwLCAxMDIsIDE2OCwgMjM3LCAzMDMsICA1NywgMTIzLCAxOTIsIDI1OCwgIDcwLA0KKyAgIDEzNiwgMjA1LCAyNzEsICA4MywgMTQ5LCAyMTgsIDI4NCwgIDk2LCAxNjIsIDIzMSwNCisgICAyOTcsICA2MiwgMTI4LCAxOTcsIDI2MywgIDc1LCAxNDEsIDIxMCwgMjc2LCAgODgsDQorICAgMTU0LCAyMjMsIDI4OSwgMTAxLCAxNjcsIDIzNiwgMzAyLCAgNTgsIDEyNCwgMTkzLA0KKyAgIDI1OSwgIDcxLCAxMzcsIDIwNiwgMjcyLCAgODQsIDE1MCwgMjE5LCAyODUsICA5NywNCisgICAxNjMsIDIzMiwgMjk4LCAgNTksIDEyNSwgMTk0LCAyNjAsICA2NCwgMTMwLCAxOTksDQorICAgMjY1LCAgNjcsIDEzMywgMjAyLCAyNjgsICA3MiwgMTM4LCAyMDcsIDI3MywgIDc3LA0KKyAgIDE0MywgMjEyLCAyNzgsICA4MCwgMTQ2LCAyMTUsIDI4MSwgIDg1LCAxNTEsIDIyMCwNCisgICAyODYsICA5MCwgMTU2LCAyMjUsIDI5MSwgIDkzLCAxNTksIDIyOCwgMjk0LCAgOTgsDQorICAgMTY0LCAyMzMsIDI5OSwgMTAzLCAxNjksIDIzOCwgMzA0LCAxMDYsIDE3MiwgMjQxLA0KKyAgIDMwNywgIDYwLCAxMjYsIDE5NSwgMjYxLCAgNjUsIDEzMSwgMjAwLCAyNjYsICA2OCwNCisgICAxMzQsIDIwMywgMjY5LCAgNzMsIDEzOSwgMjA4LCAyNzQsICA3OCwgMTQ0LCAyMTMsDQorICAgMjc5LCAgODEsIDE0NywgMjE2LCAyODIsICA4NiwgMTUyLCAyMjEsIDI4NywgIDkxLA0KKyAgIDE1NywgMjI2LCAyOTIsICA5NCwgMTYwLCAyMjksIDI5NSwgIDk5LCAxNjUsIDIzNCwNCisgICAzMDAsIDEwNCwgMTcwLCAyMzksIDMwNSwgMTA3LCAxNzMsIDI0MiwgMzA4LCAgNjEsDQorICAgMTI3LCAxOTYsIDI2MiwgIDY2LCAxMzIsIDIwMSwgMjY3LCAgNjksIDEzNSwgMjA0LA0KKyAgIDI3MCwgIDc0LCAxNDAsIDIwOSwgMjc1LCAgNzksIDE0NSwgMjE0LCAyODAsICA4MiwNCisgICAxNDgsIDIxNywgMjgzLCAgODcsIDE1MywgMjIyLCAyODgsICA5MiwgMTU4LCAyMjcsDQorICAgMjkzLCAgOTUsIDE2MSwgMjMwLCAyOTYsIDEwMCwgMTY2LCAyMzUsIDMwMSwgMTA1LA0KKyAgIDE3MSwgMjQwLCAzMDYsIDEwOCwgMTc0LCAyNDMsIDMwOQ0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzE4MjVbMzY1XSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAxMjEsIDE5OSwgMjgwLCAzNTgsICAgNywgICA1LCAgIDMsDQorICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLA0KKyAgIDEyMiwgMjAwLCAyODEsIDM1OSwgMTI3LCAyMDUsIDI4NiwgMzY0LCAxMjQsIDIwMiwNCisgICAyODMsIDM2MSwgMTI1LCAyMDMsIDI4NCwgMzYyLCAxMjgsIDI4NywgMTI2LCAyMDQsDQorICAgMjg1LCAzNjMsIDEyMywgMjAxLCAyODIsIDM2MCwgIDUyLCAgIDIsICAgMSwgMTI5LA0KKyAgIDI4OCwgMjExLCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwNCisgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsDQorICAgMjEyLCAgMzEsIDEzMCwgMjg5LCAgIDksICAzMywgIDExLCAxMzEsIDI5MCwgIDU0LA0KKyAgIDIxMywgIDI4LCAgMjcsIDEzMiwgMjkxLCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwNCisgICAgMzAsICA1NSwgMjE0LCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTMzLCAyOTIsDQorICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTM0LCAyMTUsIDI5MywgMTk4LA0KKyAgIDI5OSwgMTM2LCAxMjAsIDEzOCwgIDYwLCAyNzksICA1OCwgIDYyLCAzNTcsIDEzOSwNCisgICAxNDAsIDI5NSwgMTU2LCAgNTcsIDIxOSwgMjk3LCAgNjMsIDIxNywgMTM3LCAxNzAsDQorICAgMzAwLCAyMjIsICA2NCwgMTA2LCAgNjEsICA3OCwgMjk0LCAgOTIsIDE0MiwgMTQxLA0KKyAgIDEzNSwgMjIxLCAyOTYsIDMwMSwgMzQzLCAgNTksIDI5OCwgMTg0LCAzMjksIDMxNSwNCisgICAyMjAsIDIxNiwgMjY1LCAyNTEsIDIxOCwgMjM3LCAzNTIsIDIyMywgMTU3LCAgODYsDQorICAgMTcxLCAgODcsIDE2NCwgMzUxLCAxMTEsIDMwMiwgIDY1LCAxNzgsIDExNSwgMzIzLA0KKyAgICA3MiwgMTkyLCAxMDEsIDE3OSwgIDkzLCAgNzMsIDE5MywgMTUxLCAzMzcsIDMwOSwNCisgICAxNDMsIDI3NCwgIDY5LCAzMjQsIDE2NSwgMTUwLCAgOTcsIDMzOCwgMTEwLCAzMTAsDQorICAgMzMwLCAyNzMsICA2OCwgMTA3LCAxNzUsIDI0NSwgMTE0LCAgNzksIDExMywgMTg5LA0KKyAgIDI0NiwgMjU5LCAxNzQsICA3MSwgMTg1LCAgOTYsIDM0NCwgMTAwLCAzMjIsICA4MywNCisgICAzMzQsIDMxNiwgMzMzLCAyNTIsIDE2MSwgMzQ4LCAxNDcsICA4MiwgMjY5LCAyMzIsDQorICAgMjYwLCAzMDgsIDM1MywgMzQ3LCAxNjMsIDIzMSwgMzA2LCAzMjAsIDE4OCwgMjcwLA0KKyAgIDE0NiwgMTc3LCAyNjYsIDM1MCwgMjU2LCAgODUsIDE0OSwgMTE2LCAxOTEsIDE2MCwNCisgICAyMzgsIDI1OCwgMzM2LCAzMDUsIDI1NSwgIDg4LCAyMjQsICA5OSwgMzM5LCAyMzAsDQorICAgMjI4LCAyMjcsIDI3MiwgMjQyLCAyNDEsIDMxOSwgMjMzLCAzMTEsIDEwMiwgIDc0LA0KKyAgIDE4MCwgMjc1LCAgNjYsIDE5NCwgMTUyLCAzMjUsIDE3MiwgMjQ3LCAyNDQsIDI2MSwNCisgICAxMTcsIDE1OCwgMTY2LCAzNTQsICA3NSwgMTQ0LCAxMDgsIDMxMiwgIDk0LCAxODYsDQorICAgMzAzLCAgODAsIDIzNCwgIDg5LCAxOTUsIDExMiwgMzQwLCAxODEsIDM0NSwgMzE3LA0KKyAgIDMyNiwgMjc2LCAyMzksIDE2NywgMTE4LCAzMTMsICA3MCwgMzU1LCAzMjcsIDI1MywNCisgICAxOTAsIDE3NiwgMjcxLCAxMDQsICA5OCwgMTUzLCAxMDMsICA5MCwgIDc2LCAyNjcsDQorICAgMjc3LCAyNDgsIDIyNSwgMjYyLCAxODIsICA4NCwgMTU0LCAyMzUsIDMzNSwgMTY4LA0KKyAgIDMzMSwgMTk2LCAzNDEsIDI0OSwgMTYyLCAzMDcsIDE0OCwgMzQ5LCAyNjMsIDMyMSwNCisgICAyNTcsIDI0MywgMjI5LCAzNTYsIDE1OSwgMTE5LCAgNjcsIDE4NywgMTczLCAxNDUsDQorICAgMjQwLCAgNzcsIDMwNCwgMzMyLCAzMTQsIDM0MiwgMTA5LCAyNTQsICA4MSwgMjc4LA0KKyAgIDEwNSwgIDkxLCAzNDYsIDMxOCwgMTgzLCAyNTAsIDE5NywgMzI4LCAgOTUsIDE1NSwNCisgICAxNjksIDI2OCwgMjI2LCAyMzYsIDI2NCAgICAgICAgICAgICAgICAgDQorfTsNCisNCitzdGF0aWMgV29yZDE2IHNvcnRfMTk4NVszOTddID0gew0KKyAgICAgMCwgICA0LCAgIDYsIDEyOSwgMjE1LCAzMDQsIDM5MCwgICA3LCAgIDUsICAgMywNCisgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMjIyLCAyMjMsIDIyNCwgMjI1LCAyMjYsDQorICAgMTMwLCAyMTYsIDMwNSwgMzkxLCAxMzUsIDIyMSwgMzEwLCAzOTYsIDEzMiwgMjE4LA0KKyAgIDMwNywgMzkzLCAxMzMsIDIxOSwgMzA4LCAzOTQsIDEzNiwgMzExLCAxMzQsIDIyMCwNCisgICAzMDksIDM5NSwgMTMxLCAyMTcsIDMwNiwgMzkyLCAgNTIsICAgMiwgICAxLCAxMzcsDQorICAgMzEyLCAyMjcsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LA0KKyAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywNCisgICAyMjgsICAzMSwgMTM4LCAzMTMsICAgOSwgIDMzLCAgMTEsIDEzOSwgMzE0LCAgNTQsDQorICAgMjI5LCAgMjgsICAyNywgMTQwLCAzMTUsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLA0KKyAgICAzMCwgIDU1LCAyMzAsICAzNywgIDM2LCAgMzksICAzOCwgIDQwLCAxNDEsIDMxNiwNCisgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDU2LCAxNDIsIDIzMSwgMzE3LCAgNjMsDQorICAgIDczLCAgOTIsIDM0MCwgIDgyLCAzMjQsIDE0OSwgMzUzLCAxNTksIDMzNCwgMTY1LA0KKyAgIDMzOCwgMTc4LCAxNjMsIDI1NCwgIDc3LCAxNjgsIDI1NywgMTUzLCAzNDMsICA1NywNCisgICAyNDgsIDIzOCwgIDc5LCAyNTIsIDE2NiwgIDY3LCAgODAsIDIwMSwgMTAxLCAyNjcsDQorICAgMTQzLCAxNjQsIDM0MSwgMjU1LCAzMzksIDE4NywgMzc2LCAzMTgsICA3OCwgMzI4LA0KKyAgIDM2MiwgMTE1LCAyMzIsIDI0MiwgMjUzLCAyOTAsIDI3NiwgIDYyLCAgNTgsIDE1OCwNCisgICAgNjgsICA5MywgMTc5LCAzMTksIDE0OCwgMTY5LCAxNTQsICA3MiwgMzg1LCAzMjksDQorICAgMzMzLCAzNDQsIDEwMiwgIDgzLCAxNDQsIDIzMywgMzIzLCAxMjQsIDI0MywgMTkyLA0KKyAgIDM1NCwgMjM3LCAgNjQsIDI0NywgMjAyLCAyMDksIDE1MCwgMTE2LCAzMzUsIDI2OCwNCisgICAyMzksIDI5OSwgMTg4LCAxOTYsIDI5OCwgIDk0LCAxOTUsIDI1OCwgMTIzLCAzNjMsDQorICAgMzg0LCAxMDksIDMyNSwgMzcxLCAxNzAsIDM3MCwgIDg0LCAxMTAsIDI5NSwgMTgwLA0KKyAgICA3NCwgMjEwLCAxOTEsIDEwNiwgMjkxLCAyMDUsIDM2NywgMzgxLCAzNzcsIDIwNiwNCisgICAzNTUsIDEyMiwgMTE5LCAxMjAsIDM4MywgMTYwLCAxMDUsIDEwOCwgMjc3LCAzODAsDQorICAgMjk0LCAyODQsIDI4NSwgMzQ1LCAyMDgsIDI2OSwgMjQ5LCAzNjYsIDM4NiwgMzAwLA0KKyAgIDI5NywgMjU5LCAxMjUsIDM2OSwgMTk3LCAgOTcsIDE5NCwgMjg2LCAyMTEsIDI4MSwNCisgICAyODAsIDE4MywgMzcyLCAgODcsIDE1NSwgMjgzLCAgNTksIDM0OCwgMzI3LCAxODQsDQorICAgIDc2LCAxMTEsIDMzMCwgMjAzLCAzNDksICA2OSwgIDk4LCAxNTIsIDE0NSwgMTg5LA0KKyAgICA2NiwgMzIwLCAzMzcsIDE3MywgMzU4LCAyNTEsIDE5OCwgMTc0LCAyNjMsIDI2MiwNCisgICAxMjYsIDI0MSwgMTkzLCAgODgsIDM4OCwgMTE3LCAgOTUsIDM4NywgMTEyLCAzNTksDQorICAgMjg3LCAyNDQsIDEwMywgMjcyLCAzMDEsIDE3MSwgMTYyLCAyMzQsIDI3MywgMTI3LA0KKyAgIDM3MywgMTgxLCAyOTIsICA4NSwgMzc4LCAzMDIsIDEyMSwgMTA3LCAzNjQsIDM0NiwNCisgICAzNTYsIDIxMiwgMjc4LCAyMTMsICA2NSwgMzgyLCAyODgsIDIwNywgMTEzLCAxNzUsDQorICAgIDk5LCAyOTYsIDM3NCwgMzY4LCAxOTksIDI2MCwgMTg1LCAzMzYsIDMzMSwgMTYxLA0KKyAgIDI3MCwgMjY0LCAyNTAsIDI0MCwgIDc1LCAzNTAsIDE1MSwgIDYwLCAgODksIDMyMSwNCisgICAxNTYsIDI3NCwgMzYwLCAzMjYsICA3MCwgMjgyLCAxNjcsIDE0NiwgMzUyLCAgODEsDQorICAgIDkxLCAzODksIDI2NiwgMjQ1LCAxNzcsIDIzNSwgMTkwLCAyNTYsIDIwNCwgMzQyLA0KKyAgIDEyOCwgMTE4LCAzMDMsIDEwNCwgMzc5LCAxODIsIDExNCwgMzc1LCAyMDAsICA5NiwNCisgICAyOTMsIDE3MiwgMjE0LCAzNjUsIDI3OSwgIDg2LCAyODksIDM1MSwgMzQ3LCAzNTcsDQorICAgMjYxLCAxODYsIDE3NiwgMjcxLCAgOTAsIDEwMCwgMTQ3LCAzMjIsIDI3NSwgMzYxLA0KKyAgICA3MSwgMzMyLCAgNjEsIDI2NSwgMTU3LCAyNDYsIDIzNiAgICAgICAgIA0KK307DQorDQorc3RhdGljIFdvcmQxNiBzb3J0XzIzMDVbNDYxXSA9IHsNCisgICAgIDAsICAgNCwgICA2LCAxNDUsIDI0NywgMzUyLCA0NTQsICAgNywgICA1LCAgIDMsDQorICAgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsIDI1NCwgMjU1LCAyNTYsIDI1NywgMjU4LA0KKyAgIDE0NiwgMjQ4LCAzNTMsIDQ1NSwgMTUxLCAyNTMsIDM1OCwgNDYwLCAxNDgsIDI1MCwNCisgICAzNTUsIDQ1NywgMTQ5LCAyNTEsIDM1NiwgNDU4LCAxNTIsIDM1OSwgMTUwLCAyNTIsDQorICAgMzU3LCA0NTksIDE0NywgMjQ5LCAzNTQsIDQ1NiwgIDUyLCAgIDIsICAgMSwgMTUzLA0KKyAgIDM2MCwgMjU5LCAgMTksICAyMSwgIDEyLCAgMTcsICAxOCwgIDIwLCAgMTYsICAyNSwNCisgICAgMTMsICAxMCwgIDE0LCAgMjQsICAyMywgIDIyLCAgMjYsICAgOCwgIDE1LCAgNTMsDQorICAgMjYwLCAgMzEsIDE1NCwgMzYxLCAgIDksICAzMywgIDExLCAxNTUsIDM2MiwgIDU0LA0KKyAgIDI2MSwgIDI4LCAgMjcsIDE1NiwgMzYzLCAgMzQsICAzNSwgIDI5LCAgNDYsICAzMiwNCisgICAgMzAsICA1NSwgMjYyLCAgMzcsICAzNiwgIDM5LCAgMzgsICA0MCwgMTU3LCAzNjQsDQorICAgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA1NiwgMTU4LCAyNjMsIDM2NSwgMTgxLA0KKyAgIDE5MiwgMTcwLCAgNzksICA1NywgMzk5LCAgOTAsIDE1OSwgMjk3LCAzNzcsIDM2NiwNCisgICAyNzUsICA2OCwgMTgzLCAzODgsIDI4NiwgMTk0LCAyOTksIDkyICwgIDcwLCAxODIsDQorICAgNDAxLCAxNzIsICA1OSwgIDkxLCAgNTgsIDQwMCwgMzY4LCAxNjEsICA4MSwgMTYwLA0KKyAgIDI2NCwgMTcxLCAgODAsIDM4OSwgMzkwLCAzNzgsIDM3OSwgMTkzLCAyOTgsICA2OSwNCisgICAyNjYsIDI2NSwgMzY3LCAyNzcsIDI4OCwgMjc2LCAyODcsIDE4NCwgIDYwLCAxOTUsDQorICAgIDgyLCAgOTMsICA3MSwgMzY5LCA0MDIsIDE3MywgMTYyLCA0NDQsIDMwMCwgMzkxLA0KKyAgICA5OCwgIDc2LCAyNzgsICA2MSwgMjY3LCAzNzQsIDEzNSwgNDExLCAxNjcsIDEwMiwNCisgICAzODAsIDIwMCwgIDg3LCAxNzgsICA2NSwgIDk0LCAyMDQsIDEyNCwgIDcyLCAzNDIsDQorICAgMTg5LCAzMDUsIDM4MSwgMzk2LCA0MzMsIDMwMSwgMjI2LCA0MDcsIDI4OSwgMjM3LA0KKyAgIDExMywgMjE1LCAxODUsIDEyOCwgMzA5LCA0MDMsIDExNiwgMzIwLCAxOTYsIDMzMSwNCisgICAzNzAsIDQyMiwgMTc0LCAgNjQsIDM5MiwgIDgzLCA0MjUsIDIxOSwgMTM0LCAxODgsDQorICAgNDMyLCAxMTIsIDQyNywgMTM5LCAyNzksIDE2MywgNDM2LCAyMDgsIDQ0NywgMjE4LA0KKyAgIDIzNiwgMjI5LCAgOTcsIDI5NCwgMzg1LCAyMzAsIDE2NiwgMjY4LCAxNzcsIDQ0MywNCisgICAyMjUsIDQyNiwgMTAxLCAyNzIsIDEzOCwgMTI3LCAyOTAsIDExNywgMzQ3LCAxOTksDQorICAgNDE0LCAgOTUsIDE0MCwgMjQwLCA0MTAsIDM5NSwgMjA5LCAxMjksIDI4MywgMzQ2LA0KKyAgIDEwNSwgMjQxLCA0MzcsICA4NiwgMzA4LCA0NDgsIDIwMywgMzQ1LCAxODYsIDEwNywNCisgICAyMjAsIDQxNSwgMzM0LCAzMTksIDEwNiwgMzEzLCAxMTgsIDEyMywgIDczLCAyMDcsDQorICAgNDIxLCAyMTQsIDM4NCwgMzczLCA0MzgsICA2MiwgMzcxLCAzNDEsICA3NSwgNDQ5LA0KKyAgIDE2OCwgMzIzLCAxNjQsIDI0MiwgNDE2LCAzMjQsIDMwNCwgMTk3LCAzMzUsIDQwNCwNCisgICAyNzEsICA2MywgMTkxLCAzMjUsICA5NiwgMTY5LCAyMzEsIDI4MCwgMzEyLCAxODcsDQorICAgNDA2LCAgODQsIDIwMSwgMTAwLCAgNjcsIDM4MiwgMTc1LCAzMzYsIDIwMiwgMzMwLA0KKyAgIDI2OSwgMzkzLCAzNzYsIDM4MywgMjkzLCAzMDcsIDQwOSwgMTc5LCAyODUsIDMxNCwNCisgICAzMDIsIDM3MiwgMzk4LCAxOTAsIDE4MCwgIDg5LCAgOTksIDEwMywgMjMyLCAgNzgsDQorICAgIDg4LCAgNzcsIDEzNiwgMzg3LCAxNjUsIDE5OCwgMzk0LCAxMjUsIDE3NiwgNDI4LA0KKyAgICA3NCwgMzc1LCAyMzgsIDIyNywgIDY2LCAyNzMsIDI4MiwgMTQxLCAzMDYsIDQxMiwNCisgICAxMTQsICA4NSwgMTMwLCAzNDgsIDExOSwgMjkxLCAyOTYsIDM4NiwgMjMzLCAzOTcsDQorICAgMzAzLCA0MDUsIDI4NCwgNDQ1LCA0MjMsIDIyMSwgMjEwLCAyMDUsIDQ1MCwgMTA4LA0KKyAgIDI3NCwgNDM0LCAyMTYsIDM0MywgMzM3LCAxNDIsIDI0MywgMzIxLCA0MDgsIDQ1MSwNCisgICAzMTAsIDI5MiwgMTIwLCAxMDksIDI4MSwgNDM5LCAyNzAsIDQyOSwgMzMyLCAyOTUsDQorICAgNDE4LCAyMTEsIDMxNSwgMjIyLCAzMjYsIDEzMSwgNDMwLCAyNDQsIDMyNywgMzQ5LA0KKyAgIDQxNywgMzE2LCAxNDMsIDMzOCwgNDQwLCAyMzQsIDExMCwgMjEyLCA0NTIsIDI0NSwNCisgICAxMjEsIDQxOSwgMzUwLCAyMjMsIDEzMiwgNDQxLCAzMjgsIDQxMywgMzE3LCAzMzksDQorICAgMTI2LCAxMDQsIDEzNywgNDQ2LCAzNDQsIDIzOSwgNDM1LCAxMTUsIDMzMywgMjA2LA0KKyAgIDMyMiwgMjE3LCAyMjgsIDQyNCwgNDUzLCAzMTEsIDM1MSwgMTExLCA0NDIsIDIyNCwNCisgICAyMTMsIDEyMiwgNDMxLCAzNDAsIDIzNSwgMjQ2LCAxMzMsIDE0NCwgNDIwLCAzMjksDQorICAgMzE4DQorfTsNCisNCitzdGF0aWMgV29yZDE2IHNvcnRfMjM4NVs0NzddID0gew0KKyAgICAgMCwgICA0LCAgIDYsIDE0NSwgMjUxLCAzNjAsIDQ2NiwgICA3LCAgIDUsICAgMywNCisgICAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwgMjYyLCAyNjMsIDI2NCwgMjY1LCAyNjYsDQorICAgMTQ2LCAyNTIsIDM2MSwgNDY3LCAxNTEsIDI1NywgMzY2LCA0NzIsIDE0OCwgMjU0LA0KKyAgIDM2MywgNDY5LCAxNDksIDI1NSwgMzY0LCA0NzAsIDE1NiwgMzcxLCAxNTAsIDI1NiwNCisgICAzNjUsIDQ3MSwgMTQ3LCAyNTMsIDM2MiwgNDY4LCAgNTIsICAgMiwgICAxLCAxNTcsDQorICAgMzcyLCAyNjcsICAxOSwgIDIxLCAgMTIsICAxNywgIDE4LCAgMjAsICAxNiwgIDI1LA0KKyAgICAxMywgIDEwLCAgMTQsICAyNCwgIDIzLCAgMjIsICAyNiwgICA4LCAgMTUsICA1MywNCisgICAyNjgsICAzMSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAyNTgsIDI1OSwgMjYwLCAyNjEsDQorICAgMzY3LCAzNjgsIDM2OSwgMzcwLCA0NzMsIDQ3NCwgNDc1LCA0NzYsIDE1OCwgMzczLA0KKyAgICAgOSwgIDMzLCAgMTEsIDE1OSwgMzc0LCAgNTQsIDI2OSwgIDI4LCAgMjcsIDE2MCwNCisgICAzNzUsICAzNCwgIDM1LCAgMjksICA0NiwgIDMyLCAgMzAsICA1NSwgMjcwLCAzNywNCisgICAgMzYsICAzOSwgIDM4LCAgNDAsIDE2MSwgMzc2LCAgNDEsICA0MiwgIDQzLCAgNDQsDQorICAgIDQ1LCAgNTYsIDE2MiwgMjcxLCAzNzcsIDE4NSwgMTk2LCAxNzQsICA3OSwgIDU3LA0KKyAgIDQxMSwgIDkwLCAxNjMsIDMwNSwgMzg5LCAzNzgsIDI4MywgIDY4LCAxODcsIDQwMCwNCisgICAyOTQsIDE5OCwgMzA3LCAgOTIsICA3MCwgMTg2LCA0MTMsIDE3NiwgIDU5LCAgOTEsDQorICAgIDU4LCA0MTIsIDM4MCwgMTY1LCAgODEsIDE2NCwgMjcyLCAxNzUsICA4MCwgNDAxLA0KKyAgIDQwMiwgMzkwLCAzOTEsIDE5NywgMzA2LCAgNjksIDI3NCwgMjczLCAzNzksIDI4NSwNCisgICAyOTYsIDI4NCwgMjk1LCAxODgsICA2MCwgMTk5LCAgODIsICA5MywgIDcxLCAzODEsDQorICAgNDE0LCAxNzcsIDE2NiwgNDU2LCAzMDgsIDQwMywgIDk4LCAgNzYsIDI4NiwgIDYxLA0KKyAgIDI3NSwgMzg2LCAxMzUsIDQyMywgMTcxLCAxMDIsIDM5MiwgMjA0LCAgODcsIDE4MiwNCisgICAgNjUsICA5NCwgMjA4LCAxMjQsICA3MiwgMzUwLCAxOTMsIDMxMywgMzkzLCA0MDgsDQorICAgNDQ1LCAzMDksIDIzMCwgNDE5LCAyOTcsIDI0MSwgMTEzLCAyMTksIDE4OSwgMTI4LA0KKyAgIDMxNywgNDE1LCAxMTYsIDMyOCwgMjAwLCAzMzksIDM4MiwgNDM0LCAxNzgsICA2NCwNCisgICA0MDQsICA4MywgNDM3LCAyMjMsIDEzNCwgMTkyLCA0NDQsIDExMiwgNDM5LCAxMzksDQorICAgMjg3LCAxNjcsIDQ0OCwgMjEyLCA0NTksIDIyMiwgMjQwLCAyMzMsICA5NywgMzAyLA0KKyAgIDM5NywgMjM0LCAxNzAsIDI3NiwgMTgxLCA0NTUsIDIyOSwgNDM4LCAxMDEsIDI4MCwNCisgICAxMzgsIDEyNywgMjk4LCAxMTcsIDM1NSwgMjAzLCA0MjYsICA5NSwgMTQwLCAyNDQsDQorICAgNDIyLCA0MDcsIDIxMywgMTI5LCAyOTEsIDM1NCwgMTA1LCAyNDUsIDQ0OSwgIDg2LA0KKyAgIDMxNiwgNDYwLCAyMDcsIDM1MywgMTkwLCAxMDcsIDIyNCwgNDI3LCAzNDIsIDMyNywNCisgICAxMDYsIDMyMSwgMTE4LCAxMjMsICA3MywgMjExLCA0MzMsIDIxOCwgMzk2LCAzODUsDQorICAgNDUwLCAgNjIsIDM4MywgMzQ5LCAgNzUsIDQ2MSwgMTcyLCAzMzEsIDE2OCwgMjQ2LA0KKyAgIDQyOCwgMzMyLCAzMTIsIDIwMSwgMzQzLCA0MTYsIDI3OSwgIDYzLCAxOTUsIDMzMywNCisgICAgOTYsIDE3MywgMjM1LCAyODgsIDMyMCwgMTkxLCA0MTgsICA4NCwgMjA1LCAxMDAsDQorICAgIDY3LCAzOTQsIDE3OSwgMzQ0LCAyMDYsIDMzOCwgMjc3LCA0MDUsIDM4OCwgMzk1LA0KKyAgIDMwMSwgMzE1LCA0MjEsIDE4MywgMjkzLCAzMjIsIDMxMCwgMzg0LCA0MTAsIDE5NCwNCisgICAxODQsICA4OSwgIDk5LCAxMDMsIDIzNiwgIDc4LCAgODgsICA3NywgMTM2LCAzOTksDQorICAgMTY5LCAyMDIsIDQwNiwgMTI1LCAxODAsIDQ0MCwgIDc0LCAzODcsIDI0MiwgMjMxLA0KKyAgICA2NiwgMjgxLCAyOTAsIDE0MSwgMzE0LCA0MjQsIDExNCwgIDg1LCAxMzAsIDM1NiwNCisgICAxMTksIDI5OSwgMzA0LCAzOTgsIDIzNywgNDA5LCAzMTEsIDQxNywgMjkyLCA0NTcsDQorICAgNDM1LCAyMjUsIDIxNCwgMjA5LCA0NjIsIDEwOCwgMjgyLCA0NDYsIDIyMCwgMzUxLA0KKyAgIDM0NSwgMTQyLCAyNDcsIDMyOSwgNDIwLCA0NjMsIDMxOCwgMzAwLCAxMjAsIDEwOSwNCisgICAyODksIDQ1MSwgMjc4LCA0NDEsIDM0MCwgMzAzLCA0MzAsIDIxNSwgMzIzLCAyMjYsDQorICAgMzM0LCAxMzEsIDQ0MiwgMjQ4LCAzMzUsIDM1NywgNDI5LCAzMjQsIDE0MywgMzQ2LA0KKyAgIDQ1MiwgMjM4LCAxMTAsIDIxNiwgNDY0LCAyNDksIDEyMSwgNDMxLCAzNTgsIDIyNywNCisgICAxMzIsIDQ1MywgMzM2LCA0MjUsIDMyNSwgMzQ3LCAxMjYsIDEwNCwgMTM3LCA0NTgsDQorICAgMzUyLCAyNDMsIDQ0NywgMTE1LCAzNDEsIDIxMCwgMzMwLCAyMjEsIDIzMiwgNDM2LA0KKyAgIDQ2NSwgMzE5LCAzNTksIDExMSwgNDU0LCAyMjgsIDIxNywgMTIyLCA0NDMsIDM0OCwNCisgICAyMzksIDI1MCwgMTMzLCAxNDQsIDQzMiwgMzM3LCAzMjYgICAgICAgICANCit9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgc29ydF9TSURbMzVdID0gew0KKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LA0KKyAgIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LA0KKyAgIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LA0KKyAgIDMwLCAzMSwgMzIsIDMzLCAzNA0KK307DQorDQorLyogcG9pbnRlciB0YWJsZSBmb3IgYml0IHNvcnRpbmcgdGFibGVzICovDQorc3RhdGljIFdvcmQxNiAqc29ydF9wdHJbMTZdID0geyBzb3J0XzY2MCwgc29ydF84ODUsIHNvcnRfMTI2NSwgc29ydF8xNDI1LCBzb3J0XzE1ODUsIHNvcnRfMTgyNSwgc29ydF8xOTg1LCBzb3J0XzIzMDUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRfMjM4NSwgc29ydF9TSUQsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEx9Ow0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvb3Blcl8zMmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTU5ZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9vcGVyXzMyYi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyogRG91YmxlIHByZWNpc2lvbiBvcGVyYXRpb25zICovDQorLyogJElkJCAqLw0KKw0KKyNpZm5kZWYgX19PUEVSXzMyQl9IX18NCisjZGVmaW5lIF9fT1BFUl8zMkJfSF9fDQorDQordm9pZCBWT19MX0V4dHJhY3QgKFdvcmQzMiBMXzMyLCBXb3JkMTYgKmhpLCBXb3JkMTYgKmxvKTsNCitXb3JkMzIgTF9Db21wIChXb3JkMTYgaGksIFdvcmQxNiBsbyk7DQorV29yZDMyIE1weV8zMiAoV29yZDE2IGhpMSwgV29yZDE2IGxvMSwgV29yZDE2IGhpMiwgV29yZDE2IGxvMik7DQorV29yZDMyIE1weV8zMl8xNiAoV29yZDE2IGhpLCBXb3JkMTYgbG8sIFdvcmQxNiBuKTsNCitXb3JkMzIgRGl2XzMyIChXb3JkMzIgTF9udW0sIFdvcmQxNiBkZW5vbV9oaSwgV29yZDE2IGRlbm9tX2xvKTsNCisNCisjZW5kaWYgLy9fX09QRVJfMzJCX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjNGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfby5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBQX01FRF9PLkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgTWVkaWFuIG9wZW4tbG9vcCBsYWcgc2VhcmNoCQkJCSAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjaWZuZGVmIF9fUF9NRURfT19IX18NCisjZGVmaW5lIF9fUF9NRURfT19IX18NCisNCitXb3JkMTYgUGl0Y2hfbWVkX29sKCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBvcGVuIGxvb3AgcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB3c3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaWduYWwgdXNlZCB0byBjb21wdXRlIHRoZSBvcGVuIGxvb3AgcGl0Y2ggKi8NCisJCS8qIHdzcFstcGl0X21heF0gdG8gd3NwWy0xXSBzaG91bGQgYmUga25vd24gICAqLw0KKwkJV29yZDE2IExfbWluLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IG1pbmltdW0gcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IExfbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IG1heGltdW0gcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IExfZnJhbWUsICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGxlbmd0aCBvZiBmcmFtZSB0byBjb21wdXRlIHBpdGNoICAgICAgICAgICAqLw0KKwkJV29yZDE2IExfMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IG9sZF8gb3Blbi1sb29wIHBpdGNoICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IG5vcm1hbGl6ZSBjb3JyZWxhdGlvbiBvZiBocF93c3AgZm9yIHRoZSBMYWcgKi8NCisJCVdvcmQxNiAqIGhwX3dzcF9tZW0sICAgICAgICAgICAgICAgICAgLyogaTpvICAgOiBtZW1vcnkgb2YgdGhlIGh5cGFzcyBmaWx0ZXIgZm9yIGhwX3dzcFtdIChsZz05KSAgICovDQorCQlXb3JkMTYgKiBvbGRfaHBfd3NwLCAgICAgICAgICAgICAgICAgIC8qIGk6byAgIDogaHlwYXNzIHdzcFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgd2dodF9mbGcgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogaXMgd2VpZ2h0aW5nIGZ1bmN0aW9uIHVzZWQgICAgICAgICAgICAgICAgICovDQorCQkpOw0KKw0KK1dvcmQxNiBNZWRfb2xhZyggICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgOiBtZWRpYW4gb2YgIDUgcHJldmlvdXMgb3Blbi1sb29wIGxhZ3MgICAgICAgKi8NCisJCVdvcmQxNiBwcmV2X29sX2xhZywgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgIDogcHJldmlvdXMgb3Blbi1sb29wIGxhZyAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgb2xkX29sX2xhZ1s1XQ0KKwkgICAgICAgKTsNCisNCit2b2lkIEhwX3dzcCgNCisJCVdvcmQxNiB3c3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogd3NwW10gIHNpZ25hbCAgICAgICAqLw0KKwkJV29yZDE2IGhwX3dzcFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBvICAgOiBoeXBhc3Mgd3NwW10gICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IGxlbmdodCBvZiBzaWduYWwgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogZmlsdGVyIG1lbW9yeSBbOV0gICAqLw0KKwkgICApOw0KKw0KKyNlbmRpZiAgLy9fX1BfTUVEX09fSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vbC50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3BfbWVkX29sLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJkMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vbC50YWIKQEAgLTAsMCArMSw0NyBAQAorDQorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyB8IFRhYmxlIGZvciBmdW5jdGlvbiBQaXRjaF9tZWRfb2woKQkJCQkgICB8DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorIHN0YXRpYyBXb3JkMTYgY29ycndlaWdodFsxOTldPSB7DQorDQorIDEwNzcyLCAxMDc5NCwgMTA4MTYsIDEwODM5LCAxMDg2MiwgMTA4ODUsIDEwOTA4LCAxMDkzMiwgMTA5NTUsIDEwOTgwLA0KKyAxMTAwNCwgMTEwMjksIDExMDU0LCAxMTA3OSwgMTExMDUsIDExMTMxLCAxMTE1NywgMTExODMsIDExMjEwLCAxMTIzOCwNCisgMTEyNjUsIDExMjkzLCAxMTMyMiwgMTEzNTAsIDExMzc5LCAxMTQwOSwgMTE0MzksIDExNDY5LCAxMTUwMCwgMTE1MzEsDQorIDExNTYzLCAxMTU5NSwgMTE2MjgsIDExNjYxLCAxMTY5NCwgMTE3MjgsIDExNzYzLCAxMTc5OCwgMTE4MzQsIDExODcwLA0KKyAxMTkwNywgMTE5NDUsIDExOTgzLCAxMjAyMiwgMTIwNjEsIDEyMTAxLCAxMjE0MiwgMTIxODQsIDEyMjI2LCAxMjI3MCwNCisgMTIzMTQsIDEyMzU4LCAxMjQwNCwgMTI0NTEsIDEyNDk4LCAxMjU0NywgMTI1OTYsIDEyNjQ3LCAxMjY5OSwgMTI3NTEsDQorIDEyODA1LCAxMjg2MSwgMTI5MTcsIDEyOTc1LCAxMzAzNCwgMTMwOTUsIDEzMTU3LCAxMzIyMSwgMTMyODYsIDEzMzUzLA0KKyAxMzQyMiwgMTM0OTMsIDEzNTY2LCAxMzY0MSwgMTM3MTksIDEzNzk4LCAxMzg4MCwgMTM5NjUsIDE0MDUzLCAxNDE0MywNCisgMTQyMzcsIDE0MzM0LCAxNDQzNSwgMTQ1MzksIDE0NjQ4LCAxNDc2MSwgMTQ4NzksIDE1MDAyLCAxNTEzMCwgMTUyNjUsDQorIDE1NDA2LCAxNTU1NCwgMTU3MTAsIDE1ODc0LCAxNjA1NiwgMTYzODQsIDE2Mzg0LCAxNjM4NCwgMTYzODQsIDE2Mzg0LA0KKyAxNjM4NCwgMTYzODQsIDE2MDU2LCAxNTg3NCwgMTU3MTAsIDE1NTU0LCAxNTQwNiwgMTUyNjUsIDE1MTMwLCAxNTAwMiwNCisgMTQ4NzksIDE0NzYxLCAxNDY0OCwgMTQ1MzksIDE0NDM1LCAxNDMzNCwgMTQyMzcsIDE0MTQzLCAxNDA1MywgMTM5NjUsDQorIDEzODgwLCAxMzc5OCwgMTM3MTksIDEzNjQxLCAxMzU2NiwgMTM0OTMsIDEzNDIyLCAxMzM1MywgMTMyODYsIDEzMjIxLA0KKyAxMzE1NywgMTMwOTUsIDEzMDM0LCAxMjk3NSwgMTI5MTcsIDEyODYxLCAxMjgwNSwgMTI3NTEsIDEyNjk5LCAxMjY0NywNCisgMTI1OTYsIDEyNTQ3LCAxMjQ5OCwgMTI0NTEsIDEyNDA0LCAxMjM1OCwgMTIzMTQsIDEyMjcwLCAxMjIyNiwgMTIxODQsDQorIDEyMTQyLCAxMjEwMSwgMTIwNjEsIDEyMDIyLCAxMTk4MywgMTE5NDUsIDExOTA3LCAxMTg3MCwgMTE4MzQsIDExNzk4LA0KKyAxMTc2MywgMTE3MjgsIDExNjk0LCAxMTY2MSwgMTE2MjgsIDExNTk1LCAxMTU2MywgMTE1MzEsIDExNTAwLCAxMTQ2OSwNCisgMTE0MzksIDExNDA5LCAxMTM3OSwgMTEzNTAsIDExMzIyLCAxMTI5MywgMTEyNjUsIDExMjM4LCAxMTIxMCwgMTExODMsDQorIDExMTU3LCAxMTEzMSwgMTExMDUsIDExMDc5LCAxMTA1NCwgMTEwMjksIDExMDA0LCAxMDk4MCwgMTA5NTUsIDEwOTMyLA0KKyAxMDkwOCwgMTA4ODUsIDEwODYyLCAxMDgzOSwgMTA4MTYsIDEwNzk0LCAxMDc3MiwgMTA3NTAsIDEwNzI4fTsNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfZ2FpbjIudGFiIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX2dhaW4yLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBkZWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX2dhaW4yLnRhYgpAQCAtMCwwICsxLDIyOCBAQAorDQorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBUYWJsZXMgZm9yIGZ1bmN0aW9uIHFfZ2FpbjIoKSAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgZ19waXRjaChRMTQpLCAgZ19jb2RlKFExMSkgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBwaXRjaCBnYWluIGFyZSBvcmRlcmVkIGluIHRhYmxlIHRvIHJlZHVjZSBjb21wbGV4aXR5ICoNCisgKiBkdXJpbmcgcXVhbnRpemF0aW9uIG9mIGdhaW5zLiAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2RlZmluZSBuYl9xdWFfZ2FpbjZiICA2NCAgICAgLyogTnVtYmVyIG9mIHF1YW50aXphdGlvbiBsZXZlbCAqLw0KKyNkZWZpbmUgbmJfcXVhX2dhaW43YiAgMTI4ICAgIC8qIE51bWJlciBvZiBxdWFudGl6YXRpb24gbGV2ZWwgKi8NCisNCisNCitzdGF0aWMgV29yZDE2IHRfcXVhX2dhaW42Yls2NCoyXSA9IHsNCisgICAxNTY2LCAgMTMzMiwNCisgICAxNTc3LCAgMzU1NywNCisgICAzMDcxLCAgNjQ5MCwNCisgICA0MTkzLCAxMDE2MywNCisgICA0NDk2LCAgMjUzNCwNCisgICA1MDE5LCAgNDQ4OCwNCisgICA1NTg2LCAxNTYxNCwNCisgICA1NzI1LCAgMTQyMiwNCisgICA2NDUzLCAgIDU4MCwNCisgICA2NzI0LCAgNjgzMSwNCisgICA3NjU3LCAgMzUyNywNCisgICA4MDcyLCAgMjA5OSwNCisgICA4MjMyLCAgNTMxOSwNCisgICA4ODI3LCAgODc3NSwNCisgICA5NzQwLCAgMjg2OCwNCisgICA5ODU2LCAgMTQ2NSwNCisgIDEwMDg3LCAxMjQ4OCwNCisgIDEwMjQxLCAgNDQ1MywNCisgIDEwODU5LCAgNjYxOCwNCisgIDExMzIxLCAgMzU4NywNCisgIDExNDE3LCAgMTgwMCwNCisgIDExNjQzLCAgMjQyOCwNCisgIDExNzE4LCAgIDk4OCwNCisgIDEyMzEyLCAgNTA5MywNCisgIDEyNTIzLCAgODQxMywNCisgIDEyNTc0LCAyNjIxNCwNCisgIDEyNjAxLCAgMzM5NiwNCisgIDEzMTcyLCAgMTYyMywNCisgIDEzMjg1LCAgMjQyMywNCisgIDEzNDE4LCAgNjA4NywNCisgIDEzNDU5LCAxMjgxMCwNCisgIDEzNjU2LCAgMzYwNywNCisgIDE0MTExLCAgNDUyMSwNCisgIDE0MTQ0LCAgMTIyOSwNCisgIDE0NDI1LCAgMTg3MSwNCisgIDE0NDMxLCAgNzIzNCwNCisgIDE0NDQ1LCAgMjgzNCwNCisgIDE0NjI4LCAxMDAzNiwNCisgIDE0ODYwLCAxNzQ5NiwNCisgIDE1MTYxLCAgMzYyOSwNCisgIDE1MjA5LCAgNTgxOSwNCisgIDE1Mjk5LCAgMjI1NiwNCisgIDE1NTE4LCAgNDcyMiwNCisgIDE1NjYzLCAgMTA2MCwNCisgIDE1NzU5LCAgNzk3MiwNCisgIDE1OTM5LCAxMTk2NCwNCisgIDE2MDIwLCAgMjk5NiwNCisgIDE2MDg2LCAgMTcwNywNCisgIDE2NTIxLCAgNDI1NCwNCisgIDE2NTc2LCAgNjIyNCwNCisgIDE2ODk0LCAgMjM4MCwNCisgIDE2OTA2LCAgIDY4MSwNCisgIDE3MjEzLCAgODQwNiwNCisgIDE3NjEwLCAgMzQxOCwNCisgIDE3ODk1LCAgNTI2OSwNCisgIDE4MTY4LCAxMTc0OCwNCisgIDE4MjMwLCAgMTU3NSwNCisgIDE4NjA3LCAzMjc2NywNCisgIDE4NzI4LCAyMTY4NCwNCisgIDE5MTM3LCAgMjU0MywNCisgIDE5NDIyLCAgNjU3NywNCisgIDE5NDQ2LCAgNDA5NywNCisgIDE5NDUwLCAgOTA1NiwNCisgIDIwMzcxLCAxNDg4NX07DQorDQorc3RhdGljIFdvcmQxNiB0X3F1YV9nYWluN2JbMTI4KjJdID0gew0KKyAgICAyMDQsICAgNDQxLA0KKyAgICA0NjQsICAxOTc3LA0KKyAgICA4NjksICAxMDc3LA0KKyAgIDEwNzIsICAzMDYyLA0KKyAgIDEyODEsICA0NzU5LA0KKyAgIDE2NDcsICAxNTM5LA0KKyAgIDE4NDUsICA3MDIwLA0KKyAgIDE4NTMsICAgNjM0LA0KKyAgIDE5OTUsICAyMzM2LA0KKyAgIDIzNTEsIDE1NDAwLA0KKyAgIDI2NjEsICAxMTY1LA0KKyAgIDI3MDIsICAzOTAwLA0KKyAgIDI3MTAsIDEwMTMzLA0KKyAgIDMxOTUsICAxNzUyLA0KKyAgIDM0OTgsICAyNjI0LA0KKyAgIDM2NjMsICAgODQ5LA0KKyAgIDM5ODQsICA1Njk3LA0KKyAgIDQyMTQsICAzMzk5LA0KKyAgIDQ0MTUsICAxMzA0LA0KKyAgIDQ2OTUsICAyMDU2LA0KKyAgIDUzNzYsICA0NTU4LA0KKyAgIDUzODYsICAgNjc2LA0KKyAgIDU1MTgsIDIzNTU0LA0KKyAgIDU1NjcsICA3Nzk0LA0KKyAgIDU2NDQsICAzMDYxLA0KKyAgIDU2NzIsICAxNTEzLA0KKyAgIDU5NTcsICAyMzM4LA0KKyAgIDY1MzMsICAxMDYwLA0KKyAgIDY4MDQsICA1OTk4LA0KKyAgIDY4MjAsICAxNzY3LA0KKyAgIDY5MzcsICAzODM3LA0KKyAgIDcyNzcsICAgNDE0LA0KKyAgIDczMDUsICAyNjY1LA0KKyAgIDc0NjYsIDExMzA0LA0KKyAgIDc5NDIsICAgNzk0LA0KKyAgIDgwMDcsICAxOTgyLA0KKyAgIDgwMDcsICAxMzY2LA0KKyAgIDgzMjYsICAzMTA1LA0KKyAgIDgzMzYsICA0ODEwLA0KKyAgIDg3MDgsICA3OTU0LA0KKyAgIDg5ODksICAyMjc5LA0KKyAgIDkwMzEsICAxMDU1LA0KKyAgIDkyNDcsICAzNTY4LA0KKyAgIDkyODMsICAxNjMxLA0KKyAgIDk2NTQsICA2MzExLA0KKyAgIDk4MTEsICAyNjA1LA0KKyAgMTAxMjAsICAgNjgzLA0KKyAgMTAxNDMsICA0MTc5LA0KKyAgMTAyNDUsICAxOTQ2LA0KKyAgMTAzMzUsICAxMjE4LA0KKyAgMTA0NjgsICA5OTYwLA0KKyAgMTA2NTEsICAzMDAwLA0KKyAgMTA5NTEsICAxNTMwLA0KKyAgMTA5NjksICA1MjkwLA0KKyAgMTEyMDMsICAyMzA1LA0KKyAgMTEzMjUsICAzNTYyLA0KKyAgMTE3NzEsICA2NzU0LA0KKyAgMTE4MzksICAxODQ5LA0KKyAgMTE5NDEsICA0NDk1LA0KKyAgMTE5NTQsICAxMjk4LA0KKyAgMTE5NzUsIDE1MjIzLA0KKyAgMTE5NzcsICAgODgzLA0KKyAgMTE5ODYsICAyODQyLA0KKyAgMTI0MzgsICAyMTQxLA0KKyAgMTI1OTMsICAzNjY1LA0KKyAgMTI2MzYsICA4MzY3LA0KKyAgMTI2NTgsICAxNTk0LA0KKyAgMTI4ODYsICAyNjI4LA0KKyAgMTI5ODQsICA0OTQyLA0KKyAgMTMxNDYsICAxMTE1LA0KKyAgMTMyMjQsICAgNTI0LA0KKyAgMTMzNDEsICAzMTYzLA0KKyAgMTMzOTksICAxOTIzLA0KKyAgMTM1NDksICA1OTYxLA0KKyAgMTM2MDYsICAxNDAxLA0KKyAgMTM2NTUsICAyMzk5LA0KKyAgMTM3ODIsICAzOTA5LA0KKyAgMTM4NjgsIDEwOTIzLA0KKyAgMTQyMjYsICAxNzIzLA0KKyAgMTQyMzIsICAyOTM5LA0KKyAgMTQyNzgsICA3NTI4LA0KKyAgMTQ0MzksICA0NTk4LA0KKyAgMTQ0NTEsICAgOTg0LA0KKyAgMTQ0NTgsICAyMjY1LA0KKyAgMTQ3OTIsICAxNDAzLA0KKyAgMTQ4MTgsICAzNDQ1LA0KKyAgMTQ4OTksICA1NzA5LA0KKyAgMTUwMTcsIDE1MzYyLA0KKyAgMTUwNDgsICAxOTQ2LA0KKyAgMTUwNjksICAyNjU1LA0KKyAgMTU0MDUsICA5NTkxLA0KKyAgMTU0MDUsICA0MDc5LA0KKyAgMTU1NzAsICA3MTgzLA0KKyAgMTU2ODcsICAyMjg2LA0KKyAgMTU2OTEsICAxNjI0LA0KKyAgMTU2OTksICAzMDY4LA0KKyAgMTU3NzIsICA1MTQ5LA0KKyAgMTU4NjgsICAxMjA1LA0KKyAgMTU5NzAsICAgNjk2LA0KKyAgMTYyNDksICAzNTg0LA0KKyAgMTYzMzgsICAxOTE3LA0KKyAgMTY0MjQsICAyNTYwLA0KKyAgMTY0ODMsICA0NDM4LA0KKyAgMTY1MjksICA2NDEwLA0KKyAgMTY2MjAsIDExOTY2LA0KKyAgMTY4MzksICA4NzgwLA0KKyAgMTcwMzAsICAzMDUwLA0KKyAgMTcwMzMsIDE4MzI1LA0KKyAgMTcwOTIsICAxNTY4LA0KKyAgMTcxMjMsICA1MTk3LA0KKyAgMTczNTEsICAyMTEzLA0KKyAgMTczNzQsICAgOTgwLA0KKyAgMTc1NjYsIDI2MjE0LA0KKyAgMTc2MDksICAzOTEyLA0KKyAgMTc2MzksIDMyNzY3LA0KKyAgMTgxNTEsICA3ODcxLA0KKyAgMTgxOTcsICAyNTE2LA0KKyAgMTgyMDIsICA1NjQ5LA0KKyAgMTg2NzksICAzMjgzLA0KKyAgMTg5MzAsICAxMzcwLA0KKyAgMTkyNzEsIDEzNzU3LA0KKyAgMTkzMTcsICA0MTIwLA0KKyAgMTk0NjAsICAxOTczLA0KKyAgMTk2NTQsIDEwMDE4LA0KKyAgMTk3NjQsICA2NzkyLA0KKyAgMTk5MTIsICA1MTM1LA0KKyAgMjAwNDAsICAyODQxLA0KKyAgMjEyMzQsIDE5ODMzfTsNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfcHVsc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9wdWxzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjU1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfcHVsc2UuaApAQCAtMCwwICsxLDY2IEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgUV9QVUxTRS5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIENvZGluZyBhbmQgZGVjb2Rpbmcgb2YgYWxnZWJyYWljIGNvZGVib29rCQkJICAgICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyNpZm5kZWYgIF9fUV9QVUxTRV9IX18NCisjZGVmaW5lICBfX1FfUFVMU0VfSF9fDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisNCitXb3JkMzIgcXVhbnRfMXBfTjEoICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoTisxKSBiaXRzICAgICAgICAgICAqLw0KKwkJV29yZDE2IHBvcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlICAgICAgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCitXb3JkMzIgcXVhbnRfMnBfMk4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMipOKSsxIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovDQorCQlXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8NCisJCVdvcmQxNiBOKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KKw0KK1dvcmQzMiBxdWFudF8zcF8zTjEoICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICgzKk4pKzEgYml0cyAgICAgICAgICovDQorCQlXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8NCisJCVdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLw0KKwkJV29yZDE2IHBvczMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDMgICAgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCitXb3JkMzIgcXVhbnRfNHBfNE4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNCpOKSsxIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovDQorCQlXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8NCisJCVdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLw0KKwkJV29yZDE2IHBvczQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDQgICAgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCitXb3JkMzIgcXVhbnRfNHBfNE4oICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiA0Kk4gYml0cyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjQgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCitXb3JkMzIgcXVhbnRfNXBfNU4oICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiA1Kk4gYml0cyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjUgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCitXb3JkMzIgcXVhbnRfNnBfNk5fMiggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNipOKS0yIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjYgICovDQorCQlXb3JkMTYgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8NCisNCisNCisjZW5kaWYgLy9fX1FfUFVMU0VfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xaXNmX25zLnRhYiBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcWlzZl9ucy50YWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJmMGRhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcWlzZl9ucy50YWIKQEAgLTAsMCArMSwzNDcgQEAKKw0KKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHFpc2ZfbnMuaA0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBRdWFudGl6YXRpb24gdGFibGVzIGZvciBzcGxpdCBieSA1IFZRIG9mIElTRnMgZm9yIGEgYmFja2dyb3VuZCBub2lzZSBkYXRhYmFzZQ0KKyAqIFZlcnNpb24gd2hpdGggbm8gcHJlZGljdGlvbg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2RlZmluZSBPUkRFUiAgIDE2ICAgICAgICAgICAgLyogb3JkZXIgb2YgbGluZWFyIHByZWRpY3Rpb24gZmlsdGVyICovDQorI2RlZmluZSBJU0ZfR0FQIDEyOA0KKw0KKyNkZWZpbmUgU0laRV9CS19OT0lTRTEgIDY0DQorI2RlZmluZSBTSVpFX0JLX05PSVNFMiAgNjQNCisjZGVmaW5lIFNJWkVfQktfTk9JU0UzICA2NA0KKyNkZWZpbmUgU0laRV9CS19OT0lTRTQgIDMyDQorI2RlZmluZSBTSVpFX0JLX05PSVNFNSAgMzINCisNCisNCisvKiBtZWFucyBvZiBJU0ZzICovDQorIHN0YXRpYyBXb3JkMTYgbWVhbl9pc2Zfbm9pc2VbT1JERVJdID0gew0KKw0KKyAgIDQ3OCwgIDExMDAsICAyMjEzLCAgMzI2NywgIDQyMTksICA1MjIyLCAgNjE5OCwgIDcyNDAsDQorICA4MjI5LCAgOTE1MywgMTAwOTgsIDExMTA4LCAxMjE0NCwgMTMxODQsIDE0MTY1LCAgMzgwM307DQorDQorDQorLyogMjggYml0cyAqLw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgaXNmIGNvZGVib29rczogIHNwbGl0LWJ5LTUgVlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBjb2RlYm9vayAgIHZlY3RvciBkaW1lbnNpb24gICAgbnVtYmVyIG9mIHZlY3RvcnMgICAgICAgICAgICAgICAgICoNCisgKiAgfn5+fn5+fn4gICB+fn5+fn5+fn5+fn5+fn5+ICAgIH5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAqDQorICogICAgIDEgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAyICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgIDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMyAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDQgICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICA1ICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDFzdCBzcGxpdDogICBpc2YwIHRvIGlzZjENCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorDQorIHN0YXRpYyBXb3JkMTYgZGljbzFfaXNmX25vaXNlW1NJWkVfQktfTk9JU0UxKjJdID0gew0KKw0KKyAgLTI2OSwgIC02NzMsDQorICAtMjIyLCAgLTUzNywNCisgIC0yMzMsICAtNDMwLA0KKyAgLTEzOCwgIC00NTEsDQorICAtMjEyLCAgLTMzMSwNCisgIC0xOTIsICAtMjQxLA0KKyAgIC04NywgIC0yMzEsDQorICAtMTkxLCAgLTEyOCwNCisgICAtNzAsICAtMTA2LA0KKyAgLTE2NCwgICAgLTYsDQorICAgIDc0LCAgLTE3OSwNCisgICAgMjcsICAgLTMzLA0KKyAgLTEwMiwgICAgNzQsDQorICAtMTYyLCAgIDExNSwNCisgICAtOTQsICAgMTcyLA0KKyAgICAtNiwgICAxMzAsDQorICAtMTQzLCAgIDIzNCwNCisgICAgMTQsICAgMjE4LA0KKyAgIC02NSwgICAyNzAsDQorICAgIDg4LCAgIDE4MiwNCisgIC0xMjQsICAgMzQxLA0KKyAgIC00NCwgICAzODEsDQorICAgIDM4LCAgIDMzNSwNCisgICAxMTcsICAgMjc0LA0KKyAgLTExMiwgICA0NTQsDQorICAgIDc0LCAgIDQzMSwNCisgICAgLTUsICAgNDg4LA0KKyAgIDE3NSwgICAzODQsDQorICAgLTgzLCAgIDU2MSwNCisgICAxMjIsICAgNTI5LA0KKyAgICAyMSwgICA2MDEsDQorICAgMjI5LCAgIDQ4MSwNCisgICAyMzEsICAgMzAzLA0KKyAgIDIyNiwgICA2MDgsDQorICAgMzAwLCAgIDM3MiwNCisgICAyMTAsICAgMTg3LA0KKyAgIDMwNiwgICAyNjUsDQorICAgMzI4LCAgIDQ3MywNCisgICAzODIsICAgMzMxLA0KKyAgIDM3MSwgICAxMzIsDQorICAgMTM5LCAgICA1OCwNCisgICAzNjUsICAgIDIxLA0KKyAgIDI1MCwgICAtODIsDQorICAgNDQzLCAgIDIxOCwNCisgICA0ODMsICAgMTEwLA0KKyAgIDQyNiwgICA0MTUsDQorICAgNTc5LCAgIDIyMiwNCisgICA1MTgsICAgMzMzLA0KKyAgIDU3MywgICA0NDgsDQorICAgNDU1LCAgIDUyOSwNCisgICA2ODUsICAgMzI5LA0KKyAgIDMzMiwgICA1ODAsDQorICAgNTk1LCAgIDU5MywNCisgICA0NjgsICAgNjQ1LA0KKyAgIDc2MiwgICA1MTcsDQorICAgMzI2LCAgIDcwOSwNCisgICA0ODUsICAgNzkzLA0KKyAgIDEzMCwgICA2ODQsDQorICAgNjcxLCAgIDczNywNCisgICAzNTQsICAgODc2LA0KKyAgICA4OCwgICA4MDYsDQorICAgLTY1LCAgIDcwNiwNCisgICAtMzUsICAxMDE2LA0KKyAgIDI2NiwgIDExMjN9Ow0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDJuZCBzcGxpdDogICBpc2YyIHRvIGlzZjQNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorIHN0YXRpYyBXb3JkMTYgZGljbzJfaXNmX25vaXNlW1NJWkVfQktfTk9JU0UyKjNdID0gew0KKw0KKyAgLTgyNCwgIC04ODQsICAtOTQ5LA0KKyAgLTgwNSwgIC00NTYsICAtNDE4LA0KKyAgLTQ0MiwgIC00MzgsICAtNTQxLA0KKyAgLTIxNywgIC01NzgsICAtNzkzLA0KKyAgLTE2OCwgIC00NDQsICAtNTgyLA0KKyAgLTI4NywgIC00OTIsICAtMjc0LA0KKyAgLTU1MiwgIC0yOTcsICAtMzAwLA0KKyAgLTE2MywgIC0zMzMsICAtMzU4LA0KKyAgLTM3MCwgIC0yMzIsICAtMjMyLA0KKyAgLTE3NSwgIC0zNTgsICAtMTU5LA0KKyAgLTM4MSwgICAtMjEsICAtMzU3LA0KKyAgLTE4NCwgIC0xNTksICAtMTYyLA0KKyAgIC01MywgIC0xOTEsICAtMjgwLA0KKyAgICAxOCwgIC0yNjcsICAtMjE1LA0KKyAgLTEzOCwgICAgNjEsICAtMjgzLA0KKyAgICA3MSwgICAtOTUsICAtMjk0LA0KKyAgICAxMywgIC0xNTYsICAtNTQ2LA0KKyAgICAgMCwgICAtODMsICAgLTc5LA0KKyAgICA0NCwgICAgOTcsICAtMzE2LA0KKyAgIDE3OCwgICAtNTIsICAtMjEzLA0KKyAgIDIyMiwgIC0yNjEsICAtNDIyLA0KKyAgIDIzNywgIC0xMTgsICAgLTQ0LA0KKyAgIDE0MSwgICAxNDUsICAtMTMyLA0KKyAgIDM2MywgICAgODEsICAtMjg3LA0KKyAgIDIxMywgICAgNjUsICAgIDM0LA0KKyAgLTEwNywgICAgOTQsICAgIC01LA0KKyAgICA5MSwgICAtMjksICAgMTI2LA0KKyAgLTM1NSwgICAgNTEsICAgLTQxLA0KKyAgLTIxOSwgICAtNzYsICAgMTQ1LA0KKyAgIC02MywgICAxMDAsICAgMjQ0LA0KKyAgLTcxOSwgICAgNDQsICAgIDI3LA0KKyAgLTU3MiwgIC0xMjQsICAgMTU1LA0KKyAgLTQyMywgICAxMzMsICAgMzE1LA0KKyAgLTkxNywgICAgNzEsICAgMjI0LA0KKyAgLTI2OCwgICAzMTgsICAgMTMxLA0KKyAgIC05MywgIC0xOTAsICAgNDIwLA0KKyAgIC05NywgICAxMjIsICAgNDkxLA0KKyAgIC03OSwgICAzMTcsICAgMzU1LA0KKyAgIDEzMCwgICAxMDAsICAgMzI1LA0KKyAgICA4NiwgIC0yOTMsICAgMjEwLA0KKyAgIDEzMywgICAyNTgsICAgMTYxLA0KKyAgIDE3NiwgICAtNzMsICAgNDY1LA0KKyAgIDE5NSwgICAzMDAsICAgMzg0LA0KKyAgIDM0OCwgICAgMjIsICAgMjIxLA0KKyAgIDM3NiwgICAxODMsICAgNDA5LA0KKyAgIDM3NywgICAyODYsICAgMjAyLA0KKyAgIDI0MiwgICAyMTMsICAgNjU5LA0KKyAgIDI1NywgICA1NjUsICAgMjQ4LA0KKyAgIDM0NCwgICA0MDgsICAgLTc2LA0KKyAgIDQwNSwgICA0NDAsICAgNTA5LA0KKyAgIDYxMiwgICAzODUsICAgMzc5LA0KKyAgIDUzNiwgICA2MDcsICAgMjE2LA0KKyAgIC01NiwgICA1ODIsICAgMTkyLA0KKyAgIDEwMCwgICA1MTcsICAgNTY3LA0KKyAgLTM2NSwgICA0NDgsICAgNDQ1LA0KKyAgIDcyOCwgICAzNDcsICAgIDEwLA0KKyAgIDUwNSwgICAzNTcsICAgNzU5LA0KKyAgIDYzNiwgICA1ODIsICAgNjU4LA0KKyAgIDMzNSwgICA1MTcsICAgODUyLA0KKyAgIDM3OCwgICA4MDksICAgNTcyLA0KKyAgLTE5NSwgICA4NzgsICAgODI5LA0KKyAgIDUyOSwgICA3MDcsICAgOTg3LA0KKyAgIDkxOCwgICA3MjYsICAgMzkyLA0KKyAgMTI1MCwgICA5OTcsICAxMDYzfTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAzcmQgc3BsaXQ6ICAgaXNmNSB0byBpc2Y3DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKyBzdGF0aWMgV29yZDE2IGRpY28zX2lzZl9ub2lzZVtTSVpFX0JLX05PSVNFMyozXSA9IHsNCisNCisgIC04MDUsICAtODM4LCAgLTc3NCwNCisgIC01MjIsICAtNjI3LCAgLTgyOCwNCisgIC00NzcsICAtNDg2LCAgLTYwMywNCisgIC0yOTUsICAtNDgxLCAgLTYzNCwNCisgIC0zNjYsICAtMzg0LCAgLTM5MywNCisgIC0xODYsICAtNDE0LCAgLTM5NiwNCisgIC0yMzcsICAtMzk0LCAgLTEwNiwNCisgIC0yNTIsICAtMjAyLCAgLTI3NSwNCisgICAtNjEsICAtMTc3LCAgLTQ0MiwNCisgICAtODQsICAtMTk4LCAgLTE5OSwNCisgIC0xNzksICAtMTI1LCAgIC0zMSwNCisgICAtNzIsICAgLTQ3LCAgLTE2MywNCisgIC0yOTgsICAtMjIwLCAgIDIxNSwNCisgICAtNjQsICAtMTY4LCAgIDI1MSwNCisgIC0xMzMsICAgMTU2LCAgIC01OSwNCisgICAtMzAsICAgIC0yLCAgIDEyNywNCisgICAgNTQsICAgIDY2LCAgIC02MSwNCisgIC0yMzMsICAgIDIxLCAgIDI1MSwNCisgICAyMDksICAgLTUwLCAgICAzMiwNCisgICAgMzMsICAgMTk0LCAgIDEzNiwNCisgIC0xMTcsICAgLTE4LCAgIDQ3NSwNCisgICAyMDIsICAgIDQ2LCAgIDMwOSwNCisgICAyNTYsICAgMTg1LCAgICA1MywNCisgICAgMzUsICAgMjAwLCAgIDM5MCwNCisgICAyMDAsICAgMjYzLCAgIDI0MiwNCisgIC0yMTYsICAgMzAyLCAgIDI5NCwNCisgICAxMjgsICAgMzU4LCAgICAgMCwNCisgICAgMTksICAgNDMxLCAgIDI4NywNCisgICAyMjQsICAgNDQ3LCAgIDI4MCwNCisgICAzNjcsICAgMTY1LCAgIDIxMywNCisgICAzOTcsICAgMzE0LCAgIDMxOSwNCisgICAzODMsICAgMzc5LCAgICA3NSwNCisgICAyNzcsICAgMzI1LCAgIDQ2MiwNCisgICAzOTQsICAgNTA1LCAgIDMzNCwNCisgICAyNTEsICAgIDk4LCAgLTIxMywNCisgICA0NTAsICAgMTUzLCAgIDQ0OCwNCisgICA1NjUsICAgMjI2LCAgICA3NiwNCisgICA0NzAsICAgMzgzLCAgIDUwMiwNCisgICA2MzUsICAgMzkwLCAgIDI3OCwNCisgICAyMzcsICAgMTM1LCAgIDYyMCwNCisgICAzNDIsICAgNDAxLCAgIDY0OSwNCisgICAzMzEsICAgNTUxLCAgIDUxOCwNCisgICAxMzAsICAgNDE4LCAgIDU5MiwNCisgICA1MzEsICAgMzA2LCAgIDczNywNCisgICA3MjksICAgMzg5LCAgIDU4MCwNCisgICA0OTcsICAgNTU3LCAgIDY5OSwNCisgICAyOTYsICAgMzgzLCAgIDg3NCwNCisgICAyODMsICAgNjI0LCAgIDc1OSwNCisgICAxMjYsICAgNjIyLCAgIDQ3NiwNCisgICA1NTksICAgNTk1LCAgIDQ3MiwNCisgICAzODIsICAgNzcwLCAgIDYxNiwNCisgICA3MTksICAgNjEzLCAgIDc0NSwNCisgICA1NDAsICAgNjM5LCAgIDkyOCwNCisgICA1MTcsICAgODI2LCAgIDgwMSwNCisgICA2ODQsICAgODExLCAgIDYwNCwNCisgICA3NTIsICAgNzg2LCAgIDg1NywNCisgICA5MzMsICAgNjYxLCAgIDM1MCwNCisgICA2OTQsICAgNDUwLCAgMTA2MSwNCisgICA1NjIsICAgOTExLCAgMTA1MSwNCisgICA4MjQsICAgODEzLCAgMTEwNCwNCisgICA3NTgsICAxMDQ3LCAgIDg4MiwNCisgIDExNDAsICAgOTE3LCAgIDg4OSwNCisgIDEwMzksICAxMjQ2LCAgMTQyNiwNCisgIDE0ODMsICAxNjY2LCAgMTg3Nn07DQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogNHRoIHNwbGl0OiAgIGlzZjggdG8gaXNmMTENCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorIHN0YXRpYyBXb3JkMTYgZGljbzRfaXNmX25vaXNlW1NJWkVfQktfTk9JU0U0KjRdID0gew0KKw0KKyAgLTc3NiwgIC04NTQsICAtODkxLCAgLTkyMCwNCisgIC01NTIsICAtNjEwLCAgLTY2MywgIC03NDEsDQorICAtMzIxLCAgLTM3MCwgIC00NzYsICAtNTY1LA0KKyAgIDI3NCwgIC0xNjAsICAtNDU2LCAgIDIwMSwNCisgICAyNjUsICAgIDY3LCAgLTE2MCwgIC0zMDYsDQorICAgIC04LCAgLTIxMCwgICAgNzksICAgMjcyLA0KKyAgIDE2MywgICAyMzYsICAgMzA3LCAgIDMwOCwNCisgICA1NzgsICAgMzE3LCAgICA2NCwgICAyOTgsDQorICAgIC05LCAgIDE5NywgICAzNDIsICAgNjIwLA0KKyAgIDM0MywgICAyMzIsICAgMzE0LCAgIDYyMiwNCisgICAxNzMsICAgMTQ5LCAgIDU0OCwgICA1MjcsDQorICAgMzU2LCAgIDM3MCwgICA0ODEsICAgMzc2LA0KKyAgIDEzNSwgICA0NDQsICAgNDg4LCAgIDU1NiwNCisgICAzOTEsICAgNDcxLCAgIDQ4NywgICA2NTMsDQorICAgMjI4LCAgIDQyNCwgICA1NzYsICAgODM1LA0KKyAgIDQyMiwgICAzNzIsICAgNzIyLCAgIDY4MiwNCisgICAyOTUsICAgNjczLCAgIDY5MywgICA2MzUsDQorICAgNTM5LCAgIDU5NiwgICA1OTAsICAgNDQ5LA0KKyAgIDQ3NSwgICA2MTgsICAgNjU5LCAgIDgxOCwNCisgICA3MzUsICAgNTE3LCAgIDQ5MSwgICA2NzMsDQorICAgNjAyLCAgIDM0NiwgICAyNTcsICAgODc3LA0KKyAgIDYyNSwgICA2MzUsICAgODQ5LCAgIDcyMCwNCisgICA3MjcsICAgODE4LCAgIDY5OCwgICA1OTUsDQorICAgNjUzLCAgIDQ4MSwgICA2OTAsICAxMTM5LA0KKyAgIDgxNCwgICA3NjIsICAgNzA0LCAgIDkwOCwNCisgICA1MDcsICAgNzQ3LCAgIDg5OCwgICA5MzYsDQorICAgODQ4LCAgIDg1NSwgICA5MjQsICAgNzg1LA0KKyAgIDY0NiwgIDEwMzcsICAgODgyLCAgIDc5NSwNCisgICA3NzIsICAgODQ1LCAgMTAyNCwgIDExNTEsDQorICAxMTMzLCAgIDk4MywgICA4MTgsICAgOTIxLA0KKyAgIDk0MCwgIDEwNjgsICAxMjUyLCAgMTMwMiwNCisgIDE1ODgsICAxNzY3LCAgMTcxOCwgIDE1MTN9Ow0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDV0aCBzcGxpdDogICBpc2YxMiB0byBpc2YxNQ0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisgc3RhdGljIFdvcmQxNiBkaWNvNV9pc2Zfbm9pc2VbU0laRV9CS19OT0lTRTUqNF0gPSB7DQorICAtODEwLCAgLTg3OSwgIC05NDUsICAtMjU0LA0KKyAgIDI0OCwgICAxODQsICAgNjcxLCAgIDEyOCwNCisgICAyODgsICAgNzAzLCAgIDkxOCwgICAgOTksDQorICAgNjU4LCAgIDU1OCwgICA2NjIsICAgMjE5LA0KKyAgIDU1MiwgICA1ODUsICAgOTEwLCAgIDIwOCwNCisgICA1NTksICAgODA0LCAgIDc1OSwgICAxMTksDQorICAgNjA2LCAgIDc3NCwgICA5MjEsICAtMTM5LA0KKyAgIDc4MiwgICA3NjEsICAgNzQ4LCAgIDIwOCwNCisgICA3NTYsICAgNzA4LCAgIDk4MywgICAgNTYsDQorICAgNTQ0LCAgIDg2NCwgIDEwMTAsICAgMTUyLA0KKyAgIDczNywgICA2OTgsICAgOTg3LCAgIDI5OSwNCisgICA3NzEsICAgOTI0LCAgIDg3OSwgICAxMDMsDQorICAgNTM2LCAgIDc4NSwgICA5NjEsICAgNDA1LA0KKyAgIDY2NywgICA5MTYsICAgODAxLCAgIDMyOCwNCisgICA3MzgsICAgNzA1LCAgIDc3MywgICA0MzksDQorICAgODIzLCAgIDg3MSwgICA5OTIsICAgMzU1LA0KKyAgIDY0MCwgIDEwMDQsICAxMDUyLCAgIDM2OSwNCisgICA3MjQsICAgODIyLCAgIDk0OSwgICA1OTcsDQorICAgNDE1LCAgIDY1NSwgICA3MjksICAgNDgyLA0KKyAgMTAwOSwgICA4OTYsICAgNzkzLCAgIDM2MywNCisgICA5MDgsICAgODAzLCAgIDY4NywgICAtMjUsDQorICAxMDE2LCAgIDgzOCwgIDEwMTEsICAgMTg5LA0KKyAgIDk0NywgIDExMTIsICAgOTQyLCAgIDIyMiwNCisgICA5MTQsICAxMDQ5LCAgIDk4MSwgICA1MjcsDQorICAgOTU2LCAgIDk4NywgIDEwMTEsICAtMTIwLA0KKyAgIDc4MSwgIDEwNDksICAxMTIxLCAgICA5MiwNCisgIDExNzgsICAxMDUzLCAgIDg4NCwgICAgNDcsDQorICAxMTIzLCAgMTA1OSwgIDExODIsICAgMTE4LA0KKyAgIDkzMywgICA5NzIsICAxMjc3LCAgIDM1NywNCisgIDExMDksICAgOTE4LCAgMTEwMSwgICA1MDMsDQorICAxMDM5LCAgMTI4NiwgIDEyMjAsICAgMzE3LA0KKyAgMTM1MSwgIDEyMDcsICAxMDEwLCAgIDMyNn07DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xcGlzZl8ycy50YWIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FwaXNmXzJzLnRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg2OWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xcGlzZl8ycy50YWIKQEAgLTAsMCArMSwxMzYwIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBxcGlzZl8ycy5oDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIFF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHR3by1zdGFnZSBvZiBJU0ZzIChzcGxpdCBieSAyIGluIDFzdCBzdGFnZSkNCisgKiBWZXJzaW9uIHdoaXRoIHByZWRpY3Rpb24gTVUgPSAwLjI1DQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisjZGVmaW5lIE9SREVSICAgMTYgICAgICAgICAgICAvKiBvcmRlciBvZiBsaW5lYXIgcHJlZGljdGlvbiBmaWx0ZXIgKi8NCisjZGVmaW5lIElTRl9HQVAgMTI4ICAgICAgICAgICAvKiA1MCBIeiAqLw0KKyNkZWZpbmUgTl9TVVJWICA0DQorDQorI2RlZmluZSBTSVpFX0JLMSAgMjU2DQorI2RlZmluZSBTSVpFX0JLMiAgMjU2DQorI2RlZmluZSBTSVpFX0JLMjEgNjQNCisjZGVmaW5lIFNJWkVfQksyMiAxMjgNCisjZGVmaW5lIFNJWkVfQksyMyAxMjgNCisjZGVmaW5lIFNJWkVfQksyNCAzMg0KKyNkZWZpbmUgU0laRV9CSzI1IDMyDQorDQorI2RlZmluZSBTSVpFX0JLMjFfMzZiIDEyOA0KKyNkZWZpbmUgU0laRV9CSzIyXzM2YiAxMjgNCisjZGVmaW5lIFNJWkVfQksyM18zNmIgNjQNCisNCisvKiBtZWFucyBvZiBJU0ZzICovDQorc3RhdGljIFdvcmQxNiBtZWFuX2lzZltPUkRFUl0gPSB7DQorDQorICAgNzM4LCAgMTMyNiwgIDIzMzYsICAzNTc4LCAgNDU5NiwgIDU2NjIsICA2NzExLCAgNzczMCwNCisgIDg3NTAsICA5NzUzLCAxMDcwNSwgMTE3MjgsIDEyODMzLCAxMzk3MSwgMTUwNDMsICA0MDM3fTsNCisNCisvKiA0NiBiaXRzICovDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICBpc2YgY29kZWJvb2tzOiAgdHdvLXN0YWdlIFZRIHdpdGggc3BsaXQtYnktNSBpbiAybmQgc3RhZ2UgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGNvZGVib29rICAgdmVjdG9yIGRpbWVuc2lvbiAgICBudW1iZXIgb2YgdmVjdG9ycyAgICAgICAgICAgICAgICAgKg0KKyAqICB+fn5+fn5+fiAgIH5+fn5+fn5+fn5+fn5+fn4gICAgfn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICoNCisgKiAgICAgMV8xICAgICAgICAgICAgOSAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDFfMiAgICAgICAgICAgIDcgICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAyXzEgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMl8yICAgICAgICAgICAgMyAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDJfMyAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAyXzQgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMl81ICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAxc3Qgc3RhZ2UgY29kZWJvb2s7IDFzdCBzcGxpdDogICBpc2YwIHRvIGlzZjgNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIFdvcmQxNiBkaWNvMV9pc2ZbU0laRV9CSzEqOV0gPSB7DQorDQorICAgNTc5LCAgMTA4MSwgIDEwMzUsICAgMzkwLCAgICAgMywgIC0yNjMsICAtMTk4LCAgIC04MiwgICAgMzgsDQorICAgIDE4LCAgIC02OCwgICAtMTIsICAgMzEzLCAgIDc2MSwgICA0MDUsICAgMjQ5LCAgIDExMSwgICAtNzYsDQorICAgNzQwLCAgMTI2MywgIDEyOTIsICAxMDA2LCAgIDk5NywgIDEwMTksICAxMDE3LCAgIDk3NiwgICA5MjMsDQorICAgLTkxLCAgIDgyNywgICA5NDgsICAgNjQ4LCAgIDYxMywgICA1MzUsICAgNTIyLCAgIDQ5MCwgICA0MjEsDQorICAgIDQxLCAgIC00NCwgIC0yODEsICAtNDcyLCAgIDY1MiwgICA1MzQsICAgMTkzLCAgIDEzNSwgICAtOTAsDQorICAgIDQxLCAgLTEyMSwgIC0zNTYsICAgLTYwLCAgIDY2MywgICAzMDcsICAgIDYxLCAgIC00OCwgIC0zNDQsDQorICAgNTU3LCAgIDk0NiwgIDEwNDksICAgODY3LCAgIDg0NiwgICA5OTAsICAxMTEyLCAgMTI2MiwgIDEyNDEsDQorICAtMTE4LCAgLTIwNCwgICAzMjgsICAgNTEyLCAgIDg3MCwgICA3OTMsICAgNjEwLCAgIDQwMiwgICAxODYsDQorICAgMTU2LCAgIDI5MywgICAgNzQsICAtMzM4LCAgLTQ3NSwgIC04OTcsICAtNTk0LCAgLTE2MSwgIC00OTcsDQorICAgMjI2LCAgIDEzMSwgIC0xMzgsICAgMzA3LCAgIDE2OSwgIC0yNzEsICAtMTY0LCAgLTM4NywgIC02MjQsDQorICAgIDYyLCAgIC0zMiwgICAtNjEsICAtMjUyLCAgLTU0MSwgIC04MjgsIC0xMDI3LCAgLTUyMywgIC02NjIsDQorICAgMTAyLCAgIC02MSwgICAxNDEsICAgMTEyLCAgLTI3MCwgIC0yNTEsICAtNTQxLCAgICAyNSwgIC0xNTAsDQorICAgICA2LCAgLTEzMiwgIC0zNTYsICAtNjg2LCAgIC05NiwgIC0zMjIsICAtNTIyLCAgIC0zMSwgIC0zMjYsDQorICAgLTM2LCAgLTIwOSwgIC01MjEsICAtMjI5LCAgIDMwNywgIC0xMzIsICAgIC01LCAgIC05OSwgIC0zODQsDQorICAgIDYwLCAgIC01MSwgIC0yMzcsICAtNjY4LCAgLTk3MywgIC00MDcsICAtNzA4LCAgIC03NSwgIC0xNzIsDQorICAgIDI2LCAgLTEzOCwgIC0yNjYsICAgMTExLCAgLTMwMiwgICAgNDMsICAtMjc4LCAgLTM1NiwgIC0zNTksDQorICAgNTcwLCAgIDgyMiwgICA0OTYsICAtMTU0LCAgLTMxMiwgICAtOTIsICAgMTM3LCAgIDI3OSwgICAzNzEsDQorICAtMTQ2LCAgIDM2OCwgICA0MDksICAgIDY4LCAgICAgNiwgICAgNzcsICAgMTY3LCAgIDIwMiwgICAxNjIsDQorICAgNjMzLCAgIDg5OCwgICA5OTYsICAgNzU2LCAgIDY2MiwgICA2ODMsICAgNzgzLCAgIDkwOSwgICA5OTYsDQorICAtMTAzLCAgIDI5NCwgICA2MDcsICAgNDE1LCAgIDQ4MywgICA0NjIsICAgNDgwLCAgIDQzMSwgICA0MDgsDQorICAtMTIwLCAgLTMzOCwgIC02MTIsICAtNTI0LCAgIDU4NCwgICAzMzEsICAgIDkyLCAgIDQzMywgICAyNzYsDQorICAtMTc4LCAgLTI5MywgIC0xNTQsICAgLTQxLCAgIDI2OSwgICAxMDAsICAgIC05LCAgIDIxMywgICAxNjAsDQorICAgODMwLCAgIDczNiwgICAyNzgsICAgODIwLCAgMTI1NCwgICA2ODYsICAgNzEyLCAgMTAzOSwgICA0NzMsDQorICAtMjE4LCAgLTMwNCwgICA0NjMsICAgNDU0LCAgIDM5NywgICAyNzMsICAgMjAyLCAgIDI4NiwgICAyNzMsDQorICAtMjMyLCAgICAgNywgICAgIDYsICAtMzg4LCAgLTQ3MiwgIC00MjcsICAtMzc4LCAgLTE2NywgIC0xMDAsDQorICAtMjk0LCAgLTE4MywgICAxMzQsICAgLTQ3LCAgIDEwMSwgICAtODgsICAgLTg0LCAgLTExNywgICAgLTMsDQorICAgIDU3LCAgICAxNywgIC0yMDIsICAtNjM0LCAgLTk4OSwgLTExMTksICAtNTMzLCAgIDE3NiwgICAtMzYsDQorICAgMTIwLCAgIC0yOCwgICAgMjMsICAgMTExLCAgLTMxOSwgICAzMTgsICAgLTIyLCAgIC03NywgICAyNjYsDQorICAtMjcxLCAgLTQ2NCwgIC00MzQsICAtNjU4LCAgLTY0MCwgIC0zODUsICAtMzg1LCAgIC05OSwgICAtNjksDQorICAtMTk4LCAgLTI1OSwgIC0yNjYsICAgLTQ0LCAgIC0zOSwgIC0xMzksICAtMTM3LCAgIDE3MSwgICAgNjYsDQorICAgICA5LCAgLTE0NSwgIC0zNzcsICAtODQ2LCAtMTAwMCwgIC0xMTEsICAtMzI1LCAgIDM0MiwgICAxMzUsDQorICAgLTgxLCAgLTI4NiwgIC0zODAsICAgMTkyLCAgIC01NywgICAzMDcsICAgIDc2LCAgIC0yNCwgIC0xNDAsDQorICAgNjc3LCAgIDcwMiwgICAyNDcsICAgIDU2LCAgIDI0OSwgICAxNDEsICAtMTA1LCAgLTIzNiwgICAtOTksDQorICAgIDM2LCAgIC0zOSwgICAtNjksICAgMzQ4LCAgIDE5OCwgICAtOTMsICAgMzIyLCAgICA5MSwgICAtNzIsDQorICAgNTAzLCAgIDg4NSwgIDE1MDgsICAxMzA3LCAgMTI4MiwgIDExNzIsICAxMTE5LCAgMTIwOSwgIDEwNjEsDQorICAgNDE2LCAgIDcxOSwgICA5ODksICAxMjI3LCAgMTAwMSwgIDEwNTIsICAgOTU0LCAgIDc0MSwgIDEwNDQsDQorICAtMTI3LCAgLTM3NiwgIC02NTcsICAgMTM5LCAgIDYyMywgICAyMjMsICAgNTAxLCAgIDMwNiwgICAyMjAsDQorICAtMTEzLCAgLTM4NCwgIC03OTYsICAgNTA0LCAgIDQzOCwgICAgODUsICAgMjEzLCAgIC04MywgIC0xOTQsDQorICAgNTg1LCAgMTEzMiwgIDEyMzMsICAxMDkxLCAgMTI0NywgIDE0MzMsICAxNTEyLCAgMTQ0OCwgIDEzMTQsDQorICAtMTc0LCAgLTQyMiwgICAgIDcsICAxMTU1LCAgMTA4OSwgIDExODIsICAxMDAzLCAgIDk0NSwgICA4MDYsDQorICAgICA4LCAgLTEyNiwgIC0zMTcsICAtMTAzLCAgLTM1MSwgIC02OTUsICAgLTk4LCAgLTI2OCwgIC01MzcsDQorICAgIDMzLCAgLTEwMywgIC0yOTAsICAgMTY3LCAgIC0zOSwgIC00MDcsICAgIDQ0LCAgLTIwOCwgIC0zNzUsDQorICAgMTA0LCAgIC0yMywgICAtNjQsICAtMjkxLCAgLTYzNywgIC04NTEsIC0xMDg0LCAgIC02MSwgIC0xMTIsDQorICAgLTc1LCAgLTMwNiwgIC00MzQsICAgMjE4LCAgLTE0OCwgIC0zNTQsICAtNjgwLCAgLTEzMywgIC0yMTYsDQorICAtMTIxLCAgLTM3NywgIC03MTgsICAgLTk3LCAgLTEzMCwgIC0zNjEsICAtMTU2LCAgLTM3OSwgIC01OTksDQorICAgLTU2LCAgLTI1NCwgIC01ODYsICAgMjM1LCAgIDE1NywgIC0yMTQsICAgIDExLCAgLTI2MCwgIC0xNDksDQorICAtMTI0LCAgLTI2NywgIC0zOTcsICAtNTgwLCAgLTU5MywgIC01MjcsICAtODA1LCAgLTM4NSwgICAzNDYsDQorICAtMTkzLCAgLTQ0MCwgIC03MDgsICAtMzUxLCAgLTE0MSwgIC0yNTUsICAtNDk5LCAgLTE0NywgIC0xODUsDQorICAgNDQ4LCAgIDY2MCwgICA0OTQsICAgMjA4LCAgIDUwOSwgICA0NjEsICAgMzM4LCAgIDI5MSwgICAxNDksDQorICAtMjIzLCAgICA4OCwgICAzMzUsICAgMTU5LCAgIDIxMiwgICAxOTEsICAgMjg2LCAgIDMwOCwgICAyMDUsDQorICAgLTMxLCAgIDQ2OSwgICA4MDMsICAgNjU5LCAgIDYxOSwgICA2NTgsICAgODQzLCAgIDk4NywgIDExMTMsDQorICAtMTcxLCAgLTI0MiwgICA1MTQsICAgMzYyLCAgIDI5NSwgICA1MjQsICAgNTUyLCAgIDY5NCwgICA1ODUsDQorICAgLTY0LCAgLTMwOCwgIC00NDgsICAgLTIxLCAgIDI4NCwgICA3ODYsICAgNDQ2LCAgIDI4OSwgICAgOTIsDQorICAtMjE4LCAgLTM5MCwgICAgLTcsICAgMTY5LCAgIDIwNiwgICAzMzAsICAgMzUyLCAgIDQwOCwgICAzNTgsDQorICAgLTM2LCAgIDcwMiwgICA5NTksICAgODU5LCAgIDg2MSwgIDExMTUsICAxMjY5LCAgMTM1NywgIDEzMDUsDQorICAtMTMzLCAgLTM0MSwgICAtNjUsICAgNjc4LCAgIDQxNywgICA0NDAsICAgNDg2LCAgIDUxOCwgICA3ODAsDQorICAgIDMzLCAgIC00NCwgIC0xOTEsICAtMzQ0LCAgLTQ2MSwgIC03NTUsICAtMjAxLCAgIDIxNywgICAtMzEsDQorICAtMzUzLCAgLTU0NywgICAtNDQsICAgMTIzLCAgIC02MSwgICAtNjgsICAgLTc5LCAgICAyOSwgICAgNjAsDQorICAgIDczLCAgIC01NywgIC00MDYsICAtNzY2LCAtMTI0MywgLTEyMDMsICAgMjQwLCAgIDQwMCwgICAxNjUsDQorICAgLTczLCAgLTI4MiwgIC02MDEsICAtMjEzLCAgLTE3MSwgIC0zNzUsICAgMzMyLCAgICAzNSwgIC0xMDMsDQorICAgLTI5LCAgLTIwNywgIC01NTMsICAtNDc2LCAgLTYzOCwgIC05MDgsICAgMTcyLCAgIC0yMiwgIC0xMzUsDQorICAtMTkyLCAgLTIzOSwgIC0xNjQsICAtMTAzLCAgLTExMSwgICAtNDcsICAgMTUzLCAgIDEyNSwgICAxMTAsDQorICAgIC0xLCAgLTIwMywgIC01NzAsIC0xMDMwLCAtMTQyNCwgIC01MzUsICAgMTU1LCAgICAgMSwgICAxNDcsDQorICAtMzMzLCAgLTY1MywgIC04NjUsICAtMTk3LCAgLTE1OCwgICAtMjEsICAgLTQ0LCAgICA5NSwgICAxMDgsDQorICAgMzg5LCAgIDU4OCwgICA0OTAsICAgIDMzLCAgLTIzNywgIC01MjQsICAtNjI4LCAgLTEzNiwgIC0yNjAsDQorICAgIDQwLCAgLTE3NywgIC00NjIsICAgNDUzLCAgIDg2MiwgICAzODAsICAgMTMxLCAgLTEzMCwgIC00MDUsDQorICAgODQyLCAgMTY3OCwgIDE4NDEsICAxNTQ5LCAgMTQ3NCwgIDEyNTYsICAxMDgyLCAgIDkwNSwgICA3NDIsDQorICAgMzcwLCAgMTIxNiwgIDE3NjgsICAxNjMzLCAgMTIxMiwgICA2MzYsICAgIDIyLCAgLTMzMCwgICAgNzEsDQorICAgLTc2LCAgLTI4MSwgIC03NDEsICAtNzQyLCAgIDg5OCwgICA2MTksICAgMjc3LCAgICA3MSwgIC0yMjIsDQorICAgLTMyLCAgLTI2NSwgIC01NTYsICAgLTI1LCAgIDk5NCwgICA2ODIsICAgMzA1LCAgIDEyNiwgIC0xNjUsDQorICAgIDczLCAgIDczOCwgICA4OTMsICAgOTY4LCAgIDk5MywgIDE3NjgsICAyMjczLCAgMTg0MCwgIDEzOTEsDQorICAgLTY5LCAgLTM0OSwgIC01ODUsICAgMjM0LCAgMTE1OCwgICA5MDMsICAgNjI2LCAgIDUxMCwgICAyNTEsDQorICAgIC0xLCAgIC05OSwgIC0yNzIsICAtMjEwLCAgLTYwMywgIC0zNTEsICAtNTQwLCAgLTgxMSwgIC0zODMsDQorICAgLTE2LCAgLTIzMCwgIC01MDQsICAgNDEwLCAgIDE0OSwgIC0yMDUsICAtMzQzLCAgLTY1MSwgIC02MzksDQorICAgMTAzLCAgICAtOSwgIC0yMjcsICAtMjA1LCAgLTU2MiwgIC03ODEsIC0xMDc5LCAtMTIwOCwgIC0xNTYsDQorICAgMTQzLCAgICA2MywgIC0xMzUsICAgLTY3LCAgLTMxNywgIC02MDIsICAtNzg0LCAtMTE1NCwgIC02NDAsDQorICAtMTQ0LCAgLTM5MSwgIC02NzQsICAtNjIyLCAgLTIwMCwgIC0yNTQsICAtNjYwLCAgLTk0NywgIC0zOTUsDQorICAgLTQwLCAgLTI1MCwgIC02MjUsICAgIDI3LCAgIDU0MywgICAgOTQsICAtMTMxLCAgLTM4NiwgIC02NzMsDQorICAtMTIzLCAgLTM3MSwgIC03NTcsICAtNDUxLCAgLTU2NCwgIC02MTQsICAtNDE1LCAgLTcxMSwgICAtMzUsDQorICAtMTE2LCAgLTMwOSwgIC01OTMsICAtMjY4LCAgIDIzOSwgICAtMzMsICAtMzM4LCAgLTY1MCwgIC0xMzUsDQorICAgIDk0LCAgIDI1MSwgICA1NTQsICAgIDU3LCAgLTMxMiwgIC00MjMsICAtMTU0LCAgIC01NywgICAyMzUsDQorICAtMjY4LCAgIC03MSwgICAzODEsICAgMTE0LCAgIC00NCwgICAtODcsICAgMTI1LCAgIDE3MywgICAxMzMsDQorICAxNTEzLCAgMTcxNCwgIDEyMzgsICAgNTM0LCAgIDI3NiwgICAzMTUsICAgNDYxLCAgIDQ1OSwgICA1MDgsDQorICAtMTMxLCAgIC0xOSwgIDExNDksICAgNjcwLCAgIDQ4NiwgICAzNTYsICAgMzA5LCAgIDM2OSwgICAyOTYsDQorICAtMjIzLCAgLTUwMSwgIC04OTksICAtNzIyLCAgIC03MCwgICAgIDYsICAgMTMxLCAgIDMxMCwgICAzOTQsDQorICAgLTk5LCAgLTMwMywgIC01MTcsICAgMjQ5LCAgICA2NCwgICAtNTMsICAgMTM1LCAgIC0xMSwgICA0NTMsDQorICAtMTQ3LCAgLTM5OSwgIC03MzAsICAtNDAxLCAgIDgxNywgICA3MzgsICAgODAyLCAgIDc0OSwgICA1NzUsDQorICAtMTU0LCAgLTQzNSwgIC03MzksICAgODAwLCAgIDU5MywgICAzNjYsICAgNTI5LCAgIDMxOCwgICAzMjYsDQorICAtMjI0LCAgICA0NSwgICAtMzksICAtMzg3LCAgLTUxNSwgIC01MTgsICAtNjA4LCAgLTM4NCwgIC0zMjEsDQorICAtMzE1LCAgLTM3NywgICAxNDMsICAtMTAxLCAgLTExMywgIC0zNzcsICAtMTc3LCAgLTE0NCwgICAtMTIsDQorICAgMTE3LCAgICA0MCwgIC0yMzksICAtNjUxLCAtMTA1MSwgIC01ODEsICAtNzM3LCAgLTk5MCwgIC0zMjgsDQorICAgIDI2LCAgIC01MCwgIC0xNTcsICAgLTIzLCAgLTQ1MywgIC0yODMsICAtNTMxLCAgLTU0NiwgICAxOTIsDQorICAtMjUyLCAgLTUwMSwgIC03NDMsICAtNTg5LCAgLTYyNywgIC00OTksICAtMzI4LCAgLTExOCwgICAtNzIsDQorICAtMzI0LCAgLTQ5NCwgIC0yNDQsICAtMzA2LCAgLTE0NCwgIC0xNzcsICAtMjYyLCAgLTEzNSwgICAtNzgsDQorICAgLTM2LCAgLTIzNCwgIC01MTksICAtOTYxLCAtMTI5MCwgIC0zMTQsICAtNDc5LCAgLTM3MSwgICAtNDUsDQorICAgLTk1LCAgLTI5MiwgIC01MzUsICAgIC04LCAgLTMwMCwgICAxMTIsICAtMTY0LCAgLTI3NywgICAxOTgsDQorICAgLTk5LCAgLTEyOCwgICA4ODAsICAgODM2LCAgIDU3OSwgICAzNTEsICAgIDIzLCAgIC05NSwgIC0yMTcsDQorICAgLTI3LCAgLTI1OCwgICAxMjQsICAxMDExLCAgIDU5NywgICA0MjUsICAgMTQ0LCAgICAgNywgICAtNzMsDQorICAgNDIxLCAgMTI5MywgIDE2NDAsICAxNjIzLCAgMTc0MiwgIDE2MTcsICAxNDk5LCAgMTI4NCwgIDEwMDYsDQorICAgLTk1LCAgIDc1MiwgIDE2ODAsICAxNTY5LCAgMTYxOCwgIDE0MzYsICAxMjAwLCAgIDk4MCwgICA3MTIsDQorICAgLTY5LCAgLTMwMCwgIC02ODMsICAtNDM1LCAgMTEzMiwgICA4OTksICAgNTA0LCAgIDMzMiwgICAxMDksDQorICAgLTc0LCAgLTMyMywgIC02MzcsICAgNTYzLCAgMTA3NCwgICA2MDgsICAgMzcxLCAgIDEwNSwgICAtNDksDQorICAgLTc4LCAgIDgzMSwgIDExOTQsICAxMTEwLCAgMTM3OCwgIDE0ODEsICAxNDkyLCAgMTM2NSwgIDEyMTcsDQorICAtMjU5LCAgLTEyMSwgIDE0NDAsICAxMzM0LCAgMTYyOCwgIDE0OTAsICAxNDM4LCAgMTIyMywgICA5MzMsDQorICAgLTgyLCAgLTMwNiwgIC02MTMsICAtMjIyLCAgLTM3OCwgIC02NzUsICAtNTQ1LCAgLTY3MSwgIC04NDUsDQorICAgIDUzLCAgLTEyNCwgIC0zNDcsICAgNDIyLCAgICA1MiwgIC0xMjUsICAtMjcwLCAgLTUyOSwgICAgIDksDQorICAgIDc5LCAgIC04OSwgIC0zMjAsICAtNjYyLCAgLTk5OSwgLTExOTksIC0xMjQzLCAgLTY3NiwgIC0yOTcsDQorICAgLTY4LCAgLTI3MywgIC02MTEsICAgMTM3LCAgLTE0NiwgIC0zOTcsICAtNjI3LCAgLTg0NSwgIC0yMjAsDQorICAtMTEyLCAgLTM0NiwgIC03OTcsICAtODI2LCAgIDIzNCwgIC0xMzIsICAtMTg4LCAgLTI3OCwgIC01MjIsDQorICAtMTU5LCAgLTQwNSwgIC03MzQsICAtNDE5LCAgIDI5MywgICAgNzQsICAtMTY3LCAgLTE2NywgICAxODQsDQorICAtMTUzLCAgLTQzNywgIC04MzMsIC0xMDgwLCAgLTMzNiwgIC00NzIsICAtNTYxLCAgLTM0MCwgIC0yNTMsDQorICAtMTY5LCAgLTQyMywgIC04MjAsICAtOTA0LCAgLTEzMSwgICAtMTksICAtMzQ2LCAgLTYwNCwgICAgMzEsDQorICAgIDMzLCAgIC0zMSwgICAzMTIsICAgIDYyLCAgLTE0OCwgICAgNDksICAgLTU5LCAgIDU2NCwgICA0ODYsDQorICAtMzA2LCAgLTMzMywgICAxOTQsICAgLTQ0LCAgICA2NywgICAgNzIsICAgMTQ3LCAgIDIwNSwgICAyNDMsDQorICAtMjA3LCAgIC00OSwgIDEzNjAsICAgOTgzLCAgIDk2OSwgICA5OTEsICAxMDE0LCAgMTExMCwgICA5NzMsDQorICAtMjExLCAgLTE3MiwgICA4ODMsICAgNjI3LCAgIDcxMSwgICA2NzQsICAgNzA1LCAgIDc5OCwgICA3NDYsDQorICAgLTg4LCAgLTMyNSwgIC03NjMsICAtOTc0LCAgIDY4NywgICA5MDgsICAgNTE0LCAgIDM4MiwgICAxNzIsDQorICAtMjkyLCAgLTYxMiwgIC04MDUsICAgIDYzLCAgIDEzMSwgICAyNzAsICAgMjU5LCAgIDM1MiwgICAzNDgsDQorICAtMjM1LCAgIC04NCwgICA5NTUsICAgODE4LCAgMTEyMCwgIDEyODksICAxNTU5LCAgMTQ4MCwgIDEyODUsDQorICAtMTgwLCAgLTQ2MSwgIC02MTQsICAgNjU3LCAgIDY5MSwgICA3NDUsICAgODU0LCAgIDc4MywgICA3MTMsDQorICAgLTk3LCAgLTMwOSwgIC00NzcsICAtNjE0LCAgLTc3NywgIC03MzQsICAtNzY4LCAgLTUyNiwgIC00NzIsDQorICAtMzQ0LCAgLTQ3NiwgICAtMzUsICAtMTY5LCAgICA0OSwgICAtNzcsICAtMTUwLCAgLTI0MCwgIC0xNDEsDQorICAgLTUyLCAgLTI2OCwgIC02MzksICAtOTE5LCAtMTI3OCwgLTExMTMsICAtMzQyLCAgLTMzMywgIC0xNTEsDQorICAgLTY4LCAgLTI0MiwgIC01ODUsICAgLTczLCAgLTIwOSwgIC00NzgsICAtMTU5LCAgLTQyOSwgICAxMzMsDQorICAtMTk3LCAgLTQ5OSwgLTEwMDUsIC0xMjY4LCAgLTI3MiwgIC0yMjQsICAtMTA1LCAgIC02NywgICAgMTcsDQorICAtMzYzLCAgLTYxOCwgIC00MTQsICAtMTE2LCAgIC02MiwgICAgMjAsICAgIDEwLCAgIDExNiwgICAxMDgsDQorICAtMTk1LCAgLTQ3NSwgIC05MDYsIC0xMjYwLCAgLTg5MSwgIC00NDEsICAtMjc3LCAgLTE0MiwgICAtMjgsDQorICAtMjI2LCAgLTUxOSwgIC05NTAsICAtNzAwLCAgLTI3NSwgIC0yNjYsICAtMTE2LCAgLTEwNSwgICAgODIsDQorICAgNDA0LCAgIDUxMSwgICA1MjAsICAgMzI3LCAgICAxNywgIC0xOTQsICAtMzMzLCAgLTUzNiwgIC01ODYsDQorICAtMTE0LCAgLTEzMCwgICAyNzYsICAgMjM3LCAgIDIwNCwgICAzNDIsICAgMTM1LCAgIC0xNiwgIC0xMTEsDQorICAgNjcwLCAgMTIwOCwgIDExNjgsICAgODYwLCAgIDc0MiwgICA2MDEsICAgNTI4LCAgIDQwMywgICAzMDksDQorICAgMzk3LCAgIDYyMSwgICA5NjYsICAgNzUyLCAgIDU3OSwgICAzOTgsICAgNDAwLCAgIDMyOSwgICAyNTIsDQorICAgMTkxLCAgIDE4MCwgIC0xMzcsICAtNDY3LCAgIDI3MiwgICAxMDYsICAgLTk1LCAgICAxNywgIC0xOTIsDQorICAgLTgwLCAgLTI5MCwgIC02MjYsICAgMTk0LCAgIDU5OCwgICAxOTYsICAgIDIxLCAgLTI4MSwgICAgNzcsDQorICAgNTEwLCAgIDg2NCwgIDExMDgsICAgODA3LCAgIDkzOSwgICA5MDIsICAgOTI1LCAgIDcxNywgICA0ODEsDQorICAgMTM3LCAgIDM2NywgICA1MzQsICAgNzY0LCAgIDY3MCwgICAzODIsICAgMjk2LCAgIDE1MywgICAgODQsDQorICAgMzAzLCAgIDQ5NywgICAxNDQsICAgLTg1LCAgLTEyNSwgIC01MzksICAtNDgyLCAgLTQ2NCwgIC03NjQsDQorICAgMjMzLCAgIDM0NywgICAgNjgsICAtMTQ3LCAgIDE2OSwgIC0yMTAsICAtMjQyLCAgLTIyNiwgIC00ODIsDQorICAgMzA3LCAgIDQyMiwgICAxNTQsICAtMTc1LCAgLTM4NiwgIC03MjIsICAtNzI0LCAgLTkwNCwgLTEwMTUsDQorICAgMzA5LCAgIDMwOCwgICAxNjAsICAgLTYwLCAgLTQ3MCwgIC00MjAsICAtNTk4LCAgLTc5MSwgIC0yMTksDQorICAgIDY4LCAgIDEyMSwgIC0xMzcsICAtNTYwLCAgLTE0NiwgIC00NDYsICAtNTE1LCAgLTQ5NCwgIC03MjksDQorICAgMTMwLCAgICA1MywgIC0yMjcsICAgIDQ2LCAgIDQ3NCwgICAgMzIsICAtMTYxLCAgLTE5MiwgIC00OTAsDQorICAgMjEzLCAgIDE2NCwgICAtNzEsICAtNDY1LCAgLTg3NiwgIC0xNjEsICAtNDU2LCAgLTU4NywgICAtNDgsDQorICAgMjE4LCAgIDExNywgICAgMzksICAgMTc3LCAgLTE5NCwgICAtODgsICAtMjI2LCAgLTQxOCwgICAgNTAsDQorICAgMjEwLCAgIDU0NywgICA1NjksICAgMjc5LCAgIDEyMSwgICAtNDQsICAgLTUwLCAgICAxMCwgICAtODQsDQorICAgIDU4LCAgIDE0MCwgICAxODIsICAgIC01LCAgIDI2NywgICAxMTcsICAgMTA2LCAgIDIxMSwgICAxOTgsDQorICAgNTM5LCAgIDgzNSwgICA5MTMsICAgNzE5LCAgIDYxNywgICA1NDQsICAgNTkxLCAgIDU2NSwgICA2NDIsDQorICAgMTUzLCAgIDU1OSwgICA4NzIsICAgNDYwLCAgIDIyMiwgICAxMDgsICAgMTg4LCAgIDE4MCwgICAxODMsDQorICAgMTU4LCAgIDExOSwgICAyODQsICAtMTUzLCAgLTI3MSwgICAyMjksICAgIDg3LCAgIDExMCwgICAtNTcsDQorICAtMTgzLCAgICA4MiwgICAxMTgsICAgIDIxLCAgICAxMywgICAgNDAsICAgMTE4LCAgIDE5MSwgICAxODUsDQorICAgMTYyLCAgIDg4OSwgICA2NTQsICAgMTA4LCAgIC0zNCwgICAyNDQsICAgNDg4LCAgIDU2MSwgICA1MzIsDQorICAgMTYzLCAgICA1NiwgICA2MDksICAgMzQxLCAgICA1MCwgICAzMjksICAgIDY4LCAgIDI2NiwgICAyMTgsDQorICAgMTAwLCAgIDIwNiwgICAgMTgsICAtMzA0LCAgLTEwNywgIC00MzYsICAtNDg3LCAgIC02NSwgIC0zMDYsDQorICAgLTg2LCAgIDE1NCwgICAxMzQsICAgLTMwLCAgIC00NSwgICAtNzMsICAtMTA0LCAgIC04MCwgICAtOTYsDQorICAgMjQ1LCAgIDMzMCwgICAgMTAsICAtNDQwLCAgLTg0OSwgLTEwODIsICAgIDc5LCAgICA0MCwgIC0yNjUsDQorICAgMTk2LCAgIDM3MiwgICAyNzIsICAtMTgxLCAgLTQ5MywgIC0zODksICAgMjc1LCAgICA4MCwgICAtNTksDQorICAgICAyLCAgIC0xMiwgIC0yNDYsICAtNTA1LCAgLTEwMCwgIC00MzYsICAgIDIxLCAgLTE4NywgIC00MzEsDQorICAtMjIxLCAgIC00OCwgICAgMzYsICAtMjcxLCAgLTE4NiwgIC0xNDcsICAtMTA5LCAgICAyNiwgICAgNzEsDQorICAgMjEzLCAgIDE0MCwgICAgNzIsICAtMzUxLCAgLTYyMCwgICAtODQsICAtMzYzLCAgICA2OSwgICAgNDYsDQorICAgIDkxLCAgIDE2NywgICAgLTMsICAgLTk1LCAgIC05OSwgIC0xMDUsICAgLTQ4LCAgIDExNCwgICAxNDcsDQorICAgMjU5LCAgIDI0OSwgICAxNzIsICAgNjA3LCAgIDQwNiwgICAgNTIsICAgIDU5LCAgLTE4OSwgIC0zMjAsDQorICAgMTE1LCAgIC04NSwgICAtNTQsICAgNTc0LCAgIDEyOCwgICAyMjYsICAgLTU5LCAgLTI1MywgICAxMzAsDQorICAgLTYyLCAgMTAzMywgIDEzMDgsICAxMDM1LCAgMTEyNywgIDEwOTgsICAxMDI5LCAgIDk2MSwgICA4MjMsDQorICAgIDM5LCAgIDM2NCwgICA3NTcsICAgOTQwLCAgIDcyOCwgICA2NjAsICAgNjU5LCAgIDU4MywgICA3NzAsDQorICAtMTE1LCAgLTMzOCwgIC03NjAsICAtNDcxLCAgIDM5NCwgICAgMzcsICAgNDQxLCAgIDE3OCwgICAgIDYsDQorICAgLTU3LCAgLTMwNSwgIC01MjUsICAgNzk2LCAgIDQ1MywgICAxODgsICAgIC00LCAgLTExNCwgICAyNDgsDQorICAgIDcxLCAgIDQ0NCwgICA3OTcsICAgNzMxLCAgMTA5NiwgIDExNTcsICAxMjIyLCAgMTAyOSwgICA4MTEsDQorICAgMTM1LCAgIDM1OSwgICA1NTEsICAgNDI1LCAgIDc0OSwgICA4MTUsICAgODc0LCAgIDcwNCwgICA1MDIsDQorICAgMTMyLCAgIDI0NywgICAgIDAsICAtMjA2LCAgLTQ0OSwgIC03NTAsICAtMjU4LCAgLTUxNCwgIC02MzMsDQorICAgMjQ4LCAgIDI0OSwgICAgOTEsICAgMTIxLCAgLTE5NSwgIC00OTksICAgLTkwLCAgLTI4MiwgIC00MzUsDQorICAgIDc4LCAgICAyMCwgIC0yNzcsICAtNjIzLCAgLTk4MywgLTEyMjQsICAtNDE1LCAgLTQ1OCwgIC02MzksDQorICAgMzQ3LCAgIDUwOSwgICAyMDgsICAtMTc5LCAgLTQ2NCwgIC03MjgsICAgLTc2LCAgLTIzNywgIC00ODYsDQorICAtMTAzLCAgLTM0MywgIC03NTYsICAtNzEzLCAgLTI2NSwgIC02MDksICAtMTkxLCAgLTM5OCwgIC02MzYsDQorICAtMTIxLCAgLTM4MywgIC03NDksICAgNTY3LCAgIDI1MiwgICAtMzYsICAtMzU0LCAgLTQxNywgICAtNTAsDQorICAgMjA0LCAgIDEwMCwgIC0xNDksICAtNjUwLCAtMTA4MSwgICAtNDcsICAgIC03LCAgLTI2MywgICAxMTEsDQorICAgLTQ2LCAgLTE4MCwgIC0yNjcsICAtMzI0LCAgLTU2MiwgIC0zOTQsICAtNjkyLCAgIDM5OCwgICAyOTIsDQorICAgNDgyLCAgIDY3MCwgICA2ODMsICAgNjI0LCAgIDQ0MiwgICAxNjUsICAgMTE2LCAgICAzNiwgIC0xNDksDQorICAgMTA4LCAgIDI0NywgICAyOTEsICAgMjQ3LCAgIDM1NSwgICAxMjIsICAgMTA5LCAgIDIyNCwgICAyOTYsDQorICAgLTE0LCAgIDk0NSwgICA5OTAsICAgODAxLCAgIDc1NSwgICA4MTUsICAgODQ3LCAgIDkxMywgICA4OTIsDQorICAgMjkyLCAgIDM0OSwgICA3MjUsICAgNDgyLCAgIDM4OCwgICAzMjksICAgNDI5LCAgIDYyMCwgICA2NjcsDQorICAgLTM0LCAgIDE5NywgICAyMTMsICAtMTI3LCAgICA4NCwgICA0OTQsICAgNjIwLCAgIDU3NSwgICAzNzUsDQorICAgMTI2LCAgIDIwNywgICAxNzIsICAgMTY3LCAgIDM2MiwgICAyMDIsICAgMjk2LCAgIDM5NSwgICA0NTUsDQorICAgIC02LCAgIDI1MCwgICA1MzksICAgNDY3LCAgIDYzNiwgICA4MDEsICAxMTQ5LCAgMTI4NywgIDExMTgsDQorICAgIDI3LCAgIDI0MCwgICAzNjksICAgMjgwLCAgIDQ0MCwgICA0MTEsICAgNjM0LCAgIDg5MiwgICA5NTMsDQorICAgMTU5LCAgIDE3MCwgICAtNTgsICAtMzk1LCAgLTc5NywgIC02OTAsICAgIDc3LCAgLTIxMSwgIC0zMzQsDQorICAgIC01LCAgIC0yOCwgICAtMTMsICAgLTc0LCAgLTMzNSwgIC02MDMsICAgMzAwLCAgICA4OCwgIC0yMDUsDQorICAgIDgyLCAgIC0zMywgIC0zNjQsICAtNjk4LCAtMTIwMywgLTExNTMsICAgMTEwLCAgLTE0NiwgIC0yODksDQorICAgMTEzLCAgICAgMSwgIC0yNDMsICAtNTg4LCAgLTk5NCwgIC00OTYsICAgNDE0LCAgIDE2MCwgICAgNDIsDQorICAgLTU2LCAgLTI0NywgIC00NDAsICAtNjkzLCAgLTk5NiwgIC00NzksICAgIDExLCAgLTE3OCwgIC0zNTcsDQorICAtMTUxLCAgLTM1MywgIC0zMjcsICAtMjExLCAgLTM0MCwgICAxNDEsICAgIDY1LCAgIDQyNSwgICA0NTMsDQorICAgIDM0LCAgLTE2OSwgIC00NTUsICAtOTMyLCAtMTIxNSwgICAxMzgsICAgNDk5LCAgIDI1NiwgICAzMjQsDQorICAgIDY4LCAgIDEzOSwgICAtMTUsICAtNTQ3LCAgLTQ3OCwgICAgMTcsICAgMzA2LCAgIDUwMiwgICA0ODEsDQorICAgLTMyLCAgLTEzNCwgICA0NDUsICAgMTI5LCAgLTE0MywgIC0yNDQsICAtNTAzLCAgLTUwNywgIC01OTksDQorICAgIDYxLCAgLTE0MCwgIC0zNDUsICAgNDk2LCAgIDQ1OCwgICAgLTIsICAgIDIwLCAgLTIyNywgIC01MTQsDQorICAgMzk0LCAgMTc2NSwgIDE2NjYsICAxMzM5LCAgMTExNywgICA4MDYsICAgNjQyLCAgIDQ3OSwgICAzODAsDQorICAgMjE1LCAgIDUxOSwgICA5MjAsICAxMDUzLCAgMTA5MCwgICA3OTEsICAgNTI4LCAgIDI5MCwgICAxNTUsDQorICAgLTU0LCAgLTIzMywgIC02NDcsICAtNjAyLCAgIDYzOSwgICAyOTQsICAgIC0yLCAgLTE2NywgIC00NDIsDQorICAgLTc4LCAgLTMxNSwgIC03OTEsICAtMTEzLCAgIDgyMCwgICA0MDMsICAgMTU4LCAgLTExNiwgIC0zNTYsDQorICAgNTI5LCAgMTg1MSwgIDIwMDMsICAxMjI4LCAgIDYyMiwgICAtNDEsICAtNDE2LCAgIDM0NCwgICA4MTksDQorICAtMTA1LCAgLTM3OSwgIC0yMzYsICAxMjI0LCAgIDg5MywgICA3NDksICAgNTY4LCAgIDM1NiwgICAyMTQsDQorICAgLTE3LCAgLTE5OSwgIC0xNDQsICAgIDUwLCAgLTI4MywgIC0yNDcsICAtNTc4LCAgLTg0NiwgLTEwODcsDQorICAgIDY5LCAgIC0xMSwgIC0zODEsICAtMjA2LCAgIDIwOSwgIC0yODQsICAtMzg3LCAgLTQxNiwgIC03MTYsDQorICAgIDM5LCAgICAtNSwgIC0xNDUsICAtMzc0LCAgLTY4MiwgIC05MDksIC0xMDc0LCAtMTE2OSwgLTEwNjYsDQorICAgMjg3LCAgIDIyNiwgICAgNjcsICAtMjIxLCAgLTY2MiwgIC0xNzEsICAtNDIxLCAgLTY0MiwgIC03MDcsDQorICAtMTMyLCAgLTM0OCwgIC01MzgsICAtNDQ4LCAgIC0yMCwgICAgLTQsICAtMzU0LCAgLTc0OCwgIC05MzMsDQorICAgICA0LCAgIC03NSwgIC0yODksICAtNTk4LCAgIDMxNywgICAgNTIsICAtMjA4LCAgLTI5NywgIC01NTksDQorICAgLTg4LCAgLTI2NCwgIC0zNTgsICAtNTg5LCAgLTYzMSwgIC0yNDgsICAtNTIzLCAgLTgyMiwgLTEwNzEsDQorICAgIDcwLCAgICAtOCwgICAgNTQsICAtMzE0LCAgLTUxNSwgICAgOTIsICAtMTQ2LCAgLTI3NCwgIC00OTMsDQorICAgMTk5LCAgICA2MiwgICAzOTEsICAgMTU4LCAgLTE0MSwgICAgNzEsICAtMjE5LCAgLTIwMywgIC0yMDcsDQorICAgMTUyLCAgICA0MCwgICAzMjksICAgMTYyLCAgIC0yOSwgICAgNDgsICAtMTQ5LCAgIDEwOCwgICAxMjcsDQorICAgNjM1LCAgMTA1OCwgICA4ODMsICAgNDkyLCAgIDM3MiwgICAzMTIsICAgMzE3LCAgIDI3NCwgICAyNDEsDQorICAgMjY3LCAgIDcyMiwgIDEyNTYsICAgODgyLCAgIDYyNSwgICAyNDgsICAgICA4LCAgIC04MSwgICAtNjAsDQorICAgLTU4LCAgLTEzOCwgIC0yOTEsICAtNjAwLCAgIC0xMiwgICAgLTIsICAgLTM5LCAgIDE0NywgICAxMTcsDQorICAtMTA3LCAgLTM0NSwgIC01MTMsICAgNDU5LCAgICA3NiwgICAgOTIsICAtMjcyLCAgIDM4OCwgICAyNjIsDQorICAgMzYyLCAgIDUxNiwgICAyMDMsICAtNDA5LCAgLTcxNiwgIC04MzEsICAtMzMxLCAgIDE4NSwgICAyMDksDQorICAtMTE3LCAgLTM5MSwgIC0yOTgsICAgNjcxLCAgIDI5MiwgICA1MzgsICAgMjU3LCAgIDE2NiwgICAtMzgsDQorICAtMTAyLCAgLTMxOSwgIC0xOTQsICAtMjgzLCAgLTU3MywgIC0yNjIsICAtNTc5LCAgLTIxOSwgIC00NDQsDQorICAtMjM1LCAgICA3OCwgICAgMTEsICAtMTY4LCAgLTEwMSwgIC0yMjksICAtMjYzLCAgLTMyMSwgIC0xMjMsDQorICAgIDcwLCAgICA1MCwgIC0xNzAsICAtNTk5LCAgLTk5NiwgIC01ODgsICAtMjYzLCAgLTUxNiwgIC00NTUsDQorICAgMzk0LCAgIDM2MywgICAyMjksICAtMTM2LCAgLTUzOCwgICAgMjEsICAtMTgzLCAgLTM0OCwgIC0yMDEsDQorICAtMTI0LCAgLTM2OCwgIC02NDAsICAtODc5LCAgLTg0NywgIC0yMDksICAtNDA5LCAgLTQ5NCwgIC01MTUsDQorICAtMTI3LCAgLTM0MSwgIC01NDEsICAtNDI1LCAgLTUxMCwgICAtMTAsICAtMjUyLCAgLTQ3MywgIC0yOTEsDQorICAgIDg0LCAgIC02OSwgIC0yMDEsICAtNjc2LCAgLTg2OCwgICAxMDMsICAtMzExLCAgLTEzMiwgIC0zMjAsDQorICAgICA1LCAgLTE3MywgIC0xODgsICAtMjk3LCAgLTYyOCwgICAxOTcsICAgLTU3LCAgICAgNywgICAtMTEsDQorICAgIDQ5LCAgLTE2MCwgICAgNTYsICAgNTU4LCAgIDExMSwgICAgMzMsICAtMzExLCAgLTQ0MCwgIC00NjMsDQorICAgIC0xLCAgLTI0NiwgIC0zMDcsICAgODYyLCAgIDQ1MywgICAxMzksICAtMTcwLCAgLTM1NSwgIC0yMzIsDQorICAgMjc5LCAgIDk2NiwgIDE2NDIsICAxNDc4LCAgMTQ2MywgIDExMjMsICAgNzk1LCAgIDUyNSwgICAzMzksDQorICAtMTk3LCAgIC0zOCwgIDE3MDIsICAxMzMxLCAgMTI1MiwgICA5NTAsICAgNjkyLCAgIDUwNCwgICA0MjYsDQorICAtMTA4LCAgLTM0NCwgIC04NjEsIC0xMTcyLCAgIDQ0NCwgICAzNTQsICAgIDg4LCAgIC00NiwgIC0yMjAsDQorICAgLTUzLCAgLTMyMSwgIC00OTQsICAxMTEzLCAgIDc0NCwgICAzNjQsICAgMTk4LCAgIC0zNCwgICAtNzUsDQorICAgNDU3LCAgIDk1NSwgIDExNzcsICAxMjE0LCAgMTQyNywgIDE0NTcsICAxMzQ1LCAgIDkxNywgICA1MzksDQorICAgLTY5LCAgIDE5OSwgICA4OTcsICAxMTQwLCAgMTM0MywgIDExODMsICAgOTc3LCAgIDc0MiwgICA1MjIsDQorICAgMTIyLCAgICA0NCwgIC0yNjksICAgIDI3LCAgLTE1NSwgIC01NjIsICAtMzA3LCAgLTU5MCwgIC03NzMsDQorICAgMTU0LCAgICA0MiwgIC0xNjAsICAgMjUyLCAgLTEyOSwgIC0zMDUsICAtNDcxLCAgLTczMywgIC0zNzEsDQorICAgMTM1LCAgIDE4NSwgICAtODIsICAtNDE2LCAgLTcyMiwgIC05MTMsICAtNTA0LCAgLTc0MywgIC04ODAsDQorICAgMTQ5LCAgIDIxNCwgICAtODQsICAtMzI5LCAgLTY4MCwgIC04MzUsICAtNDI2LCAgLTY2MSwgICAtODEsDQorICAtMTI4LCAgLTM4MCwgIC03MzUsICAtOTk4LCAgLTMzNywgICAgMTcsICAtMTgyLCAgLTQ2NywgIC02OTcsDQorICAgLTg0LCAgLTI5MCwgIC01MTAsICAtNTkyLCAgICAxMywgICA0NDAsICAgMTU0LCAgIC0zOCwgIC0yNzksDQorICAgIDcwLCAgIC02MSwgIC0yNDYsICAtNzI3LCAtMTA0NywgICAtODAsICAtMzgxLCAgLTUzNSwgIC03MDQsDQorICAgMTc4LCAgICAtMiwgIC0xNDYsICAtNjcwLCAgLTkzOCwgICA0ODIsICAgMTM4LCAgICA2MywgICAgNjUsDQorICAgLTExLCAgICAxNSwgICA3NzIsICAgNDQzLCAgIDE0MiwgICAtMjAsICAtMjA5LCAgLTEyNiwgIC0xNjEsDQorICAgLTMyLCAgLTI0OSwgICAgOTUsICAgNTUyLCAgIDEyNCwgICAgMzAsICAtMzQzLCAgICA4MiwgICAtODYsDQorICAgMTQ4LCAgIDc1MSwgIDE1MTUsICAxMTA1LCAgIDg2NywgICA2MDYsICAgNDc0LCAgIDQ0OCwgICAzOTksDQorICAtMTYzLCAgLTI1NywgICA4OTksICAxMDk3LCAgIDkwNiwgICA3NTEsICAgNTAyLCAgIDM5MCwgICAyOTQsDQorICAgLTUxLCAgLTI1OCwgIC00NDcsICAtODA2LCAgLTM2OCwgICA3NjMsICAgNDY0LCAgIDM2NCwgICAxODMsDQorICAtMTY2LCAgLTM3NCwgIC0zNjcsICAgIDg3LCAgICAzNSwgICAzOTksICAgNDE4LCAgIDg1NiwgICA4MzMsDQorICAtMjA1LCAgLTMxMCwgICA1ODgsICAgNzc4LCAgIDc4NSwgIDEwNjUsICAxMTE4LCAgMTI0NSwgIDExNTcsDQorICAtMTczLCAgLTMxMiwgICAxMDcsICAgMzQ1LCAgIDQwMCwgICA3OTAsICAgODcwLCAgMTExMywgIDEwMDEsDQorICAgIC03LCAgLTEyMCwgIC0zODcsICAtNDEwLCAgLTYxNCwgIC05NDMsICAtMjI2LCAgLTM4NCwgIC00OTEsDQorICAtMjAzLCAgLTI4OCwgICAtNTEsICAtMzMxLCAgIC05MCwgIC0xNzgsICAtNDA4LCAgLTU3MywgIC0zMzgsDQorICAgIDU2LCAgIC0yOSwgIC0yNzMsICAtNjI3LCAtMTA0MSwgIC03OTgsICAtMjQ3LCAgLTQ2NywgICAxNDgsDQorICAgIDY2LCAgICAtMiwgIC0yMDUsICAtMjA1LCAgLTU3NSwgIC0zNDksICAgLTU3LCAgLTM1MiwgICAtNTgsDQorICAgLTQ1LCAgLTIyNSwgIC00NzEsICAtOTI0LCAgLTQ5NywgICAgNzcsICAgLTMyLCAgICA0NCwgIC0xMzUsDQorICAtMjc3LCAgLTQ5MSwgIC00OTcsICAtNTAyLCAgLTQyNCwgIC0yMDIsICAtMTM3LCAgICA3NywgICAgOTYsDQorICAgIDI2LCAgLTE3OSwgIC00NjksIC0xMDA4LCAtMTI2MCwgICAyNjIsICAgLTM1LCAgLTEzMiwgIC0yNTksDQorICAgLTY2LCAgLTIzMiwgIC00NDcsICAtNTMzLCAgLTc4OSwgIC0xOTEsICAtMTAwLCAgLTI2NywgICAzNjR9Ow0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDFzdCBzdGFnZSBjb2RlYm9vazsgMm5kIHNwbGl0OiAgIGlzZjkgdG8gaXNmMTUNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIFdvcmQxNiBkaWNvMl9pc2ZbU0laRV9CSzIqN10gPSB7DQorDQorICAxMzU3LCAgMTMxMywgIDExMzYsICAgNzg0LCAgIDQzOCwgICAxODEsICAgMTQ1LA0KKyAgIDYzNiwgICA2NDgsICAgNjY3LCAgIDU2OCwgICA0NDIsICAgMjE3LCAgIDM2MiwNCisgICA0MjcsICAgNDQwLCAgIDY3NCwgICA1MjQsICAgMzMyLCAgIDExNywgIC00MTcsDQorICAgMTIxLCAgIDI5NSwgICA0NjgsICAgNDY1LCAgIDIzMCwgICAgNDQsICAtMjIxLA0KKyAgLTE0NywgIC0yNDAsICAgMTQ5LCAgICA4MCwgICAzOTAsICAgMjc4LCAgIDEwNiwNCisgIC00MTgsICAtNTU2LCAgIDU1MiwgICA1MTEsICAgMjM1LCAgIDE0NCwgICAtOTUsDQorICAgIDQzLCAgIDE5MywgICAyNzQsICAgMTUwLCAgICA2NywgICAgMzQsICAtMjczLA0KKyAgIC00MywgIC0xMjYsICAgMTcxLCAgIDQxNiwgICAyODIsICAgIDYzLCAgLTM1NCwNCisgIC0zNzIsICAgLTg2LCAgLTM0NCwgIC0xMDgsICAgLTk0LCAgLTE4MiwgICAtODksDQorICAtNjAwLCAgLTg0MCwgIC0yMDAsICAgNDY1LCAgIDI1OCwgICAtMTEsICAtMjUzLA0KKyAgIC00OCwgICAzMjksICAgIDk3LCAgLTI5MCwgIC01NDMsICAtNzk1LCAgLTM1NCwNCisgIC01NzAsICAtMTE3LCAgIDE4NywgICAgMTAsICAtMTMzLCAgLTQxNiwgICAtNzYsDQorICAtNjE4LCAgLTEyOSwgIC0yNDcsICAtMzcxLCAgICA0NSwgICAtNzYsICAgMjc3LA0KKyAtMTAyMiwgLTEwNzksICAgMTI2LCAgIDQ3NCwgICAyNTQsICAgMTI3LCAgICA1MiwNCisgIC0yODEsICAgIDc2LCAgLTE2NywgIC0zNjEsICAtMjgzLCAgLTU1MSwgIC0yODMsDQorICAtMTE5LCAgIC01MiwgICAgLTEsICAgMTM0LCAgIC0zMiwgIC0yMDQsICAtNDE1LA0KKyAgMTA2NCwgICA4MjcsICAgNjM3LCAgIDY4NCwgICA0NjQsICAgMjA5LCAgICAxMiwNCisgICA0ODIsICAgNDE2LCAgIDQ0OSwgICAzNzEsICAgMzM1LCAgIDI5NCwgICAxOTQsDQorICAgNzE5LCAgIDU3NiwgICAzNjUsICAgMTM1LCAgIDExMywgICAgOTEsICAtMTk5LA0KKyAgIDI5OCwgICAxNzYsICAgNDkzLCAgIDM2NiwgICAxOTQsICAgMTYzLCAgICAzNiwNCisgICAtMzUsICAtMjM2LCAgLTI1OSwgICAtMzYsICAgIC00LCAgICA5OSwgICAxNTIsDQorICAgLTk4LCAgLTMwNiwgICAtMjcsICAgMjI4LCAgICA5MCwgICAxMTEsICAgLTg2LA0KKyAgICA5MSwgICAgMTMsICAtMjExLCAgLTI1OCwgIC0xMDYsICAgIDg2LCAgIC02NCwNCisgICAgNzMsICAgLTM1LCAgIC01NywgICAtMzEsICAgMTYyLCAgICAzNSwgIC0xOTIsDQorICAtMTA5LCAgLTMzNSwgIC02MjksICAgLTY2LCAgIC02MSwgIC0xMjgsICAgMzIyLA0KKyAgLTQ5NSwgIC02NjksICAtNzI4LCAgIDE5MywgICAgMzEsICAtMjIwLCAgIDEyMiwNCisgICAzMjQsICAgIDk1LCAgIC04OSwgICAtOTEsICAtNDA5LCAgLTcxMCwgIC0xNTQsDQorICAgICAwLCAgLTIzNCwgICAgOTIsICAgIDMzLCAgLTM0MywgIC02MDksICAtMjIwLA0KKyAgLTM0MywgIC00MDgsICAtNDc2LCAgLTY1NSwgIC0xNTMsICAgIDgyLCAgIDIyMiwNCisgIC00OTAsICAtNzQ1LCAgLTI1NSwgICAgNDksICAgLTQ4LCAgIDEzNSwgIC0xMjcsDQorICAgMTE5LCAgIC02NywgIC0zMjgsICAtMzkwLCAgLTI3MiwgIC01NDUsICAgLTU2LA0KKyAgIC01NywgIC0xMzAsICAgLTEwLCAgICAtNywgIC0xNjQsICAgLTQ3LCAgIC0yMiwNCisgICA5ODQsICAxMDY0LCAgIDk2MSwgICA1NjgsICAgMjEwLCAgIC0yNywgICAgMTYsDQorICAgODExLCAgIDY5MSwgICA3NTQsICAgNTE0LCAgIDIyNCwgICAtMzUsICAgMTY2LA0KKyAgIDY2MiwgICA3MDQsICAgNjE4LCAgIDM4NiwgICAgNTcsICAtMjExLCAgLTI1NywNCisgICA1MTAsICAgMzU5LCAgIDQxOCwgICAzOTMsICAgIDkxLCAgLTE0NCwgICAtMTgsDQorICAtMTkzLCAgIC0zMSwgICAtMjcsICAgMjIzLCAgICA4OSwgIC0xNDMsICAgIDI0LA0KKyAgLTExMiwgICAtOTgsICAgNDcxLCAgIDMxOSwgICAxODUsICAgICAzLCAgIDE3NSwNCisgICAyNTIsICAgMTQ2LCAgIC00NywgICAyNzIsICAgIDQ4LCAgLTIxMSwgIC0yMzQsDQorICAgMTQ2LCAgICA2OSwgICAyMDMsICAgMzY0LCAgICA2OCwgICAtNTIsICAgIDUxLA0KKyAgLTI1OSwgIC00NzgsICAtNjk3LCAgLTM0OSwgIC03NTgsICAtNTAxLCAgICA2MywNCisgIC01MDEsICAtNzY5LCAgLTI4OSwgICAgNzksICAtMzExLCAgLTQ5NywgIC0xMDYsDQorICAgMjUxLCAgICA1MywgIC0yMzUsICAtNDY5LCAgLTg5NSwgIC04ODQsICAgMTQ1LA0KKyAgLTQxNiwgIC01NTEsICAgMTQwLCAgLTEzMywgIC01MjMsICAtNzc1LCAgICA0NCwNCisgIC0zMjYsICAtNDIzLCAgLTcxMywgIC00OTcsICAgLTg2LCAgLTQzMSwgICAgOTksDQorICAtNzU3LCAgLTc3MiwgIC0xNjAsICAgLTc2LCAgIC00NiwgICAtMzIsICAgMzc5LA0KKyAgICA4NSwgICAtMzUsICAtMjAwLCAgLTQwMSwgIC02NjMsIC0xMDQwLCAgLTI0NywNCisgIC0xODAsICAtMzMwLCAgIC05MiwgIC0zNzYsICAgIDI3LCAgLTE4MywgIC0xMTAsDQorICAxMjc5LCAgMTA4NiwgICA3ODEsICAgNTAyLCAgIDMyNCwgICAxNjQsICAgMTU3LA0KKyAgIDY4MiwgICA0NjYsICAgNDQ5LCAgIDI3NywgICAxNDYsICAgIDI4LCAgIDQwOSwNCisgICA2MzUsICAgNDcyLCAgIDM5MCwgICAxMDcsICAtMjMyLCAgLTUzOCwgIC0xMzksDQorICAgMTk2LCAgIDM5NiwgICAzMzIsICAgMjEzLCAgIDIwOSwgICAtMjksICAgLTgxLA0KKyAgIDE1MCwgICAtOTUsICAtMzEyLCAgICA3NiwgICAtNzcsICAtMzIwLCAgIC01MCwNCisgICAgNDYsICAgICA5LCAgICA0NywgICAxNzUsICAgMTM5LCAgICAzMCwgICAzODQsDQorICAgMjE4LCAgIDIwNiwgICAtMjQsICAtMjUwLCAgIC05NiwgIC0yNzYsICAtMTgzLA0KKyAgICAyNiwgICAxMTksICAgIDM4LCAgICAxNCwgICAgLTQsICAtMTMzLCAgIC01MiwNCisgIC00NzcsICAtNjE0LCAgLTk4NywgIC03MTUsICAtNjMxLCAgLTgxMywgICAyMDAsDQorICAtNzQ0LCAtMTAwOSwgLTEwNjUsICAtNzQ1LCAgLTYzMSwgIC0xNzEsICAgIDE4LA0KKyAgLTEzNywgIC0yNTEsICAtNDgzLCAgLTYxMywgIC05ODAsIC0xMjAzLCAgICAxMiwNCisgIC02MDUsICAtNzY3LCAgLTU2MiwgIC02ODYsIC0xMDg4LCAgLTUxNSwgICAgNTgsDQorICAtMjAyLCAgLTQyOCwgIC03ODIsIC0xMDcyLCAgIC05NiwgIC0yMzQsICAtMTc5LA0KKyAgLTQ4MCwgIC03MDksIC0xMDcwLCAgLTg5NywgIC0xMzEsICAgLTkyLCAgIDMyMSwNCisgIC0xNDUsICAtMTkzLCAgLTUxMiwgIC03MjksICAtNTcyLCAgLTc2NSwgIC0yMTAsDQorICAtMzMxLCAgLTU4NSwgIC01MjUsICAtNjMxLCAgLTI4MSwgIC0yMDgsICAtMzAzLA0KKyAgMTE2NSwgIDExMDQsICAgOTM5LCAgIDgyOCwgICA3MTYsICAgNDI2LCAgIDE1NSwNCisgICAgIDYsICAtMTA5LCAgIDgyMCwgICA3NzgsICAgNDE1LCAgIDExMywgICAtMjcsDQorICAgMzgxLCAgIDMzOSwgICAzMTQsICAgMjY1LCAgIDEyMSwgICAgLTksICAtNDc0LA0KKyAgLTM3MywgICAgNDcsICAgNTg0LCAgIDQ0MiwgICAgOTksICAtMjMxLCAgLTExMywNCisgIC00OTYsICAgLTM4LCAgLTI4NSwgICAyNjIsICAgMzA1LCAgIDE3MCwgICAgIDQsDQorICAtNTg3LCAgLTU1NiwgICAgNjksICAgIDY2LCAgIDQ3MSwgICAzNTQsICAgIDEzLA0KKyAgLTEzOCwgICAgNzAsICAgLTE4LCAgIDEwNiwgICAgNjcsICAgMTY3LCAgLTMwMiwNCisgIC00NDUsICAtMTQxLCAgIDE4NSwgICAxOTEsICAgMTUxLCAgICA4MywgIC0xMzMsDQorICAtMjU3LCAgLTUyMSwgIC03MjAsICAtMTk4LCAgIDEzNCwgICAtNDYsICAtMTgyLA0KKyAgLTgxOSwgLTExNjgsICAtNzc3LCAgIDUxMiwgICAzNTksICAgIDk1LCAgLTExMywNCisgICAxMzcsICAgIC0yLCAgIC03NCwgIC0xMzgsICAtNDAxLCAgLTExNCwgIC0zNzEsDQorICAtMjQyLCAgLTQ2NiwgICAyMDQsICAgMjIzLCAgIC0zMSwgIC0yMTIsICAtMTkyLA0KKyAgLTUzMiwgIC02MzcsICAtNDY2LCAgLTY4NiwgICAyNTYsICAgMjc3LCAgLTEzOSwNCisgLTExNDEsIC0xMjQ0LCAgLTM4MSwgICAtNzUsICAgLTU0LCAgICAxNCwgICAgODgsDQorICAtMzExLCAgIDExNSwgIC0xNDMsICAtNDk5LCAgLTM0MywgICAxMjQsICAtNDE2LA0KKyAgLTYxNiwgIC0xNDcsICAtMTM1LCAgICA0MywgICAgLTQsICAgMTIxLCAgLTM2OSwNCisgICA4MzUsICAgNzgzLCAgIDY0MSwgICAzOTAsICAgMzU1LCAgIDM1MCwgICAgNjQsDQorICAgIDcyLCAgIDE5NCwgICA0NDMsICAgNDY3LCAgIDQzNiwgICAyMTksICAgMzcyLA0KKyAgIDQ2NCwgICAzNjksICAgMTkyLCAgICAgNCwgIC0xNTYsICAgLTcyLCAgLTIyNiwNCisgICAgNTcsICAgMjA2LCAgIDMwMywgICAyMDUsICAgMTg4LCAgIDEwMSwgICAyNjUsDQorICAgLTQwLCAgLTIwNSwgIC00ODgsICAtMTg0LCAgIDI3NiwgICAgNjQsICAgLTI2LA0KKyAgLTIxNywgIC00MzMsICAtMjk3LCAgIDEzNywgICAzMjgsICAgMzA4LCAgLTI4OSwNCisgICAzNzgsICAgIDgxLCAgLTMwOCwgIC00NjUsICAgIDU3LCAgIC0zNywgICAyMjcsDQorICAtMTAwLCAgICAyNCwgICAtMzYsICAtMTUxLCAgIDE5OSwgICAgIDgsICAgMTQzLA0KKyAgLTQyNiwgIC02OTcsIC0xMDU5LCAgLTEzMywgICAzODgsICAgMTYxLCAgIDMyMSwNCisgIC02NDQsIC0xMDIzLCAtMTI3MSwgICAgMzksICAgIDY2LCAgLTEyMywgICAgNzAsDQorICAgMzcyLCAgIDE3NywgIC0xNzMsICAtNTU2LCAgLTU1MywgIC0zMDQsICAtMTg5LA0KKyAgLTExNywgIC0zNjksICAtNDI1LCAgLTEyMiwgIC00NjIsICAtMTUyLCAgIC03MywNCisgIC02NDksICAtODUwLCAtMTE4OSwgIC03NjcsICAgNDk3LCAgIDM2MCwgICAyMjIsDQorICAtNzk4LCAtMTEzOSwgLTE0NTUsICAtMTkwLCAgIDQzMCwgICAyMzQsICAgMTc5LA0KKyAgICA0MiwgICAtOTQsICAtNDA1LCAgLTY5MiwgICAgMzgsICAtMjAyLCAgLTI0NiwNCisgIC0xNjksICAtMzY2LCAgLTI5MCwgICAtODgsICAgLTY0LCAgICAzMiwgIC0yOTIsDQorICAxMDEwLCAgIDkyMywgICA5MzgsICAgNzEwLCAgIDQ2NSwgICAyMzAsICAgMzQyLA0KKyAgIDIxNywgICAzMDAsICAxMDU0LCAgIDY3NSwgICAgNjgsICAtNDU4LCAgLTE3OSwNCisgICAgNzgsICAgNDUzLCAgIDMxNiwgICAgMTgsICAtMjM3LCAgLTQ5NiwgIC0yNDMsDQorICAgMTY3LCAgICAyMSwgICA0MjQsICAgMjE1LCAgIC05MSwgIC0zMDMsICAtMTcwLA0KKyAgLTI5MCwgICAtODEsICAgLTcwLCAgIC02NywgICAgNDAsICAgIDU0LCAgIC01OSwNCisgIC0zNTMsICAtNDI3LCAgIC05MCwgICAgNTMsICAgIDk0LCAgICAgOSwgICAgNTQsDQorICAgLTI4LCAgIDMxOCwgICAyODMsICAgIDE1LCAgLTI0MCwgICAtNTgsICAgIDc5LA0KKyAgIC03NSwgIC0xMjEsICAgMjI5LCAgICAzNSwgICAgNTgsICAgICA2LCAgLTEzMywNCisgIC0zNTEsICAtNTE0LCAgLTc0NCwgIC04MzQsICAtNzA1LCAgLTEzNywgICAxNjQsDQorIC0xMTI0LCAtMTM4OCwgLTEwNTUsICAtMjMwLCAgIC03MywgICAgNDAsICAgIDM2LA0KKyAgLTE2MywgIC0yMzMsICAtNTMyLCAgLTc4NSwgLTExNzAsICAtNjk3LCAgICA5NiwNCisgIC03ODgsICAtOTU5LCAgLTI0NiwgIC00MzAsICAtNjI0LCAgLTE2NSwgICAgLTgsDQorICAtODU2LCAgLTU0MCwgIC02MzAsICAtOTA3LCAgLTMzNywgICAtNzAsICAgIDc2LA0KKyAgLTkzNywgLTEwNDIsICAtNjU5LCAgLTczMywgIC0yMDgsICAgMTk5LCAgIC0yNiwNCisgIC01MjMsICAgIDc4LCAgIC05OCwgIC01MDEsICAtODY5LCAgLTg5MCwgICAtODEsDQorICAtNjI0LCAgLTcwMywgICAtNDUsICAtMzQ4LCAgIC0yNSwgICAgODcsICAtMTg2LA0KKyAgMTAwNSwgICA4MjMsICAgNTQ2LCAgIDI0OSwgICAgOTAsICAgLTIyLCAgIDIwNywNCisgICAyOTgsICAgMzk3LCAgIDM4MSwgICAzMTksICAgMjAwLCAgICA2MiwgICAzMDMsDQorICAgNDczLCAgIDM3OSwgICAxMzMsICAtMjQ3LCAgLTYzMiwgIC00NDEsICAgIDc1LA0KKyAgIDI4NCwgICAyMDgsICAgMzkxLCAgIDExNSwgICAtMjUsICAgIDQ0LCAgICA5NSwNCisgICAtNzIsICAgIDc5LCAgIC05NSwgICAtNjMsICAtMTI5LCAgLTI5MywgICAyMDMsDQorICAtMTY0LCAgLTM0OSwgICAxMTUsICAgMTIyLCAgICA2OSwgICAgLTEsICAgMzc4LA0KKyAgIDM0OCwgICAxNzAsICAgIDk5LCAgICA1OCwgIC0xNzksICAtMzAyLCAgIDE4OCwNCisgIC0xOTAsICAgIC0yLCAgIDE1MCwgICAgMjMsICAgLTUxLCAgIC0xMSwgICAyMTYsDQorICAtNjE1LCAgLTg2MywgLTEwOTAsIC0xNDI3LCAgLTgwMiwgICAtNDgsICAgIC02LA0KKyAgLTk2MSwgLTEyNzYsIC0xNTQ4LCAgLTcyNywgICAtNTgsICAgIDU2LCAgIDIyMywNCisgIC0xMjQsICAtMjU1LCAgLTU2MSwgIC05ODgsIC0xMjc3LCAgLTE0OCwgICAtODIsDQorICAtNDgwLCAgLTY2MCwgIC04OTEsIC0xMTkxLCAtMTMzOSwgIC0zMjUsICAgIDIwLA0KKyAgLTYyMSwgIC05MTcsIC0xMjk2LCAtMTM1MCwgICAyNjQsICAgMjg5LCAgICA1MCwNCisgIC04NDQsIC0xMDIyLCAtMTM0NSwgLTEzMjksICAtMjkzLCAgICA0NiwgICAyNzgsDQorICAtMjYwLCAgLTQ2OCwgIC04MjksIC0xMTc2LCAgLTUzMywgIC01NjAsICAgLTc4LA0KKyAgLTIxNSwgIC00ODQsICAtODIyLCAtMTIzMywgIC03OTEsICAgIDE1LCAgLTEzOCwNCisgIDEzMDEsICAxMzE3LCAgMTI2MiwgIDEwNDgsICAgNzE2LCAgIDM1NywgICAtNjQsDQorICAgNTc4LCAgIDgyNCwgICA5MjUsICAgODAyLCAgIDYzMCwgICAzNjIsICAgMTAyLA0KKyAgIDQ3MCwgICA5MjUsICAgNzY3LCAgIDUxNCwgICAzMjcsICAgMTkwLCAgLTExMiwNCisgICAyMjUsICAgNDkyLCAgIDQ5NSwgICA0MzcsICAgNTk4LCAgIDM4NCwgICAtNDUsDQorICAgIDQzLCAgICA4MiwgICAtNDIsICAgMTc1LCAgIDUxOSwgICAzNDIsICAgLTY0LA0KKyAgLTMwNCwgIC0xNTQsICAgMTU5LCAgIDU3NiwgICA0MDMsICAgMjIxLCAgIDMyNywNCisgICAyMTQsICAgMjQ0LCAgIDEyMiwgICAtNjIsICAgMzEyLCAgICA5MiwgIC0xNjAsDQorICAgMjE4LCAgIDIwOCwgICAzMTAsICAgMjY4LCAgIDMwNiwgICAzMjMsICAtMTk5LA0KKyAgLTI4NSwgIC0yNjksICAgLTc5LCAgLTEyNCwgIC0xNDMsICAtMTUzLCAgIDIzNiwNCisgIC0yMDUsICAtMzg0LCAgLTQyNiwgICAzNDQsICAgIDU5LCAgLTE4NSwgIC0xODQsDQorICAtMjcyLCAgIDI0NywgICAxMjYsICAtMjEwLCAgLTUxOCwgIC00NjgsICAgIDc4LA0KKyAgIC05OSwgIC0xMjAsICAgNTAyLCAgIDE2MCwgIC0yODAsICAtNTU3LCAgIDMwNCwNCisgIC00MjMsICAgLTE3LCAgLTI4MywgIC00NDMsICAgMjE1LCAgIDIxMiwgIC0xNDAsDQorICAtNTY0LCAgLTY4NCwgIC0yMjgsICAgNTEwLCAgIDM2MSwgICAxMzAsICAgMzIzLA0KKyAgLTQyOCwgICAzMzUsICAgIDk4LCAgIC02NSwgICAgMzYsICAtMjE1LCAgLTI0NiwNCisgIC0zNjIsICAgIDUxLCAgIDM2NCwgICAtMTYsICAtMjM0LCAgIDE1MCwgIC0xNjUsDQorICAgOTE0LCAgIDg4MywgICA3NTEsICAgNjUzLCAgIDY3NiwgICA0NjQsICAtMTUzLA0KKyAgIDYzMSwgICA1NDUsICAgNTM1LCAgIDcyMCwgICA1OTYsICAgMzYwLCAgIC04MSwNCisgICA3ODMsICAgNzEyLCAgIDUxMiwgICA0MzksICAgMzQxLCAgIDI1MSwgIC0zOTEsDQorICAgNDk3LCAgIDQxNywgICAyNDksICAgMzcyLCAgIDI5NSwgICAxNzMsICAtMTkzLA0KKyAgIDEyOCwgIC0xMTAsICAtMzg1LCAgICA5MywgICAgMzksICAgMTczLCAgLTIzMSwNCisgICAyMTYsICAgLTU5LCAgLTI1MywgICA0NjIsICAgMzg5LCAgIDE1NCwgICAgNjksDQorICAgNDU1LCAgIDI3MCwgICAgLTQsICAtMzM3LCAgIC00OSwgICAyMzMsICAtMzIyLA0KKyAgIDMwNywgICAxNDMsICAgIDUzLCAgIDIxOCwgICAxMjgsICAgMjM2LCAgLTE1NiwNCisgICAtMzcsICAtMTg2LCAgLTI0MCwgIC00MTEsICAtMTEwLCAgICAgOSwgICAzOTksDQorICAtMTQwLCAgLTM2NSwgIC02MjgsICAgMjU4LCAgIDM4MCwgICAyMTQsICAgMjc3LA0KKyAgIDEzMSwgICA0NTQsICAgMTc3LCAgLTI4NSwgIC01MjAsICAgMTA4LCAgLTIxNCwNCisgICAgNzcsICAtMTQxLCAgIDIwMSwgIC0xMjMsICAtNDkwLCAgLTEzMSwgICAgNjAsDQorICAgLTE0LCAgLTE5NCwgIC01MjEsICAtNzQxLCAgIDI3MywgICAzNjIsICAgLTMzLA0KKyAgLTM2MiwgIC01NjYsICAtMjg3LCAgLTIyOCwgICAxNjEsICAgMjM3LCAgIDMxNywNCisgIC0yNjksICAgMTk1LCAgIC03NSwgIC0zNzUsICAtMjA0LCAgICAxMSwgICAgNzcsDQorICAtMTI4LCAgLTI2NCwgIC0xNTYsICAtMjIzLCAgLTQ3NSwgICAyNjUsICAgIDI3LA0KKyAgMTIzOCwgIDExNDcsICAgOTE2LCAgIDY4OSwgICA0MzIsICAgMjEwLCAgLTI4MCwNCisgICA4MDAsICAgNjY0LCAgIDg3OSwgICA3MjYsICAgNDExLCAgIDE2MCwgIC0xNjQsDQorICAgNDU0LCAgIDY4NiwgICA1MzYsICAgMjc1LCAgIDE0NywgICAgNDYsICAgMTExLA0KKyAgIDMwMywgICA0ODYsICAgNTEyLCAgIDM1NSwgICAyNDEsICAgMTgxLCAgIC02OSwNCisgICAgNzksICAgIDkyLCAgICAyOSwgICAxNDcsICAgMjMzLCAgICA1MiwgICAgMTcsDQorICAtMTcxLCAgIDI4OSwgICAxMzEsICAgNDM5LCAgIDI3MSwgICAgIDMsICAgLTEwLA0KKyAgIDQxMywgICAyNDEsICAgMTQ0LCAgIDE3NCwgICAxNTUsICAgIC0yLCAgICAxNCwNCisgICAgNTgsICAgMjE3LCAgIDI0NywgICAyMTksICAgMTQ5LCAgIDE3NSwgICAtMTgsDQorICAgMjI4LCAgICAtOCwgIC0yNDAsICAtMjA2LCAgLTUxMywgIC0xOTEsICAgMjAyLA0KKyAgIC05NiwgIC0yNzIsICAtNDU0LCAgICAzMywgIC0zMDAsICAtNTc1LCAgICA0NiwNCisgICAtMTAsICAtMTA4LCAgLTI0NiwgIC0zNDcsICAtNzcwLCAgLTUzNSwgICAgIDksDQorICAtMzI2LCAgLTQzMCwgICAtNjEsICAtMzIxLCAgLTcwNCwgIC0yOTksICAgMjAxLA0KKyAgICAtMSwgIC0yODAsICAtNjAzLCAgLTQxOSwgIC0xODUsICAgIDE4LCAgIC0zNiwNCisgIC01MTYsICAtNTIyLCAgLTM3OSwgIC0yOTEsICAtMTgxLCAgIC05NywgICAgMjcsDQorICAtMTU5LCAgLTMxMywgIC01MjUsICAtMjI0LCAgLTUxMCwgIC04MzEsICAtMTk3LA0KKyAgLTI5MiwgIC00NTksICAgLTU5LCAgLTMxMCwgIC01NjIsICAtMTQzLCAgLTM1MSwNCisgIDEwNjYsICAgOTEyLCAgIDYzMSwgICAzODksICAgMjA3LCAgICA4NiwgIC0yMjQsDQorICAgNTk2LCAgIDUxMiwgICA1OTYsICAgNTA1LCAgIDMxNCwgICAxMjIsICAgLTQ4LA0KKyAgIDc4NywgICA4NjEsICAgNDQxLCAgIC05MywgIC0zMDMsICAgIDMzLCAgLTE5MCwNCisgICAyNTcsICAgNDY5LCAgIDMzNywgICAgNTEsICAgIDE1LCAgIDI5OCwgICAtOTMsDQorICAgMjk1LCAgICA3MywgIC0xMTksICAgIDI1LCAgICAzNiwgICAgMjMsICAgMTA4LA0KKyAgIC0yOCwgICAgLTMsICAgLTMyLCAgIDExNCwgICAgMjEsICAgMTg1LCAgIDEwNywNCisgICA0ODIsICAgMzA1LCAgICAxNSwgIC0yNzksICAtMzE5LCAgICA1MiwgICAgOTYsDQorICAgMjI2LCAgICA0NiwgICAxMTUsICAgIDcyLCAgLTEzNiwgICAxMzMsICAtMTI1LA0KKyAgICAxOCwgIC0yMDcsICAtNTU5LCAgLTU5MCwgIC01MDMsICAtNDgyLCAgIDMyMSwNCisgIC01NzEsICAtNzg5LCAgLTk1MSwgIC0xNzIsICAtNDQxLCAgLTUzOCwgICAxMTMsDQorICAgMTgxLCAgICAxNCwgIC0zMTAsICAtNjQxLCAtMTAwMSwgIC0yMDIsICAgMTU5LA0KKyAgLTEzNiwgIC0zOTMsICAtNDMzLCAgLTUxMywgIC05MTEsICAtMTQ0LCAgIC0yMiwNCisgICAgNzIsICAtMjY1LCAgLTcwNiwgIC05NTQsICAtMTU5LCAgICA1MywgICAzMzIsDQorICAtMzM4LCAgLTU5MSwgIC04NTIsICAtMzgzLCAgLTM5NSwgICAgNTYsICAgIDQ0LA0KKyAgICA0MywgIC0xNTgsICAtNDY0LCAgLTg5NywgIC02MzEsICAtMTU3LCAgLTI5NCwNCisgIC0xNjEsICAtMTI4LCAgLTMyOCwgIC01NzMsICAtNDgzLCAgLTEyNSwgICAgMTEsDQorICAxMDE3LCAgIDkwNiwgIDEwNTEsICAxMDA1LCAgIDY3OSwgICAzNDEsICAtMTAyLA0KKyAgIDM1OSwgICAzMzQsICAxNTY3LCAgMTMxNCwgICA3MjMsICAgMTA1LCAgICAxMCwNCisgICAtNjUsICAgNzI2LCAgIDUyOSwgICAzMDEsICAgMjIwLCAgICA0MywgIC0yNzMsDQorICAtNTEwLCAgIDQzNiwgICA3MTksICAgNTY2LCAgIDM1OCwgICAxNzksICAgMTE0LA0KKyAgLTU2MCwgICAyOTgsICAgMTMzLCAgLTEyMCwgICAzNDIsICAgMjI1LCAgICAxNCwNCisgIC04OTksICAtMTAxLCAgIDIxNywgICA2MTcsICAgNDAwLCAgIDE0NiwgICAtNTgsDQorICAgLTQxLCAgIDM1MiwgICAgODIsICAtMTk2LCAgICAzOSwgICAxMjEsICAtMTY3LA0KKyAgLTIxMiwgICAgNTksICAgNDQ3LCAgIDI4NCwgICA0MjMsICAgMjUwLCAgLTE2OSwNCisgIC0zNzEsICAtNDg0LCAgLTU5NiwgICAgMzAsICAgLTQxLCAgIDI0OSwgICAgMjIsDQorICAtMzcyLCAgLTY1MCwgIC03OTQsICAgNDc3LCAgIDQ0NSwgICAyMTYsICAgLTc5LA0KKyAgLTM1MiwgICAyNzUsICAgIDE3LCAgLTQ0MywgIC05MjksICAgIDkyLCAgICAxOSwNCisgIC02OTksICAtNjk2LCAgIDQzMSwgICAyNjQsICAgLTQ5LCAgLTMxMCwgICAxODIsDQorICAtOTc4LCAgLTIxNywgIC00MzAsICAtNDAwLCAgIDEwMSwgICAyNjEsICAgIDcyLA0KKyAgLTkyOSwgIC04ODksICAtMzU3LCAgIC0xMywgICA0NjMsICAgMzc4LCAgIDIzNiwNCisgIC04MjYsICAgIDU2LCAgICAzMCwgIC0yOTksICAtMzYwLCAgLTEyOCwgICAtNTEsDQorICAtODc4LCAgLTI5OSwgIC0xMTEsICAgIDc1LCAgICA2NSwgICAgMzYsICAgICAzLA0KKyAgIDgxNywgICAzNjgsICAgLTI1LCAgIDM1NCwgICA2OTcsICAgNTkxLCAgLTE3MywNCisgICAzMDksICAgMjEyLCAgIDIyMiwgICA3NTEsICAgNDg0LCAgIDE0MCwgICAtNTYsDQorICAgNTkzLCAgIDM3OSwgICAgNzAsICAgIC04LCAgIDI1OCwgICAxODAsICAgMTEwLA0KKyAgIDE2NSwgICAtNDYsICAgMjU1LCAgIDI5NywgICAyMTksICAgMjczLCAgIDEwNSwNCisgICAxNjAsICAgLTcwLCAgLTM1OCwgIC0xODEsICAgMzc5LCAgIDMzMCwgICAzMTksDQorICAtMjM4LCAgLTM2OSwgIC0xOTgsICAgNzQwLCAgIDU4MCwgICAzMTksICAtMTQzLA0KKyAgIDIwMSwgICAxMDksICAtMjAyLCAgLTQ1NiwgICAzMjgsICAgMjc2LCAgLTE0MSwNCisgICAyMDMsICAgMTcwLCAgIDExMSwgICAgNDIsICAgMjA3LCAgIDM2MCwgICAxODgsDQorICAtMzQ1LCAgLTM5OSwgIC01MTMsICAtMjMzLCAgIDY1MCwgICA0MjIsICAgIDgxLA0KKyAgLTYzNSwgIC05NjEsIC0xMjIwLCAgIDQ2MywgICA1MzksICAgMjA0LCAgIDIwOSwNCisgICAyMDIsICAgLTI1LCAgLTE5NCwgIC00OTgsICAtNzg3LCAgIDE5MywgIC0xNDMsDQorICAtNDQ5LCAgLTUzOCwgICAxOTUsICAtMTA2LCAgLTMzMSwgICAgNjgsICAgIDYyLA0KKyAgLTIyOCwgIC00NzcsICAtODQwLCAgLTU3NiwgICAzMTcsICAgMTI4LCAgIDI4MywNCisgIC02NzEsICAtOTM3LCAgLTgwNywgIC0xMTQsICAgMzkxLCAgIDMzNSwgICAtNjIsDQorICAgMjQ2LCAgICAgMiwgIC0zMTQsICAtNjc5LCAgLTMwMywgICAxODAsICAgLTg4LA0KKyAgLTEwNywgIC0yNzIsICAgIDkwLCAgLTE5OCwgICAtMjgsICAgMjkwLCAgLTExMiwNCisgICA4ODUsICAxMTQ5LCAgMTAyMSwgICA3MTIsICAgNDk2LCAgIDI4MSwgICAtODMsDQorICAgMjY5LCAgIDQ5MiwgICA3ODcsICAgNjQzLCAgIDM0NywgICAgNzAsICAgMTI0LA0KKyAgIDMzNiwgICA2MzYsICAgNDk5LCAgICA5MiwgIC0yMjksICAtMTc5LCAgIDE5MSwNCisgICAgMjYsICAgNDAyLCAgIDU2NCwgICAzNDAsICAgMTQ5LCAgIC0xMSwgICAxMzUsDQorICAtNDQwLCAgIDU2MSwgICA0NzAsICAgMjA0LCAgIC03MiwgIC0xODYsICAgMTQwLA0KKyAgLTcyMCwgICAgMTQsICAgMzU1LCAgIDIyOSwgICAgNjgsICAtMTMzLCAgIDQ2NSwNCisgICAxMTAsICAgMzEwLCAgIDEwMywgICAgMTIsICAgMTA2LCAgICAyOSwgICAxNTgsDQorICAtMTc4LCAgIDExMywgICAxNjEsICAgMTQyLCAgIDEyMSwgICAxMTUsICAgIDI3LA0KKyAgLTY1MSwgIC00MTQsICAtNjQ1LCAgLTE1MiwgIC0xNjQsICAgLTEzLCAgLTQyOSwNCisgIC02MzksICAtOTQ0LCAgLTY4MSwgIC0xMDQsICAgLTgxLCAgICA1MiwgIC0xODksDQorICAtNjYzLCAgLTE2NCwgIC0zMTYsICAtNjgzLCAgLTk1NCwgIC0yMDUsICAgLTgzLA0KKyAgLTYwOSwgIC02NjksICAtMTcyLCAgLTUxNywgIC02OTQsICAgMjgzLCAgIC04MCwNCisgIC02NDYsICAtMTUyLCAgLTM4MywgIC02NzgsICAtMjQ2LCAgIC00MCwgIC0xNDMsDQorICAtNzQ3LCAgLTc5NiwgIC03NDUsICAtMzkwLCAgIC05OCwgICAgNDMsICAgMjc1LA0KKyAgLTU5OSwgIC0xOTksICAtMzk4LCAgLTQzMywgIC00MzYsICAtNTM4LCAgICAzMSwNCisgLTExMDcsICAtNTY4LCAgLTM3NiwgIC0yNjUsICAtMTI2LCAgIC0yMSwgICAgIDEsDQorICAgODQ3LCAgIDU3MywgICAzMDgsICAgMzkyLCAgIDMwNSwgICAxMDEsICAgIDU1LA0KKyAgIDI3MywgICAyOTMsICAgMjAxLCAgIDI2NywgICAzNDYsICAgMjAxLCAgIDEyMywNCisgICA3MjcsICAgNDgwLCAgIDIyNiwgICAgIDIsICAgLTY1LCAgLTEzOCwgICAxNjQsDQorICAgMjczLCAgIDIwOCwgICAxNzMsICAgMjkyLCAgICAxMiwgICAyNTMsICAgMTc0LA0KKyAgIDM0MCwgICAyMDcsICAgMTgwLCAgICA4OCwgICAxMTYsICAgIDQ2LCAgIDQ3NSwNCisgIC00NjAsICAtMTY2LCAgIC0zMCwgICAgMTMsICAgMTEwLCAgIDE3MywgICAzOTYsDQorICAgMTM3LCAgICA4OCwgICAgNDMsICAtMTM3LCAgIC05NCwgICAgMzQsICAgMjg0LA0KKyAgICA5NiwgICAtMTQsICAgMjI2LCAgICA0MCwgICAgNjMsICAgIDcwLCAgIDEzMCwNCisgIC00NjcsICAtNzM1LCAtMTAxMiwgLTExNzQsICAtMzA3LCAgIDMwNSwgICAtNjcsDQorICAtNjEyLCAgLTkyMCwgLTExNDYsICAtNTY3LCAgICAtOCwgICAgOTIsICAgLTI1LA0KKyAgLTE4MiwgIC0yNzEsICAtNDkyLCAgLTc1NCwgIC04NTcsICAgMjg3LCAgIC03NSwNCisgIC00OTQsICAtNzg3LCAgLTY4OSwgIC02ODMsICAtNzA5LCAgIDEzNywgIC0zMjYsDQorICAtMjg4LCAgLTU1MCwgIC05MDMsIC0xMTA1LCAgIDMzNCwgICAzMjEsICAgLTYyLA0KKyAgLTM1NCwgIC02NTMsICAtODM0LCAgLTQ0NSwgICAgIDEsICAgMzc3LCAgLTE1MiwNCisgIC0xNjIsICAtMzA2LCAgLTYwOCwgIC05MzcsICAtMjk3LCAgIDI0NywgIC0xOTIsDQorICAtMjM0LCAgLTQ3NywgIC0yNDQsICAtNDg4LCAgLTI2NiwgICAzNDIsICAtMzMyfTsNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAybmQgc3RhZ2UgY29kZWJvb2s7IDFzdCBzcGxpdDogICBpc2YyXzAgdG8gaXNmMl8yDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzIxX2lzZltTSVpFX0JLMjEqM10gPSB7DQorDQorICAgMzI5LCAgIDQwOSwgICAyNDksDQorICAgLTMzLCAgIDUwNSwgICAxNjAsDQorICAgLTI5LCAgIC0xNCwgICA1ODIsDQorICAtMjYyLCAgIDEyNywgICAzNTQsDQorICAgMTQ1LCAgIDIzNywgICAxNzUsDQorICAtMTUyLCAgIDI0NSwgICAxMjIsDQorICAgIDI3LCAgICA0MiwgICAzNDAsDQorICAgLTg0LCAgIC05MywgICAzMTEsDQorICAgMjg1LCAgIDIyMiwgIC0xNTYsDQorICAgIDQ3LCAgIC00MywgIC01MDQsDQorICAgMjM0LCAgIDEyMSwgICAzODUsDQorICAgMTA0LCAgLTMxNywgICAgNDUsDQorICAgMTc2LCAgIDE5NSwgICAgIDgsDQorICAgMTA0LCAgIC01OSwgICAtOTQsDQorICAgMTc3LCAgICA1MywgICAxOTIsDQorICAgLTM0LCAgLTEyNywgICAxNTIsDQorICAgNTcwLCAgIDI3NywgICAtMzQsDQorICAgLTY3LCAgLTMyOSwgIC02MzksDQorICAtMTU3LCAgLTI3MiwgICA0NjIsDQorICAtMTc3LCAgLTQ2MiwgICAxOTgsDQorICAgMzIyLCAgIDE3OSwgICAxMTUsDQorICAtMzg2LCAgIDE3MSwgICAgMTksDQorICAgIDE5LCAgIC0xMiwgICAxOTUsDQorICAtMTIwLCAgLTI1MiwgICAyMDEsDQorICAgMzA0LCAgICAzNiwgIC0zMzYsDQorICAtMTI4LCAgLTIyMSwgIC0zODAsDQorICAgMTcxLCAgLTE4NSwgICAyOTYsDQorICAtMjQyLCAgLTMxMiwgICAgMjMsDQorICAgMTk4LCAgICAzOSwgICAgMTYsDQorICAgIC0zLCAgLTE3NywgIC0xMTEsDQorICAgMTExLCAgIC05MywgICAgNzYsDQorICAgLTkyLCAgLTIyMywgICAgIDQsDQorICAgMTc3LCAgIDQwNiwgICAtNDQsDQorICAtMTY4LCAgIDM4MCwgIC0xNDksDQorICAgIC00LCAgIDI3MywgICAzMzEsDQorICAtNDIwLCAgIDUxMywgICAyNzcsDQorICAgIDIxLCAgIDI0NywgICAgNDcsDQorICAgLTU4LCAgIDEzMSwgICAgLTIsDQorICAgIC0zLCAgIDEzNCwgICAxODAsDQorICAtMTQ1LCAgICA0MCwgICAxNzUsDQorICAgMTg5LCAgICA3NCwgIC0xNDUsDQorICAgLTI3LCAgIC00NSwgIC0zMjUsDQorICAgMzcwLCAgLTExNCwgICAtMjEsDQorICAgLTgzLCAgLTQxNSwgIC0xNzMsDQorICAgIDc3LCAgICA5NSwgICAtNTEsDQorICAgLTQwLCAgIC0zMCwgICAtNjcsDQorICAgIDcxLCAgICA4OCwgICAgODYsDQorICAgLTM1LCAgIC05OCwgICAgMTQsDQorICAgIDY5LCAgIDE5NywgIC0zMzQsDQorICAtMTk2LCAgICA3OSwgIC0yMzEsDQorICAtMzQ4LCAgLTEzNywgICAyMTgsDQorICAtMzUyLCAgIC04OSwgICAtODUsDQorICAgIDQ3LCAgIDIwMSwgIC0xMzAsDQorICAtMTY1LCAgICAzNywgICAtMTUsDQorICAgLTQzLCAgICAgMywgICAgODYsDQorICAtMTYxLCAgLTEwOCwgICAgNzksDQorICAgIDgzLCAgICAyMSwgIC0yMzcsDQorICAgLTgxLCAgLTE0OSwgIC0yMzgsDQorICAgMTUwLCAgLTE4NiwgIC0yNTEsDQorICAtMTg2LCAgLTI0OSwgIC0xNjIsDQorICAgLTE5LCAgICA2NiwgIC0xMzksDQorICAgLTI2LCAgIC01MCwgIC0xODEsDQorICAgIDI0LCAgICAxMSwgICAgIDAsDQorICAtMTMwLCAgLTEwNSwgICAtOTh9Ow0KKw0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIDJuZCBzdGFnZSBjb2RlYm9vazsgMm5kIHNwbGl0OiAgIGlzZjJfMyB0byBpc2YyXzUNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorDQorc3RhdGljIFdvcmQxNiBkaWNvMjJfaXNmW1NJWkVfQksyMiozXSA9IHsNCisNCisgIC0xMjcsICAgMzEwLCAgICA0MiwNCisgIC0yNDIsICAgMTk3LCAgICAgNSwNCisgIC0xNTEsICAgIDg0LCAgIC0xNywNCisgIC0yMTQsICAgMTI3LCAgLTE0OSwNCisgIC0yNDcsICAtMTMxLCAgIDE1OSwNCisgIC0yNjgsICAtMjY3LCAgIC05NSwNCisgIC0yMTcsICAgICAxLCAgIC03OSwNCisgIC0yNzEsICAgLTgwLCAgLTE4NSwNCisgICAtNDUsICAgNDM2LCAgIDE1OSwNCisgICAxNjUsICAgMTk5LCAgIDM5MSwNCisgICAtMzMsICAgIDgxLCAgIDE4NywNCisgICAtNjYsICAgLTQyLCAgIDM1NSwNCisgIC0yOTgsICAgLTU3LCAgIDM0MywNCisgIC0xMDgsICAtNTM3LCAgIDIyNiwNCisgIC0xNDQsICAgLTIzLCAgIDE5MywNCisgICAxNzYsICAtNDAyLCAgICA4NywNCisgICAgNTMsICAgMjk2LCAgICAyNSwNCisgICAtODQsICAgMjUzLCAgLTEwNCwNCisgICAtNTgsICAgMTA1LCAgLTEyNiwNCisgIC0xNjksICAgMTc0LCAgLTMxNCwNCisgICAtNDgsICAgIDQ0LCAgLTI5NCwNCisgIC0xNjQsICAtNDE3LCAgLTI0MiwNCisgIC0xMzksICAgICAzLCAgLTE5NCwNCisgIC0xNTUsICAtMjA3LCAgLTIxMSwNCisgICAxMTksICAgMzIyLCAgIDIxMywNCisgICAzMzMsICAgIDUwLCAgIDM4MCwNCisgICAyMzcsICAgMjQ3LCAgICAtMiwNCisgICA0NjYsICAgLTE2LCAgIDIwMSwNCisgICAyMzgsICAtMjU1LCAgLTEwNywNCisgICAgNjcsICAtNDQwLCAgLTE0OSwNCisgICAxMjIsICAgLTg4LCAgLTEzOSwNCisgICAgODgsICAtMjQ3LCAgIC03MywNCisgICAtNDEsICAgMjMxLCAgIDE2NywNCisgICAtNjIsICAgMTU1LCAgICAxNiwNCisgICAtNjUsICAgIDE2LCAgICA3NywNCisgICAtNjgsICAgIC0yLCAgIC02MywNCisgIC0xNTEsICAtMzAwLCAgIDE2MCwNCisgICAtMTgsICAtMzMzLCAgICA1NCwNCisgICAtNTYsICAgLTk0LCAgICAgNSwNCisgICAgIDIsICAtMTkwLCAgICAxNCwNCisgICAgOTIsICAgMTQ4LCAgIDIwOSwNCisgICAxMDgsICAgICA5LCAgIDI3MiwNCisgICAxMDgsICAgIDM1LCAgIDExMCwNCisgICAxNDIsICAgLTg1LCAgIDE0NSwNCisgICAgNDcsICAtMTU3LCAgIDI3OSwNCisgICAgIDMsICAtMzIwLCAgIDI0NiwNCisgICAgNDMsICAgLTcyLCAgICA2OCwNCisgICAgODYsICAtMjE3LCAgIDEzNSwNCisgICAgMzYsICAgMTQwLCAgICA3OSwNCisgICAgNTYsICAgMTc1LCAgIC00OSwNCisgICAgMjYsICAgIDQ1LCAgICAgMywNCisgICAgNzMsICAgIDU1LCAgLTEwMSwNCisgICAxMDksICAtMTgzLCAgLTI0MiwNCisgICAgLTQsICAtMjgzLCAgLTI0MiwNCisgICAgNDgsICAgLTY4LCAgIC00OCwNCisgICAgLTYsICAtMTUzLCAgLTEyMiwNCisgICAxNjEsICAgMTk2LCAgICA5NiwNCisgICAyMzIsICAgIDgwLCAgIDE5MCwNCisgICAxNjUsICAgIDk3LCAgICAxMSwNCisgICAyNTgsICAgLTMxLCAgICA3MSwNCisgICAyNjcsICAgLTc3LCAgIC05MSwNCisgICAzMTEsICAtMjA5LCAgICA4NywNCisgICAxNTIsICAgLTE0LCAgIC0yMiwNCisgICAxNTAsICAtMTQ5LCAgICAgOSwNCisgIC0zMjQsICAgNTU3LCAgIDE4NywNCisgIC0zODQsICAgMzA3LCAgICA0NiwNCisgIC0yNTEsICAgIDI3LCAgICA3NywNCisgIC0zNjUsICAgIDc3LCAgIC01MiwNCisgIC00ODIsICAgLTg0LCAgIDE2MCwNCisgIC00MjQsICAtNTE1LCAgIC02NCwNCisgIC0yOTQsICAtMTIwLCAgICAtNCwNCisgIC00NzYsICAtMTE2LCAgLTEwOSwNCisgICAtOTcsICAgMzE4LCAgIDM2NSwNCisgICAxMDYsICAgNjI3LCAgIDQ0NSwNCisgIC0xOTAsICAgMTIwLCAgIDI4NywNCisgIC0xNDYsICAgIDY1LCAgIDYxOSwNCisgIC00MjcsICAgMjQyLCAgIDM2MywNCisgIC0zNjEsICAtMzcxLCAgIDQzMiwNCisgIC0zNDcsICAgMTAyLCAgIDE2OCwNCisgIC02MjksICAgMTk1LCAgIC0xNCwNCisgICAtNjUsICAgNDc2LCAgIC00NywNCisgIC0yOTcsICAgMzIwLCAgLTE2OCwNCisgICAtNTUsICAgMzU2LCAgLTI2NCwNCisgIC0zOTEsICAgIDgyLCAgLTI4NiwNCisgICAtNTEsICAgLTMxLCAgLTU1NiwNCisgIC0xNzgsICAtMzk5LCAgLTU4NiwNCisgIC0yMDUsICAgLTQ5LCAgLTM2MCwNCisgIC0zNDMsICAtMjM4LCAgLTMzNywNCisgICAyMjAsICAgNDU3LCAgICA1OCwNCisgICA1NjEsICAgNDY3LCAgIDI1OSwNCisgICAzNDAsICAgMjcwLCAgLTE2OCwNCisgICA0NTAsICAgIDc3LCAgLTI4MCwNCisgICAgNjAsICAgMTY3LCAgLTQxMywNCisgICAxMzMsICAtMjUyLCAgLTQ5MiwNCisgICAyMTYsICAgMTU3LCAgLTI5MCwNCisgICAyODIsICAgICAwLCAgLTQ5NSwNCisgIC0yMjYsICAgMjkzLCAgIDE4MywNCisgIC0xNTcsICAgMTM1LCAgIDEyMiwNCisgIC0xNTgsICAgLTU5LCAgICAzOSwNCisgIC0xMzMsICAtMTE4LCAgIC05NywNCisgIC0zMzIsICAtMzA5LCAgIDExMywNCisgIC0xNjAsICAtNDI1LCAgICAtNiwNCisgIC0xNDksICAtMjExLCAgICAyNCwNCisgICAtODAsICAtMjc3LCAgIC05MCwNCisgICAtMTEsICAgMTI1LCAgIDMzOCwNCisgICAxMzAsICAgLTcxLCAgIDQ2NSwNCisgICAgIDUsICAgLTQ1LCAgIDE4NCwNCisgICAyMzcsICAgLTk1LCAgIDI1MywNCisgIC0xMzksICAtMTk3LCAgIDI5NywNCisgICAtMTksICAtMzAwLCAgIDUxMSwNCisgICAtNjMsICAtMTUyLCAgIDEzOSwNCisgICAyNTAsICAtMjg5LCAgIDMzNiwNCisgICAxMjQsICAgMzM5LCAgLTE1MCwNCisgICAgMzQsICAgMTc2LCAgLTIwOCwNCisgICAxNzEsICAgMTY2LCAgLTExNiwNCisgICAgOTQsICAgIDM4LCAgLTIyOSwNCisgICAgNzUsICAgLTY1LCAgLTMzOSwNCisgICAtNzgsICAtMjA1LCAgLTM4NSwNCisgICAgIDAsICAgLTMwLCAgLTE2MywNCisgICAtNTYsICAtMTEwLCAgLTI0MiwNCisgICAzMjEsICAgMjQ0LCAgIDE5NCwNCisgICA1MDUsICAgMjM4LCAgICAtMSwNCisgICAzMTcsICAgMTE2LCAgICA2NSwNCisgICAzMDksICAgIDg4LCAgIC03NCwNCisgICA0NTIsICAgLTUxLCAgIC01MCwNCisgICAzMzQsICAtMjE3LCAgLTI5MCwNCisgICAyMTEsICAgIDQxLCAgLTE1MiwNCisgICAyMzgsICAgLTU1LCAgLTI2MH07DQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogMm5kIHN0YWdlIGNvZGVib29rOyAzcmQgc3BsaXQ6ICAgaXNmMl82IHRvIGlzZjJfOA0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisNCitzdGF0aWMgV29yZDE2IGRpY28yM19pc2ZbU0laRV9CSzIzKjNdID0gew0KKw0KKyAgIC0xMCwgICAxNTEsICAgMzU5LA0KKyAgIDEzNiwgICAyOTgsICAgMjIzLA0KKyAgIDI1NSwgIC0xMDQsICAgMjkwLA0KKyAgIDQyMywgICAgIDYsICAgMTgzLA0KKyAgLTI3MCwgIC0yNjksICAgLTk4LA0KKyAgIC01MiwgICAtODIsICAgIDEzLA0KKyAgIC04MiwgIC0yNzQsICAgLTk3LA0KKyAgICA5MCwgIC0yNDYsICAgLTcyLA0KKyAgLTI5OSwgICAtNzAsICAgNDIxLA0KKyAgIC04OCwgICAzNjUsICAgNDMwLA0KKyAgIDE4NywgIC0zMTgsICAgMzgxLA0KKyAgIDM4MCwgICAgMzcsICAgNDg4LA0KKyAgLTM3MywgIC0zMTYsICAgIDc5LA0KKyAgLTMwOCwgIC0xMDEsICAgICA1LA0KKyAgLTEzNSwgIC00NTEsICAgICA4LA0KKyAgICA3MiwgIC00MjEsICAtMTU0LA0KKyAgIDE4MCwgICAxNzAsICAtMTIxLA0KKyAgICA2MiwgICAxNzcsICAgLTQwLA0KKyAgIDMyNiwgICAgODAsICAtMTA1LA0KKyAgIDI0OCwgICAyNjMsICAgIC01LA0KKyAgLTE2OCwgIC0xODEsICAtMjIxLA0KKyAgICAtMiwgICAtMjMsICAtMTU4LA0KKyAgIC0xNCwgIC0xNDksICAtMTIxLA0KKyAgIDExOSwgICAtOTEsICAtMTQ3LA0KKyAgIDExOSwgICAzMzIsICAtMTUzLA0KKyAgICA0OSwgICAzMDMsICAgIDM0LA0KKyAgIDQ0MiwgICAtNTUsICAgLTY5LA0KKyAgIDIxNywgICA0NTQsICAgIDU4LA0KKyAgLTM1OSwgIC0xODcsICAtMzc1LA0KKyAgIC00MiwgICAgNTAsICAtMjc0LA0KKyAgICAtOCwgIC0yNjcsICAtMjQ5LA0KKyAgICA4NSwgICAtODYsICAtMzQ2LA0KKyAgIC03NywgICAtNDAsICAgMzQ1LA0KKyAgICA4OSwgICAxMzQsICAgMjE5LA0KKyAgIDE1NiwgICAtODAsICAgMTYwLA0KKyAgIDEwOCwgICAgNDAsICAgMTE2LA0KKyAgLTE1OCwgIC0yMDYsICAgIDI5LA0KKyAgICAgNSwgICAtMzIsICAgMTc1LA0KKyAgIC02NSwgIC0xNTgsICAgMTQ2LA0KKyAgICA1NSwgICAtNzgsICAgIDczLA0KKyAgLTExNCwgIC0yMjIsICAgMzUzLA0KKyAgIC00NywgICAgODEsICAgMjExLA0KKyAgICA0OSwgIC0xNTEsICAgMjY4LA0KKyAgIDEwNSwgICAgIDQsICAgMzAyLA0KKyAgLTI2MywgIC0xMzIsICAgMTgzLA0KKyAgLTE1MSwgICAtMjgsICAgMjAxLA0KKyAgLTE3NywgIC0zMDcsICAgMTY2LA0KKyAgIDEwMSwgIC0yMjEsICAgMTMwLA0KKyAgICA3NCwgICAgNTgsICAgLTk4LA0KKyAgICAzMiwgICAgNDQsICAgIDEzLA0KKyAgIDE5NCwgICAgMzAsICAtMTQyLA0KKyAgIDE3MCwgICAgOTYsICAgICA4LA0KKyAgLTEzNiwgIC0xMTksICAgLTkxLA0KKyAgIC02NSwgICAgIDgsICAgLTU1LA0KKyAgICAgMywgIC0xODgsICAgIDEyLA0KKyAgICA0NSwgICAtNjMsICAgLTQ5LA0KKyAgIDE0OSwgICAtMjEsICAgLTE5LA0KKyAgICAyNCwgICAxNDQsICAgIDk1LA0KKyAgIDI1NCwgICAtMjIsICAgIDYwLA0KKyAgIDE2MSwgICAxOTYsICAgIDk2LA0KKyAgLTE1OCwgICAtNjEsICAgIDQ4LA0KKyAgIC03MCwgICAgMzMsICAgIDgyLA0KKyAgIC0yMywgIC0zMjEsICAgIDU4LA0KKyAgIDE1NSwgIC0xNDcsICAgICA1LA0KKyAgLTM2NCwgICAzMjgsICAgIDc3LA0KKyAgIC0yMSwgICA0NTMsICAgMTczLA0KKyAgLTEwOCwgICAgODIsICAgNjMwLA0KKyAgIDM2NywgICAyNjMsICAgMjA4LA0KKyAgLTMwMCwgICAtNjIsICAtMTc2LA0KKyAgLTIwNSwgICAxNDMsICAtMTU4LA0KKyAgLTE2OSwgIC00MTAsICAtMjY0LA0KKyAgIDI1NywgIC0yNjksICAtMTAwLA0KKyAgLTYzNiwgICAyODksICAgIC0yLA0KKyAgLTI5MiwgICA2MjcsICAgMTczLA0KKyAgLTM4MiwgIC0zNjMsICAgMzg3LA0KKyAgIDI0OCwgICA1MjQsICAgNDQ3LA0KKyAgLTUyMSwgIC0xMTEsICAtMTA3LA0KKyAgLTM5NSwgICAxMTgsICAtMjc0LA0KKyAgLTM0MywgIC02ODAsICAtMTI1LA0KKyAgLTE3MiwgIC00NDcsICAtNjYzLA0KKyAgICA3NSwgICAxNDgsICAtMzY3LA0KKyAgIC03OSwgICAyNjMsICAgLTk0LA0KKyAgIDI0OSwgICAxNDgsICAtMjg2LA0KKyAgIDM4MCwgICAyNzEsICAtMTYyLA0KKyAgLTE0MiwgICAgLTQsICAtMTg2LA0KKyAgIC01NywgICAxMTEsICAtMTI1LA0KKyAgIC0zNSwgIC0xMDgsICAtMjU0LA0KKyAgIDEwMCwgICAgMjksICAtMjQyLA0KKyAgIC04MCwgICAzMDMsICAtMjY0LA0KKyAgIC03OCwgICA0NjQsICAgLTU3LA0KKyAgIDI0OCwgICAtMjIsICAtNDk0LA0KKyAgIDY2MSwgICA2NjIsICAgIDQ0LA0KKyAgLTE5MywgICAtNDAsICAtMzMwLA0KKyAgLTE3OCwgICAxNDUsICAtMzM3LA0KKyAgIC05MCwgIC0xOTksICAtNDAwLA0KKyAgIC00MCwgICAtMjMsICAtNDk4LA0KKyAgLTE5MiwgICAxMTQsICAgMzE1LA0KKyAgIC00MSwgICAyNDQsICAgMTkwLA0KKyAgICA4OCwgICAtOTcsICAgNDg1LA0KKyAgIDI0MSwgICAgODAsICAgMjEyLA0KKyAgLTI0NiwgICAgNDAsICAgIDg3LA0KKyAgLTE1NiwgICAxNDcsICAgMTM0LA0KKyAgICAtMiwgIC0zMzQsICAgMjM5LA0KKyAgIDMwOCwgIC0yMDMsICAgMTEwLA0KKyAgLTQ1OSwgICAyNTEsICAgNDIyLA0KKyAgLTIxOCwgICAzMTAsICAgMjI4LA0KKyAgIC04NiwgIC0zNDYsICAgNjU0LA0KKyAgIDE4NCwgICAxNzUsICAgNDI1LA0KKyAgLTQ4MSwgICAtNjMsICAgMTY5LA0KKyAgLTM0OSwgICAxMTcsICAgMTg4LA0KKyAgLTEyNSwgIC01NjAsICAgMzEwLA0KKyAgIDE1OCwgIC00MTYsICAgIDk0LA0KKyAgICA0NiwgICAxNzEsICAtMTkyLA0KKyAgIC02MywgICAxNTcsICAgIDE0LA0KKyAgIDI1NiwgICAtMzUsICAtMjcxLA0KKyAgIDMyMiwgICAxMjMsICAgIDUzLA0KKyAgLTIxNCwgICAgIDQsICAgLTc2LA0KKyAgLTE1NiwgICAgODYsICAgLTE4LA0KKyAgIDEyOCwgIC0xOTcsICAtMjMyLA0KKyAgIDI2NSwgICAtOTAsICAgLTk4LA0KKyAgLTMwOCwgICAzMzIsICAtMTQ1LA0KKyAgLTEzMSwgICAzMDgsICAgIDU4LA0KKyAgIDUwOSwgICAgNTksICAtMzM5LA0KKyAgIDU2MiwgICAxOTYsICAgLTE0LA0KKyAgLTM3OCwgICAxMDAsICAgLTQ3LA0KKyAgLTIzNCwgICAyMDIsICAgICAxLA0KKyAgIDEwNCwgIC0yNzAsICAtNDkzLA0KKyAgIDMxOSwgIC0yMTAsICAtMzI1fTsNCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAybmQgc3RhZ2UgY29kZWJvb2s7IDR0aCBzcGxpdDogICBpc2YyXzkgdG8gaXNmMl8xMQ0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCitzdGF0aWMgV29yZDE2IGRpY28yNF9pc2ZbU0laRV9CSzI0KjNdID0gew0KKw0KKyAgIC03OSwgICAtODksICAgIC00LA0KKyAgLTE3MSwgICAgNzcsICAtMjExLA0KKyAgIDE2MCwgIC0xOTMsICAgIDk4LA0KKyAgIDEyMCwgIC0xMDMsICAgMzIzLA0KKyAgICAzMiwgICAtMjIsICAtMTI5LA0KKyAgICA3MiwgICAgNzgsICAtMjY4LA0KKyAgIDE4MiwgICAtNzYsICAgLTY2LA0KKyAgIDMwOSwgICAgOTksICAtMTQ1LA0KKyAgLTIyOSwgIC0xNTcsICAgLTg0LA0KKyAgLTM4MywgICAgOTgsICAgLTcxLA0KKyAgIC05MCwgIC0zNTIsICAgIDEyLA0KKyAgLTI4NCwgIC0xNzgsICAgMTc4LA0KKyAgIC02NSwgIC0xMjUsICAtMTY2LA0KKyAgIC04NywgIC0xNzUsICAtMzUxLA0KKyAgICA0MiwgIC0xOTgsICAgLTQ4LA0KKyAgIDE1NCwgIC0xNDAsICAtMjQzLA0KKyAgIC03NywgICAgMTgsICAgMTA4LA0KKyAgIC0zOSwgICAzNTUsICAgIDkxLA0KKyAgICA4NywgICAgIDgsICAgMTU1LA0KKyAgICAtNCwgICAxNTgsICAgMjM5LA0KKyAgIDEyOCwgICAgOTUsICAgLTU0LA0KKyAgICAgNywgICAyNDYsICAtMTI0LA0KKyAgIDI1OCwgICAgMTUsICAgIDg5LA0KKyAgIDIwNiwgICAyMTYsICAgIDk4LA0KKyAgLTIwMSwgICAgIDksICAgIDE4LA0KKyAgLTMxMiwgICAyMzMsICAgMjA0LA0KKyAgIC0zOSwgIC0xNzQsICAgMTU1LA0KKyAgLTE0NCwgICAgLTksICAgMjg0LA0KKyAgIC01NywgICAgNzAsICAgLTY5LA0KKyAgLTE1NywgICAxODcsICAgIDE4LA0KKyAgICA1NCwgICAtMzAsICAgIDIzLA0KKyAgICAyNCwgICAxMzUsICAgIDU1fTsNCisNCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiAybmQgc3RhZ2UgY29kZWJvb2s7IDV0aCBzcGxpdDogICBpc2YyXzEyIHRvIGlzZjJfMTUNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIFdvcmQxNiBkaWNvMjVfaXNmW1NJWkVfQksyNSo0XSA9IHsNCisNCisgICAxNjksICAgMTQyLCAgLTExOSwgICAxMTUsDQorICAgMjA2LCAgIC0yMCwgICAgOTQsICAgMjI2LA0KKyAgLTEwNiwgICAzMTMsICAgLTIxLCAgICAxNiwNCisgICAtNjIsICAgMTYxLCAgICA3MSwgICAyNTUsDQorICAgLTg5LCAgIDEwMSwgIC0xODUsICAgMTI1LA0KKyAgICA3MiwgICAtMzAsICAtMjAxLCAgIDM0NCwNCisgIC0yNTgsICAgIDMzLCAgICAtOCwgICAgODEsDQorICAtMTA0LCAgLTE1NCwgICAgNzIsICAgMjk2LA0KKyAgIDE0NCwgICAtNjgsICAtMjY4LCAgIC0yNSwNCisgICAgODEsICAgLTc4LCAgIC04NywgICAxMDYsDQorICAgIDIyLCAgIDE1NSwgIC0xODYsICAtMTE5LA0KKyAgIC00NiwgICAtMjgsICAgIDI3LCAgICA5MSwNCisgIC0xMTQsICAgLTM3LCAgLTE3NSwgICAtMzMsDQorICAgLTk0LCAgLTIyMiwgIC0xODksICAgMTIyLA0KKyAgLTEzMiwgIC0xMTksICAtMTkxLCAgLTI3MCwNCisgIC0xNzIsICAtMTczLCAgICAxOCwgICAtNDMsDQorICAgMjc5LCAgIDEzNSwgICAtNDIsICAtMTI4LA0KKyAgIDE4NywgICAtODYsICAgMjI5LCAgLTEzOCwNCisgICAxNTksICAgMjQwLCAgIDE0MCwgICAgNDYsDQorICAgIDY5LCAgICAyNSwgICAyMjcsICAgIDc3LA0KKyAgICAyMSwgICAxMTUsICAgIDEzLCAgICAgOCwNCisgICAgNjgsICAtMjQ4LCAgIDEyNiwgICAgODEsDQorICAtMTUwLCAgIDEzNywgICAyMDcsICAgIC05LA0KKyAgLTE1NCwgIC0xMzMsICAgMjg5LCAgICA2NywNCisgICAxNDMsICAgLTM3LCAgIC04NiwgIC0zMjYsDQorICAgMTgwLCAgIC0zMiwgICAgMTksICAgLTIzLA0KKyAgICAyNiwgICAxNjgsICAgMTE2LCAgLTIzMywNCisgICAtMzIsICAgLTI2LCAgIDExOCwgICAtNzgsDQorICAgICAzLCAgICAtOCwgICAtNDUsICAtMTE1LA0KKyAgICA1NywgIC0yMTUsICAgLTU0LCAgIC04MywNCisgIC0yMDksICAgMTEyLCAgIC0yMiwgIC0xNjcsDQorICAgLTkxLCAgLTE1MSwgICAxNjgsICAtMjYyfTsNCisNCisNCisNCisgICAgICAgLyogMzYgYml0ICovDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICBpc2YgY29kZWJvb2tzOiAgdHdvLXN0YWdlIFZRIHdpdGggc3BsaXQtYnktMyBpbiAybmQgc3RhZ2UgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAxc3Qgc3RhZ2UgaXMga2VwdCB0aGUgc2FtZSBhcyB0aGUgNDYgYml0IHF1YW50aXplciAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBjb2RlYm9vayAgIHZlY3RvciBkaW1lbnNpb24gICAgbnVtYmVyIG9mIHZlY3RvcnMgICAgICAgICAgICAgICAgICoNCisgKiAgfn5+fn5+fn4gICB+fn5+fn5+fn5+fn5+fn5+ICAgIH5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAqDQorICogICAgIDFfMSAgICAgICAgICAgIDkgICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAxXzIgICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgMl8xICAgICAgICAgICAgNSAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgIDJfMiAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAyXzMgICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgNjQgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzIxX2lzZl8zNmJbU0laRV9CSzIxXzM2Yio1XSA9IHsNCisNCisgICAtNTIsICAgLTk2LCAgIDIxMiwgICAzMTUsICAgLTczLA0KKyAgICA4MiwgIC0yMDQsICAgMzYzLCAgIDEzNiwgIC0xOTcsDQorICAtMTI2LCAgLTMzMSwgICAxODMsICAgMjE4LCAgIDE0MywNCisgICAtNDksICAgLTQxLCAgIDU1NywgICAyMzAsICAgIDcyLA0KKyAgICAgMiwgICAtNzMsICAgMTYzLCAgIDM3NywgICAyMjEsDQorICAgMTMzLCAgIDExMSwgICAyNzgsICAgMjE1LCAgLTExMCwNCisgIC0xMDIsICAgLTIwLCAgIDI4NCwgICAxMTMsICAgMjczLA0KKyAgICA4NCwgICAzMTksICAgMjkwLCAgICAxOCwgICAgODUsDQorICAgLTI1LCAgICAtNSwgICAxMjUsICAgMTMyLCAgLTIwNCwNCisgICAtMzgsICAgIC01LCAgIDI4NiwgICAgLTksICAtMzU2LA0KKyAgLTE0MCwgIC0yNTYsICAgIDkyLCAgIDExNywgIC0xODksDQorICAtMTQ0LCAgIDE5MSwgICAzMTMsICAgIDUxLCAgIC05OCwNCisgICAxNjcsICAgLTEwLCAgICA0NCwgICAyNDcsICAgIDM2LA0KKyAgIDM4MSwgICAxOTcsICAgMjM4LCAgICA3NCwgICAgIDYsDQorICAgIDM4LCAgLTQwOCwgICAgMjksICAgIC0zLCAgIC04NSwNCisgICAgOTIsICAgMjY2LCAgIDE1NywgICAtMjUsICAtMjAwLA0KKyAgIDE2MSwgIC0xMjEsICAgIDcwLCAgICA4NCwgIC0xNDAsDQorICAgLTE2LCAgIC04NiwgICAxMTIsICAgLTk0LCAgLTE4OSwNCisgIC0yNjksICAtMjcwLCAgIDM1MSwgICAxMDcsICAgLTI0LA0KKyAgIC02OCwgICAtNjcsICAgNDkyLCAgLTEwMywgIC0xNTUsDQorICAgLTUzLCAgLTEzMSwgICAgNjIsICAgMTIyLCAgICAxMCwNCisgICAxMzUsICAgIDg0LCAgIDI4MywgICAtNTUsICAtMTIwLA0KKyAgIC0xMiwgIC0yMTksICAgMzMxLCAgIC04MSwgICAxNjcsDQorICAgMjIwLCAgLTEzNiwgICAxNDcsICAtMTcyLCAgIC00MiwNCisgICAxNDAsICAgLTk1LCAgLTEwOSwgICAtODgsICAtMTk0LA0KKyAgICAgMCwgICAgLTIsICAgIC00LCAgIC0zMywgIC0zODEsDQorICAgLTY2LCAgLTIxNywgICAxNTIsICAtMTg2LCAgLTQwMiwNCisgICAyNDQsICAgMTA4LCAgIDE1NiwgIC0xNDAsICAtMzk1LA0KKyAgIDExMywgIC0xMzYsICAtMTk2LCAgIDExMCwgICAtMjQsDQorICAgMjE0LCAgIDExOCwgICAgMTEsICAgLTY0LCAgLTEzMSwNCisgIC0xMTAsICAtMjg2LCAgICAtNiwgIC0zMzIsICAgIDE2LA0KKyAgICA5NCwgICAgOTcsICAgIDc5LCAgLTI5MSwgIC0yMDUsDQorICAgIC01LCAgIC0zOSwgICAtMjAsICAgMjUyLCAgIC05NiwNCisgICAgNzYsICAgMTc0LCAgIDEwMSwgICAxNjMsICAgIDYxLA0KKyAgIC02OSwgIC0yMzksICAgLTU1LCAgIDM5OSwgICAgIDYsDQorICAtMTE1LCAgIDMxOSwgICAxNjQsICAgMjc1LCAgIDE5NiwNCisgICAtMTUsICAgIDM2LCAgIC00NywgICAzMzEsICAgMTIxLA0KKyAgIDIyNiwgICAyMDksICAgMjcxLCAgIDMyNSwgICAxODQsDQorICAgIDEzLCAgIC04MCwgIC0yMTgsICAgNDcxLCAgIDM1MywNCisgICAyODgsICAgMzc4LCAgICAxNiwgICAtNTEsICAgMjUxLA0KKyAgIDE3NCwgICAxMTYsICAgIDUyLCAgIDE0OSwgIC0yNzksDQorICAgMjM1LCAgIDI3NiwgICAgMzksICAgMTIwLCAgIC00OCwNCisgICAgIDAsICAtMTA4LCAgLTEwOCwgICAyNDEsICAtMzM5LA0KKyAgIC05MywgICA1MzQsICAgIDQ1LCAgICAzMywgICAtODcsDQorICAgMTk0LCAgIDE0OSwgICAtNzEsICAgNDA1LCAgIC00NCwNCisgICA0MDksICAgMzcwLCAgICA4MSwgIC0xODYsICAtMTU0LA0KKyAgICAyNSwgIC0xMDIsICAtNDQ4LCAgIDEyNCwgIC0xNzMsDQorICAgIDIyLCAgIDQwOCwgIC0xMTAsICAtMzEwLCAgLTIxNCwNCisgICAtMjYsICAgIDIzLCAgIC04MywgICAxMTQsICAgIDE0LA0KKyAgLTExMCwgICAxNjQsICAgIDUyLCAgIDIyMywgICAtODIsDQorICAgIDM3LCAgIC0yNSwgIC0yNjMsICAgMzA2LCAgIC0xNSwNCisgIC00NjYsICAgNDE1LCAgIDI5MiwgICAxNjUsICAgLTE4LA0KKyAgICAyOSwgICAtMTksICAtMTcxLCAgIDE1NSwgICAxODIsDQorICAgMTc5LCAgIDE0NCwgICAtMjcsICAgMjMxLCAgIDI1OCwNCisgIC0xMDMsICAtMjQ3LCAgLTM5NiwgICAyMzgsICAgMTEzLA0KKyAgIDM3NSwgIC0xNTQsICAtMTA5LCAgICAtNCwgICAxNTYsDQorICAgIDk4LCAgICA4NSwgIC0yOTIsICAgIC01LCAgLTEyNCwNCisgICAxMTYsICAgMTM5LCAgLTExNiwgICAtOTgsICAtMjk0LA0KKyAgIC0xNCwgICAtODMsICAtMjc4LCAgLTExNywgIC0zNzgsDQorICAgMTA2LCAgICAzMywgIC0xMDYsICAtMzQ0LCAgLTQ4NCwNCisgICAxMTksICAgIDE3LCAgLTQxMiwgICAxMzgsICAgMTY2LA0KKyAgIDM4NCwgICAxMDEsICAtMjA0LCAgICA4OCwgIC0xNTYsDQorICAtMTIxLCAgLTI4NCwgIC0zMDAsICAgIC0xLCAgLTE2NiwNCisgICAyODAsICAgIDMzLCAgLTE1MiwgIC0zMTMsICAgLTgxLA0KKyAgIC0zNywgICAgMjIsICAgMjI5LCAgIDE1MywgICAgMzcsDQorICAgLTYwLCAgIC04MywgICAyMzYsICAgIC04LCAgIC00MSwNCisgIC0xNjksICAtMjI4LCAgIDEyNiwgICAtMjAsICAgMzYzLA0KKyAgLTIzNSwgICAgMTcsICAgMzY0LCAgLTE1NiwgICAxNTYsDQorICAgLTI1LCAgIC0zMCwgICAgNzIsICAgMTQ0LCAgIDE1NiwNCisgICAxNTMsICAgLTI2LCAgIDI1NiwgICAgOTcsICAgMTQ0LA0KKyAgIC0yMSwgICAtMzcsICAgIDQ4LCAgIC02NSwgICAyNTAsDQorICAgIDYzLCAgICA3NywgICAyNzMsICAtMTI4LCAgIDEyNCwNCisgIC0xMjksICAgLTI2LCAgICA0MCwgICAgIDksICAtMTE1LA0KKyAgICAtNiwgICAgODIsICAgIDM4LCAgIC05MCwgIC0xODIsDQorICAtMzM2LCAgIC0xMywgICAgMjgsICAgMTU4LCAgICA5MSwNCisgICAtMzAsICAgMjQxLCAgIDEzNywgIC0xNzAsICAgLTE3LA0KKyAgIDE0NiwgICAgMTQsICAgLTExLCAgICAzMywgICAgNjEsDQorICAgMTkyLCAgIDE5NywgICAgNTQsICAgLTg0LCAgICA4NSwNCisgICAgMjMsICAtMjAwLCAgIC03OCwgICAtMjksICAgMTQwLA0KKyAgIDEyMiwgICAyMzcsICAgMTA2LCAgLTM0MSwgICAxMzYsDQorICAgLTU3LCAgLTE0MiwgICAtODUsICAgLTE2LCAgIC03NCwNCisgICAtNTksICAgLTkwLCAgICAtOCwgIC0xODcsICAgLTIwLA0KKyAgLTIxMSwgIC0yNjcsICAgMjE2LCAgLTE3OSwgIC0xMTAsDQorICAgLTUwLCAgICAtNywgICAyMjAsICAtMjY3LCAgIC03MCwNCisgICAtNTcsICAgLTQyLCAgIC0xNywgICAtMTUsICAgIDcxLA0KKyAgICAzMiwgICAgMjEsICAgIDYzLCAgLTEzNywgICAgMzMsDQorICAtMTM3LCAgLTE3NSwgICAxMDQsICAgLTY4LCAgICA5NywNCisgICAtNjcsICAgLTQzLCAgIDEzMywgIC0zMDEsICAgMjIxLA0KKyAgLTExNiwgIC0yMDAsICAgLTgxLCAgIC05MiwgIC0yNzIsDQorICAgLTY0LCAgIC00MSwgICAtNTQsICAtMjQ0LCAgLTIyMCwNCisgIC0yODcsICAtMjQyLCAgIC01MCwgICAtODcsICAgLTg5LA0KKyAgLTI0NSwgICAyMzYsICAgMTAyLCAgLTE2NiwgIC0yOTUsDQorICAgIDY2LCAgICAyNCwgIC0xNjIsICAgLTcxLCAgICA5NSwNCisgICAgNjYsICAgMTM2LCAgIC05MCwgIC0yMjAsICAgLTM2LA0KKyAgIC05OCwgIC0xNjEsICAtMjIyLCAgLTE4OCwgICAgMjksDQorICAgLTE4LCAgICAxOCwgICAtMTksICAtNDE1LCAgICAgOSwNCisgICAgNDksICAgIDYxLCAgIDEwMCwgICAgMzksICAgLTU2LA0KKyAgLTExMSwgICAgODIsICAgMTM1LCAgIC0zMSwgICAgNTIsDQorICAgLTkwLCAgLTE1MywgICAtOTMsICAgMTg5LCAgIDE4MiwNCisgIC0yMTQsICAgMjk1LCAgIDExOSwgICAtNzQsICAgMjg0LA0KKyAgICAgMiwgICAxMzcsICAgIDM3LCAgICA0NywgICAxODIsDQorICAgIDkyLCAgIDExNywgICAxODQsICAgLTUzLCAgIDM3MywNCisgICAtMjEsICAgLTE0LCAgIC0zNSwgICAxMzYsICAgMzkxLA0KKyAgIDE0NiwgICAxMjksICAtMTY0LCAgIC0yOCwgICAzMzMsDQorICAgIDkyLCAgICA4MCwgICAtODQsICAgMTAwLCAgLTEzNCwNCisgICAgLTgsICAgMjE3LCAgIC0zMiwgICAgIDMsICAgLTQ3LA0KKyAgLTE1MSwgICAyNTEsICAtMjE1LCAgIDE0MiwgICAgOTIsDQorICAtMjI0LCAgIDMxMCwgIC0xNzIsICAtMjc1LCAgICA5OCwNCisgICAxNTksICAgMTU1LCAgLTE3NywgICAxMTIsICAgIDUzLA0KKyAgIDIwNSwgICAgMjcsICAgICA4LCAgLTI0MCwgICAxOTIsDQorICAgMTY5LCAgIDEyMCwgIC0zMTksICAtMjAxLCAgIDEwNiwNCisgICAgMTEsICAgIDM2LCAgIC04NiwgIC0yMzcsICAgNDU1LA0KKyAgLTEwOSwgIC0xNTQsICAtMTYzLCAgIDE3NCwgICAtNTUsDQorICAgLTM4LCAgICAzMiwgIC0xMDEsICAgLTc4LCAgIC01OSwNCisgIC0yMDUsICAtMzIxLCAgIC05NywgICAgNjksICAgIDc5LA0KKyAgLTMxMCwgICAgNDQsICAgIDE4LCAgLTE4NSwgICAgMzQsDQorICAtMTE1LCAgIC0yMCwgIC0xNDgsICAgLTM5LCAgIDIwMywNCisgICAtMjksICAgMTU0LCAgIC0zMCwgIC0xNTgsICAgMTY2LA0KKyAgIC00NSwgIC0xMzEsICAtMzE3LCAgIC0yNCwgICAzNjMsDQorICAtMTY1LCAgLTIwNSwgIC0xMTIsICAtMjIyLCAgIDI2NSwNCisgICAtMzIsICAgLTQ0LCAgLTE1MCwgICAgNTQsICAtMTkzLA0KKyAgICAtNiwgICAtMzgsICAtMjU1LCAgLTE2OSwgIC0xMTUsDQorICAtMjY2LCAgICA4NywgIC0xODksICAgLTM2LCAgLTE2OSwNCisgICAtNjAsICAgLTg3LCAgLTI2NiwgIC00MzYsICAtMTcwLA0KKyAgIC02OCwgICAtODEsICAtMjc4LCAgICAyNCwgICAgMzgsDQorICAgLTIzLCAgIC0xOSwgIC0xNTUsICAtMjU2LCAgIDE0MSwNCisgICAtNjEsICAtMjI2LCAgLTU2NSwgIC0xNzUsICAgIDcxLA0KKyAgICAgOSwgICAtMjksICAtMjM3LCAgLTUxNSwgICAyNjN9Ow0KKw0KK3N0YXRpYyBXb3JkMTYgZGljbzIyX2lzZl8zNmJbU0laRV9CSzIyXzM2Yio0XSA9IHsNCisNCisgIC0yOTgsICAgIC02LCAgICA5NSwgICAgMzEsDQorICAtMjEzLCAgIC04NywgIC0xMjIsICAgMjYxLA0KKyAgICAgNCwgICAtNDksICAgMjA4LCAgICAxNCwNCisgIC0xMjksICAtMTEwLCAgICAzMCwgICAxMTgsDQorICAtMjE0LCAgIDI1OCwgICAxMTAsICAtMjM1LA0KKyAgIC00MSwgICAtMTgsICAtMTI2LCAgIDEyMCwNCisgICAxMDMsICAgIDY1LCAgIDEyNywgICAtMzcsDQorICAgMTI2LCAgIC0zNiwgICAtMjQsICAgIDI1LA0KKyAgLTEzOCwgICAtNjcsICAtMjc4LCAgLTE4NiwNCisgIC0xNjQsICAtMTk0LCAgLTIwMSwgICAgNzgsDQorICAtMjExLCAgIC04NywgICAtNTEsICAtMjIxLA0KKyAgLTE3NCwgICAtNzksICAgLTk0LCAgIC0zOSwNCisgICAgMjMsICAgIC02LCAgLTE1NywgIC0yNDAsDQorICAgIDIyLCAgLTExMCwgIC0xNTMsICAgLTY4LA0KKyAgIDE0OCwgICAgLTUsICAgIC0yLCAgLTE0OSwNCisgICAgLTEsICAtMTM1LCAgIC0zOSwgIC0xNzksDQorICAgIDY4LCAgIDM2MCwgIC0xMTcsICAgLTE1LA0KKyAgIDEzNywgICAgNDcsICAtMjc4LCAgIDE0NiwNCisgICAxMzYsICAgMjYwLCAgIDEzNSwgICAgNjUsDQorICAgIDYxLCAgIDExNiwgICAtNDUsICAgIDk3LA0KKyAgIDIzMSwgICAzNzksICAgIDg3LCAgLTEyMCwNCisgICAzMzgsICAgMTc3LCAgLTI3MiwgICAgIDMsDQorICAgMjY2LCAgIDE1NiwgICAgMjgsICAgLTY5LA0KKyAgIDI2MCwgICAgODQsICAgLTg1LCAgICA4NiwNCisgIC0yNjYsICAgMTU0LCAgLTI1NiwgIC0xODIsDQorICAgLTE3LCAgIC02NSwgIC0zMDQsICAgIC02LA0KKyAgIC00MCwgICAxNzUsICAtMTUxLCAgLTE4MCwNCisgICAtMjcsICAgIDI3LCAgIC04NywgICAtNjMsDQorICAgMTIxLCAgIDExNCwgIC0xNjYsICAtNDY5LA0KKyAgIDE1OSwgICAtNjYsICAtMzIzLCAgLTIzMSwNCisgICAyMTQsICAgMTUyLCAgLTE0MSwgIC0yMTIsDQorICAgMTM3LCAgICAzNiwgIC0xODQsICAgLTUxLA0KKyAgLTI4MiwgIC0yMzcsICAgIDQwLCAgICAxMCwNCisgICAtNDgsICAtMjM1LCAgIC0zNywgICAyNTEsDQorICAgLTU0LCAgLTMyMywgICAxMzYsICAgIDI5LA0KKyAgIC04OCwgIC0xNzQsICAgMjEzLCAgIDE5OCwNCisgIC0zOTAsICAgIDk5LCAgIC02MywgIC0zNzUsDQorICAgMTA3LCAgLTE2OSwgIC0xNjQsICAgNDI0LA0KKyAgICA2OSwgIC0xMTEsICAgMTQxLCAgLTE2NywNCisgICAgNzQsICAtMTI5LCAgICA2NSwgICAxNDQsDQorICAtMzUzLCAgLTIwNywgIC0yMDUsICAtMTA5LA0KKyAgLTE2MCwgIC0zODYsICAtMzU1LCAgICA5OCwNCisgIC0xNzYsICAtNDkzLCAgIC0yMCwgIC0xNDMsDQorICAtMjUyLCAgLTQzMiwgICAgLTIsICAgMjE2LA0KKyAgIC05MCwgIC0xNzQsICAtMTY4LCAgLTQxMSwNCisgICAgMTMsICAtMjg0LCAgLTIyOSwgIC0xNjAsDQorICAgLTg3LCAgLTI3OSwgICAgMzQsICAtMjUxLA0KKyAgIC03NSwgIC0yNjMsICAgLTU4LCAgIC00MiwNCisgICA0MjAsICAgIDUzLCAgLTIxMSwgIC0zNTgsDQorICAgMzg0LCAgIC0zNSwgIC0zNzQsICAgMzk2LA0KKyAgICA2OCwgIC0yMjgsICAgMzIzLCAgICAtMiwNCisgICAxNjcsICAtMzA3LCAgIDE5MiwgICAxOTQsDQorICAgNDU5LCAgIDMyOSwgICAgLTUsICAtMzMyLA0KKyAgIDM3NSwgICAgNzksICAgIC03LCAgIDMxMywNCisgICAyODIsICAtMTI0LCAgIDIwMCwgICAtOTIsDQorICAgMjcxLCAgLTE2MiwgICAtNzAsICAgMTgwLA0KKyAgLTE1NywgIC0yOTgsICAtNTE0LCAgLTMwOSwNCisgICAgNTgsICAtMTYzLCAgLTU0NiwgICAgMTgsDQorICAgMTI0LCAgLTM2NCwgICAxNjcsICAtMjM4LA0KKyAgICA4MywgIC00MTEsICAtMTE3LCAgICA5NiwNCisgICAxNDAsICAtMTEyLCAgLTM4OCwgIC02MjQsDQorICAgMjU5LCAgLTEzMywgIC0zMTcsICAgIDQxLA0KKyAgIDE2MywgIC0xMzAsICAgLTY0LCAgLTMzNCwNCisgICAyMjYsICAtMTY1LCAgLTEyNCwgIC0xMTAsDQorICAtNDY2LCAgIC02MSwgICAgIDYsICAgMjI5LA0KKyAgLTE1MywgICAyMDUsICAtMTQ1LCAgIDI0MiwNCisgIC0xNTksICAgIDQ4LCAgIDE5NSwgICAxNDgsDQorICAgLTU4LCAgICAyOCwgICAgMzEsICAgMjc5LA0KKyAgLTMwMywgICAxODUsICAgMjc5LCAgICAtNCwNCisgICAtNjEsICAgMTk3LCAgICA1OSwgICAgODYsDQorICAtMTE0LCAgIDEyMywgICAxNjgsICAgLTUyLA0KKyAgICAzNSwgICAgMzYsICAgMTAwLCAgIDEyNiwNCisgIC00MDcsICAgMTAyLCAgIC03NywgICAtNDAsDQorICAtMzM4LCAgICAtMSwgIC0zNDIsICAgMTU2LA0KKyAgLTE3OSwgICAxMDUsICAgLTM0LCAgIC05NywNCisgIC0xODUsICAgIDg0LCAgIC0zNSwgICAxMDgsDQorICAtMTMzLCAgIDEwNywgICAtOTEsICAtMzU3LA0KKyAgLTE4MCwgICAgNTQsICAtMjI5LCAgICAyNCwNCisgICAtNDQsICAgIDQ3LCAgICA0NywgIC0xODIsDQorICAgLTY2LCAgICAxMywgICAgNDUsICAgICA0LA0KKyAgLTMzOSwgICAyNTEsICAgIDY0LCAgIDIyNiwNCisgICAtNDIsICAgMTAxLCAgLTM1MCwgICAyNzUsDQorICAgLTk5LCAgIDM5OCwgICAxNDIsICAgMTIxLA0KKyAgIDExMSwgICAgMTIsICAtMTAyLCAgIDI2MCwNCisgICAgIDAsICAgNTA1LCAgIDI2MCwgICAtOTQsDQorICAgMTYxLCAgIDI4NSwgICAtOTYsICAgMjI0LA0KKyAgICAtNCwgICAyMDYsICAgMzE0LCAgICAzMywNCisgICAxNjcsICAgMTM5LCAgICA4OCwgICAyMDQsDQorICAtMjM1LCAgIDMxNiwgICAtNjAsICAgLTI1LA0KKyAgICAtOCwgIC0xNTAsICAtMzEyLCAgIDIwMSwNCisgICAtMzYsICAgMjkyLCAgICA2MSwgIC0xMDQsDQorICAgLTQwLCAgIDE3NCwgIC0xNjIsICAgIDQyLA0KKyAgIC0yMSwgICA0MDIsICAgLTI5LCAgLTM1MSwNCisgICAgMjEsICAgMTUyLCAgLTM2MCwgICAtOTMsDQorICAgIDU3LCAgIDE5MSwgICAyMTIsICAtMTk2LA0KKyAgICA3NiwgICAxNTgsICAgLTIxLCAgIC02OSwNCisgIC0zMjgsICAtMTg1LCAgIDMzMSwgICAxMTksDQorICAgLTUzLCAgIDI4NSwgICAgNTYsICAgMzM3LA0KKyAgLTEwNywgICAtMjQsICAgNDA1LCAgICAyOSwNCisgICAtMTgsICAgMTM3LCAgIDI3MiwgICAyNzcsDQorICAtMjU1LCAgICAyMiwgICAxNzMsICAtMTkxLA0KKyAgIDI5NSwgICAzMjIsICAgMzI1LCAgIDMwMiwNCisgICAgMjEsICAgLTI3LCAgIDMzMiwgIC0xNzgsDQorICAgMTE5LCAgICAxMywgICAyNzEsICAgMTI5LA0KKyAgLTQ1NSwgIC0xODAsICAgMTE2LCAgLTE5MSwNCisgIC0yMjcsICAgIDYyLCAgLTE0OCwgICA1MjQsDQorICAtMTc2LCAgLTI4NywgICAyODIsICAtMTU3LA0KKyAgLTI0MywgICAgMTMsICAgMTk5LCAgIDQzMCwNCisgICAtNTksICAgLTQ5LCAgIDExNSwgIC0zNjUsDQorICAgIDcyLCAgLTE3MiwgIC0xMzcsICAgIDkzLA0KKyAgLTEzOCwgIC0xMjYsICAgMTQxLCAgIC04NCwNCisgICAgIDUsICAtMTI0LCAgICAzOCwgICAtMjAsDQorICAtMjU4LCAgIDMxMSwgICA2MDEsICAgMjEzLA0KKyAgICA5NCwgICAxMzAsICAgLTYxLCAgIDUwMiwNCisgICAgLTEsICAtMTU3LCAgIDQ4NSwgICAzMTMsDQorICAgMTQ2LCAgIC03NCwgICAxNTgsICAgMzQ1LA0KKyAgIDI3NiwgICAxMzUsICAgMjgwLCAgIC01NywNCisgICA0OTAsICAgMjUyLCAgICA5OSwgICAgNDMsDQorICAgMjY3LCAgIC03NCwgICA0MjksICAgMTA1LA0KKyAgIDI3OCwgICAtMjMsICAgMTE5LCAgICA5NCwNCisgIC01NDIsICAgNDg4LCAgIDI1NywgIC0xMTUsDQorICAgLTg0LCAgLTI0NCwgIC00MzgsICAgNDc4LA0KKyAgLTExMywgIC01NDUsICAgMzg3LCAgIDEwMSwNCisgICAtOTUsICAtMzA2LCAgIDExMSwgICA0OTgsDQorICAgIDk1LCAgIDE2NiwgICAgMjIsICAtMzAxLA0KKyAgIDQyMCwgICAtMTUsICAgLTU4LCAgIC03OCwNCisgICAyNzAsICAgIDI5LCAgIDEyMiwgIC0yODIsDQorICAgMTYwLCAgLTI0MCwgICAgNTAsICAgLTM4fTsNCisNCitzdGF0aWMgV29yZDE2IGRpY28yM19pc2ZfMzZiW1NJWkVfQksyM18zNmIqN10gPSB7DQorDQorICAgIDgxLCAgIC0xOCwgICAgNjgsICAgLTI3LCAgLTEyMiwgIC0yODAsICAgIC00LA0KKyAgICA0NSwgIC0xNzcsICAgMjA5LCAgIC0zMCwgIC0xMzYsICAgLTc0LCAgIDEzMSwNCisgICAtNDQsICAgMTAxLCAgIC03NSwgICAtODgsICAgLTQ4LCAgLTEzNywgICAtNTQsDQorICAtMjQ1LCAgIC0yOCwgICAgNjMsICAgLTE4LCAgLTExMiwgIC0xMDMsICAgIDU4LA0KKyAgIC03OSwgICAgLTYsICAgMjIwLCAgIC02NSwgICAxMTQsICAgLTM1LCAgIC01MCwNCisgICAxMDksICAgLTY1LCAgIDE0MywgIC0xMTQsICAgMTI5LCAgICA3NiwgICAxMjUsDQorICAgMTY2LCAgICA5MCwgICAtNjEsICAtMjQyLCAgIDE4NiwgICAtNzQsICAgLTQzLA0KKyAgIC00NiwgICAtOTIsICAgIDQ5LCAgLTIyNywgICAgMjQsICAtMTU1LCAgICAzOSwNCisgICAgNjcsICAgIDg1LCAgICA5OSwgICAtNDIsICAgIDUzLCAgLTE4NCwgIC0yODEsDQorICAgMTQyLCAgLTEyMiwgICAgIDAsICAgIDIxLCAgLTE0MiwgICAtMTUsICAgLTE3LA0KKyAgIDIyMywgICAgOTIsICAgLTIxLCAgIC00OCwgICAtODIsICAgLTE0LCAgLTE2NywNCisgICAgNTEsICAgLTM3LCAgLTI0MywgICAtMzAsICAgLTkwLCAgICAxOCwgICAtNTYsDQorICAgIDU0LCAgIDEwNSwgICAgNzQsICAgIDg2LCAgICA2OSwgICAgMTMsICAtMTAxLA0KKyAgIDE5NiwgICAgNzIsICAgLTg5LCAgICA0MywgICAgNjUsICAgIDE5LCAgICAzOSwNCisgICAxMjEsICAgIDM0LCAgIDEzMSwgICAtODIsICAgIDI1LCAgIDIxMywgIC0xNTYsDQorICAgMTAxLCAgLTEwMiwgIC0xMzYsICAgLTIxLCAgICA1NywgICAyMTQsICAgIDIyLA0KKyAgICAzNiwgIC0xMjQsICAgMjA1LCAgIDIwNCwgICAgNTgsICAtMTU2LCAgIC04MywNCisgICAgODMsICAtMTE3LCAgIDEzNywgICAxMzcsICAgIDg1LCAgIDExNiwgICAgNDQsDQorICAgLTkyLCAgLTE0OCwgICAtNjgsICAgIDExLCAgLTEwMiwgIC0xOTcsICAtMjIwLA0KKyAgIC03NiwgIC0xODUsICAgLTU4LCAgIDEzMiwgICAtMjYsICAtMTgzLCAgICA4NSwNCisgICAgLTcsICAgLTMxLCAgICAtMiwgICAgMjMsICAgMjA1LCAgLTE1MSwgICAgMTAsDQorICAgLTI3LCAgIC0zNywgICAgLTUsICAgLTE4LCAgIDI5MiwgICAxMzEsICAgICAxLA0KKyAgIDExNywgIC0xNjgsICAgICA5LCAgIC05MywgICAgODAsICAgLTU5LCAgLTEyNSwNCisgIC0xODIsICAtMjQ0LCAgICA5OCwgICAtMjQsICAgMTM1LCAgIC0yMiwgICAgOTQsDQorICAgMjIxLCAgICA5NywgICAxMDYsICAgIDQyLCAgICA0MywgIC0xNjAsICAgIDgzLA0KKyAgICAyNSwgICAtNjQsICAgLTIxLCAgICAgNiwgICAgMTQsICAgLTE1LCAgIDE1NCwNCisgICAxMjYsICAgIDE1LCAgLTE0MCwgICAxNTAsICAgLTEwLCAgLTIwNywgIC0xMTQsDQorICAgIDc5LCAgIC02MywgIC0yMTEsICAgLTcwLCAgIC0yOCwgIC0yMTcsICAgMTY1LA0KKyAgICA0NiwgICAgMzgsICAgLTIyLCAgIDI4MSwgICAxMzIsICAgLTYyLCAgIDEwOSwNCisgICAxMTIsICAgIDU0LCAgLTExMiwgICAtOTMsICAgMjA4LCAgICAyNywgICAyOTYsDQorICAgMTE1LCAgICAxMCwgIC0xNDcsICAgIDQxLCAgIDIxNiwgICAgNDIsICAtMjc2LA0KKyAgICA1MCwgIC0xMTUsICAtMjU0LCAgIDE2NywgICAxMTcsICAgIC0yLCAgICA2MSwNCisgICAgMTcsICAgMTQ0LCAgICAzNCwgICAtNzIsICAtMTg2LCAgLTE1MCwgICAyNzIsDQorICAgLTI5LCAgIC02NiwgICAtODksICAgLTk1LCAgLTE0OSwgICAxMjksICAgMjUxLA0KKyAgIDEyMiwgICAgIDAsICAgLTUwLCAgLTIzNCwgICAtOTEsICAgIDM2LCAgICAyNiwNCisgIC0xMDUsICAtMTAyLCAgIC04OCwgIC0xMjEsICAtMjM2LCAgICAtNywgICAtMTEsDQorICAtMjA0LCAgIDEwOSwgICAgIDUsICAtMTkxLCAgIDEwNSwgICAtMTUsICAgMTYzLA0KKyAgIC04MCwgICAgMzIsICAgLTI0LCAgLTIwOSwgICAgNDEsICAgMjk0LCAgICA3MCwNCisgIC0xMDYsICAgLTk0LCAgLTIwNCwgIC0xMTgsICAgMTIwLCAgIC01MCwgICAtMzcsDQorICAgLTgyLCAgLTI0MSwgICAgNDYsICAtMTMxLCAgIC0yOSwgICAxNTAsICAgLTU1LA0KKyAgICAzMywgICAxNTUsICAgMTIwLCAgIC04OSwgICAgLTgsICAgICA3LCAgICA2MiwNCisgICAyMTMsICAgIDgyLCAgICA2MSwgICAgMTgsICAtMTYxLCAgIDE0NCwgICAxNTIsDQorICAgIDMwLCAgIDEzMSwgICAgNjUsICAgLTg3LCAgLTI1NSwgICAtMTcsICAtMTA3LA0KKyAgICAtOCwgICAgODUsICAgLTY0LCAgICA1MSwgIC0xNjIsICAgMjIzLCAgIC01MywNCisgIC0xMzQsICAgMjYxLCAgICA2OSwgICAtNTYsICAgMjE4LCAgICA3MiwgIC0xMTEsDQorICAgICAyLCAgIDE1NSwgIC0xMTMsICAgLTg3LCAgICA0OSwgICAgODUsICAgLTI4LA0KKyAgLTE2MywgICAgNDIsICAgIC0xLCAgLTE5NiwgICAgIDcsICAgIDM5LCAgLTI0NSwNCisgICAgMTQsICAtMTM3LCAgIC03OSwgICAgMTEsICAtMTYwLCAgIDIwMiwgIC0yOTMsDQorICAgLTk0LCAgICAzMywgICAyMDgsICAgMTAwLCAgICA1NiwgICAtNDQsICAgMzI2LA0KKyAgIC03OCwgICAtNDEsICAgMjMyLCAgICAxMywgIC0xNDIsICAgMjI3LCAgICA4MCwNCisgICAtMTYsICAgLTg3LCAgIDIwMSwgICAgMzMsICAtMTMzLCAgICAxNSwgIC0xODMsDQorICAgLTU4LCAgLTE5MiwgICAtNDcsICAgMTg0LCAgLTEyOCwgICAxMzMsICAgIDk5LA0KKyAgLTIwNSwgICAgMTEsICAtMTU1LCAgICA3OCwgICAgNTIsICAgIDcyLCAgIDE0MSwNCisgIC0yNDYsICAgIDI2LCAgICA5OSwgICAxNTEsICAgIDU5LCAgIDExNSwgICAtNjQsDQorICAgLTc5LCAgIC00NywgICAtMTYsICAgLTE0LCAgICAgNiwgICAgNDcsICAgLTQzLA0KKyAgIC03MiwgIC0xNzgsICAgLTI3LCAgIDE2MiwgICAxMTIsICAgIDQzLCAgLTE3NCwNCisgIC0xNzUsICAgMjM4LCAgIDE4NiwgICAgNzEsICAgLTU0LCAgLTE4OCwgICAtNzYsDQorICAtMjI1LCAgIDIzMywgICAgMzksICAgLTM5LCAgLTE1OCwgICAxMjIsICAgIDQ0LA0KKyAgIC0yNiwgICAgNDMsICAgIDg0LCAgIDEzMCwgICAtOTMsICAgLTUxLCAgICAyMiwNCisgICAgIDMsICAgIDkyLCAgLTE1MCwgICAxMzYsICAtMTgyLCAgIC01NywgICAgOTcsDQorICAtMTMxLCAgIDE3OSwgICAtNzgsICAgIDgwLCAgICA5MSwgIC0xNjUsICAgIDkwLA0KKyAgICAtMiwgICAxNDgsICAgIDE1LCAgIDEzMCwgICAgNjUsICAgMTc1LCAgIDExNywNCisgIC0xMzgsICAgMTE0LCAgLTEzNywgICAxMzIsICAgICAzLCAgIC0xMCwgIC0xODYsDQorICAgMTQwLCAgICAtNCwgICAtMzcsICAgMjU0LCAgIC02MiwgICAgOTIsICAtMTA5fTsNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3N0cmVhbS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJjMTNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaApAQCAtMCwwICsxLDQ3IEBACisNCisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0ZpbGU6CQlzdHJlYW0uaA0KKw0KK0NvbnRhaW5zOiAgICAgICBWT01FIEFQSSBCdWZmZXIgT3BlcmF0b3IgSW1wbGVtZW50IEhlYWRlcg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaWZuZGVmIF9fU1RSRUFNX0hfXw0KKyNkZWZpbmUgX19TVFJFQU1fSF9fDQorDQorI2luY2x1ZGUgInZvTWVtLmgiDQorI2RlZmluZSBGcmFtZV9NYXhzaXplICAxMDI0ICogMiAgLy9Xb3JrIEJ1ZmZlciAxMEsgDQorI2RlZmluZSBGcmFtZV9NYXhCeXRlICA2NDAgICAgICAgIC8vQU1SX1dCIEVuY29kZXIgb25lIGZyYW1lIDMyMCBzYW1wbGVzID0gNjQwIEJ5dGVzDQorI2RlZmluZSBNSU4oYSxiKQkgKChhKSA8IChiKT8gKGEpIDogKGIpKQ0KKw0KK3R5cGVkZWYgc3RydWN0ew0KKwl1bnNpZ25lZCBjaGFyICpzZXRfcHRyOw0KKwl1bnNpZ25lZCBjaGFyICpmcmFtZV9wdHI7DQorCXVuc2lnbmVkIGNoYXIgKmZyYW1lX3B0cl9iazsNCisJaW50ICBzZXRfbGVuOw0KKwlpbnQgIGZyYW1lYnVmZmVyX2xlbjsgDQorCWludCAgZnJhbWVfc3RvcmVsZW47DQorCWludCAgdXNlZF9sZW47DQorfUZyYW1lU3RyZWFtOw0KKw0KK3ZvaWQgdm9BV0JfVXBkYXRlRnJhbWVCdWZmZXIoRnJhbWVTdHJlYW0gKnN0cmVhbSwgVk9fTUVNX09QRVJBVE9SICpwTWVtT1ApOw0KK3ZvaWQgdm9BV0JfSW5pdEZyYW1lQnVmZmVyKEZyYW1lU3RyZWFtICpzdHJlYW0pOw0KK3ZvaWQgdm9BV0JfRmx1c2hGcmFtZUJ1ZmZlcihGcmFtZVN0cmVhbSAqc3RyZWFtKTsNCisjZW5kaWYgLy9fX1NUUkVBTV9IX18NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGMwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWYuaApAQCAtMCwwICsxLDY1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICAgRmlsZSAgICAgICAgICAgICA6IHR5cGVkZWYuYw0KKyogICAgICBQdXJwb3NlICAgICAgICAgIDogQmFzaWMgdHlwZXMuDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fVFlQRURFRl9IX18NCisjZGVmaW5lIF9fVFlQRURFRl9IX18NCisNCisjdW5kZWYgT1JJR0lOQUxfVFlQRURFRl9IIC8qIGRlZmluZSB0byBnZXQgIm9yaWdpbmFsIiBFVFNJIHZlcnNpb24NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHR5cGVkZWYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorI2lmZGVmIE9SSUdJTkFMX1RZUEVERUZfSA0KKy8qDQorICogdGhpcyBpcyB0aGUgb3JpZ2luYWwgY29kZSBmcm9tIHRoZSBFVFNJIGZpbGUgdHlwZWRlZi5oDQorICovDQorICAgDQorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fWlRDX18pDQordHlwZWRlZiBzaWduZWQgY2hhciBXb3JkODsNCit0eXBlZGVmIHNob3J0IFdvcmQxNjsNCit0eXBlZGVmIGxvbmcgV29yZDMyOw0KK3R5cGVkZWYgaW50IEZsYWc7DQorDQorI2VsaWYgZGVmaW5lZChfX3N1bikNCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4Ow0KK3R5cGVkZWYgc2hvcnQgV29yZDE2Ow0KK3R5cGVkZWYgbG9uZyBXb3JkMzI7DQordHlwZWRlZiBpbnQgRmxhZzsNCisNCisjZWxpZiBkZWZpbmVkKF9fdW5peF9fKSB8fCBkZWZpbmVkKF9fdW5peCkNCit0eXBlZGVmIHNpZ25lZCBjaGFyIFdvcmQ4Ow0KK3R5cGVkZWYgc2hvcnQgV29yZDE2Ow0KK3R5cGVkZWYgaW50IFdvcmQzMjsNCit0eXBlZGVmIGludCBGbGFnOw0KKw0KKyNlbmRpZg0KKyNlbHNlIC8qIG5vdCBvcmlnaW5hbCB0eXBlZGVmLmggKi8NCisNCisvKg0KKyAqIHVzZSAoaW1wcm92ZWQpIHR5cGUgZGVmaW5pdGlvbiBmaWxlIHR5cGRlZnMuaCBhbmQgYWRkIGEgIkZsYWciIHR5cGUNCisgKi8NCisjaW5jbHVkZSAidHlwZWRlZnMuaCINCit0eXBlZGVmIGludCBGbGFnOw0KKw0KKyNlbmRpZg0KKw0KKyNlbmRpZiAgLy9fX1RZUEVERUZfSF9fDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjY1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3R5cGVkZWZzLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoNCisqDQorKiAgICAgIEZpbGUgICAgICAgICAgICAgOiB0eXBlZGVmcy5oDQorKiAgICAgIERlc2NyaXB0aW9uICAgICAgOiBEZWZpbml0aW9uIG9mIHBsYXRmb3JtIGluZGVwZW5kZW50IGRhdGENCisqICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIGFuZCBjb25zdGFudHMNCisqDQorKg0KKyogICAgICBUaGUgZm9sbG93aW5nIHBsYXRmb3JtIGluZGVwZW5kZW50IGRhdGEgdHlwZXMgYW5kIGNvcnJlc3BvbmRpbmcNCisqICAgICAgcHJlcHJvY2Vzc29yICgjZGVmaW5lKSBjb25zdGFudHMgYXJlIGRlZmluZWQ6DQorKg0KKyogICAgICAgIGRlZmluZWQgdHlwZSAgbWVhbmluZyAgICAgICAgICAgY29ycmVzcG9uZGluZyBjb25zdGFudHMNCisqICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorKiAgICAgICAgQ2hhciAgICAgICAgICBjaGFyYWN0ZXIgICAgICAgICAobm9uZSkNCisqICAgICAgICBCb29sICAgICAgICAgIGJvb2xlYW4gICAgICAgICAgIHRydWUsIGZhbHNlDQorKiAgICAgICAgV29yZDggICAgICAgICA4LWJpdCBzaWduZWQgICAgICBtaW5Xb3JkOCwgICBtYXhXb3JkOA0KKyogICAgICAgIFVXb3JkOCAgICAgICAgOC1iaXQgdW5zaWduZWQgICAgbWluVVdvcmQ4LCAgbWF4VVdvcmQ4DQorKiAgICAgICAgV29yZDE2ICAgICAgICAxNi1iaXQgc2lnbmVkICAgICBtaW5Xb3JkMTYsICBtYXhXb3JkMTYNCisqICAgICAgICBVV29yZDE2ICAgICAgIDE2LWJpdCB1bnNpZ25lZCAgIG1pblVXb3JkMTYsIG1heFVXb3JkMTYNCisqICAgICAgICBXb3JkMzIgICAgICAgIDMyLWJpdCBzaWduZWQgICAgIG1pbldvcmQzMiwgIG1heFdvcmQzMg0KKyogICAgICAgIFVXb3JkMzIgICAgICAgMzItYml0IHVuc2lnbmVkICAgbWluVVdvcmQzMiwgbWF4VVdvcmQzMg0KKyogICAgICAgIEZsb2F0ICAgICAgICAgZmxvYXRpbmcgcG9pbnQgICAgbWluRmxvYXQsICAgbWF4RmxvYXQNCisqDQorKg0KKyogICAgICBUaGUgZm9sbG93aW5nIGNvbXBpbGUgc3dpdGNoZXMgYXJlICNkZWZpbmVkOg0KKyoNCisqICAgICAgICBQTEFURk9STSAgICAgIHN0cmluZyBpbmRpY2F0aW5nIHBsYXRmb3JtIHByb2dhbSBpcyBjb21waWxlZCBvbg0KKyogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzOiAiT1NGIiwgIlBDIiwgIlNVTiINCisqDQorKiAgICAgICAgT1NGICAgICAgICAgICBvbmx5IGRlZmluZWQgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYW4gQWxwaGENCisqICAgICAgICBQQyAgICAgICAgICAgIG9ubHkgZGVmaW5lZCBpZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBhIFBDDQorKiAgICAgICAgU1VOICAgICAgICAgICBvbmx5IGRlZmluZWQgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gaXMgYSBTdW4NCisqICAgICAgICANCisqICAgICAgICBMU0JGSVJTVCAgICAgIGlzIGRlZmluZWQgaWYgdGhlIGJ5dGUgb3JkZXIgb24gdGhpcyBwbGF0Zm9ybSBpcw0KKyogICAgICAgICAgICAgICAgICAgICAgImxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QiIC0+IGRlZmluZWQgb24gREVDIEFscGhhDQorKiAgICAgICAgICAgICAgICAgICAgICBhbmQgUEMsIHVuZGVmaW5lZCBvbiBTdW4NCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKw0KKyNpZm5kZWYgX19UWVBFREVGU19IX18NCisjZGVmaW5lIF9fVFlQRURFRlNfSF9fDQorDQorLyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERSBGSUxFUw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisjaW5jbHVkZSA8ZmxvYXQuaD4NCisjaW5jbHVkZSA8bGltaXRzLmg+DQorDQorDQorDQorLyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5JVElPTiBPRiBDT05TVEFOVFMgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKy8qDQorICoqKioqKioqKiBkZWZpbmUgY2hhciB0eXBlDQorICovDQordHlwZWRlZiBjaGFyIENoYXI7DQorDQorLyoNCisgKioqKioqKioqIGRlZmluZSA4IGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMNCisgKi8NCisjaWYgU0NIQVJfTUFYID09IDEyNw0KK3R5cGVkZWYgc2lnbmVkIGNoYXIgV29yZDg7DQorI2RlZmluZSBtaW5Xb3JkOCAgU0NIQVJfTUlODQorI2RlZmluZSBtYXhXb3JkOCAgU0NIQVJfTUFYDQorDQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVXb3JkODsNCisjZGVmaW5lIG1pblVXb3JkOCAwDQorI2RlZmluZSBtYXhVV29yZDggVUNIQVJfTUFYDQorI2Vsc2UNCisjZXJyb3IgY2Fubm90IGZpbmQgOC1iaXQgdHlwZQ0KKyNlbmRpZg0KKw0KKw0KKy8qDQorICoqKioqKioqKiBkZWZpbmUgMTYgYml0IHNpZ25lZC91bnNpZ25lZCB0eXBlcyAmIGNvbnN0YW50cw0KKyAqLw0KKyNpZiBJTlRfTUFYID09IDMyNzY3DQordHlwZWRlZiBpbnQgV29yZDE2Ow0KKyNkZWZpbmUgbWluV29yZDE2ICAgICBJTlRfTUlODQorI2RlZmluZSBtYXhXb3JkMTYgICAgIElOVF9NQVgNCit0eXBlZGVmIHVuc2lnbmVkIGludCBVV29yZDE2Ow0KKyNkZWZpbmUgbWluVVdvcmQxNiAgICAwDQorI2RlZmluZSBtYXhVV29yZDE2ICAgIFVJTlRfTUFYDQorI2VsaWYgU0hSVF9NQVggPT0gMzI3NjcNCit0eXBlZGVmIHNob3J0IFdvcmQxNjsNCisjZGVmaW5lIG1pbldvcmQxNiAgICAgU0hSVF9NSU4NCisjZGVmaW5lIG1heFdvcmQxNiAgICAgU0hSVF9NQVgNCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVXb3JkMTY7DQorI2RlZmluZSBtaW5VV29yZDE2ICAgIDANCisjZGVmaW5lIG1heFVXb3JkMTYgICAgVVNIUlRfTUFYDQorI2Vsc2UNCisjZXJyb3IgY2Fubm90IGZpbmQgMTYtYml0IHR5cGUNCisjZW5kaWYNCisNCisNCisvKg0KKyAqKioqKioqKiogZGVmaW5lIDMyIGJpdCBzaWduZWQvdW5zaWduZWQgdHlwZXMgJiBjb25zdGFudHMNCisgKi8NCisjaWYgSU5UX01BWCA9PSAyMTQ3NDgzNjQ3DQordHlwZWRlZiBpbnQgV29yZDMyOw0KKyNkZWZpbmUgbWluV29yZDMyICAgICBJTlRfTUlODQorI2RlZmluZSBtYXhXb3JkMzIgICAgIElOVF9NQVgNCit0eXBlZGVmIHVuc2lnbmVkIGludCBVV29yZDMyOw0KKyNkZWZpbmUgbWluVVdvcmQzMiAgICAwDQorI2RlZmluZSBtYXhVV29yZDMyICAgIFVJTlRfTUFYDQorI2VsaWYgTE9OR19NQVggPT0gMjE0NzQ4MzY0Nw0KK3R5cGVkZWYgbG9uZyBXb3JkMzI7DQorI2RlZmluZSBtaW5Xb3JkMzIgICAgIExPTkdfTUlODQorI2RlZmluZSBtYXhXb3JkMzIgICAgIExPTkdfTUFYDQordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVXb3JkMzI7DQorI2RlZmluZSBtaW5VV29yZDMyICAgIDANCisjZGVmaW5lIG1heFVXb3JkMzIgICAgVUxPTkdfTUFYDQorI2Vsc2UNCisjZXJyb3IgY2Fubm90IGZpbmQgMzItYml0IHR5cGUNCisjZW5kaWYNCisNCisvKg0KKyAqKioqKioqKiogZGVmaW5lIGZsb2F0aW5nIHBvaW50IHR5cGUgJiBjb25zdGFudHMNCisgKi8NCisvKiB1c2UgIiNpZiAwIiBiZWxvdyBpZiBGbG9hdCBzaG91bGQgYmUgZG91YmxlOw0KKyAgIHVzZSAiI2lmIDEiIGJlbG93IGlmIEZsb2F0IHNob3VsZCBiZSBmbG9hdA0KKyAqLw0KKyNpZiAwDQordHlwZWRlZiBmbG9hdCBGbG9hdDsNCisjZGVmaW5lIG1heEZsb2F0ICAgICAgRkxUX01BWA0KKyNkZWZpbmUgbWluRmxvYXQgICAgICBGTFRfTUlODQorI2Vsc2UNCit0eXBlZGVmIGRvdWJsZSBGbG9hdDsNCisjZGVmaW5lIG1heEZsb2F0ICAgICAgREJMX01BWA0KKyNkZWZpbmUgbWluRmxvYXQgICAgICBEQkxfTUlODQorI2VuZGlmDQorDQorLyoNCisgKioqKioqKioqIGRlZmluZSBjb21wbGV4IHR5cGUNCisgKi8NCit0eXBlZGVmIHN0cnVjdCB7DQorICBGbG9hdCByOyAgLyogcmVhbCAgICAgIHBhcnQgKi8NCisgIEZsb2F0IGk7ICAvKiBpbWFnaW5hcnkgcGFydCAqLw0KK30gQ1BYOw0KKw0KKy8qDQorICoqKioqKioqKiBkZWZpbmUgYm9vbGVhbiB0eXBlDQorICovDQordHlwZWRlZiBpbnQgQm9vbDsNCisjZGVmaW5lIGZhbHNlIDANCisjZGVmaW5lIHRydWUgMQ0KKw0KKy8qICoqKioqKkF2b2lkIGZ1bmN0aW9uIG11bHRpcGxlIGRlZmluaXRpb24qKioqKiogKi8NCisjZGVmaW5lICAgICBBdXRvY29yciAgICAgICAgIHZvQVdCX0F1dG9jb3JyDQorI2RlZmluZSAgICAgQ29udm9sdmUgICAgICAgICB2b0FXQl9Db252b2x2ZQ0KKyNkZWZpbmUgICAgIGNvcl9oX3ggICAgICAgICAgdm9BV0JfY29yX2hfeA0KKyNkZWZpbmUgICAgIGR0eF9lbmNfaW5pdCAgICAgdm9BV0JfZHR4X2VuY19pbml0DQorI2RlZmluZSAgICAgZHR4X2VuY19yZXNldCAgICB2b0FXQl9kdHhfZW5jX3Jlc2V0DQorI2RlZmluZSAgICAgZHR4X2VuY19leGl0ICAgICB2b0FXQl9kdHhfZW5jX2V4aXQNCisjZGVmaW5lICAgICBkdHhfZW5jICAgICAgICAgIHZvQVdCX2R0eF9lbmMNCisjZGVmaW5lICAgICBkdHhfYnVmZmVyICAgICAgIHZvQVdCX2R0eF9idWZmZXINCisjZGVmaW5lICAgICB0eF9kdHhfaGFuZGxlciAgIHZvQVdCX3R4X2R0eF9oYW5kbGVyDQorI2RlZmluZSAgICAgR19waXRjaCAgICAgICAgICB2b0FXQl9HX3BpdGNoDQorI2RlZmluZSAgICAgSXNwX0F6ICAgICAgICAgICB2b0FXQl9Jc3BfQXoNCisjZGVmaW5lICAgICBMYWdfd2luZG93ICAgICAgIHZvQVdCX0xhZ193aW5kb3cNCisjZGVmaW5lICAgICBMb2cyX25vcm0gICAgICAgIHZvQVdCX0xvZzJfbm9ybQ0KKyNkZWZpbmUgICAgIExvZzIgICAgICAgICAgICAgdm9BV0JfTG9nMg0KKyNkZWZpbmUgICAgIFBvdzIgICAgICAgICAgICAgdm9BV0JfUG93Mg0KKyNkZWZpbmUgICAgIExfQ29tcCAgICAgICAgICAgdm9BV0JfTF9Db21wDQorI2RlZmluZSAgICAgTXB5XzMyICAgICAgICAgICB2b0FXQl9NcHlfMzINCisjZGVmaW5lICAgICBNcHlfMzJfMTYgICAgICAgIHZvQVdCX01weV8zMl8xNg0KKyNkZWZpbmUgICAgIERpdl8zMiAgICAgICAgICAgdm9BV0JfRGl2XzMyDQorI2RlZmluZSAgICAgUGl0X3NocnAgICAgICAgICB2b0FXQl9QaXRfc2hycA0KKyNkZWZpbmUgICAgIFFpc2ZfbnMgICAgICAgICAgdm9BV0JfUWlzZl9ucw0KKyNkZWZpbmUgICAgIERpc2ZfbnMgICAgICAgICAgdm9BV0JfRGlzZl9ucw0KKyNkZWZpbmUgICAgIFJlc2lkdSAgICAgICAgICAgdm9BV0JfUmVzaWR1DQorI2RlZmluZSAgICAgU3luX2ZpbHQgICAgICAgICB2b0FXQl9TeW5fZmlsdA0KKyNkZWZpbmUgICAgIFNldF96ZXJvICAgICAgICAgdm9BV0JfU2V0X3plcm8NCisjZGVmaW5lICAgICBDb3B5ICAgICAgICAgICAgIHZvQVdCX0NvcHkNCisjZGVmaW5lICAgICB2b2ljZV9mYWN0b3IgICAgIHZvQVdCX3ZvaWNlX2ZhY3Rvcg0KKyNkZWZpbmUgICAgIFN5bl9maWx0XzMyICAgICAgdm9BV0JfU3luX2ZpbHRfMzINCisjZGVmaW5lICAgICBJc2ZfaXNwICAgICAgICAgIHZvQVdCX0lzZl9pc3ANCisjZGVmaW5lICAgICBMZXZpbnNvbiAgICAgICAgIHZvQVdCX0xldmluc29uDQorI2RlZmluZSAgICAgbWVkaWFuNSAgICAgICAgICB2b0FXQl9tZWRpYW41ICAgICAgICAgICANCisjZGVmaW5lICAgICBQcmVkX2x0NCAgICAgICAgIHZvQVdCX1ByZWRfbHQ0DQorI2RlZmluZSAgICAgUmVvcmRlcl9pc2YgICAgICB2b0FXQl9SZW9yZGVyX2lzZg0KKyNkZWZpbmUgICAgIERwaXNmXzJzXzM2YiAgICAgdm9BV0JfRHBpc2ZfMnNfMzZiDQorI2RlZmluZSAgICAgRHBpc2ZfMnNfNDZiICAgICB2b0FXQl9EcGlzZl8yc180NmINCisjZGVmaW5lICAgICBEb3RfcHJvZHVjdDEyICAgIHZvQVdCX0RvdF9wcm9kdWN0MTINCisjZGVmaW5lICAgICBtZW1fbWFsbG9jICAgICAgIHZvQVdCX21lbV9tYWxsb2MNCisjZGVmaW5lICAgICBtZW1fZnJlZSAgICAgICAgIHZvQVdCX21lbV9mcmVlDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjZW5kaWYgIC8vI2RlZmluZSBfX1RZUEVERUZTX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvd2JfdmFkLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3diX3ZhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MzNhZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3diX3ZhZC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFdCX1ZBRC5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogRnVuY3Rpb25zIGFuZCBzdGF0aWMgbWVtb3J5IGZvciBWb2ljZSBBY3Rpdml0eSBEZXRlY3Rpb24uICAgICAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX1dCX1ZBRF9IX18NCisjZGVmaW5lIF9fV0JfVkFEX0hfXw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJ3Yl92YWRfYy5oIg0KKyNpbmNsdWRlICJ2b01lbS5oIg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTklUSU9OIE9GIERBVEEgVFlQRVMNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKwlXb3JkMTYgYmNrcl9lc3RbQ09NUExFTl07ICAgICAgICAgICAgICAvKiBiYWNrZ3JvdW5kIG5vaXNlIGVzdGltYXRlICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBhdmVfbGV2ZWxbQ09NUExFTl07ICAgICAgICAgICAgIC8qIGF2ZXJhZ2VkIGlucHV0IGNvbXBvbmVudHMgZm9yIHN0YXRpb25hcnkgKi8NCisJLyogZXN0aW1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgb2xkX2xldmVsW0NPTVBMRU5dOyAgICAgICAgICAgICAvKiBpbnB1dCBsZXZlbHMgb2YgdGhlIHByZXZpb3VzIGZyYW1lICAgICAgICovDQorCVdvcmQxNiBzdWJfbGV2ZWxbQ09NUExFTl07ICAgICAgICAgICAgIC8qIGlucHV0IGxldmVscyBjYWxjdWxhdGVkIGF0IHRoZSBlbmQgb2YgYSBmcmFtZSAobG9va2FoZWFkKSAgKi8NCisJV29yZDE2IGFfZGF0YTVbRl81VEhfQ05UXVsyXTsgICAgICAgICAgLyogbWVtb3J5IGZvciB0aGUgZmlsdGVyIGJhbmsgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgYV9kYXRhM1tGXzNUSF9DTlRdOyAgICAgICAgICAgICAvKiBtZW1vcnkgZm9yIHRoZSBmaWx0ZXIgYmFuayAgICAgICAgICAgICAgICovDQorDQorCVdvcmQxNiBidXJzdF9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50cyBsZW5ndGggb2YgYSBzcGVlY2ggYnVyc3QgICAgICAgICAgKi8NCisJV29yZDE2IGhhbmdfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLyogaGFuZ292ZXIgY291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgc3RhdF9jb3VudDsgICAgICAgICAgICAgICAgICAgICAvKiBzdGF0aW9uYXJ5IGNvdW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovDQorDQorCS8qIE5vdGUgdGhhdCBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlcyBob2xkcyAxNSBmbGFncy4gRWFjaCBmbGFnIHJlc2VydmVzIDEgYml0IG9mIHRoZQ0KKwkgKiB2YXJpYWJsZS4gVGhlIG5ld2VzdCBmbGFnIGlzIGluIHRoZSBiaXQgMTUgKGFzc3VtaW5nIHRoYXQgTFNCIGlzIGJpdCAxIGFuZCBNU0IgaXMgYml0IDE2KS4gKi8NCisJV29yZDE2IHZhZHJlZzsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZ3MgZm9yIGludGVybWVkaWF0ZSBWQUQgZGVjaXNpb25zICAgICAqLw0KKwlXb3JkMTYgdG9uZV9mbGFnOyAgICAgICAgICAgICAgICAgICAgICAvKiB0b25lIGRldGVjdGlvbiBmbGFncyAgICAgICAgICAgICAgICAgICAgICovDQorDQorCVdvcmQxNiBzcF9lc3RfY250OyAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIHNwZWVjaCBsZXZlbCBlc3RpbWF0aW9uICAgICAgKi8NCisJV29yZDE2IHNwX21heDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBsZXZlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgc3BfbWF4X2NudDsgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudHMgZnJhbWVzIHRoYXQgY29udGFpbnMgc3BlZWNoICAgICAgICovDQorCVdvcmQxNiBzcGVlY2hfbGV2ZWw7ICAgICAgICAgICAgICAgICAgIC8qIGVzdGltYXRlZCBzcGVlY2ggbGV2ZWwgICAgICAgICAgICAgICAgICAgKi8NCisJV29yZDMyIHByZXZfcG93X3N1bTsgICAgICAgICAgICAgICAgICAgLyogcG93ZXIgb2YgcHJldmlvdXMgZnJhbWUgICAgICAgICAgICAgICAgICAqLw0KKw0KK30gVmFkVmFyczsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqIERFQ0xBUkFUSU9OIE9GIFBST1RPVFlQRVMNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorV29yZDE2IHdiX3ZhZF9pbml0KFZhZFZhcnMgKiogc3QsIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKTsNCitXb3JkMTYgd2JfdmFkX3Jlc2V0KFZhZFZhcnMgKiBzdCk7DQordm9pZCB3Yl92YWRfZXhpdChWYWRWYXJzICoqIHN0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCk7DQordm9pZCB3Yl92YWRfdG9uZV9kZXRlY3Rpb24oVmFkVmFycyAqIHN0LCBXb3JkMTYgcF9nYWluKTsNCitXb3JkMTYgd2JfdmFkKFZhZFZhcnMgKiBzdCwgV29yZDE2IGluX2J1ZltdKTsNCisNCisjZW5kaWYgIC8vX19XQl9WQURfSF9fDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWRfYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWRfYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWY1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3diX3ZhZF9jLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFdCX1ZBRF9DLkgJCQkJICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyAqIENvbnN0YW50cyBmb3IgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0aW9uLgkJCSAgICAgKg0KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorI2lmbmRlZiBfX1dCX1ZBRF9DX0hfXw0KKyNkZWZpbmUgX19XQl9WQURfQ19IX18NCisNCisjZGVmaW5lIEZSQU1FX0xFTiAyNTYgICAgICAgICAgICAgICAgICAgICAgLyogTGVuZ3RoIChzYW1wbGVzKSBvZiB0aGUgaW5wdXQgZnJhbWUgICAgICAgICAgKi8NCisjZGVmaW5lIENPTVBMRU4gMTIgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1Yi1iYW5kcyB1c2VkIGJ5IFZBRCAgICAgICAgICAgICAgKi8NCisNCisjZGVmaW5lIFVOSVJTSEZUIDcgICAgICAgICAgICAgICAgICAgICAgICAgLyogPSBsb2cyKE1BWF8xNi9VTklUWSksIFVOSVRZID0gMjU2ICAgICAgKi8NCisjZGVmaW5lIFNDQUxFIDEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKFVOSVRZKlVOSVRZKS81MTIgKi8NCisNCisjZGVmaW5lIFRPTkVfVEhSIChXb3JkMTYpKDAuNjUqTUFYXzE2KSAgICAgLyogVGhyZXNob2xkIGZvciB0b25lIGRldGVjdGlvbiAgICovDQorDQorLyogY29uc3RhbnRzIGZvciBzcGVlY2ggbGV2ZWwgZXN0aW1hdGlvbiAqLw0KKyNkZWZpbmUgU1BfRVNUX0NPVU5UIDgwDQorI2RlZmluZSBTUF9BQ1RJVklUWV9DT1VOVCAyNQ0KKyNkZWZpbmUgQUxQSEFfU1BfVVAgKFdvcmQxNikoKDEuMCAtIDAuODUpKk1BWF8xNikNCisjZGVmaW5lIEFMUEhBX1NQX0RPV04gKFdvcmQxNikoKDEuMCAtIDAuODUpKk1BWF8xNikNCisNCisjZGVmaW5lIE5PTV9MRVZFTCAyMDUwICAgICAgICAgICAgICAgICAgICAgLyogYWJvdXQgLTI2IGRCb3YgUTE1ICovDQorI2RlZmluZSBTUEVFQ0hfTEVWRUxfSU5JVCBOT01fTEVWRUwgICAgICAgIC8qIGluaXRpYWwgc3BlZWNoIGxldmVsICovDQorI2RlZmluZSBNSU5fU1BFRUNIX0xFVkVMMSAgKFdvcmQxNikoTk9NX0xFVkVMICogMC4wNjMpICAvKiBOT01fTEVWRUwgLTI0IGRCICovDQorI2RlZmluZSBNSU5fU1BFRUNIX0xFVkVMMiAgKFdvcmQxNikoTk9NX0xFVkVMICogMC4yKSAgICAvKiBOT01fTEVWRUwgLTE0IGRCICovDQorI2RlZmluZSBNSU5fU1BFRUNIX1NOUiA0MDk2ICAgICAgICAgICAgICAgIC8qIDAgZEIsIGxvd2VzdCBTTlIgZXN0aW1hdGlvbiwgUTEyICovDQorDQorLyogVGltZSBjb25zdGFudHMgZm9yIGJhY2tncm91bmQgc3BlY3RydW0gdXBkYXRlICovDQorI2RlZmluZSBBTFBIQV9VUDEgICAoV29yZDE2KSgoMS4wIC0gMC45NSkqTUFYXzE2KSAgICAgICAvKiBOb3JtYWwgdXBkYXRlLCB1cHdhcmRzOiAgICovDQorI2RlZmluZSBBTFBIQV9ET1dOMSAoV29yZDE2KSgoMS4wIC0gMC45MzYpKk1BWF8xNikgICAgICAvKiBOb3JtYWwgdXBkYXRlLCBkb3dud2FyZHMgICovDQorI2RlZmluZSBBTFBIQV9VUDIgICAoV29yZDE2KSgoMS4wIC0gMC45ODUpKk1BWF8xNikgICAgICAvKiBGb3JjZWQgdXBkYXRlLCB1cHdhcmRzICAgICovDQorI2RlZmluZSBBTFBIQV9ET1dOMiAoV29yZDE2KSgoMS4wIC0gMC45NDMpKk1BWF8xNikgICAgICAvKiBGb3JjZWQgdXBkYXRlLCBkb3dud2FyZHMgICovDQorI2RlZmluZSBBTFBIQTMgICAgICAoV29yZDE2KSgoMS4wIC0gMC45NSkqTUFYXzE2KSAgICAgICAvKiBVcGRhdGUgZG93bndhcmRzICAgICAgICAgICovDQorI2RlZmluZSBBTFBIQTQgICAgICAoV29yZDE2KSgoMS4wIC0gMC45KSpNQVhfMTYpICAgICAgICAvKiBGb3Igc3RhdGlvbmFyeSBlc3RpbWF0aW9uICovDQorI2RlZmluZSBBTFBIQTUgICAgICAoV29yZDE2KSgoMS4wIC0gMC41KSpNQVhfMTYpICAgICAgICAvKiBGb3Igc3RhdGlvbmFyeSBlc3RpbWF0aW9uICovDQorDQorLyogQ29uc3RhbnRzIGZvciBWQUQgdGhyZXNob2xkICovDQorI2RlZmluZSBUSFJfTUlOICAoV29yZDE2KSgxLjYqU0NBTEUpICAgICAgIC8qIE1pbmltdW0gdGhyZXNob2xkICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIFRIUl9ISUdIIChXb3JkMTYpKDYqU0NBTEUpICAgICAgICAgLyogSGlnaGVzdCB0aHJlc2hvbGQgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgVEhSX0xPVyAoV29yZDE2KSgxLjcqU0NBTEUpICAgICAgICAvKiBMb3dlc3QgdGhyZXNob2xkICAgICAgICAgICAgICAgKi8NCisjZGVmaW5lIE5PX1AxIDMxNzQ0ICAgICAgICAgICAgICAgICAgICAgICAgLyogaWxvZzIoMSksIE5vaXNlIGxldmVsIGZvciBoaWdoZXN0IHRocmVzaG9sZCAqLw0KKyNkZWZpbmUgTk9fUDIgMTk3ODYgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbG9nMigwLjEqTUFYXzE2KSwgTm9pc2UgbGV2ZWwgZm9yIGxvd2VzdCB0aHJlc2hvbGQgKi8NCisjZGVmaW5lIE5PX1NMT1BFIChXb3JkMTYpKE1BWF8xNiooZmxvYXQpKFRIUl9MT1ctVEhSX0hJR0gpLyhmbG9hdCkoTk9fUDItTk9fUDEpKQ0KKw0KKyNkZWZpbmUgU1BfQ0hfTUlOIChXb3JkMTYpKC0wLjc1KlNDQUxFKQ0KKyNkZWZpbmUgU1BfQ0hfTUFYIChXb3JkMTYpKDAuNzUqU0NBTEUpDQorI2RlZmluZSBTUF9QMSAyMjUyNyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlsb2cyKE5PTV9MRVZFTC80KSAqLw0KKyNkZWZpbmUgU1BfUDIgMTc4MzIgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbG9nMihOT01fTEVWRUwqNCkgKi8NCisjZGVmaW5lIFNQX1NMT1BFIChXb3JkMTYpKE1BWF8xNiooZmxvYXQpKFNQX0NIX01BWC1TUF9DSF9NSU4pLyhmbG9hdCkoU1BfUDItU1BfUDEpKQ0KKw0KKy8qIENvbnN0YW50cyBmb3IgaGFuZ292ZXIgbGVuZ3RoICovDQorI2RlZmluZSBIQU5HX0hJR0ggIDEyICAgICAgICAgICAgICAgICAgICAgIC8qIGxvbmdlc3QgaGFuZ292ZXIgICAgICAgICAgICAgICAqLw0KKyNkZWZpbmUgSEFOR19MT1cgIDIgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG9ydGVzdCBoYW5nb3ZlciAgICAgICAgICAgICAgICovDQorI2RlZmluZSBIQU5HX1AxIFRIUl9MT1cgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBmb3IgbG9uZ2VzdCBoYW5nb3ZlciAqLw0KKyNkZWZpbmUgSEFOR19QMiAoV29yZDE2KSg0KlNDQUxFKSAgICAgICAgICAvKiB0aHJlc2hvbGQgZm9yIHNob3J0ZXN0IGhhbmdvdmVyICovDQorI2RlZmluZSBIQU5HX1NMT1BFIChXb3JkMTYpKE1BWF8xNiooZmxvYXQpKEhBTkdfTE9XLUhBTkdfSElHSCkvKGZsb2F0KShIQU5HX1AyLUhBTkdfUDEpKQ0KKw0KKy8qIENvbnN0YW50cyBmb3IgYnVyc3QgbGVuZ3RoICovDQorI2RlZmluZSBCVVJTVF9ISUdIIDggICAgICAgICAgICAgICAgICAgICAgIC8qIGxvbmdlc3QgYnVyc3QgbGVuZ3RoICAgICAgICAgKi8NCisjZGVmaW5lIEJVUlNUX0xPVyAzICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvcnRlc3QgYnVyc3QgbGVuZ3RoICAgICAgICAqLw0KKyNkZWZpbmUgQlVSU1RfUDEgVEhSX0hJR0ggICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZm9yIGxvbmdlc3QgYnVyc3QgKi8NCisjZGVmaW5lIEJVUlNUX1AyIFRIUl9MT1cgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIGZvciBzaG9ydGVzdCBidXJzdCAqLw0KKyNkZWZpbmUgQlVSU1RfU0xPUEUgKFdvcmQxNikoTUFYXzE2KihmbG9hdCkoQlVSU1RfTE9XLUJVUlNUX0hJR0gpLyhmbG9hdCkoQlVSU1RfUDItQlVSU1RfUDEpKQ0KKw0KKy8qIFBhcmFtZXRlcnMgZm9yIGJhY2tncm91bmQgc3BlY3RydW0gcmVjb3ZlcnkgZnVuY3Rpb24gKi8NCisjZGVmaW5lIFNUQVRfQ09VTlQgMjAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIG9mIHN0YXRpb25hcnkgZGV0ZWN0aW9uIGNvdW50ZXIgICAgICAgICAqLw0KKw0KKyNkZWZpbmUgU1RBVF9USFJfTEVWRUwgMTg0ICAgICAgICAgICAgICAgICAvKiBUaHJlc2hvbGQgbGV2ZWwgZm9yIHN0YXRpb25hcml0eSBkZXRlY3Rpb24gICAgICAgICovDQorI2RlZmluZSBTVEFUX1RIUiAxMDAwICAgICAgICAgICAgICAgICAgICAgIC8qIFRocmVzaG9sZCBmb3Igc3RhdGlvbmFyaXR5IGRldGVjdGlvbiAgICAgICAgICAgICAgKi8NCisNCisvKiBMaW1pdHMgZm9yIGJhY2tncm91bmQgbm9pc2UgZXN0aW1hdGUgKi8NCisjZGVmaW5lIE5PSVNFX01JTiA0MCAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSAqLw0KKyNkZWZpbmUgTk9JU0VfTUFYIDIwMDAwICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtICovDQorI2RlZmluZSBOT0lTRV9JTklUIDE1MCAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgKi8NCisNCisvKiBUaHJlc2hvbGRzIGZvciBzaWduYWwgcG93ZXIgKG5vdyBjYWxjdWxhdGVkIG9uIDIgZnJhbWVzKSAqLw0KKyNkZWZpbmUgVkFEX1BPV19MT1cgKFdvcmQzMikzMDAwMEwgICAgICAgICAvKiBJZiBpbnB1dCBwb3dlciBpcyBsb3dlciB0aGFuIHRoaXMsIFZBRCBpcyBzZXQgdG8gMCAqLw0KKyNkZWZpbmUgUE9XX1RPTkVfVEhSIChXb3JkMzIpNjg2MDgwTCAgICAgICAvKiBJZiBpbnB1dCBwb3dlciBpcyBsb3dlcix0b25lIGRldGVjdGlvbiBmbGFnIGlzIGlnbm9yZWQgKi8NCisNCisvKiBDb25zdGFudHMgZm9yIHRoZSBmaWx0ZXIgYmFuayAqLw0KKyNkZWZpbmUgQ09FRkYzICAgMTMzNjMgICAgICAgICAgICAgICAgICAgICAvKiBjb2VmZmljaWVudCBmb3IgdGhlIDNyZCBvcmRlciBmaWx0ZXIgICAgICovDQorI2RlZmluZSBDT0VGRjVfMSAyMTk1NSAgICAgICAgICAgICAgICAgICAgIC8qIDFzdCBjb2VmZmljaWVudCB0aGUgZm9yIDV0aCBvcmRlciBmaWx0ZXIgKi8NCisjZGVmaW5lIENPRUZGNV8yIDYzOTAgICAgICAgICAgICAgICAgICAgICAgLyogMm5kIGNvZWZmaWNpZW50IHRoZSBmb3IgNXRoIG9yZGVyIGZpbHRlciAqLw0KKyNkZWZpbmUgRl81VEhfQ05UIDUgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgNXRoIG9yZGVyIGZpbHRlcnMgKi8NCisjZGVmaW5lIEZfM1RIX0NOVCA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIDN0aCBvcmRlciBmaWx0ZXJzICovDQorDQorI2VuZGlmICAgLy9fX1dCX1ZBRF9DX0hfXw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjVlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCkBAIC0wLDAgKzEsMTA0IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0B2b2lkIERlZW1waF8zMigNCitAICAgICBXb3JkMTYgeF9oaVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDMxLi4xNikgKi8NCitAICAgICBXb3JkMTYgeF9sb1tdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDE1Li40KSAgKi8NCitAICAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICh4MTYpICAgICAgKi8NCitAICAgICBXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBkZWVtcGhhc2lzIGZhY3RvciAgICAgICAgKi8NCitAICAgICBXb3JkMTYgTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHlbLTFdKSAgICAgICAgICAgKi8NCitAICAgICApDQorDQorQHhfaGkgICAgIFJOICAgICAgUjANCitAeF9sbyAgICAgUk4gICAgICBSMQ0KK0B5W10gICAgICBSTiAgICAgIFIyDQorQCptZW0gICAgIFJOICAgICAgUjMNCisNCisgICAgICAgICAgIC5zZWN0aW9uICAudGV4dA0KKyAgICAgICAgICAgLmdsb2JhbCAgIERlZW1waF8zMl9hc20NCisJICAgDQorRGVlbXBoXzMyX2FzbToNCisNCisgICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSANCisJICAgTU9WICAgICAgICAgIHI0LCAjMiAgICAgICAgICAgICAgICAgICBAaT0wDQorCSAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVswXQ0KKwkgICBMRFJTSCAgICAgICAgcjcsIFtyMV0sICMyICAgICAgICAgICAgIEBsb2FkIHhfbG9bMF0NCisJICAgTERSICAgICAgICAgIHI1LCA9MjIyODIgICAgICAgICAgICAgICBAcjUtLS1tdQ0KKwkgICBNT1YgICAgICAgICAgcjExLCAjMHg4MDAwDQorDQorICAgICAgICAgICBAeVswXQ0KKwkgICBNT1YgICAgICAgICAgcjEwLCByNiwgTFNMICMxNiAgICAgICAgIEBMX3RtcCA9IHhfaGlbMF08PDE2DQorCSAgIE1PViAgICAgICAgICByOCwgIHI1LCBBU1IgIzEgICAgICAgICAgQGZhYyA9IG11ID4+IDENCisJICAgTERSICAgICAgICAgIHI1LCAgW3IzXQ0KKwkgICBBREQgICAgICAgICAgcjEyLCByMTAsIHI3LCBMU0wgIzQgICAgIEBMX3RtcCArPSB4X2xvWzBdIDw8IDQNCisJICAgTU9WICAgICAgICAgIHIxMCwgcjEyLCBMU0wgIzMgICAgICAgICBATF90bXAgPDw9IDMNCisJICAgTVVMICAgICAgICAgIHI5LCByNSwgcjgNCisJICAgTERSU0ggICAgICAgIHI2LCBbcjBdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2hpWzFdIA0KKwkgICBRREFERCAgICAgICAgcjEwLCByMTAsIHI5DQorCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9sb1sxXSAgDQorCSAgIE1PViAgICAgICAgICByMTIsIHIxMCwgTFNMICMxICAgICAgICAgQExfdG1wID0gTF9tYWMoTF90bXAsICptZW0sIGZhYykNCisJICAgUUFERCAgICAgICAgIHIxMCwgcjEyLCByMTENCisJICAgTU9WICAgICAgICAgIHIxNCwgcjEwLCBBU1IgIzE2ICAgICAgICBAeVswXSA9IHJvdW5kKExfdG1wKQ0KKw0KKw0KKwkgICBNT1YgICAgICAgICAgcjEwLCByNiwgTFNMICMxNg0KKwkgICBBREQgICAgICAgICAgcjEyLCByMTAsIHI3LCBMU0wgIzQNCisgICAgICAgICAgIFNUUkggICAgICAgICByMTQsIFtyMl0sICMyICAgICAgICAgICAgQHVwZGF0ZSB5WzBdDQorCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzDQorCSAgIE1VTCAgICAgICAgICByOSwgcjE0LCByOA0KKwkgICBRREFERCAgICAgICAgcjEwLCByMTAsIHI5DQorCSAgIE1PViAgICAgICAgICByMTIsIHIxMCwgTFNMICMxDQorCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExDQorCSAgIE1PViAgICAgICAgICByMTQsIHIxMCwgQVNSICMxNiAgICAgICAgQHlbMV0gPSByb3VuZChMX3RtcCkNCisNCitMT09QOg0KKyAgICAgICAgICAgTERSU0ggICAgICAgIHI2LCBbcjBdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2hpW10NCisJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMg0KKwkgICBTVFJIICAgICAgICAgcjE0LCBbcjJdLCAjMg0KKwkgICBNT1YgICAgICAgICAgcjEwLCByNiwgTFNMICMxNg0KKwkgICBBREQgICAgICAgICAgcjEyLCByMTAsIHI3LCBMU0wgIzQNCisJICAgTVVMICAgICAgICAgIHI5LCByMTQsIHI4DQorCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzDQorCSAgIFFEQUREICAgICAgICByMTAsIHIxMCwgcjkNCisgICAgICAgICAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVtdDQorCSAgIE1PViAgICAgICAgICByMTIsIHIxMCwgTFNMICMxDQorCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExDQorCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzINCisJICAgTU9WICAgICAgICAgIHIxNCwgcjEwLCBBU1IgIzE2DQorDQorCSAgIE1PViAgICAgICAgICByMTAsIHI2LCBMU0wgIzE2DQorCSAgIEFERCAgICAgICAgICByMTIsIHIxMCwgcjcsIExTTCAjNA0KKwkgICBTVFJIICAgICAgICAgcjE0LCBbcjJdLCAjMg0KKwkgICBNVUwgICAgICAgICAgcjksIHIxNCwgcjgNCisJICAgTU9WICAgICAgICAgIHIxMCwgcjEyLCBMU0wgIzMNCisJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQ0KKyAgICAgICAgICAgQUREICAgICAgICAgIHI0LCByNCwgIzINCisJICAgTU9WICAgICAgICAgIHIxMiwgcjEwLCBMU0wgIzENCisJICAgUUFERCAgICAgICAgIHIxMCwgcjEyLCByMTENCisgICAgICAgICAgIENNUCAgICAgICAgICByNCwgIzY0DQorCSAgIE1PViAgICAgICAgICByMTQsIHIxMCwgQVNSICMxNg0KKw0KKyAgICAgICAgICAgQkxUICAgICAgICAgIExPT1ANCisgICAgICAgICAgIFNUUiAgICAgICAgICByMTQsIFtyM10NCisgICAgICAgICAgIFNUUkggICAgICAgICByMTQsIFtyMl0JICAgDQorDQorICAgICAgICAgICBMRE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNX0gDQorDQorCSAgIEBFTkRQDQorCSAgIC5FTkQNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4MzI2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Eb3RfcF9vcHQucwpAQCAtMCwwICsxLDgwIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0ANCitAV29yZDMyIERvdF9wcm9kdWN0MTIoICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMzE6IG5vcm1hbGl6ZWQgcmVzdWx0ICgxIDwgdmFsIDw9IC0xKSAqLw0KK0AgICAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB4IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCitAICAgICAgIFdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDEyYml0czogeSB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IHZlY3RvciBsZW5ndGggICAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgICAgV29yZDE2ICogZXhwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgOiBleHBvbmVudCBvZiByZXN1bHQgKDAuLiszMCkgICAgICAgKi8NCitAKQ0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCAgeFtdICAgLS0tICByMA0KK0AgIHlbXSAgIC0tLSAgcjENCitAICBsZyAgICAtLS0gIHIyDQorQCAgKmV4cCAgLS0tICByMw0KKw0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisgCSAgLmdsb2JhbCAgIERvdF9wcm9kdWN0MTJfYXNtDQorDQorRG90X3Byb2R1Y3QxMl9hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIE1PViAgICAgICAgICAgICAgIHI0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgTF9zdW0gPSAwDQorICAgICAgICAgIE1PViAgICAgICAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IDANCisNCitMT09QOg0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI2LCBbcjBdLCAjNA0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI3LCBbcjFdLCAjNA0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI4LCBbcjBdLCAjNA0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHI0LCByNiwgcjcsIHI0DQorICAgICAgICAgIExEUiAgICAgICAgICAgcjksIFtyMV0sICM0DQorCSAgU01MQVRUICAgICAgICByNCwgcjYsIHI3LCByNCANCisNCisJICBMRFIgICAgICAgICAgIHI2LCBbcjBdLCAjNA0KKwkgIFNNTEFCQiAgICAgICAgcjQsIHI4LCByOSwgcjQNCisNCisJICBMRFIgICAgICAgICAgIHI3LCBbcjFdLCAjNA0KKwkgIFNNTEFUVCAgICAgICAgcjQsIHI4LCByOSwgcjQJICANCisJICBMRFIgICAgICAgICAgIHI4LCBbcjBdLCAjNA0KKw0KKwkgIFNNTEFCQiAgICAgICAgcjQsIHI2LCByNywgcjQNCisJICBMRFIgICAgICAgICAgIHI5LCBbcjFdLCAjNA0KKwkgIFNNTEFUVCAgICAgICAgcjQsIHI2LCByNywgcjQNCisJICBBREQgICAgICAgICAgIHI1LCByNSwgIzgNCisJICBTTUxBQkIgICAgICAgIHI0LCByOCwgcjksIHI0DQorCSAgQ01QICAgICAgICAgICByNSwgcjINCisJICBTTUxBVFQgICAgICAgIHI0LCByOCwgcjksIHI0DQorCSAgQkxUICAgICAgICAgICBMT09QDQorICAgICAgICAgICAgICANCisgICAgICAgICAgTU9WICAgICAgICAgICByMTIsIHI0LCBMU0wgIzENCisgICAgICAgICAgQUREICAgICAgICAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IChMX3N1bSA8PCAxKSAgKyAxDQorCSAgTU9WICAgICAgICAgICByNCwgcjEyDQorDQorICAgICAgICAgIENNUCAgICAgICAgICAgcjEyLCAjMA0KKwkgIFJTQkxUICAgICAgICAgcjQsIHIxMiwgIzANCisgICAgICAgICAgQ0xaICAgICAgICAgICByMTAsIHI0DQorICAgICAgICAgIFNVQiAgICAgICAgICAgcjEwLCByMTAsICMxICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2Z0ID0gbm9ybV9sKExfc3VtKQ0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIwLCByMTIsIExTTCByMTAgICAgICAgICAgICAgICAgICAgICBAIExfc3VtID0gTF9zdW0gPDwgc2Z0DQorICAgICAgICAgIFJTQiAgICAgICAgICAgcjExLCByMTAsICMzMCAgICAgICAgICAgICAgICAgICAgICAgIEAgKmV4cCA9IDMwIC0gc2Z0DQorICAgICAgICAgIFNUUkggICAgICAgICAgcjExLCBbcjNdICAgICAgICAgICAgICAgICAgICAgDQorDQorRG90X3Byb2R1Y3QxMl9lbmQ6DQorCQkgICAgIA0KKyAgICAgICAgICBMRE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKyAgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgICAuRU5EDQorIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlYmQ3MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCkBAIC0wLDAgKzEsMTg1IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KKw0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0B2b2lkIEZpbHRfNmtfN2soDQorQCAgICAgV29yZDE2IHNpZ25hbFtdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHNpZ25hbCAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorQCAgICAgV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IG1lbW9yeSAoc2l6ZT0zMCkgICAgICAgICovDQorQCkNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCByMCAgICAtLS0gIHNpZ25hbFtdDQorQCByMSAgICAtLS0gIGxnDQorQCByMiAgICAtLS0gIG1lbVtdIA0KKw0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisgICAgICAgICAgLmdsb2JhbCAgRmlsdF82a183a19hc20NCisgICAgICAgICAgLmV4dGVybiAgdm9BV0JfQ29weQ0KKyAgICAgICAgICAuZXh0ZXJuICBmaXJfNmtfN2sNCisNCitGaWx0XzZrXzdrX2FzbToNCisNCisgICAgICAgICAgU1RNRkQgICAJCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSANCisgICAgICAgICAgU1VCICAgIAkJcjEzLCByMTMsICMyNDAgICAgICAgICAgICAgIEAgeFtMX1NVQkZSMTZrICsgKExfRklSIC0gMSldDQorICAgICAgICAgIE1PViAgICAgCQlyOCwgcjAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IHNpZ25hbFtdIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAJCXI0LCByMSAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgbGcgYWRkcmVzcw0KKyAgICAgICAgICBNT1YgICAgIAkJcjUsIHIyICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBtZW1bXSBhZGRyZXNzDQorDQorICAgICAgICAgIE1PViAgICAgCQlyMSwgcjEzDQorICAgICAgICAgIE1PViAgICAgCQlyMCwgcjINCisgICAgICAgICAgTU9WICAgICAJCXIyLCAjMzAgICAgICAgICAgICAgICAgICAgICBAIExfRklSIC0gMQ0KKyAgICAgICAgICBCTCAgICAgIAkJdm9BV0JfQ29weSAgICAgICAgICAgICAgICAgICBAIG1lbWNweSh4LCBtZW0sIChMX0ZJUiAtIDEpPDwxKQ0KKw0KKyAgICAgICAgICBMRFIgICAgIAkJcjEwLCBMYWJsZTEgICAgICAgICAgICAgICAgIEAgZ2V0IGZpcl83ayBhZGRyZXNzICAgICANCisNCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjE0LCAjMCAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgICAgICAgICByMywgcjggICAgICAgICAgICAgICAgICAgICAgQCBjaGFuZ2UgbXlNZW1Db3B5IHRvIENvcHksIGR1ZSB0byBDb3B5IHdpbGwgY2hhbmdlIHIzIGNvbnRlbnQNCisgICAgICAgICAgQUREICAgICAJICAgIAlyNiwgcjEzLCAjNjAgICAgICAgICAgICAgICAgQCBnZXQgeFtMX0ZJUiAtIDFdIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjcsIHIzICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZ25hbFtpXQ0KK0xPT1AxOg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIAlyOCwgIFtyN10sICMyDQorICAgICAgICAgIExEUlNIICAgICAgICAgCXI5LCAgW3I3XSwgIzINCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjgsIHI4LCBBU1IgIzINCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjksIHI5LCBBU1IgIzINCisgICAgICAgICAgTERSU0ggICAgICAgICAJcjExLCBbcjddLCAjMg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIAlyMTIsIFtyN10sICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXIxMSwgcjExLCBBU1IgIzINCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjEyLCByMTIsIEFTUiAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIAlyOCwgW3I2XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICAJcjksIFtyNl0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgCXIxMSwgW3I2XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICAJcjEyLCBbcjZdLCAjMg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIAlyOCwgIFtyN10sICMyDQorICAgICAgICAgIExEUlNIICAgICAgICAgCXI5LCAgW3I3XSwgIzINCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjgsIHI4LCBBU1IgIzINCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjksIHI5LCBBU1IgIzINCisgICAgICAgICAgTERSU0ggICAgICAgICAJcjExLCBbcjddLCAjMg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIAlyMTIsIFtyN10sICMyDQorICAgICAgICAgIE1PViAgICAgICAgICAgCXIxMSwgcjExLCBBU1IgIzINCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjEyLCByMTIsIEFTUiAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIAlyOCwgW3I2XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICAJcjksIFtyNl0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgCXIxMSwgW3I2XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICAJcjEyLCBbcjZdLCAjMg0KKyAgICAgICAgICBBREQgICAgICAgICAgIAlyMTQsIHIxNCwgIzgNCisgICAgICAgICAgQ01QICAgICAgICAgICAJcjE0LCAjODANCisgICAgICAgICAgQkxUICAgICAgICAgICAJTE9PUDEgICAgICAgICAgDQorDQorDQorICAgICAgICAgIFNUUiAgICAgCQlyNSwgW3NwLCAjLTRdICAgICAgICAgICAgICAgQCBQVVNIICByNSB0byBzdGFjaw0KKw0KKyAgICAgICAgICBAIG5vdCB1c2UgcmVnaXN0ZXJzOiByNCwgcjEwLCByMTIsIHIxNCwgcjUNCisgICAgICAgICAgTU9WICAgICAJCXI0LCByMTMgDQorICAgICAgICAgIE1PViAgICAgCQlyNSwgIzAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gMCAgICAgICAgICAgICAgDQorTE9PUDI6DQorICAgICAgICAgIExEUiAgICAgICAgICAgCXIwLCBbcjEwXQ0KKw0KKyAgICAgICAgICBMRFJTSCAgCSAgICAgICAgcjEsIFtyNF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHhbaV0NCisgICAgICAgICAgTERSU0ggICAJICAgICAgICByMiwgW3I0LCAjNjBdICAgICAgICAgICAgICBAIGxvYWQgeFtpICsgMzBdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNiwgW3I0LCAjMl0gICAgICAgICAgICAgICBAIGxvYWQgeFtpICsgMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI3LCBbcjQsICM1OF0gICAgICAgICAgICAgIEAgbG9hZCB4W2kgKyAyOV0NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHIxLCByMSwgcjIgICAgICAgICAgICAgICAgIEAgeFtpXSArIHhbaSArIDMwXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgQCB4W2kgKyAxXSArIHhbaSArIDI5XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjgsIFtyNCwgIzRdICAgICAgICAgICAgICAgQCBsb2FkIHhbaSArIDJdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOSwgW3I0LCAjNTZdICAgICAgICAgICAgICBAIGxvYWQgeFtpICsgMjhdDQorDQorICAgICAgICAgIFNNVUxCQiAgICAgICAgICAgICAgICByMTQsIHIxLCByMCAgICAgICAgICAgICAgICBAICh4W2ldICsgeFtpICsgMzBdKSAqIGZpcl83a1swXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjgsIHI4LCByOSAgICAgICAgICAgICAgICAgQCB4W2kgKyAyXSArIHhbaSArIDI4XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByNiwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpICsgMV0gKyB4W2kgKyAyOV0pICogZmlyXzdrWzFdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgICAgICAgICByMCwgW3IxMCwgIzRdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMSwgW3I0LCAjNl0gICAgICAgICAgICAgICBAIGxvYWQgeFtpKzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMiwgW3I0LCAjNTRdICAgICAgICAgICAgICBAIGxvYWQgeFtpKzI3XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjYsIFtyNCwgIzhdICAgICAgICAgICAgICAgQCBsb2FkIHhbaSs0XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjcsIFtyNCwgIzUyXSAgICAgICAgICAgICAgQCBsb2FkIHhbaSsyNl0NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHIxLCByMSwgcjIgICAgICAgICAgICAgICAgIEAgeFtpKzNdICsgeFtpKzI3XQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgQCB4W2krNF0gKyB4W2krMjZdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHI4LCByMCwgcjE0ICAgICAgICAgICBAICh4W2kgKyAyXSArIHhbaSArIDI4XSkgKiBmaXJfN2tbMl0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI4LCBbcjQsICMxMF0gICAgICAgICAgICAgIEAgbG9hZCB4W2krNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI5LCBbcjQsICM1MF0gICAgICAgICAgICAgIEAgbG9hZCB4W2krMjVdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgICAgICAgICByMTQsIHIxLCByMCwgcjE0ICAgICAgICAgICBAICh4W2krM10gKyB4W2krMjddKSAqIGZpcl83a1szXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjgsIHI4LCByOSAgICAgICAgICAgICAgICAgQCB4W2krNV0gKyB4W2krMjVdIA0KKyANCisgICAgICAgICAgTERSICAgICAgICAgICAgICAgICAgIHIwLCBbcjEwLCAjOF0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHIxLCBbcjQsICMxMl0gICAgICAgICAgICAgIEAgeFtpKzZdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMiwgW3I0LCAjNDhdICAgICAgICAgICAgICBAIHhbaSsyNF0NCisgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjYsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs0XSArIHhbaSsyNl0pICogZmlyXzdrWzRdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNiwgW3I0LCAjMTRdICAgICAgICAgICAgICBAIHhbaSs3XSANCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI3LCBbcjQsICM0Nl0gICAgICAgICAgICAgIEAgeFtpKzIzXQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByOCwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzVdICsgeFtpKzI1XSkgKiBmaXJfN2tbNV0NCisgICAgICAgICAgTERSICAgICAgICAgICAgICAgICAgIHIwLCBbcjEwLCAjMTJdDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByMSwgcjEsIHIyICAgICAgICAgICAgICAgICBAICh4W2krNl0gKyB4W2krMjRdKQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgQCAoeFtpKzddICsgeFtpKzIzXSkNCisgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjEsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSs2XSArIHhbaSsyNF0pICogZmlyXzdrWzZdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOCwgW3I0LCAjMTZdICAgICAgICAgICAgICBAIHhbaSs4XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjksIFtyNCwgIzQ0XSAgICAgICAgICAgICAgQCB4W2krMjJdIA0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByNiwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzddICsgeFtpKzIzXSkgKiBmaXJfN2tbN10gIA0KKyAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICMxNl0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHIxLCBbcjQsICMxOF0gICAgICAgICAgICAgIEAgeFtpKzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByMiwgW3I0LCAjNDJdICAgICAgICAgICAgICBAIHhbaSsyMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI2LCBbcjQsICMyMF0gICAgICAgICAgICAgIEAgeFtpKzEwXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjcsIFtyNCwgIzQwXSAgICAgICAgICAgICAgQCB4W2krMjBdDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByOCwgcjgsIHI5ICAgICAgICAgICAgICAgICBAICh4W2krOF0gKyB4W2krMjJdKQ0KKyAgICAgICAgICBBREQgICAgICAgICAgICAgICAgICAgcjEsIHIxLCByMiAgICAgICAgICAgICAgICAgQCAoeFtpKzldICsgeFtpKzIxXSkNCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgIEAgKHhbaSsxMF0gKyB4W2krMjBdKQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgICAgICAgICAgcjE0LCByOCwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzhdICsgeFtpKzIyXSkgKiBmaXJfN2tbOF0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHI4LCBbcjQsICMyMl0gICAgICAgICAgICAgIEAgeFtpKzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjksIFtyNCwgIzM4XSAgICAgICAgICAgICAgQCB4W2krMTldDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgICAgICAgICByMTQsIHIxLCByMCwgcjE0ICAgICAgICAgICBAICh4W2krOV0gKyB4W2krMjFdKSAqIGZpcl83a1s5XQ0KKyAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICMyMF0NCisgICAgICAgICAgTERSU0ggICAgICAgICAgICAgICAgIHIxLCBbcjQsICMyNF0gICAgICAgICAgICAgIEAgeFtpKzEyXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjIsIFtyNCwgIzM2XSAgICAgICAgICAgICAgQCB4W2krMThdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHI2LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krMTBdICsgeFtpKzIwXSkgKiBmaXJfN2tbMTBdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNiwgW3I0LCAjMjZdICAgICAgICAgICAgICBAIHhbaSsxM10NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgKHhbaSsxMV0gKyB4W2krMTldKSAgDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByNywgW3I0LCAjMzRdICAgICAgICAgICAgICBAIHhbaSsxN10NCisgICAgICAgICAgU01MQUJUICAgICAgICAgICAgICAgIHIxNCwgcjgsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSsxMV0gKyB4W2krMTldKSAqIGZpcl83a1sxMV0NCisgICAgICAgICAgTERSICAgICAgICAgICAgICAgICAgIHIwLCBbcjEwLCAjMjRdDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgICAgICByMSwgcjEsIHIyICAgICAgICAgICAgICAgICBAIHhbaSsxMl0gKyB4W2krMThdDQorICAgICAgICAgIExEUlNIICAgICAgICAgICAgICAgICByOCwgW3I0LCAjMjhdICAgICAgICAgICAgICBAIHhbaSsxNF0NCisgICAgICAgICAgU01MQUJCICAgICAgICAgICAgICAgIHIxNCwgcjEsIHIwLCByMTQgICAgICAgICAgIEAgKHhbaSsxMl0gKyB4W2krMThdKSAqIGZpcl83a1sxMl0NCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgIEAgKHhbaSsxM10gKyB4W2krMTddKQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjksIFtyNCwgIzMyXSAgICAgICAgICAgICAgQCB4W2krMTZdIA0KKyAgICAgICAgICBTTUxBQlQgICAgICAgICAgICAgICAgcjE0LCByNiwgcjAsIHIxNCAgICAgICAgICAgQCAoeFtpKzEzXSArIHhbaSsxN10pICogZmlyXzdrWzEzXQ0KKyAgICAgICAgICBMRFIgICAgICAgICAgICAgICAgICAgcjAsIFtyMTAsICMyOF0gICAgICAgICANCisgICAgICAgICAgQUREICAgICAgICAgICAgICAgICAgIHI4LCByOCwgcjkgICAgICAgICAgICAgICAgIEAgKHhbaSsxNF0gKyB4W2krMTZdKQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgICAgICAgICAgcjEsIFtyNCwgIzMwXSAgICAgICAgICAgICAgQCB4W2krMTVdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgICAgICAgICByMTQsIHI4LCByMCwgcjE0ICAgICAgICAgICBAICh4W2krMTRdICsgeFtpKzE2XSkgKiBmaXJfN2tbMTRdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgICAgICAgICByMTQsIHIxLCByMCwgcjE0ICAgICAgICAgICBAIHhbaSsxNV0gKiBmaXJfN2tbMTVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorICAgICAgICAgIEFERCAgICAgCQlyNSwgcjUsICMxDQorICAgICAgICAgIEFERCAgICAgCQlyMTQsIHIxNCwgIzB4NDAwMA0KKyAgICAgICAgICBBREQgICAgIAkJcjQsIHI0LCAjMiAgICAgICAgICAgICAgICANCisgICAgICAgICAgTU9WICAgICAJCXIxLCByMTQsIEFTUiAjMTUNCisgICAgICAgICAgQ01QICAgICAJCXI1LCAjODANCisgICAgICAgICAgU1RSSCAgICAJCXIxLCBbcjNdLCAjMiAgICAgICAgICAgICAgIEBzaWduYWxbaV0gPSAoTF90bXAgKyAweDQwMDApID4+IDE1DQorICAgICAgICAgIEJMVCAgICAgCQlMT09QMiAgICAgIA0KKyAgICAgICAgICAgDQorICAgICAgICAgIExEUiAgICAgCQlyMSwgW3NwLCAjLTRdICAgICAgICAgICAgICAgQG1lbSBhZGRyZXNzDQorICAgICAgICAgIEFERCAgICAgCQlyMCwgcjEzLCAjMTYwICAgICAgICAgICAgICAgQHggKyBsZw0KKyAgICAgICAgICBNT1YgICAgIAkJcjIsICMzMA0KKyAgICAgICAgICBCTCAgICAgIAkJdm9BV0JfQ29weQ0KKyAgICAgICAgICAgICAgICAgICAgDQorRmlsdF82a183a19lbmQ6DQorICAgICAgICAgIEFERCAgICAgCQlyMTMsIHIxMywgIzI0MCAgDQorICAgICAgICAgIExETUZEICAgCQlyMTMhLCB7cjQgLSByMTIsIHIxNX0gDQorIA0KK0xhYmxlMToNCisgICAgICAgICAgLndvcmQgICAJCWZpcl82a183aw0KKyAgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgICAuRU5EDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0MGEzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMKQEAgLTAsMCArMSwyMzEgQEAKK0AvKgorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorQCAqKgorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK0AgKioKK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorQCAqKgorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorQCAqLworCitAc3RhdGljIHZvaWQgTm9ybV9Db3JyIChXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB0YXJnZXQgdmVjdG9yICAgICAgICAgICAgICAqLworQCAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygc3ludGgvd2d0IGZpbHRlcnMgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBMX3N1YmZyLCAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzdWItZnJhbWUgbGVuZ3RoICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdF9taW4sICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBvZiBwaXRjaCBsYWcuICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0X21heCwgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtYXhpbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAqLworQCAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNvcnJfbm9ybVtdKSAgICAgICAgICAgICAgLyogKG8pIFExNSA6IG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gICAgKi8KK0AKKworQCByMCAtLS0gZXhjW10KK0AgcjEgLS0tIHhuW10KK0AgcjIgLS0tIGhbXQorQCByMyAtLS0gTF9zdWJmcgorQCByNCAtLS0gdF9taW4KK0AgcjUgLS0tIHRfbWF4CitAIHI2IC0tLSBjb3JyX25vcm1bXQorCisKKwkuc2VjdGlvbiAgLnRleHQgCisgICAgICAgIC5nbG9iYWwgICBOb3JtX2NvcnJfYXNtIAorICAgICAgICAuZXh0ZXJuICAgQ29udm9sdmVfYXNtCisgICAgICAgIC5leHRlcm4gICBJc3FydF9uCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitAIGNvbnN0YW50CitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisuZXF1ICAgICAgICAgRVhDICAgICAgICAgICAsICAgMAorLmVxdSAgICAgICAgIFhOICAgICAgICAgICAgLCAgIDQKKy5lcXUgICAgICAgICBIICAgICAgICAgICAgICwgICA4CisuZXF1ICAgICAgICAgTF9TVUJGUiAgICAgICAsICAgMTIKKy5lcXUgICAgICAgICB2b1NUQUNLICAgICAgICwgICAxNzIKKy5lcXUgICAgICAgICBUX01JTiAgICAgICAgICwgICAyMTIKKy5lcXUgICAgICAgICBUX01BWCAgICAgICAgICwgICAyMTYKKy5lcXUgICAgICAgICBDT1JSX05PUk0gICAgICwgICAyMjAKKyAgICAgICAgICAgICAgICAgIAorTm9ybV9jb3JyX2FzbToKKworICAgICAgICBTVE1GRCAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAgCisgICAgICAgIFNVQiAgICAgICAgcjEzLCByMTMsICN2b1NUQUNLCisgIAorICAgICAgICBBREQgICAgICAgIHI4LCByMTMsICMyMCAgICAgICAgICAgICAgICAgQGdldCB0aGUgZXhjZltMX1NVQkZSXQorICAgICAgICBMRFIgICAgICAgIHI0LCBbcjEzLCAjVF9NSU5dICAgICAgICAgICAgQGdldCB0X21pbgorICAgICAgICBSU0IgICAgICAgIHIxMSwgcjQsICMwICAgICAgICAgICAgICAgICAgQGsgPSAtdF9taW4KKyAgICAgICAgQUREICAgICAgICByNSwgcjAsIHIxMSwgTFNMICMxICAgICAgICAgIEBnZXQgdGhlICZleGNba10gICAKKyAgICAgICAgCisgICAgICAgIEB0cmFuc2ZlciBDb252b2x2ZSBmdW5jdGlvbgorICAgICAgICBTVE1GRCAgICAgICBzcCEsIHtyMCAtIHIzfQorICAgICAgICBNT1YgICAgICAgICByMCwgcjUKKyAgICAgICAgTU9WICAgICAgICAgcjEsIHIyCisgICAgICAgIE1PViAgICAgICAgIHIyLCByOCAgICAgICAgICAgICAgICAgICAgICAgQHIyIC0tLSBleGNmW10KKyAgICAgICAgQkwgICAgICAgICAgQ29udm9sdmVfYXNtCisgICAgICAgIExETUZEICAgICAgIHNwISwge3IwIC0gcjN9CisKKyAgICAgICAgQCByOCAtLS0gZXhjZltdCisKKwlNT1YgICAgICAgICByMTQsIHIxICAgICAgICAgICAgICAgICAgICAgICBAY29weSB4bltdIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIE1PViAgICAgICAgIHI1LCAjNjQKKyAgICAgICAgTU9WICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICBATF90bXAgPSAwCisgICAgICAgIE1PViAgICAgICAgIHI3LCAjMQorCitMT09QMToKKyAgICAgICAgTERSICAgICAgICAgcjksICBbcjE0XSwgIzQKKwlMRFIgICAgICAgICByMTAsIFtyMTRdLCAjNAorCUxEUiAgICAgICAgIHIxMSwgW3IxNF0sICM0CisJTERSICAgICAgICAgcjEyLCBbcjE0XSwgIzQKKwlTTUxBQkIgICAgICByNiwgcjksIHI5LCByNiAgICAgICAgICAgICAgIEBMX3RtcCArPSAoeG5baV0gKiB4bltpXSkKKwlTTUxBVFQgICAgICByNiwgcjksIHI5LCByNiAgICAgICAgICAgICAgIEBMX3RtcCArPSAoeG5baSsxXSAqIHhuW2krMV0pCisgICAgICAgIFNNTEFCQiAgICAgIHI2LCByMTAsIHIxMCwgcjYKKwlTTUxBVFQgICAgICByNiwgcjEwLCByMTAsIHI2CisJU01MQUJCICAgICAgcjYsIHIxMSwgcjExLCByNgorICAgICAgICBTTUxBVFQgICAgICByNiwgcjExLCByMTEsIHI2CisgICAgICAgIFNNTEFCQiAgICAgIHI2LCByMTIsIHIxMiwgcjYKKyAgICAgICAgU01MQVRUICAgICAgcjYsIHIxMiwgcjEyLCByNgorICAgICAgICBTVUJTICAgICAgICByNSwgcjUsICM4CisgICAgICAgIEJORSAgICAgICAgIExPT1AxCisKKwlBREQgICAgICAgICByOSwgcjcsIHI2LCBMU0wgIzEgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCAxKSArIDEKKwlDTFogICAgICAgICByNywgcjkKKwlTVUIgICAgICAgICByNiwgcjcsICMxICAgICAgICAgICAgICAgICAgIEBleHAgPSBub3JtX2woTF90bXApCisgICAgICAgIFJTQiAgICAgICAgIHI3LCByNiwgIzMyICAgICAgICAgICAgICAgICAgQGV4cCA9IDMyIC0gZXhwCisJTU9WICAgICAgICAgcjYsIHI3LCBBU1IgIzEgICAgICAgICAKKwlSU0IgICAgICAgICByNywgcjYsICMwICAgICAgICAgICAgICAgICAgIEBzY2FsZSA9IC0oZXhwID4+IDEpCisJCisgICAgICAgIEBsb29wIGZvciBldmVyeSBwb3NzaWJsZSBwZXJpb2QKKwlAZm9yKHQgPSB0X21pbkAgdCA8PSB0X21heEAgdCsrKQorCUByNyAtLS0gc2NhbGUgcjQgLS0tIHRfbWluIHI4IC0tLSBleGNmW10KKworTE9PUEZPUjoJCisgICAgICAgIE1PViAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgQExfdG1wICA9IDAKKwlNT1YgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICAgICAgIEBMX3RtcDEgPSAwCisJTU9WICAgICAgICAgcjksICM2NCAgCisJTU9WICAgICAgICAgcjEyLCByMSAgICAgICAgICAgICAgICAgICAgICBAY29weSBvZiB4bltdCisJQUREICAgICAgICAgcjE0LCByMTMsICMyMCAgICAgICAgICAgICAgICBAY29weSBvZiBleGNmW10KKwlNT1YgICAgICAgICByOCwgIzB4ODAwMAorICAgICAgICAJCitMT09QaToKKwlMRFIgICAgICAgICByMTEsIFtyMTRdLCAjNCAgICAgICAgICAgICAgIEBsb2FkIGV4Y2ZbaV0sIGV4Y2ZbaSsxXQorICAgICAgICBMRFIgICAgICAgICByMTAsIFtyMTJdLCAjNCAgICAgICAgICAgICAgIEBsb2FkIHhuW2ldLCB4bltpKzFdCisJU01MQUJCICAgICAgcjYsIHIxMSwgcjExLCByNiAgICAgICAgICAgICBATF90bXAxICs9IGV4Y2ZbaV0gKiBleGNmW2ldCisJU01MQVRUICAgICAgcjYsIHIxMSwgcjExLCByNiAgICAgICAgICAgICBATF90bXAxICs9IGV4Y2ZbaSsxXSAqIGV4Y2ZbaSsxXQorICAgICAgICBTTUxBQkIgICAgICByNSwgcjEwLCByMTEsIHI1ICAgICAgICAgICAgIEBMX3RtcCArPSB4bltpXSAqIGV4Y2ZbaV0KKwlTTUxBVFQgICAgICByNSwgcjEwLCByMTEsIHI1ICAgICAgICAgICAgIEBMX3RtcCArPSB4bltpKzFdICogZXhjZltpKzFdCisJTERSICAgICAgICAgcjExLCBbcjE0XSwgIzQgICAgICAgICAgICAgICBAbG9hZCBleGNmW2krMl0sIGV4Y2ZbaSszXQorCUxEUiAgICAgICAgIHIxMCwgW3IxMl0sICM0ICAgICAgICAgICAgICAgQGxvYWQgeG5baSsyXSwgeG5baSszXQorICAgICAgICBTTUxBQkIgICAgICByNiwgcjExLCByMTEsIHI2CisJU01MQVRUICAgICAgcjYsIHIxMSwgcjExLCByNgorCVNNTEFCQiAgICAgIHI1LCByMTAsIHIxMSwgcjUKKwlTTUxBVFQgICAgICByNSwgcjEwLCByMTEsIHI1CisJU1VCUyAgICAgICAgcjksIHI5LCAjNAorICAgICAgICBCTkUgICAgICAgICBMT09QaQorCisJQHI1IC0tLSBMX3RtcCwgcjYgLS0tIExfdG1wMQorCU1PViAgICAgICAgIHIxMCwgIzEKKwlBREQgICAgICAgICByNSwgcjEwLCByNSwgTFNMICMxICAgICAgICAgIEBMX3RtcCA9IChMX3RtcCA8PCAxKSArIDEKKwlBREQgICAgICAgICByNiwgcjEwLCByNiwgTFNMICMxICAgICAgICAgIEBMX3RtcDEgPSAoTF90bXAxIDw8IDEpICsgMQorIAorCUNMWiAgICAgICAgIHIxMCwgcjUgICAgICAgIAorCUNNUCAgICAgICAgIHI1LCAjMAorCVJTQkxUICAgICAgIHIxMSwgcjUsICMwCisJQ0xaTFQgICAgICAgcjEwLCByMTEKKwlTVUIgICAgICAgICByMTAsIHIxMCwgIzEgICAgICAgICAgICAgICAgIEBleHAgPSBub3JtX2woTF90bXApCisgICAgIAorCU1PViAgICAgICAgIHI1LCByNSwgTFNMIHIxMCAgICAgICAgICAgICAgQExfdG1wID0gKExfdG1wIDw8IGV4cCkKKwlSU0IgICAgICAgICByMTAsIHIxMCwgIzMwICAgICAgICAgICAgICAgIEBleHBfY29yciA9IDMwIC0gZXhwCisJTU9WICAgICAgICAgcjExLCByNSwgQVNSICMxNiAgICAgICAgICAgICBAY29yciA9IGV4dHJhY3RfaChMX3RtcCkKKworCUNMWiAgICAgICAgIHI1LCByNgorCVNVQiAgICAgICAgIHI1LCByNSwgIzEKKwlNT1YgICAgICAgICByNiwgcjYsIExTTCByNSAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcDEgPDwgZXhwKQorCVJTQiAgICAgICAgIHI1LCByNSwgIzMwICAgICAgICAgICAgICAgICAgQGV4cF9ub3JtID0gMzAgLSBleHAKKworCUByMTAgLS0tIGV4cF9jb3JyLCByMTEgLS0tIGNvcnIKKwlAcjYgIC0tLSBMX3RtcCwgcjUgLS0tIGV4cF9ub3JtCisKKwlASXNxcnRfbigmTF90bXAsICZleHBfbm9ybSkKKworCU1PViAgICAgICAgIHIxNCwgcjAKKwlNT1YgICAgICAgICByMTIsIHIxIAorCisgICAgICAgIFNUTUZEICAgICAgIHNwISwge3IwIC0gcjQsIHI3IC0gcjEyLCByMTR9CisJQUREICAgICAgICAgcjEsIHNwLCAjNAorCUFERCAgICAgICAgIHIwLCBzcCwgIzAKKwlTVFIgICAgICAgICByNiwgW3NwXQorCVNUUkggICAgICAgIHI1LCBbc3AsICM0XQorCUJMICAgICAgICAgIElzcXJ0X24KKwlMRFIgICAgICAgICByNiwgW3NwXQorCUxEUlNIICAgICAgIHI1LCBbc3AsICM0XQorICAgICAgICBMRE1GRCAgICAgICBzcCEsIHtyMCAtIHI0LCByNyAtIHIxMiwgcjE0fQorCU1PViAgICAgICAgIHIwLCByMTQKKwlNT1YgICAgICAgICByMSwgcjEyCisKKworCU1PViAgICAgICAgIHI2LCByNiwgQVNSICMxNiAgICAgICAgICAgICAgQG5vcm0gPSBleHRyYWN0X2goTF90bXApCisJTVVMICAgICAgICAgcjEyLCByNiwgcjExCisJQUREICAgICAgICAgcjEyLCByMTIsIHIxMiAgICAgICAgICAgICAgICBATF90bXAgPSB2b19MX211bHQoY29yciwgbm9ybSkKKyAgCisJQUREICAgICAgICAgcjYsIHIxMCwgcjUKKwlBREQgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgIEBleHBfY29yciArIGV4cF9ub3JtICsgc2NhbGUKKworICAgICAgICBDTVAgICAgICAgICByNiwgIzAKKyAgICAgICAgUlNCTFQgICAgICAgcjYsIHI2LCAjMAorCU1PVkxUICAgICAgIHIxMiwgcjEyLCBBU1IgcjYKKyAgICAgICAgTU9WR1QgICAgICAgcjEyLCByMTIsIExTTCByNiAgICAgICAgICAgICBATF90bXAgPSBMX3NobChMX3RtcCwgZXhwX2NvcnIgKyBleHBfbm9ybSArIHNjYWxlKQorCisgICAgICAgIEFERCAgICAgICAgIHIxMiwgcjEyLCByOAorICAgICAgICBNT1YgICAgICAgICByMTIsIHIxMiwgQVNSICMxNiAgICAgICAgICAgIEB2b19yb3VuZChMX3RtcCkKKworICAgICAgICBMRFIgICAgICAgICByNSwgW3IxMywgI0NPUlJfTk9STV0gICAgICAgIEAgZ2V0IGNvcnJfbm9ybSBhZGRyZXNzCisJTERSICAgICAgICAgcjYsIFtyMTMsICNUX01BWF0gICAgICAgICAgICBAIGdldCB0X21heAorCUFERCAgICAgICAgIHIxMCwgcjUsIHI0LCBMU0wgIzEgICAgICAgICAgQCBnZXQgY29ycl9ub3JtW3RdIGFkZHJlc3MKKwlTVFJIICAgICAgICByMTIsIFtyMTBdICAgICAgICAgICAgICAgICAgIEAgY29ycl9ub3JtW3RdID0gdm9fcm91bmQoTF90bXApCisKKwlDTVAgICAgICAgICByNCwgcjYKKwlCRVEgICAgICAgICBOb3JtX2NvcnJfYXNtX2VuZAorIAorCUFERCAgICAgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgQCB0X21pbiArKworICAgICAgICAKKwlSU0IgICAgICAgICByNSwgcjQsICMwICAgICAgICAgICAgICAgICAgIEAgaworCisJTU9WICAgICAgICAgcjYsICM2MyAgICAgICAgICAgICAgICAgICAgICBAIGkgPSA2MworCU1PViAgICAgICAgIHI4LCByMCAgICAgICAgICAgICAgICAgICAgICAgQCBleGNbXQorCU1PViAgICAgICAgIHI5LCByMiAgICAgICAgICAgICAgICAgICAgICAgQCBoW10KKwlBREQgICAgICAgICByMTAsIHIxMywgIzIwICAgICAgICAgICAgICAgIEAgZXhjZltdCisKKwlBREQgICAgICAgICByOCwgcjgsIHI1LCBMU0wgIzEgICAgICAgICAgIEAgZXhjW2tdIGFkZHJlc3MKKwlBREQgICAgICAgICByOSwgcjksIHI2LCBMU0wgIzEgICAgICAgICAgIEAgaFtpXSBhZGRyZXNzCisJQUREICAgICAgICAgcjEwLCByMTAsIHI2LCBMU0wgIzEgICAgICAgICBAIGV4Y2ZbaV0gYWRkcmVzcworCUxEUlNIICAgICAgIHIxMSwgW3I4XSAgICAgICAgICAgICAgICAgICAgQCB0bXAgPSBleGNba10KKworTE9PUEs6CisgICAgICAgIExEUlNIICAgICAgIHI4LCBbcjldLCAjLTIgICAgICAgICAgICAgICAgQCBsb2FkIGhbaV0KKwlMRFJTSCAgICAgICByMTIsIFtyMTAsICMtMl0gICAgICAgICAgICAgIEAgbG9hZCBleGNmW2kgLSAxXQorCU1VTCAgICAgICAgIHIxNCwgcjExLCByOAorCU1PViAgICAgICAgIHI4LCByMTQsIEFTUiAjMTUKKwlBREQgICAgICAgICByMTQsIHI4LCByMTIKKwlTVFJIICAgICAgICByMTQsIFtyMTBdLCAjLTIKKwlTVUJTICAgICAgICByNiwgcjYsICMxCisJQkdUICAgICAgICAgTE9PUEsKKworCUxEUlNIICAgICAgIHI4LCBbcjldICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGhbMF0KKwlNVUwgICAgICAgICByMTQsIHIxMSwgcjgKKyAgICAgICAgTERSICAgICAgICAgcjYsIFtyMTMsICNUX01BWF0gICAgICAgICAgICBAIGdldCB0X21heAorCU1PViAgICAgICAgIHI4LCByMTQsIEFTUiAjMTUKKwlTVFJIICAgICAgICByOCwgW3IxMF0gICAgICAgICAgICAgICAgICAgIAorCisJQ01QICAgICAgICAgcjQsIHI2CisJQkxFICAgICAgICAgTE9PUEZPUgorCitOb3JtX2NvcnJfYXNtX2VuZDogCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICByMTMsIHIxMywgI3ZvU1RBQ0sgICAgICAKKyAgICAgICAgTERNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9CisgICAgCisgICAgICAgIC5FTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNjYzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9TeW5fZmlsdF8zMl9vcHQucwpAQCAtMCwwICsxLDIyNiBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgU3luX2ZpbHRfMzIoDQorQCAgICAgV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovDQorQCAgICAgV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUW5ldzogZXhjaXRhdGlvbiAoZXhjW2ldID4+IFFuZXcpICAgICovDQorQCAgICAgV29yZDE2IFFuZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpICovDQorQCAgICAgV29yZDE2IHNpZ19oaVtdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGhpZ2ggICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IHNpZ19sb1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGxvdyAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IGxnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICovDQorQCkNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQA0KK0AgYVtdICAgICAgLS0tIHIwDQorQCBtICAgICAgICAtLS0gcjENCitAIGV4Y1tdICAgIC0tLSByMg0KK0AgUW5ldyAgICAgLS0tIHIzDQorQCBzaWdfaGlbXSAtLS0gcjQNCitAIHNpZ19sb1tdIC0tLSByNQ0KK0AgbGcgICAgICAgLS0tIHI2DQorDQorICAgICAgICAgIC5zZWN0aW9uICAudGV4dA0KKyAgICAgICAgICAuZ2xvYmFsICBTeW5fZmlsdF8zMl9hc20NCisNCitTeW5fZmlsdF8zMl9hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSANCisgICAgICAgICAgTERSICAgICAgICAgICByNCwgIFtyMTMsICM0MF0gICAgICAgICAgICAgICAgICBAIGdldCBzaWdfaGlbXSBhZGRyZXNzDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjUsICBbcjEzLCAjNDRdICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnX2xvW10gYWRkcmVzcw0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVswXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHI3LCAgcjMsICM0ICAgICAgICAgICAgICAgICAgICAgIEAgNCArIFFfbmV3DQorICAgICAgICAgIE1PViAgICAgICAgICAgcjMsIHI2LCBBU1IgcjcgICAgICAgICAgICAgICAgICAgQCBhMCA9IEFxWzBdID4+ICg0ICsgUV9uZXcpDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjE0LCA9MHhmZmZmDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzJdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzRdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzJdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjgsIFtyMCwgIzZdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyMCwgIzhdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzRdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOCwgcjgsIHIxNA0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbMl0gLS0gQXFbMV0NCisgICAgICAgICAgT1JSICAgICAgICAgICByMTEsIHI4LCByOSwgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzRdIC0tIEFxWzNdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTRdICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjExLCBbcjEzLCAjLThdDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzEwXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzVdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzEyXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzZdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjgsIFtyMCwgIzE0XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzddDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyMCwgIzE2XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzhdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOCwgcjgsIHIxNA0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbNl0gLS0gQXFbNV0NCisgICAgICAgICAgT1JSICAgICAgICAgICByMTEsIHI4LCByOSwgTFNMICMxNiAgICAgICAgICAgICBAIEFxWzhdIC0tIEFxWzddDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTEyXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0xNl0NCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IwLCAjMThdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbOV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjMjBdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMTBdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjgsIFtyMCwgIzIyXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMyNF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxMl0NCisgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNCANCisgICAgICAgICAgQU5EICAgICAgICAgICByOCwgcjgsIHIxNA0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgQXFbMTBdIC0tIEFxWzldDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjExLCByOCwgcjksIExTTCAjMTYgICAgICAgICAgICAgQCBBcVsxMl0gLS0gQXFbMTFdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTIwXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yNF0gIA0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMyNl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxM10NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjMjhdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgQXFbMTRdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjgsIFtyMCwgIzMwXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIEFxWzE1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICMzMl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVsxNl0NCisgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNA0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI4LCByOCwgcjE0DQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEwLCByNiwgcjcsIExTTCAjMTYgICAgICAgICAgICAgQCBBcVsxNF0gLS0gQXFbMTNdDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjExLCByOCwgcjksIExTTCAjMTYgICAgICAgICAgICAgQCBBcVsxNl0gLS0gQXFbMTVdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTI4XQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0zMl0NCisgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpID0gMA0KKyAgICAgICAgICAgICAgDQorTE9PUDogICAgICAgICAgICANCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3I1LCAjLTJdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3I1LCAjLTRdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMl0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtNF0gICAgICAgICAgICAgICAgICBAIEFxWzJdIC0tIEFxWzFdICAgICAgICANCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3I1LCAjLTZdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktM10NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNSwgIy04XSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktNF0NCisNCisgICAgICAgICAgU01VTEJCICAgICAgICByMTIsIHI2LCByMTEgICAgICAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTFdICogQXFbMV0NCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3I1LCAjLTEwXSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktNV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTJdICogQXFbMl0NCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtOF0gICAgICAgICAgICAgICAgICBAIEFxWzRdIC0tIEFxWzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyNSwgIy0xMl0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTZdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0zXSAqIEFxWzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyNSwgIy0xNF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTddDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByMTAsIHIxMSwgcjEyICAgICAgICAgICAgICAgQCBzaWdfbG9baS00XSAqIEFxWzRdDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTEyXSAgICAgICAgICAgICAgICAgQCBBcVs2XSAtLSBBcVs1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I1LCAjLTE2XSAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS04XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktNV0gKiBBcVs1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3I1LCAjLTE4XSAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS05XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktNl0gKiBBcVs2XQ0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0xNl0gICAgICAgICAgICAgICAgIEAgQXFbOF0gLS0gQXFbN10NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgIFtyNSwgIy0yMF0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2xvW2ktMTBdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS03XSAqIEFxWzddDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyNSwgIy0yMl0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTExXQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjEwLCByMTEsIHIxMiAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktOF0gKiBBcVs4XQ0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yMF0gICAgICAgICAgICAgICAgIEAgQXFbMTBdIC0tIEFxWzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLFtyNSwgIy0yNF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19sb1tpLTEyXQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktOV0gKiBBcVs5XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjUsICMtMjZdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0xM10NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHI3LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTEwXSAqIEFxWzEwXQ0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yNF0gICAgICAgICAgICAgICAgIEAgQXFbMTJdIC0tIEFxWzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI3LCBbcjUsICMtMjhdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0xNF0NCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI5LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTExXSAqIEFxWzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjUsICMtMzBdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0xNV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTEyXSAqIEFxWzEyXQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yOF0gICAgICAgICAgICAgICAgIEAgQXFbMTRdIC0tIEFxWzEzXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I1LCAjLTMyXSAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfbG9baS0xNl0NCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI2LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTEzXSAqIEFxWzEzXQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2xvW2ktMTRdICogQXFbMTRdDQorIA0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0zMl0gICAgICAgICAgICAgICAgIEAgQXFbMTZdIC0tIEFxWzE1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjJdLCMyICAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBleGNbaV0gDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfbG9baS0xNV0gKiBBcVsxNV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19sb1tpLTE2XSAqIEFxWzE2XQ0KKyAgICAgICAgICBNVUwgICAgICAgICAgIHI3LCByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgIEAgZXhjW2ldICogYTAgDQorICAgICAgICAgIFJTQiAgICAgICAgICAgcjE0LCByMTIsICMwICAgICAgICAgICAgICAgICAgICAgQCBMX3RtcA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHIxNCwgcjE0LCBBU1IgIzExICAgICAgICAgICAgICAgIEAgTF90bXAgPj49IDExDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjE0LCByMTQsIHI3LCBMU0wgIzEgICAgICAgICAgICAgQCBMX3RtcCArPSAoZXhjW2ldICogYTApIDw8IDENCisNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3I0LCAjLTJdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3I0LCAjLTRdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktMl0NCisNCisgICAgICAgICAgTERSICAgICAgICAgICByMTEsIFtyMTMsICMtNF0gICAgICAgICAgICAgICAgICBAIEFxWzJdIC0tIEFxWzFdICAgICAgICANCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3I0LCAjLTZdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktM10NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyNCwgIy04XSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktNF0NCisgICAgICAgICAgU01VTEJCICAgICAgICByMTIsIHI2LCByMTEgICAgICAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTFdICogQXFbMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3I0LCAjLTEwXSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktNV0NCisJICBTTUxBQlQgICAgICAgIHIxMiwgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMl0gKiBBcVsyXQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy04XSAgICAgICAgICAgICAgICAgIEAgQXFbNF0gLS0gQXFbM10NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3I0LCAjLTEyXSAgICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktNl0NCisNCisgICAgICAgICAgU01MQUJCICAgICAgICByMTIsIHI5LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTNdICogQXFbM10NCisJICBMRFJTSCAgICAgICAgIHI5LCBbcjQsICMtMTRdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS03XQ0KKw0KKwkgIFNNTEFCVCAgICAgICAgcjEyLCByMTAsIHIxMSwgcjEyICAgICAgICAgICAgICAgQCBzaWdfaGlbaS00XSAqIEFxWzRdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTEyXSAgICAgICAgICAgICAgICAgQCBBcVs2XSAtLSBBcVs1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I0LCAjLTE2XSAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS04XQ0KKw0KKwkgIFNNTEFCQiAgICAgICAgcjEyLCByNiwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS01XSAqIEFxWzVdDQorDQorCSAgTERSU0ggICAgICAgICByNiwgIFtyNCwgIy0xOF0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktOV0NCisJICBTTUxBQlQgICAgICAgIHIxMiwgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktNl0gKiBBcVs2XQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0xNl0gICAgICAgICAgICAgICAgIEAgQXFbOF0gLS0gQXFbN10NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgIFtyNCwgIy0yMF0gICAgICAgICAgICAgICAgICBAIGxvYWQgc2lnX2hpW2ktMTBdDQorDQorCSAgU01MQUJCICAgICAgICByMTIsIHI5LCByMTEsIHIxMiAgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTddICogQXFbN10NCisNCisJICBMRFJTSCAgICAgICAgIHI5LCBbcjQsICMtMjJdICAgICAgICAgICAgICAgICAgIEAgbG9hZCBzaWdfaGlbaS0xMV0NCisNCisJICBTTUxBQlQgICAgICAgIHIxMiwgcjEwLCByMTEsIHIxMiAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktOF0gKiBBcVs4XQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgW3IxMywgIy0yMF0gICAgICAgICAgICAgICAgIEAgQXFbMTBdIC0tIEFxWzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLFtyNCwgIy0yNF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTEyXQ0KKw0KKwkgIFNNTEFCQiAgICAgICAgcjEyLCByNiwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS05XSAqIEFxWzldDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyNCwgIy0yNl0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTEzXQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjcsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTBdICogQXFbMTBdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTI0XSAgICAgICAgICAgICAgICAgQCBBcVsxMl0gLS0gQXFbMTFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyNCwgIy0yOF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTE0XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjksIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTFdICogQXFbMTFdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyNCwgIy0zMF0gICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTE1XQ0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxMiwgcjEwLCByMTEsIHIxMiAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTJdICogQXFbMTJdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTI4XSAgICAgICAgICAgICAgICAgQCBBcVsxNF0gLS0gQXFbMTNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjQsICMtMzJdICAgICAgICAgICAgICAgICAgQCBsb2FkIHNpZ19oaVtpLTE2XQ0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxMiwgcjYsIHIxMSwgcjEyICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ktMTNdICogQXFbMTNdDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjEyLCByNywgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS0xNF0gKiBBcVsxNF0NCisgDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjExLCBbcjEzLCAjLTMyXSAgICAgICAgICAgICAgICAgQCBBcVsxNl0gLS0gQXFbMTVdDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjEyLCByOSwgcjExLCByMTIgICAgICAgICAgICAgICAgQCBzaWdfaGlbaS0xNV0gKiBBcVsxNV0NCisgICAgICAgICAgU01MQUJUICAgICAgICByMTIsIHIxMCwgcjExLCByMTIgICAgICAgICAgICAgICBAIHNpZ19oaVtpLTE2XSAqIEFxWzE2XSAgICAgICANCisgICAgICAgICAgQUREICAgICAgICAgICByNiwgcjEyLCByMTIgICAgICAgICAgICAgICAgICAgICBAIHIxMiA8PCAxDQorICAgICAgICAgIFNVQiAgICAgICAgICAgcjE0LCByMTQsIHI2ICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCByMTQsIExTTCAjMyAgICAgICAgICAgICAgICAgQCBMX3RtcCA8PD0zDQorICANCisgICAgICAgICAgTU9WICAgICAgICAgICByNywgcjE0LCBBU1IgIzE2ICAgICAgICAgICAgICAgICBAIExfdG1wID4+IDE2DQorDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCByMTQsIEFTUiAjNCAgICAgICAgICAgICAgICAgQCBMX3RtcCA+Pj00DQorICAgICAgICAgIFNUUkggICAgICAgICAgcjcsIFtyNF0sICMyICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2lnX2hpW2ldID0gTF90bXAgPj4gMTYNCisgICAgICAgICAgU1VCICAgICAgICAgICByOSwgcjE0LCByNywgTFNMICMxMiAgICAgICAgICAgICBAIHNpZ19sb1tpXSA9IExfdG1wIC0gKHNpZ19oaVtpXSA8PCAxMikNCisNCisgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjgsICMxDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjksIFtyNV0sICMyICAgDQorICAgICAgICAgIENNUCAgICAgICAgICAgcjgsICM2NA0KKyAgICAgICAgICBCTFQgICAgICAgICAgIExPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgDQorU3luX2ZpbHRfMzJfZW5kOg0KKwkJICAgICANCisgICAgICAgICAgTERNRkQgICAJICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKyANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyOGJkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucwpAQCAtMCwwICsxLDE4NiBAQAorQC8qCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCitAICoqCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQCAqKgorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitAICoqCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitAICovCisKKworQCp2b2lkIENvbnZvbHZlICgKK0AqICAgIFdvcmQxNiB4W10sICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqICAgIFdvcmQxNiBoW10sICAgICAgICAvKiAoaSkgICAgIDogaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqICAgIFdvcmQxNiB5W10sICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqICAgIFdvcmQxNiBMICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0AqKQorQCAgcjAgLS0tIHhbXQorQCAgcjEgLS0tIGhbXQorQCAgcjIgLS0tIHlbXQorQCAgcjMgLS0tIEwKKworCS5zZWN0aW9uICAudGV4dAorICAgICAgICAuZ2xvYmFsICAgQ29udm9sdmVfYXNtIAorCitDb252b2x2ZV9hc206CisKKyAgICAgICAgU1RNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9ICAKKyAgICAgICAgTU9WICAgICAgICAgICAgcjMsICAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbgorCU1PViAgICAgICAgICAgIHIxMSwgIzB4ODAwMAorICAgICAgICAKK0xPT1A6IAorICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHIzLCBMU0wgIzEgICAgICAgICAgICAgICAgQCB0bXBIIGFkZHJlc3MKKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIzLCAjMSAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IG4gKyAxCisgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRtcFggPSB4CisgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorICAgICAgICBTVUIgICAgICAgICAgICByNSwgcjUsICMxCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCAgcjksIHIxMCAKKworTE9PUDE6ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgQ01QICAgICAgICAgICAgcjUsICMwCisgICAgICAgIEJMRSAgICAgICAgICAgIEwxCisJTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAorCU1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjgKKwlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCUxEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4CisgICAgICAgIFNVQlMgICAgICAgICAgIHI1LCByNSwgIzQgCisJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorICAgIAorICAgICAgICBCICAgICAgICAgICAgICBMT09QMSAgCisKK0wxOiAgICAgICAgICAgICAgICAgIAorCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMTEsIHI4LCBMU0wgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjUsIHI1LCBMU1IgIzE2ICAgICAgICAgICAgICAgICAgIEBleHRyYWN0X2gocykKKyAgICAgICAgQUREICAgICAgICAgICAgcjMsIHIzLCAjMQorICAgICAgICBTVFJIICAgICAgICAgICByNSwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KKworCisgICAgICAgIEFERCAgICAgICAgICAgIHI0LCByMSwgcjMsIExTTCAjMSAgICAgICAgICAgICAgICBAdG1wSCBhZGRyZXNzCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwCisgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMgorCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCByOSwgcjEwCisgICAgICAgIFNVQiAgICAgICAgICAgIHI1LCByNSwgIzIKKyAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorICAgICAgICAKK0xPT1AyOgorICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKKyAgICAgICAgQkxFICAgICAgICAgICAgTDIKKwlMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCUxEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTUxBICAgICAgICAgICAgcjgsIHI5LCByMTAsIHI4CisJTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOAorCUxEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4CisgICAgICAgIEIgICAgICAgICAgICAgIExPT1AyCisKK0wyOgorICAgICAgICBBREQgICAgICAgICAgICByOCwgcjExLCByOCwgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI4LCByOCwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEgIAorICAgICAgICBTVFJIICAgICAgICAgICByOCwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KKworICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHIzLCBMU0wgIzEKKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIzLCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAKKyAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyCisgICAgICAgIExEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yCisgICAgICAgIE1VTCAgICAgICAgICAgIHI4LCByOSwgcjEwCisgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIKKyAgICAgICAgTUxBICAgICAgICAgICAgcjgsIHIxMiwgcjE0LCByOCAKKyAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMworICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKworTE9PUDM6CisgICAgICAgIENNUCAgICAgICAgICAgIHI1LCAjMAorICAgICAgICBCTEUgICAgICAgICAgICBMMworCUxEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4CisJTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAorICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0IAorCU1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjggCisgICAgICAgIEIgICAgICAgICAgICAgIExPT1AzICAgCisKK0wzOgorICAgICAgICBBREQgICAgICAgICAgICByOCwgcjExLCByOCwgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI4LCByOCwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgcjgsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgIEB5W25dCisKKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIzLCAjMSAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IG4gKyAxCisgICAgICAgIEFERCAgICAgICAgICAgIHI0LCByMSwgcjMsIExTTCAjMSAgICAgICAgICAgICAgICBAIHRtcEggYWRkcmVzcworICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAKKyAgICAgICAgTU9WICAgICAgICAgICAgcjgsICMwCisKK0xPT1A0OiAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgIHI1LCAjMAorICAgICAgICBCTEUgICAgICAgICAgICBMNAorCUxEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIgICAgICAgICAgICAgICAgICAgICBAICp0bXBYKysKKwlMRFJTSCAgICAgICAgICByMTAsIFtyNF0sICMtMiAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisJTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxNCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlNTEEgICAgICAgICAgICByOCwgcjksIHIxMCwgcjgKKwlNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4CisJTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworCUxEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICBAICp0bXBILS0KKwlMRFJTSCAgICAgICAgICByMTIsIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisJTERSU0ggICAgICAgICAgcjE0LCBbcjRdLCAjLTIgICAgICAgICAgICAgICAgICAgIEAgKnRtcEgtLQorCU1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAorICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0IAorCU1MQSAgICAgICAgICAgIHI4LCByMTIsIHIxNCwgcjggICAgICAgIAorICAgICAgICBCICAgICAgICAgICAgICBMT09QNCAgICAKK0w0OiAgICAgICAgICAgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICByNSwgcjExLCByOCwgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI1LCByNSwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEKKyAgICAgICAgU1RSSCAgICAgICAgICAgcjUsIFtyMl0sICMyICAgICAgICAgICAgICAgICAgICAgIEB5W25dCisgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICByMywgIzY0CisgICAgICAgIEJMVCAgICAgICAgICAgIExPT1AKKyAgICAgICAgICAgICAgICAKK0NvbnZvbHZlX2FzbV9lbmQ6IAorIAorICAgICAgICBMRE1GRCAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQorICAgIAorICAgICAgICBARU5ERlVOQworICAgICAgICAuRU5ECisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxYjk4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMKQEAgLTAsMCArMSwxNTEgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQHN0YXRpYyB2b2lkIGNvcl9oX3ZlY18wMTIoDQorQAkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICovDQorQAkJV29yZDE2IHZlY1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIHZlY3RvciAoLzgpIHRvIGNvcnJlbGF0ZSB3aXRoIGhbXSAqLw0KK0AJCVdvcmQxNiB0cmFjaywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHRyYWNrIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK0AJCVdvcmQxNiBzaWduW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNpZ24gdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KK0AJCVdvcmQxNiBycml4aXhbXVtOQl9QT1NdLCAgICAgICAgICAgICAgLyogKGkpIGNvcnJlbGF0aW9uIG9mIGhbeF0gd2l0aCBoW3hdICAgICAgKi8NCitACQlXb3JkMTYgY29yXzFbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCitACQlXb3JkMTYgY29yXzJbXSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCitAKQ0KK0ByMCAtLS0tIGhbXQ0KK0ByMSAtLS0tIHZlY1tdDQorQHIyIC0tLS0gdHJhY2sNCitAcjMgLS0tLSBzaWduW10NCitAcjQgLS0tLSBycml4aXhbXVtOQl9QT1NdDQorQHI1IC0tLS0gY29yXzFbXQ0KK0ByNiAtLS0tIGNvcl8yW10NCisNCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorCSAgLmdsb2JhbCAgY29yX2hfdmVjXzAxMl9hc20NCisNCitjb3JfaF92ZWNfMDEyX2FzbToNCisNCisgICAgICAgICBTVE1GRCAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fQ0KKwkgTERSICAgICAgICAgICByNCwgW3IxMywgIzQwXSAgICAgICAgICAgICAgICAgICAgQGxvYWQgcnJpeGl4W11bTkJfUE9TXQ0KKwkgQUREICAgICAgICAgICByNywgcjQsIHIyLCBMU0wgIzUgICAgICAgICAgICAgICAgQHI3IC0tLSBwMCA9IHJyaXhpeFt0cmFja10NCisgICAgICAgICBNT1YgICAgICAgICAgIHI0LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaT0wDQorDQorCSBAcjAgLS0tIGhbXSwgcjEgLS0tIHZlY1tdLCAgcjIgLS0tIHBvcw0KKwkgQHIzIC0tLSBzaWduW10sIHI0IC0tLSBpLCByNyAtLS0gcDANCitMT09QaToNCisgICAgICAgICBNT1YgICAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gMA0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTIgPSAwDQorICAgICAgICAgQUREICAgICAgICAgICByOSwgcjEsIHIyLCBMU0wgIzEgICAgICAgICAgICAgICAgQHAyID0gJnZlY1twb3NdDQorICAgICAgICAgTU9WICAgICAgICAgICByMTAsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgQHAxID0gaA0KKyAgICAgICAgIFJTQiAgICAgICAgICAgcjExLCByMiwgIzYyICAgICAgICAgICAgICAgICAgICAgIEBqPTYyLXBvcw0KKw0KK0xPT1BqMToNCisJIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgIA0KKwkgTERSU0ggICAgICAgICByOCwgIFtyOV0sICMyDQorCSBMRFJTSCAgICAgICAgIHIxNCwgW3I5XQ0KKwkgU1VCUyAgICAgICAgICByMTEsIHIxMSwgIzENCisgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHI4LCByNQ0KKyAgICAgICAgIE1MQSAgICAgICAgICAgcjYsIHIxMiwgcjE0LCByNgkgDQorCSBCR0UgICAgICAgICAgIExPT1BqMQ0KKw0KKwkgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAqcDErKw0KKwkgTU9WICAgICAgICAgICByNiwgcjYsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTIgPSAoTF9zdW0yIDw8IDIpDQorICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByMTQsIHI1DQorICAgICAgICAgTU9WICAgICAgICAgICByMTQsICMweDgwMDANCisgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByNSwgTFNMICMyICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IChMX3N1bTEgPDwgMikNCisgICAgICAgICBBREQgICAgICAgICAgIHIxMCwgcjYsIHIxNCAgICAgICAgIA0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI1LCByMTQNCisgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByOSwgQVNSICMxNg0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjYsIHIxMCwgQVNSICMxNg0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHIzLCByMiwgTFNMICMxICAgICAgICAgICAgICAgICBAYWRkcmVzcyBvZiBzaWduW3Bvc10NCisgICAgICAgICBBREQgICAgICAgICAgIHI4LCByNywgIzMyDQorICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyOV0sICMyICAgICAgICAgICAgICAgICAJICBAc2lnbltwb3NdDQorCSBMRFJTSCAgICAgICAgIHIxMSwgW3I5XSAgICAgICAgICAgICAgICAgICAgICAgICAgQHNpZ25bcG9zICsgMV0NCisJIE1VTCAgICAgICAgICAgcjEyLCByNSwgcjEwDQorCSBNVUwgICAgICAgICAgIHIxNCwgcjYsIHIxMQ0KKwkgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1DQorCSBNT1YgICAgICAgICAgIHI2LCByMTQsIEFTUiAjMTUNCisJIExEUiAgICAgICAgICAgcjksICBbcjEzLCAjNDRdICAgICAgICAgICAgICAgICAgIA0KKwkgTERSICAgICAgICAgICByMTIsIFtyMTMsICM0OF0NCisgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I3XSwgIzIgICAgICAgICAgICAgICAgICAgICAgQCpwMCsrDQorCSBMRFJTSCAgICAgICAgIHIxMSwgW3I4XSAgICAgICAgICAgICAgICAgICAgICAgICAgQCpwMysrDQorICAgICAgICAgQUREICAgICAgICAgICByOSwgcjksIHI0LCBMU0wgIzENCisJIEFERCAgICAgICAgICAgcjEyLCByMTIsIHI0LCBMU0wgIzENCisJIEFERCAgICAgICAgICAgcjUsIHI1LCByMTANCisJIEFERCAgICAgICAgICAgcjYsIHI2LCByMTENCisJIFNUUkggICAgICAgICAgcjUsIFtyOV0NCisJIFNUUkggICAgICAgICAgcjYsIFtyMTJdDQorDQorICAgICAgICAgQUREICAgICAgICAgICByMiwgcjIsICM0DQorIA0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjUsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAwDQorCSBNT1YgICAgICAgICAgIHI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gMA0KKwkgQUREICAgICAgICAgICByOSwgcjEsIHIyLCBMU0wgIzEgICAgICAgICAgICAgICAgQHAyID0gJnZlY1twb3NdDQorCSBNT1YgICAgICAgICAgIHIxMCwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcDEgPSBoDQorCSBSU0IgICAgICAgICAgIHIxMSwgcjIsICM2MiAgICAgICAgICAgICAgICAgICAgICBAaj02Mi1wb3MNCisJIEFERCAgICAgICAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgICAgICAgIEBpKysNCisNCitMT09QajI6DQorCSBMRFJTSCAgICAgICAgIHIxMiwgW3IxMF0sICMyICANCisJIExEUlNIICAgICAgICAgcjgsICBbcjldLCAjMg0KKwkgTERSU0ggICAgICAgICByMTQsIFtyOV0NCisJIFNVQlMgICAgICAgICAgcjExLCByMTEsICMxDQorICAgICAgICAgTUxBICAgICAgICAgICByNSwgcjEyLCByOCwgcjUNCisgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYJIA0KKwkgQkdFICAgICAgICAgICBMT09QajINCisNCisJIExEUlNIICAgICAgICAgcjEyLCBbcjEwXSwgIzIgICAgICAgICAgICAgICAgICAgICBAKnAxKysNCisJIE1PViAgICAgICAgICAgcjYsIHI2LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gKExfc3VtMiA8PCAyKQ0KKyAgICAgICAgIE1MQSAgICAgICAgICAgcjUsIHIxMiwgcjE0LCByNQ0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjE0LCAjMHg4MDAwDQorICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjUsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAoTF9zdW0xIDw8IDIpDQorICAgICAgICAgQUREICAgICAgICAgICByMTAsIHI2LCByMTQgICAgICAgIA0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI1LCByMTQNCisNCisgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByOSwgQVNSICMxNg0KKyAgICAgICAgIE1PViAgICAgICAgICAgcjYsIHIxMCwgQVNSICMxNg0KKyAgICAgICAgIEFERCAgICAgICAgICAgcjksIHIzLCByMiwgTFNMICMxICAgICAgICAgICAgICAgICBAYWRkcmVzcyBvZiBzaWduW3Bvc10NCisgICAgICAgICBBREQgICAgICAgICAgIHI4LCByNywgIzMyDQorICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyOV0sICMyICAgICAgICAgICAgICAgICAJICBAc2lnbltwb3NdDQorCSBMRFJTSCAgICAgICAgIHIxMSwgW3I5XSAgICAgICAgICAgICAgICAgICAgICAgICAgQHNpZ25bcG9zICsgMV0NCisJIE1VTCAgICAgICAgICAgcjEyLCByNSwgcjEwDQorCSBNVUwgICAgICAgICAgIHIxNCwgcjYsIHIxMQ0KKwkgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1DQorCSBNT1YgICAgICAgICAgIHI2LCByMTQsIEFTUiAjMTUNCisJIExEUiAgICAgICAgICAgcjksICBbcjEzLCAjNDRdICAgICAgICAgICAgICAgICAgIA0KKwkgTERSICAgICAgICAgICByMTIsIFtyMTMsICM0OF0NCisgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I3XSwgIzIgICAgICAgICAgICAgICAgICAgICAgQCpwMCsrDQorCSBMRFJTSCAgICAgICAgIHIxMSwgW3I4XSAgICAgICAgICAgICAgICAgICAgICAgICAgQCpwMysrDQorICAgICAgICAgQUREICAgICAgICAgICByOSwgcjksIHI0LCBMU0wgIzENCisJIEFERCAgICAgICAgICAgcjEyLCByMTIsIHI0LCBMU0wgIzENCisJIEFERCAgICAgICAgICAgcjUsIHI1LCByMTANCisJIEFERCAgICAgICAgICAgcjYsIHI2LCByMTENCisJIFNUUkggICAgICAgICAgcjUsIFtyOV0NCisJIFNUUkggICAgICAgICAgcjYsIFtyMTJdDQorCSBBREQgICAgICAgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgQGkrMQ0KKwkgQUREICAgICAgICAgICByMiwgcjIsICM0ICAgICAgICAgICAgICAgICAgICAgICAgIEBwb3MgKz0gU1RFUA0KKwkgQ01QICAgICAgICAgICByNCwgIzE2DQorCSANCisJIEJMVCAgICAgICAgICAgTE9PUGkNCisgICAgICAgICANCit0aGVfZW5kOg0KKyAgICAgICAgIExETUZEICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9DQorICAgICAgDQorICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAuRU5ECSANCisgICAgICAgIA0KKwkNCisJICANCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGQ4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcHJlZF9sdDRfMV9vcHQucwpAQCAtMCwwICsxLDQ2MCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgUHJlZF9sdDQoDQorQAkJICBXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogZXhjaXRhdGlvbiBidWZmZXIgKi8NCitACQkgIFdvcmQxNiBUMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpbnRlZ2VyIHBpdGNoIGxhZyAqLw0KK0AJCSAgV29yZDE2IGZyYWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyAgICovDQorQAkJICBXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc3ViZnJhbWUgc2l6ZSAgICAgKi8NCitACSAgICAgICkNCisNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCAgICAgICBBUk0gUmVnaXN0ZXINCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCByMCAgLS0tICBleGNbXQ0KK0AgcjEgIC0tLSAgVDANCitAIHIyICAtLS0gIGZyYWMNCitAIHIzICAtLS0gIExfc3ViZnINCisNCisgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisJIC5nbG9iYWwgICBwcmVkX2x0NF9hc20NCisJIC5leHRlcm4gICBpbnRlcjRfMg0KKw0KK3ByZWRfbHQ0X2FzbToNCisNCisgICAgICAgICBTVE1GRCAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKyAgICAgICAgIFJTQiAgICAgICByNCwgcjEsICMwICAgICAgICAgICAgICAgICAgICAgICAgIEAtVDANCisgICAgICAgICBSU0IgICAgICAgcjIsIHIyLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICBAZnJhYyA9IC1mcmFjDQorICAgICAgICAgQUREICAgICAgIHI1LCByMCwgcjQsIExTTCAjMSAgICAgICAgICAgICAgICAgQHggPSBleGMgLSBUMA0KKyAgICAgICAgIENNUCAgICAgICByMiwgIzANCisgICAgICAgICBBRERMVCAgICAgcjIsIHIyLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICBAZnJhYyArPSBVUF9TQU1QDQorICAgICAgICAgU1VCTFQgICAgIHI1LCByNSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgQHgtLQ0KKyAgICAgICAgIFNVQiAgICAgICByNSwgcjUsICMzMCAgICAgICAgICAgICAgICAgICAgICAgIEB4IC09IDE1DQorICAgICAgICAgUlNCICAgICAgIHI0LCByMiwgIzMgICAgICAgICAgICAgICAgICAgICAgICAgQGsgPSAzIC0gZnJhYw0KKyAgICAgICAgIExEUiAgICAgICByNiwgVGFibGUNCisJIE1PViAgICAgICByOCwgcjQsIExTTCAjNiAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgQE1PViAgICAgICByNywgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBqID0gMA0KKyAgICAgICAgIEFERCAgICAgICByOCwgcjYsIHI4ICAgICAgICAgICAgICAgICAgICAgICAgIEBwdHIyID0gJihpbnRlcjRfMltrXVswXSkNCisNCisJIE1PViAgICAgICByMSwgcjUNCisJIE1PViAgICAgICByNSwgIzB4ODAwMA0KKwkgTU9WICAgICAgIHIxNCwgIzIxDQorQCB1c2VkIHJlZ2lzdGVyDQorICAgICAgICAgQHIwIC0tLSBleGNbXSAgcjEgLS0tIHggIHI3IC0tLSBqICByOCAtLS0gcHRyMiAgcjUgLS0tIDB4ODAwMA0KK1RIUkVFX0xPT1A6DQorDQorICAgICAgICAgQE1PViAgICAgICByMSwgcjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwdHIxID0geA0KKwkgTU9WICAgICAgIHIyLCByOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHB0ciA9IHB0cjINCisgICAgICAgICBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFswXSwgaFsxXQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMF0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzFdDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyXQ0KKw0KKwkgU01VTEJCICAgIHIxMCwgcjQsIHIzICAgICAgICAgICAgICAgICAgICAgICAgQHhbMF0gKiBoWzBdICAgICAgICAgICAgICAgICAgDQorCSBTTVVMQkIgICAgcjExLCByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgICBAeFsxXSAqIGhbMF0NCisJIFNNVUxCQiAgICByMTIsIHI5LCByMyAgICAgICAgICAgICAgICAgICAgICAgIEB4WzJdICogaFswXQ0KKw0KKyAgICAgICAgIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzNdDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxXSAqIGhbMV0NCisgICAgICAgICBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyXSAqIGhbMV0NCisJIFNNTEFCVCAgICByMTIsIHI0LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzNdICogaFsxXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMl0sIGhbM10NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzRdDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyXSAqIGhbMl0NCisgICAgICAgICBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFszXSAqIGhbMl0NCisgICAgICAgICBTTUxBQkIgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFs0XSAqIGhbMl0NCisNCisgICAgICAgICBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs1XQ0KKyAgICAgICAgIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzNdICogaFszXQ0KKyAgICAgICAgIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzRdICogaFszXQ0KKyAgICAgICAgIFNNTEFCVCAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzVdICogaFszXQ0KKw0KKyAgICAgICAgIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzRdLCBoWzVdDQorICAgICAgICAgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbNl0NCisgICAgICAgICBTTUxBQkIgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFs0XSAqIGhbNF0NCisgICAgICAgICBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs1XSAqIGhbNF0NCisgICAgICAgICBTTUxBQkIgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFs2XSAqIGhbNF0NCisNCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzddDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFs1XSAqIGhbNV0NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzZdICogaFs1XQ0KKwkgU01MQUJUICAgIHIxMiwgcjYsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbN10gKiBoWzVdDQorDQorICAgICAgICAgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbNl0sIGhbN10NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzhdDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFs2XSAqIGhbNl0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzddICogaFs2XQ0KKwkgU01MQUJCICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbOF0gKiBoWzZdDQorDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs5XQ0KKwkgU01MQUJUICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbN10gKiBoWzddDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs4XSAqIGhbN10NCisJIFNNTEFCVCAgICByMTIsIHI0LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzldICogaFs3XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbOF0sIGhbOV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzEwXQ0KKwkgU01MQUJCICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbOF0gKiBoWzhdDQorCSBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs5XSAqIGhbOF0NCisJIFNNTEFCQiAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzEwXSAqIGhbOF0NCisNCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzExXQ0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbOV0gKiBoWzldDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxMF0gKiBoWzldDQorCSBTTUxBQlQgICAgcjEyLCByOSwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxMV0gKiBoWzldDQorDQorICAgICAgICAgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTBdLCBoWzExXQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTJdDQorICAgICAgICAgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTBdICogaFsxMF0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzExXSAqIGhbMTBdDQorCSBTTUxBQkIgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxMl0gKiBoWzEwXQ0KKw0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTNdDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxMV0gKiBoWzExXQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTJdICogaFsxMV0NCisJIFNNTEFCVCAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzEzXSAqIGhbMTFdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxMl0sIGhbMTNdDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxNF0NCisJIFNNTEFCQiAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzEyXSAqIGhbMTJdDQorCSBTTUxBQkIgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxM10gKiBoWzEyXQ0KKwkgU01MQUJCICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMTRdICogaFsxMl0NCisNCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzE1XQ0KKwkgU01MQUJUICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTNdICogaFsxM10NCisJIFNNTEFCVCAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE0XSAqIGhbMTNdDQorCSBTTUxBQlQgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsxNV0gKiBoWzEzXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTRdLCBoWzE1XQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTZdDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxNF0gKiBoWzE0XQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTVdICogaFsxNF0NCisJIFNNTEFCQiAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzE2XSAqIGhbMTRdDQorDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxN10NCisgICAgICAgICBTTUxBQlQgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxNV0gKiBoWzE1XQ0KKwkgU01MQUJUICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTZdICogaFsxNV0NCisJIFNNTEFCVCAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzE3XSAqIGhbMTVdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxNl0sIGhbMTddDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxOF0NCisJIFNNTEFCQiAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE2XSAqIGhbMTZdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxN10gKiBoWzE2XQ0KKwkgU01MQUJCICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMThdICogaFsxNl0NCisNCisgICAgICAgICBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxOV0NCisJIFNNTEFCVCAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE3XSAqIGhbMTddDQorCSBTTUxBQlQgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxOF0gKiBoWzE3XQ0KKwkgU01MQUJUICAgIHIxMiwgcjYsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMTldICogaFsxN10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzE4XSwgaFsxOV0NCisgICAgICAgICBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyMF0NCisJIFNNTEFCQiAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE4XSAqIGhbMThdDQorCSBTTUxBQkIgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxOV0gKiBoWzE4XQ0KKwkgU01MQUJCICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjBdICogaFsxOF0NCisNCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzIxXQ0KKwkgU01MQUJUICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTldICogaFsxOV0NCisJIFNNTEFCVCAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzIwXSAqIGhbMTldDQorCSBTTUxBQlQgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyMV0gKiBoWzE5XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjBdLCBoWzIxXQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjJdDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyMF0gKiBoWzIwXQ0KKwkgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjFdICogaFsyMF0NCisJIFNNTEFCQiAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzIyXSAqIGhbMjBdDQorDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyM10NCisJIFNNTEFCVCAgICByMTAsIHI0LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzIxXSAqIGhbMjFdDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyMl0gKiBoWzIxXQ0KKwkgU01MQUJUICAgIHIxMiwgcjksIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjNdICogaFsyMV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzIyXSwgaFsyM10NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI0XQ0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjJdICogaFsyMl0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzIzXSAqIGhbMjJdDQorCSBTTUxBQkIgICAgcjEyLCByNCwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyNF0gKiBoWzIyXQ0KKw0KKyAgICAgICAgIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI1XQ0KKwkgU01MQUJUICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjNdICogaFsyM10NCisJIFNNTEFCVCAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI0XSAqIGhbMjNdDQorCSBTTUxBQlQgICAgcjEyLCByNiwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyNV0gKiBoWzIzXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjRdLCBoWzI1XQ0KKyAgICAgICAgIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI2XQ0KKwkgU01MQUJCICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjRdICogaFsyNF0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI1XSAqIGhbMjRdDQorCSBTTUxBQkIgICAgcjEyLCByOSwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyNl0gKiBoWzI0XQ0KKw0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjddDQorCSBTTUxBQlQgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyNV0gKiBoWzI1XQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjZdICogaFsyNV0NCisJIFNNTEFCVCAgICByMTIsIHI0LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzI3XSAqIGhbMjVdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsyNl0sIGhbMjddDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyOF0NCisJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI2XSAqIGhbMjZdDQorCSBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyN10gKiBoWzI2XQ0KKwkgU01MQUJCICAgIHIxMiwgcjYsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMjhdICogaFsyNl0NCisNCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI5XQ0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjddICogaFsyN10NCisJIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI4XSAqIGhbMjddDQorCSBTTUxBQlQgICAgcjEyLCByOSwgcjMsIHIxMiAgICAgICAgICAgICAgICAgICBAeFsyOV0gKiBoWzI3XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjhdLCBoWzI5XQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMzBdDQorCSBTTUxBQkIgICAgcjEwLCByNiwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyOF0gKiBoWzI4XQ0KKwkgU01MQUJCICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjldICogaFsyOF0NCisJIFNNTEFCQiAgICByMTIsIHI0LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzMwXSAqIGhbMjhdDQorDQorICAgICAgICAgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMzFdDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyOV0gKiBoWzI5XQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMzBdICogaFsyOV0NCisJIFNNTEFCVCAgICByMTIsIHI2LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzMxXSAqIGhbMjldDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFszMF0sIGhbMzFdDQorICAgICAgICAgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMzJdDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszMF0gKiBoWzMwXQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMzFdICogaFszMF0NCisJIFNNTEFCQiAgICByMTIsIHI5LCByMywgcjEyICAgICAgICAgICAgICAgICAgIEB4WzMyXSAqIGhbMzBdDQorDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMtNjAgICAgICAgICAgICAgICAgICAgICBAeFszM10NCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzMxXSAqIGhbMzFdDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFszMl0gKiBoWzMxXQ0KKwkgU01MQUJUICAgIHIxMiwgcjQsIHIzLCByMTIgICAgICAgICAgICAgICAgICAgQHhbMzNdICogaFszMV0NCisNCisJIEBTU0FUICAgICAgcjEwLCAjMzIsIHIxMCwgTFNMICMyDQorCSBAU1NBVCAgICAgIHIxMSwgIzMyLCByMTEsIExTTCAjMg0KKwkgQFNTQVQgICAgICByMTIsICMzMiwgcjEyLCBMU0wgIzINCisNCisJIE1PViAgICAgICByMTAsIHIxMCwgTFNMICMxDQorCSBNT1YgICAgICAgcjExLCByMTEsIExTTCAjMQ0KKwkgTU9WICAgICAgIHIxMiwgcjEyLCBMU0wgIzENCisNCisJIFFBREQgICAgICByMTAsIHIxMCwgcjEwDQorCSBRQUREICAgICAgcjExLCByMTEsIHIxMQ0KKwkgUUFERCAgICAgIHIxMiwgcjEyLCByMTINCisNCisJIFFBREQgICAgICByMTAsIHIxMCwgcjUNCisJIFFBREQgICAgICByMTEsIHIxMSwgcjUNCisJIFFBREQgICAgICByMTIsIHIxMiwgcjUNCisNCisJIFNVQlMgICAgICByMTQsIHIxNCwgIzENCisNCisJIE1PViAgICAgICByMTAsIHIxMCwgQVNSICMxNg0KKwkgTU9WICAgICAgIHIxMSwgcjExLCBBU1IgIzE2DQorCSBNT1YgICAgICAgcjEyLCByMTIsIEFTUiAjMTYNCisNCisJIFNUUkggICAgICByMTAsIFtyMF0sICMyDQorCSBTVFJIICAgICAgcjExLCBbcjBdLCAjMg0KKwkgU1RSSCAgICAgIHIxMiwgW3IwXSwgIzINCisJIEJORSAgICAgICBUSFJFRV9MT09QDQorDQorCSBNT1YgICAgICAgcjIsIHI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAcHRyID0gcHRyMg0KKw0KK0xhc3QyTE9PUDoNCisNCisgICAgICAgICBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFswXSwgaFsxXQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMF0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzFdDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyXQ0KKw0KKwkgU01VTEJCICAgIHIxMCwgcjQsIHIzICAgICAgICAgICAgICAgICAgICAgICAgQHhbMF0gKiBoWzBdDQorCSBTTVVMQkIgICAgcjExLCByNiwgcjMgICAgICAgICAgICAgICAgICAgICAgICBAeFsxXSAqIGhbMF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzFdICogaFsxXQ0KKwkgU01MQUJUICAgIHIxMSwgcjksIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMl0gKiBoWzFdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsyXSwgaFszXQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbM10NCisgICAgICAgICBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs0XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjksIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMl0gKiBoWzJdDQorICAgICAgICAgU01MQUJCICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbM10gKiBoWzJdDQorICAgICAgDQorCSBTTUxBQlQgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszXSAqIGhbM10NCisJIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzRdICogaFszXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbNF0sIGhbNV0NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzVdDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs2XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbNF0gKiBoWzRdDQorCSBTTUxBQkIgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs1XSAqIGhbNF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzVdICogaFs1XQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbNl0gKiBoWzVdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFs2XSwgaFs3XQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbN10NCisJIExEUlNIICAgICByOSwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzhdDQorDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFs2XSAqIGhbNl0NCisJIFNNTEFCQiAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzddICogaFs2XQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbN10gKiBoWzddDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFs4XSAqIGhbN10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzhdLCBoWzldDQorCSBMRFJTSCAgICAgcjQsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFs5XQ0KKwkgTERSU0ggICAgIHI2LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTBdDQorDQorCSBTTUxBQkIgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFs4XSAqIGhbOF0NCisJIFNNTEFCQiAgICByMTEsIHI0LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzldICogaFs4XQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbOV0gKiBoWzldDQorCSBTTUxBQlQgICAgcjExLCByNiwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxMF0gKiBoWzldDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxMF0sIGhbMTFdDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxMV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzEyXQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTBdICogaFsxMF0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzExXSAqIGhbMTBdDQorDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxMV0gKiBoWzExXQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTJdICogaFsxMV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzEyXSwgaFsxM10NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzEzXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTRdDQorDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxMl0gKiBoWzEyXQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTNdICogaFsxMl0NCisNCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzEzXSAqIGhbMTNdDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxNF0gKiBoWzEzXQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMTRdLCBoWzE1XQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMTVdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxNl0NCisNCisJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE0XSAqIGhbMTRdDQorCSBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsxNV0gKiBoWzE0XQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTVdICogaFsxNV0NCisJIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE2XSAqIGhbMTVdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsxNl0sIGhbMTddDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsxN10NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzE4XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMTZdICogaFsxNl0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzE3XSAqIGhbMTZdDQorDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxN10gKiBoWzE3XQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMThdICogaFsxN10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzE4XSwgaFsxOV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzE5XQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjBdDQorDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsxOF0gKiBoWzE4XQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMTldICogaFsxOF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzE5XSAqIGhbMTldDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyMF0gKiBoWzE5XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjBdLCBoWzIxXQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjFdDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyMl0NCisNCisJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzIwXSAqIGhbMjBdDQorCSBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyMV0gKiBoWzIwXQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjFdICogaFsyMV0NCisJIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzIyXSAqIGhbMjFdDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsyMl0sIGhbMjNdDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyM10NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI0XQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjJdICogaFsyMl0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzIzXSAqIGhbMjJdDQorDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyM10gKiBoWzIzXQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjRdICogaFsyM10NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzI0XSwgaFsyNV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzI1XQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjZdDQorDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyNF0gKiBoWzI0XQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMjVdICogaFsyNF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI1XSAqIGhbMjVdDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyNl0gKiBoWzI1XQ0KKw0KKwkgTERSICAgICAgIHIzLCBbcjJdLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGhbMjZdLCBoWzI3XQ0KKwkgTERSU0ggICAgIHI0LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMjddDQorCSBMRFJTSCAgICAgcjYsIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyOF0NCisNCisJIFNNTEFCQiAgICByMTAsIHI5LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzI2XSAqIGhbMjZdDQorCSBTTUxBQkIgICAgcjExLCByNCwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFsyN10gKiBoWzI2XQ0KKw0KKwkgU01MQUJUICAgIHIxMCwgcjQsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjddICogaFsyN10NCisJIFNNTEFCVCAgICByMTEsIHI2LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI4XSAqIGhbMjddDQorDQorCSBMRFIgICAgICAgcjMsIFtyMl0sICM0ICAgICAgICAgICAgICAgICAgICAgICBAaFsyOF0sIGhbMjldDQorCSBMRFJTSCAgICAgcjksIFtyMV0sICMyICAgICAgICAgICAgICAgICAgICAgICBAeFsyOV0NCisJIExEUlNIICAgICByNCwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzMwXQ0KKw0KKwkgU01MQUJCICAgIHIxMCwgcjYsIHIzLCByMTAgICAgICAgICAgICAgICAgICAgQHhbMjhdICogaFsyOF0NCisJIFNNTEFCQiAgICByMTEsIHI5LCByMywgcjExICAgICAgICAgICAgICAgICAgIEB4WzI5XSAqIGhbMjhdDQorDQorCSBTTUxBQlQgICAgcjEwLCByOSwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFsyOV0gKiBoWzI5XQ0KKwkgU01MQUJUICAgIHIxMSwgcjQsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMzBdICogaFsyOV0NCisNCisJIExEUiAgICAgICByMywgW3IyXSwgIzQgICAgICAgICAgICAgICAgICAgICAgIEBoWzMwXSwgaFszMV0NCisJIExEUlNIICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEB4WzMxXQ0KKwkgTERSU0ggICAgIHI5LCBbcjFdLCAjMiAgICAgICAgICAgICAgICAgICAgICAgQHhbMzJdDQorDQorCSBTTUxBQkIgICAgcjEwLCByNCwgcjMsIHIxMCAgICAgICAgICAgICAgICAgICBAeFszMF0gKiBoWzMwXQ0KKwkgU01MQUJCICAgIHIxMSwgcjYsIHIzLCByMTEgICAgICAgICAgICAgICAgICAgQHhbMzFdICogaFszMF0NCisNCisJIFNNTEFCVCAgICByMTAsIHI2LCByMywgcjEwICAgICAgICAgICAgICAgICAgIEB4WzMxXSAqIGhbMzFdDQorCSBTTUxBQlQgICAgcjExLCByOSwgcjMsIHIxMSAgICAgICAgICAgICAgICAgICBAeFszMl0gKiBoWzMxXQ0KKw0KKwkgQFNTQVQgICAgICByMTAsICMzMiwgcjEwLCBMU0wgIzINCisJIEBTU0FUICAgICAgcjExLCAjMzIsIHIxMSwgTFNMICMyDQorCSBNT1YgICAgICAgcjEwLCByMTAsIExTTCAjMQ0KKwkgTU9WICAgICAgIHIxMSwgcjExLCBMU0wgIzENCisNCisJIFFBREQgICAgICByMTAsIHIxMCwgcjEwDQorCSBRQUREICAgICAgcjExLCByMTEsIHIxMSANCisNCisJIFFBREQgICAgICByMTAsIHIxMCwgcjUNCisJIFFBREQgICAgICByMTEsIHIxMSwgcjUNCisNCisJIE1PViAgICAgICByMTAsIHIxMCwgQVNSICMxNg0KKwkgTU9WICAgICAgIHIxMSwgcjExLCBBU1IgIzE2DQorDQorCSBTVFJIICAgICAgcjEwLCBbcjBdLCAjMg0KKwkgU1RSSCAgICAgIHIxMSwgW3IwXSwgIzINCisNCisNCitwcmVkX2x0NF9lbmQ6DQorICAgICAgICAgTERNRkQgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQ0KKw0KK1RhYmxlOg0KKyAgICAgICAgIC53b3JkICAgICAgIGludGVyNF8yDQorCSBARU5ERlVOQw0KKwkgLkVORA0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3Jlc2lkdV9hc21fb3B0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwZDljNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zCkBAIC0wLDAgKzEsMjI4IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0ANCitAdm9pZCBSZXNpZHUoDQorQAkgICAgV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogcHJlZGljdGlvbiBjb2VmZmljaWVudHMgKi8NCitACSAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzcGVlY2ggKHZhbHVlcyB4Wy1tLi4tMV0gYXJlIG5lZWRlZCAqLw0KK0AJICAgIFdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHgyICA6IHJlc2lkdWFsIHNpZ25hbCAgICAgICAqLw0KK0AJICAgIFdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAqLw0KK0AJICAgKQ0KK0BhW10gLS0tIHIwDQorQHhbXSAtLS0gcjENCitAeVtdIC0tLSByMg0KK0BsZyAgLS0tIHIzDQorDQorICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisJLmdsb2JhbCAgIFJlc2lkdV9vcHQNCisNCitSZXNpZHVfb3B0Og0KKw0KKyAgICAgICAgU1RNRkQgICByMTMhLCB7cjQgLSByMTIsIHIxNH0NCisNCisgICAgICAgIExEUkggICAgcjUsIFtyMF0sICMyDQorICAgICAgICBMRFJIICAgIHI2LCBbcjBdLCAjMg0KKyAgICAgICAgT1JSICAgICByNSwgcjYsIHI1LCBMU0wgIzE2ICAgICAgICAgICAgICAgICAgQHI1IC0tLSBhMCwgYTEJDQorDQorICAgICAgICBMRFJIICAgIHI2LCBbcjBdLCAjMg0KKwlMRFJIICAgIHI3LCBbcjBdLCAjMg0KKwlPUlIgICAgIHI2LCByNywgcjYsIExTTCAjMTYgICAgICAgICAgICAgICAgICBAcjYgLS0tIGEyLCBhMw0KKwkNCisgICAgICAgIExEUkggICAgcjcsIFtyMF0sICMyDQorCUxEUkggICAgcjgsIFtyMF0sICMyDQorCU9SUiAgICAgcjcsIHI4LCByNywgTFNMICMxNiAgICAgICAgICAgICAgICAgIEByNyAtLS0gYTQsIGE1DQorDQorCUxEUkggICAgcjgsIFtyMF0sICMyDQorCUxEUkggICAgcjksIFtyMF0sICMyDQorCU9SUiAgICAgcjgsIHI5LCByOCwgTFNMICMxNiAgICAgICAgICAgICAgICAgIEByOCAtLS0gYTYsIGE3DQorDQorCUxEUkggICAgcjksIFtyMF0sICMyDQorCUxEUkggICAgcjEwLCBbcjBdLCAjMg0KKwlPUlIgICAgIHI5LCByMTAsIHI5LCBMU0wgIzE2ICAgICAgICAgICAgICAgICBAcjkgLS0tIGE4LCBhOQ0KKw0KKwlMRFJIICAgIHIxMCwgW3IwXSwgIzINCisJTERSSCAgICByMTEsIFtyMF0sICMyDQorCU9SUiAgICAgcjEwLCByMTEsIHIxMCwgTFNMICMxNiAgICAgICAgICAgICAgIEByMTAgLS0tIGExMCwgYTExDQorDQorICAgICAgICBMRFJIICAgIHIxMSwgW3IwXSwgIzINCisJTERSSCAgICByMTIsIFtyMF0sICMyDQorCU9SUiAgICAgcjExLCByMTIsIHIxMSwgTFNMICMxNiAgICAgICAgICAgICAgIEByMTEgLS0tIGExMiwgYTEzDQorCQ0KKwlMRFJIICAgIHIxMiwgW3IwXSwgIzINCisJTERSSCAgICByNCwgW3IwXSwgIzINCisJT1JSICAgICByMTIsIHI0LCByMTIsIExTTCAjMTYgICAgICAgICAgICAgICAgQHIxMiAtLS0gYTE0LCBhMTUNCisJDQorDQorCVNUTUZEICAgcjEzISwge3I4IC0gcjEyfSAgICAgICAgICAgICAgICAgICAgIEBzdG9yZSByOC1yMTIgDQorCUxEUkggICAgcjQsIFtyMF0sICMyICAgICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIGExNg0KKyAgICAgICAgTU9WICAgICByMTQsIHIzLCBBU1IgIzIgICAgICAgICAgICAgICAgICAgICAgQG9uZSBsb29wIGdldCA0IG91dHB1dHMNCisJQUREICAgICByMSwgcjEsICM0DQorCU1PViAgICAgcjAsIHIyDQorCU9SUiAgICAgcjE0LCByNCwgcjE0LCBMU0wgIzE2ICAgICAgICAgICAgICAgIEByMTQgLS0tIGxvb3BudW0sIGExNg0KKw0KK3Jlc2lkdV9sb29wOg0KKw0KKyAgICAgICAgTERSICAgICByMTAsIFtyMV0sICMtNCAgICAgICAgICAgICAgICAgICAgICAgQHIxMCAgLS0tIHhbM10sIHhbMl0NCisJTERSICAgICByMiwgIFtyMV0sICMtNCAgICAgICAgICAgICAgICAgICAgICAgQHIyICAgLS0tIHhbMV0sIHhbMF0NCisNCisJU01VTFRCICByMywgcjUsIHIyICAgICAgICAgICAgICAgICAgICAgICAgICAgQGkxKDApICAtLS0gcjMgPSB4WzBdICogYTANCisgICAgICAgIFNNVUxUVCAgcjQsIHI1LCByMiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpMigwKSAgLS0tIHI0ID0geFsxXSAqIGEwCQ0KKwlTTVVMVEIgIHIxMSwgcjUsIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICBAaTMoMCkgIC0tLSByMTEgPSB4WzJdICogYTANCisJU01VTFRUICByMTIsIHI1LCByMTAgICAgICAgICAgICAgICAgICAgICAgICAgQGk0KDApICAtLS0gcjEyID0geFszXSAqIGEwDQorDQorICAgICAgICBTTUxBQkIgIHI0LCByNSwgcjIsIHI0ICAgICAgICAgICAgICAgICAgICAgICBAaTIoMSkgIC0tLSByNCArPSB4WzBdICogYTENCisgICAgICAgIFNNTEFCVCAgcjExLCByNSwgcjIsIHIxMSAgICAgICAgICAgICAgICAgICAgIEBpMygxKSAgLS0tIHIxMSArPSB4WzFdICogYTANCisgICAgICAgIFNNTEFCQiAgcjEyLCByNSwgcjEwLCByMTIgICAgICAgICAgICAgICAgICAgIEBpNCgxKSAgLS0tIHIxMiArPSB4WzJdICogYTENCisNCisJU01MQVRCICByMTEsIHI2LCByMiwgcjExICAgICAgICAgICAgICAgICAgICAgQGkzKDIpICAtLS0gcjExICs9IHhbMF0gKiBhMg0KKwlTTUxBVFQgIHIxMiwgcjYsIHIyLCByMTIgICAgICAgICAgICAgICAgICAgICBAaTQoMikgIC0tLSByMTIgKz0geFsxXSAqIGEyDQorCVNNTEFCQiAgcjEyLCByNiwgcjIsIHIxMiAgICAgICAgICAgICAgICAgICAgIEBpNCgzKSAgLS0tIHIxMiArPSB4WzBdICogYTMgICAgICAgICAgICAgICAgIA0KKwkNCisJTERSICAgICByMiwgW3IxXSwgIy00ICAgICAgICAgICAgICAgICAgICAgICAgQHIyIC0tLS0geFstMV0sIHhbLTJdDQorDQorCVNNTEFCVCAgcjMsIHI1LCByMiwgcjMgICAgICAgICAgICAgICAgICAgICAgIEBpMSgxKSAtLS0gcjMgKz0geFstMV0gKiBhMQ0KKwlTTUxBVFQgIHI0LCByNiwgcjIsIHI0ICAgICAgICAgICAgICAgICAgICAgICBAaTIoMikgLS0tIHI0ICs9IHhbLTFdICogYTINCisJU01MQUJUICByMTEsIHI2LCByMiwgcjExICAgICAgICAgICAgICAgICAgICAgQGkzKDMpIC0tLSByMTEgKz0geFstMV0gKiBhMw0KKwlTTUxBVFQgIHIxMiwgcjcsIHIyLCByMTIgICAgICAgICAgICAgICAgICAgICBAaTQoNCkgLS0tIHIxMiArPSB4Wy0xXSAqIGE0DQorICAgICAgICBTTUxBVEIgIHIzLCByNiwgcjIsIHIzICAgICAgICAgICAgICAgICAgICAgICBAaTEoMikgLS0tIHIzICs9IHhbLTJdICogYTIJDQorDQorCVNNTEFCQglyNCwgcjYsIHIyLCByNAkJCQlAIGkyCSgzKQ0KKwlTTUxBVEIgIHIxMSxyNywgcjIsIHIxMQkJCQlAIGkzCSg0KQ0KKwlTTUxBQkIJcjEyLHI3LCByMiwgcjEyCQkJCUAgaTQJKDUpDQorCQ0KKwlMRFIJcjIsW3IxXSwjLTQNCisJU01MQUJUCXIzLCByNiwgcjIsIHIzCQkJCUAgaTEJKDMpDQorCVNNTEFUVAlyNCwgcjcsIHIyLCByNAkJCQlAIGkyCSg0KQ0KKwlTTUxBQlQJcjExLHI3LCByMiwgcjExCQkJCUAgaTMJKDUpDQorCVNNTEFUVAlyMTIscjgsIHIyLCByMTIJCQkJQCBpNAkoNikNCisJU01MQVRCCXIzLCByNywgcjIsIHIzCQkJCUAgaTEJKDQpDQorCVNNTEFCQglyNCwgcjcsIHIyLCByNAkJCQlAIGkyCSg1KQ0KKwlTTUxBVEIJcjExLHI4LCByMiwgcjExCQkJCUAgaTMJKDYpDQorCVNNTEFCQglyMTIscjgsIHIyLCByMTIJCQkJQCBpNAkoNykNCisJCQ0KKwlMRFIJcjIsW3IxXSwjLTQNCisJU01MQUJUCXIzLCByNywgcjIsIHIzCQkJCUAgaTEJKDUpDQorCVNNTEFUVAlyNCwgcjgsIHIyLCByNAkJCQlAIGkyCSg2KQ0KKwlTTUxBQlQJcjExLHI4LCByMiwgcjExCQkJCUAgaTMJKDcpDQorCVNNTEFUVAlyMTIscjksIHIyLCByMTIJCQkJQCBpNAkoOCkNCisJU01MQVRCCXIzLCByOCwgcjIsIHIzCQkJCUAgaTEJKDYpDQorCVNNTEFCQglyNCwgcjgsIHIyLCByNAkJCQlAIGkyCSg3KQ0KKwlTTUxBVEIJcjExLHI5LCByMiwgcjExCQkJCUAgaTMJKDgpDQorCVNNTEFCQglyMTIscjksIHIyLCByMTIJCQkJQCBpNAkoOSkNCisJTERSCXIxMCwgW3IxMywgIzhdCQkJCUAgWyBhMTAgfCBhMTFdDQorCQ0KKwlMRFIJcjIsW3IxXSwjLTQNCisJU01MQUJUCXIzLCByOCwgcjIsIHIzCQkJCUAgaTEJKDcpDQorCVNNTEFUVAlyNCwgcjksIHIyLCByNAkJCQlAIGkyCSg4KQ0KKwlTTUxBQlQJcjExLHI5LCByMiwgcjExCQkJCUAgaTMJKDkpDQorCVNNTEFUVAlyMTIscjEwLCByMiwgcjEyCQkJQCBpNAkoMTApDQorCVNNTEFUQglyMywgcjksIHIyLCByMwkJCQlAIGkxCSg4KQ0KKwlTTUxBQkIJcjQsIHI5LCByMiwgcjQJCQkJQCBpMgkoOSkNCisJU01MQVRCCXIxMSxyMTAsIHIyLCByMTEJCQlAIGkzCSgxMCkNCisJU01MQUJCCXIxMixyMTAsIHIyLCByMTIJCQlAIGk0CSgxMSkNCisJTERSCXI4LCBbcjEzLCAjMTJdCQkJCUAgWyBhMTIgfCBhMTMgXQ0KKwkJDQorCUxEUglyMixbcjFdLCMtNA0KKwlTTUxBQlQJcjMsIHI5LCByMiwgcjMJCQkJQCBpMQkoOSkNCisJU01MQVRUCXI0LCByMTAsIHIyLCByNAkJCQlAIGkyCSgxMCkNCisJU01MQUJUCXIxMSxyMTAsIHIyLCByMTEJCQlAIGkzCSgxMSkNCisJU01MQVRUCXIxMixyOCwgcjIsIHIxMgkJCQlAIGk0CSgxMikNCisJU01MQVRCCXIzLCByMTAsIHIyLCByMwkJCQlAIGkxCSgxMCkNCisJU01MQUJCCXI0LCByMTAsIHIyLCByNAkJCQlAIGkyCSgxMSkNCisJU01MQVRCCXIxMSxyOCwgcjIsIHIxMQkJCQlAIGkzCSgxMikNCisJU01MQUJCCXIxMixyOCwgcjIsIHIxMgkJCQlAIGk0CSgxMykNCisJTERSCXI5LCBbcjEzLCAjMTZdCQkJCUAgWyBhMTQgfCBhMTUgXQ0KKwkNCisJTERSCXIyLFtyMV0sIy00DQorCVNNTEFCVAlyMywgcjEwLCByMiwgcjMJCQkJQCBpMQkoMTEpDQorCVNNTEFUVAlyNCwgcjgsIHIyLCByNAkJCQlAIGkyCSgxMikNCisJU01MQUJUCXIxMSxyOCwgcjIsIHIxMQkJCQlAIGkzCSgxMykNCisJU01MQVRUCXIxMixyOSwgcjIsIHIxMgkJCQlAIGk0CSgxNCkNCisJU01MQVRCCXIzLCByOCwgcjIsIHIzCQkJCUAgaTEJKDEyKQ0KKwlTTUxBQkIJcjQsIHI4LCByMiwgcjQJCQkJQCBpMgkoMTMpDQorCVNNTEFUQglyMTEscjksIHIyLCByMTEJCQkJQCBpMwkoMTQpDQorCVNNTEFCQglyMTIscjksIHIyLCByMTIJCQkJQCBpNAkoMTUpDQorCQ0KKw0KKwlMRFIJcjIsW3IxXSwjLTQNCisJU01MQUJUCXIzLCByOCwgcjIsIHIzCQkJCUAgaTEJKDEzKQ0KKwlTTUxBVFQJcjQsIHI5LCByMiwgcjQJCQkJQCBpMgkoMTQpDQorCVNNTEFCVAlyMTEscjksIHIyLCByMTEJCQkJQCBpMwkoMTUpDQorCVNNTEFCVAlyMTIscjE0LCByMiwgcjEyCQkJQCBpNAkoMTYpDQorCVNNTEFUQglyMywgcjksIHIyLCByMwkJCQlAIGkxCSgxNCkNCisJU01MQUJCCXI0LCByOSwgcjIsIHI0CQkJCUAgaTIJKDE1KQ0KKwlTTUxBQkIJcjExLHIxNCwgcjIsIHIxMQkJCUAgaTMJKDE2KQ0KKwlMRFIJCXI4LCBbcjEzXQkJCQkJQCBbIGE2IHwgYTcgXQ0KKwkJCQ0KKyAgICAgICAgTERSICAgICByMixbcjFdLCM0NCAgICAgICAgIAkJQCBDaGFuZ2UNCisJU01MQUJUCXIzLCByOSwgcjIsIHIzDQorCVNNTEFCQglyMywgcjE0LCByMiwgcjMNCisJU01MQUJUCXI0LCByMTQsIHIyLCByNA0KKwlMRFIJCXI5LCBbcjEzLCAjNF0JCQkJQCBbIGE4IHwgYTkgXQ0KKwkNCisNCisJUUFERAlyMyxyMyxyMwkJCQkJDQorCVFBREQJcjQscjQscjQJCQkJCQ0KKwlRQURECXIxMSxyMTEscjExCQkJCQkNCisJUUFERAlyMTIscjEyLHIxMgkJCQkJDQorCQkNCisJUUFERAlyMyxyMyxyMwkJCQkJDQorCVFBREQJcjQscjQscjQJCQkJCQ0KKwlRQURECXIxMSxyMTEscjExCQkJCQkNCisJUUFERAlyMTIscjEyLHIxMgkJCQkJDQorCQ0KKwlRQURECXIzLHIzLHIzCQkJCQkNCisJUUFERAlyNCxyNCxyNAkJCQkJDQorCVFBREQJcjExLHIxMSxyMTEJCQkJCQ0KKwlRQURECXIxMixyMTIscjEyCQkJCQkNCisJDQorCVFBREQJcjMscjMscjMJCQkJCQ0KKwlRQURECXI0LHI0LHI0CQkJCQkNCisJUUFERAlyMTEscjExLHIxMQkJCQkJDQorCVFBREQJcjEyLHIxMixyMTIJCQkJCQ0KKwkNCisJTU9WCXIyLCMzMjc2OAkNCisJDQorCVFEQURECXIzLHIyLHIzCQkJCQkNCisJUURBREQJcjQscjIscjQJCQkJCQ0KKwlRREFERAlyMTEscjIscjExCQkJCQkNCisJUURBREQJcjEyLHIyLHIxMgkJCQkJDQorCQkNCisJDQorCU1PVglyMyxyMyxhc3IgIzE2DQorCU1PVglyNCxyNCxhc3IgIzE2DQorCU1PVglyMTEscjExLGFzciAjMTYNCisJTU9WCXIxMixyMTIsYXNyICMxNg0KKwkNCisJU1RSSAlyMyxbcjBdLCMyDQorCVNUUkgJcjQsW3IwXSwjMg0KKwlTVFJICXIxMSxbcjBdLCMyDQorCVNUUkgJcjEyLFtyMF0sIzINCisJDQorCU1PVglyMixyMTQsYXNyICMxNg0KKwlTVUIJcjE0LCByMTQsICMweDEwMDAwDQorCVNVQlMJcjIscjIsIzENCisJQk5FCXJlc2lkdV9sb29wCQ0KK2VuZDoNCisJTERNRkQJcjEzISwge3I4IC1yMTJ9CQ0KKwlMRE1GRAlyMTMhLCB7cjQgLXIxMixwY30NCisNCisgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAuRU5ECSANCisgICAgICAgIA0KKwkNCisJICANCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTlmNDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3NjYWxlX3NpZ19vcHQucwpAQCAtMCwwICsxLDc1IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0ANCitAdm9pZCBTY2FsZV9zaWcoDQorQAkgICAgICAgV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSA6IHNpZ25hbCB0byBzY2FsZSAgICAgICAgICAgICAgICovDQorQAkgICAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHNpemUgb2YgeFtdICAgICAgICAgICAgICAgICAgICovDQorQAkgICAgICAgV29yZDE2IGV4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IGV4cG9uZW50OiB4ID0gcm91bmQoeCA8PCBleHApICovDQorQAkgICAgICAgKQ0KK0ANCitAcjAgLS0tIHhbXQ0KK0ByMSAtLS0gbGcNCitAcjIgLS0tIGV4cA0KKw0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisJICAuZ2xvYmFsICAgU2NhbGVfc2lnX29wdA0KKw0KK1NjYWxlX3NpZ19vcHQ6DQorDQorICAgICAgICAgU1RNRkQgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0NCisJIFNVQiAgICAgICAgICAgcjMsIHIxLCAjMSAgICAgICAgICAgICAgICAgIEBpID0gbGcgLSAxDQorICAgICAgICAgQ01QICAgICAgICAgICByMiwgIzAgICAgICAgICAgICAgICAgICAgICAgQENvbXBhcmUgZXhwIGFuZCAwDQorCSBSU0IgICAgICAgICAgIHI3LCByMiwgIzAgICAgICAgICAgICAgICAgICBAZXhwID0gLWV4cA0KKwkgQUREICAgICAgICAgICByMTAsIHIyLCAjMTYgICAgICAgICAgICAgICAgQDE2ICsgZXhwDQorICAgICAgICAgQUREICAgICAgICAgICByNCwgcjAsIHIzLCBMU0wgIzEgICAgICAgICAgQHhbaV0gYWRkcmVzcw0KKwkgTU9WICAgICAgICAgICByOCwgIzB4N2ZmZmZmZmYNCisJIE1PViAgICAgICAgICAgcjksICMweDgwMDANCisJIEJMRSAgICAgICAgICAgTE9PUDINCisJIA0KK0xPT1AxOg0KKw0KKyAgICAgICAgIExEUlNIICAgICAgICAgIHI1LCBbcjRdICAgICAgICAgICAgICAgICAgICBAbG9hZCB4W2ldDQorICAgICAgICAgTU9WICAgICAgICAgICByMTIsIHI1LCBMU0wgcjEwDQorCSBURVEgICAgICAgICAgIHI1LCByMTIsIEFTUiByMTANCisJIEVPUk5FICAgICAgICAgcjEyLCByOCwgcjUsIEFTUiAjMzENCisJIFNVQlMgICAgICAgICAgcjMsIHIzLCAjMQ0KKwkgUUFERCAgICAgICAgICByMTEsIHIxMiwgcjkNCisJIE1PViAgICAgICAgICAgcjEyLCByMTEsIEFTUiAjMTYNCisJIFNUUkggICAgICAgICAgcjEyLCBbcjRdLCAjLTINCisJIEJHRSAgICAgICAgICAgTE9PUDENCisgICAgICAgICBCTCAgICAgICAgICAgIFRoZV9lbmQNCisNCitMT09QMjoNCisNCisgICAgICAgICBMRFJTSCAgICAgICAgICByNSwgW3I0XSAgICAgICAgICAgICAgICAgICBAbG9hZCB4W2ldDQorCSBNT1YgICAgICAgICAgIHI2LCByNSwgTFNMICMxNiAgICAgICAgICAgIEBMX3RtcCA9IHhbaV0gPDwgMTYNCisJIE1PViAgICAgICAgICAgcjUsIHI2LCBBU1IgcjcgICAgICAgICAgICAgQExfdG1wID4+PSBleHANCisJIFFBREQgICAgICAgICAgcjExLCByNSwgcjkNCisJIE1PViAgICAgICAgICAgcjEyLCByMTEsIEFTUiAjMTYNCisJIFNVQlMgICAgICAgICAgcjMsIHIzLCAjMQ0KKwkgU1RSSCAgICAgICAgICByMTIsIFtyNF0sICMtMg0KKwkgQkdFICAgICAgICAgICBMT09QMg0KKw0KK1RoZV9lbmQ6DQorICAgICAgICAgTERNRkQgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0NCisgICAgIA0KKyAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgLkVORAkgDQorICAgICAgICANCisJDQorCSAgDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWU5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMKQEAgLTAsMCArMSwyMzggQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorQHZvaWQgU3luX2ZpbHQoDQorQCAgICAgV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IG1lbVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCBhW10gICAgLS0tICAgcjANCitAIHhbXSAgICAtLS0gICByMQ0KK0AgeVtdICAgIC0tLSAgIHIyDQorQCBtZW1bXSAgLS0tICAgcjMNCitAIG0gLS0tICAxNiAgbGcgLS0tIDgwICB1cGRhdGUgLS0tIDENCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorCSAgLmdsb2JhbCAgIFN5bl9maWx0X2FzbQ0KKyAgICAgICAgICAuZXh0ZXJuICAgdm9BV0JfQ29weQ0KKw0KK1N5bl9maWx0X2FzbToNCisNCisgICAgICAgICAgU1RNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTR9IA0KKyAgICAgICAgICBTVUIgICAgICAgICAgIHIxMywgcjEzLCAjNzAwICAgICAgICAgICAgICAgICAgIEAgeV9idWZbTF9GUkFNRTE2ayArIE0xNmtdDQorICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjQsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IG1lbVtdIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjEzICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgeXkgPSB5X2J1ZiBhZGRyZXNzDQorDQorICAgICAgICAgIEAgZm9yKGkgPSAwQCBpIDwgbUAgaSsrKQ0KKyAgICAgICAgICBAew0KKyAgICAgICAgICBAICAgICp5eSsrID0gbWVtW2ldQA0KKyAgICAgICAgICBAfSANCisNCisgICAgICAgICAgTERSSCAgICAgICAgICByNiwgIFtyNF0sICMyICAgICAgICAgIA0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHI3LCAgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByOCwgIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjksICBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHIxMCwgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByMTEsIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjEyLCBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHIxNCwgW3I0XSwgIzINCisNCisgICAgICAgICAgU1RSSCAgICAgICAgICByNiwgIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjcsICBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI4LCAgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByOSwgIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjEwLCBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxMSwgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByMTIsIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjE0LCBbcjVdLCAjMg0KKw0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHI2LCAgW3I0XSwgIzIgICAgICAgICAgDQorICAgICAgICAgIExEUkggICAgICAgICAgcjcsICBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHI4LCAgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByOSwgIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjEwLCBbcjRdLCAjMg0KKyAgICAgICAgICBMRFJIICAgICAgICAgIHIxMSwgW3I0XSwgIzINCisgICAgICAgICAgTERSSCAgICAgICAgICByMTIsIFtyNF0sICMyDQorICAgICAgICAgIExEUkggICAgICAgICAgcjE0LCBbcjRdLCAjMg0KKw0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI2LCAgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByNywgIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjgsICBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI5LCAgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByMTAsIFtyNV0sICMyDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjExLCBbcjVdLCAjMg0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHIxMiwgW3I1XSwgIzINCisgICAgICAgICAgU1RSSCAgICAgICAgICByMTQsIFtyNV0sICMyDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjUsIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMF0NCisgICAgICAgICAgTU9WICAgICAgICAgICByOCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjUsIHI1LCBBU1IgIzEgICAgICAgICAgICAgICAgICAgQCBhMCA9IGFbMF0gPj4gMQ0KKyAgICAgICAgICBATU9WICAgICAgICAgICByNCwgcjEzDQorICAgICAgICAgIEAgbG9hZCBhbGwgYVtdDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjE0LCA9MHhmZmZmDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzJdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjNF0gICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVsyXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCBbcjAsICM2XSAgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjExLFtyMCwgIzhdICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbNF0NCisgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNA0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI5LCByOSwgcjE0ICAgICAgICAgIA0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgLWFbMl0gLS0gLWFbMV0NCisgICAgICAgICAgT1JSICAgICAgICAgICByMTIsIHI5LCByMTEsIExTTCAjMTYgICAgICAgICAgICBAIC1hWzRdIC0tIC1hWzNdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTRdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLThdDQorICAgICAgICAgIA0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCBbcjAsICMxMF0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzVdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzEyXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbNl0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3IwLCAjMTRdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVs3XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSxbcjAsICMxNl0gICAgICAgICAgICAgICAgICAgIEAgbG9hZCBhWzhdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOSwgcjksIHIxNCAgICAgICAgICANCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIC1hWzZdIC0tIC1hWzVdDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEyLCByOSwgcjExLCBMU0wgIzE2ICAgICAgICAgICAgQCAtYVs4XSAtLSAtYVs3XQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMCwgW3IxMywgIy0xMl0NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTIsIFtyMTMsICMtMTZdICAgICAgICAgIA0KKyAgICAgICAgICAgDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzE4XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbOV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByNywgW3IwLCAjMjBdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVsxMF0NCisgICAgICAgICAgTERSU0ggICAgICAgICByOSwgW3IwLCAjMjJdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVsxMV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTEsW3IwLCAjMjRdICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVsxMl0NCisgICAgICAgICAgQU5EICAgICAgICAgICByNiwgcjYsIHIxNA0KKyAgICAgICAgICBBTkQgICAgICAgICAgIHI5LCByOSwgcjE0ICAgICAgICAgIA0KKyAgICAgICAgICBPUlIgICAgICAgICAgIHIxMCwgcjYsIHI3LCBMU0wgIzE2ICAgICAgICAgICAgIEAgLWFbMTBdIC0tIC1hWzldDQorICAgICAgICAgIE9SUiAgICAgICAgICAgcjEyLCByOSwgcjExLCBMU0wgIzE2ICAgICAgICAgICAgQCAtYVsxMl0gLS0gLWFbMTFdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEwLCBbcjEzLCAjLTIwXQ0KKyAgICAgICAgICBTVFIgICAgICAgICAgIHIxMiwgW3IxMywgIy0yNF0gICAgDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsIFtyMCwgIzI2XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjcsIFtyMCwgIzI4XSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTRdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksIFtyMCwgIzMwXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTVdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjExLFtyMCwgIzMyXSAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGFbMTZdDQorICAgICAgICAgIEFORCAgICAgICAgICAgcjYsIHI2LCByMTQNCisgICAgICAgICAgQU5EICAgICAgICAgICByOSwgcjksIHIxNCAgICAgICAgICANCisgICAgICAgICAgT1JSICAgICAgICAgICByMTAsIHI2LCByNywgTFNMICMxNiAgICAgICAgICAgICBAIC1hWzE0XSAtLSAtYVsxM10NCisgICAgICAgICAgT1JSICAgICAgICAgICByMTIsIHI5LCByMTEsIExTTCAjMTYgICAgICAgICAgICBAIC1hWzE2XSAtLSAtYVsxNV0NCisgICAgICAgICAgU1RSICAgICAgICAgICByMTAsIFtyMTMsICMtMjhdDQorICAgICAgICAgIFNUUiAgICAgICAgICAgcjEyLCBbcjEzLCAjLTMyXSAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgQUREICAgICAgICAgICByNCwgcjEzLCAjMzINCitMT09QOg0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgIEAgbG9hZCB4W2ldDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNCwgcjgsIExTTCAjMSAgICAgICAgICAgICAgQCB0ZW1wX3AgPSB5eSArIGkNCisNCisgICAgICAgICAgTVVMICAgICAgICAgICByMCwgcjUsIHI2ICAgICAgICAgICAgICAgICAgICAgIEAgTF90bXAgPSB4W2ldICogYTANCisgICAgICAgICAgQCBmb3IoaiA9IDFAIGogPD0gbSwgais9OCkNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtNF0gICAgICAgICAgICAgICAgICBAIC1hWzJdICAtYVsxXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0yXSAgICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxKQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMCwgIy00XSAgICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAyKQ0KKw0KKw0KKyAgICAgICAgICBTTVVMQkIgICAgICAgIHIxNCwgcjksIHI3ICAgICAgICAgICAgICAgICAgICAgIEAgLWFbMV0gKiAoKih0ZW1wX3AgLTEpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IxMCwgIy02XSAgICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAzKQ0KKw0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxNCwgcjEyLCByNywgcjE0ICAgICAgICAgICAgICAgIEAgLWFbMl0gKiAoKih0ZW1wX3AgLSAyKSkNCisNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtOF0gICAgICAgICAgICAgICAgICBAIC1hWzRdIC1hWzNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjExLCBbcjEwLCAjLThdICAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDQpDQorDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByNiwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVszXSAqICgqKHRlbXBfcCAtMykpDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksICBbcjEwLCAjLTEwXSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDUpDQorICAgDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVs0XSAqICgqKHRlbXBfcCAtNCkpICAgICAgICANCisNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtMTJdICAgICAgICAgICAgICAgICBAIC1hWzZdICAtYVs1XQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMiwgW3IxMCwgIy0xMl0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA2KQ0KKw0KKyAgICAgICAgICBTTUxBQkIgICAgICAgIHIxNCwgcjksIHI3LCByMTQgICAgICAgICAgICAgICAgIEAgLWFbNV0gKiAoKih0ZW1wX3AgLTUpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IxMCwgIy0xNF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSA3KQ0KKw0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxNCwgcjEyLCByNywgcjE0ICAgICAgICAgICAgICAgIEAgLWFbNl0gKiAoKih0ZW1wX3AgLSA2KSkNCisNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtMTZdICAgICAgICAgICAgICAgICBAIC1hWzhdIC1hWzddDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjExLCBbcjEwLCAjLTE2XSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDgpDQorICAgICAgICAgDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByNiwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVs3XSAqICgqKHRlbXBfcCAtNykpDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjksICBbcjEwLCAjLTE4XSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDkpDQorDQorICAgICAgICAgIFNNTEFCVCAgICAgICAgcjE0LCByMTEsIHI3LCByMTQgICAgICAgICAgICAgICAgQCAtYVs4XSAqICgqKHRlbXBfcCAtOCkpICAgICAgICAgIA0KKyANCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtMjBdICAgICAgICAgICAgICAgICBAIC1hWzEwXSAgLWFbOV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTAsICMtMjBdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTApDQorDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByOSwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVs5XSAqICgqKHRlbXBfcCAtOSkpDQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjYsICBbcjEwLCAjLTIyXSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDExKQ0KKw0KKyAgICAgICAgICBTTUxBQlQgICAgICAgIHIxNCwgcjEyLCByNywgcjE0ICAgICAgICAgICAgICAgIEAgLWFbMTBdICogKCoodGVtcF9wIC0gMTApKQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHI3LCAgW3IxMywgIy0yNF0gICAgICAgICAgICAgICAgIEAgLWFbMTJdIC1hWzExXQ0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMSwgW3IxMCwgIy0yNF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxMikNCisNCisgICAgICAgICAgU01MQUJCICAgICAgICByMTQsIHI2LCByNywgcjE0ICAgICAgICAgICAgICAgICBAIC1hWzExXSAqICgqKHRlbXBfcCAtMTEpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI5LCAgW3IxMCwgIy0yNl0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxMykNCisNCisgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMSwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzEyXSAqICgqKHRlbXBfcCAtMTIpKSAgICAgICAgICAgDQorDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjcsICBbcjEzLCAjLTI4XSAgICAgICAgICAgICAgICAgQCAtYVsxNF0gLWFbMTNdDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjEwLCAjLTI4XSAgICAgICAgICAgICAgICAgQCAqKHRlbXBfcCAtIDE0KQ0KKyANCisgICAgICAgICAgU01MQUJCICAgICAgICByMTQsIHI5LCByNywgcjE0ICAgICAgICAgICAgICAgICBAIC1hWzEzXSAqICgqKHRlbXBfcCAtMTMpKQ0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IxMCwgIy0zMF0gICAgICAgICAgICAgICAgIEAgKih0ZW1wX3AgLSAxNSkNCisNCisgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMiwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzE0XSAqICgqKHRlbXBfcCAtIDE0KSkNCisNCisgICAgICAgICAgTERSICAgICAgICAgICByNywgIFtyMTMsICMtMzJdICAgICAgICAgICAgICAgICBAIC1hWzE2XSAtYVsxNV0NCisgICAgICAgICAgTERSU0ggICAgICAgICByMTEsIFtyMTAsICMtMzJdICAgICAgICAgICAgICAgICBAICoodGVtcF9wIC0gMTYpDQorDQorICAgICAgICAgIFNNTEFCQiAgICAgICAgcjE0LCByNiwgcjcsIHIxNCAgICAgICAgICAgICAgICAgQCAtYVsxNV0gKiAoKih0ZW1wX3AgLTE1KSkNCisNCisgICAgICAgICAgU01MQUJUICAgICAgICByMTQsIHIxMSwgcjcsIHIxNCAgICAgICAgICAgICAgICBAIC1hWzE2XSAqICgqKHRlbXBfcCAtMTYpKQ0KKw0KKyAgICAgICAgICBSU0IgICAgICAgICAgIHIxNCwgcjE0LCByMA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgTU9WICAgICAgICAgICByNywgcjE0LCBMU0wgIzQgICAgICAgICAgICAgICAgICBAIExfdG1wIDw8PTQNCisgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjgsICMxDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjE0LCByNywgIzB4ODAwMCAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjcsIHIxNCwgQVNSICMxNiAgICAgICAgICAgICAgICAgQCAoTF90bXAgKyAweDgwMDApID4+IDE2DQorICAgICAgICAgIENNUCAgICAgICAgICAgcjgsICM4MA0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI3LCBbcjEwXSAgICAgICAgICAgICAgICAgICAgICAgIEAgeXlbaV0NCisgICAgICAgICAgU1RSSCAgICAgICAgICByNywgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICBAIHlbaV0NCisgICAgICAgICAgQkxUICAgICAgICAgICBMT09QDQorIA0KKyAgICAgICAgICBAIHVwZGF0ZSBtZW1bXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHI1LCByMTMsICMxNjAgICAgICAgICAgICAgICAgICAgIEAgeXlbNjRdIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAgICAgICByMSwgcjMNCisgICAgICAgICAgTU9WICAgICAgICAgICByMCwgcjUNCisgICAgICAgICAgTU9WICAgICAgICAgICByMiwgIzE2DQorICAgICAgICAgIEJMICAgICAgICAgICAgdm9BV0JfQ29weSAgICAgICAgICANCisNCitTeW5fZmlsdF9hc21fZW5kOg0KKyANCisgICAgICAgICAgQUREICAgICAgICAgICByMTMsIHIxMywgIzcwMAkJICAgICANCisgICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKyAgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgICAuRU5EDQorIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjYwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zCkBAIC0wLDAgKzEsMTAyIEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0ANCitAdm9pZCBEZWVtcGhfMzIoDQorQCAgICAgV29yZDE2IHhfaGlbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQzMS4uMTYpICovDQorQCAgICAgV29yZDE2IHhfbG9bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsIChiaXQxNS4uNCkgICovDQorQCAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAoeDE2KSAgICAgICovDQorQCAgICAgV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogZGVlbXBoYXNpcyBmYWN0b3IgICAgICAgICovDQorQCAgICAgV29yZDE2IEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICovDQorQCAgICAgKQ0KKw0KK0B4X2hpICAgICBSTiAgICAgIFIwDQorQHhfbG8gICAgIFJOICAgICAgUjENCitAeVtdICAgICAgUk4gICAgICBSMg0KK0AqbWVtICAgICBSTiAgICAgIFIzDQorDQorICAgICAgICAgICAuc2VjdGlvbiAgLnRleHQNCisgICAgICAgICAgIC5nbG9iYWwgICBEZWVtcGhfMzJfYXNtDQorCSAgIA0KK0RlZW1waF8zMl9hc206DQorDQorICAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorCSAgIE1PViAgICAgICAgICByNCwgIzIgICAgICAgICAgICAgICAgICAgQGk9MA0KKwkgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbMF0NCisJICAgTERSU0ggICAgICAgIHI3LCBbcjFdLCAjMiAgICAgICAgICAgICBAbG9hZCB4X2xvWzBdDQorCSAgIExEUiAgICAgICAgICByNSwgPTIyMjgyICAgICAgICAgICAgICAgQHI1LS0tbXUNCisJICAgTU9WICAgICAgICAgIHIxMSwgIzB4ODAwMA0KKw0KKyAgICAgICAgICAgQHlbMF0NCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYgICAgICAgICBATF90bXAgPSB4X2hpWzBdPDwxNg0KKwkgICBNT1YgICAgICAgICAgcjgsICByNSwgQVNSICMxICAgICAgICAgIEBmYWMgPSBtdSA+PiAxDQorCSAgIExEUiAgICAgICAgICByNSwgIFtyM10NCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0ICAgICBATF90bXAgKz0geF9sb1swXSA8PCA0DQorCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzICAgICAgICAgQExfdG1wIDw8PSAzDQorCSAgIE1VTCAgICAgICAgICByOSwgcjUsIHI4DQorCSAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVsxXSANCisJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQ0KKwkgICBMRFJTSCAgICAgICAgcjcsIFtyMV0sICMyICAgICAgICAgICAgIEBsb2FkIHhfbG9bMV0gIA0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMSAgICAgICAgIEBMX3RtcCA9IExfbWFjKExfdG1wLCAqbWVtLCBmYWMpDQorCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExDQorCSAgIE1PViAgICAgICAgICByMTQsIHIxMCwgQVNSICMxNiAgICAgICAgQHlbMF0gPSByb3VuZChMX3RtcCkNCisNCisNCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYNCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0DQorICAgICAgICAgICBTVFJIICAgICAgICAgcjE0LCBbcjJdLCAjMiAgICAgICAgICAgIEB1cGRhdGUgeVswXQ0KKwkgICBNT1YgICAgICAgICAgcjEwLCByMTIsIExTTCAjMw0KKwkgICBNVUwgICAgICAgICAgcjksIHIxNCwgcjgNCisJICAgUURBREQgICAgICAgIHIxMCwgcjEwLCByOQ0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMQ0KKwkgICBRQUREICAgICAgICAgcjEwLCByMTIsIHIxMQ0KKwkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYgICAgICAgIEB5WzFdID0gcm91bmQoTF90bXApDQorDQorTE9PUDoNCisgICAgICAgICAgIExEUlNIICAgICAgICByNiwgW3IwXSwgIzIgICAgICAgICAgICAgQGxvYWQgeF9oaVtdDQorCSAgIExEUlNIICAgICAgICByNywgW3IxXSwgIzINCisJICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXSwgIzINCisJICAgTU9WICAgICAgICAgIHIxMCwgcjYsIExTTCAjMTYNCisJICAgQUREICAgICAgICAgIHIxMiwgcjEwLCByNywgTFNMICM0DQorCSAgIE1VTCAgICAgICAgICByOSwgcjE0LCByOA0KKwkgICBNT1YgICAgICAgICAgcjEwLCByMTIsIExTTCAjMw0KKwkgICBRREFERCAgICAgICAgcjEwLCByMTAsIHI5DQorICAgICAgICAgICBMRFJTSCAgICAgICAgcjYsIFtyMF0sICMyICAgICAgICAgICAgIEBsb2FkIHhfaGlbXQ0KKwkgICBNT1YgICAgICAgICAgcjEyLCByMTAsIExTTCAjMQ0KKwkgICBRQUREICAgICAgICAgcjEwLCByMTIsIHIxMQ0KKwkgICBMRFJTSCAgICAgICAgcjcsIFtyMV0sICMyDQorCSAgIE1PViAgICAgICAgICByMTQsIHIxMCwgQVNSICMxNg0KKw0KKwkgICBNT1YgICAgICAgICAgcjEwLCByNiwgTFNMICMxNg0KKwkgICBBREQgICAgICAgICAgcjEyLCByMTAsIHI3LCBMU0wgIzQNCisJICAgU1RSSCAgICAgICAgIHIxNCwgW3IyXSwgIzINCisJICAgTVVMICAgICAgICAgIHI5LCByMTQsIHI4DQorCSAgIE1PViAgICAgICAgICByMTAsIHIxMiwgTFNMICMzDQorCSAgIFFEQUREICAgICAgICByMTAsIHIxMCwgcjkNCisgICAgICAgICAgIEFERCAgICAgICAgICByNCwgcjQsICMyDQorCSAgIE1PViAgICAgICAgICByMTIsIHIxMCwgTFNMICMxDQorCSAgIFFBREQgICAgICAgICByMTAsIHIxMiwgcjExDQorICAgICAgICAgICBDTVAgICAgICAgICAgcjQsICM2NA0KKwkgICBNT1YgICAgICAgICAgcjE0LCByMTAsIEFTUiAjMTYNCisNCisgICAgICAgICAgIEJMVCAgICAgICAgICBMT09QDQorICAgICAgICAgICBTVFIgICAgICAgICAgcjE0LCBbcjNdDQorICAgICAgICAgICBTVFJIICAgICAgICAgcjE0LCBbcjJdCSAgIA0KKw0KKyAgICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKw0KKwkgICAuRU5EDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2EzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKQEAgLTAsMCArMSwxMjcgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK0BXb3JkMzIgRG90X3Byb2R1Y3QxMiggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEzMTogbm9ybWFsaXplZCByZXN1bHQgKDEgPCB2YWwgPD0gLTEpICovDQorQCAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAxMmJpdHM6IHggdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAqLw0KK0AgICAgICAgV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB5IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCitAICAgICAgIFdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogdmVjdG9yIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgICBXb3JkMTYgKiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IGV4cG9uZW50IG9mIHJlc3VsdCAoMC4uKzMwKSAgICAgICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgIHhbXSAgIC0tLSAgcjANCitAICB5W10gICAtLS0gIHIxDQorQCAgbGcgICAgLS0tICByMg0KK0AgICpleHAgIC0tLSAgcjMNCisNCisgICAgICAgICAgLnNlY3Rpb24gICAudGV4dA0KKyAgICAgICAgICAuZ2xvYmFsICAgIERvdF9wcm9kdWN0MTJfYXNtDQorDQorRG90X3Byb2R1Y3QxMl9hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCSAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0NCisJICBDTVAgICAgICAgICAgICAgICByMCwgcjENCisJICBCRVEgICAgICAgICAgICAgICBMT09QX0VRDQorDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAgICAgIHtRMCwgUTF9LCBbcjBdISAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisgICAgICAgICAgVkxEMS5TMTYgICAgICAgICAge1EyLCBRM30sIFtyMF0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHhbXQ0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICB7UTQsIFE1fSwgW3IwXSEgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAgICAgIHtRNiwgUTd9LCBbcjBdISAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisJICBWTEQxLlMxNiAgICAgICAgICB7UTgsIFE5fSwgW3IxXSEgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeVtdDQorCSAgVkxEMS5TMTYgICAgICAgICAge1ExMCwgUTExfSwgW3IxXSEgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHlbXQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRMTIsIFExM30sIFtyMV0hICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB5W10NCisNCisgICAgICAgICAgVk1VTEwuUzE2ICAgICAgICAgUTE1LCBEMTYsIEQwDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE3LCBEMSAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxOCwgRDINCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMTksIEQzDQorCSAgVkxEMS5TMTYgICAgICAgICAge1EwLCBRMX0sIFtyMV0hICAgICAgICAgICAgICAgQGxvYWQgMTYgV29yZDE2IHlbXSAgIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMCwgRDQgICAgICAgDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDIxLCBENQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyMiwgRDYNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMjMsIEQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDI0LCBEOA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyNSwgRDkNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMjYsIEQxMA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyNywgRDExDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDAsIEQxMg0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxLCBEMTMNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMiwgRDE0DQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDMsIEQxNQ0KKw0KKyAgICAgICAgICBDTVAgICAgICAgICAgICAgICByMiwgIzY0DQorICAgICAgICAgIEJFUSAgICAgICAgICAgICAgIExhYmxlMQ0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgICAgICB7UTAsIFExfSwgW3IwXSEgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdICANCisJICBWTEQxLlMxNiAgICAgICAgICB7UTIsIFEzfSwgW3IxXSEgDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDQsIEQwICAgICAgICAgICAgIA0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ1LCBEMQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ2LCBEMg0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ3LCBEMw0KKwkgIEJMICAgICAgICAgICAgICAgIExhYmxlMQ0KKw0KK0xPT1BfRVE6DQorICAgICAgICAgIFZMRDEuUzE2ICAgICAgICAgIHtRMCwgUTF9LCBbcjBdIQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRMiwgUTN9LCBbcjBdIQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRNCwgUTV9LCBbcjBdIQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRNiwgUTd9LCBbcjBdIQ0KKwkgIFZNVUxMLlMxNiAgICAgICAgIFExNSwgRDAsIEQwDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMSwgRDENCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyLCBEMg0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDMsIEQzDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENCwgRDQNCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ1LCBENQ0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDYsIEQ2DQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBENywgRDcNCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQ4LCBEOA0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDksIEQ5DQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMTAsIEQxMA0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDExLCBEMTENCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxMiwgRDEyDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMTMsIEQxMw0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDE0LCBEMTQNCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQxNSwgRDE1DQorDQorCSAgQ01QICAgICAgICAgICAgICAgcjIsICM2NA0KKwkgIEJFUSAgICAgICAgICAgICAgIExhYmxlMQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgIHtRMCwgUTF9LCBbcjBdIQ0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDAsIEQwDQorCSAgVk1MQUwuUzE2ICAgICAgICAgUTE1LCBEMSwgRDENCisJICBWTUxBTC5TMTYgICAgICAgICBRMTUsIEQyLCBEMg0KKwkgIFZNTEFMLlMxNiAgICAgICAgIFExNSwgRDMsIEQzDQorDQorTGFibGUxOiANCisNCisgICAgICAgICAgVlFBREQuUzMyICAgICAgICAgRDMwLCBEMzAsIEQzMQ0KKyAgICAgICAgICBWUEFERC5TMzIgICAgICAgICBEMzAsIEQzMCwgRDMwDQorICAgICAgICAgIFZNT1YuUzMyICAgICAgICAgIHIxMiwgRDMwWzBdICAgICAgICANCisNCisJICBBREQgICAgICAgICAgICAgICByMTIsIHIxMiwgcjEyDQorICAgICAgICAgIEFERCAgICAgICAgICAgICAgIHIxMiwgcjEyLCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAIExfc3VtID0gKExfc3VtIDw8IDEpICArIDENCisJICBNT1YgICAgICAgICAgICAgICByNCwgcjEyDQorCSAgQ01QICAgICAgICAgICAgICAgcjEyLCAjMA0KKwkgIFJTQkxUICAgICAgICAgICAgIHI0LCByMTIsICMwDQorICAgICAgICAgIENMWiAgICAgICAgICAgICAgIHIxMCwgcjQNCisgICAgICAgICAgU1VCICAgICAgICAgICAgICAgcjEwLCByMTAsICMxICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2Z0ID0gbm9ybV9sKExfc3VtKQ0KKyAgICAgICAgICBNT1YgICAgICAgICAgICAgICByMCwgcjEyLCBMU0wgcjEwICAgICAgICAgICAgICAgICAgICAgQCBMX3N1bSA9IExfc3VtIDw8IHNmdA0KKyAgICAgICAgICBSU0IgICAgICAgICAgICAgICByMTEsIHIxMCwgIzMwICAgICAgICAgICAgICAgICAgICAgICAgQCAqZXhwID0gMzAgLSBzZnQNCisgICAgICAgICAgU1RSSCAgICAgICAgICAgICAgcjExLCBbcjNdICAgICAgICAgICAgICAgICAgICAgDQorDQorRG90X3Byb2R1Y3QxMl9lbmQ6DQorCQkgICAgIA0KKyAgICAgICAgICBMRE1GRCAgIAkgICAgcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKw0KKyAgICAgICAgICAuRU5EDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9GaWx0XzZrXzdrX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODgwMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKQEAgLTAsMCArMSwyMjggQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorQHZvaWQgRmlsdF82a183aygNCitAICAgICBXb3JkMTYgc2lnbmFsW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgc2lnbmFsICAgICAgICAgICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgbGVuZ3RoIG9mIGlucHV0ICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogbWVtb3J5IChzaXplPTMwKSAgICAgICAgKi8NCitAKQ0KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KK0AgcjAgICAgLS0tICBzaWduYWxbXQ0KK0AgcjEgICAgLS0tICBsZw0KK0AgcjIgICAgLS0tICBtZW1bXSANCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0DQorICAgICAgICAgIC5nbG9iYWwgICBGaWx0XzZrXzdrX2FzbQ0KKyAgICAgICAgICAuZXh0ZXJuICAgZmlyXzZrXzdrDQorDQorRmlsdF82a183a19hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCQlyMTMhLCB7cjAgLSByMTIsIHIxNH0gDQorICAgICAgICAgIFNVQiAgICAJCXIxMywgcjEzLCAjMjQwICAgICAgICAgICAgICBAIHhbTF9TVUJGUjE2ayArIChMX0ZJUiAtIDEpXQ0KKyAgICAgICAgICBNT1YgICAgIAkJcjgsIHIwICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBzaWduYWxbXSBhZGRyZXNzDQorICAgICAgICAgIE1PViAgICAgCQlyNSwgcjIgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IG1lbVtdIGFkZHJlc3MNCisNCisgICAgICAgICAgTU9WICAgICAJCXIwLCByMg0KKyAgICAgICAgICBNT1YgICAgIAkJcjEsIHIxMw0KKw0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjBdIQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7RDQsIEQ1LCBENiwgRDd9LCBbcjBdIQ0KKw0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7RDAsIEQxLCBEMiwgRDN9LCBbcjFdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7RDQsIEQ1LCBENn0sIFtyMV0hDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIEQ3WzBdLCBbcjFdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICBEN1sxXSwgW3IxXSENCisNCisNCisNCisgICAgICAgICAgTERSICAgICAJCXIxMCwgTGFibGUxICAgICAgICAgICAgICAgICBAIGdldCBmaXJfN2sgYWRkcmVzcyAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgICAgICAgICByMywgcjggICAgICAgICAgICAgICAgICAgICAgQCBjaGFuZ2UgbXlNZW1Db3B5IHRvIENvcHksIGR1ZSB0byBDb3B5IHdpbGwgY2hhbmdlIHIzIGNvbnRlbnQNCisgICAgICAgICAgQUREICAgICAJICAgIAlyNiwgcjEzLCAjNjAgICAgICAgICAgICAgICAgQCBnZXQgeFtMX0ZJUiAtIDFdIGFkZHJlc3MNCisgICAgICAgICAgTU9WICAgICAgICAgICAJcjcsIHIzICAgICAgICAgICAgICAgICAgICAgIEAgZ2V0IHNpZ25hbFtpXQ0KKyAgICAgICAgICBAZm9yIChpID0gbGcgLSAxQCBpID49IDBAIGktLSkNCisgICAgICAgICAgQHsNCisgICAgICAgICAgQCAgICAgeFtpICsgTF9GSVIgLSAxXSA9IHNpZ25hbFtpXSA+PiAyQA0KKyAgICAgICAgICBAfQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTAsIFExfSwgW3I3XSEJCSAgICBAIHNpZ25hbFswXSAgfiBzaWduYWxbMTVdDQorCSAgVkxEMS5TMTYgICAgICAgICAgICAgIHtRMiwgUTN9LCBbcjddISAgICAgICAgICAgICBAIHNpZ25hbFsxNl0gfiBzaWduYWxbMzFdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTQsIFE1fSwgW3I3XSEgICAgICAgICAgICAgQCBzaWduYWxbMzJdIH4gc2lnbmFsWzQ3XQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTYsIFE3fSwgW3I3XSEgICAgICAgICAgICAgQCBzaWduYWxbNDhdIH4gc2lnbmFsWzYzXQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTgsIFE5fSwgW3I3XSEgICAgICAgICAgICAgQCBzaWduYWxbNjRdIH4gc2lnbmFsWzc5XQ0KKwkgIFZTSFIuUzE2ICAgICAgICAgICAgICBRMTAsIFEwLCAjMg0KKyAgICAgICAgICBWU0hSLlMxNiAgICAgICAgICAgICAgUTExLCBRMSwgIzINCisgICAgICAgICAgVlNIUi5TMTYgICAgICAgICAgICAgIFExMiwgUTIsICMyDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFExMywgUTMsICMyDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIHtRMTAsIFExMX0sIFtyNl0hDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFEwLCAgUTQsICMyDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFExLCAgUTUsICMyDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFExMCwgUTYsICMyDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFExMSwgUTcsICMyDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFEyLCAgUTgsICMyDQorCSAgVlNIUi5TMTYgICAgICAgICAgICAgIFEzLCAgUTksICMyDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIHtRMTIsIFExM30sIFtyNl0hDQorCSAgVlNUMS5TMTYgICAgICAgICAgICAgIHtRMCwgUTF9LCBbcjZdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7UTEwLCBRMTF9LCBbcjZdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICB7UTIsIFEzfSwgW3I2XSENCisNCisJICBNT1YgICAgICAgICAgICAgICAgICAgcjEyLCByNQ0KKyAgICAgICAgICBAU1RSICAgICAJCXI1LCBbc3AsICMtNF0gICAgICAgICAgICAgICBAIFBVU0ggIHI1IHRvIHN0YWNrDQorICAgICAgICAgIEAgbm90IHVzZSByZWdpc3RlcnM6IHI0LCByMTAsIHIxMiwgcjE0LCByNQ0KKyAgICAgICAgICBNT1YgICAgIAkJcjQsIHIxMyANCisgICAgICAgICAgTU9WICAgICAJCXI1LCAjMCAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwICAgIA0KKyAgICAgICAgIA0KKyAgICAgICAgICBAIHI0IC0tLSB4W2ldLCByMTAgLS0tLSBmaXJfNmtfN2sNCisgICAgICAgICAgVkxEMS5TMTYgICAgICAgICAgICAgIHtRMCwgUTF9LCBbcjEwXSEgICAgICAgICAgIEBmaXJfNmtfN2tbMF0gIH4gZmlyXzZrXzdrWzE1XQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTIsIFEzfSwgW3IxMF0hICAgICAgICAgICBAZmlyXzZrXzdrWzE2XSB+IGZpcl82a183a1szMV0NCisgICAgICAgICAgVk1PVi5TMTYgICAgICAgICAgICAgIEQ3WzNdLCByNSAgICAgICAgICAgICAgICAgICAgICAgIEBzZXQgZmlyXzZrXzdLID0gMA0KKw0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTQsIFE1fSwgW3I0XSEgICAgICAgICAgICBAeFswXSAgfiB4WzE1XQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTYsIFE3fSwgW3I0XSEgICAgICAgICAgICBAeFsxNl0gfiBYWzMxXQ0KKwkgIFZMRDEuUzE2ICAgICAgICAgICAgICB7UTh9LCBbcjRdISANCisgICAgICAgICAgVk1PVi5TMTYgICAgICAgICAgICAgIFExNSwgIzAJICANCisgICAgICAgICAgDQorTE9PUF82SzdLOg0KKw0KKyAgICAgICAgICBWTVVMTC5TMTYgICAgICAgICAgICAgUTksRDgsRDBbMF0gICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICBWTVVMTC5TMTYgICAgICAgICAgICAgUTEwLEQ5LEQxWzBdIA0KKyAgICAgICAgICBWTVVMTC5TMTYgICAgICAgICAgICAgUTExLEQ5LEQwWzBdICAgICAgICAgICAgICAgICANCisgICAgICAgICAgVk1VTEwuUzE2ICAgICAgICAgICAgIFExMixEMTAsRDFbMF0NCisgICAgICAgICAgVkVYVC44ICAgICAgICAgICAgICAgIFE0LFE0LFE1LCMyDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBROSxEMTAsRDJbMF0NCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFExMCxEMTEsRDNbMF0NCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFExMSxEMTEsRDJbMF0NCisgICAgICAgICAgVk1MQUwuUzE2ICAgICAgICAgICAgIFExMixEMTIsRDNbMF0gICAgDQorICAgICAgICAgIFZFWFQuOCAgICAgICAgICAgICAgICBRNSxRNSxRNiwjMg0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTksRDEyLEQ0WzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTAsRDEzLEQ1WzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTEsRDEzLEQ0WzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTIsRDE0LEQ1WzBdDQorICAgICAgICAgIFZFWFQuOCAgICAgICAgICAgICAgICBRNixRNixRNywjMg0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgICAgICAgICAgUTksRDE0LEQ2WzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTAsRDE1LEQ3WzBdDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgICAgICAgICBRMTEsRDE1LEQ2WzBdDQorCSAgVk1MQUwuUzE2ICAgICAgICAgICAgIFExMixEMTYsRDdbMF0NCisJICBWRVhULjggIAkJUTcsUTcsUTgsIzIgDQorDQorCSAgVk1MQUwuUzE2IAkJUTksRDgsRDBbMV0gICAgICAgICAgICAgICAgDQorCSAgVk1MQUwuUzE2ICAgICAJUTEwLEQ5LEQxWzFdDQorCSAgVkVYVC44IAkJUTgsUTgsUTE1LCMyIA0KKwkgIFZNTEFMLlMxNiAJCVExMSxEOSxEMFsxXSAgICAgICAgICAgICAgICANCisJICBWTUxBTC5TMTYgCQlRMTIsRDEwLEQxWzFdDQorCSAgVkVYVC44ICAJCVE0LFE0LFE1LCMyDQorCSAgVk1MQUwuUzE2IAkJUTksRDEwLEQyWzFdDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQxMSxEM1sxXQ0KKwkgIFZNTEFMLlMxNiAJCVExMSxEMTEsRDJbMV0NCisJICBWTUxBTC5TMTYgCQlRMTIsRDEyLEQzWzFdICAgIA0KKwkgIFZFWFQuOCAgCQlRNSxRNSxRNiwjMg0KKwkgIFZNTEFMLlMxNiAJCVE5LEQxMixENFsxXQ0KKwkgIFZNTEFMLlMxNiAJCVExMCxEMTMsRDVbMV0NCisJICBWTUxBTC5TMTYgCQlRMTEsRDEzLEQ0WzFdDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxNCxENVsxXQ0KKwkgIFZFWFQuOCAgCQlRNixRNixRNywjMg0KKwkgIFZNTEFMLlMxNiAJCVE5LEQxNCxENlsxXQ0KKwkgIFZNTEFMLlMxNiAJCVExMCxEMTUsRDdbMV0NCisJICBWTUxBTC5TMTYgCQlRMTEsRDE1LEQ2WzFdDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxNixEN1sxXQ0KKwkgIFZFWFQuOCAgCQlRNyxRNyxROCwjMiANCisNCisJICBWTUxBTC5TMTYgCQlROSxEOCxEMFsyXSAgICAgICAgICAgDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQ5LEQxWzJdDQorCSAgVkVYVC44IAkJUTgsUTgsUTE1LCMyIA0KKwkgIFZNTEFMLlMxNiAJCVExMSxEOSxEMFsyXSAgICAgICAgICAgDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxMCxEMVsyXQ0KKwkgIFZFWFQuOCAgCQlRNCxRNCxRNSwjMg0KKwkgIFZNTEFMLlMxNiAJCVE5LEQxMCxEMlsyXQ0KKwkgIFZNTEFMLlMxNiAJCVExMCxEMTEsRDNbMl0NCisJICBWTUxBTC5TMTYgCQlRMTEsRDExLEQyWzJdDQorCSAgVk1MQUwuUzE2IAkJUTEyLEQxMixEM1syXSAgICANCisJICBWRVhULjggIAkJUTUsUTUsUTYsIzINCisJICBWTUxBTC5TMTYgCQlROSxEMTIsRDRbMl0NCisJICBWTUxBTC5TMTYgCQlRMTAsRDEzLEQ1WzJdDQorCSAgVk1MQUwuUzE2IAkJUTExLEQxMyxENFsyXQ0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTQsRDVbMl0NCisJICBWRVhULjggIAkJUTYsUTYsUTcsIzINCisJICBWTUxBTC5TMTYgCQlROSxEMTQsRDZbMl0NCisJICBWTUxBTC5TMTYgCQlRMTAsRDE1LEQ3WzJdDQorCSAgVk1MQUwuUzE2IAkJUTExLEQxNSxENlsyXQ0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTYsRDdbMl0NCisJICBWRVhULjggIAkJUTcsUTcsUTgsIzIgDQorDQorCSAgVk1MQUwuUzE2IAkJUTksRDgsRDBbM10gICAgICAgICAgICAgIA0KKwkgIFZNTEFMLlMxNiAJCVExMCxEOSxEMVszXQ0KKwkgIFZFWFQuOCAJCVE4LFE4LFExNSwjMiANCisJICBWTUxBTC5TMTYgCQlRMTEsRDksRDBbM10gICAgICAgICAgICAgIA0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTAsRDFbM10NCisJICBWRVhULjggIAkJUTQsUTQsUTUsIzINCisJICBWTUxBTC5TMTYgCQlROSxEMTAsRDJbM10NCisJICBWTUxBTC5TMTYgCQlRMTAsRDExLEQzWzNdDQorCSAgVk1MQUwuUzE2IAkJUTExLEQxMSxEMlszXQ0KKwkgIFZNTEFMLlMxNiAJCVExMixEMTIsRDNbM10gICAgDQorCSAgVkVYVC44ICAJCVE1LFE1LFE2LCMyDQorCSAgVk1MQUwuUzE2IAkJUTksRDEyLEQ0WzNdDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQxMyxENVszXQ0KKwkgIFZNTEFMLlMxNiAJCVExMSxEMTMsRDRbM10NCisJICBWTUxBTC5TMTYgCQlRMTIsRDE0LEQ1WzNdDQorCSAgVkVYVC44ICAJCVE2LFE2LFE3LCMyDQorCSAgVk1MQUwuUzE2IAkJUTksRDE0LEQ2WzNdDQorCSAgVk1MQUwuUzE2IAkJUTEwLEQxNSxEN1szXQ0KKwkgIFZNTEFMLlMxNiAJCVExMSxEMTUsRDZbM10NCisJICBWTUxBTC5TMTYgCQlRMTIsRDE2LEQ3WzNdDQorCSAgVkVYVC44IAkJUTcsUTcsUTgsIzIgICAgIA0KKw0KKwkgIFZNT1YuUzE2ICAJCUQ4LEQ5DQorCSAgVkVYVC44IAkJUTgsUTgsUTE1LCMyIA0KKwkgIFZNT1YuUzE2ICAJCUQ5LEQxMA0KKwkgIFZBREQuUzMyICAJCVE5LFE5LFExMA0KKwkgIFZNT1YuUzE2ICAJCUQxMCxEMTENCisJICBWTU9WLlMxNiAgCQlEMTEsRDEyDQorCSAgVkFERC5TMzIgIAkJUTExLFExMSxRMTINCisJICBWTU9WLlMxNiAgCQlEMTIsRDEzDQorCSAgVlFSU0hSTi5TMzIgCQlEMjgsUTksIzE1DQorCSAgVk1PVi5TMTYgIAkJRDEzLEQxNA0KKwkgIFZNT1YuUzE2ICAJCUQxNCxEMTUNCisJICBWUVJTSFJOLlMzMiAJCUQyOSxRMTEsIzE1DQorCSAgVk1PVi5TMTYgIAkJRDE1LEQxNg0KKw0KKwkgIFZMRDEuUzE2ICAJCXtROH0sW3I0XSENCisJICBBREQgICAgICAgICAgICAgICAgICAgcjUsIHI1LCAjOA0KKwkgIENNUCAgIAkJcjUsICM4MA0KKwkgIFZTVDEuUzE2ICAJCXtEMjgsRDI5fSxbcjNdIQ0KKwkgIEJMVCAgICAgCQlMT09QXzZLN0sNCisNCisgICAgICAgICAgQUREICAgICAJCXIwLCByMTMsICMxNjAgICAgICAgICAgICAgICBAeCArIGxnDQorCSAgTU9WICAgICAgICAgICAgICAgICAgIHIxLCByMTINCisJICBATERSICAgICAJCXIxLCBbc3AsICMtNF0gICAgICAgICAgICAgICBAbWVtIGFkZHJlc3MNCisNCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IwXSENCisJICBWTEQxLlMxNiAgICAgICAgICAgICAge0Q0LCBENSwgRDYsIEQ3fSwgW3IwXSENCisNCisJICBWU1QxLlMxNiAgICAgICAgICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IxXSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAge0Q0LCBENSwgRDZ9LCBbcjFdIQ0KKwkgIFZTVDEuUzE2ICAgICAgICAgICAgICBEN1swXSwgW3IxXSENCisJICBWU1QxLlMxNiAgICAgICAgICAgICAgRDdbMV0sIFtyMV0hDQorICAgICAgICAgICAgICAgICAgICANCitGaWx0XzZrXzdrX2VuZDoNCisNCisgICAgICAgICAgQUREICAgICAJCXIxMywgcjEzLCAjMjQwICANCisgICAgICAgICAgTERNRkQgICAJCXIxMyEsIHtyMCAtIHIxMiwgcjE1fSANCisgDQorTGFibGUxOg0KKyAgICAgICAgICAud29yZCAgIAkJZmlyXzZrXzdrDQorICAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgIC5FTkQNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU5YWRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucwpAQCAtMCwwICsxLDI3MCBAQAorQC8qCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCitAICoqCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQCAqKgorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitAICoqCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitAICovCitACitAc3RhdGljIHZvaWQgTm9ybV9Db3JyIChXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB0YXJnZXQgdmVjdG9yICAgICAgICAgICAgICAqLworQCAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNSA6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygc3ludGgvd2d0IGZpbHRlcnMgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBMX3N1YmZyLCAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzdWItZnJhbWUgbGVuZ3RoICovCitAICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgdF9taW4sICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBvZiBwaXRjaCBsYWcuICAgKi8KK0AgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiB0X21heCwgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBtYXhpbXVtIHZhbHVlIG9mIHBpdGNoIGxhZy4gICAqLworQCAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNvcnJfbm9ybVtdKSAgICAgICAgICAgICAgLyogKG8pIFExNSA6IG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gICAgKi8KK0AKKworQCByMCAtLS0gZXhjW10KK0AgcjEgLS0tIHhuW10KK0AgcjIgLS0tIGhbXQorQCByMyAtLS0gTF9zdWJmcgorQCByNCAtLS0gdF9taW4KK0AgcjUgLS0tIHRfbWF4CitAIHI2IC0tLSBjb3JyX25vcm1bXQorCisKKwkuc2VjdGlvbiAgLnRleHQKKyAgICAgICAgLmdsb2JhbCAgICBOb3JtX2NvcnJfYXNtIAorICAgICAgICAuZXh0ZXJuICAgIENvbnZvbHZlX2FzbQorICAgICAgICAuZXh0ZXJuICAgIElzcXJ0X24KK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0AgY29uc3RhbnQKK0AqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy5lcXUgICAgRVhDICAgICAgICAgICAgICAgLCAwCisuZXF1ICAgIFhOICAgICAgICAgICAgICAgICwgNAorLmVxdSAgICBIICAgICAgICAgICAgICAgICAsIDgKKy5lcXUgICAgTF9TVUJGUiAgICAgICAgICAgLCAxMgorLmVxdSAgICB2b1NUQUNLICAgICAgICAgICAsIDE3MgorLmVxdSAgICBUX01JTiAgICAgICAgICAgICAsIDIxMgorLmVxdSAgICBUX01BWCAgICAgICAgICAgICAsIDIxNgorLmVxdSAgICBDT1JSX05PUk0gICAgICAgICAsIDIyMAorICAgICAgICAgICAgICAgICAgCitOb3JtX2NvcnJfYXNtOgorCisgICAgICAgIFNUTUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAgCisgICAgICAgIFNVQiAgICAgICAgICAgIHIxMywgcjEzLCAjdm9TVEFDSworICAKKyAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMywgIzIwICAgICAgICAgICAgICAgICBAZ2V0IHRoZSBleGNmW0xfU1VCRlJdCisgICAgICAgIExEUiAgICAgICAgICAgIHI0LCBbcjEzLCAjVF9NSU5dICAgICAgICAgICAgQGdldCB0X21pbgorICAgICAgICBSU0IgICAgICAgICAgICByMTEsIHI0LCAjMCAgICAgICAgICAgICAgICAgIEBrID0gLXRfbWluCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMCwgcjExLCBMU0wgIzEgICAgICAgICAgQGdldCB0aGUgJmV4Y1trXSAgIAorICAgICAgICAKKyAgICAgICAgQHRyYW5zZmVyIENvbnZvbHZlIGZ1bmN0aW9uCisgICAgICAgIFNUTUZEICAgICAgICAgIHNwISwge3IwIC0gcjN9CisgICAgICAgIE1PViAgICAgICAgICAgIHIwLCByNQorICAgICAgICBNT1YgICAgICAgICAgICByMSwgcjIKKyAgICAgICAgTU9WICAgICAgICAgICAgcjIsIHI4ICAgICAgICAgICAgICAgICAgICAgICBAcjIgLS0tIGV4Y2ZbXQorICAgICAgICBCTCAgICAgICAgICAgICBDb252b2x2ZV9hc20KKyAgICAgICAgTERNRkQgICAgICAgICAgc3AhLCB7cjAgLSByM30KKworICAgICAgICBAIHI4IC0tLSBleGNmW10KKworCU1PViAgICAgICAgICAgIHIxNCwgcjEgICAgICAgICAgICAgICAgICAgICAgIEBjb3B5IHhuW10gYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgTU9WICAgICAgICAgICAgcjcsICMxCisJVkxEMS5TMTYgICAgICAge1EwLCBRMX0sIFtyMTRdIQorCVZMRDEuUzE2ICAgICAgIHtRMiwgUTN9LCBbcjE0XSEKKwlWTEQxLlMxNiAgICAgICB7UTQsIFE1fSwgW3IxNF0hCisJVkxEMS5TMTYgICAgICAge1E2LCBRN30sIFtyMTRdIQorCisgICAgICAgIFZNVUxMLlMxNiAgICAgIFExMCwgRDAsIEQwCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDEsIEQxCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDIsIEQyCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDMsIEQzCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDQsIEQ0CisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDUsIEQ1CisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDYsIEQ2CisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDcsIEQ3CisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDgsIEQ4CisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDksIEQ5CisJVk1MQUwuUzE2ICAgICAgUTEwLCBEMTAsIEQxMAorCVZNTEFMLlMxNiAgICAgIFExMCwgRDExLCBEMTEKKwlWTUxBTC5TMTYgICAgICBRMTAsIEQxMiwgRDEyCisJVk1MQUwuUzE2ICAgICAgUTEwLCBEMTMsIEQxMworCVZNTEFMLlMxNiAgICAgIFExMCwgRDE0LCBEMTQKKwlWTUxBTC5TMTYgICAgICBRMTAsIEQxNSwgRDE1CisKKyAgICAgICAgVlFBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMQorICAgICAgICBWTU9WLlMzMiAgICAgICByOSwgIEQyMFswXQorICAgICAgICBWTU9WLlMzMiAgICAgICByMTAsIEQyMFsxXQorICAgICAgICBRQUREICAgICAgICAgICByNiwgcjksIHIxMCAKKwlRQUREICAgICAgICAgICByNiwgcjYsIHI2CisgICAgICAgIFFBREQgICAgICAgICAgIHI5LCByNiwgcjcgICAgICAgICAgICAgICAgICAgQExfdG1wID0gKExfdG1wIDw8IDEpICsgMTsKKwlDTFogICAgICAgICAgICByNywgcjkKKwlTVUIgICAgICAgICAgICByNiwgcjcsICMxICAgICAgICAgICAgICAgICAgIEBleHAgPSBub3JtX2woTF90bXApCisgICAgICAgIFJTQiAgICAgICAgICAgIHI3LCByNiwgIzMyICAgICAgICAgICAgICAgICAgQGV4cCA9IDMyIC0gZXhwCisJTU9WICAgICAgICAgICAgcjYsIHI3LCBBU1IgIzEgICAgICAgICAKKwlSU0IgICAgICAgICAgICByNywgcjYsICMwICAgICAgICAgICAgICAgICAgIEBzY2FsZSA9IC0oZXhwID4+IDEpCisJCisgICAgICAgIEBsb29wIGZvciBldmVyeSBwb3NzaWJsZSBwZXJpb2QKKwlAZm9yKHQgPSB0X21pbkAgdCA8PSB0X21heEAgdCsrKQorCUByNyAtLS0gc2NhbGUgcjQgLS0tIHRfbWluIHI4IC0tLSBleGNmW10KKworTE9PUEZPUjoJCisJQUREICAgICAgICAgICAgcjE0LCByMTMsICMyMCAgICAgICAgICAgICAgICBAY29weSBvZiBleGNmW10KKwlNT1YgICAgICAgICAgICByMTIsIHIxICAgICAgICAgICAgICAgICAgICAgIEBjb3B5IG9mIHhuW10KKwlNT1YgICAgICAgICAgICByOCwgIzB4ODAwMAorCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRMCwgUTF9LCBbcjE0XSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiBleGNmW10KKyAgICAgICAgVkxEMS5TMTYgICAgICAge1EyLCBRM30sIFtyMTRdISAgICAgICAgICAgICAgICAgQCBsb2FkIDE2IGV4Y2ZbXSAgICAgICAKKyAgICAgICAgVkxEMS5TMTYgICAgICAge1E0LCBRNX0sIFtyMTJdISAgICAgICAgICAgICAgICAgQCBsb2FkIDE2IHhbXQorCVZMRDEuUzE2ICAgICAgIHtRNiwgUTd9LCBbcjEyXSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiB4W10KKyAgICAgICAgVk1VTEwuUzE2ICAgIFExMCwgRDAsIEQwICAgICAgICAgICAgICAgICAgICAgIEBMX3RtcDEgKz0gZXhjZltdICogZXhjZltdCisgICAgICAgIFZNVUxMLlMxNiAgICBRMTEsIEQwLCBEOCAgICAgICAgICAgICAgICAgICAgICBATF90bXAgICs9IHhbXSAqIGV4Y2ZbXSAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMCwgRDEsIEQxCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTEsIEQxLCBEOQorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMiwgRDIKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDIsIEQxMCAgICAgICAgCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQzLCBEMworICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMywgRDExCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ0LCBENAorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENCwgRDEyCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ1LCBENQorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENSwgRDEzCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ2LCBENgorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENiwgRDE0CisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ3LCBENworICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENywgRDE1CisKKwlWTEQxLlMxNiAgICAgICB7UTAsIFExfSwgW3IxNF0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgZXhjZltdCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtRMiwgUTN9LCBbcjE0XSEgICAgICAgICAgICAgICAgIEAgbG9hZCAxNiBleGNmW10KKyAgICAgICAgVkxEMS5TMTYgICAgICAge1E0LCBRNX0sIFtyMTJdISAgICAgICAgICAgICAgICAgQCBsb2FkIDE2IHhbXQorICAgICAgICBWTEQxLlMxNiAgICAgICB7UTYsIFE3fSwgW3IxMl0hICAgICAgICAgICAgICAgICBAIGxvYWQgMTYgeFtdCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQwLCBEMAorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMCwgRDgKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMCwgRDEsIEQxCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTEsIEQxLCBEOQorICAgICAgICBWTUxBTC5TMTYgICAgUTEwLCBEMiwgRDIKKyAgICAgICAgVk1MQUwuUzE2ICAgIFExMSwgRDIsIEQxMCAgICAgICAgCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQzLCBEMworICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBEMywgRDExCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ0LCBENAorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENCwgRDEyCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ1LCBENQorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENSwgRDEzCisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ2LCBENgorICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENiwgRDE0CisgICAgICAgIFZNTEFMLlMxNiAgICBRMTAsIEQ3LCBENworICAgICAgICBWTUxBTC5TMTYgICAgUTExLCBENywgRDE1CisKKyAgICAgICAgVlFBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMQorICAgICAgICBWUUFERC5TMzIgICAgICBEMjIsIEQyMiwgRDIzCisKKwlWUEFERC5TMzIgICAgICBEMjAsIEQyMCwgRDIwICAgICAgICAgICAgICAgICAgIEBEMjBbMF0gLS0tIExfdG1wMSA8PCAxCisJVlBBREQuUzMyICAgICAgRDIyLCBEMjIsIEQyMiAgICAgICAgICAgICAgICAgICBARDIyWzBdIC0tLSBMX3RtcCA8PCAxCisKKwlWTU9WLlMzMiAgICAgICByNiwgRDIwWzBdCisgICAgICAgIFZNT1YuUzMyICAgICAgIHI1LCBEMjJbMF0JCisKKwlAcjUgLS0tIExfdG1wLCByNiAtLS0gTF90bXAxCisJTU9WICAgICAgICAgICAgcjEwLCAjMQorCUFERCAgICAgICAgICAgIHI1LCByMTAsIHI1LCBMU0wgIzEgICAgICAgICAgICAgICAgICAgICBATF90bXAgPSAoTF90bXAgPDwgMSkgKyAxCisJQUREICAgICAgICAgICAgcjYsIHIxMCwgcjYsIExTTCAjMSAgICAgICAgICAgICAgICAgICAgIEBMX3RtcDEgPSAoTF90bXAxIDw8IDEpICsgMQorIAorCUNMWiAgICAgICAgICAgIHIxMCwgcjUgICAgICAgIAorCUNNUCAgICAgICAgICAgIHI1LCAjMAorCVJTQkxUICAgICAgICAgIHIxMSwgcjUsICMwCisJQ0xaTFQgICAgICAgICAgcjEwLCByMTEKKwlTVUIgICAgICAgICAgICByMTAsIHIxMCwgIzEgICAgICAgICAgICAgICAgIEBleHAgPSBub3JtX2woTF90bXApCisgICAgIAorCU1PViAgICAgICAgICAgIHI1LCByNSwgTFNMIHIxMCAgICAgICAgICAgICAgQExfdG1wID0gKExfdG1wIDw8IGV4cCkKKwlSU0IgICAgICAgICAgICByMTAsIHIxMCwgIzMwICAgICAgICAgICAgICAgIEBleHBfY29yciA9IDMwIC0gZXhwCisJTU9WICAgICAgICAgICAgcjExLCByNSwgQVNSICMxNiAgICAgICAgICAgICBAY29yciA9IGV4dHJhY3RfaChMX3RtcCkKKworCUNMWiAgICAgICAgICAgIHI1LCByNgorCVNVQiAgICAgICAgICAgIHI1LCByNSwgIzEKKwlNT1YgICAgICAgICAgICByNiwgcjYsIExTTCByNSAgICAgICAgICAgICAgIEBMX3RtcCA9IChMX3RtcDEgPDwgZXhwKQorCVJTQiAgICAgICAgICAgIHI1LCByNSwgIzMwICAgICAgICAgICAgICAgICAgQGV4cF9ub3JtID0gMzAgLSBleHAKKworCUByMTAgLS0tIGV4cF9jb3JyLCByMTEgLS0tIGNvcnIKKwlAcjYgIC0tLSBMX3RtcCwgcjUgLS0tIGV4cF9ub3JtCisKKwlASXNxcnRfbigmTF90bXAsICZleHBfbm9ybSkKKworCU1PViAgICAgICAgICAgIHIxNCwgcjAKKwlNT1YgICAgICAgICAgICByMTIsIHIxIAorCisgICAgICAgIFNUTUZEICAgICAgICAgIHNwISwge3IwIC0gcjQsIHI3IC0gcjEyLCByMTR9CisJQUREICAgICAgICAgICAgcjEsIHNwLCAjNAorCUFERCAgICAgICAgICAgIHIwLCBzcCwgIzAKKwlTVFIgICAgICAgICAgICByNiwgW3NwXQorCVNUUkggICAgICAgICAgIHI1LCBbc3AsICM0XQorCUJMICAgICAgICAgICAgIElzcXJ0X24KKwlMRFIgICAgICAgICAgICByNiwgW3NwXQorCUxEUlNIICAgICAgICAgIHI1LCBbc3AsICM0XQorICAgICAgICBMRE1GRCAgICAgICAgICBzcCEsIHtyMCAtIHI0LCByNyAtIHIxMiwgcjE0fQorCU1PViAgICAgICAgICAgIHIwLCByMTQKKwlNT1YgICAgICAgICAgICByMSwgcjEyCisKKworCU1PViAgICAgICAgICAgIHI2LCByNiwgQVNSICMxNiAgICAgICAgICAgICAgQG5vcm0gPSBleHRyYWN0X2goTF90bXApCisJTVVMICAgICAgICAgICAgcjEyLCByNiwgcjExCisJQUREICAgICAgICAgICAgcjEyLCByMTIsIHIxMiAgICAgICAgICAgICAgICBATF90bXAgPSB2b19MX211bHQoY29yciwgbm9ybSkKKyAgCisJQUREICAgICAgICAgICAgcjYsIHIxMCwgcjUKKwlBREQgICAgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgIEBleHBfY29yciArIGV4cF9ub3JtICsgc2NhbGUKKworICAgICAgICBDTVAgICAgICAgICAgICByNiwgIzAKKyAgICAgICAgUlNCTFQgICAgICAgICAgcjYsIHI2LCAjMAorCU1PVkxUICAgICAgICAgIHIxMiwgcjEyLCBBU1IgcjYKKyAgICAgICAgTU9WR1QgICAgICAgICAgcjEyLCByMTIsIExTTCByNiAgICAgICAgICAgICBATF90bXAgPSBMX3NobChMX3RtcCwgZXhwX2NvcnIgKyBleHBfbm9ybSArIHNjYWxlKQorCisgICAgICAgIEFERCAgICAgICAgICAgIHIxMiwgcjEyLCByOAorICAgICAgICBNT1YgICAgICAgICAgICByMTIsIHIxMiwgQVNSICMxNiAgICAgICAgICAgIEB2b19yb3VuZChMX3RtcCkKKworICAgICAgICBMRFIgICAgICAgICAgICByNSwgW3IxMywgI0NPUlJfTk9STV0gICAgICAgIEAgZ2V0IGNvcnJfbm9ybSBhZGRyZXNzCisJTERSICAgICAgICAgICAgcjYsIFtyMTMsICNUX01BWF0gICAgICAgICAgICBAIGdldCB0X21heAorCUFERCAgICAgICAgICAgIHIxMCwgcjUsIHI0LCBMU0wgIzEgICAgICAgICAgQCBnZXQgY29ycl9ub3JtW3RdIGFkZHJlc3MKKwlTVFJIICAgICAgICAgICByMTIsIFtyMTBdICAgICAgICAgICAgICAgICAgIEAgY29ycl9ub3JtW3RdID0gdm9fcm91bmQoTF90bXApCisKKwlDTVAgICAgICAgICAgICByNCwgcjYKKwlCRVEgICAgICAgICAgICBOb3JtX2NvcnJfYXNtX2VuZAorIAorCUFERCAgICAgICAgICAgIHI0LCByNCwgIzEgICAgICAgICAgICAgICAgICAgQCB0X21pbiArKyAKKwlSU0IgICAgICAgICAgICByNSwgcjQsICMwICAgICAgICAgICAgICAgICAgIEAgaworCisJTU9WICAgICAgICAgICAgcjYsICM2MyAgICAgICAgICAgICAgICAgICAgICBAIGkgPSA2MworCU1PViAgICAgICAgICAgIHI4LCByMCAgICAgICAgICAgICAgICAgICAgICAgQCBleGNbXQorCU1PViAgICAgICAgICAgIHI5LCByMiAgICAgICAgICAgICAgICAgICAgICAgQCBoW10KKwlBREQgICAgICAgICAgICByMTAsIHIxMywgIzIwICAgICAgICAgICAgICAgIEAgZXhjZltdCisKKwlBREQgICAgICAgICAgICByOCwgcjgsIHI1LCBMU0wgIzEgICAgICAgICAgIEAgZXhjW2tdIGFkZHJlc3MKKwlBREQgICAgICAgICAgICByOSwgcjksIHI2LCBMU0wgIzEgICAgICAgICAgIEAgaFtpXSBhZGRyZXNzCisJQUREICAgICAgICAgICAgcjEwLCByMTAsIHI2LCBMU0wgIzEgICAgICAgICBAIGV4Y2ZbaV0gYWRkcmVzcworCUxEUlNIICAgICAgICAgIHIxMSwgW3I4XSAgICAgICAgICAgICAgICAgICAgQCB0bXAgPSBleGNba10KKworTE9PUEs6CisgICAgICAgIExEUlNIICAgICAgICAgIHI4LCBbcjldLCAjLTIgICAgICAgICAgICAgICAgQCBsb2FkIGhbaV0KKwlMRFJTSCAgICAgICAgICByMTIsIFtyMTAsICMtMl0gICAgICAgICAgICAgIEAgbG9hZCBleGNmW2kgLSAxXQorCU1VTCAgICAgICAgICAgIHIxNCwgcjExLCByOAorCU1PViAgICAgICAgICAgIHI4LCByMTQsIEFTUiAjMTUKKwlBREQgICAgICAgICAgICByMTQsIHI4LCByMTIKKwlTVFJIICAgICAgICAgICByMTQsIFtyMTBdLCAjLTIKKwlTVUJTICAgICAgICAgICByNiwgcjYsICMxCisJQkdUICAgICAgICAgICAgTE9PUEsKKworCUxEUlNIICAgICAgICAgIHI4LCBbcjldICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIGhbMF0KKwlNVUwgICAgICAgICAgICByMTQsIHIxMSwgcjgKKyAgICAgICAgTERSICAgICAgICAgICAgcjYsIFtyMTMsICNUX01BWF0gICAgICAgICAgICBAIGdldCB0X21heAorCU1PViAgICAgICAgICAgIHI4LCByMTQsIEFTUiAjMTUKKwlTVFJIICAgICAgICAgICByOCwgW3IxMF0gICAgICAgICAgICAgICAgICAgIAorCisJQ01QICAgICAgICAgICAgcjQsIHI2CisJQkxFICAgICAgICAgICAgTE9PUEZPUgorCitOb3JtX2NvcnJfYXNtX2VuZDogCisgICAgICAgIAorICAgICAgICBBREQgICAgICAgICAgICByMTMsIHIxMywgI3ZvU1RBQ0sgICAgICAKKyAgICAgICAgTERNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9CisgICAgCisgICAgICAgIC5FTkQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxNzY0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucwpAQCAtMCwwICsxLDEzMyBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorQHZvaWQgU3luX2ZpbHRfMzIoDQorQCAgICAgV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovDQorQCAgICAgV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUW5ldzogZXhjaXRhdGlvbiAoZXhjW2ldID4+IFFuZXcpICAgICovDQorQCAgICAgV29yZDE2IFFuZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpICovDQorQCAgICAgV29yZDE2IHNpZ19oaVtdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGhpZ2ggICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IHNpZ19sb1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGxvdyAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IGxnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICovDQorQCkNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCitAIGFbXSAgICAgIC0tLSByMA0KK0AgbSAgICAgICAgLS0tIHIxDQorQCBleGNbXSAgICAtLS0gcjINCitAIFFuZXcgICAgIC0tLSByMw0KK0Agc2lnX2hpW10gLS0tIHI0DQorQCBzaWdfbG9bXSAtLS0gcjUNCitAIGxnICAgICAgIC0tLSByNg0KKw0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQgDQorICAgICAgICAgIC5nbG9iYWwgICBTeW5fZmlsdF8zMl9hc20NCisNCitTeW5fZmlsdF8zMl9hc206DQorDQorICAgICAgICAgIFNUTUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE0fSANCisgICAgICAgICAgTERSICAgICAgICAgICByNCwgIFtyMTMsICM0MF0gICAgICAgICAgICAgICAgICBAIGdldCBzaWdfaGlbXSBhZGRyZXNzDQorICAgICAgICAgIExEUiAgICAgICAgICAgcjUsICBbcjEzLCAjNDRdICAgICAgICAgICAgICAgICAgQCBnZXQgc2lnX2xvW10gYWRkcmVzcw0KKw0KKyAgICAgICAgICBMRFJTSCAgICAgICAgIHI2LCAgW3IwXSwgIzIgICAgICAgICAgICAgICAgICAgIEAgbG9hZCBBcVswXQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHI3LCAgcjMsICM0ICAgICAgICAgICAgICAgICAgICAgIEAgNCArIFFfbmV3DQorICAgICAgICAgIE1PViAgICAgICAgICAgcjMsIHI2LCBBU1IgcjcgICAgICAgICAgICAgICAgICAgQCBhMCA9IEFxWzBdID4+ICg0ICsgUV9uZXcpDQorDQorCSAgU1VCICAgICAgICAgICByMTAsIHI0LCAjMzIgICAgICAgICAgICAgICAgICAgICBAIHNpZ19oaVstMTZdIGFkZHJlc3MNCisJICBTVUIgICAgICAgICAgIHIxMSwgcjUsICMzMiAgICAgICAgICAgICAgICAgICAgIEAgc2lnX2xvWy0xNl0gYWRkcmVzcw0KKw0KKwkgIFZMRDEuUzE2ICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IwXSEgICAgICAgICAgQGFbMV0gfiBhWzE2XSANCisgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IDANCisNCisJICBWTEQxLlMxNiAgICAgIHtENCwgRDUsIEQ2LCBEN30sIFtyMTBdISAgICAgICAgIEAgc2lnX2hpWy0xNl0gfiBzaWdfaGlbLTFdDQorICAgICAgICAgIFZSRVY2NC4xNiAgICAgRDAsIEQwDQorICAgICAgICAgIFZSRVY2NC4xNiAgICAgRDEsIEQxDQorCSAgVkxEMS5TMTYgICAgICB7RDgsIEQ5LCBEMTAsIEQxMX0sIFtyMTFdISAgICAgICBAIHNpZ19sb1stMTZdIH4gc2lnX2xvWy0xXQ0KKyAgICAgICAgICBWUkVWNjQuMTYgICAgIEQyLCBEMg0KKyAgICAgICAgICBWUkVWNjQuMTYgICAgIEQzLCBEMwkNCisgICAgICAgICAgVkRVUC5TMzIgICAgICBRMTUsIHI4DQorICAgICAgICAgICAgICANCitTWU5fTE9PUDoNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICBAZXhjW2ldDQorCSAgQExfdG1wID0gTF9tc3UoTF90bXAsIHNpZ19sb1tpIC0gal0sIGFbal0pQA0KKwkgIFZNVUxMLlMxNiAgICAgUTEwLCBEOCwgRDMNCisJICBWRVhULjggICAgICAgIEQ4LCBEOCwgRDksICMyDQorCSAgVk1MQUwuUzE2ICAgICBRMTAsIEQ5LCBEMg0KKwkgIFZNTEFMLlMxNiAgICAgUTEwLCBEMTAsIEQxDQorCSAgVk1MQUwuUzE2ICAgICBRMTAsIEQxMSwgRDANCisNCisJICBWRVhULjggICAgICAgIEQ5LCBEOSwgRDEwLCAjMg0KKwkgIFZFWFQuOCAgICAgICAgRDEwLCBEMTAsIEQxMSwgIzINCisJICANCisJICBWUEFERC5TMzIgICAgIEQyOCwgRDIwLCBEMjENCisgICAgICAgICAgTVVMICAgICAgICAgICByMTIsIHI2LCByMyAgICAgICAgICAgICAgICAgICAgICBAZXhjW2ldICogYTANCisJICBWUEFERC5TMzIgICAgIEQyOSwgRDI4LCBEMjgNCisJICBWRFVQLlMzMiAgICAgIFExMCwgRDI5WzBdICAgICAgICAgICAgICAgICAgICAgIEByZXN1bHQxDQorICAgICAgICAgIA0KKwkgIFZNVUxMLlMxNiAgICAgUTExLCBENCwgRDMNCisJICBWTUxBTC5TMTYgICAgIFExMSwgRDUsIEQyDQorICAgICAgICAgIFZTVUIuUzMyICAgICAgUTEwLCBRMTUsIFExMA0KKwkgIEBMX3RtcCA9IExfbXN1KExfdG1wLCBzaWdfaGlbaSAtIGpdLCBhW2pdKUANCisNCisJICBWTUxBTC5TMTYgICAgIFExMSwgRDYsIEQxDQorCSAgVkVYVC44ICAgICAgICBENCwgRDQsIEQ1LCAjMg0KKwkgIFZNTEFMLlMxNiAgICAgUTExLCBENywgRDANCisNCisNCisJICBWRVhULjggICAgICAgIEQ1LCBENSwgRDYsICMyDQorCSAgVkVYVC44ICAgICAgICBENiwgRDYsIEQ3LCAjMg0KKw0KKwkgIFZQQURELlMzMiAgICAgRDI4LCBEMjIsIEQyMw0KKyAgICAgICAgICBWUEFERC5TMzIgICAgIEQyOSwgRDI4LCBEMjgNCisgICAgICAgICAgTU9WICAgICAgICAgICByMTQsIHIxMiwgTFNMICMxICAgICAgICAgICAgICAgICBAZXhjW2ldICogYTAgPDwgMQ0KKyAgICAgICAgICBWRFVQLlMzMiAgICAgIFExMSwgRDI5WzBdICAgICAgICAgICAgICAgICAgICAgIEByZXN1bHQyDQorDQorDQorDQorCSAgVlNIUi5TMzIgICAgICBRMTAsIFExMCwgIzExICAgICAgICAgICAgICAgICAgICBAcmVzdWx0MSA+Pj0gMTENCisJICBWU0hMLlMzMiAgICAgIFExMSwgUTExLCAjMSAgICAgICAgICAgICAgICAgICAgIEByZXN1bHQyIDw8PSAxDQorCSAgVkRVUC5TMzIgICAgICBRMTIsIHIxNCAgICAgICAgICAgICAgICAgICAgICAgICANCisJICBWQURELlMzMiAgICAgIFExMiwgUTEyLCBRMTAgICAgICAgICAgICAgICAgICAgIEBMX3RtcCA9IExfdG1wIC0gKHJlc3VsdDEgPj49IDExKSAtIChyZXN1bHQyIDw8PSAxKQ0KKwkgIFZTVUIuUzMyICAgICAgUTEyLCBRMTIsIFExMQ0KKw0KKwkgIFZTSEwuUzMyICAgICAgUTEyLCBRMTIsICMzICAgICAgICAgICAgICAgICAgICAgQExfdG1wIDw8PSAzDQorDQorDQorCSAgVlNIUk4uUzMyICAgICBEMjAsIFExMiwgIzE2ICAgICAgICAgICAgICAgICAgICBAc2lnX2hpW2ldID0gTF90bXAgPj4gMTZADQorCSAgVk1PVi5TMTYgICAgICByMTAsIEQyMFswXQ0KKwkgIFZTSFIuUzMyICAgICAgUTEyLCBRMTIsICM0ICAgICAgICAgICAgICAgICAgICAgQExfdG1wID4+PSA0DQorCSAgVkVYVC44ICAgICAgICBENywgRDcsIEQyMCwgIzINCisJICBTVFJIICAgICAgICAgIHIxMCwgW3I0XSwgIzIgICAgICAgICAgICAgICAgICAgIEBzdG9yZSBzaWdfaGlbaV0NCisgICAgICAgICAgVk1PVi5TMzIgICAgICByMTEsIEQyNFswXSAgICAgICAgICAgICAgICAgICAgICBAcjExIC0tLSBMX3RtcCA+Pj0gNA0KKwkgIEFERCAgICAgICAgICAgcjgsIHI4LCAjMQ0KKwkgIFNVQiAgICAgICAgICAgcjEyLCByMTEsIHIxMCwgTFNMICMxMg0KKwkgIEBNT1YgICAgICAgICAgIHIxMSwgcjEyLCBBU1IgIzE2ICAgICAgICAgICAgICAgIEBzaWdfbG9baV0NCisJICBWRFVQLlMxNiAgICAgIEQyMSwgcjEyDQorCSAgVkVYVC44ICAgICAgICBEMTEsIEQxMSwgRDIxLCAjMg0KKwkgIFNUUkggICAgICAgICAgcjEyLCBbcjVdLCAjMiAgICAgICAgICAgICAgICAgICAgQHN0cm9lIHNpZ19sb1tpXQ0KKw0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHI4LCAjNjQNCisgICAgICAgICAgQkxUICAgICAgICAgICBTWU5fTE9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgDQorU3luX2ZpbHRfMzJfZW5kOg0KKwkJICAgICANCisgICAgICAgICAgTERNRkQgICAJICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKyANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb252b2x2ZV9uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5ZTMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwpAQCAtMCwwICsxLDE3OCBAQAorQC8qCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCitAICoqCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQCAqKgorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitAICoqCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitAICovCitACitAKnZvaWQgQ29udm9sdmUgKAorQCogICAgV29yZDE2IHhbXSwgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQCogICAgV29yZDE2IGhbXSwgICAgICAgIC8qIChpKSAgICAgOiBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAqLworQCogICAgV29yZDE2IHlbXSwgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQCogICAgV29yZDE2IEwgICAgICAgICAgIC8qIChpKSAgICAgOiB2ZWN0b3Igc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQCopCitAIAorQCByMCAtLS0geFtdCitAIHIxIC0tLSBoW10KK0AgcjIgLS0tIHlbXQorQCByMyAtLS0gTAorCisJLnNlY3Rpb24gIC50ZXh0IAorICAgICAgICAuZ2xvYmFsICAgQ29udm9sdmVfYXNtIAorCitDb252b2x2ZV9hc206CisKKyAgICAgICAgU1RNRkQgICAgICAgICAgcjEzISwge3I0IC0gcjEyLCByMTR9ICAKKyAgICAgICAgTU9WICAgICAgICAgICAgcjMsICAjMCAgICAgICAgICAgICAgICAgICAgICAgIAorCU1PViAgICAgICAgICAgIHIxMSwgIzB4ODAwMAorICAgICAgICAKK0xPT1A6IAorICAgICAgICBATU9WICAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcyA9IDAKKyAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByMywgTFNMICMxICAgICAgICAgICAgICAgIEAgdG1wSCBhZGRyZXNzCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSBuICsgMQorICAgICAgICBNT1YgICAgICAgICAgICByNiwgcjAKKyAgICAgICAgTERSU0ggICAgICAgICAgcjksICBbcjZdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgKnRtcFgrKworICAgICAgICBMRFJTSCAgICAgICAgICByMTAsIFtyNF0gICAgICAgICAgICAgICAgICAgICAgICAgQCAqdG1wSC0tCisgICAgICAgIFNVQiAgICAgICAgICAgIHI1LCByNSwgIzEKKyAgICAgICAgVk1PVi5TMzIgICAgICAgUTEwLCAjMCAKKyAgICAgICAgTVVMICAgICAgICAgICAgcjgsICByOSwgcjEwIAorCitMT09QMTogICAgICAgICAgICAgICAgICAgIAorICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKKyAgICAgICAgQkxFICAgICAgICAgICAgTDEKKyAgICAgICAgU1VCICAgICAgICAgICAgcjQsIHI0LCAjOAorICAgICAgICBNT1YgICAgICAgICAgICByOSwgcjQKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hICAgCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQxLCBbcjldIQorICAgICAgICBWUkVWNjQuMTYgICAgICBEMSwgRDEKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNCAgCisgICAgICAgIFZNTEFMLlMxNiAgICAgIFExMCwgRDAsIEQxICAgICAgICAgCisgICAgICAgIEIgICAgICAgICAgICAgIExPT1AxICAgIAorTDE6ICAgICAgICAgICAgICAgICAgCisgICAgICAgIFZBREQuUzMyICAgICAgIEQyMCwgRDIwLCBEMjEKKyAgICAgICAgVlBBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMAorICAgICAgICBWTU9WLlMzMiAgICAgICByNSwgRDIwWzBdCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByNSwgcjgKKyAgICAgICAgQUREICAgICAgICAgICAgcjUsIHIxMSwgcjUsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByNSwgcjUsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQorICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCisgICAgICAgIFNUUkggICAgICAgICAgIHI1LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgICBAeVtuXQorCisKKyAgICAgICAgQE1PViAgICAgICAgICAgIHI4LCAjMAorICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHIzLCBMU0wgIzEgICAgICAgICAgICAgICAgQHRtcEggYWRkcmVzcworICAgICAgICBBREQgICAgICAgICAgICByNSwgcjMsICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI2LCByMAorICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyICAgICAgICAgICAgICAgICAgICAgQCAqdG1wWCsrCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XSwgIy0yICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMiwgW3I2XSwgIzIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjE0LCBbcjRdCisKKyAgICAgICAgTVVMICAgICAgICAgICAgcjgsIHI5LCByMTAKKyAgICAgICAgU1VCICAgICAgICAgICAgcjUsIHI1LCAjMgorICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4CisgICAgICAgIAorICAgICAgICBWTU9WLlMzMiAgICAgICBRMTAsICMwCitMT09QMjoKKyAgICAgICAgQ01QICAgICAgICAgICAgcjUsICMwCisgICAgICAgIEJMRSAgICAgICAgICAgIEwyCisgICAgICAgIFNVQiAgICAgICAgICAgIHI0LCByNCwgIzgKKyAgICAgICAgTU9WICAgICAgICAgICAgcjksIHI0CisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQwLCBbcjZdISAgIAorICAgICAgICBWTEQxLlMxNiAgICAgICBEMSwgW3I5XSEKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNAorICAgICAgICBWUkVWNjQuMTYgICAgICBEMSwgRDEKKyAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEgCisgICAgICAgIEIgICAgICAgICAgICAgIExPT1AyCitMMjoKKyAgICAgICAgVkFERC5TMzIgICAgICAgRDIwLCBEMjAsIEQyMQorICAgICAgICBWUEFERC5TMzIgICAgICBEMjAsIEQyMCwgRDIwCisgICAgICAgIFZNT1YuUzMyICAgICAgIHI1LCBEMjBbMF0KKyAgICAgICAgQUREICAgICAgICAgICAgcjgsIHI4LCByNQorICAgICAgICBBREQgICAgICAgICAgICByOCwgcjExLCByOCwgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI4LCByOCwgTFNSICMxNiAgICAgICAgICAgICAgICAgICBAZXh0cmFjdF9oKHMpCisgICAgICAgIEFERCAgICAgICAgICAgIHIzLCByMywgIzEgIAorICAgICAgICBTVFJIICAgICAgICAgICByOCwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KKworCisgICAgICAgIEBNT1YgICAgICAgICAgICByOCwgIzAKKyAgICAgICAgQUREICAgICAgICAgICAgcjQsIHIxLCByMywgTFNMICMxCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwCisgICAgICAgIExEUlNIICAgICAgICAgIHI5LCAgW3I2XSwgIzIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEwLCBbcjRdLCAjLTIKKyAgICAgICAgTERSU0ggICAgICAgICAgcjEyLCBbcjZdLCAjMgorICAgICAgICBMRFJTSCAgICAgICAgICByMTQsIFtyNF0sICMtMgorICAgICAgICBNVUwgICAgICAgICAgICByOCwgcjksIHIxMAorICAgICAgICBMRFJTSCAgICAgICAgICByOSwgIFtyNl0sICMyCisgICAgICAgIExEUlNIICAgICAgICAgIHIxMCwgW3I0XQorICAgICAgICBNTEEgICAgICAgICAgICByOCwgcjEyLCByMTQsIHI4IAorICAgICAgICBTVUIgICAgICAgICAgICByNSwgcjUsICMzCisgICAgICAgIE1MQSAgICAgICAgICAgIHI4LCByOSwgcjEwLCByOAorCisgICAgICAgIFZNT1YuUzMyICAgICAgIFExMCwgIzAKK0xPT1AzOgorICAgICAgICBDTVAgICAgICAgICAgICByNSwgIzAKKyAgICAgICAgQkxFICAgICAgICAgICAgTDMKKyAgICAgICAgU1VCICAgICAgICAgICAgcjQsIHI0LCAjOAorICAgICAgICBNT1YgICAgICAgICAgICByOSwgcjQKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDAsIFtyNl0hICAgCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQxLCBbcjldIQorICAgICAgICBWUkVWNjQuMTYgICAgICBEMSwgRDEKKyAgICAgICAgU1VCUyAgICAgICAgICAgcjUsIHI1LCAjNAorICAgICAgICBWTUxBTC5TMTYgICAgICBRMTAsIEQwLCBEMSAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDMgICAKKworTDM6CisgICAgICAgIFZBREQuUzMyICAgICAgIEQyMCwgRDIwLCBEMjEKKyAgICAgICAgVlBBREQuUzMyICAgICAgRDIwLCBEMjAsIEQyMAorICAgICAgICBWTU9WLlMzMiAgICAgICByNSwgRDIwWzBdCisgICAgICAgIEFERCAgICAgICAgICAgIHI4LCByOCwgcjUKKyAgICAgICAgQUREICAgICAgICAgICAgcjgsIHIxMSwgcjgsIExTTCAjMQorICAgICAgICBNT1YgICAgICAgICAgICByOCwgcjgsIExTUiAjMTYgICAgICAgICAgICAgICAgICAgQGV4dHJhY3RfaChzKQorICAgICAgICBBREQgICAgICAgICAgICByMywgcjMsICMxCisgICAgICAgIFNUUkggICAgICAgICAgIHI4LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgICBAeVtuXQorCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMywgIzEgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSBuICsgMQorICAgICAgICBBREQgICAgICAgICAgICByNCwgcjEsIHI1LCBMU0wgIzEgICAgICAgICAgICAgICAgQCB0bXBIIGFkZHJlc3MKKyAgICAgICAgTU9WICAgICAgICAgICAgcjYsIHIwCisgICAgICAgIFZNT1YuUzMyICAgICAgIFExMCwgIzAKK0xPT1A0OiAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgIHI1LCAjMAorICAgICAgICBCTEUgICAgICAgICAgICBMNAorICAgICAgICBTVUIgICAgICAgICAgICByNCwgcjQsICM4CisgICAgICAgIE1PViAgICAgICAgICAgIHI5LCByNAorICAgICAgICBWTEQxLlMxNiAgICAgICBEMCwgW3I2XSEgICAKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDEsIFtyOV0hCisgICAgICAgIFZSRVY2NC4xNiAgICAgIEQxLCBEMQorICAgICAgICBTVUJTICAgICAgICAgICByNSwgcjUsICM0ICAKKyAgICAgICAgVk1MQUwuUzE2ICAgICAgUTEwLCBEMCwgRDEgICAgICAgICAKKyAgICAgICAgQiAgICAgICAgICAgICAgTE9PUDQgICAgCitMNDogICAgICAgICAgICAgICAgICAKKyAgICAgICAgVkFERC5TMzIgICAgICAgRDIwLCBEMjAsIEQyMQorICAgICAgICBWUEFERC5TMzIgICAgICBEMjAsIEQyMCwgRDIwCisgICAgICAgIFZNT1YuUzMyICAgICAgIHI1LCAgRDIwWzBdCisgICAgICAgIEFERCAgICAgICAgICAgIHI1LCByMTEsIHI1LCBMU0wgIzEKKyAgICAgICAgTU9WICAgICAgICAgICAgcjUsIHI1LCBMU1IgIzE2ICAgICAgICAgICAgICAgICAgIEBleHRyYWN0X2gocykKKyAgICAgICAgQUREICAgICAgICAgICAgcjMsIHIzLCAjMQorICAgICAgICBTVFJIICAgICAgICAgICByNSwgW3IyXSwgIzIgICAgICAgICAgICAgICAgICAgICAgQHlbbl0KKyAgICAgICAgCisgICAgICAgIENNUCAgICAgICAgICAgIHIzLCAjNjQKKyAgICAgICAgQkxUICAgICAgICAgICAgTE9PUAorICAgICAgICAgICAgICAgIAorQ29udm9sdmVfYXNtX2VuZDogCisgCisgICAgICAgIExETUZEICAgICAgcjEzISwge3I0IC0gcjEyLCByMTV9CisgICAgCisgICAgICAgIEBFTkRGVU5DCisgICAgICAgIC5FTkQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29yX2hfdmVjX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzMzlkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMKQEAgLTAsMCArMSwxNTEgQEAKK0AvKg0KK0AgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCitAICoqDQorQCAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCitAICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KK0AgKioNCitAICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCitAICoqDQorQCAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorQCAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorQCAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorQCAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCitAICovDQorQA0KK0BzdGF0aWMgdm9pZCBjb3JfaF92ZWNfMDEyKA0KK0AJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAqLw0KK0AJCVdvcmQxNiB2ZWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCB2ZWN0b3IgKC84KSB0byBjb3JyZWxhdGUgd2l0aCBoW10gKi8NCitACQlXb3JkMTYgdHJhY2ssICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayB0byB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCitACQlXb3JkMTYgc2lnbltdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzaWduIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCitACQlXb3JkMTYgcnJpeGl4W11bTkJfUE9TXSwgICAgICAgICAgICAgIC8qIChpKSBjb3JyZWxhdGlvbiBvZiBoW3hdIHdpdGggaFt4XSAgICAgICovDQorQAkJV29yZDE2IGNvcl8xW10sICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorQAkJV29yZDE2IGNvcl8yW10gICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorQCkNCitAcjAgLS0tLSBoW10NCitAcjEgLS0tLSB2ZWNbXQ0KK0ByMiAtLS0tIHRyYWNrDQorQHIzIC0tLS0gc2lnbltdDQorQHI0IC0tLS0gcnJpeGl4W11bTkJfUE9TXQ0KK0ByNSAtLS0tIGNvcl8xW10NCitAcjYgLS0tLSBjb3JfMltdDQorDQorICAgICAgICAgICAgICAuc2VjdGlvbiAudGV4dCANCisJICAgICAgLmdsb2JhbCAgY29yX2hfdmVjXzAxMl9hc20NCisNCitjb3JfaF92ZWNfMDEyX2FzbToNCisNCisgICAgICAgICAgICAgU1RNRkQgICAgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNH0NCisJICAgICBMRFIgICAgICAgICAgIHI0LCBbcjEzLCAjNDBdICAgICAgICAgICAgICAgICAgICBAbG9hZCBycml4aXhbXVtOQl9QT1NdDQorCSAgICAgQUREICAgICAgICAgICByNywgcjQsIHIyLCBMU0wgIzUgICAgICAgICAgICAgICAgQHI3IC0tLSBwMCA9IHJyaXhpeFt0cmFja10NCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGk9MA0KKw0KKwkgICAgIEByMCAtLS0gaFtdLCByMSAtLS0gdmVjW10sICByMiAtLS0gcG9zDQorCSAgICAgQHIzIC0tLSBzaWduW10sIHI0IC0tLSBpLCByNyAtLS0gcDANCisNCitMT09QaToNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExfc3VtMSA9IDANCisJICAgICBNT1YgICAgICAgICAgIHI2LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gMA0KKwkgICAgIEFERCAgICAgICAgICAgcjksIHIxLCByMiwgTFNMICMxICAgICAgICAgICAgICAgIEBwMiA9ICZ2ZWNbcG9zXQ0KKwkgICAgIE1PViAgICAgICAgICAgcjEwLCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEBwMSA9IGgNCisJICAgICBSU0IgICAgICAgICAgIHIxMSwgcjIsICM2MiAgICAgICAgICAgICAgICAgICAgICBAaj02Mi1wb3MNCisNCitMT09QajE6DQorCSAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgDQorCSAgICAgTERSU0ggICAgICAgICByOCwgIFtyOV0sICMyDQorCSAgICAgTERSU0ggICAgICAgICByMTQsIFtyOV0NCisJICAgICBTVUJTICAgICAgICAgIHIxMSwgcjExLCAjMQ0KKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHI4LCByNQ0KKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYJIA0KKwkgICAgIEJHRSAgICAgICAgICAgTE9PUGoxDQorDQorCSAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAqcDErKw0KKwkgICAgIE1PViAgICAgICAgICAgcjYsIHI2LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gKExfc3VtMiA8PCAyKQ0KKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHIxNCwgcjUNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByMTQsICMweDgwMDANCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjUsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAoTF9zdW0xIDw8IDIpDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0ICAgICAgICAgDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjksIHI1LCByMTQNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjksIEFTUiAjMTYNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNiwgcjEwLCBBU1IgIzE2DQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjksIHIzLCByMiwgTFNMICMxICAgICAgICAgICAgICAgICBAYWRkcmVzcyBvZiBzaWduW3Bvc10NCisgICAgICAgICAgICAgQUREICAgICAgICAgICByOCwgcjcsICMzMg0KKyAgICAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I5XSwgIzIgICAgICAgICAgICAgICAgIAkgIEBzaWduW3Bvc10NCisJICAgICBMRFJTSCAgICAgICAgIHIxMSwgW3I5XSAgICAgICAgICAgICAgICAgICAgICAgICAgQHNpZ25bcG9zICsgMV0NCisJICAgICBNVUwgICAgICAgICAgIHIxMiwgcjUsIHIxMA0KKwkgICAgIE1VTCAgICAgICAgICAgcjE0LCByNiwgcjExDQorCSAgICAgTU9WICAgICAgICAgICByNSwgcjEyLCBBU1IgIzE1DQorCSAgICAgTU9WICAgICAgICAgICByNiwgcjE0LCBBU1IgIzE1DQorCSAgICAgTERSICAgICAgICAgICByOSwgIFtyMTMsICM0NF0gICAgICAgICAgICAgICAgICAgDQorCSAgICAgTERSICAgICAgICAgICByMTIsIFtyMTMsICM0OF0NCisgICAgICAgICAgICAgTERSU0ggICAgICAgICByMTAsIFtyN10sICMyICAgICAgICAgICAgICAgICAgICAgIEAqcDArKw0KKwkgICAgIExEUlNIICAgICAgICAgcjExLCBbcjhdICAgICAgICAgICAgICAgICAgICAgICAgICBAKnAzKysNCisgICAgICAgICAgICAgQUREICAgICAgICAgICByOSwgcjksIHI0LCBMU0wgIzENCisJICAgICBBREQgICAgICAgICAgIHIxMiwgcjEyLCByNCwgTFNMICMxDQorCSAgICAgQUREICAgICAgICAgICByNSwgcjUsIHIxMA0KKwkgICAgIEFERCAgICAgICAgICAgcjYsIHI2LCByMTENCisJICAgICBTVFJIICAgICAgICAgIHI1LCBbcjldDQorCSAgICAgU1RSSCAgICAgICAgICByNiwgW3IxMl0NCisNCisgICAgICAgICAgICAgQUREICAgICAgICAgICByMiwgcjIsICM0DQorIA0KKyAgICAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBATF9zdW0xID0gMA0KKwkgICAgIE1PViAgICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTIgPSAwDQorCSAgICAgQUREICAgICAgICAgICByOSwgcjEsIHIyLCBMU0wgIzEgICAgICAgICAgICAgICAgQHAyID0gJnZlY1twb3NdDQorCSAgICAgTU9WICAgICAgICAgICByMTAsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgQHAxID0gaA0KKwkgICAgIFJTQiAgICAgICAgICAgcjExLCByMiwgIzYyICAgICAgICAgICAgICAgICAgICAgIEBqPTYyLXBvcw0KKwkgICAgIEFERCAgICAgICAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgICAgICAgIEBpKysNCisNCitMT09QajI6DQorCSAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgDQorCSAgICAgTERSU0ggICAgICAgICByOCwgIFtyOV0sICMyDQorCSAgICAgTERSU0ggICAgICAgICByMTQsIFtyOV0NCisJICAgICBTVUJTICAgICAgICAgIHIxMSwgcjExLCAjMQ0KKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHI4LCByNQ0KKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI2LCByMTIsIHIxNCwgcjYJIA0KKwkgICAgIEJHRSAgICAgICAgICAgTE9PUGoyDQorDQorCSAgICAgTERSU0ggICAgICAgICByMTIsIFtyMTBdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAqcDErKw0KKwkgICAgIE1PViAgICAgICAgICAgcjYsIHI2LCBMU0wgIzIgICAgICAgICAgICAgICAgICAgICBATF9zdW0yID0gKExfc3VtMiA8PCAyKQ0KKyAgICAgICAgICAgICBNTEEgICAgICAgICAgIHI1LCByMTIsIHIxNCwgcjUNCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByMTQsICMweDgwMDANCisgICAgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjUsIExTTCAjMiAgICAgICAgICAgICAgICAgICAgIEBMX3N1bTEgPSAoTF9zdW0xIDw8IDIpDQorICAgICAgICAgICAgIEFERCAgICAgICAgICAgcjEwLCByNiwgcjE0ICAgICAgICANCisgICAgICAgICAgICAgQUREICAgICAgICAgICByOSwgcjUsIHIxNA0KKw0KKyAgICAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByOSwgQVNSICMxNg0KKyAgICAgICAgICAgICBNT1YgICAgICAgICAgIHI2LCByMTAsIEFTUiAjMTYNCisgICAgICAgICAgICAgQUREICAgICAgICAgICByOSwgcjMsIHIyLCBMU0wgIzEgICAgICAgICAgICAgICAgIEBhZGRyZXNzIG9mIHNpZ25bcG9zXQ0KKyAgICAgICAgICAgICBBREQgICAgICAgICAgIHI4LCByNywgIzMyDQorICAgICAgICAgICAgIExEUlNIICAgICAgICAgcjEwLCBbcjldLCAjMiAgICAgICAgICAgICAgICAgCSAgQHNpZ25bcG9zXQ0KKwkgICAgIExEUlNIICAgICAgICAgcjExLCBbcjldICAgICAgICAgICAgICAgICAgICAgICAgICBAc2lnbltwb3MgKyAxXQ0KKwkgICAgIE1VTCAgICAgICAgICAgcjEyLCByNSwgcjEwDQorCSAgICAgTVVMICAgICAgICAgICByMTQsIHI2LCByMTENCisJICAgICBNT1YgICAgICAgICAgIHI1LCByMTIsIEFTUiAjMTUNCisJICAgICBNT1YgICAgICAgICAgIHI2LCByMTQsIEFTUiAjMTUNCisJICAgICBMRFIgICAgICAgICAgIHI5LCAgW3IxMywgIzQ0XSAgICAgICAgICAgICAgICAgICANCisJICAgICBMRFIgICAgICAgICAgIHIxMiwgW3IxMywgIzQ4XQ0KKyAgICAgICAgICAgICBMRFJTSCAgICAgICAgIHIxMCwgW3I3XSwgIzIgICAgICAgICAgICAgICAgICAgICAgQCpwMCsrDQorCSAgICAgTERSU0ggICAgICAgICByMTEsIFtyOF0gICAgICAgICAgICAgICAgICAgICAgICAgIEAqcDMrKw0KKyAgICAgICAgICAgICBBREQgICAgICAgICAgIHI5LCByOSwgcjQsIExTTCAjMQ0KKwkgICAgIEFERCAgICAgICAgICAgcjEyLCByMTIsIHI0LCBMU0wgIzENCisJICAgICBBREQgICAgICAgICAgIHI1LCByNSwgcjEwDQorCSAgICAgQUREICAgICAgICAgICByNiwgcjYsIHIxMQ0KKwkgICAgIFNUUkggICAgICAgICAgcjUsIFtyOV0NCisJICAgICBTVFJIICAgICAgICAgIHI2LCBbcjEyXQ0KKwkgICAgIEFERCAgICAgICAgICAgcjQsIHI0LCAjMSAgICAgICAgICAgICAgICAgICAgICAgICBAaSsxDQorCSAgICAgQUREICAgICAgICAgICByMiwgcjIsICM0ICAgICAgICAgICAgICAgICAgICAgICAgIEBwb3MgKz0gU1RFUA0KKwkgICAgIENNUCAgICAgICAgICAgcjQsICMxNg0KKwkgICAgIA0KKwkgICAgIEJMVCAgICAgICAgICAgTE9PUGkNCisgICAgICAgICANCit0aGVfZW5kOg0KKyAgICAgICAgICAgICBMRE1GRCAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE1fQ0KKyAgICAgICAgICAgICANCisJICAgICAuRU5ECSANCisgICAgICAgIA0KKwkNCisJICANCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3ByZWRfbHQ0XzFfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODg1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwpAQCAtMCwwICsxLDEwMCBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgUHJlZF9sdDQoDQorQCAgICAgV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IGV4Y2l0YXRpb24gYnVmZmVyICovDQorQCAgICAgV29yZDE2IFQwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGludGVnZXIgcGl0Y2ggbGFnICovDQorQCAgICAgV29yZDE2IGZyYWMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIG9mIGxhZyAgICovDQorQCAgICAgV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHN1YmZyYW1lIHNpemUgICAgICovDQorQCkNCitAKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCitAIHIwICAgIC0tLSAgZXhjW10NCitAIHIxICAgIC0tLSAgVDANCitAIHIyICAgIC0tLSAgZnJhYw0KK0AgcjMgICAgLS0tICBMX3N1YmZyDQorIA0KKyAgICAgICAgICAuc2VjdGlvbiAgLnRleHQgDQorICAgICAgICAgIC5nbG9iYWwgICBwcmVkX2x0NF9hc20NCisgICAgICAgICAgLmV4dGVybiAgIGludGVyNF8yDQorDQorcHJlZF9sdDRfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIFNVQiAgICAgICAgICAgcjQsIHIwLCByMSwgTFNMICMxICAgICAgICAgICAgICAgICAgICAgICAgQCB4ID0gZXhjIC0gVDANCisgICAgICAgICAgUlNCICAgICAgICAgICByMiwgcjIsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGZyYWMgPSAtIGZyYWMNCisgICAgICAgICAgU1VCICAgICAgICAgICByNCwgcjQsICMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHggLT0gTF9JTlRFUlBPTDIgLSAxDQorICAgICAgICAgIENNUCAgICAgICAgICAgcjIsICMwDQorICAgICAgICAgIEFERExUICAgICAgICAgcjIsIHIyLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmcmFjICs9IFVQX1NBTVANCisgICAgICAgICAgU1VCTFQgICAgICAgICByNCwgcjQsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHgtLQ0KKw0KKyAgICAgICAgICBMRFIgICAgICAgICAgIHIxMSwgTGFibGUxDQorICAgICAgICAgIFJTQiAgICAgICAgICAgcjIsIHIyLCAjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBrID0gVVBfU0FNUCAtIDEgLSBmcmFjDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBqID0gMA0KKwkgIEFERCAgICAgICAgICAgcjExLCByMTEsIHIyLCBMU0wgIzYgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgaW50ZXI0XzJba11bXQ0KKw0KKwkgIFZMRDEuUzE2ICAgICAge1EwLCBRMX0sIFtyMTFdIQ0KKwkgIFZMRDEuUzE2ICAgICAge1EyLCBRM30sIFtyMTFdIQ0KKyAgICAgICAgICANCisJICBNT1YgICAgICAgICAgIHI2LCAjMHg4MDAwIA0KKw0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgIHtRNCwgUTV9LCBbcjRdISAgICAgICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIDE2IHhbXQ0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgIHtRNiwgUTd9LCBbcjRdISAgICAgICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIDE2IHhbXQ0KKw0KK0xPT1A6DQorICAgICAgICAgIFZRRE1VTEwuUzE2ICAgUTE1LCBEOCwgRDANCisgICAgICAgICAgVlFETUxBTC5TMTYgICBRMTUsIEQ5LCBEMQ0KKyAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDEwLCBEMg0KKyAgICAgICAgICBWUURNTEFMLlMxNiAgIFExNSwgRDExLCBEMw0KKyAgICAgICAgDQorICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEMTIsIEQ0DQorICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEMTMsIEQ1DQorICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEMTQsIEQ2DQorICAgICAgICAgIFZRRE1MQUwuUzE2ICAgUTE1LCBEMTUsIEQ3DQorDQorICAgICAgICAgIExEUlNIICAgICAgICAgcjEyLCBbcjRdLCAjMiAgICAgICAgICAgICAgICANCisgICAgICAgICAgDQorICAgICAgICAgIFZFWFQuUzE2ICAgICAgRDgsIEQ4LCBEOSwgIzENCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEOSwgRDksIEQxMCwgIzENCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTAsIEQxMCwgRDExLCAjMQ0KKyAgICAgICAgICBWRVhULlMxNiAgICAgIEQxMSwgRDExLCBEMTIsICMxDQorICAgICAgICAgIFZEVVAuUzE2ICAgICAgRDI0LCByMTINCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTIsIEQxMiwgRDEzLCAjMQ0KKyAgICAgICAgICBWRVhULlMxNiAgICAgIEQxMywgRDEzLCBEMTQsICMxDQorICAgICANCisgICAgICAgICAgVlFBREQuUzMyICAgICBEMzAsIEQzMCwgRDMxDQorCSAgTU9WICAgICAgICAgICByMTEsICMweDgwMDAgICAgICAgICAgDQorICAgICAgICAgIFZQQURELlMzMiAgICAgRDMwLCBEMzAsIEQzMA0KKyAgICAgICAgICBBREQgICAgICAgICAgIHI4LCByOCwgIzENCisgICAgICAgICAgVk1PVi5TMzIgICAgICByMTIsIEQzMFswXQ0KKyAgICAgICAgICBWRVhULlMxNiAgICAgIEQxNCwgRDE0LCBEMTUsICMxICAgICAgICAgIA0KKw0KKyAgICAgICAgICBRQUREICAgICAgICAgIHIxLCByMTIsIHIxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgTF9zdW0gPSAoTF9zdW0gPDwgMikNCisgICAgICAgICAgVkVYVC5TMTYgICAgICBEMTUsIEQxNSwgRDI0LCAjMQ0KKyAgICAgICAgICBRQUREICAgICAgICAgIHI1LCByMSwgcjYgICAgICAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjEsIHI1LCBBU1IgIzE2DQorICAgICAgICAgIENNUCAgICAgICAgICAgcjgsIHIzDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjEsIFtyMF0sICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBleGNbal0gPSAoTF9zdW0gKyAweDgwMDApID4+IDE2DQorICAgICAgICAgIEJMVCAgICAgICAgICAgTE9PUA0KKyAgICAgICAgICAgICAgICAgICAgDQorcHJlZF9sdDRfZW5kOg0KKwkJICAgICANCisgICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKyANCitMYWJsZTE6DQorICAgICAgICAgIC53b3JkICAgCWludGVyNF8yDQorICAgICAgICAgIEBFTkRGVU5DDQorICAgICAgICAgIC5FTkQNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTZiMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucwpAQCAtMCwwICsxLDEyNyBAQAorQC8qCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuCitAICoqCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitAICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorQCAqKgorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitAICoqCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK0AgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitAICovCitACitAdm9pZCBSZXNpZHUgKAorQCAgICBXb3JkMTYgYVtdLCAvKiAoaSkgICAgIDogcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgKi8KK0AgICAgV29yZDE2IHhbXSwgLyogKGkpICAgICA6IHNwZWVjaCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitAICAgIFdvcmQxNiB5W10sIC8qIChvKSAgICAgOiByZXNpZHVhbCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworQCAgICBXb3JkMTYgbGcgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK0ApCitAYVtdICAgICAgICBSTiAgICAgcjAKK0B4W10gICAgICAgIFJOICAgICByMQorQHlbXSAgICAgICAgUk4gICAgIHIyCitAbGcgICAgICAgICBSTiAgICAgcjMKKworCS5zZWN0aW9uICAgLnRleHQKKyAgICAgICAgLmdsb2JhbCAgICBSZXNpZHVfb3B0IAorCitSZXNpZHVfb3B0OgorCisgICAgICAgIFNUTUZEICAgICAgICAgIHIxMyEsIHtyNCAtIHIxMiwgcjE0fSAKKyAgICAgICAgU1VCICAgICAgICAgICAgcjcsIHIzLCAjNCAgICAgICAgICAgICAgICAgICAgICAgQGkgPSBsZyAtIDQKKyAgICAgICAgCisgICAgICAgIFZMRDEuUzE2ICAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyMF0hICAgICAgICAgICAgICBAZ2V0IGFsbCBhW10gIAorCVZMRDEuUzE2ICAgICAgIHtENH0sIFtyMF0hCisgICAgICAgIFZNT1YuUzMyICAgICAgIFE4LCAgIzB4ODAwMAorICAgICAgICAKK0xPT1AxOgorICAgICAgICBBREQgICAgICAgICAgICByOSwgcjEsIHI3LCBMU0wgIzEgICAgICAgICAgICAgICBAY29weSB0aGUgYWRkcmVzcworICAgICAgICBBREQgICAgICAgICAgICByMTAsIHIyLCByNywgTFNMICMxCisgICAgICAgIE1PViAgICAgICAgICAgIHI4LCByOQorICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgICAgICAgICAgICAgICAgICAgIEBnZXQgeFtpXSwgeFtpKzFdLCB4W2krMl0sIHhbaSszXQorICAgICAgICBWUURNVUxMLlMxNiAgICBRMTAsIEQ1LCBEMFswXSAgICAgICAgICAgICAgICAgIEBmaW5pc2ggdGhlIGZpcnN0IExfbXVsdAorCisgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzIgICAgICAgICAgICAgICAgICAgICAgIEBnZXQgdGhlIHhbaS0xXSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDBbMV0KKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICM0ICAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTJdIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQwWzJdCisKKyAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjNiAgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0zXSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQwWzNdICAgICAgICAgICAgICAgICAgICAKKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICM4ICAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTRdIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDFbMF0gIAorCisgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzEwICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktNV0gYWRkcmVzcworICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMVsxXSAKKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxMiAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTZdIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDFbMl0gIAorCisgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzE0ICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktN10gYWRkcmVzcworICAgICAgICBWTEQxLlMxNiAgICAgICBENSwgW3I4XSEgICAgIAorICAgICAgICBWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEMVszXSAgCisKKyAgICAgICAgU1VCICAgICAgICAgICAgcjgsIHI5LCAjMTYgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS04XSBhZGRyZXNzCisgICAgICAgIFZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdISAgICAgCisgICAgICAgIFZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzBdICAKKworICAgICAgICBTVUIgICAgICAgICAgICByOCwgcjksICMxOCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTldIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDJbMV0gICAgICAgICAKKyAgICAgICAgICAgCisgICAgICAgIFNVQiAgICAgICAgICAgIHI4LCByOSwgIzIwICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTBdIGFkZHJlc3MKKyAgICAgICAgVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hICAgICAKKyAgICAgICAgVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDJbMl0gIAorCisJU1VCICAgICAgICAgICAgcjgsIHI5LCAjMjIgICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0xMV0gYWRkcmVzcworCVZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQorCVZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQyWzNdCisKKwlTVUIgICAgICAgICAgICByOCwgcjksICMyNCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTEyXSBhZGRyZXNzCisJVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCisJVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDNbMF0KKworCVNVQiAgICAgICAgICAgIHI4LCByOSwgIzI2ICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTNdIGFkZHJlc3MKKwlWTEQxLlMxNiAgICAgICBENSwgW3I4XSEKKwlWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBEM1sxXQorCisJU1VCICAgICAgICAgICAgcjgsIHI5LCAjMjggICAgICAgICAgICAgICAgICAgICAgQGxvYWQgdGhlIHhbaS0xNF0gYWRkcmVzcworCVZMRDEuUzE2ICAgICAgIEQ1LCBbcjhdIQorCVZRRE1MQUwuUzE2ICAgIFExMCwgRDUsIEQzWzJdCisKKwlTVUIgICAgICAgICAgICByOCwgcjksICMzMCAgICAgICAgICAgICAgICAgICAgICBAbG9hZCB0aGUgeFtpLTE1XSBhZGRyZXNzCisJVkxEMS5TMTYgICAgICAgRDUsIFtyOF0hCisJVlFETUxBTC5TMTYgICAgUTEwLCBENSwgRDNbM10KKworCVNVQiAgICAgICAgICAgIHI4LCByOSwgIzMyICAgICAgICAgICAgICAgICAgICAgIEBsb2FkIHRoZSB4W2ktMTZdIGFkZHJlc3MKKwlWTEQxLlMxNiAgICAgICBENSwgW3I4XSEKKwlWUURNTEFMLlMxNiAgICBRMTAsIEQ1LCBENFswXQorCisgICAgICAgIFNVQiAgICAgICAgICAgIHI3LCByNywgIzQgICAgICAgICAgICAgICAgICAgICAgIEBpLT00CisgICAgICAgIFZRU0hMLlMzMiAgICAgIFExMCwgUTEwLCAjNAorICAgICAgICBWUUFERC5TMzIgICAgICBRMTAsIFExMCwgUTgKKyAgICAgICAgVlNIUk4uUzMyICAgICAgRDUsIFExMCwgIzE2CisgICAgICAgIFZTVDEuUzE2ICAgICAgIEQ1LCBbcjEwXSEKKyAgICAgICAgQ01QICAgICAgICAgICAgcjcsICAjMAorCisgICAgICAgIEJHRSAgICAgICAgICAgIExPT1AxCisKK1Jlc2lkdV9hc21fZW5kOiAKKyAKKyAgICAgICAgTERNRkQgICAgICByMTMhLCB7cjQgLSByMTIsIHIxNX0KKyAgICAKKyAgICAgICAgQEVOREZVTkMKKyAgICAgICAgLkVORAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTU3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zY2FsZV9zaWdfbmVvbi5zCkBAIC0wLDAgKzEsMTM4IEBACitALyoNCitAICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorQCAqKg0KK0AgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorQCAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorQCAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCitAICoqDQorQCAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorQCAqKg0KK0AgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KK0AgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCitAICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KK0AgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KK0AgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorQCAqLw0KK0AgICAgICAgICAgICAgICAgICAgDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorQHZvaWQgU2NhbGVfc2lnKA0KK0AgICAgICAgICAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogc2lnbmFsIHRvIHNjYWxlICAgICAgICAgICAgICAgKi8NCitAICAgICAgICAgICAgICAgV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHNpemUgb2YgeFtdICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgICAgICAgICAgIFdvcmQxNiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBleHBvbmVudDogeCA9IHJvdW5kKHggPDwgZXhwKSAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCAgeFtdICAgLS0tICByMA0KK0AgIGxnICAgIC0tLSAgcjENCitAICBleHAgICAtLS0gIHIyDQorDQorICAgICAgICAgIC5zZWN0aW9uICAudGV4dCANCisgICAgICAgICAgLmdsb2JhbCAgIFNjYWxlX3NpZ19vcHQNCisNCitTY2FsZV9zaWdfb3B0Og0KKw0KKyAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIE1PViAgICAgICAgICAgcjQsICM0DQorICAgICAgICAgIFZNT1YuUzMyICAgICAgUTE1LCAjMHg4MDAwICAgICAgIA0KKyAgICAgICAgICBWRFVQLlMzMiAgICAgIFExNCwgcjIgIA0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IHhbXSBhZGRyZXNzICAgIA0KKyAgICAgICAgICBDTVAgICAgICAgICAgIHIxLCAjNjQNCisgICAgICAgICAgTU9WRVEgICAgICAgICByNCwgIzENCisgICAgICAgICAgQkVRICAgICAgICAgICBMT09QDQorCSAgQ01QICAgICAgICAgICByMSwgIzEyOA0KKwkgIE1PVkVRICAgICAgICAgcjQsICMyDQorCSAgQkVRICAgICAgICAgICBMT09QDQorICAgICAgICAgIENNUCAgICAgICAgICAgcjEsICMyNTYNCisgICAgICAgICAgQkVRICAgICAgICAgICBMT09QDQorCSAgQ01QICAgICAgICAgICByMSwgIzgwDQorCSAgTU9WRVEgICAgICAgICByNCwgIzENCisJICBCRVEgICAgICAgICAgIExPT1AxDQorDQorTE9PUDE6DQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge1EwLCBRMX0sIFtyNV0hICAgICAgICAgICAgICAgICBAbG9hZCAxNiBXb3JkMTYgeFtdICAgICANCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTAsIEQwLCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTEsIEQxLCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTIsIEQyLCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTMsIEQzLCAjMTYNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTAsIFExMCwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTExLCBRMTEsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMiwgUTEyLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTMsIFExMywgUTE0DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE2LCBRMTAsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNywgUTExLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTgsIFExMiwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE5LCBRMTMsIFExNQ0KKyAgICAgICAgICBWU1QxLlMxNiAgICAgIHtROCwgUTl9LCBbcjBdISAgICAgICAgICAgICAgICAgQHN0b3JlIDE2IFdvcmQxNiB4W10NCisNCitMT09QOiAgICAgICAgICAgICAgICANCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTAsIFExfSwgW3I1XSEgICAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTIsIFEzfSwgW3I1XSEgICAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTQsIFE1fSwgW3I1XSEgICAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisgICAgICAgICAgVkxEMS5TMTYgICAgICB7UTYsIFE3fSwgW3I1XSEgICAgICAgICAgICAgICAgIEBsb2FkIDE2IFdvcmQxNiB4W10NCisNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBROCwgRDAsICMxNg0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFE5LCBEMSwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEwLCBEMiwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTExLCBEMywgIzE2ICAgICANCisgICAgICAgICAgVlNITC5TMzIgICAgICBROCwgUTgsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFE5LCBROSwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEwLCBRMTAsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMSwgUTExLCBRMTQNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTYsIFE4LCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTcsIFE5LCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTgsIFExMCwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE5LCBRMTEsIFExNQ0KKyAgICAgICAgICBWU1QxLlMxNiAgICAgIHtROCwgUTl9LCBbcjBdISAgICAgICAgICAgICAgICAgQHN0b3JlIDE2IFdvcmQxNiB4W10NCisNCisgICANCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTIsIEQ0LCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTMsIEQ1LCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTAsIEQ2LCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTEsIEQ3LCAjMTYNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTIsIFExMiwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEzLCBRMTMsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMCwgUTEwLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTEsIFExMSwgUTE0DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE2LCBRMTIsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNywgUTEzLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTgsIFExMCwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE5LCBRMTEsIFExNQ0KKyAgICAgICAgICBWU1QxLlMxNiAgICAgIHtROCwgUTl9LCBbcjBdISAgICAgICAgICAgICAgICAgQHN0b3JlIDE2IFdvcmQxNiB4W10NCisNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTAsIEQ4LCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTEsIEQ5LCAjMTYNCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTIsIEQxMCwgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEzLCBEMTEsICMxNg0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMCwgUTEwLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTEsIFExMSwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTEyLCBRMTIsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMywgUTEzLCBRMTQNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTYsIFExMCwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE3LCBRMTEsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxOCwgUTEyLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTksIFExMywgUTE1DQorICAgICAgICAgIFZTVDEuUzE2ICAgICAge1E4LCBROX0sIFtyMF0hICAgICAgICAgICAgICAgICBAc3RvcmUgMTYgV29yZDE2IHhbXQ0KKw0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMCwgRDEyLCAjMTYgICANCisgICAgICAgICAgVlNITEwuUzE2ICAgICBRMTEsIEQxMywgIzE2DQorICAgICAgICAgIFZTSExMLlMxNiAgICAgUTEyLCBEMTQsICMxNg0KKyAgICAgICAgICBWU0hMTC5TMTYgICAgIFExMywgRDE1LCAjMTYNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTAsIFExMCwgUTE0DQorICAgICAgICAgIFZTSEwuUzMyICAgICAgUTExLCBRMTEsIFExNA0KKyAgICAgICAgICBWU0hMLlMzMiAgICAgIFExMiwgUTEyLCBRMTQNCisgICAgICAgICAgVlNITC5TMzIgICAgICBRMTMsIFExMywgUTE0DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE2LCBRMTAsIFExNQ0KKyAgICAgICAgICBWQURESE4uUzMyICAgIEQxNywgUTExLCBRMTUNCisgICAgICAgICAgVkFEREhOLlMzMiAgICBEMTgsIFExMiwgUTE1DQorICAgICAgICAgIFZBRERITi5TMzIgICAgRDE5LCBRMTMsIFExNSANCisgICAgICAgICAgVlNUMS5TMTYgICAgICB7UTgsIFE5fSwgW3IwXSEgICAgICAgICAgICAgICAgIEBzdG9yZSAxNiBXb3JkMTYgeFtdICANCisgICAgICAgICAgU1VCUyAgICAgICAgICByNCwgcjQsICMxDQorICAgICAgICAgIEJHVCAgICAgICAgICAgTE9PUCAgICAgDQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorU2NhbGVfc2lnX2FzbV9lbmQ6DQorDQorICAgICAgICAgIExETUZEICAgCXIxMyEsIHtyNCAtIHIxMiwgcjE1fSANCisgICAgICAgICAgQEVOREZVTkMNCisgICAgICAgICAgLkVORA0KKyANCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzZDRhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3N5bl9maWx0X25lb24ucwpAQCAtMCwwICsxLDEwNiBAQAorQC8qDQorQCAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KK0AgKioNCitAICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KK0AgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KK0AgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorQCAqKg0KK0AgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KK0AgKioNCitAICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCitAICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorQCAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCitAICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCitAICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KK0AgKi8NCitADQorQHZvaWQgU3luX2ZpbHQoDQorQCAgICAgV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAqLw0KK0AgICAgIFdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCitAICAgICBXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorQCAgICAgV29yZDE2IG1lbVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLw0KK0ApDQorQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorQCBhW10gICAgLS0tICAgcjANCitAIHhbXSAgICAtLS0gICByMQ0KK0AgeVtdICAgIC0tLSAgIHIyDQorQCBtZW1bXSAgLS0tICAgcjMNCitAIG0gLS0tICAxNiAgbGcgLS0tIDgwICB1cGRhdGUgLS0tIDENCisNCisgICAgICAgICAgLnNlY3Rpb24gIC50ZXh0IA0KKyAgICAgICAgICAuZ2xvYmFsICAgU3luX2ZpbHRfYXNtDQorDQorU3luX2ZpbHRfYXNtOg0KKw0KKyAgICAgICAgICBTVE1GRCAgIAlyMTMhLCB7cjQgLSByMTIsIHIxNH0gDQorICAgICAgICAgIFNVQiAgICAgICAgICAgcjEzLCByMTMsICM3MDAgICAgICAgICAgICAgICAgICAgQCB5X2J1ZltMX0ZSQU1FMTZrICsgTTE2a10NCisgICANCisgICAgICAgICAgTU9WICAgICAgICAgICByNCwgcjMgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgbWVtW10gYWRkcmVzcw0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI1LCByMTMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSB5eSA9IHlfYnVmIGFkZHJlc3MNCisNCisgICAgICAgICAgQCBmb3IoaSA9IDBAIGkgPCBtQCBpKyspDQorICAgICAgICAgIEB7DQorICAgICAgICAgIEAgICAgKnl5KysgPSBtZW1baV1ADQorICAgICAgICAgIEB9IA0KKyAgICAgICAgICBWTEQxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyNF0hICAgICAgICAgIEBsb2FkIDE2IG1lbXMNCisJICBWU1QxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyNV0hICAgICAgICAgIEBzdG9yZSAxNiBtZW1bXSB0byAqeXkNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNSwgW3IwXSwgIzIgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgYVswXQ0KKyAgICAgICAgICBNT1YgICAgICAgICAgIHI4LCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaSA9IDANCisgICAgICAgICAgTU9WICAgICAgICAgICByNSwgcjUsIEFTUiAjMSAgICAgICAgICAgICAgICAgICBAIGEwID0gYVswXSA+PiAxDQorICAgICAgICAgIFZNT1YuUzE2ICAgICAgRDhbMF0sIHI1DQorICAgICAgICAgIEAgbG9hZCBhbGwgYVtdDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3IwXSEgICAgICAgICAgQCBsb2FkIGFbMV0gfiBhWzE2XQ0KKwkgIFZSRVY2NC4xNiAgICAgRDAsIEQwDQorCSAgVlJFVjY0LjE2ICAgICBEMSwgRDENCisJICBWUkVWNjQuMTYgICAgIEQyLCBEMg0KKwkgIFZSRVY2NC4xNiAgICAgRDMsIEQzIA0KKwkgIE1PViAgICAgICAgICAgcjgsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb29wIHRpbWVzDQorCSAgTU9WICAgICAgICAgICByMTAsIHIxMyAgICAgICAgICAgICAgICAgICAgICAgICBAIHRlbXAgPSB5X2J1Zg0KKwkgIEFERCAgICAgICAgICAgcjQsIHIxMywgIzMyICAgICAgICAgICAgICAgICAgICAgQCB5eVtpXSBhZGRyZXNzDQorDQorICAgICAgICAgIFZMRDEuUzE2ICAgICAge0Q0LCBENSwgRDYsIEQ3fSwgW3IxMF0hICAgICAgICAgQCBmaXJzdCAxNiB0ZW1wX3ANCisNCitTWU5fTE9PUDoNCisNCisgICAgICAgICAgTERSU0ggICAgICAgICByNiwgW3IxXSwgIzIgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgeFtpXQ0KKwkgIE1VTCAgICAgICAgICAgcjEyLCByNiwgcjUgICAgICAgICAgICAgICAgICAgICAgQCBMX3RtcCA9IHhbaV0gKiBhMA0KKwkgIEFERCAgICAgICAgICAgcjEwLCByNCwgcjgsIExTTCAjMSAgICAgICAgICAgICAgQCB5W2ldLCB5eVtpXSBhZGRyZXNzDQorDQorCSAgVkRVUC5TMzIgICAgICBRMTAsIHIxMg0KKwkgIFZNVUxMLlMxNiAgICAgUTUsIEQzLCBENCAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgIFZNTEFMLlMxNiAgICAgUTUsIEQyLCBENQ0KKyAgICAgICAgICBWTUxBTC5TMTYgICAgIFE1LCBEMSwgRDYNCisgICAgICAgICAgVk1MQUwuUzE2ICAgICBRNSwgRDAsIEQ3DQorICAgICAgICAgIFZFWFQuOCAgICAgICAgRDQsIEQ0LCBENSwgIzINCisgICAgICAgICAgVkVYVC44ICAgICAgICBENSwgRDUsIEQ2LCAjMg0KKyAgICAgICAgICBWRVhULjggICAgICAgIEQ2LCBENiwgRDcsICMyDQorICAgICAgICAgIFZQQURELlMzMiAgICAgRDEyLCBEMTAsIEQxMQ0KKyAgICAgICAgICBBREQgICAgICAgICAgIHI4LCByOCwgIzENCisgICAgICAgICAgVlBBREQuUzMyICAgICBEMTAsIEQxMiwgRDEyDQorDQorCSAgVkRVUC5TMzIgICAgICBRNywgRDEwWzBdDQorDQorCSAgVlNVQi5TMzIgICAgICBROSwgUTEwLCBRNw0KKyAgICAgICAgICBWUVJTSFJOLlMzMiAgIEQyMCwgUTksICMxMiAgIA0KKyAgICAgICAgICBWTU9WLlMxNiAgICAgIHI5LCBEMjBbMF0NCisgICAgICAgICAgVkVYVC44ICAgICAgICBENywgRDcsIEQyMCwgIzINCisgICAgICAgICAgQ01QICAgICAgICAgICByOCwgIzgwDQorICAgICAgICAgIFNUUkggICAgICAgICAgcjksIFtyMTBdICAgICAgICAgICAgICAgICAgICAgICAgQCB5eVtpXQ0KKyAgICAgICAgICBTVFJIICAgICAgICAgIHI5LCBbcjJdLCAjMiAgICAgICAgICAgICAgICAgICAgIEAgeVtpXSAgICAgICAgICAJICAgICAgICAgDQorCSAgDQorICAgICAgICAgIEJMVCAgICAgICAgICAgU1lOX0xPT1ANCisgDQorICAgICAgICAgIEAgdXBkYXRlIG1lbVtdDQorICAgICAgICAgIEFERCAgICAgICAgICAgcjUsIHIxMywgIzE2MCAgICAgICAgICAgICAgICAgICAgQCB5eVs2NF0gYWRkcmVzcw0KKwkgIFZMRDEuUzE2ICAgICAge0QwLCBEMSwgRDIsIEQzfSwgW3I1XSENCisJICBWU1QxLlMxNiAgICAgIHtEMCwgRDEsIEQyLCBEM30sIFtyM10hICAgICAgICAgICAgICANCisNCitTeW5fZmlsdF9hc21fZW5kOg0KKyANCisgICAgICAgICAgQUREICAgICAgICAgICByMTMsIHIxMywgIzcwMAkJICAgICANCisgICAgICAgICAgTERNRkQgICAJcjEzISwge3I0IC0gcjEyLCByMTV9IA0KKyAgICAgICAgICBARU5ERlVOQw0KKyAgICAgICAgICAuRU5EDQorIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXV0b2NvcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2VkNjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCkBAIC0wLDAgKzEsMTI3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogYXV0b2NvcnIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246Q29tcHV0ZSBhdXRvY29ycmVsYXRpb25zIG9mIHNpZ25hbCB3aXRoIHdpbmRvd2luZyAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJoYW1fd2luZC50YWIiDQorDQordm9pZCBBdXRvY29ycigNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogSW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICA6IExQQyBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHJfaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1OiBBdXRvY29ycmVsYXRpb25zICAobXNiKSAgICAgICAgICAgKi8NCisJCVdvcmQxNiByX2xbXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgIDogQXV0b2NvcnJlbGF0aW9ucyAgKGxzYikgICAgICAgICAgICovDQorCSAgICAgKQ0KK3sNCisJV29yZDMyIGksIG5vcm0sIHNoaWZ0Ow0KKwlXb3JkMTYgeVtMX1dJTkRPV107DQorCVdvcmQzMiBMX3N1bSwgTF9zdW0xLCBMX3RtcCwgRl9MRU47DQorCVdvcmQxNiAqcDEsKnAyLCpwMzsNCisJY29uc3QgV29yZDE2ICpwNDsNCisJLyogV2luZG93aW5nIG9mIHNpZ25hbCAqLw0KKwlwMSA9IHg7DQorCXA0ID0gdm9fd2luZG93Ow0KKwlwMyA9IHk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBMX1dJTkRPVzsgaSs9NCkNCisJew0KKwkJKnAzKysgPSB2b19tdWx0X3IoKCpwMSsrKSwgKCpwNCsrKSk7DQorCQkqcDMrKyA9IHZvX211bHRfcigoKnAxKyspLCAoKnA0KyspKTsNCisJCSpwMysrID0gdm9fbXVsdF9yKCgqcDErKyksICgqcDQrKykpOw0KKwkJKnAzKysgPSB2b19tdWx0X3IoKCpwMSsrKSwgKCpwNCsrKSk7DQorCX0NCisNCisJLyogY2FsY3VsYXRlIGVuZXJneSBvZiBzaWduYWwgKi8NCisJTF9zdW0gPSB2b19MX2RlcG9zaXRfaCgxNik7ICAgICAgICAgICAgICAgLyogc3FydCgyNTYpLCBhdm9pZCBvdmVyZmxvdyBhZnRlciByb3VuZGluZyAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9XSU5ET1c7IGkrKykNCisJew0KKwkJTF90bXAgPSB2b19MX211bHQoeVtpXSwgeVtpXSk7DQorCQlMX3RtcCA9IChMX3RtcCA+PiA4KTsNCisJCUxfc3VtICs9IExfdG1wOw0KKwl9DQorDQorCS8qIHNjYWxlIHNpZ25hbCB0byBhdm9pZCBvdmVyZmxvdyBpbiBhdXRvY29ycmVsYXRpb24gKi8NCisJbm9ybSA9IG5vcm1fbChMX3N1bSk7DQorCXNoaWZ0ID0gNCAtIChub3JtID4+IDEpOw0KKwlpZihzaGlmdCA+IDApDQorCXsNCisJCXAxID0geTsNCisJCWZvciAoaSA9IDA7IGkgPCBMX1dJTkRPVzsgaSs9NCkNCisJCXsNCisJCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsgDQorCQkJcDErKzsNCisJCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsgDQorCQkJcDErKzsNCisJCQkqcDEgPSB2b19zaHJfcigqcDEsIHNoaWZ0KTsNCisJCQlwMSsrOw0KKwkJCSpwMSA9IHZvX3Nocl9yKCpwMSwgc2hpZnQpOyANCisJCQlwMSsrOw0KKwkJfQ0KKwl9DQorDQorCS8qIENvbXB1dGUgYW5kIG5vcm1hbGl6ZSByWzBdICovDQorCUxfc3VtID0gMTsgDQorCWZvciAoaSA9IDA7IGkgPCBMX1dJTkRPVzsgaSs9NCkNCisJew0KKwkJTF9zdW0gKz0gdm9fTF9tdWx0KHlbaV0sIHlbaV0pOw0KKwkJTF9zdW0gKz0gdm9fTF9tdWx0KHlbaSsxXSwgeVtpKzFdKTsNCisJCUxfc3VtICs9IHZvX0xfbXVsdCh5W2krMl0sIHlbaSsyXSk7DQorCQlMX3N1bSArPSB2b19MX211bHQoeVtpKzNdLCB5W2krM10pOw0KKwl9DQorDQorCW5vcm0gPSBub3JtX2woTF9zdW0pOw0KKwlMX3N1bSA9IChMX3N1bSA8PCBub3JtKTsNCisNCisJcl9oWzBdID0gTF9zdW0gPj4gMTY7DQorCXJfbFswXSA9IChMX3N1bSAmIDB4ZmZmZik+PjE7DQorDQorCS8qIENvbXB1dGUgclsxXSB0byByW21dICovDQorCWZvciAoaSA9IDE7IGkgPD0gODsgaSsrKQ0KKwl7DQorCQlMX3N1bTEgPSAwOw0KKwkJTF9zdW0gPSAwOw0KKwkJRl9MRU4gPSAoV29yZDMyKShMX1dJTkRPVyAtIDIqaSk7DQorCQlwMSA9IHk7DQorCQlwMiA9IHkgKyAoMippKS0xOw0KKwkJZG97DQorCQkJTF9zdW0xICs9ICpwMSAqICpwMisrOw0KKwkJCUxfc3VtICs9ICpwMSsrICogKnAyOw0KKwkJfXdoaWxlKC0tRl9MRU4hPTApOw0KKw0KKwkJTF9zdW0xICs9ICpwMSAqICpwMisrOw0KKw0KKwkJTF9zdW0xID0gTF9zdW0xPDxub3JtOw0KKwkJTF9zdW0gPSBMX3N1bTw8bm9ybTsNCisNCisJCXJfaFsoMippKS0xXSA9IExfc3VtMSA+PiAxNTsNCisJCXJfbFsoMippKS0xXSA9IExfc3VtMSAmIDB4MDAwMDdmZmY7DQorCQlyX2hbKDIqaSldID0gTF9zdW0gPj4gMTU7DQorCQlyX2xbKDIqaSldID0gTF9zdW0gJiAweDAwMDA3ZmZmOw0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hel9pc3AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXpfaXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1OWY5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXpfaXNwLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgRmlsZTogYXpfaXNwLmMNCisqDQorKiAgRGVzY3JpcHRpb246DQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogQ29tcHV0ZSB0aGUgSVNQcyBmcm9tICB0aGUgTFBDIGNvZWZmaWNpZW50cyAgKG9yZGVyPU0pICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogVGhlIElTUHMgYXJlIHRoZSByb290cyBvZiB0aGUgdHdvIHBvbHlub21pYWxzIEYxKHopIGFuZCBGMih6KSAgICAgICAgICoNCisqIGRlZmluZWQgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgIEYxKHopID0gQSh6KSArIHpeLW0gQSh6Xi0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIGFuZCAgICAgICAgICBGMih6KSA9IEEoeikgLSB6Xi1tIEEoel4tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBGb3IgYSBldmVuIG9yZGVyIG09Mm4sIEYxKHopIGhhcyBNLzIgY29uanVnYXRlIHJvb3RzIG9uIHRoZSB1bml0ICAgICAgKg0KKyogY2lyY2xlIGFuZCBGMih6KSBoYXMgTS8yLTEgY29uanVnYXRlIHJvb3RzIG9uIHRoZSB1bml0IGNpcmNsZSBpbiAgICAgICoNCisqIGFkZGl0aW9uIHRvIHR3byByb290cyBhdCAwIGFuZCBwaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRm9yIGEgMTZ0aCBvcmRlciBMUCBhbmFseXNpcywgRjEoeikgYW5kIEYyKHopIGNhbiBiZSB3cml0dGVuIGFzICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgIEYxKHopID0gKDEgKyBhW01dKSAgIFBST0RVQ1QgICgxIC0gMiBjb3Mod19pKSB6Xi0xICsgel4tMiApICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICBpPTAsMiw0LDYsOCwxMCwxMiwxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgIEYyKHopID0gKDEgLSBhW01dKSAoMSAtIHpeLTIpIFBST0RVQ1QgKDEgLSAyIGNvcyh3X2kpIHpeLTEgKyB6Xi0yICkgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPTEsMyw1LDcsOSwxMSwxMyAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBUaGUgSVNQcyBhcmUgdGhlIE0tMSBmcmVxdWVuY2llcyB3X2ksIGk9MC4uLk0tMiBwbHVzIHRoZSBsYXN0ICAgICAgICAgKg0KKyogcHJlZGljdG9yIGNvZWZmaWNpZW50IGFbTV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgInN0ZGlvLmgiDQorI2luY2x1ZGUgImdyaWQxMDAudGFiIg0KKw0KKyNkZWZpbmUgTSAgIDE2DQorI2RlZmluZSBOQyAgKE0vMikNCisNCisvKiBsb2NhbCBmdW5jdGlvbiAqLw0KK3N0YXRpYyBfX2lubGluZSBXb3JkMTYgQ2hlYnBzMihXb3JkMTYgeCwgV29yZDE2IGZbXSwgV29yZDMyIG4pOw0KKw0KK3ZvaWQgQXpfaXNwKA0KKwkJV29yZDE2IGFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogcHJlZGljdG9yIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc3BbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IEltbWl0dGFuY2Ugc3BlY3RyYWwgcGFpcnMgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgb2xkX2lzcFtdICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBvbGQgaXNwW10gKGluIGNhc2Ugbm90IGZvdW5kIE0gcm9vdHMpICAqLw0KKwkgICApDQorew0KKwlXb3JkMzIgaSwgaiwgbmYsIGlwLCBvcmRlcjsNCisJV29yZDE2IHhsb3csIHlsb3csIHhoaWdoLCB5aGlnaCwgeG1pZCwgeW1pZCwgeGludDsNCisJV29yZDE2IHgsIHksIHNpZ24sIGV4cDsNCisJV29yZDE2ICpjb2VmOw0KKwlXb3JkMTYgZjFbTkMgKyAxXSwgZjJbTkNdOw0KKwlXb3JkMzIgdDA7DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogZmluZCB0aGUgc3VtIGFuZCBkaWZmIHBvbHlub21pYWxzIEYxKHopIGFuZCBGMih6KSAgICAgICAgICAgKg0KKwkgKiAgICAgIEYxKHopID0gW0EoeikgKyB6Xk0gQSh6Xi0xKV0gICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgRjIoeikgPSBbQSh6KSAtIHpeTSBBKHpeLTEpXS8oMS16Xi0yKSAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiBmb3IgKGk9MDsgaTxOQzsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICBmMVtpXSA9IGFbaV0gKyBhW00taV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIGYyW2ldID0gYVtpXSAtIGFbTS1pXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogZjFbTkNdID0gMi4wKmFbTkNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIGZvciAoaT0yOyBpPE5DOyBpKyspICAgICAgICAgICAgRGl2aWRlIGJ5ICgxLXpeLTIpICAgICAgICAgICoNCisJICogICBmMltpXSArPSBmMltpLTJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlmb3IgKGkgPSAwOyBpIDwgTkM7IGkrKykNCisJew0KKwkJdDAgPSBhW2ldIDw8IDE1Ow0KKwkJZjFbaV0gPSB2b19yb3VuZCh0MCArIChhW00gLSBpXSA8PCAxNSkpOyAgICAgICAgLyogPShhW2ldK2FbTS1pXSkvMiAqLw0KKwkJZjJbaV0gPSB2b19yb3VuZCh0MCAtIChhW00gLSBpXSA8PCAxNSkpOyAgICAgICAgLyogPShhW2ldLWFbTS1pXSkvMiAqLw0KKwl9DQorCWYxW05DXSA9IGFbTkNdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAyOyBpIDwgTkM7IGkrKykgICAgICAgICAgICAgICAvKiBEaXZpZGUgYnkgKDEtel4tMikgKi8NCisJCWYyW2ldID0gYWRkMShmMltpXSwgZjJbaSAtIDJdKTsgICAgIA0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogRmluZCB0aGUgSVNQcyAocm9vdHMgb2YgRjEoeikgYW5kIEYyKHopICkgdXNpbmcgdGhlICAgICAgICAgICAgICAgICAqDQorCSAqIENoZWJ5c2hldiBwb2x5bm9taWFsIGV2YWx1YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiBUaGUgcm9vdHMgb2YgRjEoeikgYW5kIEYyKHopIGFyZSBhbHRlcm5hdGl2ZWx5IHNlYXJjaGVkLiAgICAgICAgICAgICoNCisJICogV2Ugc3RhcnQgYnkgZmluZGluZyB0aGUgZmlyc3Qgcm9vdCBvZiBGMSh6KSB0aGVuIHdlIHN3aXRjaCAgICAgICAgICAqDQorCSAqIHRvIEYyKHopIHRoZW4gYmFjayB0byBGMSh6KSBhbmQgc28gb24gdW50aWwgYWxsIHJvb3RzIGFyZSBmb3VuZC4gICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogIC0gRXZhbHVhdGUgQ2hlYnlzaGV2IHBvbC4gYXQgZ3JpZCBwb2ludHMgYW5kIGNoZWNrIGZvciBzaWduIGNoYW5nZS4qDQorCSAqICAtIElmIHNpZ24gY2hhbmdlIHRyYWNrIHRoZSByb290IGJ5IHN1YmRpdmlkaW5nIHRoZSBpbnRlcnZhbCAgICAgICAgKg0KKwkgKiAgICAyIHRpbWVzIGFuZCBja2Vja2luZyBzaWduIGNoYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwluZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBmb3VuZCBmcmVxdWVuY2llcyAqLw0KKwlpcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGljYXRvciBmb3IgZjEgb3IgZjIgICAgICAqLw0KKwljb2VmID0gZjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJb3JkZXIgPSBOQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXhsb3cgPSB2b2dyaWRbMF07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCXlsb3cgPSBDaGVicHMyKHhsb3csIGNvZWYsIG9yZGVyKTsNCisJaiA9IDA7DQorCXdoaWxlICgobmYgPCBNIC0gMSkgJiYgKGogPCBHUklEX1BPSU5UUykpDQorCXsNCisJCWogKys7DQorCQl4aGlnaCA9IHhsb3c7ICAgICAgICAgICAgICAgICAgICAgDQorCQl5aGlnaCA9IHlsb3c7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJeGxvdyA9IHZvZ3JpZFtqXTsgICAgICAgICAgICAgICAgICAgIA0KKwkJeWxvdyA9IENoZWJwczIoeGxvdywgY29lZiwgb3JkZXIpOw0KKwkJaWYgKCh5bG93ICogeWhpZ2gpIDw9IChXb3JkMzIpIDApDQorCQl7DQorCQkJLyogZGl2aWRlIDIgdGltZXMgdGhlIGludGVydmFsICovDQorCQkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykNCisJCQl7DQorCQkJCXhtaWQgPSAoeGxvdyA+PiAxKSArICh4aGlnaCA+PiAxKTsgICAgICAgIC8qIHhtaWQgPSAoeGxvdyArIHhoaWdoKS8yICovDQorCQkJCXltaWQgPSBDaGVicHMyKHhtaWQsIGNvZWYsIG9yZGVyKTsNCisJCQkJaWYgKCh5bG93ICogeW1pZCkgPD0gKFdvcmQzMikgMCkNCisJCQkJew0KKwkJCQkJeWhpZ2ggPSB5bWlkOyAgICAgICAgIA0KKwkJCQkJeGhpZ2ggPSB4bWlkOyAgICAgICAgICANCisJCQkJfSBlbHNlDQorCQkJCXsNCisJCQkJCXlsb3cgPSB5bWlkOyAgICAgICAgICAgDQorCQkJCQl4bG93ID0geG1pZDsgICAgICAgICAgDQorCQkJCX0NCisJCQl9DQorCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJCSAqIExpbmVhciBpbnRlcnBvbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkgKiAgICB4aW50ID0geGxvdyAtIHlsb3cqKHhoaWdoLXhsb3cpLyh5aGlnaC15bG93KTsgICAgICAgICAgICAqDQorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCQl4ID0geGhpZ2ggLSB4bG93Ow0KKwkJCXkgPSB5aGlnaCAtIHlsb3c7DQorCQkJaWYgKHkgPT0gMCkNCisJCQl7DQorCQkJCXhpbnQgPSB4bG93OyAgICAgICAgICAgICAgIA0KKwkJCX0gZWxzZQ0KKwkJCXsNCisJCQkJc2lnbiA9IHk7ICAgICAgICAgICAgICAgICANCisJCQkJeSA9IGFic19zKHkpOw0KKwkJCQlleHAgPSBub3JtX3MoeSk7DQorCQkJCXkgPSB5IDw8IGV4cDsNCisJCQkJeSA9IGRpdl9zKChXb3JkMTYpIDE2MzgzLCB5KTsNCisJCQkJdDAgPSB4ICogeTsNCisJCQkJdDAgPSAodDAgPj4gKDE5IC0gZXhwKSk7DQorCQkJCXkgPSB2b19leHRyYWN0X2wodDApOyAgICAgICAgIC8qIHk9ICh4aGlnaC14bG93KS8oeWhpZ2gteWxvdykgaW4gUTExICovDQorCQkJCWlmIChzaWduIDwgMCkNCisJCQkJCXkgPSAteTsNCisJCQkJdDAgPSB5bG93ICogeTsgICAgICAvKiByZXN1bHQgaW4gUTI2ICovDQorCQkJCXQwID0gKHQwID4+IDEwKTsgICAgICAgIC8qIHJlc3VsdCBpbiBRMTUgKi8NCisJCQkJeGludCA9IHZvX3N1Yih4bG93LCB2b19leHRyYWN0X2wodDApKTsgICAgICAgIC8qIHhpbnQgPSB4bG93IC0geWxvdyp5ICovDQorCQkJfQ0KKwkJCWlzcFtuZl0gPSB4aW50OyAgICAgICAgICAgICAgICANCisJCQl4bG93ID0geGludDsgICAgICAgICAgICAgICAgICAgDQorCQkJbmYrKzsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWlmIChpcCA9PSAwKQ0KKwkJCXsNCisJCQkJaXAgPSAxOyAgICAgICAgICAgICAgICAgICAgDQorCQkJCWNvZWYgPSBmMjsgICAgICAgICAgICAgICAgDQorCQkJCW9yZGVyID0gTkMgLSAxOyAgICAgICAgICAgDQorCQkJfSBlbHNlDQorCQkJew0KKwkJCQlpcCA9IDA7ICAgICAgICAgICAgICAgICAgIA0KKwkJCQljb2VmID0gZjE7ICAgICAgICAgICAgICAgICANCisJCQkJb3JkZXIgPSBOQzsgICAgICAgICAgICAgIA0KKwkJCX0NCisJCQl5bG93ID0gQ2hlYnBzMih4bG93LCBjb2VmLCBvcmRlcik7DQorCQl9DQorCX0NCisJLyogQ2hlY2sgaWYgTS0xIHJvb3RzIGZvdW5kICovDQorCWlmKG5mIDwgTSAtIDEpDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCBNOyBpKyspDQorCQl7DQorCQkJaXNwW2ldID0gb2xkX2lzcFtpXTsgICAgICAgICAgDQorCQl9DQorCX0gZWxzZQ0KKwl7DQorCQlpc3BbTSAtIDFdID0gYVtNXSA8PCAzOyAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFExMiB0byBRMTUgd2l0aCBzYXR1cmF0aW9uICovDQorCX0NCisJcmV0dXJuOw0KK30NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogZnVuY3Rpb24gIENoZWJwczI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICB+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICBFdmFsdWF0ZXMgdGhlIENoZWJpc2hldiBwb2x5bm9taWFsIHNlcmllcyAgICAgICAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgVGhlIHBvbHlub21pYWwgb3JkZXIgaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgIG4gPSBNLzIgICAoTSBpcyB0aGUgcHJlZGljdGlvbiBvcmRlcikgICAgICAgICAgICAgICAgICAgICoNCisqICBUaGUgcG9seW5vbWlhbCBpcyBnaXZlbiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICBDKHgpID0gZigwKVRfbih4KSArIGYoMSlUX24tMSh4KSArIC4uLiArZihuLTEpVF8xKHgpICsgZihuKS8yICoNCisqIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgeDogICAgIGlucHV0IHZhbHVlIG9mIGV2YWx1YXRpb247IHggPSBjb3MoZnJlcXVlbmN5KSBpbiBRMTUgKg0KKyogIGZbXTogICBjb2VmZmljaWVudHMgb2YgdGhlIHBvbC4gICAgICAgICAgICAgICAgICAgICAgaW4gUTExICoNCisqICBuOiAgICAgb3JkZXIgb2YgdGhlIHBvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogVGhlIHZhbHVlIG9mIEMoeCkgaXMgcmV0dXJuZWQuIChTYXR1cmVkIHRvICstMS45OSBpbiBRMTQpICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCitzdGF0aWMgX19pbmxpbmUgV29yZDE2IENoZWJwczIoV29yZDE2IHgsIFdvcmQxNiBmW10sIFdvcmQzMiBuKQ0KK3sNCisJV29yZDMyIGksIGNoZWI7DQorCVdvcmQxNiBiMF9oLCBiMF9sLCBiMV9oLCBiMV9sLCBiMl9oLCBiMl9sOw0KKwlXb3JkMzIgdDA7DQorDQorCS8qIE5vdGU6IEFsbCBjb21wdXRhdGlvbiBhcmUgZG9uZSBpbiBRMjQuICovDQorDQorCXQwID0gZlswXSA8PCAxMzsNCisJYjJfaCA9IHQwID4+IDE2Ow0KKwliMl9sID0gKHQwICYgMHhmZmZmKT4+MTsNCisNCisJdDAgPSAoKGIyX2ggKiB4KTw8MSkgKyAoKChiMl9sICogeCk+PjE1KTw8MSk7DQorCXQwIDw8PSAxOw0KKwl0MCArPSAoZlsxXSA8PCAxMyk7CQkJCQkJLyogKyBmWzFdIGluIFEyNCAgICAgICAgKi8NCisNCisJYjFfaCA9IHQwID4+IDE2Ow0KKwliMV9sID0gKHQwICYgMHhmZmZmKSA+PiAxOw0KKw0KKwlmb3IgKGkgPSAyOyBpIDwgbjsgaSsrKQ0KKwl7DQorCQl0MCA9ICgoYjFfaCAqIHgpPDwxKSArICgoKGIxX2wgKiB4KT4+MTUpPDwxKTsNCisNCisJCXQwICs9IChiMl9oICogKC0xNjM4NCkpPDwxOw0KKwkJdDAgKz0gKGZbaV0gPDwgMTIpOw0KKwkJdDAgPDw9IDE7DQorCQl0MCAtPSAoYjJfbCA8PCAxKTsJCQkJCS8qIHQwID0gMi4wKngqYjEgLSBiMiArIGZbaV07ICovDQorDQorCQliMF9oID0gdDAgPj4gMTY7DQorCQliMF9sID0gKHQwICYgMHhmZmZmKSA+PiAxOw0KKw0KKwkJYjJfbCA9IGIxX2w7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGIyID0gYjE7ICovDQorCQliMl9oID0gYjFfaDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJYjFfbCA9IGIwX2w7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGIxID0gYjA7ICovDQorCQliMV9oID0gYjBfaDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCXQwID0gKChiMV9oICogeCk8PDEpICsgKCgoYjFfbCAqIHgpPj4xNSk8PDEpOw0KKwl0MCArPSAoYjJfaCAqICgtMzI3NjgpKTw8MTsJCQkJLyogdDAgPSB4KmIxIC0gYjIgICAgICAgICAgKi8NCisJdDAgLT0gKGIyX2wgPDwgMSk7DQorCXQwICs9IChmW25dIDw8IDEyKTsJCQkJCQkvKiB0MCA9IHgqYjEgLSBiMiArIGZbaV0vMiAqLw0KKw0KKwl0MCA9IExfc2hsMih0MCwgNik7ICAgICAgICAgICAgICAgICAgICAgLyogUTI0IHRvIFEzMCB3aXRoIHNhdHVyYXRpb24gKi8NCisNCisJY2hlYiA9IGV4dHJhY3RfaCh0MCk7ICAgICAgICAgICAgICAgICAgLyogUmVzdWx0IGluIFExNCAgICAgICAgICAgICAgKi8NCisNCisJaWYgKGNoZWIgPT0gLTMyNzY4KQ0KKwl7DQorCQljaGViID0gLTMyNzY3OyAgICAgICAgICAgICAgICAgICAgIC8qIHRvIGF2b2lkIHNhdHVyYXRpb24gaW4gQXpfaXNwICovDQorCX0NCisJcmV0dXJuIChjaGViKTsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9iaXRzLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2JpdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQxYTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9iaXRzLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICAgICAgIEZpbGU6IGJpdHMuYw0KKw0KKwkgICBEZXNjcmlwdGlvbjogUGVyZm9ybXMgYml0IHN0cmVhbSBtYW5pcHVsYXRpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisjaW5jbHVkZSAiYml0cy5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJkdHguaCINCisjaW5jbHVkZSAibWltZV9pby50YWIiDQorDQorDQoraW50IFBhY2tCaXRzKFdvcmQxNiBwcm1zW10sICAgICAgICAgICAgIC8qICBpOiBhbmFseXNpcyBwYXJhbWV0ZXJzICovDQorCQkJIFdvcmQxNiBjb2RpbmdfbW9kZSwgICAgICAgIC8qICBpOiBjb2RpbmcgYml0LXN0cmVhbSByYXRpbyBtb2RlICovDQorCQkJIFdvcmQxNiBtb2RlLCAgICAgICAgICAgICAgIC8qICBpOiBjb2RpbmcgYml0LXN0cmVhbSByYXRpbyBtb2RlKi8gDQorCQkJIENvZGVyX1N0YXRlICpzdCAgICAgICAgICAgIC8qaS9vOiBjb2RlciBnbG9iYWwgcGFyYW1ldGVycyBzdHJ1Y3QgKi8gICAgICAgICAgIA0KKwkJCSApDQorew0KKwlXb3JkMTYgaSwgZnJhbWVfdHlwZTsNCisJVVdvcmQ4IHRlbXA7DQorCVVXb3JkOCAqc3RyZWFtX3B0cjsNCisJV29yZDE2IGJpdHN0cmVhbWZvcm1hdCA9IHN0LT5mcmFtZVR5cGU7DQorDQorCXVuc2lnbmVkIHNob3J0KiBkYXRhT3V0ID0gc3QtPm91dHB1dFN0cmVhbTsNCisNCisJaWYgKGNvZGluZ19tb2RlID09IE1SRFRYKQ0KKwl7CSAgIA0KKwkJc3QtPnNpZF91cGRhdGVfY291bnRlci0tOw0KKw0KKwkJaWYgKHN0LT5wcmV2X2Z0ID09IFRYX1NQRUVDSCkNCisJCXsNCisJCQlmcmFtZV90eXBlID0gVFhfU0lEX0ZJUlNUOw0KKwkJCXN0LT5zaWRfdXBkYXRlX2NvdW50ZXIgPSAzOw0KKwkJfSBlbHNlDQorCQl7DQorCQkJaWYgKChzdC0+c2lkX2hhbmRvdmVyX2RlYnQgPiAwKSAmJiAoc3QtPnNpZF91cGRhdGVfY291bnRlciA+IDIpKQ0KKwkJCXsNCisJCQkJLyogZW5zdXJlIGV4dHJhIHVwZGF0ZXMgYXJlICBwcm9wZXJseSBkZWxheWVkIGFmdGVyIGEgcG9zc2libGUgU0lEX0ZJUlNUICovDQorCQkJCWZyYW1lX3R5cGUgPSBUWF9TSURfVVBEQVRFOw0KKwkJCQlzdC0+c2lkX2hhbmRvdmVyX2RlYnQtLTsNCisJCQl9IGVsc2UNCisJCQl7DQorCQkJCWlmIChzdC0+c2lkX3VwZGF0ZV9jb3VudGVyID09IDApDQorCQkJCXsNCisJCQkJCWZyYW1lX3R5cGUgPSBUWF9TSURfVVBEQVRFOw0KKwkJCQkJc3QtPnNpZF91cGRhdGVfY291bnRlciA9IDg7DQorCQkJCX0gZWxzZQ0KKwkJCQl7DQorCQkJCQlmcmFtZV90eXBlID0gVFhfTk9fREFUQTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisJfSBlbHNlDQorCXsNCisJCXN0LT5zaWRfdXBkYXRlX2NvdW50ZXIgPSA4Ow0KKwkJZnJhbWVfdHlwZSA9IFRYX1NQRUVDSDsNCisJfQ0KKwlzdC0+cHJldl9mdCA9IGZyYW1lX3R5cGU7DQorDQorCWlmKGJpdHN0cmVhbWZvcm1hdCA9PSAwKQkJCQkvKiBkZWZhdWx0IGZpbGUgZm9ybWF0ICovDQorCXsNCisJCSooZGF0YU91dCkgPSBUWF9GUkFNRV9UWVBFOw0KKwkJKihkYXRhT3V0ICsgMSkgPSBmcmFtZV90eXBlOw0KKwkJKihkYXRhT3V0ICsgMikgPSBtb2RlOw0KKwkJZm9yIChpID0gMDsgaSA8IG5iX29mX2JpdHNbY29kaW5nX21vZGVdOyBpKyspDQorCQl7DQorCQkJKihkYXRhT3V0ICsgMyArIGkpID0gcHJtc1tpXTsNCisJCX0NCisJCXJldHVybiAgKDMgKyBuYl9vZl9iaXRzW2NvZGluZ19tb2RlXSk8PDE7DQorCX0gZWxzZQ0KKwl7DQorCQlpZiAoYml0c3RyZWFtZm9ybWF0ID09IDEpCQkvKiBJVFUgZmlsZSBmb3JtYXQgKi8NCisJCXsgIAkJCQkJCQ0KKwkJCSooZGF0YU91dCkgPSAweDZiMjE7DQorCQkJaWYoZnJhbWVfdHlwZSAhPSBUWF9OT19EQVRBICYmIGZyYW1lX3R5cGUgIT0gVFhfU0lEX0ZJUlNUKQ0KKwkJCXsNCisJCQkJKihkYXRhT3V0ICsgMSkgPSBuYl9vZl9iaXRzW2NvZGluZ19tb2RlXTsNCisJCQkJZm9yIChpID0gMDsgaSA8IG5iX29mX2JpdHNbY29kaW5nX21vZGVdOyBpKyspDQorCQkJCXsNCisJCQkJCWlmKHBybXNbaV0gPT0gQklUXzApew0KKwkJCQkJCSooZGF0YU91dCArIDIgKyBpKSA9IEJJVF8wX0lUVTsJIAkJCQ0KKwkJCQkJfQ0KKwkJCQkJZWxzZXsNCisJCQkJCQkqKGRhdGFPdXQgKyAyICsgaSkgPSBCSVRfMV9JVFU7DQorCQkJCQl9DQorCQkJCX0NCisJCQkJcmV0dXJuICgyICsgbmJfb2ZfYml0c1tjb2RpbmdfbW9kZV0pPDwxOyAgIA0KKwkJCX0gZWxzZQ0KKwkJCXsNCisJCQkJKihkYXRhT3V0ICsgMSkgPSAwOw0KKwkJCQlyZXR1cm4gMjw8MTsJICAgDQorCQkJfQ0KKwkJfSBlbHNlCQkJCQkJCS8qIE1JTUUvc3RvcmFnZSBmaWxlIGZvcm1hdCAqLw0KKwkJew0KKyNkZWZpbmUgTVJTSUQgOQ0KKwkJCS8qIGNoYW5nZSBtb2RlIGluZGV4IGluIGNhc2Ugb2YgU0lEIGZyYW1lICovDQorCQkJaWYgKGNvZGluZ19tb2RlID09IE1SRFRYKQ0KKwkJCXsNCisJCQkJY29kaW5nX21vZGUgPSBNUlNJRDsNCisJCQkJaWYgKGZyYW1lX3R5cGUgPT0gVFhfU0lEX0ZJUlNUKQ0KKwkJCQl7DQorCQkJCQlmb3IgKGkgPSAwOyBpIDwgTkJCSVRTX1NJRDsgaSsrKQlwcm1zW2ldID0gQklUXzA7DQorCQkJCX0NCisJCQl9DQorCQkJLyogLT4gZm9yY2UgTk9fREFUQSBmcmFtZSAqLw0KKwkJCWlmIChjb2RpbmdfbW9kZSA8IDAgfHwgY29kaW5nX21vZGUgPiAxNSB8fCAoY29kaW5nX21vZGUgPiBNUlNJRCAmJiBjb2RpbmdfbW9kZSA8IDE0KSkNCisJCQl7DQorCQkJCWNvZGluZ19tb2RlID0gMTU7DQorCQkJfQ0KKwkJCS8qIG1hcmsgZW1wdHkgZnJhbWVzIGJldHdlZW4gU0lEIHVwZGF0ZXMgYXMgTk9fREFUQSBmcmFtZXMgKi8NCisJCQlpZiAoY29kaW5nX21vZGUgPT0gTVJTSUQgJiYgZnJhbWVfdHlwZSA9PSBUWF9OT19EQVRBKQ0KKwkJCXsNCisJCQkJY29kaW5nX21vZGUgPSAxNTsNCisJCQl9DQorCQkJLyogc2V0IHBvaW50ZXIgZm9yIHBhY2tlZCBmcmFtZSwgbm90ZSB0aGF0IHdlIGhhbmRsZSBkYXRhIGFzIGJ5dGVzICovDQorCQkJc3RyZWFtX3B0ciA9IChVV29yZDgqKWRhdGFPdXQ7DQorCQkJLyogaW5zZXJ0IHRhYmxlIG9mIGNvbnRlbnRzIChUb0MpIGJ5dGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0ICovDQorCQkJKnN0cmVhbV9wdHIgPSB0b2NfYnl0ZVtjb2RpbmdfbW9kZV07DQorCQkJc3RyZWFtX3B0cisrOw0KKwkJCXRlbXAgPSAwOw0KKwkJCS8qIHNvcnQgYW5kIHBhY2sgQU1SLVdCIHNwZWVjaCBvciBTSUQgYml0cyAqLw0KKwkJCWZvciAoaSA9IDE7IGkgPCB1bnBhY2tlZF9zaXplW2NvZGluZ19tb2RlXSArIDE7IGkrKykNCisJCQl7DQorCQkJCWlmIChwcm1zW3NvcnRfcHRyW2NvZGluZ19tb2RlXVtpLTFdXSA9PSBCSVRfMSkNCisJCQkJew0KKwkJCQkJdGVtcCsrOw0KKwkJCQl9DQorCQkJCWlmIChpJjB4NykNCisJCQkJew0KKwkJCQkJdGVtcCA8PD0gMTsNCisJCQkJfQ0KKwkJCQllbHNlDQorCQkJCXsNCisJCQkJCSpzdHJlYW1fcHRyID0gdGVtcDsNCisJCQkJCXN0cmVhbV9wdHIrKzsNCisJCQkJCXRlbXAgPSAwOw0KKwkJCQl9DQorCQkJfQ0KKwkJCS8qIGluc2VydCBTSUQgdHlwZSBpbmRpY2F0aW9uIGFuZCBzcGVlY2ggbW9kZSBpbiBjYXNlIG9mIFNJRCBmcmFtZSAqLw0KKwkJCWlmIChjb2RpbmdfbW9kZSA9PSBNUlNJRCkNCisJCQl7DQorCQkJCWlmIChmcmFtZV90eXBlID09IFRYX1NJRF9VUERBVEUpDQorCQkJCXsNCisJCQkJCXRlbXArKzsNCisJCQkJfQ0KKwkJCQl0ZW1wIDw8PSA0Ow0KKwkJCQl0ZW1wICs9IG1vZGUgJiAweDAwMEY7DQorCQkJfQ0KKwkJCS8qIGluc2VydCB1bnVzZWQgYml0cyAoemVyb3MpIGF0IHRoZSB0YWlsIG9mIHRoZSBsYXN0IGJ5dGUgKi8NCisJCQlpZiAodW51c2VkX3NpemVbY29kaW5nX21vZGVdKQ0KKwkJCXsNCisJCQkJdGVtcCA8PD0gKHVudXNlZF9zaXplW2NvZGluZ19tb2RlXSAtIDEpOw0KKwkJCX0NCisJCQkqc3RyZWFtX3B0ciA9IHRlbXA7DQorCQkJLyogd3JpdGUgcGFja2VkIGZyYW1lIGludG8gZmlsZSAoMSBieXRlIGFkZGVkIHRvIGNvdmVyIFRvQyBlbnRyeSkgKi8NCisJCQlyZXR1cm4gKDEgKyBwYWNrZWRfc2l6ZVtjb2RpbmdfbW9kZV0pOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorKiBQYXJtX3NlcmlhbCAtPiBjb252ZXJ0IHBhcmFtZXRlcnMgdG8gc2VyaWFsIHN0cmVhbSAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQordm9pZCBQYXJtX3NlcmlhbCgNCisJCVdvcmQxNiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBwYXJhbWV0ZXIgdmFsdWUgKi8NCisJCVdvcmQxNiBub19vZl9iaXRzLCAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBudW1iZXIgb2YgYml0cyAgKi8NCisJCVdvcmQxNiAqKiBwcm1zDQorCQkpDQorew0KKwlXb3JkMTYgaSwgYml0Ow0KKwkqcHJtcyArPSBub19vZl9iaXRzOyAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgbm9fb2ZfYml0czsgaSsrKQ0KKwl7DQorCQliaXQgPSAoV29yZDE2KSAodmFsdWUgJiAweDAwMDEpOyAgICAvKiBnZXQgbHNiICovDQorCQlpZiAoYml0ID09IDApDQorCQkJKi0tKCpwcm1zKSA9IEJJVF8wOw0KKwkJZWxzZQ0KKwkJCSotLSgqcHJtcykgPSBCSVRfMTsNCisJCXZhbHVlID4+PSAxOyAgICAgICAgICANCisJfQ0KKwkqcHJtcyArPSBub19vZl9iaXRzOyAgICAgICAgICAgICAgICAgIA0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jMnQ2NGZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmYzRjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jCkBAIC0wLDAgKzEsMjk3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogYzJ0NjRmeC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJICAgRGVzY3JpcHRpb246UGVyZm9ybXMgYWxnZWJyYWljIGNvZGVib29rIHNlYXJjaCBmb3IgNi42MGtiaXRzIG1vZGUqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorDQorI2RlZmluZSBOQl9UUkFDSyAgMg0KKyNkZWZpbmUgU1RFUCAgICAgIDINCisjZGVmaW5lIE5CX1BPUyAgICAzMg0KKyNkZWZpbmUgTVNJWkUgICAgIDEwMjQNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICBBQ0VMUF8ydDY0X2Z4KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDEyIGJpdHMgYWxnZWJyYWljIGNvZGVib29rLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogMiB0cmFja3MgeCAzMiBwb3NpdGlvbnMgcGVyIHRyYWNrID0gNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDEyIGJpdHMgLS0+IDIgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBBbGwgcHVsc2VzIGNhbiBoYXZlIHR3byAoMikgcG9zc2libGUgYW1wbGl0dWRlczogKzEgb3IgLTEuICAgICAgICAgICAgICoNCisqIEVhY2ggcHVsc2UgY2FuIGhhdmUgMzIgcG9zc2libGUgcG9zaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgQUNFTFBfMnQ2NF9meCgNCisJCVdvcmQxNiBkbltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDwxMmIgOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCB4W10gYW5kIEhbXSAgICAgICovDQorCQlXb3JkMTYgY25bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogcmVzaWR1YWwgYWZ0ZXIgbG9uZyB0ZXJtIHByZWRpY3Rpb24gICAgICAgICAqLw0KKwkJV29yZDE2IEhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8NCisJCVdvcmQxNiBjb2RlW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFE5IDogYWxnZWJyYWljIChmaXhlZCkgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGZpbHRlcmVkIGZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgOiBpbmRleCAoMTIpOiA1KzErNSsxID0gMTEgYml0cy4gICAgICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLCBqLCBrLCBpMCwgaTEsIGl4LCBpeSwgcG9zLCBwb3MyOw0KKwlXb3JkMTYgcHMsIHBzaywgcHMxLCBwczIsIGFscGssIGFscDEsIGFscDIsIHNxOw0KKwlXb3JkMTYgYWxwLCB2YWwsIGV4cCwga19jbiwga19kbjsNCisJV29yZDE2ICpwMCwgKnAxLCAqcDIsICpwc2lnbjsNCisJV29yZDE2ICpoLCAqaF9pbnYsICpwdHJfaDEsICpwdHJfaDIsICpwdHJfaGY7DQorDQorCVdvcmQxNiBzaWduW0xfU1VCRlJdLCB2ZWNbTF9TVUJGUl0sIGRuMltMX1NVQkZSXTsNCisJV29yZDE2IGhfYnVmWzQgKiBMX1NVQkZSXSA9IHswfTsNCisJV29yZDE2IHJyaXhpeFtOQl9UUkFDS11bTkJfUE9TXTsNCisJV29yZDE2IHJyaXhpeVtNU0laRV07DQorCVdvcmQzMiBzLCBjb3I7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogRmluZCBzaWduIGZvciBlYWNoIHB1bHNlIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlhbHAgPSA4MTkyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscCA9IDIuMCAoUTEyKSAqLw0KKw0KKwkvKiBjYWxjdWxhdGUgZW5lcmd5IGZvciBub3JtYWxpemF0aW9uIG9mIGNuW10gYW5kIGRuW10gKi8NCisJLyogc2V0IGtfY24gPSAzMi4uMzI3NjcgKGVuZXJfY24gPSAyXjMwLi4yNTYtMCkgKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwlzID0gRG90X3Byb2R1Y3QxMl9hc20oY24sIGNuLCBMX1NVQkZSLCAmZXhwKTsNCisjZWxzZQ0KKwlzID0gRG90X3Byb2R1Y3QxMihjbiwgY24sIExfU1VCRlIsICZleHApOw0KKyNlbmRpZg0KKw0KKwlJc3FydF9uKCZzLCAmZXhwKTsNCisJcyA9IExfc2hsKHMsIGFkZDEoZXhwLCA1KSk7ICAgICAgICAgICAgIA0KKwlrX2NuID0gdm9fcm91bmQocyk7DQorDQorCS8qIHNldCBrX2RuID0gMzIuLjUxMiAoZW5lcl9kbiA9IDJeMzAuLjJeMjIpICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwlzID0gRG90X3Byb2R1Y3QxMl9hc20oZG4sIGRuLCBMX1NVQkZSLCAmZXhwKTsNCisjZWxzZQ0KKwlzID0gRG90X3Byb2R1Y3QxMihkbiwgZG4sIExfU1VCRlIsICZleHApOw0KKyNlbmRpZg0KKw0KKwlJc3FydF9uKCZzLCAmZXhwKTsNCisJa19kbiA9IHZvX3JvdW5kKExfc2hsKHMsIChleHAgKyA4KSkpOyAgICAvKiBrX2RuID0gMjU2Li40MDk2ICovDQorCWtfZG4gPSB2b19tdWx0X3IoYWxwLCBrX2RuKTsgICAgICAgICAgICAgIC8qIGFscCBpbiBRMTIgKi8NCisNCisJLyogbWl4IG5vcm1hbGl6ZWQgY25bXSBhbmQgZG5bXSAqLw0KKwlwMCA9IGNuOw0KKwlwMSA9IGRuOw0KKwlwMiA9IGRuMjsNCisNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlIvNDsgaSsrKQ0KKwl7DQorCQlzID0gKGtfY24qICgqcDArKykpKyhrX2RuICogKCpwMSsrKSk7DQorCQkqcDIrKyA9IHMgPj4gNzsNCisJCXMgPSAoa19jbiogKCpwMCsrKSkrKGtfZG4gKiAoKnAxKyspKTsNCisJCSpwMisrID0gcyA+PiA3Ow0KKwkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOw0KKwkJKnAyKysgPSBzID4+IDc7DQorCQlzID0gKGtfY24qICgqcDArKykpKyhrX2RuICogKCpwMSsrKSk7DQorCQkqcDIrKyA9IHMgPj4gNzsgDQorCX0NCisNCisJLyogc2V0IHNpZ24gYWNjb3JkaW5nIHRvIGRuMltdID0ga19jbipjbltdICsga19kbipkbltdICAgICovDQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpICsrKQ0KKwl7DQorCQl2YWwgPSBkbltpXTsgICAgICAgICAgICAgICAgICAgDQorCQlwcyA9IGRuMltpXTsgICAgICAgICAgICAgICAgICAgDQorCQlpZiAocHMgPj0gMCkNCisJCXsNCisJCQlzaWduW2ldID0gMzI3Njc7ICAgICAgICAgICAgIC8qIHNpZ24gPSArMSAoUTEyKSAqLw0KKwkJCXZlY1tpXSA9IC0zMjc2ODsgICAgICAgICAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJc2lnbltpXSA9IC0zMjc2ODsgICAgICAgICAgICAvKiBzaWduID0gLTEgKFExMikgKi8NCisJCQl2ZWNbaV0gPSAzMjc2NzsgICAgICAgICAgICANCisJCQlkbltpXSA9IC12YWw7DQorCQl9DQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIENvbXB1dGUgaF9pbnZbaV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCS8qIGltcHVsc2UgcmVzcG9uc2UgYnVmZmVyIGZvciBmYXN0IGNvbXB1dGF0aW9uICovDQorCWggPSBoX2J1ZiArIExfU1VCRlI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaF9pbnYgPSBoICsgKExfU1VCRlI8PDEpOyAgICAgICAgIA0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwl7DQorCQloW2ldID0gSFtpXTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJaF9pbnZbaV0gPSB2b19uZWdhdGUoaFtpXSk7ICAgICAgICAgICANCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogQ29tcHV0ZSBycml4aXhbXVtdIG5lZWRlZCBmb3IgdGhlIGNvZGVib29rIHNlYXJjaC4gICAgICAgICAqDQorCSAqIFJlc3VsdCBpcyBtdWx0aXBsaWVkIGJ5IDAuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCS8qIEluaXQgcG9pbnRlcnMgdG8gbGFzdCBwb3NpdGlvbiBvZiBycml4aXhbXSAqLw0KKwlwMCA9ICZycml4aXhbMF1bTkJfUE9TIC0gMV07ICAgICAgICAgICANCisJcDEgPSAmcnJpeGl4WzFdW05CX1BPUyAtIDFdOyAgICAgICAgICAgDQorDQorCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljb3IgPSAweDAwMDEwMDAwTDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciByb3VuZGluZyAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgTkJfUE9TOyBpKyspDQorCXsNCisJCWNvciArPSAoKCpwdHJfaDEpICogKCpwdHJfaDEpIDw8IDEpOw0KKwkJcHRyX2gxKys7DQorCQkqcDEtLSA9IChleHRyYWN0X2goY29yKSA+PiAxKTsgICAgICAgICAgICANCisJCWNvciArPSAoKCpwdHJfaDEpICogKCpwdHJfaDEpIDw8IDEpOw0KKwkJcHRyX2gxKys7DQorCQkqcDAtLSA9IChleHRyYWN0X2goY29yKSA+PiAxKTsgICAgICAgICAgICANCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogQ29tcHV0ZSBycml4aXlbXVtdIG5lZWRlZCBmb3IgdGhlIGNvZGVib29rIHNlYXJjaC4gICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJcG9zID0gTVNJWkUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgDQorCXBvczIgPSBNU0laRSAtIDI7ICAgICAgICAgICAgICAgICAgICAgIA0KKwlwdHJfaGYgPSBoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IE5CX1BPUzsgaysrKQ0KKwl7DQorCQlwMSA9ICZycml4aXlbcG9zXTsgICAgICAgICAgICAgICAgIA0KKwkJcDAgPSAmcnJpeGl5W3BvczJdOyAgICAgICAgICAgICAgICANCisJCWNvciA9IDB4MDAwMDgwMDBMOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciByb3VuZGluZyAqLw0KKwkJcHRyX2gxID0gaDsgICAgICAgICAgICAgICAgICAgICAgICANCisJCXB0cl9oMiA9IHB0cl9oZjsgICAgICAgICAgICAgICAgICAgDQorDQorCQlmb3IgKGkgPSAoayArIDEpOyBpIDwgTkJfUE9TOyBpKyspDQorCQl7DQorCQkJY29yICs9ICgoKnB0cl9oMSkgKiAoKnB0cl9oMikpPDwxOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICANCisJCQljb3IgKz0gKCgqcHRyX2gxKSAqICgqcHRyX2gyKSk8PDE7DQorCQkJcHRyX2gxKys7DQorCQkJcHRyX2gyKys7DQorCQkJKnAwID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgDQorDQorCQkJcDEgLT0gKE5CX1BPUyArIDEpOw0KKwkJCXAwIC09IChOQl9QT1MgKyAxKTsNCisJCX0NCisJCWNvciArPSAoKCpwdHJfaDEpICogKCpwdHJfaDIpKTw8MTsNCisJCXB0cl9oMSsrOw0KKwkJcHRyX2gyKys7DQorCQkqcDEgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICAgIA0KKw0KKwkJcG9zIC09IE5CX1BPUzsNCisJCXBvczItLTsNCisJCXB0cl9oZiArPSBTVEVQOw0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBNb2RpZmljYXRpb24gb2YgcnJpeGl5W11bXSB0byB0YWtlIHNpZ25zIGludG8gYWNjb3VudC4gICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlwMCA9IHJyaXhpeTsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSArPSBTVEVQKQ0KKwl7DQorCQlwc2lnbiA9IHNpZ247ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJaWYgKHBzaWduW2ldIDwgMCkNCisJCXsNCisJCQlwc2lnbiA9IHZlYzsgICAgICAgICAgICAgICAgICAgDQorCQl9DQorCQlmb3IgKGogPSAxOyBqIDwgTF9TVUJGUjsgaiArPSBTVEVQKQ0KKwkJew0KKwkJCSpwMCA9IHZvX211bHQoKnAwLCBwc2lnbltqXSk7ICAgICANCisJCQlwMCsrOw0KKwkJfQ0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogc2VhcmNoIDIgcHVsc2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiB+QH5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIDMyIHBvcyB4IDMyIHBvcyA9IDEwMjQgdGVzdHMgKGFsbCBjb21iaW5haXNvbnMgaXMgdGVzdGVkKSAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJcDAgPSBycml4aXhbMF07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCXAxID0gcnJpeGl4WzFdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlwMiA9IHJyaXhpeTsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlwc2sgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJYWxwayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWl4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlpeSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChpMCA9IDA7IGkwIDwgTF9TVUJGUjsgaTAgKz0gU1RFUCkNCisJew0KKwkJcHMxID0gZG5baTBdOyAgICAgICAgICAgICAgICAgICAgICANCisJCWFscDEgPSAoKnAwKyspOyAgICAgICAgICAgICAgICAgICAgDQorCQlwb3MgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChpMSA9IDE7IGkxIDwgTF9TVUJGUjsgaTEgKz0gU1RFUCkNCisJCXsNCisJCQlwczIgPSBhZGQxKHBzMSwgZG5baTFdKTsNCisJCQlhbHAyID0gYWRkMShhbHAxLCBhZGQxKCpwMSsrLCAqcDIrKykpOw0KKwkJCXNxID0gdm9fbXVsdChwczIsIHBzMik7DQorCQkJcyA9IHZvX0xfbXVsdChhbHBrLCBzcSkgLSAoKHBzayAqIGFscDIpPDwxKTsNCisJCQlpZiAocyA+IDApDQorCQkJew0KKwkJCQlwc2sgPSBzcTsgICAgICAgICAgICAgICAgICANCisJCQkJYWxwayA9IGFscDI7ICAgICAgICAgICAgICAgDQorCQkJCXBvcyA9IGkxOyAgICAgICAgICAgICAgICAgIA0KKwkJCX0NCisJCX0NCisJCXAxIC09IE5CX1BPUzsNCisJCWlmIChwb3MgPj0gMCkNCisJCXsNCisJCQlpeCA9IGkwOyAgICAgICAgICAgICAgICAgICAgICANCisJCQlpeSA9IHBvczsgICAgICAgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBCdWlsZCB0aGUgY29kZXdvcmQsIHRoZSBmaWx0ZXJlZCBjb2Rld29yZCBhbmQgaW5kZXggb2YgY29kZXZlY3Rvci4qDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCXsNCisJCWNvZGVbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisNCisJaTAgPSAoaXggPj4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3Mgb2YgcHVsc2UgMSAoMC4uMzEpICovDQorCWkxID0gKGl5ID4+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zIG9mIHB1bHNlIDIgKDAuLjMxKSAqLw0KKwlpZiAoc2lnbltpeF0gPiAwKQ0KKwl7DQorCQljb2RlW2l4XSA9IDUxMjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2Rld29yZCBpbiBROSBmb3JtYXQgKi8NCisJCXAwID0gaCAtIGl4OyAgICAgICAgICAgICAgICAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQljb2RlW2l4XSA9IC01MTI7ICAgICAgICAgICAgICAgICAgIA0KKwkJaTAgKz0gTkJfUE9TOyAgICAgICAgICAgICAgICAgICAgICANCisJCXAwID0gaF9pbnYgLSBpeDsgICAgICAgICAgICAgICAgICAgDQorCX0NCisJaWYgKHNpZ25baXldID4gMCkNCisJew0KKwkJY29kZVtpeV0gPSA1MTI7ICAgICAgICAgICAgICAgICAgICANCisJCXAxID0gaCAtIGl5OyAgICAgICAgICAgICAgICAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQljb2RlW2l5XSA9IC01MTI7ICAgICAgICAgICAgICAgICAgIA0KKwkJaTEgKz0gTkJfUE9TOyAgICAgICAgICAgICAgICAgICAgICANCisJCXAxID0gaF9pbnYgLSBpeTsgICAgICAgICAgICAgICAgICAgDQorCX0NCisJKmluZGV4ID0gYWRkMSgoaTAgPDwgNiksIGkxKTsgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCXsNCisJCXlbaV0gPSB2b19zaHJfcihhZGQxKCgqcDArKyksICgqcDErKykpLCAzKTsNCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jNHQ2NGZ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiYTk1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jCkBAIC0wLDAgKzEsMTA0MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogYzR0NjRmeC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOlBlcmZvcm1zIGFsZ2VicmFpYyBjb2RlYm9vayBzZWFyY2ggZm9yIGhpZ2hlciBtb2RlcyAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiBBQ0VMUF80dDY0X2Z4KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogMjAsIDM2LCA0NCwgNTIsIDY0LCA3MiwgODggYml0cyBhbGdlYnJhaWMgY29kZWJvb2suICAgICAgICAgICAgICAgICAgICoNCisqIDQgdHJhY2tzIHggMTYgcG9zaXRpb25zIHBlciB0cmFjayA9IDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogMjAgYml0cyAtLT4gNCBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIDM2IGJpdHMgLS0+IDggcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICAqDQorKiA0NCBiaXRzIC0tPiAxMCBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogNTIgYml0cyAtLT4gMTIgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICoNCisqIDY0IGJpdHMgLS0+IDE2IHB1bHNlcyBpbiBhIGZyYW1lIG9mIDY0IHNhbXBsZXMuICAgICAgICAgICAgICAgICAgICAgICAqDQorKiA3MiBiaXRzIC0tPiAxOCBwdWxzZXMgaW4gYSBmcmFtZSBvZiA2NCBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogODggYml0cyAtLT4gMjQgcHVsc2VzIGluIGEgZnJhbWUgb2YgNjQgc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBBbGwgcHVsc2VzIGNhbiBoYXZlIHR3byAoMikgcG9zc2libGUgYW1wbGl0dWRlczogKzEgb3IgLTEuICAgICAgICAgICAgKg0KKyogRWFjaCBwdWxzZSBjYW4gaGF2ZSBzaXh0ZWVuICgxNikgcG9zc2libGUgcG9zaXRpb25zLiAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KKyNpbmNsdWRlICJxX3B1bHNlLmgiDQorDQorc3RhdGljIFdvcmQxNiB0aXBvc1szNl0gPSB7DQorCTAsIDEsIDIsIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIHBvaW50ICZpcG9zWzBdLCAxc3QgaXRlciAqLw0KKwkxLCAyLCAzLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBwb2ludCAmaXBvc1s0XSwgMm5kIGl0ZXIgKi8NCisJMiwgMywgMCwgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgcG9pbnQgJmlwb3NbOF0sIDNyZCBpdGVyICovDQorCTMsIDAsIDEsIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIHBvaW50ICZpcG9zWzEyXSwgNHRoIGl0ZXIgKi8NCisJMCwgMSwgMiwgMywNCisJMSwgMiwgMywgMCwNCisJMiwgMywgMCwgMSwNCisJMywgMCwgMSwgMiwNCisJMCwgMSwgMiwgM307ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHBvaW50IGZvciAyNCBwdWxzZXMgJmlwb3NbMzVdLCA0dGggaXRlciAqLw0KKw0KKyNkZWZpbmUgTkJfUFVMU0VfTUFYICAyNA0KKw0KKyNkZWZpbmUgTF9TVUJGUiAgIDY0DQorI2RlZmluZSBOQl9UUkFDSyAgNA0KKyNkZWZpbmUgU1RFUCAgICAgIDQNCisjZGVmaW5lIE5CX1BPUyAgICAxNg0KKyNkZWZpbmUgTVNJWkUgICAgIDI1Ng0KKyNkZWZpbmUgTkJfTUFYICAgIDgNCisjZGVmaW5lIE5QTUFYUFQgICAoKE5CX1BVTFNFX01BWCtOQl9UUkFDSy0xKS9OQl9UUkFDSykNCisNCisvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLw0KK3ZvaWQgY29yX2hfdmVjXzAxMigNCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHZlY1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIHZlY3RvciAoLzgpIHRvIGNvcnJlbGF0ZSB3aXRoIGhbXSAqLw0KKwkJV29yZDE2IHRyYWNrLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2lnbltdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzaWduIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBycml4aXhbXVtOQl9QT1NdLCAgICAgICAgICAgICAgLyogKGkpIGNvcnJlbGF0aW9uIG9mIGhbeF0gd2l0aCBoW3hdICAgICAgKi8NCisJCVdvcmQxNiBjb3JfMVtdLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJV29yZDE2IGNvcl8yW10gICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorCQkpOw0KKw0KK3ZvaWQgY29yX2hfdmVjXzAxMl9hc20oDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB2ZWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCB2ZWN0b3IgKC84KSB0byBjb3JyZWxhdGUgd2l0aCBoW10gKi8NCisJCVdvcmQxNiB0cmFjaywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHRyYWNrIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNpZ25bXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2lnbiB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcnJpeGl4W11bTkJfUE9TXSwgICAgICAgICAgICAgIC8qIChpKSBjb3JyZWxhdGlvbiBvZiBoW3hdIHdpdGggaFt4XSAgICAgICovDQorCQlXb3JkMTYgY29yXzFbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCisJCVdvcmQxNiBjb3JfMltdICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJKTsNCisNCit2b2lkIGNvcl9oX3ZlY18zMCgNCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHZlY1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIHZlY3RvciAoLzgpIHRvIGNvcnJlbGF0ZSB3aXRoIGhbXSAqLw0KKwkJV29yZDE2IHRyYWNrLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2lnbltdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzaWduIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBycml4aXhbXVtOQl9QT1NdLCAgICAgICAgICAgICAgLyogKGkpIGNvcnJlbGF0aW9uIG9mIGhbeF0gd2l0aCBoW3hdICAgICAgKi8NCisJCVdvcmQxNiBjb3JfMVtdLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJV29yZDE2IGNvcl8yW10gICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorCQkpOw0KKw0KK3ZvaWQgc2VhcmNoX2l4aXkoDQorCQlXb3JkMTYgbmJfcG9zX2l4LCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBuYiBvZiBwb3MgZm9yIHB1bHNlIDEgKDEuLjgpICAgICAgICovDQorCQlXb3JkMTYgdHJhY2tfeCwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayBvZiBwdWxzZSAxICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgdHJhY2tfeSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayBvZiBwdWxzZSAyICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBwcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIGNvcnJlbGF0aW9uIG9mIGFsbCBmaXhlZCBwdWxzZXMgICovDQorCQlXb3JkMTYgKiBhbHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIGVuZXJneSBvZiBhbGwgZml4ZWQgcHVsc2VzICAgICAgICovDQorCQlXb3JkMTYgKiBpeCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBwb3NpdGlvbiBvZiBwdWxzZSAxICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpeSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBwb3NpdGlvbiBvZiBwdWxzZSAyICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBiZXR3ZWVuIHRhcmdldCBhbmQgaFtdICAgICAgICovDQorCQlXb3JkMTYgZG4yW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB2ZWN0b3Igb2Ygc2VsZWN0ZWQgcG9zaXRpb25zICAgICAgICovDQorCQlXb3JkMTYgY29yX3hbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBvZiBwdWxzZSAxIHdpdGggZml4ZWQgcHVsc2VzICovDQorCQlXb3JkMTYgY29yX3lbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBvZiBwdWxzZSAyIHdpdGggZml4ZWQgcHVsc2VzICovDQorCQlXb3JkMTYgcnJpeGl5W11bTVNJWkVdICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBvZiBwdWxzZSAxIHdpdGggcHVsc2UgMiAgICovDQorCQkpOw0KKw0KKw0KK3ZvaWQgQUNFTFBfNHQ2NF9meCgNCisJCVdvcmQxNiBkbltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDwxMmIgOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCB4W10gYW5kIEhbXSAgICAgICovDQorCQlXb3JkMTYgY25bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSA8MTJiIDogcmVzaWR1YWwgYWZ0ZXIgbG9uZyB0ZXJtIHByZWRpY3Rpb24gICAgICAgICAqLw0KKwkJV29yZDE2IEhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTEyOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8NCisJCVdvcmQxNiBjb2RlW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFE5IDogYWxnZWJyYWljIChmaXhlZCkgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBROSA6IGZpbHRlcmVkIGZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAgICAqLw0KKwkJV29yZDE2IG5iYml0cywgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgOiAyMCwgMzYsIDQ0LCA1MiwgNjQsIDcyIG9yIDg4IGJpdHMgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBzZXJfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIDogYml0IHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgX2luZGV4W10gICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSA6IGluZGV4ICgyMCk6IDUrNSs1KzUgPSAyMCBiaXRzLiAgICAgICAgICAgICAgICAgICAqLw0KKwkJLyogKG8pIDogaW5kZXggKDM2KTogOSs5KzkrOSA9IDM2IGJpdHMuICAgICAgICAgICAgICAgICAgICovDQorCQkvKiAobykgOiBpbmRleCAoNDQpOiAxMys5KzEzKzkgPSA0NCBiaXRzLiAgICAgICAgICAgICAgICAgKi8NCisJCS8qIChvKSA6IGluZGV4ICg1Mik6IDEzKzEzKzEzKzEzID0gNTIgYml0cy4gICAgICAgICAgICAgICAqLw0KKwkJLyogKG8pIDogaW5kZXggKDY0KTogMisyKzIrMisxNCsxNCsxNCsxNCA9IDY0IGJpdHMuICAgICAgICovDQorCQkvKiAobykgOiBpbmRleCAoNzIpOiAxMCsyKzEwKzIrMTArMTQrMTArMTQgPSA3MiBiaXRzLiAgICAgKi8NCisJCS8qIChvKSA6IGluZGV4ICg4OCk6IDExKzExKzExKzExKzExKzExKzExKzExID0gODggYml0cy4gICAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGksIGosIGs7DQorCVdvcmQxNiBzdCwgaXgsIGl5LCBwb3MsIGluZGV4LCB0cmFjaywgbmJfcHVsc2UsIG5iaXRlciwgal90ZW1wOw0KKwlXb3JkMTYgcHNrLCBwcywgYWxwaywgYWxwLCB2YWwsIGtfY24sIGtfZG4sIGV4cDsNCisJV29yZDE2ICpwMCwgKnAxLCAqcDIsICpwMywgKnBzaWduOw0KKwlXb3JkMTYgKmgsICpoX2ludiwgKnB0cl9oMSwgKnB0cl9oMiwgKnB0cl9oZiwgaF9zaGlmdDsNCisJV29yZDMyIHMsIGNvciwgTF90bXAsIExfaW5kZXg7DQorCVdvcmQxNiBkbjJbTF9TVUJGUl0sIHNpZ25bTF9TVUJGUl0sIHZlY1tMX1NVQkZSXTsNCisJV29yZDE2IGluZFtOUE1BWFBUICogTkJfVFJBQ0tdOw0KKwlXb3JkMTYgY29kdmVjW05CX1BVTFNFX01BWF0sIG5icG9zWzEwXTsNCisJV29yZDE2IGNvcl94W05CX1BPU10sIGNvcl95W05CX1BPU10sIHBvc19tYXhbTkJfVFJBQ0tdOw0KKwlXb3JkMTYgaF9idWZbNCAqIExfU1VCRlJdOw0KKwlXb3JkMTYgcnJpeGl4W05CX1RSQUNLXVtOQl9QT1NdLCBycml4aXlbTkJfVFJBQ0tdW01TSVpFXTsNCisJV29yZDE2IGlwb3NbTkJfUFVMU0VfTUFYXTsNCisNCisJc3dpdGNoIChuYmJpdHMpDQorCXsNCisJCWNhc2UgMjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwIGJpdHMsIDQgcHVsc2VzLCA0IHRyYWNrcyAqLw0KKwkJCW5iaXRlciA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0eDE2eDE2PTEwMjQgbG9vcCAqLw0KKwkJCWFscCA9IDgxOTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAyLjAgKFExMikgKi8NCisJCQluYl9wdWxzZSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMV0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQlicmVhazsNCisJCWNhc2UgMzY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDM2IGJpdHMsIDggcHVsc2VzLCA0IHRyYWNrcyAqLw0KKwkJCW5iaXRlciA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0eDIweDE2PTEyODAgbG9vcCAqLw0KKwkJCWFscCA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAxLjAgKFExMikgKi8NCisJCQluYl9wdWxzZSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMV0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1syXSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWJyZWFrOw0KKwkJY2FzZSA0NDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDQgYml0cywgMTAgcHVsc2VzLCA0IHRyYWNrcyAqLw0KKwkJCW5iaXRlciA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0eDI2eDE2PTE2NjQgbG9vcCAqLw0KKwkJCWFscCA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAxLjAgKFExMikgKi8NCisJCQluYl9wdWxzZSA9IDEwOyAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzBdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMV0gPSA2OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1syXSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzNdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYnJlYWs7DQorCQljYXNlIDUyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1MiBiaXRzLCAxMiBwdWxzZXMsIDQgdHJhY2tzICovDQorCQkJbmJpdGVyID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDR4MjZ4MTY9MTY2NCBsb29wICovDQorCQkJYWxwID0gNDA5NjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscCA9IDEuMCAoUTEyKSAqLw0KKwkJCW5iX3B1bHNlID0gMTI7ICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMF0gPSA0OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1sxXSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzJdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbM10gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQlicmVhazsNCisJCWNhc2UgNjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDY0IGJpdHMsIDE2IHB1bHNlcywgNCB0cmFja3MgKi8NCisJCQluYml0ZXIgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogM3gzNngxNj0xNzI4IGxvb3AgKi8NCisJCQlhbHAgPSAzMjc3OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMC44IChRMTIpICovDQorCQkJbmJfcHVsc2UgPSAxNjsgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1swXSA9IDQ7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzFdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMl0gPSA2OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1szXSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzRdID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbNV0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQlicmVhazsNCisJCWNhc2UgNzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDcyIGJpdHMsIDE4IHB1bHNlcywgNCB0cmFja3MgKi8NCisJCQluYml0ZXIgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogM3gzNXgxNj0xNjgwIGxvb3AgKi8NCisJCQlhbHAgPSAzMDcyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxwID0gMC43NSAoUTEyKSAqLw0KKwkJCW5iX3B1bHNlID0gMTg7ICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMF0gPSAyOyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1sxXSA9IDM7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzJdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbM10gPSA1OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s0XSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzVdID0gNzsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbNl0gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQlicmVhazsNCisJCWNhc2UgODg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDg4IGJpdHMsIDI0IHB1bHNlcywgNCB0cmFja3MgKi8NCisJCQlpZihzZXJfc2l6ZSA+IDQ2MikNCisJCQkJbmJpdGVyID0gMTsNCisJCQllbHNlDQorCQkJCW5iaXRlciA9IDI7ICAgICAgICAgICAgICAgICAgICAvKiAyeDUzeDE2PTE2OTYgbG9vcCAqLw0KKw0KKwkJCWFscCA9IDIwNDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHAgPSAwLjUgKFExMikgKi8NCisJCQluYl9wdWxzZSA9IDI0OyAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzBdID0gMjsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbMV0gPSAyOyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1syXSA9IDM7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzNdID0gNDsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbNF0gPSA1OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s1XSA9IDY7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzZdID0gNzsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJbmJwb3NbN10gPSA4OyAgICAgICAgICAgICAgICAgICAgICANCisJCQluYnBvc1s4XSA9IDg7ICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCW5icG9zWzldID0gODsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYnJlYWs7DQorCQlkZWZhdWx0Og0KKwkJCW5iaXRlciA9IDA7DQorCQkJYWxwID0gMDsNCisJCQluYl9wdWxzZSA9IDA7DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IG5iX3B1bHNlOyBpKyspDQorCXsNCisJCWNvZHZlY1tpXSA9IGk7ICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBGaW5kIHNpZ24gZm9yIGVhY2ggcHVsc2UgcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCS8qIGNhbGN1bGF0ZSBlbmVyZ3kgZm9yIG5vcm1hbGl6YXRpb24gb2YgY25bXSBhbmQgZG5bXSAqLw0KKwkvKiBzZXQga19jbiA9IDMyLi4zMjc2NyAoZW5lcl9jbiA9IDJeMzAuLjI1Ni0wKSAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJcyA9IERvdF9wcm9kdWN0MTJfYXNtKGNuLCBjbiwgTF9TVUJGUiwgJmV4cCk7DQorI2Vsc2UNCisJcyA9IERvdF9wcm9kdWN0MTIoY24sIGNuLCBMX1NVQkZSLCAmZXhwKTsNCisjZW5kaWYNCisNCisJSXNxcnRfbigmcywgJmV4cCk7DQorCXMgPSBMX3NobChzLCAoZXhwICsgNSkpOyANCisJa19jbiA9IGV4dHJhY3RfaChMX2FkZChzLCAweDgwMDApKTsNCisNCisJLyogc2V0IGtfZG4gPSAzMi4uNTEyIChlbmVyX2RuID0gMl4zMC4uMl4yMikgKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwlzID0gRG90X3Byb2R1Y3QxMl9hc20oZG4sIGRuLCBMX1NVQkZSLCAmZXhwKTsNCisjZWxzZQ0KKwlzID0gRG90X3Byb2R1Y3QxMihkbiwgZG4sIExfU1VCRlIsICZleHApOw0KKyNlbmRpZg0KKw0KKwlJc3FydF9uKCZzLCAmZXhwKTsNCisJa19kbiA9IChMX3NobChzLCAoZXhwICsgNSArIDMpKSArIDB4ODAwMCkgPj4gMTY7ICAgIC8qIGtfZG4gPSAyNTYuLjQwOTYgKi8NCisJa19kbiA9IHZvX211bHRfcihhbHAsIGtfZG4pOyAgICAgICAgICAgICAgLyogYWxwIGluIFExMiAqLw0KKw0KKwkvKiBtaXggbm9ybWFsaXplZCBjbltdIGFuZCBkbltdICovDQorCXAwID0gY247DQorCXAxID0gZG47DQorCXAyID0gZG4yOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUi80OyBpKyspDQorCXsNCisJCXMgPSAoa19jbiogKCpwMCsrKSkrKGtfZG4gKiAoKnAxKyspKTsNCisJCSpwMisrID0gcyA+PiA3Ow0KKwkJcyA9IChrX2NuKiAoKnAwKyspKSsoa19kbiAqICgqcDErKykpOw0KKwkJKnAyKysgPSBzID4+IDc7DQorCQlzID0gKGtfY24qICgqcDArKykpKyhrX2RuICogKCpwMSsrKSk7DQorCQkqcDIrKyA9IHMgPj4gNzsNCisJCXMgPSAoa19jbiogKCpwMCsrKSkrKGtfZG4gKiAoKnAxKyspKTsNCisJCSpwMisrID0gcyA+PiA3OyANCisJfQ0KKw0KKwkvKiBzZXQgc2lnbiBhY2NvcmRpbmcgdG8gZG4yW10gPSBrX2NuKmNuW10gKyBrX2RuKmRuW10gICAgKi8NCisJZm9yKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwl7DQorCQl2YWwgPSBkbltpXTsgICAgICAgICAgICAgICAgICAgDQorCQlwcyA9IGRuMltpXTsgICAgICAgICAgICAgICAgICAgDQorCQlpZiAocHMgPj0gMCkNCisJCXsNCisJCQlzaWduW2ldID0gMzI3Njc7ICAgICAgICAgICAgIC8qIHNpZ24gPSArMSAoUTEyKSAqLw0KKwkJCXZlY1tpXSA9IC0zMjc2ODsgICAgICAgICAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJc2lnbltpXSA9IC0zMjc2ODsgICAgICAgICAgICAvKiBzaWduID0gLTEgKFExMikgKi8NCisJCQl2ZWNbaV0gPSAzMjc2NzsgICAgICAgICAgICANCisJCQlkbltpXSA9IC12YWw7DQorCQkJZG4yW2ldID0gLXBzOw0KKwkJfQ0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogU2VsZWN0IE5CX01BWCBwb3NpdGlvbiBwZXIgdHJhY2sgYWNjb3JkaW5nIHRvIG1heCBvZiBkbjJbXS4gICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlwb3MgPSAwOw0KKwlmb3IgKGkgPSAwOyBpIDwgTkJfVFJBQ0s7IGkrKykNCisJew0KKwkJZm9yIChrID0gMDsgayA8IE5CX01BWDsgaysrKQ0KKwkJew0KKwkJCXBzID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICANCisJCQlmb3IgKGogPSBpOyBqIDwgTF9TVUJGUjsgaiArPSBTVEVQKQ0KKwkJCXsNCisJCQkJaWYoZG4yW2pdID4gcHMpDQorCQkJCXsNCisJCQkJCXBzID0gZG4yW2pdOyAgICAgICAgICANCisJCQkJCXBvcyA9IGo7ICAgICAgICAgICAgICAgDQorCQkJCX0NCisJCQl9DQorCQkJZG4yW3Bvc10gPSAoayAtIE5CX01BWCk7ICAgICAvKiBkbjIgPCAwIHdoZW4gcG9zaXRpb24gaXMgc2VsZWN0ZWQgKi8NCisJCQlpZiAoayA9PSAwKQ0KKwkJCXsNCisJCQkJcG9zX21heFtpXSA9IHBvczsgICAgICAgICAgDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIFNjYWxlIGhbXSB0byBhdm9pZCBvdmVyZmxvdyBhbmQgdG8gZ2V0IG1heGltdW0gb2YgcHJlY2lzaW9uICAqDQorCSAqIG9uIGNvcnJlbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIE1heGltdW0gb2YgaFtdIChoWzBdKSBpcyBmaXhlZCB0byAyMDQ4IChNQVgxNiAvIDE2KS4gICAgICAgICAqDQorCSAqICA9PT4gVGhpcyBhbGxvdyBhZGRpdGlvbiBvZiAxNiBwdWxzZXMgd2l0aG91dCBzYXR1cmF0aW9uLiAgICAqDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIEVuZXJneSB3b3JzdCBjYXNlIChvbiByZXNvbmFudCBpbXB1bHNlIHJlc3BvbnNlKSwgICAgICAgICAgICAqDQorCSAqIC0gZW5lcmd5IG9mIGhbXSBpcyBhcHByb3hpbWF0ZWx5IE1BWC8xNi4gICAgICAgICAgICAgICAgICAgICAqDQorCSAqIC0gRHVyaW5nIHNlYXJjaCwgdGhlIGVuZXJneSBpcyBkaXZpZGVkIGJ5IDggdG8gYXZvaWQgICAgICAgICAqDQorCSAqICAgb3ZlcmZsb3cgb24gImFscCIuIChlbmVyZ3kgb2YgaFtdID0gTUFYLzEyOCkuICAgICAgICAgICAgICAqDQorCSAqICA9PT4gImFscCIgd29yc3QgY2FzZSBkZXRlY3RlZCBpcyAyMjg1NCBvbiBzaW51c29pZGFsIHdhdmUuICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkvKiBpbXB1bHNlIHJlc3BvbnNlIGJ1ZmZlciBmb3IgZmFzdCBjb21wdXRhdGlvbiAqLw0KKw0KKwloID0gaF9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaF9pbnYgPSBoX2J1ZiArICgyICogTF9TVUJGUik7ICAgDQorCUxfdG1wID0gMDsNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJew0KKwkJKmgrKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCSpoX2ludisrID0gMDsgICANCisJCUxfdG1wICs9IChIW2ldICogSFtpXSkgPDwgMTsNCisJfQ0KKwkvKiBzY2FsZSBoW10gZG93biAoLzIpIHdoZW4gZW5lcmd5IG9mIGhbXSBpcyBoaWdoIHdpdGggbWFueSBwdWxzZXMgdXNlZCAqLw0KKwl2YWwgPSBleHRyYWN0X2goTF90bXApOw0KKwloX3NoaWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJaWYgKChuYl9wdWxzZSA+PSAxMikgJiYgKHZhbCA+IDEwMjQpKQ0KKwl7DQorCQloX3NoaWZ0ID0gMTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCXAwID0gSDsNCisJcDEgPSBoOw0KKwlwMiA9IGhfaW52Ow0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUi80OyBpKyspDQorCXsNCisJCSpwMSA9ICpwMCsrID4+IGhfc2hpZnQ7ICAgICAgICAgDQorCQkqcDIrKyA9IC0oKnAxKyspOyAgDQorCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OyAgICAgICAgIA0KKwkJKnAyKysgPSAtKCpwMSsrKTsgDQorCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OyAgICAgICAgIA0KKwkJKnAyKysgPSAtKCpwMSsrKTsgDQorCQkqcDEgPSAqcDArKyA+PiBoX3NoaWZ0OyAgICAgICAgIA0KKwkJKnAyKysgPSAtKCpwMSsrKTsgDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIENvbXB1dGUgcnJpeGl4W11bXSBuZWVkZWQgZm9yIHRoZSBjb2RlYm9vayBzZWFyY2guICAgICAgICAgKg0KKwkgKiBUaGlzIGFsZ29yaXRobSBjb21wdXRlIGltcHVsc2UgcmVzcG9uc2UgZW5lcmd5IG9mIGFsbCAgICAgICoNCisJICogcG9zaXRpb25zICgxNikgaW4gZWFjaCB0cmFjayAoNCkuICAgICAgIFRvdGFsID0gNHgxNiA9IDY0LiAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJLyogc3RvcmFnZSBvcmRlciAtLT4gaTNpMywgaTJpMiwgaTFpMSwgaTBpMCAqLw0KKw0KKwkvKiBJbml0IHBvaW50ZXJzIHRvIGxhc3QgcG9zaXRpb24gb2YgcnJpeGl4W10gKi8NCisJcDAgPSAmcnJpeGl4WzBdW05CX1BPUyAtIDFdOyAgICAgICAgICAgDQorCXAxID0gJnJyaXhpeFsxXVtOQl9QT1MgLSAxXTsgICAgICAgICAgIA0KKwlwMiA9ICZycml4aXhbMl1bTkJfUE9TIC0gMV07ICAgICAgICAgICANCisJcDMgPSAmcnJpeGl4WzNdW05CX1BPUyAtIDFdOyAgICAgICAgICAgDQorDQorCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwljb3IgPSAweDAwMDA4MDAwTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciByb3VuZGluZyAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgTkJfUE9TOyBpKyspDQorCXsNCisJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMSkpOw0KKwkJcHRyX2gxKys7DQorCQkqcDMtLSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgIA0KKwkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gxKSk7DQorCQlwdHJfaDErKzsNCisJCSpwMi0tID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgDQorCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDEpKTsNCisJCXB0cl9oMSsrOw0KKwkJKnAxLS0gPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICANCisJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMSkpOw0KKwkJcHRyX2gxKys7DQorCQkqcDAtLSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgIA0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBDb21wdXRlIHJyaXhpeVtdW10gbmVlZGVkIGZvciB0aGUgY29kZWJvb2sgc2VhcmNoLiAgICAgICAgICoNCisJICogVGhpcyBhbGdvcml0aG0gY29tcHV0ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIDIgcHVsc2VzICAgICAgICAqDQorCSAqICgyIGltcHVsc2VzIHJlc3BvbnNlcykgaW4gNCBwb3NzaWJsZSBhZGphY2VudHMgdHJhY2tzLiAgICAgKg0KKwkgKiAodHJhY2sgMC0xLCAxLTIsIDItMyBhbmQgMy0wKS4gICAgIFRvdGFsID0gNHgxNngxNiA9IDEwMjQuICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkvKiBzdG9yYWdlIG9yZGVyIC0tPiBpMmkzLCBpMWkyLCBpMGkxLCBpM2kwICovDQorDQorCXBvcyA9IE1TSVpFIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwlwdHJfaGYgPSBoICsgMTsgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IE5CX1BPUzsgaysrKQ0KKwl7DQorCQlwMyA9ICZycml4aXlbMl1bcG9zXTsgICAgICAgICAgICAgIA0KKwkJcDIgPSAmcnJpeGl5WzFdW3Bvc107ICAgICAgICAgICAgICANCisJCXAxID0gJnJyaXhpeVswXVtwb3NdOyAgICAgICAgICAgICAgDQorCQlwMCA9ICZycml4aXlbM11bcG9zIC0gTkJfUE9TXTsgICAgIA0KKw0KKwkJY29yID0gMHgwMDAwODAwMEw7ICAgICAgICAgICAgICAgICAgIC8qIGZvciByb3VuZGluZyAqLw0KKwkJcHRyX2gxID0gaDsgICAgICAgICAgICAgICAgICAgICAgICANCisJCXB0cl9oMiA9IHB0cl9oZjsgICAgICAgICAgICAgICAgICAgDQorDQorCQlmb3IgKGkgPSBrICsgMTsgaSA8IE5CX1BPUzsgaSsrKQ0KKwkJew0KKwkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMyA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICANCisJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDIgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgDQorCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQkJcHRyX2gxKys7DQorCQkJcHRyX2gyKys7DQorCQkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIA0KKwkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMCA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgIA0KKw0KKwkJCXAzIC09IChOQl9QT1MgKyAxKTsNCisJCQlwMiAtPSAoTkJfUE9TICsgMSk7DQorCQkJcDEgLT0gKE5CX1BPUyArIDEpOw0KKwkJCXAwIC09IChOQl9QT1MgKyAxKTsNCisJCX0NCisJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJcHRyX2gxKys7DQorCQlwdHJfaDIrKzsNCisJCSpwMyA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICAgICAgDQorCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCXB0cl9oMSsrOw0KKwkJcHRyX2gyKys7DQorCQkqcDIgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgICAgIA0KKwkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQlwdHJfaDErKzsNCisJCXB0cl9oMisrOw0KKwkJKnAxID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICANCisNCisJCXBvcyAtPSBOQl9QT1M7DQorCQlwdHJfaGYgKz0gU1RFUDsNCisJfQ0KKw0KKwkvKiBzdG9yYWdlIG9yZGVyIC0tPiBpM2kwLCBpMmkzLCBpMWkyLCBpMGkxICovDQorDQorCXBvcyA9IE1TSVpFIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwlwdHJfaGYgPSBoICsgMzsgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IE5CX1BPUzsgaysrKQ0KKwl7DQorCQlwMyA9ICZycml4aXlbM11bcG9zXTsgICAgICAgICAgICAgIA0KKwkJcDIgPSAmcnJpeGl5WzJdW3BvcyAtIDFdOyAgICAgICAgICANCisJCXAxID0gJnJyaXhpeVsxXVtwb3MgLSAxXTsgICAgICAgICAgDQorCQlwMCA9ICZycml4aXlbMF1bcG9zIC0gMV07ICAgICAgICAgIA0KKw0KKwkJY29yID0gMHgwMDAwODAwMEw7CQkJCQkJCQkvKiBmb3Igcm91bmRpbmcgKi8NCisJCXB0cl9oMSA9IGg7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlwdHJfaDIgPSBwdHJfaGY7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkJZm9yIChpID0gayArIDE7IGkgPCBOQl9QT1M7IGkrKykNCisJCXsNCisJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDMgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgDQorCQkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQkJcHRyX2gxKys7DQorCQkJcHRyX2gyKys7DQorCQkJKnAyID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgIA0KKwkJCWNvciArPSB2b19MX211bHQoKCpwdHJfaDEpLCAoKnB0cl9oMikpOw0KKwkJCXB0cl9oMSsrOw0KKwkJCXB0cl9oMisrOw0KKwkJCSpwMSA9IGV4dHJhY3RfaChjb3IpOyAgICAgICAgICANCisJCQljb3IgKz0gdm9fTF9tdWx0KCgqcHRyX2gxKSwgKCpwdHJfaDIpKTsNCisJCQlwdHJfaDErKzsNCisJCQlwdHJfaDIrKzsNCisJCQkqcDAgPSBleHRyYWN0X2goY29yKTsgICAgICAgICAgDQorDQorCQkJcDMgLT0gKE5CX1BPUyArIDEpOw0KKwkJCXAyIC09IChOQl9QT1MgKyAxKTsNCisJCQlwMSAtPSAoTkJfUE9TICsgMSk7DQorCQkJcDAgLT0gKE5CX1BPUyArIDEpOw0KKwkJfQ0KKwkJY29yICs9IHZvX0xfbXVsdCgoKnB0cl9oMSksICgqcHRyX2gyKSk7DQorCQlwdHJfaDErKzsNCisJCXB0cl9oMisrOw0KKwkJKnAzID0gZXh0cmFjdF9oKGNvcik7ICAgICAgICAgICAgICANCisNCisJCXBvcy0tOw0KKwkJcHRyX2hmICs9IFNURVA7DQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIE1vZGlmaWNhdGlvbiBvZiBycml4aXlbXVtdIHRvIHRha2Ugc2lnbnMgaW50byBhY2NvdW50LiAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCXAwID0gJnJyaXhpeVswXVswXTsgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlmb3IgKGsgPSAwOyBrIDwgTkJfVFJBQ0s7IGsrKykNCisJew0KKwkJal90ZW1wID0gKGsgKyAxKSYweDAzOw0KKwkJZm9yIChpID0gazsgaSA8IExfU1VCRlI7IGkgKz0gU1RFUCkNCisJCXsNCisJCQlwc2lnbiA9IHNpZ247ICAgICAgICAgICAgICAgICAgDQorCQkJaWYgKHBzaWduW2ldIDwgMCkNCisJCQl7DQorCQkJCXBzaWduID0gdmVjOyAgICAgICAgICAgICAgIA0KKwkJCX0NCisJCQlqID0gal90ZW1wOw0KKwkJCWZvciAoOyBqIDwgTF9TVUJGUjsgaiArPSBTVEVQKQ0KKwkJCXsNCisJCQkJKnAwID0gdm9fbXVsdCgqcDAsIHBzaWduW2pdKTsgICAgDQorCQkJCXAwKys7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogICAgICAgICAgICAgICAgICAgICAgIERlZXAgZmlyc3Qgc2VhcmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlwc2sgPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJYWxwayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoayA9IDA7IGsgPCBuYml0ZXI7IGsrKykNCisJew0KKwkJal90ZW1wID0gazw8MjsNCisJCWZvciAoaSA9IDA7IGkgPCBuYl9wdWxzZTsgaSsrKQ0KKwkJCWlwb3NbaV0gPSB0aXBvc1tqX3RlbXAgKyBpXTsNCisNCisJCWlmKG5iYml0cyA9PSAyMCkNCisJCXsNCisJCQlwb3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJcHMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWFscCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICANCisJCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwkJCXsNCisJCQkJdmVjW2ldID0gMDsgICAgICAgICAgICAgICAgDQorCQkJfQ0KKwkJfSBlbHNlIGlmICgobmJiaXRzID09IDM2KSB8fCAobmJiaXRzID09IDQ0KSkNCisJCXsNCisJCQkvKiBmaXJzdCBzdGFnZTogZml4IDIgcHVsc2VzICovDQorCQkJcG9zID0gMjsNCisNCisJCQlpeCA9IGluZFswXSA9IHBvc19tYXhbaXBvc1swXV07DQorCQkJaXkgPSBpbmRbMV0gPSBwb3NfbWF4W2lwb3NbMV1dOw0KKwkJCXBzID0gZG5baXhdICsgZG5baXldOw0KKwkJCWkgPSBpeCA+PiAyOyAgICAgICAgICAgICAgICAvKiBpeCAvIFNURVAgKi8NCisJCQlqID0gaXkgPj4gMjsgICAgICAgICAgICAgICAgLyogaXkgLyBTVEVQICovDQorCQkJcyA9IHJyaXhpeFtpcG9zWzBdXVtpXSA8PCAxMzsNCisJCQlzICs9IHJyaXhpeFtpcG9zWzFdXVtqXSA8PCAxMzsNCisJCQlpID0gKGkgPDwgNCkgKyBqOyAgICAgICAgIC8qIChpeC9TVEVQKSpOQl9QT1MgKyAoaXkvU1RFUCkgKi8NCisJCQlzICs9IHJyaXhpeVtpcG9zWzBdXVtpXSA8PCAxNDsNCisJCQlhbHAgPSAocyArIDB4ODAwMCkgPj4gMTY7DQorCQkJaWYgKHNpZ25baXhdIDwgMCkNCisJCQkJcDAgPSBoX2ludiAtIGl4Ow0KKwkJCWVsc2UNCisJCQkJcDAgPSBoIC0gaXg7DQorCQkJaWYgKHNpZ25baXldIDwgMCkNCisJCQkJcDEgPSBoX2ludiAtIGl5Ow0KKwkJCWVsc2UNCisJCQkJcDEgPSBoIC0gaXk7DQorDQorCQkJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCQl7DQorCQkJCXZlY1tpXSA9ICgqcDArKykgKyAoKnAxKyspOw0KKwkJCX0NCisNCisJCQlpZihuYmJpdHMgPT0gNDQpDQorCQkJew0KKwkJCQlpcG9zWzhdID0gMDsgICAgICAgICAgICAgICANCisJCQkJaXBvc1s5XSA9IDE7ICAgICAgICAgICAgICAgDQorCQkJfQ0KKwkJfSBlbHNlDQorCQl7DQorCQkJLyogZmlyc3Qgc3RhZ2U6IGZpeCA0IHB1bHNlcyAqLw0KKwkJCXBvcyA9IDQ7DQorDQorCQkJaXggPSBpbmRbMF0gPSBwb3NfbWF4W2lwb3NbMF1dOyAgDQorCQkJaXkgPSBpbmRbMV0gPSBwb3NfbWF4W2lwb3NbMV1dOyAgDQorCQkJaSA9IGluZFsyXSA9IHBvc19tYXhbaXBvc1syXV07ICAgDQorCQkJaiA9IGluZFszXSA9IHBvc19tYXhbaXBvc1szXV07ICAgDQorCQkJcHMgPSBhZGQxKGFkZDEoYWRkMShkbltpeF0sIGRuW2l5XSksIGRuW2ldKSwgZG5bal0pOw0KKw0KKwkJCWlmIChzaWduW2l4XSA8IDApDQorCQkJCXAwID0gaF9pbnYgLSBpeDsNCisJCQllbHNlDQorCQkJCXAwID0gaCAtIGl4Ow0KKw0KKwkJCWlmIChzaWduW2l5XSA8IDApDQorCQkJCXAxID0gaF9pbnYgLSBpeTsNCisJCQllbHNlDQorCQkJCXAxID0gaCAtIGl5Ow0KKw0KKwkJCWlmIChzaWduW2ldIDwgMCkNCisJCQkJcDIgPSBoX2ludiAtIGk7DQorCQkJZWxzZQ0KKwkJCQlwMiA9IGggLSBpOw0KKw0KKwkJCWlmIChzaWduW2pdIDwgMCkNCisJCQkJcDMgPSBoX2ludiAtIGo7DQorCQkJZWxzZQ0KKwkJCQlwMyA9IGggLSBqOw0KKw0KKwkJCUxfdG1wID0gMEw7DQorCQkJZm9yKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwkJCXsNCisJCQkJdmVjW2ldICA9IGFkZDEoYWRkMShhZGQxKCpwMCsrLCAqcDErKyksICpwMisrKSwgKnAzKyspOw0KKwkJCQlMX3RtcCAgKz0gKHZlY1tpXSAqIHZlY1tpXSkgPDwgMTsNCisJCQl9DQorDQorCQkJYWxwID0gKChMX3RtcCA+PiAzKSArIDB4ODAwMCkgPj4gMTY7DQorDQorCQkJaWYobmJiaXRzID09IDcyKQ0KKwkJCXsNCisJCQkJaXBvc1sxNl0gPSAwOyAgICAgICAgICAgICAgDQorCQkJCWlwb3NbMTddID0gMTsgICAgICAgICAgICAgIA0KKwkJCX0NCisJCX0NCisNCisJCS8qIG90aGVyIHN0YWdlcyBvZiAyIHB1bHNlcyAqLw0KKw0KKwkJZm9yIChqID0gcG9zLCBzdCA9IDA7IGogPCBuYl9wdWxzZTsgaiArPSAyLCBzdCsrKQ0KKwkJew0KKwkJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkJICogQ2FsY3VsYXRlIGNvcnJlbGF0aW9uIG9mIGFsbCBwb3NzaWJsZSBwb3NpdGlvbnMgICoNCisJCQkgKiBvZiB0aGUgbmV4dCAyIHB1bHNlcyB3aXRoIHByZXZpb3VzIGZpeGVkIHB1bHNlcy4gKg0KKwkJCSAqIEVhY2ggcHVsc2UgY2FuIGhhdmUgMTYgcG9zc2libGUgcG9zaXRpb25zLiAgICAgICAqDQorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJaWYoaXBvc1tqXSA9PSAzKQ0KKwkJCXsNCisJCQkJY29yX2hfdmVjXzMwKGgsIHZlYywgaXBvc1tqXSwgc2lnbiwgcnJpeGl4LCBjb3JfeCwgY29yX3kpOw0KKwkJCX0NCisJCQllbHNlDQorCQkJew0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJCQljb3JfaF92ZWNfMDEyX2FzbShoLCB2ZWMsIGlwb3Nbal0sIHNpZ24sIHJyaXhpeCwgY29yX3gsIGNvcl95KTsNCisjZWxzZQ0KKwkJCQljb3JfaF92ZWNfMDEyKGgsIHZlYywgaXBvc1tqXSwgc2lnbiwgcnJpeGl4LCBjb3JfeCwgY29yX3kpOw0KKyNlbmRpZg0KKwkJCX0NCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJCSAqIEZpbmQgYmVzdCBwb3NpdGlvbnMgb2YgMiBwdWxzZXMuICAgICAgICAgICAgICAgICAqDQorCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJc2VhcmNoX2l4aXkobmJwb3Nbc3RdLCBpcG9zW2pdLCBpcG9zW2ogKyAxXSwgJnBzLCAmYWxwLA0KKwkJCQkJJml4LCAmaXksIGRuLCBkbjIsIGNvcl94LCBjb3JfeSwgcnJpeGl5KTsNCisNCisJCQlpbmRbal0gPSBpeDsgICAgICAgICAgICAgICAgICAgDQorCQkJaW5kW2ogKyAxXSA9IGl5OyAgICAgICAgICAgICAgIA0KKw0KKwkJCWlmIChzaWduW2l4XSA8IDApDQorCQkJCXAwID0gaF9pbnYgLSBpeDsNCisJCQllbHNlDQorCQkJCXAwID0gaCAtIGl4Ow0KKwkJCWlmIChzaWduW2l5XSA8IDApDQorCQkJCXAxID0gaF9pbnYgLSBpeTsNCisJCQllbHNlDQorCQkJCXAxID0gaCAtIGl5Ow0KKw0KKwkJCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKz00KQ0KKwkJCXsNCisJCQkJdmVjW2ldICAgKz0gYWRkMSgoKnAwKyspLCAoKnAxKyspKTsgICAgICAgDQorCQkJCXZlY1tpKzFdICs9IGFkZDEoKCpwMCsrKSwgKCpwMSsrKSk7ICAgICAgICANCisJCQkJdmVjW2krMl0gKz0gYWRkMSgoKnAwKyspLCAoKnAxKyspKTsgICAgICAgIA0KKwkJCQl2ZWNbaSszXSArPSBhZGQxKCgqcDArKyksICgqcDErKykpOyAgICAgIA0KKwkJCX0NCisJCX0NCisJCS8qIG1lbW9yaXNlIHRoZSBiZXN0IGNvZGV2ZWN0b3IgKi8NCisJCXBzID0gdm9fbXVsdChwcywgcHMpOw0KKwkJcyA9IHZvX0xfbXN1KHZvX0xfbXVsdChhbHBrLCBwcyksIHBzaywgYWxwKTsNCisJCWlmIChzID4gMCkNCisJCXsNCisJCQlwc2sgPSBwczsgICAgICAgICAgICAgICAgICAgICAgDQorCQkJYWxwayA9IGFscDsgICAgICAgICAgICAgICAgICAgIA0KKwkJCWZvciAoaSA9IDA7IGkgPCBuYl9wdWxzZTsgaSsrKQ0KKwkJCXsNCisJCQkJY29kdmVjW2ldID0gaW5kW2ldOyAgICAgICAgDQorCQkJfQ0KKwkJCWZvciAoaSA9IDA7IGkgPCBMX1NVQkZSOyBpKyspDQorCQkJew0KKwkJCQl5W2ldID0gdmVjW2ldOyAgICAgICAgICAgICANCisJCQl9DQorCQl9DQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBCdWlsZCB0aGUgY29kZXdvcmQsIHRoZSBmaWx0ZXJlZCBjb2Rld29yZCBhbmQgaW5kZXggb2YgY29kZXZlY3Rvci4qDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCWZvciAoaSA9IDA7IGkgPCBOUE1BWFBUICogTkJfVFJBQ0s7IGkrKykNCisJew0KKwkJaW5kW2ldID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwl7DQorCQljb2RlW2ldID0gMDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJeVtpXSA9IHZvX3Nocl9yKHlbaV0sIDMpOyAgICAgICAgICAgICAgIC8qIFExMiB0byBROSAqLw0KKwl9DQorCXZhbCA9ICg1MTIgPj4gaF9zaGlmdCk7ICAgICAgICAgICAgICAgLyogY29kZXdvcmQgaW4gUTkgZm9ybWF0ICovDQorCWZvciAoayA9IDA7IGsgPCBuYl9wdWxzZTsgaysrKQ0KKwl7DQorCQlpID0gY29kdmVjW2tdOyAgICAgICAgICAgICAgICAgICAgICAgLyogcmVhZCBwdWxzZSBwb3NpdGlvbiAqLw0KKwkJaiA9IHNpZ25baV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlYWQgc2lnbiAgICAgICAgICAgKi8NCisJCWluZGV4ID0gaSA+PiAyOyAgICAgICAgICAgICAgICAgLyogaW5kZXggPSBwb3Mgb2YgcHVsc2UgKDAuLjE1KSAqLw0KKwkJdHJhY2sgPSAoV29yZDE2KSAoaSAmIDB4MDMpOyAgICAgICAgIC8qIHRyYWNrID0gaSAlIE5CX1RSQUNLICgwLi4zKSAgKi8NCisNCisJCWlmIChqID4gMCkNCisJCXsNCisJCQljb2RlW2ldICs9IHZhbDsgICANCisJCQljb2R2ZWNba10gKz0gMTI4OyAgDQorCQl9IGVsc2UNCisJCXsNCisJCQljb2RlW2ldIC09IHZhbDsgICANCisJCQlpbmRleCArPSBOQl9QT1M7ICAgIA0KKwkJfQ0KKw0KKwkJaSA9IChXb3JkMTYpKCh2b19MX211bHQodHJhY2ssIE5QTUFYUFQpID4+IDEpKTsNCisNCisJCXdoaWxlIChpbmRbaV0gPj0gMCkNCisJCXsNCisJCQlpICs9IDE7DQorCQl9DQorCQlpbmRbaV0gPSBpbmRleDsgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCWsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkvKiBCdWlsZCBpbmRleCBvZiBjb2RldmVjdG9yICovDQorCWlmKG5iYml0cyA9PSAyMCkNCisJew0KKwkJZm9yICh0cmFjayA9IDA7IHRyYWNrIDwgTkJfVFJBQ0s7IHRyYWNrKyspDQorCQl7DQorCQkJX2luZGV4W3RyYWNrXSA9IChXb3JkMTYpKHF1YW50XzFwX04xKGluZFtrXSwgNCkpOw0KKwkJCWsgKz0gTlBNQVhQVDsNCisJCX0NCisJfSBlbHNlIGlmKG5iYml0cyA9PSAzNikNCisJew0KKwkJZm9yICh0cmFjayA9IDA7IHRyYWNrIDwgTkJfVFJBQ0s7IHRyYWNrKyspDQorCQl7DQorCQkJX2luZGV4W3RyYWNrXSA9IChXb3JkMTYpKHF1YW50XzJwXzJOMShpbmRba10sIGluZFtrICsgMV0sIDQpKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCX0gZWxzZSBpZihuYmJpdHMgPT0gNDQpDQorCXsNCisJCWZvciAodHJhY2sgPSAwOyB0cmFjayA8IE5CX1RSQUNLIC0gMjsgdHJhY2srKykNCisJCXsNCisJCQlfaW5kZXhbdHJhY2tdID0gKFdvcmQxNikocXVhbnRfM3BfM04xKGluZFtrXSwgaW5kW2sgKyAxXSwgaW5kW2sgKyAyXSwgNCkpOw0KKwkJCWsgKz0gTlBNQVhQVDsNCisJCX0NCisJCWZvciAodHJhY2sgPSAyOyB0cmFjayA8IE5CX1RSQUNLOyB0cmFjaysrKQ0KKwkJew0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KShxdWFudF8ycF8yTjEoaW5kW2tdLCBpbmRbayArIDFdLCA0KSk7DQorCQkJayArPSBOUE1BWFBUOw0KKwkJfQ0KKwl9IGVsc2UgaWYobmJiaXRzID09IDUyKQ0KKwl7DQorCQlmb3IgKHRyYWNrID0gMDsgdHJhY2sgPCBOQl9UUkFDSzsgdHJhY2srKykNCisJCXsNCisJCQlfaW5kZXhbdHJhY2tdID0gKFdvcmQxNikocXVhbnRfM3BfM04xKGluZFtrXSwgaW5kW2sgKyAxXSwgaW5kW2sgKyAyXSwgNCkpOw0KKwkJCWsgKz0gTlBNQVhQVDsNCisJCX0NCisJfSBlbHNlIGlmKG5iYml0cyA9PSA2NCkNCisJew0KKwkJZm9yICh0cmFjayA9IDA7IHRyYWNrIDwgTkJfVFJBQ0s7IHRyYWNrKyspDQorCQl7DQorCQkJTF9pbmRleCA9IHF1YW50XzRwXzROKCZpbmRba10sIDQpOw0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KSgoTF9pbmRleCA+PiAxNCkgJiAzKTsNCisJCQlfaW5kZXhbdHJhY2sgKyBOQl9UUkFDS10gPSAoV29yZDE2KShMX2luZGV4ICYgMHgzRkZGKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCX0gZWxzZSBpZihuYmJpdHMgPT0gNzIpDQorCXsNCisJCWZvciAodHJhY2sgPSAwOyB0cmFjayA8IE5CX1RSQUNLIC0gMjsgdHJhY2srKykNCisJCXsNCisJCQlMX2luZGV4ID0gcXVhbnRfNXBfNU4oJmluZFtrXSwgNCk7DQorCQkJX2luZGV4W3RyYWNrXSA9IChXb3JkMTYpKChMX2luZGV4ID4+IDEwKSAmIDB4MDNGRik7DQorCQkJX2luZGV4W3RyYWNrICsgTkJfVFJBQ0tdID0gKFdvcmQxNikoTF9pbmRleCAmIDB4MDNGRik7DQorCQkJayArPSBOUE1BWFBUOw0KKwkJfQ0KKwkJZm9yICh0cmFjayA9IDI7IHRyYWNrIDwgTkJfVFJBQ0s7IHRyYWNrKyspDQorCQl7DQorCQkJTF9pbmRleCA9IHF1YW50XzRwXzROKCZpbmRba10sIDQpOw0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KSgoTF9pbmRleCA+PiAxNCkgJiAzKTsNCisJCQlfaW5kZXhbdHJhY2sgKyBOQl9UUkFDS10gPSAoV29yZDE2KShMX2luZGV4ICYgMHgzRkZGKTsNCisJCQlrICs9IE5QTUFYUFQ7DQorCQl9DQorCX0gZWxzZSBpZihuYmJpdHMgPT0gODgpDQorCXsNCisJCWZvciAodHJhY2sgPSAwOyB0cmFjayA8IE5CX1RSQUNLOyB0cmFjaysrKQ0KKwkJew0KKwkJCUxfaW5kZXggPSBxdWFudF82cF82Tl8yKCZpbmRba10sIDQpOw0KKwkJCV9pbmRleFt0cmFja10gPSAoV29yZDE2KSgoTF9pbmRleCA+PiAxMSkgJiAweDA3RkYpOw0KKwkJCV9pbmRleFt0cmFjayArIE5CX1RSQUNLXSA9IChXb3JkMTYpKExfaW5kZXggJiAweDA3RkYpOw0KKwkJCWsgKz0gTlBNQVhQVDsNCisJCX0NCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBGdW5jdGlvbiAgY29yX2hfdmVjKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIENvbXB1dGUgY29ycmVsYXRpb25zIG9mIGhbXSB3aXRoIHZlY1tdIGZvciB0aGUgc3BlY2lmaWVkIHRyYWNrLiAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KK3ZvaWQgY29yX2hfdmVjXzMwKA0KKwkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIGltcHVsc2UgcmVzcG9uc2UgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgdmVjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzY2FsZWQgdmVjdG9yICgvOCkgdG8gY29ycmVsYXRlIHdpdGggaFtdICovDQorCQlXb3JkMTYgdHJhY2ssICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayB0byB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBzaWduW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNpZ24gdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHJyaXhpeFtdW05CX1BPU10sICAgICAgICAgICAgICAvKiAoaSkgY29ycmVsYXRpb24gb2YgaFt4XSB3aXRoIGhbeF0gICAgICAqLw0KKwkJV29yZDE2IGNvcl8xW10sICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorCQlXb3JkMTYgY29yXzJbXSAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXN1bHQgb2YgY29ycmVsYXRpb24gKE5CX1BPUyBlbGVtZW50cykgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLCBqLCBwb3MsIGNvcnI7DQorCVdvcmQxNiAqcDAsICpwMSwgKnAyLCpwMywqY29yX3gsKmNvcl95Ow0KKwlXb3JkMzIgTF9zdW0xLExfc3VtMjsNCisJY29yX3ggPSBjb3JfMTsNCisJY29yX3kgPSBjb3JfMjsNCisJcDAgPSBycml4aXhbdHJhY2tdOw0KKwlwMyA9IHJyaXhpeFswXTsNCisJcG9zID0gdHJhY2s7DQorDQorCWZvciAoaSA9IDA7IGkgPCBOQl9QT1M7IGkrPTIpDQorCXsNCisJCUxfc3VtMSA9IExfc3VtMiA9IDBMOw0KKwkJcDEgPSBoOw0KKwkJcDIgPSAmdmVjW3Bvc107DQorCQlmb3IgKGo9cG9zO2ogPCBMX1NVQkZSOyBqKyspDQorCQl7DQorCQkJTF9zdW0xICs9ICpwMSAqICpwMjsJCQ0KKwkJCXAyLT0zOw0KKwkJCUxfc3VtMiArPSAqcDErKyAqICpwMjsJCQ0KKwkJCXAyKz00Ow0KKwkJfQ0KKwkJcDItPTM7DQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJDQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJDQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJDQorDQorCQlMX3N1bTEgPSAoTF9zdW0xIDw8IDIpOw0KKwkJTF9zdW0yID0gKExfc3VtMiA8PCAyKTsNCisNCisJCWNvcnIgPSB2b19yb3VuZChMX3N1bTEpOwkNCisJCSpjb3JfeCsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvc10pICsgKCpwMCsrKTsNCisJCWNvcnIgPSB2b19yb3VuZChMX3N1bTIpOw0KKwkJKmNvcl95KysgPSB2b19tdWx0KGNvcnIsIHNpZ25bcG9zLTNdKSArICgqcDMrKyk7DQorCQlwb3MgKz0gU1RFUDsNCisNCisJCUxfc3VtMSA9IExfc3VtMiA9IDBMOw0KKwkJcDEgPSBoOw0KKwkJcDIgPSAmdmVjW3Bvc107DQorCQlmb3IgKGo9cG9zO2ogPCBMX1NVQkZSOyBqKyspDQorCQl7DQorCQkJTF9zdW0xICs9ICpwMSAqICpwMjsJCQ0KKwkJCXAyLT0zOw0KKwkJCUxfc3VtMiArPSAqcDErKyAqICpwMjsJCQ0KKwkJCXAyKz00Ow0KKwkJfQ0KKwkJcDItPTM7DQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJDQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJDQorCQlMX3N1bTIgKz0gKnAxKysgKiAqcDIrKzsJDQorDQorCQlMX3N1bTEgPSAoTF9zdW0xIDw8IDIpOw0KKwkJTF9zdW0yID0gKExfc3VtMiA8PCAyKTsNCisNCisJCWNvcnIgPSB2b19yb3VuZChMX3N1bTEpOwkNCisJCSpjb3JfeCsrID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvc10pICsgKCpwMCsrKTsNCisJCWNvcnIgPSB2b19yb3VuZChMX3N1bTIpOw0KKwkJKmNvcl95KysgPSB2b19tdWx0KGNvcnIsIHNpZ25bcG9zLTNdKSArICgqcDMrKyk7DQorCQlwb3MgKz0gU1RFUDsNCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KK3ZvaWQgY29yX2hfdmVjXzAxMigNCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHNjYWxlZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHZlY1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgc2NhbGVkIHZlY3RvciAoLzgpIHRvIGNvcnJlbGF0ZSB3aXRoIGhbXSAqLw0KKwkJV29yZDE2IHRyYWNrLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgdHJhY2sgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2lnbltdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBzaWduIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBycml4aXhbXVtOQl9QT1NdLCAgICAgICAgICAgICAgLyogKGkpIGNvcnJlbGF0aW9uIG9mIGhbeF0gd2l0aCBoW3hdICAgICAgKi8NCisJCVdvcmQxNiBjb3JfMVtdLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJlc3VsdCBvZiBjb3JyZWxhdGlvbiAoTkJfUE9TIGVsZW1lbnRzKSAqLw0KKwkJV29yZDE2IGNvcl8yW10gICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmVzdWx0IG9mIGNvcnJlbGF0aW9uIChOQl9QT1MgZWxlbWVudHMpICovDQorCQkpDQorew0KKwlXb3JkMzIgaSwgaiwgcG9zLCBjb3JyOw0KKwlXb3JkMTYgKnAwLCAqcDEsICpwMiwqcDMsKmNvcl94LCpjb3JfeTsNCisJV29yZDMyIExfc3VtMSxMX3N1bTI7DQorCWNvcl94ID0gY29yXzE7DQorCWNvcl95ID0gY29yXzI7DQorCXAwID0gcnJpeGl4W3RyYWNrXTsNCisJcDMgPSBycml4aXhbdHJhY2srMV07DQorCXBvcyA9IHRyYWNrOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTkJfUE9TOyBpKz0yKQ0KKwl7DQorCQlMX3N1bTEgPSBMX3N1bTIgPSAwTDsNCisJCXAxID0gaDsNCisJCXAyID0gJnZlY1twb3NdOw0KKwkJZm9yIChqPTYyLXBvcyA7aiA+PSAwOyBqLS0pDQorCQl7DQorCQkJTF9zdW0xICs9ICpwMSAqICpwMisrOw0KKwkJCUxfc3VtMiArPSAqcDErKyAqICpwMjsNCisJCX0NCisJCUxfc3VtMSArPSAqcDEgKiAqcDI7DQorCQlMX3N1bTEgPSAoTF9zdW0xIDw8IDIpOw0KKwkJTF9zdW0yID0gKExfc3VtMiA8PCAyKTsNCisNCisJCWNvcnIgPSAoTF9zdW0xICsgMHg4MDAwKSA+PiAxNjsNCisJCWNvcl94W2ldID0gdm9fbXVsdChjb3JyLCBzaWduW3Bvc10pICsgKCpwMCsrKTsNCisJCWNvcnIgPSAoTF9zdW0yICsgMHg4MDAwKSA+PiAxNjsNCisJCWNvcl95W2ldID0gdm9fbXVsdChjb3JyLCBzaWduW3BvcyArIDFdKSArICgqcDMrKyk7DQorCQlwb3MgKz0gU1RFUDsNCisNCisJCUxfc3VtMSA9IExfc3VtMiA9IDBMOw0KKwkJcDEgPSBoOw0KKwkJcDIgPSAmdmVjW3Bvc107DQorCQlmb3IgKGo9IDYyLXBvcztqID49IDA7IGotLSkNCisJCXsNCisJCQlMX3N1bTEgKz0gKnAxICogKnAyKys7DQorCQkJTF9zdW0yICs9ICpwMSsrICogKnAyOw0KKwkJfQ0KKwkJTF9zdW0xICs9ICpwMSAqICpwMjsNCisJCUxfc3VtMSA9IChMX3N1bTEgPDwgMik7DQorCQlMX3N1bTIgPSAoTF9zdW0yIDw8IDIpOw0KKw0KKwkJY29yciA9IChMX3N1bTEgKyAweDgwMDApID4+IDE2Ow0KKwkJY29yX3hbaSsxXSA9IHZvX211bHQoY29yciwgc2lnbltwb3NdKSArICgqcDArKyk7DQorCQljb3JyID0gKExfc3VtMiArIDB4ODAwMCkgPj4gMTY7DQorCQljb3JfeVtpKzFdID0gdm9fbXVsdChjb3JyLCBzaWduW3BvcyArIDFdKSArICgqcDMrKyk7DQorCQlwb3MgKz0gU1RFUDsNCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisgKiBGdW5jdGlvbiAgc2VhcmNoX2l4aXkoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIEZpbmQgdGhlIGJlc3QgcG9zaXRpb25zIG9mIDIgcHVsc2VzIGluIGEgc3ViZnJhbWUuICAgICAgICAgICAgICAgICoNCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KK3ZvaWQgc2VhcmNoX2l4aXkoDQorCQlXb3JkMTYgbmJfcG9zX2l4LCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBuYiBvZiBwb3MgZm9yIHB1bHNlIDEgKDEuLjgpICAgICAgICovDQorCQlXb3JkMTYgdHJhY2tfeCwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayBvZiBwdWxzZSAxICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgdHJhY2tfeSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB0cmFjayBvZiBwdWxzZSAyICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBwcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIGNvcnJlbGF0aW9uIG9mIGFsbCBmaXhlZCBwdWxzZXMgICovDQorCQlXb3JkMTYgKiBhbHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIGVuZXJneSBvZiBhbGwgZml4ZWQgcHVsc2VzICAgICAgICovDQorCQlXb3JkMTYgKiBpeCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBwb3NpdGlvbiBvZiBwdWxzZSAxICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpeSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBwb3NpdGlvbiBvZiBwdWxzZSAyICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBiZXR3ZWVuIHRhcmdldCBhbmQgaFtdICAgICAgICovDQorCQlXb3JkMTYgZG4yW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSB2ZWN0b3Igb2Ygc2VsZWN0ZWQgcG9zaXRpb25zICAgICAgICovDQorCQlXb3JkMTYgY29yX3hbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBvZiBwdWxzZSAxIHdpdGggZml4ZWQgcHVsc2VzICovDQorCQlXb3JkMTYgY29yX3lbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBvZiBwdWxzZSAyIHdpdGggZml4ZWQgcHVsc2VzICovDQorCQlXb3JkMTYgcnJpeGl5W11bTVNJWkVdICAgICAgICAgICAgICAgIC8qIChpKSBjb3JyLiBvZiBwdWxzZSAxIHdpdGggcHVsc2UgMiAgICovDQorCQkpDQorew0KKwlXb3JkMzIgeCwgeSwgcG9zLCB0aHJlc19peDsNCisJV29yZDE2IHBzMSwgcHMyLCBzcSwgc3FrOw0KKwlXb3JkMTYgYWxwXzE2LCBhbHBrOw0KKwlXb3JkMTYgKnAwLCAqcDEsICpwMjsNCisJV29yZDMyIHMsIGFscDAsIGFscDEsIGFscDI7DQorDQorCXAwID0gY29yX3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlwMSA9IGNvcl95OyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJcDIgPSBycml4aXlbdHJhY2tfeF07ICAgICAgICAgICAgICAgICAgDQorDQorCXRocmVzX2l4ID0gbmJfcG9zX2l4IC0gTkJfTUFYOw0KKw0KKwlhbHAwID0gTF9kZXBvc2l0X2goKmFscCk7DQorCWFscDAgPSAoYWxwMCArIDB4MDAwMDgwMDBMKTsgICAgICAgLyogZm9yIHJvdW5kaW5nICovDQorDQorCXNxayA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlhbHBrID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yICh4ID0gdHJhY2tfeDsgeCA8IExfU1VCRlI7IHggKz0gU1RFUCkNCisJew0KKwkJcHMxID0gKnBzICsgZG5beF07DQorCQlhbHAxID0gYWxwMCArICgoKnAwKyspPDwxMyk7DQorDQorCQlpZiAoZG4yW3hdIDwgdGhyZXNfaXgpDQorCQl7DQorCQkJcG9zID0gLTE7DQorCQkJZm9yICh5ID0gdHJhY2tfeTsgeSA8IExfU1VCRlI7IHkgKz0gU1RFUCkNCisJCQl7DQorCQkJCXBzMiA9IGFkZDEocHMxLCBkblt5XSk7DQorDQorCQkJCWFscDIgPSBhbHAxICsgKCgqcDErKyk8PDEzKTsNCisJCQkJYWxwMiA9IGFscDIgKyAoKCpwMisrKTw8MTQpOw0KKwkJCQlhbHBfMTYgPSBleHRyYWN0X2goYWxwMik7DQorCQkJCXNxID0gdm9fbXVsdChwczIsIHBzMik7DQorCQkJCXMgPSB2b19MX211bHQoYWxwaywgc3EpIC0gKChzcWsgKiBhbHBfMTYpPDwxKTsNCisNCisJCQkJaWYgKHMgPiAwKQ0KKwkJCQl7DQorCQkJCQlzcWsgPSBzcTsgICAgICAgICAgICAgIA0KKwkJCQkJYWxwayA9IGFscF8xNjsgICAgICAgICANCisJCQkJCXBvcyA9IHk7ICAgICAgICAgICAgICAgDQorCQkJCX0NCisJCQl9DQorCQkJcDEgLT0gTkJfUE9TOw0KKw0KKwkJCWlmIChwb3MgPj0gMCkNCisJCQl7DQorCQkJCSppeCA9IHg7ICAgICAgICAgICAgICAgICAgIA0KKwkJCQkqaXkgPSBwb3M7ICAgICAgICAgICAgICAgICANCisJCQl9DQorCQl9IGVsc2UNCisJCXsNCisJCQlwMiArPSBOQl9QT1M7DQorCQl9DQorCX0NCisNCisJKnBzID0gYWRkMSgqcHMsIGFkZDEoZG5bKml4XSwgZG5bKml5XSkpOyANCisJKmFscCA9IGFscGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCXJldHVybjsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jbW5NZW1vcnkuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY21uTWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3MjY0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY21uTWVtb3J5LmMKQEAgLTAsMCArMSw3MyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJY21uTWVtb3J5LmMNCisNCisJQ29udGVudDoJc2FtcGxlIGNvZGUgZm9yIG1lbW9yeSBvcGVyYXRvciBpbXBsZW1lbnRhdGlvbg0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgImNtbk1lbW9yeS5oIg0KKw0KKyNpbmNsdWRlIDxtYWxsb2MuaD4NCisjaWYgZGVmaW5lZCBMSU5VWA0KKyNpbmNsdWRlIDxzdHJpbmcuaD4NCisjZW5kaWYNCisNCisvL1ZPX01FTV9PUEVSQVRPUgkJZ19tZW1PUDsNCisNCitWT19VMzIgY21uTWVtQWxsb2MgKFZPX1MzMiB1SUQsICBWT19NRU1fSU5GTyAqIHBNZW1JbmZvKQ0KK3sNCisJaWYgKCFwTWVtSW5mbykNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorDQorCXBNZW1JbmZvLT5WQnVmZmVyID0gbWFsbG9jIChwTWVtSW5mby0+U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIgY21uTWVtRnJlZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBNZW0pDQorew0KKwlmcmVlIChwTWVtKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1ZPX1UzMgljbW5NZW1TZXQgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZiwgVk9fVTggdVZhbHVlLCBWT19VMzIgdVNpemUpDQorew0KKwltZW1zZXQgKHBCdWZmLCB1VmFsdWUsIHVTaXplKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1ZPX1UzMgljbW5NZW1Db3B5IChWT19TMzIgdUlELCBWT19QVFIgcERlc3QsIFZPX1BUUiBwU291cmNlLCBWT19VMzIgdVNpemUpDQorew0KKwltZW1jcHkgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIJY21uTWVtQ2hlY2sgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyLCBWT19VMzIgdVNpemUpDQorew0KKwlyZXR1cm4gMDsNCit9DQorDQorVk9fUzMyIGNtbk1lbUNvbXBhcmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyMSwgVk9fUFRSIHBCdWZmZXIyLCBWT19VMzIgdVNpemUpDQorew0KKwlyZXR1cm4gbWVtY21wKHBCdWZmZXIxLCBwQnVmZmVyMiwgdVNpemUpOw0KK30NCisNCitWT19VMzIJY21uTWVtTW92ZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQ0KK3sNCisJbWVtbW92ZSAocERlc3QsIHBTb3VyY2UsIHVTaXplKTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29udm9sdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmM3NGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jb252b2x2ZS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAgICAgICBGaWxlOiBjb252b2x2ZS5jDQorDQorCSAgIERlc2NyaXB0aW9uOlBlcmZvcm0gdGhlIGNvbnZvbHV0aW9uIGJldHdlZW4gdHdvIHZlY3RvcnMgeFtdIGFuZCBoW10NCisJICAgICAgICAgICAgICAgYW5kIHdyaXRlIHRoZSByZXN1bHQgaW4gdGhlIHZlY3RvciB5W10NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCit2b2lkIENvbnZvbHZlICgNCisJCVdvcmQxNiB4W10sICAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBoW10sICAgICAgICAvKiAoaSkgICAgIDogaW1wdWxzZSByZXNwb25zZSAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMICAgICAgICAgICAvKiAoaSkgICAgIDogdmVjdG9yIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJICAgICAgKQ0KK3sNCisJV29yZDMyICBpLCBuOw0KKwlXb3JkMTYgKnRtcEgsKnRtcFg7DQorCVdvcmQzMiBzOw0KKwlmb3IgKG4gPSAwOyBuIDwgNjQ7KQ0KKwl7DQorCQl0bXBIID0gaCtuOw0KKwkJdG1wWCA9IHg7DQorCQlpPW4rMTsNCisJCXMgPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpO2ktLTsNCisJCXdoaWxlKGk+MCkNCisJCXsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJaSAtPSA0Ow0KKwkJfQ0KKwkJeVtuXSA9ICgoczw8MSkgKyAweDgwMDApPj4xNjsgICANCisJCW4rKzsNCisNCisJCXRtcEggPSBoK247DQorCQl0bXBYID0geDsNCisJCWk9bisxOw0KKwkJcyA9ICB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpO2ktLTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTtpLS07DQorDQorCQl3aGlsZShpPjApDQorCQl7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCWkgLT0gNDsNCisJCX0NCisJCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7ICAgIA0KKwkJbisrOw0KKw0KKwkJdG1wSCA9IGgrbjsNCisJCXRtcFggPSB4Ow0KKwkJaT1uKzE7DQorCQlzID0gIHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7aS0tOw0KKwkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpO2ktLTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTtpLS07DQorDQorCQl3aGlsZShpPjApDQorCQl7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCWkgLT0gNDsNCisJCX0NCisJCXlbbl0gPSAoKHM8PDEpICsgMHg4MDAwKT4+MTY7ICAgDQorCQluKys7DQorDQorCQlzID0gMDsNCisJCXRtcEggPSBoK247DQorCQl0bXBYID0geDsNCisJCWk9bisxOw0KKwkJd2hpbGUoaT4wKQ0KKwkJew0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlzICs9IHZvX211bHQzMigoKnRtcFgrKyksICgqdG1wSC0tKSk7DQorCQkJcyArPSB2b19tdWx0MzIoKCp0bXBYKyspLCAoKnRtcEgtLSkpOw0KKwkJCXMgKz0gdm9fbXVsdDMyKCgqdG1wWCsrKSwgKCp0bXBILS0pKTsNCisJCQlpIC09IDQ7DQorCQl9DQorCQl5W25dID0gKChzPDwxKSArIDB4ODAwMCk+PjE2OyAgIA0KKwkJbisrOyAgICAgICAgDQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29yX2hfeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmU5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYwpAQCAtMCwwICsxLDEyNyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGNvcl9oX3guYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOkNvbXB1dGUgY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgInhbXSIgYW5kICJoW10iICAqDQorKgkgICAgICAgICAgICAgICBEZXNpZ25lZCBmb3IgY29kZWJvb2sgc2VhcmNoICgyNCBwdWxzZXMsIDQgdHJhY2tzLCAgKiANCisqCQkJCSAgIDQgcHVsc2VzIHBlciB0cmFjaywgMTYgcG9zaXRpb25zIGluIGVhY2ggdHJhY2spIHRvICAqDQorKgkJCQkgICBhdm9pZCBzYXR1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorDQorI2RlZmluZSBMX1NVQkZSICAgNjQNCisjZGVmaW5lIE5CX1RSQUNLICA0DQorI2RlZmluZSBTVEVQICAgICAgNA0KKw0KK3ZvaWQgY29yX2hfeCgNCisJCVdvcmQxNiBoW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlciAqLw0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZG5bXSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSA8MTJiaXQgOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgaFtdICAgICAgICAgKi8NCisJICAgICkNCit7DQorCVdvcmQzMiBpLCBqOw0KKwlXb3JkMzIgTF90bXAsIHkzMltMX1NVQkZSXSwgTF90b3Q7DQorCVdvcmQxNiAqcDEsICpwMjsNCisJV29yZDMyICpwMzsNCisJV29yZDMyIExfbWF4LCBMX21heDEsIExfbWF4MiwgTF9tYXgzOw0KKwkvKiBmaXJzdCBrZWVwIHRoZSByZXN1bHQgb24gMzIgYml0cyBhbmQgZmluZCBhYnNvbHV0ZSBtYXhpbXVtICovDQorCUxfdG90ICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlMX21heCAgPSAwOyANCisJTF9tYXgxID0gMDsNCisJTF9tYXgyID0gMDsNCisJTF9tYXgzID0gMDsNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkgKz0gU1RFUCkNCisJew0KKwkJTF90bXAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEgLT4gdG8gYXZvaWQgbnVsbCBkbltdICovDQorCQlwMSA9ICZ4W2ldOw0KKwkJcDIgPSAmaFswXTsNCisJCWZvciAoaiA9IGk7IGogPCBMX1NVQkZSOyBqKyspDQorCQkJTF90bXAgKz0gdm9fTF9tdWx0KCpwMSsrLCAqcDIrKyk7DQorDQorCQl5MzJbaV0gPSBMX3RtcDsgICAgICAgICAgICAgICANCisJCUxfdG1wID0gKExfdG1wID4gMCk/IExfdG1wOi1MX3RtcDsNCisJCWlmKExfdG1wID4gTF9tYXgpDQorCQl7DQorCQkJTF9tYXggPSBMX3RtcDsgICAgICAgICAgICAgDQorCQl9DQorDQorCQlMX3RtcCA9IDFMOw0KKwkJcDEgPSAmeFtpKzFdOw0KKwkJcDIgPSAmaFswXTsNCisJCWZvciAoaiA9IGkrMTsgaiA8IExfU1VCRlI7IGorKykNCisJCQlMX3RtcCArPSB2b19MX211bHQoKnAxKyssICpwMisrKTsNCisNCisJCXkzMltpKzFdID0gTF90bXA7ICAgICAgICAgICAgICAgDQorCQlMX3RtcCA9IChMX3RtcCA+IDApPyBMX3RtcDotTF90bXA7DQorCQlpZihMX3RtcCA+IExfbWF4MSkNCisJCXsNCisJCQlMX21heDEgPSBMX3RtcDsgICAgICAgICAgICAgDQorCQl9DQorDQorCQlMX3RtcCA9IDE7DQorCQlwMSA9ICZ4W2krMl07DQorCQlwMiA9ICZoWzBdOw0KKwkJZm9yIChqID0gaSsyOyBqIDwgTF9TVUJGUjsgaisrKQ0KKwkJCUxfdG1wICs9IHZvX0xfbXVsdCgqcDErKywgKnAyKyspOw0KKw0KKwkJeTMyW2krMl0gPSBMX3RtcDsgICAgICAgICAgICAgICANCisJCUxfdG1wID0gKExfdG1wID4gMCk/IExfdG1wOi1MX3RtcDsNCisJCWlmKExfdG1wID4gTF9tYXgyKQ0KKwkJew0KKwkJCUxfbWF4MiA9IExfdG1wOyAgICAgICAgICAgICANCisJCX0NCisNCisJCUxfdG1wID0gMTsNCisJCXAxID0gJnhbaSszXTsNCisJCXAyID0gJmhbMF07DQorCQlmb3IgKGogPSBpKzM7IGogPCBMX1NVQkZSOyBqKyspDQorCQkJTF90bXAgKz0gdm9fTF9tdWx0KCpwMSsrLCAqcDIrKyk7DQorDQorCQl5MzJbaSszXSA9IExfdG1wOyAgICAgICAgICAgICAgIA0KKwkJTF90bXAgPSAoTF90bXAgPiAwKT8gTF90bXA6LUxfdG1wOw0KKwkJaWYoTF90bXAgPiBMX21heDMpDQorCQl7DQorCQkJTF9tYXgzID0gTF90bXA7ICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorCS8qIHRvdCArPSAzKm1heCAvIDggKi8NCisJTF9tYXggPSAoKExfbWF4ICsgTF9tYXgxICsgTF9tYXgyICsgTF9tYXgzKSA+PiAyKTsNCisJTF90b3QgPSB2b19MX2FkZChMX3RvdCwgTF9tYXgpOyAgICAgICAvKiArbWF4LzQgKi8NCisJTF90b3QgPSB2b19MX2FkZChMX3RvdCwgKExfbWF4ID4+IDEpKTsgIC8qICttYXgvOCAqLw0KKw0KKwkvKiBGaW5kIHRoZSBudW1iZXIgb2YgcmlnaHQgc2hpZnRzIHRvIGRvIG9uIHkzMltdIHNvIHRoYXQgICAgKi8NCisJLyogNi4wIHggc3VtYXRpb24gb2YgbWF4IG9mIGRuW10gaW4gZWFjaCB0cmFjayBub3Qgc2F0dXJhdGUuICovDQorCWogPSBub3JtX2woTF90b3QpIC0gNDsgICAgICAgICAgICAgLyogNCAtPiAxNiB4IHRvdCAqLw0KKwlwMSA9IGRuOw0KKwlwMyA9IHkzMjsNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrPTQpDQorCXsNCisJCSpwMSsrID0gdm9fcm91bmQoTF9zaGwoKnAzKyssIGopKTsNCisJCSpwMSsrID0gdm9fcm91bmQoTF9zaGwoKnAzKyssIGopKTsNCisJCSpwMSsrID0gdm9fcm91bmQoTF9zaGwoKnAzKyssIGopKTsNCisJCSpwMSsrID0gdm9fcm91bmQoTF9zaGwoKnAzKyssIGopKTsNCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWNpbTU0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5YTdkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVjaW01NC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBkZWNpbTU0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJICAgRGVzY3JpcHRpb246RGVjaW1hdGlvbiBvZiAxNmtIeiBzaWduYWwgdG8gMTIuOGtIeiAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorDQorI2RlZmluZSBGQUM1ICAgNQ0KKyNkZWZpbmUgRE9XTl9GQUMgIDI2MjE1ICAgICAgICAgICAgICAgICAgICAvKiA0LzUgaW4gUTE1ICovDQorDQorI2RlZmluZSBOQl9DT0VGX0RPV04gIDE1DQorDQorLyogTG9jYWwgZnVuY3Rpb25zICovDQorc3RhdGljIHZvaWQgRG93bl9zYW1wKA0KKwkJV29yZDE2ICogc2lnLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHNpZ25hbCB0byBkb3duc2FtcGxpbmcgICovDQorCQlXb3JkMTYgKiBzaWdfZCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogZG93bnNhbXBsZWQgc2lnbmFsICAgICAgKi8NCisJCVdvcmQxNiBMX2ZyYW1lX2QgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBsZW5ndGggb2Ygb3V0cHV0ICAgICAgICAqLw0KKwkJKTsNCisNCisvKiAxLzUgcmVzb2x1dGlvbiBpbnRlcnBvbGF0aW9uIGZpbHRlciAgKGluIFExNCkgICovDQorLyogLTEuNWRCIEAgNmtIeiwgLTZkQiBAIDYuNGtIeiwgLTEwZEIgQCA2LjZrSHosIC0yMGRCIEAgNi45a0h6LCAtMjVkQiBAIDdrSHosIC01NWRCIEAgOGtIeiAqLw0KKw0KK3N0YXRpYyBXb3JkMTYgZmlyX2Rvd24xWzRdWzMwXSA9DQorew0KKwl7LTUsIDI0LCAtNTAsIDU0LCAwLCAtMTI4LCAyOTQsIC00MDgsIDM0NCwgMCwgLTY0NywgMTUwNSwgLTIzNzksIDMwMzQsIDEzMTA3LCAzMDM0LCAtMjM3OSwgMTUwNSwgLTY0NywgMCwgMzQ0LCAtNDA4LA0KKwkyOTQsIC0xMjgsIDAsIDU0LCAtNTAsIDI0LCAtNSwgMH0sDQorDQorCXstNiwgMTksIC0yNiwgMCwgNzcsIC0xODgsIDI3MCwgLTIzMywgMCwgNDM0LCAtOTY0LCAxMzY2LCAtMTI5MywgMCwgMTIyNTQsIDY1NzUsIC0yNzQ2LCAxMDMwLCAwLCAtNTA3LCA2MDEsIC00NDEsDQorCTE5OCwgMCwgLTk1LCA5OSwgLTU4LCAxOCwgMCwgLTF9LA0KKw0KKwl7LTMsIDksIDAsIC00MSwgMTExLCAtMTcwLCAxNTMsIDAsIC0yOTUsIDY0OSwgLTg4OCwgNzcwLCAwLCAtMTk5NywgOTg5NCwgOTg5NCwgLTE5OTcsIDAsIDc3MCwgLTg4OCwgNjQ5LCAtMjk1LCAwLA0KKwkxNTMsIC0xNzAsIDExMSwgLTQxLCAwLCA5LCAtM30sDQorDQorCXstMSwgMCwgMTgsIC01OCwgOTksIC05NSwgMCwgMTk4LCAtNDQxLCA2MDEsIC01MDcsIDAsIDEwMzAsIC0yNzQ2LCA2NTc1LCAxMjI1NCwgMCwgLTEyOTMsIDEzNjYsIC05NjQsIDQzNCwgMCwNCisJLTIzMywgMjcwLCAtMTg4LCA3NywgMCwgLTI2LCAxOSwgLTZ9DQorfTsNCisNCit2b2lkIEluaXRfRGVjaW1fMTJrOCgNCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBtZW1vcnkgKDIqTkJfQ09FRl9ET1dOKSBzZXQgdG8gemVyb3MgKi8NCisJCSkNCit7DQorCVNldF96ZXJvKG1lbSwgMiAqIE5CX0NPRUZfRE9XTik7DQorCXJldHVybjsNCit9DQorDQordm9pZCBEZWNpbV8xMms4KA0KKwkJV29yZDE2IHNpZzE2a1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHNpZ25hbCB0byBkb3duc2FtcGxpbmcgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgbGVuZ3RoIG9mIGlucHV0ICAgICAgICAgKi8NCisJCVdvcmQxNiBzaWcxMms4W10sICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiBkZWNpbWF0ZWQgc2lnbmFsICAgICAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbi9vdXQ6IG1lbW9yeSAoMipOQl9DT0VGX0RPV04pICovDQorCSAgICAgICApDQorew0KKwlXb3JkMTYgbGdfZG93bjsNCisJV29yZDE2IHNpZ25hbFtMX0ZSQU1FMTZrICsgKDIgKiBOQl9DT0VGX0RPV04pXTsNCisNCisJQ29weShtZW0sIHNpZ25hbCwgMiAqIE5CX0NPRUZfRE9XTik7DQorDQorCUNvcHkoc2lnMTZrLCBzaWduYWwgKyAoMiAqIE5CX0NPRUZfRE9XTiksIGxnKTsNCisNCisJbGdfZG93biA9IChsZyAqIERPV05fRkFDKT4+MTU7DQorDQorCURvd25fc2FtcChzaWduYWwgKyBOQl9DT0VGX0RPV04sIHNpZzEyazgsIGxnX2Rvd24pOw0KKw0KKwlDb3B5KHNpZ25hbCArIGxnLCBtZW0sIDIgKiBOQl9DT0VGX0RPV04pOw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KK3N0YXRpYyB2b2lkIERvd25fc2FtcCgNCisJCVdvcmQxNiAqIHNpZywgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgdG8gZG93bnNhbXBsaW5nICAqLw0KKwkJV29yZDE2ICogc2lnX2QsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGRvd25zYW1wbGVkIHNpZ25hbCAgICAgICovDQorCQlXb3JkMTYgTF9mcmFtZV9kICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgbGVuZ3RoIG9mIG91dHB1dCAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLCBqLCBmcmFjLCBwb3M7DQorCVdvcmQxNiAqeCwgKnk7DQorCVdvcmQzMiBMX3N1bTsNCisNCisJcG9zID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb3NpdGlvbiBpcyBpbiBRMiAtPiAxLzQgcmVzb2x1dGlvbiAgKi8NCisJZm9yIChqID0gMDsgaiA8IExfZnJhbWVfZDsgaisrKQ0KKwl7DQorCQlpID0gKHBvcyA+PiAyKTsgICAgICAgICAgICAgICAgICAgLyogaW50ZWdlciBwYXJ0ICAgICAqLw0KKwkJZnJhYyA9IHBvcyAmIDM7ICAgICAgICAgICAgICAgICAgIC8qIGZyYWN0aW9uYWwgcGFydCAqLw0KKwkJeCA9IHNpZyArIGkgLSBOQl9DT0VGX0RPV04gKyAxOw0KKwkJeSA9IChXb3JkMTYgKikoZmlyX2Rvd24xICsgZnJhYyk7DQorDQorCQlMX3N1bSA9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngrKyksKCp5KyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKngpLCgqeSkpOw0KKw0KKwkJTF9zdW0gPSBMX3NobDIoTF9zdW0sIDIpOyAgICAgICAgICAgICAgDQorCQlzaWdfZFtqXSA9IGV4dHJhY3RfaChMX2FkZChMX3N1bSwgMHg4MDAwKSk7IA0KKwkJcG9zICs9IEZBQzU7ICAgICAgICAgICAgICAvKiBwb3MgKyA1LzQgKi8NCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZGVlbXBoLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlZW1waC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZDUyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlZW1waC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogZGVlbXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJICAgRGVzY3JpcHRpb246ZmlsdGVyaW5nIHRocm91Z2ggMS8oMS1tdSB6XiAtMSkgICAgICAgICAgICAgICAgICAgICoNCisqCSAgICAgICAgICAgICAgIERlZW1waDIgLS0+IHNpZ25hbCBpcyBkaXZpZGVkIGJ5IDIgICAgICAgICAgICAgICAgICAqDQorKgkJCQkgICBEZWVtcGhfMzIgLS0+IGZvciAzMiBiaXRzIHNpZ25hbC4gICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorDQordm9pZCBEZWVtcGgoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogZGVlbXBoYXNpcyBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHlbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICApDQorew0KKwlXb3JkMzIgaTsNCisJV29yZDMyIExfdG1wOw0KKw0KKwlMX3RtcCA9IExfZGVwb3NpdF9oKHhbMF0pOw0KKwlMX3RtcCA9IExfbWFjKExfdG1wLCAqbWVtLCBtdSk7DQorCXhbMF0gPSB2b19yb3VuZChMX3RtcCk7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwlmb3IgKGkgPSAxOyBpIDwgTDsgaSsrKQ0KKwl7DQorCQlMX3RtcCA9IExfZGVwb3NpdF9oKHhbaV0pOw0KKwkJTF90bXAgPSBMX21hYyhMX3RtcCwgeFtpIC0gMV0sIG11KTsNCisJCXhbaV0gPSB2b3JvdW5kKExfdG1wKTsgICAgICAgICAgICAgICANCisJfQ0KKw0KKwkqbWVtID0geFtMIC0gMV07ICAgICAgICAgICAgICAgICAgICAgICANCisNCisJcmV0dXJuOw0KK30NCisNCisNCit2b2lkIERlZW1waDIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogZGVlbXBoYXNpcyBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHlbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiBMX3RtcDsNCisJTF90bXAgPSB4WzBdIDw8IDE1Ow0KKwlMX3RtcCArPSAoKCptZW0pICogbXUpPDwxOw0KKwl4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAxOyBpIDwgTDsgaSsrKQ0KKwl7DQorCQlMX3RtcCA9IHhbaV0gPDwgMTU7DQorCQlMX3RtcCArPSAoeFtpIC0gMV0gKiBtdSk8PDE7DQorCQl4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgDQorCX0NCisJKm1lbSA9IHhbTCAtIDFdOyAgICAgICAgICAgICAgICAgICAgICAgDQorCXJldHVybjsNCit9DQorDQorDQordm9pZCBEZWVtcGhfMzIoDQorCQlXb3JkMTYgeF9oaVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgKGJpdDMxLi4xNikgKi8NCisJCVdvcmQxNiB4X2xvW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAoYml0MTUuLjQpICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogb3V0cHV0IHNpZ25hbCAoeDE2KSAgICAgICovDQorCQlXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBkZWVtcGhhc2lzIGZhY3RvciAgICAgICAgKi8NCisJCVdvcmQxNiBMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHZlY3RvciBzaXplICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogbWVtb3J5ICh5Wy0xXSkgICAgICAgICAgICovDQorCSAgICAgICkNCit7DQorCVdvcmQxNiBmYWM7DQorCVdvcmQzMiBpLCBMX3RtcDsNCisNCisJZmFjID0gbXUgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFExNSAtLT4gUTE0ICovDQorDQorCUxfdG1wID0gTF9kZXBvc2l0X2goeF9oaVswXSk7DQorCUxfdG1wICs9ICh4X2xvWzBdICogOCk8PDE7DQorCUxfdG1wID0gKExfdG1wIDw8IDMpOw0KKwlMX3RtcCArPSAoKCptZW0pICogZmFjKTw8MTsNCisJTF90bXAgPSAoTF90bXAgPDwgMSk7ICAgICAgICAgICAgICAgDQorCXlbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChpID0gMTsgaSA8IEw7IGkrKykNCisJew0KKwkJTF90bXAgPSBMX2RlcG9zaXRfaCh4X2hpW2ldKTsNCisJCUxfdG1wICs9ICh4X2xvW2ldICogOCk8PDE7DQorCQlMX3RtcCA9IChMX3RtcCA8PCAzKTsNCisJCUxfdG1wICs9ICh5W2kgLSAxXSAqIGZhYyk8PDE7DQorCQlMX3RtcCA9IChMX3RtcCA8PCAxKTsgICAgICAgICAgIA0KKwkJeVtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgIA0KKwl9DQorDQorCSptZW0gPSB5W0wgLSAxXTsgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZHR4LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2R0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTIxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2R0eC5jCkBAIC0wLDAgKzEsNjA1IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogZHR4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJICAgIERlc2NyaXB0aW9uOkRUWCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImFjZWxwLmgiICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvdHlwZSBvZiBmdW5jdGlvbnMgICAgKi8NCisjaW5jbHVkZSAiYml0cy5oIg0KKyNpbmNsdWRlICJkdHguaCINCisjaW5jbHVkZSAibG9nMi5oIg0KKyNpbmNsdWRlICJtZW1fYWxpZ24uaCINCisNCitzdGF0aWMgdm9pZCBhdmVyX2lzZl9oaXN0b3J5KA0KKwkJV29yZDE2IGlzZl9vbGRbXSwNCisJCVdvcmQxNiBpbmRpY2VzW10sDQorCQlXb3JkMzIgaXNmX2F2ZXJbXQ0KKwkJKTsNCisNCitzdGF0aWMgdm9pZCBmaW5kX2ZyYW1lX2luZGljZXMoDQorCQlXb3JkMTYgaXNmX29sZF90eFtdLA0KKwkJV29yZDE2IGluZGljZXNbXSwNCisJCWR0eF9lbmNTdGF0ZSAqIHN0DQorCQkpOw0KKw0KK3N0YXRpYyBXb3JkMTYgZGl0aGVyaW5nX2NvbnRyb2woDQorCQlkdHhfZW5jU3RhdGUgKiBzdA0KKwkJKTsNCisNCisvKiBleGNpdGF0aW9uIGVuZXJneSBhZGp1c3RtZW50IGRlcGVuZGluZyBvbiBzcGVlY2ggY29kZXIgbW9kZSB1c2VkLCBRNyAqLw0KK3N0YXRpYyBXb3JkMTYgZW5fYWRqdXN0WzldID0NCit7DQorCTIzMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGUwID0gN2sgIDogIC01LjRkQiAgKi8NCisJMTc5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZTEgPSA5ayAgOiAgLTQuMmRCICAqLw0KKwkxNDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RlMiA9IDEyayA6ICAtMy4zZEIgICovDQorCTEyOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGUzID0gMTRrIDogIC0zLjBkQiAgKi8NCisJMTIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZTQgPSAxNmsgOiAgLTIuODVkQiAqLw0KKwkxMTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RlNSA9IDE4ayA6ICAtMi43ZEIgICovDQorCTExNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1vZGU2ID0gMjBrIDogIC0yLjdkQiAgKi8NCisJMTE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kZTcgPSAyM2sgOiAgLTIuN2RCICAqLw0KKwkxMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RlOCA9IDI0ayA6ICAtMi43ZEIgICovDQorfTsNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBGdW5jdGlvbiAgICA6IGR0eF9lbmNfaW5pdA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitXb3JkMTYgZHR4X2VuY19pbml0KGR0eF9lbmNTdGF0ZSAqKiBzdCwgV29yZDE2IGlzZl9pbml0W10sIFZPX01FTV9PUEVSQVRPUiAqcE1lbU9QKQ0KK3sNCisJZHR4X2VuY1N0YXRlICpzOw0KKw0KKwlpZiAoc3QgPT0gKGR0eF9lbmNTdGF0ZSAqKikgTlVMTCkNCisJew0KKwkJZnByaW50ZihzdGRlcnIsICJkdHhfZW5jX2luaXQ6IGludmFsaWQgcGFyYW1ldGVyXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwkqc3QgPSBOVUxMOw0KKw0KKwkvKiBhbGxvY2F0ZSBtZW1vcnkgKi8NCisJaWYgKChzID0gKGR0eF9lbmNTdGF0ZSAqKW1lbV9tYWxsb2MocE1lbU9QLCBzaXplb2YoZHR4X2VuY1N0YXRlKSwgMzIsIFZPX0lOREVYX0VOQ19BTVJXQikpID09IE5VTEwpDQorCXsNCisJCWZwcmludGYoc3RkZXJyLCAiZHR4X2VuY19pbml0OiBjYW4gbm90IG1hbGxvYyBzdGF0ZSBzdHJ1Y3R1cmVcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorCWR0eF9lbmNfcmVzZXQocywgaXNmX2luaXQpOw0KKwkqc3QgPSBzOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogRnVuY3Rpb24gICAgOiBkdHhfZW5jX3Jlc2V0DQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK1dvcmQxNiBkdHhfZW5jX3Jlc2V0KGR0eF9lbmNTdGF0ZSAqIHN0LCBXb3JkMTYgaXNmX2luaXRbXSkNCit7DQorCVdvcmQzMiBpOw0KKw0KKwlpZiAoc3QgPT0gKGR0eF9lbmNTdGF0ZSAqKSBOVUxMKQ0KKwl7DQorCQlmcHJpbnRmKHN0ZGVyciwgImR0eF9lbmNfcmVzZXQ6IGludmFsaWQgcGFyYW1ldGVyXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwlzdC0+aGlzdF9wdHIgPSAwOyAgICAgICAgICAgICAgICAgICAgICANCisJc3QtPmxvZ19lbl9pbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgDQorDQorCS8qIEluaXQgaXNmX2hpc3RbXSAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRTsgaSsrKQ0KKwl7DQorCQlDb3B5KGlzZl9pbml0LCAmc3QtPmlzZl9oaXN0W2kgKiBNXSwgTSk7DQorCX0NCisJc3QtPmNuZ19zZWVkID0gUkFORE9NX0lOSVRTRUVEOyAgICAgICANCisNCisJLyogUmVzZXQgZW5lcmd5IGhpc3RvcnkgKi8NCisJU2V0X3plcm8oc3QtPmxvZ19lbl9oaXN0LCBEVFhfSElTVF9TSVpFKTsNCisNCisJc3QtPmR0eEhhbmdvdmVyQ291bnQgPSBEVFhfSEFOR19DT05TVDsgDQorCXN0LT5kZWNBbmFFbGFwc2VkQ291bnQgPSAzMjc2NzsgICAgICAgIA0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgMjg7IGkrKykNCisJew0KKwkJc3QtPkRbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRSAtIDE7IGkrKykNCisJew0KKwkJc3QtPnN1bURbaV0gPSAwOyAgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogRnVuY3Rpb24gICAgOiBkdHhfZW5jX2V4aXQNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordm9pZCBkdHhfZW5jX2V4aXQoZHR4X2VuY1N0YXRlICoqIHN0LCBWT19NRU1fT1BFUkFUT1IgKnBNZW1PUCkNCit7DQorCWlmIChzdCA9PSBOVUxMIHx8ICpzdCA9PSBOVUxMKQ0KKwkJcmV0dXJuOw0KKwkvKiBkZWFsbG9jYXRlIG1lbW9yeSAqLw0KKwltZW1fZnJlZShwTWVtT1AsICpzdCwgVk9fSU5ERVhfRU5DX0FNUldCKTsNCisJKnN0ID0gTlVMTDsNCisJcmV0dXJuOw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBGdW5jdGlvbiAgICA6IGR0eF9lbmMNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorV29yZDE2IGR0eF9lbmMoDQorCQlkdHhfZW5jU3RhdGUgKiBzdCwgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpc2ZbTV0sICAgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogQ04gSVNGIHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZXhjMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBvICAgOiBDTiBleGNpdGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiogcHJtcw0KKwkgICAgICApDQorew0KKwlXb3JkMzIgaSwgajsNCisJV29yZDE2IGluZGljZVs3XTsNCisJV29yZDE2IGxvZ19lbiwgZ2FpbiwgbGV2ZWwsIGV4cCwgZXhwMCwgdG1wOw0KKwlXb3JkMTYgbG9nX2VuX2ludF9lLCBsb2dfZW5faW50X207DQorCVdvcmQzMiBMX2lzZltNXSwgZW5lcjMyLCBsZXZlbDMyOw0KKwlXb3JkMTYgaXNmX29yZGVyWzNdOw0KKwlXb3JkMTYgQ05fZGl0aDsNCisNCisJLyogVk9YIG1vZGUgY29tcHV0YXRpb24gb2YgU0lEIHBhcmFtZXRlcnMgKi8NCisJbG9nX2VuID0gMDsNCisJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJew0KKwkJTF9pc2ZbaV0gPSAwOw0KKwl9DQorCS8qIGF2ZXJhZ2UgZW5lcmd5IGFuZCBpc2YgKi8NCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJLyogRGl2aXNpb24gYnkgRFRYX0hJU1RfU0laRSA9IDggaGFzIGJlZW4gZG9uZSBpbiBkdHhfYnVmZmVyLiBsb2dfZW4gaXMgaW4gUTEwICovDQorCQlsb2dfZW4gPSBhZGQobG9nX2VuLCBzdC0+bG9nX2VuX2hpc3RbaV0pOw0KKw0KKwl9DQorCWZpbmRfZnJhbWVfaW5kaWNlcyhzdC0+aXNmX2hpc3QsIGlzZl9vcmRlciwgc3QpOw0KKwlhdmVyX2lzZl9oaXN0b3J5KHN0LT5pc2ZfaGlzdCwgaXNmX29yZGVyLCBMX2lzZik7DQorDQorCWZvciAoaiA9IDA7IGogPCBNOyBqKyspDQorCXsNCisJCWlzZltqXSA9IChXb3JkMTYpKExfaXNmW2pdID4+IDMpOyAgLyogZGl2aWRlIGJ5IDggKi8NCisJfQ0KKw0KKwkvKiBxdWFudGl6ZSBsb2dhcml0aG1pYyBlbmVyZ3kgdG8gNiBiaXRzICgtNiA6IDY2IGRCKSB3aGljaCBjb3JyZXNwb25kcyB0byAtMjoyMiBpbiBsb2cyKEUpLiAgKi8NCisJLyogc3QtPmxvZ19lbl9pbmRleCA9IChzaG9ydCkoIChsb2dfZW4gKyAyLjApICogMi42MjUgKTsgKi8NCisNCisJLyogaW5jcmVhc2UgZHluYW1pY3MgdG8gNyBiaXRzIChROCkgKi8NCisJbG9nX2VuID0gKGxvZ19lbiA+PiAyKTsNCisNCisJLyogQWRkIDIgaW4gUTggPSA1MTIgdG8gZ2V0IGxvZzIoRSkgYmV0d2VlbiAwOjI0ICovDQorCWxvZ19lbiA9IGFkZChsb2dfZW4sIDUxMik7DQorDQorCS8qIE11bHRpcGx5IGJ5IDIuNjI1IHRvIGdldCBmdWxsIDYgYml0IHJhbmdlLiAyLjYyNSA9IDIxNTA0IGluIFExMy4gVGhlIHJlc3VsdCBpcyBpbiBRNiAqLw0KKwlsb2dfZW4gPSBtdWx0KGxvZ19lbiwgMjE1MDQpOw0KKw0KKwkvKiBRdWFudGl6ZSBFbmVyZ3kgKi8NCisJc3QtPmxvZ19lbl9pbmRleCA9IHNocihsb2dfZW4sIDYpOw0KKw0KKwlpZihzdC0+bG9nX2VuX2luZGV4ID4gNjMpDQorCXsNCisJCXN0LT5sb2dfZW5faW5kZXggPSA2MzsNCisJfQ0KKwlpZiAoc3QtPmxvZ19lbl9pbmRleCA8IDApDQorCXsNCisJCXN0LT5sb2dfZW5faW5kZXggPSAwOw0KKwl9DQorCS8qIFF1YW50aXplIElTRnMgKi8NCisJUWlzZl9ucyhpc2YsIGlzZiwgaW5kaWNlKTsNCisNCisNCisJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCA2LCBwcm1zKTsNCisJUGFybV9zZXJpYWwoaW5kaWNlWzFdLCA2LCBwcm1zKTsNCisJUGFybV9zZXJpYWwoaW5kaWNlWzJdLCA2LCBwcm1zKTsNCisJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCA1LCBwcm1zKTsNCisJUGFybV9zZXJpYWwoaW5kaWNlWzRdLCA1LCBwcm1zKTsNCisNCisJUGFybV9zZXJpYWwoKHN0LT5sb2dfZW5faW5kZXgpLCA2LCBwcm1zKTsNCisNCisJQ05fZGl0aCA9IGRpdGhlcmluZ19jb250cm9sKHN0KTsNCisJUGFybV9zZXJpYWwoQ05fZGl0aCwgMSwgcHJtcyk7DQorDQorCS8qIGxldmVsID0gKGZsb2F0KSggcG93KCAyLjBmLCAoZmxvYXQpc3QtPmxvZ19lbl9pbmRleCAvIDIuNjI1IC0gMi4wICkgKTsgICAgKi8NCisJLyogbG9nMihFKSBpbiBROSAobG9nMihFKSBsaWVzIGluIGJldHdlZW4gLTI6MjIpICovDQorCWxvZ19lbiA9IHNobChzdC0+bG9nX2VuX2luZGV4LCAxNSAtIDYpOw0KKw0KKwkvKiBEaXZpZGUgYnkgMi42MjU7IGxvZ19lbiB3aWxsIGJlIGJldHdlZW4gMDoyNCAgKi8NCisJbG9nX2VuID0gbXVsdChsb2dfZW4sIDEyNDgzKTsNCisJLyogdGhlIHJlc3VsdCBjb3JyZXNwb25kcyB0byBsb2cyKGdhaW4pIGluIFExMCAqLw0KKw0KKwkvKiBGaW5kIGludGVnZXIgcGFydCAgKi8NCisJbG9nX2VuX2ludF9lID0gKGxvZ19lbiA+PiAxMCk7DQorDQorCS8qIEZpbmQgZnJhY3Rpb25hbCBwYXJ0ICovDQorCWxvZ19lbl9pbnRfbSA9IChXb3JkMTYpIChsb2dfZW4gJiAweDNmZik7DQorCWxvZ19lbl9pbnRfbSA9IHNobChsb2dfZW5faW50X20sIDUpOw0KKw0KKwkvKiBTdWJ0cmFjdCAyIGZyb20gbG9nX2VuIGluIFE5LCBpLmUgZGl2aWRlIHRoZSBnYWluIGJ5IDIgKGVuZXJneSBieSA0KSAqLw0KKwkvKiBBZGQgMTYgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgcmVzdWx0IG9mIHBvdzIgaW4gUTE2ICovDQorCWxvZ19lbl9pbnRfZSA9IGFkZChsb2dfZW5faW50X2UsIDE2IC0gMSk7DQorDQorCWxldmVsMzIgPSBQb3cyKGxvZ19lbl9pbnRfZSwgbG9nX2VuX2ludF9tKTsgLyogUTE2ICovDQorCWV4cDAgPSBub3JtX2wobGV2ZWwzMik7DQorCWxldmVsMzIgPSAobGV2ZWwzMiA8PCBleHAwKTsgICAgICAgIC8qIGxldmVsIGluIFEzMSAqLw0KKwlleHAwID0gKDE1IC0gZXhwMCk7DQorCWxldmVsID0gZXh0cmFjdF9oKGxldmVsMzIpOyAgICAgICAgICAgIC8qIGxldmVsIGluIFExNSAqLw0KKw0KKwkvKiBnZW5lcmF0ZSB3aGl0ZSBub2lzZSB2ZWN0b3IgKi8NCisJZm9yIChpID0gMDsgaSA8IExfRlJBTUU7IGkrKykNCisJew0KKwkJZXhjMltpXSA9IChSYW5kb20oJihzdC0+Y25nX3NlZWQpKSA+PiA0KTsNCisJfQ0KKw0KKwkvKiBnYWluID0gbGV2ZWwgLyBzcXJ0KGVuZXIpICogc3FydChMX0ZSQU1FKSAqLw0KKw0KKwkvKiBlbmVyZ3kgb2YgZ2VuZXJhdGVkIGV4Y2l0YXRpb24gKi8NCisJZW5lcjMyID0gRG90X3Byb2R1Y3QxMihleGMyLCBleGMyLCBMX0ZSQU1FLCAmZXhwKTsNCisNCisJSXNxcnRfbigmZW5lcjMyLCAmZXhwKTsNCisNCisJZ2FpbiA9IGV4dHJhY3RfaChlbmVyMzIpOw0KKw0KKwlnYWluID0gbXVsdChsZXZlbCwgZ2Fpbik7ICAgICAgICAgICAgICAvKiBnYWluIGluIFExNSAqLw0KKw0KKwlleHAgPSBhZGQoZXhwMCwgZXhwKTsNCisNCisJLyogTXVsdGlwbHkgYnkgc3FydChMX0ZSQU1FKT0xNiwgaS5lLiBzaGlmdCBsZWZ0IGJ5IDQgKi8NCisJZXhwICs9IDQ7DQorDQorCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspDQorCXsNCisJCXRtcCA9IG11bHQoZXhjMltpXSwgZ2Fpbik7ICAgICAgICAgLyogUTAgKiBRMTUgKi8NCisJCWV4YzJbaV0gPSBzaGwodG1wLCBleHApOyANCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogRnVuY3Rpb24gICAgOiBkdHhfYnVmZmVyIFB1cnBvc2UgICAgIDogaGFuZGxlcyB0aGUgRFRYIGJ1ZmZlcg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitXb3JkMTYgZHR4X2J1ZmZlcigNCisJCWR0eF9lbmNTdGF0ZSAqIHN0LCAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0ICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGlzZl9uZXdbXSwgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBpc2YgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMzIgZW5yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHJlc2lkdWFsIGVuZXJneSAoaW4gTF9GUkFNRSkgICAgKi8NCisJCVdvcmQxNiBjb2RlY19tb2RlDQorCQkpDQorew0KKwlXb3JkMTYgbG9nX2VuOw0KKw0KKwlXb3JkMTYgbG9nX2VuX2U7DQorCVdvcmQxNiBsb2dfZW5fbTsNCisJc3QtPmhpc3RfcHRyID0gYWRkKHN0LT5oaXN0X3B0ciwgMSk7IA0KKwlpZihzdC0+aGlzdF9wdHIgPT0gRFRYX0hJU1RfU0laRSkNCisJew0KKwkJc3QtPmhpc3RfcHRyID0gMDsNCisJfQ0KKwkvKiBjb3B5IGxzcCB2ZWN0b3IgaW50byBidWZmZXIgKi8NCisJQ29weShpc2ZfbmV3LCAmc3QtPmlzZl9oaXN0W3N0LT5oaXN0X3B0ciAqIE1dLCBNKTsNCisNCisJLyogbG9nX2VuID0gKGZsb2F0KWxvZzEwKGVuciowLjAwNTkzMjIpLyhmbG9hdClsb2cxMCgyLjBmKTsgICovDQorCUxvZzIoZW5yLCAmbG9nX2VuX2UsICZsb2dfZW5fbSk7DQorDQorCS8qIGNvbnZlcnQgZXhwb25lbnQgYW5kIG1hbnRpc3NhIHRvIFdvcmQxNiBRNy4gUTcgaXMgdXNlZCB0byBzaW1wbGlmeSBhdmVyYWdpbmcgaW4gZHR4X2VuYyAqLw0KKwlsb2dfZW4gPSBzaGwobG9nX2VuX2UsIDcpOyAgICAgICAgICAgICAvKiBRNyAqLw0KKwlsb2dfZW4gPSBhZGQobG9nX2VuLCBzaHIobG9nX2VuX20sIDE1IC0gNykpOw0KKw0KKwkvKiBGaW5kIGVuZXJneSBwZXIgc2FtcGxlIGJ5IG11bHRpcGx5aW5nIHdpdGggMC4wMDU5MzIyLCBpLmUgc3VidHJhY3QgbG9nMigxLzAuMDA1OTMyMikgPSA3LjM5NzIyIFRoZQ0KKwkgKiBjb25zdGFudCAwLjAwNTkzMjIgdGFrZXMgaW50byBhY2NvdW50IHdpbmRvd2luZ3MgYW5kIGFuYWx5c2lzIGxlbmd0aCBmcm9tIGF1dG9jb3JyZWxhdGlvbg0KKwkgKiBjb21wdXRhdGlvbnM7IDcuMzk3MjIgaW4gUTcgPSA5NDcgICovDQorCS8qIFN1YnRyYWN0IDMgZEIgPSAwLjk5NjU4IGluIGxvZzIoRSkgPSAxMjcgaW4gUTcuICovDQorCS8qIGxvZ19lbiA9IHN1YiggbG9nX2VuLCA5NDcgKyBlbl9hZGp1c3RbY29kZWNfbW9kZV0gKTsgKi8NCisNCisJLyogRmluZCBlbmVyZ3kgcGVyIHNhbXBsZSAoZGl2aWRlIGJ5IExfRlJBTUU9MjU2KSwgaS5lIHN1YnRyYWN0IGxvZzIoMjU2KSA9IDguMCAgKDEwMjQgaW4gUTcpICovDQorCS8qIFN1YnRyYWN0IDMgZEIgPSAwLjk5NjU4IGluIGxvZzIoRSkgPSAxMjcgaW4gUTcuICovDQorDQorCWxvZ19lbiA9IHN1Yihsb2dfZW4sIGFkZCgxMDI0LCBlbl9hZGp1c3RbY29kZWNfbW9kZV0pKTsNCisNCisJLyogSW5zZXJ0IGludG8gdGhlIGJ1ZmZlciAqLw0KKwlzdC0+bG9nX2VuX2hpc3Rbc3QtPmhpc3RfcHRyXSA9IGxvZ19lbjsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEZ1bmN0aW9uICAgIDogdHhfZHR4X2hhbmRsZXIgUHVycG9zZSAgICAgOiBhZGRzIGV4dHJhIHNwZWVjaCBoYW5nb3Zlcg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFuYWx5emUgc3BlZWNoIG9uDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlY29kaW5nIHNpZGUuDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQordm9pZCB0eF9kdHhfaGFuZGxlcihkdHhfZW5jU3RhdGUgKiBzdCwgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdCAgICAgICAgICAgKi8NCisJCVdvcmQxNiB2YWRfZmxhZywgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogdmFkIGRlY2lzaW9uICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogdXNlZE1vZGUgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBtb2RlIGNoYW5nZWQgb3Igbm90ICAgICovDQorCQkpDQorew0KKw0KKwkvKiB0aGlzIHN0YXRlIG1hY2hpbmUgaXMgaW4gc3luY2ggd2l0aCB0aGUgR1NNRUZSIHR4RHR4IG1hY2hpbmUgICAgICAqLw0KKwlzdC0+ZGVjQW5hRWxhcHNlZENvdW50ID0gYWRkKHN0LT5kZWNBbmFFbGFwc2VkQ291bnQsIDEpOyANCisNCisJaWYgKHZhZF9mbGFnICE9IDApDQorCXsNCisJCXN0LT5kdHhIYW5nb3ZlckNvdW50ID0gRFRYX0hBTkdfQ09OU1Q7DQorCX0gZWxzZQ0KKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub24tc3BlZWNoICovDQorCQlpZiAoc3QtPmR0eEhhbmdvdmVyQ291bnQgPT0gMCkNCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0IG9mIGRlY29kZXIgYW5hbHlzaXMgaGFuZ292ZXIgICovDQorCQkJc3QtPmRlY0FuYUVsYXBzZWRDb3VudCA9IDA7ICAgIA0KKwkJCSp1c2VkTW9kZSA9IE1SRFRYOyAgICAgICAgICAgIA0KKwkJfSBlbHNlDQorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHBvc3NpYmxlIGFuYWx5c2lzIGhhbmdvdmVyICovDQorCQkJc3QtPmR0eEhhbmdvdmVyQ291bnQgPSBzdWIoc3QtPmR0eEhhbmdvdmVyQ291bnQsIDEpOw0KKw0KKwkJCS8qIGRlY0FuYUVsYXBzZWRDb3VudCArIGR0eEhhbmdvdmVyQ291bnQgPCBEVFhfRUxBUFNFRF9GUkFNRVNfVEhSRVNIICovDQorCQkJaWYgKHN1YihhZGQoc3QtPmRlY0FuYUVsYXBzZWRDb3VudCwgc3QtPmR0eEhhbmdvdmVyQ291bnQpLA0KKwkJCQkJCURUWF9FTEFQU0VEX0ZSQU1FU19USFJFU0gpIDwgMCkNCisJCQl7DQorCQkJCSp1c2VkTW9kZSA9IE1SRFRYOw0KKwkJCQkvKiBpZiBzaG9ydCB0aW1lIHNpbmNlIGRlY29kZXIgdXBkYXRlLCBkbyBub3QgYWRkIGV4dHJhIEhPICovDQorCQkJfQ0KKwkJCS8qIGVsc2Ugb3ZlcnJpZGUgVkFEIGFuZCBzdGF5IGluIHNwZWVjaCBtb2RlICp1c2VkTW9kZSBhbmQgYWRkIGV4dHJhIGhhbmdvdmVyICovDQorCQl9DQorCX0NCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCitzdGF0aWMgdm9pZCBhdmVyX2lzZl9oaXN0b3J5KA0KKwkJV29yZDE2IGlzZl9vbGRbXSwNCisJCVdvcmQxNiBpbmRpY2VzW10sDQorCQlXb3JkMzIgaXNmX2F2ZXJbXQ0KKwkJKQ0KK3sNCisJV29yZDMyIGksIGosIGs7DQorCVdvcmQxNiBpc2ZfdG1wWzIgKiBNXTsNCisJV29yZDMyIExfdG1wOw0KKw0KKwkvKiBNZW1vcml6ZSBpbiBpc2ZfdG1wW11bXSB0aGUgSVNGIHZlY3RvcnMgdG8gYmUgcmVwbGFjZWQgYnkgKi8NCisJLyogdGhlIG1lZGlhbiBJU0YgdmVjdG9yIHByaW9yIHRvIHRoZSBhdmVyYWdpbmcgICAgICAgICAgICAgICAqLw0KKwlmb3IgKGsgPSAwOyBrIDwgMjsgaysrKQ0KKwl7DQorCQlpZiAoKGluZGljZXNba10gKyAxKSAhPSAwKQ0KKwkJew0KKwkJCWZvciAoaSA9IDA7IGkgPCBNOyBpKyspDQorCQkJew0KKwkJCQlpc2ZfdG1wW2sgKiBNICsgaV0gPSBpc2Zfb2xkW2luZGljZXNba10gKiBNICsgaV07ICAgICAgDQorCQkJCWlzZl9vbGRbaW5kaWNlc1trXSAqIE0gKyBpXSA9IGlzZl9vbGRbaW5kaWNlc1syXSAqIE0gKyBpXTsgICAgDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qIFBlcmZvcm0gdGhlIElTRiBhdmVyYWdpbmcgKi8NCisJZm9yIChqID0gMDsgaiA8IE07IGorKykNCisJew0KKwkJTF90bXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICANCisNCisJCWZvciAoaSA9IDA7IGkgPCBEVFhfSElTVF9TSVpFOyBpKyspDQorCQl7DQorCQkJTF90bXAgPSBMX2FkZChMX3RtcCwgTF9kZXBvc2l0X2woaXNmX29sZFtpICogTSArIGpdKSk7DQorCQl9DQorCQlpc2ZfYXZlcltqXSA9IExfdG1wOyAgICAgICAgICAgICAgDQorCX0NCisNCisJLyogUmV0cmlldmUgZnJvbSBpc2ZfdG1wW11bXSB0aGUgSVNGIHZlY3RvcnMgc2F2ZWQgcHJpb3IgdG8gYXZlcmFnaW5nICovDQorCWZvciAoayA9IDA7IGsgPCAyOyBrKyspDQorCXsNCisJCWlmICgoaW5kaWNlc1trXSArIDEpICE9IDApDQorCQl7DQorCQkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCQl7DQorCQkJCWlzZl9vbGRbaW5kaWNlc1trXSAqIE0gKyBpXSA9IGlzZl90bXBbayAqIE0gKyBpXTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJcmV0dXJuOw0KK30NCisNCitzdGF0aWMgdm9pZCBmaW5kX2ZyYW1lX2luZGljZXMoDQorCQlXb3JkMTYgaXNmX29sZF90eFtdLA0KKwkJV29yZDE2IGluZGljZXNbXSwNCisJCWR0eF9lbmNTdGF0ZSAqIHN0DQorCQkpDQorew0KKwlXb3JkMzIgTF90bXAsIHN1bW1pbiwgc3VtbWF4LCBzdW1tYXgybmQ7DQorCVdvcmQxNiBpLCBqLCB0bXA7DQorCVdvcmQxNiBwdHI7DQorDQorCS8qIFJlbW92ZSB0aGUgZWZmZWN0IG9mIHRoZSBvbGRlc3QgZnJhbWUgZnJvbSB0aGUgY29sdW1uICovDQorCS8qIHN1bSBzdW1EWzAuLkRUWF9ISVNUX1NJWkUtMV0uIHN1bURbRFRYX0hJU1RfU0laRV0gaXMgICAgKi8NCisJLyogbm90IHVwZGF0ZWQgc2luY2UgaXQgd2lsbCBiZSByZW1vdmVkIGxhdGVyLiAgICAgICAgICAgKi8NCisNCisJdG1wID0gRFRYX0hJU1RfU0laRV9NSU5fT05FOyAgICAgICAgICAgDQorCWogPSAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRV9NSU5fT05FOyBpKyspDQorCXsNCisJCWogPSBhZGQoaiwgdG1wKTsNCisJCXN0LT5zdW1EW2ldID0gTF9zdWIoc3QtPnN1bURbaV0sIHN0LT5EW2pdKTsgICAgIA0KKwkJdG1wID0gc3ViKHRtcCwgMSk7DQorCX0NCisNCisJLyogU2hpZnQgdGhlIGNvbHVtbiBzdW0gc3VtRC4gVGhlIGVsZW1lbnQgc3VtRFtEVFhfSElTVF9TSVpFLTFdICAgICovDQorCS8qIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9sZGVzdCBmcmFtZSBpcyByZW1vdmVkLiBUaGUgc3VtIG9mICAgICAqLw0KKwkvKiB0aGUgZGlzdGFuY2VzIGJldHdlZW4gdGhlIGxhdGVzdCBpc2YgYW5kIG90aGVyIGlzZnMsICovDQorCS8qIGkuZS4gdGhlIGVsZW1lbnQgc3VtRFswXSwgd2lsbCBiZSBjb21wdXRlZCBkdXJpbmcgdGhpcyBjYWxsLiAqLw0KKwkvKiBIZW5jZSB0aGlzIGVsZW1lbnQgaXMgaW5pdGlhbGl6ZWQgdG8gemVyby4gICAgICAgICAgICAgICAgICAgKi8NCisNCisJZm9yIChpID0gRFRYX0hJU1RfU0laRV9NSU5fT05FOyBpID4gMDsgaS0tKQ0KKwl7DQorCQlzdC0+c3VtRFtpXSA9IHN0LT5zdW1EW2kgLSAxXTsgICAgIA0KKwl9DQorCXN0LT5zdW1EWzBdID0gMDsgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwkvKiBSZW1vdmUgdGhlIG9sZGVzdCBmcmFtZSBmcm9tIHRoZSBkaXN0YW5jZSBtYXRyaXguICAgICAgICAgICAqLw0KKwkvKiBOb3RlIHRoYXQgdGhlIGRpc3RhbmNlIG1hdHJpeCBpcyByZXBsYWNlZCBieSBhIG9uZS0gICAgICAgICAqLw0KKwkvKiBkaW1lbnNpb25hbCBhcnJheSB0byBzYXZlIHN0YXRpYyBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKwl0bXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMjc7IGkgPj0gMTI7IGkgPSAoV29yZDE2KSAoaSAtIHRtcCkpDQorCXsNCisJCXRtcCA9IGFkZCh0bXAsIDEpOw0KKwkJZm9yIChqID0gdG1wOyBqID4gMDsgai0tKQ0KKwkJew0KKwkJCXN0LT5EW2kgLSBqICsgMV0gPSBzdC0+RFtpIC0gaiAtIHRtcF07ICAgDQorCQl9DQorCX0NCisNCisJLyogQ29tcHV0ZSB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBkaXN0YW5jZSBtYXRyaXggRCAgICAgICAgICAgICovDQorCS8qIChzcXVhcmVkIEV1Y2xpZGVhbiBkaXN0YW5jZXMgZnJvbSBpc2YxW10gdG8gaXNmX29sZF90eFtdW10pLiAqLw0KKw0KKwlwdHIgPSBzdC0+aGlzdF9wdHI7ICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMTsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbGF0ZXN0IGlzZiBhbmQgdGhlIG90aGVyIGlzZnMuICovDQorCQlwdHIgPSBzdWIocHRyLCAxKTsNCisJCWlmIChwdHIgPCAwKQ0KKwkJew0KKwkJCXB0ciA9IERUWF9ISVNUX1NJWkVfTUlOX09ORTsgICANCisJCX0NCisJCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlmb3IgKGogPSAwOyBqIDwgTTsgaisrKQ0KKwkJew0KKwkJCXRtcCA9IHN1Yihpc2Zfb2xkX3R4W3N0LT5oaXN0X3B0ciAqIE0gKyBqXSwgaXNmX29sZF90eFtwdHIgKiBNICsgal0pOw0KKwkJCUxfdG1wID0gTF9tYWMoTF90bXAsIHRtcCwgdG1wKTsNCisJCX0NCisJCXN0LT5EW2kgLSAxXSA9IExfdG1wOyAgICAgICAgICAgDQorDQorCQkvKiBVcGRhdGUgYWxzbyB0aGUgY29sdW1uIHN1bXMuICovDQorCQlzdC0+c3VtRFswXSA9IExfYWRkKHN0LT5zdW1EWzBdLCBzdC0+RFtpIC0gMV0pOyANCisJCXN0LT5zdW1EW2ldID0gTF9hZGQoc3QtPnN1bURbaV0sIHN0LT5EW2kgLSAxXSk7IA0KKwl9DQorDQorCS8qIEZpbmQgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZGlzdGFuY2VzICovDQorCXN1bW1heCA9IHN0LT5zdW1EWzBdOyAgICAgICAgICAgICAgICAgIA0KKwlzdW1taW4gPSBzdC0+c3VtRFswXTsgICAgICAgICAgICAgICAgICANCisJaW5kaWNlc1swXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCWluZGljZXNbMl0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAxOyBpIDwgRFRYX0hJU1RfU0laRTsgaSsrKQ0KKwl7DQorCQlpZiAoTF9zdWIoc3QtPnN1bURbaV0sIHN1bW1heCkgPiAwKQ0KKwkJew0KKwkJCWluZGljZXNbMF0gPSBpOyAgICAgICAgICAgICAgICANCisJCQlzdW1tYXggPSBzdC0+c3VtRFtpXTsgICAgICAgICAgDQorCQl9DQorCQlpZiAoTF9zdWIoc3QtPnN1bURbaV0sIHN1bW1pbikgPCAwKQ0KKwkJew0KKwkJCWluZGljZXNbMl0gPSBpOyAgICAgICAgICAgICAgICANCisJCQlzdW1taW4gPSBzdC0+c3VtRFtpXTsgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJLyogRmluZCB0aGUgc2Vjb25kIGxhcmdlc3QgZGlzdGFuY2UgKi8NCisJc3VtbWF4Mm5kID0gLTIxNDc0ODM2NDdMOyAgICAgICAgICAgICAgDQorCWluZGljZXNbMV0gPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgRFRYX0hJU1RfU0laRTsgaSsrKQ0KKwl7DQorCQlpZiAoKExfc3ViKHN0LT5zdW1EW2ldLCBzdW1tYXgybmQpID4gMCkgJiYgKHN1YihpLCBpbmRpY2VzWzBdKSAhPSAwKSkNCisJCXsNCisJCQlpbmRpY2VzWzFdID0gaTsgICAgICAgICAgICAgICAgDQorCQkJc3VtbWF4Mm5kID0gc3QtPnN1bURbaV07ICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCXsNCisJCWluZGljZXNbaV0gPSBzdWIoc3QtPmhpc3RfcHRyLCBpbmRpY2VzW2ldKTsgICAgIA0KKwkJaWYgKGluZGljZXNbaV0gPCAwKQ0KKwkJew0KKwkJCWluZGljZXNbaV0gPSBhZGQoaW5kaWNlc1tpXSwgRFRYX0hJU1RfU0laRSk7ICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCS8qIElmIG1heGltdW0gZGlzdGFuY2UvTUVEX1RIUkVTSCBpcyBzbWFsbGVyIHRoYW4gbWluaW11bSBkaXN0YW5jZSAqLw0KKwkvKiB0aGVuIHRoZSBtZWRpYW4gSVNGIHZlY3RvciByZXBsYWNlbWVudCBpcyBub3QgcGVyZm9ybWVkICAgICAgICAgKi8NCisJdG1wID0gbm9ybV9sKHN1bW1heCk7DQorCXN1bW1heCA9IChzdW1tYXggPDwgdG1wKTsNCisJc3VtbWluID0gKHN1bW1pbiA8PCB0bXApOw0KKwlMX3RtcCA9IExfbXVsdCh2b3JvdW5kKHN1bW1heCksIElOVl9NRURfVEhSRVNIKTsNCisJaWYoTF90bXAgPD0gc3VtbWluKQ0KKwl7DQorCQlpbmRpY2VzWzBdID0gLTE7IA0KKwl9DQorCS8qIElmIHNlY29uZCBsYXJnZXN0IGRpc3RhbmNlL01FRF9USFJFU0ggaXMgc21hbGxlciB0aGFuICAgICAqLw0KKwkvKiBtaW5pbXVtIGRpc3RhbmNlIHRoZW4gdGhlIG1lZGlhbiBJU0YgdmVjdG9yIHJlcGxhY2VtZW50IGlzICAgICovDQorCS8qIG5vdCBwZXJmb3JtZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJc3VtbWF4Mm5kID0gTF9zaGwoc3VtbWF4Mm5kLCB0bXApOw0KKwlMX3RtcCA9IExfbXVsdCh2b3JvdW5kKHN1bW1heDJuZCksIElOVl9NRURfVEhSRVNIKTsNCisJaWYoTF90bXAgPD0gc3VtbWluKQ0KKwl7DQorCQlpbmRpY2VzWzFdID0gLTE7ICAgICAgICAgICAgICAgICANCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KK3N0YXRpYyBXb3JkMTYgZGl0aGVyaW5nX2NvbnRyb2woDQorCQlkdHhfZW5jU3RhdGUgKiBzdA0KKwkJKQ0KK3sNCisJV29yZDE2IHRtcCwgbWVhbiwgQ05fZGl0aCwgZ2Fpbl9kaWZmOw0KKwlXb3JkMzIgaSwgSVNGX2RpZmY7DQorDQorCS8qIGRldGVybWluZSBob3cgc3RhdGlvbmFyeSB0aGUgc3BlY3RydW0gb2YgYmFja2dyb3VuZCBub2lzZSBpcyAqLw0KKwlJU0ZfZGlmZiA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspDQorCXsNCisJCUlTRl9kaWZmID0gTF9hZGQoSVNGX2RpZmYsIHN0LT5zdW1EW2ldKTsNCisJfQ0KKwlpZiAoKElTRl9kaWZmID4+IDI2KSA+IDApDQorCXsNCisJCUNOX2RpdGggPSAxOw0KKwl9IGVsc2UNCisJew0KKwkJQ05fZGl0aCA9IDA7DQorCX0NCisNCisJLyogZGV0ZXJtaW5lIGhvdyBzdGF0aW9uYXJ5IHRoZSBlbmVyZ3kgb2YgYmFja2dyb3VuZCBub2lzZSBpcyAqLw0KKwltZWFuID0gMDsNCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJbWVhbiA9IGFkZChtZWFuLCBzdC0+bG9nX2VuX2hpc3RbaV0pOw0KKwl9DQorCW1lYW4gPSAobWVhbiA+PiAzKTsNCisJZ2Fpbl9kaWZmID0gMDsNCisJZm9yIChpID0gMDsgaSA8IERUWF9ISVNUX1NJWkU7IGkrKykNCisJew0KKwkJdG1wID0gYWJzX3Moc3ViKHN0LT5sb2dfZW5faGlzdFtpXSwgbWVhbikpOw0KKwkJZ2Fpbl9kaWZmID0gYWRkKGdhaW5fZGlmZiwgdG1wKTsNCisJfQ0KKwlpZiAoZ2Fpbl9kaWZmID4gR0FJTl9USFIpDQorCXsNCisJCUNOX2RpdGggPSAxOw0KKwl9DQorCXJldHVybiBDTl9kaXRoOw0KK30NCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ19waXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDEzOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dfcGl0Y2guYwpAQCAtMCwwICsxLDc5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBnX3BpdGNoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJICAgRGVzY3JpcHRpb246Q29tcHV0ZSB0aGUgZ2FpbiBvZiBwaXRjaC4gUmVzdWx0IGluIFExMiAgICAgICAgKg0KKyoJICAgICAgICAgICAgICAgaWYoZ2FpbiA8IDApIGdhaW4gPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoJCQkJICAgaWYoZ2FpbiA+IDEuMikgZ2FpbiA9IDEuMiAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorDQorV29yZDE2IEdfcGl0Y2goICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTQgOiBHYWluIG9mIHBpdGNoIGxhZyBzYXR1cmF0ZWQgdG8gMS4yICAgKi8NCisJCVdvcmQxNiB4bltdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IFBpdGNoIHRhcmdldC4gICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHkxW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZmlsdGVyZWQgYWRhcHRpdmUgY29kZWJvb2suICAgICAgICAgICovDQorCQlXb3JkMTYgZ19jb2VmZltdLCAgICAgICAgICAgICAgICAgICAgIC8qIDogQ29ycmVsYXRpb25zIG5lZWQgZm9yIGdhaW4gcXVhbnRpemF0aW9uLiAgICAgKi8NCisJCVdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogOiBMZW5ndGggb2Ygc3ViZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICApDQorew0KKwlXb3JkMzIgaTsNCisJV29yZDE2IHh5LCB5eSwgZXhwX3h5LCBleHBfeXksIGdhaW47DQorCS8qIENvbXB1dGUgc2NhbGFyIHByb2R1Y3QgPHkxW10seTFbXT4gKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCS8qIENvbXB1dGUgc2NhbGFyIHByb2R1Y3QgPHhuW10seTFbXT4gKi8NCisJeHkgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMl9hc20oeG4sIHkxLCBMX3N1YmZyLCAmZXhwX3h5KSk7DQorCXl5ID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKHkxLCB5MSwgTF9zdWJmciwgJmV4cF95eSkpOw0KKw0KKyNlbHNlDQorCS8qIENvbXB1dGUgc2NhbGFyIHByb2R1Y3QgPHhuW10seTFbXT4gKi8NCisJeHkgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMih4biwgeTEsIExfc3ViZnIsICZleHBfeHkpKTsNCisJeXkgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMih5MSwgeTEsIExfc3ViZnIsICZleHBfeXkpKTsNCisNCisjZW5kaWYNCisNCisJZ19jb2VmZlswXSA9IHl5OyAgICAgICAgICAgICAgICAgICAgICAgDQorCWdfY29lZmZbMV0gPSBleHBfeXk7ICAgICAgICAgICAgICAgICAgIA0KKwlnX2NvZWZmWzJdID0geHk7ICAgICAgICAgICAgICAgICAgICAgICANCisJZ19jb2VmZlszXSA9IGV4cF94eTsgICAgICAgICAgICAgICAgICAgDQorDQorCS8qIElmICh4eSA8IDApIGdhaW4gPSAwICovDQorCWlmICh4eSA8IDApDQorCQlyZXR1cm4gKChXb3JkMTYpIDApOw0KKw0KKwkvKiBjb21wdXRlIGdhaW4gPSB4eS95eSAqLw0KKw0KKwl4eSA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJlIHN1cmUgeHkgPCB5eSAqLw0KKwlnYWluID0gZGl2X3MoeHksIHl5KTsNCisNCisJaSA9IGV4cF94eTsNCisJaSAtPSBleHBfeXk7DQorDQorCWdhaW4gPSBzaGwoZ2FpbiwgaSk7ICAgICAgICAgICAgICAgICAgIA0KKw0KKwkvKiBpZiAoZ2FpbiA+IDEuMikgZ2FpbiA9IDEuMiAgaW4gUTE0ICovDQorCWlmKGdhaW4gPiAxOTY2MSkNCisJew0KKwkJZ2FpbiA9IDE5NjYxOyAgICAgICAgICAgICAgICAgICAgICANCisJfQ0KKwlyZXR1cm4gKGdhaW4pOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2dwY2xpcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ncGNsaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjNmMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ncGNsaXAuYwpAQCAtMCwwICsxLDExMCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogZ3BjbGlwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246VG8gYXZvaWQgdW5zdGFibGUgc3ludGhlc2lzIG9uIGZyYW1lIGVyYXN1cmUsIHRoZSBnYWluICoNCisqICAgICAgbmVlZCB0byBiZSBsaW1pdGVkKGdhaW4gcGl0Y2ggPCAxLjApIHdoZW4gdGhlIGZvbGxvd2luZyAgICAgICAgICAgICoNCisqICAgICAgY2FzZSBvY2N1cnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgYSByZXNvbmFuY2Ugb24gTFBDIGZpbHRlcihscF9kaXNwIDwgNjBIeikgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgYSBnb29kIHBpdGNoIHByZWRpY3Rpb24gKGxwX2dwID4gMC45NSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCisjZGVmaW5lIERJU1RfSVNGX01BWCAgICAzMDcgICAgICAgICAgICAgICAgLyogMTIwIEh6ICg2NDAwSHo9MTYzODQpICovDQorI2RlZmluZSBESVNUX0lTRl9USFJFUyAgMTU0ICAgICAgICAgICAgICAgIC8qIDYwICAgICAoNjQwMEh6PTE2Mzg0KSAqLw0KKyNkZWZpbmUgR0FJTl9QSVRfVEhSRVMgIDE0NzQ2ICAgICAgICAgICAgICAvKiAwLjkgaW4gUTE0ICovDQorI2RlZmluZSBHQUlOX1BJVF9NSU4gICAgOTgzMCAgICAgICAgICAgICAgIC8qIDAuNiBpbiBRMTQgKi8NCisjZGVmaW5lIE0gICAgICAgICAgICAgICAxNg0KKw0KKw0KK3ZvaWQgSW5pdF9ncF9jbGlwKA0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgOiBtZW1vcnkgb2YgZ2FpbiBvZiBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCisJCSkNCit7DQorCW1lbVswXSA9IERJU1RfSVNGX01BWDsgICAgICAgICAgICAgICAgIA0KKwltZW1bMV0gPSBHQUlOX1BJVF9NSU47ICAgICAgICAgICAgICAgICANCit9DQorDQorDQorV29yZDE2IEdwX2NsaXAoDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIDogbWVtb3J5IG9mIGdhaW4gb2YgcGl0Y2ggY2xpcHBpbmcgYWxnb3JpdGhtICovDQorCSAgICAgICkNCit7DQorCVdvcmQxNiBjbGlwID0gMDsNCisJaWYgKChtZW1bMF0gPCBESVNUX0lTRl9USFJFUykgJiYgKG1lbVsxXSA+IEdBSU5fUElUX1RIUkVTKSkNCisJCWNsaXAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCXJldHVybiAoY2xpcCk7DQorfQ0KKw0KKw0KK3ZvaWQgR3BfY2xpcF90ZXN0X2lzZigNCisJCVdvcmQxNiBpc2ZbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBpc2YgdmFsdWVzIChpbiBmcmVxdWVuY3kgZG9tYWluKSAgICAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBtZW1vcnkgb2YgZ2FpbiBvZiBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCisJCSkNCit7DQorCVdvcmQxNiBkaXN0LCBkaXN0X21pbjsNCisJV29yZDMyIGk7DQorDQorCWRpc3RfbWluID0gdm9fc3ViKGlzZlsxXSwgaXNmWzBdKTsNCisNCisJZm9yIChpID0gMjsgaSA8IE0gLSAxOyBpKyspDQorCXsNCisJCWRpc3QgPSB2b19zdWIoaXNmW2ldLCBpc2ZbaSAtIDFdKTsNCisJCWlmKGRpc3QgPCBkaXN0X21pbikNCisJCXsNCisJCQlkaXN0X21pbiA9IGRpc3Q7ICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJZGlzdCA9IGV4dHJhY3RfaChMX21hYyh2b19MX211bHQoMjYyMTQsIG1lbVswXSksIDY1NTQsIGRpc3RfbWluKSk7DQorDQorCWlmIChkaXN0ID4gRElTVF9JU0ZfTUFYKQ0KKwl7DQorCQlkaXN0ID0gRElTVF9JU0ZfTUFYOyAgICAgICAgICAgICAgIA0KKwl9DQorCW1lbVswXSA9IGRpc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCXJldHVybjsNCit9DQorDQorDQordm9pZCBHcF9jbGlwX3Rlc3RfZ2Fpbl9waXQoDQorCQlXb3JkMTYgZ2Fpbl9waXQsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTQgOiBnYWluIG9mIHF1YW50aXplZCBwaXRjaCAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IG1lbW9yeSBvZiBnYWluIG9mIHBpdGNoIGNsaXBwaW5nIGFsZ29yaXRobSAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IGdhaW47DQorCVdvcmQzMiBMX3RtcDsNCisJTF90bXAgPSAoMjk0OTEgKiBtZW1bMV0pPDwxOw0KKwlMX3RtcCArPSAoMzI3NyAqIGdhaW5fcGl0KTw8MTsNCisNCisJZ2FpbiA9IGV4dHJhY3RfaChMX3RtcCk7DQorDQorCWlmKGdhaW4gPCBHQUlOX1BJVF9NSU4pDQorCXsNCisJCWdhaW4gPSBHQUlOX1BJVF9NSU47ICAgICAgICAgICAgICANCisJfQ0KKwltZW1bMV0gPSBnYWluOyAgICAgICAgICAgICAgICAgICAgICAgICANCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hvbWluZy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ob21pbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU2MzNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ob21pbmcuYwpAQCAtMCwwICsxLDQ2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogaG9taW5nLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246UGVyZm9ybXMgdGhlIGhvbWluZyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJjbnN0LmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImJpdHMuaCINCisjaW5jbHVkZSAiaG9taW5nLnRhYiINCisNCitXb3JkMTYgZW5jb2Rlcl9ob21pbmdfZnJhbWVfdGVzdChXb3JkMTYgaW5wdXRfZnJhbWVbXSkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMTYgaiA9IDA7DQorDQorCS8qIGNoZWNrIDMyMCBpbnB1dCBzYW1wbGVzIGZvciBtYXRjaGluZyBFSEZfTUFTSzogZGVmaW5lZCBpbiBlX2hvbWluZy5oICovDQorCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FMTZrOyBpKyspDQorCXsNCisJCWogPSAoV29yZDE2KSAoaW5wdXRfZnJhbWVbaV0gXiBFSEZfTUFTSyk7DQorDQorCQlpZiAoaikNCisJCQlicmVhazsNCisJfQ0KKw0KKwlyZXR1cm4gKFdvcmQxNikgKCFqKTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDQwMC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDQwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2E1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNDAwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGhwNDAwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAybmQgb3JkZXIgaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dCBvZmYgZnJlcXVlbmN5IGF0IDQwMCBIei4gICAgICAgICAgKg0KKyogRGVzaWduZWQgd2l0aCBjaGVieTIgZnVuY3Rpb24gaW4gTUFUTEFCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIE9wdGltaXplZCBmb3IgZml4ZWQtcG9pbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgZnJlcXVlbmN5IHJlc3BvbnNlOiAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIGZyZXF1ZW5jeTogICAgIDBIeiAgIDEwMEh6ICAyMDBIeiAgMzAwSHogIDQwMEh6ICA2MzBIeiAgMS41a0h6ICAza0h6ICoNCisqICBkQiBsb3NzOiAgICAgLWluZmRCICAtMzBkQiAgLTIwZEIgIC0xMGRCICAtM2RCICAgKzZkQiAgICArMWRCICAgIDBkQiAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgeVtpXSA9IGJbMF0qeFtpXSArIGJbMV0qeFtpLTFdICsgYlsyXSp4W2ktMl0gICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgKyBhWzFdKnlbaS0xXSArIGFbMl0qeVtpLTJdOyAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgV29yZDE2IGJbM10gPSB7MzY2MCwgLTczMjAsICAzNjYwfTsgICAgICAgaW4gUTEyICAgICAgICAgICAgICAgICAgICAgKg0KKyogIFdvcmQxNiBhWzNdID0gezQwOTYsICA3MzIwLCAtMzU0MH07ICAgICAgIGluIFExMiAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgZmxvYXQgLS0+ICAgYlszXSA9IHswLjg5MzU1NDY4NywgLTEuNzg3MTA5Mzc1LCAgMC44OTM1NTQ2ODd9OyAgICAgICAgKg0KKyogICAgICAgICAgICAgIGFbM10gPSB7MS4wMDAwMDAwMDAsICAxLjc4NzEwOTM3NSwgLTAuODY0MjU3ODEyfTsgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorDQorLyogZmlsdGVyIGNvZWZmaWNpZW50cyAgKi8NCitzdGF0aWMgV29yZDE2IGJbM10gPSB7OTE1LCAtMTgzMCwgOTE1fTsgICAgICAgICAvKiBRMTIgKC80KSAqLw0KK3N0YXRpYyBXb3JkMTYgYVszXSA9IHsxNjM4NCwgMjkyODAsIC0xNDE2MH07ICAgIC8qIFExMiAoeDQpICovDQorLyogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIHZhbHVlcyAqLw0KKw0KK3ZvaWQgSW5pdF9IUDQwMF8xMms4KFdvcmQxNiBtZW1bXSkNCit7DQorCVNldF96ZXJvKG1lbSwgNik7DQorfQ0KKw0KKw0KK3ZvaWQgSFA0MDBfMTJrOCgNCisJCVdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgc2lnbmFsIC8gb3V0cHV0IGlzIGRpdmlkZWQgYnkgMTYgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ2h0IG9mIHNpZ25hbCAgICAqLw0KKwkJV29yZDE2IG1lbVtdICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaWx0ZXIgbWVtb3J5IFs2XSAgICovDQorCSAgICAgICApDQorew0KKwlXb3JkMTYgIHgyOw0KKwlXb3JkMTYgeTJfaGksIHkyX2xvLCB5MV9oaSwgeTFfbG8sIHgwLCB4MTsNCisJV29yZDMyIExfdG1wOw0KKwlXb3JkMzIgbnVtOw0KKwl5Ml9oaSA9ICptZW0rKzsNCisJeTJfbG8gPSAqbWVtKys7DQorCXkxX2hpID0gKm1lbSsrOw0KKwl5MV9sbyA9ICptZW0rKzsNCisJeDAgPSAqbWVtKys7ICAgDQorCXgxID0gKm1lbTsgICANCisJbnVtID0gKFdvcmQzMilsZzsNCisJZG8NCisJew0KKwkJeDIgPSB4MTsNCisJCXgxID0geDA7DQorCQl4MCA9ICpzaWduYWw7DQorCQkvKiB5W2ldID0gYlswXSp4W2ldICsgYlsxXSp4W2ktMV0gKyBiMTQwWzJdKnhbaS0yXSAgKi8NCisJCS8qICsgYVsxXSp5W2ktMV0gKyBhWzJdICogeVtpLTJdOyAgKi8NCisJCUxfdG1wID0gODE5Mkw7ICAgICAgICAgICAgICAgICAgICAvKiByb3VuZGluZyB0byBtYXhpbWlzZSBwcmVjaXNpb24gKi8NCisJCUxfdG1wICs9IHkxX2xvICogYVsxXTsNCisJCUxfdG1wICs9IHkyX2xvICogYVsyXTsNCisJCUxfdG1wID0gTF90bXAgPj4gMTQ7DQorCQlMX3RtcCArPSAoeTFfaGkgKiBhWzFdICsgeTJfaGkgKiBhWzJdICsgKHgwICsgeDIpKiBiWzBdICsgeDEgKiBiWzFdKSA8PCAxOw0KKwkJTF90bXAgPDw9IDE7ICAgICAgICAgICAvKiBjb2VmZiBRMTIgLS0+IFExMyAqLw0KKwkJeTJfaGkgPSB5MV9oaTsNCisJCXkyX2xvID0geTFfbG87DQorCQl5MV9oaSA9IChXb3JkMTYpKExfdG1wPj4xNik7DQorCQl5MV9sbyA9IChXb3JkMTYpKChMX3RtcCAmIDB4ZmZmZik+PjEpOw0KKw0KKwkJLyogc2lnbmFsIGlzIGRpdmlkZWQgYnkgMTYgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZW5lcmd5IGNvbXB1dGF0aW9uICovDQorCQkqc2lnbmFsKysgPSAoTF90bXAgKyAweDgwMDApID4+IDE2Ow0KKwl9d2hpbGUoLS1udW0gIT0wKTsNCisNCisJKm1lbS0tID0geDE7DQorCSptZW0tLSA9IHgwOw0KKwkqbWVtLS0gPSB5MV9sbzsNCisJKm1lbS0tID0geTFfaGk7DQorCSptZW0tLSA9IHkyX2xvOw0KKwkqbWVtICAgPSB5Ml9oaTsgIA0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlM2Q3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jCkBAIC0wLDAgKzEsMTA2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBocDUwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKgkgICBEZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogMm5kIG9yZGVyIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXQgb2ZmIGZyZXF1ZW5jeSBhdCAzMSBIei4gICAgICAgICAgICoNCisqIERlc2lnbmVkIHdpdGggY2hlYnkyIGZ1bmN0aW9uIGluIE1BVExBQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBPcHRpbWl6ZWQgZm9yIGZpeGVkLXBvaW50IHRvIGdldCB0aGUgZm9sbG93aW5nIGZyZXF1ZW5jeSByZXNwb25zZTogICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBmcmVxdWVuY3k6ICAgICAwSHogICAgMTRIeiAgMjRIeiAgIDMxSHogICAzN0h6ICAgNDFIeiAgIDQ3SHogICAgICAgICAqDQorKiAgZEIgbG9zczogICAgIC1pbmZkQiAgLTE1ZEIgIC02ZEIgICAtM2RCICAtMS41ZEIgIC0xZEIgIC0wLjVkQiAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIHlbaV0gPSBiWzBdKnhbaV0gKyBiWzFdKnhbaS0xXSArIGJbMl0qeFtpLTJdICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICsgYVsxXSp5W2ktMV0gKyBhWzJdKnlbaS0yXTsgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIFdvcmQxNiBiWzNdID0gezQwNTMsIC04MTA2LCA0MDUzfTsgICAgICAgaW4gUTEyICAgICAgICAgICAgICAgICAgICAgICoNCisqICBXb3JkMTYgYVszXSA9IHs4MTkyLCAxNjIxMSwgLTgwMjF9OyAgICAgICBpbiBRMTIgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIGZsb2F0IC0tPiAgIGJbM10gPSB7MC45ODk1MDE5NTMsIC0xLjk3OTAwMzkwNiwgIDAuOTg5NTAxOTUzfTsgICAgICAgICoNCisqICAgICAgICAgICAgICBhWzNdID0gezEuMDAwMDAwMDAwLCAgMS45Nzg4ODE4MzYsIC0wLjk3OTEyNTk3N307ICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisNCisvKiBmaWx0ZXIgY29lZmZpY2llbnRzICAqLw0KK3N0YXRpYyBXb3JkMTYgYlszXSA9IHs0MDUzLCAtODEwNiwgNDA1M307ICAvKiBRMTIgKi8NCitzdGF0aWMgV29yZDE2IGFbM10gPSB7ODE5MiwgMTYyMTEsIC04MDIxfTsgLyogUTEyICh4MikgKi8NCisNCisvKiBJbml0aWFsaXphdGlvbiBvZiBzdGF0aWMgdmFsdWVzICovDQorDQordm9pZCBJbml0X0hQNTBfMTJrOChXb3JkMTYgbWVtW10pDQorew0KKwlTZXRfemVybyhtZW0sIDYpOw0KK30NCisNCisNCit2b2lkIEhQNTBfMTJrOCgNCisJCVdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IHNpZ25hbCAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5naHQgb2Ygc2lnbmFsICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpbHRlciBtZW1vcnkgWzZdICAgKi8NCisJICAgICAgKQ0KK3sNCisJV29yZDE2IHgyOw0KKwlXb3JkMTYgeTJfaGksIHkyX2xvLCB5MV9oaSwgeTFfbG8sIHgwLCB4MTsNCisJV29yZDMyIExfdG1wOw0KKwlXb3JkMzIgbnVtOw0KKw0KKwl5Ml9oaSA9ICptZW0rKzsNCisJeTJfbG8gPSAqbWVtKys7DQorCXkxX2hpID0gKm1lbSsrOw0KKwl5MV9sbyA9ICptZW0rKzsNCisJeDAgPSAqbWVtKys7ICAgDQorCXgxID0gKm1lbTsNCisJbnVtID0gKFdvcmQzMilsZzsNCisJZG8NCisJew0KKwkJeDIgPSB4MTsNCisJCXgxID0geDA7DQorCQl4MCA9ICpzaWduYWw7DQorCQkvKiB5W2ldID0gYlswXSp4W2ldICsgYlsxXSp4W2ktMV0gKyBiMTQwWzJdKnhbaS0yXSAgKi8NCisJCS8qICsgYVsxXSp5W2ktMV0gKyBhWzJdICogeVtpLTJdOyAgKi8NCisJCUxfdG1wID0gODE5MiA7ICAgICAgICAgICAgICAgICAgICAvKiByb3VuZGluZyB0byBtYXhpbWlzZSBwcmVjaXNpb24gKi8NCisJCUxfdG1wICs9IHkxX2xvICogYVsxXTsNCisJCUxfdG1wICs9IHkyX2xvICogYVsyXTsNCisJCUxfdG1wID0gTF90bXAgPj4gMTQ7DQorCQlMX3RtcCArPSAoeTFfaGkgKiBhWzFdICsgeTJfaGkgKiBhWzJdICsgKHgwICsgeDIpICogYlswXSArIHgxICogYlsxXSkgPDwgMTsNCisJCUxfdG1wIDw8PSAyOyAgICAgICAgICAgLyogY29lZmYgUTEyIC0tPiBRMTMgKi8NCisJCXkyX2hpID0geTFfaGk7DQorCQl5Ml9sbyA9IHkxX2xvOw0KKwkJeTFfaGkgPSAoV29yZDE2KShMX3RtcD4+MTYpOw0KKwkJeTFfbG8gPSAoV29yZDE2KSgoTF90bXAgJiAweGZmZmYpPj4xKTsNCisJCSpzaWduYWwrKyA9IGV4dHJhY3RfaCgoTF9hZGQoKExfdG1wPDwxKSwgMHg4MDAwKSkpOw0KKwl9d2hpbGUoLS1udW0gIT0wKTsNCisNCisJKm1lbS0tID0geDE7DQorCSptZW0tLSA9IHgwOw0KKwkqbWVtLS0gPSB5MV9sbzsNCisJKm1lbS0tID0geTFfaGk7DQorCSptZW0tLSA9IHkyX2xvOw0KKwkqbWVtLS0gPSB5Ml9oaTsgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA2ay5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDZrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlNWIyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA2ay5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBocDZrLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCURlc2NyaXB0aW9uOjE1dGggb3JkZXIgYmFuZCBwYXNzIDZrSHogdG8gN2tIeiBGSVIgZmlsdGVyICAgICAgICAqDQorKiAgICAgICBmcmVxdWVuY3k6IDRrSHogICA1a0h6ICA1LjVrSHogIDZrSHogIDYuNWtIeiAgN2tIeiA3LjVrSHogOGtIeiAgKg0KKyoJZEIgbG9zczogIC02MGRCICAtNDVkQiAgLTEzZEIgICAtM2RCICAgMGRCICAgIC0zZEIgLTEzZEIgIC00NWRCICoNCisqCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KKyNkZWZpbmUgTF9GSVIgMzENCisNCisvKiBmaWx0ZXIgY29lZmZpY2llbnRzIChnYWluPTQuMCkgKi8NCisNCitXb3JkMTYgZmlyXzZrXzdrW0xfRklSXSA9DQorew0KKwktMzIsIDQ3LCAzMiwgLTI3LCAtMzY5LA0KKwkxMTIyLCAtMTQyMSwgMCwgMzc5OCwgLTg4ODAsDQorCTEyMzQ5LCAtMTA5ODQsIDM1NDgsIDc3NjYsIC0xODAwMSwNCisJMjIxMTgsIC0xODAwMSwgNzc2NiwgMzU0OCwgLTEwOTg0LA0KKwkxMjM0OSwgLTg4ODAsIDM3OTgsIDAsIC0xNDIxLA0KKwkxMTIyLCAtMzY5LCAtMjcsIDMyLCA0NywNCisJLTMyDQorfTsNCisNCisNCit2b2lkIEluaXRfRmlsdF82a183ayhXb3JkMTYgbWVtW10pICAgICAgICAgLyogbWVtWzMwXSAqLw0KK3sNCisJU2V0X3plcm8obWVtLCBMX0ZJUiAtIDEpOw0KKwlyZXR1cm47DQorfQ0KKw0KK3ZvaWQgRmlsdF82a183aygNCisJCVdvcmQxNiBzaWduYWxbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQ6ICBzaWduYWwgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIGxlbmd0aCBvZiBpbnB1dCAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogbWVtb3J5IChzaXplPTMwKSAgICAgICAgKi8NCisJICAgICAgICkNCit7DQorCVdvcmQxNiB4W0xfU1VCRlIxNmsgKyAoTF9GSVIgLSAxKV07DQorCVdvcmQzMiBpLCBMX3RtcDsNCisNCisJQ29weShtZW0sIHgsIExfRklSIC0gMSk7DQorCWZvciAoaSA9IGxnIC0gMTsgaSA+PSAwOyBpLS0pDQorCXsNCisJCXhbaSArIExfRklSIC0gMV0gPSBzaWduYWxbaV0gPj4gMjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2FpbiBvZiBmaWx0ZXIgPSA0ICovDQorCX0JDQorCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQ0KKwl7DQorCQlMX3RtcCA9ICAoeFtpXSArIHhbaSsgMzBdKSAqIGZpcl82a183a1swXTsNCisJCUxfdG1wICs9ICh4W2krMV0gKyB4W2kgKyAyOV0pICogZmlyXzZrXzdrWzFdOw0KKwkJTF90bXAgKz0gKHhbaSsyXSArIHhbaSArIDI4XSkgKiBmaXJfNmtfN2tbMl07DQorCQlMX3RtcCArPSAoeFtpKzNdICsgeFtpICsgMjddKSAqIGZpcl82a183a1szXTsNCisJCUxfdG1wICs9ICh4W2krNF0gKyB4W2kgKyAyNl0pICogZmlyXzZrXzdrWzRdOw0KKwkJTF90bXAgKz0gKHhbaSs1XSArIHhbaSArIDI1XSkgKiBmaXJfNmtfN2tbNV07DQorCQlMX3RtcCArPSAoeFtpKzZdICsgeFtpICsgMjRdKSAqIGZpcl82a183a1s2XTsNCisJCUxfdG1wICs9ICh4W2krN10gKyB4W2kgKyAyM10pICogZmlyXzZrXzdrWzddOw0KKwkJTF90bXAgKz0gKHhbaSs4XSArIHhbaSArIDIyXSkgKiBmaXJfNmtfN2tbOF07DQorCQlMX3RtcCArPSAoeFtpKzldICsgeFtpICsgMjFdKSAqIGZpcl82a183a1s5XTsNCisJCUxfdG1wICs9ICh4W2krMTBdICsgeFtpICsgMjBdKSAqIGZpcl82a183a1sxMF07DQorCQlMX3RtcCArPSAoeFtpKzExXSArIHhbaSArIDE5XSkgKiBmaXJfNmtfN2tbMTFdOw0KKwkJTF90bXAgKz0gKHhbaSsxMl0gKyB4W2kgKyAxOF0pICogZmlyXzZrXzdrWzEyXTsNCisJCUxfdG1wICs9ICh4W2krMTNdICsgeFtpICsgMTddKSAqIGZpcl82a183a1sxM107DQorCQlMX3RtcCArPSAoeFtpKzE0XSArIHhbaSArIDE2XSkgKiBmaXJfNmtfN2tbMTRdOw0KKwkJTF90bXAgKz0gKHhbaSsxNV0pICogZmlyXzZrXzdrWzE1XTsNCisJCXNpZ25hbFtpXSA9IChMX3RtcCArIDB4NDAwMCkgPj4gMTU7DQorCX0NCisNCisJQ29weSh4ICsgbGcsIG1lbSwgTF9GSVIgLSAxKTsNCisNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocF93c3AuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHBfd3NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiNjJhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHBfd3NwLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBocF93c3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIDNuZCBvcmRlciBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0IG9mZiBmcmVxdWVuY3kgYXQgMTgwSHogICAgICAqDQorKiBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICB5W2ldID0gYlswXSp4W2ldICsgYlsxXSp4W2ktMV0gKyBiWzJdKnhbaS0yXSArIGJbM10qeFtpLTNdICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICArIGFbMV0qeVtpLTFdICsgYVsyXSp5W2ktMl0gKyBhWzNdKnlbaS0zXTsgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIGZsb2F0IGFfY29lZltIUF9PUkRFUl09IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAtMi42NDQzNjcxMTYwMDY2NGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgMi4zNTA4NzM4NjYyNTM2MGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgLTAuNzAwMDExNTY5Mjc0MjRmfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogZmxvYXQgYl9jb2VmW0hQX09SREVSKzFdPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAtMC44Mzc4NzA1NzUwNTY2NWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAyLjUwOTc1NTcwMDcxMDU4ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAtMi41MDk3NTU3MDA3MTA1OGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgIDAuODM3ODcwNTc1MDU2NjVmfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisNCisvKiBmaWx0ZXIgY29lZmZpY2llbnRzIGluIFExMiAqLw0KK3N0YXRpYyBXb3JkMTYgYVs0XSA9IHs4MTkyLCAyMTY2MywgLTE5MjU4LCA1NzM0fTsNCitzdGF0aWMgV29yZDE2IGJbNF0gPSB7LTM0MzIsICsxMDI4MCwgLTEwMjgwLCArMzQzMn07DQorDQorLyogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIHZhbHVlcyAqLw0KK3ZvaWQgSW5pdF9IcF93c3AoV29yZDE2IG1lbVtdKQ0KK3sNCisJU2V0X3plcm8obWVtLCA5KTsNCisNCisJcmV0dXJuOw0KK30NCisNCit2b2lkIHNjYWxlX21lbV9IcF93c3AoV29yZDE2IG1lbVtdLCBXb3JkMTYgZXhwKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiBMX3RtcDsNCisNCisJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikNCisJew0KKwkJTF90bXAgPSAoKG1lbVtpXSA8PCAxNikgKyAobWVtW2kgKyAxXTw8MSkpOw0KKwkJTF90bXAgPSBMX3NobChMX3RtcCwgZXhwKTsNCisJCW1lbVtpXSA9IExfdG1wID4+IDE2Ow0KKwkJbWVtW2kgKyAxXSA9IChMX3RtcCAmIDB4ZmZmZik+PjE7DQorCX0NCisNCisJZm9yIChpID0gNjsgaSA8IDk7IGkrKykNCisJew0KKwkJTF90bXAgPSBMX2RlcG9zaXRfaChtZW1baV0pOyAgICAgICAvKiB4W2ldICovDQorCQlMX3RtcCA9IExfc2hsKExfdG1wLCBleHApOw0KKwkJbWVtW2ldID0gdm9fcm91bmQoTF90bXApOw0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorDQordm9pZCBIcF93c3AoDQorCQlXb3JkMTYgd3NwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHdzcFtdICBzaWduYWwgICAgICAgKi8NCisJCVdvcmQxNiBocF93c3BbXSwgICAgICAgICAgICAgICAgICAgICAgLyogbyAgIDogaHlwYXNzIHdzcFtdICAgICAgICAqLw0KKwkJV29yZDE2IGxnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBsZW5naHQgb2Ygc2lnbmFsICAgICovDQorCQlXb3JkMTYgbWVtW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IGZpbHRlciBtZW1vcnkgWzldICAgKi8NCisJICAgKQ0KK3sNCisJV29yZDE2IHgwLCB4MSwgeDIsIHgzOw0KKwlXb3JkMTYgeTNfaGksIHkzX2xvLCB5Ml9oaSwgeTJfbG8sIHkxX2hpLCB5MV9sbzsNCisJV29yZDMyIGksIExfdG1wOw0KKw0KKwl5M19oaSA9IG1lbVswXTsgICAgICAgICAgICAgICAgICAgICAgICANCisJeTNfbG8gPSBtZW1bMV07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCXkyX2hpID0gbWVtWzJdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl5Ml9sbyA9IG1lbVszXTsgICAgICAgICAgICAgICAgICAgICAgICANCisJeTFfaGkgPSBtZW1bNF07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCXkxX2xvID0gbWVtWzVdOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl4MCA9IG1lbVs2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJeDEgPSBtZW1bN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXgyID0gbWVtWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykNCisJew0KKwkJeDMgPSB4MjsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCXgyID0geDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQl4MSA9IHgwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJeDAgPSB3c3BbaV07ICAgICAgICAgICAgICAgICAgICAgICANCisJCS8qIHlbaV0gPSBiWzBdKnhbaV0gKyBiWzFdKnhbaS0xXSArIGIxNDBbMl0qeFtpLTJdICsgYlszXSp4W2ktM10gICovDQorCQkvKiArIGFbMV0qeVtpLTFdICsgYVsyXSAqIHlbaS0yXSAgKyBhWzNdKnlbaS0zXSAgKi8NCisNCisJCUxfdG1wID0gMTYzODRMOyAgICAgICAgICAgICAgICAgICAgLyogcm91bmRpbmcgdG8gbWF4aW1pc2UgcHJlY2lzaW9uICovDQorCQlMX3RtcCArPSAoeTFfbG8gKiBhWzFdKTw8MTsNCisJCUxfdG1wICs9ICh5Ml9sbyAqIGFbMl0pPDwxOw0KKwkJTF90bXAgKz0gKHkzX2xvICogYVszXSk8PDE7DQorCQlMX3RtcCA9IExfdG1wID4+IDE1Ow0KKwkJTF90bXAgKz0gKHkxX2hpICogYVsxXSk8PDE7DQorCQlMX3RtcCArPSAoeTJfaGkgKiBhWzJdKTw8MTsNCisJCUxfdG1wICs9ICh5M19oaSAqIGFbM10pPDwxOw0KKwkJTF90bXAgKz0gKHgwICogYlswXSk8PDE7DQorCQlMX3RtcCArPSAoeDEgKiBiWzFdKTw8MTsNCisJCUxfdG1wICs9ICh4MiAqIGJbMl0pPDwxOw0KKwkJTF90bXAgKz0gKHgzICogYlszXSk8PDE7DQorDQorCQlMX3RtcCA9IExfdG1wIDw8IDI7DQorDQorCQl5M19oaSA9IHkyX2hpOyAgICAgICAgICAgICAgICAgICAgIA0KKwkJeTNfbG8gPSB5Ml9sbzsgICAgICAgICAgICAgICAgICAgICANCisJCXkyX2hpID0geTFfaGk7ICAgICAgICAgICAgICAgICAgICAgDQorCQl5Ml9sbyA9IHkxX2xvOyANCisJCXkxX2hpID0gTF90bXAgPj4gMTY7DQorCQl5MV9sbyA9IChMX3RtcCAmIDB4ZmZmZikgPj4xOw0KKw0KKwkJaHBfd3NwW2ldID0gKExfdG1wICsgMHg0MDAwKT4+MTU7ICAgICAgICAgIA0KKwl9DQorDQorCW1lbVswXSA9IHkzX2hpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwltZW1bMV0gPSB5M19sbzsgICAgICAgICAgICAgICAgICAgICAgICANCisJbWVtWzJdID0geTJfaGk7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCW1lbVszXSA9IHkyX2xvOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwltZW1bNF0gPSB5MV9oaTsgICAgICAgICAgICAgICAgICAgICAgICANCisJbWVtWzVdID0geTFfbG87ICAgICAgICAgICAgICAgICAgICAgICAgDQorCW1lbVs2XSA9IHgwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwltZW1bN10gPSB4MTsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJbWVtWzhdID0geDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCXJldHVybjsNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2ludF9scGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTFmZDBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMKQEAgLTAsMCArMSw2NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogaW50X2xwYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246SW50ZXJwb2xhdGlvbiBvZiB0aGUgTFAgcGFyYW1ldGVycyBpbiA0IHN1YmZyYW1lcy4gICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKw0KKyNkZWZpbmUgTVAxIChNKzEpDQorDQorDQordm9pZCBJbnRfaXNwKA0KKwkJV29yZDE2IGlzcF9vbGRbXSwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzcHMgZnJvbSBwYXN0IGZyYW1lICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGlzcF9uZXdbXSwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGlzcHMgZnJvbSBwcmVzZW50IGZyYW1lICAgICAgICAgICAqLw0KKwkJV29yZDE2IGZyYWNbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGZyYWN0aW9uIGZvciAzIGZpcnN0IHN1YmZyIChRMTUpICAqLw0KKwkJV29yZDE2IEF6W10gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IExQIGNvZWZmaWNpZW50cyBpbiA0IHN1YmZyYW1lcyAgICAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDMyIGksIGs7IA0KKwlXb3JkMTYgZmFjX29sZCwgZmFjX25ldzsNCisJV29yZDE2IGlzcFtNXTsNCisJV29yZDMyIExfdG1wOw0KKw0KKwlmb3IgKGsgPSAwOyBrIDwgMzsgaysrKQ0KKwl7DQorCQlmYWNfbmV3ID0gZnJhY1trXTsgICAgICAgICAgICAgICAgDQorCQlmYWNfb2xkID0gKDMyNzY3IC0gZmFjX25ldykgKyAxOyAgLyogMS4wIC0gZmFjX25ldyAqLw0KKw0KKwkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCXsNCisJCQlMX3RtcCA9IChpc3Bfb2xkW2ldICogZmFjX29sZCk8PDE7DQorCQkJTF90bXAgKz0gKGlzcF9uZXdbaV0gKiBmYWNfbmV3KTw8MTsNCisJCQlpc3BbaV0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgIA0KKwkJfQ0KKwkJSXNwX0F6KGlzcCwgQXosIE0sIDApOw0KKwkJQXogKz0gTVAxOw0KKwl9DQorDQorCS8qIDR0aCBzdWJmcmFtZTogaXNwX25ldyAoZnJhYz0xLjApICovDQorCUlzcF9Beihpc3BfbmV3LCBBeiwgTSwgMCk7DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfYXouYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2F6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0NGQxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2F6LmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IGlzcF9hei5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOkNvbXB1dGUgdGhlIExQQyBjb2VmZmljaWVudHMgZnJvbSBpc3AgKG9yZGVyPU0pICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisNCisjZGVmaW5lIE5DIChNLzIpDQorI2RlZmluZSBOQzE2ayAoTTE2ay8yKQ0KKw0KKy8qIGxvY2FsIGZ1bmN0aW9uICovDQorDQorc3RhdGljIHZvaWQgR2V0X2lzcF9wb2woV29yZDE2ICogaXNwLCBXb3JkMzIgKiBmLCBXb3JkMTYgbik7DQorc3RhdGljIHZvaWQgR2V0X2lzcF9wb2xfMTZrSHooV29yZDE2ICogaXNwLCBXb3JkMzIgKiBmLCBXb3JkMTYgbik7DQorDQordm9pZCBJc3BfQXooDQorCQlXb3JkMTYgaXNwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBJbW1pdHRhbmNlIHNwZWN0cmFsIHBhaXJzICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExMiA6IHByZWRpY3RvciBjb2VmZmljaWVudHMgKG9yZGVyID0gTSkgICAqLw0KKwkJV29yZDE2IG0sDQorCQlXb3JkMTYgYWRhcHRpdmVfc2NhbGluZyAgICAgICAgICAgICAgIC8qIChpKSAwICAgOiBhZGFwdGl2ZSBzY2FsaW5nIGRpc2FibGVkICovDQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAxICAgOiBhZGFwdGl2ZSBzY2FsaW5nIGVuYWJsZWQgICovDQorCSAgICkNCit7DQorCVdvcmQzMiBpLCBqOyANCisJV29yZDE2IGhpLCBsbzsNCisJV29yZDMyIGYxW05DMTZrICsgMV0sIGYyW05DMTZrXTsNCisJV29yZDE2IG5jOw0KKwlXb3JkMzIgdDA7DQorCVdvcmQxNiBxLCBxX3N1ZzsNCisJV29yZDMyIHRtYXg7DQorDQorCW5jID0gKG0gPj4gMSk7DQorCWlmKG5jID4gOCkNCisJew0KKwkJR2V0X2lzcF9wb2xfMTZrSHooJmlzcFswXSwgZjEsIG5jKTsNCisJCWZvciAoaSA9IDA7IGkgPD0gbmM7IGkrKykNCisJCXsNCisJCQlmMVtpXSA9IGYxW2ldIDw8IDI7DQorCQl9DQorCX0gZWxzZQ0KKwkJR2V0X2lzcF9wb2woJmlzcFswXSwgZjEsIG5jKTsNCisNCisJaWYgKG5jID4gOCkNCisJew0KKwkJR2V0X2lzcF9wb2xfMTZrSHooJmlzcFsxXSwgZjIsIChuYyAtIDEpKTsNCisJCWZvciAoaSA9IDA7IGkgPD0gbmMgLSAxOyBpKyspDQorCQl7DQorCQkJZjJbaV0gPSBmMltpXSA8PCAyOw0KKwkJfQ0KKwl9IGVsc2UNCisJCUdldF9pc3BfcG9sKCZpc3BbMV0sIGYyLCAobmMgLSAxKSk7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICBNdWx0aXBseSBGMih6KSBieSAoMSAtIHpeLTIpICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlmb3IgKGkgPSAobmMgLSAxKTsgaSA+IDE7IGktLSkNCisJew0KKwkJZjJbaV0gPSB2b19MX3N1YihmMltpXSwgZjJbaSAtIDJdKTsgICAgICAgICAgLyogZjJbaV0gLT0gZjJbaS0yXTsgKi8NCisJfQ0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICBTY2FsZSBGMSh6KSBieSAoMStpc3BbbS0xXSkgIGFuZCAgRjIoeikgYnkgKDEtaXNwW20tMV0pICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJZm9yIChpID0gMDsgaSA8IG5jOyBpKyspDQorCXsNCisJCS8qIGYxW2ldICo9ICgxLjAgKyBpc3BbTS0xXSk7ICovDQorDQorCQloaSA9IGYxW2ldID4+IDE2Ow0KKwkJbG8gPSAoZjFbaV0gJiAweGZmZmYpPj4xOw0KKw0KKwkJdDAgPSBNcHlfMzJfMTYoaGksIGxvLCBpc3BbbSAtIDFdKTsNCisJCWYxW2ldID0gdm9fTF9hZGQoZjFbaV0sIHQwKTsgDQorDQorCQkvKiBmMltpXSAqPSAoMS4wIC0gaXNwW00tMV0pOyAqLw0KKw0KKwkJaGkgPSBmMltpXSA+PiAxNjsNCisJCWxvID0gKGYyW2ldICYgMHhmZmZmKT4+MTsNCisJCXQwID0gTXB5XzMyXzE2KGhpLCBsbywgaXNwW20gLSAxXSk7DQorCQlmMltpXSA9IHZvX0xfc3ViKGYyW2ldLCB0MCk7IA0KKwl9DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICBBKHopID0gKEYxKHopK0YyKHopKS8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICBGMSh6KSBpcyBzeW1tZXRyaWMgYW5kIEYyKHopIGlzIGFudGlzeW1tZXRyaWMgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwkvKiBhWzBdID0gMS4wOyAqLw0KKwlhWzBdID0gNDA5NjsgIA0KKwl0bWF4ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDEsIGogPSBtIC0gMTsgaSA8IG5jOyBpKyssIGotLSkNCisJew0KKwkJLyogYVtpXSA9IDAuNSooZjFbaV0gKyBmMltpXSk7ICovDQorDQorCQl0MCA9IHZvX0xfYWRkKGYxW2ldLCBmMltpXSk7ICAgICAgICAgIC8qIGYxW2ldICsgZjJbaV0gICAgICAgICAgICAgKi8NCisJCXRtYXggfD0gTF9hYnModDApOyAgICAgICAgICAgICAgICAgDQorCQlhW2ldID0gKFdvcmQxNikodm9fTF9zaHJfcih0MCwgMTIpKTsgLyogZnJvbSBRMjMgdG8gUTEyIGFuZCAqIDAuNSAqLw0KKw0KKwkJLyogYVtqXSA9IDAuNSooZjFbaV0gLSBmMltpXSk7ICovDQorDQorCQl0MCA9IHZvX0xfc3ViKGYxW2ldLCBmMltpXSk7ICAgICAgICAgIC8qIGYxW2ldIC0gZjJbaV0gICAgICAgICAgICAgKi8NCisJCXRtYXggfD0gTF9hYnModDApOyAgICAgICAgICAgICAgICANCisJCWFbal0gPSAoV29yZDE2KSh2b19MX3Nocl9yKHQwLCAxMikpOyAvKiBmcm9tIFEyMyB0byBRMTIgYW5kICogMC41ICovDQorCX0NCisNCisJLyogcmVzY2FsZSBkYXRhIGlmIG92ZXJmbG93IGhhcyBvY2N1cmVkIGFuZCByZXByb2Nlc3MgdGhlIGxvb3AgKi8NCisJaWYoYWRhcHRpdmVfc2NhbGluZyA9PSAxKQ0KKwkJcSA9IDQgLSBub3JtX2wodG1heCk7ICAgICAgICAvKiBhZGFwdGl2ZSBzY2FsaW5nIGVuYWJsZWQgKi8NCisJZWxzZQ0KKwkJcSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc2NhbGluZyBkaXNhYmxlZCAqLw0KKw0KKwlpZiAocSA+IDApDQorCXsNCisJCXFfc3VnID0gKDEyICsgcSk7DQorCQlmb3IgKGkgPSAxLCBqID0gbSAtIDE7IGkgPCBuYzsgaSsrLCBqLS0pDQorCQl7DQorCQkJLyogYVtpXSA9IDAuNSooZjFbaV0gKyBmMltpXSk7ICovDQorCQkJdDAgPSB2b19MX2FkZChmMVtpXSwgZjJbaV0pOyAgICAgICAgICAvKiBmMVtpXSArIGYyW2ldICAgICAgICAgICAgICovDQorCQkJYVtpXSA9IChXb3JkMTYpKHZvX0xfc2hyX3IodDAsIHFfc3VnKSk7IC8qIGZyb20gUTIzIHRvIFExMiBhbmQgKiAwLjUgKi8NCisNCisJCQkvKiBhW2pdID0gMC41KihmMVtpXSAtIGYyW2ldKTsgKi8NCisJCQl0MCA9IHZvX0xfc3ViKGYxW2ldLCBmMltpXSk7ICAgICAgICAgIC8qIGYxW2ldIC0gZjJbaV0gICAgICAgICAgICAgKi8NCisJCQlhW2pdID0gKFdvcmQxNikodm9fTF9zaHJfcih0MCwgcV9zdWcpKTsgLyogZnJvbSBRMjMgdG8gUTEyIGFuZCAqIDAuNSAqLw0KKwkJfQ0KKwkJYVswXSA9IHNocihhWzBdLCBxKTsgDQorCX0NCisJZWxzZQ0KKwl7DQorCQlxX3N1ZyA9IDEyOyANCisJCXEgICAgID0gMDsgDQorCX0NCisJLyogYVtOQ10gPSAwLjUqZjFbTkNdKigxLjAgKyBpc3BbTS0xXSk7ICovDQorCWhpID0gZjFbbmNdID4+IDE2Ow0KKwlsbyA9IChmMVtuY10gJiAweGZmZmYpPj4xOw0KKwl0MCA9IE1weV8zMl8xNihoaSwgbG8sIGlzcFttIC0gMV0pOw0KKwl0MCA9IHZvX0xfYWRkKGYxW25jXSwgdDApOw0KKwlhW25jXSA9IChXb3JkMTYpKExfc2hyX3IodDAsIHFfc3VnKSk7ICAgIC8qIGZyb20gUTIzIHRvIFExMiBhbmQgKiAwLjUgKi8NCisJLyogYVttXSA9IGlzcFttLTFdOyAqLw0KKw0KKwlhW21dID0gdm9fc2hyX3IoaXNwW20gLSAxXSwgKDMgKyBxKSk7ICAgICAgICAgICAvKiBmcm9tIFExNSB0byBRMTIgICAgICAgICAgKi8NCisJcmV0dXJuOw0KK30NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogcHJvY2VkdXJlIEdldF9pc3BfcG9sOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICB+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgIEZpbmQgdGhlIHBvbHlub21pYWwgRjEoeikgb3IgRjIoeikgZnJvbSB0aGUgSVNQcy4gICAgICAgKg0KKyogVGhpcyBpcyBwZXJmb3JtZWQgYnkgZXhwYW5kaW5nIHRoZSBwcm9kdWN0IHBvbHlub21pYWxzOiAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBGMSh6KSA9ICAgcHJvZHVjdCAgICggMSAtIDIgaXNwX2kgel4tMSArIHpeLTIgKSAgICAgICAgICAgKg0KKyogICAgICAgICBpPTAsMiw0LDYsOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIEYyKHopID0gICBwcm9kdWN0ICAgKCAxIC0gMiBpc3BfaSB6Xi0xICsgel4tMiApICAgICAgICAgICAqDQorKiAgICAgICAgIGk9MSwzLDUsNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIHdoZXJlIGlzcF9pIGFyZSB0aGUgSVNQcyBpbiB0aGUgY29zaW5lIGRvbWFpbi4gICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIFBhcmFtZXRlcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgaXNwW10gICA6IGlzcCB2ZWN0b3IgKGNvc2luZSBkb21haW5lKSAgICAgICAgIGluIFExNSAgICAgKg0KKyogIGZbXSAgICAgOiB0aGUgY29lZmZpY2llbnRzIG9mIEYxIG9yIEYyICAgICAgICBpbiBRMjMgICAgICoNCisqICBuICAgICAgIDogPT0gTkMgZm9yIEYxKHopOyA9PSBOQy0xIGZvciBGMih6KSAgICAgICAgICAgICAqDQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCitzdGF0aWMgdm9pZCBHZXRfaXNwX3BvbChXb3JkMTYgKiBpc3AsIFdvcmQzMiAqIGYsIFdvcmQxNiBuKQ0KK3sNCisJV29yZDE2IGhpLCBsbzsNCisJV29yZDMyIGksIGosIHQwOw0KKwkvKiBBbGwgY29tcHV0YXRpb24gaW4gUTIzICovDQorDQorCWZbMF0gPSB2b19MX211bHQoNDA5NiwgMTAyNCk7ICAgICAgICAgICAgICAgLyogZlswXSA9IDEuMDsgICAgICAgIGluIFEyMyAgKi8NCisJZlsxXSA9IHZvX0xfbXVsdChpc3BbMF0sIC0yNTYpOyAgICAgICAgICAgICAvKiBmWzFdID0gLTIuMCppc3BbMF0gaW4gUTIzICAqLw0KKw0KKwlmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgZiBwb2ludGVyICAgICAgICAgICovDQorCWlzcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBpc3AgcG9pbnRlciAgICAgICAgKi8NCisJZm9yIChpID0gMjsgaSA8PSBuOyBpKyspDQorCXsNCisJCSpmID0gZlstMl07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlmb3IgKGogPSAxOyBqIDwgaTsgaisrLCBmLS0pDQorCQl7DQorCQkJaGkgPSBmWy0xXT4+MTY7DQorCQkJbG8gPSAoZlstMV0gJiAweGZmZmYpPj4xOw0KKw0KKwkJCXQwID0gTXB5XzMyXzE2KGhpLCBsbywgKmlzcCk7ICAvKiB0MCA9IGZbLTFdICogaXNwICAgICovDQorCQkJdDAgPSB0MCA8PCAxOw0KKwkJCSpmID0gdm9fTF9zdWIoKmYsIHQwKTsgICAgICAgICAgICAgIC8qICpmIC09IHQwICAgICAgICAgICAgKi8NCisJCQkqZiA9IHZvX0xfYWRkKCpmLCBmWy0yXSk7ICAgICAgICAgICAvKiAqZiArPSBmWy0yXSAgICAgICAgICovDQorCQl9DQorCQkqZiAtPSAoKmlzcCA8PCA5KTsgICAgICAgICAgIC8qICpmIC09IGlzcDw8OCAgICAgICAgKi8NCisJCWYgKz0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBmIHBvaW50ZXIgICAqLw0KKwkJaXNwICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIGlzcCBwb2ludGVyICovDQorCX0NCisJcmV0dXJuOw0KK30NCisNCitzdGF0aWMgdm9pZCBHZXRfaXNwX3BvbF8xNmtIeihXb3JkMTYgKiBpc3AsIFdvcmQzMiAqIGYsIFdvcmQxNiBuKQ0KK3sNCisJV29yZDE2IGhpLCBsbzsNCisJV29yZDMyIGksIGosIHQwOw0KKw0KKwkvKiBBbGwgY29tcHV0YXRpb24gaW4gUTIzICovDQorCWZbMF0gPSBMX211bHQoNDA5NiwgMjU2KTsgICAgICAgICAgICAgICAgLyogZlswXSA9IDEuMDsgICAgICAgIGluIFEyMyAgKi8NCisJZlsxXSA9IExfbXVsdChpc3BbMF0sIC02NCk7ICAgICAgICAgICAgICAvKiBmWzFdID0gLTIuMCppc3BbMF0gaW4gUTIzICAqLw0KKw0KKwlmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgZiBwb2ludGVyICAgICAgICAgICovDQorCWlzcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBpc3AgcG9pbnRlciAgICAgICAgKi8NCisNCisJZm9yIChpID0gMjsgaSA8PSBuOyBpKyspDQorCXsNCisJCSpmID0gZlstMl07ICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlmb3IgKGogPSAxOyBqIDwgaTsgaisrLCBmLS0pDQorCQl7DQorCQkJVk9fTF9FeHRyYWN0KGZbLTFdLCAmaGksICZsbyk7DQorCQkJdDAgPSBNcHlfMzJfMTYoaGksIGxvLCAqaXNwKTsgIC8qIHQwID0gZlstMV0gKiBpc3AgICAgKi8NCisJCQl0MCA9IExfc2hsMih0MCwgMSk7DQorCQkJKmYgPSBMX3N1YigqZiwgdDApOyAgICAgICAgICAgICAgLyogKmYgLT0gdDAgICAgICAgICAgICAqLw0KKwkJCSpmID0gTF9hZGQoKmYsIGZbLTJdKTsgICAgICAgICAgIC8qICpmICs9IGZbLTJdICAgICAgICAgKi8NCisJCX0NCisJCSpmID0gTF9tc3UoKmYsICppc3AsIDY0KTsgICAgICAgICAgICAvKiAqZiAtPSBpc3A8PDggICAgICAgICovDQorCQlmICs9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2UgZiBwb2ludGVyICAgKi8NCisJCWlzcCArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWR2YW5jZSBpc3AgcG9pbnRlciAqLw0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9pc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZlMzg5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMKQEAgLTAsMCArMSw5MSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGlzcF9pc2YuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCUlzcF9pc2YgICBUcmFuc2Zvcm1hdGlvbiBpc3AgdG8gaXNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCUlzZl9pc3AgICBUcmFuc2Zvcm1hdGlvbiBpc2YgdG8gaXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCVRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGlzcFtpXSB0byBpc2ZbaV0gYW5kIGlzZltpXSB0byBpc3BbaV0gICoNCisqCWFyZSBhcHByb3hpbWF0ZWQgYnkgYSBsb29rLXVwIHRhYmxlIGFuZCBpbnRlcnBvbGF0aW9uICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAiaXNwX2lzZi50YWIiICAgICAgICAgICAgICAgICAgICAgLyogTG9vay11cCB0YWJsZSBmb3IgdHJhbnNmb3JtYXRpb25zICovDQorDQordm9pZCBJc3BfaXNmKA0KKwkJV29yZDE2IGlzcFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaXNwW21dIChyYW5nZTogLTE8PXZhbDwxKSAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGlzZltdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE1IDogaXNmW21dIG5vcm1hbGl6ZWQgKHJhbmdlOiAwLjA8PXZhbDw9MC41KSAqLw0KKwkJV29yZDE2IG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogTFBDIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDMyIGksIGluZDsNCisJV29yZDMyIExfdG1wOw0KKwlpbmQgPSAxMjc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJlZ2luZyBhdCBlbmQgb2YgdGFibGUgLTEgKi8NCisJZm9yIChpID0gKG0gLSAxKTsgaSA+PSAwOyBpLS0pDQorCXsNCisJCWlmIChpID49IChtIC0gMikpDQorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG0tMiBpcyBhIGNvbnN0YW50ICovDQorCQkJaW5kID0gMTI3OyAgICAgICAgICAgICAgICAgICAgICAgLyogYmVnaW5nIGF0IGVuZCBvZiB0YWJsZSAtMSAqLw0KKwkJfQ0KKwkJLyogZmluZCB2YWx1ZSBpbiB0YWJsZSB0aGF0IGlzIGp1c3QgZ3JlYXRlciB0aGFuIGlzcFtpXSAqLw0KKwkJd2hpbGUgKHRhYmxlW2luZF0gPCBpc3BbaV0pDQorCQkJaW5kLS07DQorCQkvKiBhY29zKGlzcFtpXSk9IGluZCoxMjggKyAoICggaXNwW2ldLXRhYmxlW2luZF0gKSAqIHNsb3BlW2luZF0gKS8yMDQ4ICovDQorCQlMX3RtcCA9IHZvX0xfbXVsdCh2b19zdWIoaXNwW2ldLCB0YWJsZVtpbmRdKSwgc2xvcGVbaW5kXSk7DQorCQlpc2ZbaV0gPSB2b19yb3VuZCgoTF90bXAgPDwgNCkpOyAgIC8qIChpc3BbaV0tdGFibGVbaW5kXSkqc2xvcGVbaW5kXSk+PjExICovDQorCQlpc2ZbaV0gPSBhZGQxKGlzZltpXSwgKGluZCA8PCA3KSk7IA0KKwl9DQorCWlzZlttIC0gMV0gPSAoaXNmW20gLSAxXSA+PiAxKTsgICAgICANCisJcmV0dXJuOw0KK30NCisNCisNCit2b2lkIElzZl9pc3AoDQorCQlXb3JkMTYgaXNmW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpc2ZbbV0gbm9ybWFsaXplZCAocmFuZ2U6IDAuMDw9dmFsPD0wLjUpICovDQorCQlXb3JkMTYgaXNwW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBpc3BbbV0gKHJhbmdlOiAtMTw9dmFsPDEpICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICApDQorew0KKwlXb3JkMTYgb2Zmc2V0Ow0KKwlXb3JkMzIgaSwgaW5kLCBMX3RtcDsNCisNCisJZm9yIChpID0gMDsgaSA8IG0gLSAxOyBpKyspDQorCXsNCisJCWlzcFtpXSA9IGlzZltpXTsgICAgICAgICAgICAgICAgICANCisJfQ0KKwlpc3BbbSAtIDFdID0gKGlzZlttIC0gMV0gPDwgMSk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspDQorCXsNCisJCWluZCA9IChpc3BbaV0gPj4gNyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluZCAgICA9IGI3LWIxNSBvZiBpc2ZbaV0gKi8NCisJCW9mZnNldCA9IChXb3JkMTYpIChpc3BbaV0gJiAweDAwN2YpOyAgICAgIC8qIG9mZnNldCA9IGIwLWI2ICBvZiBpc2ZbaV0gKi8NCisNCisJCS8qIGlzcFtpXSA9IHRhYmxlW2luZF0rICgodGFibGVbaW5kKzFdLXRhYmxlW2luZF0pKm9mZnNldCkgLyAxMjggKi8NCisJCUxfdG1wID0gdm9fTF9tdWx0KHZvX3N1Yih0YWJsZVtpbmQgKyAxXSwgdGFibGVbaW5kXSksIG9mZnNldCk7DQorCQlpc3BbaV0gPSBhZGQxKHRhYmxlW2luZF0sIChXb3JkMTYpKChMX3RtcCA+PiA4KSkpOyAgIA0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sYWdfd2luZC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sYWdfd2luZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTc3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xhZ193aW5kLmMKQEAgLTAsMCArMSw0OSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogbGFnX3dpbmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgIERlc2NyaXB0aW9uOiBMYWdfd2luZG93cyBvbiBhdXRvY29ycmVsYXRpb25zICAgICAgICAgICAgICAgICoNCisqCSAgICAgICAgICAgICAgICByW2ldICo9IGxhZ193aW5kW2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAib3Blcl8zMmIuaCINCisjaW5jbHVkZSAibGFnX3dpbmQudGFiIg0KKw0KKw0KK3ZvaWQgTGFnX3dpbmRvdygNCisJCVdvcmQxNiByX2hbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgICA6IEF1dG9jb3JyZWxhdGlvbnMgIChtc2IpICAgICAgICAgICovDQorCQlXb3JkMTYgcl9sW10gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBBdXRvY29ycmVsYXRpb25zICAobHNiKSAgICAgICAgICAqLw0KKwkgICAgICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiB4Ow0KKw0KKwlmb3IgKGkgPSAxOyBpIDw9IE07IGkrKykNCisJew0KKwkJeCA9IE1weV8zMihyX2hbaV0sIHJfbFtpXSwgdm9sYWdfaFtpIC0gMV0sIHZvbGFnX2xbaSAtIDFdKTsNCisJCXJfaFtpXSA9IHggPj4gMTY7DQorCQlyX2xbaV0gPSAoeCAmIDB4ZmZmZik+PjE7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xldmluc29uLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xldmluc29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjNmY2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGV2aW5zb24uYwpAQCAtMCwwICsxLDI1MCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogbGV2aW5zb24uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246TEVWSU5TT04tRFVSQklOIGFsZ29yaXRobSBpbiBkb3VibGUgcHJlY2lzaW9uICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgTEVWSU5TT04uQwkJCQkJICAgICAqDQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICBMRVZJTlNPTi1EVVJCSU4gYWxnb3JpdGhtIGluIGRvdWJsZSBwcmVjaXNpb24gICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogQWxnb3JpdGhtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgUltpXSAgICBhdXRvY29ycmVsYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgQVtpXSAgICBmaWx0ZXIgY29lZmZpY2llbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgSyAgICAgICByZWZsZWN0aW9uIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgQWxwaGEgICBwcmVkaWN0aW9uIGdhaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgSW5pdGlhbGl6YXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBBWzBdID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBLICAgID0gLVJbMV0vUlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBBWzFdID0gSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBBbHBoYSA9IFJbMF0gKiAoMS1LKioyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgRG8gZm9yICBpID0gMiB0byBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICBTID0gIFNVTSAoIFJbal0qQVtpLWpdICxqPTEsaS0xICkgKyAgUltpXSAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICBLID0gLVMgLyBBbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICBBbltqXSA9IEFbal0gKyBLKkFbaS1qXSAgIGZvciBqPTEgdG8gaS0xICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlICAgQW5baV0gPSBuZXcgQVtpXSAgICAgICAgICAgICAqDQorICogICAgICAgICAgICBBbltpXT1LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICBBbHBoYT1BbHBoYSAqICgxLUsqKjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogUmVtYXJrcyBvbiB0aGUgZHluYW1pY3Mgb2YgdGhlIGNhbGN1bGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgVGhlIG51bWJlcnMgdXNlZCBhcmUgaW4gZG91YmxlIHByZWNpc2lvbiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdCA6ICAqDQorICogICAgICAgQSA9IEFIIDw8MTYgKyBBTDw8MS4gIEFIIGFuZCBBTCBhcmUgMTYgYml0IHNpZ25lZCBpbnRlZ2Vycy4gICAgICAgICAqDQorICogICAgICAgU2luY2UgdGhlIExTQidzIGFsc28gY29udGFpbiBhIHNpZ24gYml0LCB0aGlzIGZvcm1hdCBkb2VzIG5vdCAgICAgICAqDQorICogICAgICAgY29ycmVzcG9uZCB0byBzdGFuZGFyZCAzMiBiaXQgaW50ZWdlcnMuICBXZSB1c2UgdGhpcyBmb3JtYXQgc2luY2UgICAqDQorICogICAgICAgaXQgYWxsb3dzIGZhc3QgZXhlY3V0aW9uIG9mIG11bHRpcGxpY2F0aW9ucyBhbmQgZGl2aXNpb25zLiAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgIkRQRiIgd2lsbCByZWZlciB0byB0aGlzIHNwZWNpYWwgZm9ybWF0IGluIHRoZSBmb2xsb3dpbmcgdGV4dC4gICAgICAqDQorICogICAgICAgU2VlIG9wZXJfMzJiLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgVGhlIFJbaV0gd2VyZSBub3JtYWxpemVkIGluIHJvdXRpbmUgQVVUTyAoaGVuY2UsIFJbaV0gPCAxLjApLiAgICAgICAqDQorICogICAgICAgVGhlIEtbaV0gYW5kIEFscGhhIGFyZSB0aGVvcmV0aWNhbGx5IDwgMS4wLiAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgVGhlIEFbaV0sIGZvciBhIHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiA4IGtIeiwgYXJlIGluIHByYWN0aWNlICAgICAgICAqDQorICogICAgICAgYWx3YXlzIGluZmVyaW9yIHRvIDE2LjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgVGhlc2UgY2hhcmFjdGVyaXN0aWNzIGFsbG93IHN0cmFpZ3RoZm9yd2FyZCBmaXhlZC1wb2ludCAgICAgICAgICAgICAqDQorICogICAgICAgaW1wbGVtZW50YXRpb24uICBXZSBjaG9vc2UgdG8gcmVwcmVzZW50IHRoZSBwYXJhbWV0ZXJzIGFzICAgICAgICAgICAqDQorICogICAgICAgZm9sbG93cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBSW2ldICAgIFEzMSAgICstIC45OS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBLW2ldICAgIFEzMSAgICstIC45OS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICBBbHBoYSAgIE5vcm1hbGl6ZWQgLT4gbWFudGlzc2EgaW4gUTMxIHBsdXMgZXhwb25lbnQgICAgICAgICAqDQorICogICAgICAgICAgICAgICBBW2ldICAgIFEyNyAgICstIDE1Ljk5OS4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgVGhlIGFkZGl0aW9ucyBhcmUgcGVyZm9ybWVkIGluIDMyIGJpdC4gIEZvciB0aGUgc3VtbWF0aW9uIHVzZWQgICAgICAqDQorICogICAgICAgdG8gY2FsY3VsYXRlIHRoZSBLW2ldLCB3ZSBtdWx0aXBseSBudW1iZXJzIGluIFEzMSBieSBudW1iZXJzICAgICAgICAqDQorICogICAgICAgaW4gUTI3LCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9ucyBpbiBRMjcsICAgICAgICAgICAgICAqDQorICogICAgICAgcmVzdWx0aW5nIGluIGEgZHluYW1pYyBvZiArLSAxNi4gIFRoaXMgaXMgc3VmZmljaWVudCB0byBhdm9pZCAgICAgICAqDQorICogICAgICAgb3ZlcmZsb3csIHNpbmNlIHRoZSBmaW5hbCByZXN1bHQgb2YgdGhlIHN1bW1hdGlvbiBpcyAgICAgICAgICAgICAgICAqDQorICogICAgICAgbmVjZXNzYXJpbHkgPCAxLjAgYXMgYm90aCB0aGUgS1tpXSBhbmQgQWxwaGEgYXJlICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgdGhlb3JldGljYWxseSA8IDEuMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18qLw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorDQorI2RlZmluZSBNICAgMTYNCisjZGVmaW5lIE5DICAoTS8yKQ0KKw0KK3ZvaWQgSW5pdF9MZXZpbnNvbigNCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0ICA6c3RhdGljIG1lbW9yeSAoMTggd29yZHMpICovDQorCQkpDQorew0KKwlTZXRfemVybyhtZW0sIDE4KTsgICAgICAgICAgICAgICAgICAgICAvKiBvbGRfQVswLi5NLTFdID0gMCwgb2xkX3JjWzAuLjFdID0gMCAqLw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KK3ZvaWQgTGV2aW5zb24oDQorCQlXb3JkMTYgUmhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBSaFtNKzFdIFZlY3RvciBvZiBhdXRvY29ycmVsYXRpb25zIChtc2IpICovDQorCQlXb3JkMTYgUmxbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBSbFtNKzFdIFZlY3RvciBvZiBhdXRvY29ycmVsYXRpb25zIChsc2IpICovDQorCQlXb3JkMTYgQVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTIgOiBBW01dICAgIExQQyBjb2VmZmljaWVudHMgIChtID0gMTYpICAgICAgICovDQorCQlXb3JkMTYgcmNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiByY1tNXSAgIFJlZmxlY3Rpb24gY29lZmZpY2llbnRzLiAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOnN0YXRpYyBtZW1vcnkgKDE4IHdvcmRzKSAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKQ0KK3sNCisJV29yZDMyIGksIGo7DQorCVdvcmQxNiBoaSwgbG87DQorCVdvcmQxNiBLaCwgS2w7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZmxlY3Rpb24gY29lZmZpY2llbnQ7IGhpIGFuZCBsbyAgICAgICAgICAgKi8NCisJV29yZDE2IGFscF9oLCBhbHBfbCwgYWxwX2V4cDsgICAgICAgICAgLyogUHJlZGljdGlvbiBnYWluOyBoaSBsbyBhbmQgZXhwb25lbnQgICAgICAgICAqLw0KKwlXb3JkMTYgQWhbTSArIDFdLCBBbFtNICsgMV07ICAgICAgICAgICAvKiBMUEMgY29lZi4gaW4gZG91YmxlIHByZWMuICAgICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBBbmhbTSArIDFdLCBBbmxbTSArIDFdOyAgICAgICAgIC8qIExQQyBjb2VmLmZvciBuZXh0IGl0ZXJhdGlvbiBpbiBkb3VibGUgcHJlYy4gKi8NCisJV29yZDMyIHQwLCB0MSwgdDI7ICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwlXb3JkMTYgKm9sZF9BLCAqb2xkX3JjOw0KKw0KKwkvKiBMYXN0IEEoeikgZm9yIGNhc2Ugb2YgdW5zdGFibGUgZmlsdGVyICovDQorCW9sZF9BID0gbWVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlvbGRfcmMgPSBtZW0gKyBNOyAgICAgICAgICAgICAgICAgICAgICANCisNCisJLyogSyA9IEFbMV0gPSAtUlsxXSAvIFJbMF0gKi8NCisNCisJdDEgPSAoKFJoWzFdIDw8IDE2KSArIChSbFsxXSA8PCAxKSk7ICAgLyogUlsxXSBpbiBRMzEgKi8NCisJdDIgPSBMX2Ficyh0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogYWJzIFJbMV0gICAgICAgICAqLw0KKwl0MCA9IERpdl8zMih0MiwgUmhbMF0sIFJsWzBdKTsgICAgICAgICAvKiBSWzFdL1JbMF0gaW4gUTMxICovDQorCWlmICh0MSA+IDApDQorCQl0MCA9IC10MDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC1SWzFdL1JbMF0gICAgICAgKi8NCisNCisJS2ggPSB0MCA+PiAxNjsNCisJS2wgPSAodDAgJiAweGZmZmYpPj4xOw0KKwlyY1swXSA9IEtoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJdDAgPSAodDAgPj4gNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQVsxXSBpbiBRMjcgICAgICAqLw0KKw0KKwlBaFsxXSA9IHQwID4+IDE2Ow0KKwlBbFsxXSA9ICh0MCAmIDB4ZmZmZik+PjE7DQorDQorCS8qIEFscGhhID0gUlswXSAqICgxLUsqKjIpICovDQorCXQwID0gTXB5XzMyKEtoLCBLbCwgS2gsIEtsKTsgICAgICAgICAgIC8qIEsqSyAgICAgIGluIFEzMSAqLw0KKwl0MCA9IExfYWJzKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb21lIGNhc2UgPDAgISEgKi8NCisJdDAgPSB2b19MX3N1YigoV29yZDMyKSAweDdmZmZmZmZmTCwgdDApOyAgLyogMSAtIEsqSyAgaW4gUTMxICovDQorDQorCWhpID0gdDAgPj4gMTY7DQorCWxvID0gKHQwICYgMHhmZmZmKT4+MTsNCisNCisJdDAgPSBNcHlfMzIoUmhbMF0sIFJsWzBdLCBoaSwgbG8pOyAgICAgLyogQWxwaGEgaW4gUTMxICAgICovDQorDQorCS8qIE5vcm1hbGl6ZSBBbHBoYSAqLw0KKwlhbHBfZXhwID0gbm9ybV9sKHQwKTsNCisJdDAgPSAodDAgPDwgYWxwX2V4cCk7DQorDQorCWFscF9oID0gdDAgPj4gMTY7DQorCWFscF9sID0gKHQwICYgMHhmZmZmKT4+MTsNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogSVRFUkFUSU9OUyAgST0yIHRvIE0gICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCWZvciAoaSA9IDI7IGkgPD0gTTsgaSsrKQ0KKwl7DQorCQkvKiB0MCA9IFNVTSAoIFJbal0qQVtpLWpdICxqPTEsaS0xICkgKyAgUltpXSAqLw0KKwkJdDAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChqID0gMTsgaiA8IGk7IGorKykNCisJCQl0MCA9IHZvX0xfYWRkKHQwLCBNcHlfMzIoUmhbal0sIFJsW2pdLCBBaFtpIC0gal0sIEFsW2kgLSBqXSkpOw0KKw0KKwkJdDAgPSB0MCA8PCA0OyAgICAgICAgICAgICAgICAgLyogcmVzdWx0IGluIFEyNyAtPiBjb252ZXJ0IHRvIFEzMSAqLw0KKwkJLyogTm8gb3ZlcmZsb3cgcG9zc2libGUgICAgICAgICAgICAqLw0KKwkJdDEgPSAoKFJoW2ldIDw8IDE2KSArIChSbFtpXSA8PCAxKSk7DQorCQl0MCA9IHZvX0xfYWRkKHQwLCB0MSk7ICAgICAgICAgICAgICAgIC8qIGFkZCBSW2ldIGluIFEzMSAgICAgICAgICAgICAgICAgKi8NCisNCisJCS8qIEsgPSAtdDAgLyBBbHBoYSAqLw0KKwkJdDEgPSBMX2Ficyh0MCk7DQorCQl0MiA9IERpdl8zMih0MSwgYWxwX2gsIGFscF9sKTsgICAgIC8qIGFicyh0MCkvQWxwaGEgICAgICAgICAgICAgICAgICAgKi8NCisJCWlmICh0MCA+IDApDQorCQkJdDIgPSAtdDI7ICAgICAgICAgICAgICAgICAgIC8qIEsgPS10MC9BbHBoYSAgICAgICAgICAgICAgICAgICAgKi8NCisJCXQyID0gKHQyIDw8IGFscF9leHApOyAgICAgICAgICAgLyogZGVub3JtYWxpemU7IGNvbXBhcmUgdG8gQWxwaGEgICAqLw0KKw0KKwkJS2ggPSB0MiA+PiAxNjsNCisJCUtsID0gKHQyICYgMHhmZmZmKT4+MTsNCisNCisJCXJjW2kgLSAxXSA9IEtoOyAgICAgICAgICAgICAgICAgICANCisJCS8qIFRlc3QgZm9yIHVuc3RhYmxlIGZpbHRlci4gSWYgdW5zdGFibGUga2VlcCBvbGQgQSh6KSAqLw0KKwkJaWYgKGFic19zKEtoKSA+IDMyNzUwKQ0KKwkJew0KKwkJCUFbMF0gPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgLyogQWlbMF0gbm90IHN0b3JlZCAoYWx3YXlzIDEuMCkgKi8NCisJCQlmb3IgKGogPSAwOyBqIDwgTTsgaisrKQ0KKwkJCXsNCisJCQkJQVtqICsgMV0gPSBvbGRfQVtqXTsgICAgICAgDQorCQkJfQ0KKwkJCXJjWzBdID0gb2xkX3JjWzBdOyAgICAgICAgICAgICAvKiBvbmx5IHR3byByYyBjb2VmZmljaWVudHMgYXJlIG5lZWRlZCAqLw0KKwkJCXJjWzFdID0gb2xkX3JjWzFdOw0KKwkJCXJldHVybjsNCisJCX0NCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogIENvbXB1dGUgbmV3IExQQyBjb2VmZi4gLT4gQW5baV0gICAgICAgICAqDQorCQkgKiAgQW5bal09IEFbal0gKyBLKkFbaS1qXSAgICAgLCBqPTEgdG8gaS0xICoNCisJCSAqICBBbltpXT0gSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJZm9yIChqID0gMTsgaiA8IGk7IGorKykNCisJCXsNCisJCQl0MCA9IE1weV8zMihLaCwgS2wsIEFoW2kgLSBqXSwgQWxbaSAtIGpdKTsNCisJCQl0MCA9IHZvX0xfYWRkKHQwLCAoKEFoW2pdIDw8IDE2KSArIChBbFtqXSA8PCAxKSkpOw0KKwkJCUFuaFtqXSA9IHQwID4+IDE2Ow0KKwkJCUFubFtqXSA9ICh0MCAmIDB4ZmZmZik+PjE7DQorCQl9DQorCQl0MiA9ICh0MiA+PiA0KTsgICAgICAgICAgICAgICAgIC8qIHQyID0gSyBpbiBRMzEgLT5jb252ZXJ0IHRvIFEyNyAgKi8NCisNCisJCVZPX0xfRXh0cmFjdCh0MiwgJkFuaFtpXSwgJkFubFtpXSk7ICAgLyogQW5baV0gaW4gUTI3ICAgICAgICAgICAgICAgICAgICAqLw0KKw0KKwkJLyogQWxwaGEgPSBBbHBoYSAqICgxLUsqKjIpICovDQorCQl0MCA9IE1weV8zMihLaCwgS2wsIEtoLCBLbCk7ICAgICAgICAgICAgICAgLyogSypLICAgICAgaW4gUTMxICovDQorCQl0MCA9IExfYWJzKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSBjYXNlIDwwICEhICovDQorCQl0MCA9IHZvX0xfc3ViKChXb3JkMzIpIDB4N2ZmZmZmZmZMLCB0MCk7ICAgLyogMSAtIEsqSyAgaW4gUTMxICovDQorCQloaSA9IHQwID4+IDE2Ow0KKwkJbG8gPSAodDAgJiAweGZmZmYpPj4xOw0KKwkJdDAgPSBNcHlfMzIoYWxwX2gsIGFscF9sLCBoaSwgbG8pOyAvKiBBbHBoYSBpbiBRMzEgICAgKi8NCisNCisJCS8qIE5vcm1hbGl6ZSBBbHBoYSAqLw0KKwkJaiA9IG5vcm1fbCh0MCk7DQorCQl0MCA9ICh0MCA8PCBqKTsNCisJCWFscF9oID0gdDAgPj4gMTY7DQorCQlhbHBfbCA9ICh0MCAmIDB4ZmZmZik+PjE7DQorCQlhbHBfZXhwICs9IGo7ICAgICAgICAgLyogQWRkIG5vcm1hbGl6YXRpb24gdG8gYWxwX2V4cCAqLw0KKw0KKwkJLyogQVtqXSA9IEFuW2pdICovDQorCQlmb3IgKGogPSAxOyBqIDw9IGk7IGorKykNCisJCXsNCisJCQlBaFtqXSA9IEFuaFtqXTsgICAgICAgICAgICAgICANCisJCQlBbFtqXSA9IEFubFtqXTsgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisJLyogVHJ1bmNhdGUgQVtpXSBpbiBRMjcgdG8gUTEyIHdpdGggcm91bmRpbmcgKi8NCisJQVswXSA9IDQwOTY7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMTsgaSA8PSBNOyBpKyspDQorCXsNCisJCXQwID0gKEFoW2ldIDw8IDE2KSArIChBbFtpXSA8PCAxKTsNCisJCW9sZF9BW2kgLSAxXSA9IEFbaV0gPSB2b19yb3VuZCgodDAgPDwgMSkpOyAgICAgIA0KKwl9DQorCW9sZF9yY1swXSA9IHJjWzBdOyAgICAgICAgICAgICAgICAgICAgDQorCW9sZF9yY1sxXSA9IHJjWzFdOyAgICAgICAgICAgICAgICAgICAgDQorDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sb2cyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xvZzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDNkODE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sb2cyLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIEZpbGUgICAgICAgICAgICAgOiBsb2cyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIFB1cnBvc2UgICAgICAgICAgOiBDb21wdXRlcyBsb2cyKExfeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJsb2cyLmgiDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFIEZJTEVTDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUwgVkFSSUFCTEVTIEFORCBUQUJMRVMNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJsb2cyX3RhYi5oIiAgICAgLyogVGFibGUgZm9yIExvZzIoKSAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICBGVU5DVElPTjogICBMb2cyX25vcm0oKQ0KKyoNCisqICAgUFVSUE9TRTogICBDb21wdXRlcyBsb2cyKExfeCwgZXhwKSwgIHdoZXJlICAgTF94IGlzIHBvc2l0aXZlIGFuZA0KKyogICAgICAgICAgICAgIG5vcm1hbGl6ZWQsIGFuZCBleHAgaXMgdGhlIG5vcm1hbGlzYXRpb24gZXhwb25lbnQNCisqICAgICAgICAgICAgICBJZiBMX3ggaXMgbmVnYXRpdmUgb3IgemVybywgdGhlIHJlc3VsdCBpcyAwLg0KKyoNCisqICAgREVTQ1JJUFRJT046DQorKiAgICAgICAgVGhlIGZ1bmN0aW9uIExvZzIoTF94KSBpcyBhcHByb3hpbWF0ZWQgYnkgYSB0YWJsZSBhbmQgbGluZWFyDQorKiAgICAgICAgaW50ZXJwb2xhdGlvbi4gVGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdXNlZCB0byBjb21wdXRlIExvZzIoTF94KQ0KKyoNCisqICAgICAgICAgICAxLSBleHBvbmVudCA9IDMwLW5vcm1fZXhwb25lbnQNCisqICAgICAgICAgICAyLSBpID0gYml0MjUtYjMxIG9mIExfeDsgIDMyPD1pPD02MyAgKGJlY2F1c2Ugb2Ygbm9ybWFsaXphdGlvbikuDQorKiAgICAgICAgICAgMy0gYSA9IGJpdDEwLWIyNA0KKyogICAgICAgICAgIDQtIGkgLT0zMg0KKyogICAgICAgICAgIDUtIGZyYWN0aW9uID0gdGFibGVbaV08PDE2IC0gKHRhYmxlW2ldIC0gdGFibGVbaSsxXSkgKiBhICogMg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgTG9nMl9ub3JtICgNCisJCVdvcmQzMiBMX3gsICAgICAgICAgLyogKGkpIDogaW5wdXQgdmFsdWUgKG5vcm1hbGl6ZWQpICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGV4cCwgICAgICAgICAvKiAoaSkgOiBub3JtX2wgKExfeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKmV4cG9uZW50LCAgIC8qIChvKSA6IEludGVnZXIgcGFydCBvZiBMb2cyLiAgIChyYW5nZTogMDw9dmFsPD0zMCkgKi8NCisJCVdvcmQxNiAqZnJhY3Rpb24gICAgLyogKG8pIDogRnJhY3Rpb25hbCBwYXJ0IG9mIExvZzIuIChyYW5nZTogMDw9dmFsPDEpICAqLw0KKwkgICAgICAgKQ0KK3sNCisJV29yZDE2IGksIGEsIHRtcDsNCisJV29yZDMyIExfeTsNCisJaWYgKExfeCA8PSAoV29yZDMyKSAwKQ0KKwl7DQorCQkqZXhwb25lbnQgPSAwOyANCisJCSpmcmFjdGlvbiA9IDA7IA0KKwkJcmV0dXJuOw0KKwl9DQorCSpleHBvbmVudCA9ICgzMCAtIGV4cCk7IA0KKwlMX3ggPSAoTF94ID4+IDkpOw0KKwlpID0gZXh0cmFjdF9oIChMX3gpOyAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIyNS1iMzEgKi8NCisJTF94ID0gKExfeCA+PiAxKTsNCisJYSA9IChXb3JkMTYpKExfeCk7ICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgYjEwLWIyNCBvZiBmcmFjdGlvbiAqLw0KKwlhID0gKFdvcmQxNikoYSAmIChXb3JkMTYpMHg3ZmZmKTsNCisJaSAtPSAzMjsNCisJTF95ID0gTF9kZXBvc2l0X2ggKHRhYmxlW2ldKTsgICAgICAgLyogdGFibGVbaV0gPDwgMTYgICAgICAgICovDQorCXRtcCA9IHZvX3N1Yih0YWJsZVtpXSwgdGFibGVbaSArIDFdKTsgLyogdGFibGVbaV0gLSB0YWJsZVtpKzFdICovDQorCUxfeSA9IHZvX0xfbXN1IChMX3ksIHRtcCwgYSk7ICAgICAgICAgIC8qIExfeSAtPSB0bXAqYSoyICAgICAgICAqLw0KKwkqZnJhY3Rpb24gPSBleHRyYWN0X2ggKExfeSk7IA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICBGVU5DVElPTjogICBMb2cyKCkNCisqDQorKiAgIFBVUlBPU0U6ICAgQ29tcHV0ZXMgbG9nMihMX3gpLCAgd2hlcmUgICBMX3ggaXMgcG9zaXRpdmUuDQorKiAgICAgICAgICAgICAgSWYgTF94IGlzIG5lZ2F0aXZlIG9yIHplcm8sIHRoZSByZXN1bHQgaXMgMC4NCisqDQorKiAgIERFU0NSSVBUSU9OOg0KKyogICAgICAgIG5vcm1hbGl6ZXMgTF94IGFuZCB0aGVuIGNhbGxzIExvZzJfbm9ybSgpLg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgTG9nMiAoDQorCQlXb3JkMzIgTF94LCAgICAgICAgIC8qIChpKSA6IGlucHV0IHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqZXhwb25lbnQsICAgLyogKG8pIDogSW50ZWdlciBwYXJ0IG9mIExvZzIuICAgKHJhbmdlOiAwPD12YWw8PTMwKSAqLw0KKwkJV29yZDE2ICpmcmFjdGlvbiAgICAvKiAobykgOiBGcmFjdGlvbmFsIHBhcnQgb2YgTG9nMi4gKHJhbmdlOiAwPD12YWw8MSkgKi8NCisJICApDQorew0KKwlXb3JkMTYgZXhwOw0KKw0KKwlleHAgPSBub3JtX2woTF94KTsNCisJTG9nMl9ub3JtICgoTF94IDw8IGV4cCksIGV4cCwgZXhwb25lbnQsIGZyYWN0aW9uKTsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9scF9kZWMyLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xwX2RlYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2I3NDZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9scF9kZWMyLmMKQEAgLTAsMCArMSw3MCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IGxwX2RlYzIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqCURlc2NyaXB0aW9uOkRlY2ltYXRlIGEgdmVjdG9yIGJ5IDIgd2l0aCAybmQgb3JkZXIgZmlyIGZpbHRlciAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KKyNkZWZpbmUgTF9GSVIgIDUNCisjZGVmaW5lIExfTUVNICAoTF9GSVItMikNCisNCisvKiBzdGF0aWMgZmxvYXQgaF9maXJbTF9GSVJdID0gezAuMTMsIDAuMjMsIDAuMjgsIDAuMjMsIDAuMTN9OyAqLw0KKy8qIGZpeGVkLXBvaW50OiBzdW0gb2YgY29lZiA9IDMyNzY3IHRvIGF2b2lkIG92ZXJmbG93IG9uIERDICovDQorc3RhdGljIFdvcmQxNiBoX2ZpcltMX0ZJUl0gPSB7NDI2MCwgNzUzNiwgOTE3NSwgNzUzNiwgNDI2MH07DQorDQordm9pZCBMUF9EZWNpbTIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogc2lnbmFsIHRvIHByb2Nlc3MgICAgICAgICAqLw0KKwkJV29yZDE2IGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgKi8NCisJCVdvcmQxNiBtZW1bXSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBtZW1vcnkgKHNpemU9MykgICAgICAgICAgICovDQorCSAgICAgICkNCit7DQorCVdvcmQxNiAqcF94LCB4X2J1ZltMX0ZSQU1FICsgTF9NRU1dOw0KKwlXb3JkMzIgaSwgajsNCisJV29yZDMyIExfdG1wOw0KKwkvKiBjb3B5IGluaXRpYWwgZmlsdGVyIHN0YXRlcyBpbnRvIGJ1ZmZlciAqLw0KKwlwX3ggPSB4X2J1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IExfTUVNOyBpKyspDQorCXsNCisJCSpwX3grKyA9IG1lbVtpXTsgIA0KKwkJbWVtW2ldID0geFtsIC0gTF9NRU0gKyBpXTsgIA0KKwl9DQorCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspDQorCXsNCisJCSpwX3grKyA9IHhbaV07ICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBsOyBpICs9IDIsIGorKykNCisJew0KKwkJcF94ID0gJnhfYnVmW2ldOyAgDQorCQlMX3RtcCAgPSAoKCpwX3grKykgKiBoX2ZpclswXSk7DQorCQlMX3RtcCArPSAoKCpwX3grKykgKiBoX2ZpclsxXSk7DQorCQlMX3RtcCArPSAoKCpwX3grKykgKiBoX2ZpclsyXSk7DQorCQlMX3RtcCArPSAoKCpwX3grKykgKiBoX2ZpclszXSk7DQorCQlMX3RtcCArPSAoKCpwX3grKykgKiBoX2Zpcls0XSk7DQorCQl4W2pdID0gKExfdG1wICsgMHg0MDAwKT4+MTU7ICAgICAgICAgICAgICANCisJfQ0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWF0aF9vcC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tYXRoX29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NWVkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWF0aF9vcC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICBUaGlzIGZpbGUgY29udGFpbnMgbWF0aGVtYXRpYyBvcGVyYXRpb25zIGluIGZpeGVkIHBvaW50LiAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgSXNxcnQoKSAgICAgICAgICAgICAgOiBpbnZlcnNlIHNxdWFyZSByb290ICgxNiBiaXRzIHByZWNpc2lvbikuICAgICAgICAgIHwNCit8ICBQb3cyKCkgICAgICAgICAgICAgICA6IDJeeCAgKDE2IGJpdHMgcHJlY2lzaW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgIExvZzIoKSAgICAgICAgICAgICAgIDogbG9nMiAoMTYgYml0cyBwcmVjaXNpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgRG90X3Byb2R1Y3QoKSAgICAgICAgOiBzY2FsYXIgcHJvZHVjdCBvZiA8eFtdLHlbXT4gICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgIFRoZXNlIG9wZXJhdGlvbnMgYXJlIG5vdCBzdGFuZGFyZCBkb3VibGUgcHJlY2lzaW9uIG9wZXJhdGlvbnMuICAgICAgICAgICB8DQorfCAgVGhleSBhcmUgdXNlZCB3aGVyZSBsb3cgY29tcGxleGl0eSBpcyBpbXBvcnRhbnQgYW5kIHRoZSBmdWxsIDMyIGJpdHMgICAgIHwNCit8ICBwcmVjaXNpb24gaXMgbm90IG5lY2Vzc2FyeS4gRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiBEaXZfMzIoKSBoYXMgYSAgICAgfA0KK3wgIDI0IGJpdHMgcHJlY2lzaW9uIHdoaWNoIGlzIGVub3VnaCBmb3Igb3VyIHB1cnBvc2VzLiAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICBJbiB0aGlzIGZpbGUsIHRoZSB2YWx1ZXMgdXNlIHRoZXNlcyByZXByZXNlbnRhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgV29yZDMyIExfMzIgICAgIDogc3RhbmRhcmQgc2lnbmVkIDMyIGJpdHMgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICBXb3JkMTYgaGksIGxvICAgOiBMXzMyID0gaGk8PDE2ICsgbG88PDEgIChEUEYgLSBEb3VibGUgUHJlY2lzaW9uIEZvcm1hdCkgfA0KK3wgIFdvcmQzMiBmcmFjLCBXb3JkMTYgZXhwIDogTF8zMiA9IGZyYWMgPDwgZXhwLTMxICAobm9ybWFsaXNlZCBmb3JtYXQpICAgICB8DQorfCAgV29yZDE2IGludCwgZnJhYyAgICAgICAgOiBMXzMyID0gaW50LmZyYWMgICAgICAgIChmcmFjdGlvbmFsIGZvcm1hdCkgICAgIHwNCit8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffA0KKyovDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisjaW5jbHVkZSAibWF0aF9vcC5oIg0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IElzcXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICBDb21wdXRlIDEvc3FydChMX3gpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgIGlmIExfeCBpcyBuZWdhdGl2ZSBvciB6ZXJvLCByZXN1bHQgaXMgMSAoN2ZmZmZmZmYpLiAgICAgICAgICAgICAgICAgfA0KK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQorfCAgQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAxLSBOb3JtYWxpemF0aW9uIG9mIExfeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDItIGNhbGwgSXNxcnRfbihMX3gsIGV4cG9uYW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMy0gTF95ID0gTF94IDw8IGV4cG9uYW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCitXb3JkMzIgSXNxcnQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEzMSA6IG91dHB1dCB2YWx1ZSAocmFuZ2U6IDA8PXZhbDwxKSAgICAgICAgICovDQorCQlXb3JkMzIgTF94ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBpbnB1dCB2YWx1ZSAgKHJhbmdlOiAwPD12YWw8PTdmZmZmZmZmKSAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDE2IGV4cDsNCisJV29yZDMyIExfeTsNCisJZXhwID0gbm9ybV9sKExfeCk7DQorCUxfeCA9IChMX3ggPDwgZXhwKTsgICAgICAgICAgICAgICAgIC8qIExfeCBpcyBub3JtYWxpemVkICovDQorCWV4cCA9ICgzMSAtIGV4cCk7DQorCUlzcXJ0X24oJkxfeCwgJmV4cCk7DQorCUxfeSA9IChMX3ggPDwgZXhwKTsgICAgICAgICAgICAgICAgIC8qIGRlbm9ybWFsaXphdGlvbiAgICovDQorCXJldHVybiAoTF95KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogSXNxcnRfbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgIENvbXB1dGUgMS9zcXJ0KHZhbHVlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgaWYgdmFsdWUgaXMgbmVnYXRpdmUgb3IgemVybywgcmVzdWx0IGlzIDEgKGZyYWM9N2ZmZmZmZmYsIGV4cD0wKS4gICB8DQorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCit8ICBBbGdvcml0aG06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIFRoZSBmdW5jdGlvbiAxL3NxcnQodmFsdWUpIGlzIGFwcHJveGltYXRlZCBieSBhIHRhYmxlIGFuZCBsaW5lYXIgICAgICAgIHwNCit8ICAgaW50ZXJwb2xhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDEtIElmIGV4cG9uYW50IGlzIG9kZCB0aGVuIHNoaWZ0IGZyYWN0aW9uIHJpZ2h0IG9uY2UuICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMi0gZXhwb25hbnQgPSAtKChleHBvbmFudC0xKT4+MSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAzLSBpID0gYml0MjUtYjMwIG9mIGZyYWN0aW9uLCAxNiA8PSBpIDw9IDYzIC0+YmVjYXVzZSBvZiBub3JtYWxpemF0aW9uLiB8DQorfCAgIDQtIGEgPSBiaXQxMC1iMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgNS0gaSAtPTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICA2LSBmcmFjdGlvbiA9IHRhYmxlW2ldPDwxNiAtICh0YWJsZVtpXSAtIHRhYmxlW2krMV0pICogYSAqIDIgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KK3N0YXRpYyBXb3JkMTYgdGFibGVfaXNxcnRbNDldID0NCit7DQorCTMyNzY3LCAzMTc5MCwgMzA4OTQsIDMwMDcwLCAyOTMwOSwgMjg2MDIsIDI3OTQ1LCAyNzMzMCwgMjY3NTUsIDI2MjE0LA0KKwkyNTcwNSwgMjUyMjUsIDI0NzcwLCAyNDMzOSwgMjM5MzAsIDIzNTQxLCAyMzE3MCwgMjI4MTcsIDIyNDc5LCAyMjE1NSwNCisJMjE4NDUsIDIxNTQ4LCAyMTI2MywgMjA5ODgsIDIwNzI0LCAyMDQ3MCwgMjAyMjUsIDE5OTg4LCAxOTc2MCwgMTk1MzksDQorCTE5MzI2LCAxOTExOSwgMTg5MTksIDE4NzI1LCAxODUzNiwgMTgzNTQsIDE4MTc2LCAxODAwNCwgMTc4MzcsIDE3Njc0LA0KKwkxNzUxNSwgMTczNjEsIDE3MjExLCAxNzA2NCwgMTY5MjEsIDE2NzgyLCAxNjY0NiwgMTY1MTQsIDE2Mzg0DQorfTsNCisNCit2b2lkIElzcXJ0X24oDQorCQlXb3JkMzIgKiBmcmFjLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIFEzMTogbm9ybWFsaXplZCB2YWx1ZSAoMS4wIDwgZnJhYyA8PSAwLjUpICovDQorCQlXb3JkMTYgKiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgIDogZXhwb25lbnQgKHZhbHVlID0gZnJhYyB4IDJeZXhwb25lbnQpICovDQorCSAgICApDQorew0KKwlXb3JkMTYgaSwgYSwgdG1wOw0KKw0KKwlpZiAoKmZyYWMgPD0gKFdvcmQzMikgMCkNCisJew0KKwkJKmV4cCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCSpmcmFjID0gMHg3ZmZmZmZmZkw7ICAgICAgICAgICAgICAgDQorCQlyZXR1cm47DQorCX0NCisNCisJaWYoKCpleHAgJiAxKSA9PSAxKSAgICAgICAgICAgICAgICAgICAgICAgLypJZiBleHBvbmFudCBvZGQgLT4gc2hpZnQgcmlnaHQgKi8NCisJCSpmcmFjID0gKCpmcmFjKSA+PiAxOw0KKw0KKwkqZXhwID0gbmVnYXRlKCgqZXhwIC0gMSkgPj4gMSk7ICAgDQorDQorCSpmcmFjID0gKCpmcmFjID4+IDkpOyAgICAgICAgICAgICAgIA0KKwlpID0gZXh0cmFjdF9oKCpmcmFjKTsgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIyNS1iMzEgKi8NCisJKmZyYWMgPSAoKmZyYWMgPj4gMSk7ICAgICAgICAgICAgICANCisJYSA9IChXb3JkMTYpKCpmcmFjKTsgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IGIxMC1iMjQgKi8NCisJYSA9IChXb3JkMTYpIChhICYgKFdvcmQxNikgMHg3ZmZmKTsgICAgDQorCWkgLT0gMTY7DQorCSpmcmFjID0gTF9kZXBvc2l0X2godGFibGVfaXNxcnRbaV0pOyAgIC8qIHRhYmxlW2ldIDw8IDE2ICAgICAgICAgKi8NCisJdG1wID0gdm9fc3ViKHRhYmxlX2lzcXJ0W2ldLCB0YWJsZV9pc3FydFtpICsgMV0pOyAgICAgIC8qIHRhYmxlW2ldIC0gdGFibGVbaSsxXSkgKi8NCisJKmZyYWMgPSB2b19MX21zdSgqZnJhYywgdG1wLCBhKTsgICAgICAgICAgLyogZnJhYyAtPSAgdG1wKmEqMiAgICAgICAqLw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgRnVuY3Rpb24gTmFtZSA6IFBvdzIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgTF94ID0gcG93KDIuMCwgZXhwb25hbnQuZnJhY3Rpb24pICAgICAgICAgKGV4cG9uYW50ID0gaW50ZXJnZXIgcGFydCkgIHwNCit8ICAgICAgICAgPSBwb3coMi4wLCAwLmZyYWN0aW9uKSA8PCBleHBvbmFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQorfCAgQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBUaGUgZnVuY3Rpb24gUG93MihMX3gpIGlzIGFwcHJveGltYXRlZCBieSBhIHRhYmxlIGFuZCBsaW5lYXIgICAgICAgICAgICB8DQorfCAgIGludGVycG9sYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICAxLSBpID0gYml0MTAtYjE1IG9mIGZyYWN0aW9uLCAgIDAgPD0gaSA8PSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgIDItIGEgPSBiaXQwLWI5ICAgb2YgZnJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgMy0gTF94ID0gdGFibGVbaV08PDE2IC0gKHRhYmxlW2ldIC0gdGFibGVbaSsxXSkgKiBhICogMiAgICAgICAgICAgICAgICAgfA0KK3wgICA0LSBMX3ggPSBMX3ggPj4gKDMwLWV4cG9uYW50KSAgICAgKHdpdGggcm91bmRpbmcpICAgICAgICAgICAgICAgICAgICAgICB8DQorfF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wNCisqLw0KK3N0YXRpYyBXb3JkMTYgdGFibGVfcG93MlszM10gPQ0KK3sNCisJMTYzODQsIDE2NzQzLCAxNzEwOSwgMTc0ODQsIDE3ODY3LCAxODI1OCwgMTg2NTgsIDE5MDY2LCAxOTQ4NCwgMTk5MTEsDQorCTIwMzQ3LCAyMDc5MiwgMjEyNDcsIDIxNzEzLCAyMjE4OCwgMjI2NzQsIDIzMTcwLCAyMzY3OCwgMjQxOTYsIDI0NzI2LA0KKwkyNTI2OCwgMjU4MjEsIDI2Mzg2LCAyNjk2NCwgMjc1NTQsIDI4MTU4LCAyODc3NCwgMjk0MDUsIDMwMDQ4LCAzMDcwNiwNCisJMzEzNzksIDMyMDY2LCAzMjc2Nw0KK307DQorDQorV29yZDMyIFBvdzIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMCAgOiByZXN1bHQgICAgICAgKHJhbmdlOiAwPD12YWw8PTB4N2ZmZmZmZmYpICovDQorCQlXb3JkMTYgZXhwb25hbnQsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBJbnRlZ2VyIHBhcnQuICAgICAgKHJhbmdlOiAwPD12YWw8PTMwKSAgICovDQorCQlXb3JkMTYgZnJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBGcmFjdGlvbm5hbCBwYXJ0LiAgKHJhbmdlOiAwLjA8PXZhbDwxLjApICovDQorCSAgICkNCit7DQorCVdvcmQxNiBleHAsIGksIGEsIHRtcDsNCisJV29yZDMyIExfeDsNCisNCisJTF94ID0gdm9fTF9tdWx0KGZyYWN0aW9uLCAzMik7ICAgICAgICAgICAgLyogTF94ID0gZnJhY3Rpb248PDYgICAgICAgICAgICovDQorCWkgPSBleHRyYWN0X2goTF94KTsgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgYjEwLWIxNiBvZiBmcmFjdGlvbiAqLw0KKwlMX3ggPUxfeCA+PiAxOw0KKwlhID0gKFdvcmQxNikoTF94KTsgICAgICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QgYjAtYjkgICBvZiBmcmFjdGlvbiAqLw0KKwlhID0gKFdvcmQxNikgKGEgJiAoV29yZDE2KSAweDdmZmYpOyANCisNCisJTF94ID0gTF9kZXBvc2l0X2godGFibGVfcG93MltpXSk7ICAgICAgLyogdGFibGVbaV0gPDwgMTYgICAgICAgICovDQorCXRtcCA9IHZvX3N1Yih0YWJsZV9wb3cyW2ldLCB0YWJsZV9wb3cyW2kgKyAxXSk7ICAgICAgICAvKiB0YWJsZVtpXSAtIHRhYmxlW2krMV0gKi8NCisJTF94IC09ICh0bXAgKiBhKTw8MTsgICAgICAgICAgICAgIC8qIExfeCAtPSB0bXAqYSoyICAgICAgICAqLw0KKw0KKwlleHAgPSB2b19zdWIoMzAsIGV4cG9uYW50KTsNCisJTF94ID0gdm9fTF9zaHJfcihMX3gsIGV4cCk7DQorDQorCXJldHVybiAoTF94KTsNCit9DQorDQorLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3wgICBGdW5jdGlvbiBOYW1lIDogRG90X3Byb2R1Y3QxMigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgIENvbXB1dGUgc2NhbGFyIHByb2R1Y3Qgb2YgPHhbXSx5W10+IHVzaW5nIGFjY3VtdWxhdG9yLiAgICAgICAgICAgICAgfA0KK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICBUaGUgcmVzdWx0IGlzIG5vcm1hbGl6ZWQgKGluIFEzMSkgd2l0aCBleHBvbmVudCAoMC4uMzApLiAgICAgICAgICAgIHwNCit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KK3wgIEFsZ29yaXRobTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQorfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCit8ICAgICAgIGRvdF9wcm9kdWN0ID0gc3VtKHhbaV0qeVtpXSkgICAgIGk9MC4uTi0xICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KK3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198DQorKi8NCisNCitXb3JkMzIgRG90X3Byb2R1Y3QxMiggICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFEzMTogbm9ybWFsaXplZCByZXN1bHQgKDEgPCB2YWwgPD0gLTEpICovDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAxMmJpdHM6IHggdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgMTJiaXRzOiB5IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogdmVjdG9yIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IGV4cG9uZW50IG9mIHJlc3VsdCAoMC4uKzMwKSAgICAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IHNmdDsNCisJV29yZDMyIGksIExfc3VtOw0KKwlMX3N1bSA9IDA7DQorCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQ0KKwl7DQorCQlMX3N1bSArPSB4W2ldICogeVtpXTsNCisJfQ0KKwlMX3N1bSA9IChMX3N1bSA8PCAxKSArIDE7DQorCS8qIE5vcm1hbGl6ZSBhY2MgaW4gUTMxICovDQorCXNmdCA9IG5vcm1fbChMX3N1bSk7DQorCUxfc3VtID0gTF9zdW0gPDwgc2Z0Ow0KKwkqZXhwID0gMzAgLSBzZnQ7ICAgICAgICAgICAgLyogZXhwb25lbnQgPSAwLi4zMCAqLw0KKwlyZXR1cm4gKExfc3VtKTsNCisNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9tZW1fYWxpZ24uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWVtX2FsaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4OTE1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWVtX2FsaWduLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUZpbGU6CQltZW1fYWxpZ24uYworCisJQ29udGVudDoJTWVtb3J5IGFsbG9jIGFsaWdubWVudHMgZnVuY3Rpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUJIm1lbV9hbGlnbi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogZnVuY3Rpb24gbmFtZTogbWVtX21hbGxvYworKiBkZXNjcmlwdGlvbjogIG1hbGxvYyB0aGUgYWxpZ25tZW50cyBtZW1vcnkgCisqIHJldHVybnM6ICAgICAgdGhlIHBvaW50IG9mIHRoZSBtZW1vcnkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICoKK21lbV9tYWxsb2MoVk9fTUVNX09QRVJBVE9SICpwTWVtb3AsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBjaGFyIGFsaWdubWVudCwgdW5zaWduZWQgaW50IENvZGVjSUQpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyICptZW1fcHRyOworCVZPX01FTV9JTkZPIE1lbUluZm87CisKKwlpZiAoIWFsaWdubWVudCkgeworCisJCU1lbUluZm8uRmxhZyA9IDA7CisJCU1lbUluZm8uU2l6ZSA9IHNpemUgKyAxOworCQlyZXQgPSBwTWVtb3AtPkFsbG9jKENvZGVjSUQsICZNZW1JbmZvKTsKKwkJaWYocmV0ICE9IDApCisJCQlyZXR1cm4gMDsKKwkJbWVtX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopTWVtSW5mby5WQnVmZmVyOworCisJCXBNZW1vcC0+U2V0KENvZGVjSUQsIG1lbV9wdHIsIDAsIHNpemUgKyAxKTsKKworCQkqbWVtX3B0ciA9ICh1bnNpZ25lZCBjaGFyKTE7CisKKwkJcmV0dXJuICgodm9pZCAqKShtZW1fcHRyKzEpKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBjaGFyICp0bXA7CisKKwkJTWVtSW5mby5GbGFnID0gMDsKKwkJTWVtSW5mby5TaXplID0gc2l6ZSArIGFsaWdubWVudDsKKwkJcmV0ID0gcE1lbW9wLT5BbGxvYyhDb2RlY0lELCAmTWVtSW5mbyk7CisJCWlmKHJldCAhPSAwKQorCQkJcmV0dXJuIDA7CisKKwkJdG1wID0gKHVuc2lnbmVkIGNoYXIgKilNZW1JbmZvLlZCdWZmZXI7CisKKwkJcE1lbW9wLT5TZXQoQ29kZWNJRCwgdG1wLCAwLCBzaXplICsgYWxpZ25tZW50KTsKKworCQltZW1fcHRyID0KKwkJCSh1bnNpZ25lZCBjaGFyICopICgodW5zaWduZWQgaW50KSAodG1wICsgYWxpZ25tZW50IC0gMSkgJgorCQkJCQkofigodW5zaWduZWQgaW50KSAoYWxpZ25tZW50IC0gMSkpKSk7CisKKwkJaWYgKG1lbV9wdHIgPT0gdG1wKQorCQkJbWVtX3B0ciArPSBhbGlnbm1lbnQ7CisKKwkJKihtZW1fcHRyIC0gMSkgPSAodW5zaWduZWQgY2hhcikgKG1lbV9wdHIgLSB0bXApOworCisJCXJldHVybiAoKHZvaWQgKiltZW1fcHRyKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIGZ1bmN0aW9uIG5hbWU6IG1lbV9mcmVlCisqIGRlc2NyaXB0aW9uOiAgZnJlZSB0aGUgbWVtb3J5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAorbWVtX2ZyZWUoVk9fTUVNX09QRVJBVE9SICpwTWVtb3AsIHZvaWQgKm1lbV9wdHIsIHVuc2lnbmVkIGludCBDb2RlY0lEKQoreworCisJdW5zaWduZWQgY2hhciAqcHRyOworCisJaWYgKG1lbV9wdHIgPT0gMCkKKwkJcmV0dXJuOworCisJcHRyID0gbWVtX3B0cjsKKworCXB0ciAtPSAqKHB0ciAtIDEpOworCisJcE1lbW9wLT5GcmVlKENvZGVjSUQsIHB0cik7Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL29wZXJfMzJiLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL29wZXJfMzJiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNTIzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvb3Blcl8zMmIuYwpAQCAtMCwwICsxLDIyMyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIG9wZXJhdGlvbnMgaW4gZG91YmxlIHByZWNpc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgVGhlc2Ugb3BlcmF0aW9ucyBhcmUgbm90IHN0YW5kYXJkIGRvdWJsZSBwcmVjaXNpb24gb3BlcmF0aW9ucy4gICAgICAgICAgICoNCisgKiAgVGhleSBhcmUgdXNlZCB3aGVyZSBzaW5nbGUgcHJlY2lzaW9uIGlzIG5vdCBlbm91Z2ggYnV0IHRoZSBmdWxsIDMyIGJpdHMgICoNCisgKiAgcHJlY2lzaW9uIGlzIG5vdCBuZWNlc3NhcnkuIEZvciBleGFtcGxlLCB0aGUgZnVuY3Rpb24gRGl2XzMyKCkgaGFzIGEgICAgICoNCisgKiAgMjQgYml0cyBwcmVjaXNpb24gd2hpY2ggaXMgZW5vdWdoIGZvciBvdXIgcHVycG9zZXMuICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgVGhlIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVycyB1c2UgYSBzcGVjaWFsIHJlcHJlc2VudGF0aW9uOiAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgTF8zMiA9IGhpPDwxNiArIGxvPDwxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgTF8zMiBpcyBhIDMyIGJpdCBpbnRlZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgaGkgYW5kIGxvIGFyZSAxNiBiaXQgc2lnbmVkIGludGVnZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgQXMgdGhlIGxvdyBwYXJ0IGFsc28gY29udGFpbnMgdGhlIHNpZ24sIHRoaXMgYWxsb3dzIGZhc3QgbXVsdGlwbGljYXRpb24uICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgIDB4ODAwMCAwMDAwIDw9IExfMzIgPD0gMHg3ZmZmIGZmZmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgV2Ugd2lsbCB1c2UgRFBGIChEb3VibGUgUHJlY2lzaW9uIEZvcm1hdCApaW4gdGhpcyBmaWxlIHRvIHNwZWNpZnkgICAgICAgICoNCisgKiAgdGhpcyBzcGVjaWFsIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIEZ1bmN0aW9uIExfRXh0cmFjdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIEV4dHJhY3QgZnJvbSBhIDMyIGJpdCBpbnRlZ2VyIHR3byAxNiBiaXQgRFBGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBMXzMyICAgICAgOiAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAweDgwMDAgMDAwMCA8PSBMXzMyIDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBoaSAgICAgICAgOiBiMTYgdG8gYjMxIG9mIExfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBsbyAgICAgICAgOiAoTF8zMiAtIGhpPDwxNik+PjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisNCitfX2lubGluZSB2b2lkIFZPX0xfRXh0cmFjdCAoV29yZDMyIExfMzIsIFdvcmQxNiAqaGksIFdvcmQxNiAqbG8pDQorew0KKwkqaGkgPSAoV29yZDE2KShMXzMyID4+IDE2KTsNCisJKmxvID0gKFdvcmQxNikoKExfMzIgJiAweGZmZmYpID4+IDEpOw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBGdW5jdGlvbiBMX0NvbXAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBDb21wb3NlIGZyb20gdHdvIDE2IGJpdCBEUEYgYSAzMiBiaXQgaW50ZWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICBMXzMyID0gaGk8PDE2ICsgbG88PDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBBcmd1bWVudHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaGkgICAgICAgIG1zYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgbG8gICAgICAgIGxzZiAod2l0aCBzaWduKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgUmV0dXJuIFZhbHVlIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgIDMyIGJpdCBsb25nIHNpZ25lZCBpbnRlZ2VyIChXb3JkMzIpIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgKg0KKyAqICAgICAgICAgICAgIHJhbmdlIDogMHg4MDAwIDAwMDAgPD0gTF8zMiA8PSAweDdmZmYgZmZmMC4gICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorDQorV29yZDMyIExfQ29tcCAoV29yZDE2IGhpLCBXb3JkMTYgbG8pDQorew0KKwlXb3JkMzIgTF8zMjsNCisNCisJTF8zMiA9IExfZGVwb3NpdF9oIChoaSk7DQorDQorCXJldHVybiAoTF9tYWMgKExfMzIsIGxvLCAxKSk7ICAgICAgIC8qID0gaGk8PDE2ICsgbG88PDEgKi8NCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogRnVuY3Rpb24gTXB5XzMyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBNdWx0aXBseSB0d28gMzIgYml0IGludGVnZXJzIChEUEYpLiBUaGUgcmVzdWx0IGlzIGRpdmlkZWQgYnkgMioqMzEgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBMXzMyID0gKGhpMSpoaTIpPDwxICsgKCAoaGkxKmxvMik+PjE1ICsgKGxvMSpoaTIpPj4xNSApPDwxICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBUaGlzIG9wZXJhdGlvbiBjYW4gYWxzbyBiZSB2aWV3ZWQgYXMgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHR3byBRMzEgICAgICAqDQorICogICBudW1iZXIgYW5kIHRoZSByZXN1bHQgaXMgYWxzbyBpbiBRMzEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogQXJndW1lbnRzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGhpMSAgICAgICAgIGhpIHBhcnQgb2YgZmlyc3QgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGxvMSAgICAgICAgIGxvIHBhcnQgb2YgZmlyc3QgbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGhpMiAgICAgICAgIGhpIHBhcnQgb2Ygc2Vjb25kIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogIGxvMiAgICAgICAgIGxvIHBhcnQgb2Ygc2Vjb25kIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKi8NCisNCitfX2lubGluZSBXb3JkMzIgIE1weV8zMiAoV29yZDE2IGhpMSwgV29yZDE2IGxvMSwgV29yZDE2IGhpMiwgV29yZDE2IGxvMikNCit7DQorCVdvcmQzMiBMXzMyOw0KKwlMXzMyID0gKGhpMSAqIGhpMik7DQorCUxfMzIgKz0gKGhpMSAqIGxvMikgPj4gMTU7DQorCUxfMzIgKz0gKGxvMSAqIGhpMikgPj4gMTU7DQorCUxfMzIgPDw9IDE7DQorDQorCXJldHVybiAoTF8zMik7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIEZ1bmN0aW9uIE1weV8zMl8xNigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgTXVsdGlwbHkgYSAxNiBiaXQgaW50ZWdlciBieSBhIDMyIGJpdCAoRFBGKS4gVGhlIHJlc3VsdCBpcyBkaXZpZGVkICAgICAgKg0KKyAqICAgYnkgMioqMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgTF8zMiA9IChoaTEqbG8yKTw8MSArICgobG8xKmxvMik+PjE1KTw8MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBoaSAgICAgICAgICBoaSBwYXJ0IG9mIDMyIGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBsbyAgICAgICAgICBsbyBwYXJ0IG9mIDMyIGJpdCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICBuICAgICAgICAgICAxNiBiaXQgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyovDQorDQorX19pbmxpbmUgV29yZDMyIE1weV8zMl8xNiAoV29yZDE2IGhpLCBXb3JkMTYgbG8sIFdvcmQxNiBuKQ0KK3sNCisJV29yZDMyIExfMzI7DQorDQorCUxfMzIgPSAoaGkgKiBuKTw8MTsNCisJTF8zMiArPSAoKChsbyAqIG4pPj4xNSk8PDEpOw0KKw0KKwlyZXR1cm4gKExfMzIpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIEZ1bmN0aW9uIE5hbWUgOiBEaXZfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIFB1cnBvc2UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICBGcmFjdGlvbmFsIGludGVnZXIgZGl2aXNpb24gb2YgdHdvIDMyIGJpdCBudW1iZXJzLiAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICBMX251bSAvIExfZGVub20uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICBMX251bSBhbmQgTF9kZW5vbSBtdXN0IGJlIHBvc2l0aXZlIGFuZCBMX251bSA8IExfZGVub20uICAgICAgICoNCisgKiAgICAgICAgICAgICBMX2Rlbm9tID0gZGVub21faGk8PDE2ICsgZGVub21fbG88PDEgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICBkZW5vbV9oaSBpcyBhIG5vcm1hbGl6ZSBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIElucHV0cyA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICBMX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICoNCisgKiAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDwgTF9udW0gPCBMX2Rlbm9tICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICBMX2Rlbm9tID0gZGVub21faGk8PDE2ICsgZGVub21fbG88PDEgICAgICAoRFBGKSAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICBkZW5vbV9oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAxNiBiaXQgcG9zaXRpdmUgbm9ybWFsaXplZCBpbnRlZ2VyIHdob3NlIHZhbHVlIGZhbGxzIGluIHRoZSAgICoNCisgKiAgICAgICAgICAgICByYW5nZSA6IDB4NDAwMCA8IGhpIDwgMHg3ZmZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICBkZW5vbV9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAxNiBiaXQgcG9zaXRpdmUgaW50ZWdlciB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICByYW5nZSA6IDAgPCBsbyA8IDB4N2ZmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIFJldHVybiBWYWx1ZSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICBMX2RpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAzMiBiaXQgbG9uZyBzaWduZWQgaW50ZWdlciAoV29yZDMyKSB3aG9zZSB2YWx1ZSBmYWxscyBpbiB0aGUgICoNCisgKiAgICAgICAgICAgICByYW5nZSA6IDB4MDAwMCAwMDAwIDw9IExfZGl2IDw9IDB4N2ZmZiBmZmZmLiAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgQWxnb3JpdGhtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgLSBmaW5kID0gMS9MX2Rlbm9tLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgIEZpcnN0IGFwcHJveGltYXRpb246IGFwcHJveCA9IDEgLyBkZW5vbV9oaSAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgIDEvTF9kZW5vbSA9IGFwcHJveCAqICgyLjAgLSBMX2Rlbm9tICogYXBwcm94ICkgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgLSAgcmVzdWx0ID0gTF9udW0gKiAoMS9MX2Rlbm9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqLw0KKw0KK1dvcmQzMiBEaXZfMzIgKFdvcmQzMiBMX251bSwgV29yZDE2IGRlbm9tX2hpLCBXb3JkMTYgZGVub21fbG8pDQorew0KKwlXb3JkMTYgYXBwcm94LCBoaSwgbG8sIG5faGksIG5fbG87DQorCVdvcmQzMiBMXzMyOw0KKw0KKwkvKiBGaXJzdCBhcHByb3hpbWF0aW9uOiAxIC8gTF9kZW5vbSA9IDEvZGVub21faGkgKi8NCisNCisJYXBwcm94ID0gZGl2X3MgKChXb3JkMTYpIDB4M2ZmZiwgZGVub21faGkpOw0KKw0KKwkvKiAxL0xfZGVub20gPSBhcHByb3ggKiAoMi4wIC0gTF9kZW5vbSAqIGFwcHJveCkgKi8NCisNCisJTF8zMiA9IE1weV8zMl8xNiAoZGVub21faGksIGRlbm9tX2xvLCBhcHByb3gpOw0KKw0KKwlMXzMyID0gTF9zdWIgKChXb3JkMzIpIDB4N2ZmZmZmZmZMLCBMXzMyKTsNCisJaGkgPSBMXzMyID4+IDE2Ow0KKwlsbyA9IChMXzMyICYgMHhmZmZmKSA+PiAxOw0KKw0KKwlMXzMyID0gTXB5XzMyXzE2IChoaSwgbG8sIGFwcHJveCk7DQorDQorCS8qIExfbnVtICogKDEvTF9kZW5vbSkgKi8NCisJaGkgPSBMXzMyID4+IDE2Ow0KKwlsbyA9IChMXzMyICYgMHhmZmZmKSA+PiAxOw0KKwlWT19MX0V4dHJhY3QgKExfbnVtLCAmbl9oaSwgJm5fbG8pOw0KKwlMXzMyID0gTXB5XzMyIChuX2hpLCBuX2xvLCBoaSwgbG8pOw0KKwlMXzMyID0gTF9zaGwyKExfMzIsIDIpOw0KKw0KKwlyZXR1cm4gKExfMzIpOw0KK30NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BfbWVkX29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZTk2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcF9tZWRfb2wuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogcF9tZWRfb2wuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246IENvbXB1dGUgdGhlIG9wZW4gbG9vcCBwaXRjaCBsYWcgICAgICAgICAgICAgICAgICAgICoNCisqCSAgICAgICAgICAgIG91dHB1dDogb3BlbiBsb29wIHBpdGNoIGxhZyAgICAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImFjZWxwLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAicF9tZWRfb2wudGFiIg0KKw0KK1dvcmQxNiBQaXRjaF9tZWRfb2woDQorCQkgICBXb3JkMTYgICAgICB3c3BbXSwgICAgICAgIC8qICAgaTogc2lnbmFsIHVzZWQgdG8gY29tcHV0ZSB0aGUgb3BlbiBsb29wIHBpdGNoKi8gIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIHdzcFstcGl0X21heF0gdG8gd3NwWy0xXSBzaG91bGQgYmUga25vd24gKi8NCisJCSAgIENvZGVyX1N0YXRlICpzdCwgICAgICAgICAgLyogaS9vOiBjb2RlYyBnbG9iYWwgc3RydWN0dXJlICovDQorCQkgICBXb3JkMTYgICAgICBMX2ZyYW1lICAgICAgIC8qICAgaTogbGVuZ3RoIG9mIGZyYW1lIHRvIGNvbXB1dGUgcGl0Y2ggKi8NCisJCSkNCit7DQorCVdvcmQxNiBUbTsNCisJV29yZDE2IGhpLCBsbzsNCisJV29yZDE2ICp3dywgKndlLCAqaHBfd3NwOw0KKwlXb3JkMTYgZXhwX1IwLCBleHBfUjEsIGV4cF9SMjsNCisJV29yZDMyIGksIGosIG1heCwgUjAsIFIxLCBSMjsNCisJV29yZDE2ICpwMSwgKnAyOw0KKwlXb3JkMTYgTF9taW4gPSAxNzsgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBwaXRjaCBsYWc6IFBJVF9NSU4gLyBPUExfREVDSU0gKi8NCisJV29yZDE2IExfbWF4ID0gMTE1OyAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gcGl0Y2ggbGFnOiBQSVRfTUFYIC8gT1BMX0RFQ0lNICovDQorCVdvcmQxNiBMXzAgPSBzdC0+b2xkX1QwX21lZDsgICAgICAgICAvKiBvbGQgb3Blbi1sb29wIHBpdGNoICovDQorCVdvcmQxNiAqZ2FpbiA9ICYoc3QtPm9sX2dhaW4pOyAgICAgICAvKiBub3JtYWxpemUgY29ycmVsYXRpb24gb2YgaHBfd3NwIGZvciB0aGUgbGFnICovDQorCVdvcmQxNiAqaHBfd3NwX21lbSA9IHN0LT5ocF93c3BfbWVtOyAvKiBtZW1vcnkgb2YgdGhlIGh5cGFzcyBmaWx0ZXIgZm9yIGhwX3dzcFtdIChsZyA9IDkpKi8NCisJV29yZDE2ICpvbGRfaHBfd3NwID0gc3QtPm9sZF9ocF93c3A7IC8qIGh5cGFzcyB3c3BbXSAqLw0KKwlXb3JkMTYgd2dodF9mbGcgPSBzdC0+b2xfd2dodF9mbGc7ICAgLyogaXMgd2VpZ2h0aW5nIGZ1bmN0aW9uIHVzZWQgKi8NCisNCisJd3cgPSAmY29ycndlaWdodFsxOThdOw0KKwl3ZSA9ICZjb3Jyd2VpZ2h0Wzk4ICsgTF9tYXggLSBMXzBdOw0KKw0KKwltYXggPSBNSU5fMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJVG0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IExfbWF4OyBpID4gTF9taW47IGktLSkNCisJew0KKwkJLyogQ29tcHV0ZSB0aGUgY29ycmVsYXRpb24gKi8NCisJCVIwID0gMDsNCisJCXAxID0gd3NwOw0KKwkJcDIgPSAmd3NwWy1pXTsNCisJCWZvciAoaiA9IDA7IGogPCBMX2ZyYW1lOyBqKz00KQ0KKwkJew0KKwkJCVIwICs9IHZvX0xfbXVsdCgoKnAxKyspLCAoKnAyKyspKTsNCisJCQlSMCArPSB2b19MX211bHQoKCpwMSsrKSwgKCpwMisrKSk7DQorCQkJUjAgKz0gdm9fTF9tdWx0KCgqcDErKyksICgqcDIrKykpOw0KKwkJCVIwICs9IHZvX0xfbXVsdCgoKnAxKyspLCAoKnAyKyspKTsgICAgIA0KKwkJfQ0KKwkJLyogV2VpZ2h0aW5nIG9mIHRoZSBjb3JyZWxhdGlvbiBmdW5jdGlvbi4gICAqLw0KKwkJaGkgPSBSMD4+MTY7DQorCQlsbyA9IChSMCAmIDB4ZmZmZik+PjE7DQorDQorCQlSMCA9IE1weV8zMl8xNihoaSwgbG8sICp3dyk7DQorCQl3dy0tOw0KKw0KKwkJaWYgKChMXzAgPiAwKSAmJiAod2dodF9mbGcgPiAwKSkNCisJCXsNCisJCQkvKiBXZWlnaHQgdGhlIG5laWdoYm91cmhvb2Qgb2YgdGhlIG9sZCBsYWcuICovDQorCQkJaGkgPSBSMD4+MTY7DQorCQkJbG8gPSAoUjAgJiAweGZmZmYpPj4xOw0KKwkJCVIwID0gTXB5XzMyXzE2KGhpLCBsbywgKndlKTsNCisJCQl3ZS0tOw0KKwkJfQ0KKwkJaWYoUjAgPj0gbWF4KQ0KKwkJew0KKwkJCW1heCA9IFIwOw0KKwkJCVRtID0gaTsNCisJCX0NCisJfQ0KKw0KKwkvKiBIeXBhc3MgdGhlIHdzcFtdIHZlY3RvciAqLw0KKwlocF93c3AgPSBvbGRfaHBfd3NwICsgTF9tYXg7ICAgICAgICAgICANCisJSHBfd3NwKHdzcCwgaHBfd3NwLCBMX2ZyYW1lLCBocF93c3BfbWVtKTsNCisNCisJLyogQ29tcHV0ZSBub3JtYWxpemUgY29ycmVsYXRpb24gYXQgZGVsYXkgVG0gKi8NCisJUjAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVIxID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCVIyID0gMDsgDQorCXAxID0gaHBfd3NwOw0KKwlwMiA9IGhwX3dzcCAtIFRtOw0KKwlmb3IgKGogPSAwOyBqIDwgTF9mcmFtZTsgais9NCkNCisJew0KKwkJUjIgKz0gdm9fbXVsdDMyKCpwMSwgKnAxKTsNCisJCVIxICs9IHZvX211bHQzMigqcDIsICpwMik7DQorCQlSMCArPSB2b19tdWx0MzIoKnAxKyssICpwMisrKTsNCisJCVIyICs9IHZvX211bHQzMigqcDEsICpwMSk7DQorCQlSMSArPSB2b19tdWx0MzIoKnAyLCAqcDIpOw0KKwkJUjAgKz0gdm9fbXVsdDMyKCpwMSsrLCAqcDIrKyk7DQorCQlSMiArPSB2b19tdWx0MzIoKnAxLCAqcDEpOw0KKwkJUjEgKz0gdm9fbXVsdDMyKCpwMiwgKnAyKTsNCisJCVIwICs9IHZvX211bHQzMigqcDErKywgKnAyKyspOw0KKwkJUjIgKz0gdm9fbXVsdDMyKCpwMSwgKnAxKTsNCisJCVIxICs9IHZvX211bHQzMigqcDIsICpwMik7DQorCQlSMCArPSB2b19tdWx0MzIoKnAxKyssICpwMisrKTsNCisJfQ0KKwlSMCA9IFIwIDw8MTsNCisJUjEgPSAoUjEgPDwxKSArIDFMOw0KKwlSMiA9IChSMiA8PDEpICsgMUw7DQorCS8qIGdhaW4gPSBSMC8gc3FydChSMSpSMikgKi8NCisNCisJZXhwX1IwID0gbm9ybV9sKFIwKTsNCisJUjAgPSAoUjAgPDwgZXhwX1IwKTsNCisNCisJZXhwX1IxID0gbm9ybV9sKFIxKTsNCisJUjEgPSAoUjEgPDwgZXhwX1IxKTsNCisNCisJZXhwX1IyID0gbm9ybV9sKFIyKTsNCisJUjIgPSAoUjIgPDwgZXhwX1IyKTsNCisNCisNCisJUjEgPSB2b19MX211bHQodm9fcm91bmQoUjEpLCB2b19yb3VuZChSMikpOw0KKw0KKwlpID0gbm9ybV9sKFIxKTsNCisJUjEgPSAoUjEgPDwgaSk7DQorDQorCWV4cF9SMSArPSBleHBfUjI7DQorCWV4cF9SMSArPSBpOw0KKwlleHBfUjEgPSA2MiAtIGV4cF9SMTsNCisNCisJSXNxcnRfbigmUjEsICZleHBfUjEpOw0KKw0KKwlSMCA9IHZvX0xfbXVsdCh2b3JvdW5kKFIwKSwgdm9yb3VuZChSMSkpOw0KKwlleHBfUjAgPSAzMSAtIGV4cF9SMDsNCisJZXhwX1IwICs9IGV4cF9SMTsNCisNCisJKmdhaW4gPSB2b19yb3VuZChMX3NobChSMCwgZXhwX1IwKSk7DQorDQorCS8qIFNoaXRmIGhwX3dzcFtdIGZvciBuZXh0IGZyYW1lICovDQorDQorCWZvciAoaSA9IDA7IGkgPCBMX21heDsgaSsrKQ0KKwl7DQorCQlvbGRfaHBfd3NwW2ldID0gb2xkX2hwX3dzcFtpICsgTF9mcmFtZV07DQorCX0NCisNCisJcmV0dXJuIChUbSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBGdW5jdGlvbjogbWVkaWFuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBSZXR1cm5zIHRoZSBtZWRpYW4gb2YgdGhlIHNldCB7WFstMl0sIFhbLTFdLC4uLiwgWFsyXX0sICAgICAgICAgICoNCisqICAgICAgd2hvc2UgZWxlbWVudHMgYXJlIDE2LWJpdCBpbnRlZ2Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIElucHV0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgWFstMjoyXSAgIDE2LWJpdCBpbnRlZ2Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogIFJldHVybjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgVGhlIG1lZGlhbiBvZiB7WFstMl0sIFhbLTFdLC4uLiwgWFsyXX0uICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1dvcmQxNiBtZWRpYW41KFdvcmQxNiB4W10pDQorew0KKwlXb3JkMTYgeDEsIHgyLCB4MywgeDQsIHg1Ow0KKwlXb3JkMTYgdG1wOw0KKw0KKwl4MSA9IHhbLTJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJeDIgPSB4Wy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCXgzID0geFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl4NCA9IHhbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJeDUgPSB4WzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorDQorCWlmICh4MiA8IHgxKQ0KKwl7DQorCQl0bXAgPSB4MTsNCisJCXgxID0geDI7DQorCQl4MiA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4MyA8IHgxKQ0KKwl7DQorCQl0bXAgPSB4MTsNCisJCXgxID0geDM7DQorCQl4MyA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4NCA8IHgxKQ0KKwl7DQorCQl0bXAgPSB4MTsNCisJCXgxID0geDQ7DQorCQl4NCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4NSA8IHgxKQ0KKwl7DQorCQl4NSA9IHgxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4MyA8IHgyKQ0KKwl7DQorCQl0bXAgPSB4MjsNCisJCXgyID0geDM7DQorCQl4MyA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4NCA8IHgyKQ0KKwl7DQorCQl0bXAgPSB4MjsNCisJCXgyID0geDQ7DQorCQl4NCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4NSA8IHgyKQ0KKwl7DQorCQl4NSA9IHgyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4NCA8IHgzKQ0KKwl7DQorCQl4MyA9IHg0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWlmICh4NSA8IHgzKQ0KKwl7DQorCQl4MyA9IHg1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCXJldHVybiAoeDMpOw0KK30NCisNCisNCitXb3JkMTYgTWVkX29sYWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IDogbWVkaWFuIG9mICA1IHByZXZpb3VzIG9wZW4tbG9vcCBsYWdzICAgICAgICovDQorCQlXb3JkMTYgcHJldl9vbF9sYWcsICAgICAgICAgICAgICAgIC8qIGlucHV0ICA6IHByZXZpb3VzIG9wZW4tbG9vcCBsYWcgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG9sZF9vbF9sYWdbNV0NCisJICAgICAgICkNCit7DQorCVdvcmQzMiBpOw0KKw0KKwkvKiBVc2UgbWVkaWFuIG9mIDUgcHJldmlvdXMgb3Blbi1sb29wIGxhZ3MgYXMgb2xkIGxhZyAqLw0KKw0KKwlmb3IgKGkgPSA0OyBpID4gMDsgaS0tKQ0KKwl7DQorCQlvbGRfb2xfbGFnW2ldID0gb2xkX29sX2xhZ1tpIC0gMV07IA0KKwl9DQorDQorCW9sZF9vbF9sYWdbMF0gPSBwcmV2X29sX2xhZzsgICAgICAgICAgIA0KKw0KKwlpID0gbWVkaWFuNSgmb2xkX29sX2xhZ1syXSk7DQorDQorCXJldHVybiBpOw0KKw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdF9zaHJwLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdF9zaHJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMjI3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcGl0X3NocnAuYwpAQCAtMCwwICsxLDQ5IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBwaXRfc2hycC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICBEZXNjcmlwdGlvbjogUGVyZm9ybXMgUGl0Y2ggc2hhcnBlbmluZyByb3V0aW5lICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KK3ZvaWQgUGl0X3NocnAoDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluL291dDogaW1wdWxzZSByZXNwb25zZSAob3IgYWxnZWJyYWljIGNvZGUpICovDQorCQlXb3JkMTYgcGl0X2xhZywgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGl0Y2ggbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2hhcnAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcGl0Y2ggc2hhcnBlbmluZyBmYWN0b3IgKFExNSkgICAgICAgICovDQorCQlXb3JkMTYgTF9zdWJmciAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogc3ViZnJhbWUgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiBMX3RtcDsNCisJV29yZDE2ICp4X3B0ciA9IHggKyBwaXRfbGFnOw0KKw0KKwlmb3IgKGkgPSBwaXRfbGFnOyBpIDwgTF9zdWJmcjsgaSsrKQ0KKwl7DQorCQlMX3RtcCA9ICgqeF9wdHIgPDwgMTUpOw0KKwkJTF90bXAgKz0gKngrKyAqIHNoYXJwOw0KKwkJKnhfcHRyKysgPSAoKExfdG1wICsgMHg0MDAwKT4+MTUpOw0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRjaF9mNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTViMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IHBpdGNoX2Y0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBGaW5kIHRoZSBjbG9zZWQgbG9vcCBwaXRjaCBwZXJpb2Qgd2l0aCAgICAgICAgICAgICAqDQorKgkgICAgICAgICAgICAxLzQgc3Vic2FtcGxlIHJlc29sdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KKyNkZWZpbmUgVVBfU0FNUCAgICAgIDQNCisjZGVmaW5lIExfSU5URVJQT0wxICA0DQorDQorLyogTG9jYWwgZnVuY3Rpb25zICovDQorDQorI2lmZGVmIEFTTV9PUFQNCit2b2lkIE5vcm1fY29ycl9hc20oDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGNpdGF0aW9uIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB0YXJnZXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHN5bnRoL3dndCBmaWx0ZXJzICovDQorCQlXb3JkMTYgTF9zdWJmciwNCisJCVdvcmQxNiB0X21pbiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiB0X21heCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1heGltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiBjb3JyX25vcm1bXSAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gICAgICAgICAgICAgICAgKi8NCisJCSk7DQorI2Vsc2UNCitzdGF0aWMgdm9pZCBOb3JtX0NvcnIoDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGNpdGF0aW9uIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB0YXJnZXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHN5bnRoL3dndCBmaWx0ZXJzICovDQorCQlXb3JkMTYgTF9zdWJmciwNCisJCVdvcmQxNiB0X21pbiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiB0X21heCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1heGltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiBjb3JyX25vcm1bXSAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gICAgICAgICAgICAgICAgKi8NCisJCSk7DQorI2VuZGlmDQorDQorc3RhdGljIFdvcmQxNiBJbnRlcnBvbF80KCAgICAgICAgICAgICAgICAgIC8qIChvKSAgOiBpbnRlcnBvbGF0ZWQgdmFsdWUgICovDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgOiBpbnB1dCB2ZWN0b3IgICAgICAgICovDQorCQlXb3JkMzIgZnJhYyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgOiBmcmFjdGlvbiAoLTQuLiszKSAgICovDQorCQkpOw0KKw0KKw0KK1dvcmQxNiBQaXRjaF9mcjQoICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcGl0Y2ggcGVyaW9kLiAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGV4Y1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjaXRhdGlvbiBidWZmZXIgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHhuW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogdGFyZ2V0IHZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogaW1wdWxzZSByZXNwb25zZSBvZiBzeW50aC93Z3QgZmlsdGVycyAqLw0KKwkJV29yZDE2IHQwX21pbiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBpbiB0aGUgc2VhcmNoZWQgcmFuZ2UuICAqLw0KKwkJV29yZDE2IHQwX21heCwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWF4aW11bSB2YWx1ZSBpbiB0aGUgc2VhcmNoZWQgcmFuZ2UuICAqLw0KKwkJV29yZDE2ICogcGl0X2ZyYWMsICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogY2hvc2VuIGZyYWN0aW9uICgwLCAxLCAyIG9yIDMpLiAgICAgICAqLw0KKwkJV29yZDE2IGlfc3ViZnIsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogaW5kaWNhdG9yIGZvciBmaXJzdCBzdWJmcmFtZS4gICAgICAgICAqLw0KKwkJV29yZDE2IHQwX2ZyMiwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBmb3IgcmVzb2x1dGlvbiAxLzIgICAgICAqLw0KKwkJV29yZDE2IHQwX2ZyMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbWluaW11bSB2YWx1ZSBmb3IgcmVzb2x1dGlvbiAxICAgICAgICAqLw0KKwkJV29yZDE2IExfc3ViZnIgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogTGVuZ3RoIG9mIHN1YmZyYW1lICAgICAgICAgICAgICAgICAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGZyYWN0aW9uLCBpOw0KKwlXb3JkMTYgdF9taW4sIHRfbWF4Ow0KKwlXb3JkMTYgbWF4LCB0MCwgc3RlcCwgdGVtcDsNCisJV29yZDE2ICpjb3JyOw0KKwlXb3JkMTYgY29ycl92WzQwXTsgICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBsZW5ndGggPSB0MF9tYXgtdDBfbWluKzErMipMX2ludGVyICovDQorDQorCS8qIEZpbmQgaW50ZXJ2YWwgdG8gY29tcHV0ZSBub3JtYWxpemVkIGNvcnJlbGF0aW9uICovDQorDQorCXRfbWluID0gdDBfbWluIC0gTF9JTlRFUlBPTDE7DQorCXRfbWF4ID0gdDBfbWF4ICsgTF9JTlRFUlBPTDE7DQorCWNvcnIgPSAmY29ycl92Wy10X21pbl07DQorCS8qIENvbXB1dGUgbm9ybWFsaXplZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgZmlsdGVyZWQgZXhjaXRhdGlvbiAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisgICAgTm9ybV9jb3JyX2FzbShleGMsIHhuLCBoLCBMX3N1YmZyLCB0X21pbiwgdF9tYXgsIGNvcnIpOw0KKyNlbHNlDQorCU5vcm1fQ29ycihleGMsIHhuLCBoLCBMX3N1YmZyLCB0X21pbiwgdF9tYXgsIGNvcnIpOw0KKyNlbmRpZiANCisNCisJLyogRmluZCBpbnRlZ2VyIHBpdGNoICovDQorDQorCW1heCA9IGNvcnJbdDBfbWluXTsNCisJdDAgPSB0MF9taW47DQorCWZvciAoaSA9IHQwX21pbiArIDE7IGkgPD0gdDBfbWF4OyBpKyspDQorCXsNCisJCWlmIChjb3JyW2ldID49IG1heCkNCisJCXsNCisJCQltYXggPSBjb3JyW2ldOyAgICAgICAgICAgICAgICAgDQorCQkJdDAgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorCS8qIElmIGZpcnN0IHN1YmZyYW1lIGFuZCB0MCA+PSB0MF9mcjEsIGRvIG5vdCBzZWFyY2ggZnJhY3Rpb25uYWwgcGl0Y2ggKi8NCisJaWYgKChpX3N1YmZyID09IDApICYmICh0MCA+PSB0MF9mcjEpKQ0KKwl7DQorCQkqcGl0X2ZyYWMgPSAwOw0KKwkJcmV0dXJuICh0MCk7DQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIFNlYXJjaCBmcmFjdGlvbm5hbCBwaXRjaCB3aXRoIDEvNCBzdWJzYW1wbGUgcmVzb2x1dGlvbi4gICAgICAgICAgKg0KKwkgKiBUZXN0IHRoZSBmcmFjdGlvbnMgYXJvdW5kIHQwIGFuZCBjaG9vc2UgdGhlIG9uZSB3aGljaCBtYXhpbWl6ZXMgICoNCisJICogdGhlIGludGVycG9sYXRlZCBub3JtYWxpemVkIGNvcnJlbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJc3RlcCA9IDE7ICAgICAgICAgICAgICAgLyogMS80IHN1YnNhbXBsZSByZXNvbHV0aW9uICovDQorCWZyYWN0aW9uID0gLTM7DQorCWlmICgodDBfZnIyID09IFBJVF9NSU4pfHwoKGlfc3ViZnIgPT0gMCkgJiYgKHQwID49IHQwX2ZyMikpKQ0KKwl7DQorCQlzdGVwID0gMjsgICAgICAgICAgICAgIC8qIDEvMiBzdWJzYW1wbGUgcmVzb2x1dGlvbiAqLw0KKwkJZnJhY3Rpb24gPSAtMjsNCisJfQ0KKwlpZih0MCA9PSB0MF9taW4pDQorCXsNCisJCWZyYWN0aW9uID0gMDsNCisJfQ0KKwltYXggPSBJbnRlcnBvbF80KCZjb3JyW3QwXSwgZnJhY3Rpb24pOw0KKw0KKwlmb3IgKGkgPSBmcmFjdGlvbiArIHN0ZXA7IGkgPD0gMzsgaSArPSBzdGVwKQ0KKwl7DQorCQl0ZW1wID0gSW50ZXJwb2xfNCgmY29yclt0MF0sIGkpOw0KKwkJaWYodGVtcCA+IG1heCkNCisJCXsNCisJCQltYXggPSB0ZW1wOw0KKwkJCWZyYWN0aW9uID0gaTsNCisJCX0NCisJfQ0KKwkvKiBsaW1pdCB0aGUgZnJhY3Rpb24gdmFsdWUgaW4gdGhlIGludGVydmFsIFswLDEsMiwzXSAqLw0KKwlpZiAoZnJhY3Rpb24gPCAwKQ0KKwl7DQorCQlmcmFjdGlvbiArPSBVUF9TQU1QOw0KKwkJdDAgLT0gMTsNCisJfQ0KKwkqcGl0X2ZyYWMgPSBmcmFjdGlvbjsNCisJcmV0dXJuICh0MCk7DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICBOb3JtX0NvcnIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogRmluZCB0aGUgbm9ybWFsaXplZCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0YXJnZXQgdmVjdG9yIGFuZCB0aGUgICAgKg0KKyogZmlsdGVyZWQgcGFzdCBleGNpdGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIChjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgZmlsdGVyZWQgZXhjaXRhdGlvbiBkaXZpZGVkIGJ5IHRoZSAgICAgICAgICAgICAgICAqDQorKiAgc3F1YXJlIHJvb3Qgb2YgZW5lcmd5IG9mIHRhcmdldCBhbmQgZmlsdGVyZWQgZXhjaXRhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaWZuZGVmIEFTTV9PUFQNCitzdGF0aWMgdm9pZCBOb3JtX0NvcnIoDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBleGNpdGF0aW9uIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB0YXJnZXQgdmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgaFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHN5bnRoL3dndCBmaWx0ZXJzICovDQorCQlXb3JkMTYgTF9zdWJmciwNCisJCVdvcmQxNiB0X21pbiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1pbmltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiB0X21heCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG1heGltdW0gdmFsdWUgb2YgcGl0Y2ggbGFnLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiBjb3JyX25vcm1bXSkgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IG5vcm1hbGl6ZWQgY29ycmVsYXRpb24gICAgICAgICAgICAgICAgKi8NCit7DQorCVdvcmQzMiBpLCBrLCB0Ow0KKwlXb3JkMzIgY29yciwgZXhwX2NvcnIsIG5vcm0sIGV4cCwgc2NhbGU7DQorCVdvcmQxNiBleHBfbm9ybSwgZXhjZltMX1NVQkZSXSwgdG1wOw0KKwlXb3JkMzIgTF90bXAsIExfdG1wMSwgTF90bXAyOw0KKw0KKwkvKiBjb21wdXRlIHRoZSBmaWx0ZXJlZCBleGNpdGF0aW9uIGZvciB0aGUgZmlyc3QgZGVsYXkgdF9taW4gKi8NCisJayA9IC10X21pbjsNCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJQ29udm9sdmVfYXNtKCZleGNba10sIGgsIGV4Y2YsIDY0KTsNCisjZWxzZQ0KKwlDb252b2x2ZSgmZXhjW2tdLCBoLCBleGNmLCA2NCk7DQorI2VuZGlmDQorDQorCS8qIENvbXB1dGUgcm91bmRlZCBkb3duIDEvc3FydChlbmVyZ3kgb2YgeG5bXSkgKi8NCisJTF90bXAgPSAwOyANCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKz00KQ0KKwl7DQorCQlMX3RtcCArPSAoeG5baV0gKiB4bltpXSk7DQorCQlMX3RtcCArPSAoeG5baSsxXSAqIHhuW2krMV0pOw0KKwkJTF90bXAgKz0gKHhuW2krMl0gKiB4bltpKzJdKTsNCisJCUxfdG1wICs9ICh4bltpKzNdICogeG5baSszXSk7DQorCX0NCisNCisJTF90bXAgPSAoTF90bXAgPDwgMSkgKyAxOw0KKwlleHAgPSBub3JtX2woTF90bXApOw0KKwlleHAgPSAoMzIgLSBleHApOw0KKwkvL2V4cCA9IGV4cCArIDI7ICAgICAgICAgICAgICAgICAgICAgLyogZW5lcmd5IG9mIHhuW10geCAyICsgcm91bmRlZCB1cCAgICAgKi8NCisJc2NhbGUgPSAtKGV4cCA+PiAxKTsgICAgICAgICAgIC8qICgxPDxzY2FsZSkgPCAxL3NxcnQoZW5lcmd5IHJvdW5kZWQpICovDQorDQorCS8qIGxvb3AgZm9yIGV2ZXJ5IHBvc3NpYmxlIHBlcmlvZCAqLw0KKw0KKwlmb3IgKHQgPSB0X21pbjsgdCA8PSB0X21heDsgdCsrKQ0KKwl7DQorCQkvKiBDb21wdXRlIGNvcnJlbGF0aW9uIGJldHdlZW4geG5bXSBhbmQgZXhjZltdICovDQorCQlMX3RtcCAgPSAwOyAgDQorCQlMX3RtcDEgPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8IDY0OyBpKz00KQ0KKwkJew0KKwkJCUxfdG1wICArPSAoeG5baV0gKiBleGNmW2ldKTsNCisJCQlMX3RtcDEgKz0gKGV4Y2ZbaV0gKiBleGNmW2ldKTsNCisJCQlMX3RtcCAgKz0gKHhuW2krMV0gKiBleGNmW2krMV0pOw0KKwkJCUxfdG1wMSArPSAoZXhjZltpKzFdICogZXhjZltpKzFdKTsNCisJCQlMX3RtcCAgKz0gKHhuW2krMl0gKiBleGNmW2krMl0pOw0KKwkJCUxfdG1wMSArPSAoZXhjZltpKzJdICogZXhjZltpKzJdKTsNCisJCQlMX3RtcCAgKz0gKHhuW2krM10gKiBleGNmW2krM10pOw0KKwkJCUxfdG1wMSArPSAoZXhjZltpKzNdICogZXhjZltpKzNdKTsNCisJCX0NCisNCisJCUxfdG1wID0gKExfdG1wIDw8IDEpICsgMTsNCisJCUxfdG1wMSA9IChMX3RtcDEgPDwgMSkgKyAxOw0KKw0KKwkJZXhwID0gbm9ybV9sKExfdG1wKTsNCisJCUxfdG1wID0gKExfdG1wIDw8IGV4cCk7DQorCQlleHBfY29yciA9ICgzMCAtIGV4cCk7DQorCQljb3JyID0gZXh0cmFjdF9oKExfdG1wKTsNCisNCisJCWV4cCA9IG5vcm1fbChMX3RtcDEpOw0KKwkJTF90bXAgPSAoTF90bXAxIDw8IGV4cCk7DQorCQlleHBfbm9ybSA9ICgzMCAtIGV4cCk7DQorDQorCQlJc3FydF9uKCZMX3RtcCwgJmV4cF9ub3JtKTsNCisJCW5vcm0gPSBleHRyYWN0X2goTF90bXApOw0KKw0KKwkJLyogTm9ybWFsaXplIGNvcnJlbGF0aW9uID0gY29ycmVsYXRpb24gKiAoMS9zcXJ0KGVuZXJneSkpICovDQorDQorCQlMX3RtcCA9IHZvX0xfbXVsdChjb3JyLCBub3JtKTsNCisNCisJCUxfdG1wMiA9IGV4cF9jb3JyICsgZXhwX25vcm0gKyBzY2FsZTsNCisJCWlmKExfdG1wMiA8IDApDQorCQl7DQorCQkJTF90bXAyID0gLUxfdG1wMjsNCisJCQlMX3RtcCA9IExfdG1wID4+IExfdG1wMjsNCisJCX0NCisJCWVsc2UNCisJCXsNCisJCQlMX3RtcCA9IExfdG1wIDw8IExfdG1wMjsNCisJCX0NCisNCisJCWNvcnJfbm9ybVt0XSA9IHZvX3JvdW5kKExfdG1wKTsgICAgICANCisJCS8qIG1vZGlmeSB0aGUgZmlsdGVyZWQgZXhjaXRhdGlvbiBleGNmW10gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLw0KKw0KKwkJaWYodCAhPSB0X21heCkNCisJCXsNCisJCQlrID0gLSh0ICsgMSk7DQorCQkJdG1wID0gZXhjW2tdOw0KKwkJCWZvciAoaSA9IDYzOyBpID4gMDsgaS0tKQ0KKwkJCXsNCisJCQkJZXhjZltpXSA9IGFkZDEodm9fbXVsdCh0bXAsIGhbaV0pLCBleGNmW2kgLSAxXSk7DQorCQkJfQ0KKwkJCWV4Y2ZbMF0gPSB2b19tdWx0KHRtcCwgaFswXSk7DQorCQl9DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisjZW5kaWYNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogSW50ZXJwb2xfNCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVzY3JpcHRpb246IEZvciBpbnRlcnBvbGF0aW5nIHRoZSBub3JtYWxpemVkIGNvcnJlbGF0aW9uIHdpdGggMS80IHJlc29sdXRpb24uICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorLyogMS80IHJlc29sdXRpb24gaW50ZXJwb2xhdGlvbiBmaWx0ZXIgKC0zIGRCIGF0IDAuNzkxKmZzLzIpIGluIFExNCAqLw0KK3N0YXRpYyBXb3JkMTYgaW50ZXI0XzFbNF1bOF0gPQ0KK3sNCisJey0xMiwgNDIwLCAtMTczMiwgNTQyOSwgMTM0MTgsIC0xMjQyLCA3MywgMzJ9LA0KKwl7LTI2LCA0NTUsIC0yMTQyLCA5OTEwLCA5OTEwLCAgLTIxNDIsIDQ1NSwgLTI2fSwNCisJezMyLCAgNzMsIC0xMjQyLCAxMzQxOCwgNTQyOSwgLTE3MzIsIDQyMCwgLTEyfSwNCisJezIwNiwgLTc2NiwgMTM3NiwgMTQ3NDYsIDEzNzYsIC03NjYsIDIwNiwgMH0NCit9Ow0KKw0KKy8qKiogQ29lZmZpY2llbnRzIGluIGZsb2F0aW5nIHBvaW50DQorc3RhdGljIGZsb2F0IGludGVyNF8xW1VQX1NBTVAqTF9JTlRFUlBPTDErMV0gPSB7DQorMC45MDAwMDAsDQorMC44MTg5NTksICAwLjYwNDg1MCwgIDAuMzMxMzc5LCAgMC4wODM5NTgsDQorLTAuMDc1Nzk1LCAtMC4xMzA3MTcsIC0wLjEwNTY4NSwgLTAuMDQ2Nzc0LA0KKzAuMDA0NDY3LCAgMC4wMjc3ODksICAwLjAyNTY0MiwgIDAuMDEyNTcxLA0KKzAuMDAxOTI3LCAtMC4wMDE1NzEsIC0wLjAwMDc1MywgIDAuMDAwMDAwfTsNCisqKiovDQorDQorc3RhdGljIFdvcmQxNiBJbnRlcnBvbF80KCAgICAgICAgICAgICAgICAgIC8qIChvKSAgOiBpbnRlcnBvbGF0ZWQgdmFsdWUgICovDQorCQlXb3JkMTYgKiB4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgOiBpbnB1dCB2ZWN0b3IgICAgICAgICovDQorCQlXb3JkMzIgZnJhYyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgOiBmcmFjdGlvbiAoLTQuLiszKSAgICovDQorCQkpDQorew0KKwlXb3JkMTYgc3VtOw0KKwlXb3JkMzIgIGssIExfc3VtOw0KKwlXb3JkMTYgKnB0cjsNCisNCisJaWYgKGZyYWMgPCAwKQ0KKwl7DQorCQlmcmFjICs9IFVQX1NBTVA7DQorCQl4LS07DQorCX0NCisJeCA9IHggLSBMX0lOVEVSUE9MMSArIDE7DQorCWsgPSBVUF9TQU1QIC0gMSAtIGZyYWM7DQorCXB0ciA9ICYoaW50ZXI0XzFba11bMF0pOw0KKw0KKwlMX3N1bSAgPSB2b19tdWx0MzIoeFswXSwgKCpwdHIrKykpOw0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFsxXSwgKCpwdHIrKykpOw0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFsyXSwgKCpwdHIrKykpOw0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFszXSwgKCpwdHIrKykpOw0KKwlMX3N1bSArPSB2b19tdWx0MzIoeFs0XSwgKCpwdHIrKykpOyAgDQorCUxfc3VtICs9IHZvX211bHQzMih4WzVdLCAoKnB0cisrKSk7DQorCUxfc3VtICs9IHZvX211bHQzMih4WzZdLCAoKnB0cisrKSk7DQorCUxfc3VtICs9IHZvX211bHQzMih4WzddLCAoKnB0cisrKSk7ICAgDQorDQorCXN1bSA9IGV4dHJhY3RfaChMX2FkZChMX3NobDIoTF9zdW0sIDIpLCAweDgwMDApKTsNCisJcmV0dXJuIChzdW0pOw0KK30NCisNCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWRfbHQ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZmYyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZF9sdDQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogcHJlZF9sdDQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246IENvbXB1dGUgdGhlIHJlc3VsdCBvZiBsb25nIHRlcm0gcHJlZGljdGlvbiB3aXRoICAgICoNCisqICAgICAgZnJhY3Rpb25hbCBpbnRlcnBvbGF0aW9uIG9mIHJlc29sdXRpb24gMS80ICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgb24gcmV0dXJuIGV4Y1swLi5MX3N1YnItMV0gY29udGFpbnMgdGhlIGludGVycG9sYXRlZCBzaWduYWwgICAgICoNCisqICAgICAgKGFkYXB0aXZlIGNvZGVib29rIGV4Y2l0YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCisjZGVmaW5lIFVQX1NBTVAgICAgICA0DQorI2RlZmluZSBMX0lOVEVSUE9MMiAgMTYNCisNCisvKiAxLzQgcmVzb2x1dGlvbiBpbnRlcnBvbGF0aW9uIGZpbHRlciAoLTMgZEIgYXQgMC44NTYqZnMvMikgaW4gUTE0ICovDQorDQorV29yZDE2IGludGVyNF8yWzRdWzMyXSA9DQorew0KKwl7MCwtMiw0LC0yLC0xMCwzOCwtODgsMTY1LC0yNzUsNDI0LC02MTksODcxLC0xMjA3LDE2OTksLTI1OTgsNTUzMSwxNDAzMSwtMjE0Nyw3ODAsLTI0OSwNCisJLTE2LDE1MywtMjEzLDIyNiwtMjA5LDE3NSwtMTMzLDkxLC01NSwyOCwtMTAsMn0sDQorDQorCXsxLC03LDE5LC0zMyw0NywtNTIsNDMsLTksLTYwLDE3NSwtMzU1LDYyNiwtMTA0NCwxNzQ5LC0zMjY3LDEwMzU5LDEwMzU5LC0zMjY3LDE3NDksLTEwNDQsDQorCTYyNiwtMzU1LDE3NSwtNjAsLTksNDMsLTUyLDQ3LC0zMywxOSwgLTcsIDF9LA0KKw0KKwl7MiwtMTAsMjgsLTU1LDkxLC0xMzMsMTc1LC0yMDksMjI2LC0yMTMsMTUzLC0xNiwtMjQ5LDc4MCwtMjE0NywxNDAzMSw1NTMxLC0yNTk4LDE2OTksLTEyMDcsDQorCTg3MSwtNjE5LDQyNCwtMjc1LDE2NSwtODgsMzgsLTEwLC0yLDQsLTIsMH0sDQorDQorCXsxLC03LDIyLC00OSw5MiwtMTUzLDIzMSwtMzI1LDQzMSwtNTQ0LDY1NiwtNzYyLDg1MywtOTIzLDk2OCwxNTQwMSw5NjgsLTkyMyw4NTMsLTc2MiwNCisJNjU2LC01NDQsNDMxLC0zMjUsMjMxLC0xNTMsOTIsLTQ5LDIyLC03LCAxLCAwfQ0KKw0KK307DQorDQordm9pZCBQcmVkX2x0NCgNCisJCVdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4vb3V0OiBleGNpdGF0aW9uIGJ1ZmZlciAqLw0KKwkJV29yZDE2IFQwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IGludGVnZXIgcGl0Y2ggbGFnICovDQorCQlXb3JkMTYgZnJhYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogZnJhY3Rpb24gb2YgbGFnICAgKi8NCisJCVdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzdWJmcmFtZSBzaXplICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQxNiBqLCBrLCAqeDsNCisJV29yZDMyIExfc3VtOw0KKwlXb3JkMTYgKnB0ciwgKnB0cjE7DQorCVdvcmQxNiAqcHRyMjsNCisNCisJeCA9IGV4YyAtIFQwOyAgIA0KKwlmcmFjID0gLWZyYWM7DQorCWlmIChmcmFjIDwgMCkNCisJew0KKwkJZnJhYyArPSBVUF9TQU1QOw0KKwkJeC0tOw0KKwl9ICAgDQorCXggLT0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHggPSBMX0lOVEVSUE9MMiAtIDEgKi8NCisJayA9IDMgLSBmcmFjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogayA9IFVQX1NBTVAgLSAxIC0gZnJhYyAqLw0KKw0KKwlwdHIyID0gJihpbnRlcjRfMltrXVswXSk7DQorCWZvciAoaiA9IDA7IGogPCBMX3N1YmZyOyBqKyspDQorCXsNCisJCXB0ciA9IHB0cjI7DQorCQlwdHIxID0geDsNCisJCUxfc3VtICA9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisJCUxfc3VtICs9IHZvX211bHQzMigoKnB0cjErKyksICgqcHRyKyspKTsNCisNCisJCUxfc3VtID0gTF9zaGwyKExfc3VtLCAyKTsNCisJCWV4Y1tqXSA9IGV4dHJhY3RfaChMX2FkZChMX3N1bSwgMHg4MDAwKSk7DQorCQl4Kys7DQorCX0NCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZW1waC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmNkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYwpAQCAtMCwwICsxLDg4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBwcmVlbXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246IFByZWVtcGhhc2lzOiBmaWx0ZXJpbmcgdGhyb3VnaCAxIC0gZyB6Xi0xICAgICAgICAgKg0KKyoJICAgICAgICAgICBQcmVlbXBoMiAtLT4gc2lnbmFsIGlzIG11bHRpcGxpZWQgYnkgMiAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCit2b2lkIFByZWVtcGgoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogcHJlZW1waGFzaXMgY29lZmZpY2llbnQgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGxlbmdodCBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgKQ0KK3sNCisJV29yZDE2IHRlbXA7DQorCVdvcmQzMiBpLCBMX3RtcDsNCisNCisJdGVtcCA9IHhbbGcgLSAxXTsgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChpID0gbGcgLSAxOyBpID4gMDsgaS0tKQ0KKwl7DQorCQlMX3RtcCA9IExfZGVwb3NpdF9oKHhbaV0pOw0KKwkJTF90bXAgLT0gKHhbaSAtIDFdICogbXUpPDwxOw0KKwkJeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OyAgICAgICAgICAgICAgIA0KKwl9DQorDQorCUxfdG1wID0gTF9kZXBvc2l0X2goeFswXSk7DQorCUxfdG1wIC09ICgoKm1lbSkgKiBtdSk8PDE7DQorCXhbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICAgICAgDQorDQorCSptZW0gPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KK3ZvaWQgUHJlZW1waDIoDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLw0KKwkJV29yZDE2IG11LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogcHJlZW1waGFzaXMgY29lZmZpY2llbnQgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGxlbmdodCBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQxNiB0ZW1wOw0KKwlXb3JkMzIgaSwgTF90bXA7DQorDQorCXRlbXAgPSB4W2xnIC0gMV07ICAgICAgICAgICAgICAgICAgICAgDQorDQorCWZvciAoaSA9IChXb3JkMTYpIChsZyAtIDEpOyBpID4gMDsgaS0tKQ0KKwl7DQorCQlMX3RtcCA9IExfZGVwb3NpdF9oKHhbaV0pOw0KKwkJTF90bXAgLT0gKHhbaSAtIDFdICogbXUpPDwxOw0KKwkJTF90bXAgPSAoTF90bXAgPDwgMSk7DQorCQl4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgICAgDQorCX0NCisNCisJTF90bXAgPSBMX2RlcG9zaXRfaCh4WzBdKTsNCisJTF90bXAgLT0gKCgqbWVtKSAqIG11KTw8MTsNCisJTF90bXAgPSAoTF90bXAgPDwgMSk7DQorCXhbMF0gPSAoTF90bXAgKyAweDgwMDApPj4xNjsgICAgICAgICAgICAgICAgICAgDQorDQorCSptZW0gPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX2dhaW4yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllZWZlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogIEZpbGU6IHFfZ2FpbjIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgRGVzY3JpcHRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogUXVhbnRpemF0aW9uIG9mIHBpdGNoIGFuZCBjb2RlYm9vayBnYWlucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIE1BIHByZWRpY3Rpb24gaXMgcGVyZm9ybWVkIG9uIHRoZSBpbm5vdmF0aW9uIGVuZXJneSAoaW4gZEIgd2l0aCBtZWFuICAgICAqDQorKiByZW1vdmVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogQW4gaW5pdGlhbCBwcmVkaWN0ZWQgZ2FpbiwgZ18wLCBpcyBmaXJzdCBkZXRlcm1pbmVkIGFuZCB0aGUgY29ycmVjdGlvbiAgICoNCisqIGZhY3RvciAgICAgYWxwaGEgPSBnYWluIC8gZ18wICAgIGlzIHF1YW50aXplZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBUaGUgcGl0Y2ggZ2FpbiBhbmQgdGhlIGNvcnJlY3Rpb24gZmFjdG9yIGFyZSB2ZWN0b3IgcXVhbnRpemVkIGFuZCB0aGUgICAgKg0KKyogbWVhbi1zcXVhcmVkIHdlaWdodGVkIGVycm9yIGNyaXRlcmlvbiBpcyB1c2VkIGluIHRoZSBxdWFudGl6ZXIgc2VhcmNoLiAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm9wZXJfMzJiLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAibG9nMi5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJxX2dhaW4yLnRhYiINCisNCisjZGVmaW5lIE1FQU5fRU5FUiAgICAzMA0KKyNkZWZpbmUgUkFOR0UgICAgICAgIDY0DQorI2RlZmluZSBQUkVEX09SREVSICAgNA0KKw0KKw0KKy8qIE1BIHByZWRpY3Rpb24gY29lZmYgPXswLjUsIDAuNCwgMC4zLCAwLjJ9IGluIFExMyAqLw0KK3N0YXRpYyBXb3JkMTYgcHJlZFtQUkVEX09SREVSXSA9IHs0MDk2LCAzMjc3LCAyNDU4LCAxNjM4fTsNCisNCisNCit2b2lkIEluaXRfUV9nYWluMigNCisJCVdvcmQxNiAqIG1lbSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0ICA6c3RhdGljIG1lbW9yeSAoMiB3b3JkcykgICAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGk7DQorDQorCS8qIDRuZCBvcmRlciBxdWFudGl6ZXIgZW5lcmd5IHByZWRpY3RvciAoaW5pdCB0byAtMTQuMCBpbiBRMTApICovDQorCWZvciAoaSA9IDA7IGkgPCBQUkVEX09SREVSOyBpKyspDQorCXsNCisJCW1lbVtpXSA9IC0xNDMzNjsgICAgICAgICAgICAgICAgICAgICAvKiBwYXN0X3F1YV9lbltpXSAqLw0KKwl9DQorDQorCXJldHVybjsNCit9DQorDQorV29yZDE2IFFfZ2FpbjIoICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiBpbmRleCBvZiBxdWFudGl6YXRpb24uICAgICAgICAgICovDQorCQlXb3JkMTYgeG5bXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRX3huOiBUYXJnZXQgdmVjdG9yLiAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeTFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRX3huOiBBZGFwdGl2ZSBjb2RlYm9vay4gICAgICAgICAgICovDQorCQlXb3JkMTYgUV94biwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiB4biBhbmQgeTEgZm9ybWF0ICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeTJbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBROSAgOiBGaWx0ZXJlZCBpbm5vdmF0aXZlIHZlY3Rvci4gICovDQorCQlXb3JkMTYgY29kZVtdLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBROSAgOiBJbm5vdmF0aXZlIHZlY3Rvci4gICAgICAgICAgICovDQorCQlXb3JkMTYgZ19jb2VmZltdLCAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBDb3JyZWxhdGlvbnMgPHhuIHkxPiA8eTEgeTE+ICovDQorCQkvKiAgICAgICAgICAgQ29tcHV0ZSBpbiBHX3BpdGNoKCkuICAgICAgICAqLw0KKwkJV29yZDE2IExfc3ViZnIsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogU3ViZnJhbWUgbGVuZ2h0LiAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IG5iaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogbnVtYmVyIG9mIGJpdHMgKDYgb3IgNykgICAgICAqLw0KKwkJV29yZDE2ICogZ2Fpbl9waXQsICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKVExNDogUGl0Y2ggZ2Fpbi4gICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDMyICogZ2Fpbl9jb2QsICAgICAgICAgICAgICAgICAgICAvKiAobykgUTE2IDogQ29kZSBnYWluLiAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGdwX2NsaXAsICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogR3AgQ2xpcHBpbmcgZmxhZyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogbWVtICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSAgIDogc3RhdGljIG1lbW9yeSAoMiB3b3JkcykgICAgICAqLw0KKwkgICAgICApDQorew0KKwlXb3JkMTYgaW5kZXgsICpwLCBtaW5faW5kLCBzaXplOw0KKwlXb3JkMTYgZXhwLCBmcmFjLCBnY29kZTAsIGV4cF9nY29kZTAsIGVfbWF4LCBleHBfY29kZSwgcXVhX2VuZXI7DQorCVdvcmQxNiBnX3BpdGNoLCBnMl9waXRjaCwgZ19jb2RlLCBnX3BpdF9jb2QsIGcyX2NvZGUsIGcyX2NvZGVfbG87DQorCVdvcmQxNiBjb2VmZls1XSwgY29lZmZfbG9bNV0sIGV4cF9jb2VmZls1XTsNCisJV29yZDE2IGV4cF9tYXhbNV07DQorCVdvcmQzMiBpLCBqLCBMX3RtcCwgZGlzdF9taW47DQorCVdvcmQxNiAqcGFzdF9xdWFfZW4sICp0X3F1YV9nYWluOw0KKw0KKwlwYXN0X3F1YV9lbiA9IG1lbTsgICAgICAgICAgICAgICAgICAgICANCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogLSBGaW5kIHRoZSBpbml0aWFsIHF1YW50aXphdGlvbiBwaXRjaCBpbmRleCAgICAgICAgICAgICAgICAgICAgICoNCisJICogLSBTZXQgZ2FpbnMgc2VhcmNoIHJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCWlmIChuYml0cyA9PSA2KQ0KKwl7DQorCQl0X3F1YV9nYWluID0gdF9xdWFfZ2FpbjZiOyAgICAgICAgIA0KKwkJbWluX2luZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICANCisJCXNpemUgPSBSQU5HRTsgICAgICAgICAgICAgICAgICAgICAgDQorDQorCQlpZihncF9jbGlwID09IDEpDQorCQl7DQorCQkJc2l6ZSA9IHNpemUgLSAxNjsgICAgICAgICAgLyogbGltaXQgZ2FpbiBwaXRjaCB0byAxLjAgKi8NCisJCX0NCisJfSBlbHNlDQorCXsNCisJCXRfcXVhX2dhaW4gPSB0X3F1YV9nYWluN2I7ICAgICAgICAgDQorDQorCQlwID0gdF9xdWFfZ2FpbjdiICsgUkFOR0U7ICAgICAgICAgICAgLyogcHQgYXQgMS80dGggb2YgdGFibGUgKi8NCisNCisJCWogPSBuYl9xdWFfZ2FpbjdiIC0gUkFOR0U7ICAgICAgICAgDQorDQorCQlpZiAoZ3BfY2xpcCA9PSAxKQ0KKwkJew0KKwkJCWogPSBqIC0gMjc7ICAgICAgICAgICAgICAgIC8qIGxpbWl0IGdhaW4gcGl0Y2ggdG8gMS4wICovDQorCQl9DQorCQltaW5faW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZ19waXRjaCA9ICpnYWluX3BpdDsgICAgICAgICAgICAgICANCisNCisJCWZvciAoaSA9IDA7IGkgPCBqOyBpKyssIHAgKz0gMikNCisJCXsNCisJCQlpZiAoZ19waXRjaCA+ICpwKQ0KKwkJCXsNCisJCQkJbWluX2luZCA9IG1pbl9pbmQgKyAxOw0KKwkJCX0NCisJCX0NCisJCXNpemUgPSBSQU5HRTsgICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICBDb21wdXRlIGNvZWZmaWNpZW50IG5lZWQgZm9yIHRoZSBxdWFudGl6YXRpb24uICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogIGNvZWZmWzBdID0gICAgeTEgeTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICBjb2VmZlsxXSA9IC0yIHhuIHkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgY29lZmZbMl0gPSAgICB5MiB5MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogIGNvZWZmWzNdID0gLTIgeG4geTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICBjb2VmZls0XSA9ICAyIHkxIHkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogUHJvZHVjdCA8eTEgeTE+IGFuZCA8eG4geTE+IGhhdmUgYmVlbiBjb21wdXRlIGluIEdfcGl0Y2goKSBhbmQgICAqDQorCSAqIGFyZSBpbiB2ZWN0b3IgZ19jb2VmZltdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCWNvZWZmWzBdID0gZ19jb2VmZlswXTsgICAgICAgICAgICAgICAgIA0KKwlleHBfY29lZmZbMF0gPSBnX2NvZWZmWzFdOyAgICAgICAgICAgICANCisJY29lZmZbMV0gPSBuZWdhdGUoZ19jb2VmZlsyXSk7ICAgICAgICAgICAgICAgICAgICAvKiBjb2VmZlsxXSA9IC0yIHhuIHkxICovDQorCWV4cF9jb2VmZlsxXSA9IGdfY29lZmZbM10gKyAxOyAgICAgDQorDQorCS8qIENvbXB1dGUgc2NhbGFyIHByb2R1Y3QgPHkyW10seTJbXT4gKi8NCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwljb2VmZlsyXSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbSh5MiwgeTIsIExfc3ViZnIsICZleHApKTsNCisjZWxzZQ0KKwljb2VmZlsyXSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyKHkyLCB5MiwgTF9zdWJmciwgJmV4cCkpOw0KKyNlbmRpZg0KKwlleHBfY29lZmZbMl0gPSAoZXhwIC0gMTgpICsgKFFfeG4gPDwgMSk7ICAgICAvKiAtMTggKHkyIFE5KSAqLw0KKw0KKwkvKiBDb21wdXRlIHNjYWxhciBwcm9kdWN0IC0yKjx4bltdLHkyW10+ICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwljb2VmZlszXSA9IGV4dHJhY3RfaChMX25lZ2F0ZShEb3RfcHJvZHVjdDEyX2FzbSh4biwgeTIsIExfc3ViZnIsICZleHApKSk7DQorI2Vsc2UNCisJY29lZmZbM10gPSBleHRyYWN0X2goTF9uZWdhdGUoRG90X3Byb2R1Y3QxMih4biwgeTIsIExfc3ViZnIsICZleHApKSk7DQorI2VuZGlmDQorDQorCWV4cF9jb2VmZlszXSA9IChleHAgLSA4KSArIFFfeG47ICAvKiAtOSAoeTIgUTkpLCArMSAoMiB4biB5MikgKi8NCisNCisJLyogQ29tcHV0ZSBzY2FsYXIgcHJvZHVjdCAyKjx5MVtdLHkyW10+ICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCWNvZWZmWzRdID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKHkxLCB5MiwgTF9zdWJmciwgJmV4cCkpOw0KKyNlbHNlDQorCWNvZWZmWzRdID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoeTEsIHkyLCBMX3N1YmZyLCAmZXhwKSk7DQorI2VuZGlmDQorCWV4cF9jb2VmZls0XSA9IChleHAgLSA4KSArIFFfeG47ICAvKiAtOSAoeTIgUTkpLCArMSAoMiB5MSB5MikgKi8NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogIEZpbmQgZW5lcmd5IG9mIGNvZGUgYW5kIGNvbXB1dGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgTF90bXAgPSBNRUFOX0VORVIgLSAxMGxvZzEwKGVuZXJneSBvZiBjb2RlLyBMX3N1YmZyKSAgICAgICAgICoNCisJICogICAgICAgICAgPSBNRUFOX0VORVIgLSAzLjAxMDMqbG9nMihlbmVyZ3kgb2YgY29kZS8gTF9zdWJmcikgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCUxfdG1wID0gRG90X3Byb2R1Y3QxMl9hc20oY29kZSwgY29kZSwgTF9zdWJmciwgJmV4cF9jb2RlKTsNCisjZWxzZQ0KKwlMX3RtcCA9IERvdF9wcm9kdWN0MTIoY29kZSwgY29kZSwgTF9zdWJmciwgJmV4cF9jb2RlKTsNCisjZW5kaWYNCisJLyogZXhwX2NvZGU6IC0xOCAoY29kZSBpbiBROSksIC02ICgvTF9zdWJmciksIC0zMSAoTF90bXAgUTMxLT5RMCkgKi8NCisJZXhwX2NvZGUgPSAoZXhwX2NvZGUgLSAoMTggKyA2ICsgMzEpKTsNCisNCisJTG9nMihMX3RtcCwgJmV4cCwgJmZyYWMpOw0KKwlleHAgKz0gZXhwX2NvZGU7DQorCUxfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgLTI0NjYwKTsgIC8qIHggLTMuMDEwMyhRMTMpIC0+IFExNCAqLw0KKw0KKwlMX3RtcCArPSAoTUVBTl9FTkVSICogODE5Mik8PDE7IC8qICsgTUVBTl9FTkVSIGluIFExNCAqLw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBDb21wdXRlIGdjb2RlMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgPSBTdW0oaT0wLDEpIHByZWRbaV0qcGFzdF9xdWFfZW5baV0gKyBtZWFuX2VuZXIgLSBlbmVyX2NvZGUgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJTF90bXAgPSAoTF90bXAgPDwgMTApOyAgICAgICAgICAgICAgLyogRnJvbSBRMTQgdG8gUTI0ICovDQorCUxfdG1wICs9IChwcmVkWzBdICogcGFzdF9xdWFfZW5bMF0pPDwxOyAgICAgIC8qIFExMypRMTAgLT4gUTI0ICovDQorCUxfdG1wICs9IChwcmVkWzFdICogcGFzdF9xdWFfZW5bMV0pPDwxOyAgICAgIC8qIFExMypRMTAgLT4gUTI0ICovDQorCUxfdG1wICs9IChwcmVkWzJdICogcGFzdF9xdWFfZW5bMl0pPDwxOyAgICAgIC8qIFExMypRMTAgLT4gUTI0ICovDQorCUxfdG1wICs9IChwcmVkWzNdICogcGFzdF9xdWFfZW5bM10pPDwxOyAgICAgIC8qIFExMypRMTAgLT4gUTI0ICovDQorDQorCWdjb2RlMCA9IGV4dHJhY3RfaChMX3RtcCk7ICAgICAgICAgICAgIC8qIEZyb20gUTI0IHRvIFE4ICAqLw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBnY29kZTAgPSBwb3coMTAuMCwgZ2NvZGUwLzIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgPSBwb3coMiwgMy4zMjE5MjgqZ2NvZGUwLzIwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgPSBwb3coMiwgMC4xNjYwOTYqZ2NvZGUwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJTF90bXAgPSB2b19MX211bHQoZ2NvZGUwLCA1NDQzKTsgICAgICAgICAgLyogKjAuMTY2MDk2IGluIFExNSAtPiBRMjQgICAgICovDQorCUxfdG1wID0gTF90bXAgPj4gODsgICAgICAgICAgICAgICAvKiBGcm9tIFEyNCB0byBRMTYgICAgICAgICAgICAgKi8NCisJVk9fTF9FeHRyYWN0KExfdG1wLCAmZXhwX2djb2RlMCwgJmZyYWMpOyAgLyogRXh0cmFjdCBleHBvbmVudCBvZiBnY29kZTAgICovDQorDQorCWdjb2RlMCA9IChXb3JkMTYpKFBvdzIoMTQsIGZyYWMpKTsgICAgLyogUHV0IDE0IGFzIGV4cG9uZW50IHNvIHRoYXQgICovDQorCS8qIG91dHB1dCBvZiBQb3cyKCkgd2lsbCBiZTogICAqLw0KKwkvKiAxNjM4NCA8IFBvdzIoKSA8PSAzMjc2NyAgICAgKi8NCisJZXhwX2djb2RlMCAtPSAxNDsNCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBGaW5kIHRoZSBiZXN0IHF1YW50aXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogQmVmb3JlIGRvaW5nIHRoZSBjb21wdXRhdGlvbiB3ZSBuZWVkIHRvIGFsaW5nIGV4cG9uZW50cyBvZiBjb2VmZltdICAgICAgKg0KKwkgKiB0byBiZSBzdXJlIHRvIGhhdmUgdGhlIG1heGltdW0gcHJlY2lzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogSW4gdGhlIHRhYmxlIHRoZSBwaXRjaCBnYWlucyBhcmUgaW4gUTE0LCB0aGUgY29kZSBnYWlucyBhcmUgaW4gUTExIGFuZCAgKg0KKwkgKiBhcmUgbXVsdGlwbHkgYnkgZ2NvZGUwIHdoaWNoIGhhdmUgYmVlbiBtdWx0aXBseSBieSAyXmV4cF9nY29kZTAuICAgICAgICAqDQorCSAqIEFsc28gd2hlbiB3ZSBjb21wdXRlIGdfcGl0Y2gqZ19waXRjaCwgZ19jb2RlKmdfY29kZSBhbmQgZ19waXRjaCpnX2NvZGUgICoNCisJICogd2UgZGl2aWRlIGJ5IDJeMTUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiBDb25zaWRlcmluZyBhbGwgdGhlIHNjYWxpbmcgYWJvdmUgd2UgaGF2ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICBleHBfY29kZSA9IGV4cF9nY29kZTAtMTErMTUgPSBleHBfZ2NvZGUwKzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZ19waXRjaCpnX3BpdGNoICA9IC0xNC0xNCsxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICBnX3BpdGNoICAgICAgICAgID0gLTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIGdfY29kZSpnX2NvZGUgICAgPSAoMipleHBfY29kZSkrMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZ19jb2RlICAgICAgICAgICA9IGV4cF9jb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICBnX3BpdGNoKmdfY29kZSAgID0gLTE0ICsgZXhwX2NvZGUgKzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgZ19waXRjaCpnX3BpdGNoICogY29lZmZbMF0gIDtleHBfbWF4MCA9IGV4cF9jb2VmZlswXSAtIDEzICAgICAgICAgICAgICoNCisJICogICBnX3BpdGNoICAgICAgICAgKiBjb2VmZlsxXSAgO2V4cF9tYXgxID0gZXhwX2NvZWZmWzFdIC0gMTQgICAgICAgICAgICAgKg0KKwkgKiAgIGdfY29kZSpnX2NvZGUgICAqIGNvZWZmWzJdICA7ZXhwX21heDIgPSBleHBfY29lZmZbMl0gKzE1KygyKmV4cF9jb2RlKSAqDQorCSAqICAgZ19jb2RlICAgICAgICAgICogY29lZmZbM10gIDtleHBfbWF4MyA9IGV4cF9jb2VmZlszXSArIGV4cF9jb2RlICAgICAgICoNCisJICogICBnX3BpdGNoKmdfY29kZSAgKiBjb2VmZls0XSAgO2V4cF9tYXg0ID0gZXhwX2NvZWZmWzRdICsgMSArIGV4cF9jb2RlICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlleHBfY29kZSA9IChleHBfZ2NvZGUwICsgNCk7DQorCWV4cF9tYXhbMF0gPSAoZXhwX2NvZWZmWzBdIC0gMTMpOyAgICANCisJZXhwX21heFsxXSA9IChleHBfY29lZmZbMV0gLSAxNCk7ICAgIA0KKwlleHBfbWF4WzJdID0gKGV4cF9jb2VmZlsyXSArICgxNSArIChleHBfY29kZSA8PCAxKSkpOyAgDQorCWV4cF9tYXhbM10gPSAoZXhwX2NvZWZmWzNdICsgZXhwX2NvZGUpOyAgIA0KKwlleHBfbWF4WzRdID0gKGV4cF9jb2VmZls0XSArICgxICsgZXhwX2NvZGUpKTsgIA0KKw0KKwkvKiBGaW5kIG1heGltdW0gZXhwb25hbnQgKi8NCisNCisJZV9tYXggPSBleHBfbWF4WzBdOyAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMTsgaSA8IDU7IGkrKykNCisJew0KKwkJaWYoZXhwX21heFtpXSA+IGVfbWF4KQ0KKwkJew0KKwkJCWVfbWF4ID0gZXhwX21heFtpXTsgICAgICAgICAgICANCisJCX0NCisJfQ0KKw0KKwkvKiBhbGlnbiBjb2VmZltdIGFuZCBzYXZlIGluIHNwZWNpYWwgMzIgYml0IGRvdWJsZSBwcmVjaXNpb24gKi8NCisNCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykNCisJew0KKwkJaiA9IGFkZDEodm9fc3ViKGVfbWF4LCBleHBfbWF4W2ldKSwgMik7LyogLzQgdG8gYXZvaWQgb3ZlcmZsb3cgKi8NCisJCUxfdG1wID0gTF9kZXBvc2l0X2goY29lZmZbaV0pOw0KKwkJTF90bXAgPSBMX3NocihMX3RtcCwgaik7DQorCQlWT19MX0V4dHJhY3QoTF90bXAsICZjb2VmZltpXSwgJmNvZWZmX2xvW2ldKTsNCisJCWNvZWZmX2xvW2ldID0gKGNvZWZmX2xvW2ldID4+IDMpOyAgIC8qIGxvID4+IDMgKi8NCisJfQ0KKw0KKwkvKiBDb2RlYm9vayBzZWFyY2ggKi8NCisJZGlzdF9taW4gPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICAgDQorCXAgPSAmdF9xdWFfZ2FpblttaW5faW5kIDw8IDFdOyAgICAgIA0KKw0KKwlpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykNCisJew0KKwkJZ19waXRjaCA9ICpwKys7ICAgICAgICAgICAgICAgICAgICANCisJCWdfY29kZSA9ICpwKys7ICAgICAgICAgICAgICAgICAgICAgDQorDQorCQlnX2NvZGUgPSAoKGdfY29kZSAqIGdjb2RlMCkgKyAweDQwMDApPj4xNTsNCisJCWcyX3BpdGNoID0gKChnX3BpdGNoICogZ19waXRjaCkgKyAweDQwMDApPj4xNTsNCisJCWdfcGl0X2NvZCA9ICgoZ19jb2RlICogZ19waXRjaCkgKyAweDQwMDApPj4xNTsNCisJCUxfdG1wID0gKGdfY29kZSAqIGdfY29kZSk8PDE7DQorCQlWT19MX0V4dHJhY3QoTF90bXAsICZnMl9jb2RlLCAmZzJfY29kZV9sbyk7DQorDQorCQlMX3RtcCA9IChjb2VmZlsyXSAqIGcyX2NvZGVfbG8pPDwxOw0KKwkJTF90bXAgPSAgKExfdG1wID4+IDMpOw0KKwkJTF90bXAgKz0gKGNvZWZmX2xvWzBdICogZzJfcGl0Y2gpPDwxOw0KKwkJTF90bXAgKz0gKGNvZWZmX2xvWzFdICogZ19waXRjaCk8PDE7DQorCQlMX3RtcCArPSAoY29lZmZfbG9bMl0gKiBnMl9jb2RlKTw8MTsNCisJCUxfdG1wICs9IChjb2VmZl9sb1szXSAqIGdfY29kZSk8PDE7DQorCQlMX3RtcCArPSAoY29lZmZfbG9bNF0gKiBnX3BpdF9jb2QpPDwxOw0KKwkJTF90bXAgPSAgKExfdG1wID4+IDEyKTsNCisJCUxfdG1wICs9IChjb2VmZlswXSAqIGcyX3BpdGNoKTw8MTsNCisJCUxfdG1wICs9IChjb2VmZlsxXSAqIGdfcGl0Y2gpPDwxOw0KKwkJTF90bXAgKz0gKGNvZWZmWzJdICogZzJfY29kZSk8PDE7DQorCQlMX3RtcCArPSAoY29lZmZbM10gKiBnX2NvZGUpPDwxOw0KKwkJTF90bXAgKz0gKGNvZWZmWzRdICogZ19waXRfY29kKTw8MTsNCisNCisJCWlmKExfdG1wIDwgZGlzdF9taW4pDQorCQl7DQorCQkJZGlzdF9taW4gPSBMX3RtcDsgICAgICAgICAgICAgIA0KKwkJCWluZGV4ID0gaTsgICAgICAgICAgICAgICAgICAgICANCisJCX0NCisJfQ0KKw0KKwkvKiBSZWFkIHRoZSBxdWFudGl6ZWQgZ2FpbnMgKi8NCisJaW5kZXggPSBpbmRleCArIG1pbl9pbmQ7DQorCXAgPSAmdF9xdWFfZ2FpblsoaW5kZXggKyBpbmRleCldOyAgICANCisJKmdhaW5fcGl0ID0gKnArKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbGVjdGVkIHBpdGNoIGdhaW4gaW4gUTE0ICovDQorCWdfY29kZSA9ICpwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWxlY3RlZCBjb2RlIGdhaW4gaW4gUTExICAqLw0KKw0KKwlMX3RtcCA9IHZvX0xfbXVsdChnX2NvZGUsIGdjb2RlMCk7ICAgICAgICAgICAgIC8qIFExMSpRMCAtPiBRMTIgKi8NCisJTF90bXAgPSBMX3NobChMX3RtcCwgKGV4cF9nY29kZTAgKyA0KSk7ICAgLyogUTEyIC0+IFExNiAqLw0KKw0KKwkqZ2Fpbl9jb2QgPSBMX3RtcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGdhaW4gb2YgY29kZSBpbiBRMTYgKi8NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIHF1YV9lbmVyID0gMjAqbG9nMTAoZ19jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICA9IDYuMDIwNipsb2cyKGdfY29kZSkgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgICAgICAgPSA2LjAyMDYqKGxvZzIoZ19jb2RlUTExKSAtIDExKSAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJTF90bXAgPSBMX2RlcG9zaXRfbChnX2NvZGUpOw0KKwlMb2cyKExfdG1wLCAmZXhwLCAmZnJhYyk7DQorCWV4cCAtPSAxMTsNCisJTF90bXAgPSBNcHlfMzJfMTYoZXhwLCBmcmFjLCAyNDY2MCk7ICAgLyogeCA2LjAyMDYgaW4gUTEyICovDQorDQorCXF1YV9lbmVyID0gKFdvcmQxNikoTF90bXAgPj4gMyk7IC8qIHJlc3VsdCBpbiBRMTAgKi8NCisNCisJLyogdXBkYXRlIHRhYmxlIG9mIHBhc3QgcXVhbnRpemVkIGVuZXJnaWVzICovDQorDQorCXBhc3RfcXVhX2VuWzNdID0gcGFzdF9xdWFfZW5bMl07ICAgICAgIA0KKwlwYXN0X3F1YV9lblsyXSA9IHBhc3RfcXVhX2VuWzFdOyAgICAgICANCisJcGFzdF9xdWFfZW5bMV0gPSBwYXN0X3F1YV9lblswXTsgICAgICAgDQorCXBhc3RfcXVhX2VuWzBdID0gcXVhX2VuZXI7ICAgICAgICAgICAgIA0KKw0KKwlyZXR1cm4gKGluZGV4KTsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfcHVsc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhiYTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IHFfcHVsc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBDb2RpbmcgYW5kIGRlY29kaW5nIG9mIGFsZ2VicmFpYyBjb2RlYm9vayAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgInFfcHVsc2UuaCINCisNCisjZGVmaW5lIE5CX1BPUyAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zIGluIHRyYWNrLCBtYXNrIGZvciBzaWduIGJpdCAqLw0KKw0KK1dvcmQzMiBxdWFudF8xcF9OMSggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIE4rMSBiaXRzICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcG9zLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgICAgICAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG1hc2s7DQorCVdvcmQzMiBpbmRleDsNCisNCisJbWFzayA9ICgxIDw8IE4pIC0gMTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIFF1YW50aXphdGlvbiBvZiAxIHB1bHNlIHdpdGggTisxIGJpdHM6ICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJaW5kZXggPSBMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zICYgbWFzaykpOw0KKwlpZiAoKHBvcyAmIE5CX1BPUykgIT0gMCkNCisJew0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgTF9kZXBvc2l0X2woMSA8PCBOKSk7ICAgLyogaW5kZXggKz0gMSA8PCBOOyAqLw0KKwl9DQorCXJldHVybiAoaW5kZXgpOw0KK30NCisNCisNCitXb3JkMzIgcXVhbnRfMnBfMk4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMipOKSsxIGJpdHMgICAgICAgICAqLw0KKwkJV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovDQorCQlXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG1hc2ssIHRtcDsNCisJV29yZDMyIGluZGV4Ow0KKwltYXNrID0gKDEgPDwgTikgLSAxOyAgICAgICAgICAgICAgLyogbWFzayA9ICgoMTw8TiktMSk7ICovDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogUXVhbnRpemF0aW9uIG9mIDIgcHVsc2VzIHdpdGggMipOKzEgYml0czogICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlpZiAoKChwb3MyIF4gcG9zMSkgJiBOQl9QT1MpID09IDApDQorCXsNCisJCS8qIHNpZ24gb2YgMXN0IHB1bHNlID09IHNpZ24gb2YgMnRoIHB1bHNlICovDQorCQlpZihwb3MxIDw9IHBvczIpICAgICAgICAgIC8qICgocG9zMSAtIHBvczIpIDw9IDApICovDQorCQl7DQorCQkJLyogaW5kZXggPSAoKHBvczEgJiBtYXNrKSA8PCBOKSArIChwb3MyICYgbWFzayk7ICovDQorCQkJaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMiAmIG1hc2spKSkpOw0KKwkJfSBlbHNlDQorCQl7DQorCQkJLyogKChwb3MyICYgbWFzaykgPDwgTikgKyAocG9zMSAmIG1hc2spOyAqLw0KKwkJCWluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkpKTsNCisJCX0NCisJCWlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkNCisJCXsNCisJCQl0bXAgPSAoTiA8PCAxKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMUwgPDwgdG1wKSk7ICAgICAgIC8qIGluZGV4ICs9IDEgPDwgKDIqTik7ICovDQorCQl9DQorCX0gZWxzZQ0KKwl7DQorCQkvKiBzaWduIG9mIDFzdCBwdWxzZSAhPSBzaWduIG9mIDJ0aCBwdWxzZSAqLw0KKwkJaWYgKHZvX3N1YigoV29yZDE2KSAocG9zMSAmIG1hc2spLCAoV29yZDE2KSAocG9zMiAmIG1hc2spKSA8PSAwKQ0KKwkJew0KKwkJCS8qIGluZGV4ID0gKChwb3MyICYgbWFzaykgPDwgTikgKyAocG9zMSAmIG1hc2spOyAqLw0KKwkJCWluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkpKTsgDQorCQkJaWYgKChwb3MyICYgTkJfUE9TKSAhPSAwKQ0KKwkJCXsNCisJCQkJdG1wID0gKE4gPDwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLw0KKwkJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMUwgPDwgdG1wKSk7DQorCQkJfQ0KKwkJfSBlbHNlDQorCQl7DQorCQkJLyogaW5kZXggPSAoKHBvczEgJiBtYXNrKSA8PCBOKSArIChwb3MyICYgbWFzayk7CSAqLw0KKwkJCWluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MxICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkpKTsgDQorCQkJaWYgKChwb3MxICYgTkJfUE9TKSAhPSAwKQ0KKwkJCXsNCisJCQkJdG1wID0gKE4gPDwgMSk7DQorCQkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsICgxIDw8IHRtcCkpOyAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLw0KKwkJCX0NCisJCX0NCisJfQ0KKwlyZXR1cm4gKGluZGV4KTsNCit9DQorDQorDQorV29yZDMyIHF1YW50XzNwXzNOMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDMqTikrMSBiaXRzICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxICAgICAqLw0KKwkJV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovDQorCQlXb3JkMTYgcG9zMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMyAgICAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG5iX3BvczsNCisJV29yZDMyIGluZGV4Ow0KKw0KKwluYl9wb3MgPSgxIDw8KE4gLSAxKSk7ICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PChOLTEpKTsgKi8NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBRdWFudGl6YXRpb24gb2YgMyBwdWxzZXMgd2l0aCAzKk4rMSBiaXRzOiAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCWlmICgoKHBvczEgXiBwb3MyKSAmIG5iX3BvcykgPT0gMCkNCisJew0KKwkJaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMiwgc3ViKE4sIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMiwgKE4tMSkpOyAqLw0KKwkJLyogaW5kZXggKz0gKHBvczEgJiBuYl9wb3MpIDw8IE47ICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7ICANCisJCS8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczMsIE4pIDw8ICgyKk4pOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczMsIE4pPDwoTiA8PCAxKSkpOw0KKw0KKwl9IGVsc2UgaWYgKCgocG9zMSBeIHBvczMpICYgbmJfcG9zKSA9PSAwKQ0KKwl7DQorCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MzLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MzLCAoTi0xKSk7ICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7IA0KKwkJLyogaW5kZXggKz0gKHBvczEgJiBuYl9wb3MpIDw8IE47ICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMiwgTikgPDwgKE4gPDwgMSkpKTsNCisJCS8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczIsIE4pIDw8DQorCQkgKiAoMipOKTsgKi8NCisJfSBlbHNlDQorCXsNCisJCWluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczMsIChOIC0gMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTi0xKSk7ICovDQorCQkvKiBpbmRleCArPSAocG9zMiAmIG5iX3BvcykgPDwgTjsJCQkgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMiAmIG5iX3BvcykpIDw8IE4pKTsgIA0KKwkJLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zMSwgTikgPDwgKDIqTik7CSAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczEsIE4pIDw8IChOIDw8IDEpKSk7DQorCX0NCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KK1dvcmQzMiBxdWFudF80cF80TjEoICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICg0Kk4pKzEgYml0cyAgICAgICAgICovDQorCQlXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8NCisJCVdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLw0KKwkJV29yZDE2IHBvczMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDMgICAgICovDQorCQlXb3JkMTYgcG9zNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgNCAgICAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG5iX3BvczsNCisJV29yZDMyIGluZGV4Ow0KKw0KKwluYl9wb3MgPSAxIDw8IChOIC0gMSk7ICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PChOLTEpKTsgICovDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogUXVhbnRpemF0aW9uIG9mIDQgcHVsc2VzIHdpdGggNCpOKzEgYml0czogICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlpZiAoKChwb3MxIF4gcG9zMikgJiBuYl9wb3MpID09IDApDQorCXsNCisJCWluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIChOLTEpKTsgKi8NCisJCS8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOwkgKi8NCisJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsgIA0KKwkJLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8ICgyKk4pOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzJwXzJOMShwb3MzLCBwb3M0LCBOKSA8PCAoTiA8PCAxKSkpOw0KKwl9IGVsc2UgaWYgKCgocG9zMSBeIHBvczMpICYgbmJfcG9zKSA9PSAwKQ0KKwl7DQorCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MzLCAoTiAtIDEpKTsNCisJCS8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOyAgDQorCQkvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zNCwgTikgPDwgKDIqTik7ICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7DQorCX0gZWxzZQ0KKwl7DQorCQlpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsNCisJCS8qIGluZGV4ICs9IChwb3MyICYgbmJfcG9zKSA8PCBOOyAqLw0KKwkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MyICYgbmJfcG9zKSkgPDwgTikpOyAgDQorCQkvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zNCwgTikgPDwgKDIqTik7ICovDQorCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczEsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7DQorCX0NCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KK1dvcmQzMiBxdWFudF80cF80TiggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIDQqTiBiaXRzICAgICAgICAgICAgICovDQorCQlXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNCAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG5iX3BvcywgbWFzaywgbl8xLCB0bXA7DQorCVdvcmQxNiBwb3NBWzRdLCBwb3NCWzRdOw0KKwlXb3JkMzIgaSwgaiwgaywgaW5kZXg7DQorDQorCW5fMSA9IChXb3JkMTYpIChOIC0gMSk7ICAgICAgICAgICAgICAgIA0KKwluYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLw0KKwltYXNrID0gdm9fc3ViKCgxIDw8IE4pLCAxKTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLw0KKw0KKwlpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJaiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoayA9IDA7IGsgPCA0OyBrKyspDQorCXsNCisJCWlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQ0KKwkJew0KKwkJCXBvc0FbaSsrXSA9IHBvc1trXTsgICAgICAgICAgICANCisJCX0gZWxzZQ0KKwkJew0KKwkJCXBvc0JbaisrXSA9IHBvc1trXTsgICAgICAgICAgICANCisJCX0NCisJfQ0KKw0KKwlzd2l0Y2ggKGkpDQorCXsNCisJCWNhc2UgMDoNCisJCQl0bXAgPSB2b19zdWIoKE4gPDwgMiksIDMpOyAgICAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNCpOKS0zKTsgKi8NCisJCQlpbmRleCA9ICgxTCA8PCB0bXApOw0KKwkJCS8qIGluZGV4ICs9IHF1YW50XzRwXzROMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBwb3NCWzNdLCBuXzEpOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzRwXzROMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBwb3NCWzNdLCBuXzEpKTsNCisJCQlicmVhazsNCisJCWNhc2UgMToNCisJCQkvKiBpbmRleCA9IHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSkgPDwgKCgzKm5fMSkrMSk7ICovDQorCQkJdG1wID0gYWRkMSgoV29yZDE2KSgodm9fTF9tdWx0KDMsIG5fMSkgPj4gMSkpLCAxKTsNCisJCQlpbmRleCA9IExfc2hsKHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSksIHRtcCk7DQorCQkJLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSk7ICovDQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkpOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSAyOg0KKwkJCXRtcCA9ICgobl8xIDw8IDEpICsgMSk7ICAgICAgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSA8PCAoKDIqbl8xKSsxKTsgKi8NCisJCQlpbmRleCA9IExfc2hsKHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpLCB0bXApOw0KKwkJCS8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpKTsNCisJCQlicmVhazsNCisJCWNhc2UgMzoNCisJCQkvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8IE47ICovDQorCQkJaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgTik7DQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpOyAqLw0KKwkJCWJyZWFrOw0KKwkJY2FzZSA0Og0KKwkJCWluZGV4ID0gcXVhbnRfNHBfNE4xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIHBvc0FbM10sIG5fMSk7DQorCQkJYnJlYWs7DQorCQlkZWZhdWx0Og0KKwkJCWluZGV4ID0gMDsNCisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIGZ1bmN0aW9uIHF1YW50XzRwXzROXG4iKTsNCisJfQ0KKwl0bXAgPSAoKE4gPDwgMikgLSAyKTsgICAgICAgICAgICAgICAvKiBpbmRleCArPSAoaSAmIDMpIDw8ICgoNCpOKS0yKTsgKi8NCisJaW5kZXggPSB2b19MX2FkZChpbmRleCwgTF9zaGwoKExfZGVwb3NpdF9sKGkpICYgKDNMKSksIHRtcCkpOw0KKw0KKwlyZXR1cm4gKGluZGV4KTsNCit9DQorDQorDQorDQorV29yZDMyIHF1YW50XzVwXzVOKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gNSpOIGJpdHMgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi41ICAqLw0KKwkJV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovDQorew0KKwlXb3JkMTYgbmJfcG9zLCBuXzEsIHRtcDsNCisJV29yZDE2IHBvc0FbNV0sIHBvc0JbNV07DQorCVdvcmQzMiBpLCBqLCBrLCBpbmRleCwgdG1wMjsNCisNCisJbl8xID0gKFdvcmQxNikgKE4gLSAxKTsgICAgICAgICAgICAgICAgDQorCW5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovDQorDQorCWkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlqID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJZm9yIChrID0gMDsgayA8IDU7IGsrKykNCisJew0KKwkJaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApDQorCQl7DQorCQkJcG9zQVtpKytdID0gcG9zW2tdOyAgICAgICAgICAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJcG9zQltqKytdID0gcG9zW2tdOyAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCXN3aXRjaCAoaSkNCisJew0KKwkJY2FzZSAwOg0KKwkJCXRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiAoKDUqTiktMSkpICovDQorCQkJaW5kZXggPSBMX3NobCgxTCwgdG1wKTsgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLw0KKwkJCXRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyovDQorCQkJdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHRtcDIpOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NCWzRdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQls0XSwgTik7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDE6DQorCQkJdG1wID0gdm9fc3ViKChXb3JkMTYpKCh2b19MX211bHQoNSwgTikgPj4gMSkpLCAxKTsgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDUqTiktMSk7ICovDQorCQkJaW5kZXggPSBMX3NobCgxTCwgdG1wKTsNCisJCQl0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSA8PCgoMipOKSsxKTsgICovDQorCQkJdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHRtcDIpOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NBWzBdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQVswXSwgTik7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDI6DQorCQkJdG1wID0gdm9fc3ViKChXb3JkMTYpKCh2b19MX211bHQoNSwgTikgPj4gMSkpLCAxKTsgICAgICAgIC8qICgoNSpOKS0xKSkgKi8NCisJCQlpbmRleCA9IExfc2hsKDFMLCB0bXApOyAgICAgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDUqTiktMSk7ICovDQorCQkJdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLw0KKwkJCXRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCB0bXAyKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIE4pOyAqLw0KKwkJCWJyZWFrOw0KKwkJY2FzZSAzOg0KKwkJCXRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLw0KKwkJCWluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIHRtcCk7DQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBOKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgNDoNCisJCQl0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8NCisJCQlpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCB0bXApOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NCWzBdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQlswXSwgTik7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDU6DQorCQkJdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovDQorCQkJaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgdG1wKTsNCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQVs0XSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0FbNF0sIE4pOyAqLw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlpbmRleCA9IDA7DQorCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBmdW5jdGlvbiBxdWFudF81cF81TlxuIik7DQorCX0NCisNCisJcmV0dXJuIChpbmRleCk7DQorfQ0KKw0KKw0KK1dvcmQzMiBxdWFudF82cF82Tl8yKCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICg2Kk4pLTIgYml0cyAgICAgICAgICovDQorCQlXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNiAgKi8NCisJCVdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLw0KK3sNCisJV29yZDE2IG5iX3Bvcywgbl8xOw0KKwlXb3JkMTYgcG9zQVs2XSwgcG9zQls2XTsNCisJV29yZDMyIGksIGosIGssIGluZGV4Ow0KKw0KKwkvKiAhISAgTiBhbmQgbl8xIGFyZSBjb25zdGFudHMgLT4gaXQgZG9lc24ndCBuZWVkIHRvIGJlIG9wZXJhdGVkIGJ5IEJhc2ljIE9wZXJhdG9ycyAqLw0KKwluXzEgPSAoV29yZDE2KSAoTiAtIDEpOyAgICAgICAgICAgICAgICANCisJbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8NCisNCisJaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQ0KKwl7DQorCQlpZiAoKHBvc1trXSAmIG5iX3BvcykgPT0gMCkNCisJCXsNCisJCQlwb3NBW2krK10gPSBwb3Nba107ICAgICAgICAgICAgDQorCQl9IGVsc2UNCisJCXsNCisJCQlwb3NCW2orK10gPSBwb3Nba107ICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJc3dpdGNoIChpKQ0KKwl7DQorCQljYXNlIDA6DQorCQkJaW5kZXggPSAoMSA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE4pKTsgLyogaW5kZXggKz0gcXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQls1XSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgMToNCisJCQlpbmRleCA9ICgxTCA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE4pKTsgLyogaW5kZXggKz0gcXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQVswXSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgMjoNCisJCQlpbmRleCA9ICgxTCA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLw0KKwkJCS8qIGluZGV4ICs9IHF1YW50XzRwXzROKHBvc0IsIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovDQorCQkJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzRwXzROKHBvc0IsIG5fMSkgPDwgKFdvcmQxNikgKDIgKiBuXzEgKyAxKSkpOw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpKTsgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgMzoNCisJCQlpbmRleCA9IChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoV29yZDE2KSAoMyAqIG5fMSArIDEpKTsgICAgDQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgzKm5fMSkrMSk7ICovDQorCQkJaW5kZXggPXZvX0xfYWRkKGluZGV4LCBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSk7ICAgICANCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgNDoNCisJCQlpID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQkJaW5kZXggPSAocXVhbnRfNHBfNE4ocG9zQSwgbl8xKSA8PCAoV29yZDE2KSAoMiAqIG5fMSArIDEpKTsgIC8qIGluZGV4ID0gcXVhbnRfNHBfNE4ocG9zQSwgbl8xKSA8PCAoKDIqbl8xKSsxKTsgKi8NCisJCQlpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKSk7ICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSk7ICovDQorCQkJYnJlYWs7DQorCQljYXNlIDU6DQorCQkJaSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWluZGV4ID0gKHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTik7ICAgICAgIC8qIGluZGV4ID0gcXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWNhc2UgNjoNCisJCQlpID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJCWluZGV4ID0gKHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTik7ICAgICAgIC8qIGluZGV4ID0gcXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOOyAqLw0KKwkJCWluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0FbNV0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQVs1XSwgbl8xKTsgKi8NCisJCQlicmVhazsNCisJCWRlZmF1bHQ6DQorCQkJaW5kZXggPSAwOw0KKwkJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gZnVuY3Rpb24gcXVhbnRfNnBfNk5fMlxuIik7DQorCX0NCisJaW5kZXggPSB2b19MX2FkZChpbmRleCwgKChMX2RlcG9zaXRfbChpKSAmIDNMKSA8PCAoV29yZDE2KSAoNiAqIE4gLSA0KSkpOyAgIC8qIGluZGV4ICs9IChpICYgMykgPDwgKCg2Kk4pLTQpOyAqLw0KKw0KKwlyZXR1cm4gKGluZGV4KTsNCit9DQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Fpc2ZfbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGIwYTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICBGaWxlOiBxaXNmX25zLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBDb2RpbmcvRGVjb2Rpbmcgb2YgSVNGIHBhcmFtZXRlcnMgZm9yIGJhY2tncm91bmQgbm9pc2UuKg0KKyogICAgICAgICAgICAgICAgICAgIFRoZSBJU0YgdmVjdG9yIGlzIHF1YW50aXplZCB1c2luZyBWUSB3aXRoIHNwbGl0LWJ5LTUgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJhY2VscC5oIg0KKyNpbmNsdWRlICJxaXNmX25zLnRhYiIgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlYm9va3Mgb2YgSVNGcyAqLw0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogcm91dGluZTogICBRaXNmX25zKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgIH5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCit2b2lkIFFpc2ZfbnMoDQorCQlXb3JkMTYgKiBpc2YxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogSVNGIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBpc2ZfcSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogcXVhbnRpemVkIElTRiAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpbmRpY2UgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICovDQorCSAgICApDQorew0KKwlXb3JkMTYgaTsNCisJV29yZDMyIHRtcDsNCisNCisJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspDQorCXsNCisJCWlzZl9xW2ldID0gc3ViKGlzZjFbaV0sIG1lYW5faXNmX25vaXNlW2ldKTsgICAgIA0KKwl9DQorDQorCWluZGljZVswXSA9IFN1Yl9WUSgmaXNmX3FbMF0sIGRpY28xX2lzZl9ub2lzZSwgMiwgU0laRV9CS19OT0lTRTEsICZ0bXApOyAgICANCisJaW5kaWNlWzFdID0gU3ViX1ZRKCZpc2ZfcVsyXSwgZGljbzJfaXNmX25vaXNlLCAzLCBTSVpFX0JLX05PSVNFMiwgJnRtcCk7ICAgIA0KKwlpbmRpY2VbMl0gPSBTdWJfVlEoJmlzZl9xWzVdLCBkaWNvM19pc2Zfbm9pc2UsIDMsIFNJWkVfQktfTk9JU0UzLCAmdG1wKTsgICAgDQorCWluZGljZVszXSA9IFN1Yl9WUSgmaXNmX3FbOF0sIGRpY280X2lzZl9ub2lzZSwgNCwgU0laRV9CS19OT0lTRTQsICZ0bXApOyAgICANCisJaW5kaWNlWzRdID0gU3ViX1ZRKCZpc2ZfcVsxMl0sIGRpY281X2lzZl9ub2lzZSwgNCwgU0laRV9CS19OT0lTRTUsICZ0bXApOyAgIA0KKw0KKwkvKiBkZWNvZGluZyB0aGUgSVNGcyAqLw0KKw0KKwlEaXNmX25zKGluZGljZSwgaXNmX3EpOw0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICAgRGlzZl9ucygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICB+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogRGVjb2Rpbmcgb2YgSVNGIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogIEFyZ3VtZW50czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgaW5kaWNlW10gOiBpbmRpY2VzIG9mIHRoZSBzZWxlY3RlZCBjb2RlYm9vayBlbnRyaWVzICAgICAgICAgICAgKg0KKyogICAgaXNmW10gICAgOiBxdWFudGl6ZWQgSVNGcyAoaW4gZnJlcXVlbmN5IGRvbWFpbikgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIERpc2ZfbnMoDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX3EgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IElTRiBpbiB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAgKi8NCisJICAgICkNCit7DQorCVdvcmQxNiBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQ0KKwl7DQorCQlpc2ZfcVtpXSA9IGRpY28xX2lzZl9ub2lzZVtpbmRpY2VbMF0gKiAyICsgaV07ICANCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQ0KKwl7DQorCQlpc2ZfcVtpICsgMl0gPSBkaWNvMl9pc2Zfbm9pc2VbaW5kaWNlWzFdICogMyArIGldOyAgICAgIA0KKwl9DQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCXsNCisJCWlzZl9xW2kgKyA1XSA9IGRpY28zX2lzZl9ub2lzZVtpbmRpY2VbMl0gKiAzICsgaV07ICAgICAgDQorCX0NCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykNCisJew0KKwkJaXNmX3FbaSArIDhdID0gZGljbzRfaXNmX25vaXNlW2luZGljZVszXSAqIDQgKyBpXTsgICAgICANCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQ0KKwl7DQorCQlpc2ZfcVtpICsgMTJdID0gZGljbzVfaXNmX25vaXNlW2luZGljZVs0XSAqIDQgKyBpXTsgICAgIA0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwl7DQorCQlpc2ZfcVtpXSA9IGFkZChpc2ZfcVtpXSwgbWVhbl9pc2Zfbm9pc2VbaV0pOyAgIA0KKwl9DQorDQorCVJlb3JkZXJfaXNmKGlzZl9xLCBJU0ZfR0FQLCBPUkRFUik7DQorDQorCXJldHVybjsNCit9DQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xcGlzZl8ycy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xcGlzZl8ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZWRiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FwaXNmXzJzLmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBhcGlzZl8ycy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjogQ29kaW5nL0RlY29kZWluZyBvZiBJU0YgcGFyYW1ldGVycyB3aXRoIHByZWRpY2F0aW9uDQorKiAgICAgICBUaGUgSVNGIHZlY3RvciBpcyBxdWFudGl6ZWQgdXNpbmcgdHdvLXN0YWdlIFZRIHdpdGggc3BsaXQtYnktMiAqDQorKiAgICAgICBpbiAxc3Qgc3RhZ2UgYW5kIHNwbGl0LWJ5LTUob3IgMykgaW4gdGhlIHNlY29uZCBzdGFnZSAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAicXBpc2ZfMnMudGFiIiAgICAgICAgICAgICAgICAgICAgLyogQ29kZWJvb2tzIG9mIGlzZnMgKi8NCisNCisjZGVmaW5lIE1VICAgICAgICAgMTA5MjMgICAgICAgICAgICAgICAgICAgLyogUHJlZGljdGlvbiBmYWN0b3IgICAoMS4wLzMuMCkgaW4gUTE1ICovDQorI2RlZmluZSBOX1NVUlZfTUFYIDQgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgc3Vydml2b3JzIG1heCAqLw0KKyNkZWZpbmUgQUxQSEEgICAgICAyOTQ5MSAgICAgICAgICAgICAgICAgICAvKiAwLiA5IGluIFExNSAgICAgKi8NCisjZGVmaW5lIE9ORV9BTFBIQSAoMzI3NjgtQUxQSEEpICAgICAgICAgICAgLyogKDEuMCAtIEFMUEhBKSBpbiBRMTUgKi8NCisNCisvKiBwcml2YXRlIGZ1bmN0aW9ucyAqLw0KK3N0YXRpYyB2b2lkIFZRX3N0YWdlMSgNCisJCVdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgcmVzaWR1YWwgdmVjdG9yICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZGljbywgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHF1YW50aXphdGlvbiBjb2RlYm9vayAgICAgICAgICovDQorCQlXb3JkMTYgZGltLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogZGltZW50aW9uIG9mIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiBkaWNvX3NpemUsICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaXplIG9mIHF1YW50aXphdGlvbiBjb2RlYm9vayAqLw0KKwkJV29yZDE2ICogaW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGluZGljZXMgb2Ygc3Vydml2b3JzICAgICAgICAgICovDQorCQlXb3JkMTYgc3VydiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbnVtYmVyIG9mIHN1cnZpdm9yICAgICAgICAgICAgKi8NCisJCSk7DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogICBRcGlzZl8yc180NkIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogUXVhbnRpemF0aW9uIG9mIGlzZiBwYXJhbWV0ZXJzIHdpdGggcHJlZGljdGlvbi4gKDQ2IGJpdHMpICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBUaGUgaXNmIHZlY3RvciBpcyBxdWFudGl6ZWQgdXNpbmcgdHdvLXN0YWdlIFZRIHdpdGggc3BsaXQtYnktMiBpbiAgICAgICAqDQorKiAgMXN0IHN0YWdlIGFuZCBzcGxpdC1ieS01IGluIHRoZSBzZWNvbmQgc3RhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgUXBpc2ZfMnNfNDZiKA0KKwkJV29yZDE2ICogaXNmMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgUTE1IDogSVNGIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBpc2ZfcSwgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSBRMTUgOiBxdWFudGl6ZWQgSVNGICAgICAgICAgICAgICAgKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIHBhc3RfaXNmcSwgICAgICAgICAgICAgICAgICAgLyogKGlvKVExNSA6IHBhc3QgSVNGIHF1YW50aXplciAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICAgIDogcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbmJfc3VydiAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBudW1iZXIgb2Ygc3Vydml2b3IgKDEsIDIsIDMgb3IgNCkgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiB0bXBfaW5kWzVdOw0KKwlXb3JkMTYgc3VydjFbTl9TVVJWX01BWF07ICAgICAgICAgICAgICAvKiBpbmRpY2VzIG9mIHN1cnZpdm9ycyBmcm9tIDFzdCBzdGFnZSAqLw0KKwlXb3JkMzIgaSwgaywgdGVtcCwgbWluX2VyciwgZGlzdGFuY2U7DQorCVdvcmQxNiBpc2ZbT1JERVJdOw0KKwlXb3JkMTYgaXNmX3N0YWdlMltPUkRFUl07DQorDQorCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwl7DQorCQlpc2ZbaV0gPSB2b19zdWIoaXNmMVtpXSwgbWVhbl9pc2ZbaV0pOw0KKwkJaXNmW2ldID0gdm9fc3ViKGlzZltpXSwgdm9fbXVsdChNVSwgcGFzdF9pc2ZxW2ldKSk7IA0KKwl9DQorDQorCVZRX3N0YWdlMSgmaXNmWzBdLCBkaWNvMV9pc2YsIDksIFNJWkVfQksxLCBzdXJ2MSwgbmJfc3Vydik7DQorDQorCWRpc3RhbmNlID0gTUFYXzMyOyAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IG5iX3N1cnY7IGsrKykNCisJew0KKwkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykNCisJCXsNCisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZltpXSwgZGljbzFfaXNmW2kgKyBzdXJ2MVtrXSAqIDldKTsgDQorCQl9DQorCQl0bXBfaW5kWzBdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzBdLCBkaWNvMjFfaXNmLCAzLCBTSVpFX0JLMjEsICZtaW5fZXJyKTsgDQorCQl0ZW1wID0gbWluX2VycjsNCisJCXRtcF9pbmRbMV0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbM10sIGRpY28yMl9pc2YsIDMsIFNJWkVfQksyMiwgJm1pbl9lcnIpOyANCisJCXRlbXAgPSB2b19MX2FkZCh0ZW1wLCBtaW5fZXJyKTsNCisJCXRtcF9pbmRbMl0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbNl0sIGRpY28yM19pc2YsIDMsIFNJWkVfQksyMywgJm1pbl9lcnIpOyAgDQorCQl0ZW1wID0gdm9fTF9hZGQodGVtcCwgbWluX2Vycik7DQorDQorCQlpZih0ZW1wIDwgZGlzdGFuY2UpDQorCQl7DQorCQkJZGlzdGFuY2UgPSB0ZW1wOyAgICAgICAgICAgICAgIA0KKwkJCWluZGljZVswXSA9IHN1cnYxW2tdOyAgICAgICAgICANCisJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQ0KKwkJCXsNCisJCQkJaW5kaWNlW2kgKyAyXSA9IHRtcF9pbmRbaV07DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorDQorCVZRX3N0YWdlMSgmaXNmWzldLCBkaWNvMl9pc2YsIDcsIFNJWkVfQksyLCBzdXJ2MSwgbmJfc3Vydik7DQorDQorCWRpc3RhbmNlID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IG5iX3N1cnY7IGsrKykNCisJew0KKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykNCisJCXsNCisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZls5ICsgaV0sIGRpY28yX2lzZltpICsgc3VydjFba10gKiA3XSk7ICAgICAgIA0KKwkJfQ0KKw0KKwkJdG1wX2luZFswXSA9IFN1Yl9WUSgmaXNmX3N0YWdlMlswXSwgZGljbzI0X2lzZiwgMywgU0laRV9CSzI0LCAmbWluX2Vycik7DQorCQl0ZW1wID0gbWluX2VycjsgDQorCQl0bXBfaW5kWzFdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzNdLCBkaWNvMjVfaXNmLCA0LCBTSVpFX0JLMjUsICZtaW5fZXJyKTsNCisJCXRlbXAgPSB2b19MX2FkZCh0ZW1wLCBtaW5fZXJyKTsNCisNCisJCWlmKHRlbXAgPCBkaXN0YW5jZSkNCisJCXsNCisJCQlkaXN0YW5jZSA9IHRlbXA7ICAgICAgICAgICAgICAgDQorCQkJaW5kaWNlWzFdID0gc3VydjFba107ICAgICAgICAgIA0KKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspDQorCQkJew0KKwkJCQlpbmRpY2VbaSArIDVdID0gdG1wX2luZFtpXTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJRHBpc2ZfMnNfNDZiKGluZGljZSwgaXNmX3EsIHBhc3RfaXNmcSwgaXNmX3EsIGlzZl9xLCAwLCAwKTsNCisNCisJcmV0dXJuOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqIEZ1bmN0aW9uOiAgIFFwaXNmXzJzXzM2QigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIERlc2NyaXB0aW9uOiBRdWFudGl6YXRpb24gb2YgaXNmIHBhcmFtZXRlcnMgd2l0aCBwcmVkaWN0aW9uLiAoMzYgYml0cykgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIFRoZSBpc2YgdmVjdG9yIGlzIHF1YW50aXplZCB1c2luZyB0d28tc3RhZ2UgVlEgd2l0aCBzcGxpdC1ieS0yIGluICAgICAgICAgICoNCisqICAxc3Qgc3RhZ2UgYW5kIHNwbGl0LWJ5LTMgaW4gdGhlIHNlY29uZCBzdGFnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQordm9pZCBRcGlzZl8yc18zNmIoDQorCQlXb3JkMTYgKiBpc2YxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBJU0YgaW4gdGhlIGZyZXF1ZW5jeSBkb21haW4gKDAuLjAuNSkgKi8NCisJCVdvcmQxNiAqIGlzZl9xLCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSA6IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogcGFzdF9pc2ZxLCAgICAgICAgICAgICAgICAgICAvKiAoaW8pUTE1IDogcGFzdCBJU0YgcXVhbnRpemVyICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBxdWFudGl6YXRpb24gaW5kaWNlcyAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBuYl9zdXJ2ICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG51bWJlciBvZiBzdXJ2aXZvciAoMSwgMiwgMyBvciA0KSAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IGksIGssIHRtcF9pbmRbNV07DQorCVdvcmQxNiBzdXJ2MVtOX1NVUlZfTUFYXTsgICAgICAgICAgICAgIC8qIGluZGljZXMgb2Ygc3Vydml2b3JzIGZyb20gMXN0IHN0YWdlICovDQorCVdvcmQzMiB0ZW1wLCBtaW5fZXJyLCBkaXN0YW5jZTsNCisJV29yZDE2IGlzZltPUkRFUl07DQorCVdvcmQxNiBpc2Zfc3RhZ2UyW09SREVSXTsNCisNCisJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspDQorCXsNCisJCWlzZltpXSA9IHZvX3N1Yihpc2YxW2ldLCBtZWFuX2lzZltpXSk7DQorCQlpc2ZbaV0gPSB2b19zdWIoaXNmW2ldLCB2b19tdWx0KE1VLCBwYXN0X2lzZnFbaV0pKTsNCisJfQ0KKw0KKwlWUV9zdGFnZTEoJmlzZlswXSwgZGljbzFfaXNmLCA5LCBTSVpFX0JLMSwgc3VydjEsIG5iX3N1cnYpOw0KKw0KKwlkaXN0YW5jZSA9IE1BWF8zMjsgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IG5iX3N1cnY7IGsrKykNCisJew0KKwkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykNCisJCXsNCisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZltpXSwgZGljbzFfaXNmW2kgKyBzdXJ2MVtrXSAqIDldKTsgDQorCQl9DQorDQorCQl0bXBfaW5kWzBdID0gU3ViX1ZRKCZpc2Zfc3RhZ2UyWzBdLCBkaWNvMjFfaXNmXzM2YiwgNSwgU0laRV9CSzIxXzM2YiwgJm1pbl9lcnIpOyAgICAgICAgDQorCQl0ZW1wID0gbWluX2VycjsgICAgICAgICAgICAgICAgICANCisJCXRtcF9pbmRbMV0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbNV0sIGRpY28yMl9pc2ZfMzZiLCA0LCBTSVpFX0JLMjJfMzZiLCAmbWluX2Vycik7ICAgICAgICANCisJCXRlbXAgPSB2b19MX2FkZCh0ZW1wLCBtaW5fZXJyKTsNCisNCisJCWlmKHRlbXAgPCBkaXN0YW5jZSkNCisJCXsNCisJCQlkaXN0YW5jZSA9IHRlbXA7ICAgICAgICAgICAgICAgDQorCQkJaW5kaWNlWzBdID0gc3VydjFba107ICAgICAgICAgIA0KKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspDQorCQkJew0KKwkJCQlpbmRpY2VbaSArIDJdID0gdG1wX2luZFtpXTsNCisJCQl9DQorCQl9DQorCX0NCisNCisJVlFfc3RhZ2UxKCZpc2ZbOV0sIGRpY28yX2lzZiwgNywgU0laRV9CSzIsIHN1cnYxLCBuYl9zdXJ2KTsNCisJZGlzdGFuY2UgPSBNQVhfMzI7ICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChrID0gMDsgayA8IG5iX3N1cnY7IGsrKykNCisJew0KKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykNCisJCXsNCisJCQlpc2Zfc3RhZ2UyW2ldID0gdm9fc3ViKGlzZls5ICsgaV0sIGRpY28yX2lzZltpICsgc3VydjFba10gKiA3XSk7ICAgICANCisJCX0NCisNCisJCXRtcF9pbmRbMF0gPSBTdWJfVlEoJmlzZl9zdGFnZTJbMF0sIGRpY28yM19pc2ZfMzZiLCA3LCBTSVpFX0JLMjNfMzZiLCAmbWluX2Vycik7ICANCisJCXRlbXAgPSBtaW5fZXJyOyAgICAgICAgICAgICAgICAgIA0KKw0KKwkJaWYodGVtcCA8IGRpc3RhbmNlKQ0KKwkJew0KKwkJCWRpc3RhbmNlID0gdGVtcDsgICAgICAgICAgICAgICANCisJCQlpbmRpY2VbMV0gPSBzdXJ2MVtrXTsgICAgICAgICAgDQorCQkJaW5kaWNlWzRdID0gdG1wX2luZFswXTsgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCURwaXNmXzJzXzM2YihpbmRpY2UsIGlzZl9xLCBwYXN0X2lzZnEsIGlzZl9xLCBpc2ZfcSwgMCwgMCk7DQorDQorCXJldHVybjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246IERwaXNmXzJzXzQ2YigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogRGVjb2Rpbmcgb2YgSVNGIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQordm9pZCBEcGlzZl8yc180NmIoDQorCQlXb3JkMTYgKiBpbmRpY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0OiAgcXVhbnRpemF0aW9uIGluZGljZXMgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZfcSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogcXVhbnRpemVkIElTRiBpbiBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgKiBwYXN0X2lzZnEsICAgICAgICAgICAgICAgICAgIC8qIGkvMCAgIDogcGFzdCBJU0YgcXVhbnRpemVyICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmb2xkLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHBhc3QgcXVhbnRpemVkIElTRiAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZl9idWYsICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBpc2YgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGJmaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IEJhZCBmcmFtZSBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBlbmNfZGVjDQorCQkpDQorew0KKwlXb3JkMTYgcmVmX2lzZltNXSwgdG1wOw0KKwlXb3JkMzIgaSwgaiwgTF90bXA7DQorDQorCWlmIChiZmkgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdvb2QgZnJhbWUgKi8NCisJew0KKwkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykNCisJCXsNCisJCQlpc2ZfcVtpXSA9IGRpY28xX2lzZltpbmRpY2VbMF0gKiA5ICsgaV07ICAgIA0KKwkJfQ0KKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykNCisJCXsNCisJCQlpc2ZfcVtpICsgOV0gPSBkaWNvMl9pc2ZbaW5kaWNlWzFdICogNyArIGldOyAgICAgICANCisJCX0NCisNCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCQl7DQorCQkJaXNmX3FbaV0gPSBhZGQxKGlzZl9xW2ldLCBkaWNvMjFfaXNmW2luZGljZVsyXSAqIDMgKyBpXSk7ICAgDQorCQkJaXNmX3FbaSArIDNdID0gYWRkMShpc2ZfcVtpICsgM10sIGRpY28yMl9pc2ZbaW5kaWNlWzNdICogMyArIGldKTsgIA0KKwkJCWlzZl9xW2kgKyA2XSA9IGFkZDEoaXNmX3FbaSArIDZdLCBkaWNvMjNfaXNmW2luZGljZVs0XSAqIDMgKyBpXSk7IA0KKwkJCWlzZl9xW2kgKyA5XSA9IGFkZDEoaXNmX3FbaSArIDldLCBkaWNvMjRfaXNmW2luZGljZVs1XSAqIDMgKyBpXSk7IA0KKwkJfQ0KKw0KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykNCisJCXsNCisJCQlpc2ZfcVtpICsgMTJdID0gYWRkMShpc2ZfcVtpICsgMTJdLCBkaWNvMjVfaXNmW2luZGljZVs2XSAqIDQgKyBpXSk7ICANCisJCX0NCisNCisJCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwkJew0KKwkJCXRtcCA9IGlzZl9xW2ldOyAgICAgICAgICAgICAgIA0KKwkJCWlzZl9xW2ldID0gYWRkMSh0bXAsIG1lYW5faXNmW2ldKTsgIA0KKwkJCWlzZl9xW2ldID0gYWRkMShpc2ZfcVtpXSwgdm9fbXVsdChNVSwgcGFzdF9pc2ZxW2ldKSk7DQorCQkJcGFzdF9pc2ZxW2ldID0gdG1wOyAgDQorCQl9DQorDQorCQlpZiAoZW5jX2RlYykNCisJCXsNCisJCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQ0KKwkJCXsNCisJCQkJZm9yIChqID0gKExfTUVBTkJVRiAtIDEpOyBqID4gMDsgai0tKQ0KKwkJCQl7DQorCQkJCQlpc2ZfYnVmW2ogKiBNICsgaV0gPSBpc2ZfYnVmWyhqIC0gMSkgKiBNICsgaV07IA0KKwkJCQl9DQorCQkJCWlzZl9idWZbaV0gPSBpc2ZfcVtpXTsgDQorCQkJfQ0KKwkJfQ0KKwl9IGVsc2UNCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFkIGZyYW1lICovDQorCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQ0KKwkJew0KKwkJCUxfdG1wID0gbWVhbl9pc2ZbaV0gPDwgMTQ7DQorCQkJZm9yIChqID0gMDsgaiA8IExfTUVBTkJVRjsgaisrKQ0KKwkJCXsNCisJCQkJTF90bXAgKz0gKGlzZl9idWZbaiAqIE0gKyBpXSA8PCAxNCk7DQorCQkJfQ0KKwkJCXJlZl9pc2ZbaV0gPSB2b19yb3VuZChMX3RtcCk7DQorCQl9DQorDQorCQkvKiB1c2UgdGhlIHBhc3QgSVNGcyBzbGlnaHRseSBzaGlmdGVkIHRvd2FyZHMgdGhlaXIgbWVhbiAqLw0KKwkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspDQorCQl7DQorCQkJaXNmX3FbaV0gPSBhZGQxKHZvX211bHQoQUxQSEEsIGlzZm9sZFtpXSksIHZvX211bHQoT05FX0FMUEhBLCByZWZfaXNmW2ldKSk7IA0KKwkJfQ0KKw0KKwkJLyogZXN0aW1hdGUgcGFzdCBxdWFudGl6ZWQgcmVzaWR1YWwgdG8gYmUgdXNlZCBpbiBuZXh0IGZyYW1lICovDQorCQlmb3IgKGkgPSAwOyBpIDwgT1JERVI7IGkrKykNCisJCXsNCisJCQl0bXAgPSBhZGQxKHJlZl9pc2ZbaV0sIHZvX211bHQocGFzdF9pc2ZxW2ldLCBNVSkpOyAgICAgIC8qIHByZWRpY3RlZCBJU0YgKi8NCisJCQlwYXN0X2lzZnFbaV0gPSB2b19zdWIoaXNmX3FbaV0sIHRtcCk7IA0KKwkJCXBhc3RfaXNmcVtpXSA9IChwYXN0X2lzZnFbaV0gPj4gMSk7ICAgICAgICAvKiBwYXN0X2lzZnFbaV0gKj0gMC41ICovDQorCQl9DQorCX0NCisNCisJUmVvcmRlcl9pc2YoaXNmX3EsIElTRl9HQVAsIE9SREVSKTsNCisJcmV0dXJuOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogICBEaXNmXzJzXzM2YigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIERlc2NyaXB0aW9uOiBEZWNvZGluZyBvZiBJU0YgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgRHBpc2ZfMnNfMzZiKA0KKwkJV29yZDE2ICogaW5kaWNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dDogIHF1YW50aXphdGlvbiBpbmRpY2VzICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogaXNmX3EsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IHF1YW50aXplZCBJU0YgaW4gZnJlcXVlbmN5IGRvbWFpbiAoMC4uMC41KSAqLw0KKwkJV29yZDE2ICogcGFzdF9pc2ZxLCAgICAgICAgICAgICAgICAgICAvKiBpLzAgICA6IHBhc3QgSVNGIHF1YW50aXplciAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiAqIGlzZm9sZCwgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBwYXN0IHF1YW50aXplZCBJU0YgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBpc2ZfYnVmLCAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogaXNmIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBiZmksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBCYWQgZnJhbWUgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZW5jX2RlYw0KKwkJKQ0KK3sNCisJV29yZDE2IHJlZl9pc2ZbTV0sIHRtcDsNCisJV29yZDMyIGksIGosIExfdG1wOw0KKw0KKwlpZiAoYmZpID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHb29kIGZyYW1lICovDQorCXsNCisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspDQorCQl7DQorCQkJaXNmX3FbaV0gPSBkaWNvMV9pc2ZbaW5kaWNlWzBdICogOSArIGldOyAgICANCisJCX0NCisJCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspDQorCQl7DQorCQkJaXNmX3FbaSArIDldID0gZGljbzJfaXNmW2luZGljZVsxXSAqIDcgKyBpXTsgICAgICAgDQorCQl9DQorDQorCQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2ldID0gYWRkMShpc2ZfcVtpXSwgZGljbzIxX2lzZl8zNmJbaW5kaWNlWzJdICogNSArIGldKTsgICAgICAgDQorCQl9DQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2kgKyA1XSA9IGFkZDEoaXNmX3FbaSArIDVdLCBkaWNvMjJfaXNmXzM2YltpbmRpY2VbM10gKiA0ICsgaV0pOyAgICAgICAgDQorCQl9DQorCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQ0KKwkJew0KKwkJCWlzZl9xW2kgKyA5XSA9IGFkZDEoaXNmX3FbaSArIDldLCBkaWNvMjNfaXNmXzM2YltpbmRpY2VbNF0gKiA3ICsgaV0pOyAgICAgICANCisJCX0NCisNCisJCWZvciAoaSA9IDA7IGkgPCBPUkRFUjsgaSsrKQ0KKwkJew0KKwkJCXRtcCA9IGlzZl9xW2ldOw0KKwkJCWlzZl9xW2ldID0gYWRkMSh0bXAsIG1lYW5faXNmW2ldKTsgICANCisJCQlpc2ZfcVtpXSA9IGFkZDEoaXNmX3FbaV0sIHZvX211bHQoTVUsIHBhc3RfaXNmcVtpXSkpOyAgIA0KKwkJCXBhc3RfaXNmcVtpXSA9IHRtcDsgICAgICAgICAgIA0KKwkJfQ0KKw0KKw0KKwkJaWYgKGVuY19kZWMpDQorCQl7DQorCQkJZm9yIChpID0gMDsgaSA8IE07IGkrKykNCisJCQl7DQorCQkJCWZvciAoaiA9IChMX01FQU5CVUYgLSAxKTsgaiA+IDA7IGotLSkNCisJCQkJew0KKwkJCQkJaXNmX2J1ZltqICogTSArIGldID0gaXNmX2J1ZlsoaiAtIDEpICogTSArIGldOyAgICAgIA0KKwkJCQl9DQorCQkJCWlzZl9idWZbaV0gPSBpc2ZfcVtpXTsgICAgDQorCQkJfQ0KKwkJfQ0KKwl9IGVsc2UNCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFkIGZyYW1lICovDQorCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQ0KKwkJew0KKwkJCUxfdG1wID0gKG1lYW5faXNmW2ldIDw8IDE0KTsNCisJCQlmb3IgKGogPSAwOyBqIDwgTF9NRUFOQlVGOyBqKyspDQorCQkJew0KKwkJCQlMX3RtcCArPSAoaXNmX2J1ZltqICogTSArIGldIDw8IDE0KTsNCisJCQl9DQorCQkJcmVmX2lzZltpXSA9IHZvX3JvdW5kKExfdG1wKTsgICAgDQorCQl9DQorDQorCQkvKiB1c2UgdGhlIHBhc3QgSVNGcyBzbGlnaHRseSBzaGlmdGVkIHRvd2FyZHMgdGhlaXIgbWVhbiAqLw0KKwkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspDQorCQl7DQorCQkJaXNmX3FbaV0gPSBhZGQxKHZvX211bHQoQUxQSEEsIGlzZm9sZFtpXSksIHZvX211bHQoT05FX0FMUEhBLCByZWZfaXNmW2ldKSk7ICAgICAgICANCisJCX0NCisNCisJCS8qIGVzdGltYXRlIHBhc3QgcXVhbnRpemVkIHJlc2lkdWFsIHRvIGJlIHVzZWQgaW4gbmV4dCBmcmFtZSAqLw0KKwkJZm9yIChpID0gMDsgaSA8IE9SREVSOyBpKyspDQorCQl7DQorCQkJdG1wID0gYWRkMShyZWZfaXNmW2ldLCB2b19tdWx0KHBhc3RfaXNmcVtpXSwgTVUpKTsgICAgICAvKiBwcmVkaWN0ZWQgSVNGICovDQorCQkJcGFzdF9pc2ZxW2ldID0gdm9fc3ViKGlzZl9xW2ldLCB0bXApOyAgDQorCQkJcGFzdF9pc2ZxW2ldID0gcGFzdF9pc2ZxW2ldID4+IDE7ICAgICAgICAgLyogcGFzdF9pc2ZxW2ldICo9IDAuNSAqLw0KKwkJfQ0KKwl9DQorDQorCVJlb3JkZXJfaXNmKGlzZl9xLCBJU0ZfR0FQLCBPUkRFUik7DQorDQorCXJldHVybjsNCit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogRnVuY3Rpb246ICBSZW9yZGVyX2lzZigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogVG8gbWFrZSBzdXJlIHRoYXQgdGhlICBpc2ZzIGFyZSBwcm9wZXJseSBvcmRlciBhbmQgdG8gICAgICAgKg0KKyogICAgICAgICAgICAgIGtlZXAgYSBjZXJ0YWluIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSBpc2ZzLiAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorKiAgICBBcmd1bWVudCAgICAgICAgIGRlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgaW4vb3V0ICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICBpc2ZbXSAgICAgICAgICAgdmVjdG9yIG9mIGlzZnMgICAgICAgICAgICAgICAgICAgIGkvbyAgICAgICAgICAgICAgICAqDQorKiAgICAgbWluX2Rpc3QgICAgICAgIG1pbmltdW0gcmVxdWlyZWQgZGlzdGFuY2UgICAgICAgICBpICAgICAgICAgICAgICAgICAgKg0KKyogICAgIG4gICAgICAgICAgICAgICBMUEMgb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgaSAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgUmVvcmRlcl9pc2YoDQorCQlXb3JkMTYgKiBpc2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pIFExNTogSVNGIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluICgwLi4wLjUpICovDQorCQlXb3JkMTYgbWluX2Rpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgIDogbWluaW11bSBkaXN0YW5jZSB0byBrZWVwICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgIDogbnVtYmVyIG9mIElTRiAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQkpDQorew0KKwlXb3JkMzIgaTsgDQorCVdvcmQxNiBpc2ZfbWluOw0KKw0KKwlpc2ZfbWluID0gbWluX2Rpc3Q7ICAgICAgICAgICAgICAgICAgICANCisJZm9yIChpID0gMDsgaSA8IG4gLSAxOyBpKyspDQorCXsNCisJCWlmKGlzZltpXSA8IGlzZl9taW4pDQorCQl7DQorCQkJaXNmW2ldID0gaXNmX21pbjsgICAgICAgICAgICAgIA0KKwkJfQ0KKwkJaXNmX21pbiA9IChpc2ZbaV0gKyBtaW5fZGlzdCk7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCitXb3JkMTYgU3ViX1ZRKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0OiByZXR1cm4gcXVhbnRpemF0aW9uIGluZGV4ICAgICAqLw0KKwkJV29yZDE2ICogeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IElTRiByZXNpZHVhbCB2ZWN0b3IgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBkaWNvLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogcXVhbnRpemF0aW9uIGNvZGVib29rICAgICAgICAgKi8NCisJCVdvcmQxNiBkaW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBkaW1lbnRpb24gb2YgdmVjdG9yICAgICAgICAgICAqLw0KKwkJV29yZDE2IGRpY29fc2l6ZSwgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHNpemUgb2YgcXVhbnRpemF0aW9uIGNvZGVib29rICovDQorCQlXb3JkMzIgKiBkaXN0YW5jZSAgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogZXJyb3Igb2YgcXVhbnRpemF0aW9uICAgICAgICAgKi8NCisJICAgICApDQorew0KKwlXb3JkMTYgdGVtcCwgKnBfZGljbzsNCisJV29yZDMyIGksIGosIGluZGV4Ow0KKwlXb3JkMzIgZGlzdF9taW4sIGRpc3Q7DQorDQorCWRpc3RfbWluID0gTUFYXzMyOyAgICAgICAgICAgICAgICAgICAgIA0KKwlwX2RpY28gPSBkaWNvOyAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBkaWNvX3NpemU7IGkrKykNCisJew0KKwkJZGlzdCA9IDA7ICANCisNCisJCWZvciAoaiA9IDA7IGogPCBkaW07IGorKykNCisJCXsNCisJCQl0ZW1wID0geFtqXSAtICgqcF9kaWNvKyspOw0KKwkJCWRpc3QgKz0gKHRlbXAgKiB0ZW1wKTw8MTsNCisJCX0NCisNCisJCWlmKGRpc3QgPCBkaXN0X21pbikNCisJCXsNCisJCQlkaXN0X21pbiA9IGRpc3Q7ICAgICAgICAgICAgICAgDQorCQkJaW5kZXggPSBpOyAgICAgICAgICAgICAgICAgICAgIA0KKwkJfQ0KKwl9DQorDQorCSpkaXN0YW5jZSA9IGRpc3RfbWluOyAgICAgICAgICAgICAgICAgIA0KKw0KKwkvKiBSZWFkaW5nIHRoZSBzZWxlY3RlZCB2ZWN0b3IgKi8NCisJcF9kaWNvID0gJmRpY29baW5kZXggKiBkaW1dOyAgICAgICAgICAgDQorCWZvciAoaiA9IDA7IGogPCBkaW07IGorKykNCisJew0KKwkJeFtqXSA9ICpwX2RpY28rKzsgICAgICAgICAgICAgICAgICANCisJfQ0KKw0KKwlyZXR1cm4gaW5kZXg7DQorfQ0KKw0KKw0KK3N0YXRpYyB2b2lkIFZRX3N0YWdlMSgNCisJCVdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBJU0YgcmVzaWR1YWwgdmVjdG9yICAgICAgICAgICAqLw0KKwkJV29yZDE2ICogZGljbywgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6IHF1YW50aXphdGlvbiBjb2RlYm9vayAgICAgICAgICovDQorCQlXb3JkMTYgZGltLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogZGltZW50aW9uIG9mIHZlY3RvciAgICAgICAgICAgKi8NCisJCVdvcmQxNiBkaWNvX3NpemUsICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiBzaXplIG9mIHF1YW50aXphdGlvbiBjb2RlYm9vayAqLw0KKwkJV29yZDE2ICogaW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6IGluZGljZXMgb2Ygc3Vydml2b3JzICAgICAgICAgICovDQorCQlXb3JkMTYgc3VydiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogbnVtYmVyIG9mIHN1cnZpdm9yICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiB0ZW1wLCAqcF9kaWNvOw0KKwlXb3JkMzIgaSwgaiwgaywgbDsNCisJV29yZDMyIGRpc3RfbWluW05fU1VSVl9NQVhdLCBkaXN0Ow0KKw0KKwlkaXN0X21pblswXSA9IE1BWF8zMjsNCisJZGlzdF9taW5bMV0gPSBNQVhfMzI7DQorCWRpc3RfbWluWzJdID0gTUFYXzMyOw0KKwlkaXN0X21pblszXSA9IE1BWF8zMjsNCisJaW5kZXhbMF0gPSAwOw0KKwlpbmRleFsxXSA9IDE7DQorCWluZGV4WzJdID0gMjsNCisJaW5kZXhbM10gPSAzOw0KKw0KKwlwX2RpY28gPSBkaWNvOyAgICAgICAgICAgICAgICAgICAgICAgICANCisNCisJZm9yIChpID0gMDsgaSA8IGRpY29fc2l6ZTsgaSsrKQ0KKwl7DQorCQlkaXN0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwkJZm9yIChqID0gMDsgaiA8IGRpbTsgaisrKQ0KKwkJew0KKwkJCXRlbXAgPSB4W2pdIC0gICgqcF9kaWNvKyspOw0KKwkJCWRpc3QgKz0gKHRlbXAgKiB0ZW1wKTw8MTsNCisJCX0NCisNCisJCWZvciAoayA9IDA7IGsgPCBzdXJ2OyBrKyspDQorCQl7DQorCQkJaWYoZGlzdCA8IGRpc3RfbWluW2tdKQ0KKwkJCXsNCisJCQkJZm9yIChsID0gc3VydiAtIDE7IGwgPiBrOyBsLS0pDQorCQkJCXsNCisJCQkJCWRpc3RfbWluW2xdID0gZGlzdF9taW5bbCAtIDFdOyAgICAgIA0KKwkJCQkJaW5kZXhbbF0gPSBpbmRleFtsIC0gMV07ICAgIA0KKwkJCQl9DQorCQkJCWRpc3RfbWluW2tdID0gZGlzdDsgICAgICAgIA0KKwkJCQlpbmRleFtrXSA9IGk7ICAgICAgICAgICAgICANCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXJldHVybjsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yYW5kb20uYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhYThiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmFuZG9tLmMKQEAgLTAsMCArMSwzMyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IHJhbmRvbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOiBTaWduZWQgMTYgYml0cyByYW5kb20gZ2VuZXJhdG9yICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCitXb3JkMTYgUmFuZG9tKFdvcmQxNiAqIHNlZWQpDQorew0KKwkvKiBzdGF0aWMgV29yZDE2IHNlZWQgPSAyMTg0NTsgKi8NCisJKnNlZWQgPSAoV29yZDE2KShMX2FkZCgoTF9tdWx0KCpzZWVkLCAzMTgyMSkgPj4gMSksIDEzODQ5TCkpOw0KKwlyZXR1cm4gKCpzZWVkKTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9yZXNpZHUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmVzaWR1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyOTg4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmVzaWR1LmMKQEAgLTAsMCArMSw2NyBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBGaWxlOiByZXNpZHUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICBEZXNjcmlwdGlvbjogQ29tcHV0ZSB0aGUgTFBDIHJlc2lkdWFsIGJ5IGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgIHRoZSBpbnB1dCBzcGVlY2ggdGhyb3VnaCBBKHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2luY2x1ZGUgInR5cGVkZWYuaCINCisjaW5jbHVkZSAiYmFzaWNfb3AuaCINCisNCit2b2lkIFJlc2lkdSgNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IHByZWRpY3Rpb24gY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNwZWVjaCAodmFsdWVzIHhbLW0uLi0xXSBhcmUgbmVlZGVkICAgICAgICAgKi8NCisJCVdvcmQxNiB5W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHgyICA6IHJlc2lkdWFsIHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiBpLCpwMSwgKnAyOw0KKwlXb3JkMzIgczsNCisJZm9yIChpID0gMDsgaSA8IGxnOyBpKyspDQorCXsNCisJCXAxID0gYTsNCisJCXAyID0gJnhbaV07DQorCQlzICA9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDErKyksICgqcDItLSkpOw0KKwkJcyArPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlzICs9IHZvX211bHQzMigoKnAxKyspLCAoKnAyLS0pKTsNCisJCXMgKz0gdm9fbXVsdDMyKCgqcDEpLCAoKnAyKSk7DQorDQorCQlzID0gTF9zaGwyKHMsIDUpOyANCisJCXlbaV0gPSBleHRyYWN0X2goTF9hZGQocywgMHg4MDAwKSk7DQorCX0NCisNCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3NjYWxlLmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3NjYWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0MDEyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc2NhbGUuYwpAQCAtMCwwICsxLDU3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogc2NhbGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246IFNjYWxlIHNpZ25hbCB0byBnZXQgbWF4aW11bSBvZiBkeW5hbWljICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKw0KK3ZvaWQgU2NhbGVfc2lnKA0KKwkJV29yZDE2IHhbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaS9vKSA6IHNpZ25hbCB0byBzY2FsZSAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogc2l6ZSBvZiB4W10gICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBleHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBleHBvbmVudDogeCA9IHJvdW5kKHggPDwgZXhwKSAqLw0KKwkgICAgICApDQorew0KKwlXb3JkMzIgaTsNCisJV29yZDMyIExfdG1wOw0KKwlpZihleHAgPiAwKQ0KKwl7DQorCQlmb3IgKGkgPSBsZyAtIDEgOyBpID49IDA7IGktLSkNCisJCXsNCisJCQlMX3RtcCA9IExfc2hsMih4W2ldLCAxNiArIGV4cCk7ICANCisJCQl4W2ldID0gZXh0cmFjdF9oKExfYWRkKExfdG1wLCAweDgwMDApKTsgICAgICAgICAgICANCisJCX0NCisJfQ0KKwllbHNlDQorCXsNCisJCWV4cCA9IC1leHA7DQorCQlmb3IgKGkgPSBsZyAtIDE7IGkgPj0gMDsgaS0tKQ0KKwkJew0KKwkJCUxfdG1wID0geFtpXSA8PCAxNjsNCisJCQlMX3RtcCA+Pj0gZXhwOyANCisJCQl4W2ldID0gKExfdG1wICsgMHg4MDAwKT4+MTY7ICAgICAgICAgICAgDQorCQl9DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N0cmVhbS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzA4MjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zdHJlYW0uYwpAQCAtMCwwICsxLDU4IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyogICAgICAgRmlsZTogc3RyZWFtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgRGVzY3JpcHRpb246IFZPTUUgQVBJIEJ1ZmZlciBPcGVyYXRvciBJbXBsZW1lbnQgQ29kZSAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAic3RyZWFtLmgiDQorDQordm9pZCB2b0FXQl9Jbml0RnJhbWVCdWZmZXIoRnJhbWVTdHJlYW0gKnN0cmVhbSkNCit7DQorCXN0cmVhbS0+c2V0X3B0ciA9IE5VTEw7DQorCXN0cmVhbS0+ZnJhbWVfcHRyX2JrID0gc3RyZWFtLT5mcmFtZV9wdHI7DQorCXN0cmVhbS0+c2V0X2xlbiA9IDA7DQorCXN0cmVhbS0+ZnJhbWVidWZmZXJfbGVuID0gMDsNCisJc3RyZWFtLT5mcmFtZV9zdG9yZWxlbiA9IDA7CQ0KK30NCisNCit2b2lkIHZvQVdCX1VwZGF0ZUZyYW1lQnVmZmVyKA0KKwkJRnJhbWVTdHJlYW0gKnN0cmVhbSwgDQorCQlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUA0KKwkJKQ0KK3sNCisJaW50ICBsZW47DQorCWxlbiAgPSBNSU4oRnJhbWVfTWF4c2l6ZSAtIHN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4sIHN0cmVhbS0+c2V0X2xlbik7DQorCXBNZW1PUC0+Q29weShWT19JTkRFWF9FTkNfQU1SV0IsIHN0cmVhbS0+ZnJhbWVfcHRyX2JrICsgc3RyZWFtLT5mcmFtZV9zdG9yZWxlbiAsIHN0cmVhbS0+c2V0X3B0ciwgbGVuKTsNCisJc3RyZWFtLT5zZXRfbGVuIC09IGxlbjsNCisJc3RyZWFtLT5zZXRfcHRyICs9IGxlbjsNCisJc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW4gPSBzdHJlYW0tPmZyYW1lX3N0b3JlbGVuICsgbGVuOw0KKwlzdHJlYW0tPmZyYW1lX3B0ciA9IHN0cmVhbS0+ZnJhbWVfcHRyX2JrOw0KKwlzdHJlYW0tPnVzZWRfbGVuICs9IGxlbjsNCit9DQorDQordm9pZCB2b0FXQl9GbHVzaEZyYW1lQnVmZmVyKEZyYW1lU3RyZWFtICpzdHJlYW0pDQorew0KKwlzdHJlYW0tPnNldF9wdHIgPSBOVUxMOw0KKwlzdHJlYW0tPmZyYW1lX3B0cl9iayA9IHN0cmVhbS0+ZnJhbWVfcHRyOw0KKwlzdHJlYW0tPnNldF9sZW4gPSAwOw0KKwlzdHJlYW0tPmZyYW1lYnVmZmVyX2xlbiA9IDA7DQorCXN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4gPSAwOwkNCit9DQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zeW5fZmlsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWZiOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3N5bl9maWx0LmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiBzeW5fZmlsdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjogRG8gdGhlIHN5bnRoZXNpcyBmaWx0ZXJpbmcgMS9BKHopICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorI2luY2x1ZGUgIm1hdGhfb3AuaCINCisjaW5jbHVkZSAiY25zdC5oIg0KKw0KK3ZvaWQgU3luX2ZpbHQoDQorCQlXb3JkMTYgYVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICovDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBpbnB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgeVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgbWVtW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyaW5nLiAgICovDQorCQlXb3JkMTYgdXBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiAwPW5vIHVwZGF0ZSwgMT11cGRhdGUgb2YgbWVtb3J5LiAgICAgICAgICovDQorCSAgICAgKQ0KK3sNCisJV29yZDMyIGksIGEwOw0KKwlXb3JkMTYgeV9idWZbTF9TVUJGUjE2ayArIE0xNmtdOw0KKwlXb3JkMzIgTF90bXA7DQorCVdvcmQxNiAqeXksICpwMSwgKnAyOw0KKwl5eSA9ICZ5X2J1ZlswXTsgICAgICAgICAgICAgICAgICAgICAgICANCisJLyogY29weSBpbml0aWFsIGZpbHRlciBzdGF0ZXMgaW50byBzeW50aGVzaXMgYnVmZmVyICovDQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KKwl7DQorCQkqeXkrKyA9IG1lbVtpXTsgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWEwID0gKGFbMF0gPj4gMSk7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgLyAyICovDQorCS8qIERvIHRoZSBmaWx0ZXJpbmcuICovDQorCWZvciAoaSA9IDA7IGkgPCBsZzsgaSsrKQ0KKwl7DQorCQlwMSA9ICZhWzFdOw0KKwkJcDIgPSAmeXlbaS0xXTsNCisJCUxfdG1wICA9IHZvX211bHQzMihhMCwgeFtpXSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSsrKSwgKCpwMi0tKSk7DQorCQlMX3RtcCAtPSB2b19tdWx0MzIoKCpwMSksICgqcDIpKTsNCisNCisJCUxfdG1wID0gTF9zaGwyKExfdG1wLCA0KTsNCisJCXlbaV0gPSB5eVtpXSA9IGV4dHJhY3RfaChMX2FkZChMX3RtcCwgMHg4MDAwKSk7ICANCisJfQ0KKwkvKiBVcGRhdGUgbWVtb3J5IGlmIHJlcXVpcmVkICovDQorCWlmICh1cGRhdGUpDQorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykNCisJCXsNCisJCQltZW1baV0gPSB5eVtsZyAtIDE2ICsgaV07DQorCQl9DQorCXJldHVybjsNCit9DQorDQorDQordm9pZCBTeW5fZmlsdF8zMigNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAqLw0KKwkJV29yZDE2IG0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICovDQorCQlXb3JkMTYgZXhjW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRbmV3OiBleGNpdGF0aW9uIChleGNbaV0gPj4gUW5ldykgICAgKi8NCisJCVdvcmQxNiBRbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IGV4YyBzY2FsaW5nID0gMChtaW4pIHRvIDgobWF4KSAqLw0KKwkJV29yZDE2IHNpZ19oaVtdLCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgLzE2IDogc3ludGhlc2lzIGhpZ2ggICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgc2lnX2xvW10sICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAvMTYgOiBzeW50aGVzaXMgbG93ICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGksYTA7DQorCVdvcmQzMiBMX3RtcCwgTF90bXAxOw0KKwlXb3JkMTYgKnAxLCAqcDIsICpwMzsNCisJYTAgPSBhWzBdID4+ICg0ICsgUW5ldyk7ICAgICAgICAgIC8qIGlucHV0IC8gMTYgYW5kID4+UW5ldyAqLw0KKwkvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgbGc7IGkrKykNCisJew0KKwkJTF90bXAgID0gMDsgDQorCQlMX3RtcDEgPSAwOw0KKwkJcDEgPSBhOw0KKwkJcDIgPSAmc2lnX2xvW2kgLSAxXTsNCisJCXAzID0gJnNpZ19oaVtpIC0gMV07DQorDQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorCQlMX3RtcCAgLT0gdm9fbXVsdDMyKCgqcDItLSksICgqcDEpKTsNCisJCUxfdG1wMSAtPSB2b19tdWx0MzIoKCpwMy0tKSwgKCpwMSsrKSk7DQorDQorCQlMX3RtcCA9IExfdG1wID4+IDExOyAgICAgIA0KKwkJTF90bXAgKz0gdm9fTF9tdWx0KGV4Y1tpXSwgYTApOw0KKw0KKwkJLyogc2lnX2hpID0gYml0MTYgdG8gYml0MzEgb2Ygc3ludGhlc2lzICovDQorCQlMX3RtcCA9IExfdG1wIC0gKExfdG1wMTw8MSk7DQorDQorCQlMX3RtcCA9IExfdG1wID4+IDM7ICAgICAgICAgICAvKiBhaSBpbiBRMTIgKi8NCisJCXNpZ19oaVtpXSA9IGV4dHJhY3RfaChMX3RtcCk7ICAgICAgDQorDQorCQkvKiBzaWdfbG8gPSBiaXQ0IHRvIGJpdDE1IG9mIHN5bnRoZXNpcyAqLw0KKwkJTF90bXAgPj49IDQ7ICAgICAgICAgICAvKiA0IDogc2lnX2xvW2ldID4+IDQgKi8NCisJCXNpZ19sb1tpXSA9IChXb3JkMTYpKChMX3RtcCAtIChzaWdfaGlbaV0gPDwgMTMpKSk7ICANCisJfQ0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXBkdF90YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U1NjUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91cGR0X3Rhci5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiB1cGR0X3Rhci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjogVXBkYXRlIHRoZSB0YXJnZXQgdmVjdG9yIGZvciBjb2RlYm9vayBzZWFyY2ggICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQordm9pZCBVcGR0X3RhcigNCisJCVdvcmQxNiAqIHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICA6IG9sZCB0YXJnZXQgKGZvciBwaXRjaCBzZWFyY2gpICAgICAqLw0KKwkJV29yZDE2ICogeDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTAgIDogbmV3IHRhcmdldCAoZm9yIGNvZGVib29rIHNlYXJjaCkgICovDQorCQlXb3JkMTYgKiB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMCAgOiBmaWx0ZXJlZCBhZGFwdGl2ZSBjb2RlYm9vayB2ZWN0b3IgKi8NCisJCVdvcmQxNiBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNCA6IGFkYXB0aXZlIGNvZGVib29rIGdhaW4gICAgICAgICAgICAqLw0KKwkJV29yZDE2IEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc3ViZnJhbWUgc2l6ZSAgICAgICAgICAgICAgICAgICAgICovDQorCSAgICAgKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQzMiBMX3RtcDsNCisNCisJZm9yIChpID0gMDsgaSA8IEw7IGkrKykNCisJew0KKwkJTF90bXAgPSB4W2ldIDw8IDE1Ow0KKwkJTF90bXAgLT0gKHlbaV0gKiBnYWluKTw8MTsNCisJCXgyW2ldID0gZXh0cmFjdF9oKExfc2hsMihMX3RtcCwgMSkpOyANCisJfQ0KKw0KKwlyZXR1cm47DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXRpbC5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxNDFkZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdXRpbC5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgICBGaWxlOiB1dGlsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICBEZXNjcmlwdGlvbjogUmVzZXQgYW5kIENvcHkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogIFNldF96ZXJvKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiBEZXNjcmlwdGlvbjogU2V0IHZlY3RvciB4W10gdG8gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgU2V0X3plcm8oDQorCQlXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgICA6IHZlY3RvciB0byBjbGVhciAgICAgKi8NCisJCVdvcmQxNiBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgIDogbGVuZ3RoIG9mIHZlY3RvciAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBudW0gPSAoV29yZDMyKUw7DQorCWRvew0KKwkJKngrKyA9IDA7DQorCX13aGlsZSgtLW51bSAhPTApOw0KK30NCisNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiBGdW5jdGlvbjogQ29weSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIERlc2NyaXB0aW9uOiBDb3B5IHZlY3RvciB4W10gdG8geVtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgQ29weSgNCisJCVdvcmQxNiB4W10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBpbnB1dCB2ZWN0b3IgICAqLw0KKwkJV29yZDE2IHlbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgICA6IG91dHB1dCB2ZWN0b3IgICovDQorCQlXb3JkMTYgTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgIDogdmVjdG9yIGxlbmd0aCAgKi8NCisJICkNCit7DQorCVdvcmQzMgl0ZW1wMSx0ZW1wMixudW07DQorCWlmKEwmMSkNCisJew0KKwkJdGVtcDEgPSAqeCsrOw0KKwkJKnkrKyA9IHRlbXAxOw0KKwl9DQorCW51bSA9IChXb3JkMzIpKEw+PjEpOw0KKwl0ZW1wMSA9ICp4Kys7DQorCXRlbXAyID0gKngrKzsNCisJZG97DQorCQkqeSsrID0gdGVtcDE7DQorCQkqeSsrID0gdGVtcDI7DQorCQl0ZW1wMSA9ICp4Kys7DQorCQl0ZW1wMiA9ICp4Kys7DQorCX13aGlsZSgtLW51bSE9MCk7DQorfQ0KKw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkOTlhNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCkBAIC0wLDAgKzEsMTk0MSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgRmlsZTogdm9BTVJXQkVuYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgRGVzY3JpcHRpb246IFBlcmZvcm1zIHRoZSBtYWluIGVuY29kZXIgcm91dGluZSAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgIEZpeGVkLXBvaW50IEMgc2ltdWxhdGlvbiBvZiBBTVIgV0IgQUNFTFAgY29kaW5nICAgICoNCisqCQkgICAgYWxnb3JpdGhtIHdpdGggMjAgbXNzcGVlY2ggZnJhbWVzIGZvciAgICAgICAgICAgICAgKg0KKyoJCSAgICB3aWRlYmFuZCBzcGVlY2ggc2lnbmFscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRpby5oPg0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJvcGVyXzMyYi5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgImNuc3QuaCINCisjaW5jbHVkZSAiYWNlbHAuaCINCisjaW5jbHVkZSAiY29kX21haW4uaCINCisjaW5jbHVkZSAiYml0cy5oIg0KKyNpbmNsdWRlICJtYWluLmgiDQorI2luY2x1ZGUgInZvQU1SV0IuaCINCisjaW5jbHVkZSAibWVtX2FsaWduLmgiDQorI2luY2x1ZGUgImNtbk1lbW9yeS5oIg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KKy8qIExQQyBpbnRlcnBvbGF0aW9uIGNvZWYgezAuNDUsIDAuOCwgMC45NiwgMS4wfTsgaW4gUTE1ICovDQorc3RhdGljIFdvcmQxNiBpbnRlcnBvbF9mcmFjW05CX1NVQkZSXSA9IHsxNDc0NiwgMjYyMTQsIDMxNDU3LCAzMjc2N307DQorDQorLyogaXNwIHRhYmxlcyBmb3IgaW5pdGlhbGl6YXRpb24gKi8NCitzdGF0aWMgV29yZDE2IGlzcF9pbml0W01dID0NCit7DQorCTMyMTM4LCAzMDI3NCwgMjcyNDYsIDIzMTcwLCAxODIwNSwgMTI1NDAsIDYzOTMsIDAsDQorCS02MzkzLCAtMTI1NDAsIC0xODIwNSwgLTIzMTcwLCAtMjcyNDYsIC0zMDI3NCwgLTMyMTM4LCAxNDc1DQorfTsNCisNCitzdGF0aWMgV29yZDE2IGlzZl9pbml0W01dID0NCit7DQorCTEwMjQsIDIwNDgsIDMwNzIsIDQwOTYsIDUxMjAsIDYxNDQsIDcxNjgsIDgxOTIsDQorCTkyMTYsIDEwMjQwLCAxMTI2NCwgMTIyODgsIDEzMzEyLCAxNDMzNiwgMTUzNjAsIDM4NDANCit9Ow0KKw0KKy8qIEhpZ2ggQmFuZCBlbmNvZGluZyAqLw0KK3N0YXRpYyBjb25zdCBXb3JkMTYgSFBfZ2FpblsxNl0gPQ0KK3sNCisJMzYyNCwgNDY3MywgNTU5NywgNjQ3OSwgNzQyNSwgODM3OCwgOTMyNCwgMTAyNjQsDQorCTExMjEwLCAxMjIwNiwgMTMzOTEsIDE0ODQ0LCAxNjc3MCwgMTk2NTUsIDI0Mjg5LCAzMjcyOA0KK307DQorDQorLyogUHJpdmF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiAqLw0KK3N0YXRpYyBXb3JkMTYgc3ludGhlc2lzKA0KKwkJCVdvcmQxNiBBcVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQSh6KSAgOiBxdWFudGl6ZWQgQXogICAgICAgICAgICAgICAqLw0KKwkJCVdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBleGNpdGF0aW9uIGF0IDEya0h6ICAgICAgICAqLw0KKwkJCVdvcmQxNiBRX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBzY2FsaW5nIHBlcmZvcm1lZCBvbiBleGMgICAqLw0KKwkJCVdvcmQxNiBzeW50aDE2a1tdLCAgICAgICAgICAgICAgICAgICAgLyogKG8pICAgOiAxNmtIeiBzeW50aGVzaXMgc2lnbmFsICAgICAqLw0KKwkJCUNvZGVyX1N0YXRlICogc3QgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgICAgICAgICAqLw0KKwkJCSk7DQorDQorLyogQ29kZWMgc29tZSBwYXJhbWV0ZXJzIGluaXRpYWxpemF0aW9uICovDQordm9pZCBSZXNldF9lbmNvZGVyKHZvaWQgKnN0LCBXb3JkMTYgcmVzZXRfYWxsKQ0KK3sNCisJV29yZDE2IGk7DQorCUNvZGVyX1N0YXRlICpjb2Rfc3RhdGU7DQorCWNvZF9zdGF0ZSA9IChDb2Rlcl9TdGF0ZSAqKSBzdDsNCisJU2V0X3plcm8oY29kX3N0YXRlLT5vbGRfZXhjLCBQSVRfTUFYICsgTF9JTlRFUlBPTCk7DQorCVNldF96ZXJvKGNvZF9zdGF0ZS0+bWVtX3N5biwgTSk7DQorCVNldF96ZXJvKGNvZF9zdGF0ZS0+cGFzdF9pc2ZxLCBNKTsNCisJY29kX3N0YXRlLT5tZW1fdzAgPSAwOyAgICAgICAgICAgICAgICAgDQorCWNvZF9zdGF0ZS0+dGlsdF9jb2RlID0gMDsgICAgICAgICAgICAgIA0KKwljb2Rfc3RhdGUtPmZpcnN0X2ZyYW1lID0gMTsgICAgICAgICAgICANCisJSW5pdF9ncF9jbGlwKGNvZF9zdGF0ZS0+Z3BfY2xpcCk7DQorCWNvZF9zdGF0ZS0+TF9nY190aHJlcyA9IDA7ICAgICAgICAgICAgIA0KKwlpZiAocmVzZXRfYWxsICE9IDApDQorCXsNCisJCS8qIFN0YXRpYyB2ZWN0b3JzIHRvIHplcm8gKi8NCisJCVNldF96ZXJvKGNvZF9zdGF0ZS0+b2xkX3NwZWVjaCwgTF9UT1RBTCAtIExfRlJBTUUpOw0KKwkJU2V0X3plcm8oY29kX3N0YXRlLT5vbGRfd3NwLCAoUElUX01BWCAvIE9QTF9ERUNJTSkpOw0KKwkJU2V0X3plcm8oY29kX3N0YXRlLT5tZW1fZGVjaW0yLCAzKTsNCisJCS8qIHJvdXRpbmVzIGluaXRpYWxpemF0aW9uICovDQorCQlJbml0X0RlY2ltXzEyazgoY29kX3N0YXRlLT5tZW1fZGVjaW0pOw0KKwkJSW5pdF9IUDUwXzEyazgoY29kX3N0YXRlLT5tZW1fc2lnX2luKTsNCisJCUluaXRfTGV2aW5zb24oY29kX3N0YXRlLT5tZW1fbGV2aW5zb24pOw0KKwkJSW5pdF9RX2dhaW4yKGNvZF9zdGF0ZS0+cXVhX2dhaW4pOw0KKwkJSW5pdF9IcF93c3AoY29kX3N0YXRlLT5ocF93c3BfbWVtKTsNCisJCS8qIGlzcCBpbml0aWFsaXphdGlvbiAqLw0KKwkJQ29weShpc3BfaW5pdCwgY29kX3N0YXRlLT5pc3BvbGQsIE0pOw0KKwkJQ29weShpc3BfaW5pdCwgY29kX3N0YXRlLT5pc3BvbGRfcSwgTSk7DQorCQkvKiB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiAqLw0KKwkJY29kX3N0YXRlLT5tZW1fcHJlZW1waCA9IDA7ICAgICAgICANCisJCWNvZF9zdGF0ZS0+bWVtX3dzcCA9IDA7ICAgICAgICAgICAgDQorCQljb2Rfc3RhdGUtPlFfb2xkID0gMTU7ICAgICAgICAgICAgIA0KKwkJY29kX3N0YXRlLT5RX21heFswXSA9IDE1OyAgICAgICAgICANCisJCWNvZF9zdGF0ZS0+UV9tYXhbMV0gPSAxNTsgICAgICAgICAgDQorCQljb2Rfc3RhdGUtPm9sZF93c3BfbWF4ID0gMDsgICAgICAgIA0KKwkJY29kX3N0YXRlLT5vbGRfd3NwX3NoaWZ0ID0gMDsgICAgICANCisJCS8qIHBpdGNoIG9sIGluaXRpYWxpemF0aW9uICovDQorCQljb2Rfc3RhdGUtPm9sZF9UMF9tZWQgPSA0MDsgICAgICAgIA0KKwkJY29kX3N0YXRlLT5vbF9nYWluID0gMDsgICAgICAgICAgICANCisJCWNvZF9zdGF0ZS0+YWRhX3cgPSAwOyAgICAgICAgICAgICAgDQorCQljb2Rfc3RhdGUtPm9sX3dnaHRfZmxnID0gMDsgICAgICAgIA0KKwkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykNCisJCXsNCisJCQljb2Rfc3RhdGUtPm9sZF9vbF9sYWdbaV0gPSA0MDsgDQorCQl9DQorCQlTZXRfemVybyhjb2Rfc3RhdGUtPm9sZF9ocF93c3AsIChMX0ZSQU1FIC8gMikgLyBPUExfREVDSU0gKyAoUElUX01BWCAvIE9QTF9ERUNJTSkpOw0KKwkJU2V0X3plcm8oY29kX3N0YXRlLT5tZW1fc3luX2hmLCBNKTsNCisJCVNldF96ZXJvKGNvZF9zdGF0ZS0+bWVtX3N5bl9oaSwgTSk7DQorCQlTZXRfemVybyhjb2Rfc3RhdGUtPm1lbV9zeW5fbG8sIE0pOw0KKwkJSW5pdF9IUDUwXzEyazgoY29kX3N0YXRlLT5tZW1fc2lnX291dCk7DQorCQlJbml0X0ZpbHRfNmtfN2soY29kX3N0YXRlLT5tZW1faGYpOw0KKwkJSW5pdF9IUDQwMF8xMms4KGNvZF9zdGF0ZS0+bWVtX2hwNDAwKTsNCisJCUNvcHkoaXNmX2luaXQsIGNvZF9zdGF0ZS0+aXNmb2xkLCBNKTsNCisJCWNvZF9zdGF0ZS0+bWVtX2RlZW1waCA9IDA7ICAgICAgICAgDQorCQljb2Rfc3RhdGUtPnNlZWQyID0gMjE4NDU7ICAgICAgICAgIA0KKwkJSW5pdF9GaWx0XzZrXzdrKGNvZF9zdGF0ZS0+bWVtX2hmMik7DQorCQljb2Rfc3RhdGUtPmdhaW5fYWxwaGEgPSAzMjc2NzsgICAgIA0KKwkJY29kX3N0YXRlLT52YWRfaGlzdCA9IDA7DQorCQl3Yl92YWRfcmVzZXQoY29kX3N0YXRlLT52YWRTdCk7DQorCQlkdHhfZW5jX3Jlc2V0KGNvZF9zdGF0ZS0+ZHR4X2VuY1N0LCBpc2ZfaW5pdCk7DQorCX0NCisJcmV0dXJuOw0KK30NCisNCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKyogICBGdW50aW9uICBjb2RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgfn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgIC0+TWFpbiBjb2RlciByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KK3ZvaWQgY29kZXIoDQorCQlXb3JkMTYgKiBtb2RlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IDogIHVzZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBzcGVlY2gxNmtbXSwgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgOiAgMzIwIG5ldyBzcGVlY2ggc2FtcGxlcyAoYXQgMTYga0h6KSAgICAqLw0KKwkJV29yZDE2IHBybXNbXSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQ6ICBvdXRwdXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBzZXJfc2l6ZSwgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dDogIGJpdCByYXRlIG9mIHRoZSB1c2VkIG1vZGUgICAgICAgICAgICAgKi8NCisJCXZvaWQgKnNwZV9zdGF0ZSwgICAgICAgICAgICAgICAgICAgICAgLyogaS9vICAgOiAgU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGFsbG93X2R0eCAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCA6ICBEVFggT04vT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCSAgKQ0KK3sNCisJLyogQ29kZXIgc3RhdGVzICovDQorCUNvZGVyX1N0YXRlICpzdDsNCisJLyogU3BlZWNoIHZlY3RvciAqLw0KKwlXb3JkMTYgb2xkX3NwZWVjaFtMX1RPVEFMXTsNCisJV29yZDE2ICpuZXdfc3BlZWNoLCAqc3BlZWNoLCAqcF93aW5kb3c7DQorDQorCS8qIFdlaWdodGVkIHNwZWVjaCB2ZWN0b3IgKi8NCisJV29yZDE2IG9sZF93c3BbTF9GUkFNRSArIChQSVRfTUFYIC8gT1BMX0RFQ0lNKV07DQorCVdvcmQxNiAqd3NwOw0KKw0KKwkvKiBFeGNpdGF0aW9uIHZlY3RvciAqLw0KKwlXb3JkMTYgb2xkX2V4Y1soTF9GUkFNRSArIDEpICsgUElUX01BWCArIExfSU5URVJQT0xdOw0KKwlXb3JkMTYgKmV4YzsNCisNCisJLyogTFBDIGNvZWZmaWNpZW50cyAqLw0KKwlXb3JkMTYgcl9oW00gKyAxXSwgcl9sW00gKyAxXTsgICAgICAgICAvKiBBdXRvY29ycmVsYXRpb25zIG9mIHdpbmRvd2VkIHNwZWVjaCAgKi8NCisJV29yZDE2IHJjW01dOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVmbGVjdGlvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICovDQorCVdvcmQxNiBBcFtNICsgMV07ICAgICAgICAgICAgICAgICAgICAgIC8qIEEoeikgd2l0aCBzcGVjdHJhbCBleHBhbnNpb24gICAgICAgICAqLw0KKwlXb3JkMTYgaXNwbmV3W01dOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbW1pdHRhbmNlIHNwZWN0cmFsIHBhaXJzIGF0IDRuZCBzZnIgKi8NCisJV29yZDE2IGlzcG5ld19xW01dOyAgICAgICAgICAgICAgICAgICAgLyogcXVhbnRpemVkIElTUHMgYXQgNG5kIHN1YmZyYW1lICAgICAgICovDQorCVdvcmQxNiBpc2ZbTV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElTRiAoZnJlcXVlbmN5IGRvbWFpbikgYXQgNG5kIHNmciAgICAqLw0KKwlXb3JkMTYgKnBfQSwgKnBfQXE7ICAgICAgICAgICAgICAgICAgICAvKiBwdHIgdG8gQSh6KSBmb3IgdGhlIDQgc3ViZnJhbWVzICAgICAgKi8NCisJV29yZDE2IEFbTkJfU1VCRlIgKiAoTSArIDEpXTsgICAgICAgICAgLyogQSh6KSB1bnF1YW50aXplZCBmb3IgdGhlIDQgc3ViZnJhbWVzICovDQorCVdvcmQxNiBBcVtOQl9TVUJGUiAqIChNICsgMSldOyAgICAgICAgIC8qIEEoeikgICBxdWFudGl6ZWQgZm9yIHRoZSA0IHN1YmZyYW1lcyAqLw0KKw0KKwkvKiBPdGhlciB2ZWN0b3JzICovDQorCVdvcmQxNiB4bltMX1NVQkZSXTsgICAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCB2ZWN0b3IgZm9yIHBpdGNoIHNlYXJjaCAgICAgKi8NCisJV29yZDE2IHhuMltMX1NVQkZSXTsgICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZlY3RvciBmb3IgY29kZWJvb2sgc2VhcmNoICAqLw0KKwlXb3JkMTYgZG5bTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgICAvKiBDb3JyZWxhdGlvbiBiZXR3ZWVuIHhuMiBhbmQgaDEgICAgICovDQorCVdvcmQxNiBjbltMX1NVQkZSXTsgICAgICAgICAgICAgICAgICAgIC8qIFRhcmdldCB2ZWN0b3IgaW4gcmVzaWR1YWwgZG9tYWluICAgKi8NCisJV29yZDE2IGgxW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgICAgLyogSW1wdWxzZSByZXNwb25zZSB2ZWN0b3IgICAgICAgICAgICAqLw0KKwlXb3JkMTYgaDJbTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgICAvKiBJbXB1bHNlIHJlc3BvbnNlIHZlY3RvciAgICAgICAgICAgICovDQorCVdvcmQxNiBjb2RlW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICAgICAgICAgKi8NCisJV29yZDE2IHkxW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyZWQgYWRhcHRpdmUgZXhjaXRhdGlvbiAgICAgICAqLw0KKwlXb3JkMTYgeTJbTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXJlZCBhZGFwdGl2ZSBleGNpdGF0aW9uICAgICAgICovDQorCVdvcmQxNiBlcnJvcltNICsgTF9TVUJGUl07ICAgICAgICAgICAgIC8qIGVycm9yIG9mIHF1YW50aXphdGlvbiAgICAgICAgICAgICAgKi8NCisJV29yZDE2IHN5bnRoW0xfU1VCRlJdOyAgICAgICAgICAgICAgICAgLyogMTIuOGtIeiBzeW50aGVzaXMgdmVjdG9yICAgICAgICAgICAqLw0KKwlXb3JkMTYgZXhjMltMX0ZSQU1FXTsgICAgICAgICAgICAgICAgICAvKiBleGNpdGF0aW9uIHZlY3RvciAgICAgICAgICAgICAgICAgICovDQorCVdvcmQxNiBidWZbTF9GUkFNRV07ICAgICAgICAgICAgICAgICAgIC8qIFZBRCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisNCisJLyogU2NhbGFycyAqLw0KKwlXb3JkMzIgaSwgaiwgaV9zdWJmciwgc2VsZWN0LCBwaXRfZmxhZywgY2xpcF9nYWluLCB2YWRfZmxhZzsNCisJV29yZDE2IGNvZGVjX21vZGU7DQorCVdvcmQxNiBUX29wLCBUX29wMiwgVDAsIFQwX21pbiwgVDBfbWF4LCBUMF9mcmFjLCBpbmRleDsNCisJV29yZDE2IGdhaW5fcGl0LCBnYWluX2NvZGUsIGdfY29lZmZbNF0sIGdfY29lZmYyWzRdOw0KKwlXb3JkMTYgdG1wLCBnYWluMSwgZ2FpbjIsIGV4cCwgUV9uZXcsIG11LCBzaGlmdCwgbWF4Ow0KKwlXb3JkMTYgdm9pY2VfZmFjOw0KKwlXb3JkMTYgaW5kaWNlWzhdOw0KKwlXb3JkMzIgTF90bXAsIExfZ2Fpbl9jb2RlLCBMX21heCwgTF90bXAxOw0KKwlXb3JkMTYgY29kZTJbTF9TVUJGUl07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVkIGNvZGVib29rIGV4Y2l0YXRpb24gICovDQorCVdvcmQxNiBzdGFiX2ZhYywgZmFjLCBnYWluX2NvZGVfbG87DQorDQorCVdvcmQxNiBjb3JyX2dhaW47DQorCVdvcmQxNiAqdm9fcDAsICp2b19wMSwgKnZvX3AyLCAqdm9fcDM7DQorDQorCXN0ID0gKENvZGVyX1N0YXRlICopIHNwZV9zdGF0ZTsNCisNCisJKnNlcl9zaXplID0gbmJfb2ZfYml0c1sqbW9kZV07ICAgICAgICAgDQorCWNvZGVjX21vZGUgPSAqbW9kZTsgICAgICAgICAgICAgICAgICAgIA0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgICAgICAgICBJbml0aWFsaXplIHBvaW50ZXJzIHRvIHNwZWVjaCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfCAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgIHBhc3Qgc3AgICBzZjEgICAgIHNmMiAgICAgc2YzICAgICBzZjQgICAgTF9ORVhUICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgPC0tLS0tLS0gIFRvdGFsIHNwZWVjaCBidWZmZXIgKExfVE9UQUwpICAgLS0tLS0tPiAgICAgKg0KKwkgKiAgICAgICAgICAgICAgb2xkX3NwZWVjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgPC0tLS0tLS0gIExQQyBhbmFseXNpcyB3aW5kb3cgKExfV0lORE9XKSAgLS0tLS0tPiAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICA8LS0gcHJlc2VudCBmcmFtZSAoTF9GUkFNRSkgLS0tLT4gICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICBwX3dpbmRvdyB8ICAgICAgIDwtLS0tLSBuZXcgc3BlZWNoIChMX0ZSQU1FKSAtLS0tPiAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWNoICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zcGVlY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJbmV3X3NwZWVjaCA9IG9sZF9zcGVlY2ggKyBMX1RPVEFMIC0gTF9GUkFNRSAtIExfRklMVDsgICAgICAgICAvKiBOZXcgc3BlZWNoICAgICAqLw0KKwlzcGVlY2ggPSBvbGRfc3BlZWNoICsgTF9UT1RBTCAtIExfRlJBTUUgLSBMX05FWFQ7ICAgICAgICAgICAgIC8qIFByZXNlbnQgZnJhbWUgICovDQorCXBfd2luZG93ID0gb2xkX3NwZWVjaCArIExfVE9UQUwgLSBMX1dJTkRPVzsgDQorDQorCWV4YyA9IG9sZF9leGMgKyBQSVRfTUFYICsgTF9JTlRFUlBPTDsgIA0KKwl3c3AgPSBvbGRfd3NwICsgKFBJVF9NQVggLyBPUExfREVDSU0pOyANCisNCisJLyogY29weSBjb2RlciBtZW1vcnkgc3RhdGUgaW50byB3b3JraW5nIHNwYWNlICovDQorCUNvcHkoc3QtPm9sZF9zcGVlY2gsIG9sZF9zcGVlY2gsIExfVE9UQUwgLSBMX0ZSQU1FKTsNCisJQ29weShzdC0+b2xkX3dzcCwgb2xkX3dzcCwgUElUX01BWCAvIE9QTF9ERUNJTSk7DQorCUNvcHkoc3QtPm9sZF9leGMsIG9sZF9leGMsIFBJVF9NQVggKyBMX0lOVEVSUE9MKTsNCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIERvd24gc2FtcGxpbmcgc2lnbmFsIGZyb20gMTZrSHogdG8gMTIuOGtIeiAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAtPiBUaGUgc2lnbmFsIGlzIGV4dGVuZGVkIGJ5IExfRklMVCBzYW1wbGVzIChwYWRkZWQgdG8gemVybykgICoNCisJICogdG8gYXZvaWQgYWRkaXRpb25hbCBkZWxheSAoTF9GSUxUIHNhbXBsZXMpIGluIHRoZSBjb2Rlci4gICAgICAqDQorCSAqIFRoZSBsYXN0IExfRklMVCBzYW1wbGVzIGFyZSBhcHByb3hpbWF0ZWQgYWZ0ZXIgZGVjaW1hdGlvbiBhbmQgKg0KKwkgKiBhcmUgdXNlZCAoYW5kIHdpbmRvd2VkKSBvbmx5IGluIGF1dG9jb3JyZWxhdGlvbnMuICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlEZWNpbV8xMms4KHNwZWVjaDE2aywgTF9GUkFNRTE2aywgbmV3X3NwZWVjaCwgc3QtPm1lbV9kZWNpbSk7DQorDQorCS8qIGxhc3QgTF9GSUxUIHNhbXBsZXMgZm9yIGF1dG9jb3JyZWxhdGlvbiB3aW5kb3cgKi8NCisJQ29weShzdC0+bWVtX2RlY2ltLCBjb2RlLCAyICogTF9GSUxUMTZrKTsNCisJU2V0X3plcm8oZXJyb3IsIExfRklMVDE2ayk7ICAgICAgICAgICAgLyogc2V0IG5leHQgc2FtcGxlIHRvIHplcm8gKi8NCisJRGVjaW1fMTJrOChlcnJvciwgTF9GSUxUMTZrLCBuZXdfc3BlZWNoICsgTF9GUkFNRSwgY29kZSk7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBQZXJmb3JtIDUwSHogSFAgZmlsdGVyaW5nIG9mIGlucHV0IHNpZ25hbC4gICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKw0KKwlIUDUwXzEyazgobmV3X3NwZWVjaCwgTF9GUkFNRSwgc3QtPm1lbV9zaWdfaW4pOw0KKw0KKwkvKiBsYXN0IExfRklMVCBzYW1wbGVzIGZvciBhdXRvY29ycmVsYXRpb24gd2luZG93ICovDQorCUNvcHkoc3QtPm1lbV9zaWdfaW4sIGNvZGUsIDYpOw0KKwlIUDUwXzEyazgobmV3X3NwZWVjaCArIExfRlJBTUUsIExfRklMVCwgY29kZSk7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBQZXJmb3JtIGZpeGVkIHByZWVtcGhhc2lzIHRocm91Z2ggMSAtIGcgel4tMSAgICAgICAgICAgICAgICAgICoNCisJICogU2NhbGUgc2lnbmFsIHRvIGdldCBtYXhpbXVtIG9mIHByZWNpc2lvbiBpbiBmaWx0ZXJpbmcgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJbXUgPSBQUkVFTVBIX0ZBQyA+PiAxOyAgICAgICAgICAgICAgLyogUTE1IC0tPiBRMTQgKi8NCisNCisJLyogZ2V0IG1heCBvZiBuZXcgcHJlZW1waGFzZWQgc2FtcGxlcyAoTF9GUkFNRStMX0ZJTFQpICovDQorCUxfdG1wID0gbmV3X3NwZWVjaFswXSA8PCAxNTsNCisJTF90bXAgLT0gKHN0LT5tZW1fcHJlZW1waCAqIG11KTw8MTsNCisJTF9tYXggPSBMX2FicyhMX3RtcCk7DQorDQorCWZvciAoaSA9IDE7IGkgPCBMX0ZSQU1FICsgTF9GSUxUOyBpKyspDQorCXsNCisJCUxfdG1wID0gbmV3X3NwZWVjaFtpXSA8PCAxNTsNCisJCUxfdG1wIC09IChuZXdfc3BlZWNoW2kgLSAxXSAqIG11KTw8MTsNCisJCUxfdG1wID0gTF9hYnMoTF90bXApOw0KKwkJaWYoTF90bXAgPiBMX21heCkNCisJCXsNCisJCQlMX21heCA9IExfdG1wOyAgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisNCisJLyogZ2V0IHNjYWxpbmcgZmFjdG9yIGZvciBuZXcgYW5kIHByZXZpb3VzIHNhbXBsZXMgKi8NCisJLyogbGltaXQgc2NhbGluZyB0byBRX01BWCB0byBrZWVwIGR5bmFtaWMgZm9yIHJpbmdpbmcgaW4gbG93IHNpZ25hbCAqLw0KKwkvKiBsaW1pdCBzY2FsaW5nIHRvIFFfTUFYIGFsc28gdG8gYXZvaWQgYVswXTwxIGluIHN5bl9maWx0XzMyICovDQorCXRtcCA9IGV4dHJhY3RfaChMX21heCk7DQorCWlmICh0bXAgPT0gMCkNCisJew0KKwkJc2hpZnQgPSBRX01BWDsgICAgICAgICAgICAgICAgICAgICANCisJfSBlbHNlDQorCXsNCisJCXNoaWZ0ID0gbm9ybV9zKHRtcCkgLSAxOw0KKwkJaWYgKHNoaWZ0IDwgMCkNCisJCXsNCisJCQlzaGlmdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgDQorCQl9DQorCQlpZiAoc2hpZnQgPiBRX01BWCkNCisJCXsNCisJCQlzaGlmdCA9IFFfTUFYOyAgICAgICAgICAgICAgICAgDQorCQl9DQorCX0NCisJUV9uZXcgPSBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWlmIChRX25ldyA+IHN0LT5RX21heFswXSkNCisJew0KKwkJUV9uZXcgPSBzdC0+UV9tYXhbMF07ICAgICAgICAgICAgICANCisJfQ0KKwlpZiAoUV9uZXcgPiBzdC0+UV9tYXhbMV0pDQorCXsNCisJCVFfbmV3ID0gc3QtPlFfbWF4WzFdOyAgICAgICAgICAgICAgDQorCX0NCisJZXhwID0gKFFfbmV3IC0gc3QtPlFfb2xkKTsNCisJc3QtPlFfb2xkID0gUV9uZXc7ICAgICAgICAgICAgICAgICAgICAgDQorCXN0LT5RX21heFsxXSA9IHN0LT5RX21heFswXTsgICAgICAgICAgIA0KKwlzdC0+UV9tYXhbMF0gPSBzaGlmdDsgICAgICAgICAgICAgICAgICANCisNCisJLyogcHJlZW1waGFzaXMgd2l0aCBzY2FsaW5nIChMX0ZSQU1FK0xfRklMVCkgKi8NCisJdG1wID0gbmV3X3NwZWVjaFtMX0ZSQU1FIC0gMV07ICAgICAgICAgDQorDQorCWZvciAoaSA9IExfRlJBTUUgKyBMX0ZJTFQgLSAxOyBpID4gMDsgaS0tKQ0KKwl7DQorCQlMX3RtcCA9IG5ld19zcGVlY2hbaV0gPDwgMTU7DQorCQlMX3RtcCAtPSAobmV3X3NwZWVjaFtpIC0gMV0gKiBtdSk8PDE7DQorCQlMX3RtcCA9IChMX3RtcCA8PCBRX25ldyk7DQorCQluZXdfc3BlZWNoW2ldID0gdm9fcm91bmQoTF90bXApOyAgICAgIA0KKwl9DQorDQorCUxfdG1wID0gbmV3X3NwZWVjaFswXSA8PCAxNTsNCisJTF90bXAgLT0gKHN0LT5tZW1fcHJlZW1waCAqIG11KTw8MTsNCisJTF90bXAgPSAoTF90bXAgPDwgUV9uZXcpOw0KKwluZXdfc3BlZWNoWzBdID0gdm9fcm91bmQoTF90bXApOyAgICAgICAgICANCisNCisJc3QtPm1lbV9wcmVlbXBoID0gdG1wOyAgICAgICAgICAgICAgICAgDQorDQorCS8qIHNjYWxlIHByZXZpb3VzIHNhbXBsZXMgYW5kIG1lbW9yeSAqLw0KKw0KKwlTY2FsZV9zaWcob2xkX3NwZWVjaCwgTF9UT1RBTCAtIExfRlJBTUUgLSBMX0ZJTFQsIGV4cCk7DQorCVNjYWxlX3NpZyhvbGRfZXhjLCBQSVRfTUFYICsgTF9JTlRFUlBPTCwgZXhwKTsNCisJU2NhbGVfc2lnKHN0LT5tZW1fc3luLCBNLCBleHApOw0KKwlTY2FsZV9zaWcoc3QtPm1lbV9kZWNpbTIsIDMsIGV4cCk7DQorCVNjYWxlX3NpZygmKHN0LT5tZW1fd3NwKSwgMSwgZXhwKTsNCisJU2NhbGVfc2lnKCYoc3QtPm1lbV93MCksIDEsIGV4cCk7DQorDQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgQ2FsbCBWQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogIFByZWVtcGhlc2lzIHNjYWxlIGRvd24gc2lnbmFsIGluIGxvdyBmcmVxdWVuY3kgYW5kIGtlZXAgZHluYW1pYyBpbiBIRi4qDQorCSAqICBWYWQgd29yayBzbGlnaHRseSBpbiBmdXR1ciAobmV3X3NwZWVjaCA9IHNwZWVjaCArIExfTkVYVCAtIExfRklMVCkuICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCUNvcHkobmV3X3NwZWVjaCwgYnVmLCBMX0ZSQU1FKTsNCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJU2NhbGVfc2lnX29wdChidWYsIExfRlJBTUUsIDEgLSBRX25ldyk7DQorI2Vsc2UNCisJU2NhbGVfc2lnKGJ1ZiwgTF9GUkFNRSwgMSAtIFFfbmV3KTsNCisjZW5kaWYNCisNCisJdmFkX2ZsYWcgPSB3Yl92YWQoc3QtPnZhZFN0LCBidWYpOyAgICAgICAgICAvKiBWb2ljZSBBY3Rpdml0eSBEZXRlY3Rpb24gKi8gDQorCWlmICh2YWRfZmxhZyA9PSAwKQ0KKwl7DQorCQlzdC0+dmFkX2hpc3QgPSAoc3QtPnZhZF9oaXN0ICsgMSk7ICAgICAgICANCisJfSBlbHNlDQorCXsNCisJCXN0LT52YWRfaGlzdCA9IDA7ICAgICAgICAgICAgIA0KKwl9DQorDQorCS8qIERUWCBwcm9jZXNzaW5nICovDQorCWlmIChhbGxvd19kdHggIT0gMCkNCisJew0KKwkJLyogTm90ZSB0aGF0IG1vZGUgbWF5IGNoYW5nZSBoZXJlICovDQorCQl0eF9kdHhfaGFuZGxlcihzdC0+ZHR4X2VuY1N0LCB2YWRfZmxhZywgbW9kZSk7DQorCQkqc2VyX3NpemUgPSBuYl9vZl9iaXRzWyptb2RlXTsgDQorCX0NCisNCisJaWYoKm1vZGUgIT0gTVJEVFgpDQorCXsNCisJCVBhcm1fc2VyaWFsKHZhZF9mbGFnLCAxLCAmcHJtcyk7DQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqICBQZXJmb3JtIExQQyBhbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAtIGF1dG9jb3JyZWxhdGlvbiArIGxhZyB3aW5kb3dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgLSBMZXZpbnNvbi1kdXJiaW4gYWxnb3JpdGhtIHRvIGZpbmQgYVtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIC0gY29udmVydCBhW10gdG8gaXNwW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAtIGNvbnZlcnQgaXNwW10gdG8gaXNmW10gZm9yIHF1YW50aXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgLSBxdWFudGl6ZSBhbmQgY29kZSB0aGUgaXNmW10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgIC0gY29udmVydCBpc2ZbXSB0byBpc3BbXSBmb3IgaW50ZXJwb2xhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAtIGZpbmQgdGhlIGludGVycG9sYXRlZCBJU1BzIGFuZCBjb252ZXJ0IHRvIGFbXSBmb3IgdGhlIDQgc3ViZnJhbWVzICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJLyogTFAgYW5hbHlzaXMgY2VudGVyZWQgYXQgNG5kIHN1YmZyYW1lICovDQorCUF1dG9jb3JyKHBfd2luZG93LCBNLCByX2gsIHJfbCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogQXV0b2NvcnJlbGF0aW9ucyAqLw0KKwlMYWdfd2luZG93KHJfaCwgcl9sKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhZyB3aW5kb3dpbmcgICAgKi8NCisJTGV2aW5zb24ocl9oLCByX2wsIEEsIHJjLCBzdC0+bWVtX2xldmluc29uKTsgICAgICAgICAgICAvKiBMZXZpbnNvbiBEdXJiaW4gICovDQorCUF6X2lzcChBLCBpc3BuZXcsIHN0LT5pc3BvbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBBKHopIHRvIElTUCAqLw0KKw0KKwkvKiBGaW5kIHRoZSBpbnRlcnBvbGF0ZWQgSVNQcyBhbmQgY29udmVydCB0byBhW10gZm9yIGFsbCBzdWJmcmFtZXMgKi8NCisJSW50X2lzcChzdC0+aXNwb2xkLCBpc3BuZXcsIGludGVycG9sX2ZyYWMsIEEpOw0KKw0KKwkvKiB1cGRhdGUgaXNwb2xkW10gZm9yIHRoZSBuZXh0IGZyYW1lICovDQorCUNvcHkoaXNwbmV3LCBzdC0+aXNwb2xkLCBNKTsNCisNCisJLyogQ29udmVydCBJU1BzIHRvIGZyZXF1ZW5jeSBkb21haW4gMC4uNjQwMCAqLw0KKwlJc3BfaXNmKGlzcG5ldywgaXNmLCBNKTsNCisNCisJLyogY2hlY2sgcmVzb25hbmNlIGZvciBwaXRjaCBjbGlwcGluZyBhbGdvcml0aG0gKi8NCisJR3BfY2xpcF90ZXN0X2lzZihpc2YsIHN0LT5ncF9jbGlwKTsNCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgUGVyZm9ybSBQSVRDSF9PTCBhbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogLSBGaW5kIHRoZSByZXNpZHVhbCByZXNbXSBmb3IgdGhlIHdob2xlIHNwZWVjaCBmcmFtZSAgICAgICAgICAgICAgICAgKg0KKwkgKiAtIEZpbmQgdGhlIHdlaWdodGVkIGlucHV0IHNwZWVjaCB3c3BbXSBmb3IgdGhlIHdob2xlIHNwZWVjaCBmcmFtZSAgICAqDQorCSAqIC0gc2NhbGUgd3NwW10gdG8gYXZvaWQgb3ZlcmZsb3cgaW4gcGl0Y2ggZXN0aW1hdGlvbiAgICAgICAgICAgICAgICAgICoNCisJICogLSBGaW5kIG9wZW4gbG9vcCBwaXRjaCBsYWcgZm9yIHdob2xlIHNwZWVjaCBmcmFtZSAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlwX0EgPSBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaV9zdWJmciA9IDA7IGlfc3ViZnIgPCBMX0ZSQU1FOyBpX3N1YmZyICs9IExfU1VCRlIpDQorCXsNCisJCS8qIFdlaWdodGluZyBvZiBMUEMgY29lZmZpY2llbnRzICovDQorCQlXZWlnaHRfYShwX0EsIEFwLCBHQU1NQTEsIE0pOw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJUmVzaWR1X29wdChBcCwgJnNwZWVjaFtpX3N1YmZyXSwgJndzcFtpX3N1YmZyXSwgTF9TVUJGUik7DQorI2Vsc2UNCisJCVJlc2lkdShBcCwgJnNwZWVjaFtpX3N1YmZyXSwgJndzcFtpX3N1YmZyXSwgTF9TVUJGUik7DQorI2VuZGlmDQorDQorCQlwX0EgKz0gKE0gKyAxKTsgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCURlZW1waDIod3NwLCBUSUxUX0ZBQywgTF9GUkFNRSwgJihzdC0+bWVtX3dzcCkpOw0KKw0KKwkvKiBmaW5kIG1heGltdW0gdmFsdWUgb24gd3NwW10gZm9yIDEyIGJpdHMgc2NhbGluZyAqLw0KKwltYXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTsgaSsrKQ0KKwl7DQorCQl0bXAgPSBhYnNfcyh3c3BbaV0pOw0KKwkJaWYodG1wID4gbWF4KQ0KKwkJew0KKwkJCW1heCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICANCisJCX0NCisJfQ0KKwl0bXAgPSBzdC0+b2xkX3dzcF9tYXg7ICAgICAgICAgICAgICAgICANCisJaWYobWF4ID4gdG1wKQ0KKwl7DQorCQl0bXAgPSBtYXg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRtcCA9IG1heCh3c3BfbWF4LCBvbGRfd3NwX21heCkgKi8NCisJfQ0KKwlzdC0+b2xkX3dzcF9tYXggPSBtYXg7ICAgICAgICAgICAgICAgIA0KKw0KKwlzaGlmdCA9IG5vcm1fcyh0bXApIC0gMzsNCisJaWYgKHNoaWZ0ID4gMCkNCisJew0KKwkJc2hpZnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGlmdCA9IDAuLi0zICovDQorCX0NCisJLyogZGVjaW1hdGlvbiBvZiB3c3BbXSB0byBzZWFyY2ggcGl0Y2ggaW4gTEYgYW5kIHRvIHJlZHVjZSBjb21wbGV4aXR5ICovDQorCUxQX0RlY2ltMih3c3AsIExfRlJBTUUsIHN0LT5tZW1fZGVjaW0yKTsNCisNCisJLyogc2NhbGUgd3NwW10gaW4gMTIgYml0cyB0byBhdm9pZCBvdmVyZmxvdyAqLw0KKyNpZmRlZiAgQVNNX09QVCAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCVNjYWxlX3NpZ19vcHQod3NwLCBMX0ZSQU1FIC8gT1BMX0RFQ0lNLCBzaGlmdCk7DQorI2Vsc2UNCisJU2NhbGVfc2lnKHdzcCwgTF9GUkFNRSAvIE9QTF9ERUNJTSwgc2hpZnQpOw0KKyNlbmRpZg0KKwkvKiBzY2FsZSBvbGRfd3NwICh3YXJuaW5nOiBleHAgbXVzdCBiZSBRX25ldy1RX29sZCkgKi8NCisJZXhwID0gZXhwICsgKHNoaWZ0IC0gc3QtPm9sZF93c3Bfc2hpZnQpOw0KKwlzdC0+b2xkX3dzcF9zaGlmdCA9IHNoaWZ0Ow0KKw0KKwlTY2FsZV9zaWcob2xkX3dzcCwgUElUX01BWCAvIE9QTF9ERUNJTSwgZXhwKTsNCisJU2NhbGVfc2lnKHN0LT5vbGRfaHBfd3NwLCBQSVRfTUFYIC8gT1BMX0RFQ0lNLCBleHApOw0KKw0KKwlzY2FsZV9tZW1fSHBfd3NwKHN0LT5ocF93c3BfbWVtLCBleHApOw0KKw0KKwkvKiBGaW5kIG9wZW4gbG9vcCBwaXRjaCBsYWcgZm9yIHdob2xlIHNwZWVjaCBmcmFtZSAqLw0KKw0KKwlpZigqc2VyX3NpemUgPT0gTkJCSVRTXzdrKQ0KKwl7DQorCQkvKiBGaW5kIG9wZW4gbG9vcCBwaXRjaCBsYWcgZm9yIHdob2xlIHNwZWVjaCBmcmFtZSAqLw0KKwkJVF9vcCA9IFBpdGNoX21lZF9vbCh3c3AsIHN0LCBMX0ZSQU1FIC8gT1BMX0RFQ0lNKTsNCisJfSBlbHNlDQorCXsNCisJCS8qIEZpbmQgb3BlbiBsb29wIHBpdGNoIGxhZyBmb3IgZmlyc3QgMS8yIGZyYW1lICovDQorCQlUX29wID0gUGl0Y2hfbWVkX29sKHdzcCwgc3QsIChMX0ZSQU1FLzIpIC8gT1BMX0RFQ0lNKTsNCisJfQ0KKw0KKwlpZihzdC0+b2xfZ2FpbiA+IDE5NjYxKSAgICAgICAvKiAwLjYgaW4gUTE1ICovDQorCXsNCisJCXN0LT5vbGRfVDBfbWVkID0gTWVkX29sYWcoVF9vcCwgc3QtPm9sZF9vbF9sYWcpOyAgICAgICANCisJCXN0LT5hZGFfdyA9IDMyNzY3OyAgICAgICAgICAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQlzdC0+YWRhX3cgPSB2b19tdWx0KHN0LT5hZGFfdywgMjk0OTEpOw0KKwl9DQorDQorCWlmKHN0LT5hZGFfdyA8IDI2MjE0KQ0KKwkJc3QtPm9sX3dnaHRfZmxnID0gMDsNCisJZWxzZQ0KKwkJc3QtPm9sX3dnaHRfZmxnID0gMTsNCisNCisJd2JfdmFkX3RvbmVfZGV0ZWN0aW9uKHN0LT52YWRTdCwgc3QtPm9sX2dhaW4pOw0KKwlUX29wICo9IE9QTF9ERUNJTTsgICAgICAgICAgICAgICAgICAgICANCisNCisJaWYoKnNlcl9zaXplICE9IE5CQklUU183aykNCisJew0KKwkJLyogRmluZCBvcGVuIGxvb3AgcGl0Y2ggbGFnIGZvciBzZWNvbmQgMS8yIGZyYW1lICovDQorCQlUX29wMiA9IFBpdGNoX21lZF9vbCh3c3AgKyAoKExfRlJBTUUgLyAyKSAvIE9QTF9ERUNJTSksIHN0LCAoTF9GUkFNRS8yKSAvIE9QTF9ERUNJTSk7DQorDQorCQlpZihzdC0+b2xfZ2FpbiA+IDE5NjYxKSAgIC8qIDAuNiBpbiBRMTUgKi8NCisJCXsNCisJCQlzdC0+b2xkX1QwX21lZCA9IE1lZF9vbGFnKFRfb3AyLCBzdC0+b2xkX29sX2xhZyk7ICANCisJCQlzdC0+YWRhX3cgPSAzMjc2NzsgICAgICAgICAgICAgDQorCQl9IGVsc2UNCisJCXsNCisJCQlzdC0+YWRhX3cgPSBtdWx0KHN0LT5hZGFfdywgMjk0OTEpOyANCisJCX0NCisNCisJCWlmKHN0LT5hZGFfdyA8IDI2MjE0KQ0KKwkJCXN0LT5vbF93Z2h0X2ZsZyA9IDA7DQorCQllbHNlDQorCQkJc3QtPm9sX3dnaHRfZmxnID0gMTsNCisNCisJCXdiX3ZhZF90b25lX2RldGVjdGlvbihzdC0+dmFkU3QsIHN0LT5vbF9nYWluKTsNCisNCisJCVRfb3AyICo9IE9QTF9ERUNJTTsgICAgICAgICAgICAgICAgDQorDQorCX0gZWxzZQ0KKwl7DQorCQlUX29wMiA9IFRfb3A7ICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVFgtQ05HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlpZigqbW9kZSA9PSBNUkRUWCkgICAgICAgICAgICAvKiBDTkcgbW9kZSAqLw0KKwl7DQorCQkvKiBCdWZmZXIgaXNmJ3MgYW5kIGVuZXJneSAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlSZXNpZHVfb3B0KCZBWzMgKiAoTSArIDEpXSwgc3BlZWNoLCBleGMsIExfRlJBTUUpOw0KKyNlbHNlDQorCQlSZXNpZHUoJkFbMyAqIChNICsgMSldLCBzcGVlY2gsIGV4YywgTF9GUkFNRSk7DQorI2VuZGlmDQorDQorCQlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTsgaSsrKQ0KKwkJew0KKwkJCWV4YzJbaV0gPSBzaHIoZXhjW2ldLCBRX25ldyk7ICANCisJCX0NCisNCisJCUxfdG1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgDQorCQlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTsgaSsrKQ0KKwkJCUxfdG1wICs9IChleGMyW2ldICogZXhjMltpXSk8PDE7DQorDQorCQlMX3RtcCA+Pj0gMTsNCisNCisJCWR0eF9idWZmZXIoc3QtPmR0eF9lbmNTdCwgaXNmLCBMX3RtcCwgY29kZWNfbW9kZSk7DQorDQorCQkvKiBRdWFudGl6ZSBhbmQgY29kZSB0aGUgSVNGcyAqLw0KKwkJZHR4X2VuYyhzdC0+ZHR4X2VuY1N0LCBpc2YsIGV4YzIsICZwcm1zKTsNCisNCisJCS8qIENvbnZlcnQgSVNGcyB0byB0aGUgY29zaW5lIGRvbWFpbiAqLw0KKwkJSXNmX2lzcChpc2YsIGlzcG5ld19xLCBNKTsNCisJCUlzcF9Beihpc3BuZXdfcSwgQXEsIE0sIDApOw0KKw0KKwkJZm9yIChpX3N1YmZyID0gMDsgaV9zdWJmciA8IExfRlJBTUU7IGlfc3ViZnIgKz0gTF9TVUJGUikNCisJCXsNCisJCQljb3JyX2dhaW4gPSBzeW50aGVzaXMoQXEsICZleGMyW2lfc3ViZnJdLCAwLCAmc3BlZWNoMTZrW2lfc3ViZnIgKiA1IC8gNF0sIHN0KTsNCisJCX0NCisJCUNvcHkoaXNmLCBzdC0+aXNmb2xkLCBNKTsNCisNCisJCS8qIHJlc2V0IHNwZWVjaCBjb2RlciBtZW1vcmllcyAqLw0KKwkJUmVzZXRfZW5jb2RlcihzdCwgMCk7DQorDQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogVXBkYXRlIHNpZ25hbCBmb3IgbmV4dCBmcmFtZS4gICAgICAgICAgICAgICAgICAgICoNCisJCSAqIC0+IHNhdmUgcGFzdCBvZiBzcGVlY2hbXSBhbmQgd3NwW10uICAgICAgICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJCUNvcHkoJm9sZF9zcGVlY2hbTF9GUkFNRV0sIHN0LT5vbGRfc3BlZWNoLCBMX1RPVEFMIC0gTF9GUkFNRSk7DQorCQlDb3B5KCZvbGRfd3NwW0xfRlJBTUUgLyBPUExfREVDSU1dLCBzdC0+b2xkX3dzcCwgUElUX01BWCAvIE9QTF9ERUNJTSk7DQorDQorCQlyZXR1cm47DQorCX0NCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ0VMUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCS8qIFF1YW50aXplIGFuZCBjb2RlIHRoZSBJU0ZzICovDQorDQorCWlmICgqc2VyX3NpemUgPD0gTkJCSVRTXzdrKQ0KKwl7DQorCQlRcGlzZl8yc18zNmIoaXNmLCBpc2YsIHN0LT5wYXN0X2lzZnEsIGluZGljZSwgNCk7DQorDQorCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDgsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVsxXSwgOCwgJnBybXMpOw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzJdLCA3LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDcsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVs0XSwgNiwgJnBybXMpOw0KKwl9IGVsc2UNCisJew0KKwkJUXBpc2ZfMnNfNDZiKGlzZiwgaXNmLCBzdC0+cGFzdF9pc2ZxLCBpbmRpY2UsIDQpOw0KKw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCA4LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDgsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgNiwgJnBybXMpOw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCA3LCAmcHJtcyk7DQorCQlQYXJtX3NlcmlhbChpbmRpY2VbNF0sIDcsICZwcm1zKTsNCisJCVBhcm1fc2VyaWFsKGluZGljZVs1XSwgNSwgJnBybXMpOw0KKwkJUGFybV9zZXJpYWwoaW5kaWNlWzZdLCA1LCAmcHJtcyk7DQorCX0NCisNCisJLyogQ2hlY2sgc3RhYmlsaXR5IG9uIGlzZiA6IGRpc3RhbmNlIGJldHdlZW4gb2xkIGlzZiBhbmQgY3VycmVudCBpc2YgKi8NCisNCisJTF90bXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSAwOyBpIDwgTSAtIDE7IGkrKykNCisJew0KKwkJdG1wID0gdm9fc3ViKGlzZltpXSwgc3QtPmlzZm9sZFtpXSk7DQorCQlMX3RtcCArPSAodG1wICogdG1wKTw8MTsNCisJfQ0KKw0KKwl0bXAgPSBleHRyYWN0X2goTF9zaGwyKExfdG1wLCA4KSk7IA0KKw0KKwl0bXAgPSB2b19tdWx0KHRtcCwgMjYyMTQpOyAgICAgICAgICAgICAgICAvKiB0bXAgPSBMX3RtcCowLjgvMjU2ICovDQorCXRtcCA9IHZvX3N1YigyMDQ4MCwgdG1wKTsgICAgICAgICAgICAgICAgIC8qIDEuMjUgLSB0bXAgKGluIFExNCkgKi8NCisNCisJc3RhYl9mYWMgPSBzaGwodG1wLCAxKTsgDQorDQorCWlmIChzdGFiX2ZhYyA8IDApDQorCXsNCisJCXN0YWJfZmFjID0gMDsgICAgICAgICAgICAgICAgICAgICAgDQorCX0NCisJQ29weShpc2YsIHN0LT5pc2ZvbGQsIE0pOw0KKw0KKwkvKiBDb252ZXJ0IElTRnMgdG8gdGhlIGNvc2luZSBkb21haW4gKi8NCisJSXNmX2lzcChpc2YsIGlzcG5ld19xLCBNKTsNCisNCisJaWYgKHN0LT5maXJzdF9mcmFtZSAhPSAwKQ0KKwl7DQorCQlzdC0+Zmlyc3RfZnJhbWUgPSAwOyAgICAgICAgICAgICAgDQorCQlDb3B5KGlzcG5ld19xLCBzdC0+aXNwb2xkX3EsIE0pOw0KKwl9DQorCS8qIEZpbmQgdGhlIGludGVycG9sYXRlZCBJU1BzIGFuZCBjb252ZXJ0IHRvIGFbXSBmb3IgYWxsIHN1YmZyYW1lcyAqLw0KKw0KKwlJbnRfaXNwKHN0LT5pc3BvbGRfcSwgaXNwbmV3X3EsIGludGVycG9sX2ZyYWMsIEFxKTsNCisNCisJLyogdXBkYXRlIGlzcG9sZFtdIGZvciB0aGUgbmV4dCBmcmFtZSAqLw0KKwlDb3B5KGlzcG5ld19xLCBzdC0+aXNwb2xkX3EsIE0pOw0KKw0KKwlwX0FxID0gQXE7DQorCWZvciAoaV9zdWJmciA9IDA7IGlfc3ViZnIgPCBMX0ZSQU1FOyBpX3N1YmZyICs9IExfU1VCRlIpDQorCXsNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlSZXNpZHVfb3B0KHBfQXEsICZzcGVlY2hbaV9zdWJmcl0sICZleGNbaV9zdWJmcl0sIExfU1VCRlIpOw0KKyNlbHNlDQorCQlSZXNpZHUocF9BcSwgJnNwZWVjaFtpX3N1YmZyXSwgJmV4Y1tpX3N1YmZyXSwgTF9TVUJGUik7DQorI2VuZGlmDQorCQlwX0FxICs9IChNICsgMSk7ICAgICAgICAgICAgICAgICAgIA0KKwl9DQorDQorCS8qIEJ1ZmZlciBpc2YncyBhbmQgZW5lcmd5IGZvciBkdHggb24gbm9uLXNwZWVjaCBmcmFtZSAqLw0KKwlpZiAodmFkX2ZsYWcgPT0gMCkNCisJew0KKwkJZm9yIChpID0gMDsgaSA8IExfRlJBTUU7IGkrKykNCisJCXsNCisJCQlleGMyW2ldID0gZXhjW2ldID4+IFFfbmV3Ow0KKwkJfQ0KKwkJTF90bXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICANCisJCWZvciAoaSA9IDA7IGkgPCBMX0ZSQU1FOyBpKyspDQorCQkJTF90bXAgKz0gKGV4YzJbaV0gKiBleGMyW2ldKTw8MTsNCisJCUxfdG1wID4+PSAxOw0KKw0KKwkJZHR4X2J1ZmZlcihzdC0+ZHR4X2VuY1N0LCBpc2YsIExfdG1wLCBjb2RlY19tb2RlKTsNCisJfQ0KKwkvKiByYW5nZSBmb3IgY2xvc2VkIGxvb3AgcGl0Y2ggc2VhcmNoIGluIDFzdCBzdWJmcmFtZSAqLw0KKw0KKwlUMF9taW4gPSBUX29wIC0gODsNCisJaWYgKFQwX21pbiA8IFBJVF9NSU4pDQorCXsNCisJCVQwX21pbiA9IFBJVF9NSU47ICAgICAgICAgICAgICAgICAgDQorCX0NCisJVDBfbWF4ID0gKFQwX21pbiArIDE1KTsNCisNCisJaWYoVDBfbWF4ID4gUElUX01BWCkNCisJew0KKwkJVDBfbWF4ID0gUElUX01BWDsgICAgICAgICAgICAgICAgICANCisJCVQwX21pbiA9IFQwX21heCAtIDE1OyAgICAgICAgICANCisJfQ0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJICogICAgICAgICAgTG9vcCBmb3IgZXZlcnkgc3ViZnJhbWUgaW4gdGhlIGFuYWx5c2lzIGZyYW1lICAgICAgICAgICAgICAgICAqDQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiAgVG8gZmluZCB0aGUgcGl0Y2ggYW5kIGlubm92YXRpb24gcGFyYW1ldGVycy4gVGhlIHN1YmZyYW1lIHNpemUgaXMgICAgICoNCisJICogIExfU1VCRlIgYW5kIHRoZSBsb29wIGlzIHJlcGVhdGVkIExfRlJBTUUvTF9TVUJGUiB0aW1lcy4gICAgICAgICAgICAgICAqDQorCSAqICAgICAtIGNvbXB1dGUgdGhlIHRhcmdldCBzaWduYWwgZm9yIHBpdGNoIHNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBjb21wdXRlIGltcHVsc2UgcmVzcG9uc2Ugb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlciAoaDFbXSkgICAgICoNCisJICogICAgIC0gZmluZCB0aGUgY2xvc2VkLWxvb3AgcGl0Y2ggcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCSAqICAgICAtIGVuY29kZSB0aGUgcGl0Y2ggZGVhbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBmaW5kIDIgbHQgcHJlZGljdGlvbiAod2l0aCAvIHdpdGhvdXQgTFAgZmlsdGVyIGZvciBsdCBwcmVkKSAgICAgICoNCisJICogICAgIC0gZmluZCAyIHBpdGNoIGdhaW5zIGFuZCBjaG9vc2UgdGhlIGJlc3QgbHQgcHJlZGljdGlvbi4gICAgICAgICAgICAqDQorCSAqICAgICAtIGZpbmQgdGFyZ2V0IHZlY3RvciBmb3IgY29kZWJvb2sgc2VhcmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSB1cGRhdGUgdGhlIGltcHVsc2UgcmVzcG9uc2UgaDFbXSBmb3IgY29kZWJvb2sgc2VhcmNoICAgICAgICAgICAgICoNCisJICogICAgIC0gY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgdmVjdG9yIGFuZCBpbXB1bHNlIHJlc3BvbnNlICAgICAgICAgICAqDQorCSAqICAgICAtIGNvZGVib29rIHNlYXJjaCBhbmQgZW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBWUSBvZiBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogICAgIC0gZmluZCB2b2ljaW5nIGZhY3RvciBhbmQgdGlsdCBvZiBjb2RlIGZvciBuZXh0IHN1YmZyYW1lLiAgICAgICAgICAqDQorCSAqICAgICAtIHVwZGF0ZSBzdGF0ZXMgb2Ygd2VpZ2h0aW5nIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAgICAgLSBmaW5kIGV4Y2l0YXRpb24gYW5kIHN5bnRoZXNpcyBzcGVlY2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlwX0EgPSBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisJcF9BcSA9IEFxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaV9zdWJmciA9IDA7IGlfc3ViZnIgPCBMX0ZSQU1FOyBpX3N1YmZyICs9IExfU1VCRlIpDQorCXsNCisJCXBpdF9mbGFnID0gaV9zdWJmcjsgICAgICAgICAgICAgICAgDQorCQlpZiAoKGlfc3ViZnIgPT0gMiAqIExfU1VCRlIpICYmICgqc2VyX3NpemUgPiBOQkJJVFNfN2spKQ0KKwkJew0KKwkJCXBpdF9mbGFnID0gMDsgICAgICAgICAgICAgICAgIA0KKwkJCS8qIHJhbmdlIGZvciBjbG9zZWQgbG9vcCBwaXRjaCBzZWFyY2ggaW4gM3JkIHN1YmZyYW1lICovDQorCQkJVDBfbWluID0gKFRfb3AyIC0gOCk7DQorDQorCQkJaWYgKFQwX21pbiA8IFBJVF9NSU4pDQorCQkJew0KKwkJCQlUMF9taW4gPSBQSVRfTUlOOyAgICAgICAgICANCisJCQl9DQorCQkJVDBfbWF4ID0gKFQwX21pbiArIDE1KTsNCisJCQlpZiAoVDBfbWF4ID4gUElUX01BWCkNCisJCQl7DQorCQkJCVQwX21heCA9IFBJVF9NQVg7ICAgICAgICAgDQorCQkJCVQwX21pbiA9IChUMF9tYXggLSAxNSk7DQorCQkJfQ0KKwkJfQ0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAgICAgICAgRmluZCB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgcGl0Y2ggc2VhcmNoOiAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogICAgICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAgICAgICAgICAgICB8LS0tLS0tfCAgcmVzW25dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogc3BlZWNoW25dLS0tfCBBKHopIHwtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqICAgICAgICAgICAgIHwtLS0tLS18ICAgICAgIHwgICB8LS0tLS0tLS18IGVycm9yW25dICB8LS0tLS0tfCAgICAgICAgICAqDQorCQkgKiAgICAgICAgICAgICAgICAgICB6ZXJvIC0tICgtKS0tfCAxL0EoeikgfC0tLS0tLS0tLS0tfCBXKHopIHwtLSB0YXJnZXQgKg0KKwkJICogICAgICAgICAgICAgICAgICAgZXhjICAgICAgICAgIHwtLS0tLS0tLXwgICAgICAgICAgIHwtLS0tLS18ICAgICAgICAgICoNCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiBJbnN0ZWFkIG9mIHN1YnRyYWN0aW5nIHRoZSB6ZXJvLWlucHV0IHJlc3BvbnNlIG9mIGZpbHRlcnMgZnJvbSAgICAgICAgKg0KKwkJICogdGhlIHdlaWdodGVkIGlucHV0IHNwZWVjaCwgdGhlIGFib3ZlIGNvbmZpZ3VyYXRpb24gaXMgdXNlZCB0byAgICAgICAgICoNCisJCSAqIGNvbXB1dGUgdGhlIHRhcmdldCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQlmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQ0KKwkJew0KKwkJCWVycm9yW2ldID0gdm9fc3ViKHNwZWVjaFtpICsgaV9zdWJmciAtIE1dLCBzdC0+bWVtX3N5bltpXSk7DQorCQl9DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlSZXNpZHVfb3B0KHBfQXEsICZzcGVlY2hbaV9zdWJmcl0sICZleGNbaV9zdWJmcl0sIExfU1VCRlIpOw0KKyNlbHNlDQorCQlSZXNpZHUocF9BcSwgJnNwZWVjaFtpX3N1YmZyXSwgJmV4Y1tpX3N1YmZyXSwgTF9TVUJGUik7DQorI2VuZGlmDQorCQlTeW5fZmlsdChwX0FxLCAmZXhjW2lfc3ViZnJdLCBlcnJvciArIE0sIExfU1VCRlIsIGVycm9yLCAwKTsNCisJCVdlaWdodF9hKHBfQSwgQXAsIEdBTU1BMSwgTSk7DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCVJlc2lkdV9vcHQoQXAsIGVycm9yICsgTSwgeG4sIExfU1VCRlIpOw0KKyNlbHNlDQorCQlSZXNpZHUoQXAsIGVycm9yICsgTSwgeG4sIExfU1VCRlIpOw0KKyNlbmRpZg0KKwkJRGVlbXBoMih4biwgVElMVF9GQUMsIExfU1VCRlIsICYoc3QtPm1lbV93MCkpOw0KKw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogRmluZCBhcHByb3guIHRhcmdldCBpbiByZXNpZHVhbCBkb21haW4gImNuW10iIGZvciBpbm92YXRpb24gc2VhcmNoLiAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCS8qIGZpcnN0IGhhbGY6IHhuW10gLS0+IGNuW10gKi8NCisJCVNldF96ZXJvKGNvZGUsIE0pOw0KKwkJQ29weSh4biwgY29kZSArIE0sIExfU1VCRlIgLyAyKTsNCisJCXRtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICANCisJCVByZWVtcGgyKGNvZGUgKyBNLCBUSUxUX0ZBQywgTF9TVUJGUiAvIDIsICZ0bXApOw0KKwkJV2VpZ2h0X2EocF9BLCBBcCwgR0FNTUExLCBNKTsNCisJCVN5bl9maWx0KEFwLGNvZGUgKyBNLCBjb2RlICsgTSwgTF9TVUJGUiAvIDIsIGNvZGUsIDApOw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlSZXNpZHVfb3B0KHBfQXEsY29kZSArIE0sIGNuLCBMX1NVQkZSIC8gMik7DQorI2Vsc2UNCisJCVJlc2lkdShwX0FxLGNvZGUgKyBNLCBjbiwgTF9TVUJGUiAvIDIpOw0KKyNlbmRpZg0KKw0KKwkJLyogc2Vjb25kIGhhbGY6IHJlc1tdIC0tPiBjbltdIChhcHByb3hpbWF0ZWQgYW5kIGZhc3RlcikgKi8NCisJCUNvcHkoJmV4Y1tpX3N1YmZyICsgKExfU1VCRlIgLyAyKV0sIGNuICsgKExfU1VCRlIgLyAyKSwgTF9TVUJGUiAvIDIpOw0KKw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiBDb21wdXRlIGltcHVsc2UgcmVzcG9uc2UsIGgxW10sIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgICogDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQlTZXRfemVybyhlcnJvciwgTSArIExfU1VCRlIpOw0KKwkJV2VpZ2h0X2EocF9BLCBlcnJvciArIE0sIEdBTU1BMSwgTSk7DQorDQorCQl2b19wMCA9IGVycm9yK007DQorCQl2b19wMyA9IGgxOw0KKwkJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCXsNCisJCQlMX3RtcCA9ICp2b19wMCA8PCAxNDsgICAgICAgIC8qIHg0IChRMTIgdG8gUTE0KSAqLw0KKwkJCXZvX3AxID0gcF9BcSArIDE7DQorCQkJdm9fcDIgPSB2b19wMC0xOw0KKwkJCWZvciAoaiA9IDE7IGogPD0gTS80OyBqKyspDQorCQkJew0KKwkJCQlMX3RtcCAtPSAqdm9fcDErKyAqICp2b19wMi0tOw0KKwkJCQlMX3RtcCAtPSAqdm9fcDErKyAqICp2b19wMi0tOw0KKwkJCQlMX3RtcCAtPSAqdm9fcDErKyAqICp2b19wMi0tOw0KKwkJCQlMX3RtcCAtPSAqdm9fcDErKyAqICp2b19wMi0tOw0KKwkJCX0NCisJCQkqdm9fcDMrKyA9ICp2b19wMCsrID0gdm9fcm91bmQoKExfdG1wIDw8NCkpOw0KKwkJfQ0KKwkJLyogZGVlbXBoIHdpdGhvdXQgZGl2aXNpb24gYnkgMiAtPiBRMTQgdG8gUTE1ICovDQorCQl0bXAgPSAwOyANCisJCURlZW1waDIoaDEsIFRJTFRfRkFDLCBMX1NVQkZSLCAmdG1wKTsgICAvKiBoMSBpbiBRMTQgKi8NCisNCisJCS8qIGgyIGluIFExMiBmb3IgY29kZWJvb2sgc2VhcmNoICovDQorCQlDb3B5KGgxLCBoMiwgTF9TVUJGUik7DQorDQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIHNjYWxlIHhuW10gYW5kIGgxW10gdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZG90X3Byb2R1Y3QxMigpICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyNpZmRlZiAgQVNNX09QVCAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlTY2FsZV9zaWdfb3B0KGgyLCBMX1NVQkZSLCAtMik7DQorCQlTY2FsZV9zaWdfb3B0KHhuLCBMX1NVQkZSLCBzaGlmdCk7ICAgICAvKiBzY2FsaW5nIG9mIHhuW10gdG8gbGltaXQgZHluYW1pYyBhdCAxMiBiaXRzICovDQorCQlTY2FsZV9zaWdfb3B0KGgxLCBMX1NVQkZSLCAxICsgc2hpZnQpOyAgLyogc2V0IGgxW10gaW4gUTE1IHdpdGggc2NhbGluZyBmb3IgY29udm9sdXRpb24gKi8NCisjZWxzZQ0KKwkJU2NhbGVfc2lnKGgyLCBMX1NVQkZSLCAtMik7DQorCQlTY2FsZV9zaWcoeG4sIExfU1VCRlIsIHNoaWZ0KTsgICAgIC8qIHNjYWxpbmcgb2YgeG5bXSB0byBsaW1pdCBkeW5hbWljIGF0IDEyIGJpdHMgKi8NCisJCVNjYWxlX3NpZyhoMSwgTF9TVUJGUiwgMSArIHNoaWZ0KTsgIC8qIHNldCBoMVtdIGluIFExNSB3aXRoIHNjYWxpbmcgZm9yIGNvbnZvbHV0aW9uICovDQorI2VuZGlmDQorCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAgICAgICAgICAgICAgICAgQ2xvc2VkLWxvb3AgZnJhY3Rpb25hbCBwaXRjaCBzZWFyY2ggICAgICAgICAgICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJLyogZmluZCBjbG9zZWQgbG9vcCBmcmFjdGlvbmFsIHBpdGNoICBsYWcgKi8NCisJCWlmKCpzZXJfc2l6ZSA8PSBOQkJJVFNfOWspDQorCQl7DQorCQkJVDAgPSBQaXRjaF9mcjQoJmV4Y1tpX3N1YmZyXSwgeG4sIGgxLCBUMF9taW4sIFQwX21heCwgJlQwX2ZyYWMsDQorCQkJCQlwaXRfZmxhZywgUElUX01JTiwgUElUX0ZSMV84YiwgTF9TVUJGUik7DQorDQorCQkJLyogZW5jb2RlIHBpdGNoIGxhZyAqLw0KKwkJCWlmIChwaXRfZmxhZyA9PSAwKSAgICAgICAgICAgICAvKiBpZiAxc3QvM3JkIHN1YmZyYW1lICovDQorCQkJew0KKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJCQkgKiBUaGUgcGl0Y2ggcmFuZ2UgZm9yIHRoZSAxc3QvM3JkIHN1YmZyYW1lIGlzIGVuY29kZWQgd2l0aCAgICAgKg0KKwkJCQkgKiA4IGJpdHMgYW5kIGlzIGRpdmlkZWQgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJCQkgKiAgIFBJVF9NSU4gdG8gUElUX0ZSMS0xICByZXNvbHV0aW9uIDEvMiAoZnJhYyA9IDAgb3IgMikgICAgICAgKg0KKwkJCQkgKiAgIFBJVF9GUjEgdG8gUElUX01BWCAgICByZXNvbHV0aW9uIDEgICAoZnJhYyA9IDApICAgICAgICAgICAgKg0KKwkJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCQkJaWYgKFQwIDwgUElUX0ZSMV84YikNCisJCQkJew0KKwkJCQkJaW5kZXggPSAoKFQwIDw8IDEpICsgKFQwX2ZyYWMgPj4gMSkgLSAoUElUX01JTjw8MSkpOw0KKwkJCQl9IGVsc2UNCisJCQkJew0KKwkJCQkJaW5kZXggPSAoKFQwIC0gUElUX0ZSMV84YikgKyAoKFBJVF9GUjFfOGIgLSBQSVRfTUlOKSoyKSk7DQorCQkJCX0NCisNCisJCQkJUGFybV9zZXJpYWwoaW5kZXgsIDgsICZwcm1zKTsNCisNCisJCQkJLyogZmluZCBUMF9taW4gYW5kIFQwX21heCBmb3Igc3ViZnJhbWUgMiBhbmQgNCAqLw0KKwkJCQlUMF9taW4gPSAoVDAgLSA4KTsNCisJCQkJaWYgKFQwX21pbiA8IFBJVF9NSU4pDQorCQkJCXsNCisJCQkJCVQwX21pbiA9IFBJVF9NSU47DQorCQkJCX0NCisJCQkJVDBfbWF4ID0gVDBfbWluICsgMTU7DQorCQkJCWlmIChUMF9tYXggPiBQSVRfTUFYKQ0KKwkJCQl7DQorCQkJCQlUMF9tYXggPSBQSVRfTUFYOw0KKwkJCQkJVDBfbWluID0gKFQwX21heCAtIDE1KTsNCisJCQkJfQ0KKwkJCX0gZWxzZQ0KKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBzdWJmcmFtZSAyIG9yIDQgKi8NCisJCQkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkJICogVGhlIHBpdGNoIHJhbmdlIGZvciBzdWJmcmFtZSAyIG9yIDQgaXMgZW5jb2RlZCB3aXRoIDUgYml0czogICoNCisJCQkJICogICBUMF9taW4gIHRvIFQwX21heCAgICAgcmVzb2x1dGlvbiAxLzIgKGZyYWMgPSAwIG9yIDIpICAgICAgICoNCisJCQkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJCWkgPSAoVDAgLSBUMF9taW4pOw0KKwkJCQlpbmRleCA9IChpIDw8IDEpICsgKFQwX2ZyYWMgPj4gMSk7DQorDQorCQkJCVBhcm1fc2VyaWFsKGluZGV4LCA1LCAmcHJtcyk7DQorCQkJfQ0KKwkJfSBlbHNlDQorCQl7DQorCQkJVDAgPSBQaXRjaF9mcjQoJmV4Y1tpX3N1YmZyXSwgeG4sIGgxLCBUMF9taW4sIFQwX21heCwgJlQwX2ZyYWMsDQorCQkJCQlwaXRfZmxhZywgUElUX0ZSMiwgUElUX0ZSMV85YiwgTF9TVUJGUik7DQorDQorCQkJLyogZW5jb2RlIHBpdGNoIGxhZyAqLw0KKwkJCWlmIChwaXRfZmxhZyA9PSAwKSAgICAgICAgICAgICAvKiBpZiAxc3QvM3JkIHN1YmZyYW1lICovDQorCQkJew0KKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJCQkgKiBUaGUgcGl0Y2ggcmFuZ2UgZm9yIHRoZSAxc3QvM3JkIHN1YmZyYW1lIGlzIGVuY29kZWQgd2l0aCAgICAgKg0KKwkJCQkgKiA5IGJpdHMgYW5kIGlzIGRpdmlkZWQgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJCQkgKiAgIFBJVF9NSU4gdG8gUElUX0ZSMi0xICByZXNvbHV0aW9uIDEvNCAoZnJhYyA9IDAsMSwyIG9yIDMpICAgKg0KKwkJCQkgKiAgIFBJVF9GUjIgdG8gUElUX0ZSMS0xICByZXNvbHV0aW9uIDEvMiAoZnJhYyA9IDAgb3IgMSkgICAgICAgKg0KKwkJCQkgKiAgIFBJVF9GUjEgdG8gUElUX01BWCAgICByZXNvbHV0aW9uIDEgICAoZnJhYyA9IDApICAgICAgICAgICAgKg0KKwkJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisNCisJCQkJaWYgKFQwIDwgUElUX0ZSMikNCisJCQkJew0KKwkJCQkJaW5kZXggPSAoKFQwIDw8IDIpICsgVDBfZnJhYykgLSAoUElUX01JTiA8PCAyKTsNCisJCQkJfSBlbHNlIGlmKFQwIDwgUElUX0ZSMV85YikNCisJCQkJew0KKwkJCQkJaW5kZXggPSAoKCgoVDAgPDwgMSkgKyAoVDBfZnJhYyA+PiAxKSkgLSAoUElUX0ZSMjw8MSkpICsgKChQSVRfRlIyIC0gUElUX01JTik8PDIpKTsNCisJCQkJfSBlbHNlDQorCQkJCXsNCisJCQkJCWluZGV4ID0gKCgoVDAgLSBQSVRfRlIxXzliKSArICgoUElUX0ZSMiAtIFBJVF9NSU4pPDwyKSkgKyAoKFBJVF9GUjFfOWIgLSBQSVRfRlIyKTw8MSkpOw0KKwkJCQl9DQorDQorCQkJCVBhcm1fc2VyaWFsKGluZGV4LCA5LCAmcHJtcyk7DQorDQorCQkJCS8qIGZpbmQgVDBfbWluIGFuZCBUMF9tYXggZm9yIHN1YmZyYW1lIDIgYW5kIDQgKi8NCisNCisJCQkJVDBfbWluID0gKFQwIC0gOCk7DQorCQkJCWlmIChUMF9taW4gPCBQSVRfTUlOKQ0KKwkJCQl7DQorCQkJCQlUMF9taW4gPSBQSVRfTUlOOyANCisJCQkJfQ0KKwkJCQlUMF9tYXggPSBUMF9taW4gKyAxNTsNCisNCisJCQkJaWYgKFQwX21heCA+IFBJVF9NQVgpDQorCQkJCXsNCisJCQkJCVQwX21heCA9IFBJVF9NQVg7DQorCQkJCQlUMF9taW4gPSAoVDBfbWF4IC0gMTUpOw0KKwkJCQl9DQorCQkJfSBlbHNlDQorCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHN1YmZyYW1lIDIgb3IgNCAqLw0KKwkJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJCQkgKiBUaGUgcGl0Y2ggcmFuZ2UgZm9yIHN1YmZyYW1lIDIgb3IgNCBpcyBlbmNvZGVkIHdpdGggNiBiaXRzOiAgKg0KKwkJCQkgKiAgIFQwX21pbiAgdG8gVDBfbWF4ICAgICByZXNvbHV0aW9uIDEvNCAoZnJhYyA9IDAsMSwyIG9yIDMpICAgKg0KKwkJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCQkJaSA9IChUMCAtIFQwX21pbik7DQorCQkJCWluZGV4ID0gKGkgPDwgMikgKyBUMF9mcmFjOw0KKwkJCQlQYXJtX3NlcmlhbChpbmRleCwgNiwgJnBybXMpOw0KKwkJCX0NCisJCX0NCisNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiBHYWluIGNsaXBwaW5nIHRlc3QgdG8gYXZvaWQgdW5zdGFibGUgc3ludGhlc2lzIG9uIGZyYW1lIGVyYXN1cmUgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQljbGlwX2dhaW4gPSAwOw0KKwkJaWYoKHN0LT5ncF9jbGlwWzBdIDwgMTU0KSAmJiAoc3QtPmdwX2NsaXBbMV0gPiAxNDc0NikpDQorCQkJY2xpcF9nYWluID0gMTsNCisNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCQkgKiAtIGZpbmQgdW5pdHkgZ2FpbiBwaXRjaCBleGNpdGF0aW9uIChhZGFwdGl2ZSBjb2RlYm9vayBlbnRyeSkgICAgKg0KKwkJICogICB3aXRoIGZyYWN0aW9uYWwgaW50ZXJwb2xhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqIC0gZmluZCBmaWx0ZXJlZCBwaXRjaCBleGMuIHkxW109ZXhjW10gY29udm9sdmVkIHdpdGggaDFbXSkgICAgICAqDQorCQkgKiAtIGNvbXB1dGUgcGl0Y2ggZ2FpbjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkvKiBmaW5kIHBpdGNoIGV4aXRhdGlvbiAqLw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCXByZWRfbHQ0X2FzbSgmZXhjW2lfc3ViZnJdLCBUMCwgVDBfZnJhYywgTF9TVUJGUiArIDEpOw0KKyNlbHNlDQorCQlQcmVkX2x0NCgmZXhjW2lfc3ViZnJdLCBUMCwgVDBfZnJhYywgTF9TVUJGUiArIDEpOw0KKyNlbmRpZg0KKwkJaWYgKCpzZXJfc2l6ZSA+IE5CQklUU185aykNCisJCXsNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJCUNvbnZvbHZlX2FzbSgmZXhjW2lfc3ViZnJdLCBoMSwgeTEsIExfU1VCRlIpOw0KKyNlbHNlDQorCQkJQ29udm9sdmUoJmV4Y1tpX3N1YmZyXSwgaDEsIHkxLCBMX1NVQkZSKTsNCisjZW5kaWYgDQorCQkJZ2FpbjEgPSBHX3BpdGNoKHhuLCB5MSwgZ19jb2VmZiwgTF9TVUJGUik7DQorCQkJLyogY2xpcCBnYWluIGlmIG5lY2Vzc2FyeSB0byBhdm9pZCBwcm9ibGVtIGF0IGRlY29kZXIgKi8NCisJCQlpZiAoKGNsaXBfZ2FpbiAhPSAwKSAmJiAoZ2FpbjEgPiBHUF9DTElQKSkNCisJCQl7DQorCQkJCWdhaW4xID0gR1BfQ0xJUDsgDQorCQkJfQ0KKwkJCS8qIGZpbmQgZW5lcmd5IG9mIG5ldyB0YXJnZXQgeG4yW10gKi8NCisJCQlVcGR0X3Rhcih4biwgZG4sIHkxLCBnYWluMSwgTF9TVUJGUik7ICAgICAgIC8qIGRuIHVzZWQgdGVtcG9yYXJ5ICovDQorCQl9IGVsc2UNCisJCXsNCisJCQlnYWluMSA9IDA7IA0KKwkJfQ0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIC0gZmluZCBwaXRjaCBleGNpdGF0aW9uIGZpbHRlcmVkIGJ5IDFzdCBvcmRlciBMUCBmaWx0ZXIuICAgICAgICAqDQorCQkgKiAtIGZpbmQgZmlsdGVyZWQgcGl0Y2ggZXhjLiB5MltdPWV4Y1tdIGNvbnZvbHZlZCB3aXRoIGgxW10pICAgICAgKg0KKwkJICogLSBjb21wdXRlIHBpdGNoIGdhaW4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwkJLyogZmluZCBwaXRjaCBleGNpdGF0aW9uIHdpdGggbHAgZmlsdGVyICovDQorCQl2b19wMCA9IGV4YyArIGlfc3ViZnItMTsNCisJCXZvX3AxID0gY29kZTsNCisJCS8qIGZpbmQgcGl0Y2ggZXhjaXRhdGlvbiB3aXRoIGxwIGZpbHRlciAqLw0KKwkJZm9yIChpID0gMDsgaSA8IExfU1VCRlIvMjsgaSsrKQ0KKwkJew0KKwkJCUxfdG1wID0gNTg5OCAqICp2b19wMCsrOw0KKwkJCUxfdG1wMSA9IDU4OTggKiAqdm9fcDA7DQorCQkJTF90bXAgKz0gMjA5NzIgKiAqdm9fcDArKzsNCisJCQlMX3RtcDEgKz0gMjA5NzIgKiAqdm9fcDArKzsNCisJCQlMX3RtcDEgKz0gNTg5OCAqICp2b19wMC0tOw0KKwkJCUxfdG1wICs9IDU4OTggKiAqdm9fcDA7DQorCQkJKnZvX3AxKysgPSAoTF90bXAgKyAweDQwMDApPj4xNTsNCisJCQkqdm9fcDErKyA9IChMX3RtcDEgKyAweDQwMDApPj4xNTsNCisJCX0NCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJCUNvbnZvbHZlX2FzbShjb2RlLCBoMSwgeTIsIExfU1VCRlIpOw0KKyNlbHNlDQorCQlDb252b2x2ZShjb2RlLCBoMSwgeTIsIExfU1VCRlIpOw0KKyNlbmRpZiANCisNCisJCWdhaW4yID0gR19waXRjaCh4biwgeTIsIGdfY29lZmYyLCBMX1NVQkZSKTsNCisNCisJCS8qIGNsaXAgZ2FpbiBpZiBuZWNlc3NhcnkgdG8gYXZvaWQgcHJvYmxlbSBhdCBkZWNvZGVyICovDQorCQlpZiAoKGNsaXBfZ2FpbiAhPSAwKSAmJiAoZ2FpbjIgPiBHUF9DTElQKSkNCisJCXsNCisJCQlnYWluMiA9IEdQX0NMSVA7DQorCQl9DQorCQkvKiBmaW5kIGVuZXJneSBvZiBuZXcgdGFyZ2V0IHhuMltdICovDQorCQlVcGR0X3Rhcih4biwgeG4yLCB5MiwgZ2FpbjIsIExfU1VCRlIpOw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIHVzZSB0aGUgYmVzdCBwcmVkaWN0aW9uIChtaW5pbWlzZSBxdWFkcmF0aWMgZXJyb3IpLiAgICAgICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCXNlbGVjdCA9IDA7IA0KKwkJaWYoKnNlcl9zaXplID4gTkJCSVRTXzlrKQ0KKwkJew0KKwkJCUxfdG1wID0gMEw7DQorCQkJdm9fcDAgPSBkbjsNCisJCQl2b19wMSA9IHhuMjsNCisJCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUi8yOyBpKyspDQorCQkJew0KKwkJCQlMX3RtcCArPSAqdm9fcDAgKiAqdm9fcDA7DQorCQkJCXZvX3AwKys7DQorCQkJCUxfdG1wIC09ICp2b19wMSAqICp2b19wMTsNCisJCQkJdm9fcDErKzsNCisJCQkJTF90bXAgKz0gKnZvX3AwICogKnZvX3AwOw0KKwkJCQl2b19wMCsrOw0KKwkJCQlMX3RtcCAtPSAqdm9fcDEgKiAqdm9fcDE7DQorCQkJCXZvX3AxKys7DQorCQkJfQ0KKw0KKwkJCWlmIChMX3RtcCA8PSAwKQ0KKwkJCXsNCisJCQkJc2VsZWN0ID0gMTsgDQorCQkJfQ0KKwkJCVBhcm1fc2VyaWFsKHNlbGVjdCwgMSwgJnBybXMpOw0KKwkJfQ0KKwkJaWYgKHNlbGVjdCA9PSAwKQ0KKwkJew0KKwkJCS8qIHVzZSB0aGUgbHAgZmlsdGVyIGZvciBwaXRjaCBleGNpdGF0aW9uIHByZWRpY3Rpb24gKi8NCisJCQlnYWluX3BpdCA9IGdhaW4yOw0KKwkJCUNvcHkoY29kZSwgJmV4Y1tpX3N1YmZyXSwgTF9TVUJGUik7DQorCQkJQ29weSh5MiwgeTEsIExfU1VCRlIpOw0KKwkJCUNvcHkoZ19jb2VmZjIsIGdfY29lZmYsIDQpOw0KKwkJfSBlbHNlDQorCQl7DQorCQkJLyogbm8gZmlsdGVyIHVzZWQgZm9yIHBpdGNoIGV4Y2l0YXRpb24gcHJlZGljdGlvbiAqLw0KKwkJCWdhaW5fcGl0ID0gZ2FpbjE7DQorCQkJQ29weShkbiwgeG4yLCBMX1NVQkZSKTsgICAgICAgIC8qIHRhcmdldCB2ZWN0b3IgZm9yIGNvZGVib29rIHNlYXJjaCAqLw0KKwkJfQ0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIC0gdXBkYXRlIGNuW10gZm9yIGNvZGVib29rIHNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCVVwZHRfdGFyKGNuLCBjbiwgJmV4Y1tpX3N1YmZyXSwgZ2Fpbl9waXQsIExfU1VCRlIpOw0KKw0KKyNpZmRlZiAgQVNNX09QVCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCQlTY2FsZV9zaWdfb3B0KGNuLCBMX1NVQkZSLCBzaGlmdCk7ICAgICAvKiBzY2FsaW5nIG9mIGNuW10gdG8gbGltaXQgZHluYW1pYyBhdCAxMiBiaXRzICovDQorI2Vsc2UNCisJCVNjYWxlX3NpZyhjbiwgTF9TVUJGUiwgc2hpZnQpOyAgICAgLyogc2NhbGluZyBvZiBjbltdIHRvIGxpbWl0IGR5bmFtaWMgYXQgMTIgYml0cyAqLw0KKyNlbmRpZg0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIC0gaW5jbHVkZSBmaXhlZC1nYWluIHBpdGNoIGNvbnRyaWJ1dGlvbiBpbnRvIGltcHVsc2UgcmVzcC4gaDFbXSAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCXRtcCA9IDA7DQorCQlQcmVlbXBoKGgyLCBzdC0+dGlsdF9jb2RlLCBMX1NVQkZSLCAmdG1wKTsNCisNCisJCWlmIChUMF9mcmFjID4gMikNCisJCQlUMCA9IChUMCArIDEpOw0KKwkJUGl0X3NocnAoaDIsIFQwLCBQSVRfU0hBUlAsIExfU1VCRlIpOw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIC0gQ29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgeG4yW10gYW5kIGltcHVsc2UgcmVzcG9uc2UgaDFbXSAgICAqDQorCQkgKiAtIElubm92YXRpdmUgY29kZWJvb2sgc2VhcmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQljb3JfaF94KGgyLCB4bjIsIGRuKTsNCisJCWlmICgqc2VyX3NpemUgPD0gTkJCSVRTXzdrKQ0KKwkJew0KKwkJCUFDRUxQXzJ0NjRfZngoZG4sIGNuLCBoMiwgY29kZSwgeTIsIGluZGljZSk7DQorDQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCAxMiwgJnBybXMpOw0KKwkJfSBlbHNlIGlmKCpzZXJfc2l6ZSA8PSBOQkJJVFNfOWspDQorCQl7DQorCQkJQUNFTFBfNHQ2NF9meChkbiwgY24sIGgyLCBjb2RlLCB5MiwgMjAsICpzZXJfc2l6ZSwgaW5kaWNlKTsNCisNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDUsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDUsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMl0sIDUsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDUsICZwcm1zKTsNCisJCX0gZWxzZSBpZigqc2VyX3NpemUgPD0gTkJCSVRTXzEyaykNCisJCXsNCisJCQlBQ0VMUF80dDY0X2Z4KGRuLCBjbiwgaDIsIGNvZGUsIHkyLCAzNiwgKnNlcl9zaXplLCBpbmRpY2UpOw0KKw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgOSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsxXSwgOSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgOSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVszXSwgOSwgJnBybXMpOw0KKwkJfSBlbHNlIGlmKCpzZXJfc2l6ZSA8PSBOQkJJVFNfMTRrKQ0KKwkJew0KKwkJCUFDRUxQXzR0NjRfZngoZG4sIGNuLCBoMiwgY29kZSwgeTIsIDQ0LCAqc2VyX3NpemUsIGluZGljZSk7DQorDQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzBdLCAxMywgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsxXSwgMTMsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMl0sIDksICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDksICZwcm1zKTsNCisJCX0gZWxzZSBpZigqc2VyX3NpemUgPD0gTkJCSVRTXzE2aykNCisJCXsNCisJCQlBQ0VMUF80dDY0X2Z4KGRuLCBjbiwgaDIsIGNvZGUsIHkyLCA1MiwgKnNlcl9zaXplLCBpbmRpY2UpOw0KKw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgMTMsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDEzLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzJdLCAxMywgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVszXSwgMTMsICZwcm1zKTsNCisJCX0gZWxzZSBpZigqc2VyX3NpemUgPD0gTkJCSVRTXzE4aykNCisJCXsNCisJCQlBQ0VMUF80dDY0X2Z4KGRuLCBjbiwgaDIsIGNvZGUsIHkyLCA2NCwgKnNlcl9zaXplLCBpbmRpY2UpOw0KKw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgMiwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsxXSwgMiwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgMiwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVszXSwgMiwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs0XSwgMTQsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbNV0sIDE0LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzZdLCAxNCwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs3XSwgMTQsICZwcm1zKTsNCisJCX0gZWxzZSBpZigqc2VyX3NpemUgPD0gTkJCSVRTXzIwaykNCisJCXsNCisJCQlBQ0VMUF80dDY0X2Z4KGRuLCBjbiwgaDIsIGNvZGUsIHkyLCA3MiwgKnNlcl9zaXplLCBpbmRpY2UpOw0KKw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVswXSwgMTAsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMV0sIDEwLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzJdLCAyLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzNdLCAyLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzRdLCAxMCwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs1XSwgMTAsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbNl0sIDE0LCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzddLCAxNCwgJnBybXMpOw0KKwkJfSBlbHNlDQorCQl7DQorCQkJQUNFTFBfNHQ2NF9meChkbiwgY24sIGgyLCBjb2RlLCB5MiwgODgsICpzZXJfc2l6ZSwgaW5kaWNlKTsNCisNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbMF0sIDExLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzFdLCAxMSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVsyXSwgMTEsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbM10sIDExLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzRdLCAxMSwgJnBybXMpOw0KKwkJCVBhcm1fc2VyaWFsKGluZGljZVs1XSwgMTEsICZwcm1zKTsNCisJCQlQYXJtX3NlcmlhbChpbmRpY2VbNl0sIDExLCAmcHJtcyk7DQorCQkJUGFybV9zZXJpYWwoaW5kaWNlWzddLCAxMSwgJnBybXMpOw0KKwkJfQ0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogLSBBZGQgdGhlIGZpeGVkLWdhaW4gcGl0Y2ggY29udHJpYnV0aW9uIHRvIGNvZGVbXS4gICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCXRtcCA9IDA7IA0KKwkJUHJlZW1waChjb2RlLCBzdC0+dGlsdF9jb2RlLCBMX1NVQkZSLCAmdG1wKTsNCisJCVBpdF9zaHJwKGNvZGUsIFQwLCBQSVRfU0hBUlAsIExfU1VCRlIpOw0KKwkJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogIC0gQ29tcHV0ZSB0aGUgZml4ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogIC0gcXVhbnRpemUgZml4ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJCWlmKCpzZXJfc2l6ZSA8PSBOQkJJVFNfOWspDQorCQl7DQorCQkJaW5kZXggPSBRX2dhaW4yKHhuLCB5MSwgUV9uZXcgKyBzaGlmdCwgeTIsIGNvZGUsIGdfY29lZmYsIExfU1VCRlIsIDYsDQorCQkJCQkmZ2Fpbl9waXQsICZMX2dhaW5fY29kZSwgY2xpcF9nYWluLCBzdC0+cXVhX2dhaW4pOw0KKwkJCVBhcm1fc2VyaWFsKGluZGV4LCA2LCAmcHJtcyk7DQorCQl9IGVsc2UNCisJCXsNCisJCQlpbmRleCA9IFFfZ2FpbjIoeG4sIHkxLCBRX25ldyArIHNoaWZ0LCB5MiwgY29kZSwgZ19jb2VmZiwgTF9TVUJGUiwgNywNCisJCQkJCSZnYWluX3BpdCwgJkxfZ2Fpbl9jb2RlLCBjbGlwX2dhaW4sIHN0LT5xdWFfZ2Fpbik7DQorCQkJUGFybV9zZXJpYWwoaW5kZXgsIDcsICZwcm1zKTsNCisJCX0NCisJCS8qIHRlc3QgcXVhbnRpemVkIGdhaW4gb2YgcGl0Y2ggZm9yIHBpdGNoIGNsaXBwaW5nIGFsZ29yaXRobSAqLw0KKwkJR3BfY2xpcF90ZXN0X2dhaW5fcGl0KGdhaW5fcGl0LCBzdC0+Z3BfY2xpcCk7DQorDQorCQlMX3RtcCA9IExfc2hsKExfZ2Fpbl9jb2RlLCBRX25ldyk7IA0KKwkJZ2Fpbl9jb2RlID0gZXh0cmFjdF9oKExfYWRkKExfdG1wLCAweDgwMDApKTsNCisNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCSAqIFVwZGF0ZSBwYXJhbWV0ZXJzIGZvciB0aGUgbmV4dCBzdWJmcmFtZS4gICAgICAgICAgICAgICAgICoNCisJCSAqIC0gdGlsdCBvZiBjb2RlOiAwLjAgKHVudm9pY2VkKSB0byAwLjUgKHZvaWNlZCkgICAgICAgICAgICoNCisJCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkvKiBmaW5kIHZvaWNlIGZhY3RvciBpbiBRMTUgKDE9dm9pY2VkLCAtMT11bnZvaWNlZCkgKi8NCisJCUNvcHkoJmV4Y1tpX3N1YmZyXSwgZXhjMiwgTF9TVUJGUik7DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwkJU2NhbGVfc2lnX29wdChleGMyLCBMX1NVQkZSLCBzaGlmdCk7DQorI2Vsc2UNCisJCVNjYWxlX3NpZyhleGMyLCBMX1NVQkZSLCBzaGlmdCk7DQorI2VuZGlmDQorCQl2b2ljZV9mYWMgPSB2b2ljZV9mYWN0b3IoZXhjMiwgc2hpZnQsIGdhaW5fcGl0LCBjb2RlLCBnYWluX2NvZGUsIExfU1VCRlIpOw0KKwkJLyogdGlsdCBvZiBjb2RlIGZvciBuZXh0IHN1YmZyYW1lOiAwLjU9dm9pY2VkLCAwPXVudm9pY2VkICovDQorCQlzdC0+dGlsdF9jb2RlID0gKCh2b2ljZV9mYWMgPj4gMikgKyA4MTkyKTsNCisJCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkJICogLSBVcGRhdGUgZmlsdGVyJ3MgbWVtb3J5ICJtZW1fdzAiIGZvciBmaW5kaW5nIHRoZSAgICAqDQorCQkgKiAgIHRhcmdldCB2ZWN0b3IgaW4gdGhlIG5leHQgc3ViZnJhbWUuICAgICAgICAgICAgICAgICoNCisJCSAqIC0gRmluZCB0aGUgdG90YWwgZXhjaXRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkJICogLSBGaW5kIHN5bnRoZXNpcyBzcGVlY2ggdG8gdXBkYXRlIG1lbV9zeW5bXS4gICAgICAgICAqDQorCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQkvKiB5MiBpbiBROSwgZ2Fpbl9waXQgaW4gUTE0ICovDQorCQlMX3RtcCA9IChnYWluX2NvZGUgKiB5MltMX1NVQkZSIC0gMV0pPDwxOw0KKwkJTF90bXAgPSBMX3NobChMX3RtcCwgKDUgKyBzaGlmdCkpOw0KKwkJTF90bXAgPSBMX25lZ2F0ZShMX3RtcCk7DQorCQlMX3RtcCArPSAoeG5bTF9TVUJGUiAtIDFdICogMTYzODQpPDwxOw0KKwkJTF90bXAgLT0gKHkxW0xfU1VCRlIgLSAxXSAqIGdhaW5fcGl0KTw8MTsNCisJCUxfdG1wID0gTF9zaGwoTF90bXAsICgxIC0gc2hpZnQpKTsNCisJCXN0LT5tZW1fdzAgPSBleHRyYWN0X2goTF9hZGQoTF90bXAsIDB4ODAwMCkpOw0KKw0KKwkJaWYgKCpzZXJfc2l6ZSA+PSBOQkJJVFNfMjRrKQ0KKwkJCUNvcHkoJmV4Y1tpX3N1YmZyXSwgZXhjMiwgTF9TVUJGUik7DQorDQorCQlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwkJew0KKwkJCS8qIGNvZGUgaW4gUTksIGdhaW5fcGl0IGluIFExNCAqLw0KKwkJCUxfdG1wID0gKGdhaW5fY29kZSAqIGNvZGVbaV0pPDwxOw0KKwkJCUxfdG1wID0gKExfdG1wIDw8IDUpOw0KKwkJCUxfdG1wICs9IChleGNbaSArIGlfc3ViZnJdICogZ2Fpbl9waXQpPDwxOw0KKwkJCUxfdG1wID0gTF9zaGwyKExfdG1wLCAxKTsgDQorCQkJZXhjW2kgKyBpX3N1YmZyXSA9IGV4dHJhY3RfaChMX2FkZChMX3RtcCwgMHg4MDAwKSk7DQorCQl9DQorDQorCQlTeW5fZmlsdChwX0FxLCZleGNbaV9zdWJmcl0sIHN5bnRoLCBMX1NVQkZSLCBzdC0+bWVtX3N5biwgMSk7DQorDQorCQlpZigqc2VyX3NpemUgPj0gTkJCSVRTXzI0aykNCisJCXsNCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkgKiBwaGFzZSBkaXNwZXJzaW9uIHRvIGVuaGFuY2Ugbm9pc2UgaW4gbG93IGJpdCByYXRlICAgICAgICAgICoNCisJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJLyogTF9nYWluX2NvZGUgaW4gUTE2ICovDQorCQkJVk9fTF9FeHRyYWN0KExfZ2Fpbl9jb2RlLCAmZ2Fpbl9jb2RlLCAmZ2Fpbl9jb2RlX2xvKTsNCisNCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkgKiBub2lzZSBlbmhhbmNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkgKiB+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkgKiAtIEVuaGFuY2UgZXhjaXRhdGlvbiBvbiBub2lzZS4gKG1vZGlmeSBnYWluIG9mIGNvZGUpICAgICAgICoNCisJCQkgKiAgIElmIHNpZ25hbCBpcyBub2lzeSBhbmQgTFBDIGZpbHRlciBpcyBzdGFibGUsIG1vdmUgZ2FpbiAgICoNCisJCQkgKiAgIG9mIGNvZGUgMS41IGRCIHRvd2FyZCBnYWluIG9mIGNvZGUgdGhyZXNob2xkLiAgICAgICAgICAgICoNCisJCQkgKiAgIFRoaXMgZGVjcmVhc2UgYnkgMyBkQiBub2lzZSBlbmVyZ3kgdmFyaWF0aW9uLiAgICAgICAgICAgICoNCisJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCQkJdG1wID0gKDE2Mzg0IC0gKHZvaWNlX2ZhYyA+PiAxKSk7ICAgICAgICAvKiAxPXVudm9pY2VkLCAwPXZvaWNlZCAqLw0KKwkJCWZhYyA9IHZvX211bHQoc3RhYl9mYWMsIHRtcCk7DQorCQkJTF90bXAgPSBMX2dhaW5fY29kZTsgDQorCQkJaWYoTF90bXAgPCBzdC0+TF9nY190aHJlcykNCisJCQl7DQorCQkJCUxfdG1wID0gdm9fTF9hZGQoTF90bXAsIE1weV8zMl8xNihnYWluX2NvZGUsIGdhaW5fY29kZV9sbywgNjIyNikpOw0KKwkJCQlpZihMX3RtcCA+IHN0LT5MX2djX3RocmVzKQ0KKwkJCQl7DQorCQkJCQlMX3RtcCA9IHN0LT5MX2djX3RocmVzOw0KKwkJCQl9DQorCQkJfSBlbHNlDQorCQkJew0KKwkJCQlMX3RtcCA9IE1weV8zMl8xNihnYWluX2NvZGUsIGdhaW5fY29kZV9sbywgMjc1MzYpOw0KKwkJCQlpZihMX3RtcCA8IHN0LT5MX2djX3RocmVzKQ0KKwkJCQl7DQorCQkJCQlMX3RtcCA9IHN0LT5MX2djX3RocmVzOw0KKwkJCQl9DQorCQkJfQ0KKwkJCXN0LT5MX2djX3RocmVzID0gTF90bXA7DQorDQorCQkJTF9nYWluX2NvZGUgPSBNcHlfMzJfMTYoZ2Fpbl9jb2RlLCBnYWluX2NvZGVfbG8sICgzMjc2NyAtIGZhYykpOw0KKwkJCVZPX0xfRXh0cmFjdChMX3RtcCwgJmdhaW5fY29kZSwgJmdhaW5fY29kZV9sbyk7DQorCQkJTF9nYWluX2NvZGUgPSB2b19MX2FkZChMX2dhaW5fY29kZSwgTXB5XzMyXzE2KGdhaW5fY29kZSwgZ2Fpbl9jb2RlX2xvLCBmYWMpKTsNCisNCisJCQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoNCisJCQkgKiBwaXRjaCBlbmhhbmNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkgKiB+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJCQkgKiAtIEVuaGFuY2UgZXhjaXRhdGlvbiBvbiB2b2ljZS4gKEhQIGZpbHRlcmluZyBvZiBjb2RlKSAgICAgICoNCisJCQkgKiAgIE9uIHZvaWNlZCBzaWduYWwsIGZpbHRlcmluZyBvZiBjb2RlIGJ5IGEgc21vb3RoIGZpciBIUCAgICoNCisJCQkgKiAgIGZpbHRlciB0byBkZWNyZWFzZSBlbmVyZ3kgb2YgY29kZSBpbiBsb3cgZnJlcXVlbmN5LiAgICAgICoNCisJCQkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorCQkJdG1wID0gKCh2b2ljZV9mYWMgPj4gMykgKyA0MDk2KTsgLyogMC4yNT12b2ljZWQsIDA9dW52b2ljZWQgKi8NCisNCisJCQlMX3RtcCA9IExfZGVwb3NpdF9oKGNvZGVbMF0pOw0KKwkJCUxfdG1wIC09IChjb2RlWzFdICogdG1wKTw8MTsNCisJCQljb2RlMlswXSA9IHZvX3JvdW5kKExfdG1wKTsgDQorDQorCQkJZm9yIChpID0gMTsgaSA8IExfU1VCRlIgLSAxOyBpKyspDQorCQkJew0KKwkJCQlMX3RtcCA9IExfZGVwb3NpdF9oKGNvZGVbaV0pOw0KKwkJCQlMX3RtcCAtPSAoY29kZVtpICsgMV0gKiB0bXApPDwxOw0KKwkJCQlMX3RtcCAtPSAoY29kZVtpIC0gMV0gKiB0bXApPDwxOw0KKwkJCQljb2RlMltpXSA9IHZvX3JvdW5kKExfdG1wKTsgDQorCQkJfQ0KKw0KKwkJCUxfdG1wID0gTF9kZXBvc2l0X2goY29kZVtMX1NVQkZSIC0gMV0pOw0KKwkJCUxfdG1wIC09IChjb2RlW0xfU1VCRlIgLSAyXSAqIHRtcCk8PDE7DQorCQkJY29kZTJbTF9TVUJGUiAtIDFdID0gdm9fcm91bmQoTF90bXApOyANCisNCisJCQkvKiBidWlsZCBleGNpdGF0aW9uICovDQorCQkJZ2Fpbl9jb2RlID0gdm9fcm91bmQoTF9zaGwoTF9nYWluX2NvZGUsIFFfbmV3KSk7DQorDQorCQkJZm9yIChpID0gMDsgaSA8IExfU1VCRlI7IGkrKykNCisJCQl7DQorCQkJCUxfdG1wID0gKGNvZGUyW2ldICogZ2Fpbl9jb2RlKTw8MTsNCisJCQkJTF90bXAgPSAoTF90bXAgPDwgNSk7DQorCQkJCUxfdG1wICs9IChleGMyW2ldICogZ2Fpbl9waXQpPDwxOw0KKwkJCQlMX3RtcCA9IChMX3RtcCA8PCAxKTsNCisJCQkJZXhjMltpXSA9IHZvX3JvdW5kKExfdG1wKTsNCisJCQl9DQorDQorCQkJY29ycl9nYWluID0gc3ludGhlc2lzKHBfQXEsIGV4YzIsIFFfbmV3LCAmc3BlZWNoMTZrW2lfc3ViZnIgKiA1IC8gNF0sIHN0KTsNCisJCQlQYXJtX3NlcmlhbChjb3JyX2dhaW4sIDQsICZwcm1zKTsNCisJCX0NCisJCXBfQSArPSAoTSArIDEpOw0KKwkJcF9BcSArPSAoTSArIDEpOw0KKwl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2Ygc3ViZnJhbWUgbG9vcCAqLw0KKw0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKg0KKwkgKiBVcGRhdGUgc2lnbmFsIGZvciBuZXh0IGZyYW1lLiAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiAtPiBzYXZlIHBhc3Qgb2Ygc3BlZWNoW10sIHdzcFtdIGFuZCBleGNbXS4gICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJQ29weSgmb2xkX3NwZWVjaFtMX0ZSQU1FXSwgc3QtPm9sZF9zcGVlY2gsIExfVE9UQUwgLSBMX0ZSQU1FKTsNCisJQ29weSgmb2xkX3dzcFtMX0ZSQU1FIC8gT1BMX0RFQ0lNXSwgc3QtPm9sZF93c3AsIFBJVF9NQVggLyBPUExfREVDSU0pOw0KKwlDb3B5KCZvbGRfZXhjW0xfRlJBTUVdLCBzdC0+b2xkX2V4YywgUElUX01BWCArIExfSU5URVJQT0wpOw0KKwlyZXR1cm47DQorfQ0KKw0KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorKiBGdW5jdGlvbiBzeW50aGVzaXMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqIFN5bnRoZXNpcyBvZiBzaWduYWwgYXQgMTZrSHogd2l0aCBIRiBleHRlbnNpb24uICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorDQorc3RhdGljIFdvcmQxNiBzeW50aGVzaXMoDQorCQlXb3JkMTYgQXFbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEoeikgIDogcXVhbnRpemVkIEF6ICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgOiBleGNpdGF0aW9uIGF0IDEya0h6ICAgICAgICAqLw0KKwkJV29yZDE2IFFfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgICA6IHNjYWxpbmcgcGVyZm9ybWVkIG9uIGV4YyAgICovDQorCQlXb3JkMTYgc3ludGgxNmtbXSwgICAgICAgICAgICAgICAgICAgIC8qIChvKSAgIDogMTZrSHogc3ludGhlc2lzIHNpZ25hbCAgICAgKi8NCisJCUNvZGVyX1N0YXRlICogc3QgICAgICAgICAgICAgICAgICAgICAgLyogKGkvbykgOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgICAgICAgICAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IGZhYywgdG1wLCBleHA7DQorCVdvcmQxNiBlbmVyLCBleHBfZW5lcjsNCisJV29yZDMyIExfdG1wLCBpOw0KKw0KKwlXb3JkMTYgc3ludGhfaGlbTSArIExfU1VCRlJdLCBzeW50aF9sb1tNICsgTF9TVUJGUl07DQorCVdvcmQxNiBzeW50aFtMX1NVQkZSXTsNCisJV29yZDE2IEhGW0xfU1VCRlIxNmtdOyAgICAgICAgICAgICAgICAgLyogSGlnaCBGcmVxdWVuY3kgdmVjdG9yICAgICAgKi8NCisJV29yZDE2IEFwW00gKyAxXTsNCisNCisJV29yZDE2IEhGX1NQW0xfU1VCRlIxNmtdOyAgICAgICAgICAgICAgLyogSGlnaCBGcmVxdWVuY3kgdmVjdG9yIChmcm9tIG9yaWdpbmFsIHNpZ25hbCkgKi8NCisNCisJV29yZDE2IEhQX2VzdF9nYWluLCBIUF9jYWxjX2dhaW4sIEhQX2NvcnJfZ2FpbjsNCisJV29yZDE2IGRpc3RfbWluLCBkaXN0Ow0KKwlXb3JkMTYgSFBfZ2Fpbl9pbmQgPSAwOw0KKwlXb3JkMTYgZ2FpbjEsIGdhaW4yOw0KKwlXb3JkMTYgd2VpZ2h0MSwgd2VpZ2h0MjsNCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIHNwZWVjaCBzeW50aGVzaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiB+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogLSBGaW5kIHN5bnRoZXNpcyBzcGVlY2ggY29ycmVzcG9uZGluZyB0byBleGMyW10uICAgICAgICAgICAqDQorCSAqIC0gUGVyZm9ybSBmaXhlZCBkZWVtcGhhc2lzIGFuZCBocCA1MGh6IGZpbHRlcmluZy4gICAgICAgICAgKg0KKwkgKiAtIE92ZXJzYW1wbGluZyBmcm9tIDEyLjhrSHogdG8gMTZrSHouICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKwlDb3B5KHN0LT5tZW1fc3luX2hpLCBzeW50aF9oaSwgTSk7DQorCUNvcHkoc3QtPm1lbV9zeW5fbG8sIHN5bnRoX2xvLCBNKTsNCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJU3luX2ZpbHRfMzJfYXNtKEFxLCBNLCBleGMsIFFfbmV3LCBzeW50aF9oaSArIE0sIHN5bnRoX2xvICsgTSwgTF9TVUJGUik7DQorI2Vsc2UNCisJU3luX2ZpbHRfMzIoQXEsIE0sIGV4YywgUV9uZXcsIHN5bnRoX2hpICsgTSwgc3ludGhfbG8gKyBNLCBMX1NVQkZSKTsNCisjZW5kaWYNCisNCisJQ29weShzeW50aF9oaSArIExfU1VCRlIsIHN0LT5tZW1fc3luX2hpLCBNKTsNCisJQ29weShzeW50aF9sbyArIExfU1VCRlIsIHN0LT5tZW1fc3luX2xvLCBNKTsNCisNCisjaWZkZWYgQVNNX09QVCAgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJRGVlbXBoXzMyX2FzbShzeW50aF9oaSArIE0sIHN5bnRoX2xvICsgTSwgc3ludGgsICYoc3QtPm1lbV9kZWVtcGgpKTsNCisjZWxzZQ0KKwlEZWVtcGhfMzIoc3ludGhfaGkgKyBNLCBzeW50aF9sbyArIE0sIHN5bnRoLCBQUkVFTVBIX0ZBQywgTF9TVUJGUiwgJihzdC0+bWVtX2RlZW1waCkpOw0KKyNlbmRpZg0KKw0KKwlIUDUwXzEyazgoc3ludGgsIExfU1VCRlIsIHN0LT5tZW1fc2lnX291dCk7DQorDQorCS8qIE9yaWdpbmFsIHNwZWVjaCBzaWduYWwgYXMgcmVmZXJlbmNlIGZvciBoaWdoIGJhbmQgZ2FpbiBxdWFudGlzYXRpb24gKi8NCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlIxNms7IGkrKykNCisJew0KKwkJSEZfU1BbaV0gPSBzeW50aDE2a1tpXTsgDQorCX0NCisNCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIEhGIG5vaXNlIHN5bnRoZXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKwkgKiB+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICogLSBHZW5lcmF0ZSBIRiBub2lzZSBiZXR3ZWVuIDUuNSBhbmQgNy41IGtIei4gICAgICAgICAqDQorCSAqIC0gU2V0IGVuZXJneSBvZiBub2lzZSBhY2NvcmRpbmcgdG8gc3ludGhlc2lzIHRpbHQuICAgKg0KKwkgKiAgICAgdGlsdCA+IDAuOCA9PT4gLSAxNCBkQiAodm9pY2VkKSAgICAgICAgICAgICAgICAgICoNCisJICogICAgIHRpbHQgICAwLjUgPT0+IC0gNiBkQiAgKHZvaWNlZCBvciBub2lzZSkgICAgICAgICAqDQorCSAqICAgICB0aWx0IDwgMC4wID09PiAgIDAgZEIgIChub2lzZSkgICAgICAgICAgICAgICAgICAgKg0KKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorCS8qIGdlbmVyYXRlIHdoaXRlIG5vaXNlIHZlY3RvciAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjE2azsgaSsrKQ0KKwl7DQorCQlIRltpXSA9IFJhbmRvbSgmKHN0LT5zZWVkMikpPj4zOw0KKwl9DQorCS8qIGVuZXJneSBvZiBleGNpdGF0aW9uICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCVNjYWxlX3NpZ19vcHQoZXhjLCBMX1NVQkZSLCAtMyk7DQorCVFfbmV3ID0gUV9uZXcgLSAzOw0KKwllbmVyID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKGV4YywgZXhjLCBMX1NVQkZSLCAmZXhwX2VuZXIpKTsNCisjZWxzZQ0KKwlTY2FsZV9zaWcoZXhjLCBMX1NVQkZSLCAtMyk7DQorCVFfbmV3ID0gUV9uZXcgLSAzOw0KKwllbmVyID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoZXhjLCBleGMsIExfU1VCRlIsICZleHBfZW5lcikpOw0KKyNlbmRpZg0KKw0KKwlleHBfZW5lciA9IGV4cF9lbmVyIC0gKFFfbmV3ICsgUV9uZXcpOw0KKwkvKiBzZXQgZW5lcmd5IG9mIHdoaXRlIG5vaXNlIHRvIGVuZXJneSBvZiBleGNpdGF0aW9uICovDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCXRtcCA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbShIRiwgSEYsIExfU1VCRlIxNmssICZleHApKTsNCisjZWxzZQ0KKwl0bXAgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMihIRiwgSEYsIExfU1VCRlIxNmssICZleHApKTsNCisjZW5kaWYNCisNCisJaWYodG1wID4gZW5lcikNCisJew0KKwkJdG1wID0gKHRtcCA+PiAxKTsgICAgICAgICAgICAgICAgIC8qIEJlIHN1cmUgdG1wIDwgZW5lciAqLw0KKwkJZXhwID0gKGV4cCArIDEpOw0KKwl9DQorCUxfdG1wID0gTF9kZXBvc2l0X2goZGl2X3ModG1wLCBlbmVyKSk7IC8qIHJlc3VsdCBpcyBub3JtYWxpemVkICovDQorCWV4cCA9IChleHAgLSBleHBfZW5lcik7DQorCUlzcXJ0X24oJkxfdG1wLCAmZXhwKTsNCisJTF90bXAgPSBMX3NobChMX3RtcCwgKGV4cCArIDEpKTsgICAgICAgLyogTF90bXAgeCAyLCBMX3RtcCBpbiBRMzEgKi8NCisJdG1wID0gZXh0cmFjdF9oKExfdG1wKTsgICAgICAgICAgICAgICAgLyogdG1wID0gMiB4IHNxcnQoZW5lcl9leGMvZW5lcl9oZikgKi8NCisNCisJZm9yIChpID0gMDsgaSA8IExfU1VCRlIxNms7IGkrKykNCisJew0KKwkJSEZbaV0gPSB2b19tdWx0KEhGW2ldLCB0bXApOw0KKwl9DQorDQorCS8qIGZpbmQgdGlsdCBvZiBzeW50aGVzaXMgc3BlZWNoICh0aWx0OiAxPXZvaWNlZCwgLTE9dW52b2ljZWQpICovDQorCUhQNDAwXzEyazgoc3ludGgsIExfU1VCRlIsIHN0LT5tZW1faHA0MDApOw0KKw0KKwlMX3RtcCA9IDFMOw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9TVUJGUjsgaSsrKQ0KKwkJTF90bXAgKz0gKHN5bnRoW2ldICogc3ludGhbaV0pPDwxOw0KKw0KKwlleHAgPSBub3JtX2woTF90bXApOw0KKwllbmVyID0gZXh0cmFjdF9oKExfdG1wIDw8IGV4cCk7ICAgLyogZW5lciA9IHJbMF0gKi8NCisNCisJTF90bXAgPSAxTDsNCisJZm9yIChpID0gMTsgaSA8IExfU1VCRlI7IGkrKykNCisJCUxfdG1wICs9KHN5bnRoW2ldICogc3ludGhbaSAtIDFdKTw8MTsNCisNCisJdG1wID0gZXh0cmFjdF9oKExfdG1wIDw8IGV4cCk7ICAgIC8qIHRtcCA9IHJbMV0gKi8NCisNCisJaWYgKHRtcCA+IDApDQorCXsNCisJCWZhYyA9IGRpdl9zKHRtcCwgZW5lcik7DQorCX0gZWxzZQ0KKwl7DQorCQlmYWMgPSAwOyANCisJfQ0KKw0KKwkvKiBtb2RpZnkgZW5lcmd5IG9mIHdoaXRlIG5vaXNlIGFjY29yZGluZyB0byBzeW50aGVzaXMgdGlsdCAqLw0KKwlnYWluMSA9IDMyNzY3IC0gZmFjOw0KKwlnYWluMiA9IHZvX211bHQoZ2FpbjEsIDIwNDgwKTsNCisJZ2FpbjIgPSBzaGwoZ2FpbjIsIDEpOw0KKw0KKwlpZiAoc3QtPnZhZF9oaXN0ID4gMCkNCisJew0KKwkJd2VpZ2h0MSA9IDA7DQorCQl3ZWlnaHQyID0gMzI3Njc7DQorCX0gZWxzZQ0KKwl7DQorCQl3ZWlnaHQxID0gMzI3Njc7DQorCQl3ZWlnaHQyID0gMDsNCisJfQ0KKwl0bXAgPSB2b19tdWx0KHdlaWdodDEsIGdhaW4xKTsNCisJdG1wID0gYWRkMSh0bXAsIHZvX211bHQod2VpZ2h0MiwgZ2FpbjIpKTsNCisNCisJaWYgKHRtcCAhPSAwKQ0KKwl7DQorCQl0bXAgPSAodG1wICsgMSk7DQorCX0NCisJSFBfZXN0X2dhaW4gPSB0bXA7DQorDQorCWlmKEhQX2VzdF9nYWluIDwgMzI3NykNCisJew0KKwkJSFBfZXN0X2dhaW4gPSAzMjc3OyAgICAgICAgICAgICAgICAvKiAwLjEgaW4gUTE1ICovDQorCX0NCisJLyogc3ludGhlc2lzIG9mIG5vaXNlOiA0LjhrSHouLjUuNmtIeiAtLT4gNmtIei4uN2tIeiAqLw0KKwlXZWlnaHRfYShBcSwgQXAsIDE5NjYxLCBNKTsgICAgICAgICAgICAvKiBmYWM9MC42ICovDQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAgLyogYXNtIG9wdGltaXphdGlvbiBicmFuY2ggKi8NCisJU3luX2ZpbHRfYXNtKEFwLCBIRiwgSEYsIHN0LT5tZW1fc3luX2hmKTsNCisJLyogbm9pc2UgSGlnaCBQYXNzIGZpbHRlcmluZyAoMW1zIG9mIGRlbGF5KSAqLw0KKwlGaWx0XzZrXzdrX2FzbShIRiwgTF9TVUJGUjE2aywgc3QtPm1lbV9oZik7DQorCS8qIGZpbHRlcmluZyBvZiB0aGUgb3JpZ2luYWwgc2lnbmFsICovDQorCUZpbHRfNmtfN2tfYXNtKEhGX1NQLCBMX1NVQkZSMTZrLCBzdC0+bWVtX2hmMik7DQorDQorCS8qIGNoZWNrIHRoZSBnYWluIGRpZmZlcmVuY2UgKi8NCisJU2NhbGVfc2lnX29wdChIRl9TUCwgTF9TVUJGUjE2aywgLTEpOw0KKwllbmVyID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKEhGX1NQLCBIRl9TUCwgTF9TVUJGUjE2aywgJmV4cF9lbmVyKSk7DQorCS8qIHNldCBlbmVyZ3kgb2Ygd2hpdGUgbm9pc2UgdG8gZW5lcmd5IG9mIGV4Y2l0YXRpb24gKi8NCisJdG1wID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKEhGLCBIRiwgTF9TVUJGUjE2aywgJmV4cCkpOw0KKyNlbHNlDQorCVN5bl9maWx0KEFwLCBIRiwgSEYsIExfU1VCRlIxNmssIHN0LT5tZW1fc3luX2hmLCAxKTsNCisJLyogbm9pc2UgSGlnaCBQYXNzIGZpbHRlcmluZyAoMW1zIG9mIGRlbGF5KSAqLw0KKwlGaWx0XzZrXzdrKEhGLCBMX1NVQkZSMTZrLCBzdC0+bWVtX2hmKTsNCisJLyogZmlsdGVyaW5nIG9mIHRoZSBvcmlnaW5hbCBzaWduYWwgKi8NCisJRmlsdF82a183ayhIRl9TUCwgTF9TVUJGUjE2aywgc3QtPm1lbV9oZjIpOw0KKwkvKiBjaGVjayB0aGUgZ2FpbiBkaWZmZXJlbmNlICovDQorCVNjYWxlX3NpZyhIRl9TUCwgTF9TVUJGUjE2aywgLTEpOw0KKwllbmVyID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTIoSEZfU1AsIEhGX1NQLCBMX1NVQkZSMTZrLCAmZXhwX2VuZXIpKTsNCisJLyogc2V0IGVuZXJneSBvZiB3aGl0ZSBub2lzZSB0byBlbmVyZ3kgb2YgZXhjaXRhdGlvbiAqLw0KKwl0bXAgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMihIRiwgSEYsIExfU1VCRlIxNmssICZleHApKTsNCisjZW5kaWYNCisNCisJaWYgKHRtcCA+IGVuZXIpDQorCXsNCisJCXRtcCA9ICh0bXAgPj4gMSk7ICAgICAgICAgICAgICAgICAvKiBCZSBzdXJlIHRtcCA8IGVuZXIgKi8NCisJCWV4cCA9IChleHAgKyAxKTsNCisJfQ0KKwlMX3RtcCA9IExfZGVwb3NpdF9oKGRpdl9zKHRtcCwgZW5lcikpOyAvKiByZXN1bHQgaXMgbm9ybWFsaXplZCAqLw0KKwlleHAgPSB2b19zdWIoZXhwLCBleHBfZW5lcik7DQorCUlzcXJ0X24oJkxfdG1wLCAmZXhwKTsNCisJTF90bXAgPSBMX3NobChMX3RtcCwgZXhwKTsgICAgICAgICAgICAgLyogTF90bXAsIExfdG1wIGluIFEzMSAqLw0KKwlIUF9jYWxjX2dhaW4gPSBleHRyYWN0X2goTF90bXApOyAgICAgICAvKiB0bXAgPSBzcXJ0KGVuZXJfaW5wdXQvZW5lcl9oZikgKi8NCisNCisJLyogc3QtPmdhaW5fYWxwaGEgKj0gc3QtPmR0eF9lbmNTdC0+ZHR4SGFuZ292ZXJDb3VudC83ICovDQorCUxfdG1wID0gKHZvX0xfbXVsdChzdC0+ZHR4X2VuY1N0LT5kdHhIYW5nb3ZlckNvdW50LCA0NjgxKSA8PCAxNSk7DQorCXN0LT5nYWluX2FscGhhID0gdm9fbXVsdChzdC0+Z2Fpbl9hbHBoYSwgZXh0cmFjdF9oKExfdG1wKSk7DQorDQorCWlmKHN0LT5kdHhfZW5jU3QtPmR0eEhhbmdvdmVyQ291bnQgPiA2KQ0KKwkJc3QtPmdhaW5fYWxwaGEgPSAzMjc2NzsNCisJSFBfZXN0X2dhaW4gPSBIUF9lc3RfZ2FpbiA+PiAxOyAgICAgLyogRnJvbSBRMTUgdG8gUTE0ICovDQorCUhQX2NvcnJfZ2FpbiA9IGFkZDEodm9fbXVsdChIUF9jYWxjX2dhaW4sIHN0LT5nYWluX2FscGhhKSwgdm9fbXVsdCgoMzI3NjcgLSBzdC0+Z2Fpbl9hbHBoYSksIEhQX2VzdF9nYWluKSk7DQorDQorCS8qIFF1YW50aXNlIHRoZSBjb3JyZWN0aW9uIGdhaW4gKi8NCisJZGlzdF9taW4gPSAzMjc2NzsNCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspDQorCXsNCisJCWRpc3QgPSB2b19tdWx0KChIUF9jb3JyX2dhaW4gLSBIUF9nYWluW2ldKSwgKEhQX2NvcnJfZ2FpbiAtIEhQX2dhaW5baV0pKTsNCisJCWlmIChkaXN0X21pbiA+IGRpc3QpDQorCQl7DQorCQkJZGlzdF9taW4gPSBkaXN0Ow0KKwkJCUhQX2dhaW5faW5kID0gaTsNCisJCX0NCisJfQ0KKwlIUF9jb3JyX2dhaW4gPSBIUF9nYWluW0hQX2dhaW5faW5kXTsNCisJLyogcmV0dXJuIHRoZSBxdWFudGlzZWQgZ2FpbiBpbmRleCB3aGVuIHVzaW5nIHRoZSBoaWdoZXN0IG1vZGUsIG90aGVyd2lzZSB6ZXJvICovDQorCXJldHVybiAoSFBfZ2Fpbl9pbmQpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEJyZWlmOiBDb2RlYyBtYWluIGZ1bmN0aW9uIA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitpbnQgQU1SX0VuY19FbmNvZGUoSEFNUkVOQyBoQ29kZWMpDQorew0KKwlXb3JkMzIgaTsNCisJQ29kZXJfU3RhdGUgKmdEYXRhID0gKENvZGVyX1N0YXRlKiloQ29kZWM7DQorCVdvcmQxNiAqc2lnbmFsOw0KKwlXb3JkMTYgcGFja2VkX3NpemUgPSAwOw0KKwlXb3JkMTYgcHJtc1tOQl9CSVRTX01BWF07DQorCVdvcmQxNiBjb2RpbmdfbW9kZSA9IDAsIG5iX2JpdHMsIGFsbG93X2R0eCwgbW9kZSwgcmVzZXRfZmxhZzsNCisJbW9kZSA9IGdEYXRhLT5tb2RlOw0KKwljb2RpbmdfbW9kZSA9IGdEYXRhLT5tb2RlOw0KKwluYl9iaXRzID0gbmJfb2ZfYml0c1ttb2RlXTsNCisJc2lnbmFsID0gKFdvcmQxNiAqKWdEYXRhLT5pbnB1dFN0cmVhbTsNCisJYWxsb3dfZHR4ID0gZ0RhdGEtPmFsbG93X2R0eDsNCisNCisJLyogY2hlY2sgZm9yIGhvbWluZyBmcmFtZSAqLw0KKwlyZXNldF9mbGFnID0gZW5jb2Rlcl9ob21pbmdfZnJhbWVfdGVzdChzaWduYWwpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgTF9GUkFNRTE2azsgaSsrKSAgIC8qIERlbGV0ZSB0aGUgMiBMU0JzICgxNC1iaXQgaW5wdXQpICovDQorCXsNCisJCSooc2lnbmFsICsgaSkgPSAoV29yZDE2KSAoKihzaWduYWwgKyBpKSAmIDB4ZmZmQyk7DQorCX0NCisNCisJY29kZXIoJmNvZGluZ19tb2RlLCBzaWduYWwsIHBybXMsICZuYl9iaXRzLCBnRGF0YSwgYWxsb3dfZHR4KTsNCisJcGFja2VkX3NpemUgPSBQYWNrQml0cyhwcm1zLCBjb2RpbmdfbW9kZSwgbW9kZSwgZ0RhdGEpOw0KKwlpZiAocmVzZXRfZmxhZyAhPSAwKQ0KKwl7DQorCQlSZXNldF9lbmNvZGVyKGdEYXRhLCAxKTsNCisJfQ0KKwlyZXR1cm4gcGFja2VkX3NpemU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKkJyaWVmOiBDb2RlYyBBUEkgZnVuY3Rpb24gLS0tIEluaXRpYWxpemUgdGhlIGNvZGVjIGFuZCByZXR1cm4gYSBjb2RlYyBoYW5kbGUNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1ZPX1UzMiBWT19BUEkgdm9BTVJXQl9Jbml0KFZPX0hBTkRMRSAqIHBoQ29kZWMsICAgICAgICAgICAgICAgICAgIC8qIG86IHRoZSBhdWRpbyBjb2RlYyBoYW5kbGUgKi8NCisJCQkJCQkgICBWT19BVURJT19DT0RJTkdUWVBFIHZUeXBlLCAgICAgICAgICAgICAvKiBpOiBDb2RlYyBUeXBlIElEICovDQorCQkJCQkJICAgVk9fQ09ERUNfSU5JVF9VU0VSREFUQSAqIHBVc2VyRGF0YSAgICAgLyogaTogaW5pdCBQYXJhbWV0ZXJzICovDQorCQkJCQkJICAgKQ0KK3sNCisJQ29kZXJfU3RhdGUgKnN0Ow0KKwlGcmFtZVN0cmVhbSAqc3RyZWFtOw0KKyNpZmRlZiBVU0VfREVBVUxUX01FTQ0KKwlWT19NRU1fT1BFUkFUT1Igdm9NZW1vcHJhdG9yOw0KKyNlbmRpZg0KKwlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsNCisJaW50IGludGVyTWVtID0gMDsNCisNCisJaWYocFVzZXJEYXRhID09IE5VTEwgfHwgcFVzZXJEYXRhLT5tZW1mbGFnICE9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1IgfHwgcFVzZXJEYXRhLT5tZW1EYXRhID09IE5VTEwgKQ0KKwl7DQorI2lmZGVmIFVTRV9ERUFVTFRfTUVNDQorCQl2b01lbW9wcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsNCisJCXZvTWVtb3ByYXRvci5Db3B5ID0gY21uTWVtQ29weTsNCisJCXZvTWVtb3ByYXRvci5GcmVlID0gY21uTWVtRnJlZTsNCisJCXZvTWVtb3ByYXRvci5TZXQgPSBjbW5NZW1TZXQ7DQorCQl2b01lbW9wcmF0b3IuQ2hlY2sgPSBjbW5NZW1DaGVjazsNCisJCWludGVyTWVtID0gMTsNCisJCXBNZW1PUCA9ICZ2b01lbW9wcmF0b3I7DQorI2Vsc2UNCisJCSpwaENvZGVjID0gTlVMTDsNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorI2VuZGlmDQorCX0NCisJZWxzZQ0KKwl7DQorCQlwTWVtT1AgPSAoVk9fTUVNX09QRVJBVE9SICopcFVzZXJEYXRhLT5tZW1EYXRhOw0KKwl9IA0KKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qDQorCSAqIE1lbW9yeSBhbGxvY2F0aW9uIGZvciBjb2RlciBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisJaWYgKChzdCA9IChDb2Rlcl9TdGF0ZSAqKW1lbV9tYWxsb2MocE1lbU9QLCBzaXplb2YoQ29kZXJfU3RhdGUpLCAzMiwgVk9fSU5ERVhfRU5DX0FNUldCKSkgPT0gTlVMTCkNCisJew0KKwkJcmV0dXJuIFZPX0VSUl9PVVRPRl9NRU1PUlk7DQorCX0NCisNCisJc3QtPnZhZFN0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgDQorCXN0LT5kdHhfZW5jU3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgIA0KKwlzdC0+c2lkX3VwZGF0ZV9jb3VudGVyID0gMzsNCisJc3QtPnNpZF9oYW5kb3Zlcl9kZWJ0ID0gMDsNCisJc3QtPnByZXZfZnQgPSBUWF9TUEVFQ0g7DQorCXN0LT5pbnB1dFN0cmVhbSA9IE5VTEw7DQorCXN0LT5pbnB1dFNpemUgPSAwOw0KKw0KKwkvKiBEZWZhdWx0IHNldHRpbmcgKi8NCisJc3QtPm1vZGUgPSBWT0FNUldCX01EMjM4NTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgcmF0ZSAyMy44NWticHMgKi8NCisJc3QtPmZyYW1lVHlwZSA9IFZPQU1SV0JfUkZDMzI2NzsgICAgICAgICAgICAgICAgICAvKiBmcmFtZSB0eXBlOiBSRkMzMjY3ICovDQorCXN0LT5hbGxvd19kdHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBEVFggbW9kZSAqLw0KKw0KKwlzdC0+b3V0cHV0U3RyZWFtID0gTlVMTDsNCisJc3QtPm91dHB1dFNpemUgPSAwOw0KKw0KKwlzdC0+c3RyZWFtID0gKEZyYW1lU3RyZWFtICopbWVtX21hbGxvYyhwTWVtT1AsIHNpemVvZihGcmFtZVN0cmVhbSksIDMyLCBWT19JTkRFWF9FTkNfQU1SV0IpOw0KKwlpZihzdC0+c3RyZWFtID09IE5VTEwpDQorCQlyZXR1cm4gVk9fRVJSX09VVE9GX01FTU9SWTsNCisNCisJc3QtPnN0cmVhbS0+ZnJhbWVfcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltZW1fbWFsbG9jKHBNZW1PUCwgRnJhbWVfTWF4c2l6ZSwgMzIsIFZPX0lOREVYX0VOQ19BTVJXQik7DQorCWlmKHN0LT5zdHJlYW0tPmZyYW1lX3B0ciA9PSBOVUxMKQ0KKwkJcmV0dXJuICBWT19FUlJfT1VUT0ZfTUVNT1JZOw0KKw0KKwlzdHJlYW0gPSBzdC0+c3RyZWFtOw0KKwl2b0FXQl9Jbml0RnJhbWVCdWZmZXIoc3RyZWFtKTsNCisNCisJd2JfdmFkX2luaXQoJihzdC0+dmFkU3QpLCBwTWVtT1ApOw0KKwlkdHhfZW5jX2luaXQoJihzdC0+ZHR4X2VuY1N0KSwgaXNmX2luaXQsIHBNZW1PUCk7DQorDQorCVJlc2V0X2VuY29kZXIoKHZvaWQgKikgc3QsIDEpOw0KKw0KKwlpZihpbnRlck1lbSkNCisJew0KKwkJc3QtPnZvTWVtb3ByYXRvci5BbGxvYyA9IGNtbk1lbUFsbG9jOw0KKwkJc3QtPnZvTWVtb3ByYXRvci5Db3B5ID0gY21uTWVtQ29weTsNCisJCXN0LT52b01lbW9wcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7DQorCQlzdC0+dm9NZW1vcHJhdG9yLlNldCA9IGNtbk1lbVNldDsNCisJCXN0LT52b01lbW9wcmF0b3IuQ2hlY2sgPSBjbW5NZW1DaGVjazsNCisJCXBNZW1PUCA9ICZzdC0+dm9NZW1vcHJhdG9yOw0KKwl9DQorDQorCXN0LT5wdm9NZW1vcCA9IHBNZW1PUDsNCisNCisJKnBoQ29kZWMgPSAodm9pZCAqKSBzdDsNCisNCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEJyaWVmOiBDb2RlYyBBUEkgZnVuY3Rpb246IElucHV0IFBDTSBkYXRhDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1ZPX1UzMiBWT19BUEkgdm9BTVJXQl9TZXRJbnB1dERhdGEoDQorCQlWT19IQU5ETEUgaENvZGVjLCAgICAgICAgICAgICAgICAgICAvKiBpL286IFRoZSBjb2RlYyBoYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbiAqLw0KKwkJVk9fQ09ERUNCVUZGRVIgKiBwSW5wdXQgICAgICAgICAgICAgLyogICBpOiBUaGUgaW5wdXQgYnVmZmVyIHBhcmFtZXRlciAgKi8NCisJCSkNCit7DQorCUNvZGVyX1N0YXRlICAqZ0RhdGE7DQorCUZyYW1lU3RyZWFtICAqc3RyZWFtOw0KKw0KKwlpZihOVUxMID09IGhDb2RlYykNCisJew0KKwkJcmV0dXJuIFZPX0VSUl9JTlZBTElEX0FSRzsNCisJfQ0KKw0KKwlnRGF0YSA9IChDb2Rlcl9TdGF0ZSAqKWhDb2RlYzsNCisJc3RyZWFtID0gZ0RhdGEtPnN0cmVhbTsNCisNCisJaWYoTlVMTCA9PSBwSW5wdXQgfHwgTlVMTCA9PSBwSW5wdXQtPkJ1ZmZlciB8fCAwID4gcElucHV0LT5MZW5ndGgpDQorCXsNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCX0NCisNCisJc3RyZWFtLT5zZXRfcHRyICAgID0gcElucHV0LT5CdWZmZXI7DQorCXN0cmVhbS0+c2V0X2xlbiAgICA9IHBJbnB1dC0+TGVuZ3RoOw0KKwlzdHJlYW0tPmZyYW1lX3B0ciAgPSBzdHJlYW0tPmZyYW1lX3B0cl9iazsNCisJc3RyZWFtLT51c2VkX2xlbiAgID0gMDsNCisNCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiBCcmllZjogQ29kZWMgQVBJIGZ1bmN0aW9uOiBHZXQgdGhlIGNvbXByZXNzaW9uIGF1ZGlvIGRhdGEgZnJhbWUgYnkgZnJhbWUNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1ZPX1UzMiBWT19BUEkgdm9BTVJXQl9HZXRPdXRwdXREYXRhKA0KKwkJVk9fSEFORExFIGhDb2RlYywgICAgICAgICAgICAgICAgICAgIC8qIGk6IFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbiovDQorCQlWT19DT0RFQ0JVRkZFUiAqIHBPdXRwdXQsICAgICAgICAgICAgLyogbzogVGhlIG91dHB1dCBhdWRpbyBkYXRhICovDQorCQlWT19BVURJT19PVVRQVVRJTkZPICogcEF1ZGlvRm9ybWF0ICAgLyogbzogVGhlIGVuY29kZXIgbW9kdWxlIGZpbGxlZCBhdWRpbyBmb3JtYXQgYW5kIHVzZWQgdGhlIGlucHV0IHNpemUqLw0KKwkJKQ0KK3sNCisJQ29kZXJfU3RhdGUqIGdEYXRhID0gKENvZGVyX1N0YXRlKiloQ29kZWM7DQorCVZPX01FTV9PUEVSQVRPUiAgKnBNZW1PUDsNCisJRnJhbWVTdHJlYW0gICpzdHJlYW0gPSAoRnJhbWVTdHJlYW0gKilnRGF0YS0+c3RyZWFtOw0KKwlwTWVtT1AgPSAoVk9fTUVNX09QRVJBVE9SICAqKWdEYXRhLT5wdm9NZW1vcDsNCisNCisJaWYoc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW4gIDwgRnJhbWVfTWF4Qnl0ZSkgICAgICAgICAvKiBjaGVjayB0aGUgd29yayBidWZmZXIgbGVuICovDQorCXsNCisJCXN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4gPSBzdHJlYW0tPmZyYW1lYnVmZmVyX2xlbjsNCisJCWlmKHN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4pDQorCQl7DQorCQkJcE1lbU9QLT5Db3B5KFZPX0lOREVYX0VOQ19BTVJXQiwgc3RyZWFtLT5mcmFtZV9wdHJfYmsgLCBzdHJlYW0tPmZyYW1lX3B0ciAsIHN0cmVhbS0+ZnJhbWVfc3RvcmVsZW4pOw0KKwkJfQ0KKwkJaWYoc3RyZWFtLT5zZXRfbGVuID4gMCkNCisJCXsNCisJCQl2b0FXQl9VcGRhdGVGcmFtZUJ1ZmZlcihzdHJlYW0sIHBNZW1PUCk7DQorCQl9DQorCQlpZihzdHJlYW0tPmZyYW1lYnVmZmVyX2xlbiA8IEZyYW1lX01heEJ5dGUpDQorCQl7DQorCQkJaWYocEF1ZGlvRm9ybWF0KQ0KKwkJCQlwQXVkaW9Gb3JtYXQtPklucHV0VXNlZCA9IHN0cmVhbS0+dXNlZF9sZW47DQorCQkJcmV0dXJuIFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEw7DQorCQl9DQorCX0NCisNCisJZ0RhdGEtPmlucHV0U3RyZWFtID0gc3RyZWFtLT5mcmFtZV9wdHI7DQorCWdEYXRhLT5vdXRwdXRTdHJlYW0gPSAodW5zaWduZWQgc2hvcnQqKXBPdXRwdXQtPkJ1ZmZlcjsNCisNCisJZ0RhdGEtPm91dHB1dFNpemUgPSBBTVJfRW5jX0VuY29kZShnRGF0YSk7ICAgICAgICAgLyogZW5jb2RlciBtYWluIGZ1bmN0aW9uICovDQorDQorCXBPdXRwdXQtPkxlbmd0aCA9IGdEYXRhLT5vdXRwdXRTaXplOyAgICAgICAgICAgICAgIC8qIGdldCB0aGUgb3V0cHV0IGJ1ZmZlciBsZW5ndGggKi8NCisJc3RyZWFtLT5mcmFtZV9wdHIgKz0gNjQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRoZSB3b3JrIGJ1ZmZlciBwdHIgKi8NCisJc3RyZWFtLT5mcmFtZWJ1ZmZlcl9sZW4gIC09IDY0MDsNCisNCisJaWYocEF1ZGlvRm9ybWF0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIG91dHB1dCBhdWRpbyBpbmZvcm1hdGlvbiAqLw0KKwl7DQorCQlwQXVkaW9Gb3JtYXQtPkZvcm1hdC5DaGFubmVscyA9IDE7DQorCQlwQXVkaW9Gb3JtYXQtPkZvcm1hdC5TYW1wbGVSYXRlID0gODAwMDsNCisJCXBBdWRpb0Zvcm1hdC0+Rm9ybWF0LlNhbXBsZUJpdHMgPSAxNjsJDQorCQlwQXVkaW9Gb3JtYXQtPklucHV0VXNlZCA9IHN0cmVhbS0+dXNlZF9sZW47DQorCX0NCisJcmV0dXJuIFZPX0VSUl9OT05FOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqIEJyaWVmOiBDb2RlYyBBUEkgZnVuY3Rpb24tLS1zZXQgdGhlIGRhdGEgYnkgc3BlY2lmaWVkIHBhcmFtZXRlciBJRA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KK1ZPX1UzMiBWT19BUEkgdm9BTVJXQl9TZXRQYXJhbSgNCisJCVZPX0hBTkRMRSBoQ29kZWMsICAgLyogaS9vOiBUaGUgQ29kZWMgSGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24gKi8NCisJCVZPX1MzMiB1UGFyYW1JRCwgICAgLyogICBpOiBUaGUgcGFyYW0gSUQgKi8NCisJCVZPX1BUUiBwRGF0YSAgICAgICAgLyogICBpOiBUaGUgcGFyYW0gdmFsdWUgZGVwZW5kIG9uIHRoZSBJRCAqLw0KKwkJKQ0KK3sNCisJQ29kZXJfU3RhdGUqIGdEYXRhID0gKENvZGVyX1N0YXRlKiloQ29kZWM7DQorCUZyYW1lU3RyZWFtICpzdHJlYW0gPSAoRnJhbWVTdHJlYW0gKikoZ0RhdGEtPnN0cmVhbSk7DQorCWludCAqbFZhbHVlID0gKGludCopcERhdGE7DQorDQorCXN3aXRjaCh1UGFyYW1JRCkNCisJew0KKwkJLyogc2V0dGluZyBBTVItV0IgZnJhbWUgdHlwZSovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEU6DQorCQkJaWYoKmxWYWx1ZSA8IFZPQU1SV0JfREVGQVVMVCB8fCAqbFZhbHVlID4gVk9BTVJXQl9SRkMzMjY3KQ0KKwkJCQlyZXR1cm4gVk9fRVJSX1dST05HX1BBUkFNX0lEOyANCisJCQlnRGF0YS0+ZnJhbWVUeXBlID0gKmxWYWx1ZTsNCisJCQlicmVhazsNCisJCS8qIHNldHRpbmcgQU1SLVdCIGJpdCByYXRlICovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9NT0RFOg0KKwkJCXsNCisJCQkJaWYoKmxWYWx1ZSA8IFZPQU1SV0JfTUQ2NiB8fCAqbFZhbHVlID4gVk9BTVJXQl9NRDIzODUpDQorCQkJCQlyZXR1cm4gVk9fRVJSX1dST05HX1BBUkFNX0lEOyANCisJCQkJZ0RhdGEtPm1vZGUgPSAqbFZhbHVlOw0KKwkJCX0NCisJCQlicmVhazsNCisJCS8qIGVuYWJsZSBvciBkaXNhYmxlIERUWCBtb2RlICovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9EVFg6DQorCQkJZ0RhdGEtPmFsbG93X2R0eCA9IChXb3JkMTYpKCpsVmFsdWUpOw0KKwkJCWJyZWFrOw0KKw0KKwkJY2FzZSBWT19QSURfQ09NTU9OX0hFQUREQVRBOg0KKwkJCWJyZWFrOw0KKyAgICAgICAgLyogZmx1c2ggdGhlIHdvcmsgYnVmZmVyICovDQorCQljYXNlIFZPX1BJRF9DT01NT05fRkxVU0g6DQorCQkJc3RyZWFtLT5zZXRfcHRyID0gTlVMTDsNCisJCQlzdHJlYW0tPmZyYW1lX3N0b3JlbGVuID0gMDsNCisJCQlzdHJlYW0tPmZyYW1lYnVmZmVyX2xlbiA9IDA7DQorCQkJc3RyZWFtLT5zZXRfbGVuID0gMDsNCisJCQlicmVhazsNCisNCisJCWRlZmF1bHQ6DQorCQkJcmV0dXJuIFZPX0VSUl9XUk9OR19QQVJBTV9JRDsNCisJfQ0KKwlyZXR1cm4gVk9fRVJSX05PTkU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqQnJpZWY6IENvZGVjIEFQSSBmdW5jdGlvbi0tLUdldCB0aGUgZGF0YSBieSBzcGVjaWZpZWQgcGFyYW1ldGVyIElEDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitWT19VMzIgVk9fQVBJIHZvQU1SV0JfR2V0UGFyYW0oDQorCQlWT19IQU5ETEUgaENvZGVjLCAgICAgIC8qIGk6IFRoZSBDb2RlYyBIYW5kbGUgd2hpY2ggd2FzIGNyZWF0ZWQgYnkgSW5pdCBmdW5jdGlvbiAqLw0KKwkJVk9fUzMyIHVQYXJhbUlELCAgICAgICAvKiBpOiBUaGUgcGFyYW0gSUQgKi8NCisJCVZPX1BUUiBwRGF0YSAgICAgICAgICAgLyogbzogVGhlIHBhcmFtIHZhbHVlIGRlcGVuZCBvbiB0aGUgSUQgKi8NCisJCSkNCit7DQorCWludCAgICB0ZW1wOw0KKwlDb2Rlcl9TdGF0ZSogZ0RhdGEgPSAoQ29kZXJfU3RhdGUqKWhDb2RlYzsNCisNCisJaWYgKGdEYXRhPT1OVUxMKSANCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCXN3aXRjaCh1UGFyYW1JRCkNCisJew0KKwkJLyogb3V0cHV0IGF1ZGlvIGZvcm1hdCAqLw0KKwkJY2FzZSBWT19QSURfQU1SV0JfRk9STUFUOg0KKwkJCXsNCisJCQkJVk9fQVVESU9fRk9STUFUKiBmbXQgPSAoVk9fQVVESU9fRk9STUFUKilwRGF0YTsNCisJCQkJZm10LT5DaGFubmVscyAgID0gMTsNCisJCQkJZm10LT5TYW1wbGVSYXRlID0gMTYwMDA7DQorCQkJCWZtdC0+U2FtcGxlQml0cyA9IDE2Ow0KKwkJCQlicmVhazsNCisJCQl9DQorICAgICAgICAvKiBvdXRwdXQgYXVkaW8gY2hhbm5lbCBudW1iZXIgKi8NCisJCWNhc2UgVk9fUElEX0FNUldCX0NIQU5ORUxTOg0KKwkJCXRlbXAgPSAxOw0KKwkJCXBEYXRhID0gKHZvaWQgKikoJnRlbXApOw0KKwkJCWJyZWFrOw0KKyAgICAgICAgLyogb3V0cHV0IGF1ZGlvIHNhbXBsZSByYXRlICovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9TQU1QTEVSQVRFOg0KKwkJCXRlbXAgPSAxNjAwMDsNCisJCQlwRGF0YSA9ICh2b2lkICopKCZ0ZW1wKTsNCisJCQlicmVhazsNCisJCS8qIG91dHB1dCBhdWRpbyBmcmFtZSB0eXBlICovDQorCQljYXNlIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEU6DQorCQkJdGVtcCA9IGdEYXRhLT5mcmFtZVR5cGU7DQorCQkJcERhdGEgPSAodm9pZCAqKSgmdGVtcCk7DQorCQkJYnJlYWs7DQorCQkvKiBvdXRwdXQgYXVkaW8gYml0IHJhdGUgKi8NCisJCWNhc2UgVk9fUElEX0FNUldCX01PREU6DQorCQkJdGVtcCA9IGdEYXRhLT5tb2RlOw0KKwkJCXBEYXRhID0gKHZvaWQgKikoJnRlbXApOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlyZXR1cm4gVk9fRVJSX1dST05HX1BBUkFNX0lEOw0KKwl9DQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogQnJpZWY6IENvZGVjIEFQSSBmdW5jdGlvbi0tLVJlbGVhc2UgdGhlIGNvZGVjIGFmdGVyIGFsbCBlbmNvZGVyIG9wZXJhdGlvbnMgYXJlIGRvbmUNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitWT19VMzIgVk9fQVBJIHZvQU1SV0JfVW5pbml0KFZPX0hBTkRMRSBoQ29kZWMgICAgICAgICAgIC8qIGkvbzogQ29kZWMgaGFuZGxlIHBvaW50ZXIgKi8NCisJCQkJCQkJICkNCit7DQorCUNvZGVyX1N0YXRlKiBnRGF0YSA9IChDb2Rlcl9TdGF0ZSopaENvZGVjOw0KKwlWT19NRU1fT1BFUkFUT1IgKnBNZW1PUDsNCisJcE1lbU9QID0gZ0RhdGEtPnB2b01lbW9wOw0KKw0KKwlpZihoQ29kZWMpDQorCXsNCisJCWlmKGdEYXRhLT5zdHJlYW0pDQorCQl7DQorCQkJaWYoZ0RhdGEtPnN0cmVhbS0+ZnJhbWVfcHRyX2JrKQ0KKwkJCXsNCisJCQkJbWVtX2ZyZWUocE1lbU9QLCBnRGF0YS0+c3RyZWFtLT5mcmFtZV9wdHJfYmssIFZPX0lOREVYX0VOQ19BTVJXQik7DQorCQkJCWdEYXRhLT5zdHJlYW0tPmZyYW1lX3B0cl9iayA9IE5VTEw7DQorCQkJfQ0KKwkJCW1lbV9mcmVlKHBNZW1PUCwgZ0RhdGEtPnN0cmVhbSwgVk9fSU5ERVhfRU5DX0FNUldCKTsNCisJCQlnRGF0YS0+c3RyZWFtID0gTlVMTDsNCisJCX0NCisJCXdiX3ZhZF9leGl0KCYoKChDb2Rlcl9TdGF0ZSAqKSBnRGF0YSktPnZhZFN0KSwgcE1lbU9QKTsNCisJCWR0eF9lbmNfZXhpdCgmKCgoQ29kZXJfU3RhdGUgKikgZ0RhdGEpLT5kdHhfZW5jU3QpLCBwTWVtT1ApOw0KKw0KKwkJbWVtX2ZyZWUocE1lbU9QLCBoQ29kZWMsIFZPX0lOREVYX0VOQ19BTVJXQik7DQorCQloQ29kZWMgPSBOVUxMOw0KKwl9DQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogQnJpZWY6IHZvR2V0QU1SV0JFbmNBUEkgZ2V0cyB0aGUgQVBJIGhhbmRsZSBvZiB0aGUgY29kZWMNCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorVk9fUzMyIFZPX0FQSSB2b0dldEFNUldCRW5jQVBJKA0KKwkJCQkJCQkgICBWT19BVURJT19DT0RFQ0FQSSAqIHBFbmNIYW5kbGUgICAgICAvKiBpL286IENvZGVjIGhhbmRsZSBwb2ludGVyICovDQorCQkJCQkJCSAgICkNCit7DQorCWlmKE5VTEwgPT0gcEVuY0hhbmRsZSkNCisJCXJldHVybiBWT19FUlJfSU5WQUxJRF9BUkc7DQorCXBFbmNIYW5kbGUtPkluaXQgPSB2b0FNUldCX0luaXQ7DQorCXBFbmNIYW5kbGUtPlNldElucHV0RGF0YSA9IHZvQU1SV0JfU2V0SW5wdXREYXRhOw0KKwlwRW5jSGFuZGxlLT5HZXRPdXRwdXREYXRhID0gdm9BTVJXQl9HZXRPdXRwdXREYXRhOw0KKwlwRW5jSGFuZGxlLT5TZXRQYXJhbSA9IHZvQU1SV0JfU2V0UGFyYW07DQorCXBFbmNIYW5kbGUtPkdldFBhcmFtID0gdm9BTVJXQl9HZXRQYXJhbTsNCisJcEVuY0hhbmRsZS0+VW5pbml0ID0gdm9BTVJXQl9VbmluaXQ7DQorDQorCXJldHVybiBWT19FUlJfTk9ORTsNCit9DQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZg0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9pY2VmYWMuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9pY2VmYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdkNzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b2ljZWZhYy5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgIEZpbGU6IHZvaWNlZmFjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgIERlc2NyaXB0aW9uOiBGaW5kIHRoZSB2b2ljaW5nIGZhY3RvcnMgKDEgPSB2b2ljZSB0byAtMSA9IHVudm9pY2VkKSAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorDQorV29yZDE2IHZvaWNlX2ZhY3RvciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIFExNSAgIDogZmFjdG9yICgtMT11bnZvaWNlZCB0byAxPXZvaWNlZCkgKi8NCisJCVdvcmQxNiBleGNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFFfZXhjIDogcGl0Y2ggZXhjaXRhdGlvbiAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBRX2V4YywgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICAgIDogZXhjIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBnYWluX3BpdCwgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExNCAgIDogZ2FpbiBvZiBwaXRjaCAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBjb2RlW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFE5ICAgIDogRml4ZWQgY29kZWJvb2sgZXhjaXRhdGlvbiAgICAgICAgKi8NCisJCVdvcmQxNiBnYWluX2NvZGUsICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFEwICAgIDogZ2FpbiBvZiBjb2RlICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBMX3N1YmZyICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICAgIDogc3ViZnJhbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiB0bXAsIGV4cCwgZW5lcjEsIGV4cDEsIGVuZXIyLCBleHAyOw0KKwlXb3JkMzIgaSwgTF90bXA7DQorDQorI2lmZGVmIEFTTV9PUFQgICAgICAgICAgICAgICAvKiBhc20gb3B0aW1pemF0aW9uIGJyYW5jaCAqLw0KKwllbmVyMSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyX2FzbShleGMsIGV4YywgTF9zdWJmciwgJmV4cDEpKTsNCisjZWxzZQ0KKwllbmVyMSA9IGV4dHJhY3RfaChEb3RfcHJvZHVjdDEyKGV4YywgZXhjLCBMX3N1YmZyLCAmZXhwMSkpOw0KKyNlbmRpZg0KKwlleHAxID0gZXhwMSAtIChRX2V4YyArIFFfZXhjKTsNCisJTF90bXAgPSB2b19MX211bHQoZ2Fpbl9waXQsIGdhaW5fcGl0KTsNCisJZXhwID0gbm9ybV9sKExfdG1wKTsNCisJdG1wID0gZXh0cmFjdF9oKExfdG1wIDw8IGV4cCk7DQorCWVuZXIxID0gdm9fbXVsdChlbmVyMSwgdG1wKTsNCisJZXhwMSA9IGV4cDEgLSBleHAgLSAxMDsgICAgICAgIC8qIDEwIC0+IGdhaW5fcGl0IFExNCB0byBROSAqLw0KKw0KKyNpZmRlZiBBU01fT1BUICAgICAgICAgICAgICAgIC8qIGFzbSBvcHRpbWl6YXRpb24gYnJhbmNoICovDQorCWVuZXIyID0gZXh0cmFjdF9oKERvdF9wcm9kdWN0MTJfYXNtKGNvZGUsIGNvZGUsIExfc3ViZnIsICZleHAyKSk7DQorI2Vsc2UNCisJZW5lcjIgPSBleHRyYWN0X2goRG90X3Byb2R1Y3QxMihjb2RlLCBjb2RlLCBMX3N1YmZyLCAmZXhwMikpOw0KKyNlbmRpZg0KKw0KKwlleHAgPSBub3JtX3MoZ2Fpbl9jb2RlKTsNCisJdG1wID0gZ2Fpbl9jb2RlIDw8IGV4cDsNCisJdG1wID0gdm9fbXVsdCh0bXAsIHRtcCk7DQorCWVuZXIyID0gdm9fbXVsdChlbmVyMiwgdG1wKTsNCisJZXhwMiA9IGV4cDIgLSAoZXhwICsgZXhwKTsNCisNCisJaSA9IGV4cDEgLSBleHAyOw0KKw0KKwlpZiAoaSA+PSAwKQ0KKwl7DQorCQllbmVyMSA9IGVuZXIxID4+IDE7DQorCQllbmVyMiA9IGVuZXIyID4+IChpICsgMSk7DQorCX0gZWxzZQ0KKwl7DQorCQllbmVyMSA9IGVuZXIxID4+ICgxIC0gaSk7DQorCQllbmVyMiA9IGVuZXIyID4+IDE7DQorCX0NCisNCisJdG1wID0gdm9fc3ViKGVuZXIxLCBlbmVyMik7DQorCWVuZXIxID0gYWRkMShhZGQxKGVuZXIxLCBlbmVyMiksIDEpOw0KKw0KKwlpZiAodG1wID49IDApDQorCXsNCisJCXRtcCA9IGRpdl9zKHRtcCwgZW5lcjEpOw0KKwl9IGVsc2UNCisJew0KKwkJdG1wID0gdm9fbmVnYXRlKGRpdl9zKHZvX25lZ2F0ZSh0bXApLCBlbmVyMSkpOw0KKwl9DQorDQorCXJldHVybiAodG1wKTsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEyNjg1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvd2JfdmFkLmMKQEAgLTAsMCArMSw4MDggQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKiAgICAgIEZpbGU6IHdiX3ZhZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgIERlc2NyaXB0aW9uOiBWb2ljZSBBY3Rpdml0eSBEZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSAiY25zdC5oIg0KKyNpbmNsdWRlICJ3Yl92YWQuaCINCisjaW5jbHVkZSAidHlwZWRlZi5oIg0KKyNpbmNsdWRlICJiYXNpY19vcC5oIg0KKyNpbmNsdWRlICJtYXRoX29wLmgiDQorI2luY2x1ZGUgIndiX3ZhZF9jLmgiDQorI2luY2x1ZGUgIm1lbV9hbGlnbi5oIg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICBDYWxjdWxhdGUgTG9nMiBhbmQgc2NhbGUgdGhlIHNpZ25hbDoNCisqDQorKiAgICBpbG9nMihXb3JkMzIgaW4pID0gLTEwMjQqbG9nMTAoaW4gKiAyXi0zMSkvbG9nMTAoMiksIHdoZXJlIGluID0gWzEsIDJeMzEtMV0NCisqDQorKiAgaW5wdXQgICBvdXRwdXQNCisqICAzMjc2OCAgIDE2Mzg0DQorKiAgMSAgICAgICAzMTc0NA0KKyoNCisqIFdoZW4gaW5wdXQgaXMgaW4gdGhlIHJhbmdlIG9mIFsxLDJeMTZdLCBtYXggZXJyb3IgaXMgMC4wMzgwJS4NCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIFdvcmQxNiBpbG9nMiggICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybjogb3V0cHV0IHZhbHVlIG9mIHRoZSBsb2cyICovDQorCQlXb3JkMTYgbWFudCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGk6IHZhbHVlIHRvIGJlIGNvbnZlcnRlZCAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IGV4LCBleDIsIHJlczsNCisJV29yZDMyIGksIGxfdGVtcDsNCisNCisJaWYgKG1hbnQgPD0gMCkNCisJew0KKwkJbWFudCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWV4ID0gbm9ybV9zKG1hbnQpOw0KKwltYW50ID0gbWFudCA8PCBleDsNCisNCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykNCisJCW1hbnQgPSB2b19tdWx0KG1hbnQsIG1hbnQpOw0KKwlsX3RlbXAgPSB2b19MX211bHQobWFudCwgbWFudCk7DQorDQorCWV4MiA9IG5vcm1fbChsX3RlbXApOw0KKwltYW50ID0gZXh0cmFjdF9oKGxfdGVtcCA8PCBleDIpOw0KKw0KKwlyZXMgPSAoZXggKyAxNikgPDwgMTA7DQorCXJlcyA9IGFkZDEocmVzLCAoZXgyIDw8IDYpKTsNCisJcmVzID0gdm9fc3ViKGFkZDEocmVzLCAxMjcpLCAobWFudCA+PiA4KSk7DQorCXJldHVybiAocmVzKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiAgICAgOiBmaWx0ZXI1DQorKiAgICAgUHVycG9zZSAgICAgIDogRmlmdGgtb3JkZXIgaGFsZi1iYW5kIGxvd3Bhc3MvaGlnaHBhc3MgZmlsdGVyIHBhaXIgd2l0aA0KKyogICAgICAgICAgICAgICAgICAgIGRlY2ltYXRpb24uDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIHZvaWQgZmlsdGVyNSgNCisJCVdvcmQxNiAqIGluMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogaW5wdXQgdmFsdWVzOyBvdXRwdXQgbG93LXBhc3MgcGFydCAgKi8NCisJCVdvcmQxNiAqIGluMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogaW5wdXQgdmFsdWVzOyBvdXRwdXQgaGlnaC1wYXNzIHBhcnQgKi8NCisJCVdvcmQxNiBkYXRhW10gICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogZmlsdGVyIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyOw0KKw0KKwl0ZW1wMCA9IHZvX3N1YigqaW4wLCB2b19tdWx0KENPRUZGNV8xLCBkYXRhWzBdKSk7DQorCXRlbXAxID0gYWRkMShkYXRhWzBdLCB2b19tdWx0KENPRUZGNV8xLCB0ZW1wMCkpOw0KKwlkYXRhWzBdID0gdGVtcDA7ICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwl0ZW1wMCA9IHZvX3N1YigqaW4xLCB2b19tdWx0KENPRUZGNV8yLCBkYXRhWzFdKSk7DQorCXRlbXAyID0gYWRkMShkYXRhWzFdLCB2b19tdWx0KENPRUZGNV8yLCB0ZW1wMCkpOw0KKwlkYXRhWzFdID0gdGVtcDA7ICAgICAgICAgICAgICAgICAgICAgICANCisNCisJKmluMCA9IGV4dHJhY3RfaCgodm9fTF9hZGQodGVtcDEsIHRlbXAyKSA8PCAxNSkpOyAgIA0KKwkqaW4xID0gZXh0cmFjdF9oKCh2b19MX3N1Yih0ZW1wMSwgdGVtcDIpIDw8IDE1KSk7ICANCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiAgICAgOiBmaWx0ZXIzDQorKiAgICAgUHVycG9zZSAgICAgIDogVGhpcmQtb3JkZXIgaGFsZi1iYW5kIGxvd3Bhc3MvaGlnaHBhc3MgZmlsdGVyIHBhaXIgd2l0aA0KKyogICAgICAgICAgICAgICAgICAgIGRlY2ltYXRpb24uDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIHZvaWQgZmlsdGVyMygNCisJCVdvcmQxNiAqIGluMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogaW5wdXQgdmFsdWVzOyBvdXRwdXQgbG93LXBhc3MgcGFydCAgKi8NCisJCVdvcmQxNiAqIGluMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogaW5wdXQgdmFsdWVzOyBvdXRwdXQgaGlnaC1wYXNzIHBhcnQgKi8NCisJCVdvcmQxNiAqIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogZmlsdGVyIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQxNiB0ZW1wMSwgdGVtcDI7DQorDQorCXRlbXAxID0gdm9fc3ViKCppbjEsIHZvX211bHQoQ09FRkYzLCAqZGF0YSkpOw0KKwl0ZW1wMiA9IGFkZDEoKmRhdGEsIHZvX211bHQoQ09FRkYzLCB0ZW1wMSkpOw0KKwkqZGF0YSA9IHRlbXAxOyAgICAgICAgICAgICAgICAgICAgICAgIA0KKw0KKwkqaW4xID0gZXh0cmFjdF9oKCh2b19MX3N1YigqaW4wLCB0ZW1wMikgPDwgMTUpKTsgICANCisJKmluMCA9IGV4dHJhY3RfaCgodm9fTF9hZGQoKmluMCwgdGVtcDIpIDw8IDE1KSk7ICAgDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICA6IGxldmVsX2NhbGN1bGF0aW9uDQorKiAgICAgUHVycG9zZSAgICA6IENhbGN1bGF0ZSBzaWduYWwgbGV2ZWwgaW4gYSBzdWItYmFuZC4gTGV2ZWwgaXMgY2FsY3VsYXRlZA0KKyogICAgICAgICAgICAgICAgICBieSBzdW1taW5nIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgaW5wdXQgZGF0YS4NCisqDQorKiAgICAgICAgICAgICAgICAgIFNpZ25hbCBsZXZlbCBjYWxjdWxhdGVkIGZyb20gb2YgdGhlIGVuZCBvZiB0aGUgZnJhbWUNCisqICAgICAgICAgICAgICAgICAgKGRhdGFbY291bnQxIC0gY291bnQyXSkgaXMgc3RvcmVkIHRvICgqc3ViX2xldmVsKQ0KKyogICAgICAgICAgICAgICAgICBhbmQgYWRkZWQgdG8gdGhlIGxldmVsIG9mIHRoZSBuZXh0IGZyYW1lLg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIFdvcmQxNiBsZXZlbF9jYWxjdWxhdGlvbiggICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuOiBzaWduYWwgbGV2ZWwgKi8NCisJCVdvcmQxNiBkYXRhW10sICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogc2lnbmFsIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgKiBzdWJfbGV2ZWwsICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IGxldmVsIGNhbGN1bGF0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgZnJhbWUqLw0KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvICAgOiBsZXZlbCBvZiBzaWduYWwgY2FsY3VsYXRlZCBmcm9tIHRoZSBsYXN0ICAgICAgICAgKi8NCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgKGNvdW50MiAtIGNvdW50MSkgc2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgICovDQorCQlXb3JkMTYgY291bnQxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IG51bWJlciBvZiBzYW1wbGVzIHRvIGJlIGNvdW50ZWQgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGNvdW50MiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBudW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBjb3VudGVkICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpbmRfbSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogc3RlcCBzaXplIGZvciB0aGUgaW5kZXggb2YgdGhlIGRhdGEgYnVmZmVyICAgICAgICovDQorCQlXb3JkMTYgaW5kX2EsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IHNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBzY2FsaW5nIGZvciB0aGUgbGV2ZWwgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLCBsX3RlbXAxLCBsX3RlbXAyOw0KKwlXb3JkMTYgbGV2ZWw7DQorDQorCWxfdGVtcDEgPSAwTDsgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKwlmb3IgKGkgPSBjb3VudDE7IGkgPCBjb3VudDI7IGkrKykNCisJew0KKwkJbF90ZW1wMSArPSAoYWJzX3MoZGF0YVtpbmRfbSAqIGkgKyBpbmRfYV0pPDwxKTsNCisJfQ0KKw0KKwlsX3RlbXAyID0gdm9fTF9hZGQobF90ZW1wMSwgTF9zaGwoKnN1Yl9sZXZlbCwgMTYgLSBzY2FsZSkpOw0KKwkqc3ViX2xldmVsID0gZXh0cmFjdF9oKExfc2hsKGxfdGVtcDEsIHNjYWxlKSk7ICAgICAgDQorDQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDE7IGkrKykNCisJew0KKwkJbF90ZW1wMiArPSAoYWJzX3MoZGF0YVtpbmRfbSAqIGkgKyBpbmRfYV0pPDwxKTsNCisJfQ0KKwlsZXZlbCA9IGV4dHJhY3RfaChMX3NobDIobF90ZW1wMiwgc2NhbGUpKTsNCisNCisJcmV0dXJuIGxldmVsOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogICAgIEZ1bmN0aW9uICAgICA6IGZpbHRlcl9iYW5rDQorKiAgICAgUHVycG9zZSAgICAgIDogRGl2aWRlIGlucHV0IHNpZ25hbCBpbnRvIGJhbmRzIGFuZCBjYWxjdWxhdGUgbGV2ZWwgb2YNCisqICAgICAgICAgICAgICAgICAgICB0aGUgc2lnbmFsIGluIGVhY2ggYmFuZA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyB2b2lkIGZpbHRlcl9iYW5rKA0KKwkJVmFkVmFycyAqIHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGluW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBpbnB1dCBmcmFtZSAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxldmVsW10gICAgICAgICAgICAgICAgICAgICAgICAvKiBvICAgOiBzaWduYWwgbGV2ZWxzIGF0IGVhY2ggYmFuZCAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQxNiB0bXBfYnVmW0ZSQU1FX0xFTl07DQorDQorCS8qIHNoaWZ0IGlucHV0IDEgYml0IGRvd24gZm9yIHNhZmUgc2NhbGluZyAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTEVOOyBpKyspDQorCXsNCisJCXRtcF9idWZbaV0gPSBpbltpXSA+PiAxOyAgICAgICANCisJfQ0KKw0KKwkvKiBydW4gdGhlIGZpbHRlciBiYW5rICovDQorCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykNCisJew0KKwkJZmlsdGVyNSgmdG1wX2J1ZlsyICogaV0sICZ0bXBfYnVmWzIgKiBpICsgMV0sIHN0LT5hX2RhdGE1WzBdKTsNCisJfQ0KKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykNCisJew0KKwkJZmlsdGVyNSgmdG1wX2J1Zls0ICogaV0sICZ0bXBfYnVmWzQgKiBpICsgMl0sIHN0LT5hX2RhdGE1WzFdKTsNCisJCWZpbHRlcjUoJnRtcF9idWZbNCAqIGkgKyAxXSwgJnRtcF9idWZbNCAqIGkgKyAzXSwgc3QtPmFfZGF0YTVbMl0pOw0KKwl9DQorCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQ0KKwl7DQorCQlmaWx0ZXI1KCZ0bXBfYnVmWzggKiBpXSwgJnRtcF9idWZbOCAqIGkgKyA0XSwgc3QtPmFfZGF0YTVbM10pOw0KKwkJZmlsdGVyNSgmdG1wX2J1Zls4ICogaSArIDJdLCAmdG1wX2J1Zls4ICogaSArIDZdLCBzdC0+YV9kYXRhNVs0XSk7DQorCQlmaWx0ZXIzKCZ0bXBfYnVmWzggKiBpICsgM10sICZ0bXBfYnVmWzggKiBpICsgN10sICZzdC0+YV9kYXRhM1swXSk7DQorCX0NCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspDQorCXsNCisJCWZpbHRlcjMoJnRtcF9idWZbMTYgKiBpICsgMF0sICZ0bXBfYnVmWzE2ICogaSArIDhdLCAmc3QtPmFfZGF0YTNbMV0pOw0KKwkJZmlsdGVyMygmdG1wX2J1ZlsxNiAqIGkgKyA0XSwgJnRtcF9idWZbMTYgKiBpICsgMTJdLCAmc3QtPmFfZGF0YTNbMl0pOw0KKwkJZmlsdGVyMygmdG1wX2J1ZlsxNiAqIGkgKyA2XSwgJnRtcF9idWZbMTYgKiBpICsgMTRdLCAmc3QtPmFfZGF0YTNbM10pOw0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspDQorCXsNCisJCWZpbHRlcjMoJnRtcF9idWZbMzIgKiBpICsgMF0sICZ0bXBfYnVmWzMyICogaSArIDE2XSwgJnN0LT5hX2RhdGEzWzRdKTsNCisJCWZpbHRlcjMoJnRtcF9idWZbMzIgKiBpICsgOF0sICZ0bXBfYnVmWzMyICogaSArIDI0XSwgJnN0LT5hX2RhdGEzWzVdKTsNCisJfQ0KKw0KKwkvKiBjYWxjdWxhdGUgbGV2ZWxzIGluIGVhY2ggZnJlcXVlbmN5IGJhbmQgKi8NCisNCisJLyogNDgwMCAtIDY0MDAgSHogKi8NCisJbGV2ZWxbMTFdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMTFdLCAxNiwgNjQsIDQsIDEsIDE0KTsgICANCisJLyogNDAwMCAtIDQ4MDAgSHogKi8NCisJbGV2ZWxbMTBdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMTBdLCA4LCAzMiwgOCwgNywgMTUpOyAgIA0KKwkvKiAzMjAwIC0gNDAwMCBIeiAqLw0KKwlsZXZlbFs5XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzldLDgsIDMyLCA4LCAzLCAxNSk7ICAgDQorCS8qIDI0MDAgLSAzMjAwIEh6ICovDQorCWxldmVsWzhdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbOF0sOCwgMzIsIDgsIDIsIDE1KTsgICANCisJLyogMjAwMCAtIDI0MDAgSHogKi8NCisJbGV2ZWxbN10gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFs3XSw0LCAxNiwgMTYsIDE0LCAxNik7ICAgICAgIA0KKwkvKiAxNjAwIC0gMjAwMCBIeiAqLw0KKwlsZXZlbFs2XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzZdLDQsIDE2LCAxNiwgNiwgMTYpOyAgICAgICAgDQorCS8qIDEyMDAgLSAxNjAwIEh6ICovDQorCWxldmVsWzVdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbNV0sNCwgMTYsIDE2LCA0LCAxNik7ICAgICAgICANCisJLyogODAwIC0gMTIwMCBIeiAqLw0KKwlsZXZlbFs0XSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzRdLDQsIDE2LCAxNiwgMTIsIDE2KTsgICAgICAgDQorCS8qIDYwMCAtIDgwMCBIeiAqLw0KKwlsZXZlbFszXSA9IGxldmVsX2NhbGN1bGF0aW9uKHRtcF9idWYsICZzdC0+c3ViX2xldmVsWzNdLDIsIDgsIDMyLCA4LCAxNyk7IA0KKwkvKiA0MDAgLSA2MDAgSHogKi8NCisJbGV2ZWxbMl0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFsyXSwyLCA4LCAzMiwgMjQsIDE3KTsgICAgICAgIA0KKwkvKiAyMDAgLSA0MDAgSHogKi8NCisJbGV2ZWxbMV0gPSBsZXZlbF9jYWxjdWxhdGlvbih0bXBfYnVmLCAmc3QtPnN1Yl9sZXZlbFsxXSwyLCA4LCAzMiwgMTYsIDE3KTsgICAgICAgIA0KKwkvKiAwIC0gMjAwIEh6ICovDQorCWxldmVsWzBdID0gbGV2ZWxfY2FsY3VsYXRpb24odG1wX2J1ZiwgJnN0LT5zdWJfbGV2ZWxbMF0sMiwgOCwgMzIsIDAsIDE3KTsgDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICA6IHVwZGF0ZV9jbnRybA0KKyogICAgIFB1cnBvc2UgICAgOiBDb250cm9sIHVwZGF0ZSBvZiB0aGUgYmFja2dyb3VuZCBub2lzZSBlc3RpbWF0ZS4NCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitzdGF0aWMgdm9pZCB1cGRhdGVfY250cmwoDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsZXZlbFtdICAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogc3ViLWJhbmQgbGV2ZWxzIG9mIHRoZSBpbnB1dCBmcmFtZSAqLw0KKwkJKQ0KK3sNCisJV29yZDMyIGk7DQorCVdvcmQxNiBudW0sIHRlbXAsIHN0YXRfcmF0LCBleHAsIGRlbm9tOw0KKwlXb3JkMTYgYWxwaGE7DQorDQorCS8qIGlmIGEgdG9uZSBoYXMgYmVlbiBkZXRlY3RlZCBmb3IgYSB3aGlsZSwgaW5pdGlhbGl6ZSBzdGF0X2NvdW50ICovDQorCWlmIChzdWIoKFdvcmQxNikgKHN0LT50b25lX2ZsYWcgJiAweDdjMDApLCAweDdjMDApID09IDApDQorCXsNCisJCXN0LT5zdGF0X2NvdW50ID0gU1RBVF9DT1VOVDsgICAgICANCisJfSBlbHNlDQorCXsNCisJCS8qIGlmIDggbGFzdCB2YWQtZGVjaXNpb25zIGhhdmUgYmVlbiAiMCIsIHJlaW5pdGlhbGl6ZSBzdGF0X2NvdW50ICovDQorCQlpZiAoKHN0LT52YWRyZWcgJiAweDdmODApID09IDApDQorCQl7DQorCQkJc3QtPnN0YXRfY291bnQgPSBTVEFUX0NPVU5UOyAgIA0KKwkJfSBlbHNlDQorCQl7DQorCQkJc3RhdF9yYXQgPSAwOyAgICAgICAgICAgICAgICAgIA0KKwkJCWZvciAoaSA9IDA7IGkgPCBDT01QTEVOOyBpKyspDQorCQkJew0KKwkJCQlpZihsZXZlbFtpXSA+IHN0LT5hdmVfbGV2ZWxbaV0pDQorCQkJCXsNCisJCQkJCW51bSA9IGxldmVsW2ldOyAgICAgICAgDQorCQkJCQlkZW5vbSA9IHN0LT5hdmVfbGV2ZWxbaV07ICAgDQorCQkJCX0gZWxzZQ0KKwkJCQl7DQorCQkJCQludW0gPSBzdC0+YXZlX2xldmVsW2ldOw0KKwkJCQkJZGVub20gPSBsZXZlbFtpXTsgICAgICANCisJCQkJfQ0KKwkJCQkvKiBMaW1pdCBuaW1pbXVtIHZhbHVlIG9mIG51bSBhbmQgZGVub20gdG8gU1RBVF9USFJfTEVWRUwgKi8NCisJCQkJaWYobnVtIDwgU1RBVF9USFJfTEVWRUwpDQorCQkJCXsNCisJCQkJCW51bSA9IFNUQVRfVEhSX0xFVkVMOyAgDQorCQkJCX0NCisJCQkJaWYoZGVub20gPCBTVEFUX1RIUl9MRVZFTCkNCisJCQkJew0KKwkJCQkJZGVub20gPSBTVEFUX1RIUl9MRVZFTDsNCisJCQkJfQ0KKwkJCQlleHAgPSBub3JtX3MoZGVub20pOw0KKwkJCQlkZW5vbSA9IGRlbm9tIDw8IGV4cDsNCisNCisJCQkJLyogc3RhdF9yYXQgPSBudW0vZGVub20gKiA2NCAqLw0KKwkJCQl0ZW1wID0gZGl2X3MobnVtID4+IDEsIGRlbm9tKTsNCisJCQkJc3RhdF9yYXQgPSBhZGQxKHN0YXRfcmF0LCBzaHIodGVtcCwgKDggLSBleHApKSk7DQorCQkJfQ0KKw0KKwkJCS8qIGNvbXBhcmUgc3RhdF9yYXQgd2l0aCBhIHRocmVzaG9sZCBhbmQgdXBkYXRlIHN0YXRfY291bnQgKi8NCisJCQlpZihzdGF0X3JhdCA+IFNUQVRfVEhSKQ0KKwkJCXsNCisJCQkJc3QtPnN0YXRfY291bnQgPSBTVEFUX0NPVU5UOyAgICANCisJCQl9IGVsc2UNCisJCQl7DQorCQkJCWlmICgoc3QtPnZhZHJlZyAmIDB4NDAwMCkgIT0gMCkNCisJCQkJew0KKw0KKwkJCQkJaWYgKHN0LT5zdGF0X2NvdW50ICE9IDApDQorCQkJCQl7DQorCQkJCQkJc3QtPnN0YXRfY291bnQgPSBzdC0+c3RhdF9jb3VudCAtIDE7ICAgICAgIA0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qIFVwZGF0ZSBhdmVyYWdlIGFtcGxpdHVkZSBlc3RpbWF0ZSBmb3Igc3RhdGlvbmFyaXR5IGVzdGltYXRpb24gKi8NCisJYWxwaGEgPSBBTFBIQTQ7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCWlmKHN0LT5zdGF0X2NvdW50ID09IFNUQVRfQ09VTlQpDQorCXsNCisJCWFscGhhID0gMzI3Njc7ICAgICAgICAgICAgICAgICAgICANCisJfSBlbHNlIGlmICgoc3QtPnZhZHJlZyAmIDB4NDAwMCkgPT0gMCkNCisJew0KKwkJYWxwaGEgPSBBTFBIQTU7ICAgICAgICAgICAgICAgICAgIA0KKwl9DQorCWZvciAoaSA9IDA7IGkgPCBDT01QTEVOOyBpKyspDQorCXsNCisJCXN0LT5hdmVfbGV2ZWxbaV0gPSBhZGQxKHN0LT5hdmVfbGV2ZWxbaV0sIHZvX211bHRfcihhbHBoYSwgdm9fc3ViKGxldmVsW2ldLCBzdC0+YXZlX2xldmVsW2ldKSkpOyAgIA0KKwl9DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICAgIDogaGFuZ292ZXJfYWRkaXRpb24NCisqICAgICBQdXJwb3NlICAgICAgOiBBZGQgaGFuZ292ZXIgYWZ0ZXIgc3BlZWNoIGJ1cnN0cw0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBXb3JkMTYgaGFuZ292ZXJfYWRkaXRpb24oICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybjogVkFEX2ZsYWcgaW5kaWNhdGluZyBmaW5hbCBWQUQgZGVjaXNpb24gKi8NCisJCVZhZFZhcnMgKiBzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBsb3dfcG93ZXIsICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogZmxhZyBwb3dlciBvZiB0aGUgaW5wdXQgZnJhbWUgICAgKi8NCisJCVdvcmQxNiBoYW5nX2xlbiwgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogaGFuZ292ZXIgbGVuZ3RoICovDQorCQlXb3JkMTYgYnVyc3RfbGVuICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IG1pbmltdW0gYnVyc3QgbGVuZ3RoIGZvciBoYW5nb3ZlciBhZGRpdGlvbiAqLw0KKwkJKQ0KK3sNCisJLyogaWYgdGhlIGlucHV0IHBvd2VyIChwb3dfc3VtKSBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkLCBjbGVhciBjb3VudGVycyBhbmQgc2V0IFZBRF9mbGFnIHRvICIwIiAgICAgICAgICovDQorCWlmIChsb3dfcG93ZXIgIT0gMCkNCisJew0KKwkJc3QtPmJ1cnN0X2NvdW50ID0gMDsgICAgICAgICAgICAgICANCisJCXN0LT5oYW5nX2NvdW50ID0gMDsgICAgICAgICAgICAgICAgDQorCQlyZXR1cm4gMDsNCisJfQ0KKwkvKiB1cGRhdGUgdGhlIGNvdW50ZXJzIChoYW5nX2NvdW50LCBidXJzdF9jb3VudCkgKi8NCisJaWYgKChzdC0+dmFkcmVnICYgMHg0MDAwKSAhPSAwKQ0KKwl7DQorCQlzdC0+YnVyc3RfY291bnQgPSBzdC0+YnVyc3RfY291bnQgKyAxOyAgICANCisJCWlmKHN0LT5idXJzdF9jb3VudCA+PSBidXJzdF9sZW4pDQorCQl7DQorCQkJc3QtPmhhbmdfY291bnQgPSBoYW5nX2xlbjsgICAgIA0KKwkJfQ0KKwkJcmV0dXJuIDE7DQorCX0gZWxzZQ0KKwl7DQorCQlzdC0+YnVyc3RfY291bnQgPSAwOyAgICAgICAgICAgICAgIA0KKwkJaWYgKHN0LT5oYW5nX2NvdW50ID4gMCkNCisJCXsNCisJCQlzdC0+aGFuZ19jb3VudCA9IHN0LT5oYW5nX2NvdW50IC0gMTsgICAgDQorCQkJcmV0dXJuIDE7DQorCQl9DQorCX0NCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgICAgRnVuY3Rpb24gICA6IG5vaXNlX2VzdGltYXRlX3VwZGF0ZQ0KKyogICAgIFB1cnBvc2UgICAgOiBVcGRhdGUgb2YgYmFja2dyb3VuZCBub2lzZSBlc3RpbWF0ZQ0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyB2b2lkIG5vaXNlX2VzdGltYXRlX3VwZGF0ZSgNCisJCVZhZFZhcnMgKiBzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxldmVsW10gICAgICAgICAgICAgICAgICAgICAgICAvKiBpICAgOiBzdWItYmFuZCBsZXZlbHMgb2YgdGhlIGlucHV0IGZyYW1lICovDQorCQkpDQorew0KKwlXb3JkMzIgaTsgDQorCVdvcmQxNiBhbHBoYV91cCwgYWxwaGFfZG93biwgYmNrcl9hZGQgPSAyOw0KKw0KKwkvKiBDb250cm9sIHVwZGF0ZSBvZiBiY2tyX2VzdFtdICovDQorCXVwZGF0ZV9jbnRybChzdCwgbGV2ZWwpOw0KKw0KKwkvKiBDaG9vc2UgdXBkYXRlIHNwZWVkICovDQorCWlmICgoMHg3ODAwICYgc3QtPnZhZHJlZykgPT0gMCkNCisJew0KKwkJYWxwaGFfdXAgPSBBTFBIQV9VUDE7ICAgICAgICAgICAgICANCisJCWFscGhhX2Rvd24gPSBBTFBIQV9ET1dOMTsgICAgICAgICAgDQorCX0gZWxzZQ0KKwl7DQorCQlpZiAoKHN0LT5zdGF0X2NvdW50ID09IDApKQ0KKwkJew0KKwkJCWFscGhhX3VwID0gQUxQSEFfVVAyOyAgICAgICAgICANCisJCQlhbHBoYV9kb3duID0gQUxQSEFfRE9XTjI7ICAgICAgDQorCQl9IGVsc2UNCisJCXsNCisJCQlhbHBoYV91cCA9IDA7ICAgICAgICAgICAgICAgICAgDQorCQkJYWxwaGFfZG93biA9IEFMUEhBMzsgICAgICAgICAgIA0KKwkJCWJja3JfYWRkID0gMDsgICAgICAgICAgICAgICAgICANCisJCX0NCisJfQ0KKw0KKwkvKiBVcGRhdGUgbm9pc2UgZXN0aW1hdGUgKGJja3JfZXN0KSAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQ0KKwl7DQorCQlXb3JkMTYgdGVtcDsNCisJCXRlbXAgPSAoc3QtPm9sZF9sZXZlbFtpXSAtIHN0LT5iY2tyX2VzdFtpXSk7DQorDQorCQlpZiAodGVtcCA8IDApDQorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBkb3dud2FyZHMgKi8NCisJCQlzdC0+YmNrcl9lc3RbaV0gPSBhZGQxKC0yLCBhZGQoc3QtPmJja3JfZXN0W2ldLHZvX211bHRfcihhbHBoYV9kb3duLCB0ZW1wKSkpOyANCisJCQkvKiBsaW1pdCBtaW5pbXVtIHZhbHVlIG9mIHRoZSBub2lzZSBlc3RpbWF0ZSB0byBOT0lTRV9NSU4gKi8NCisJCQlpZihzdC0+YmNrcl9lc3RbaV0gPCBOT0lTRV9NSU4pDQorCQkJew0KKwkJCQlzdC0+YmNrcl9lc3RbaV0gPSBOT0lTRV9NSU47ICAgDQorCQkJfQ0KKwkJfSBlbHNlDQorCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSB1cHdhcmRzICovDQorCQkJc3QtPmJja3JfZXN0W2ldID0gYWRkMShiY2tyX2FkZCwgYWRkMShzdC0+YmNrcl9lc3RbaV0sdm9fbXVsdF9yKGFscGhhX3VwLCB0ZW1wKSkpOyAgIA0KKw0KKwkJCS8qIGxpbWl0IG1heGltdW0gdmFsdWUgb2YgdGhlIG5vaXNlIGVzdGltYXRlIHRvIE5PSVNFX01BWCAqLw0KKwkJCWlmKHN0LT5iY2tyX2VzdFtpXSA+IE5PSVNFX01BWCkNCisJCQl7DQorCQkJCXN0LT5iY2tyX2VzdFtpXSA9IE5PSVNFX01BWDsgICAgDQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCS8qIFVwZGF0ZSBzaWduYWwgbGV2ZWxzIG9mIHRoZSBwcmV2aW91cyBmcmFtZSAob2xkX2xldmVsKSAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQ0KKwl7DQorCQlzdC0+b2xkX2xldmVsW2ldID0gbGV2ZWxbaV07ICAgICAgDQorCX0NCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiAgICAgOiB2YWRfZGVjaXNpb24NCisqICAgICBQdXJwb3NlICAgICAgOiBDYWxjdWxhdGVzIFZBRF9mbGFnDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIFdvcmQxNiB2YWRfZGVjaXNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlIDogVkFEX2ZsYWcgKi8NCisJCVZhZFZhcnMgKiBzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGxldmVsW0NPTVBMRU5dLCAgICAgICAgICAgICAgICAvKiBpICAgOiBzdWItYmFuZCBsZXZlbHMgb2YgdGhlIGlucHV0IGZyYW1lICovDQorCQlXb3JkMzIgcG93X3N1bSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkgICA6IHBvd2VyIG9mIHRoZSBpbnB1dCBmcmFtZSAgICAgICAgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpOw0KKwlXb3JkMzIgTF9zbnJfc3VtOw0KKwlXb3JkMzIgTF90ZW1wOw0KKwlXb3JkMTYgdmFkX3RociwgdGVtcCwgbm9pc2VfbGV2ZWw7DQorCVdvcmQxNiBsb3dfcG93ZXJfZmxhZzsNCisJV29yZDE2IGhhbmdfbGVuLCBidXJzdF9sZW47DQorCVdvcmQxNiBpbG9nMl9zcGVlY2hfbGV2ZWwsIGlsb2cyX25vaXNlX2xldmVsOw0KKwlXb3JkMTYgdGVtcDI7DQorDQorCS8qIENhbGN1bGF0ZSBzcXVhcmVkIHN1bSBvZiB0aGUgaW5wdXQgbGV2ZWxzIChsZXZlbCkgZGl2aWRlZCBieSB0aGUgYmFja2dyb3VuZCBub2lzZSBjb21wb25lbnRzDQorCSAqIChiY2tyX2VzdCkuICovDQorCUxfc25yX3N1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBDT01QTEVOOyBpKyspDQorCXsNCisJCVdvcmQxNiBleHA7DQorDQorCQlleHAgPSBub3JtX3Moc3QtPmJja3JfZXN0W2ldKTsNCisJCXRlbXAgPSAoc3QtPmJja3JfZXN0W2ldIDw8IGV4cCk7DQorCQl0ZW1wID0gZGl2X3MoKGxldmVsW2ldID4+IDEpLCB0ZW1wKTsNCisJCXRlbXAgPSBzaGwodGVtcCwgKGV4cCAtIChVTklSU0hGVCAtIDEpKSk7DQorCQlMX3Nucl9zdW0gPSBMX21hYyhMX3Nucl9zdW0sIHRlbXAsIHRlbXApOw0KKwl9DQorDQorCS8qIENhbGN1bGF0ZSBhdmVyYWdlIGxldmVsIG9mIGVzdGltYXRlZCBiYWNrZ3JvdW5kIG5vaXNlICovDQorCUxfdGVtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDE7IGkgPCBDT01QTEVOOyBpKyspICAgICAgICAgIC8qIGlnbm9yZSBsb3dlc3QgYmFuZCAqLw0KKwl7DQorCQlMX3RlbXAgPSB2b19MX2FkZChMX3RlbXAsIHN0LT5iY2tyX2VzdFtpXSk7DQorCX0NCisNCisJbm9pc2VfbGV2ZWwgPSBleHRyYWN0X2goKExfdGVtcCA8PCAxMikpOw0KKwkvKiBpZiBTTlIgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZCAoTUlOX1NQRUVDSF9TTlIpLCBhbmQgaW5jcmVhc2Ugc3BlZWNoX2xldmVsICovDQorCXRlbXAgPSB2b19tdWx0KG5vaXNlX2xldmVsLCBNSU5fU1BFRUNIX1NOUikgPDwgMzsNCisNCisJaWYoc3QtPnNwZWVjaF9sZXZlbCA8IHRlbXApDQorCXsNCisJCXN0LT5zcGVlY2hfbGV2ZWwgPSB0ZW1wOyAgICAgICAgICANCisJfQ0KKwlpbG9nMl9ub2lzZV9sZXZlbCA9IGlsb2cyKG5vaXNlX2xldmVsKTsNCisNCisJLyogSWYgU05SIGlzIHZlcnkgcG9vciwgc3BlZWNoX2xldmVsIGlzIHByb2JhYmx5IGNvcnJ1cHRlZCBieSBub2lzZSBsZXZlbC4gVGhpcyBpcyBjb3JyZWN0cmVkIGJ5DQorCSAqIHN1YnRyYWN0aW5nIE1JTl9TUEVFQ0hfU05SKm5vaXNlX2xldmVsIGZyb20gc3BlZWNoIGxldmVsICovDQorCWlsb2cyX3NwZWVjaF9sZXZlbCA9IGlsb2cyKHN0LT5zcGVlY2hfbGV2ZWwgLSB0ZW1wKTsNCisNCisJdGVtcCA9IGFkZDEodm9fbXVsdChOT19TTE9QRSwgKGlsb2cyX25vaXNlX2xldmVsIC0gTk9fUDEpKSwgVEhSX0hJR0gpOw0KKw0KKwl0ZW1wMiA9IGFkZDEoU1BfQ0hfTUlOLCB2b19tdWx0KFNQX1NMT1BFLCAoaWxvZzJfc3BlZWNoX2xldmVsIC0gU1BfUDEpKSk7DQorCWlmICh0ZW1wMiA8IFNQX0NIX01JTikNCisJew0KKwkJdGVtcDIgPSBTUF9DSF9NSU47ICAgICAgICAgICAgICAgICANCisJfQ0KKwlpZiAodGVtcDIgPiBTUF9DSF9NQVgpDQorCXsNCisJCXRlbXAyID0gU1BfQ0hfTUFYOyAgICAgICAgICAgICAgICAgDQorCX0NCisJdmFkX3RociA9IHRlbXAgKyB0ZW1wMjsNCisNCisJaWYodmFkX3RociA8IFRIUl9NSU4pDQorCXsNCisJCXZhZF90aHIgPSBUSFJfTUlOOyAgICAgICAgICAgICAgICAgDQorCX0NCisJLyogU2hpZnQgVkFEIGRlY2lzaW9uIHJlZ2lzdGVyICovDQorCXN0LT52YWRyZWcgPSAoc3QtPnZhZHJlZyA+PiAxKTsgICAgICAgDQorDQorCS8qIE1ha2UgaW50ZXJtZWRpYXRlIFZBRCBkZWNpc2lvbiAqLw0KKwlpZihMX3Nucl9zdW0gPiB2b19MX211bHQodmFkX3RociwgKDUxMiAqIENPTVBMRU4pKSkNCisJew0KKwkJc3QtPnZhZHJlZyA9IChXb3JkMTYpIChzdC0+dmFkcmVnIHwgMHg0MDAwKTsgDQorCX0NCisJLyogY2hlY2sgaWYgdGhlIGlucHV0IHBvd2VyIChwb3dfc3VtKSBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkIiAqLw0KKwlpZihwb3dfc3VtIDwgVkFEX1BPV19MT1cpDQorCXsNCisJCWxvd19wb3dlcl9mbGFnID0gMTsgICAgICAgICAgICAgICANCisJfSBlbHNlDQorCXsNCisJCWxvd19wb3dlcl9mbGFnID0gMDsgICAgICAgICAgICAgICANCisJfQ0KKwkvKiBVcGRhdGUgYmFja2dyb3VuZCBub2lzZSBlc3RpbWF0ZXMgKi8NCisJbm9pc2VfZXN0aW1hdGVfdXBkYXRlKHN0LCBsZXZlbCk7DQorDQorCS8qIENhbGN1bGF0ZSB2YWx1ZXMgZm9yIGhhbmdfbGVuIGFuZCBidXJzdF9sZW4gYmFzZWQgb24gdmFkX3RociAqLw0KKwloYW5nX2xlbiA9IGFkZDEodm9fbXVsdChIQU5HX1NMT1BFLCAodmFkX3RociAtIEhBTkdfUDEpKSwgSEFOR19ISUdIKTsNCisJaWYoaGFuZ19sZW4gPCBIQU5HX0xPVykNCisJew0KKwkJaGFuZ19sZW4gPSBIQU5HX0xPVzsgICAgICAgICAgICAgIA0KKwl9DQorCWJ1cnN0X2xlbiA9IGFkZDEodm9fbXVsdChCVVJTVF9TTE9QRSwgKHZhZF90aHIgLSBCVVJTVF9QMSkpLCBCVVJTVF9ISUdIKTsNCisNCisJcmV0dXJuIChoYW5nb3Zlcl9hZGRpdGlvbihzdCwgbG93X3Bvd2VyX2ZsYWcsIGhhbmdfbGVuLCBidXJzdF9sZW4pKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiA6IEVzdGltYXRlX1NwZWVjaCgpDQorKiAgICAgUHVycG9zZSAgOiBFc3RpbWF0ZSBzcGVlY2ggbGV2ZWwNCisqDQorKiBNYXhpbXVtIHNpZ25hbCBsZXZlbCBpcyBzZWFyY2hlZCBhbmQgc3RvcmVkIHRvIHRoZSB2YXJpYWJsZSBzcF9tYXguDQorKiBUaGUgc3BlZWNoIGZyYW1lcyBtdXN0IGxvY2F0ZSB3aXRoaW4gU1BfRVNUX0NPVU5UIG51bWJlciBvZiBmcmFtZXMuDQorKiBUaHVzLCBub2lzeSBmcmFtZXMgaGF2aW5nIG9jY2FzaW9uYWwgVkFEID0gIjEiIGRlY2lzaW9ucyB3aWxsIG5vdA0KKyogYWZmZWN0IHRvIHRoZSBlc3RpbWF0ZWQgc3BlZWNoX2xldmVsLg0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyB2b2lkIEVzdGltYXRlX1NwZWVjaCgNCisJCVZhZFZhcnMgKiBzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0dXJlICAgICovDQorCQlXb3JkMTYgaW5fbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgIC8qIGxldmVsIG9mIHRoZSBpbnB1dCBmcmFtZSAqLw0KKwkJKQ0KK3sNCisJV29yZDE2IGFscGhhOw0KKw0KKwkvKiBpZiB0aGUgcmVxdWlyZWQgYWN0aXZpdHkgY291bnQgY2Fubm90IGJlIGFjaGlldmVkLCByZXNldCBjb3VudGVycyAqLw0KKwlpZigoc3QtPnNwX2VzdF9jbnQgLSBzdC0+c3BfbWF4X2NudCkgPiAoU1BfRVNUX0NPVU5UIC0gU1BfQUNUSVZJVFlfQ09VTlQpKQ0KKwl7DQorCQlzdC0+c3BfZXN0X2NudCA9IDA7ICAgICAgICAgICAgICAgIA0KKwkJc3QtPnNwX21heCA9IDA7ICAgICAgICAgICAgICAgICAgICANCisJCXN0LT5zcF9tYXhfY250ID0gMDsgICAgICAgICAgICAgICAgDQorCX0NCisJc3QtPnNwX2VzdF9jbnQgKz0gMTsgDQorDQorCWlmICgoKHN0LT52YWRyZWcgJiAweDQwMDApfHwoaW5fbGV2ZWwgPiBzdC0+c3BlZWNoX2xldmVsKSkgJiYgKGluX2xldmVsID4gTUlOX1NQRUVDSF9MRVZFTDEpKQ0KKwl7DQorCQkvKiB1cGRhdGUgc3BfbWF4ICovDQorCQlpZihpbl9sZXZlbCA+IHN0LT5zcF9tYXgpDQorCQl7DQorCQkJc3QtPnNwX21heCA9IGluX2xldmVsOyAgICAgICAgIA0KKwkJfQ0KKwkJc3QtPnNwX21heF9jbnQgKz0gMTsgICAgICAgIA0KKw0KKwkJaWYoc3QtPnNwX21heF9jbnQgPj0gU1BfQUNUSVZJVFlfQ09VTlQpDQorCQl7DQorCQkJV29yZDE2IHRtcDsNCisJCQkvKiB1cGRhdGUgc3BlZWNoIGVzdGltYXRlICovDQorCQkJdG1wID0gKHN0LT5zcF9tYXggPj4gMSk7ICAgICAgLyogc2NhbGUgdG8gZ2V0ICJhdmVyYWdlIiBzcGVlY2ggbGV2ZWwgKi8NCisNCisJCQkvKiBzZWxlY3QgdXBkYXRlIHNwZWVkICovDQorCQkJaWYodG1wID4gc3QtPnNwZWVjaF9sZXZlbCkNCisJCQl7DQorCQkJCWFscGhhID0gQUxQSEFfU1BfVVA7ICAgICAgIA0KKwkJCX0gZWxzZQ0KKwkJCXsNCisJCQkJYWxwaGEgPSBBTFBIQV9TUF9ET1dOOyAgICANCisJCQl9DQorCQkJaWYodG1wID4gTUlOX1NQRUVDSF9MRVZFTDIpDQorCQkJew0KKwkJCQlzdC0+c3BlZWNoX2xldmVsID0gYWRkMShzdC0+c3BlZWNoX2xldmVsLCB2b19tdWx0X3IoYWxwaGEsIHZvX3N1Yih0bXAsIHN0LT5zcGVlY2hfbGV2ZWwpKSk7IA0KKwkJCX0NCisJCQkvKiBjbGVhciBhbGwgY291bnRlcnMgdXNlZCBmb3Igc3BlZWNoIGVzdGltYXRpb24gKi8NCisJCQlzdC0+c3BfbWF4ID0gMDsgICAgICAgICAgICAgICAgDQorCQkJc3QtPnNwX21heF9jbnQgPSAwOyAgICAgICAgICAgIA0KKwkJCXN0LT5zcF9lc3RfY250ID0gMDsgICAgICAgICAgICANCisJCX0NCisJfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogIEZ1bmN0aW9uOiAgIHdiX3ZhZF9pbml0DQorKiAgUHVycG9zZTogICAgQWxsb2NhdGVzIHN0YXRlIG1lbW9yeSBhbmQgaW5pdGlhbGl6ZXMgc3RhdGUgbWVtb3J5DQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorV29yZDE2IHdiX3ZhZF9pbml0KCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybjogbm9uLXplcm8gd2l0aCBlcnJvciwgemVybyBmb3Igb2suICovDQorCQlWYWRWYXJzICoqIHN0YXRlLCAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAqLw0KKwkJVk9fTUVNX09QRVJBVE9SICpwTWVtT1ANCisJCSkNCit7DQorCVZhZFZhcnMgKnM7DQorDQorCWlmIChzdGF0ZSA9PSAoVmFkVmFycyAqKikgTlVMTCkNCisJew0KKwkJZnByaW50ZihzdGRlcnIsICJ2YWRfaW5pdDogaW52YWxpZCBwYXJhbWV0ZXJcbiIpOw0KKwkJcmV0dXJuIC0xOw0KKwl9DQorCSpzdGF0ZSA9IE5VTEw7DQorDQorCS8qIGFsbG9jYXRlIG1lbW9yeSAqLw0KKwlpZiAoKHMgPSAoVmFkVmFycyAqKSBtZW1fbWFsbG9jKHBNZW1PUCwgc2l6ZW9mKFZhZFZhcnMpLCAzMiwgVk9fSU5ERVhfRU5DX0FNUldCKSkgPT0gTlVMTCkNCisJew0KKwkJZnByaW50ZihzdGRlcnIsICJ2YWRfaW5pdDogY2FuIG5vdCBtYWxsb2Mgc3RhdGUgc3RydWN0dXJlXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwl3Yl92YWRfcmVzZXQocyk7DQorDQorCSpzdGF0ZSA9IHM7DQorDQorCXJldHVybiAwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKg0KKyogIEZ1bmN0aW9uOiAgIHdiX3ZhZF9yZXNldA0KKyogIFB1cnBvc2U6ICAgIEluaXRpYWxpemVzIHN0YXRlIG1lbW9yeQ0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1dvcmQxNiB3Yl92YWRfcmVzZXQoICAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm46IG5vbi16ZXJvIHdpdGggZXJyb3IsIHplcm8gZm9yIG9rLiAqLw0KKwkJVmFkVmFycyAqIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgKi8NCisJCSkNCit7DQorCVdvcmQzMiBpLCBqOw0KKw0KKwlpZiAoc3RhdGUgPT0gKFZhZFZhcnMgKikgTlVMTCkNCisJew0KKwkJZnByaW50ZihzdGRlcnIsICJ2YWRfcmVzZXQ6IGludmFsaWQgcGFyYW1ldGVyXG4iKTsNCisJCXJldHVybiAtMTsNCisJfQ0KKwlzdGF0ZS0+dG9uZV9mbGFnID0gMDsNCisJc3RhdGUtPnZhZHJlZyA9IDA7DQorCXN0YXRlLT5oYW5nX2NvdW50ID0gMDsNCisJc3RhdGUtPmJ1cnN0X2NvdW50ID0gMDsNCisJc3RhdGUtPmhhbmdfY291bnQgPSAwOw0KKw0KKwkvKiBpbml0aWFsaXplIG1lbW9yeSB1c2VkIGJ5IHRoZSBmaWx0ZXIgYmFuayAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgRl81VEhfQ05UOyBpKyspDQorCXsNCisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspDQorCQl7DQorCQkJc3RhdGUtPmFfZGF0YTVbaV1bal0gPSAwOw0KKwkJfQ0KKwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBGXzNUSF9DTlQ7IGkrKykNCisJew0KKwkJc3RhdGUtPmFfZGF0YTNbaV0gPSAwOw0KKwl9DQorDQorCS8qIGluaXRpYWxpemUgdGhlIHJlc3Qgb2YgdGhlIG1lbW9yeSAqLw0KKwlmb3IgKGkgPSAwOyBpIDwgQ09NUExFTjsgaSsrKQ0KKwl7DQorCQlzdGF0ZS0+YmNrcl9lc3RbaV0gPSBOT0lTRV9JTklUOw0KKwkJc3RhdGUtPm9sZF9sZXZlbFtpXSA9IE5PSVNFX0lOSVQ7DQorCQlzdGF0ZS0+YXZlX2xldmVsW2ldID0gTk9JU0VfSU5JVDsNCisJCXN0YXRlLT5zdWJfbGV2ZWxbaV0gPSAwOw0KKwl9DQorDQorCXN0YXRlLT5zcF9lc3RfY250ID0gMDsNCisJc3RhdGUtPnNwX21heCA9IDA7DQorCXN0YXRlLT5zcF9tYXhfY250ID0gMDsNCisJc3RhdGUtPnNwZWVjaF9sZXZlbCA9IFNQRUVDSF9MRVZFTF9JTklUOw0KKwlzdGF0ZS0+cHJldl9wb3dfc3VtID0gMDsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqDQorKiAgRnVuY3Rpb246ICAgd2JfdmFkX2V4aXQNCisqICBQdXJwb3NlOiAgICBUaGUgbWVtb3J5IHVzZWQgZm9yIHN0YXRlIG1lbW9yeSBpcyBmcmVlZA0KKyoNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3ZvaWQgd2JfdmFkX2V4aXQoDQorCQlWYWRWYXJzICoqIHN0YXRlLCAgICAgICAgICAgICAgICAgICAgICAvKiBpL28gOiBTdGF0ZSBzdHJ1Y3R1cmUgICAgKi8NCisJCVZPX01FTV9PUEVSQVRPUiAqcE1lbU9QDQorCQkpDQorew0KKwlpZiAoc3RhdGUgPT0gTlVMTCB8fCAqc3RhdGUgPT0gTlVMTCkNCisJCXJldHVybjsNCisJLyogZGVhbGxvY2F0ZSBtZW1vcnkgKi8NCisJbWVtX2ZyZWUocE1lbU9QLCAqc3RhdGUsIFZPX0lOREVYX0VOQ19BTVJXQik7DQorCSpzdGF0ZSA9IE5VTEw7DQorCXJldHVybjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiAgICAgOiB3Yl92YWRfdG9uZV9kZXRlY3Rpb24NCisqICAgICBQdXJwb3NlICAgICAgOiBTZWFyY2ggbWF4aW11bSBwaXRjaCBnYWluIGZyb20gYSBmcmFtZS4gU2V0IHRvbmUgZmxhZyBpZg0KKyogICAgICAgICAgICAgICAgICAgIHBpdGNoIGdhaW4gaXMgaGlnaC4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdA0KKyogICAgICAgICAgICAgICAgICAgIHNpZ25hbGluZyB0b25lcyBhbmQgb3RoZXIgc2lnbmFscyB3aXRoIGhpZ2ggcGl0Y2ggZ2Fpbi4NCisqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCit2b2lkIHdiX3ZhZF90b25lX2RldGVjdGlvbigNCisJCVZhZFZhcnMgKiBzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS9vIDogU3RhdGUgc3RydWN0ICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBwX2dhaW4gICAgICAgICAgICAgICAgICAgICAgICAgLyogcGl0Y2ggZ2FpbiAgICAgICovDQorCQkpDQorew0KKwkvKiB1cGRhdGUgdG9uZSBmbGFnICovDQorCXN0LT50b25lX2ZsYWcgPSAoc3QtPnRvbmVfZmxhZyA+PiAxKTsNCisNCisJLyogaWYgKHBpdGNoX2dhaW4gPiBUT05FX1RIUikgc2V0IHRvbmUgZmxhZyAqLw0KKwlpZiAocF9nYWluID4gVE9ORV9USFIpDQorCXsNCisJCXN0LT50b25lX2ZsYWcgPSAoV29yZDE2KSAoc3QtPnRvbmVfZmxhZyB8IDB4NDAwMCk7DQorCX0NCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoNCisqICAgICBGdW5jdGlvbiAgICAgOiB3Yl92YWQNCisqICAgICBQdXJwb3NlICAgICAgOiBNYWluIHByb2dyYW0gZm9yIFZvaWNlIEFjdGl2aXR5IERldGVjdGlvbiAoVkFEKSBmb3IgQU1SDQorKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorV29yZDE2IHdiX3ZhZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJldHVybiB2YWx1ZSA6IFZBRCBEZWNpc2lvbiwgMSA9IHNwZWVjaCwgMCA9IG5vaXNlICovDQorCQlWYWRWYXJzICogc3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGkvbyA6IFN0YXRlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgKi8NCisJCVdvcmQxNiBpbl9idWZbXSAgICAgICAgICAgICAgICAgICAgICAgLyogaSAgIDogc2FtcGxlcyBvZiB0aGUgaW5wdXQgZnJhbWUgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQxNiBsZXZlbFtDT01QTEVOXTsNCisJV29yZDMyIGk7DQorCVdvcmQxNiBWQURfZmxhZywgdGVtcDsNCisJV29yZDMyIExfdGVtcCwgcG93X3N1bTsNCisNCisJLyogQ2FsY3VsYXRlIHBvd2VyIG9mIHRoZSBpbnB1dCBmcmFtZS4gKi8NCisJTF90ZW1wID0gMEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDA7IGkgPCBGUkFNRV9MRU47IGkrKykNCisJew0KKwkJTF90ZW1wID0gTF9tYWMoTF90ZW1wLCBpbl9idWZbaV0sIGluX2J1ZltpXSk7DQorCX0NCisNCisJLyogcG93X3N1bSA9IHBvd2VyIG9mIGN1cnJlbnQgZnJhbWUgYW5kIHByZXZpb3VzIGZyYW1lICovDQorCXBvd19zdW0gPSBMX2FkZChMX3RlbXAsIHN0LT5wcmV2X3Bvd19zdW0pOyAgDQorDQorCS8qIHNhdmUgcG93ZXIgb2YgY3VycmVudCBmcmFtZSBmb3IgbmV4dCBjYWxsICovDQorCXN0LT5wcmV2X3Bvd19zdW0gPSBMX3RlbXA7ICAgICAgICAgICAgIA0KKw0KKwkvKiBJZiBpbnB1dCBwb3dlciBpcyB2ZXJ5IGxvdywgY2xlYXIgdG9uZSBmbGFnICovDQorCWlmIChwb3dfc3VtIDwgUE9XX1RPTkVfVEhSKQ0KKwl7DQorCQlzdC0+dG9uZV9mbGFnID0gKFdvcmQxNikgKHN0LT50b25lX2ZsYWcgJiAweDFmZmYpOyAgICAgIA0KKwl9DQorCS8qIFJ1biB0aGUgZmlsdGVyIGJhbmsgYW5kIGNhbGN1bGF0ZSBzaWduYWwgbGV2ZWxzIGF0IGVhY2ggYmFuZCAqLw0KKwlmaWx0ZXJfYmFuayhzdCwgaW5fYnVmLCBsZXZlbCk7DQorDQorCS8qIGNvbXB1dGUgVkFEIGRlY2lzaW9uICovDQorCVZBRF9mbGFnID0gdmFkX2RlY2lzaW9uKHN0LCBsZXZlbCwgcG93X3N1bSk7DQorDQorCS8qIENhbGN1bGF0ZSBpbnB1dCBsZXZlbCAqLw0KKwlMX3RlbXAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgDQorCWZvciAoaSA9IDE7IGkgPCBDT01QTEVOOyBpKyspICAgICAgICAgIC8qIGlnbm9yZSBsb3dlc3QgYmFuZCAqLw0KKwl7DQorCQlMX3RlbXAgPSB2b19MX2FkZChMX3RlbXAsIGxldmVsW2ldKTsNCisJfQ0KKw0KKwl0ZW1wID0gZXh0cmFjdF9oKExfdGVtcCA8PCAxMik7DQorDQorCUVzdGltYXRlX1NwZWVjaChzdCwgdGVtcCk7ICAgICAgICAgICAgIC8qIEVzdGltYXRlIHNwZWVjaCBsZXZlbCAqLw0KKwlyZXR1cm4gKFZBRF9mbGFnKTsNCit9DQorDQorDQorDQorDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93ZWlnaHRfYS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93ZWlnaHRfYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2JlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3dlaWdodF9hLmMKQEAgLTAsMCArMSw0OCBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqICAgICAgIEZpbGU6IHdlaWdodF9hLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgIERlc2NyaXB0aW9uOldlaWdodGluZyBvZiBMUEMgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICoNCisqCSAgICAgICAgICAgICAgIGFwW2ldID0gYVtpXSAqIChnYW1tYSAqKiBpKSAgICAgICAgICAgICAgICAgICAgICoNCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpbmNsdWRlICJ0eXBlZGVmLmgiDQorI2luY2x1ZGUgImJhc2ljX29wLmgiDQorDQordm9pZCBXZWlnaHRfYSgNCisJCVdvcmQxNiBhW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSAgTFBDIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAqLw0KKwkJV29yZDE2IGFwW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgUTEyIDogU3BlY3RyYWwgZXhwYW5kZWQgTFBDIGNvZWZmaWNpZW50cyAgICovDQorCQlXb3JkMTYgZ2FtbWEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBTcGVjdHJhbCBleHBhbnNpb24gZmFjdG9yLiAgICAgICAgICAgKi8NCisJCVdvcmQxNiBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IExQQyBvcmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KKwkgICAgICkNCit7DQorCVdvcmQzMiBudW0gPSBtIC0gMSwgZmFjOw0KKwkqYXArKyA9ICphKys7DQorCWZhYyA9IGdhbW1hOw0KKwlkb3sNCisJCSphcCsrID0oV29yZDE2KSgoKHZvX0xfbXVsdCgoKmErKyksIGZhYykpICsgMHg4MDAwKSA+PiAxNik7DQorCQlmYWMgPSAodm9fTF9tdWx0KGZhYywgZ2FtbWEpICsgMHg4MDAwKSA+PiAxNjsNCisJfXdoaWxlKC0tbnVtICE9IDApOw0KKw0KKwkqYXArKyA9IChXb3JkMTYpKCgodm9fTF9tdWx0KCgqYSsrKSwgZmFjKSkgKyAweDgwMDApID4+IDE2KTsNCisJcmV0dXJuOw0KK30NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2RlYy9BVkNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FWQ0RlY29kZXIuY3BwCmluZGV4IGFhMmEzZDEuLjcxNTRiYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FWQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZGVjL0FWQ0RlY29kZXIuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGNvbnN0IGNoYXIga1N0YXJ0Q29kZVs0XSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9OworCiBzdGF0aWMgaW50MzJfdCBNYWxsb2Modm9pZCAqdXNlckRhdGEsIGludDMyX3Qgc2l6ZSwgaW50MzJfdCBhdHRycykgewogICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludDMyX3Q+KG1hbGxvYyhzaXplKSk7CiB9CkBAIC00OSw3ICs1MSwxMSBAQAogICAgICAgbUlucHV0QnVmZmVyKE5VTEwpLAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKICAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAotICAgICAgbVBlbmRpbmdTZWVrVGltZVVzKC0xKSB7CisgICAgICBtUGVuZGluZ1NlZWtUaW1lVXMoLTEpLAorICAgICAgbVBlbmRpbmdTZWVrTW9kZShNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKSwKKyAgICAgIG1UYXJnZXRUaW1lVXMoLTEpLAorICAgICAgbVNQU1NlZW4oZmFsc2UpLAorICAgICAgbVBQU1NlZW4oZmFsc2UpIHsKICAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ0FWQ0hhbmRsZSkpOwogICAgIG1IYW5kbGUtPkFWQ09iamVjdCA9IE5VTEw7CiAgICAgbUhhbmRsZS0+dXNlckRhdGEgPSB0aGlzOwpAQCAtMTU0LDIyICsxNjAsMjUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPE1ldGFEYXRhPiBwYXJhbXMgPSBuZXcgTWV0YURhdGE7Ci0gICAgcGFyYW1zLT5zZXRJbnQzMihrS2V5V2FudHNOQUxGcmFnbWVudHMsIHRydWUpOwotICAgIG1Tb3VyY2UtPnN0YXJ0KHBhcmFtcy5nZXQoKSk7CisgICAgbVNvdXJjZS0+c3RhcnQoKTsKIAogICAgIG1BbmNob3JUaW1lVXMgPSAwOwogICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKICAgICBtUGVuZGluZ1NlZWtUaW1lVXMgPSAtMTsKKyAgICBtUGVuZGluZ1NlZWtNb2RlID0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOworICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKKyAgICBtU1BTU2VlbiA9IGZhbHNlOworICAgIG1QUFNTZWVuID0gZmFsc2U7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCiAgICAgcmV0dXJuIE9LOwogfQogCiB2b2lkIEFWQ0RlY29kZXI6OmFkZENvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihzaXplKTsKLSAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoc2l6ZSArIDQpOworICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwga1N0YXJ0Q29kZSwgNCk7CisgICAgbWVtY3B5KCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyA0LCBkYXRhLCBzaXplKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBzaXplICsgNCk7CiAKICAgICBtQ29kZWNTcGVjaWZpY0RhdGEucHVzaChidWZmZXIpOwogfQpAQCAtMjAwLDE2ICsyMDksNDEgQEAKICAgICByZXR1cm4gbUZvcm1hdDsKIH0KIAorc3RhdGljIHZvaWQgZmluZE5BTEZyYWdtZW50KAorICAgICAgICBjb25zdCBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBjb25zdCB1aW50OF90ICoqZnJhZ1B0ciwgc2l6ZV90ICpmcmFnU2l6ZSkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIENIRUNLKHNpemUgPj0gNCk7CisgICAgQ0hFQ0soIW1lbWNtcChrU3RhcnRDb2RlLCBkYXRhLCA0KSk7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gNDsKKyAgICB3aGlsZSAob2Zmc2V0ICsgMyA8IHNpemUgJiYgbWVtY21wKGtTdGFydENvZGUsICZkYXRhW29mZnNldF0sIDQpKSB7CisgICAgICAgICsrb2Zmc2V0OworICAgIH0KKworICAgICpmcmFnUHRyID0gJmRhdGFbNF07CisgICAgaWYgKG9mZnNldCArIDMgPj0gc2l6ZSkgeworICAgICAgICAqZnJhZ1NpemUgPSBzaXplIC0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICAqZnJhZ1NpemUgPSBvZmZzZXQgLSA0OworICAgIH0KK30KKwogc3RhdHVzX3QgQVZDRGVjb2Rlcjo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIExPR1YoInNlZWsgcmVxdWVzdGVkIHRvICVsbGQgdXMgKCUuMmYgc2VjcykiLCBzZWVrVGltZVVzLCBzZWVrVGltZVVzIC8gMUU2KTsKIAogICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwogICAgICAgICBtUGVuZGluZ1NlZWtUaW1lVXMgPSBzZWVrVGltZVVzOworICAgICAgICBtUGVuZGluZ1NlZWtNb2RlID0gbW9kZTsKIAogICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CiAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKQEAgLTIyMiw2ICsyNTYsOCBAQAogICAgIGlmIChtSW5wdXRCdWZmZXIgPT0gTlVMTCkgewogICAgICAgICBMT0dWKCJmZXRjaGluZyBuZXcgaW5wdXQgYnVmZmVyLiIpOwogCisgICAgICAgIGJvb2wgc2Vla2luZyA9IGZhbHNlOworCiAgICAgICAgIGlmICghbUNvZGVjU3BlY2lmaWNEYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbUNvZGVjU3BlY2lmaWNEYXRhLmVkaXRJdGVtQXQoMCk7CiAgICAgICAgICAgICBtQ29kZWNTcGVjaWZpY0RhdGEucmVtb3ZlQXQoMCk7CkBAIC0yMzQsNyArMjcwLDkgQEAKIAogICAgICAgICAgICAgICAgIFJlYWRPcHRpb25zIHNlZWtPcHRpb25zOwogICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NlZWtUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBzZWVrT3B0aW9ucy5zZXRTZWVrVG8obVBlbmRpbmdTZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vla2luZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgc2Vla09wdGlvbnMuc2V0U2Vla1RvKG1QZW5kaW5nU2Vla1RpbWVVcywgbVBlbmRpbmdTZWVrTW9kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2Vla1RpbWVVcyA9IC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZzZWVrT3B0aW9ucyk7CkBAIC0yNTIsMTg2ICsyOTAsMjM5IEBACiAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmIChzZWVraW5nKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVVczsKKyAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpCisgICAgICAgICAgICAgICAgICAgICYmIHRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IHRhcmdldFRpbWVVczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgY29uc3QgdWludDhfdCAqaW5QdHIgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKW1JbnB1dEJ1ZmZlci0+ZGF0YSgpICsgbUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBjb25zdCB1aW50OF90ICpmcmFnUHRyOworICAgIHNpemVfdCBmcmFnU2l6ZTsKKyAgICBmaW5kTkFMRnJhZ21lbnQobUlucHV0QnVmZmVyLCAmZnJhZ1B0ciwgJmZyYWdTaXplKTsKKworICAgIGJvb2wgcmVsZWFzZUZyYWdtZW50ID0gdHJ1ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCiAgICAgaW50IG5hbFR5cGU7CiAgICAgaW50IG5hbFJlZklkYzsKICAgICBBVkNEZWNfU3RhdHVzIHJlcyA9CiAgICAgICAgIFBWQVZDRGVjR2V0TkFMVHlwZSgKLSAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLCBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpLAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwgZnJhZ1NpemUsCiAgICAgICAgICAgICAgICAgJm5hbFR5cGUsICZuYWxSZWZJZGMpOwogCiAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewogICAgICAgICBMT0dFKCJjYW5ub3QgZGV0ZXJtaW5lIG5hbCB0eXBlIik7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgc3dpdGNoIChuYWxUeXBlKSB7Ci0gICAgICAgIGNhc2UgQVZDX05BTFRZUEVfU1BTOgotICAgICAgICB7Ci0gICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NlcVBhcmFtU2V0KAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVZDRGVjT2JqZWN0ICpwRGVjVmlkID0gKEFWQ0RlY09iamVjdCAqKW1IYW5kbGUtPkFWQ09iamVjdDsKLQotICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9Ci0gICAgICAgICAgICAgICAgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+cGljX3dpZHRoX2luX21ic19taW51czEgKyAxKSAqIDE2OwotCi0gICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9Ci0gICAgICAgICAgICAgICAgKHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSkgKiAxNjsKLQotICAgICAgICAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbTsKLSAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEFWQ19OQUxUWVBFX1NQUyB8fCBuYWxUeXBlID09IEFWQ19OQUxUWVBFX1BQUworICAgICAgICAgICAgICAgIHx8IChtU1BTU2VlbiAmJiBtUFBTU2VlbikpIHsKKyAgICAgICAgc3dpdGNoIChuYWxUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NQUzoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcm9wX2xlZnQgPSAyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OwotICAgICAgICAgICAgICAgIGNyb3BfcmlnaHQgPQotICAgICAgICAgICAgICAgICAgICB3aWR0aCAtICgyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCArIDEpOworICAgICAgICAgICAgICAgIG1TUFNTZWVuID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX21ic19vbmx5X2ZsYWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjcm9wX3RvcCA9IDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPQotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICgyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgICAgICAgICByZXMgPSBQVkFWQ0RlY1NlcVBhcmFtU2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgY29uc3RfY2FzdDx1aW50OF90ICo+KGZyYWdQdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1NpemUpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAgICAgQVZDRGVjT2JqZWN0ICpwRGVjVmlkID0gKEFWQ0RlY09iamVjdCAqKW1IYW5kbGUtPkFWQ09iamVjdDsKKworICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPQorICAgICAgICAgICAgICAgICAgICAocERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEpICogMTY7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpICogMTY7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF9yaWdodCwgY3JvcF90b3AsIGNyb3BfYm90dG9tOworICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjcm9wX3RvcCA9IDQgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPQotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICg0ICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0ID0gMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9yaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtICgyICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCArIDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX21ic19vbmx5X2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gMiAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9ib3R0b20gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIgKiBwRGVjVmlkLT5zZXFQYXJhbXNbMF0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF90b3AgPSA0ICogcERlY1ZpZC0+c2VxUGFyYW1zWzBdLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCAqIHBEZWNWaWQtPnNlcVBhcmFtc1swXS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcm9wX2JvdHRvbSA9IGhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgICAgIGNyb3BfcmlnaHQgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gY3JvcF9sZWZ0ID0gMDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgICAgICBjcm9wX3JpZ2h0ID0gd2lkdGggLSAxOwotICAgICAgICAgICAgICAgIGNyb3BfdG9wID0gY3JvcF9sZWZ0ID0gMDsKKworICAgICAgICAgICAgICAgIGludDMyX3QgYWxpZ25lZF93aWR0aCA9IChjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMSArIDE1KSAmIH4xNTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGFsaWduZWRfaGVpZ2h0ID0gKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxICsgMTUpICYgfjE1OworCisgICAgICAgICAgICAgICAgaW50MzJfdCBvbGRXaWR0aCwgb2xkSGVpZ2h0OworICAgICAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZvbGRXaWR0aCkpOworICAgICAgICAgICAgICAgIENIRUNLKG1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmb2xkSGVpZ2h0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAob2xkV2lkdGggIT0gYWxpZ25lZF93aWR0aCB8fCBvbGRIZWlnaHQgIT0gYWxpZ25lZF9oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBhbGlnbmVkX3dpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgYWxpZ25lZF9oZWlnaHQpOworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IElORk9fRk9STUFUX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQzMl90IGFsaWduZWRfd2lkdGggPSAoY3JvcF9yaWdodCAtIGNyb3BfbGVmdCArIDEgKyAxNSkgJiB+MTU7Ci0gICAgICAgICAgICBpbnQzMl90IGFsaWduZWRfaGVpZ2h0ID0gKGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxICsgMTUpICYgfjE1OwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCBhbGlnbmVkX3dpZHRoKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGFsaWduZWRfaGVpZ2h0KTsKKyAgICAgICAgICAgIGNhc2UgQVZDX05BTFRZUEVfUFBTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1QUFNTZWVuID0gdHJ1ZTsKIAotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjUGljUGFyYW1TZXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7CiAKLSAgICAgICAgICAgIHJldHVybiBJTkZPX0ZPUk1BVF9DSEFOR0VEOwotICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBBVkNERUNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9QUFM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjUGljUGFyYW1TZXQoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciksCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChyZXMgIT0gQVZDREVDX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9TTElDRToKLSAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9JRFI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjb2RlU2xpY2UoCi0gICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpblB0ciksCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgICAgICBpZiAocmVzID09IEFWQ0RFQ19QSUNUVVJFX09VVFBVVF9SRUFEWSkgewotICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBSZWxlYXNlOwotICAgICAgICAgICAgICAgIEFWQ0ZyYW1lSU8gT3V0cHV0OwotICAgICAgICAgICAgICAgIE91dHB1dC5ZQ2JDclswXSA9IE91dHB1dC5ZQ2JDclsxXSA9IE91dHB1dC5ZQ2JDclsyXSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoUFZBVkNEZWNHZXRPdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgJmluZGV4LCAmUmVsZWFzZSwgJk91dHB1dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZDREVDX1NVQ0NFU1MpOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0soaW5kZXggPj0gMCk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soaW5kZXggPCAoaW50MzJfdCltRnJhbWVzLnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICAqb3V0ID0gbUZyYW1lcy5lZGl0SXRlbUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAoKm91dCktPnNldF9yYW5nZSgwLCAoKm91dCktPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgKCpvdXQpLT5hZGRfcmVmKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBEbyBfbm90XyByZWxlYXNlIGlucHV0IGJ1ZmZlciB5ZXQuCi0KLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgaWYgKHJlcyA9PSBBVkNERUNfUElDVFVSRV9SRUFEWSB8fCByZXMgPT0gQVZDREVDX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMT0dWKCJmYWlsZWQgdG8gZGVjb2RlIGZyYW1lIChyZXMgPSAlZCkiLCByZXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9TRUk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcyA9IFBWQVZDRGVjU0VJKAotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLQotICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICBpZiAocmVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7CisgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NMSUNFOgorICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9JRFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzID0gUFZBVkNEZWNvZGVTbGljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihmcmFnUHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdTaXplKTsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQVZDREVDX1BJQ1RVUkVfT1VUUFVUX1JFQURZKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgUmVsZWFzZTsKKyAgICAgICAgICAgICAgICAgICAgQVZDRnJhbWVJTyBPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dC5ZQ2JDclswXSA9IE91dHB1dC5ZQ2JDclsxXSA9IE91dHB1dC5ZQ2JDclsyXSA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoUFZBVkNEZWNHZXRPdXRwdXQobUhhbmRsZSwgJmluZGV4LCAmUmVsZWFzZSwgJk91dHB1dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ0RFQ19TVUNDRVNTKTsKKworICAgICAgICAgICAgICAgICAgICBDSEVDSyhpbmRleCA+PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaW5kZXggPCAoaW50MzJfdCltRnJhbWVzLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXIgKm1idWYgPSBtRnJhbWVzLmVkaXRJdGVtQXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcEZyYW1lID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UYXJnZXRUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtYnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyh0aW1lVXMgPD0gbVRhcmdldFRpbWVVcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtVGFyZ2V0VGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIGZyYW1lIHdpdGggdGhlIG1hdGNoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wIGFuZCB3ZSB3b24ndCByZXR1cm4gdGhlIGN1cnJlbnQgb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBGcmFtZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJza2lwcGluZyBmcmFtZSBhdCAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVigiZm91bmQgdGFyZ2V0IGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXQgPSBtYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgKCpvdXQpLT5zZXRfcmFuZ2UoMCwgKCpvdXQpLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKCpvdXQpLT5hZGRfcmVmKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gRG8gX25vdF8gcmVsZWFzZSBpbnB1dCBidWZmZXIgeWV0LgorCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VGcmFnbWVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBBVkNERUNfUElDVFVSRV9SRUFEWSB8fCByZXMgPT0gQVZDREVDX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKworICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dWKCJmYWlsZWQgdG8gZGVjb2RlIGZyYW1lIChyZXMgPSAlZCkiLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9TRUk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzID0gUFZBVkNEZWNTRUkoCisgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZnJhZ1B0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFnU2l6ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IEFWQ0RFQ19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7CisKKyAgICAgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9BVUQ6CisgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX0ZJTEw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0UoIlNob3VsZCBub3QgYmUgaGVyZSwgdW5rbm93biBuYWxUeXBlICVkIiwgbmFsVHlwZSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBTUFMgb3IgUFBTIHlldC4KIAotICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX0FVRDoKLSAgICAgICAgeworICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworICAgICAgICBlcnIgPSBPSzsKKyAgICB9CisKKyAgICBpZiAocmVsZWFzZUZyYWdtZW50KSB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICBpZiAoZnJhZ1NpemUgKyA0ID09IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKLQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgTE9HRSgiU2hvdWxkIG5vdCBiZSBoZXJlLCB1bmtub3duIG5hbFR5cGUgJWQiLCBuYWxUeXBlKTsKLSAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlIik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+c2V0X3JhbmdlKAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBmcmFnU2l6ZSArIDQsCisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFnU2l6ZSAtIDQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHJldHVybiBlcnI7CiB9CiAKIC8vIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BVkNFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmEzOTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw1MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFWQ0VuY29kZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBVkNFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorI2luY2x1ZGUgIk9NWF9WaWRlby5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbmxpbmUgc3RhdGljIHZvaWQgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqaW55dXYsIHVpbnQ4X3QqIG91dHl1diwKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKworICAgIGludDMyX3Qgb3V0WXNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICB1aW50MzJfdCAqb3V0eSA9ICAodWludDMyX3QgKikgb3V0eXV2OworICAgIHVpbnQxNl90ICpvdXRjYiA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUpOworICAgIHVpbnQxNl90ICpvdXRjciA9ICh1aW50MTZfdCAqKSAob3V0eXV2ICsgb3V0WXNpemUgKyAob3V0WXNpemUgPj4gMikpOworCisgICAgLyogWSBjb3B5aW5nICovCisgICAgbWVtY3B5KG91dHksIGlueXV2LCBvdXRZc2l6ZSk7CisKKyAgICAvKiBVICYgViBjb3B5aW5nICovCisgICAgdWludDMyX3QgKmlueXV2XzQgPSAodWludDMyX3QgKikgKGlueXV2ICsgb3V0WXNpemUpOworICAgIGZvciAoaW50MzJfdCBpID0gaGVpZ2h0ID4+IDE7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSB3aWR0aCA+PiAyOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wID0gKmlueXV2XzQrKzsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBVID0gdGVtcCAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wVSA9IHRlbXBVIHwgKCh0ZW1wID4+IDgpICYgMHhGRjAwKTsKKworICAgICAgICAgICAgdWludDMyX3QgdGVtcFYgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0ZW1wViA9IHRlbXBWIHwgKCh0ZW1wID4+IDE2KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIC8vIEZsaXAgVSBhbmQgVgorICAgICAgICAgICAgKm91dGNiKysgPSB0ZW1wVjsKKyAgICAgICAgICAgICpvdXRjcisrID0gdGVtcFU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90IE1hbGxvY1dyYXBwZXIoCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IHNpemUsIGludDMyX3QgYXR0cnMpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90PihtYWxsb2Moc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCBGcmVlV3JhcHBlcih2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBwdHIpIHsKKyAgICBmcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihwdHIpKTsKK30KKworc3RhdGljIGludDMyX3QgRHBiQWxsb2NXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLAorICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycykgeworICAgIEFWQ0VuY29kZXIgKmVuY29kZXIgPSBzdGF0aWNfY2FzdDxBVkNFbmNvZGVyICo+KHVzZXJEYXRhKTsKKyAgICBDSEVDSyhlbmNvZGVyICE9IE5VTEwpOworICAgIHJldHVybiBlbmNvZGVyLT5hbGxvY091dHB1dEJ1ZmZlcnMoc2l6ZUluTWJzLCBudW1CdWZmZXJzKTsKK30KKworc3RhdGljIGludDMyX3QgQmluZEZyYW1lV3JhcHBlcigKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsIGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpIHsKKyAgICBBVkNFbmNvZGVyICplbmNvZGVyID0gc3RhdGljX2Nhc3Q8QVZDRW5jb2RlciAqPih1c2VyRGF0YSk7CisgICAgQ0hFQ0soZW5jb2RlciAhPSBOVUxMKTsKKyAgICByZXR1cm4gZW5jb2Rlci0+YmluZE91dHB1dEJ1ZmZlcihpbmRleCwgeXV2KTsKK30KKworc3RhdGljIHZvaWQgVW5iaW5kRnJhbWVXcmFwcGVyKHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IGluZGV4KSB7CisgICAgQVZDRW5jb2RlciAqZW5jb2RlciA9IHN0YXRpY19jYXN0PEFWQ0VuY29kZXIgKj4odXNlckRhdGEpOworICAgIENIRUNLKGVuY29kZXIgIT0gTlVMTCk7CisgICAgcmV0dXJuIGVuY29kZXItPnVuYmluZE91dHB1dEJ1ZmZlcihpbmRleCk7Cit9CisKK0FWQ0VuY29kZXI6OkFWQ0VuY29kZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtTWV0YShtZXRhKSwKKyAgICAgIG1OdW1JbnB1dEZyYW1lcygtMSksCisgICAgICBtUHJldlRpbWVzdGFtcFVzKC0xKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1JbnB1dEZyYW1lRGF0YShOVUxMKSwKKyAgICAgIG1Hcm91cChOVUxMKSB7CisKKyAgICBMT0dWKCJDb25zdHJ1Y3Qgc29mdHdhcmUgQVZDRW5jb2RlciIpOworCisgICAgbUhhbmRsZSA9IG5ldyB0YWdBVkNIYW5kbGU7CisgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWdBVkNIYW5kbGUpKTsKKyAgICBtSGFuZGxlLT5BVkNPYmplY3QgPSBOVUxMOworICAgIG1IYW5kbGUtPnVzZXJEYXRhID0gdGhpczsKKyAgICBtSGFuZGxlLT5DQkFWQ19EUEJBbGxvYyA9IERwYkFsbG9jV3JhcHBlcjsKKyAgICBtSGFuZGxlLT5DQkFWQ19GcmFtZUJpbmQgPSBCaW5kRnJhbWVXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX0ZyYW1lVW5iaW5kID0gVW5iaW5kRnJhbWVXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX01hbGxvYyA9IE1hbGxvY1dyYXBwZXI7CisgICAgbUhhbmRsZS0+Q0JBVkNfRnJlZSA9IEZyZWVXcmFwcGVyOworCisgICAgbUluaXRDaGVjayA9IGluaXRDaGVjayhtZXRhKTsKK30KKworQVZDRW5jb2Rlcjo6fkFWQ0VuY29kZXIoKSB7CisgICAgTE9HVigiRGVzdHJ1Y3Qgc29mdHdhcmUgQVZDRW5jb2RlciIpOworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorCisgICAgZGVsZXRlIG1FbmNQYXJhbXM7CisgICAgZGVsZXRlIG1IYW5kbGU7Cit9CisKK3N0YXR1c190IEFWQ0VuY29kZXI6OmluaXRDaGVjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBMT0dWKCJpbml0Q2hlY2siKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmbVZpZGVvV2lkdGgpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJm1WaWRlb0hlaWdodCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1WaWRlb0ZyYW1lUmF0ZSkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJm1WaWRlb0JpdFJhdGUpKTsKKworICAgIC8vIFhYWDogQWRkIG1vcmUgY29sb3IgZm9ybWF0IHN1cHBvcnQKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmbVZpZGVvQ29sb3JGb3JtYXQpKTsKKyAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgeworICAgICAgICBpZiAobVZpZGVvQ29sb3JGb3JtYXQgIT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpIHsKKyAgICAgICAgICAgIExPR0UoIkNvbG9yIGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwgbVZpZGVvQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAvLyBBbGxvY2F0ZSBzcGFyZSBidWZmZXIgb25seSB3aGVuIGNvbG9yIGNvbnZlcnNpb24gaXMgbmVlZGVkLgorICAgICAgICAvLyBBc3N1bWUgdGhlIGNvbG9yIGZvcm1hdCBpcyBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hci4KKyAgICAgICAgbUlucHV0RnJhbWVEYXRhID0KKyAgICAgICAgICAgICh1aW50OF90ICopIG1hbGxvYygobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzICkgPj4gMSk7CisgICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSk7CisgICAgfQorCisgICAgLy8gWFhYOiBSZW1vdmUgdGhpcyByZXN0cmljdGlvbgorICAgIGlmIChtVmlkZW9XaWR0aCAlIDE2ICE9IDAgfHwgbVZpZGVvSGVpZ2h0ICUgMTYgIT0gMCkgeworICAgICAgICBMT0dFKCJWaWRlbyBmcmFtZSBzaXplICVkeCVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiIsCisgICAgICAgICAgICBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ0FWQ0VuY1BhcmFtOworICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YobUVuY1BhcmFtcykpOworICAgIG1FbmNQYXJhbXMtPndpZHRoID0gbVZpZGVvV2lkdGg7CisgICAgbUVuY1BhcmFtcy0+aGVpZ2h0ID0gbVZpZGVvSGVpZ2h0OworICAgIG1FbmNQYXJhbXMtPmZyYW1lX3JhdGUgPSAxMDAwICogbVZpZGVvRnJhbWVSYXRlOyAgLy8gSW4gZnJhbWVzL21zIQorICAgIG1FbmNQYXJhbXMtPnJhdGVfY29udHJvbCA9IEFWQ19PTjsKKyAgICBtRW5jUGFyYW1zLT5iaXRyYXRlID0gbVZpZGVvQml0UmF0ZTsKKyAgICBtRW5jUGFyYW1zLT5pbml0UVAgPSAwOworICAgIG1FbmNQYXJhbXMtPmluaXRfQ0JQX3JlbW92YWxfZGVsYXkgPSAxNjAwOworICAgIG1FbmNQYXJhbXMtPkNQQl9zaXplID0gKHVpbnQzMl90KSAobVZpZGVvQml0UmF0ZSA+PiAxKTsKKworICAgIG1FbmNQYXJhbXMtPmludHJhbWJfcmVmcmVzaCA9IDA7CisgICAgbUVuY1BhcmFtcy0+YXV0b19zY2QgPSBBVkNfT047CisgICAgbUVuY1BhcmFtcy0+b3V0X29mX2JhbmRfcGFyYW1fc2V0ID0gQVZDX09OOworICAgIG1FbmNQYXJhbXMtPnBvY190eXBlID0gMjsKKyAgICBtRW5jUGFyYW1zLT5sb2cyX21heF9wb2NfbHNiX21pbnVzXzQgPSAxMjsKKyAgICBtRW5jUGFyYW1zLT5kZWx0YV9wb2NfemVyb19mbGFnID0gMDsKKyAgICBtRW5jUGFyYW1zLT5vZmZzZXRfcG9jX25vbl9yZWYgPSAwOworICAgIG1FbmNQYXJhbXMtPm9mZnNldF90b3BfYm90dG9tID0gMDsKKyAgICBtRW5jUGFyYW1zLT5udW1fcmVmX2luX2N5Y2xlID0gMDsKKyAgICBtRW5jUGFyYW1zLT5vZmZzZXRfcG9jX3JlZiA9IE5VTEw7CisKKyAgICBtRW5jUGFyYW1zLT5udW1fcmVmX2ZyYW1lID0gMTsKKyAgICBtRW5jUGFyYW1zLT5udW1fc2xpY2VfZ3JvdXAgPSAxOworICAgIG1FbmNQYXJhbXMtPmZtb190eXBlID0gMDsKKworICAgIG1FbmNQYXJhbXMtPmRiX2ZpbHRlciA9IEFWQ19PTjsKKyAgICBtRW5jUGFyYW1zLT5kaXNhYmxlX2RiX2lkYyA9IDA7CisKKyAgICBtRW5jUGFyYW1zLT5hbHBoYV9vZmZzZXQgPSAwOworICAgIG1FbmNQYXJhbXMtPmJldGFfb2Zmc2V0ID0gMDsKKyAgICBtRW5jUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkID0gQVZDX09GRjsKKworICAgIG1FbmNQYXJhbXMtPmRhdGFfcGFyID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5mdWxsc2VhcmNoID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5zZWFyY2hfcmFuZ2UgPSAxNjsKKyAgICBtRW5jUGFyYW1zLT5zdWJfcGVsID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5zdWJtYl9wcmVkID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5yZG9wdF9tb2RlID0gQVZDX09GRjsKKyAgICBtRW5jUGFyYW1zLT5iaWRpcl9wcmVkID0gQVZDX09GRjsKKyAgICBpbnQzMl90IG5NYWNyb0Jsb2NrcyA9ICgoKChtVmlkZW9XaWR0aCArIDE1KSA+PiA0KSA8PCA0KSAqCisgICAgICAgICAgICAoKChtVmlkZW9IZWlnaHQgKyAxNSkgPj4gNCkgPDwgNCkpID4+IDg7CisgICAgdWludDMyX3QgKnNsaWNlR3JvdXAgPSAodWludDMyX3QgKikgbWFsbG9jKHNpemVvZih1aW50MzJfdCkgKiBuTWFjcm9CbG9ja3MpOworICAgIGZvciAoaW50IGlpID0gMCwgaWR4ID0gMDsgaWkgPCBuTWFjcm9CbG9ja3M7ICsraWkpIHsKKyAgICAgICAgc2xpY2VHcm91cFtpaV0gPSBpZHgrKzsKKyAgICAgICAgaWYgKGlkeCA+PSBtRW5jUGFyYW1zLT5udW1fc2xpY2VfZ3JvdXApIHsKKyAgICAgICAgICAgIGlkeCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVuY1BhcmFtcy0+c2xpY2VfZ3JvdXAgPSBzbGljZUdyb3VwOworCisgICAgbUVuY1BhcmFtcy0+dXNlX292ZXJydW5fYnVmZmVyID0gQVZDX09GRjsKKworICAgIC8vIFNldCBJRFIgZnJhbWUgcmVmcmVzaCBpbnRlcnZhbAorICAgIGludDMyX3QgaUZyYW1lc0ludGVydmFsU2VjOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SUZyYW1lc0ludGVydmFsLCAmaUZyYW1lc0ludGVydmFsU2VjKSk7CisgICAgaWYgKGlGcmFtZXNJbnRlcnZhbFNlYyA8IDApIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aWRyX3BlcmlvZCA9IC0xOworICAgIH0gZWxzZSBpZiAoaUZyYW1lc0ludGVydmFsU2VjID09IDApIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aWRyX3BlcmlvZCA9IDE7ICAvLyBBbGwgSSBmcmFtZXMKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jUGFyYW1zLT5pZHJfcGVyaW9kID0KKyAgICAgICAgICAgIChpRnJhbWVzSW50ZXJ2YWxTZWMgKiBtVmlkZW9GcmFtZVJhdGUpOworICAgIH0KKyAgICBMT0dWKCJpZHJfcGVyaW9kOiAlZCwgSS1mcmFtZXMgaW50ZXJ2YWw6ICVkIHNlY29uZHMsIGFuZCBmcmFtZSByYXRlOiAlZCIsCisgICAgICAgIG1FbmNQYXJhbXMtPmlkcl9wZXJpb2QsIGlGcmFtZXNJbnRlcnZhbFNlYywgbVZpZGVvRnJhbWVSYXRlKTsKKworICAgIC8vIFNldCBwcm9maWxlIGFuZCBsZXZlbAorICAgIC8vIElmIHByb2ZpbGUgYW5kIGxldmVsIHNldHRpbmcgaXMgbm90IGNvcnJlY3QsIGZhaWx1cmUKKyAgICAvLyBpcyByZXBvcnRlZCB3aGVuIHRoZSBlbmNvZGVyIGlzIGluaXRpYWxpemVkLgorICAgIG1FbmNQYXJhbXMtPnByb2ZpbGUgPSBBVkNfQkFTRUxJTkU7CisgICAgbUVuY1BhcmFtcy0+bGV2ZWwgPSBBVkNfTEVWRUwzXzI7CisgICAgaW50MzJfdCBwcm9maWxlLCBsZXZlbDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKSkgeworICAgICAgICBtRW5jUGFyYW1zLT5wcm9maWxlID0gKEFWQ1Byb2ZpbGUpIHByb2ZpbGU7CisgICAgfQorICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCkpIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+bGV2ZWwgPSAoQVZDTGV2ZWwpIGxldmVsOworICAgIH0KKworCisgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIG1WaWRlb1dpZHRoKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtVmlkZW9IZWlnaHQpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpZGVvRnJhbWVSYXRlKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIG1WaWRlb0NvbG9yRm9ybWF0KTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiQVZDRW5jb2RlciIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVZDRW5jb2Rlcjo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIExPR1YoInN0YXJ0Iik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RhcnQoKSB3aGVuIGVuY29kZXIgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBVkNFbmNfU3RhdHVzIGVycjsKKyAgICBlcnIgPSBQVkFWQ0VuY0luaXRpYWxpemUobUhhbmRsZSwgbUVuY1BhcmFtcywgTlVMTCwgTlVMTCk7CisgICAgaWYgKGVyciAhPSBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZW5jb2RlcjogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgIGludDMyX3QgbWF4U2l6ZTsKKyAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0KKyAgICAgICAgUFZBVkNFbmNHZXRNYXhPdXRwdXRCdWZmZXJTaXplKG1IYW5kbGUsICZtYXhTaXplKSkgeworICAgICAgICBtYXhTaXplID0gMzE1ODQ7ICAvLyBNYWdpYyAjCisgICAgfQorICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihuZXcgTWVkaWFCdWZmZXIobWF4U2l6ZSkpOworCisgICAgbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKyAgICBtTnVtSW5wdXRGcmFtZXMgPSAtMjsgIC8vIDFzdCB0d28gYnVmZmVycyBjb250YWluIFNQUyBhbmQgUFBTCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1SZWFkeUZvck5leHRGcmFtZSA9IHRydWU7CisgICAgbUlzSURSRnJhbWUgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVkNFbmNvZGVyOjpzdG9wKCkgeworICAgIExPR1YoInN0b3AiKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RvcCgpIHdoZW4gZW5jb2RlciBoYXMgbm90IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1Hcm91cCkgeworICAgICAgICBkZWxldGUgbUdyb3VwOworICAgICAgICBtR3JvdXAgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtSW5wdXRGcmFtZURhdGEpIHsKKyAgICAgICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKG1IYW5kbGUpOworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICByZWxlYXNlT3V0cHV0QnVmZmVycygpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQVZDRW5jb2Rlcjo6cmVsZWFzZU91dHB1dEJ1ZmZlcnMoKSB7CisgICAgTE9HVigicmVsZWFzZU91dHB1dEJ1ZmZlcnMiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRCdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBtT3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGkpOworICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKE5VTEwpOworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgbU91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKK30KKworc3A8TWV0YURhdGE+IEFWQ0VuY29kZXI6OmdldEZvcm1hdCgpIHsKKyAgICBMT0dWKCJnZXRGb3JtYXQiKTsKKyAgICByZXR1cm4gbUZvcm1hdDsKK30KKworc3RhdHVzX3QgQVZDRW5jb2Rlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICBDSEVDSyghb3B0aW9ucyk7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBNZWRpYUJ1ZmZlciAqb3V0cHV0QnVmZmVyOworICAgIENIRUNLX0VRKE9LLCBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRwdXRCdWZmZXIpKTsKKyAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKSBvdXRwdXRCdWZmZXItPmRhdGEoKTsKKyAgICB1aW50MzJfdCBkYXRhTGVuZ3RoID0gb3V0cHV0QnVmZmVyLT5zaXplKCk7CisKKyAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCAmJiBtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIDQgYnl0ZXMgYXJlIHJlc2VydmVkIGZvciBob2xkaW5nIHRoZSBzdGFydCBjb2RlIDB4MDAwMDAwMDEKKyAgICAgICAgLy8gb2YgdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgICAgb3V0UHRyICs9IDQ7CisgICAgICAgIGRhdGFMZW5ndGggLT0gNDsKKyAgICB9CisKKyAgICBpbnQzMl90IHR5cGU7CisgICAgQVZDRW5jX1N0YXR1cyBlbmNvZGVyU3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICAvLyBDb21iaW5lIFNQUyBhbmQgUFBTIGFuZCBwbGFjZSB0aGVtIGluIHRoZSB2ZXJ5IGZpcnN0IG91dHB1dCBidWZmZXIKKyAgICAvLyBTUFMgYW5kIFBQUyBhcmUgc2VwYXJhdGVkIGJ5IHN0YXJ0IGNvZGUgMHgwMDAwMDAwMQorICAgIC8vIEFzc3VtZSB0aGF0IHdlIGhhdmUgZXhhY3RseSBvbmUgU1BTIGFuZCBleGFjdGx5IG9uZSBQUFMuCisgICAgd2hpbGUgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgJiYgbU51bUlucHV0RnJhbWVzIDw9IDApIHsKKyAgICAgICAgZW5jb2RlclN0YXR1cyA9IFBWQVZDRW5jb2RlTkFMKG1IYW5kbGUsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZ0eXBlKTsKKyAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1dST05HX1NUQVRFKSB7CisgICAgICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgbU51bUlucHV0RnJhbWVzKTsgIC8vIDFzdCB2aWRlbyBmcmFtZSBpcyAwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NQUzoKKyAgICAgICAgICAgICAgICAgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKW91dHB1dEJ1ZmZlci0+ZGF0YSgpLCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCBkYXRhTGVuZ3RoICsgNCk7CisgICAgICAgICAgICAgICAgICAgIG91dFB0ciArPSAoZGF0YUxlbmd0aCArIDQpOyAgLy8gNCBieXRlcyBmb3IgbmV4dCBzdGFydCBjb2RlCisgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggPSBvdXRwdXRCdWZmZXItPnNpemUoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG91dHB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVkNfTkFMVFlQRV9QUFM6CisgICAgICAgICAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKCh1aW50OF90ICopIG91dHB1dEJ1ZmZlci0+ZGF0YSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW5ndGggKyBvdXRwdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpICsgNCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIDApOworICAgICAgICAgICAgICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTmFsIHR5cGUgKCVkKSBvdGhlciB0aGFuIFNQUy9QUFMgaXMgdW5leHBlY3RlZCIsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEdldCBuZXh0IGlucHV0IHZpZGVvIGZyYW1lCisgICAgaWYgKG1SZWFkeUZvck5leHRGcmFtZSkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlYWQgaW5wdXQgdmlkZW8gZnJhbWU6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnNpemUoKSAtICgobVZpZGVvV2lkdGggKiBtVmlkZW9IZWlnaHQgKiAzKSA+PiAxKSAhPSAwKSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICBvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICAgICAvLyBXaGVuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGlzIHRoZSBzYW1lIGFzCisgICAgICAgIC8vIHRoYXQgb2YgdGhlIHByZXZpb3VzIHNhbXBsZSwgdGhlIGVuY29kaW5nIG9mIHRoZSBzYW1wbGUKKyAgICAgICAgLy8gaXMgYnlwYXNzZWQsIGFuZCB0aGUgb3V0cHV0IGxlbmd0aCBpcyBzZXQgdG8gMC4KKyAgICAgICAgaWYgKG1OdW1JbnB1dEZyYW1lcyA+PSAxICYmIG1QcmV2VGltZXN0YW1wVXMgPT0gdGltZVVzKSB7CisgICAgICAgICAgICAvLyBGcmFtZSBhcnJpdmVzIHRvbyBsYXRlCisgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICpvdXQgPSBvdXRwdXRCdWZmZXI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBhY2NlcHQgb3V0LW9mLW9yZGVyIHNhbXBsZXMKKyAgICAgICAgQ0hFQ0sobVByZXZUaW1lc3RhbXBVcyA8IHRpbWVVcyk7CisgICAgICAgIG1QcmV2VGltZXN0YW1wVXMgPSB0aW1lVXM7CisKKyAgICAgICAgQVZDRnJhbWVJTyB2aWRlb0lucHV0OworICAgICAgICBtZW1zZXQoJnZpZGVvSW5wdXQsIDAsIHNpemVvZih2aWRlb0lucHV0KSk7CisgICAgICAgIHZpZGVvSW5wdXQuaGVpZ2h0ID0gKChtVmlkZW9IZWlnaHQgICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgIHZpZGVvSW5wdXQucGl0Y2ggPSAoKG1WaWRlb1dpZHRoICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgIHZpZGVvSW5wdXQuY29kaW5nX3RpbWVzdGFtcCA9ICh0aW1lVXMgKyA1MDApIC8gMTAwMDsgIC8vIGluIG1zCisgICAgICAgIHVpbnQ4X3QgKmlucHV0RGF0YSA9ICh1aW50OF90ICopIG1JbnB1dEJ1ZmZlci0+ZGF0YSgpOworCisgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgICAgICBDSEVDSyhtSW5wdXRGcmFtZURhdGEpOworICAgICAgICAgICAgQ0hFQ0sobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICAgICAgQ29udmVydFlVVjQyMFNlbWlQbGFuYXJUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICBpbnB1dERhdGEgPSBtSW5wdXRGcmFtZURhdGE7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0soaW5wdXREYXRhICE9IE5VTEwpOworICAgICAgICB2aWRlb0lucHV0LllDYkNyWzBdID0gaW5wdXREYXRhOworICAgICAgICB2aWRlb0lucHV0LllDYkNyWzFdID0gdmlkZW9JbnB1dC5ZQ2JDclswXSArIHZpZGVvSW5wdXQuaGVpZ2h0ICogdmlkZW9JbnB1dC5waXRjaDsKKyAgICAgICAgdmlkZW9JbnB1dC5ZQ2JDclsyXSA9IHZpZGVvSW5wdXQuWUNiQ3JbMV0gKworICAgICAgICAgICAgKCh2aWRlb0lucHV0LmhlaWdodCAqIHZpZGVvSW5wdXQucGl0Y2gpID4+IDIpOworICAgICAgICB2aWRlb0lucHV0LmRpc3Bfb3JkZXIgPSBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgICAgZW5jb2RlclN0YXR1cyA9IFBWQVZDRW5jU2V0SW5wdXQobUhhbmRsZSwgJnZpZGVvSW5wdXQpOworICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUyB8fAorICAgICAgICAgICAgZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfTkVXX0lEUikgeworICAgICAgICAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lID0gZmFsc2U7CisgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICAgICAgICAgIGlmIChlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19ORVdfSURSKSB7CisgICAgICAgICAgICAgICAgbUlzSURSRnJhbWUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVuY29kZSBhbiBpbnB1dCB2aWRlbyBmcmFtZQorICAgIENIRUNLKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MgfHwKKyAgICAgICAgICBlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19ORVdfSURSKTsKKyAgICBkYXRhTGVuZ3RoID0gb3V0cHV0QnVmZmVyLT5zaXplKCk7ICAvLyBSZXNldCB0aGUgb3V0cHV0IGJ1ZmZlciBsZW5ndGgKKyAgICBlbmNvZGVyU3RhdHVzID0gUFZBVkNFbmNvZGVOQUwobUhhbmRsZSwgb3V0UHRyLCAmZGF0YUxlbmd0aCwgJnR5cGUpOworICAgIGlmIChlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTKSB7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgbUlzSURSRnJhbWUpOworICAgICAgICBDSEVDS19FUShOVUxMLCBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworICAgIH0gZWxzZSBpZiAoZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfUElDVFVSRV9SRUFEWSkgeworICAgICAgICBDSEVDS19FUShOVUxMLCBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIobUhhbmRsZSkpOworICAgICAgICBpZiAobUlzSURSRnJhbWUpIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgbUlzSURSRnJhbWUpOworICAgICAgICAgICAgbUlzSURSRnJhbWUgPSAwOworICAgICAgICAgICAgTE9HVigiT3V0cHV0IGFuIElEUiBmcmFtZSIpOworICAgICAgICB9CisgICAgICAgIG1SZWFkeUZvck5leHRGcmFtZSA9IHRydWU7CisgICAgICAgIEFWQ0ZyYW1lSU8gcmVjb247CisgICAgICAgIGlmIChQVkFWQ0VuY0dldFJlY29uKG1IYW5kbGUsICZyZWNvbikgPT0gQVZDRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIFBWQVZDRW5jUmVsZWFzZVJlY29uKG1IYW5kbGUsICZyZWNvbik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhTGVuZ3RoID0gMDsKKyAgICAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGVuY29kZXJTdGF0dXMgPCBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb3V0cHV0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgZGF0YUxlbmd0aCk7CisgICAgKm91dCA9IG91dHB1dEJ1ZmZlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKK2ludDMyX3QgQVZDRW5jb2Rlcjo6YWxsb2NPdXRwdXRCdWZmZXJzKAorICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycykgeworICAgIENIRUNLKG1PdXRwdXRCdWZmZXJzLmlzRW1wdHkoKSk7CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IChzaXplSW5NYnMgPDwgNykgKiAzOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgIG51bUJ1ZmZlcnM7ICsraSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGZyYW1lU2l6ZSk7CisgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJzLnB1c2goYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBBVkNFbmNvZGVyOjp1bmJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCkgeworICAgIENIRUNLKGluZGV4ID49IDApOworfQorCitpbnQzMl90IEFWQ0VuY29kZXI6OmJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCwgdWludDhfdCAqKnl1dikgeworICAgIENIRUNLKGluZGV4ID49IDApOworICAgIENIRUNLKGluZGV4IDwgKGludDMyX3QpIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobUlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgbU91dHB1dEJ1ZmZlcnNbaW5kZXhdLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICAqeXV2ID0gKHVpbnQ4X3QgKikgbU91dHB1dEJ1ZmZlcnNbaW5kZXhdLT5kYXRhKCk7CisKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBBVkNFbmNvZGVyOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBmMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM1IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBBVkNFbmNvZGVyLmNwcCBcCisgICAgc3JjL2F2Y2VuY19hcGkuY3BwIFwKKyAgICBzcmMvYml0c3RyZWFtX2lvLmNwcCBcCisgICAgc3JjL2Jsb2NrLmNwcCBcCisgICAgc3JjL2ZpbmRoYWxmcGVsLmNwcCBcCisgICAgc3JjL2hlYWRlci5jcHAgXAorICAgIHNyYy9pbml0LmNwcCBcCisgICAgc3JjL2ludHJhX2VzdC5jcHAgXAorICAgIHNyYy9tb3Rpb25fY29tcC5jcHAgXAorICAgIHNyYy9tb3Rpb25fZXN0LmNwcCBcCisgICAgc3JjL3JhdGVfY29udHJvbC5jcHAgXAorICAgIHNyYy9yZXNpZHVhbC5jcHAgXAorICAgIHNyYy9zYWQuY3BwIFwKKyAgICBzcmMvc2FkX2hhbGZwZWwuY3BwIFwKKyAgICBzcmMvc2xpY2UuY3BwIFwKKyAgICBzcmMvdmxjX2VuY29kZS5jcHAKKworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfYXZjZW5jCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUgXAorICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgOj0gXAorICAgIC1EX19hcm1fXyBcCisgICAgLURPU0NMX0lNUE9SVF9SRUY9IC1ET1NDTF9VTlVTRURfQVJHPSAtRE9TQ0xfRVhQT1JUX1JFRj0KKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTg4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5jcHAKQEAgLTAsMCArMSw3NDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgorI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0dldE5BTFR5cGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogU25pZmYgTkFMIHR5cGUgZnJvbSB0aGUgYml0c3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2NlZWQsIEFWQ0VOQ19GQUlMIGlmIGZhaWwuICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0TkFMVHlwZSh1bnNpZ25lZCBjaGFyICpiaXRzdHJlYW0sIGludCBzaXplLAorICAgICAgICBpbnQgKm5hbF90eXBlLCBpbnQgKm5hbF9yZWZfaWRjKQoreworICAgIGludCBmb3JiaWRkZW5femVyb19iaXQ7CisgICAgaWYgKHNpemUgPiAwKQorICAgIHsKKyAgICAgICAgZm9yYmlkZGVuX3plcm9fYml0ID0gYml0c3RyZWFtWzBdID4+IDc7CisgICAgICAgIGlmIChmb3JiaWRkZW5femVyb19iaXQgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICAgICAgKm5hbF9yZWZfaWRjID0gKGJpdHN0cmVhbVswXSAmIDB4NjApID4+IDU7CisgICAgICAgICpuYWxfdHlwZSA9IGJpdHN0cmVhbVswXSAmIDB4MUY7CisgICAgICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY0luaXRpYWxpemUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMTgvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogSW5pdGlhbGl6ZSB0aGUgZW5jb2RlciBsaWJyYXJ5LCBhbGxvY2F0ZSBtZW1vcnkgYW5kIHZlcmlmeSAgICovCisvKiAgICAgICAgICAgICAgdGhlIHByb2ZpbGUvbGV2ZWwgc3VwcG9ydC9zZXR0aW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IEVuY29kaW5nIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNJbml0aWFsaXplKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNFbmNQYXJhbXMgKmVuY1BhcmFtLAorICAgICAgICB2b2lkKiBleHRTUFMsIHZvaWQqIGV4dFBQUykKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvOworICAgIHVpbnQzMiAqdXNlckRhdGEgPSAodWludDMyKikgYXZjSGFuZGxlLT51c2VyRGF0YTsKKyAgICBpbnQgZnJhbWVzaXplOworCisgICAgaWYgKGF2Y0hhbmRsZS0+QVZDT2JqZWN0ICE9IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0FMUkVBRFlfSU5JVElBTElaRUQ7IC8qIEl0J3MgYWxyZWFkeSBpbml0aWFsaXplZCwgbmVlZCB0byBjbGVhbnVwIGZpcnN0ICovCisgICAgfQorCisgICAgLyogbm90IGluaXRpYWxpemVkICovCisKKyAgICAvKiBhbGxvY2F0ZSB2aWRlb09iamVjdCAqLworICAgIGF2Y0hhbmRsZS0+QVZDT2JqZWN0ID0gKHZvaWQqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDRW5jT2JqZWN0KSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoYXZjSGFuZGxlLT5BVkNPYmplY3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIG1lbXNldChlbmN2aWQsIDAsIHNpemVvZihBVkNFbmNPYmplY3QpKTsgLyogcmVzZXQgZXZlcnl0aGluZyAqLworCisgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfSW5pdGlhbGl6aW5nOworCisgICAgZW5jdmlkLT5hdmNIYW5kbGUgPSBhdmNIYW5kbGU7CisKKyAgICBlbmN2aWQtPmNvbW1vbiA9IChBVkNDb21tb25PYmoqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0NvbW1vbk9iaiksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+Y29tbW9uID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIHZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgbWVtc2V0KHZpZGVvLCAwLCBzaXplb2YoQVZDQ29tbW9uT2JqKSk7CisKKyAgICAvKiBhbGxvY2F0ZSBiaXRzdHJlYW0gc3RydWN0dXJlICovCisgICAgZW5jdmlkLT5iaXRzdHJlYW0gPSAoQVZDRW5jQml0c3RyZWFtKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNFbmNCaXRzdHJlYW0pLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPmJpdHN0cmVhbSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgZW5jdmlkLT5iaXRzdHJlYW0tPmVuY3ZpZCA9IGVuY3ZpZDsgLyogdG8gcG9pbnQgYmFjayBmb3IgcmVhbGxvY2F0aW9uICovCisKKyAgICAvKiBhbGxvY2F0ZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IHN0cnVjdHVyZSAqLworICAgIHZpZGVvLT5jdXJyU2VxUGFyYW1zID0gKEFWQ1NlcVBhcmFtU2V0KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNTZXFQYXJhbVNldCksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5jdXJyU2VxUGFyYW1zID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQodmlkZW8tPmN1cnJTZXFQYXJhbXMsIDAsIHNpemVvZihBVkNTZXFQYXJhbVNldCkpOworCisgICAgLyogYWxsb2NhdGUgcGljdHVyZSBwYXJhbWV0ZXIgc2V0IHN0cnVjdHVyZSAqLworICAgIHZpZGVvLT5jdXJyUGljUGFyYW1zID0gKEFWQ1BpY1BhcmFtU2V0KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNQaWNQYXJhbVNldCksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQodmlkZW8tPmN1cnJQaWNQYXJhbXMsIDAsIHNpemVvZihBVkNQaWNQYXJhbVNldCkpOworCisgICAgLyogYWxsb2NhdGUgc2xpY2UgaGVhZGVyIHN0cnVjdHVyZSAqLworICAgIHZpZGVvLT5zbGljZUhkciA9IChBVkNTbGljZUhlYWRlciopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDU2xpY2VIZWFkZXIpLCBERUZBVUxUX0FUVFIpOworICAgIGlmICh2aWRlby0+c2xpY2VIZHIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+c2xpY2VIZHIsIDAsIHNpemVvZihBVkNTbGljZUhlYWRlcikpOworCisgICAgLyogYWxsb2NhdGUgZW5jb2RlZCBwaWN0dXJlIGJ1ZmZlciBzdHJ1Y3R1cmUqLworICAgIHZpZGVvLT5kZWNQaWNCdWYgPSAoQVZDRGVjUGljQnVmZmVyKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNEZWNQaWNCdWZmZXIpLCBERUZBVUxUX0FUVFIpOworICAgIGlmICh2aWRlby0+ZGVjUGljQnVmID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQodmlkZW8tPmRlY1BpY0J1ZiwgMCwgc2l6ZW9mKEFWQ0RlY1BpY0J1ZmZlcikpOworCisgICAgLyogYWxsb2NhdGUgcmF0ZSBjb250cm9sIHN0cnVjdHVyZSAqLworICAgIGVuY3ZpZC0+cmF0ZUN0cmwgPSAoQVZDUmF0ZUNvbnRyb2wqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1JhdGVDb250cm9sKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5yYXRlQ3RybCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KGVuY3ZpZC0+cmF0ZUN0cmwsIDAsIHNpemVvZihBVkNSYXRlQ29udHJvbCkpOworCisgICAgLyogcmVzZXQgZnJhbWUgbGlzdCwgbm90IHJlYWxseSBuZWVkZWQgKi8KKyAgICB2aWRlby0+Y3VyclBpYyA9IE5VTEw7CisgICAgdmlkZW8tPmN1cnJGUyA9IE5VTEw7CisgICAgZW5jdmlkLT5jdXJySW5wdXQgPSBOVUxMOworICAgIHZpZGVvLT5wcmV2UmVmUGljID0gTlVMTDsKKworICAgIC8qIG5vdyByZWFkIGVuY1BhcmFtcywgYW5kIGFsbG9jYXRlIGRpbWVuc2lvbi1kZXBlbmRlbnQgdmFyaWFibGVzICovCisgICAgLyogc3VjaCBhcyBtYmxvY2sgKi8KKyAgICBzdGF0dXMgPSBTZXRFbmNvZGVQYXJhbShhdmNIYW5kbGUsIGVuY1BhcmFtLCBleHRTUFMsIGV4dFBQUyk7IC8qIGluaXRpYWxpemVkIHZhcmlhYmxlcyB0byBiZSB1c2VkIGluIFNQUyovCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKGVuY1BhcmFtLT51c2Vfb3ZlcnJ1bl9idWZmZXIgPT0gQVZDX09OKQorICAgIHsKKyAgICAgICAgLyogYWxsb2NhdGUgb3ZlcnJ1biBidWZmZXIgKi8KKyAgICAgICAgZW5jdmlkLT5vQlNpemUgPSBlbmN2aWQtPnJhdGVDdHJsLT5jcGJTaXplOworICAgICAgICBpZiAoZW5jdmlkLT5vQlNpemUgPiBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+b0JTaXplID0gREVGQVVMVF9PVkVSUlVOX0JVRkZFUl9TSVpFOworICAgICAgICB9CisgICAgICAgIGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9ICh1aW50OCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBlbmN2aWQtPm9CU2l6ZSwgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgaWYgKGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+b0JTaXplID0gMDsKKyAgICAgICAgZW5jdmlkLT5vdmVycnVuQnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBmcmFtZSBzaXplIGRlcGVuZGVudCBzdHJ1Y3R1cmVzICovCisgICAgZnJhbWVzaXplID0gdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnMgKiB2aWRlby0+UGljV2lkdGhJbk1iczsKKworICAgIHZpZGVvLT5tYmxvY2sgPSAoQVZDTWFjcm9ibG9jayopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDTWFjcm9ibG9jaykgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5tYmxvY2sgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwID0gKGludCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YodWludCkgKiB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgKiAyLCBERUZBVUxUX0FUVFIpOworICAgIGlmICh2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXAgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgZW5jdmlkLT5tb3QxNngxNiA9IChBVkNNViopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDTVYpICogZnJhbWVzaXplLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPm1vdDE2eDE2ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQoZW5jdmlkLT5tb3QxNngxNiwgMCwgc2l6ZW9mKEFWQ01WKSpmcmFtZXNpemUpOworCisgICAgZW5jdmlkLT5pbnRyYVNlYXJjaCA9ICh1aW50OCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YodWludDgpICogZnJhbWVzaXplLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPmludHJhU2VhcmNoID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIGVuY3ZpZC0+bWluX2Nvc3QgPSAoaW50KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihpbnQpICogZnJhbWVzaXplLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPm1pbl9jb3N0ID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgbW90aW9uIHNlYXJjaCByZWxhdGVkIG1lbW9yeSAqLworICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPSBJbml0TW90aW9uU2VhcmNoTW9kdWxlKGF2Y0hhbmRsZSkpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKworICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPSBJbml0UmF0ZUNvbnRyb2xNb2R1bGUoYXZjSGFuZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgLyogaW50aWFsaXplIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXIgPSAoQVZDRW5jRnVuY1B0ciopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDRW5jRnVuY1B0ciksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2sgPSAmQVZDU0FEX01hY3JvYmxvY2tfQzsKKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMF0gPSBOVUxMOworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsxXSA9ICZBVkNTQURfTUJfSGFsZlBlbF9DeGg7CisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzJdID0gJkFWQ1NBRF9NQl9IYWxmUGVsX0N5aDsKKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbM10gPSAmQVZDU0FEX01CX0hhbGZQZWxfQ3hoeWg7CisKKyAgICAvKiBpbml0aWFsaXplIHRpbWluZyBjb250cm9sICovCisgICAgZW5jdmlkLT5tb2RUaW1lUmVmID0gMDsgICAgIC8qIEFMV0FZUyBBU1NVTUUgVEhBVCBUSU1FU1RBTVAgU1RBUlQgRlJPTSAwICEhISovCisgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IDA7CisgICAgZW5jdmlkLT5wcmV2Q29kZWRGcmFtZU51bSA9IDA7CisgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmID0gMDsKKworICAgIGlmIChlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IFRSVUUpCisgICAgeworICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19TUFM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0FuYWx5emluZ19GcmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNHZXRNYXhPdXRwdXRTaXplKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMS8yOS8yMDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFJldHVybiBtYXggb3V0cHV0IGJ1ZmZlciBzaXplIHRoYXQgYXBwcyBzaG91bGQgYWxsb2NhdGUgZm9yICAqLworLyogICAgICAgICAgICAgIG91dHB1dCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXRNYXhPdXRwdXRCdWZmZXJTaXplKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQqIHNpemUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilhdmNIYW5kbGUtPkFWQ09iamVjdDsKKworICAgIGlmIChlbmN2aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfVU5JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IGVuY3ZpZC0+cmF0ZUN0cmwtPmNwYlNpemU7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNTZXRJbnB1dCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA0LzE4LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRvIGZlZWQgYW4gdW5lbmNvZGVkIG9yaWdpbmFsIGZyYW1lIHRvIHRoZSBlbmNvZGVyIGxpYnJhcnkuICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1NldElucHV0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICppbnB1dCkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworCisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgdWludCBmcmFtZU51bTsKKworICAgIGlmIChlbmN2aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfVU5JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICBpZiAoZW5jdmlkLT5lbmNfc3RhdGUgPT0gQVZDRW5jX1dhaXRpbmdGb3JCdWZmZXIpCisgICAgeworICAgICAgICBnb3RvIFJFQ0FMTF9JTklURlJBTUU7CisgICAgfQorICAgIGVsc2UgaWYgKGVuY3ZpZC0+ZW5jX3N0YXRlICE9IEFWQ0VuY19BbmFseXppbmdfRnJhbWUpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgfQorCisgICAgaWYgKGlucHV0LT5waXRjaCA+IDB4RkZGRikKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsgLy8gd2UgdXNlIDItYnl0ZXMgZm9yIHBpdGNoCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogTGV0J3MgcmF0ZSBjb250cm9sIGRlY2lkZSB3aGV0aGVyIHRvIGVuY29kZSB0aGlzIGZyYW1lIG9yIG5vdCAqLworICAgIC8qIEFsc28gc2V0IHZpZGVvLT5uYWxfdW5pdF90eXBlLCBzbGljZUhkci0+c2xpY2VfdHlwZSwgdmlkZW8tPnNsaWNlX3R5cGUgKi8KKyAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0gUkNEZXRlcm1pbmVGcmFtZU51bShlbmN2aWQsIHJhdGVDdHJsLCBpbnB1dC0+Y29kaW5nX3RpbWVzdGFtcCwgJmZyYW1lTnVtKSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfU0tJUFBFRF9QSUNUVVJFOyAvKiBub3QgdGltZSB0byBlbmNvZGUsIHRodXMgc2tpcHBpbmcgKi8KKyAgICB9CisKKyAgICAvKiB3ZSBtYXkgbm90IG5lZWQgdGhpcyBsaW5lICovCisgICAgLy9uZXh0RnJtTW9kVGltZSA9ICh1aW50MzIpKCgoKGZyYW1lTnVtKzEpKjEwMDApL3JhdGVDdHJsLT5mcmFtZV9yYXRlKSArIG1vZFRpbWVSZWYpOyAvKiByZWMuIHRpbWUgKi8KKyAgICAvL2VuY3ZpZC0+bmV4dE1vZFRpbWUgPSBuZXh0RnJtTW9kVGltZSAtIChlbmN2aWQtPmZyYW1lSW50ZXJ2YWw+PjEpIC0gMTsgLyogYmV0d2VlbiBjdXJyZW50IGFuZCBuZXh0IGZyYW1lICovCisKKyAgICBlbmN2aWQtPmN1cnJJbnB1dCA9IGlucHV0OworICAgIGVuY3ZpZC0+Y3VycklucHV0LT5jb2Rpbmdfb3JkZXIgPSBmcmFtZU51bTsKKworUkVDQUxMX0lOSVRGUkFNRToKKyAgICAvKiBpbml0aWFsaXplIGFuZCBhbmFseXplIHRoZSBmcmFtZSAqLworICAgIHN0YXR1cyA9IEluaXRGcmFtZShlbmN2aWQpOworCisgICAgaWYgKHN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX0ZyYW1lOworICAgIH0KKyAgICBlbHNlIGlmIChzdGF0dXMgPT0gQVZDRU5DX05FV19JRFIpCisgICAgeworICAgICAgICBpZiAoZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19GcmFtZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGFzc3VtaW5nIHRoYXQgaW4tYmFuZCBwYXJhbXNldCBrZWVwcyBzZW5kaW5nIG5ldyBTUFMgYW5kIFBQUy4KKyAgICAgICAgeworICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfU1BTOworICAgICAgICAgICAgLy92aWRlby0+Y3VyclNlcVBhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQrKzsKKyAgICAgICAgICAgIC8vaWYodmlkZW8tPmN1cnJTZXFQYXJhbXMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID4gMzEpIC8vIHJhbmdlIGNoZWNrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJTZXFQYXJhbXMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gMDsgIC8vIHJlc2V0CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+c2xpY2VIZHItPmlkcl9waWNfaWQrKzsKKyAgICAgICAgaWYgKHZpZGVvLT5zbGljZUhkci0+aWRyX3BpY19pZCA+IDY1NTM1KSAvLyByYW5nZSBjaGVjaworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+c2xpY2VIZHItPmlkcl9waWNfaWQgPSAwOyAgLy8gcmVzZXQKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiB0aGUgZm9sbG93aW5nIGxvZ2ljcyBuZWVkIHRvIGJlIHJldmlzaXRlZCAqLworICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBBVkNFTkNfUElDVFVSRV9SRUFEWSkgLy8gbm8gYnVmZmVycyByZXR1cm5lZCBiYWNrIHRvIHRoZSBlbmNvZGVyCisgICAgeworICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19XYWl0aW5nRm9yQnVmZmVyOyAvLyBJbnB1dCBhY2NlcHRlZCBidXQgY2FuJ3QgY29udGludWUKKyAgICAgICAgLy8gbmVlZCB0byBmcmVlIHVwIHNvbWUgbWVtb3J5IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggRW5jb2RlCisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsgLy8gcmV0dXJuIHN0YXR1cywgaW5jbHVkaW5nIHRoZSBBVkNFTkNfRkFJTCBjYXNlIGFuZCBhbGwgMyBhYm92ZS4KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY29kZU5BTCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gZW5jb2RlIG9uZSBOQUwvc2xpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jb2RlTkFMKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCAqYnVmX25hbF9zaXplLCBpbnQgKm5hbF90eXBlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAoZW5jdmlkID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1VOSU5JVElBTElaRUQ7CisgICAgfQorCisgICAgc3dpdGNoIChlbmN2aWQtPmVuY19zdGF0ZSkKKyAgICB7CisgICAgICAgIGNhc2UgQVZDRW5jX0luaXRpYWxpemluZzoKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfVU5JTklUSUFMSVpFRDsKKyAgICAgICAgY2FzZSBBVkNFbmNfRW5jb2RpbmdfU1BTOgorICAgICAgICAgICAgLyogaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgQml0c3RyZWFtRW5jSW5pdChiaXRzdHJlYW0sIGJ1ZmZlciwgKmJ1Zl9uYWxfc2l6ZSwgTlVMTCwgMCk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCA4LCAoMSA8PCA1KSB8IEFWQ19OQUxUWVBFX1NQUyk7CisKKyAgICAgICAgICAgIC8qIGVuY29kZSBTUFMgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVNQUyhlbmN2aWQsIGJpdHN0cmVhbSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNsb3NpbmcgdGhlIE5BTCB3aXRoIHRyYWlsaW5nIGJpdHMgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVRyYWlsaW5nQml0cyhiaXRzdHJlYW0sIGJ1Zl9uYWxfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX1BQUzsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSB2aWRlby0+Y3VyclNlcVBhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnBpY19wYXJhbWV0ZXJfc2V0X2lkKys7CisgICAgICAgICAgICAgICAgKm5hbF90eXBlID0gQVZDX05BTFRZUEVfU1BTOworICAgICAgICAgICAgICAgICpidWZfbmFsX3NpemUgPSBiaXRzdHJlYW0tPndyaXRlX3BvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ0VuY19FbmNvZGluZ19QUFM6CisgICAgICAgICAgICAvKiBpbml0aWFsaXplZCB0aGUgc3RydWN0dXJlICovCisgICAgICAgICAgICBCaXRzdHJlYW1FbmNJbml0KGJpdHN0cmVhbSwgYnVmZmVyLCAqYnVmX25hbF9zaXplLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIDgsICgxIDw8IDUpIHwgQVZDX05BTFRZUEVfUFBTKTsKKworICAgICAgICAgICAgLyogZW5jb2RlIFBQUyAqLworICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlUFBTKGVuY3ZpZCwgYml0c3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2xvc2luZyB0aGUgTkFMIHdpdGggdHJhaWxpbmcgYml0cyAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtVHJhaWxpbmdCaXRzKGJpdHN0cmVhbSwgYnVmX25hbF9zaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPT0gVFJVRSkgLy8gYWxyZWFkeSBleHRyYWN0IFBQUywgU1BTCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19BbmFseXppbmdfRnJhbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgICAgLy8gU2V0SW5wdXQgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSBTUFMgYW5kIFBQUy4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX0ZyYW1lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpuYWxfdHlwZSA9IEFWQ19OQUxUWVBFX1BQUzsKKyAgICAgICAgICAgICAgICAqYnVmX25hbF9zaXplID0gYml0c3RyZWFtLT53cml0ZV9wb3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFWQ0VuY19FbmNvZGluZ19GcmFtZToKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemVkIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY0luaXQoYml0c3RyZWFtLCBidWZmZXIsICpidWZfbmFsX3NpemUsIGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciwgZW5jdmlkLT5vQlNpemUpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgOCwgKHZpZGVvLT5uYWxfcmVmX2lkYyA8PCA1KSB8ICh2aWRlby0+bmFsX3VuaXRfdHlwZSkpOworCisgICAgICAgICAgICAvKiBSZS1vcmRlciB0aGUgcmVmZXJlbmNlIGxpc3QgYWNjb3JkaW5nIHRvIHRoZSByZWZfcGljX2xpc3RfcmVvcmRlcmluZygpICovCisgICAgICAgICAgICAvKiBXZSBkb24ndCBoYXZlIHRvIHJlb3JkZXIgdGhlIGxpc3QgZm9yIHRoZSBlbmNvZGVyIGhlcmUuIFRoaXMgY2FuIG9ubHkgYmUgZG9uZQorICAgICAgICAgICAgYWZ0ZXIgd2UgZW5jb2RlIHRoaXMgc2xpY2UuIFdlIGNhbiBydW4gdGhydSBhIHNlY29uZC1wYXNzIHRvIHNlZSBpZiBuZXcgb3JkZXJpbmcKKyAgICAgICAgICAgIHdvdWxkIHNhdmUgbW9yZSBiaXRzLiBUb28gbXVjaCBkZWxheSAhISAqLworICAgICAgICAgICAgLyogc3RhdHVzID0gUmVPcmRlckxpc3QodmlkZW8pOyovCisgICAgICAgICAgICBzdGF0dXMgPSBJbml0U2xpY2UoZW5jdmlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogd2hlbiB3ZSBoYXZlIGV2ZXJ5dGhpbmcsIHdlIGVuY29kZSB0aGUgc2xpY2UgaGVhZGVyICovCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVTbGljZUhlYWRlcihlbmN2aWQsIGJpdHN0cmVhbSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VuY29kZVNsaWNlKGVuY3ZpZCk7CisKKyAgICAgICAgICAgIHZpZGVvLT5zbGljZV9pZCsrOworCisgICAgICAgICAgICAvKiBjbG9zaW5nIHRoZSBOQUwgd2l0aCB0cmFpbGluZyBiaXRzICovCisgICAgICAgICAgICBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoYml0c3RyZWFtLCBidWZfbmFsX3NpemUpOworCisgICAgICAgICAgICAqYnVmX25hbF9zaXplID0gYml0c3RyZWFtLT53cml0ZV9wb3M7CisKKyAgICAgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPm51bUZyYW1lQml0cyArPSAoKCpidWZfbmFsX3NpemUpIDw8IDMpOworCisgICAgICAgICAgICAqbmFsX3R5cGUgPSB2aWRlby0+bmFsX3VuaXRfdHlwZTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBVkNFTkNfUElDVFVSRV9SRUFEWSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBSQ1VwZGF0ZUZyYW1lKGVuY3ZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBVkNFTkNfU0tJUFBFRF9QSUNUVVJFKSAvKiBza2lwIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERQQlJlbGVhc2VDdXJyZW50RnJhbWUoYXZjSGFuZGxlLCB2aWRlbyk7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0FuYWx5emluZ19GcmFtZTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHBlcmZvcm0gbG9vcC1maWx0ZXJpbmcgb24gdGhlIGVudGlyZSBmcmFtZSAqLworICAgICAgICAgICAgICAgIERlYmxvY2tQaWN0dXJlKHZpZGVvKTsKKworICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgb3JpZ2luYWwgZnJhbWUgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICBlbmN2aWQtPnByZXZDb2RlZEZyYW1lTnVtID0gZW5jdmlkLT5jdXJySW5wdXQtPmNvZGluZ19vcmRlcjsKKworICAgICAgICAgICAgICAgIC8qIHN0b3JlIHRoZSBlbmNvZGVkIHBpY3R1cmUgaW4gdGhlIERQQiBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBTdG9yZVBpY3R1cmVJbkRQQihhdmNIYW5kbGUsIHZpZGVvKTsKKworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpYy0+aXNSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+UHJldlJlZkZyYW1lTnVtID0gdmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIFBPQyByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgICAgICAgICAgICAgIFBvc3RQT0ModmlkZW8pOworCisgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19QSUNUVVJFX1JFQURZOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19XUk9OR19TVEFURTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gcmV0cmlldmUgdGhlIG92ZXJydW4gYnVmZmVyLiBDaGVjayB3aGV0aGVyIG92ZXJydW4gYnVmZmVyICovCisvKiAgICAgICAgICAgICAgaXMgdXNlZCBvciBub3QgYmVmb3JlIHJldHVybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUG9pbnRlciB0byB0aGUgaW50ZXJuYWwgb3ZlcnJ1biBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIHVpbnQ4KiBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIoQVZDSGFuZGxlKiBhdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworCisgICAgaWYgKGJpdHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9PSBiaXRzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlcikgLyogT0IgaXMgdXNlZCAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNHZXRSZWNvbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA0LzI5LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRvIHJldHJpZXZlIHRoZSBtb3N0IHJlY2VudGx5IGVuY29kZWQgZnJhbWUuICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHVzZXIgd2lsbCBtYWtlIGEgY29weSBpZiB0aGV5IHdhbnQgdG8gaG9sZCBvbiAgICovCisvKiAgICAgICAgICAgICAgdG8gaXQuIE90aGVyd2lzZSwgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgcmVzZXJ2ZWQuICAgICAgKi8KKy8qICAgICAgICAgICAgICBNb3N0IGFwcGxpY2F0aW9ucyBwcmVmZXIgdG8gc2VlIG9yaWdpbmFsIGZyYW1lIHJhdGhlciB0aGFuICAqLworLyogICAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJhbWUuIFNvLCB3ZSBhcmUgc3RheWluZyBhd2FyZSBmcm9tIGNvbXBsZXggICovCisvKiAgICAgICAgICAgICAgYnVmZmVyaW5nIG1lY2hhbmlzbS4gSWYgbmVlZGVkLCBjYW4gYmUgYWRkZWQgbGF0ZXIuICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXRSZWNvbihBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqcmVjb24pCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRnJhbWVTdG9yZSAqY3VyckZTID0gdmlkZW8tPmN1cnJGUzsKKworICAgIGlmIChlbmN2aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfVU5JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICByZWNvbi0+WUNiQ3JbMF0gPSBjdXJyRlMtPmZyYW1lLlNsOworICAgIHJlY29uLT5ZQ2JDclsxXSA9IGN1cnJGUy0+ZnJhbWUuU2NiOworICAgIHJlY29uLT5ZQ2JDclsyXSA9IGN1cnJGUy0+ZnJhbWUuU2NyOworICAgIHJlY29uLT5oZWlnaHQgPSBjdXJyRlMtPmZyYW1lLmhlaWdodDsKKyAgICByZWNvbi0+cGl0Y2ggPSBjdXJyRlMtPmZyYW1lLnBpdGNoOworICAgIHJlY29uLT5kaXNwX29yZGVyID0gY3VyckZTLT5QaWNPcmRlckNudDsKKyAgICByZWNvbi0+Y29kaW5nX29yZGVyID0gY3VyckZTLT5GcmFtZU51bTsKKyAgICByZWNvbi0+aWQgPSAodWludDMyKSBjdXJyRlMtPmJhc2VfZHBiOyAvKiB1c2UgdGhlIHBvaW50ZXIgYXMgdGhlIGlkICovCisKKyAgICBjdXJyRlMtPklzT3V0cHV0dGVkIHw9IDE7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jUmVsZWFzZVJlY29uKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICpyZWNvbikKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcocmVjb24pOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOyAvL2ZvciBub3cKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0NsZWFuVXBFbmNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMTgvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gY2xlYW4gdXAgbWVtb3JpZXMgYWxsb2NhdGVkIGJ5IFBWQVZDRW5jSW5pdGlhbGl6ZSgpICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiB2b2lkICAgIFBWQVZDQ2xlYW5VcEVuY29kZXIoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbzsKKyAgICB1aW50MzIgKnVzZXJEYXRhID0gKHVpbnQzMiopIGF2Y0hhbmRsZS0+dXNlckRhdGE7CisKKyAgICBpZiAoZW5jdmlkICE9IE5VTEwpCisgICAgeworICAgICAgICBDbGVhbk1vdGlvblNlYXJjaE1vZHVsZShhdmNIYW5kbGUpOworCisgICAgICAgIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShhdmNIYW5kbGUpOworCisgICAgICAgIGlmIChlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5mdW5jdGlvblBvaW50ZXIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+bWluX2Nvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPm1pbl9jb3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmN2aWQtPmludHJhU2VhcmNoKQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5pbnRyYVNlYXJjaCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5tb3QxNngxNikKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+bW90MTZ4MTYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+cmF0ZUN0cmwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPnJhdGVDdHJsKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmN2aWQtPm92ZXJydW5CdWZmZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPm92ZXJydW5CdWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICAgICAgaWYgKHZpZGVvICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPm1ibG9jayAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+bWJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+ZGVjUGljQnVmICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xlYW5VcERQQihhdmNIYW5kbGUsIHZpZGVvKTsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPmRlY1BpY0J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPnNsaWNlSGRyICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5zbGljZUhkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMtPnNsaWNlX2dyb3VwX2lkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5jdXJyUGljUGFyYW1zLT5zbGljZV9ncm91cF9pZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5jdXJyUGljUGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclNlcVBhcmFtcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+Y3VyclNlcVBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW5jdmlkLT5iaXRzdHJlYW0gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5iaXRzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQpOworCisgICAgICAgIGF2Y0hhbmRsZS0+QVZDT2JqZWN0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUJpdFJhdGUoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQzMiBiaXRyYXRlKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhiaXRyYXRlKTsKKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVGcmFtZVJhdGUoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQzMiBudW0sIHVpbnQzMiBkZW5vbSkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcobnVtKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoZGVub20pOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUlEUkludGVydmFsKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBpbnQgSURSSW50ZXJ2YWwpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKElEUkludGVydmFsKTsKKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNJRFJSZXF1ZXN0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUlNQlJlZnJlc2goQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCBudW1NQikKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcobnVtTUIpOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCit2b2lkIFBWQVZDRW5jR2V0RnJhbWVTdGF0cyhBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRW5jRnJhbWVTdGF0cyAqYXZjU3RhdHMpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKworICAgIGF2Y1N0YXRzLT5hdmdGcmFtZVFQID0gR2V0QXZnRnJhbWVRUChyYXRlQ3RybCk7CisgICAgYXZjU3RhdHMtPm51bUludHJhTUJzID0gZW5jdmlkLT5udW1JbnRyYU1COworCisgICAgcmV0dXJuIDsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NDFlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5oCkBAIC0wLDAgKzEsMzIzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqCitUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gZnVuY3Rpb24gaW50ZXJmYWNlcyB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeQorYW5kIG5lY2Vzc2FyeSB0eXBlIGRlZml0aW9uaXRpb25zIGFuZCBlbnVtZXJhdGlvbnMuCitAcHVibGlzaGVkQWxsCisqLworCisjaWZuZGVmIEFWQ0VOQ19BUElfSF9JTkNMVURFRAorI2RlZmluZSBBVkNFTkNfQVBJX0hfSU5DTFVERUQKKworI2lmbmRlZiBBVkNBUElfQ09NTU9OX0hfSU5DTFVERUQKKyNpbmNsdWRlICJhdmNhcGlfY29tbW9uLmgiCisjZW5kaWYKKworLy8gRm9yIG1lbXNldCwgZXRjCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKgorIFRoaXMgZW51bWVyYXRpb24gaXMgdXNlZCBmb3IgdGhlIHN0YXR1cyByZXR1cm5lZCBmcm9tIHRoZSBsaWJyYXJ5IGludGVyZmFjZS4KKyovCit0eXBlZGVmIGVudW0KK3sKKyAgICAvKioKKyAgICBGYWlsIGluZm9ybWF0aW9uLCBuZWVkIHRvIGFkZCBtb3JlIGVycm9yIGNvZGUgZm9yIG1vcmUgc3BlY2lmaWMgaW5mbworICAgICovCisgICAgQVZDRU5DX1RSQUlMSU5HT05FU19GQUlMID0gLTM1LAorICAgIEFWQ0VOQ19TTElDRV9FTVBUWSA9IC0zNCwKKyAgICBBVkNFTkNfUE9DX0ZBSUwgPSAtMzMsCisgICAgQVZDRU5DX0NPTlNFQ1VUSVZFX05PTlJFRiA9IC0zMiwKKyAgICBBVkNFTkNfQ0FCQUNfRkFJTCA9IC0zMSwKKyAgICBBVkNFTkNfUFJFRF9XRUlHSFRfVEFCX0ZBSUwgPSAtMzAsCisgICAgQVZDRU5DX0RFQ19SRUZfUElDX01BUktfRkFJTCA9IC0yOSwKKyAgICBBVkNFTkNfU1BTX0ZBSUwgPSAtMjgsCisgICAgQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTCAgICA9IC0yNywKKyAgICBBVkNFTkNfQklUU1RSRUFNX0lOSVRfRkFJTCA9IC0yNiwKKyAgICBBVkNFTkNfQ0hST01BX1FQX0ZBSUwgPSAtMjUsCisgICAgQVZDRU5DX0lOSVRfUVNfRkFJTCA9IC0yNCwKKyAgICBBVkNFTkNfSU5JVF9RUF9GQUlMID0gLTIzLAorICAgIEFWQ0VOQ19XRUlHSFRFRF9CSVBSRURfRkFJTCA9IC0yMiwKKyAgICBBVkNFTkNfSU5WQUxJRF9JTlRSQV9QRVJJT0QgPSAtMjEsCisgICAgQVZDRU5DX0lOVkFMSURfQ0hBTkdFX1JBVEUgPSAtMjAsCisgICAgQVZDRU5DX0lOVkFMSURfQkVUQV9PRkZTRVQgPSAtMTksCisgICAgQVZDRU5DX0lOVkFMSURfQUxQSEFfT0ZGU0VUID0gLTE4LAorICAgIEFWQ0VOQ19JTlZBTElEX0RFQkxPQ0tfSURDID0gLTE3LAorICAgIEFWQ0VOQ19JTlZBTElEX1JFRFVOREFOVF9QSUMgPSAtMTYsCisgICAgQVZDRU5DX0lOVkFMSURfRlJBTUVSQVRFID0gLTE1LAorICAgIEFWQ0VOQ19JTlZBTElEX05VTV9TTElDRUdST1VQID0gLTE0LAorICAgIEFWQ0VOQ19JTlZBTElEX1BPQ19MU0IgPSAtMTMsCisgICAgQVZDRU5DX0lOVkFMSURfTlVNX1JFRiA9IC0xMiwKKyAgICBBVkNFTkNfSU5WQUxJRF9GTU9fVFlQRSA9IC0xMSwKKyAgICBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUwgPSAtMTAsCisgICAgQVZDRU5DX0xFVkVMX05PVF9TVVBQT1JURUQgPSAtOSwKKyAgICBBVkNFTkNfTEVWRUxfRkFJTCA9IC04LAorICAgIEFWQ0VOQ19QUk9GSUxFX05PVF9TVVBQT1JURUQgPSAtNywKKyAgICBBVkNFTkNfVE9PTFNfTk9UX1NVUFBPUlRFRCA9IC02LAorICAgIEFWQ0VOQ19XUk9OR19TVEFURSA9IC01LAorICAgIEFWQ0VOQ19VTklOSVRJQUxJWkVEID0gLTQsCisgICAgQVZDRU5DX0FMUkVBRFlfSU5JVElBTElaRUQgPSAtMywKKyAgICBBVkNFTkNfTk9UX1NVUFBPUlRFRCA9IC0yLAorICAgIEFWQ0VOQ19NRU1PUllfRkFJTCA9IEFWQ19NRU1PUllfRkFJTCwKKyAgICBBVkNFTkNfRkFJTCA9IEFWQ19GQUlMLAorICAgIC8qKgorICAgIEdlbmVyaWMgc3VjY2VzcyB2YWx1ZQorICAgICovCisgICAgQVZDRU5DX1NVQ0NFU1MgPSBBVkNfU1VDQ0VTUywKKyAgICBBVkNFTkNfUElDVFVSRV9SRUFEWSA9IDIsCisgICAgQVZDRU5DX05FV19JRFIgPSAzLCAvKiB1cG9uIGdldHRpbmcgdGhpcywgdXNlcnMgaGF2ZSB0byBjYWxsIFBWQVZDRW5jb2RlU1BTIGFuZCBQVkFWQ0VuY29kZVBQUyB0byBnZXQgYSBuZXcgU1BTIGFuZCBQUFMqLworICAgIEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkUgPSA0IC8qIGNvbnRpbnVhYmxlIGVycm9yIG1lc3NhZ2UgKi8KKworfSBBVkNFbmNfU3RhdHVzOworCisjZGVmaW5lIE1BWF9OVU1fU0xJQ0VfR1JPVVAgIDggICAgICAvKiBtYXhpbXVtIGZvciBhbGwgdGhlIHByb2ZpbGVzICovCisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMuCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQVZDRW5jUGFyYW0KK3sKKyAgICAvKiBpZiBwcm9maWxlL2xldmVsIGlzIHNldCB0byB6ZXJvLCBlbmNvZGVyIHdpbGwgY2hvb3NlIHRoZSBjbG9zZXN0IG9uZSBmb3IgeW91ICovCisgICAgQVZDUHJvZmlsZSBwcm9maWxlOyAvKiBwcm9maWxlIG9mIHRoZSBiaXRzdHJlYW0gdG8gYmUgY29tcGxpYW50IHdpdGgqLworICAgIEFWQ0xldmVsICAgbGV2ZWw7ICAgLyogbGV2ZWwgb2YgdGhlIGJpdHN0cmVhbSB0byBiZSBjb21wbGlhbnQgd2l0aCovCisKKyAgICBpbnQgd2lkdGg7ICAgICAgLyogd2lkdGggb2YgYW4gaW5wdXQgZnJhbWUgaW4gcGl4ZWwgKi8KKyAgICBpbnQgaGVpZ2h0OyAgICAgLyogaGVpZ2h0IG9mIGFuIGlucHV0IGZyYW1lIGluIHBpeGVsICovCisKKyAgICBpbnQgcG9jX3R5cGU7IC8qIHBpY3R1cmUgb3JkZXIgY291bnQgbW9kZSwgMCwxIG9yIDIgKi8KKyAgICAvKiBmb3IgcG9jX3R5cGUgPT0gMCAqLworICAgIHVpbnQgbG9nMl9tYXhfcG9jX2xzYl9taW51c180OyAvKiBzcGVjaWZ5IG1heGltdW0gdmFsdWUgb2YgUE9DIExzYiwgcmFuZ2UgMC4uMTIqLworICAgIC8qIGZvciBwb2NfdHlwZSA9PSAxICovCisgICAgdWludCBkZWx0YV9wb2NfemVyb19mbGFnOyAvKiBkZWx0YSBQT0MgYWx3YXlzIHplcm8gKi8KKyAgICBpbnQgb2Zmc2V0X3BvY19ub25fcmVmOyAvKiBvZmZzZXQgZm9yIG5vbi1yZWZlcmVuY2UgcGljICovCisgICAgaW50IG9mZnNldF90b3BfYm90dG9tOyAvKiBvZmZzZXQgYmV0d2VlbiB0b3AgYW5kIGJvdHRvbSBmaWVsZCAqLworICAgIHVpbnQgbnVtX3JlZl9pbl9jeWNsZTsgLyogbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZSBpbiBvbmUgY3ljbGUgKi8KKyAgICBpbnQgKm9mZnNldF9wb2NfcmVmOyAvKiBhcnJheSBvZiBvZmZzZXQgZm9yIHJlZiBwaWMsIGRpbWVuc2lvbiBbbnVtX3JlZl9pbl9jeWNsZV0gKi8KKworICAgIGludCBudW1fcmVmX2ZyYW1lOyAgLyogbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZSB1c2VkICovCisgICAgaW50IG51bV9zbGljZV9ncm91cDsgIC8qIG51bWJlciBvZiBzbGljZSBncm91cCAqLworICAgIGludCBmbW9fdHlwZTsgICAvKiAwOiBpbnRlcmxlYXZlLCAxOiBkaXNwZXJzZWQsIDI6IGZvcmVncm91bmQgd2l0aCBsZWZ0LW92ZXIKKyAgICAgICAgICAgICAgICAgICAgMzogYm94LW91dCwgNDpyYXN0ZXIgc2NhbiwgNTp3aXBlLCA2OmV4cGxpY2l0ICovCisgICAgLyogZm9yIGZtb190eXBlID09IDAgKi8KKyAgICB1aW50IHJ1bl9sZW5ndGhfbWludXMxW01BWF9OVU1fU0xJQ0VfR1JPVVBdOyAgIC8qIGFycmF5IG9mIHNpemUgbnVtX3NsaWNlX2dyb3VwLCBpbiByb3VuZCByb2JpbiBmYXNpb24gKi8KKyAgICAvKiBmbW9fdHlwZSA9PSAyKi8KKyAgICB1aW50IHRvcF9sZWZ0W01BWF9OVU1fU0xJQ0VfR1JPVVAtMV07ICAgICAgICAgICAvKiBhcnJheSBvZiBjby1vcmRpbmF0ZXMgb2YgZWFjaCBzbGljZV9ncm91cCAqLworICAgIHVpbnQgYm90dG9tX3JpZ2h0W01BWF9OVU1fU0xJQ0VfR1JPVVAtMV07ICAgICAgIC8qIGV4Y2VwdCB0aGUgbGFzdCBvbmUgd2hpY2ggaXMgdGhlIGJhY2tncm91bmQuICovCisgICAgLyogZm1vX3R5cGUgPT0gMyw0LDUgKi8KKyAgICBBVkNGbGFnIGNoYW5nZV9kaXJfZmxhZzsgIC8qIHNsaWNlIGdyb3VwIGNoYW5nZSBkaXJlY3Rpb24gZmxhZyAqLworICAgIHVpbnQgY2hhbmdlX3JhdGVfbWludXMxOworICAgIC8qIGZtb190eXBlID09IDYgKi8KKyAgICB1aW50ICpzbGljZV9ncm91cDsgLyogYXJyYXkgb2Ygc2l6ZSBNQldpZHRoKk1CSGVpZ2h0ICovCisKKyAgICBBVkNGbGFnIGRiX2ZpbHRlcjsgIC8qIGVuYWJsZSBkZWJsb2NraW5nIGxvb3AgZmlsdGVyICovCisgICAgaW50IGRpc2FibGVfZGJfaWRjOyAgLyogMDogZmlsdGVyIGV2ZXJ5d2hlcmUsIDE6IG5vIGZpbHRlciwgMjogbm8gZmlsdGVyIGFjcm9zcyBzbGljZSBib3VuZGFyeSAqLworICAgIGludCBhbHBoYV9vZmZzZXQ7ICAgLyogYWxwaGEgb2Zmc2V0IHJhbmdlIC02LC4uLiw2ICovCisgICAgaW50IGJldGFfb2Zmc2V0OyAgICAvKiBiZXRhIG9mZnNldCByYW5nZSAtNiwuLi4sNiAqLworCisgICAgQVZDRmxhZyBjb25zdHJhaW5lZF9pbnRyYV9wcmVkOyAvKiBjb25zdHJhaW5lZCBpbnRyYSBwcmVkaWN0aW9uIGZsYWcgKi8KKworICAgIEFWQ0ZsYWcgYXV0b19zY2Q7ICAgLyogc2NlbmUgY2hhbmdlIGRldGVjdGlvbiBvbiBvciBvZmYgKi8KKyAgICBpbnQgaWRyX3BlcmlvZDsgLyogaWRyIGZyYW1lIHJlZnJlc2ggcmF0ZSBpbiBudW1iZXIgb2YgdGFyZ2V0IGVuY29kZWQgZnJhbWUgKG5vIGNvbmNlcHQgb2YgYWN0dWFsIHRpbWUpLiovCisgICAgaW50IGludHJhbWJfcmVmcmVzaDsgICAgLyogbWluaW11bSBudW1iZXIgb2YgaW50cmEgTUIgcGVyIGZyYW1lICovCisgICAgQVZDRmxhZyBkYXRhX3BhcjsgICAvKiBlbmFibGUgZGF0YSBwYXJ0aXRpb25pbmcgKi8KKworICAgIEFWQ0ZsYWcgZnVsbHNlYXJjaDsgLyogZW5hYmxlIGZ1bGwtcGVsIGZ1bGwtc2VhcmNoIG1vZGUgKi8KKyAgICBpbnQgc2VhcmNoX3JhbmdlOyAgIC8qIHNlYXJjaCByYW5nZSBmb3IgbW90aW9uIHZlY3RvciBpbiAoLXNlYXJjaF9yYW5nZSwrc2VhcmNoX3JhbmdlKSBwaXhlbHMgKi8KKyAgICBBVkNGbGFnIHN1Yl9wZWw7ICAgIC8qIGVuYWJsZSBzdWIgcGVsIHByZWRpY3Rpb24gKi8KKyAgICBBVkNGbGFnIHN1Ym1iX3ByZWQ7IC8qIGVuYWJsZSBzdWIgTUIgcGFydGl0aW9uIG1vZGUgKi8KKyAgICBBVkNGbGFnIHJkb3B0X21vZGU7IC8qIFJEIG9wdGltYWwgbW9kZSBzZWxlY3Rpb24gKi8KKyAgICBBVkNGbGFnIGJpZGlyX3ByZWQ7IC8qIGVuYWJsZSBiaS1kaXJlY3Rpb25hbCBmb3IgQi1zbGljZSwgdGhpcyBmbGFnIGZvcmNlcyB0aGUgZW5jb2RlciB0byBlbmNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFueSBmcmFtZSB3aXRoIFBPQyBsZXNzIHRoYW4gdGhlIHByZXZpb3VzbHkgZW5jb2RlZCBmcmFtZSBhcyBhIEItZnJhbWUuCisgICAgICAgICAgICAgICAgICAgICAgICBJZiBpdCdzIG9mZiwgdGhlbiBzdWNoIGZyYW1lcyB3aWxsIHJlbWFpbiBQLWZyYW1lLiAqLworCisgICAgQVZDRmxhZyByYXRlX2NvbnRyb2w7IC8qIHJhdGUgY29udHJvbCBlbmFibGUsIG9uOiBSQyBvbiwgb2ZmOiBjb25zdGFudCBRUCAqLworICAgIGludCBpbml0UVA7ICAgICAvKiBpbml0aWFsIFFQICovCisgICAgdWludDMyIGJpdHJhdGU7ICAgIC8qIHRhcmdldCBlbmNvZGluZyBiaXQgcmF0ZSBpbiBiaXRzL3NlY29uZCAqLworICAgIHVpbnQzMiBDUEJfc2l6ZTsgIC8qIGNvZGVkIHBpY3R1cmUgYnVmZmVyIGluIG51bWJlciBvZiBiaXRzICovCisgICAgdWludDMyIGluaXRfQ0JQX3JlbW92YWxfZGVsYXk7IC8qIGluaXRpYWwgQ0JQIHJlbW92YWwgZGVsYXkgaW4gbXNlYyAqLworCisgICAgdWludDMyIGZyYW1lX3JhdGU7ICAvKiBmcmFtZSByYXRlIGluIHRoZSB1bml0IG9mIGZyYW1lcyBwZXIgMTAwMCBzZWNvbmQgKi8KKyAgICAvKiBub3RlLCBmcmFtZSByYXRlIGlzIG9ubHkgbmVlZGVkIGJ5IHRoZSByYXRlIGNvbnRyb2wsIEFWQyBpcyB0aW1lc3RhbXAgYWdub3N0aWMuICovCisKKyAgICBBVkNGbGFnIG91dF9vZl9iYW5kX3BhcmFtX3NldDsgLyogZmxhZyB0byBzZXQgd2hldGhlciBwYXJhbSBzZXRzIGFyZSB0byBiZSByZXRyaWV2ZWQgdXAgZnJvbnQgb3Igbm90ICovCisKKyAgICBBVkNGbGFnIHVzZV9vdmVycnVuX2J1ZmZlcjsgIC8qIGRvIG5vdCB0aHJvdyBhd2F5IHRoZSBmcmFtZSBpZiBvdXRwdXQgYnVmZmVyIGlzIG5vdCBiaWcgZW5vdWdoLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBleGNlc3MgYml0cyB0byB0aGUgb3ZlcnJ1biBidWZmZXIgKi8KK30gQVZDRW5jUGFyYW1zOworCisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgY3VycmVudCBmcmFtZSBlbmNvZGluZyBzdGF0aXN0aWNzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KKyovCit0eXBlZGVmIHN0cnVjdCB0YWdBVkNFbmNGcmFtZVN0YXRzCit7CisgICAgaW50IGF2Z0ZyYW1lUVA7ICAgLyogYXZlcmFnZSBmcmFtZSBRUCAqLworICAgIGludCBudW1JbnRyYU1CczsgIC8qIG51bWJlciBvZiBpbnRyYSBNQnMgKi8KKyAgICBpbnQgbnVtRmFsc2VBbGFybTsKKyAgICBpbnQgbnVtTWlzRGV0ZWN0ZWQ7CisgICAgaW50IG51bURldGVjdGVkOworCit9IEFWQ0VuY0ZyYW1lU3RhdHM7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgLyoqIFRIRSBGT0xMT1dJTkdTIEFSRSBBUElTICovCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZW5jb2RlciBsaWJyYXJ5LiBJdCB2ZXJpZmllcyB0aGUgdmFsaWRpdHkgb2YgdGhlCisgICAgZW5jb2RpbmcgcGFyYW1ldGVycyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCBhbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkCisgICAgdG9vbHMgYnkgdGhpcyBsaWJyYXJ5LiBJdCBhbGxvY2F0ZXMgbmVjZXNzYXJ5IG1lbW9yaWVzIHJlcXVpcmVkIHRvIHBlcmZvcm0gZW5jb2RpbmcuCisgICAgRm9yIHJlLWVuY29kaW5nIGFwcGxpY2F0aW9uLCBpZiB1c2VycyB3YW50IHRvIHNldHVwIGVuY29kZXIgaW4gYSBtb3JlIHByZWNpc2Ugd2F5LAorICAgIHVzZXJzIGNhbiBnaXZlIHRoZSBleHRlcm5hbCBTUFMgYW5kIFBQUyB0byB0aGUgZW5jb2RlciB0byBmb2xsb3cuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJlbmNQYXJhbSIgICAiUG9pbnRlciB0byB0aGUgZW5jb2RpbmcgcGFyYW1ldGVyIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJleHRTUFMiICAgICAiRXh0ZXJuYWwgU1BTIHVzZWQgZm9yIHJlLWVuY29kaW5nIHB1cnBvc2UuIE5VTEwgaWYgbm90IHByZXNlbnQiCisgICAgXHBhcmFtICJleHRQUFMiICAgICAiRXh0ZXJuYWwgUFBTIHVzZWQgZm9yIHJlLWVuY29kaW5nIHB1cnBvc2UuIE5VTEwgaWYgbm90IHByZXNlbnQiCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsCisgICAgICAgICAgICAgQVZDRU5DX05PVF9TVVBQT1JURUQgZm9yIHRoZSB1c2Ugb2YgdW5zdXBwb3J0ZWQgdG9vbHMsCisgICAgICAgICAgICAgQVZDRU5DX01FTU9SWV9GQUlMIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLAorICAgICAgICAgICAgIEFWQ0VOQ19GQUlMIGZvciBnZW5lcmljIGZhaWx1cmUuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNJbml0aWFsaXplKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNFbmNQYXJhbXMgKmVuY1BhcmFtLCB2b2lkKiBleHRTUFMsIHZvaWQqIGV4dFBQUyk7CisKKworICAgIC8qKgorICAgIFNpbmNlIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgaXMgbm90IGtub3duIHByaW9yIHRvIGVuY29kaW5nIGEgZnJhbWUsIHVzZXJzIG5lZWQgdG8KKyAgICBhbGxvY2F0ZSBiaWcgZW5vdWdoIGJ1ZmZlciBvdGhlcndpc2UsIHRoYXQgZnJhbWUgd2lsbCBiZSBkcm9wcGVkLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgICB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIHVzZXJzIHRoYXQgZ3VhcmFudGVlcyB0byBob2xkIG9uZSBmcmFtZS4KKyAgICBJdCBmb2xsb3dzIHRoZSBDUEIgc3BlYyBmb3IgYSBwYXJ0aWN1bGFyIGxldmVsLiAgSG93ZXZlciwgd2hlbiB0aGUgdXNlcnMgc2V0IHVzZV9vdmVycnVuX2J1ZmZlcgorICAgIGZsYWcsIHRoaXMgQVBJIGlzIHVzZWxlc3MgYXMgZXhjZXNzIG91dHB1dCBiaXRzIGFyZSBzYXZlZCBpbiB0aGUgb3ZlcnJ1biBidWZmZXIgd2FpdGluZyB0byBiZQorICAgIGNvcGllZCBvdXQgaW4gc21hbGwgY2h1bmtzLCBpLmUuIHVzZXJzIGNhbiBhbGxvY2F0ZSBhbnkgc2l6ZSBvZiBvdXRwdXQgYnVmZmVyLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAic2l6ZSIgICAiUG9pbnRlciB0byB0aGUgc2l6ZSB0byBiZSBtb2RpZmllZC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIEFWQ0VOQ19VTklOSVRJQUxJWkVEIHdoZW4gbGV2ZWwgaXMgbm90IGtub3duLgorICAgICovCisKKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldE1heE91dHB1dEJ1ZmZlclNpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCogc2l6ZSk7CisKKyAgICAvKioKKyAgICBVc2VycyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZSBhbiBpbnB1dCBzdHJ1Y3R1cmUgdG8gdGhlIGVuY29kZXIgbGlicmFyeSB3aGljaCB3aWxsIGtlZXAKKyAgICBhIGxpc3Qgb2YgaW5wdXQgc3RydWN0dXJlcyBpdCByZWNlaXZlcyBpbiBjYXNlIHRoZSB1c2VycyBjYWxsIHRoaXMgZnVuY3Rpb24gbWFueSB0aW1lIGJlZm9yZQorICAgIGNhbGxpbmcgUFZBVkNFbmNvZGVTbGljZS4gVGhlIGVuY29kZXIgbGlicmFyeSB3aWxsIGVuY29kZSB0aGVtIGFjY29yZGluZyB0byB0aGUgZnJhbWVfbnVtIG9yZGVyLgorICAgIFVzZXJzIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBjb250ZW50IG9mIGEgcGFydGljdWxhciBmcmFtZSB1bnRpbCB0aGlzIGZyYW1lIGlzIGVuY29kZWQgYW5kCisgICAgcmV0dXJuZWQgdGhydSBDQkFWQ0VuY19SZXR1cm5JbnB1dCgpIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAiaW5wdXQiICAgICAgIlBvaW50ZXIgdG8gdGhlIGlucHV0IHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsCisgICAgICAgICAgICBBVkNFTkNfRkFJTCBpZiB0aGUgZW5jb2RlciBpcyBub3QgaW4gdGhlIHJpZ2h0IHN0YXRlIHRvIHRha2UgYSBuZXcgaW5wdXQgZnJhbWUuCisgICAgICAgICAgICBBVkNFTkNfTkVXX0lEUiBmb3IgdGhlIGRldGVjdGlvbiBvciBkZXRlcm1pbmF0aW9uIG9mIGEgbmV3IElEUiwgd2l0aCB0aGlzIHN0YXR1cywKKyAgICAgICAgICAgIHRoZSByZXR1cm5lZCBOQUwgaXMgYW4gU1BTIE5BTCwKKyAgICAgICAgICAgIEFWQ0VOQ19OT19QSUNUVVJFIGlmIHRoZSBpbnB1dCBmcmFtZSBjb2RpbmcgdGltZXN0YW1wIGlzIHRvbyBlYXJseSwgdXNlcnMgbXVzdAorICAgICAgICAgICAgZ2V0IG5leHQgZnJhbWUgb3IgYWRqdXN0IHRoZSBjb2RpbmcgdGltZXN0YW1wLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jU2V0SW5wdXQoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKmlucHV0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGVuY29kZSBhIE5BTCB1bml0IHdoaWNoIGNhbiBiZSBhbiBTUFMgTkFMLCBhIFBQUyBOQUwgb3IKKyAgICBhIFZDTCAodmlkZW8gY29kaW5nIGxheWVyKSBOQUwgd2hpY2ggY29udGFpbnMgb25lIHNsaWNlIG9mIGRhdGEuIEl0IGNvdWxkIGJlIGEKKyAgICBmaXhlZCBudW1iZXIgb2YgbWFjcm9ibG9ja3MsIGFzIHNwZWNpZmllZCBpbiB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIHNldCwgb3IgdGhlCisgICAgbWF4aW11bSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgZml0dGVkIGludG8gdGhlIGdpdmVuIGlucHV0IGFyZ3VtZW50ICJidWZmZXIiLiBUaGUKKyAgICBpbnB1dCBmcmFtZSBpcyB0YWtlbiBmcm9tIHRoZSBvbGRlc3QgdW5lbmNvZGVkIGlucHV0IGZyYW1lIHJldHJpZXZlZCBieSB1c2VycyBieQorICAgIFBWQVZDRW5jR2V0SW5wdXQgQVBJLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAiYnVmZmVyIiAgICAgIlBvaW50ZXIgdG8gdGhlIG91dHB1dCBBVkMgYml0c3RyZWFtIGJ1ZmZlciwgdGhlIGZvcm1hdCB3aWxsIGJlIEVCU1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm90IFJCU1AuIgorICAgIFxwYXJhbSAiYnVmX25hbF9zaXplIiAgICJBcyBpbnB1dCwgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHBoeXNpY2FsIGxpbWl0YXRpb24gb2YgdGhlIGJ1ZmZlci4gQXMgb3V0cHV0LCB0aGUgc2l6ZSBvZiB0aGUgRUJTUC4iCisgICAgXHBhcmFtICJuYWxfdHlwZSIgICAiUG9pbnRlciB0byB0aGUgTkFMIHR5cGUgb2YgdGhlIHJldHVybmVkIGJ1ZmZlci4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb2YgZW5jb2Rpbmcgb25lIHNsaWNlLAorICAgICAgICAgICAgIEFWQ0VOQ19QSUNUVVJFX1JFQURZIGZvciB0aGUgY29tcGxldGlvbiBvZiBhIGZyYW1lIGVuY29kaW5nLAorICAgICAgICAgICAgIEFWQ0VOQ19GQUlMIGZvciBmYWlsdXJlICh0aGlzIHNob3VsZCBub3Qgb2NjdXIsIHRob3VnaCkuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNvZGVOQUwoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQ4ICpidWZmZXIsIHVpbnQgKmJ1Zl9uYWxfc2l6ZSwgaW50ICpuYWxfdHlwZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHNuaWZmcyB0aGUgbmFsX3VuaXRfdHlwZSBzdWNoIHRoYXQgdXNlcnMgY2FuIGNhbGwgY29ycmVzcG9uZGluZyBBUElzLgorICAgIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIFBWQVZDRGVjR2V0TkFMVHlwZSgpIGluIHRoZSBkZWNvZGVyLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAgIlBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhIE5BTCB1bml0IChzdGFydCB3aXRoIGZvcmJpZGRlbl96ZXJvX2JpdCwgZXRjLikuIgorICAgIFxwYXJhbSAic2l6ZSIgICAgICAgInNpemUgb2YgdGhlIGJpdHN0cmVhbSAoTnVtQnl0ZXNJbk5BTHVuaXQgKyAxKS4iCisgICAgXHBhcmFtICJuYWxfdW5pdF90eXBlIiAiUG9pbnRlciB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIG5hbCB1bml0IHR5cGUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsIEFWQ0VOQ19GQUlMIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldE5BTFR5cGUodWludDggKmJpdHN0cmVhbSwgaW50IHNpemUsIGludCAqbmFsX3R5cGUsIGludCAqbmFsX3JlZl9pZGMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwb2ludGVyIHRvIGludGVybmFsIG92ZXJydW4gYnVmZmVyLiBVc2VycyBjYW4gY2FsbCB0aGlzIHRvIHF1ZXJ5CisgICAgd2hldGhlciB0aGUgb3ZlcnJ1biBidWZmZXIgaGFzIGJlZW4gdXNlZCB0byBlbmNvZGUgdGhlIGN1cnJlbnQgTkFMLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIlBvaW50ZXIgdG8gdGhlIGhhbmRsZS4iCisgICAgXHJldHVybiAiUG9pbnRlciB0byBvdmVycnVuIGJ1ZmZlciBpZiBpdCBpcyB1c2VkLCBvdGhlcndpc2UsIE5VTEwuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIHVpbnQ4KiBQVkFWQ0VuY0dldE92ZXJydW5CdWZmZXIoQVZDSGFuZGxlKiBhdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lIG9mIHRoZSBtb3N0IHJlY2VudGx5IGVuY29kZWQgZnJhbWUuCisgICAgTm90ZSB0aGF0IHRoaXMgZnJhbWUgaXMgbm90IHJldHVybmVkIHRvIHRoZSB1c2VycyB5ZXQuIFVzZXJzIHNob3VsZCBvbmx5IHJlYWQgdGhlCisgICAgY29udGVudCBvZiB0aGlzIGZyYW1lLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAib3V0cHV0IiAgICAgIlBvaW50ZXIgdG8gdGhlIGlucHV0IHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIEFWQ0VOQ19OT19QSUNUVVJFIGlmIG5vIHBpY3R1cmUgdG8gYmUgb3V0cHV0dGVkLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0UmVjb24oQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKnJlY29uKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIHJlY29udHJ1Y3RlZCBmcmFtZSBiYWNrIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5CisgICAgaW4gb3JkZXIgdG8gYmUgcmUtdXNlZCBmb3IgZW5jb2Rpbmcgb3BlcmF0aW9uLiBJZiB1c2VycyB3YW50IHRoZSBjb250ZW50IG9mIGl0IHRvIHJlbWFpbgorICAgIHVuY2hhbmdlZCBmb3IgYSBsb25nIHRpbWUsIHRoZXkgc2hvdWxkIG1ha2UgYSBjb3B5IG9mIGl0IGFuZCByZWxlYXNlIHRoZSBtZW1vcnkgYmFjayB0bworICAgIHRoZSBlbmNvZGVyLiBUaGUgZW5jb2RlciByZWxpZXMgb24gdGhlIGlkIGVsZW1lbnQgaW4gdGhlIEFWQ0ZyYW1lSU8gc3RydWN0dXJlLAorICAgIHRodXMgdXNlcnMgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIGlkIHZhbHVlLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGRlY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAib3V0cHV0IiAgICAgICJQb2ludGVyIHRvIHRoZSBBVkNGcmFtZUlPIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIEFWQ0VOQ19GQUlMIGZvciBmYWlsIGZvciBpZCBub3QgZm91bmQuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNSZWxlYXNlUmVjb24oQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKnJlY29uKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2xlYW4gdXAgb3BlcmF0aW9uIGluY2x1ZGluZyBtZW1vcnkgZGVhbGxvY2F0aW9uLgorICAgIFRoZSBlbmNvZGVyIHdpbGwgYWxzbyBjbGVhciB0aGUgbGlzdCBvZiBpbnB1dCBzdHJ1Y3R1cmVzIGl0IGhhcyBub3QgcmVsZWFzZWQuCisgICAgVGhpcyBpbXBsaWVzIHRoYXQgdXNlcnMgbXVzdCBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaW5wdXQgc3RydWN0dXJlIHRoZXkgaGF2ZSBhbGxvY2F0ZWQKKyAgICBhbmQgZnJlZSB0aGVtIGFjY29yZGluZ2x5LgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIHZvaWQgICAgUFZBVkNDbGVhblVwRW5jb2RlcihBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIHN0YXRpc3RpY3Mgb2YgdGhlIGN1cnJlbnQgZnJhbWUuIElmIHRoZSBlbmNvZGVyIGhhcyBub3QgZmluaXNoZWQKKyAgICB3aXRoIHRoZSBjdXJyZW50IGZyYW1lLCB0aGUgcmVzdWx0IGlzIG5vdCBhY2N1cmF0ZS4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gImF2Y1N0YXRzIiAgICJQb2ludGVyIHRvIEFWQ0VuY0ZyYW1lU3RhdHMgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgUFZBVkNFbmNHZXRGcmFtZVN0YXRzKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNFbmNGcmFtZVN0YXRzICphdmNTdGF0cyk7CisKKyAgICAvKioKKyAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIHRoZSBtb2RpZmljYXRpb24gb2YgZW5jb2RpbmcgcGFyYW1ldGVycy4KKyAgICBUbyBiZSBwb2xpc2hlZC4KKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlQml0UmF0ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDMyIGJpdHJhdGUpOworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlRnJhbWVSYXRlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50MzIgbnVtLCB1aW50MzIgZGVub20pOworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSURSSW50ZXJ2YWwoQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCBJRFJJbnRlcnZhbCk7CisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNJRFJSZXF1ZXN0KEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUlNQlJlZnJlc2goQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCBudW1NQik7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAgLyogX0FWQ0VOQ19BUElfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19pbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZlMDhhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfaW50LmgKQEAgLTAsMCArMSw0NzEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioKK1RoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5CithbmQgbmVjZXNzYXJ5IHR5cGUgZGVmaXRpb25pdGlvbnMgYW5kIGVudW1lcmF0aW9ucy4KK0BwdWJsaXNoZWRBbGwKKyovCisKKyNpZm5kZWYgQVZDRU5DX0lOVF9IX0lOQ0xVREVECisjZGVmaW5lIEFWQ0VOQ19JTlRfSF9JTkNMVURFRAorCisjaWZuZGVmIEFWQ0lOVF9DT01NT05fSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2ludF9jb21tb24uaCIKKyNlbmRpZgorI2lmbmRlZiBBVkNFTkNfQVBJX0hfSU5DTFVERUQKKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisjZW5kaWYKKwordHlwZWRlZiBmbG9hdCBPc2NsRmxvYXQ7CisKKy8qIERlZmluaXRpb24gZm9yIHRoZSBzdHJ1Y3R1cmVzIGJlbG93ICovCisjZGVmaW5lIERFRkFVTFRfQVRUUiAgICAwIC8qIGRlZmF1bHQgbWVtb3J5IGF0dHJpYnV0ZSAqLworI2RlZmluZSBNQVhfSU5QVVRfRlJBTUUgMzAgLyogc29tZSBhcmJpdHJhcnkgbnVtYmVyLCBpdCBjYW4gYmUgbXVjaCBoaWdoZXIgdGhhbiB0aGlzLiAqLworI2RlZmluZSBNQVhfUkVGX0ZSQU1FICAxNiAvKiBtYXggc2l6ZSBvZiB0aGUgUmVmUGljTGlzdDAgYW5kIFJlZlBpY0xpc3QxICovCisjZGVmaW5lIE1BWF9SRUZfUElDX0xJU1QgMzMKKworI2RlZmluZSBNSU5fUVAgICAgICAgICAgMAorI2RlZmluZSBNQVhfUVAgICAgICAgICAgNTEKKyNkZWZpbmUgU0hJRlRfUVAgICAgICAgIDEyCisjZGVmaW5lICBMQU1CREFfQUNDVVJBQ1lfQklUUyAgICAgICAgIDE2CisjZGVmaW5lICBMQU1CREFfRkFDVE9SKGxhbWJkYSkgICAgICAgICgoaW50KSgoZG91YmxlKSgxPDxMQU1CREFfQUNDVVJBQ1lfQklUUykqbGFtYmRhKzAuNSkpCisKKworI2RlZmluZSBESVNBQkxFX1RIUkVTSE9MRElORyAgMAorLy8gZm9yIGJldHRlciBSLUQgcGVyZm9ybWFuY2UKKyNkZWZpbmUgX0xVTUFfQ09FRkZfQ09TVF8gICAgICAgNCAvLyE8IHRocmVzaG9sZCBmb3IgbHVtYSBjb2VmZnMKKyNkZWZpbmUgX0NIUk9NQV9DT0VGRl9DT1NUXyAgICAgNCAvLyE8IHRocmVzaG9sZCBmb3IgY2hyb21hIGNvZWZmcywgdXNlZCB0byBiZSA3CisjZGVmaW5lIF9MVU1BX01CX0NPRUZGX0NPU1RfICAgIDUgLy8hPCB0aHJlc2hvbGQgZm9yIGx1bWEgY29lZmZzIG9mIGludGVyIE1hY3JvYmxvY2tzCisjZGVmaW5lIF9MVU1BXzh4OF9DT0VGRl9DT1NUXyAgIDUgLy8hPCB0aHJlc2hvbGQgZm9yIGx1bWEgY29lZmZzIG9mIDh4OCBJbnRlciBQYXJ0aXRpb24KKyNkZWZpbmUgTUFYX1ZBTFVFICAgICAgIDk5OTk5OSAgIC8vITwgdXNlZCBmb3Igc3RhcnQgdmFsdWUgZm9yIHNvbWUgdmFyaWFibGVzCisKKyNkZWZpbmUgIFdFSUdIVEVEX0NPU1QoZmFjdG9yLGJpdHMpICAgKCgoZmFjdG9yKSooYml0cykpPj5MQU1CREFfQUNDVVJBQ1lfQklUUykKKyNkZWZpbmUgIE1WX0NPU1QoZixzLGN4LGN5LHB4LHB5KSAgICAgKFdFSUdIVEVEX0NPU1QoZixtdmJpdHNbKChjeCk8PChzKSktcHhdK212Yml0c1soKGN5KTw8KHMpKS1weV0pKQorI2RlZmluZSAgTVZfQ09TVF9TKGYsY3gsY3kscHgscHkpICAgICAoV0VJR0hURURfQ09TVChmLG12Yml0c1tjeC1weF0rbXZiaXRzW2N5LXB5XSkpCisKKy8qIGZvciBzdWItcGVsIHNlYXJjaCBhbmQgaW50ZXJwb2xhdGlvbiAqLworI2RlZmluZSBTVUJQRUxfUFJFRF9CTEtfU0laRSA1NzYgLy8gMjR4MjQKKyNkZWZpbmUgUkVGX0NFTlRFUiA3NQorI2RlZmluZSBWMlFfSDBRIDEKKyNkZWZpbmUgVjBRX0gyUSAyCisjZGVmaW5lIFYyUV9IMlEgMworCisvKgorI2RlZmluZSBWM1FfSDBRIDEKKyNkZWZpbmUgVjNRX0gxUSAyCisjZGVmaW5lIFYwUV9IMVEgMworI2RlZmluZSBWMVFfSDFRIDQKKyNkZWZpbmUgVjFRX0gwUSA1CisjZGVmaW5lIFYxUV9IM1EgNgorI2RlZmluZSBWMFFfSDNRIDcKKyNkZWZpbmUgVjNRX0gzUSA4CisjZGVmaW5lIFYyUV9IM1EgOQorI2RlZmluZSBWMlFfSDBRIDEwCisjZGVmaW5lIFYyUV9IMVEgMTEKKyNkZWZpbmUgVjJRX0gyUSAxMgorI2RlZmluZSBWM1FfSDJRIDEzCisjZGVmaW5lIFYwUV9IMlEgMTQKKyNkZWZpbmUgVjFRX0gyUSAxNQorKi8KKworCisjZGVmaW5lIERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRSAxMDAwCisKKy8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWJvdmUgY29zdCBtb2RlbAorY29uc3QgdWludDggQ09FRkZfQ09TVFsyXVsxNl0gPQoreworICAgIHszLCAyLCAyLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7OSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOSwgOX0KK307CisKKworCisvLyEgY29udmVydCBmcm9tIEguMjYzIFFQIHRvIEguMjY0IHF1YW50IGdpdmVuIGJ5OiBxdWFudD1wb3coMixRUC82KQorY29uc3QgaW50IFFQMlFVQU5UWzQwXSA9Cit7CisgICAgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKKyAgICAzLCAzLCAzLCA0LCA0LCA0LCA1LCA2LAorICAgIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE0LAorICAgIDE2LCAxOCwgMjAsIDIzLCAyNSwgMjksIDMyLCAzNiwKKyAgICA0MCwgNDUsIDUxLCA1NywgNjQsIDcyLCA4MSwgOTEKK307CisKKworLyoqCitUaGlzIGVudW1lcmF0aW9uIGtlZXBzIHRyYWNrIG9mIHRoZSBpbnRlcm5hbCBzdGF0dXMgb2YgdGhlIGVuY29kZXIgd2hldGhlciBpdCBpcyBkb2luZworc29tZXRoaW5nLiBUaGUgZW5jb2RpbmcgZmxvdyBmb2xsb3dzIHRoZSBvcmRlciBpbiB3aGljaCB0aGVzZSBzdGF0ZXMgYXJlLgorQHB1Ymxpc2hlZEFsbAorKi8KK3R5cGVkZWYgZW51bQoreworICAgIEFWQ0VuY19Jbml0aWFsaXppbmcgPSAwLAorICAgIEFWQ0VuY19FbmNvZGluZ19TUFMsCisgICAgQVZDRW5jX0VuY29kaW5nX1BQUywKKyAgICBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lLAorICAgIEFWQ0VuY19XYWl0aW5nRm9yQnVmZmVyLCAgLy8gcGVuZGluZyBzdGF0ZQorICAgIEFWQ0VuY19FbmNvZGluZ19GcmFtZSwKK30gQVZDRW5jX1N0YXRlIDsKKworLyoqCitCaXRzdHJlYW0gc3RydWN0dXJlIGNvbnRhaW5zIGJpdHN0cmVhbSByZWxhdGVkIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgcG9pbnRlcgordG8gdGhlIGJ1ZmZlciwgdGhlIGN1cnJlbnQgYnl0ZSBwb3NpdGlvbiBhbmQgYml0IHBvc2l0aW9uLiBUaGUgY29udGVudCBvZiB0aGUKK2JpdHN0cmVhbUJ1ZmZlciB3aWxsIGJlIGluIEVCU1AgZm9ybWF0IGFzIHRoZSBlbXVsYXRpb24gcHJldmVudGlvbiBjb2RlcyBhcmUKK2F1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgYXMgdGhlIFJCU1AgaXMgcmVjb3JkZWQuCitAcHVibGlzaGVkQWxsCisqLwordHlwZWRlZiBzdHJ1Y3QgdGFnRW5jQml0c3RyZWFtCit7CisgICAgdWludDggKmJpdHN0cmVhbUJ1ZmZlcjsgLyogcG9pbnRlciB0byBidWZmZXIgbWVtb3J5ICAgKi8KKyAgICBpbnQgYnVmX3NpemU7ICAgICAgIC8qIHNpemUgb2YgdGhlIGJ1ZmZlciBtZW1vcnkgKi8KKyAgICBpbnQgd3JpdGVfcG9zOyAgICAgIC8qIG5leHQgcG9zaXRpb24gdG8gd3JpdGUgdG8gYml0c3RyZWFtQnVmZmVyICAqLworICAgIGludCBjb3VudF96ZXJvczsgICAvKiBjb3VudCBudW1iZXIgb2YgY29uc2VjdXRpdmUgemVybyAqLworICAgIHVpbnQgY3VycmVudF93b3JkOyAgLyogYnl0ZS1zd2FwcGVkIChNU0IgbGVmdCkgY3VycmVudCB3b3JkIHRvIHdyaXRlIHRvIGJ1ZmZlciAqLworICAgIGludCBiaXRfbGVmdDsgICAgICAvKiBudW1iZXIgb2YgYml0IGxlZnQgaW4gY3VycmVudF93b3JkICovCisgICAgdWludDggICAqb3ZlcnJ1bkJ1ZmZlcjsgIC8qIGV4dHJhIG91dHB1dCBidWZmZXIgdG8gcHJldmVudCBjdXJyZW50IHNraXAgZHVlIHRvIG91dHB1dCBidWZmZXIgb3ZlcnJ1biovCisgICAgaW50ICAgICBvQlNpemU7ICAgICAvKiBzaXplIG9mIGFsbG9jYXRlZCBvdmVycnVuIGJ1ZmZlciAqLworICAgIHZvaWQgICAqZW5jdmlkOyAvKiBwb2ludGVyIHRvIHRoZSBtYWluIG9iamVjdCAqLworCit9IEFWQ0VuY0JpdHN0cmVhbTsKKworLyoqCitUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciByYXRlIGNvbnRyb2wgcHVycG9zZSBhbmQgb3RoZXIgcGVyZm9ybWFuY2UgcmVsYXRlZCBjb250cm9sCit2YXJpYWJsZXMgc3VjaCBhcywgUkQgY29zdCwgc3RhdGlzdGljcywgbW90aW9uIHNlYXJjaCBzdHVmZnMsIGV0Yy4KK3Nob3VsZCBiZSBpbiB0aGlzIHN0cnVjdHVyZS4KK0BwdWJsaXNoZWRBbGwKKyovCisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUkRJbmZvCit7CisgICAgaW50IFFQOworICAgIGludCBhY3R1YWxfYml0czsKKyAgICBPc2NsRmxvYXQgbWFkOworICAgIE9zY2xGbG9hdCBSX0Q7Cit9IFJESW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTXVsdGlQYXNzCit7CisgICAgLyogbXVsdGlwYXNzIHJhdGUgY29udHJvbCBkYXRhICovCisgICAgaW50IHRhcmdldF9iaXRzOyAgICAvKiB0YXJnZXQgYml0cyBmb3IgY3VycmVudCBmcmFtZSwgPSByYy0+VCAqLworICAgIGludCBhY3R1YWxfYml0czsgICAgLyogYWN0dWFsIGJpdHMgZm9yIGN1cnJlbnQgZnJhbWUgb2J0YWluZWQgYWZ0ZXIgZW5jb2RpbmcsID0gcmMtPlJjKi8KKyAgICBpbnQgUVA7ICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBsZXZlbCBmb3IgY3VycmVudCBmcmFtZSwgPSByYy0+UWMqLworICAgIGludCBwcmV2X1FQOyAgICAgICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCBwcmV2X3ByZXZfUVA7ICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBwcmV2aW91cyBmcmFtZSBiZWZvcmUgbGFzdCovCisgICAgT3NjbEZsb2F0IG1hZDsgICAgICAgICAgLyogbWFkIGZvciBjdXJyZW50IGZyYW1lLCA9IHZpZGVvLT5hdmdNQUQqLworICAgIGludCBiaXRyYXRlOyAgICAgICAgLyogYml0cmF0ZSBmb3IgY3VycmVudCBmcmFtZSAqLworICAgIE9zY2xGbG9hdCBmcmFtZXJhdGU7ICAgIC8qIGZyYW1lcmF0ZSBmb3IgY3VycmVudCBmcmFtZSovCisKKyAgICBpbnQgblJlX1F1YW50aXplZDsgIC8qIGNvbnRyb2wgdmFyaWFibGUgZm9yIG11bHRpcGFzcyBlbmNvZGluZywgKi8KKyAgICAvKiAwIDogZmlyc3QgcGFzcyAqLworICAgIC8qIDEgOiBpbnRlcm1lZGlhdGUgcGFzcyhxdWFudGl6YXRpb24gYW5kIFZMQyBsb29wIG9ubHkpICovCisgICAgLyogMiA6IGZpbmFsIHBhc3MoZGUtcXVhbnRpemF0aW9uLCBpZGN0LCBldGMpICovCisgICAgLyogMyA6IG1hY3JvYmxvY2sgbGV2ZWwgcmF0ZSBjb250cm9sICovCisKKyAgICBpbnQgZW5jb2RlZF9mcmFtZXM7ICAgICAvKiBjb3VudGVyIGZvciBhbGwgZW5jb2RlZCBmcmFtZXMgKi8KKyAgICBpbnQgcmVfZW5jb2RlZF9mcmFtZXM7ICAvKiBjb3VudGVyIGZvciBhbGwgbXVsdGlwYXNzIGVuY29kZWQgZnJhbWVzKi8KKyAgICBpbnQgcmVfZW5jb2RlZF90aW1lczsgICAvKiBjb3VudGVyIGZvciBhbGwgdGltZXMgb2YgbXVsdGlwYXNzIGZyYW1lIGVuY29kaW5nICovCisKKyAgICAvKiBNdWx0aXBsZSBmcmFtZSBwcmVkaWN0aW9uKi8KKyAgICBSREluZm8gKipwUkRTYW1wbGVzOyAgICAgICAgLyogcFJEU2FtcGxlc1szMF1bMzJdLCAzMC0+MzBmcHMsIDMyIC0+IDUgYml0IHF1YW50aXplciwgMzIgY2FuZGlkYXRlcyovCisgICAgaW50IGZyYW1lUG9zOyAgICAgICAgICAgICAgIC8qIHNwZWNpZmljIHBvc2l0aW9uIGluIHByZXZpb3VzIG11bHRpcGxlIGZyYW1lcyovCisgICAgaW50IGZyYW1lUmFuZ2U7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBvdmVyYWxsIHByZXZpb3VzIG11bHRpcGxlIGZyYW1lcyAqLworICAgIGludCBzYW1wbGVzUGVyRnJhbWVbMzBdOyAgICAvKiBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZnJhbWUsIDMwLT4zMGZwcyAqLworCisgICAgLyogQml0IGFsbG9jYXRpb24gZm9yIHNjZW5lIGNoYW5nZSBmcmFtZXMgYW5kIGhpZ2ggbW90aW9uIGZyYW1lcyAqLworICAgIE9zY2xGbG9hdCBzdW1fbWFkOworICAgIGludCBjb3VudGVyX0JUc3JjOyAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGJpdCB0cmFuc2ZlciBmcm9tIGxvdyBtb3Rpb24gZnJhbWVzIG9yIGxlc3MgY29tcGxpY2F0ZWRseSBjb21wcmVzc2VkIGZyYW1lcyAqLworICAgIGludCBjb3VudGVyX0JUZHN0OyAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGJpdCB0cmFuc2ZlciB0byBzY2VuZSBjaGFuZ2UgZnJhbWVzIG9yIGhpZ2ggbW90aW9uIGZyYW1lcyBvciBtb3JlIGNvbXBsaWNhdGVkbHkgY29tcHJlc3NlZCBmcmFtZXMgKi8KKyAgICBPc2NsRmxvYXQgc3VtX1FQOworICAgIGludCBkaWZmX2NvdW50ZXI7ICAgLyogZGlmZl9jb3VudGVyID0gLWRpZmZfY291bnRlcl9CVGRzdCwgb3IgZGlmZl9jb3VudGVyX0JUc3JjICovCisKKyAgICAvKiBGb3IgdGFyZ2V0IGJpdHJhdGUgb3IgZnJhbWVyYXRlIHVwZGF0ZSAqLworICAgIE9zY2xGbG9hdCB0YXJnZXRfYml0c19wZXJfZnJhbWU7ICAgICAgICAvKiA9IEMgPSBiaXRyYXRlL2ZyYW1lcmF0ZSAqLworICAgIE9zY2xGbG9hdCB0YXJnZXRfYml0c19wZXJfZnJhbWVfcHJldjsgICAvKiBwcmV2aW91cyBDICovCisgICAgT3NjbEZsb2F0IGF2ZXJfbWFkOyAgICAgICAgICAgICAgICAgICAgIC8qIHNvLWZhciBhdmVyYWdlIG1hZCBjb3VsZCByZXBsYWNlIHN1bV9tYWQgKi8KKyAgICBPc2NsRmxvYXQgYXZlcl9tYWRfcHJldjsgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgYXZlcmFnZSBtYWQgKi8KKyAgICBpbnQgICBvdmVybGFwcGVkX3dpbl9zaXplOyAgICAgICAgICAvKiB0cmFuc2l0aW9uIHBlcmlvZCBvZiB0aW1lICovCisgICAgaW50ICAgZW5jb2RlZF9mcmFtZXNfcHJldjsgICAgICAgICAgLyogcHJldmlvdXMgZW5jb2RlZF9mcmFtZXMgKi8KK30gTXVsdGlQYXNzOworCisKK3R5cGVkZWYgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5Cit7CisgICAgaW50IFFwOworICAgIGludCBScDsKKyAgICBPc2NsRmxvYXQgTXA7ICAgLyogZm9yIE1CLWJhc2VkIFJDICovCisgICAgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5ICpuZXh0OworICAgIHN0cnVjdCB0YWdkYXRhUG9pbnRBcnJheSAqcHJldjsKK30gZGF0YVBvaW50QXJyYXk7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0FWQ1JhdGVDb250cm9sCit7CisKKyAgICAvKiB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBpbml0aWFsaXplZCBieSB0aGUgdXNlcnMgQVZDRW5jUGFyYW1zICovCisgICAgLyogYml0cmF0ZS1yb2J1c3RuZXNzIHRyYWRlb2ZmICovCisgICAgdWludCBzY2RFbmFibGU7IC8qIGVuYWJsZSBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uICovCisgICAgaW50IGlkclBlcmlvZDsgIC8qIElEUiBwZXJpb2QgaW4gbnVtYmVyIG9mIGZyYW1lcyAqLworICAgIGludCBpbnRyYU1CUmF0ZTsgICAvKiBpbnRyYSBNQiByZWZyZXNoIHJhdGUgcGVyIGZyYW1lICovCisgICAgdWludCBkcEVuYWJsZTsgIC8qIGVuYWJsZSBkYXRhIHBhcnRpdGlvbmluZyAqLworCisgICAgLyogcXVhbGl0eS1jb21wbGV4aXR5IHRyYWRlb2ZmICovCisgICAgdWludCBzdWJQZWxFbmFibGU7ICAvKiBlbmFibGUgcXVhcnRlciBwZWwgc2VhcmNoICovCisgICAgaW50IG12UmFuZ2U7ICAgIC8qIG1vdGlvbiB2ZWN0b3Igc2VhcmNoIHJhbmdlIGluICsvLSBwaXhlbCAqLworICAgIHVpbnQgc3ViTUJFbmFibGU7ICAvKiBlbmFibGUgc3ViIE1CIHByZWRpY3Rpb24gbW9kZSAoNHg0LCA0eDgsIDh4NCkgKi8KKyAgICB1aW50IHJkT3B0RW5hYmxlOyAgLyogZW5hYmxlIFJELW9wdCBtb2RlIHNlbGVjdGlvbiAqLworICAgIHVpbnQgdHdvUGFzczsgLyogZmxhZyBmb3IgMiBwYXNzIGVuY29kaW5nICggZm9yIGZ1dHVyZSApKi8KKyAgICB1aW50IGJpZGlyUHJlZDsgLyogYmktZGlyZWN0aW9uYWwgcHJlZGljdGlvbiBmb3IgQi1mcmFtZS4gKi8KKworICAgIHVpbnQgcmNFbmFibGU7ICAvKiBlbmFibGUgcmF0ZSBjb250cm9sLCAnMScgb24sICcwJyBjb25zdCBRUCAqLworICAgIGludCBpbml0UVA7IC8qIGluaXRpYWwgUVAgKi8KKworICAgIC8qIG5vdGUgdGhlIGZvbGxvd2luZyAzIHBhcmFtcyBhcmUgZm9yIEhSRCwgdGhlc2UgdHJpcGxldHMgY2FuIGJlIGEgc2VyaWVzCisgICAgb2YgdHJpcGxldHMgYXMgdGhlIGdlbmVyYWxpemVkIEhSRCBhbGxvd3MuIFNFSSBtZXNzYWdlIG11c3QgYmUgZ2VuZXJhdGVkIGluIHRoaXMgY2FzZS4gKi8KKyAgICAvKiBXZSBubyBsb25nZXIgaGF2ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gQ0JSIGFuZCBWQlIuIFRoZSB1c2VycyB0byB0aGUKKyAgICBBVkMgZW5jb2RlciBsaWIgd2lsbCBkbyB0aGUgbWFwcGluZyBmcm9tIENCUi9WQlIgdG8gdGhlc2UgcGFyYW1ldGVycy4gKi8KKyAgICBpbnQzMiBiaXRSYXRlOyAgLyogdGFyZ2V0IGJpdCByYXRlIGZvciB0aGUgb3ZlcmFsbCBjbGlwIGluIGJpdHMvc2Vjb25kKi8KKyAgICBpbnQzMiBjcGJTaXplOyAgLyogY29kZWQgcGljdHVyZSBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLworICAgIGludDMyIGluaXREZWxheU9mZnNldDsgLyogaW5pdGlhbCBDQlAgcmVtb3ZhbCBkZWxheSBpbiBiaXRzICovCisKKyAgICBPc2NsRmxvYXQgZnJhbWVfcmF0ZTsgLyogZnJhbWUgcmF0ZSAqLworICAgIGludCBzcmNJbnRlcnZhbDsgLyogc291cmNlIGZyYW1lIHJhdGUgaW4gbXNlYyAqLworICAgIGludCBiYXNpY1VuaXQ7ICAvKiBudW1iZXIgb2YgbWFjcm9ibG9ja3MgcGVyIEJVICovCisKKyAgICAvKiBUaGVuIGludGVybmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBvcGVyYXRpb24gKi8KKyAgICB1aW50IGZpcnN0X2ZyYW1lOyAvKiBhIGZsYWcgZm9yIHRoZSBmaXJzdCBmcmFtZSAqLworICAgIGludCBsYW1iZGFfbWY7IC8qIGZvciBleGFtcGxlICovCisgICAgaW50IHRvdGFsU0FEOyAgICAvKiBTQUQgb2YgY3VycmVudCBmcmFtZSAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogdGhpcyBwYXJ0IGNvbWVzIGZyb20gTVBFRzQgcmF0ZSBjb250cm9sICovCisgICAgaW50IGFscGhhOyAgLyogd2VpZ2h0IGZvciBJIGZyYW1lICovCisgICAgaW50IFJzOyAgICAgLypiaXQgcmF0ZSBmb3IgdGhlIHNlcXVlbmNlIChvciBzZWdtZW50KSBlLmcuLCAyNDAwMCBiaXRzL3NlYyAqLworICAgIGludCBSYzsgICAgIC8qYml0cyB1c2VkIGZvciB0aGUgY3VycmVudCBmcmFtZS4gSXQgaXMgdGhlIGJpdCBjb3VudCBvYnRhaW5lZCBhZnRlciBlbmNvZGluZy4gKi8KKyAgICBpbnQgUnA7ICAgICAvKmJpdHMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBidWZmZXIgcGVyIHBpY3R1cmUuICovCisgICAgLyo/IGlzIHRoaXMgdGhlIGF2ZXJhZ2Ugb25lLCBvciBqdXN0IHRoZSBiaXRzIGNvZGVkIGZvciB0aGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICBpbnQgUnBzOyAgICAvKmJpdCB0byBiZSByZW1vdmVkIGZyb20gYnVmZmVyIHBlciBzcmMgZnJhbWUgKi8KKyAgICBPc2NsRmxvYXQgVHM7ICAgLypudW1iZXIgb2Ygc2Vjb25kcyBmb3IgdGhlIHNlcXVlbmNlICAob3Igc2VnbWVudCkuIGUuZy4sIDEwIHNlYyAqLworICAgIE9zY2xGbG9hdCBFcDsKKyAgICBPc2NsRmxvYXQgRWM7ICAgLyptZWFuIGFic29sdXRlIGRpZmZlcmVuY2UgZm9yIHRoZSBjdXJyZW50IGZyYW1lIGFmdGVyIG1vdGlvbiBjb21wZW5zYXRpb24uKi8KKyAgICAvKklmIHRoZSBtYWNyb2Jsb2NrIGlzIGludHJhIGNvZGVkLCB0aGUgb3JpZ2luYWwgc3BhdGlhbCBwaXhlbCB2YWx1ZXMgYXJlIHN1bW1lZC4qLworICAgIGludCBRYzsgICAgIC8qcXVhbnRpemF0aW9uIGxldmVsIHVzZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiAqLworICAgIGludCBOcjsgICAgIC8qbnVtYmVyIG9mIFAgZnJhbWVzIHJlbWFpbmluZyBmb3IgZW5jb2RpbmcuKi8KKyAgICBpbnQgUnI7IC8qbnVtYmVyIG9mIGJpdHMgcmVtYWluaW5nIGZvciBlbmNvZGluZyB0aGlzIHNlcXVlbmNlIChvciBzZWdtZW50KS4qLworICAgIGludCBScl9PbGQ7CisgICAgaW50IFQ7ICAgICAgLyp0YXJnZXQgYml0IHRvIGJlIHVzZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiovCisgICAgaW50IFM7ICAgICAgLypudW1iZXIgb2YgYml0cyB1c2VkIGZvciBlbmNvZGluZyB0aGUgcHJldmlvdXMgZnJhbWUuKi8KKyAgICBpbnQgSGM7IC8qaGVhZGVyIGFuZCBtb3Rpb24gdmVjdG9yIGJpdHMgdXNlZCBpbiB0aGUgY3VycmVudCBmcmFtZS4gSXQgaW5jbHVkZXMgYWxsIHRoZSAgaW5mb3JtYXRpb24gZXhjZXB0IHRvIHRoZSByZXNpZHVhbCBpbmZvcm1hdGlvbi4qLworICAgIGludCBIcDsgLypoZWFkZXIgYW5kIG1vdGlvbiB2ZWN0b3IgYml0cyB1c2VkIGluIHRoZSBwcmV2aW91cyBmcmFtZS4gSXQgaW5jbHVkZXMgYWxsIHRoZSAgICAgaW5mb3JtYXRpb24gZXhjZXB0IHRvIHRoZSByZXNpZHVhbCBpbmZvcm1hdGlvbi4qLworICAgIGludCBRbDsgLypxdWFudGl6YXRpb24gbGV2ZWwgdXNlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICBpbnQgQnM7IC8qYnVmZmVyIHNpemUgZS5nLiwgUi8yICovCisgICAgaW50IEI7ICAgICAgLypjdXJyZW50IGJ1ZmZlciBsZXZlbCBlLmcuLCBSLzQgLSBzdGFydCBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIGJ1ZmZlciAqLworICAgIE9zY2xGbG9hdCBYMTsKKyAgICBPc2NsRmxvYXQgWDI7CisgICAgT3NjbEZsb2F0IFgxMTsKKyAgICBPc2NsRmxvYXQgTTsgICAgICAgICAgICAvKnNhZmUgbWFyZ2luIGZvciB0aGUgYnVmZmVyICovCisgICAgT3NjbEZsb2F0IHNtVGljazsgICAgLypyYXRpbyBvZiBzcmMgdmVyc3VzIGVuYyBmcmFtZSByYXRlICovCisgICAgZG91YmxlIHJlbW5hbnQ7ICAvKnJlbWFpbmRlciBmcmFtZSBvZiBzcmMvZW5jIGZyYW1lIGZvciBmaW5lIGZyYW1lIHNraXBwaW5nICovCisgICAgaW50IHRpbWVJbmNSZXM7IC8qIHZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24gKi8KKworICAgIGRhdGFQb2ludEFycmF5ICAgKmVuZDsgLypxdWFudGl6YXRpb24gbGV2ZWxzIGZvciB0aGUgcGFzdCAoMjApIGZyYW1lcyAqLworCisgICAgaW50ICAgICBmcmFtZU51bWJlcjsgLyogcmFuZ2luZyBmcm9tIDAgdG8gMjAgbm9kZXMqLworICAgIGludCAgICAgdzsKKyAgICBpbnQgICAgIE5yX09yaWdpbmFsOworICAgIGludCAgICAgTnJfT2xkLCBOcl9PbGQyOworICAgIGludCAgICAgc2tpcF9uZXh0X2ZyYW1lOworICAgIGludCAgICAgUWRlcDsgICAgICAgLyogc21vb3RoIFEgYWRqdXN0bWVudCAqLworICAgIGludCAgICAgVkJSX0VuYWJsZWQ7CisKKyAgICBpbnQgdG90YWxGcmFtZU51bWJlcjsgLyogdG90YWwgY29kZWQgZnJhbWVzLCBmb3IgZGVidWdnaW5nISEqLworCisgICAgY2hhciAgICBvRmlyc3RUaW1lOworCisgICAgaW50IG51bUZyYW1lQml0czsgLyoga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgYml0cyBvZiB0aGUgY3VycmVudCBmcmFtZSAqLworICAgIGludCBOdW1iZXJvZkhlYWRlckJpdHM7CisgICAgaW50IE51bWJlcm9mVGV4dHVyZUJpdHM7CisgICAgaW50IG51bU1CSGVhZGVyQml0czsKKyAgICBpbnQgbnVtTUJUZXh0dXJlQml0czsKKyAgICBkb3VibGUgKk1BRG9mTUI7CisgICAgaW50MzIgYml0c1BlckZyYW1lOworCisgICAgLyogQlggcmF0ZSBjb250cm9sLCBzb21ldGhpbmcgbGlrZSBUTU44IHJhdGUgY29udHJvbCovCisKKyAgICBNdWx0aVBhc3MgKnBNUDsKKworICAgIGludCAgICAgVE1OX1c7CisgICAgaW50ICAgICBUTU5fVEg7CisgICAgaW50ICAgICBWQlZfZnVsbG5lc3M7CisgICAgaW50ICAgICBtYXhfQml0VmFyaWFuY2VfbnVtOyAvKiB0aGUgbnVtYmVyIG9mIHRoZSBtYXhpbXVtIGJpdCB2YXJpYW5jZSB3aXRoaW4gdGhlIGdpdmVuIGJ1ZmZlciB3aXRoIHRoZSB1bml0IG9mIDEwJSBvZiBiaXRyYXRlL2ZyYW1lcmF0ZSovCisgICAgaW50ICAgICBlbmNvZGVkX2ZyYW1lczsgLyogY291bnRlciBmb3IgYWxsIGVuY29kZWQgZnJhbWVzICovCisgICAgaW50ICAgICBsb3dfYm91bmQ7ICAgICAgICAgICAgICAvKiBib3VuZCBmb3IgdW5kZXJmbG93IGRldGVjdGlvbiwgdXN1YWxseSBsb3dfYm91bmQ9LUJzLzIsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGluIEguMjYzIG1vZGUgKi8KKyAgICBpbnQgICAgIFZCVl9mdWxsbmVzc19vZmZzZXQ7ICAgIC8qIG9mZnNldCBvZiBWQlZfZnVsbG5lc3MsIHVzdWFsbHkgaXMgemVybywgYnV0IGNhbiBiZSBjaGFuZ2VkIGluIEguMjYzIG1vZGUqLworICAgIC8qIEVuZCBCWCAqLworCit9IEFWQ1JhdGVDb250cm9sOworCisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBtb3Rpb24gdmVjdG9yIGluZm9ybWF0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnTVYKK3sKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKyAgICB1aW50IHNhZDsKK30gQVZDTVY7CisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybSBkZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YKK2Z1bmN0aW9ucy4gKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0FWQ0VuY0Z1bmNQdHIKK3sKKworICAgIGludCAoKlNBRF9NQl9IYWxmUGVsWzRdKSh1aW50OCosIHVpbnQ4KiwgaW50LCB2b2lkICopOworICAgIGludCAoKlNBRF9NYWNyb2Jsb2NrKSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisKK30gQVZDRW5jRnVuY1B0cjsKKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGNvcnJlY3QgcGFkZGluZy4KKyovCit0eXBlZGVmIHN0cnVjdCB0YWdQYWRJbmZvCit7CisgICAgaW50IGk7CisgICAgaW50IHdpZHRoOworICAgIGludCBqOworICAgIGludCBoZWlnaHQ7Cit9IEFWQ1BhZEluZm87CisKKworI2lmZGVmIEhURk0KK3R5cGVkZWYgc3RydWN0IHRhZ0hURk1fU3RhdAoreworICAgIGludCBhYnNfZGlmX21hZF9hdmc7CisgICAgdWludCBjb3VudGJyZWFrOworICAgIGludCBvZmZzZXRBcnJheVsxNl07CisgICAgaW50IG9mZnNldFJlZlsxNl07Cit9IEhURk1fU3RhdDsKKyNlbmRpZgorCisKKy8qKgorVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIG1haW4gb2JqZWN0IGZvciBBVkMgZW5jb2RlciBsaWJyYXJ5IHByb3ZpZGluZyBhY2Nlc3MgdG8gYWxsCitnbG9iYWwgdmFyaWFibGVzLiBJdCBpcyBhbGxvY2F0ZWQgYXQgUFZBVkNJbml0RW5jb2RlciBhbmQgZnJlZWQgYXQgUFZBVkNDbGVhblVwRW5jb2Rlci4KK0BwdWJsaXNoZWRBbGwKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdFbmNPYmplY3QKK3sKKworICAgIEFWQ0NvbW1vbk9iaiAqY29tbW9uOworCisgICAgQVZDRW5jQml0c3RyZWFtICAgICAqYml0c3RyZWFtOyAvKiBmb3IgY3VycmVudCBOQUwgKi8KKyAgICB1aW50OCAgICpvdmVycnVuQnVmZmVyOyAgLyogZXh0cmEgb3V0cHV0IGJ1ZmZlciB0byBwcmV2ZW50IGN1cnJlbnQgc2tpcCBkdWUgdG8gb3V0cHV0IGJ1ZmZlciBvdmVycnVuKi8KKyAgICBpbnQgICAgIG9CU2l6ZTsgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIG92ZXJydW4gYnVmZmVyICovCisKKyAgICAvKiByYXRlIGNvbnRyb2wgKi8KKyAgICBBVkNSYXRlQ29udHJvbCAgICAgICpyYXRlQ3RybDsgLyogcG9pbnRlciB0byB0aGUgcmF0ZSBjb250cm9sIHN0cnVjdHVyZSAqLworCisgICAgLyogZW5jb2Rpbmcgb3BlcmF0aW9uICovCisgICAgQVZDRW5jX1N0YXRlICAgICAgICBlbmNfc3RhdGU7IC8qIGVuY29kaW5nIHN0YXRlICovCisKKyAgICBBVkNGcmFtZUlPICAgICAgICAgICpjdXJySW5wdXQ7IC8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgaW5wdXQgZnJhbWUgKi8KKworICAgIGludCAgICAgICAgICAgICAgICAgY3VyclNsaWNlR3JvdXA7IC8qIGN1cnJlbnRseSBlbmNvZGVkIHNsaWNlIGdyb3VwIGlkICovCisKKyAgICBpbnQgICAgIGxldmVsWzI0XVsxNl0sIHJ1blsyNF1bMTZdOyAvKiBzY3JhdGNoIG1lbW9yeSAqLworICAgIGludCAgICAgbGV2ZWxkY1sxNl0sIHJ1bmRjWzE2XTsgLyogZm9yIERDIGNvbXBvbmVudCAqLworICAgIGludCAgICAgbGV2ZWxjZGNbMTZdLCBydW5jZGNbMTZdOyAvKiBmb3IgY2hyb21hIERDIGNvbXBvbmVudCAqLworICAgIGludCAgICAgbnVtY29lZmNkY1syXTsgLyogbnVtYmVyIG9mIGNvZWZmaWNpZW50IGZvciBjaHJvbWEgREMgKi8KKyAgICBpbnQgICAgIG51bWNvZWZkYzsgICAgICAvKiBudW1iZXIgb2YgY29lZmZpY2llbnRzIGZvciBEQyBjb21wb25lbnQgKi8KKworICAgIGludCAgICAgcXBfY29uc3Q7CisgICAgaW50ICAgICBxcF9jb25zdF9jOworICAgIC8qKioqKioqKiogaW50cmEgcHJlZGljdGlvbiBzY3JhdGNoIG1lbW9yeSAqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQ4ICAgcHJlZF9pMTZbQVZDTnVtSTE2UHJlZE1vZGVdWzI1Nl07IC8qIHNhdmUgcHJlZGljdGlvbiBmb3IgTUIgKi8KKyAgICB1aW50OCAgIHByZWRfaTRbQVZDTnVtSTRQcmVkTW9kZV1bMTZdOyAgLyogc2F2ZSBwcmVkaWN0aW9uIGZvciBibGsgKi8KKyAgICB1aW50OCAgIHByZWRfaWNbQVZDTnVtSUNocm9tYU1vZGVdWzEyOF07ICAvKiBmb3IgMiBjaHJvbWEgKi8KKworICAgIGludCAgICAgbW9zdFByb2JhYmxlSTRNb2RlWzE2XTsgLyogaW4gcmFzdGVyIHNjYW4gb3JkZXIgKi8KKyAgICAvKioqKioqKioqIG1vdGlvbiBjb21wZW5zYXRpb24gcmVsYXRlZCB2YXJpYWJsZXMgKioqKioqKioqKioqKioqKi8KKyAgICBBVkNNViAgICptb3QxNngxNjsgICAgICAgICAgLyogU2F2ZWQgbW90aW9uIHZlY3RvcnMgZm9yIDE2eDE2IGJsb2NrKi8KKyAgICBBVkNNVigqbW90MTZ4OClbMl07ICAgICAvKiBTYXZlZCBtb3Rpb24gdmVjdG9ycyBmb3IgMTZ4OCBibG9jayovCisgICAgQVZDTVYoKm1vdDh4MTYpWzJdOyAgICAgLyogU2F2ZWQgbW90aW9uIHZlY3RvcnMgZm9yIDh4MTYgYmxvY2sqLworICAgIEFWQ01WKCptb3Q4eDgpWzRdOyAgICAgIC8qIFNhdmVkIG1vdGlvbiB2ZWN0b3JzIGZvciA4eDggYmxvY2sqLworCisgICAgLyoqKioqKioqKiBzdWJwZWwgcG9zaXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDMyICBzdWJwZWxfcHJlZFtTVUJQRUxfUFJFRF9CTEtfU0laRS8qPDwyKi9dOyAvKiBhbGwgMTYgc3ViLXBlbCBwb3NpdGlvbnMgICovCisgICAgdWludDggICAqaHBlbF9jYW5kWzldOyAgICAgIC8qIHBvaW50ZXIgdG8gaGFsZi1wZWwgcG9zaXRpb24gKi8KKyAgICBpbnQgICAgIGJlc3RfaHBlbF9wb3M7ICAgICAgICAgIC8qIGJlc3QgcG9zaXRpb24gKi8KKyAgICB1aW50OCAgIHFwZWxfY2FuZFs4XVsyNCoxNl07ICAgICAgICAvKiBwb2ludGVyIHRvIHF1YXJ0ZXItcGVsIHBvc2l0aW9uICovCisgICAgaW50ICAgICBiZXN0X3FwZWxfcG9zOworICAgIHVpbnQ4ICAgKmJpbGluX2Jhc2VbOV1bNF07ICAgIC8qIHBvaW50ZXIgdG8gNCBwb3NpdGlvbiBhdCB0b3AgbGVmdCBvZiBiaWxpbmVhciBxdWFydGVyLXBlbCAqLworCisgICAgLyogbmVlZCBmb3IgaW50cmEgcmVmcmVzaCByYXRlICovCisgICAgdWludDggICAqaW50cmFTZWFyY2g7ICAgICAgIC8qIEludHJhIEFycmF5IGZvciBNQnMgdG8gYmUgaW50cmEgc2VhcmNoZWQgKi8KKyAgICB1aW50ICAgIGZpcnN0SW50cmFSZWZyZXNoTUJJbmR4OyAvKiBrZWVwIHRyYWNrIGZvciBpbnRyYSByZWZyZXNoICovCisKKyAgICBpbnQgICAgIGk0X3NhZDsgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IGZvciBpNCBtb2RlIFNBRCAqLworICAgIGludCAgICAgKm1pbl9jb3N0OyAgICAgICAgICAvKiBNaW5pbXVtIGNvc3QgZm9yIHRoZSBhbGwgTUJzICovCisgICAgaW50ICAgICBsYW1iZGFfbW9kZTsgICAgICAgIC8qIExhZ3JhbmdlIHBhcmFtZXRlciBmb3IgbW9kZSBzZWxlY3Rpb24gKi8KKyAgICBpbnQgICAgIGxhbWJkYV9tb3Rpb247ICAgICAgLyogTGFncmFuZ2UgcGFyYW1ldGVyIGZvciBNViBzZWxlY3Rpb24gKi8KKworICAgIHVpbnQ4ICAgKm12Yml0c19hcnJheTsgICAgICAvKiBUYWJsZSBmb3IgYml0cyBzcGVudCBpbiB0aGUgY29zdCBmdW5jaXRvbiAqLworICAgIHVpbnQ4ICAgKm12Yml0czsgICAgICAgICAgICAvKiBBbiBvZmZzZXQgdG8gdGhlIGFib3ZlIGFycmF5LiAqLworCisgICAgLyogdG8gc3BlZWR1cCB0aGUgU0FEIGNhbGN1bGF0aW9uICovCisgICAgdm9pZCAqc2FkX2V4dHJhX2luZm87CisgICAgdWludDggY3VycllNQlsyNTZdOyAgICAgLyogaW50ZXJsZWF2ZWQgY3VycmVudCBtYWNyb2Jsb2NrIGluIEhURk0gb3JkZXIgKi8KKworI2lmZGVmIEhURk0KKyAgICBpbnQgbnJtbHpfdGhbNDhdOyAgICAgICAvKiBUaHJlc2hvbGQgZm9yIGZhc3QgU0FEIGNhbGN1bGF0aW9uIHVzaW5nIEhURk0gKi8KKyAgICBIVEZNX1N0YXQgaHRmbV9zdGF0OyAgICAvKiBGb3Igc3RhdGlzdGljcyBjb2xsZWN0aW9uICovCisjZW5kaWYKKworICAgIC8qIHN0YXRpc3RpY3MgKi8KKyAgICBpbnQgbnVtSW50cmFNQjsgICAgICAgICAvKiBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBpbnRyYSBNQiAqLworCisgICAgLyogZW5jb2RpbmcgY29tcGxleGl0eSBjb250cm9sICovCisgICAgdWludCBmdWxsc2VhcmNoX2VuYWJsZTsgLyogZmxhZyB0byBlbmFibGUgZnVsbC1wZWwgZnVsbC1zZWFyY2ggKi8KKworICAgIC8qIG1pc2MuKi8KKyAgICBib29sIG91dE9mQmFuZFBhcmFtU2V0OyAvKiBmbGFnIHRvIGVuYWJsZSBvdXQtb2YtYmFuZCBwYXJhbSBzZXQgKi8KKworICAgIEFWQ1NlcVBhcmFtU2V0IGV4dFNQUzsgLyogZm9yIGV4dGVybmFsIFNQUyAqLworICAgIEFWQ1BpY1BhcmFtU2V0IGV4dFBQUzsgLyogZm9yIGV4dGVybmFsIFBQUyAqLworCisgICAgLyogdGltZSBjb250cm9sICovCisgICAgdWludDMyICBwcmV2RnJhbWVOdW07ICAgLyogcHJldmlvdXMgZnJhbWUgbnVtYmVyIHN0YXJ0aW5nIGZyb20gbW9kVGltZVJlZiAqLworICAgIHVpbnQzMiAgbW9kVGltZVJlZjsgICAgIC8qIFJlZmVyZW5jZSBtb2RUaW1lIHVwZGF0ZSBldmVyeSBJLVZvcCovCisgICAgdWludDMyICB3cmFwTW9kVGltZTsgICAgLyogT2Zmc2V0IHRvIG1vZFRpbWUgUmVmLCByYXJlbHkgdXNlZCAqLworCisgICAgdWludCAgICBwcmV2UHJvY0ZyYW1lTnVtOyAgLyogcHJldmlvdXNseSBwcm9jZXNzZWQgZnJhbWUgbnVtYmVyLCBjb3VsZCBiZSBza2lwcGVkICovCisgICAgdWludCAgICBwcmV2Q29kZWRGcmFtZU51bTsgIC8qIHByZXZpb3VzbHkgZW5jb2RlZCBmcmFtZSBudW1iZXIgKi8KKyAgICAvKiBQT0MgcmVsYXRlZCB2YXJpYWJsZXMgKi8KKyAgICB1aW50MzIgIGRpc3BPcmRQT0NSZWY7ICAgICAgLyogcmVmZXJlbmNlIFBPQyBpcyBkaXNwbGF5ZXIgb3JkZXIgdW5pdC4gKi8KKworICAgIC8qIEZ1bmN0aW9uIHBvaW50ZXJzICovCisgICAgQVZDRW5jRnVuY1B0ciAqZnVuY3Rpb25Qb2ludGVyOyAvKiBzdG9yZSBwb2ludGVycyB0byBwbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KKworICAgIC8qIEFwcGxpY2F0aW9uIGNvbnRyb2wgZGF0YSAqLworICAgIEFWQ0hhbmRsZSAqYXZjSGFuZGxlOworCisKK30gQVZDRW5jT2JqZWN0OworCisKKyNlbmRpZiAvKkFWQ0VOQ19JTlRfSF9JTkNMVURFRCovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfbGliLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTI4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2xpYi5oCkBAIC0wLDAgKzEsMTAyMCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKgorVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiBpbnRlcm5hbCBmdW5jdGlvbnMgZm9yIEFWQyBkZWNvZGVyIGxpYnJhcnkuCitAcHVibGlzaGVkQWxsCisqLworI2lmbmRlZiBBVkNFTkNfTElCX0hfSU5DTFVERUQKKyNkZWZpbmUgQVZDRU5DX0xJQl9IX0lOQ0xVREVECisKKyNpZm5kZWYgQVZDTElCX0NPTU1PTl9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjbGliX2NvbW1vbi5oIgorI2VuZGlmCisjaWZuZGVmIEFWQ0VOQ19JTlRfSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2VuY19pbnQuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorICAgIC8qLS0tLS0tLS0tLS0tLSBibG9jay5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHJlc2lkdWUgY2FsY3VsYXRpb24sIHRyYW5zZm9ybSwgcXVhbnRpemUsIGludmVyc2UgcXVhbnRpemUsCisgICAgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIHJlc2lkdWUgY29tcGVuc2F0aW9uIG9uIGEgNHg0IGJsb2NrLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiYmxraWR4IiAgInJhc3RlciBzY2FuIGJsb2NrIGluZGV4IG9mIHRoZSBjdXJyZW50IDR4NCBibG9jay4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZyIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrLiIKKyAgICBccGFyYW0gImNvZWZfY29zdCIgICJQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBjb3N0IHRvIGJlIGZpbGxlZCBpbiBhbmQgcmV0dXJuZWQuIgorICAgIFxyZXR1cm4gIk51bWJlciBvZiBub24temVybyBjb2VmZmljaWVudHMuIgorICAgICovCisgICAgaW50IGRjdF9sdW1hKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgYmxraWR4LCB1aW50OCAqY3VyLCB1aW50OCAqb3JnLCBpbnQgKmNvZWZfY29zdCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIElEQ1Qgb24gYW4gSU5URVIgbWFjcm9ibG9jay4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbiBvZiB0aGUgbWFjcm9ibG9jayBvbiB0aGUgY3VycmVudCBmcmFtZS4iCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJwaWNQaXRjaCIgIlBpdGNoIG9mIHRoZSBjdXJyZW50IGZyYW1lLiIKKyAgICBccmV0dXJuICJ2b2lkIi4KKyAgICAqLworICAgIHZvaWQgTUJJbnRlcklkY3QoQVZDQ29tbW9uT2JqICp2aWRlbywgdWludDggKmN1ckwsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IHBpY1BpdGNoKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSByZXNpZHVlIGNhbGN1bGF0aW9uLCB0cmFuc2Zvcm0sIHF1YW50aXplLCBpbnZlcnNlIHF1YW50aXplLAorICAgIGludmVyc2UgdHJhbnNmb3JtIGFuZCByZXNpZHVlIGNvbXBlbnNhdGlvbiBvbiBhIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJjdXJMIiAgICJQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIE1CLiIKKyAgICBccGFyYW0gIm9yZ0wiICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBNQi4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgZGN0X2x1bWFfMTZ4MTYoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJMLCB1aW50OCAqb3JnTCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gcmVzaWR1ZSBjYWxjdWxhdGlvbiwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgaW52ZXJzZSBxdWFudGl6ZSwKKyAgICBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgcmVzaWR1ZSBjb21wZW5zYXRpb24gZm9yIGNocm9tYSBjb21wb25lbnRzIG9mIGFuIE1CLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiY3VyQyIgICAiUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCBNQi4iCisgICAgXHBhcmFtICJvcmdDIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgTUIuIgorICAgIFxwYXJhbSAiY3IiICAgICAiRmxhZyB3aGV0aGVyIGl0IGlzIENyIG9yIG5vdC4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgZGN0X2Nocm9tYShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ckMsIHVpbnQ4ICpvcmdDLCBpbnQgY3IpOworCisgICAgLyotLS0tLS0tLS0tLSBpbml0LmMgLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdXNlcnMgaW4gZW5jUGFyYW0uCisgICAgVGhlIHJlc3VsdHMgYXJlIGtlcHQgaW4gQVZDRW5jT2JqZWN0LCBBVkNTZXFQYXJhbVNldCwgQVZDUGljUGFyYW1TZXQgYW5kIEFWQ1NsaWNlSGVhZGVyLgorICAgIFxwYXJhbSAiZW5jdmlkIiAgICAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImVuY1BhcmFtIiAgICJQb2ludGVyIHRvIEFWQ0VuY1BhcmFtLiIKKyAgICBccGFyYW0gImV4dFNQUyIgICAgICJFeHRlcm5hbCBTUFMgdGVtcGxhdGUgdG8gYmUgZm9sbG93ZWQuIE5VTEwgaWYgbm90IHByZXNlbnQuIgorICAgIFxwYXJhbSAiZXh0UFBTIiAgICAgIkV4dGVybmFsIFBQUyB0ZW1wbGF0ZSB0byBiZSBmb2xsb3dlZC4gTlVMTCBpZiBub3QgcHJlc2VudC4iCisgICAgXHJldHVybiAic2VlIEFWQ0VuY19TdGF0dXMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyAgU2V0RW5jb2RlUGFyYW0oQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY1BhcmFtcyAqZW5jUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZXh0U1BTLCB2b2lkICpleHRQUFMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyB3aGV0aGVyIHRoZXkgbWVldCB0aGUgc2V0IG9mIHN1cHBvcnRlZAorICAgIHRvb2wgYnkgYSBzcGVjaWZpYyBwcm9maWxlLiBJZiB0aGUgcHJvZmlsZSBpcyBub3Qgc2V0LCBpdCB3aWxsIGp1c3QgZmluZCB0aGUgY2xvc2VzdAorICAgIHByb2ZpbGUgaW5zdGVhZCBvZiB2ZXJpZnlpbmcgaXQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJzZXFQYXJhbSIgICAiUG9pbnRlciB0byBBVkNTZXFQYXJhbVNldC4iCisgICAgXHBhcmFtICJwaWNQYXJhbSIgICAiUG9pbnRlciB0byBBVkNQaWNQYXJhbVNldC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywKKyAgICAgICAgICAgIEFWQ0VOQ19QUk9GSUxFX05PVF9TVVBQT1JURUQgaWYgdGhlIHNwZWNpZmllZCBwcm9maWxlCisgICAgICAgICAgICAgICAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksCisgICAgICAgICAgICBBVkNFTkNfVE9PTFNfTk9UX1NVUFBPUlRFRCBpZiBhbnkgb2YgdGhlIHNwZWNpZmllZCBlbmNvZGluZyB0b29scyBhcmUKKyAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHVzZXItc2VsZWN0ZWQgcHJvZmlsZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFZlcmlmeVByb2ZpbGUoQVZDRW5jT2JqZWN0ICp2aWRlbywgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyB3aGV0aGVyIHRoZXkgbWVldCB0aGUgcmVxdWlyZW1lbnQKKyAgICBmb3IgYSBzcGVjaWZpYyBsZXZlbC4gSWYgdGhlIGxldmVsIGlzIG5vdCBzZXQsIGl0IHdpbGwganVzdCBmaW5kIHRoZSBjbG9zZXN0CisgICAgbGV2ZWwgaW5zdGVhZCBvZiB2ZXJpZnlpbmcgaXQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJzZXFQYXJhbSIgICAiUG9pbnRlciB0byBBVkNTZXFQYXJhbVNldC4iCisgICAgXHBhcmFtICJwaWNQYXJhbSIgICAiUG9pbnRlciB0byBBVkNQaWNQYXJhbVNldC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywKKyAgICAgICAgICAgIEFWQ0VOQ19MRVZFTF9OT1RfU1VQUE9SVEVEIGlmIHRoZSBzcGVjaWZpZWQgbGV2ZWwKKyAgICAgICAgICAgICAgICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwKKyAgICAgICAgICAgIEFWQ0VOQ19MRVZFTF9GQUlMIGlmIGFueSBvZiB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBleGNlZWQKKyAgICAgICAgICAgIHRoZSByYW5nZSBvZiB0aGUgdXNlci1zZWxlY3RlZCBsZXZlbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFZlcmlmeUxldmVsKEFWQ0VuY09iamVjdCAqdmlkZW8sIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSwgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY2l0b24gaW5pdGlhbGl6ZXMgdGhlIGZyYW1lIGVuY29kaW5nIGJ5IHNldHRpbmcgcG9jL2ZyYW1lX251bSByZWxhdGVkIHBhcmFtZXRlcnMuIGl0CisgICAgYWxzbyBwZXJmb3JtcyBtb3Rpb24gZXN0aW1hdGlvbi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywgQVZDRU5DX05PX1BJQ1RVUkUgaWYgdGhlcmUgaXMgbm8gaW5wdXQgcGljdHVyZQorICAgICAgICAgICAgaW4gdGhlIHF1ZXVlIHRvIGVuY29kZSwgQVZDRU5DX1BPQ19GQUlMIG9yIEFWQ0VOQ19DT05TRUNVVElWRV9OT05SRUYgZm9yIFBPQworICAgICAgICAgICAgcmVsYXRlZCBlcnJvcnMsIEFWQ0VOQ19ORVdfSURSIGlmIG5ldyBJRFIgaXMgZGV0ZWN0ZWQuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0RnJhbWUoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBzbGljZSBoZWFkZXIgcmVsYXRlZCB2YXJpYWJsZXMgYW5kIG90aGVyIHZhcmlhYmxlcyBuZWNlc3NhcnkKKyAgICBmb3IgZGVjb2Rpbmcgb25lIHNsaWNlLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgSW5pdFNsaWNlKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qLS0tLS0tLS0tLS0gaGVhZGVyLmMgLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBiaXRzdHJlYW0gZW5jb2Rpbmcgb2YgdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgTkFMLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19TUFNfRkFJTCBvciBvdGhlcnMgZm9yIHVuZXhwZWN0ZWQgZmFpbHVyZSB3aGljaAorICAgIHNob3VsZCBub3Qgb2NjdXIuIFRoZSBTUFMgcGFyYW1ldGVycyBzaG91bGQgYWxsIGJlIHZlcmlmaWVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZVNQUyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBWVUkgcGFyYW1ldGVycyBpbnRvIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGJpdHN0cmVhbS4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInZ1aSIgICAgIlBvaW50ZXIgdG8gQVZDVlVJUGFyYW1zLiIKKyAgICBccmV0dXJuICJub3RoaW5nLiIKKyAgICAqLworICAgIHZvaWQgRW5jb2RlVlVJKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBBVkNWVUlQYXJhbXMqIHZ1aSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgSFJEIHBhcmFtZXRlcnMgaW50byB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBiaXRzdHJlYW0KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gImhyZCIgICAgIlBvaW50ZXIgdG8gQVZDSFJEUGFyYW1zLiIKKyAgICBccmV0dXJuICJub3RoaW5nLiIKKyAgICAqLworICAgIHZvaWQgRW5jb2RlSFJEKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBBVkNIUkRQYXJhbXMqIGhyZCk7CisKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYml0c3RyZWFtIGVuY29kaW5nIG9mIHRoZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgTkFMLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19QUFNfRkFJTCBvciBvdGhlcnMgZm9yIHVuZXhwZWN0ZWQgZmFpbHVyZSB3aGljaAorICAgIHNob3VsZCBub3Qgb2NjdXIuIFRoZSBTUFMgcGFyYW1ldGVycyBzaG91bGQgYWxsIGJlIHZlcmlmaWVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZVBQUyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHNsaWNlIGhlYWRlciBpbmZvcm1hdGlvbiB3aGljaCBoYXMgYmVlbiBpbml0aWFsaXplZCBvciBmYWJyaWNhdGVkCisgICAgcHJpb3IgdG8gZW50ZXJpbmcgdGhpcyBmdW5jaXRvbi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBiaXRzdHJlYW0gZmFpbCBzdGF0dXNlcy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZVNsaWNlSGVhZGVyKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgcmVmZXJlbmNlIHBpY3R1cmUgbGlzdCByZW9yZGVyaW5nIHJlbHRlZCBzeW50YXguCisgICAgXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInNsaWNlSGRyIiAiUG9pbnRlciB0byBBVkNTbGljZUhkci4iCisgICAgXHBhcmFtICJzbGljZV90eXBlIiAiVmFsdWUgb2Ygc2xpY2VfdHlwZSAtIDUgaWYgZ3JlYXRlciB0aGFuIDUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIGFuZCBBVkNFTkNfRkFJTCBvdGhlcndpc2UuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyByZWZfcGljX2xpc3RfcmVvcmRlcmluZyhBVkNDb21tb25PYmogKnZpZGVvLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyLCBpbnQgc2xpY2VfdHlwZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgZGVjX3JlZl9waWNfbWFya2luZyByZWxhdGVkIHN5bnRheC4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAic2xpY2VIZHIiICJQb2ludGVyIHRvIEFWQ1NsaWNlSGRyLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBhbmQgQVZDRU5DX0ZBSUwgb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgZGVjX3JlZl9waWNfbWFya2luZyhBVkNDb21tb25PYmogKnZpZGVvLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBPQyByZWxhdGVkIHZhcmlhYmxlcyBhbmQgdGhlIFBPQyBzeW50YXggdG8gYmUgZW5jb2RlZAorICAgIHRvIHRoZSBzbGljZSBoZWFkZXIgZGVyaXZlZCBmcm9tIHRoZSBkaXNwX29yZGVyIGFuZCBpc19yZWZlcmVuY2UgZmxhZyBvZiB0aGUgb3JpZ2luYWwKKyAgICBpbnB1dCBmcmFtZSB0byBiZSBlbmNvZGVkLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLAorICAgICAgICAgICAgQVZDRU5DX1BPQ19GQUlMIGlmIHRoZSBwb2MgdHlwZSBpcyB1bmRlZmluZWQgb3IKKyAgICAgICAgICAgIEFWQ0VOQ19DT05TRUNVVElWRV9OT05SRUYgaWYgdGhlcmUgYXJlIGNvbnNlY3V0aXZlIG5vbi1yZWZlcmVuY2UgZnJhbWUgZm9yIFBPQyB0eXBlIDIuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0UE9DKEFWQ0VuY09iamVjdCAqdmlkZW8pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBQT0MgcmVsYXRlZCBvcGVyYXRpb24gYWZ0ZXIgYSBwaWN0dXJlIGlzIGRlY29kZWQuCisgICAgXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgUG9zdFBPQyhBVkNDb21tb25PYmogKnZpZGVvKTsKKworICAgIC8qLS0tLS0tLS0tLS0gYml0c3RyZWFtX2lvLmMgLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgYml0c3RyZWFtIHN0cnVjdHVyZSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBieQorICAgIHRoZSB1c2Vycy4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImJ1ZmZlciIgICAgICJQb2ludGVyIHRvIHRoZSB1bnNpZ25lZCBjaGFyIGJ1ZmZlciBmb3Igb3V0cHV0LiIKKyAgICBccGFyYW0gImJ1Zl9zaXplIiAgICJUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLiIKKyAgICBccGFyYW0gIm92ZXJydW5CdWZmZXIiICAiUG9pbnRlciB0byBleHRyYSBvdmVycnVuIGJ1ZmZlci4iCisgICAgXHBhcmFtICJvQlNpemUiICAgICAiU2l6ZSBvZiBvdmVycnVuIGJ1ZmZlciBpbiBieXRlcy4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywgQVZDRU5DX0JJVFNUUkVBTV9JTklUX0ZBSUwgaWYgZmFpbCIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQml0c3RyZWFtRW5jSW5pdChBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludDggKmJ1ZmZlciwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqb3ZlcnJ1bkJ1ZmZlciwgaW50IG9CU2l6ZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgZGF0YSBmcm9tIHRoZSBjYWNoZSBpbnRvIHRoZSBiaXRzdHJlYW0gYnVmZmVyLiBJdCBhbHNvIGFkZHMgdGhlCisgICAgZW11bGF0aW9uIHByZXZlbnRpb24gY29kZSBpZiBuZWNlc3NhcnkuCisgICAgXHBhcmFtICJzdHJlYW0iICAgICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMIGlmIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBBVkNCaXRzdHJlYW1TYXZlV29yZChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgY29kZXdvcmQgaW50byB0aGUgY2FjaGUgd2hpY2ggd2lsbCBldmVudHVhbGx5IGJlIHdyaXR0ZW4gdG8KKyAgICB0aGUgYml0c3RyZWFtIGJ1ZmZlci4KKyAgICBccGFyYW0gInN0cmVhbSIgICAgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gIm5CaXRzIiAgICAgICJOdW1iZXIgb2YgYml0cyBpbiB0aGUgY29kZXdvcmQuIgorICAgIFxwYXJhbSAiY29kZSIgICAgICAgIlRoZSBjb2Rld29yZC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMIGlmIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1Xcml0ZUJpdHMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBuQml0cywgdWludCBjb2RlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG9uZSBiaXQgb2YgZGF0YSBpbnRvIHRoZSBjYWNoZSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUgd3JpdHRlbgorICAgIHRvIHRoZSBiaXRzdHJlYW0gYnVmZmVyLgorICAgIFxwYXJhbSAic3RyZWFtIiAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY29kZSIgICAgICAgIlRoZSBjb2Rld29yZC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcyBvciBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMIGlmIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1Xcml0ZTFCaXQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgY29kZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgdHJhaWxpbmcgYml0cyB0byB0aGUgYml0c3RyZWFtIGFuZCByZXBvcnRzIGJhY2sgdGhlIGZpbmFsIEVCU1Agc2l6ZS4KKyAgICBccGFyYW0gInN0cmVhbSIgICAgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gIm5hbF9zaXplIiAgICJPdXRwdXQgdGhlIGZpbmFsIE5BTCBzaXplLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVRyYWlsaW5nQml0cyhBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCAqbmFsX3NpemUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaXMgYnl0ZS1hbGlnbmVkIG9yIG5vdC4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInRydWUgaWYgYnl0ZS1hbGlnbmVkLCBmYWxzZSBvdGhlcndpc2UuIgorICAgICovCisgICAgYm9vbCBieXRlX2FsaWduZWQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgYXZhaWxhYmlsaXR5IG9mIG92ZXJydW4gYnVmZmVyIGFuZCBzd2l0Y2hlcyB0byB1c2UgaXQgd2hlbgorICAgIG5vcm1hbCBidWZmZmVyIGlzIG5vdCBiaWcgZW5vdWdoLgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgYml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJudW1FeHRyYUJ5dGVzIiAiTnVtYmVyIG9mIGV4dHJhIGJ5dGUgbmVlZGVkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEFWQ0JpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIGludCBudW1FeHRyYUJ5dGVzKTsKKworCisgICAgLyotLS0tLS0tLS0tLS0tLSBpbnRyYV9lc3QuYyAtLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50cmEvaW50ZXIgZGVjaXNpb24gYmFzZWQgb24gQUJFLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAibWluX2Nvc3QiICAgIkJlc3QgaW50ZXIgY29zdC4iCisgICAgXHBhcmFtICJjdXJMIiAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IE1CIG9yaWdpbiBpbiByZWNvbnN0cnVjdGVkIGZyYW1lLiIKKyAgICBccGFyYW0gInBpY1BpdGNoIiAiUGl0Y2ggb2YgdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUuIgorICAgIFxyZXR1cm4gIkJvb2xlYW4gZm9yIGludHJhIG1vZGUuIgorICAgICovCisKKy8vYm9vbCBJbnRyYURlY2lzaW9uQUJFKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgbWluX2Nvc3QsIHVpbnQ4ICpjdXJMLCBpbnQgcGljUGl0Y2gpOworICAgIGJvb2wgSW50cmFEZWNpc2lvbihpbnQgKm1pbl9jb3N0LCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gsIGJvb2wgYXZlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW50cmEgcHJlZGljdGlvbiBtb2RlIHNlYXJjaC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gIm1ibnVtIiAgIkN1cnJlbnQgTUIgbnVtYmVyLiIKKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgTUIgb3JpZ2luIGluIHJlY29uc3RydWN0ZWQgZnJhbWUuIgorICAgIFxwYXJhbSAicGljUGl0Y2giICJQaXRjaCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZS4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIE1CSW50cmFTZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBtYm51bSwgdWludDggKmN1ckwsIGludCBwaWNQaXRjaCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbGwgdGhlIEkxNiBwcmVkaWN0aW9uIG1vZGVzIGZvciBhbiBNQiBhbmQga2VlcCBpdCBpbgorICAgIGVuY3ZpZC0+cHJlZF9pMTYuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgaW50cmFwcmVkX2x1bWFfMTZ4MTYoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIGNvc3Qgb2YgYWxsIEkxNiBtb2RlcyBhbmQgY29tcGFyZSB0aGVtIHRvIGdldCB0aGUgbWluaW11bS4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gIm9yZ1kiICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGx1bWEgTUIuIgorICAgIFxwYXJhbSAibWluX2Nvc3QiICJQb2ludGVyIHRvIHRoZSBtaW5pbWFsIGNvc3Qgc28tZmFyLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBmaW5kX2Nvc3RfMTZ4MTYoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpvcmdZLCBpbnQgKm1pbl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29zdCBvZiBlYWNoIEkxNiBtb2RlLgorICAgIFxwYXJhbSAib3JnIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgbHVtYSBNQi4iCisgICAgXHBhcmFtICJvcmdfcGl0Y2giICJTdHJpZGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZnJhbWUuIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiB2YWx1ZXMuIgorICAgIFxwYXJhbSAibWluX2Nvc3QiICJNaW5pbWFsIGNvc3Qgc28tZmFyLiIKKyAgICBccmV0dXJuICJDb3N0IgorICAgICovCisKKyAgICBpbnQgY29zdF9pMTYodWludDggKm9yZywgaW50IG9yZ19waXRjaCwgdWludDggKnByZWQsIGludCBtaW5fY29zdCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhbGwgdGhlIEk0IHByZWRpY3Rpb24gbW9kZXMgYW5kIHNlbGVjdCB0aGUgYmVzdCBvbmUKKyAgICBmb3IgYWxsIHRoZSBibG9ja3MgaW5zaWRlIGEgbWFjcm9ibG9jay5JdCBhbHNvIGNhbGxzIGRjdF9sdW1hIHRvIGdlbmVyYXRlIHRoZSByZWNvbnN0cnVjdGVkCisgICAgTUIsIGFuZCB0cmFuc2Zvcm0gY29lZmZpY2llbnRzIHRvIGJlIGVuY29kZWQuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgIlBvaW50ZXIgdG8gdGhlIG1pbmltYWwgY29zdCBzby1mYXIuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIG1iX2ludHJhNHg0X3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50ICptaW5fY29zdCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG1vc3QgcHJvYmFibGUgSTQgbW9kZSBvZiBhIGdpdmVuIDR4NCBibG9jaworICAgIGZyb20gbmVpZ2hib3JpbmcgaW5mb3JtYXRpb25hY2NvcmRpbmcgdG8gQVZDL0guMjY0IHN0YW5kYXJkLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAiYmxraWR4IiAiVGhlIGN1cnJlbnQgYmxvY2sgaW5kZXguIgorICAgIFxyZXR1cm4gIk1vc3QgcHJvYmFibGUgbW9kZS4iCisgICAgKi8KKyAgICBpbnQgRmluZE1vc3RQcm9iYWJsZUk0TW9kZShBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgYmxraWR4KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgd2hlcmUgYSBsb3Qgb2YgYWN0aW9ucyB0YWtlIHBsYWNlIGluIHRoZSA0eDQgYmxvY2sgbGV2ZWwgaW5zaWRlCisgICAgbWJfaW50cmE0eDRfc2VhcmNoLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiYmxraWR4IiAiVGhlIGN1cnJlbnQgNHg0IGJsb2NrIGluZGV4LiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgYmxvY2suIgorICAgIFxwYXJhbSAib3JnIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2suIgorICAgIFxyZXR1cm4gIk1pbmltYWwgY29zdCwgYWxzbyBzZXQgY3Vyck1CLT5pNE1vZGUiCisgICAgKi8KKyAgICBpbnQgYmxrX2ludHJhNHg0X3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IGJsa2lkeCwgdWludDggKmN1ciwgdWludDggKm9yZyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNvc3Qgb2YgYSBnaXZlbiBJNCBwcmVkaWN0aW9uIG1vZGUuCisgICAgXHBhcmFtICJvcmciICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jay4iCisgICAgXHBhcmFtICJvcmdfcGl0Y2giICAiU3RyaWRlIHNpemUgb2YgdGhlIG9yaWdpbmFsIGZyYW1lLiIKKyAgICBccGFyYW0gInByZWQiICAgIlBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gYmxvY2suIChlbmN2aWQtPnByZWRfaTQpIgorICAgIFxwYXJhbSAiY29zdCIgICAiUG9pbnRlciB0byB0aGUgbWluaW1hbCBjb3N0ICh0byBiZSB1cGRhdGVkKS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgY29zdF9pNCh1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgdWludDE2ICpjb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgY2hyb21hIGludHJhIHNlYXJjaC4gRWFjaCBtb2RlIGlzIHNhdmVkIGluIGVuY3ZpZC0+cHJlZF9pYy4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBjaHJvbWFfaW50cmFfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29zdCBvZiBhIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUuCisgICAgXHBhcmFtICJvcmdDYiIgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBDYiBibG9jay4iCisgICAgXHBhcmFtICJvcmdDciIgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBDciBibG9jay4iCisgICAgXHBhcmFtICJvcmdfcGl0Y2giICAiU3RyaWRlIHNpemUgb2YgdGhlIG9yaWdpbmFsIGZyYW1lLiIKKyAgICBccGFyYW0gInByZWQiICAgIlBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gYmxvY2sgKGVuY3ZpZC0+cHJlZF9pYykiCisgICAgXHBhcmFtICJtaW5jb3N0IiAgICAiTWluaW1hbCBjb3N0IHNvIGZhci4iCisgICAgXHJldHVybiAiQ29zdC4iCisgICAgKi8KKworICAgIGludCBTQVREQ2hyb21hKHVpbnQ4ICpvcmdDYiwgdWludDggKm9yZ0NyLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgaW50IG1pbmNvc3QpOworCisgICAgLyotLS0tLS0tLS0tLS0tLSBtb3Rpb25fY29tcC5jIC0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBUaGlzIGlzIGEgbWFpbiBmdW5jdGlvbiB0byBwZWZvcm0gaW50ZXIgcHJlZGljdGlvbi4KKyAgICBccGFyYW0gImVuY3ZpZCIgICAgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJ2aWRlbyIgICAgICAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxyZXR1cm4gInZvaWQiLgorICAgICovCisgICAgdm9pZCBBVkNNQk1vdGlvbkNvbXAoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8pOworCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbHVtYSBtb3Rpb24gY29tcGVuc2F0aW9uLgorICAgIFxwYXJhbSAicmVmIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIGEgcmVmZXJlbmNlIGx1bWEuIgorICAgIFxwYXJhbSAicGljd2lkdGgiICAgIldpZHRoIG9mIHRoZSBwaWN0dXJlLiIKKyAgICBccGFyYW0gInBpY2hlaWdodCIgICJIZWlnaHQgb2YgdGhlIHBpY3R1cmUuIgorICAgIFxwYXJhbSAieF9wb3MiICAiWC1jb29yZGluYXRlIG9mIHRoZSBwcmVkaWN0ZWQgYmxvY2sgaW4gcXVhcnRlciBwZWwgcmVzb2x1dGlvbi4iCisgICAgXHBhcmFtICJ5X3BvcyIgICJZLWNvb3JkaW5hdGUgb2YgdGhlIHByZWRpY3RlZCBibG9jayBpbiBxdWFydGVyIHBlbCByZXNvbHV0aW9uLiIKKyAgICBccGFyYW0gInByZWQiICAgIlBvaW50ZXIgdG8gdGhlIG91dHB1dCBwcmVkaWN0ZWQgYmxvY2suIgorICAgIFxwYXJhbSAicHJlZF9waXRjaCIgIldpZHRoIG9mIHByZWQuIgorICAgIFxwYXJhbSAiYmxrd2lkdGgiICAgIldpZHRoIG9mIHRoZSBjdXJyZW50IHBhcnRpdGlvbi4iCisgICAgXHBhcmFtICJibGtoZWlnaHQiICAiSGVpZ2h0IG9mIHRoZSBjdXJyZW50IHBhcnRpdGlvbi4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgZUx1bWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHJlZCwgaW50IHByZWRfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUZ1bGxQZWxNQyh1aW50OCAqaW4sIGludCBpbndpZHRoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVIb3J6SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KTsKKworICAgIHZvaWQgZUhvcnpJbnRlcnAyTUMoaW50ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KTsKKworICAgIHZvaWQgZUhvcnpJbnRlcnAzTUModWludDggKmluLCBpbnQgaW5waXRjaCwgaW50ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVWZXJ0SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KTsKKworICAgIHZvaWQgZVZlcnRJbnRlcnAyTUModWludDggKmluLCBpbnQgaW5waXRjaCwgaW50ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVWZXJ0SW50ZXJwM01DKGludCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeSk7CisKKyAgICB2b2lkIGVEaWFnb25hbEludGVycE1DKHVpbnQ4ICppbjEsIHVpbnQ4ICppbjIsIGludCBpbnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYU1vdGlvbkNvbXAodWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgcGljaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFEaWFnb25hbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hSG9yaXpvbnRhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFWZXJ0aWNhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hRnVsbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFWZXJ0aWNhbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hRGlhZ29uYWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tIG1vdGlvbl9lc3QuYyAtLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYXJyYXlzIG5lY2Vzc2FyeSBmb3IgbW90aW9uIHNlYXJjaCBhbGdvcml0aG0uCisgICAgXHBhcmFtICJlbnZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNfU1VDQ0VTUyBvciBBVkNfTUVNT1JZX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0TW90aW9uU2VhcmNoTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworICAgIC8qKgorICAgIENsZWFuIHVwIG1lbW9yeSBhbGxvY2F0ZWQgaW4gSW5pdE1vdGlvblNlYXJjaE1vZHVsZS4KKyAgICBccGFyYW0gImVudmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBDbGVhbk1vdGlvblNlYXJjaE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbW90aW9uIGVzdGltYXRpb24gb2YgYWxsIG1hY3JvYmxvY2tzIGluIGEgZnJhbWUgZHVyaW5nIHRoZSBJbml0RnJhbWUuCisgICAgVGhlIGdvYWwgaXMgdG8gZmluZCB0aGUgYmVzdCBNQiBwYXJ0aXRpb24gZm9yIGludGVyIGFuZCBmaW5kIG91dCBpZiBpbnRyYSBzZWFyY2ggaXMgbmVlZGVkIGZvcgorICAgIGFueSBNQnMuIFRoaXMgaW50cmEgTUIgdGVuZGVuY3kgY2FuIGJlIHVzZWQgZm9yIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24uCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgQVZDTW90aW9uRXN0aW1hdGlvbihBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHJlcGV0aXRpdmUgZWRnZSBwYWRkaW5nIHRvIHRoZSByZWZlcmVuY2UgcGljdHVyZSBieSBhZGRpbmcgMTYgcGl4ZWxzCisgICAgYXJvdW5kIHRoZSBsdW1hIGFuZCA4IHBpeGVscyBhcm91bmQgdGhlIGNocm9tYXMuCisgICAgXHBhcmFtICJyZWZQaWMiICJQb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgcGljdHVyZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgIEFWQ1BhZGRpbmdFZGdlKEFWQ1BpY3R1cmVEYXRhICpyZWZQaWMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBrZWVwcyB0cmFjayBvZiBpbnRyYSByZWZyZXNoIG1hY3JvYmxvY2sgbG9jYXRpb25zLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZ2xvYmFsIGFycmF5IHN0cnVjdHVyZSBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAibWJsb2NrIiAiUG9pbnRlciB0byB0aGUgYXJyYXkgb2YgQVZDTWFjcm9ibG9jayBzdHJ1Y3R1cmVzLiIKKyAgICBccGFyYW0gInRvdGFsTUIiICJUb3RhbCBudW1iZXIgb2YgTUJzIGluIGEgZnJhbWUuIgorICAgIFxwYXJhbSAibnVtUmVmcmVzaCIgIk51bWJlciBvZiBNQiB0byBiZSBpbnRyYSByZWZyZXNoIGluIGEgc2luZ2xlIGZyYW1lLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBBVkNSYXN0ZXJJbnRyYVVwZGF0ZShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqbWJsb2NrLCBpbnQgdG90YWxNQiwgaW50IG51bVJlZnJlc2gpOworCisjaWZkZWYgSFRGTQorICAgIHZvaWQgSW5pdEhURk0oVmlkZW9FbmNEYXRhICplbmN2aWQsIEhURk1fU3RhdCAqaHRmbV9zdGF0LCBkb3VibGUgKm5ld3ZhciwgaW50ICpjb2xsZWN0KTsKKyAgICB2b2lkIFVwZGF0ZUhURk0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIGRvdWJsZSAqbmV3dmFyLCBkb3VibGUgKmV4cF9sYW1kYSwgSFRGTV9TdGF0ICpodGZtX3N0YXQpOworICAgIHZvaWQgQ2FsY1RocmVzaG9sZChkb3VibGUgcGYsIGRvdWJsZSBleHBfbGFtZGFbXSwgaW50IG5ybWx6X3RoW10pOworICAgIHZvaWQgICAgSFRGTVByZXBhcmVDdXJNQl9BVkMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEhURk1fU3RhdCAqaHRmbV9zdGF0LCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gpOworI2VuZGlmCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBpbnB1dCBNQiBpbnRvIGEgc21hbGxlciBmYXN0ZXIgbWVtb3J5IHNwYWNlIHRvIG1pbmltaXplIHRoZSBjYWNoZSBtaXNzLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZ2xvYmFsIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBpbnB1dCBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gInBpdGNoIiAgIlN0cmlkZSBzaXplIG9mIHRoZSBpbnB1dCBmcmFtZSAobHVtYSkuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkICAgIEFWQ1ByZXBhcmVDdXJNQihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgaW50IHBpdGNoKTsKKworICAgIC8qKgorICAgIFBlcmZvcm1zIG1vdGlvbiB2ZWN0b3Igc2VhcmNoIGZvciBhIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIGluIHRoZSBpbnB1dCBmcmFtZS4iCisgICAgXHBhcmFtICJiZXN0X2NhbmQiICJBcnJheSBvZiBiZXN0IGNhbmRpZGF0ZXMgKHRvIGJlIGZpbGxlZCBpbiBhbmQgcmV0dXJuZWQpLiIKKyAgICBccGFyYW0gImkwIiAgICAgIlgtY29vcmRpbmF0ZSBvZiB0aGUgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJqMCIgICAgICJZLWNvb3JkaW5hdGUgb2YgdGhlIG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAidHlwZV9wcmVkIiAiSW5kaWNhdGVzIHRoZSB0eXBlIG9mIG9wZXJhdGlvbnMuIgorICAgIFxwYXJhbSAiRlNfZW4iICAgICAgIkZsYWcgZm9yIGZ1bGxzZWFyY2ggZW5hYmxlLiIKKyAgICBccGFyYW0gImhwX2d1ZXNzIiAgICJHdWVzcyBmb3IgaGFsZi1wZWwgc2VhcmNoLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBBVkNNQk1vdGlvblNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgdWludDggKmJlc3RfY2FuZFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkwLCBpbnQgajAsIGludCB0eXBlX3ByZWQsIGludCBGU19lbiwgaW50ICpocF9ndWVzcyk7CisKKy8vQVZDRW5jX1N0YXR1cyBBVkNNQk1vdGlvblNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgbWJOdW0sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFzcyk7CisKKyAgICAvKioKKyAgICBQZXJmb3JtIGZ1bGwtcGVsIGV4aGF1c3RpdmUgc2VhcmNoIGFyb3VuZCB0aGUgcHJlZGljdGVkIE1WLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInByZXYiICAgIlBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBmcmFtZS4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSBpbnB1dCBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gImltaW4iICAgIlBvaW50ZXIgdG8gbWluaW1hbCBtdiAoeCkuIgorICAgIFxwYXJhbSAiam1pbiIgICAiUG9pbnRlciB0byBtaW5pbWFsIG12ICh5KS4iCisgICAgXHBhcmFtICJpbG93LCBpaGlnaCwgamxvdywgamhpZ2giICAgIkxvd2VyIGJvdW5kIG9uIHNlYXJjaCByYW5nZS4iCisgICAgXHBhcmFtICJjbXZ4LCBjbXZ5IiAiUHJlZGljdGVkIE1WIHZhbHVlLiIKKworICAgIFxyZXR1cm4gIlRoZSBjb3N0IGZ1bmN0aW9uIG9mIHRoZSBiZXN0IGNhbmRpZGF0ZS4iCisgICAgKi8KKyAgICBpbnQgQVZDRnVsbFNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKnByZXYsIHVpbnQ4ICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICppbWluLCBpbnQgKmptaW4sIGludCBpbG93LCBpbnQgaWhpZ2gsIGludCBqbG93LCBpbnQgamhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNtdngsIGludCBjbXZ5KTsKKworICAgIC8qKgorICAgIFNlbGVjdCBjYW5kaWRhdGVzIGZyb20gbmVpZ2hib3JpbmcgYmxvY2tzIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiB0aGUKKyAgICBwcmVkaWN0aW9uIHNlbGVjdGlvbi4KKyAgICBccGFyYW0gIm12eCIgICAgIlBvaW50ZXIgdG8gdGhlIGNhbmRpZGF0ZSwgeC1jb29yZGluYXRlLiIKKyAgICBccGFyYW0gIm12eSIgICAgIlBvaW50ZXIgdG8gdGhlIGNhbmRpZGF0ZSwgeS1jb29yZGluYXRlLiIKKyAgICBccGFyYW0gIm51bV9jYW4iICAgICJQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgY2FuZGlkYXRlcyByZXR1cm5lZC4iCisgICAgXHBhcmFtICJpbWIiICAgICJUaGUgTUIgaW5kZXggeC1jb29yZGluYXRlLiIKKyAgICBccGFyYW0gImptYiIgICAgIlRoZSBNQiBpbmRleCB5LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAidHlwZV9wcmVkIiAgIlR5cGUgb2YgdGhlIHByZWRpY3Rpb24uIgorICAgIFxwYXJhbSAiY212eCwgY212eSIgIlBvaW50ZXIgdG8gcHJlZGljdGVkIE1WIChtb2RpZmllZCB2ZXJzaW9uKS4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIEFWQ0NhbmRpZGF0ZVNlbGVjdGlvbihpbnQgKm12eCwgaW50ICptdnksIGludCAqbnVtX2NhbiwgaW50IGltYiwgaW50IGptYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IHR5cGVfcHJlZCwgaW50ICpjbXZ4LCBpbnQgKmNtdnkpOworCisgICAgLyoqCisgICAgVXRpbGl0eSBmdW5jdGlvbiB0byBtb3ZlIHRoZSB2YWx1ZXMgaW4gdGhlIGFycmF5IGRuIGFjY29yZGluZyB0byB0aGUgbmV3CisgICAgbG9jYXRpb24gdG8gYXZvaWQgcmVkdW5kYW50IGNhbGN1bGF0aW9uLgorICAgIFxwYXJhbSAiZG4iICJBcnJheSBvZiBpbnRlZ2VyIG9mIHNpemUgOS4iCisgICAgXHBhcmFtICJuZXdfbG9jIiAgICAiTmV3IGxvY2F0aW9uIGluZGV4LiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgQVZDTW92ZU5laWdoYm9yU0FEKGludCBkbltdLCBpbnQgbmV3X2xvYyk7CisKKyAgICAvKioKKyAgICBGaW5kIG1pbmltdW0gaW5kZXggb2YgZG4uCisgICAgXHBhcmFtICJkbiIgIkFycmF5IG9mIGludGVnZXIgb2Ygc2l6ZSA5LiIKKyAgICBccmV0dXJuICJUaGUgaW5kZXggb2YgZG4gd2l0aCB0aGUgc21hbGxlc3QgZG5bXSB2YWx1ZS4iCisgICAgKi8KKyAgICBpbnQgQVZDRmluZE1pbihpbnQgZG5bXSk7CisKKworICAgIC8qLS0tLS0tLS0tLS0tLSBmaW5kaGFsZnBlbC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgU2VhcmNoIGZvciB0aGUgYmVzdCBoYWxmLXBlbCByZXNvbHV0aW9uIE1WIGFyb3VuZCB0aGUgZnVsbC1wZWwgTVYuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAibW90IiAgICAiUG9pbnRlciB0byB0aGUgQVZDTVYgYXJyYXkgb2YgdGhlIGZyYW1lLiIKKyAgICBccGFyYW0gIm5jYW5kIiAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbiBvZiB0aGUgZnVsbHNlYXJjaCByZXN1bHQuIgorICAgIFxwYXJhbSAieHBvcyIgICAiVGhlIGN1cnJlbnQgTUIgcG9zaXRpb24gaW4geC4iCisgICAgXHBhcmFtICJ5cG9zIiAgICJUaGUgY3VycmVudCBNQiBwb3NpdGlvbiBpbiB5LiIKKyAgICBccGFyYW0gImhwX2d1ZXNzIiAgICJJbnB1dCB0byBoZWxwIHNwZWVkdXAgdGhlIHNlYXJjaC4iCisgICAgXHBhcmFtICJjbXZ4LCBjbXZ5IiAiUHJlZGljdGVkIG1vdGlvbiB2ZWN0b3IgdXNlIGZvciBtdmNvc3QuIgorICAgIFxyZXR1cm4gIk1pbmltYWwgY29zdCAoU0FURCkgd2l0aG91dCBNViBjb3N0LiAoZm9yIHJhdGUgY29udHJvbCBwdXJwb3NlKSIKKyAgICAqLworICAgIGludCBBVkNGaW5kSGFsZlBlbE1CKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCBBVkNNViAqbW90LCB1aW50OCAqbmNhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhwb3MsIGludCB5cG9zLCBpbnQgaHBfZ3Vlc3MsIGludCBjbXZ4LCBpbnQgY212eSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBzdWItcGVsIHBpeGVscyByZXF1aXJlZCB0byBkbyBzdWJwZWwgTVYgc2VhcmNoLgorICAgIFxwYXJhbSAic3VicGVsX3ByZWQiICJQb2ludGVyIHRvIDItRCBhcnJheSwgZWFjaCBhcnJheSBmb3IgZWFjaCBwb3NpdGlvbi4iCisgICAgXHBhcmFtICJuY2FuZCIgIlBvaW50ZXIgdG8gdGhlIGZ1bGwtcGVsIGNlbnRlciBwb3NpdGlvbiBpbiByZWYgZnJhbWUuIgorICAgIFxwYXJhbSAibHgiICJQaXRjaCBvZiB0aGUgcmVmIGZyYW1lLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICAqLworICAgIHZvaWQgR2VuZXJhdGVIYWxmUGVsUHJlZCh1aW50OCAqc3VicGVsX3ByZWQsIHVpbnQ4ICpuY2FuZCwgaW50IGx4KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlIHZlcnRpY2FsIGludGVycG9sYXRpb24gYXQgaGFsZi1wb2ludCBvZiBzaXplIDR4MTcuCisgICAgXHBhcmFtICJkc3QiICJQb2ludGVyIHRvIGRlc3RpbmF0aW9uLiIKKyAgICBccGFyYW0gInJlZiIgIlBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nIHJlZmVyZW5jZSBwaXhlbC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFZlcnRJbnRlcnBXQ2xpcCh1aW50OCAqZHN0LCB1aW50OCAqcmVmKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHF1YXJ0ZXItcGVsIHBpeGVscyBhcm91bmQgdGhlIGJlc3QgaGFsZi1wZWwgcmVzdWx0CisgICAgZHVyaW5nIHRoZSBzdWItcGVsIE1WIHNlYXJjaC4KKyAgICBccGFyYW0gImJpbGluX2Jhc2UiICAiQXJyYXkgb2YgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBiYXNpcyBmb3IgcS1wZWwgaW50ZXJwLiIKKyAgICBccGFyYW0gInFwZWxfcHJlZCIgICJBcnJheSBvZiBwb2ludGVycyBwb2ludGluZyB0byBxdWFydGVyLXBlbCBjYW5kaWRhdGVzLiIKKyAgICBccGFyYW0gImhwZWxfcG9zIiAiQmVzdCBoYWxmLXBlbCBwb3NpdGlvbiBhdCB0aGUgY2VudGVyLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBHZW5lcmF0ZVF1YXJ0UGVsUHJlZCh1aW50OCAqKmJpbGluX2Jhc2UsIHVpbnQ4ICpxcGVsX3ByZWQsIGludCBocGVsX3Bvcyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIFNBVEQgb2YgYSBzdWJwZWwgY2FuZGlkYXRlLgorICAgIFxwYXJhbSAiY2FuZCIgICAiUG9pbnRlciB0byBhIGNhbmRpZGF0ZS4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IGJsb2NrLiIKKyAgICBccGFyYW0gImRtaW4iICAgIk1pbi1zby1mYXIgU0FURC4iCisgICAgXHJldHVybiAiU3VtIG9mIEFic29sdXRlIFRyYW5zZm9ybWVkIERpZmZlcmVuY2UuIgorICAgICovCisgICAgaW50IFNBVERfTUIodWludDggKmNhbmQsIHVpbnQ4ICpjdXIsIGludCBkbWluKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLSByYXRlX2NvbnRyb2wuYyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKiBUaGlzIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSBmdW5jdGlvbi4gSXQgcmV0dXJucyBhdmVyYWdlIFFQIG9mIHRoZSBwcmV2aW91c2x5IGVuY29kZWQgZnJhbWUuCisgICAgXHBhcmFtICJyYXRlQ3RybCIgIlBvaW50ZXIgdG8gQVZDUmF0ZUNvbnRyb2wgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBdmVyYWdlIFFQLiIKKyAgICAqLworICAgIGludCBHZXRBdmdGcmFtZVFQKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGlucHV0IGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBzaG91bGQgYmUgZW5jb2RlZAorICAgIG9yIHNraXBwZWQuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInJhdGVDdHJsIiAgICJQb2ludGVyIHRvIHRoZSBBVkNSYXRlQ29udHJvbCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAibW9kVGltZSIgICAgIlRoZSAzMiBiaXQgdGltZXN0YW1wIG9mIHRoZSBpbnB1dCBmcmFtZS4iCisgICAgXHBhcmFtICJmcmFtZU51bSIgICAiUG9pbnRlciB0byB0aGUgZnJhbWUgbnVtYmVyIGlmIHRvIGJlIGVuY29kZWQuIgorICAgIFxyZXR1cm4gIkFWQ19TVUNDRVNTIG9yIGVsc2UuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBSQ0RldGVybWluZUZyYW1lTnVtKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIHVpbnQzMiBtb2RUaW1lLCB1aW50ICpmcmFtZU51bSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGJ1ZmZlciBmdWxsbmVzcyB3aGVuIGZyYW1lcyBhcmUgZHJvcHBlZCBlaXRoZXIgYnkgdGhlCisgICAgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBvciBieSB0aGUgdXNlcnMgdG8gbWFrZSBzdXJlIHRoYXQgdGFyZ2V0IGJpdCByYXRlIGlzIHN0aWxsIG1ldC4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byB0aGUgY29tbW9uIG9iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICJQb2ludGVyIHRvIHJhdGUgY29udHJvbCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiZnJhbWVJbmMiICJEaWZmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGZyYW1lIG51bWJlciBhbmQgcHJldmlvdXMgZnJhbWUgbnVtYmVyLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgUkNVcGRhdGVCdWZmZXIoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgZnJhbWVJbmMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyByYXRlIGNvbnRyb2wgbW9kdWxlIGFuZCBhbGxvY2F0ZXMgbmVjZXNzYXJ5IGJ1ZmZlcmVzIHRvIGRvIHRoZSBqb2IuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGhhbmRsZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX01FTU9SWV9GQUlMLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgSW5pdFJhdGVDb250cm9sTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZnJlZXMgYnVmZmVycyBhbGxvY2F0ZWQgaW4gSW5pdFJhdGVDb250cm9sTW9kdWxlLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBoYW5kbGUuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBDbGVhbnVwUmF0ZUNvbnRyb2xNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIEdPUCBvciB0aGUgZmlyc3QgSURSIGZyYW1lLiBJdCBjYWxjdWxhdGVzCisgICAgdGFyZ2V0IGJpdHMgZm9yIGEgR09QLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBSQ0luaXRHT1AoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRhcmdldCBiaXRzIGZvciBhIHBhcnRpY3VsYXIgZnJhbWUuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBSQ0luaXRGcmFtZVFQKEFWQ0VuY09iamVjdCAqdmlkZW8pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIFFQIGZvciB0aGUgdXBjb21pbmcgZnJhbWUgb3IgYmFzaWMgdW5pdC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgb2JqZWN0LiIKKyAgICBccGFyYW0gInJhdGVDdHJsIiAiUG9pbnRlciB0byB0aGUgcmF0ZSBjb250cm9sIG9iamVjdC4iCisgICAgXHJldHVybiAiUVAgdmFsdWUgcmFuZ2luZyBmcm9tIDAtNTEuIgorICAgICovCisgICAgaW50ICBSQ0NhbGN1bGF0ZVFQKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBsdW1hIFFQIHRvIGNocm9tYSBRUCBhbmQgY2FsY3VsYXRlcyBsYW1iZGEgYmFzZWQgb24gUVAuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBSQ0luaXRDaHJvbWFRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgZW5jb2RpbmcgZWFjaCBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBSQ0luaXRNQlFQKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBiaXRzIHVzYWdlIHN0YXRzIGFmdGVyIGVuY29kaW5nIGFuIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gQVZDQ29tbW9uT2JqLiIKKyAgICBccGFyYW0gInJhdGVDdHJsIiAiUG9pbnRlciB0byBBVkNSYXRlQ29udHJvbC4iCisgICAgXHBhcmFtICJudW1faGVhZGVyX2JpdHMiICJOdW1iZXIgb2YgYml0cyB1c2VkIGZvciBNQiBoZWFkZXIuIgorICAgIFxwYXJhbSAibnVtX3RleHR1cmVfYml0cyIgIk51bWJlciBvZiBiaXRzIHVzZWQgZm9yIE1CIHRleHR1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIFJDUG9zdE1CKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgaW50IG51bV9oZWFkZXJfYml0cywgaW50IG51bV90ZXh0dXJlX2JpdHMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJlZGljdGlvbiBhbmQgb3JpZ2luYWwgTUIuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gIm9yZ0wiICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBNQi4iCisgICAgXHBhcmFtICJvcmdQaXRjaCIgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIHBpY3R1cmUgcGl0Y2guIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBSQ0NhbGN1bGF0ZU1BRChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCB1aW50OCAqb3JnTCwgaW50IG9yZ1BpdGNoKTsKKworICAgIC8qKgorICAgIFJlc3RvcmUgUVAgcmVsYXRlZCBwYXJhbWV0ZXJzIG9mIHByZXZpb3VzIE1CIHdoZW4gY3VycmVudCBNQiBpcyBza2lwcGVkLgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIGNvbW1vbiB2aWRlbyBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZ2xvYmFsIGVuY29kaW5nIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgUkNSZXN0b3JlUVAoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNDb21tb25PYmogKnZpZGVvLCBBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBkb25lIHdpdGggYSBmcmFtZS4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgb2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfU0tJUFBFRF9QSUNUVVJFIHdoZW4gYnVmZXIgb3ZlcmZsb3cgKG5lZWQgdG8gZGlzY2FyZCBjdXJyZW50IGZyYW1lKS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFJDVXBkYXRlRnJhbWUoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyotLS0tLS0tLS0gcmVzaWR1YWwuYyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0aGUgaW50cmEgcGNtIGRhdGEgYW5kIGZpbGwgaXQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbG9jYXRpb24KKyAgICBvbiB0aGUgY3VycmVudCBwaWN0dXJlLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsIG9yIGVsc2UgZm9yIGJpdHN0cmVhbSBlcnJvcnMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVJbnRyYVBDTShBVkNFbmNPYmplY3QgKnZpZGVvKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgQ0FWTEMgc3ludGF4IGVuY29kaW5nIG9uIHRoZSBydW4gYW5kIGxldmVsIGluZm9ybWF0aW9uIG9mIHRoZSBjb2VmZmljaWVudHMuCisgICAgVGhlIGxldmVsIGFuZCBydW4gYXJyYXlzIGFyZSBlbGVtZW50cyBpbiBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLCBwb3B1bGF0ZWQgYnkgVHJhbnNRdWFudFpaLAorICAgIFRyYW5zUXVhbnRJbnRyYURDIGFuZCBUcmFuc1F1YW50Q2hyb21hREMgZnVuY3Rpb25zLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAidHlwZSIgICAiT25lIG9mIEFWQ1Jlc2lkdWFsVHlwZSBmb3IgYSBwYXJ0aWN1bGFyIDR4NCBibG9jay4iCisgICAgXHBhcmFtICJiaW5keCIgICJCbG9jayBpbmRleCBvciBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudHMgZm9yIEFWQ19JbnRyYTE2REMgYW5kIEFWQ19DaHJvbWFEQyBtb2RlLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiIKKyAgICBcTm90ZSAgICJUaGlzIGZ1bmN0aW9uIGhhcyAzMi1iaXQgbWFjaGluZSBzcGVjaWZpYyBpbnN0cnVjdGlvbiEhISEiCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGVuY19yZXNpZHVhbF9ibG9jayhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDUmVzaWR1YWxUeXBlIHR5cGUsIGludCBiaW5keCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CKTsKKworCisgICAgLyotLS0tLS0tLS0tLS0tIHNhZC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworICAgIGludCBBVkNTQURfTUJfSGFsZlBlbF9DeGh5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N4aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NYWNyb2Jsb2NrX0ModWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworCisjaWZkZWYgSFRGTSAvKiAgMy8yLzEsIEh5cG90aGVzaXMgVGVzdGluZyBGYXN0IE1hdGNoaW5nICovCisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3gsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTV9Db2xsZWN0eWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5feCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl94LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk14aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk15aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNeGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFRGTV9Db2xsZWN0KHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hURk0odWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworI2VuZGlmCisKKworICAgIC8qLS0tLS0tLS0tLS0tLSBzbGljZS5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbWFpbiBlbmNvZGluZyBsb29wIGZvciBhIHNsaWNlLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLCBBVkNFTkNfUElDVFVSRV9SRUFEWSBmb3IgZW5kLW9mLXBpY3R1cmUgYW5kCisgICAgICAgICAgICAgQVZDRU5DX0ZBSUwgb3IgQVZDRU5DX1NMSUNFX0VNUFRZIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEFWQ0VuY29kZVNsaWNlKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG1haW4gZW5jb2Rpbmcgb3BlcmF0aW9uIGZvciBvbmUgbWFjcm9ibG9jay4KKyAgICBccGFyYW0gInZpZGVvIiAicG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLCBvciBvdGhlciBiaXRzdHJlYW0gcmVsYXRlZCBmYWlsdXJlIHN0YXR1cy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZU1CKEFWQ0VuY09iamVjdCAqdmlkZW8pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxscyBwcmVkaWN0aW9uIElOVFJBL0lOVEVSIGZ1bmN0aW9ucywgdHJhbnNmb3JtLAorICAgIHF1YW50aXphdGlvbiBhbmQgemlnemFnIHNjYW5uaW5nIHRvIGdldCB0aGUgcnVuLWxldmVsIHN5bWJvbHMuCisgICAgXHBhcmFtICJlbmN2aWQiICJwb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJjdXJMIiAgICJwb2ludGVyIHRvIEx1bWEgY29tcG9uZW50IG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIFxwYXJhbSAiY3VyQ2IiICAicG9pbnRlciB0byBDYiBjb21wb25lbnQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgXHBhcmFtICJjdXJDciIgICJwb2ludGVyIHRvIENyIGNvbXBvbmVudCBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAgICBccmV0dXJuICJ2b2lkIGZvciBub3cuIgorICAgICAqLworICAgIHZvaWQgTUJQcmVkVHJhbnNRdWFudFpaKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyTCwgdWludDggKmN1ckNiLCB1aW50OCAqY3VyQ3IpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHByZWRpY3Rpb24gTUIgaW50byB0aGUgcmVjb25zdHJ1Y3RlZCBZVVYKKyAgICBmcmFtZSBkaXJlY3RseS4KKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIFkgY29tcG9uZW50LiIKKyAgICBccGFyYW0gImN1ckNiIiAgIlBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIENiIGNvbXBvbmVudC4iCisgICAgXHBhcmFtICJjdXJDciIgICJQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBDciBjb21wb25lbnQuIgorICAgIFxwYXJhbSAicHJlZEJsb2NrIiAgIlBvaW50ZXIgdG8gdGhlIHByZWRpY3Rpb24gTUIuIgorICAgIFxwYXJhbSAicGljV2lkdGgiICAgIlRoZSB3aWR0aCBvZiB0aGUgZnJhbWUuIgorICAgIFxyZXR1cm4gIk5vbmUuIgorICAgICovCisgICAgdm9pZCBDb3B5X01CKHVpbnQ4ICpjdXJMLCB1aW50OCAqY3VyQ2IsIHVpbnQ4ICpjdXJDciwgdWludDggKnByZWRCbG9jaywgaW50IHBpY1dpZHRoKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0aGUgbWJfdHlwZSwgQ0JQLCBwcmVkaWN0aW9uIG1vZGUsIHJlZiBpZHggYW5kIE1WLgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJ2aWRlbyIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVsc2UgZm9yIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVNQkhlYWRlcihBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY09iamVjdCAqdmlkZW8pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgcmlnaHQgbWJfdHlwZSBmb3IgYSBtYWNyb2Jsb2NrIGdpdmVuIHRoZSBtYk1vZGUsIENCUCwKKyAgICBOdW1QYXJ0LCBQcmVkUGFydE1vZGUuCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInNsaWNlX3R5cGUiICJWYWx1ZSBvZiB0aGUgc2xpY2VfdHlwZS4iCisgICAgXHJldHVybiAibWJfdHlwZS4iCisgICAgKi8KKyAgICB1aW50IEludGVycHJldE1CVHlwZShBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBzbGljZV90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0aGUgbWJfcHJlZCBwYXJ0IG9mIHRoZSBtYWNyb2Jsb2NrIGRhdGEuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNDb21tb25PYmogc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgYml0c3RyZWFtIGZhaWwgc3RhdHVzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0aGUgc3ViX21iX3ByZWQgcGFydCBvZiB0aGUgbWFjcm9ibG9jayBkYXRhLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgQVZDQ29tbW9uT2JqIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGJpdHN0cmVhbSBmYWlsIHN0YXR1cy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIHN1Yl9tYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBzdWJfbWJfdHlwZSBhbmQgc2V0cyBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICB3aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19QX1NMSUNFLgorICAgIGluIHRoZSBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4KKyAgICBccGFyYW0gIm1ibG9jayIgIlBvaW50ZXIgdG8gY3VycmVudCBBVkNNYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gInN1Yl9tYl90eXBlIiAiRnJvbSB0aGUgc3ludGF4IGJpdHN0cmVhbS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgSW50ZXJwcmV0U3ViTUJUeXBlUChBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW50ZXJwcmV0cyB0aGUgc3ViX21iX3R5cGUgYW5kIHNldHMgbmVjZXNzYXJ5IGluZm9ybWF0aW9uCisgICAgd2hlbiB0aGUgc2xpY2UgdHlwZSBpcyBBVkNfQl9TTElDRS4KKyAgICBpbiB0aGUgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuCisgICAgXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIGN1cnJlbnQgQVZDTWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJzdWJfbWJfdHlwZSIgIkZyb20gdGhlIHN5bnRheCBiaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEludGVycHJldFN1Yk1CVHlwZUIoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50ICpzdWJfbWJfdHlwZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgaW50cmEgNHg0IG1vZGUuIEl0IGNhbGN1bGF0ZXMgdGhlIHByZWRpY3RlZCBJNHg0IG1vZGUgYW5kIHRoZQorICAgIHJlbW5hbnQgdG8gYmUgZW5jb2RlZC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbSBzcnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVJbnRyYTR4NE1vZGUoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0gdmxjX2VuY29kZS5jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgYW5kIHdyaXRlcyBhIHZhbHVlIGludG8gYW4gRXhwLUdvbG9tYiBjb2Rld29yZC4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gImNvZGVOdW0iICJQb2ludGVyIHRvIHRoZSB2YWx1ZSBvZiB0aGUgY29kZU51bS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgYml0c3RyZWFtIGVycm9yIG1lc3NhZ2VzIGZvciBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgdWVfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCBjb2RlTnVtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gbWFwcyBhbmQgZW5jb2RlcyBzaWduZWQgRXhwLUdvbG9tYiBjb2Rlcy4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInZhbHVlIiAgIlBvaW50ZXIgdG8gc3ludGF4IGVsZW1lbnQgdmFsdWUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19GQUlMLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgIHNlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIGludCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIG1hcHMgYW5kIGVuY29kZXMgdHJ1bmNhdGVkIEV4cC1Hb2xvbWIgY29kZXMuCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJ2YWx1ZSIgICJQb2ludGVyIHRvIHN5bnRheCBlbGVtZW50IHZhbHVlLiIKKyAgICBccGFyYW0gInJhbmdlIiAgIlJhbmdlIG9mIHRoZSB2YWx1ZSBhcyBpbnB1dCB0byBkZXRlcm1pbmUgdGhlIGFsZ29yaXRobS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyB0ZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IHZhbHVlLCB1aW50IHJhbmdlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBFeHAtR29sb21iIGNvZGV3b3JkIGZyb20gY29kZU51bS4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gImNvZGVOdW0iICJQb2ludGVyIHRvIHRoZSBjb2RlTnVtIHZhbHVlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBiaXRzdHJlYW0gZXJyb3IgbWVzc2FnZXMgZm9yIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBTZXRFR0JpdHN0cmluZyhBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCBjb2RlTnVtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgQ0FWTEMgZW5jb2Rpbmcgb2YgdGhlIENCUCAoY29kZWQgYmxvY2sgcGF0dGVybikgb2YgYSBtYWNyb2Jsb2NrCisgICAgYnkgY2FsbGluZyB1ZV92KCkgYW5kIHRoZW4gbWFwcGluZyB0aGUgQ0JQIHRvIHRoZSBjb3JyZXNwb25kaW5nIFZMQyBjb2RlTnVtLgorICAgIFxwYXJhbSAiY3Vyck1CIiAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgQVZDTWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic3RyZWFtIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlQ0JQKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRyYWlsaW5nIG9uZXMgYW5kIHRvdGFsIGNvZWZmaWNpZW50LgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gIlRyYWlsaW5nT25lcyIgICAiVGhlIHRyYWlsaW5nIG9uZSB2YXJpYWJsZSBvdXRwdXQuIgorICAgIFxwYXJhbSAiVG90YWxDb2VmZiIgIlRoZSB0b3RhbCBjb2VmZmljaWVudCB2YXJpYWJsZSBvdXRwdXQuIgorICAgIFxwYXJhbSAibkMiICJDb250ZXh0IGZvciBudW1iZXIgb2Ygbm9uemVybyBjb2VmZmljaWVudCAocHJlZGljdGlvbiBjb250ZXh0KS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgVHJhaWxpbmdPbmVzLCBpbnQgVG90YWxDb2VmZiwgaW50IG5DKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0cmFpbGluZyBvbmVzIGFuZCB0b3RhbCBjb2VmZmljaWVudCBmb3IgY2hyb21hIERDIGJsb2NrLgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gIlRyYWlsaW5nT25lcyIgICAiVGhlIHRyYWlsaW5nIG9uZSB2YXJpYWJsZSBvdXRwdXQuIgorICAgIFxwYXJhbSAiVG90YWxDb2VmZiIgIlRoZSB0b3RhbCBjb2VmZmljaWVudCB2YXJpYWJsZSBvdXRwdXQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVsc2UgZm9yIGJpdHN0cmVhbSBmYWlsdXJlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lc0Nocm9tYURDKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgVHJhaWxpbmdPbmVzLCBpbnQgVG90YWxDb2VmZik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdG90YWxfemVyb3MgdmFsdWUgYXMgaW4gVGFibGUgOS03IGFuZCA5LTguCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVG90YWxaZXJvcyIgIlRoZSB0b3RhbF96ZXJvcyB2YWx1ZS4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbFplcm9zKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgdG90YWxfemVyb3MsIGludCBUb3RhbENvZWZmKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0b3RhbF96ZXJvcyBWTEMgc3ludGF4IGZvciBjaHJvbWEgREMgYXMgaW4gVGFibGUgOS05LgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gIlRvdGFsWmVyb3MiICJUaGUgdG90YWxfemVyb3MgdmFsdWUuIgorICAgIFxwYXJhbSAiVG90YWxDb2VmZiIgIlRoZSB0b3RhbCBjb2VmZmljaWVudCB2YXJpYWJsZSBvdXRwdXQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGVsc2UgZm9yIGJpdHN0cmVhbSBmYWlsdXJlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgY2VfVG90YWxaZXJvc0Nocm9tYURDKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgdG90YWxfemVyb3MsIGludCBUb3RhbENvZWZmKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBydW5fYmVmb3JlIFZMQyBzeW50YXggYXMgaW4gVGFibGUgOS0xMC4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJydW5fYmVmb3JlIiAiVGhlIHJ1bl9iZWZvcmUgdmFsdWUuIgorICAgIFxwYXJhbSAiemVyb3NMZWZ0IiAgIlRoZSBjb250ZXh0IGZvciBudW1iZXIgb2YgemVyb3MgbGVmdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9SdW5CZWZvcmUoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBydW5fYmVmb3JlLCBpbnQgemVyb3NMZWZ0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLyogX0FWQ0VOQ19MSUJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFiNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2JpdHN0cmVhbV9pby5jcHAKQEAgLTAsMCArMSwzMzYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisjZGVmaW5lIFdPUkRfU0laRSAzMgorCisvKiBhcnJheSBmb3IgdHJhaWxpbmcgYml0IHBhdHRlcm4gYXMgZnVuY3Rpb24gb2YgbnVtYmVyIG9mIGJpdHMgKi8KKy8qIHRoZSBmaXJzdCBvbmUgaXMgdW51c2VkLiAqLworY29uc3Qgc3RhdGljIHVpbnQ4IHRyYWlsaW5nX2JpdHNbOV0gPSB7MCwgMHgxLCAweDIsIDB4NCwgMHg4LCAweDEwLCAweDIwLCAweDQwLCAweDgwfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1Jbml0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDExLzQvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogUG9wdWxhdGUgYml0c3RyZWFtIHN0cnVjdHVyZSB3aXRoIGJpdHN0cmVhbSBidWZmZXIgYW5kIHNpemUgICovCisvKiAgICAgICAgICAgICBpdCBhbHNvIGluaXRpYWxpemVzIGludGVybmFsIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNFTkNfRkFJTCBpZiBmYWlsZWQuICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIHwtLS0tLS0tLXwtLS0tLS0tLXwtLS0tfn5+fn4tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwKKyAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBed3JpdGVfcG9zICAgICAgICAgIF5idWZfc2l6ZQorICAgYml0c3RyZWFtQnVmZmVyICAgICAgICAgICAgICAgICAgPC0tLS0tLS0tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfd29yZAorCisgICB8LS0tLS14eHh4eHh4eHh4eHh4fCAgPSBjdXJyZW50X3dvcmQgMzIgb3IgMTYgYml0cworICAgIDwtLS0tPgorICAgICBiaXRfbGVmdAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbUVuY0luaXQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIHVpbnQ4ICpidWZmZXIsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqb3ZlcnJ1bkJ1ZmZlciwgaW50IG9CU2l6ZSkKK3sKKyAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmX3NpemUgPD0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfQklUU1RSRUFNX0lOSVRfRkFJTDsKKyAgICB9CisKKyAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IGJ1ZmZlcjsKKworICAgIHN0cmVhbS0+YnVmX3NpemUgPSBidWZfc2l6ZTsKKworICAgIHN0cmVhbS0+d3JpdGVfcG9zID0gMDsKKworICAgIHN0cmVhbS0+Y291bnRfemVyb3MgPSAwOworCisgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAwOworCisgICAgc3RyZWFtLT5iaXRfbGVmdCA9IFdPUkRfU0laRTsKKworICAgIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9IG92ZXJydW5CdWZmZXI7CisKKyAgICBzdHJlYW0tPm9CU2l6ZSA9IG9CU2l6ZTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBBVkNCaXRzdHJlYW1TYXZlV29yZCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAzLzI5LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFNhdmUgdGhlIGN1cnJlbnRfd29yZCBpbnRvIHRoZSBidWZmZXIsIGJ5dGUtc3dhcCwgYW5kICAgICAgICAqLworLyogICAgICAgICAgICAgIGFkZCBlbXVsYXRpb24gcHJldmVudGlvbiBpbnNlcnRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBBVkNCaXRzdHJlYW1TYXZlV29yZChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBpbnQgbnVtX2JpdHM7CisgICAgdWludDggKndyaXRlX3BudCwgYnl0ZTsKKyAgICB1aW50IGN1cnJlbnRfd29yZDsKKworICAgIC8qIGNoZWNrIG51bWJlciBvZiBieXRlcyBpbiBjdXJyZW50X3dvcmQsIG11c3QgYWx3YXlzIGJlIGJ5dGUtYWxpZ25lZCEhISEgKi8KKyAgICBudW1fYml0cyA9IFdPUkRfU0laRSAtIHN0cmVhbS0+Yml0X2xlZnQ7IC8qIG11c3QgYmUgbXVsdGlwbGUgb2YgOCAhISovCisKKyAgICBpZiAoc3RyZWFtLT5idWZfc2l6ZSAtIHN0cmVhbS0+d3JpdGVfcG9zIDw9IChudW1fYml0cyA+PiAzKSArIDIpIC8qIDIgbW9yZSBieXRlcyBmb3IgcG9zc2libGUgRVBCUyAqLworICAgIHsKKyAgICAgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IEFWQ0JpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoc3RyZWFtLCAobnVtX2JpdHMgPj4gMykgKyAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3cml0ZSB3b3JkLCBieXRlLWJ5LWJ5dGUgKi8KKyAgICB3cml0ZV9wbnQgPSBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciArIHN0cmVhbS0+d3JpdGVfcG9zOworICAgIGN1cnJlbnRfd29yZCA9IHN0cmVhbS0+Y3VycmVudF93b3JkOworICAgIHdoaWxlIChudW1fYml0cykgLyogbm8gbmVlZCB0byBjaGVjayBzdHJlYW0tPmJ1Zl9zaXplIGFuZCBzdHJlYW0tPndyaXRlX3BvcywgdGFrZW4gY2FyZSBhbHJlYWR5ICovCisgICAgeworICAgICAgICBudW1fYml0cyAtPSA4OworICAgICAgICBieXRlID0gKGN1cnJlbnRfd29yZCA+PiBudW1fYml0cykgJiAweEZGOworICAgICAgICBpZiAoYnl0ZSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAqd3JpdGVfcG50KysgPSBieXRlOworICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgIHN0cmVhbS0+Y291bnRfemVyb3MgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcysrOworICAgICAgICAgICAgKndyaXRlX3BudCsrID0gYnl0ZTsKKyAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7CisgICAgICAgICAgICBpZiAoc3RyZWFtLT5jb3VudF96ZXJvcyA9PSAyKQorICAgICAgICAgICAgeyAgIC8qIGZvciBudW1fYml0cyA9IDMyLCB0aGlzIGNhbiBhZGQgMiBtb3JlIGJ5dGVzIGV4dHJhIGZvciBFUEJTICovCisgICAgICAgICAgICAgICAgKndyaXRlX3BudCsrID0gMHgzOworICAgICAgICAgICAgICAgIHN0cmVhbS0+d3JpdGVfcG9zKys7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZXNldCBjdXJyZW50X3dvcmQgYW5kIGJpdF9sZWZ0ICovCisgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAwOworICAgIHN0cmVhbS0+Yml0X2xlZnQgPSBXT1JEX1NJWkU7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtV3JpdGVCaXRzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAzLzI5LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFdyaXRlIHVwIHRvIG1hY2hpbmUgd29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogVW51c2VkIGJpdHMgaW4gJ2NvZGUnIG11c3QgYmUgYWxsIHplcm9zLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0VOQ19XUklURV9GQUlMIGlmIGJ1ZmZlciBpcyAgKi8KKy8qICAgICAgICAgICAgICBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0FWQ0VuY19TdGF0dXMgQml0c3RyZWFtV3JpdGVCaXRzKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgbkJpdHMsIHVpbnQgY29kZSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIGludCBiaXRfbGVmdCA9IHN0cmVhbS0+Yml0X2xlZnQ7CisgICAgdWludCBjdXJyZW50X3dvcmQgPSBzdHJlYW0tPmN1cnJlbnRfd29yZDsKKworICAgIC8vREVCVUdfTE9HKHVzZXJEYXRhLEFWQ19MT0dUWVBFX0lORk8sIkJpdHN0cmVhbVdyaXRlQml0cyIsbkJpdHMsLTEpOworCisgICAgaWYgKG5CaXRzID4gV09SRF9TSVpFKSAvKiBoYXMgdG8gYmUgdGFrZW4gY2FyZSBvZiBzcGVjaWFsbHkgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsgLyogZm9yIG5vdyAqLworICAgICAgICAvKiBvdGhlcndpc2UsIGJyZWFrIGl0IGRvd24gdG8gMiB3cml0ZSBvZiBsZXNzIHRoYW4gMTYgYml0cyBhdCBhIHRpbWUuICovCisgICAgfQorCisgICAgaWYgKG5CaXRzIDw9IGJpdF9sZWZ0KSAvKiBtb3JlIGJpdHMgbGVmdCBpbiBjdXJyZW50X3dvcmQgKi8KKyAgICB7CisgICAgICAgIHN0cmVhbS0+Y3VycmVudF93b3JkID0gKGN1cnJlbnRfd29yZCA8PCBuQml0cykgfCBjb2RlOworICAgICAgICBzdHJlYW0tPmJpdF9sZWZ0IC09IG5CaXRzOworICAgICAgICBpZiAoc3RyZWFtLT5iaXRfbGVmdCA9PSAwKSAvKiBwcmVwYXJlIGZvciB0aGUgbmV4dCB3b3JkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0JpdHN0cmVhbVNhdmVXb3JkKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0cmVhbS0+Y3VycmVudF93b3JkID0gKGN1cnJlbnRfd29yZCA8PCBiaXRfbGVmdCkgfCAoY29kZSA+PiAobkJpdHMgLSBiaXRfbGVmdCkpOworCisgICAgICAgIG5CaXRzIC09IGJpdF9sZWZ0OworCisgICAgICAgIHN0cmVhbS0+Yml0X2xlZnQgPSAwOworCisgICAgICAgIHN0YXR1cyA9IEFWQ0JpdHN0cmVhbVNhdmVXb3JkKHN0cmVhbSk7IC8qIHNhdmUgY3VycmVudCB3b3JkICovCisKKyAgICAgICAgc3RyZWFtLT5iaXRfbGVmdCA9IFdPUkRfU0laRSAtIG5CaXRzOworCisgICAgICAgIHN0cmVhbS0+Y3VycmVudF93b3JkID0gY29kZTsgLyogbm8gZXh0cmEgbWFza2luZyBmb3IgY29kZSwgbXVzdCBiZSBoYW5kbGVkIGJlZm9yZSBzYXZpbmcgKi8KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtV3JpdGUxQml0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAzLzMwLzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFdyaXRlIDEgYml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogVW51c2VkIGJpdHMgaW4gJ2NvZGUnIG11c3QgYmUgYWxsIHplcm9zLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0VOQ19XUklURV9GQUlMIGlmIGJ1ZmZlciBpcyAgKi8KKy8qICAgICAgICAgICAgICBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0FWQ0VuY19TdGF0dXMgQml0c3RyZWFtV3JpdGUxQml0KEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCB1aW50IGNvZGUpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgdWludCBjdXJyZW50X3dvcmQgPSBzdHJlYW0tPmN1cnJlbnRfd29yZDsKKworICAgIC8vREVCVUdfTE9HKHVzZXJEYXRhLEFWQ19MT0dUWVBFX0lORk8sIkJpdHN0cmVhbVdyaXRlMUJpdCIsY29kZSwtMSk7CisKKyAgICAvL2lmKDEgPD0gYml0X2xlZnQpIC8qIG1vcmUgYml0cyBsZWZ0IGluIGN1cnJlbnRfd29yZCAqLworICAgIC8qIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGVyZSBhbHdheXMgYmUgcG9zaXRpdmUgYml0X2xlZnQgaW4gdGhlIGN1cnJlbnQgd29yZCAqLworICAgIHN0cmVhbS0+Y3VycmVudF93b3JkID0gKGN1cnJlbnRfd29yZCA8PCAxKSB8IGNvZGU7CisgICAgc3RyZWFtLT5iaXRfbGVmdC0tOworICAgIGlmIChzdHJlYW0tPmJpdF9sZWZ0ID09IDApIC8qIHByZXBhcmUgZm9yIHRoZSBuZXh0IHdvcmQgKi8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEFWQ0JpdHN0cmVhbVNhdmVXb3JkKHN0cmVhbSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtVHJhaWxpbmdCaXRzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAzLzMxLzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEFkZCB0cmFpbGluZyBiaXRzIGFuZCByZXBvcnQgdGhlIGZpbmFsIEVCU1Agc2l6ZS4gICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0VOQ19XUklURV9GQUlMIGlmIGJ1ZmZlciBpcyAgKi8KKy8qICAgICAgICAgICAgICBmdWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0FWQ0VuY19TdGF0dXMgQml0c3RyZWFtVHJhaWxpbmdCaXRzKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50ICpuYWxfc2l6ZSkKK3sKKyAgICAodm9pZCkobmFsX3NpemUpOworCisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgaW50IGJpdF9sZWZ0ID0gYml0c3RyZWFtLT5iaXRfbGVmdDsKKworICAgIGJpdF9sZWZ0ICY9IDB4NzsgLyogbW9kdWxvIGJ5IDggKi8KKyAgICBpZiAoYml0X2xlZnQgPT0gMCkgYml0X2xlZnQgPSA4OworICAgIC8qIGJpdHN0cmVhbS0+Yml0X2xlZnQgPT0gMCBjYW5ub3QgaGFwcGVuIGhlcmUgc2luY2UgaXQgd291bGQgaGF2ZSBiZWVuIFNhdmVkIGFscmVhZHkgKi8KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIGJpdF9sZWZ0LCB0cmFpbGluZ19iaXRzW2JpdF9sZWZ0XSk7CisKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBpZiBpdCdzIG5vdCBzYXZlZCwgc2F2ZSBpdC4gKi8KKyAgICAvL2lmKGJpdHN0cmVhbS0+Yml0X2xlZnQ8KFdPUkRfU0laRTw8MykpIC8qIGluIGZhY3QsIG5vIG5lZWQgdG8gY2hlY2sgKi8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEFWQ0JpdHN0cmVhbVNhdmVXb3JkKGJpdHN0cmVhbSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogY2hlY2sgd2hldGhlciBpdCdzIGJ5dGUtYWxpZ25lZCAqLworYm9vbCBieXRlX2FsaWduZWQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgaWYgKHN0cmVhbS0+Yml0X2xlZnQgJSA4KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBkZXRlcm1pbmUgd2hldGhlciBvdmVycnVuIGJ1ZmZlciBjYW4gYmUgdXNlZCBvciBub3QgKi8KK0FWQ0VuY19TdGF0dXMgQVZDQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgaW50IG51bUV4dHJhQnl0ZXMpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilzdHJlYW0tPmVuY3ZpZDsKKworICAgIGlmIChzdHJlYW0tPm92ZXJydW5CdWZmZXIgIT0gTlVMTCkgLy8gb3ZlcnJ1bkJ1ZmZlciBpcyBzZXQKKyAgICB7CisgICAgICAgIGlmIChzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciAhPSBzdHJlYW0tPm92ZXJydW5CdWZmZXIpIC8vIG5vdCBhbHJlYWR5IHVzZWQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHN0cmVhbS0+d3JpdGVfcG9zICsgbnVtRXh0cmFCeXRlcyA+PSBzdHJlYW0tPm9CU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSA9IHN0cmVhbS0+d3JpdGVfcG9zICsgbnVtRXh0cmFCeXRlcyArIDEwMDsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSAmPSAofjB4Myk7IC8vIG1ha2UgaXQgbXVsdGlwbGUgb2YgNAorCisgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgbmV3IG92ZXJydW4gQnVmZmVyCisgICAgICAgICAgICAgICAgaWYgKGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+YXZjSGFuZGxlLT5DQkFWQ19GcmVlKCh1aW50MzIqKWVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCllbmN2aWQtPm92ZXJydW5CdWZmZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVuY3ZpZC0+b0JTaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5vdmVycnVuQnVmZmVyID0gKHVpbnQ4KikgZW5jdmlkLT5hdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUsIERFRkFVTFRfQVRUUik7CisKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm92ZXJydW5CdWZmZXIgPSBlbmN2aWQtPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBldmVyeXRoaW5nIHRvIG92ZXJydW4gYnVmZmVyIGFuZCBzdGFydCB1c2luZyBpdC4KKyAgICAgICAgICAgIG1lbWNweShzdHJlYW0tPm92ZXJydW5CdWZmZXIsIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyLCBzdHJlYW0tPndyaXRlX3Bvcyk7CisgICAgICAgICAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgIHN0cmVhbS0+YnVmX3NpemUgPSBzdHJlYW0tPm9CU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIG92ZXJydW4gYnVmZmVyIGlzIGFscmVhZHkgdXNlZAorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSA9IHN0cmVhbS0+d3JpdGVfcG9zICsgbnVtRXh0cmFCeXRlcyArIDEwMDsKKyAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplICY9ICh+MHgzKTsgLy8gbWFrZSBpdCBtdWx0aXBsZSBvZiA0CisKKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIG5ldyBvdmVycnVuIGJ1ZmZlcgorICAgICAgICAgICAgZW5jdmlkLT5vQlNpemUgPSBzdHJlYW0tPm9CU2l6ZTsKKyAgICAgICAgICAgIGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9ICh1aW50OCopIGVuY3ZpZC0+YXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUsIERFRkFVTFRfQVRUUik7CisKKyAgICAgICAgICAgIGlmIChlbmN2aWQtPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gY29weSBmcm9tIHRoZSBvbGQgYnVmZmVyIHRvIG5ldyBidWZmZXIKKyAgICAgICAgICAgIG1lbWNweShlbmN2aWQtPm92ZXJydW5CdWZmZXIsIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT53cml0ZV9wb3MpOworICAgICAgICAgICAgLy8gZnJlZSBvbGQgYnVmZmVyCisgICAgICAgICAgICBlbmN2aWQtPmF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSgodWludDMyKillbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcik7CisKKyAgICAgICAgICAgIC8vIGFzc2lnbiBwb2ludGVyIHRvIG5ldyBidWZmZXIKKyAgICAgICAgICAgIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9IGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gc3RyZWFtLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5idWZfc2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworICAgIH0KKyAgICBlbHNlIC8vIG92ZXJydW5CdWZmZXIgaXMgbm90IGVuYWJsZS4KKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICB9CisKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9ibG9jay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYmxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTI2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYmxvY2suY3BwCkBAIC0wLDAgKzEsMTI4MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKy8qIHN1YnRyYWN0IHdpdGggdGhlIHByZWRpY3Rpb24gYW5kIGRvIHRyYW5zZm9ybWF0aW9uICovCit2b2lkIHRyYW5zKHVpbnQ4ICpjdXIsIGludCBwaXRjaCwgdWludDggKnByZWRCbG9jaywgaW50MTYgKmRhdGFCbG9jaykKK3sKKyAgICBpbnQxNiAqcHRyID0gZGF0YUJsb2NrOworICAgIGludCByMCwgcjEsIHIyLCByMywgajsKKyAgICBpbnQgY3VycGl0Y2ggPSAodWludClwaXRjaCA+PiAxNjsKKyAgICBpbnQgcHJlZHBpdGNoID0gKHBpdGNoICYgMHhGRkZGKTsKKworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJlc2lkdWUgZmlyc3QgKi8KKyAgICAgICAgcjAgPSBjdXJbMF0gLSBwcmVkQmxvY2tbMF07CisgICAgICAgIHIxID0gY3VyWzFdIC0gcHJlZEJsb2NrWzFdOworICAgICAgICByMiA9IGN1clsyXSAtIHByZWRCbG9ja1syXTsKKyAgICAgICAgcjMgPSBjdXJbM10gLSBwcmVkQmxvY2tbM107CisKKyAgICAgICAgcjAgKz0gcjM7ICAgICAgICAgICAvL3B0clswXSArIHB0clszXTsKKyAgICAgICAgcjMgPSByMCAtIChyMyA8PCAxKTsgICAgLy9wdHJbMF0gLSBwdHJbM107CisgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgLy9wdHJbMV0gKyBwdHJbMl07CisgICAgICAgIHIyID0gcjEgLSAocjIgPDwgMSk7ICAgIC8vcHRyWzFdIC0gcHRyWzJdOworCisgICAgICAgIHB0clswXSA9IHIwICsgcjE7CisgICAgICAgIHB0clsyXSA9IHIwIC0gcjE7CisgICAgICAgIHB0clsxXSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICBwdHJbM10gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICBwdHIgKz0gMTY7CisgICAgICAgIHByZWRCbG9jayArPSBwcmVkcGl0Y2g7CisgICAgICAgIGN1ciArPSBjdXJwaXRjaDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIHB0ciA9IGRhdGFCbG9jazsKKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworICAgICAgICByMCA9IHB0clswXSArIHB0cls0OF07CisgICAgICAgIHIzID0gcHRyWzBdIC0gcHRyWzQ4XTsKKyAgICAgICAgcjEgPSBwdHJbMTZdICsgcHRyWzMyXTsKKyAgICAgICAgcjIgPSBwdHJbMTZdIC0gcHRyWzMyXTsKKworICAgICAgICBwdHJbMF0gPSByMCArIHIxOworICAgICAgICBwdHJbMzJdID0gcjAgLSByMTsKKyAgICAgICAgcHRyWzE2XSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICBwdHJbNDhdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgcHRyKys7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIGRvIHJlc2lkdWUgdHJhbnNmb3JtIHF1YW50IGludnF1YW50LCBpbnZ0cmFucyBhbmQgd3JpdGUgb3V0cHV0IG91dCAqLworaW50IGRjdF9sdW1hKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgYmxraWR4LCB1aW50OCAqY3VyLCB1aW50OCAqb3JnLCBpbnQgKmNvZWZfY29zdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IG9yZ19waXRjaCA9IGVuY3ZpZC0+Y3VycklucHV0LT5waXRjaDsKKyAgICBpbnQgcGl0Y2ggPSB2aWRlby0+Y3VyclBpYy0+cGl0Y2g7CisgICAgaW50MTYgKmNvZWYgPSB2aWRlby0+YmxvY2s7CisgICAgdWludDggKnByZWQgPSB2aWRlby0+cHJlZF9ibG9jazsgLy8gc2l6ZSAxNiBmb3IgYSA0eDQgYmxvY2sKKyAgICBpbnQgcHJlZF9waXRjaCA9IHZpZGVvLT5wcmVkX3BpdGNoOworICAgIGludCByMCwgcjEsIHIyLCByMywgaiwgaywgaWR4OworICAgIGludCAqbGV2ZWwsICpydW47CisgICAgaW50IFFxLCBScSwgcV9iaXRzLCBxcF9jb25zdCwgcXVhbnQ7CisgICAgaW50IGRhdGEsIGxldiwgemVyb19ydW47CisgICAgaW50IG51bWNvZWZmOworCisgICAgY29lZiArPSAoKGJsa2lkeCAmIDB4MykgPDwgMikgKyAoKGJsa2lkeCA+PiAyKSA8PCA2KTsgLyogcG9pbnQgdG8gdGhlIDR4NCBibG9jayAqLworCisgICAgLyogZmlyc3QgdGFrZSBhIDR4NCB0cmFuc2Zvcm0gKi8KKyAgICAvKiBob3Jpem9udGFsICovCisgICAgaiA9IDQ7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByZXNpZHVlIGZpcnN0ICovCisgICAgICAgIHIwID0gb3JnWzBdIC0gcHJlZFswXTsgICAvKiBPUFRJTUlaRUFCTEUgKi8KKyAgICAgICAgcjEgPSBvcmdbMV0gLSBwcmVkWzFdOworICAgICAgICByMiA9IG9yZ1syXSAtIHByZWRbMl07CisgICAgICAgIHIzID0gb3JnWzNdIC0gcHJlZFszXTsKKworICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICByMyA9IHIwIC0gKHIzIDw8IDEpOyAgICAvL3B0clswXSAtIHB0clszXTsKKyAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICAvL3B0clsxXSArIHB0clsyXTsKKyAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgIGNvZWZbMl0gPSByMCAtIHIxOworICAgICAgICBjb2VmWzFdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgIGNvZWZbM10gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICBjb2VmICs9IDE2OworICAgICAgICBvcmcgKz0gb3JnX3BpdGNoOworICAgICAgICBwcmVkICs9IHByZWRfcGl0Y2g7CisgICAgICAgIGotLTsKKyAgICB9CisgICAgLyogdmVydGljYWwgKi8KKyAgICBjb2VmIC09IDY0OworICAgIHByZWQgLT0gKHByZWRfcGl0Y2ggPDwgMik7CisgICAgaiA9IDQ7CisgICAgd2hpbGUgKGogPiAwKSAgIC8qIE9QVElNSVpBQkxFICovCisgICAgeworICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzQ4XTsKKyAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZls0OF07CisgICAgICAgIHIxID0gY29lZlsxNl0gKyBjb2VmWzMyXTsKKyAgICAgICAgcjIgPSBjb2VmWzE2XSAtIGNvZWZbMzJdOworCisgICAgICAgIGNvZWZbMF0gPSByMCArIHIxOworICAgICAgICBjb2VmWzMyXSA9IHIwIC0gcjE7CisgICAgICAgIGNvZWZbMTZdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgIGNvZWZbNDhdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgY29lZisrOworICAgICAgICBqLS07CisgICAgfQorCisgICAgY29lZiAtPSA0OworCisgICAgLyogcXVhbnQgKi8KKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbcmFzMmRlY1tibGtpZHhdXTsKKyAgICBydW4gPSBlbmN2aWQtPnJ1bltyYXMyZGVjW2Jsa2lkeF1dOworCisgICAgUnEgPSB2aWRlby0+UVB5X21vZF82OworICAgIFFxID0gdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBxcF9jb25zdCA9IGVuY3ZpZC0+cXBfY29uc3Q7CisgICAgcV9iaXRzID0gMTUgKyBRcTsKKworICAgIHplcm9fcnVuID0gMDsKKyAgICBudW1jb2VmZiA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisgICAgeworICAgICAgICBpZHggPSBaWl9TQ0FOX0JMT0NLW2tdOyAvKiBtYXAgYmFjayB0byByYXN0ZXIgc2NhbiBvcmRlciAqLworICAgICAgICBkYXRhID0gY29lZltpZHhdOworICAgICAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdW2tdOworICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gcV9iaXRzOworICAgICAgICBpZiAobGV2KQorICAgICAgICB7CisgICAgICAgICAgICAqY29lZl9jb3N0ICs9ICgobGV2ID4gMSkgPyBNQVhfVkFMVUUgOiBDT0VGRl9DT1NUW0RJU0FCTEVfVEhSRVNIT0xESU5HXVt6ZXJvX3J1bl0pOworCisgICAgICAgICAgICAvKiBkZXF1YW50ICovCisgICAgICAgICAgICBxdWFudCA9IGRlcXVhbnRfY29lZnJlc1tScV1ba107CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbnVtY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IChsZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbnVtY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAoLWxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bltudW1jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmN1cnJNQi0+bWJfaW50cmEpIC8vIG9ubHkgZG8gaW52ZXJzZSB0cmFuc2Zvcm0gd2l0aCBpbnRyYSBibG9jaworICAgIHsKKyAgICAgICAgaWYgKG51bWNvZWZmKSAvKiB0aGVuIGRvIGludmVyc2UgdHJhbnNmb3JtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pIC8qIGhvcml6b250YWwgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzJdOworICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMl07CisgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxXSA+PiAxKSAtIGNvZWZbM107CisgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzFdICsgKGNvZWZbM10gPj4gMSk7CisKKyAgICAgICAgICAgICAgICBjb2VmWzBdID0gcjAgKyByMzsKKyAgICAgICAgICAgICAgICBjb2VmWzFdID0gcjEgKyByMjsKKyAgICAgICAgICAgICAgICBjb2VmWzJdID0gcjEgLSByMjsKKyAgICAgICAgICAgICAgICBjb2VmWzNdID0gcjAgLSByMzsKKworICAgICAgICAgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvZWYgLT0gNjQ7CisgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKSAvKiB2ZXJ0aWNhbCwgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgaG9yaXpvbnRhbCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMzJdOworICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMzJdOworICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMTZdID4+IDEpIC0gY29lZls0OF07CisgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzE2XSArIChjb2VmWzQ4XSA+PiAxKTsKKyAgICAgICAgICAgICAgICByMCArPSByMzsKKyAgICAgICAgICAgICAgICByMyA9IChyMCAtIChyMyA8PCAxKSk7IC8qIHIwLXIzICovCisgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisgICAgICAgICAgICAgICAgcjIgPSAocjEgLSAocjIgPDwgMSkpOyAvKiByMS1yMiAqLworICAgICAgICAgICAgICAgIHIwICs9IDMyOworICAgICAgICAgICAgICAgIHIxICs9IDMyOworICAgICAgICAgICAgICAgIHIyICs9IDMyOworICAgICAgICAgICAgICAgIHIzICs9IDMyOworCisgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKHIwID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMSA9ICoocHJlZCArPSBwcmVkX3BpdGNoKSArIChyMSA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjIgPSAqKHByZWQgKz0gcHJlZF9waXRjaCkgKyAocjIgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIzID0gcHJlZFtwcmVkX3BpdGNoXSArIChyMyA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisKKyAgICAgICAgICAgICAgICAqY3VyID0gcjA7CisgICAgICAgICAgICAgICAgKihjdXIgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgKihjdXIgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgY3VyW3BpdGNoXSA9IHIzOworICAgICAgICAgICAgICAgIGN1ciAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgY3VyKys7CisgICAgICAgICAgICAgICAgcHJlZCAtPSAocHJlZF9waXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICBwcmVkKys7CisgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgIC8vIGNvcHkgZnJvbSBwcmVkIHRvIGN1cgorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzIqKWN1cikgPSAqKCh1aW50MzIqKXByZWQpOworICAgICAgICAgICAgKigodWludDMyKikoY3VyICs9IHBpdGNoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IHByZWRfcGl0Y2gpKTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ciArPSBwaXRjaCkpID0gKigodWludDMyKikocHJlZCArPSBwcmVkX3BpdGNoKSk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXIgKz0gcGl0Y2gpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gcHJlZF9waXRjaCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG51bWNvZWZmOworfQorCisKK3ZvaWQgTUJJbnRlcklkY3QoQVZDQ29tbW9uT2JqICp2aWRlbywgdWludDggKmN1ckwsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IHBpY1BpdGNoKQoreworICAgIGludDE2ICpjb2VmLCAqY29lZjggPSB2aWRlby0+YmxvY2s7CisgICAgdWludDggKmN1cjsgIC8vIHRoZSBzYW1lIGFzIGN1ckwKKyAgICBpbnQgYjgsIGI0OworICAgIGludCByMCwgcjEsIHIyLCByMywgaiwgYmxraWR4OworCisgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICB7CisgICAgICAgIGN1ciA9IGN1ckw7CisgICAgICAgIGNvZWYgPSBjb2VmODsKKworICAgICAgICBpZiAoY3Vyck1CLT5DQlAmKDEgPDwgYjgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJsa2lkeCA9IGJsa0lkeDJibGtYWVtiOF1bYjRdOworICAgICAgICAgICAgICAgIC8qIGRvIElEQ1QgKi8KKyAgICAgICAgICAgICAgICBpZiAoY3Vyck1CLT5uel9jb2VmZltibGtpZHhdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkgLyogaG9yaXpvbnRhbCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMV0gPj4gMSkgLSBjb2VmWzNdOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzFdICsgKGNvZWZbM10gPj4gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIzOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZlsxXSA9IHIxICsgcjI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmWzJdID0gcjEgLSByMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbM10gPSByMCAtIHIzOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmICs9IDE2OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29lZiAtPSA2NDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkgLyogdmVydGljYWwsIGhhcyB0byBiZSBkb25lIGFmdGVyIGhvcml6b250YWwgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMTZdID4+IDEpIC0gY29lZls0OF07CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMTZdICsgKGNvZWZbNDhdID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgKz0gcjM7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyMCAtIChyMyA8PCAxKSk7IC8qIHIwLXIzICovCisgICAgICAgICAgICAgICAgICAgICAgICByMSArPSByMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIxIC0gKHIyIDw8IDEpKTsgLyogcjEtcjIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwICs9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICByMiArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzICs9IDMyOworCisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IGN1clswXSArIChyMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXIgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihjdXIgKz0gcGljUGl0Y2gpICsgKHIxID4+IDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmN1ciA9IHIxOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAqKGN1ciArPSBwaWNQaXRjaCkgKyAocjIgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICAqY3VyID0gcjI7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IGN1cltwaWNQaXRjaF0gKyAocjMgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJbcGljUGl0Y2hdID0gcjM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1ciAtPSAocGljUGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdXIgLT0gNDsKKyAgICAgICAgICAgICAgICAgICAgY29lZiAtPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYjQmMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1ciArPSAoKHBpY1BpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gNjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1ciArPSA0OworICAgICAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGI4JjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1ckwgKz0gKChwaWNQaXRjaCA8PCAzKSAtIDgpOworICAgICAgICAgICAgY29lZjggKz0gMTIwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3VyTCArPSA4OworICAgICAgICAgICAgY29lZjggKz0gODsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qIHBlcmZvcm1hIGRjdCwgcXVhbnQsIGlxdWFudCwgaWRjdCBmb3IgdGhlIGVudGlyZSBNQiAqLwordm9pZCBkY3RfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ckwsIHVpbnQ4ICpvcmdMKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgcGl0Y2ggPSB2aWRlby0+Y3VyclBpYy0+cGl0Y2g7CisgICAgaW50IG9yZ19waXRjaCA9IGVuY3ZpZC0+Y3VycklucHV0LT5waXRjaDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludDE2ICpjb2VmID0gdmlkZW8tPmJsb2NrOworICAgIHVpbnQ4ICpwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltjdXJyTUItPmkxNk1vZGVdOworICAgIGludCBibGtfeCwgYmxrX3ksIGosIGssIGlkeCwgYjgsIGI0OworICAgIGludCByMCwgcjEsIHIyLCByMywgbTAsIG0xLCBtMiAsIG0zOworICAgIGludCBkYXRhLCBsZXY7CisgICAgaW50ICpsZXZlbCwgKnJ1biwgemVyb19ydW4sIG5jb2VmZjsKKyAgICBpbnQgUnEsIFFxLCBxdWFudCwgcV9iaXRzLCBxcF9jb25zdDsKKyAgICBpbnQgb2Zmc2V0X2N1cls0XSwgb2Zmc2V0X3ByZWRbNF0sIG9mZnNldDsKKworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIGZvciAoYmxrX3ggPSA0OyBibGtfeCA+IDA7IGJsa194LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcmVzaWR1ZSBmaXJzdCAqLworICAgICAgICAgICAgcjAgPSAqb3JnTCsrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIxID0gKm9yZ0wrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMiA9ICpvcmdMKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjMgPSAqb3JnTCsrIC0gKnByZWQrKzsKKworICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgICAgICAvL3B0clswXSArIHB0clszXTsKKyAgICAgICAgICAgIHIzID0gcjAgLSAocjMgPDwgMSk7ICAgIC8vcHRyWzBdIC0gcHRyWzNdOworICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICAvL3B0clsxXSArIHB0clsyXTsKKyAgICAgICAgICAgIHIyID0gcjEgLSAocjIgPDwgMSk7ICAgIC8vcHRyWzFdIC0gcHRyWzJdOworCisgICAgICAgICAgICAqY29lZisrID0gcjAgKyByMTsKKyAgICAgICAgICAgICpjb2VmKysgPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgICAgICpjb2VmKysgPSByMCAtIHIxOworICAgICAgICAgICAgKmNvZWYrKyA9IHIzIC0gKHIyIDw8IDEpOworICAgICAgICB9CisgICAgICAgIG9yZ0wgKz0gKG9yZ19waXRjaCAtIDE2KTsKKyAgICB9CisgICAgcHJlZCAtPSAyNTY7CisgICAgY29lZiAtPSAyNTY7CisgICAgLyogdmVydGljYWwgKi8KKyAgICBmb3IgKGJsa195ID0gNDsgYmxrX3kgPiAwOyBibGtfeS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMTY7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbNDhdOworICAgICAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZls0OF07CisgICAgICAgICAgICByMSA9IGNvZWZbMTZdICsgY29lZlszMl07CisgICAgICAgICAgICByMiA9IGNvZWZbMTZdIC0gY29lZlszMl07CisKKyAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIxOworICAgICAgICAgICAgY29lZlszMl0gPSByMCAtIHIxOworICAgICAgICAgICAgY29lZlsxNl0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgICAgIGNvZWZbNDhdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgfQorICAgICAgICBjb2VmICs9IDQ4OworICAgIH0KKworICAgIC8qIHRoZW4gcGVyZm9ybSBEQyB0cmFuc2Zvcm0gKi8KKyAgICBjb2VmIC09IDI1NjsKKyAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsxMl07CisgICAgICAgIHIzID0gY29lZlswXSAtIGNvZWZbMTJdOworICAgICAgICByMSA9IGNvZWZbNF0gKyBjb2VmWzhdOworICAgICAgICByMiA9IGNvZWZbNF0gLSBjb2VmWzhdOworCisgICAgICAgIGNvZWZbMF0gPSByMCArIHIxOworICAgICAgICBjb2VmWzhdID0gcjAgLSByMTsKKyAgICAgICAgY29lZls0XSA9IHIzICsgcjI7CisgICAgICAgIGNvZWZbMTJdID0gcjMgLSByMjsKKyAgICAgICAgY29lZiArPSA2NDsKKyAgICB9CisgICAgY29lZiAtPSAyNTY7CisgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMTkyXTsKKyAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZlsxOTJdOworICAgICAgICByMSA9IGNvZWZbNjRdICsgY29lZlsxMjhdOworICAgICAgICByMiA9IGNvZWZbNjRdIC0gY29lZlsxMjhdOworCisgICAgICAgIGNvZWZbMF0gPSAocjAgKyByMSkgPj4gMTsKKyAgICAgICAgY29lZlsxMjhdID0gKHIwIC0gcjEpID4+IDE7CisgICAgICAgIGNvZWZbNjRdID0gKHIzICsgcjIpID4+IDE7CisgICAgICAgIGNvZWZbMTkyXSA9IChyMyAtIHIyKSA+PiAxOworICAgICAgICBjb2VmICs9IDQ7CisgICAgfQorCisgICAgY29lZiAtPSAxNjsKKyAgICAvLyB0aGVuIHF1YW50aXplIERDCisgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsZGM7CisgICAgcnVuID0gZW5jdmlkLT5ydW5kYzsKKworICAgIFJxID0gdmlkZW8tPlFQeV9tb2RfNjsKKyAgICBRcSA9IHZpZGVvLT5RUHlfZGl2XzY7CisgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVswXTsKKyAgICBxX2JpdHMgPSAxNSArIFFxOworICAgIHFwX2NvbnN0ID0gZW5jdmlkLT5xcF9jb25zdDsKKworICAgIHplcm9fcnVuID0gMDsKKyAgICBuY29lZmYgPSAwOworICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKSAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgIHsKKyAgICAgICAgaWR4ID0gWklHWkFHMlJBU1RFUkRDW2tdOworICAgICAgICBkYXRhID0gY29lZltpZHhdOworICAgICAgICBpZiAoZGF0YSA+IDApICAgLy8gcXVhbnQKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBsZXYgPj49IChxX2JpdHMgKyAxKTsKKyAgICAgICAgaWYgKGxldikgLy8gZGVxdWFudAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSBsZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gLWxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bltuY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICBjb2VmW2lkeF0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaW52ZXJzZSB0cmFuc2Zvcm0gREMgKi8KKyAgICBlbmN2aWQtPm51bWNvZWZkYyA9IG5jb2VmZjsKKyAgICBpZiAobmNvZWZmKQorICAgIHsKKyAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdWzBdOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gY29lZlswXSArIGNvZWZbNF07CisgICAgICAgICAgICBtMSA9IGNvZWZbMF0gLSBjb2VmWzRdOworICAgICAgICAgICAgbTIgPSBjb2VmWzhdICsgY29lZlsxMl07CisgICAgICAgICAgICBtMyA9IGNvZWZbOF0gLSBjb2VmWzEyXTsKKworCisgICAgICAgICAgICBjb2VmWzBdID0gbTAgKyBtMjsKKyAgICAgICAgICAgIGNvZWZbNF0gPSBtMCAtIG0yOworICAgICAgICAgICAgY29lZls4XSA9IG0xIC0gbTM7CisgICAgICAgICAgICBjb2VmWzEyXSA9IG0xICsgbTM7CisgICAgICAgICAgICBjb2VmICs9IDY0OworICAgICAgICB9CisKKyAgICAgICAgY29lZiAtPSAyNTY7CisKKyAgICAgICAgaWYgKFFxID49IDIpICAvKiB0aGlzIHdheSBzaG91bGQgYmUgZmFzdGVyIHRoYW4gSk0gKi8KKyAgICAgICAgeyAgICAgICAgICAgLyogdGhleSB1c2UgKCgobTQqc2NhbGUpPDwoUVB5LzYpKSsyKT4+MiBmb3IgYm90aCBjYXNlcy4gKi8KKyAgICAgICAgICAgIFFxIC09IDI7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0wID0gY29lZlswXSArIGNvZWZbNjRdOworICAgICAgICAgICAgICAgIG0xID0gY29lZlswXSAtIGNvZWZbNjRdOworICAgICAgICAgICAgICAgIG0yID0gY29lZlsxMjhdICsgY29lZlsxOTJdOworICAgICAgICAgICAgICAgIG0zID0gY29lZlsxMjhdIC0gY29lZlsxOTJdOworCisgICAgICAgICAgICAgICAgY29lZlswXSA9ICgobTAgKyBtMikgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgY29lZls2NF0gPSAoKG0wIC0gbTIpICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIGNvZWZbMTI4XSA9ICgobTEgLSBtMykgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgY29lZlsxOTJdID0gKChtMSArIG0zKSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBRcSArPSAyOyAvKiByZXN0b3JlIHRoZSB2YWx1ZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUXEgPSAyIC0gUXE7CisgICAgICAgICAgICBvZmZzZXQgPSAxIDw8IChRcSAtIDEpOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0wID0gY29lZlswXSArIGNvZWZbNjRdOworICAgICAgICAgICAgICAgIG0xID0gY29lZlswXSAtIGNvZWZbNjRdOworICAgICAgICAgICAgICAgIG0yID0gY29lZlsxMjhdICsgY29lZlsxOTJdOworICAgICAgICAgICAgICAgIG0zID0gY29lZlsxMjhdIC0gY29lZlsxOTJdOworCisgICAgICAgICAgICAgICAgY29lZlswXSA9ICgoKG0wICsgbTIpICogcXVhbnQgKyBvZmZzZXQpID4+IFFxKTsKKyAgICAgICAgICAgICAgICBjb2VmWzY0XSA9ICgoKG0wIC0gbTIpICogcXVhbnQgKyBvZmZzZXQpID4+IFFxKTsKKyAgICAgICAgICAgICAgICBjb2VmWzEyOF0gPSAoKChtMSAtIG0zKSAqIHF1YW50ICsgb2Zmc2V0KSA+PiBRcSk7CisgICAgICAgICAgICAgICAgY29lZlsxOTJdID0gKCgobTEgKyBtMykgKiBxdWFudCArIG9mZnNldCkgPj4gUXEpOworICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFFxID0gMiAtIFFxOyAvKiByZXN0b3JlIHRoZSB2YWx1ZSAqLworICAgICAgICB9CisgICAgICAgIGNvZWYgLT0gMTY7IC8qIGJhY2sgdG8gdGhlIG9yaWdpbiAqLworICAgIH0KKworICAgIC8qIG5vdyB6aWd6YWcgc2NhbiBhYyBjb2VmcywgcXVhbnQsIGlxdWFudCBhbmQgaXRyYW5zICovCisgICAgcnVuID0gZW5jdmlkLT5ydW5bMF07CisgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsWzBdOworCisgICAgLyogb2Zmc2V0IGJ0dyA0eDQgYmxvY2sgKi8KKyAgICBvZmZzZXRfY3VyWzBdID0gMDsKKyAgICBvZmZzZXRfY3VyWzFdID0gKHBpdGNoIDw8IDIpIC0gODsKKworICAgIC8qIG9mZnNldCBidHcgOHg4IGJsb2NrICovCisgICAgb2Zmc2V0X2N1clsyXSA9IDggLSAocGl0Y2ggPDwgMyk7CisgICAgb2Zmc2V0X2N1clszXSA9IC04OworCisgICAgLyogc2ltaWxhcmx5IGZvciBwcmVkICovCisgICAgb2Zmc2V0X3ByZWRbMF0gPSAwOworICAgIG9mZnNldF9wcmVkWzFdID0gNTY7CisgICAgb2Zmc2V0X3ByZWRbMl0gPSAtMTIwOworICAgIG9mZnNldF9wcmVkWzNdID0gLTg7CisKKyAgICBjdXJyTUItPkNCUCA9IDA7CisKKyAgICBmb3IgKGI4ID0gMDsgYjggPCA0OyBiOCsrKQorICAgIHsKKyAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgeworCisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgICAgICBuY29lZmYgPSAwOworCisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgMTY7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZHggPSBaWl9TQ0FOX0JMT0NLW2tdOyAvKiBtYXAgYmFjayB0byByYXN0ZXIgc2NhbiBvcmRlciAqLworICAgICAgICAgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgICAgICAgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVtrXTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZXYgPj49IHFfYml0czsKKyAgICAgICAgICAgICAgICBpZiAobGV2KQorICAgICAgICAgICAgICAgIHsgICAvKiBkZXF1YW50ICovCisgICAgICAgICAgICAgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVtrXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKGxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKC1sZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa0lkeDJibGtYWVtiOF1bYjRdXSA9IG5jb2VmZjsgLyogaW4gcmFzdGVyIHNjYW4gISEhICovCisgICAgICAgICAgICBpZiAobmNvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IGI4KTsKKworICAgICAgICAgICAgICAgIC8vIGRvIGludmVyc2UgdHJhbnNmb3JtIGhlcmUKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxXSA+PiAxKSAtIGNvZWZbM107CisgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxXSArIChjb2VmWzNdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIzOworICAgICAgICAgICAgICAgICAgICBjb2VmWzFdID0gcjEgKyByMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZlsyXSA9IHIxIC0gcjI7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbM10gPSByMCAtIHIzOworCisgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZWYgLT0gNjQ7CisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzE2XSArIChjb2VmWzQ4XSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICByMCArPSByMzsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjAgLSAocjMgPDwgMSkpOyAvKiByMC1yMyAqLworICAgICAgICAgICAgICAgICAgICByMSArPSByMjsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjEgLSAocjIgPDwgMSkpOyAvKiByMS1yMiAqLworICAgICAgICAgICAgICAgICAgICByMCArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjEgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIyICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMyArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKHIwID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gcHJlZFsxNl0gKyAocjEgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSBwcmVkWzMyXSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMyA9IHByZWRbNDhdICsgKHIzID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICpjdXJMID0gcjA7CisgICAgICAgICAgICAgICAgICAgICooY3VyTCArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJMICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgICAgICBjdXJMW3BpdGNoXSA9IHIzOworICAgICAgICAgICAgICAgICAgICBjdXJMIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyTCsrOworICAgICAgICAgICAgICAgICAgICBwcmVkKys7CisgICAgICAgICAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAvLyBkbyBEQy1vbmx5IGludmVyc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyAzMjsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSBwcmVkWzE2XSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMiA9IHByZWRbMzJdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIzID0gcHJlZFs0OF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgKmN1ckwgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJMICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICAgICAqKGN1ckwgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgICAgIGN1ckxbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgICAgIGN1ckwgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjdXJMKys7CisgICAgICAgICAgICAgICAgICAgIHByZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBydW4gKz0gMTY7ICAvLyBmb2xsb3cgY29kaW5nIG9yZGVyCisgICAgICAgICAgICBsZXZlbCArPSAxNjsKKyAgICAgICAgICAgIGN1ckwgKz0gb2Zmc2V0X2N1cltiNCYxXTsKKyAgICAgICAgICAgIHByZWQgKz0gb2Zmc2V0X3ByZWRbYjQmMV07CisgICAgICAgICAgICBjb2VmICs9IG9mZnNldF9wcmVkW2I0JjFdOworICAgICAgICB9CisKKyAgICAgICAgY3VyTCArPSBvZmZzZXRfY3VyWzIgKyAoYjgmMSldOworICAgICAgICBwcmVkICs9IG9mZnNldF9wcmVkWzIgKyAoYjgmMSldOworICAgICAgICBjb2VmICs9IG9mZnNldF9wcmVkWzIgKyAoYjgmMSldOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBkY3RfY2hyb21hKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyQywgdWludDggKm9yZ0MsIGludCBjcikKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgb3JnX3BpdGNoID0gKGVuY3ZpZC0+Y3VycklucHV0LT5waXRjaCkgPj4gMTsKKyAgICBpbnQgcGl0Y2ggPSAodmlkZW8tPmN1cnJQaWMtPnBpdGNoKSA+PiAxOworICAgIGludCBwcmVkX3BpdGNoID0gMTY7CisgICAgaW50MTYgKmNvZWYgPSB2aWRlby0+YmxvY2sgKyAyNTY7CisgICAgdWludDggKnByZWQgPSB2aWRlby0+cHJlZF9ibG9jazsKKyAgICBpbnQgaiwgYmxrX3gsIGJsa195LCBrLCBpZHgsIGI0OworICAgIGludCByMCwgcjEsIHIyLCByMywgbTA7CisgICAgaW50IFFxLCBScSwgcXBfY29uc3QsIHFfYml0cywgcXVhbnQ7CisgICAgaW50ICpsZXZlbCwgKnJ1biwgemVyb19ydW4sIG5jb2VmZjsKKyAgICBpbnQgZGF0YSwgbGV2OworICAgIGludCBvZmZzZXRfY3VyWzJdLCBvZmZzZXRfcHJlZFsyXSwgb2Zmc2V0X2NvZWZbMl07CisgICAgdWludDggbnpfdGVtcFs0XTsKKyAgICBpbnQgIGNvZWZmX2Nvc3Q7CisKKyAgICBpZiAoY3IpCisgICAgeworICAgICAgICBjb2VmICs9IDg7CisgICAgICAgIHByZWQgKz0gODsKKyAgICB9CisKKyAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSA9PSAwKSAvLyBpbnRlciBtb2RlCisgICAgeworICAgICAgICBwcmVkID0gY3VyQzsKKyAgICAgICAgcHJlZF9waXRjaCA9IHBpdGNoOworICAgIH0KKworICAgIC8qIGRvIDR4NCB0cmFuc2Zvcm0gKi8KKyAgICAvKiBob3Jpem9udGFsICovCisgICAgZm9yIChqID0gODsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIGZvciAoYmxrX3ggPSAyOyBibGtfeCA+IDA7IGJsa194LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcmVzaWR1ZSBmaXJzdCAqLworICAgICAgICAgICAgcjAgPSAqb3JnQysrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIxID0gKm9yZ0MrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMiA9ICpvcmdDKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjMgPSAqb3JnQysrIC0gKnByZWQrKzsKKworICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgICAgICAvL3B0clswXSArIHB0clszXTsKKyAgICAgICAgICAgIHIzID0gcjAgLSAocjMgPDwgMSk7ICAgIC8vcHRyWzBdIC0gcHRyWzNdOworICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICAvL3B0clsxXSArIHB0clsyXTsKKyAgICAgICAgICAgIHIyID0gcjEgLSAocjIgPDwgMSk7ICAgIC8vcHRyWzFdIC0gcHRyWzJdOworCisgICAgICAgICAgICAqY29lZisrID0gcjAgKyByMTsKKyAgICAgICAgICAgICpjb2VmKysgPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgICAgICpjb2VmKysgPSByMCAtIHIxOworICAgICAgICAgICAgKmNvZWYrKyA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIH0KKyAgICAgICAgY29lZiArPSA4OyAvLyBjb2VmIHBpdGNoIGlzIDE2CisgICAgICAgIHByZWQgKz0gKHByZWRfcGl0Y2ggLSA4KTsgLy8gcHJlZF9waXRjaCBpcyAxNgorICAgICAgICBvcmdDICs9IChvcmdfcGl0Y2ggLSA4KTsKKyAgICB9CisgICAgcHJlZCAtPSAocHJlZF9waXRjaCA8PCAzKTsKKyAgICBjb2VmIC09IDEyODsKKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIGZvciAoYmxrX3kgPSAyOyBibGtfeSA+IDA7IGJsa195LS0pCisgICAgeworICAgICAgICBmb3IgKGogPSA4OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzQ4XTsKKyAgICAgICAgICAgIHIzID0gY29lZlswXSAtIGNvZWZbNDhdOworICAgICAgICAgICAgcjEgPSBjb2VmWzE2XSArIGNvZWZbMzJdOworICAgICAgICAgICAgcjIgPSBjb2VmWzE2XSAtIGNvZWZbMzJdOworCisgICAgICAgICAgICBjb2VmWzBdID0gcjAgKyByMTsKKyAgICAgICAgICAgIGNvZWZbMzJdID0gcjAgLSByMTsKKyAgICAgICAgICAgIGNvZWZbMTZdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgICAgICBjb2VmWzQ4XSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgICAgICBjb2VmKys7CisgICAgICAgIH0KKyAgICAgICAgY29lZiArPSA1NjsKKyAgICB9CisgICAgLyogdGhlbiBwZXJmb3JtIERDIHRyYW5zZm9ybSAqLworICAgIGNvZWYgLT0gMTI4OworCisgICAgLyogMngyIHRyYW5zZm9ybSBvZiBEQyBjb21wb25lbnRzKi8KKyAgICByMCA9IGNvZWZbMF07CisgICAgcjEgPSBjb2VmWzRdOworICAgIHIyID0gY29lZls2NF07CisgICAgcjMgPSBjb2VmWzY4XTsKKworICAgIGNvZWZbMF0gPSByMCArIHIxICsgcjIgKyByMzsKKyAgICBjb2VmWzRdID0gcjAgLSByMSArIHIyIC0gcjM7CisgICAgY29lZls2NF0gPSByMCArIHIxIC0gcjIgLSByMzsKKyAgICBjb2VmWzY4XSA9IHIwIC0gcjEgLSByMiArIHIzOworCisgICAgUXEgICAgPSB2aWRlby0+UVBjX2Rpdl82OworICAgIFJxICAgID0gdmlkZW8tPlFQY19tb2RfNjsKKyAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdWzBdOworICAgIHFfYml0cyAgICA9IDE1ICsgUXE7CisgICAgcXBfY29uc3QgPSBlbmN2aWQtPnFwX2NvbnN0X2M7CisKKyAgICB6ZXJvX3J1biA9IDA7CisgICAgbmNvZWZmID0gMDsKKyAgICBydW4gPSBlbmN2aWQtPnJ1bmNkYyArIChjciA8PCAyKTsKKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxjZGMgKyAoY3IgPDwgMik7CisKKyAgICAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgeworICAgICAgICBpZHggPSAoKGsgPj4gMSkgPDwgNikgKyAoKGsgJiAxKSA8PCAyKTsKKyAgICAgICAgZGF0YSA9IGNvZWZbaWR4XTsKKyAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gKHFfYml0cyArIDEpOworICAgICAgICBpZiAobGV2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSBsZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gLWxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bltuY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICBjb2VmW2lkeF0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jdmlkLT5udW1jb2VmY2RjW2NyXSA9IG5jb2VmZjsKKworICAgIGlmIChuY29lZmYpCisgICAgeworICAgICAgICBjdXJyTUItPkNCUCB8PSAoMSA8PCA0KTsgLy8gREMgcHJlc2VudAorICAgICAgICAvLyBkbyBpbnZlcnNlIHRyYW5zZm9ybQorICAgICAgICBxdWFudCA9IGRlcXVhbnRfY29lZnJlc1tScV1bMF07CisKKyAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZls0XTsKKyAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZls0XTsKKyAgICAgICAgcjIgPSBjb2VmWzY0XSArIGNvZWZbNjhdOworICAgICAgICByMyA9IGNvZWZbNjRdIC0gY29lZls2OF07CisKKyAgICAgICAgcjAgKz0gcjI7CisgICAgICAgIHIyID0gcjAgLSAocjIgPDwgMSk7CisgICAgICAgIHIxICs9IHIzOworICAgICAgICByMyA9IHIxIC0gKHIzIDw8IDEpOworCisgICAgICAgIGlmIChRcSA+PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBRcSAtPSAxOworICAgICAgICAgICAgY29lZlswXSA9IChyMCAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIGNvZWZbNF0gPSAocjEgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICBjb2VmWzY0XSA9IChyMiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIGNvZWZbNjhdID0gKHIzICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgUXErKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZWZbMF0gPSAocjAgKiBxdWFudCkgPj4gMTsKKyAgICAgICAgICAgIGNvZWZbNF0gPSAocjEgKiBxdWFudCkgPj4gMTsKKyAgICAgICAgICAgIGNvZWZbNjRdID0gKHIyICogcXVhbnQpID4+IDE7CisgICAgICAgICAgICBjb2VmWzY4XSA9IChyMyAqIHF1YW50KSA+PiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IGRvIEFDIHppZ3phZyBzY2FuLCBxdWFudCwgaXF1YW50IGFuZCBpdHJhbnMgKi8KKyAgICBpZiAoY3IpCisgICAgeworICAgICAgICBydW4gPSBlbmN2aWQtPnJ1blsyMF07CisgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFsyMF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuWzE2XTsKKyAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsWzE2XTsKKyAgICB9CisKKyAgICAvKiBvZmZzZXQgYnR3IDR4NCBibG9jayAqLworICAgIG9mZnNldF9jdXJbMF0gPSAwOworICAgIG9mZnNldF9jdXJbMV0gPSAocGl0Y2ggPDwgMikgLSA4OworICAgIG9mZnNldF9wcmVkWzBdID0gMDsKKyAgICBvZmZzZXRfcHJlZFsxXSA9IChwcmVkX3BpdGNoIDw8IDIpIC0gODsKKyAgICBvZmZzZXRfY29lZlswXSA9IDA7CisgICAgb2Zmc2V0X2NvZWZbMV0gPSA1NjsKKworICAgIGNvZWZmX2Nvc3QgPSAwOworCisgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICB7CisgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgbmNvZWZmID0gMDsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDE2OyBrKyspIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkeCA9IFpaX1NDQU5fQkxPQ0tba107IC8qIG1hcCBiYWNrIHRvIHJhc3RlciBzY2FuIG9yZGVyICovCisgICAgICAgICAgICBkYXRhID0gY29lZltpZHhdOworICAgICAgICAgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVtrXTsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXYgPj49IHFfYml0czsKKyAgICAgICAgICAgIGlmIChsZXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZm9yIFJEIHBlcmZvcm1hbmNlKi8KKyAgICAgICAgICAgICAgICBpZiAobGV2ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgY29lZmZfY29zdCArPSBNQVhfVkFMVUU7ICAgICAgICAgICAgICAgIC8vIHNldCBoaWdoIGNvc3QsIHNoYWxsIG5vdCBiZSBkaXNjYXJkZWQKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvZWZmX2Nvc3QgKz0gQ09FRkZfQ09TVFtESVNBQkxFX1RIUkVTSE9MRElOR11bemVyb19ydW5dOworCisgICAgICAgICAgICAgICAgLyogZGVxdWFudCAqLworICAgICAgICAgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVtrXTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAobGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKC1sZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJ1bltuY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbnpfdGVtcFtiNF0gPSBuY29lZmY7IC8vIHJhc3RlciBzY2FuCisKKyAgICAgICAgLy8ganVzdCBhZHZhbmNlIHRoZSBwb2ludGVycyBmb3Igbm93LCBkbyBJRENUIGxhdGVyCisgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgcnVuICs9IDE2OworICAgICAgICBsZXZlbCArPSAxNjsKKyAgICAgICAgY29lZiArPSBvZmZzZXRfY29lZltiNCYxXTsKKyAgICB9CisKKyAgICAvKiByZXdpbmQgdGhlIHBvaW50ZXJzICovCisgICAgY29lZiAtPSAxMjg7CisKKyAgICBpZiAoY29lZmZfY29zdCA8IF9DSFJPTUFfQ09FRkZfQ09TVF8pCisgICAgeworICAgICAgICAvKiBpZiBpdCdzIG5vdCBlZmZpY2llbnQgdG8gZW5jb2RlIGFueSBibG9ja3MuCisgICAgICAgIEp1c3QgZG8gREMgb25seSAqLworICAgICAgICAvKiBXZSBjYW4gcmVzZXQgbGV2ZWwgYW5kIHJ1biBhbHNvLCBidXQgc2V0dGluZyBueiB0byB6ZXJvIHNob3VsZCBiZSBlbm91Z2guICovCisgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbMTYrKGNyPDwxKV0gPSAwOworICAgICAgICBjdXJyTUItPm56X2NvZWZmWzE3Kyhjcjw8MSldID0gMDsKKyAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsyMCsoY3I8PDEpXSA9IDA7CisgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbMjErKGNyPDwxKV0gPSAwOworCisgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIERDLW9ubHkgaW52ZXJzZQorICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgMzI7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMSA9ICoocHJlZCArPSBwcmVkX3BpdGNoKSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjIgPSBwcmVkW3ByZWRfcGl0Y2hdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMyA9IHByZWRbcHJlZF9waXRjaDw8MV0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICpjdXJDID0gcjA7CisgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICBjdXJDW3BpdGNoXSA9IHIzOworICAgICAgICAgICAgICAgIGN1ckMgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgIGN1ckMrKzsKKyAgICAgICAgICAgICAgICBwcmVkICs9ICgxIC0gcHJlZF9waXRjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICBjdXJDICs9IG9mZnNldF9jdXJbYjQmMV07CisgICAgICAgICAgICBwcmVkICs9IG9mZnNldF9wcmVkW2I0JjFdOworICAgICAgICAgICAgY29lZiArPSBvZmZzZXRfY29lZltiNCYxXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vIG5vdCBkcm9wcGluZyBhbnl0aGluZywgY29udGludWUgd2l0aCB0aGUgSURDVAorICAgIHsKKyAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmNvZWZmID0gbnpfdGVtcFtiNF0gOyAvLyBpbiByYXN0ZXIgc2NhbgorICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsxNisoYjQmMSkrKGNyPDwxKSsoKGI0Pj4xKTw8MildID0gbmNvZWZmOyAvLyBpbiByYXN0ZXIgc2NhbgorCisgICAgICAgICAgICBpZiAobmNvZWZmKSAvLyBkbyBhIGNoZWNrIG9uIHRoZSBub256ZXJvLWNvZWZmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgfD0gKDIgPDwgNCk7CisKKyAgICAgICAgICAgICAgICAvLyBkbyBpbnZlcnNlIHRyYW5zZm9ybSBoZXJlCisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMV0gPj4gMSkgLSBjb2VmWzNdOworICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMV0gKyAoY29lZlszXSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICBjb2VmWzBdID0gcjAgKyByMzsKKyAgICAgICAgICAgICAgICAgICAgY29lZlsxXSA9IHIxICsgcjI7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbMl0gPSByMSAtIHIyOworICAgICAgICAgICAgICAgICAgICBjb2VmWzNdID0gcjAgLSByMzsKKworICAgICAgICAgICAgICAgICAgICBjb2VmICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2VmIC09IDY0OworICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgIHIyID0gKGNvZWZbMTZdID4+IDEpIC0gY29lZls0OF07CisgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxNl0gKyAoY29lZls0OF0gPj4gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgcjAgKz0gcjM7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHIwIC0gKHIzIDw8IDEpKTsgLyogcjAtcjMgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHIxIC0gKHIyIDw8IDEpKTsgLyogcjEtcjIgKi8KKyAgICAgICAgICAgICAgICAgICAgcjAgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIxICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMiArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjMgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChyMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMSA9ICoocHJlZCArPSBwcmVkX3BpdGNoKSArIChyMSA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMiA9IHByZWRbcHJlZF9waXRjaF0gKyAocjIgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjMgPSBwcmVkW3ByZWRfcGl0Y2g8PDFdICsgKHIzID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICpjdXJDID0gcjA7CisgICAgICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgICAgICBjdXJDW3BpdGNoXSA9IHIzOworICAgICAgICAgICAgICAgICAgICBjdXJDIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyQysrOworICAgICAgICAgICAgICAgICAgICBwcmVkICs9ICgxIC0gcHJlZF9waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZG8gREMtb25seSBpbnZlcnNlCisgICAgICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgMzI7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gcHJlZFtwcmVkX3BpdGNoXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMyA9IHByZWRbcHJlZF9waXRjaDw8MV0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgKmN1ckMgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgICAgIGN1ckNbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgICAgIGN1ckMgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjdXJDKys7CisgICAgICAgICAgICAgICAgICAgIHByZWQgKz0gKDEgLSBwcmVkX3BpdGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyQyArPSBvZmZzZXRfY3VyW2I0JjFdOworICAgICAgICAgICAgcHJlZCArPSBvZmZzZXRfcHJlZFtiNCYxXTsKKyAgICAgICAgICAgIGNvZWYgKz0gb2Zmc2V0X2NvZWZbYjQmMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIG9ubHkgREMgdHJhbnNmb3JtICovCitpbnQgVHJhbnNRdWFudEludHJhMTZEQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50MTYgKmJsb2NrID0gdmlkZW8tPmJsb2NrOworICAgIGludCAqbGV2ZWwgPSBlbmN2aWQtPmxldmVsZGM7CisgICAgaW50ICpydW4gPSBlbmN2aWQtPnJ1bmRjOworICAgIGludDE2ICpwdHIgPSBibG9jazsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjMsIGo7CisgICAgaW50IFFxID0gdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBpbnQgUnEgPSB2aWRlby0+UVB5X21vZF82OworICAgIGludCBxX2JpdHMsIHFwX2NvbnN0LCBxdWFudDsKKyAgICBpbnQgZGF0YSwgbGV2LCB6ZXJvX3J1bjsKKyAgICBpbnQgaywgbmNvZWZmLCBpZHg7CisKKyAgICAvKiBEQyB0cmFuc2Zvcm0gKi8KKyAgICAvKiBob3Jpem9udGFsICovCisgICAgaiA9IDQ7CisgICAgd2hpbGUgKGopCisgICAgeworICAgICAgICByMCA9IHB0clswXSArIHB0clsxMl07CisgICAgICAgIHIzID0gcHRyWzBdIC0gcHRyWzEyXTsKKyAgICAgICAgcjEgPSBwdHJbNF0gKyBwdHJbOF07CisgICAgICAgIHIyID0gcHRyWzRdIC0gcHRyWzhdOworCisgICAgICAgIHB0clswXSA9IHIwICsgcjE7CisgICAgICAgIHB0cls4XSA9IHIwIC0gcjE7CisgICAgICAgIHB0cls0XSA9IHIzICsgcjI7CisgICAgICAgIHB0clsxMl0gPSByMyAtIHIyOworICAgICAgICBwdHIgKz0gNjQ7CisgICAgICAgIGotLTsKKyAgICB9CisgICAgLyogdmVydGljYWwgKi8KKyAgICBwdHIgPSBibG9jazsKKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaikKKyAgICB7CisgICAgICAgIHIwID0gcHRyWzBdICsgcHRyWzE5Ml07CisgICAgICAgIHIzID0gcHRyWzBdIC0gcHRyWzE5Ml07CisgICAgICAgIHIxID0gcHRyWzY0XSArIHB0clsxMjhdOworICAgICAgICByMiA9IHB0cls2NF0gLSBwdHJbMTI4XTsKKworICAgICAgICBwdHJbMF0gPSAocjAgKyByMSkgPj4gMTsKKyAgICAgICAgcHRyWzEyOF0gPSAocjAgLSByMSkgPj4gMTsKKyAgICAgICAgcHRyWzY0XSA9IChyMyArIHIyKSA+PiAxOworICAgICAgICBwdHJbMTkyXSA9IChyMyAtIHIyKSA+PiAxOworICAgICAgICBwdHIgKz0gNDsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1bMF07CisgICAgcV9iaXRzICAgID0gMTUgKyBRcTsKKyAgICBxcF9jb25zdCA9ICgxIDw8IHFfYml0cykgLyAzOyAgICAvLyBpbnRyYQorCisgICAgemVyb19ydW4gPSAwOworICAgIG5jb2VmZiA9IDA7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykgLyogaW4gemlnemFnIHNjYW4gb3JkZXIgKi8KKyAgICB7CisgICAgICAgIGlkeCA9IFpJR1pBRzJSQVNURVJEQ1trXTsKKyAgICAgICAgZGF0YSA9IGJsb2NrW2lkeF07CisgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gLWRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBsZXYgPj49IChxX2JpdHMgKyAxKTsKKyAgICAgICAgaWYgKGxldikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSA9IGxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBibG9ja1tpZHhdID0gLWxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bltuY29lZmYrK10gPSB6ZXJvX3J1bjsKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHplcm9fcnVuKys7CisgICAgICAgICAgICBibG9ja1tpZHhdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmNvZWZmOworfQorCitpbnQgVHJhbnNRdWFudENocm9tYURDKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQxNiAqYmxvY2ssIGludCBzbGljZV90eXBlLCBpbnQgY3IpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCAqbGV2ZWwsICpydW47CisgICAgaW50IHIwLCByMSwgcjIsIHIzOworICAgIGludCBRcSwgUnEsIHFfYml0cywgcXBfY29uc3QsIHF1YW50OworICAgIGludCBkYXRhLCBsZXYsIHplcm9fcnVuOworICAgIGludCBrLCBuY29lZmYsIGlkeDsKKworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGNkYyArIChjciA8PCAyKTsgLyogY2Igb3IgY3IgKi8KKyAgICBydW4gPSBlbmN2aWQtPnJ1bmNkYyArIChjciA8PCAyKTsKKworICAgIC8qIDJ4MiB0cmFuc2Zvcm0gb2YgREMgY29tcG9uZW50cyovCisgICAgcjAgPSBibG9ja1swXTsKKyAgICByMSA9IGJsb2NrWzRdOworICAgIHIyID0gYmxvY2tbNjRdOworICAgIHIzID0gYmxvY2tbNjhdOworCisgICAgYmxvY2tbMF0gPSByMCArIHIxICsgcjIgKyByMzsKKyAgICBibG9ja1s0XSA9IHIwIC0gcjEgKyByMiAtIHIzOworICAgIGJsb2NrWzY0XSA9IHIwICsgcjEgLSByMiAtIHIzOworICAgIGJsb2NrWzY4XSA9IHIwIC0gcjEgLSByMiArIHIzOworCisgICAgUXEgICAgPSB2aWRlby0+UVBjX2Rpdl82OworICAgIFJxICAgID0gdmlkZW8tPlFQY19tb2RfNjsKKyAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdWzBdOworICAgIHFfYml0cyAgICA9IDE1ICsgUXE7CisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICBxcF9jb25zdCA9ICgxIDw8IHFfYml0cykgLyAzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBxcF9jb25zdCA9ICgxIDw8IHFfYml0cykgLyA2OworICAgIH0KKworICAgIHplcm9fcnVuID0gMDsKKyAgICBuY29lZmYgPSAwOworCisgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgLyogaW4gemlnemFnIHNjYW4gb3JkZXIgKi8KKyAgICB7CisgICAgICAgIGlkeCA9ICgoayA+PiAxKSA8PCA2KSArICgoayAmIDEpIDw8IDIpOworICAgICAgICBkYXRhID0gYmxvY2tbaWR4XTsKKyAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gKHFfYml0cyArIDEpOworICAgICAgICBpZiAobGV2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICBibG9ja1tpZHhdID0gbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuY29lZmY7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhMmExNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKQEAgLTAsMCArMSw2MjIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorLyogMy8yOS8wMSBmYXN0IGhhbGYtcGVsIHNlYXJjaCBiYXNlZCBvbiBuZWlnaGJvcmluZyBndWVzcyAqLworLyogdmFsdWUgcmFuZ2luZyBmcm9tIDAgdG8gNCwgaGlnaCBjb21wbGV4aXR5IChtb3JlIGFjY3VyYXRlKSB0bworICAgbG93IGNvbXBsZXhpdHkgKGxlc3MgYWNjdXJhdGUpICovCisjZGVmaW5lIEhQX0RJU1RBTkNFX1RIICAgICAgNSAvLyAyICAvKiBoYWxmLXBlbCBkaXN0YW5jZSB0aHJlc2hvbGQgKi8KKworI2RlZmluZSBQUkVGXzE2X1ZFQyAxMjkgICAgIC8qIDFNViBiaWFzIHZlcnN1cyA0TVZzKi8KKworY29uc3Qgc3RhdGljIGludCBkaXN0YW5jZV90YWJbOV1bOV0gPSAgIC8qIFtocF9ndWVzc11ba10gKi8KK3sKKyAgICB7MCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgezEsIDAsIDEsIDIsIDMsIDQsIDMsIDIsIDF9LAorICAgIHsxLCAwLCAwLCAwLCAxLCAyLCAzLCAyLCAxfSwKKyAgICB7MSwgMiwgMSwgMCwgMSwgMiwgMywgNCwgM30sCisgICAgezEsIDIsIDEsIDAsIDAsIDAsIDEsIDIsIDN9LAorICAgIHsxLCA0LCAzLCAyLCAxLCAwLCAxLCAyLCAzfSwKKyAgICB7MSwgMiwgMywgMiwgMSwgMCwgMCwgMCwgMX0sCisgICAgezEsIDIsIDMsIDQsIDMsIDIsIDEsIDAsIDF9LAorICAgIHsxLCAwLCAxLCAyLCAzLCAyLCAxLCAwLCAwfQorfTsKKworI2RlZmluZSBDTElQX1JFU1VMVCh4KSAgICAgIGlmKCh1aW50KXggPiAweEZGKXsgXAorICAgICAgICAgICAgICAgICB4ID0gMHhGRiAmICh+KHg+PjMxKSk7fQorCisjZGVmaW5lIENMSVBfVVBQRVIxNih4KSAgICAgaWYoKHVpbnQpeCA+PSAweDIwMDAwMDAwKXsgXAorICAgICAgICB4ID0gMHhGRjAwMDAgJiAofih4Pj4zMSkpO30gXAorICAgICAgICBlbHNlIHsgXAorICAgICAgICB4ID0gKHg+PjUpJjB4RkYwMDAwOyBcCisgICAgICAgIH0KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBBVkNGaW5kSGFsZlBlbE1CCisgICAgRGF0ZTogICAgICAgMTAvMzEvMjAwNworICAgIFB1cnBvc2U6ICAgIEZpbmQgaGFsZiBwZWwgcmVzb2x1dGlvbiBNViBzdXJyb3VuZGluZyB0aGUgZnVsbC1wZWwgTVYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludCBBVkNGaW5kSGFsZlBlbE1CKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCBBVkNNViAqbW90LCB1aW50OCAqbmNhbmQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeHBvcywgaW50IHlwb3MsIGludCBocF9ndWVzcywgaW50IGNtdngsIGludCBjbXZ5KQoreworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gZW5jdmlkLT5jb21tb24tPmN1cnJQaWM7CisgICAgaW50IGx4ID0gY3VyclBpYy0+cGl0Y2g7CisgICAgaW50IGQsIGRtaW4sIHNhdGRfbWluOworICAgIHVpbnQ4KiBjYW5kOworICAgIGludCBsYW1iZGFfbW90aW9uID0gZW5jdmlkLT5sYW1iZGFfbW90aW9uOworICAgIHVpbnQ4ICptdmJpdHMgPSBlbmN2aWQtPm12Yml0czsKKyAgICBpbnQgbXZjb3N0OworICAgIC8qIGxpc3Qgb2YgY2FuZGlkYXRlIHRvIGdvIHRocm91Z2ggZm9yIGhhbGYtcGVsIHNlYXJjaCovCisgICAgdWludDggKnN1YnBlbF9wcmVkID0gKHVpbnQ4KikgZW5jdmlkLT5zdWJwZWxfcHJlZDsgLy8gYWxsIDE2IHN1Yi1wZWwgcG9zaXRpb25zCisgICAgdWludDggKipocGVsX2NhbmQgPSAodWludDgqKikgZW5jdmlkLT5ocGVsX2NhbmQ7IC8qIGhhbGYtcGVsIHBvc2l0aW9uICovCisKKyAgICBpbnQgeGhbOV0gPSB7MCwgMCwgMiwgMiwgMiwgMCwgLTIsIC0yLCAtMn07CisgICAgaW50IHloWzldID0gezAsIC0yLCAtMiwgMCwgMiwgMiwgMiwgMCwgLTJ9OworICAgIGludCB4cVs4XSA9IHswLCAxLCAxLCAxLCAwLCAtMSwgLTEsIC0xfTsKKyAgICBpbnQgeXFbOF0gPSB7IC0xLCAtMSwgMCwgMSwgMSwgMSwgMCwgLTF9OworICAgIGludCBoLCBobWluLCBxLCBxbWluOworCisgICAgT1NDTF9VTlVTRURfQVJHKHhwb3MpOworICAgIE9TQ0xfVU5VU0VEX0FSRyh5cG9zKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoaHBfZ3Vlc3MpOworCisgICAgR2VuZXJhdGVIYWxmUGVsUHJlZChzdWJwZWxfcHJlZCwgbmNhbmQsIGx4KTsKKworICAgIGN1ciA9IGVuY3ZpZC0+Y3VycllNQjsgLy8gcHJlLWxvYWQgY3VycmVudCBvcmlnaW5hbCBNQgorCisgICAgY2FuZCA9IGhwZWxfY2FuZFswXTsKKworICAgIC8vIGZpbmQgY29zdCBmb3IgdGhlIGN1cnJlbnQgZnVsbC1wZWwgcG9zaXRpb24KKyAgICBkbWluID0gU0FURF9NQihjYW5kLCBjdXIsIDY1NTM1KTsgLy8gZ2V0IEhhZGFtYWFyZCB0cmFuc2Zvcm0gU0FECisgICAgbXZjb3N0ID0gTVZfQ09TVF9TKGxhbWJkYV9tb3Rpb24sIG1vdC0+eCwgbW90LT55LCBjbXZ4LCBjbXZ5KTsKKyAgICBzYXRkX21pbiA9IGRtaW47CisgICAgZG1pbiArPSBtdmNvc3Q7CisgICAgaG1pbiA9IDA7CisKKyAgICAvKiBmaW5kIGhhbGYtcGVsICovCisgICAgZm9yIChoID0gMTsgaCA8IDk7IGgrKykKKyAgICB7CisgICAgICAgIGQgPSBTQVREX01CKGhwZWxfY2FuZFtoXSwgY3VyLCBkbWluKTsKKyAgICAgICAgbXZjb3N0ID0gTVZfQ09TVF9TKGxhbWJkYV9tb3Rpb24sIG1vdC0+eCArIHhoW2hdLCBtb3QtPnkgKyB5aFtoXSwgY212eCwgY212eSk7CisgICAgICAgIGQgKz0gbXZjb3N0OworCisgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgeworICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICBobWluID0gaDsKKyAgICAgICAgICAgIHNhdGRfbWluID0gZCAtIG12Y29zdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1vdC0+c2FkID0gZG1pbjsKKyAgICBtb3QtPnggKz0geGhbaG1pbl07CisgICAgbW90LT55ICs9IHloW2htaW5dOworICAgIGVuY3ZpZC0+YmVzdF9ocGVsX3BvcyA9IGhtaW47CisKKyAgICAvKioqIHNlYXJjaCBmb3IgcXVhcnRlci1wZWwgKioqKi8KKyAgICBHZW5lcmF0ZVF1YXJ0UGVsUHJlZChlbmN2aWQtPmJpbGluX2Jhc2VbaG1pbl0sICYoZW5jdmlkLT5xcGVsX2NhbmRbMF1bMF0pLCBobWluKTsKKworICAgIGVuY3ZpZC0+YmVzdF9xcGVsX3BvcyA9IHFtaW4gPSAtMTsKKworICAgIGZvciAocSA9IDA7IHEgPCA4OyBxKyspCisgICAgeworICAgICAgICBkID0gU0FURF9NQihlbmN2aWQtPnFwZWxfY2FuZFtxXSwgY3VyLCBkbWluKTsKKyAgICAgICAgbXZjb3N0ID0gTVZfQ09TVF9TKGxhbWJkYV9tb3Rpb24sIG1vdC0+eCArIHhxW3FdLCBtb3QtPnkgKyB5cVtxXSwgY212eCwgY212eSk7CisgICAgICAgIGQgKz0gbXZjb3N0OworICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgcW1pbiA9IHE7CisgICAgICAgICAgICBzYXRkX21pbiA9IGQgLSBtdmNvc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocW1pbiAhPSAtMSkKKyAgICB7CisgICAgICAgIG1vdC0+c2FkID0gZG1pbjsKKyAgICAgICAgbW90LT54ICs9IHhxW3FtaW5dOworICAgICAgICBtb3QtPnkgKz0geXFbcW1pbl07CisgICAgICAgIGVuY3ZpZC0+YmVzdF9xcGVsX3BvcyA9IHFtaW47CisgICAgfQorCisgICAgcmV0dXJuIHNhdGRfbWluOworfQorCisKKworLyoqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHN1Yi1wZWwgcHJlZGljdGlvbiBhcm91bmQgdGhlIGZ1bGwtcGVsIGNhbmRpZGF0ZS4KK0VhY2ggc3ViLXBlbCBwb3NpdGlvbiBhcnJheSBpcyAyMCBwaXhlbCB3aWRlIChmb3Igd29yZC1hbGlnbm1lbnQpIGFuZCAxNyBwaXhlbCB0YWxsLiAqLworLyoqIFRoZSBzdWItcGVsIHBvc2l0aW9uIGlzIGxhYmVsZWQgaW4gc3BpcmFsIG1hbm5lciBmcm9tIHRoZSBjZW50ZXIuICovCisKK3ZvaWQgR2VuZXJhdGVIYWxmUGVsUHJlZCh1aW50OCogc3VicGVsX3ByZWQsIHVpbnQ4ICpuY2FuZCwgaW50IGx4KQoreworICAgIC8qIGxldCdzIGRvIHN0cmFpZ2h0Zm9yd2FyZCB3YXkgZmlyc3QgKi8KKyAgICB1aW50OCAqcmVmOworICAgIHVpbnQ4ICpkc3Q7CisgICAgdWludDggdG1wODsKKyAgICBpbnQzMiB0bXAzMjsKKyAgICBpbnQxNiB0bXBfaG9yelsxOCoyMl0sICpkc3RfMTYsICpzcmNfMTY7CisgICAgcmVnaXN0ZXIgaW50IGEgPSAwLCBiID0gMCwgYyA9IDAsIGQgPSAwLCBlID0gMCwgZiA9IDA7IC8vIHRlbXAgcmVnaXN0ZXIKKyAgICBpbnQgbXNrOworICAgIGludCBpLCBqOworCisgICAgLyogZmlyc3QgY29weSBmdWxsLXBlbCB0byB0aGUgZmlyc3QgYXJyYXkgKi8KKyAgICAvKiB0byBiZSBvcHRpbWl6ZWQgbGF0ZXIgYmFzZWQgb24gYnl0ZS1vZmZzZXQgbG9hZCAqLworICAgIHJlZiA9IG5jYW5kIC0gMyAtIGx4IC0gKGx4IDw8IDEpOyAvKiBtb3ZlIGJhY2sgKC0zLC0zKSAqLworICAgIGRzdCA9IHN1YnBlbF9wcmVkOworCisgICAgZHN0IC09IDQ7IC8qIG9mZnNldCAqLworICAgIGZvciAoaiA9IDA7IGogPCAyMjsgaisrKSAvKiAyNHgyMiAqLworICAgIHsKKyAgICAgICAgaSA9IDY7CisgICAgICAgIHdoaWxlIChpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMzIgPSAqcmVmKys7CisgICAgICAgICAgICB0bXA4ID0gKnJlZisrOworICAgICAgICAgICAgdG1wMzIgfD0gKHRtcDggPDwgOCk7CisgICAgICAgICAgICB0bXA4ID0gKnJlZisrOworICAgICAgICAgICAgdG1wMzIgfD0gKHRtcDggPDwgMTYpOworICAgICAgICAgICAgdG1wOCA9ICpyZWYrKzsKKyAgICAgICAgICAgIHRtcDMyIHw9ICh0bXA4IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSB0bXAzMjsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICByZWYgKz0gKGx4IC0gMjQpOworICAgIH0KKworICAgIC8qIGZyb20gdGhlIGZpcnN0IGFycmF5LCB3ZSBkbyBob3Jpem9udGFsIGludGVycCAqLworICAgIHJlZiA9IHN1YnBlbF9wcmVkICsgMjsKKyAgICBkc3RfMTYgPSB0bXBfaG9yejsgLyogMTcgeCAyMiAqLworCisgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaSAtPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBhID0gcmVmWy0yXTsKKyAgICAgICAgICAgIGIgPSByZWZbLTFdOworICAgICAgICAgICAgYyA9IHJlZlswXTsKKyAgICAgICAgICAgIGQgPSByZWZbMV07CisgICAgICAgICAgICBlID0gcmVmWzJdOworICAgICAgICAgICAgZiA9IHJlZlszXTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICBhID0gcmVmWzRdOworICAgICAgICAgICAgKmRzdF8xNisrID0gYiArIGEgLSA1ICogKGMgKyBmKSArIDIwICogKGQgKyBlKTsKKyAgICAgICAgICAgIGIgPSByZWZbNV07CisgICAgICAgICAgICAqZHN0XzE2KysgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgYyA9IHJlZls2XTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisKKyAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICB9CisgICAgICAgIC8qIGRvIHRoZSAxN3RoIGNvbHVtbiBoZXJlICovCisgICAgICAgIGQgPSByZWZbM107CisgICAgICAgICpkc3RfMTYgPSAgZSArIGQgLSA1ICogKGYgKyBjKSArIDIwICogKGEgKyBiKTsKKyAgICAgICAgZHN0XzE2ICs9IDI7IC8qIHN0cmlkZSBmb3IgdG1wX2hvcnogaXMgMTggKi8KKyAgICAgICAgcmVmICs9IDg7ICAvKiBzdHJpZGUgZm9yIHJlZiBpcyAyNCAqLworICAgICAgICBpZiAoaiA9PSAzKSAgLy8gbW92ZSAxOCBsaW5lcyBkb3duCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdF8xNiArPSAzMjQ7Ly8xOCoxODsKKyAgICAgICAgICAgIHJlZiArPSA0MzI7Ly8xOCoyNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlZiAtPSA0ODA7Ly8yMCoyNDsKKyAgICBkc3RfMTYgLT0gMzYwOy8vMjAqMTg7CisgICAgZHN0ID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7IC8qIGdvIHRvIHRoZSAxNHRoIGFycmF5IDE3eDE4Ki8KKworICAgIGZvciAoaiA9IDE4OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSByZWZbLTJdOworICAgICAgICAgICAgYiA9IHJlZlstMV07CisgICAgICAgICAgICBjID0gcmVmWzBdOworICAgICAgICAgICAgZCA9IHJlZlsxXTsKKyAgICAgICAgICAgIGUgPSByZWZbMl07CisgICAgICAgICAgICBmID0gcmVmWzNdOworICAgICAgICAgICAgdG1wMzIgPSBhICsgZiAtIDUgKiAoYiArIGUpICsgMjAgKiAoYyArIGQpOworICAgICAgICAgICAgKmRzdF8xNisrID0gdG1wMzI7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqZHN0KysgPSB0bXAzMjsKKworICAgICAgICAgICAgYSA9IHJlZls0XTsKKyAgICAgICAgICAgIHRtcDMyID0gYiArIGEgLSA1ICogKGMgKyBmKSArIDIwICogKGQgKyBlKTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IHRtcDMyOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKmRzdCsrID0gdG1wMzI7CisKKyAgICAgICAgICAgIGIgPSByZWZbNV07CisgICAgICAgICAgICB0bXAzMiA9IGMgKyBiIC0gNSAqIChkICsgYSkgKyAyMCAqIChlICsgZik7CisgICAgICAgICAgICAqZHN0XzE2KysgPSB0bXAzMjsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICpkc3QrKyA9IHRtcDMyOworCisgICAgICAgICAgICBjID0gcmVmWzZdOworICAgICAgICAgICAgdG1wMzIgPSBkICsgYyAtIDUgKiAoZSArIGIpICsgMjAgKiAoZiArIGEpOworICAgICAgICAgICAgKmRzdF8xNisrID0gdG1wMzI7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqZHN0KysgPSB0bXAzMjsKKworICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZG8gdGhlIDE3dGggY29sdW1uIGhlcmUgKi8KKyAgICAgICAgZCA9IHJlZlszXTsKKyAgICAgICAgdG1wMzIgPSAgZSArIGQgLSA1ICogKGYgKyBjKSArIDIwICogKGEgKyBiKTsKKyAgICAgICAgKmRzdF8xNiA9IHRtcDMyOworICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgKmRzdCA9IHRtcDMyOworCisgICAgICAgIGRzdCArPSA4OyAgLyogc3RyaWRlIGZvciBkc3QgaXMgMjQgKi8KKyAgICAgICAgZHN0XzE2ICs9IDI7IC8qIHN0cmlkZSBmb3IgdG1wX2hvcnogaXMgMTggKi8KKyAgICAgICAgcmVmICs9IDg7ICAvKiBzdHJpZGUgZm9yIHJlZiBpcyAyNCAqLworICAgIH0KKworCisgICAgLyogRG8gbWlkZGxlIHBvaW50IGZpbHRlcmluZyovCisgICAgc3JjXzE2ID0gdG1wX2hvcno7IC8qIDE3IHggMjIgKi8KKyAgICBkc3QgPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsgLyogMTJ0aCBhcnJheSAxN3gxNyovCisgICAgZHN0IC09IDI0OyAvLyBvZmZzZXQKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDE2OyBqID4gMDsgaiAtPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBhID0gKnNyY18xNjsKKyAgICAgICAgICAgIGIgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICBjID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgZCA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIGUgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICBmID0gKihzcmNfMTYgKz0gMTgpOworCisgICAgICAgICAgICB0bXAzMiA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDUxMikgPj4gMTA7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOworCisgICAgICAgICAgICBhID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgdG1wMzIgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsKKworICAgICAgICAgICAgYiA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIHRtcDMyID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7CisKKyAgICAgICAgICAgIGMgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICB0bXAzMiA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDUxMikgPj4gMTA7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOworCisgICAgICAgICAgICBzcmNfMTYgLT0gKDE4IDw8IDIpOworICAgICAgICB9CisKKyAgICAgICAgZCA9IHNyY18xNls5MF07IC8vIDE4KjUKKyAgICAgICAgdG1wMzIgPSBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDUxMikgPj4gMTA7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICBkc3RbMjRdID0gdG1wMzI7CisKKyAgICAgICAgc3JjXzE2IC09ICgoMTggPDwgNCkgLSAxKTsKKyAgICAgICAgZHN0IC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICB9CisKKyAgICAvKiBkbyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCisgICAgcmVmID0gc3VicGVsX3ByZWQgKyAyOworICAgIGRzdCA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOyAvKiAxMHRoIGFycmF5IDE4eDE3ICovCisgICAgZHN0IC09IDI0OyAvLyBvZmZzZXQKKworICAgIGZvciAoaSA9IDI7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGogLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9ICpyZWY7CisgICAgICAgICAgICBiID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgYyA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGQgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBlID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZiA9ICoocmVmICs9IDI0KTsKKworICAgICAgICAgICAgdG1wMzIgPSBhICsgZiAtIDUgKiAoYiArIGUpICsgMjAgKiAoYyArIGQpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGEgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYiA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBjID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBkICsgYyAtIDUgKiAoZSArIGIpICsgMjAgKiAoZiArIGEpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIHJlZiAtPSAoMjQgPDwgMik7CisgICAgICAgIH0KKworICAgICAgICBkID0gcmVmWzEyMF07IC8vIDI0KjUKKyAgICAgICAgdG1wMzIgPSBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgZHN0WzI0XSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgIGRzdCAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgICAgIHJlZiAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgfQorCisgICAgLy8gbm90ZSB0aGF0IHVzaW5nIFNJTUQgaGVyZSBkb2Vzbid0IGhlbHAgbXVjaCwgdGhlIGN5Y2xlIGFsbW9zdCBzdGF5cyB0aGUgc2FtZQorICAgIC8vIG9uZSBjYW4ganVzdCB1c2UgdGhlIGFib3ZlIGNvZGUgYW5kIGNoYW5nZSB0aGUgZm9yKGk9MiB0byBmb3IoaT0xOAorICAgIGZvciAoaSA9IDE2OyBpID4gMDsgaSAtPSA0KQorICAgIHsKKyAgICAgICAgbXNrID0gMDsKKyAgICAgICAgZm9yIChqID0gMTc7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSAqKCh1aW50MzIqKXJlZik7IC8qIGxvYWQgNCBieXRlcyAqLworICAgICAgICAgICAgYiA9IChhID4+IDgpICYgMHhGRjAwRkY7IC8qIHNlY29uZCBhbmQgZm91cnRoIGJ5dGUgKi8KKyAgICAgICAgICAgIGEgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgPSAqKCh1aW50MzIqKShyZWYgKyAxMjApKTsKKyAgICAgICAgICAgIGQgPSAoYyA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgYyAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYSArPSBjOworICAgICAgICAgICAgYiArPSBkOworCisgICAgICAgICAgICBlID0gKigodWludDMyKikocmVmICsgNzIpKTsgLyogZSwgZiAqLworICAgICAgICAgICAgZiA9IChlID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBlICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBjID0gKigodWludDMyKikocmVmICsgNDgpKTsgLyogYywgZCAqLworICAgICAgICAgICAgZCA9IChjID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBjICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBjICs9IGU7CisgICAgICAgICAgICBkICs9IGY7CisKKyAgICAgICAgICAgIGEgKz0gMjAgKiBjOworICAgICAgICAgICAgYiArPSAyMCAqIGQ7CisgICAgICAgICAgICBhICs9IDB4MTAwMDEwOworICAgICAgICAgICAgYiArPSAweDEwMDAxMDsKKworICAgICAgICAgICAgZSA9ICooKHVpbnQzMiopKHJlZiArPSAyNCkpOyAvKiBlLCBmICovCisgICAgICAgICAgICBmID0gKGUgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGUgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgPSAqKCh1aW50MzIqKShyZWYgKyA3MikpOyAvKiBjLCBkICovCisgICAgICAgICAgICBkID0gKGMgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGMgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgKz0gZTsKKyAgICAgICAgICAgIGQgKz0gZjsKKworICAgICAgICAgICAgYSAtPSA1ICogYzsKKyAgICAgICAgICAgIGIgLT0gNSAqIGQ7CisKKyAgICAgICAgICAgIGMgPSBhIDw8IDE2OworICAgICAgICAgICAgZCA9IGIgPDwgMTY7CisgICAgICAgICAgICBDTElQX1VQUEVSMTYoYSkKKyAgICAgICAgICAgIENMSVBfVVBQRVIxNihjKQorICAgICAgICAgICAgQ0xJUF9VUFBFUjE2KGIpCisgICAgICAgICAgICBDTElQX1VQUEVSMTYoZCkKKworICAgICAgICAgICAgYSB8PSAoYyA+PiAxNik7CisgICAgICAgICAgICBiIHw9IChkID4+IDE2KTsKKyAgICAgICAgICAgIC8vICBhPj49NTsKKyAgICAgICAgICAgIC8vICBiPj49NTsKKyAgICAgICAgICAgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgIC8vICBtc2sgfD0gYjsgIG1za3w9YTsKKyAgICAgICAgICAgIC8vICBhICY9IDB4RkYwMEZGOworICAgICAgICAgICAgLy8gIGIgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICBhIHw9IChiIDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCisKKyAgICAgICAgICAgICooKHVpbnQxNiopKGRzdCArPSAyNCkpID0gYSAmIDB4RkZGRjsgLy9kc3QgaXMgbm90IHdvcmQtYWxpZ25lZC4KKyAgICAgICAgICAgICooKHVpbnQxNiopKGRzdCArIDIpKSA9IGEgPj4gMTY7CisKKyAgICAgICAgfQorICAgICAgICBkc3QgLT0gNDA0OyAvLyAyNCoxNy00CisgICAgICAgIHJlZiAtPSA0MDQ7CisgICAgICAgIC8qICAgICAgaWYobXNrICYgMHhGRjAwRkYwMCkgLy8gbmVlZCBjbGlwcGluZworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmVydEludGVycFdDbGlwKGRzdCxyZWYpOyAvLyByZS1kbyA0IGNvbHVtbiB3aXRoIGNsaXAKKyAgICAgICAgICAgICAgICB9Ki8KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIFZlcnRJbnRlcnBXQ2xpcCh1aW50OCAqZHN0LCB1aW50OCAqcmVmKQoreworICAgIGludCBpLCBqOworICAgIGludCBhLCBiLCBjLCBkLCBlLCBmOworICAgIGludDMyIHRtcDMyOworCisgICAgZHN0IC09IDQ7CisgICAgcmVmIC09IDQ7CisKKyAgICBmb3IgKGkgPSA0OyBpID4gMDsgaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMTY7IGogPiAwOyBqIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSAqcmVmOworICAgICAgICAgICAgYiA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGMgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBkID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZSA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGYgPSAqKHJlZiArPSAyNCk7CisKKyAgICAgICAgICAgIHRtcDMyID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBhID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGIgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGMgKyBiIC0gNSAqIChkICsgYSkgKyAyMCAqIChlICsgZik7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYyA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICByZWYgLT0gKDI0IDw8IDIpOworICAgICAgICB9CisKKyAgICAgICAgZCA9IHJlZlsxMjBdOyAvLyAyNCo1CisgICAgICAgIHRtcDMyID0gZSArIGQgLSA1ICogKGYgKyBjKSArIDIwICogKGEgKyBiKTsKKyAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgIGRzdFsyNF0gPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICBkc3QgLT0gKCgyNCA8PCA0KSAtIDEpOworICAgICAgICByZWYgLT0gKCgyNCA8PCA0KSAtIDEpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBHZW5lcmF0ZVF1YXJ0UGVsUHJlZCh1aW50OCAqKmJpbGluX2Jhc2UsIHVpbnQ4ICpxcGVsX2NhbmQsIGludCBocGVsX3BvcykKK3sKKyAgICAvLyBmb3IgZXZlbiB2YWx1ZSBvZiBocGVsX3Bvcywgc3RhcnQgd2l0aCBwYXR0ZXJuIDEsIG90aGVyd2lzZSwgc3RhcnQgd2l0aCBwYXR0ZXJuIDIKKyAgICBpbnQgaSwgajsKKworICAgIHVpbnQ4ICpjMSA9IHFwZWxfY2FuZDsKKyAgICB1aW50OCAqdGwgPSBiaWxpbl9iYXNlWzBdOworICAgIHVpbnQ4ICp0ciA9IGJpbGluX2Jhc2VbMV07CisgICAgdWludDggKmJsID0gYmlsaW5fYmFzZVsyXTsKKyAgICB1aW50OCAqYnIgPSBiaWxpbl9iYXNlWzNdOworICAgIGludCBhLCBiLCBjLCBkOworICAgIGludCBvZmZzZXQgPSAxIC0gKDM4NCAqIDcpOworCisgICAgaWYgKCEoaHBlbF9wb3MmMSkpIC8vIGRpYW1vbmQgcGF0dGVybgorICAgIHsKKyAgICAgICAgaiA9IDE2OworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMTY7CisgICAgICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSB0clsyNF07CisgICAgICAgICAgICAgICAgYSA9ICp0cisrOworICAgICAgICAgICAgICAgIGIgPSBibFsxXTsKKyAgICAgICAgICAgICAgICBjID0gKmJyKys7CisKKyAgICAgICAgICAgICAgICAqYzEgPSAoYyArIGEgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgYSArIDEpID4+IDE7IC8qIGMyICovCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBjICsgMSkgPj4gMTsgLyogYzMgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGQgKyAxKSA+PiAxOyAvKiBjNCAqLworCisgICAgICAgICAgICAgICAgYiA9ICpibCsrOworCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGMgKyBkICsgMSkgPj4gMTsgIC8qIGM1ICovCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBkICsgMSkgPj4gMTsgIC8qIGM2ICovCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBjICsgMSkgPj4gMTsgIC8qIGM3ICovCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBhICsgMSkgPj4gMTsgIC8qIGM4ICovCisKKyAgICAgICAgICAgICAgICBjMSArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGxpbmUsIHBpdGNoIGlzIDI0CisgICAgICAgICAgICB0bCArPSA4OworICAgICAgICAgICAgdHIgKz0gODsKKyAgICAgICAgICAgIGJsICs9IDg7CisgICAgICAgICAgICBiciArPSA4OworICAgICAgICAgICAgYzEgKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vIHN0YXIgcGF0dGVybgorICAgIHsKKyAgICAgICAgaiA9IDE2OworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMTY7CisgICAgICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGEgPSAqYnIrKzsKKyAgICAgICAgICAgICAgICBiID0gKnRyKys7CisgICAgICAgICAgICAgICAgYyA9IHRsWzFdOworICAgICAgICAgICAgICAgICpjMSA9IChhICsgYiArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgYiA9IGJsWzFdOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYyArIDEpID4+IDE7IC8qIGMyICovCisgICAgICAgICAgICAgICAgYyA9IHRsWzI1XTsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGIgKyAxKSA+PiAxOyAvKiBjMyAqLworICAgICAgICAgICAgICAgIGIgPSB0clsyM107CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBjICsgMSkgPj4gMTsgLyogYzQgKi8KKyAgICAgICAgICAgICAgICBjID0gdGxbMjRdOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYiArIDEpID4+IDE7IC8qIGM1ICovCisgICAgICAgICAgICAgICAgYiA9ICpibCsrOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYyArIDEpID4+IDE7IC8qIGM2ICovCisgICAgICAgICAgICAgICAgYyA9ICp0bCsrOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYiArIDEpID4+IDE7IC8qIGM3ICovCisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBjICsgMSkgPj4gMTsgLyogYzggKi8KKworICAgICAgICAgICAgICAgIGMxICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgbGluZSwgcGl0Y2ggaXMgMjQKKyAgICAgICAgICAgIHRsICs9IDg7CisgICAgICAgICAgICB0ciArPSA4OworICAgICAgICAgICAgYmwgKz0gODsKKyAgICAgICAgICAgIGJyICs9IDg7CisgICAgICAgICAgICBjMSArPSA4OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBhc3N1bWluZyBjYW5kIGFsd2F5cyBoYXMgYSBwaXRjaCBvZiAyNCAqLworaW50IFNBVERfTUIodWludDggKmNhbmQsIHVpbnQ4ICpjdXIsIGludCBkbWluKQoreworICAgIGludCBjb3N0OworCisKKyAgICBkbWluID0gKGRtaW4gPDwgMTYpIHwgMjQ7CisgICAgY29zdCA9IEFWQ1NBRF9NYWNyb2Jsb2NrX0MoY2FuZCwgY3VyLCBkbWluLCBOVUxMKTsKKworICAgIHJldHVybiBjb3N0OworfQorCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9oZWFkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjZmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9oZWFkZXIuY3BwCkBAIC0wLDAgKzEsOTE3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisKKy8qKiBzZWUgc3ViY2xhdXNlIDcuNC4yLjEgKi8KKy8qIG5vIG5lZWQgZm9yIGNoZWNraW5nIHRoZSB2YWxpZCByYW5nZSAsIGFscmVhZHkgZG9uZSBpbiBTZXRFbmNvZGVQYXJhbSgpLAoraWYgd2UgaGF2ZSB0byBzZW5kIGFub3RoZXIgU1BTLCB0aGUgcmFuZ2VzIHNob3VsZCBiZSB2ZXJpZmllZCBmaXJzdCBiZWZvcmUKK3VzZXJzIGNhbGwgUFZBVkNFbmNvZGVTUFMoKSAqLworQVZDRW5jX1N0YXR1cyBFbmNvZGVTUFMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0gPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBBVkNWVUlQYXJhbXMgKnZ1aSA9ICYoc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzKTsKKyAgICBpbnQgaTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgLy9ERUJVR19MT0codXNlckRhdGEsQVZDX0xPR1RZUEVfSU5GTywiRW5jb2RlU1BTIiwtMSwtMSk7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCBzZXFQYXJhbS0+cHJvZmlsZV9pZGMpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQwX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQyX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQzX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDQsIDApOyAgLyogZm9yYmlkZGVuIHplcm8gYml0cyAqLworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpICAvKiB3ZSBjYW4gY2hlY2sgYWZ0ZXIgZWFjaCB3cml0ZSBhbHNvICovCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHNlcVBhcmFtLT5sZXZlbF9pZGMpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmIChzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID09IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCk7CisgICAgfQorICAgIGVsc2UgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyk7CisgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYyk7IC8qIHVwdG8gMzIgYml0cyAqLworICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2VxUGFyYW0tPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCk7IC8qIHVwdG8gMzIgYml0cyAqLworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSk7IC8qIHVwdG8gMzIgYml0cyAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+cGljX3dpZHRoX2luX21ic19taW51czEpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8qIGlmIGZyYW1lX21ic19vbmx5X2ZsYWcgaXMgMCwgdGhlbiB3cml0ZSwgbWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZnJhbWUgaGVyZSAqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9jcm9wcGluZ19mbGFnKTsKKyAgICBpZiAoc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfbGVmdF9vZmZzZXQpOworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0KTsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQpOworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpOworICAgIGlmIChzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgIHsKKyAgICAgICAgLyogbm90IHN1cHBvcnRlZCAqLworICAgICAgICAvL3JldHVybiBBVkNFTkNfU1BTX0ZBSUw7CisgICAgICAgIEVuY29kZVZVSShzdHJlYW0sIHZ1aSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEVuY29kZVZVSShBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgQVZDVlVJUGFyYW1zKiB2dWkpCit7CisgICAgaW50IHRlbXA7CisKKyAgICB0ZW1wID0gdnVpLT5hc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCB2dWktPmFzcGVjdF9yYXRpb19pZGMpOworICAgICAgICBpZiAodnVpLT5hc3BlY3RfcmF0aW9faWRjID09IDI1NSkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTYsIHZ1aS0+c2FyX3dpZHRoKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCB2dWktPnNhcl9oZWlnaHQpOworICAgICAgICB9CisgICAgfQorICAgIHRlbXAgPSB2dWktPm92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT5vdmVyc2Nhbl9hcHByb3ByaWF0ZV9mbGFnKTsKKyAgICB9CisgICAgdGVtcCA9IHZ1aS0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMywgdnVpLT52aWRlb19mb3JtYXQpOworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPnZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyk7CisgICAgICAgIHRlbXAgPSB2dWktPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWc7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgICAgICBpZiAodGVtcCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgdnVpLT5jb2xvdXJfcHJpbWFyaWVzKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHZ1aS0+bWF0cml4X2NvZWZmaWNpZW50cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGVtcCA9IHZ1aS0+Y2hyb21hX2xvY2F0aW9uX2luZm9fcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQpOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5jaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZCk7CisgICAgfQorCisgICAgdGVtcCA9IHZ1aS0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMzIsIHZ1aS0+bnVtX3VuaXRzX2luX3RpY2spOworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgdnVpLT50aW1lX3NjYWxlKTsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcpOworICAgIH0KKworICAgIHRlbXAgPSB2dWktPm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBFbmNvZGVIUkQoc3RyZWFtLCAmKHZ1aS0+bmFsX2hyZF9wYXJhbWV0ZXJzKSk7CisgICAgfQorICAgIHRlbXAgPSB2dWktPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBFbmNvZGVIUkQoc3RyZWFtLCAmKHZ1aS0+dmNsX2hyZF9wYXJhbWV0ZXJzKSk7CisgICAgfQorICAgIGlmICh2dWktPm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgfHwgdnVpLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT5sb3dfZGVsYXlfaHJkX2ZsYWcpOworICAgIH0KKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPnBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKTsKKyAgICB0ZW1wID0gdnVpLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+bW90aW9uX3ZlY3RvcnNfb3Zlcl9waWNfYm91bmRhcmllc19mbGFnKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bWF4X2J5dGVzX3Blcl9waWNfZGVub20pOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5tYXhfYml0c19wZXJfbWJfZGVub20pOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5sb2cyX21heF9tdl9sZW5ndGhfaG9yaXpvbnRhbCk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPmxvZzJfbWF4X212X2xlbmd0aF92ZXJ0aWNhbCk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPm1heF9kZWNfZnJhbWVfcmVvcmRlcmluZyk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nKTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgRW5jb2RlSFJEKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBBVkNIUkRQYXJhbXMqIGhyZCkKK3sKKyAgICBpbnQgaTsKKworICAgIHVlX3Yoc3RyZWFtLCBocmQtPmNwYl9jbnRfbWludXMxKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA0LCBocmQtPmJpdF9yYXRlX3NjYWxlKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA0LCBocmQtPmNwYl9zaXplX3NjYWxlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IChpbnQpaHJkLT5jcGJfY250X21pbnVzMTsgaSsrKQorICAgIHsKKyAgICAgICAgdWVfdihzdHJlYW0sIGhyZC0+Yml0X3JhdGVfdmFsdWVfbWludXMxW2ldKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIGhyZC0+Y3BiX3NpemVfdmFsdWVfbWludXMxW2ldKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIGhyZC0+Y2JyX2ZsYWdbaV0pOworICAgIH0KKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA1LCBocmQtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSk7CisgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNSwgaHJkLT5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA1LCBocmQtPmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMSk7CisgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNSwgaHJkLT50aW1lX29mZnNldF9sZW5ndGgpOworCisgICAgcmV0dXJuIDsKK30KKworCisKKy8qKiBzZWUgc3ViY2xhdXNlIDcuNC4yLjIgKi8KKy8qIG5vIG5lZWQgZm9yIGNoZWNraW5nIHRoZSB2YWxpZCByYW5nZSAsIGFscmVhZHkgZG9uZSBpbiBTZXRFbmNvZGVQYXJhbSgpLgorSWYgd2UgaGF2ZSB0byBzZW5kIGFub3RoZXIgU1BTLCB0aGUgcmFuZ2VzIHNob3VsZCBiZSB2ZXJpZmllZCBmaXJzdCBiZWZvcmUKK3VzZXJzIGNhbGwgUFZBVkNFbmNvZGVTUFMoKSovCitBVkNFbmNfU3RhdHVzIEVuY29kZVBQUyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgaW50IGksIGlHcm91cCwgbnVtQml0czsKKyAgICB1aW50IHRlbXA7CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBwaWNQYXJhbS0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSk7CisgICAgaWYgKHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlKTsKKyAgICAgICAgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlHcm91cCA9IDA7IGlHcm91cCA8PSAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaUdyb3VwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5ydW5fbGVuZ3RoX21pbnVzMVtpR3JvdXBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpR3JvdXAgPSAwOyBpR3JvdXAgPCAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaUdyb3VwKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT50b3BfbGVmdFtpR3JvdXBdKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPmJvdHRvbV9yaWdodFtpR3JvdXBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gMyB8fAorICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gNCB8fAorICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gNSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyk7CisgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKmlmKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA2KSovCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSk7CisKKyAgICAgICAgICAgIG51bUJpdHMgPSAwOy8qIGNlaWwobG9nMihudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSsxKSkgYml0cyAqLworICAgICAgICAgICAgaSA9IHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsKKyAgICAgICAgICAgIHdoaWxlIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBudW1CaXRzKys7CisgICAgICAgICAgICAgICAgaSA+Pj0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSAoaW50KXBpY1BhcmFtLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbnVtQml0cywgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMiwgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNik7CisgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2KTsKKyAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgcGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQpOworCisgICAgdGVtcCA9IHBpY1BhcmFtLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA8PCAyOworICAgIHRlbXAgfD0gKHBpY1BhcmFtLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPDwgMSk7CisgICAgdGVtcCB8PSBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMywgdGVtcCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMyAqLworQVZDRW5jX1N0YXR1cyBFbmNvZGVTbGljZUhlYWRlcihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNQaWNQYXJhbVNldCAqY3VyclBQUyA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBpbnQgc2xpY2VfdHlwZSwgdGVtcCwgaTsKKyAgICBpbnQgbnVtX2JpdHM7CisKKyAgICBudW1fYml0cyA9IChzdHJlYW0tPndyaXRlX3BvcyA8PCAzKSAtIHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmZpcnN0X21iX2luX3NsaWNlKTsKKworICAgIHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKworICAgIGlmICh2aWRlby0+bWJOdW0gPT0gMCkgLyogZmlyc3QgbWIgaW4gZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+c2xpY2VfdHlwZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZV90eXBlKTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnBpY19wYXJhbWV0ZXJfc2V0X2lkKTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGN1cnJTUFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0LCBzbGljZUhkci0+ZnJhbWVfbnVtKTsKKworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvKiBpZiBmcmFtZV9tYnNfb25seV9mbGFnIGlzIDAsIGVuY29kZSBmaWVsZF9waWNfZmxhZywgYm90dG9tX2ZpZWxkX2ZsYWcgaGVyZSAqLworCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+aWRyX3BpY19pZCk7CisgICAgfQorCisgICAgaWYgKGN1cnJTUFMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgY3VyclNQUy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYik7CisKKyAgICAgICAgaWYgKGN1cnJQUFMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSk7IC8qIDMyIGJpdHMgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlID09IDEgJiYgIWN1cnJTUFMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdKTsgICAgLyogMzIgYml0cyAqLworICAgICAgICBpZiAoY3VyclBQUy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0pOyAvKiAzMiBiaXRzICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5yZWR1bmRhbnRfcGljX2NudCk7CisgICAgfQorCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSB8fCBzbGljZV90eXBlID09IEFWQ19TUF9TTElDRSB8fCBzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKTsKKyAgICAgICAgaWYgKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgLyogd2Ugc2hvdWxkbid0IGVudGVyIHRoaXMgcGFydCBhdCBhbGwgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSk7CisgICAgICAgICAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKCkgKi8KKyAgICBzdGF0dXMgPSByZWZfcGljX2xpc3RfcmVvcmRlcmluZyh2aWRlbywgc3RyZWFtLCBzbGljZUhkciwgc2xpY2VfdHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKChjdXJyUFBTLT53ZWlnaHRlZF9wcmVkX2ZsYWcgJiYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UgfHwgc2xpY2VfdHlwZSA9PSBBVkNfU1BfU0xJQ0UpKSB8fAorICAgICAgICAgICAgKGN1cnJQUFMtPndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJiBzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKSkKKyAgICB7CisgICAgICAgIC8vICAgICAgcHJlZF93ZWlnaHRfdGFibGUoKTsgLy8gbm90IHN1cHBvcnRlZCAhIQorICAgICAgICByZXR1cm4gQVZDRU5DX1BSRURfV0VJR0hUX1RBQl9GQUlMOworICAgIH0KKworICAgIGlmICh2aWRlby0+bmFsX3JlZl9pZGMgIT0gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IGRlY19yZWZfcGljX21hcmtpbmcodmlkZW8sIHN0cmVhbSwgc2xpY2VIZHIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJQUFMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAmJiBzbGljZV90eXBlICE9IEFWQ19JX1NMSUNFICYmIHNsaWNlX3R5cGUgIT0gQVZDX1NJX1NMSUNFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19DQUJBQ19GQUlMOworICAgICAgICAvKiAgICAgIHVlX3Yoc3RyZWFtLCYoc2xpY2VIZHItPmNhYmFjX2luaXRfaWRjKSk7CisgICAgICAgICAgICAgICAgaWYoc2xpY2VIZHItPmNhYmFjX2luaXRfaWRjID4gMil7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgISEhIQorICAgICAgICAgICAgICAgIH0qLworICAgIH0KKworICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+c2xpY2VfcXBfZGVsdGEpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19TUF9TTElDRSB8fCBzbGljZV90eXBlID09IEFWQ19TSV9TTElDRSkKKyAgICB7CisgICAgICAgIGlmIChzbGljZV90eXBlID09IEFWQ19TUF9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPnNwX2Zvcl9zd2l0Y2hfZmxhZyk7CisgICAgICAgICAgICAvKiBpZiBzcF9mb3Jfc3dpdGNoX2ZsYWcgaXMgMCwgUCBtYWNyb2Jsb2NrcyBpbiBTUCBzbGljZSBpcyBkZWNvZGVkIHVzaW5nCisgICAgICAgICAgICBTUCBkZWNvZGluZyBwcm9jZXNzIGZvciBub24tc3dpdGNoaW5nIHBpY3R1cmVzIGluIDguNi4xICovCisgICAgICAgICAgICAvKiBlbHNlLCBQIG1hY3JvYmxvY2tzIGluIFNQIHNsaWNlIGlzIGRlY29kZWQgdXNpbmcgU1AgYW5kIFNJIGRlY29kaW5nCisgICAgICAgICAgICBwcm9jZXNzIGZvciBzd2l0Y2hpbmcgcGljdHVyZSBpbiA4LjYuMiAqLworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+c2xpY2VfcXNfZGVsdGEpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJQUFMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnKQorICAgIHsKKworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjKTsKKworICAgICAgICBpZiAoc2xpY2VIZHItPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIpOworCisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPnNsaWNlX2JldGFfb2Zmc2V0X2Rpdl8yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJQUFMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCAmJiBjdXJyUFBTLT5zbGljZV9ncm91cF9tYXBfdHlwZSA+PSAzCisgICAgICAgICAgICAmJiBjdXJyUFBTLT5zbGljZV9ncm91cF9tYXBfdHlwZSA8PSA1KQorICAgIHsKKyAgICAgICAgLyogQ2VpbChMb2cyKFBpY1NpemVJbk1hcFVuaXRzLyhmbG9hdClTbGljZUdyb3VwQ2hhbmdlUmF0ZSArIDEpKSAqLworICAgICAgICB0ZW1wID0gdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzIC8gdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlOworICAgICAgICBpZiAodmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzICUgdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wKys7CisgICAgICAgIH0KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlICh0ZW1wID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA+Pj0gMTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGksIHNsaWNlSGRyLT5zbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUpOworICAgIH0KKworCisgICAgZW5jdmlkLT5yYXRlQ3RybC0+TnVtYmVyb2ZIZWFkZXJCaXRzICs9IChzdHJlYW0tPndyaXRlX3BvcyA8PCAzKSAtIHN0cmVhbS0+Yml0X2xlZnQgLSBudW1fYml0czsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjMuMSAqLworQVZDRW5jX1N0YXR1cyByZWZfcGljX2xpc3RfcmVvcmRlcmluZyhBVkNDb21tb25PYmogKnZpZGVvLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyLCBpbnQgc2xpY2VfdHlwZSkKK3sKKyAgICAodm9pZCkodmlkZW8pOworICAgIGludCBpOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICBpZiAoc2xpY2VfdHlwZSAhPSBBVkNfSV9TTElDRSAmJiBzbGljZV90eXBlICE9IEFWQ19TSV9TTElDRSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wwKTsKKyAgICAgICAgaWYgKHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wwKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDBbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGNoZWNrIHNob3VsZCBiZSBpbiBJbml0U2xpY2UoKSwgaWYgd2UgZXZlciB1c2UgaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyppZihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wwW2ldID4gdmlkZW8tPk1heFBpY051bS8yIC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1JFRl9QSUNfUkVPUkRFUl9GQUlMOyAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wwW2ldID4gdmlkZW8tPk1heFBpY051bS8yIC0yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1JFRl9QSUNfUkVPUkRFUl9GQUlMOyAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfSovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5sb25nX3Rlcm1fcGljX251bV9sMFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDBbaV0gIT0gMworICAgICAgICAgICAgICAgICAgICAmJiBpIDw9IChpbnQpc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKyAxKSA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMSk7CisgICAgICAgIGlmIChzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMSkKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0pOworICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wxW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBjaGVjayBzaG91bGQgYmUgaW4gSW5pdFNsaWNlKCkgaWYgd2UgZXZlciB1c2UgaXQKKyAgICAgICAgICAgICAgICAgICAgaWYoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMVtpXSA+IHZpZGVvLT5NYXhQaWNOdW0vMiAtMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19SRUZfUElDX1JFT1JERVJfRkFJTDsgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMVtpXSA+IHZpZGVvLT5NYXhQaWNOdW0vMiAtMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19SRUZfUElDX1JFT1JERVJfRkFJTDsgLy8gb3V0IG9mIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIH0qLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bG9uZ190ZXJtX3BpY19udW1fbDFbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wxW2ldICE9IDMKKyAgICAgICAgICAgICAgICAgICAgJiYgaSA8PSAoaW50KXNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICsgMSkgOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjMuMyAqLworQVZDRW5jX1N0YXR1cyBkZWNfcmVmX3BpY19tYXJraW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIpCit7CisgICAgaW50IGk7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKworICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyk7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcpOworICAgICAgICBpZiAoc2xpY2VIZHItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyA9PSAwKSAvKiB1c2VkIGZvciBzaG9ydC10ZXJtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5NYXhMb25nVGVybUZyYW1lSWR4ID0gLTE7IC8qIG5vIGxvbmctdGVybSBmcmFtZSBpbmR4ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiB1c2VkIGZvciBsb25nLXRlcm0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPk1heExvbmdUZXJtRnJhbWVJZHggPSAwOworICAgICAgICAgICAgdmlkZW8tPkxvbmdUZXJtRnJhbWVJZHggPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnKTsgLyogZGVmYXVsdCB0byB6ZXJvICovCisgICAgICAgIGlmIChzbGljZUhkci0+YWRhcHRpdmVfcmVmX3BpY19tYXJraW5nX21vZGVfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0pOworICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5sb25nX3Rlcm1fcGljX251bVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gMyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9mcmFtZV9pZHhbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPm1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSAhPSAwICYmIGkgPCBNQVhfREVDX1JFRl9QSUNfTUFSS0lORyk7CisgICAgICAgICAgICBpZiAoaSA+PSBNQVhfREVDX1JFRl9QSUNfTUFSS0lORyAmJiBzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0RFQ19SRUZfUElDX01BUktfRkFJTDsgLyogd2UncmUgc2NyZXdlZCEhLCBub3QgZW5vdWdoIG1lbW9yeSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIHN1YmNsYXVzZSA4LjIuMSBEZWNvZGluZyBwcm9jZXNzIGZvciBwaWN0dXJlIG9yZGVyIGNvdW50LgorU2VlIGFsc28gUG9zdFBPQygpIGZvciBpbml0aWFsaXphdGlvbiBvZiBzb21lIHZhcmlhYmxlcy4gKi8KK0FWQ0VuY19TdGF0dXMgSW5pdFBPQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDRnJhbWVJTyAgKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIGludCBpOworCisgICAgc3dpdGNoIChjdXJyU1BTLT5waWNfb3JkZXJfY250X3R5cGUpCisgICAgeworICAgICAgICBjYXNlIDA6IC8qIFBPQyBNT0RFIDAgLCBzdWJjbGF1c2UgOC4yLjEuMSAqLworICAgICAgICAgICAgLyogZW5jb2RpbmcgcGFydCAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSBjdXJySW5wdXQtPmRpc3Bfb3JkZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoY3VycklucHV0LT5kaXNwX29yZGVyIDwgZW5jdmlkLT5kaXNwT3JkUE9DUmVmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiAtPSB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgPSBjdXJySW5wdXQtPmRpc3Bfb3JkZXIgLSBlbmN2aWQtPmRpc3BPcmRQT0NSZWY7CisgICAgICAgICAgICB3aGlsZSAoc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiID49IHZpZGVvLT5NYXhQaWNPcmRlckNudExzYikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgLT0gdmlkZW8tPk1heFBpY09yZGVyQ250THNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVjb2RpbmcgcGFydCAqLworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBNU0JzIG9mIGN1cnJlbnQgcGljdHVyZSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgIDwgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgICYmCisgICAgICAgICAgICAgICAgICAgICh2aWRlby0+cHJldlBpY09yZGVyQ250THNiIC0gc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiKSAgPj0gKHZpZGVvLT5NYXhQaWNPcmRlckNudExzYiAvIDIpKQorICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudE1zYiA9IHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgKyB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgID4gIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgICYmCisgICAgICAgICAgICAgICAgICAgICAoc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiIC0gdmlkZW8tPnByZXZQaWNPcmRlckNudExzYikgID4gKHZpZGVvLT5NYXhQaWNPcmRlckNudExzYiAvIDIpKQorICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudE1zYiA9IHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgLSB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250TXNiID0gdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYjsKKworICAgICAgICAgICAgLyogSlZULUkwMTAgcGFnZSA4MSBpcyBkaWZmZXJlbnQgZnJvbSBKTTcuMyAqLworICAgICAgICAgICAgaWYgKCFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcgfHwgIXNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5QaWNPcmRlckNudE1zYiArIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+VG9wRmllbGRPcmRlckNudCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5QaWNPcmRlckNudE1zYiArIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gQVZDX01JTih2aWRlby0+VG9wRmllbGRPcmRlckNudCwgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20gPSAwOyAvKiBkZWZhdWx0ZWQgdG8gemVybyAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiBQT0MgTU9ERSAxLCBzdWJjbGF1c2UgOC4yLjEuMiAqLworICAgICAgICAgICAgLyogY2FsY3VsYXRlIEZyYW1lTnVtT2Zmc2V0ICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IGN1cnJJbnB1dC0+ZGlzcF9vcmRlcjsgIC8qIHJlc2V0IHRoZSByZWZlcmVuY2UgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPnByZXZGcmFtZU51bSA+IHNsaWNlSGRyLT5mcmFtZV9udW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCArIHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2FsY3VsYXRlIGFic0ZyYW1lTnVtICovCisgICAgICAgICAgICBpZiAoY3VyclNQUy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+YWJzRnJhbWVOdW0gPSB2aWRlby0+RnJhbWVOdW1PZmZzZXQgKyBzbGljZUhkci0+ZnJhbWVfbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5hYnNGcmFtZU51bSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2aWRlby0+YWJzRnJhbWVOdW0gPiAwICYmIHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5hYnNGcmFtZU51bS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBkZXJpdmUgcGljT3JkZXJDbnRDeWNsZUNudCBhbmQgZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+YWJzRnJhbWVOdW0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5waWNPcmRlckNudEN5Y2xlQ250ID0gKHZpZGVvLT5hYnNGcmFtZU51bSAtIDEpIC8gY3VyclNQUy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZnJhbWVOdW1JblBpY09yZGVyQ250Q3ljbGUgPSAodmlkZW8tPmFic0ZyYW1lTnVtIC0gMSkgJSBjdXJyU1BTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVyaXZlIGV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlLCB0aGlzIHZhbHVlIGNhbiBiZSBjb21wdXRlZCB1cCBmcm9udC4gKi8KKyAgICAgICAgICAgIHZpZGVvLT5leHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCljdXJyU1BTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlICs9IGN1cnJTUFMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVyaXZlIGV4cGVjdGVkUGljT3JkZXJDbnQgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+YWJzRnJhbWVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgPSB2aWRlby0+cGljT3JkZXJDbnRDeWNsZUNudCAqIHZpZGVvLT5leHBlY3RlZERlbHRhUGVyUGljT3JkZXJDbnRDeWNsZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHZpZGVvLT5mcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ICs9IGN1cnJTUFMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgVG9wRmllbGRPcmRlckNudCBhbmQgQm90dG9tRmllbGRPcmRlckNudCAqLworICAgICAgICAgICAgLyogZW5jb2RpbmcgcGFydCAqLworICAgICAgICAgICAgaWYgKCFjdXJyU1BTLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IGN1cnJJbnB1dC0+ZGlzcF9vcmRlciAtIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiAtIHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250OworCisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljUGFyYW1zLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICYmICFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9IHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOyAvKiBzaG91bGQgYmUgY2FsY3VsYXRlZCBmcm9tIGN1cnJJbnB1dC0+Ym90dG9tX2ZpZWxkLT5kaXNwX29yZGVyICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gPSBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF07CisgICAgICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+VG9wRmllbGRPcmRlckNudCArIGN1cnJTUFMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdOworCisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gQVZDX01JTih2aWRlby0+VG9wRmllbGRPcmRlckNudCwgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgPSB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKyBjdXJyU1BTLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSAyOiAvKiBQT0MgTU9ERSAyLCBzdWJjbGF1c2UgOC4yLjEuMyAqLworICAgICAgICAgICAgLyogZGVjb2Rpbmcgb3JkZXIgbXVzdCBiZSB0aGUgc2FtZSBhcyBkaXNwbGF5IG9yZGVyICovCisgICAgICAgICAgICAvKiB3ZSBkb24ndCBjaGVjayBmb3IgdGhhdC4gVGhlIGRlY29kZXIgd2lsbCBqdXN0IG91dHB1dCBpbiBkZWNvZGluZyBvcmRlci4gKi8KKyAgICAgICAgICAgIC8qIENoZWNrIGZvciAyIGNvbnNlY3V0aXZlIG5vbi1yZWZlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3JlZl9pZGMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jdmlkLT5kaXNwT3JkUE9DUmVmID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0NPTlNFQ1VUSVZFX05PTlJFRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmID0gMTsgIC8qIGFjdCBhcyBhIGZsYWcgZm9yIG5vbiByZWYgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSAwOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5wcmV2RnJhbWVOdW0gPiBzbGljZUhkci0+ZnJhbWVfbnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgKyB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlcml2ZSB0ZW1wUGljT3JkZXJDbnQsIHdlIGp1c3QgdXNlIFBpY09yZGVyQ250ICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+bmFsX3JlZl9pZGMgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSAyICogKHZpZGVvLT5GcmFtZU51bU9mZnNldCArIHNsaWNlSGRyLT5mcmFtZV9udW0pIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSAyICogKHZpZGVvLT5GcmFtZU51bU9mZnNldCArIHNsaWNlSGRyLT5mcmFtZV9udW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVyaXZlIFRvcEZpZWxkT3JkZXJDbnQgYW5kIEJvdHRvbUZpZWxkT3JkZXJDbnQgKi8KKyAgICAgICAgICAgIGlmIChzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1BPQ19GQUlMOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyoqIHNlZSBzdWJjbGF1c2UgOC4yLjEgKi8KK0FWQ0VuY19TdGF0dXMgUG9zdFBPQyhBVkNDb21tb25PYmogKnZpZGVvKQoreworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworCisgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IHNsaWNlSGRyLT5mcmFtZV9udW07CisKKyAgICBzd2l0Y2ggKGN1cnJTUFMtPnBpY19vcmRlcl9jbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgMDogLyogc3ViY2xhdXNlIDguMi4xLjEgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWVtX21ncl9jdHJsX2VxXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgPSB2aWRlby0+UGljT3JkZXJDbnRNc2I7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiA9IHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6ICAvKiBzdWJjbGF1c2UgOC4yLjEuMiBhbmQgOC4yLjEuMyAqLworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAodmlkZW8tPm1lbV9tZ3JfY3RybF9lcV81KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+RnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbml0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU4YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwCkBAIC0wLDAgKzEsODk5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisKKyNkZWZpbmUgTE9HMl9NQVhfRlJBTUVfTlVNX01JTlVTNCAgIDEyICAgLyogMTIgZGVmYXVsdCAqLworI2RlZmluZSBTTElDRV9HUk9VUF9DSEFOR0VfQ1lDTEUgICAgMSAgICAvKiBkZWZhdWx0ICovCisKKy8qIGluaXRpYWxpemVkIHZhcmlhYmxlcyB0byBiZSB1c2VkIGluIFNQUyovCitBVkNFbmNfU3RhdHVzICBTZXRFbmNvZGVQYXJhbShBVkNIYW5kbGUqIGF2Y0hhbmRsZSwgQVZDRW5jUGFyYW1zKiBlbmNQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGV4dFNQUywgdm9pZCogZXh0UFBTKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0gPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0gPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB2b2lkICp1c2VyRGF0YSA9IGF2Y0hhbmRsZS0+dXNlckRhdGE7CisgICAgaW50IGlpLCBtYXhGcmFtZU51bTsKKworICAgIEFWQ1NlcVBhcmFtU2V0KiBleHRTID0gTlVMTDsKKyAgICBBVkNQaWNQYXJhbVNldCogZXh0UCA9IE5VTEw7CisKKyAgICBpZiAoZXh0U1BTKSBleHRTID0gKEFWQ1NlcVBhcmFtU2V0KikgZXh0U1BTOworICAgIGlmIChleHRQUFMpIGV4dFAgPSAoQVZDUGljUGFyYW1TZXQqKSBleHRQUFM7CisKKyAgICAvKiBUaGlzIHBhcnQgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGVuY29kaW5nIG9wdGlvbnMgdGhpcworICAgIGxpYnJhcnkgc3VwcG9ydHMgaW4gc2VxUGFyYW0sIHBpY1BhcmFtIGFuZCBzbGljZUhkciBzdHJ1Y3R1cmVzIGFuZAorICAgIGFsc28gY29weSB0aGUgdmFsdWVzIGZyb20gdGhlIGVuY1BhcmFtIGludG8gdGhlIGFib3ZlIDMgc3RydWN0dXJlcy4KKworICAgIFNvbWUgcGFyYW1ldGVycyB3aWxsIGJlIGFzc2lnbmVkIGxhdGVyIHdoZW4gd2UgZW5jb2RlIFNQUyBvciBQUFMgc3VjaCBhcworICAgIHRoZSBzZXFfcGFyYW1ldGVyX2lkIG9yIHBpY19wYXJhbWV0ZXJfaWQuIEFsc28gc29tZSBvZiB0aGUgc2xpY2UgcGFyYW1ldGVycworICAgIGhhdmUgdG8gYmUgcmUtYXNzaWduZWQgcGVyIHNsaWNlIGJhc2lzIHN1Y2ggYXMgZnJhbWVfbnVtLCBzbGljZV90eXBlLAorICAgIGZpcnN0X21iX2luX3NsaWNlLCBwaWNfb3JkZXJfY250X2xzYiwgc2xpY2VfcXBfZGVsdGEsIHNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSAqLworCisgICAgLyogcHJvZmlsZV9pZGMsIGNvbnN0cmFpbmVkX3NldHhfZmxhZyBhbmQgbGV2ZWxfaWRjIGlzIHNldCBieSBWZXJpZnlQcm9maWxlKCksCisgICAgYW5kIFZlcmlmeUxldmVsKCkgZnVuY3Rpb25zIGxhdGVyLiAqLworCisgICAgZW5jdmlkLT5mdWxsc2VhcmNoX2VuYWJsZSA9IGVuY1BhcmFtLT5mdWxsc2VhcmNoOworCisgICAgZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9ICgoZW5jUGFyYW0tPm91dF9vZl9iYW5kX3BhcmFtX3NldCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFKTsKKworICAgIC8qIHBhcmFtZXRlcnMgZGVyaXZlZCBmcm9tIHRoZSB0aGUgZW5jUGFyYW0gdGhhdCBhcmUgdXNlZCBpbiBTUFMgKi8KKyAgICBpZiAoZXh0UykKKyAgICB7CisgICAgICAgIHZpZGVvLT5NYXhQaWNPcmRlckNudExzYiA9ICAxIDw8IChleHRTLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KTsKKyAgICAgICAgdmlkZW8tPlBpY1dpZHRoSW5NYnMgPSBleHRTLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDE7CisgICAgICAgIHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzID0gZXh0Uy0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSA7CisgICAgICAgIHZpZGVvLT5GcmFtZUhlaWdodEluTWJzID0gKDIgLSBleHRTLT5mcmFtZV9tYnNfb25seV9mbGFnKSAqIHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzIDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW8tPk1heFBpY09yZGVyQ250THNiID0gIDEgPDwgKGVuY1BhcmFtLT5sb2cyX21heF9wb2NfbHNiX21pbnVzXzQgKyA0KTsKKyAgICAgICAgdmlkZW8tPlBpY1dpZHRoSW5NYnMgPSAoZW5jUGFyYW0tPndpZHRoICsgMTUpID4+IDQ7IC8qIHJvdW5kIGl0IHRvIG11bHRpcGxlIG9mIDE2ICovCisgICAgICAgIHZpZGVvLT5GcmFtZUhlaWdodEluTWJzID0gKGVuY1BhcmFtLT5oZWlnaHQgKyAxNSkgPj4gNDsgLyogcm91bmQgaXQgdG8gbXVsdGlwbGUgb2YgMTYgKi8KKyAgICAgICAgdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgPSB2aWRlby0+RnJhbWVIZWlnaHRJbk1iczsKKyAgICB9CisKKyAgICB2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiAxNiA7CisgICAgaWYgKHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgKyAzMiA+IDB4RkZGRikKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsgLy8gd2UgdXNlIDItYnl0ZXMgZm9yIHBpdGNoCisgICAgfQorCisgICAgdmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzQyA9IHZpZGVvLT5QaWNXaWR0aEluTWJzICogOCA7CisgICAgdmlkZW8tPlBpY0hlaWdodEluTWJzID0gdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnM7CisgICAgdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyA7CisgICAgdmlkZW8tPlBpY0hlaWdodEluU2FtcGxlc0wgPSB2aWRlby0+UGljSGVpZ2h0SW5NYnMgKiAxNjsKKyAgICB2aWRlby0+UGljSGVpZ2h0SW5TYW1wbGVzQyA9IHZpZGVvLT5QaWNIZWlnaHRJbk1icyAqIDg7CisgICAgdmlkZW8tPlBpY1NpemVJbk1icyA9IHZpZGVvLT5QaWNXaWR0aEluTWJzICogdmlkZW8tPlBpY0hlaWdodEluTWJzOworCisgICAgaWYgKCFleHRTICYmICFleHRQKQorICAgIHsKKyAgICAgICAgbWF4RnJhbWVOdW0gPSAoZW5jUGFyYW0tPmlkcl9wZXJpb2QgPT0gLTEpID8gKDEgPDwgMTYpIDogZW5jUGFyYW0tPmlkcl9wZXJpb2Q7CisgICAgICAgIGlpID0gMDsKKyAgICAgICAgd2hpbGUgKG1heEZyYW1lTnVtID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWkrKzsKKyAgICAgICAgICAgIG1heEZyYW1lTnVtID4+PSAxOworICAgICAgICB9CisgICAgICAgIGlmIChpaSA8IDQpIGlpID0gNDsKKyAgICAgICAgZWxzZSBpZiAoaWkgPiAxNikgaWkgPSAxNjsKKworICAgICAgICBzZXFQYXJhbS0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IGlpIC0gNDsvL0xPRzJfTUFYX0ZSQU1FX05VTV9NSU5VUzQ7IC8qIGRlZmF1bHQgKi8KKworICAgICAgICB2aWRlby0+TWF4RnJhbWVOdW0gPSAxIDw8IGlpOyAvLyhMT0cyX01BWF9GUkFNRV9OVU1fTUlOVVM0ICsgNCk7IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgdmlkZW8tPk1heFBpY051bSA9IHZpZGVvLT5NYXhGcmFtZU51bTsKKworICAgICAgICAvKioqKioqKioqKioqKiBzZXQgdGhlIFNQUyAqKioqKioqKioqKioqKioqKioqLworICAgICAgICBzZXFQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSAwOyAvKiBzdGFydCB3aXRoIHplcm8gKi8KKyAgICAgICAgLyogUE9DICovCisgICAgICAgIHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPSBlbmNQYXJhbS0+cG9jX3R5cGU7IC8qIFBPQyB0eXBlICovCisgICAgICAgIGlmIChlbmNQYXJhbS0+cG9jX3R5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC8qZW5jUGFyYW0tPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNDwwIHx8IChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSovCisgICAgICAgICAgICAgICAgZW5jUGFyYW0tPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNCA+IDEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9QT0NfTFNCOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VxUGFyYW0tPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9IGVuY1BhcmFtLT5sb2cyX21heF9wb2NfbHNiX21pbnVzXzQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZW5jUGFyYW0tPnBvY190eXBlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9IGVuY1BhcmFtLT5kZWx0YV9wb2NfemVyb19mbGFnOworICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPSBlbmNQYXJhbS0+b2Zmc2V0X3BvY19ub25fcmVmOworICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCA9IGVuY1BhcmFtLT5vZmZzZXRfdG9wX2JvdHRvbTsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlID0gZW5jUGFyYW0tPm51bV9yZWZfaW5fY3ljbGU7CisgICAgICAgICAgICBpZiAoZW5jUGFyYW0tPm9mZnNldF9wb2NfcmVmID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lOyBpaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpaV0gPSBlbmNQYXJhbS0+b2Zmc2V0X3BvY19yZWZbaWldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lID4gMTYgfHwgZW5jUGFyYW0tPm51bV9yZWZfZnJhbWUgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfTlVNX1JFRjsKKyAgICAgICAgfQorICAgICAgICBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMgPSBlbmNQYXJhbS0+bnVtX3JlZl9mcmFtZTsgLyogbnVtIHJlZmVyZW5jZSBmcmFtZSByYW5nZSAwLi4uMTYqLworICAgICAgICBzZXFQYXJhbS0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSA9IHZpZGVvLT5QaWNXaWR0aEluTWJzIC0gMTsKKyAgICAgICAgc2VxUGFyYW0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzIC0gMTsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcgPSBUUlVFOworICAgICAgICBzZXFQYXJhbS0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wcGluZ19mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoZXh0UykgLy8gdXNlIGV4dGVybmFsIFNQUyBhbmQgUFBTCisgICAgeworICAgICAgICBzZXFQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBleHRTLT5zZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICAgICAgc2VxUGFyYW0tPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSBleHRTLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0OworICAgICAgICB2aWRlby0+TWF4RnJhbWVOdW0gPSAxIDw8IChleHRTLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCk7CisgICAgICAgIHZpZGVvLT5NYXhQaWNOdW0gPSB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgIGlmIChlbmNQYXJhbS0+aWRyX3BlcmlvZCA+IChpbnQpKHZpZGVvLT5NYXhGcmFtZU51bSkgfHwgKGVuY1BhcmFtLT5pZHJfcGVyaW9kID09IC0xKSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jUGFyYW0tPmlkcl9wZXJpb2QgPSAoaW50KXZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgfQorCisgICAgICAgIHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPSBleHRTLT5waWNfb3JkZXJfY250X3R5cGU7CisgICAgICAgIGlmIChzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgvKmV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDwwIHx8IChubyBuZWVkIGl0J3MgdW5zaWduZWQpKi8KKyAgICAgICAgICAgICAgICBleHRTLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPiAxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfUE9DX0xTQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcVBhcmFtLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPSBleHRTLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgPSBleHRTLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljID0gZXh0Uy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQgPSBleHRTLT5vZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7CisgICAgICAgICAgICBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSA9IGV4dFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisgICAgICAgICAgICBpZiAoZXh0Uy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludCkgZXh0Uy0+bnVtX3JlZl9mcmFtZXM7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2lpXSA9IGV4dFMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2lpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lICovCisgICAgICAgIGlmIChleHRTLT5udW1fcmVmX2ZyYW1lcyA+IDE2IC8qfHwgZXh0Uy0+bnVtX3JlZl9mcmFtZXM8MCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkqLykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX05VTV9SRUY7CisgICAgICAgIH0KKyAgICAgICAgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzID0gZXh0Uy0+bnVtX3JlZl9mcmFtZXM7IC8qIG51bSByZWZlcmVuY2UgZnJhbWUgcmFuZ2UgMC4uLjE2Ki8KKyAgICAgICAgc2VxUGFyYW0tPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyA9IGV4dFMtPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZzsKKyAgICAgICAgc2VxUGFyYW0tPnBpY193aWR0aF9pbl9tYnNfbWludXMxID0gZXh0Uy0+cGljX3dpZHRoX2luX21ic19taW51czE7CisgICAgICAgIHNlcVBhcmFtLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPSBleHRTLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czE7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnID0gZXh0Uy0+ZnJhbWVfbWJzX29ubHlfZmxhZzsKKyAgICAgICAgaWYgKGV4dFMtPmZyYW1lX21ic19vbmx5X2ZsYWcgIT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgICAgIHNlcVBhcmFtLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gZXh0Uy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZzsKKyAgICAgICAgaWYgKGV4dFMtPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgIT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gZXh0Uy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgPSBleHRTLT5mcmFtZV9jcm9wcGluZ19mbGFnIDsKKyAgICAgICAgaWYgKGV4dFMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgIT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX3RvcF9vZmZzZXQgPSAwOworICAgICAgICBzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZXh0Uy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgICAgICBpZiAoZXh0Uy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoJihzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnMpLCAmKGV4dFMtPnZ1aV9wYXJhbWV0ZXJzKSwgc2l6ZW9mKEFWQ1ZVSVBhcmFtcykpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKiogbm93IFBQUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKCFleHRQICYmICFleHRTKQorICAgIHsKKyAgICAgICAgcGljUGFyYW0tPnBpY19wYXJhbWV0ZXJfc2V0X2lkID0gKHVpbnQpKC0xKTsgLyogc3RhcnQgd2l0aCB6ZXJvICovCisgICAgICAgIHBpY1BhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9ICh1aW50KSgtMSk7IC8qIHN0YXJ0IHdpdGggemVybyAqLworICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID0gMDsgLyogZGVmYXVsdCB0byBDQVZMQyAqLworICAgICAgICBwaWNQYXJhbS0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyA9IDA7IC8qIGRlZmF1bHQgZm9yIG5vdywgd2lsbCBuZWVkIGl0IGZvciBCLXNsaWNlICovCisgICAgICAgIC8qIEZNTyAqLworICAgICAgICBpZiAoZW5jUGFyYW0tPm51bV9zbGljZV9ncm91cCA8IDEgfHwgZW5jUGFyYW0tPm51bV9zbGljZV9ncm91cCA+IE1BWF9OVU1fU0xJQ0VfR1JPVVApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9OVU1fU0xJQ0VHUk9VUDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPSBlbmNQYXJhbS0+bnVtX3NsaWNlX2dyb3VwIC0gMTsKKworICAgICAgICBpZiAocGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID0gZW5jUGFyYW0tPmZtb190eXBlOworICAgICAgICAgICAgc3dpdGNoIChlbmNQYXJhbS0+Zm1vX3R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPD0gKGludClwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV0gPSBlbmNQYXJhbS0+cnVuX2xlbmd0aF9taW51czFbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludClwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT50b3BfbGVmdFtpaV0gPSBlbmNQYXJhbS0+dG9wX2xlZnRbaWldOworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPmJvdHRvbV9yaWdodFtpaV0gPSBlbmNQYXJhbS0+Ym90dG9tX3JpZ2h0W2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY1BhcmFtLT5jaGFuZ2VfZGlyX2ZsYWcgPT0gQVZDX09OKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoLyplbmNQYXJhbS0+Y2hhbmdlX3JhdGVfbWludXMxIDwgMCB8fCAobm8gbmVlZCBpdCdzIHVuc2lnbmVkKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW0tPmNoYW5nZV9yYXRlX21pbnVzMSA+IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9DSEFOR0VfUkFURTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxID0gZW5jUGFyYW0tPmNoYW5nZV9yYXRlX21pbnVzMTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlID0gcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSArIDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnBpY19zaXplX2luX21hcF91bml0c19taW51czEgPSB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLSAxOworCisgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCAqLworICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgPSAodWludCopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZih1aW50KSAqIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cywgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY1BhcmFtLT5zbGljZV9ncm91cCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWRbaWldID0gZW5jUGFyYW0tPnNsaWNlX2dyb3VwW2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfRk1PX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPSBlbmNQYXJhbS0+bnVtX3JlZl9mcmFtZSAtIDE7IC8qIGFzc3VtZSBmcmFtZSBvbmx5ICovCisgICAgICAgIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gMDsgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfcHJlZF9mbGFnID0gMDsgLyogbm8gd2VpZ2h0ZWQgcHJlZGljdGlvbiBzdXBwb3J0ZWQgKi8KKyAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPSAwOyAvKiByYW5nZSAwLDEsMiAqLworICAgICAgICBpZiAoLypwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA8IDAgfHwgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA+IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfV0VJR0hURURfQklQUkVEX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPSAwOyAvKiBkZWZhdWx0LCB3aWxsIGJlIGNoYW5nZWQgYXQgc2xpY2UgbGV2ZWwgYW55d2F5ICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA+IDI1KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOSVRfUVBfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPSAwOworICAgICAgICBpZiAocGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPCAtMjYgfHwgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPiAyNSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTklUX1FTX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisKKyAgICAgICAgcGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPSAwOyAvKiBkZWZhdWx0IHRvIHplcm8gZm9yIG5vdyAqLworICAgICAgICBpZiAocGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPCAtMTIgfHwgcGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPiAxMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19DSFJPTUFfUVBfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKyAgICAgICAgLyogZGVibG9ja2luZyAqLworICAgICAgICBwaWNQYXJhbS0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPSAoZW5jUGFyYW0tPmRiX2ZpbHRlciA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFIDsKKyAgICAgICAgLyogY29uc3RyYWluZWQgaW50cmEgcHJlZGljdGlvbiAqLworICAgICAgICBwaWNQYXJhbS0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gKGVuY1BhcmFtLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgICAgIHBpY1BhcmFtLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgPSAwOyAvKiBkZWZhdWx0ICovCisgICAgfQorICAgIGVsc2UgaWYgKGV4dFApLy8gZXh0ZXJuYWwgUFBTCisgICAgeworICAgICAgICBwaWNQYXJhbS0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSBleHRQLT5waWNfcGFyYW1ldGVyX3NldF9pZCAtIDE7IC8qIHRvIGJlIGluY3JlYXNlZCBieSBvbmUgKi8KKyAgICAgICAgcGljUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gZXh0UC0+c2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisgICAgICAgIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPSBleHRQLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWc7CisgICAgICAgIGlmIChleHRQLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgIT0gMCkgLyogZGVmYXVsdCB0byBDQVZMQyAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgPSBleHRQLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnOyAvKiBkZWZhdWx0IGZvciBub3csIHdpbGwgbmVlZCBpdCBmb3IgQi1zbGljZSAqLworICAgICAgICBpZiAoZXh0UC0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgLyogRk1PICovCisgICAgICAgIGlmICgvKihleHRQLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTwwKSB8fCAobm8gbmVlZCBpdCdzIHVuc2lnbmVkKSAqLworICAgICAgICAgICAgKGV4dFAtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gTUFYX05VTV9TTElDRV9HUk9VUCAtIDEpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfTlVNX1NMSUNFR1JPVVA7CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID0gZXh0UC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7CisKKyAgICAgICAgaWYgKHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9IGV4dFAtPnNsaWNlX2dyb3VwX21hcF90eXBlOworICAgICAgICAgICAgc3dpdGNoIChleHRQLT5zbGljZV9ncm91cF9tYXBfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8PSAoaW50KWV4dFAtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cnVuX2xlbmd0aF9taW51czFbaWldID0gZXh0UC0+cnVuX2xlbmd0aF9taW51czFbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludClwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT50b3BfbGVmdFtpaV0gPSBleHRQLT50b3BfbGVmdFtpaV07CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+Ym90dG9tX3JpZ2h0W2lpXSA9IGV4dFAtPmJvdHRvbV9yaWdodFtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPSBleHRQLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWc7CisgICAgICAgICAgICAgICAgICAgIGlmICgvKmV4dFAtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA8IDAgfHwgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICBleHRQLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPiB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfQ0hBTkdFX1JBVEU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA9IGV4dFAtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlID0gcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSArIDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dFAtPnBpY19zaXplX2luX21hcF91bml0c19taW51czEgIT0gdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnBpY19zaXplX2luX21hcF91bml0c19taW51czEgPSBleHRQLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOworCisgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCAqLworICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWQgPSAodWludCopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZih1aW50KSAqIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cywgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4dFAtPnNsaWNlX2dyb3VwX2lkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludCl2aWRlby0+UGljU2l6ZUluTWFwVW5pdHM7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZFtpaV0gPSBleHRQLT5zbGljZV9ncm91cF9pZFtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0ZNT19UWVBFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gZXh0UC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKKyAgICAgICAgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPSBleHRQLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOyAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXh0UC0+d2VpZ2h0ZWRfcHJlZF9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfcHJlZF9mbGFnID0gMDsgLyogbm8gd2VpZ2h0ZWQgcHJlZGljdGlvbiBzdXBwb3J0ZWQgKi8KKyAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX2JpcHJlZF9pZGMgPSBleHRQLT53ZWlnaHRlZF9iaXByZWRfaWRjOyAvKiByYW5nZSAwLDEsMiAqLworICAgICAgICBpZiAoLypwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA8IDAgfHwgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA+IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfV0VJR0hURURfQklQUkVEX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPSBleHRQLT5waWNfaW5pdF9xcF9taW51czI2OyAvKiBkZWZhdWx0LCB3aWxsIGJlIGNoYW5nZWQgYXQgc2xpY2UgbGV2ZWwgYW55d2F5ICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA+IDI1KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOSVRfUVBfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPSBleHRQLT5waWNfaW5pdF9xc19taW51czI2OworICAgICAgICBpZiAocGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPCAtMjYgfHwgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYgPiAyNSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTklUX1FTX0ZBSUw7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisKKyAgICAgICAgcGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPSBleHRQLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0OyAvKiBkZWZhdWx0IHRvIHplcm8gZm9yIG5vdyAqLworICAgICAgICBpZiAocGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPCAtMTIgfHwgcGljUGFyYW0tPmNocm9tYV9xcF9pbmRleF9vZmZzZXQgPiAxMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19DSFJPTUFfUVBfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKyAgICAgICAgLyogZGVibG9ja2luZyAqLworICAgICAgICBwaWNQYXJhbS0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPSBleHRQLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZzsKKyAgICAgICAgLyogY29uc3RyYWluZWQgaW50cmEgcHJlZGljdGlvbiAqLworICAgICAgICBwaWNQYXJhbS0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnID0gZXh0UC0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOworICAgICAgICBpZiAoZXh0UC0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9IGV4dFAtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZzsgLyogZGVmYXVsdCAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKiBub3cgc2V0IHVwIHNvbWUgU2xpY2VIZWFkZXIgcGFyYW1ldGVycyAqKioqKioqKioqKi8KKyAgICBpZiAocGljUGFyYW0tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID09IFRSVUUpCisgICAgeworICAgICAgICAvKiB0aGVzZSB2YWx1ZXMgb25seSBwcmVzZW50IHdoZW4gZGJfZmlsdGVyIGlzIE9OICovCisgICAgICAgIGlmIChlbmNQYXJhbS0+ZGlzYWJsZV9kYl9pZGMgPiAyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfREVCTE9DS19JREM7IC8qIG91dCBvZiByYW5nZSAqLworICAgICAgICB9CisgICAgICAgIHNsaWNlSGRyLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyA9IGVuY1BhcmFtLT5kaXNhYmxlX2RiX2lkYzsKKworICAgICAgICBpZiAoZW5jUGFyYW0tPmFscGhhX29mZnNldCA8IC02IHx8IGVuY1BhcmFtLT5hbHBoYV9vZmZzZXQgPiA2KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfQUxQSEFfT0ZGU0VUOworICAgICAgICB9CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA9IGVuY1BhcmFtLT5hbHBoYV9vZmZzZXQ7CisKKyAgICAgICAgaWYgKGVuY1BhcmFtLT5iZXRhX29mZnNldCA8IC02IHx8IGVuY1BhcmFtLT5iZXRhX29mZnNldCA+IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9CRVRBX09GRlNFVDsKKyAgICAgICAgfQorICAgICAgICBzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIgPSAgZW5jUGFyYW0tPmJldGFfb2Zmc2V0OworICAgIH0KKyAgICBpZiAoZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgc2xpY2VIZHItPmlkcl9waWNfaWQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbGljZUhkci0+aWRyX3BpY19pZCA9ICh1aW50KSgtMSk7IC8qIHN0YXJ0IHdpdGggemVybyAqLworICAgIH0KKyAgICBzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcgPSBGQUxTRTsKKyAgICBzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcgPSBGQUxTRTsgIC8qIHdvbid0IGJlIHVzZWQgYW55d2F5ICovCisgICAgdmlkZW8tPk1iYWZmRnJhbWVGbGFnID0gKHNlcVBhcmFtLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnICYmICFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpOworCisgICAgLyogdGhlIHJlc3Qgd2lsbCBiZSBzZXQgaW4gSW5pdFNsaWNlKCkgKi8KKworICAgIC8qIG5vdyB0aGUgcmF0ZSBjb250cm9sIGFuZCBwZXJmb3JtYW5jZSByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICByYXRlQ3RybC0+c2NkRW5hYmxlID0gKGVuY1BhcmFtLT5hdXRvX3NjZCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgIHJhdGVDdHJsLT5pZHJQZXJpb2QgPSBlbmNQYXJhbS0+aWRyX3BlcmlvZCArIDE7CisgICAgcmF0ZUN0cmwtPmludHJhTUJSYXRlID0gZW5jUGFyYW0tPmludHJhbWJfcmVmcmVzaDsKKyAgICByYXRlQ3RybC0+ZHBFbmFibGUgPSAoZW5jUGFyYW0tPmRhdGFfcGFyID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisKKyAgICByYXRlQ3RybC0+c3ViUGVsRW5hYmxlID0gKGVuY1BhcmFtLT5zdWJfcGVsID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgcmF0ZUN0cmwtPm12UmFuZ2UgPSBlbmNQYXJhbS0+c2VhcmNoX3JhbmdlOworCisgICAgcmF0ZUN0cmwtPnN1Yk1CRW5hYmxlID0gKGVuY1BhcmFtLT5zdWJtYl9wcmVkID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgcmF0ZUN0cmwtPnJkT3B0RW5hYmxlID0gKGVuY1BhcmFtLT5yZG9wdF9tb2RlID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgcmF0ZUN0cmwtPmJpZGlyUHJlZCA9IChlbmNQYXJhbS0+YmlkaXJfcHJlZCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworCisgICAgcmF0ZUN0cmwtPnJjRW5hYmxlID0gKGVuY1BhcmFtLT5yYXRlX2NvbnRyb2wgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+aW5pdFFQID0gZW5jUGFyYW0tPmluaXRRUDsKKyAgICByYXRlQ3RybC0+aW5pdFFQID0gQVZDX0NMSVAzKDAsIDUxLCByYXRlQ3RybC0+aW5pdFFQKTsKKworICAgIHJhdGVDdHJsLT5iaXRSYXRlID0gZW5jUGFyYW0tPmJpdHJhdGU7CisgICAgcmF0ZUN0cmwtPmNwYlNpemUgPSBlbmNQYXJhbS0+Q1BCX3NpemU7CisgICAgcmF0ZUN0cmwtPmluaXREZWxheU9mZnNldCA9IChyYXRlQ3RybC0+Yml0UmF0ZSAqIGVuY1BhcmFtLT5pbml0X0NCUF9yZW1vdmFsX2RlbGF5IC8gMTAwMCk7CisKKyAgICBpZiAoZW5jUGFyYW0tPmZyYW1lX3JhdGUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9GUkFNRVJBVEU7CisgICAgfQorCisgICAgcmF0ZUN0cmwtPmZyYW1lX3JhdGUgPSAoT3NjbEZsb2F0KShlbmNQYXJhbS0+ZnJhbWVfcmF0ZSAqIDEuMCAvIDEwMDApOworLy8gIHJhdGVDdHJsLT5zcmNJbnRlcnZhbCA9IGVuY1BhcmFtLT5zcmNfaW50ZXJ2YWw7CisgICAgcmF0ZUN0cmwtPmZpcnN0X2ZyYW1lID0gMTsgLyogc2V0IHRoaXMgZmxhZyBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKworICAgIC8qIGNvbnRyYWluZWRfc2V0eF9mbGFnIHdpbGwgYmUgc2V0IGluc2lkZSB0aGUgVmVyaWZ5UHJvZmlsZSBjYWxsZWQgYmVsb3cuKi8KKyAgICBpZiAoIWV4dFMgJiYgIWV4dFApCisgICAgeworICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBlbmNQYXJhbS0+cHJvZmlsZTsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDBfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MV9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQyX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDNfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+bGV2ZWxfaWRjID0gZW5jUGFyYW0tPmxldmVsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBleHRTLT5wcm9maWxlX2lkYzsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDBfZmxhZyA9IGV4dFMtPmNvbnN0cmFpbmVkX3NldDBfZmxhZzsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDFfZmxhZyA9IGV4dFMtPmNvbnN0cmFpbmVkX3NldDFfZmxhZzsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyA9IGV4dFMtPmNvbnN0cmFpbmVkX3NldDJfZmxhZzsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDNfZmxhZyA9IGV4dFMtPmNvbnN0cmFpbmVkX3NldDNfZmxhZzsKKyAgICAgICAgc2VxUGFyYW0tPmxldmVsX2lkYyA9IGV4dFMtPmxldmVsX2lkYzsKKyAgICB9CisKKworICAgIHN0YXR1cyA9IFZlcmlmeVByb2ZpbGUoZW5jdmlkLCBzZXFQYXJhbSwgcGljUGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IFZlcmlmeUxldmVsKGVuY3ZpZCwgc2VxUGFyYW0sIHBpY1BhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qIHZlcmlmeSB0aGUgcHJvZmlsZSBzZXR0aW5nICovCitBVkNFbmNfU3RhdHVzIFZlcmlmeVByb2ZpbGUoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSwgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtKQoreworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKworICAgIGlmIChzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPT0gMCkgLyogZmluZCBwcm9maWxlIGZvciB0aGlzIHNldHRpbmcgKi8KKyAgICB7CisgICAgICAgIC8qIGZpbmQgdGhlIHJpZ2h0IHByb2ZpbGUgZm9yIGl0ICovCisgICAgICAgIGlmIChzZXFQYXJhbS0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyA9PSBUUlVFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA8PSA3IC8qJiYKKyAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMT49MCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IEFWQ19FWFRFTkRFRDsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQyX2ZsYWcgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5kcEVuYWJsZSA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA9PSAwICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9PSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPnByb2ZpbGVfaWRjID0gQVZDX01BSU47CisgICAgICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MV9mbGFnID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyYXRlQ3RybC0+YmlkaXJQcmVkID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPmRwRW5hYmxlID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcgPT0gVFJVRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9PSAwICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA8PSA3IC8qJiYKKyAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMT49MCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkqLykKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPnByb2ZpbGVfaWRjID0gQVZDX0JBU0VMSU5FOworICAgICAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDBfZmxhZyA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VxUGFyYW0tPnByb2ZpbGVfaWRjID09IDApIC8qIHN0aWxsIHplcm8gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19QUk9GSUxFX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvZmlsZSBieSB0aGlzIGxpYnJhcnkgKi8KKyAgICBzd2l0Y2ggKHNlcVBhcmFtLT5wcm9maWxlX2lkYykKKyAgICB7CisgICAgICAgIGNhc2UgQVZDX0JBU0VMSU5FOgorICAgICAgICAgICAgaWYgKHJhdGVDdHJsLT5iaWRpclByZWQgPT0gVFJVRSB8fAorICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+ZHBFbmFibGUgPT0gVFJVRSB8fAorICAgICAgICAgICAgICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyAhPSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPT0gVFJVRSB8fAorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyAhPSAwIHx8CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPT0gVFJVRSB8fAorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiA3IC8qfHwKKyAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTwwIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSAqLykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfVE9PTFNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDX01BSU46CisgICAgICAgIGNhc2UgQVZDX0VYVEVOREVEOgorICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiB2ZXJpZnkgdGhlIGxldmVsIHNldHRpbmcgKi8KK0FWQ0VuY19TdGF0dXMgVmVyaWZ5TGV2ZWwoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSwgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtKQoreworICAgICh2b2lkKShwaWNQYXJhbSk7CisKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgbWJfcGVyX3NlYywgaWk7CisgICAgaW50IGxldl9pZHg7CisgICAgaW50IGRwYl9zaXplOworCisgICAgbWJfcGVyX3NlYyA9IChpbnQpKHZpZGVvLT5QaWNTaXplSW5NYnMgKiByYXRlQ3RybC0+ZnJhbWVfcmF0ZSArIDAuNSk7CisgICAgZHBiX3NpemUgPSAoc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzICogdmlkZW8tPlBpY1NpemVJbk1icyAqIDMpID4+IDY7CisKKyAgICBpZiAoc2VxUGFyYW0tPmxldmVsX2lkYyA9PSAwKSAvKiBmaW5kIGxldmVsIGZvciB0aGlzIHNldHRpbmcgKi8KKyAgICB7CisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IE1BWF9MRVZFTF9JRFg7IGlpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtYl9wZXJfc2VjIDw9IE1heE1CUFNbaWldICYmCisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNTaXplSW5NYnMgPD0gKHVpbnQpTWF4RlNbaWldICYmCisgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5iaXRSYXRlIDw9IChpbnQzMilNYXhCUltpaV0qMTAwMCAmJgorICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+Y3BiU2l6ZSA8PSAoaW50MzIpTWF4Q1BCW2lpXSoxMDAwICYmCisgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5tdlJhbmdlIDw9IE1heFZtdlJbaWldICYmCisgICAgICAgICAgICAgICAgICAgIGRwYl9zaXplIDw9IE1heERQQlgyW2lpXSo1MTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VxUGFyYW0tPmxldmVsX2lkYyA9IG1hcElkeDJMZXZbaWldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZXFQYXJhbS0+bGV2ZWxfaWRjID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTEVWRUxfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRoaXMgbGV2ZWwgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgbGlicmFyeSAqLworICAgIGxldl9pZHggPSBtYXBMZXYySWR4W3NlcVBhcmFtLT5sZXZlbF9pZGNdOworICAgIGlmIChzZXFQYXJhbS0+bGV2ZWxfaWRjID09IEFWQ19MRVZFTDFfQikKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQzX2ZsYWcgPSAxOworICAgIH0KKworCisgICAgaWYgKGxldl9pZHggPT0gMjU1KSAvKiBub3QgZGVmaW5lZCAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19MRVZFTF9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRoZSBlbmNvZGluZyBzZXR0aW5nIGNvbXBsaWVzIHdpdGggdGhlIGxldmVsICovCisgICAgaWYgKG1iX3Blcl9zZWMgPiBNYXhNQlBTW2xldl9pZHhdIHx8CisgICAgICAgICAgICB2aWRlby0+UGljU2l6ZUluTWJzID4gKHVpbnQpTWF4RlNbbGV2X2lkeF0gfHwKKyAgICAgICAgICAgIHJhdGVDdHJsLT5iaXRSYXRlID4gKGludDMyKU1heEJSW2xldl9pZHhdKjEwMDAgfHwKKyAgICAgICAgICAgIHJhdGVDdHJsLT5jcGJTaXplID4gKGludDMyKU1heENQQltsZXZfaWR4XSoxMDAwIHx8CisgICAgICAgICAgICByYXRlQ3RybC0+bXZSYW5nZSA+IE1heFZtdlJbbGV2X2lkeF0pCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0xFVkVMX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiBpbml0aWFsaXplIHZhcmlhYmxlcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZnJhbWUgKi8KKy8qIGRldGVybWluZSB0aGUgcGljdHVyZSB0eXBlICovCisvKiBlbmNvZGUgUE9DICovCisvKiBtYXliZSB3ZSBzaG91bGQgZG8gbW9yZSBzdHVmZiBoZXJlLiBNb3Rpb25Fc3RpbWF0aW9uK1NDRCBhbmQgZ2VuZXJhdGUgYSBuZXcgU1BTIGFuZCBQUFMgKi8KK0FWQ0VuY19TdGF0dXMgSW5pdEZyYW1lKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ1N0YXR1cyByZXQ7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKworICAgIC8qIGxvb2sgZm9yIHRoZSBuZXh0IGZyYW1lIGluIGNvZGluZ19vcmRlciBhbmQgbG9vayBmb3IgYXZhaWxhYmxlIHBpY3R1cmUKKyAgICAgICBpbiB0aGUgRFBCLiBOb3RlLCB2aWRlby0+Y3VyckZTLT5QaWNPcmRlckNudCwgY3VyckZTLT5GcmFtZU51bSBhbmQgY3VyclBpYy0+UGljTnVtCisgICAgICAgYXJlIHNldCB0byB3cm9uZyBudW1iZXIgaW4gdGhpcyBmdW5jdGlvbiAocmlnaHQgZm9yIGRlY29kZXIpLiAqLworICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgeworICAgICAgICAvLyBjYWxsIGluaXQgRFBCIGluIGhlcmUuCisgICAgICAgIHJldCA9IEFWQ0NvbmZpZ3VyZVNlcXVlbmNlKGVuY3ZpZC0+YXZjSGFuZGxlLCB2aWRlbywgVFJVRSk7CisgICAgICAgIGlmIChyZXQgIT0gQVZDX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcgKGV2ZXJ5IGZyYW1lKSovCisgICAgLyogcG9wdWxhdGUgdmlkZW8tPm1hcFVuaXRUb1NsaWNlR3JvdXBNYXAgYW5kIHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCAqLworICAgIC8qIEl0IGNoYW5nZXMgb25jZSBwZXIgZWFjaCBQUFMuICovCisgICAgRk1PSW5pdCh2aWRlbyk7CisKKyAgICByZXQgPSBEUEJJbml0QnVmZmVyKGVuY3ZpZC0+YXZjSGFuZGxlLCB2aWRlbyk7IC8vIGdldCBuZXcgYnVmZmVyCisKKyAgICBpZiAocmV0ICE9IEFWQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChBVkNFbmNfU3RhdHVzKXJldDsgLy8gQVZDRU5DX1BJQ1RVUkVfUkVBRFksIEZBSUwKKyAgICB9CisKKyAgICBEUEJJbml0UGljKHZpZGVvLCAwKTsgLyogMCBpcyBkdW1teSAqLworCisgICAgLyoqKioqKioqKioqKiogZGV0ZXJtaW5lIHBpY3R1cmUgdHlwZSBJRFIgb3Igbm9uLUlEUiAqKioqKioqKioqKi8KKyAgICB2aWRlby0+Y3VyclBpY1R5cGUgPSBBVkNfRlJBTUU7CisgICAgdmlkZW8tPnNsaWNlX2RhdGFfcGFydGl0aW9uaW5nID0gRkFMU0U7CisgICAgZW5jdmlkLT5jdXJySW5wdXQtPmlzX3JlZmVyZW5jZSA9IDE7IC8qIGRlZmF1bHQgdG8gYWxsIGZyYW1lcyAqLworICAgIHZpZGVvLT5uYWxfcmVmX2lkYyA9IDE7ICAvKiBuZWVkIHRvIHNldCB0aGlzIGZvciBJbml0UE9DICovCisgICAgdmlkZW8tPmN1cnJQaWMtPmlzUmVmZXJlbmNlID0gVFJVRTsKKworICAgIC8qKioqKioqKioqKioqIHNldCBmcmFtZV9udW0gKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW0gPSB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgIHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPSAwOworICAgICAgICBzbGljZUhkci0+ZnJhbWVfbnVtID0gMDsKKyAgICB9CisgICAgLyogb3RoZXJ3aXNlLCBpdCdzIHNldCB0byBwcmV2aW91cyByZWZlcmVuY2UgZnJhbWUgYWNjZXNzIHVuaXQncyBmcmFtZV9udW0gaW4gZGVjb2Rpbmcgb3JkZXIsCisgICAgICAgc2VlIHRoZSBlbmQgb2YgUFZBVkNEZWNvZGVTbGljZSgpKi8KKyAgICAvKiBUaGVyZSdzIGFsc28gcmVzdHJpY3Rpb24gb24gdGhlIGZyYW1lX251bSwgc2VlIHBhZ2UgNTkgb2YgSlZULUkxMDEwLmRvYy4gKi8KKyAgICAvKiBCYXNpY2FsbHksIGZyYW1lX251bSBjYW4ndCBiZSByZXBlYXRlZCB1bmxlc3MgaXQncyBvcHBvc2l0ZSBmaWVsZHMgb3Igbm9uIHJlZmVyZW5jZSBmaWVsZHMgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICBzbGljZUhkci0+ZnJhbWVfbnVtID0gKHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gKyAxKSAlIHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICB9CisgICAgdmlkZW8tPkN1cnJQaWNOdW0gPSBzbGljZUhkci0+ZnJhbWVfbnVtOyAgLyogZm9yIGZpZWxkX3BpY19mbGFnID0gMCAqLworICAgIC8vdmlkZW8tPkN1cnJQaWNOdW0gPSAyKnNsaWNlSGRyLT5mcmFtZV9udW0gKyAxOyAvKiBmb3IgZmllbGRfcGljX2ZsYWcgPSAxICovCisKKyAgICAvKiBhc3NpZ24gcGljX29yZGVyX2NudCwgdmlkZW8tPlBpY09yZGVyQ250ICovCisgICAgc3RhdHVzID0gSW5pdFBPQyhlbmN2aWQpOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpICAvKiBpbmNvcnJpZ2FibGUgZmFpbCAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIHJlZkxpc3RJZHggZm9yIHRoaXMgcGljdHVyZSAqLworICAgIFJlZkxpc3RJbml0KHZpZGVvKTsKKworICAgIC8qKioqKioqKioqKioqIG1vdGlvbiBlc3RpbWF0aW9uIGFuZCBzY2VuZSBhbmFseXNpcyAqKioqKioqKioqKiovCisgICAgLy8gLCB0byBtb3ZlIHRoaXMgdG8gTUItYmFzZWQgTVYgc2VhcmNoIGZvciBjb21wYXJpc29uCisgICAgLy8gdXNlIHN1Yi1vcHRpbWFsIFFQIGZvciBtdiBzZWFyY2gKKyAgICBBVkNNb3Rpb25Fc3RpbWF0aW9uKGVuY3ZpZCk7ICAvKiBBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfTkVXX0lEUiAqLworCisgICAgLyogYWZ0ZXIgdGhpcyBwb2ludCwgdGhlIHBpY3R1cmUgdHlwZSB3aWxsIGJlIGZpeGVkIHRvIGVpdGhlciBJRFIgb3Igbm9uLUlEUiAqLworICAgIHZpZGVvLT5jdXJyRlMtPlBpY09yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250OworICAgIHZpZGVvLT5jdXJyRlMtPkZyYW1lTnVtID0gdmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW07CisgICAgdmlkZW8tPmN1cnJQaWMtPlBpY051bSA9IHZpZGVvLT5DdXJyUGljTnVtOworICAgIHZpZGVvLT5tYk51bSA9IDA7IC8qIHN0YXJ0IGZyb20gemVybyBNQiAqLworICAgIGVuY3ZpZC0+Y3VyclNsaWNlR3JvdXAgPSAwOyAvKiBzdGFydCBmcm9tIHNsaWNlIGdyb3VwICMwICovCisgICAgZW5jdmlkLT5udW1JbnRyYU1CID0gMDsgLyogcmVzZXQgdGhpcyBjb3VudGVyICovCisKKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgUkNJbml0R09QKGVuY3ZpZCk7CisKKyAgICAgICAgLyogY2FsY3VsYXRlIHBpY3R1cmUgUVAgKi8KKyAgICAgICAgUkNJbml0RnJhbWVRUChlbmN2aWQpOworCisgICAgICAgIHJldHVybiBBVkNFTkNfTkVXX0lEUjsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgcGljdHVyZSBRUCAqLworICAgIFJDSW5pdEZyYW1lUVAoZW5jdmlkKTsgLyogZ2V0IFFQIGFmdGVyIE1WIHNlYXJjaCAqLworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiBpbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhpcyBzbGljZSAqLworQVZDRW5jX1N0YXR1cyBJbml0U2xpY2UoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNQaWNQYXJhbVNldCAqY3VyclBQUyA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisgICAgaW50IHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKworICAgIHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZSA9IHZpZGVvLT5tYk51bTsKKyAgICBpZiAodmlkZW8tPm1iTnVtKSAvLyBub3QgZmlyc3Qgc2xpY2Ugb2YgYSBmcmFtZQorICAgIHsKKyAgICAgICAgdmlkZW8tPnNsaWNlSGRyLT5zbGljZV90eXBlID0gKEFWQ1NsaWNlVHlwZSlzbGljZV90eXBlOworICAgIH0KKworICAgIC8qIHNsaWNlSGRyLT5zbGljZV90eXBlIGFscmVhZHkgc2V0IGluIEluaXRGcmFtZSAqLworCisgICAgc2xpY2VIZHItPnBpY19wYXJhbWV0ZXJfc2V0X2lkID0gdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnBpY19wYXJhbWV0ZXJfc2V0X2lkOworCisgICAgLyogc2xpY2VIZHItPmZyYW1lX251bSBhbHJlYWR5IHNldCBpbiBJbml0RnJhbWUgKi8KKworICAgIGlmICghY3VyclNQUy0+ZnJhbWVfbWJzX29ubHlfZmxhZykgIC8qIHdlIHNob3VsZG4ndCBuZWVkIHRoaXMgY2hlY2sgKi8KKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9IHNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZyA9IEZBTFNFOworICAgICAgICByZXR1cm4gQVZDRU5DX1RPT0xTX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogc2xpY2VIZHItPmlkcl9waWNfaWQgYWxyZWFkeSBzZXQgaW4gUFZBVkNFbmNvZGVOQUwKKworICAgICBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgYWxyZWFkeSBzZXQgaW4gSW5pdEZyYW1lLi5Jbml0UE9DCisgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSAgYWxyZWFkeSBzZXQgaW4gSW5pdFBPQworCisgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0gYWxyZWFkeSBzZXQgaW4gSW5pdFBPQworICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdIGFscmVhZHkgc2V0IGluIEluaXRQT0MKKyAgICAqLworCisgICAgc2xpY2VIZHItPnJlZHVuZGFudF9waWNfY250ID0gMDsgLyogZGVmYXVsdCBpZihjdXJyUFBTLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcpLCByYW5nZSAwLi4xMjcgKi8KKyAgICBzbGljZUhkci0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnID0gMDsgLy8gZGVmYXVsdCBpZihzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorCisgICAgc2xpY2VIZHItPm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQsIGlmKHNsaWNlX3R5cGU9PSBQLFNQIG9yIEIpKi8KKyAgICBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9IDA7IC8qIGRlZmF1bHQsIGlmIChudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZykgKi8KKyAgICBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA9IDA7IC8qIGRlZmF1bHQsIGlmIGFib3ZlIGFuZCBCX3NsaWNlICovCisgICAgLyogdGhlIGFib3ZlIDIgdmFsdWVzIHJhbmdlIGZyb20gMC4uMTUgZm9yIGZyYW1lIHBpY3R1cmUgYW5kIDAuLjMxIGZvciBmaWVsZCBwaWN0dXJlICovCisKKyAgICAvKiByZWZfcGljX2xpc3RfcmVvcmRlcmluZygpLCBjdXJyZW50bHkgd2UgZG9uJ3QgZG8gYW55dGhpbmcgKi8KKyAgICBzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMCA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDEgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIC8qIGlmIHRoZSBhYm92ZSBhcmUgVFJVRSwgc29tZSBvdGhlciBwYXJhbXMgbXVzdCBiZSBzZXQgKi8KKworICAgIGlmICgoY3VyclBQUy0+d2VpZ2h0ZWRfcHJlZF9mbGFnICYmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFKSkgfHwKKyAgICAgICAgICAgIChjdXJyUFBTLT53ZWlnaHRlZF9iaXByZWRfaWRjID09IDEgJiYgc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkpCisgICAgeworICAgICAgICAvLyAgICAgIHByZWRfd2VpZ2h0X3RhYmxlKCk7IC8vIG5vdCBzdXBwb3J0ZWQgISEKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qIGRlY19yZWZfcGljX21hcmtpbmcoKSwgdGhpcyB3aWxsIGJlIGRvbmUgbGF0ZXIqLworICAgIHNsaWNlSGRyLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICBzbGljZUhkci0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnID0gRkFMU0U7IC8qIGZvciBJRFIgZnJhbWUsIGRvIG5vdCBtYWtlIGl0IGxvbmcgdGVybSAqLworICAgIHNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICAvKiBvdGhlciBwYXJhbXMgYXJlIG5vdCBzZXQgaGVyZSBiZWNhdXNlIHRoZXkgYXJlIG5vdCB1c2VkICovCisKKyAgICBzbGljZUhkci0+Y2FiYWNfaW5pdF9pZGMgPSAwOyAvKiBkZWZhdWx0LCBpZiBlbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgJiYgc2xpY2VfdHlwZT09SSBvciBTSSwgcmFuZ2UgMC4uMiAgKi8KKyAgICBzbGljZUhkci0+c2xpY2VfcXBfZGVsdGEgPSAwOyAvKiBkZWZhdWx0IGZvciBub3cgKi8KKyAgICBzbGljZUhkci0+c3BfZm9yX3N3aXRjaF9mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQsIGlmIHNsaWNlX3R5cGUgPT0gU1AgKi8KKyAgICBzbGljZUhkci0+c2xpY2VfcXNfZGVsdGEgPSAwOyAvKiBkZWZhdWx0LCBpZiBzbGljZV90eXBlID09IFNQIG9yIFNJICovCisKKyAgICAvKiBkZXJpdmVkIHZhcmlhYmxlcyBmcm9tIGVuY1BhcmFtICovCisgICAgLyogZGVibG9ja2luZyBmaWx0ZXIgKi8KKyAgICB2aWRlby0+RmlsdGVyT2Zmc2V0QSA9IHZpZGVvLT5GaWx0ZXJPZmZzZXRCID0gMDsKKyAgICBpZiAoY3VyclBQUy0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5GaWx0ZXJPZmZzZXRBID0gc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyIDw8IDE7CisgICAgICAgIHZpZGVvLT5GaWx0ZXJPZmZzZXRCID0gc2xpY2VIZHItPnNsaWNlX2JldGFfb2Zmc2V0X2Rpdl8yIDw8IDE7CisgICAgfQorCisgICAgLyogZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZyAqLworICAgIC8qIHBvcHVsYXRlIHZpZGVvLT5tYXBVbml0VG9TbGljZUdyb3VwTWFwIGFuZCB2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXAgKi8KKyAgICAvKiBXZSBhbHJlYWR5IGNhbGwgaXQgYXQgdGhlIGVuZCBvZiBQVkFWQ0VuY0luaXRpYWxpemUoKS4gSXQgY2hhbmdlcyBvbmNlIHBlciBlYWNoIFBQUy4gKi8KKyAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCAmJiB2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPj0gMworICAgICAgICAgICAgJiYgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnNsaWNlX2dyb3VwX21hcF90eXBlIDw9IDUpCisgICAgeworICAgICAgICBzbGljZUhkci0+c2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlID0gU0xJQ0VfR1JPVVBfQ0hBTkdFX0NZQ0xFOyAgLyogZGVmYXVsdCwgZG9uJ3QgdW5kZXJzdGFuZCBob3cgdG8gc2V0IGl0ISEhKi8KKworICAgICAgICB2aWRlby0+TWFwVW5pdHNJblNsaWNlR3JvdXAwID0KKyAgICAgICAgICAgIEFWQ19NSU4oc2xpY2VIZHItPnNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSAqIHZpZGVvLT5TbGljZUdyb3VwQ2hhbmdlUmF0ZSwgdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzKTsKKworICAgICAgICBGTU9Jbml0KHZpZGVvKTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgU2xpY2VRUHkgZmlyc3QgICovCisgICAgLyogY2FsY3VsYXRlIFFTeSBmaXJzdCAqLworCisgICAgc2xpY2VIZHItPnNsaWNlX3FwX2RlbHRhID0gdmlkZW8tPlFQeSAtIDI2IC0gY3VyclBQUy0+cGljX2luaXRfcXBfbWludXMyNjsKKyAgICAvL3NsaWNlSGRyLT5zbGljZV9xc19kZWx0YSA9IHZpZGVvLT5RU3kgLSAyNiAtIGN1cnJQUFMtPnBpY19pbml0X3FzX21pbnVzMjY7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbnRyYV9lc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ludHJhX2VzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlNTk4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9pbnRyYV9lc3QuY3BwCkBAIC0wLDAgKzEsMjE5OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKyNkZWZpbmUgVEhfSTQgIDAgIC8qIHRocmVzaG9sZCBiaWFzaW5nIHRvd2FyZCBJMTYgbW9kZSBpbnN0ZWFkIG9mIEk0IG1vZGUgKi8KKyNkZWZpbmUgVEhfSW50cmEgIDAgLyogdGhyZXNob2xkIGJpYXNpbmcgdG93YXJkIElOVEVSIG1vZGUgaW5zdGVhZCBvZiBpbnRyYSBtb2RlICovCisKKyNkZWZpbmUgRklYRURfSU5UUkFQUkVEX01PREUgIEFWQ19JMTYKKyNkZWZpbmUgRklYRURfSTE2X01PREUgIEFWQ19JMTZfREMKKyNkZWZpbmUgRklYRURfSTRfTU9ERSAgIEFWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnQKKyNkZWZpbmUgRklYRURfSU5UUkFfQ0hST01BX01PREUgQVZDX0lDX0RDCisKKyNkZWZpbmUgQ0xJUF9SRVNVTFQoeCkgICAgICBpZigodWludCl4ID4gMHhGRil7IFwKKyAgICAgICAgICAgICAgICAgeCA9IDB4RkYgJiAofih4Pj4zMSkpO30KKworCitib29sIEludHJhRGVjaXNpb25BQkUoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBtaW5fY29zdCwgdWludDggKmN1ckwsIGludCBwaWNQaXRjaCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgaW50IG9yZ1BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBpbnQgeF9wb3MgPSAodmlkZW8tPm1iX3gpIDw8IDQ7CisgICAgaW50IHlfcG9zID0gKHZpZGVvLT5tYl95KSA8PCA0OworICAgIHVpbnQ4ICpvcmdZID0gY3VycklucHV0LT5ZQ2JDclswXSArIHlfcG9zICogb3JnUGl0Y2ggKyB4X3BvczsKKyAgICBpbnQgajsKKyAgICB1aW50OCAqdG9wTCwgKmxlZnRMLCAqb3JnWV8yLCAqb3JnWV8zOworICAgIGludCB0ZW1wLCBTQkUsIG9mZnNldDsKKyAgICBPc2NsRmxvYXQgQUJFOworICAgIGJvb2wgaW50cmEgPSB0cnVlOworCisgICAgaWYgKCgoeF9wb3MgPj4gNCkgIT0gKGludCl2aWRlby0+UGljV2lkdGhJbk1icyAtIDEpICYmCisgICAgICAgICAgICAoKHlfcG9zID4+IDQpICE9IChpbnQpdmlkZW8tPlBpY0hlaWdodEluTWJzIC0gMSkgJiYKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSAmJgorICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgU0JFID0gMDsKKyAgICAgICAgLyogdG9wIG5laWdoYm9yICovCisgICAgICAgIHRvcEwgPSBjdXJMIC0gcGljUGl0Y2g7CisgICAgICAgIC8qIGxlZnQgbmVpZ2hib3IgKi8KKyAgICAgICAgbGVmdEwgPSBjdXJMIC0gMTsKKyAgICAgICAgb3JnWV8yID0gb3JnWSAtIG9yZ1BpdGNoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKnRvcEwrKyAtIG9yZ1lbal07CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgICAgIHRlbXAgPSAqKGxlZnRMICs9IHBpY1BpdGNoKSAtICoob3JnWV8yICs9IG9yZ1BpdGNoKTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICB9CisKKyAgICAgICAgLyogY2FsY3VsYXRlIGNocm9tYSAqLworICAgICAgICBvZmZzZXQgPSAoeV9wb3MgPj4gMikgKiBwaWNQaXRjaCArICh4X3BvcyA+PiAxKTsKKyAgICAgICAgdG9wTCA9IHZpZGVvLT5jdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgICAgIG9yZ1lfMiA9IGN1cnJJbnB1dC0+WUNiQ3JbMV0gKyBvZmZzZXQgKyAoeV9wb3MgPj4gMikgKiAob3JnUGl0Y2ggLSBwaWNQaXRjaCk7CisKKyAgICAgICAgbGVmdEwgPSB0b3BMIC0gMTsKKyAgICAgICAgdG9wTCAtPSAocGljUGl0Y2ggPj4gMSk7CisgICAgICAgIG9yZ1lfMyA9IG9yZ1lfMiAtIChvcmdQaXRjaCA+PiAxKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9ICp0b3BMKysgLSBvcmdZXzJbal07CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgICAgIHRlbXAgPSAqKGxlZnRMICs9IChwaWNQaXRjaCA+PiAxKSkgLSAqKG9yZ1lfMyArPSAob3JnUGl0Y2ggPj4gMSkpOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgIH0KKworICAgICAgICB0b3BMID0gdmlkZW8tPmN1cnJQaWMtPlNjciArIG9mZnNldDsKKyAgICAgICAgb3JnWV8yID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldCArICh5X3BvcyA+PiAyKSAqIChvcmdQaXRjaCAtIHBpY1BpdGNoKTsKKworICAgICAgICBsZWZ0TCA9IHRvcEwgLSAxOworICAgICAgICB0b3BMIC09IChwaWNQaXRjaCA+PiAxKTsKKyAgICAgICAgb3JnWV8zID0gb3JnWV8yIC0gKG9yZ1BpdGNoID4+IDEpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKnRvcEwrKyAtIG9yZ1lfMltqXTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICAgICAgdGVtcCA9ICoobGVmdEwgKz0gKHBpY1BpdGNoID4+IDEpKSAtICoob3JnWV8zICs9IChvcmdQaXRjaCA+PiAxKSk7CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbXBhcmUgbWluY29zdC8zODQgYW5kIFNCRS82NCAqLworICAgICAgICBBQkUgPSBTQkUgLyA2NC4wOworICAgICAgICBpZiAoQUJFKjAuOCA+PSBtaW5fY29zdCAvIDM4NC4wKQorICAgICAgICB7CisgICAgICAgICAgICBpbnRyYSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGludHJhOworfQorCisvKiBwZXJmb3JtIHNlYXJjaGluZyBmb3IgTUIgbW9kZSAqLworLyogYXNzdW1pbmcgdGhhdCB0aGlzIGlzIGRvbmUgaW5zaWRlIHRoZSBlbmNvZGluZyBsb29wLAorbm8gbmVlZCB0byBjYWxsIEluaXROZWlnaGJvckF2YWlsYWJpbGl0eSAqLworCit2b2lkIE1CSW50cmFTZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBtYm51bSwgdWludDggKmN1ckwsIGludCBwaWNQaXRjaCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgbWluX2Nvc3Q7CisgICAgdWludDggKm9yZ1k7CisgICAgaW50IHhfcG9zID0gKHZpZGVvLT5tYl94KSA8PCA0OworICAgIGludCB5X3BvcyA9ICh2aWRlby0+bWJfeSkgPDwgNDsKKyAgICB1aW50MzIgKnNhdmVkX2ludGVyOworICAgIGludCBqOworICAgIGludCBvcmdQaXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgYm9vbCBpbnRyYSA9IHRydWU7CisKKyAgICBjdXJyTUItPkNCUCA9IDA7CisKKyAgICAvKiBmaXJzdCBkbyBtb3Rpb24gdmVjdG9yIGFuZCB2YXJpYWJsZSBibG9jayBzaXplIHNlYXJjaCAqLworICAgIG1pbl9jb3N0ID0gZW5jdmlkLT5taW5fY29zdFttYm51bV07CisKKyAgICAvKiBub3cgcGVyZm9ybSBpbnRyYSBwcmVkaWN0aW9uIHNlYXJjaCAqLworICAgIC8qIG5lZWQgdG8gYWRkIHRoZSBjaGVjayBmb3IgZW5jdmlkLT5pbnRyYVNlYXJjaFt2aWRlby0+bWJOdW1dIHRvIHNraXAgaW50cmEKKyAgICAgICBpZiBpdCdzIG5vdCB3b3J0aCBjaGVja2luZy4gKi8KKyAgICBpZiAodmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UpCisgICAgeworICAgICAgICAvKiBEZWNpZGUgd2hldGhlciBpbnRyYSBzZWFyY2ggaXMgbmVjZXNzYXJ5IG9yIG5vdCAqLworICAgICAgICAvKiBUaGlzIG9uZSwgd2UgZG8gaXQgaW4gdGhlIGVuY29kaW5nIGxvb3Agc28gdGhlIG5laWdoYm9yaW5nIHBpeGVsIGFyZSB0aGUKKyAgICAgICAgYWN0dWFsIHJlY29uc3RydWN0ZWQgcGl4ZWxzLiAqLworICAgICAgICBpbnRyYSA9IEludHJhRGVjaXNpb25BQkUoZW5jdmlkLCBtaW5fY29zdCwgY3VyTCwgcGljUGl0Y2gpOworICAgIH0KKworICAgIGlmIChpbnRyYSA9PSB0cnVlIHx8IHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19JX1NMSUNFKQorICAgIHsKKyAgICAgICAgb3JnWSA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyB5X3BvcyAqIG9yZ1BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgLyogaTE2IG1vZGUgc2VhcmNoICovCisgICAgICAgIC8qIGdlbmVyYXRlIGFsbCB0aGUgcHJlZGljdGlvbnMgKi8KKyAgICAgICAgaW50cmFwcmVkX2x1bWFfMTZ4MTYoZW5jdmlkKTsKKworICAgICAgICAvKiBldmFsdWF0ZSB0aGVtIG9uZSBieSBvbmUgKi8KKyAgICAgICAgZmluZF9jb3N0XzE2eDE2KGVuY3ZpZCwgb3JnWSwgJm1pbl9jb3N0KTsKKworICAgICAgICBpZiAodmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNhdmUgY3VycmVudCBpbnRlciBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBzYXZlZF9pbnRlciA9IGVuY3ZpZC0+c3VicGVsX3ByZWQ7IC8qIHJldXNlIGV4aXN0aW5nIGJ1ZmZlciAqLworICAgICAgICAgICAgaiA9IDE2OworICAgICAgICAgICAgY3VyTCAtPSA0OworICAgICAgICAgICAgcGljUGl0Y2ggLT0gMTY7CisgICAgICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpzYXZlZF9pbnRlcisrID0gKigodWludDMyKikoY3VyTCArPSA0KSk7CisgICAgICAgICAgICAgICAgKnNhdmVkX2ludGVyKysgPSAqKCh1aW50MzIqKShjdXJMICs9IDQpKTsKKyAgICAgICAgICAgICAgICAqc2F2ZWRfaW50ZXIrKyA9ICooKHVpbnQzMiopKGN1ckwgKz0gNCkpOworICAgICAgICAgICAgICAgICpzYXZlZF9pbnRlcisrID0gKigodWludDMyKikoY3VyTCArPSA0KSk7CisgICAgICAgICAgICAgICAgY3VyTCArPSBwaWNQaXRjaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLyogaTQgbW9kZSBzZWFyY2ggKi8KKyAgICAgICAgbWJfaW50cmE0eDRfc2VhcmNoKGVuY3ZpZCwgJm1pbl9jb3N0KTsKKworICAgICAgICBlbmN2aWQtPm1pbl9jb3N0W21ibnVtXSA9IG1pbl9jb3N0OyAvKiB1cGRhdGUgbWluX2Nvc3QgKi8KKyAgICB9CisKKworICAgIGlmIChjdXJyTUItPm1iX2ludHJhKQorICAgIHsKKyAgICAgICAgY2hyb21hX2ludHJhX3NlYXJjaChlbmN2aWQpOworCisgICAgICAgIC8qIG5lZWQgdG8gc2V0IHRoaXMgaW4gb3JkZXIgZm9yIHRoZSBNQkludGVyUHJlZGljdGlvbiB0byB3b3JrISEgKi8KKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+bXZMMCwgMCwgc2l6ZW9mKGludDMyKSoxNik7CisgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFswXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDBbMl0gPSBjdXJyTUItPnJlZl9pZHhfTDBbM10gPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAodmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UgJiYgaW50cmEgPT0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8qIHJlc3RvcmUgY3VycmVudCBpbnRlciBwcmVkaWN0aW9uICovCisgICAgICAgIHNhdmVkX2ludGVyID0gZW5jdmlkLT5zdWJwZWxfcHJlZDsgLyogcmV1c2UgZXhpc3RpbmcgYnVmZmVyICovCisgICAgICAgIGogPSAxNjsKKyAgICAgICAgY3VyTCAtPSAoKHBpY1BpdGNoICsgMTYpIDw8IDQpOworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXJMICs9IDQpKSA9ICpzYXZlZF9pbnRlcisrOworICAgICAgICAgICAgKigodWludDMyKikoY3VyTCArPSA0KSkgPSAqc2F2ZWRfaW50ZXIrKzsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ckwgKz0gNCkpID0gKnNhdmVkX2ludGVyKys7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXJMICs9IDQpKSA9ICpzYXZlZF9pbnRlcisrOworICAgICAgICAgICAgY3VyTCArPSBwaWNQaXRjaDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qIGdlbmVyYXRlIGFsbCB0aGUgcHJlZGljdGlvbiB2YWx1ZXMgKi8KK3ZvaWQgaW50cmFwcmVkX2x1bWFfMTZ4MTYoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisKKyAgICBpbnQgeF9wb3MgPSAodmlkZW8tPm1iX3gpIDw8IDQ7CisgICAgaW50IHlfcG9zID0gKHZpZGVvLT5tYl95KSA8PCA0OworICAgIGludCBwaXRjaCA9IGN1cnJQaWMtPnBpdGNoOworCisgICAgaW50IG9mZnNldCA9IHlfcG9zICogcGl0Y2ggKyB4X3BvczsKKworICAgIHVpbnQ4ICpwcmVkLCAqdG9wLCAqbGVmdDsKKyAgICB1aW50OCAqY3VyTCA9IGN1cnJQaWMtPlNsICsgb2Zmc2V0OyAvKiBwb2ludCB0byByZWNvbnN0cnVjdGVkIGZyYW1lICovCisgICAgdWludDMyIHdvcmQxLCB3b3JkMiwgd29yZDMsIHdvcmQ0OworICAgIHVpbnQzMiBzdW0gPSAwOworCisgICAgaW50IGFfMTYsIGIsIGMsIGZhY3Rvcl9jOworICAgIHVpbnQ4ICpjb21wX3JlZl94MCwgKmNvbXBfcmVmX3gxLCAqY29tcF9yZWZfeTAsICpjb21wX3JlZl95MTsKKyAgICBpbnQgSCA9IDAsIFYgPSAwLCB0bXAsIHZhbHVlOworICAgIGludCBpOworCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIC8vZ2V0IHZlcnRpY2FsIHByZWRpY3Rpb24gbW9kZQorICAgICAgICB0b3AgPSBjdXJMIC0gcGl0Y2g7CisKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9WZXJ0aWNhbF0gLSAxNjsKKworICAgICAgICB3b3JkMSA9ICooKHVpbnQzMiopKHRvcCkpOyAgLyogcmVhZCA0IGJ5dGVzIGZyb20gdG9wICovCisgICAgICAgIHdvcmQyID0gKigodWludDMyKikodG9wICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSB0b3AgKi8KKyAgICAgICAgd29yZDMgPSAqKCh1aW50MzIqKSh0b3AgKyA4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHRvcCAqLworICAgICAgICB3b3JkNCA9ICooKHVpbnQzMiopKHRvcCArIDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHRvcCAqLworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDE2KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSB3b3JkMjsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSB3b3JkMzsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gd29yZDQ7CisKKyAgICAgICAgfQorCisgICAgICAgIHN1bSA9IHdvcmQxICYgMHhGRjAwRkY7CisgICAgICAgIHdvcmQxID0gKHdvcmQxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgIHN1bSArPSB3b3JkMTsKKyAgICAgICAgd29yZDEgPSAod29yZDIgJiAweEZGMDBGRik7CisgICAgICAgIHN1bSArPSB3b3JkMTsKKyAgICAgICAgd29yZDIgPSAod29yZDIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgc3VtICs9IHdvcmQyOworICAgICAgICB3b3JkMSA9ICh3b3JkMyAmIDB4RkYwMEZGKTsKKyAgICAgICAgc3VtICs9IHdvcmQxOworICAgICAgICB3b3JkMyA9ICh3b3JkMyA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICBzdW0gKz0gd29yZDM7CisgICAgICAgIHdvcmQxID0gKHdvcmQ0ICYgMHhGRjAwRkYpOworICAgICAgICBzdW0gKz0gd29yZDE7CisgICAgICAgIHdvcmQ0ID0gKHdvcmQ0ID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgIHN1bSArPSB3b3JkNDsKKworICAgICAgICBzdW0gKz0gKHN1bSA+PiAxNik7CisgICAgICAgIHN1bSAmPSAweEZGRkY7CisKKyAgICAgICAgaWYgKCF2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bSA9IChzdW0gKyA4KSA+PiA0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIC8vIGdldCBob3Jpem9udGFsIG1vZGUKKyAgICAgICAgbGVmdCA9IGN1ckwgLSAxIC0gcGl0Y2g7CisKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9Ib3Jpem9udGFsXSAtIDE2OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICB3b3JkMSA9ICoobGVmdCArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW0gKz0gd29yZDE7CisKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxIDw8IDgpIHwgd29yZDE7CisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSA8PCAxNikgfCB3b3JkMTsgLyogbWFrZSBpdCA0ICovCisKKyAgICAgICAgICAgICoodWludDMyKikocHJlZCArPSAxNikgPSB3b3JkMTsKKyAgICAgICAgICAgICoodWludDMyKikocHJlZCArIDQpID0gd29yZDE7CisgICAgICAgICAgICAqKHVpbnQzMiopKHByZWQgKyA4KSA9IHdvcmQxOworICAgICAgICAgICAgKih1aW50MzIqKShwcmVkICsgMTIpID0gd29yZDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgc3VtID0gKHN1bSArIDgpID4+IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gPSAoc3VtICsgMTYpID4+IDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBnZXQgREMgbW9kZQorICAgIGlmICghdmlkZW8tPmludHJhQXZhaWxBICYmICF2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBzdW0gPSAweDgwODA4MDgwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdW0gPSAoc3VtIDw8IDgpIHwgc3VtOworICAgICAgICBzdW0gPSAoc3VtIDw8IDE2KSB8IHN1bTsKKyAgICB9CisKKyAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X0RDXSAtIDE2OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSAxNikpID0gc3VtOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gc3VtOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gc3VtOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHN1bTsKKyAgICB9CisKKyAgICAvLyBnZXQgcGxhbmUgbW9kZQorICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICB7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfUGxhbmVdIC0gMTY7CisKKyAgICAgICAgY29tcF9yZWZfeDAgPSBjdXJMIC0gcGl0Y2ggKyA4OworICAgICAgICBjb21wX3JlZl94MSA9IGN1ckwgLSBwaXRjaCArIDY7CisgICAgICAgIGNvbXBfcmVmX3kwID0gY3VyTCAtIDEgKyAocGl0Y2ggPDwgMyk7CisgICAgICAgIGNvbXBfcmVmX3kxID0gY3VyTCAtIDEgKyA2ICogcGl0Y2g7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgSCArPSBpICogKCpjb21wX3JlZl94MCsrIC0gKmNvbXBfcmVmX3gxLS0pOworICAgICAgICAgICAgViArPSBpICogKCpjb21wX3JlZl95MCAtICpjb21wX3JlZl95MSk7CisgICAgICAgICAgICBjb21wX3JlZl95MCArPSBwaXRjaDsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kxIC09IHBpdGNoOworICAgICAgICB9CisKKyAgICAgICAgSCArPSBpICogKCpjb21wX3JlZl94MCsrIC0gY3VyTFstcGl0Y2gtMV0pOworICAgICAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKKworCisgICAgICAgIGFfMTYgPSAoKCooY3VyTCAtIHBpdGNoICsgMTUpICsgKihjdXJMIC0gMSArIDE1ICogcGl0Y2gpKSA8PCA0KSArIDE2OzsKKyAgICAgICAgYiA9ICg1ICogSCArIDMyKSA+PiA2OworICAgICAgICBjID0gKDUgKiBWICsgMzIpID4+IDY7CisKKyAgICAgICAgdG1wID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhY3Rvcl9jID0gYV8xNiArIGMgKiAodG1wKysgLSA3KTsKKyAgICAgICAgICAgIGZhY3Rvcl9jIC09IDcgKiBiOworCisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDgpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDE2KSkgPSB3b3JkMTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSB3b3JkMTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSB3b3JkMTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSB3b3JkMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogZXZhbHVhdGUgZWFjaCBwcmVkaWN0aW9uIG1vZGUgb2YgSTE2ICovCit2b2lkIGZpbmRfY29zdF8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKm9yZ1ksIGludCAqbWluX2Nvc3QpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IGNvc3Q7CisgICAgaW50IG9yZ19waXRjaCA9IGVuY3ZpZC0+Y3VycklucHV0LT5waXRjaDsKKworICAgIC8qIGV2YWx1YXRlIHZlcnRpY2FsIG1vZGUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgY29zdCA9IGNvc3RfaTE2KG9yZ1ksIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X1ZlcnRpY2FsXSwgKm1pbl9jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfVmVydGljYWw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIGV2YWx1YXRlIGhvcml6b250YWwgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBjb3N0ID0gY29zdF9pMTYob3JnWSwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfSG9yaXpvbnRhbF0sICptaW5fY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgKm1pbl9jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAqbWluX2Nvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTE2OworICAgICAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0hvcml6b250YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBldmFsdWF0ZSBEQyBtb2RlICovCisgICAgY29zdCA9IGNvc3RfaTE2KG9yZ1ksIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X0RDXSwgKm1pbl9jb3N0KTsKKyAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICB7CisgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0kxNjsKKyAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7CisgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfREM7CisgICAgfQorCisgICAgLyogZXZhbHVhdGUgcGxhbmUgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICB7CisgICAgICAgIGNvc3QgPSBjb3N0X2kxNihvcmdZLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9QbGFuZV0sICptaW5fY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgKm1pbl9jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICAqbWluX2Nvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTE2OworICAgICAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X1BsYW5lOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCitpbnQgY29zdF9pMTYodWludDggKm9yZywgaW50IG9yZ19waXRjaCwgdWludDggKnByZWQsIGludCBtaW5fY29zdCkKK3sKKworICAgIGludCBjb3N0OworICAgIGludCBqLCBrOworICAgIGludDE2IHJlc1syNTZdLCAqcHJlczsgLy8gcmVzaWR1ZQorICAgIGludCBtMCwgbTEsIG0yLCBtMzsKKworICAgIC8vIGNhbGN1bGF0ZSBTQVRECisgICAgb3JnX3BpdGNoIC09IDE2OworICAgIHByZXMgPSByZXM7CisgICAgLy8gaG9yaXpvbnRhbCB0cmFuc2Zvcm0KKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIGsgPSA0OworICAgICAgICB3aGlsZSAoayA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gb3JnWzBdIC0gcHJlZFswXTsKKyAgICAgICAgICAgIG0zID0gb3JnWzNdIC0gcHJlZFszXTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gb3JnWzFdIC0gcHJlZFsxXTsKKyAgICAgICAgICAgIG0yID0gb3JnWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICAgICAgcHJlc1syXSA9IG0wIC0gbTE7CisgICAgICAgICAgICBwcmVzWzFdID0gbTIgKyBtMzsKKyAgICAgICAgICAgIHByZXNbM10gPSBtMyAtIG0yOworCisgICAgICAgICAgICBvcmcgKz0gNDsKKyAgICAgICAgICAgIHByZXMgKz0gNDsKKyAgICAgICAgICAgIHByZWQgKz0gNDsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgfQorICAgICAgICBvcmcgKz0gb3JnX3BpdGNoOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KKyAgICBjb3N0ID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgIHsKKyAgICAgICAgcHJlcyA9IHJlcyArIChqIDw8IDYpOworICAgICAgICBrID0gMTY7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICAgICAgbTMgPSBwcmVzWzM8PDRdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBwcmVzWzE8PDRdOworICAgICAgICAgICAgbTIgPSBwcmVzWzI8PDRdOworICAgICAgICAgICAgbTEgKz0gbTI7CisgICAgICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgcHJlc1swXSA9IG0wID0gbTAgKyBtMTsKKworICAgICAgICAgICAgaWYgKGsmMHgzKSAgLy8gb25seSBzdW0gdXAgbm9uIERDIHZhbHVlcy4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3N0ICs9ICgobTAgPiAwKSA/IG0wIDogLW0wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbTEgPSBtMCAtIChtMSA8PCAxKTsKKyAgICAgICAgICAgIGNvc3QgKz0gKChtMSA+IDApID8gbTEgOiAtbTEpOworICAgICAgICAgICAgbTMgPSBtMiArIG0zOworICAgICAgICAgICAgY29zdCArPSAoKG0zID4gMCkgPyBtMyA6IC1tMyk7CisgICAgICAgICAgICBtMiA9IG0zIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgY29zdCArPSAoKG0yID4gMCkgPyBtMiA6IC1tMik7CisKKyAgICAgICAgICAgIHByZXMrKzsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNvc3QgPj4gMSkgPiBtaW5fY29zdCkgLyogZWFybHkgZHJvcCBvdXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChjb3N0ID4+IDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSGFkYW1hcmQgb2YgdGhlIERDIGNvZWZmaWNpZW50ICovCisgICAgcHJlcyA9IHJlczsKKyAgICBrID0gNDsKKyAgICB3aGlsZSAoayA+IDApCisgICAgeworICAgICAgICBtMCA9IHByZXNbMF07CisgICAgICAgIG0zID0gcHJlc1szPDwyXTsKKyAgICAgICAgbTAgPj49IDI7CisgICAgICAgIG0wICs9IChtMyA+PiAyKTsKKyAgICAgICAgbTMgPSBtMCAtIChtMyA+PiAxKTsKKyAgICAgICAgbTEgPSBwcmVzWzE8PDJdOworICAgICAgICBtMiA9IHByZXNbMjw8Ml07CisgICAgICAgIG0xID4+PSAyOworICAgICAgICBtMSArPSAobTIgPj4gMik7CisgICAgICAgIG0yID0gbTEgLSAobTIgPj4gMSk7CisgICAgICAgIHByZXNbMF0gPSAobTAgKyBtMSk7CisgICAgICAgIHByZXNbMjw8Ml0gPSAobTAgLSBtMSk7CisgICAgICAgIHByZXNbMTw8Ml0gPSAobTIgKyBtMyk7CisgICAgICAgIHByZXNbMzw8Ml0gPSAobTMgLSBtMik7CisgICAgICAgIHByZXMgKz0gKDQgPDwgNCk7CisgICAgICAgIGstLTsKKyAgICB9CisKKyAgICBwcmVzID0gcmVzOworICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgbTMgPSBwcmVzWzM8PDZdOworICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgbTEgPSBwcmVzWzE8PDZdOworICAgICAgICBtMiA9IHByZXNbMjw8Nl07CisgICAgICAgIG0xICs9IG0yOworICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICBtMCA9IG0wICsgbTE7CisgICAgICAgIGNvc3QgKz0gKChtMCA+PSAwKSA/IG0wIDogLW0wKTsKKyAgICAgICAgbTEgPSBtMCAtIChtMSA8PCAxKTsKKyAgICAgICAgY29zdCArPSAoKG0xID49IDApID8gbTEgOiAtbTEpOworICAgICAgICBtMyA9IG0yICsgbTM7CisgICAgICAgIGNvc3QgKz0gKChtMyA+PSAwKSA/IG0zIDogLW0zKTsKKyAgICAgICAgbTIgPSBtMyAtIChtMiA8PCAxKTsKKyAgICAgICAgY29zdCArPSAoKG0yID49IDApID8gbTIgOiAtbTIpOworICAgICAgICBwcmVzICs9IDQ7CisKKyAgICAgICAgaWYgKChjb3N0ID4+IDEpID4gbWluX2Nvc3QpIC8qIGVhcmx5IGRyb3Agb3V0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoY29zdCA+PiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGstLTsKKyAgICB9CisKKyAgICByZXR1cm4gKGNvc3QgPj4gMSk7Cit9CisKKwordm9pZCBtYl9pbnRyYTR4NF9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCAqbWluX2Nvc3QpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBpbnQgcGl0Y2ggPSBjdXJyUGljLT5waXRjaDsKKyAgICBpbnQgb3JnX3BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBpbnQgb2Zmc2V0OworICAgIHVpbnQ4ICpjdXJMLCAqY29tcCwgKm9yZzQsICpvcmc4OworICAgIGludCB5ID0gdmlkZW8tPm1iX3kgPDwgNDsKKyAgICBpbnQgeCA9IHZpZGVvLT5tYl94IDw8IDQ7CisKKyAgICBpbnQgYjgsIGI0LCBjb3N0NHg0LCBibGtpZHg7CisgICAgaW50IGNvc3QgPSAwOworICAgIGludCBudW1jb2VmOworICAgIGludCBkdW1teSA9IDA7CisgICAgaW50IG1iX2ludHJhID0gY3Vyck1CLT5tYl9pbnRyYTsgLy8gc2F2ZSB0aGUgb3JpZ2luYWwgdmFsdWUKKworICAgIG9mZnNldCA9IHkgKiBwaXRjaCArIHg7CisKKyAgICBjdXJMID0gY3VyclBpYy0+U2wgKyBvZmZzZXQ7CisgICAgb3JnOCA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyB5ICogb3JnX3BpdGNoICsgeDsKKyAgICB2aWRlby0+cHJlZF9waXRjaCA9IDQ7CisKKyAgICBjb3N0ID0gKGludCkoNi4wICogZW5jdmlkLT5sYW1iZGFfbW9kZSArIDAuNDk5OSk7CisgICAgY29zdCA8PD0gMjsKKworICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOyAgLy8gdGVtcG9yYXJ5IHNldCB0aGlzIHRvIG9uZSB0byBlbmFibGUgdGhlIElEQ1QKKyAgICAvLyBvcGVyYXRpb24gaW5zaWRlIGRjdF9sdW1hCisKKyAgICBmb3IgKGI4ID0gMDsgYjggPCA0OyBiOCsrKQorICAgIHsKKyAgICAgICAgY29tcCA9IGN1ckw7CisgICAgICAgIG9yZzQgPSBvcmc4OworCisgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsa2lkeCA9IGJsa0lkeDJibGtYWVtiOF1bYjRdOworICAgICAgICAgICAgY29zdDR4NCA9IGJsa19pbnRyYTR4NF9zZWFyY2goZW5jdmlkLCBibGtpZHgsIGNvbXAsIG9yZzQpOworICAgICAgICAgICAgY29zdCArPSBjb3N0NHg0OworICAgICAgICAgICAgaWYgKGNvc3QgPiAqbWluX2Nvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IG1iX2ludHJhOyAvLyByZXN0b3JlIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGRvIHJlc2lkdWUsIFhmcm0sIFEsIGludlEsIGludlhmcm0sIHJlY29uIGFuZCBzYXZlIHRoZSBEQ1QgY29lZnMuKi8KKyAgICAgICAgICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gZW5jdmlkLT5wcmVkX2k0W2N1cnJNQi0+aTRNb2RlW2Jsa2lkeF1dOworICAgICAgICAgICAgbnVtY29lZiA9IGRjdF9sdW1hKGVuY3ZpZCwgYmxraWR4LCBjb21wLCBvcmc0LCAmZHVtbXkpOworICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHhdID0gbnVtY29lZjsKKyAgICAgICAgICAgIGlmIChudW1jb2VmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5jYnA0eDQgfD0gKDEgPDwgYmxraWR4KTsKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCB8PSAoMSA8PCBiOCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiNCYxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXAgKz0gKChwaXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgICAgIG9yZzQgKz0gKChvcmdfcGl0Y2ggPDwgMikgLSA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb21wICs9IDQ7CisgICAgICAgICAgICAgICAgb3JnNCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGI4JjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1ckwgKz0gKChwaXRjaCA8PCAzKSAtIDgpOworICAgICAgICAgICAgb3JnOCArPSAoKG9yZ19waXRjaCA8PCAzKSAtIDgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3VyTCArPSA4OworICAgICAgICAgICAgb3JnOCArPSA4OworICAgICAgICB9CisgICAgfQorCisgICAgY3Vyck1CLT5tYl9pbnRyYSA9IG1iX2ludHJhOyAvLyByZXN0b3JlIHRoZSB2YWx1ZQorCisgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgeworICAgICAgICAqbWluX2Nvc3QgPSBjb3N0OworICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JNDsKKyAgICAgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBzZWFyY2ggZm9yIGk0IG1vZGUgZm9yIGEgNHg0IGJsb2NrICovCitpbnQgYmxrX2ludHJhNHg0X3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IGJsa2lkeCwgdWludDggKmN1ciwgdWludDggKm9yZykKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTmVpZ2hib3JBdmFpbGFiaWxpdHkgYXZhaWxhYmlsaXR5OworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgYm9vbCB0b3BfbGVmdCA9IEZBTFNFOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICB1aW50OCBtb2RlX2F2YWlsW0FWQ051bUk0UHJlZE1vZGVdOworICAgIHVpbnQzMiB0ZW1wLCBEQzsKKyAgICB1aW50OCAqcHJlZDsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworICAgIHVpbnQxNiBtaW5fY29zdCwgY29zdDsKKworICAgIGludCBQX3gsIFFfeCwgUl94LCBQX3ksIFFfeSwgUl95LCBELCBEMCwgRDE7CisgICAgaW50IFAwLCBRMCwgUjAsIFMwLCBQMSwgUTEsIFIxLCBQMiwgUTI7CisgICAgdWludDggUF9BLCBQX0IsIFBfQywgUF9ELCBQX0UsIFBfRiwgUF9HLCBQX0gsIFBfSSwgUF9KLCBQX0ssIFBfTCwgUF9YOworICAgIGludCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjc7CisgICAgaW50IHgwLCB4MSwgeDIsIHgzLCB4NCwgeDU7CisgICAgdWludDMyIHRlbXAxLCB0ZW1wMjsKKworICAgIGludCBpcG1vZGUsIG1vc3RQcm9iYWJsZU1vZGU7CisgICAgaW50IGZpeGVkY29zdCA9IDQgKiBlbmN2aWQtPmxhbWJkYV9tb2RlOworICAgIGludCBtaW5fc2FkID0gMHg3RkZGOworCisgICAgYXZhaWxhYmlsaXR5LmxlZnQgPSBUUlVFOworICAgIGF2YWlsYWJpbGl0eS50b3AgPSBUUlVFOworICAgIGlmIChibGtpZHggPD0gMykgLyogdG9wIHJvdyBibG9jayAgKCFibG9ja195KSAqLworICAgIHsgLyogY2hlY2sgYXZhaWxhYmlsaXR5IHVwICovCisgICAgICAgIGF2YWlsYWJpbGl0eS50b3AgPSB2aWRlby0+aW50cmFBdmFpbEIgOworICAgIH0KKyAgICBpZiAoIShibGtpZHgmMHgzKSkgLyogbGVmdCBjb2x1bW4gYmxvY2sgKCFibG9ja194KSovCisgICAgeyAvKiBjaGVjayBhdmFpbGFiaWxpdHkgbGVmdCAqLworICAgICAgICBhdmFpbGFiaWxpdHkubGVmdCA9IHZpZGVvLT5pbnRyYUF2YWlsQSA7CisgICAgfQorICAgIGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPSBCbGtUb3BSaWdodFtibGtpZHhdOworCisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPT0gMikKKyAgICB7CisgICAgICAgIGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPSB2aWRlby0+aW50cmFBdmFpbEI7CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPT0gMykKKyAgICB7CisgICAgICAgIGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPSB2aWRlby0+aW50cmFBdmFpbEM7CisgICAgfQorCisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3AgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHVpbnQzMiopKGN1ciAtIHBpdGNoKTsKKyAgICAgICAgUF9BID0gdGVtcCAmIDB4RkY7CisgICAgICAgIFBfQiA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgUF9DID0gKHRlbXAgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgUF9EID0gKHRlbXAgPj4gMjQpICYgMHhGRjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUF9BID0gUF9CID0gUF9DID0gUF9EID0gMTI4OworICAgIH0KKworICAgIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0ID09IFRSVUUpCisgICAgeworICAgICAgICB0ZW1wID0gKih1aW50MzIqKShjdXIgLSBwaXRjaCArIDQpOworICAgICAgICBQX0UgPSB0ZW1wICYgMHhGRjsKKyAgICAgICAgUF9GID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICBQX0cgPSAodGVtcCA+PiAxNikgJiAweEZGOworICAgICAgICBQX0ggPSAodGVtcCA+PiAyNCkgJiAweEZGOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX0UgPSBQX0YgPSBQX0cgPSBQX0ggPSAxMjg7CisgICAgfQorCisgICAgaWYgKGF2YWlsYWJpbGl0eS5sZWZ0ID09IFRSVUUpCisgICAgeworICAgICAgICBjdXItLTsKKyAgICAgICAgUF9JID0gKmN1cjsKKyAgICAgICAgUF9KID0gKihjdXIgKz0gcGl0Y2gpOworICAgICAgICBQX0sgPSAqKGN1ciArPSBwaXRjaCk7CisgICAgICAgIFBfTCA9ICooY3VyICsgcGl0Y2gpOworICAgICAgICBjdXIgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICBjdXIrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUF9JID0gUF9KID0gUF9LID0gUF9MID0gMTI4OworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRvcC1sZWZ0IHBpeGVsIGlzIGF2YWlsYWJsZSAqLworICAgIGlmICgoKGJsa2lkeCA+IDMpICYmIChibGtpZHgmMHgzKSkgfHwgKChibGtpZHggPiAzKSAmJiB2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgICAgICB8fCAoKGJsa2lkeCYweDMpICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgIHx8ICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxEICYmIHZpZGVvLT5pbnRyYUF2YWlsQikpCisgICAgeworICAgICAgICB0b3BfbGVmdCA9IFRSVUU7CisgICAgICAgIFBfWCA9ICooY3VyIC0gcGl0Y2ggLSAxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUF9YID0gMTI4OworICAgIH0KKworICAgIC8vPT09PT0gSU5UUkEgUFJFRElDVElPTiBGT1IgNHg0IEJMT0NLID09PT09CisgICAgLyogdmVydGljYWwgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF0gPSAwOworICAgIGlmIChhdmFpbGFiaWxpdHkudG9wKQorICAgIHsKKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfVmVydGljYWxdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfVmVydGljYWxdOworCisgICAgICAgIHRlbXAgPSAoUF9EIDw8IDI0KSB8IChQX0MgPDwgMTYpIHwgKFBfQiA8PCA4KSB8IFBfQSA7CisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSAgdGVtcDsgLyogd3JpdGUgNCBhdCBhIHRpbWUgKi8KKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKyAgICB9CisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxdID0gMDsKKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsX1VwXSA9IDA7CisgICAgaWYgKGF2YWlsYWJpbGl0eS5sZWZ0KQorICAgIHsKKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9Ib3Jpem9udGFsXTsKKworICAgICAgICB0ZW1wID0gUF9JIHwgKFBfSSA8PCA4KTsKKyAgICAgICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7CisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOworICAgICAgICB0ZW1wID0gUF9KIHwgKFBfSiA8PCA4KTsKKyAgICAgICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAgICAgdGVtcCA9IFBfSyB8IChQX0sgPDwgOCk7CisgICAgICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgICAgIHRlbXAgPSBQX0wgfCAoUF9MIDw8IDgpOworICAgICAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxfVXBdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfSG9yaXpvbnRhbF9VcF07CisKKyAgICAgICAgUTAgPSAoUF9KICsgUF9LICsgMSkgPj4gMTsKKyAgICAgICAgUTEgPSAoUF9KICsgKFBfSyA8PCAxKSArIFBfTCArIDIpID4+IDI7CisgICAgICAgIFAwID0gKChQX0kgKyBQX0ogKyAxKSA+PiAxKTsKKyAgICAgICAgUDEgPSAoKFBfSSArIChQX0ogPDwgMSkgKyBQX0sgKyAyKSA+PiAyKTsKKworICAgICAgICB0ZW1wID0gUDAgfCAoUDEgPDwgOCk7ICAgICAgLy8gW1AwIFAxIFEwIFExXQorICAgICAgICB0ZW1wIHw9IChRMCA8PCAxNik7ICAgICAvLyBbUTAgUTEgUjAgRE9dCisgICAgICAgIHRlbXAgfD0gKFExIDw8IDI0KTsgICAgIC8vIFtSMCBEMCBEMSBEMV0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7ICAgICAgLy8gW0QxIEQxIEQxIEQxXQorCisgICAgICAgIEQwID0gKFBfSyArIDMgKiBQX0wgKyAyKSA+PiAyOworICAgICAgICBSMCA9IChQX0sgKyBQX0wgKyAxKSA+PiAxOworCisgICAgICAgIHRlbXAgPSBRMCB8IChRMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUjAgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChEMCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICBEMSA9IFBfTDsKKworICAgICAgICB0ZW1wID0gUjAgfCAoRDAgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKEQxIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoRDEgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IEQxIHwgKEQxIDw8IDgpOworICAgICAgICB0ZW1wIHw9ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgIH0KKyAgICAvKiBEQyAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RDXSA9IDE7CisgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfRENdOworICAgIGlmIChhdmFpbGFiaWxpdHkubGVmdCkKKyAgICB7CisgICAgICAgIERDID0gUF9JICsgUF9KICsgUF9LICsgUF9MOworCisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkudG9wKQorICAgICAgICB7CisgICAgICAgICAgICBEQyA9IChQX0EgKyBQX0IgKyBQX0MgKyBQX0QgKyBEQyArIDQpID4+IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBEQyA9IChEQyArIDIpID4+IDI7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChhdmFpbGFiaWxpdHkudG9wKQorICAgIHsKKyAgICAgICAgREMgPSAoUF9BICsgUF9CICsgUF9DICsgUF9EICsgMikgPj4gMjsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBEQyA9IDEyODsKKyAgICB9CisKKyAgICB0ZW1wID0gREMgfCAoREMgPDwgOCk7CisgICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7CisgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAvKiBEb3duLWxlZnQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnRdID0gMDsKKworICAgIGlmIChhdmFpbGFiaWxpdHkudG9wKQorICAgIHsKKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0XSA9IDE7CisKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0XTsKKworICAgICAgICByMCA9IFBfQTsKKyAgICAgICAgcjEgPSBQX0I7CisgICAgICAgIHIyID0gUF9DOworICAgICAgICByMyA9IFBfRDsKKworICAgICAgICByMCArPSAocjEgPDwgMSk7CisgICAgICAgIHIwICs9IHIyOworICAgICAgICByMCArPSAyOworICAgICAgICByMCA+Pj0gMjsKKyAgICAgICAgcjEgKz0gKHIyIDw8IDEpOworICAgICAgICByMSArPSByMzsKKyAgICAgICAgcjEgKz0gMjsKKyAgICAgICAgcjEgPj49IDI7CisKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eS50b3BfcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHI0ID0gUF9FOworICAgICAgICAgICAgcjUgPSBQX0Y7CisgICAgICAgICAgICByNiA9IFBfRzsKKyAgICAgICAgICAgIHI3ID0gUF9IOworCisgICAgICAgICAgICByMiArPSAocjMgPDwgMSk7CisgICAgICAgICAgICByMiArPSByNDsKKyAgICAgICAgICAgIHIyICs9IDI7CisgICAgICAgICAgICByMiA+Pj0gMjsKKyAgICAgICAgICAgIHIzICs9IChyNCA8PCAxKTsKKyAgICAgICAgICAgIHIzICs9IHI1OworICAgICAgICAgICAgcjMgKz0gMjsKKyAgICAgICAgICAgIHIzID4+PSAyOworICAgICAgICAgICAgcjQgKz0gKHI1IDw8IDEpOworICAgICAgICAgICAgcjQgKz0gcjY7CisgICAgICAgICAgICByNCArPSAyOworICAgICAgICAgICAgcjQgPj49IDI7CisgICAgICAgICAgICByNSArPSAocjYgPDwgMSk7CisgICAgICAgICAgICByNSArPSByNzsKKyAgICAgICAgICAgIHI1ICs9IDI7CisgICAgICAgICAgICByNSA+Pj0gMjsKKyAgICAgICAgICAgIHI2ICs9ICgzICogcjcpOworICAgICAgICAgICAgcjYgKz0gMjsKKyAgICAgICAgICAgIHI2ID4+PSAyOworICAgICAgICAgICAgdGVtcCA9IHIwIHwgKHIxIDw8IDgpOworICAgICAgICAgICAgdGVtcCB8PSAocjIgPDwgMTYpOworICAgICAgICAgICAgdGVtcCB8PSAocjMgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyNCA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyNSA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyNiA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByMiArPSAocjMgKiAzKTsKKyAgICAgICAgICAgIHIyICs9IDI7CisgICAgICAgICAgICByMiA+Pj0gMjsKKyAgICAgICAgICAgIHIzID0gKChyMyA8PCAyKSArIDIpOworICAgICAgICAgICAgcjMgPj49IDI7CisKKyAgICAgICAgICAgIHRlbXAgPSByMCB8IChyMSA8PCA4KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHIyIDw8IDE2KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHIzIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOworCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjMgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjMgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPj4gOCkgfCAocjMgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBEb3duIFJpZ2h0ICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfRGlhZ29uYWxfRG93bl9SaWdodF0gPSAwOworICAgIC8qIERpYWdvbmFsIFZlcnRpY2FsIFJpZ2h0ICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfVmVydGljYWxfUmlnaHRdID0gMDsKKyAgICAvKiBIb3Jpem9udGFsIERvd24gKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsX0Rvd25dID0gMDsKKworICAgIGlmICh0b3BfbGVmdCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgLyogRG93biBSaWdodCAqLworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9EaWFnb25hbF9Eb3duX1JpZ2h0XSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0RpYWdvbmFsX0Rvd25fUmlnaHRdOworCisgICAgICAgIFFfeCA9IChQX0EgKyAyICogUF9CICsgUF9DICsgMikgPj4gMjsKKyAgICAgICAgUl94ID0gKFBfQiArIDIgKiBQX0MgKyBQX0QgKyAyKSA+PiAyOworICAgICAgICBQX3ggPSAoUF9YICsgMiAqIFBfQSArIFBfQiArIDIpID4+IDI7CisgICAgICAgIEQgICA9IChQX0EgKyAyICogUF9YICsgUF9JICsgMikgPj4gMjsKKyAgICAgICAgUF95ID0gKFBfWCArIDIgKiBQX0kgKyBQX0ogKyAyKSA+PiAyOworICAgICAgICBRX3kgPSAoUF9JICsgMiAqIFBfSiArIFBfSyArIDIpID4+IDI7CisgICAgICAgIFJfeSA9IChQX0ogKyAyICogUF9LICsgUF9MICsgMikgPj4gMjsKKworICAgICAgICAvKiB3ZSBjYW4gcGFjayB0aGVzZSAqLworICAgICAgICB0ZW1wID0gIEQgfCAoUF94IDw8IDgpOyAgIC8vW0QgICBQX3ggUV94IFJfeF0KKyAgICAgICAgLy9bUF95IEQgICBQX3ggUV94XQorICAgICAgICB0ZW1wIHw9IChRX3ggPDwgMTYpOyAvL1tRX3kgUF95IEQgICBQX3hdCisgICAgICAgIHRlbXAgfD0gKFJfeCA8PCAyNCk7ICAvL1tSX3kgUV95IFBfeSBEICBdCisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSAgUF95IHwgKEQgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFBfeCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFFfeCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gIFFfeSB8IChQX3kgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKEQgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChQX3ggPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFJfeSB8IChRX3kgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFBfeSA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKEQgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKworICAgICAgICAvKiBEaWFnb25hbCBWZXJ0aWNhbCBSaWdodCAqLworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9SaWdodF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9WZXJ0aWNhbF9SaWdodF07CisKKyAgICAgICAgUTAgPSBQX0EgKyBQX0IgKyAxOworICAgICAgICBSMCA9IFBfQiArIFBfQyArIDE7CisgICAgICAgIFMwID0gUF9DICsgUF9EICsgMTsKKyAgICAgICAgUDAgPSBQX1ggKyBQX0EgKyAxOworICAgICAgICBEID0gKFBfSSArIDIgKiBQX1ggKyBQX0EgKyAyKSA+PiAyOworCisgICAgICAgIFAxID0gKFAwICsgUTApID4+IDI7CisgICAgICAgIFExID0gKFEwICsgUjApID4+IDI7CisgICAgICAgIFIxID0gKFIwICsgUzApID4+IDI7CisKKyAgICAgICAgUDAgPj49IDE7CisgICAgICAgIFEwID4+PSAxOworICAgICAgICBSMCA+Pj0gMTsKKyAgICAgICAgUzAgPj49IDE7CisKKyAgICAgICAgUDIgPSAoUF9YICsgMiAqIFBfSSArIFBfSiArIDIpID4+IDI7CisgICAgICAgIFEyID0gKFBfSSArIDIgKiBQX0ogKyBQX0sgKyAyKSA+PiAyOworCisgICAgICAgIHRlbXAgPSAgUDAgfCAoUTAgPDwgOCk7ICAvL1tQMCBRMCBSMCBTMF0KKyAgICAgICAgLy9bRCAgUDEgUTEgUjFdCisgICAgICAgIHRlbXAgfD0gKFIwIDw8IDE2KTsgLy9bUDIgUDAgUTAgUjBdCisgICAgICAgIHRlbXAgfD0gKFMwIDw8IDI0KTsgLy9bUTIgRCAgUDEgUTFdCisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSAgdGVtcDsKKworICAgICAgICB0ZW1wID0gIEQgfCAoUDEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFExIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUjEgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworCisgICAgICAgIHRlbXAgPSBQMiB8IChQMCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUTAgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChSMCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFEyIHwgKEQgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFAxIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUTEgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworCisKKyAgICAgICAgLyogSG9yaXpvbnRhbCBEb3duICovCisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxfRG93bl0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9Ib3Jpem9udGFsX0Rvd25dOworCisKKyAgICAgICAgUTIgPSAoUF9BICsgMiAqIFBfQiArIFBfQyArIDIpID4+IDI7CisgICAgICAgIFAyID0gKFBfWCArIDIgKiBQX0EgKyBQX0IgKyAyKSA+PiAyOworICAgICAgICBEID0gKFBfSSArIDIgKiBQX1ggKyBQX0EgKyAyKSA+PiAyOworICAgICAgICBQMCA9IFBfWCArIFBfSSArIDE7CisgICAgICAgIFEwID0gUF9JICsgUF9KICsgMTsKKyAgICAgICAgUjAgPSBQX0ogKyBQX0sgKyAxOworICAgICAgICBTMCA9IFBfSyArIFBfTCArIDE7CisKKyAgICAgICAgUDEgPSAoUDAgKyBRMCkgPj4gMjsKKyAgICAgICAgUTEgPSAoUTAgKyBSMCkgPj4gMjsKKyAgICAgICAgUjEgPSAoUjAgKyBTMCkgPj4gMjsKKworICAgICAgICBQMCA+Pj0gMTsKKyAgICAgICAgUTAgPj49IDE7CisgICAgICAgIFIwID4+PSAxOworICAgICAgICBTMCA+Pj0gMTsKKworCisgICAgICAgIC8qIHdlIGNhbiBwYWNrIHRoZXNlICovCisgICAgICAgIHRlbXAgPSBQMCB8IChEIDw8IDgpOyAgIC8vW1AwIEQgIFAyIFEyXQorICAgICAgICAvL1tRMCBQMSBQMCBEIF0KKyAgICAgICAgdGVtcCB8PSAoUDIgPDwgMTYpOyAgLy9bUjAgUTEgUTAgUDFdCisgICAgICAgIHRlbXAgfD0gKFEyIDw8IDI0KTsgLy9bUzAgUjEgUjAgUTFdCisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBRMCB8IChQMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUDAgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChEIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBSMCB8IChRMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUTAgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChQMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gUzAgfCAoUjEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKFIwIDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUTEgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICB9CisKKyAgICAvKiB2ZXJ0aWNhbCBsZWZ0ICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfVmVydGljYWxfTGVmdF0gPSAwOworICAgIGlmIChhdmFpbGFiaWxpdHkudG9wKQorICAgIHsKKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfVmVydGljYWxfTGVmdF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9WZXJ0aWNhbF9MZWZ0XTsKKworICAgICAgICB4MCA9IFBfQSArIFBfQiArIDE7CisgICAgICAgIHgxID0gUF9CICsgUF9DICsgMTsKKyAgICAgICAgeDIgPSBQX0MgKyBQX0QgKyAxOworICAgICAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgeDMgPSBQX0QgKyBQX0UgKyAxOworICAgICAgICAgICAgeDQgPSBQX0UgKyBQX0YgKyAxOworICAgICAgICAgICAgeDUgPSBQX0YgKyBQX0cgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeDMgPSB4NCA9IHg1ID0gKFBfRCA8PCAxKSArIDE7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wMSA9ICh4MCA+PiAxKTsKKyAgICAgICAgdGVtcDEgfD0gKCh4MSA+PiAxKSA8PCA4KTsKKyAgICAgICAgdGVtcDEgfD0gKCh4MiA+PiAxKSA8PCAxNik7CisgICAgICAgIHRlbXAxIHw9ICgoeDMgPj4gMSkgPDwgMjQpOworCisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSB0ZW1wMTsKKworICAgICAgICB0ZW1wMiA9ICgoeDAgKyB4MSkgPj4gMik7CisgICAgICAgIHRlbXAyIHw9ICgoKHgxICsgeDIpID4+IDIpIDw8IDgpOworICAgICAgICB0ZW1wMiB8PSAoKCh4MiArIHgzKSA+PiAyKSA8PCAxNik7CisgICAgICAgIHRlbXAyIHw9ICgoKHgzICsgeDQpID4+IDIpIDw8IDI0KTsKKworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXAyOworCisgICAgICAgIHRlbXAxID0gKHRlbXAxID4+IDgpIHwgKCh4NCA+PiAxKSA8PCAyNCk7ICAgLyogcm90YXRlIG91dCBvbGQgdmFsdWUgKi8KKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wMTsKKworICAgICAgICB0ZW1wMiA9ICh0ZW1wMiA+PiA4KSB8ICgoKHg0ICsgeDUpID4+IDIpIDw8IDI0KTsgLyogcm90YXRlIG91dCBvbGQgdmFsdWUgKi8KKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wMjsKKyAgICB9CisKKyAgICAvLz09PT09IExPT1AgT1ZFUiBBTEwgNHg0IElOVFJBIFBSRURJQ1RJT04gTU9ERVMgPT09PT0KKyAgICAvLyBjYW4gcmUtb3JkZXIgdGhlIHNlYXJjaCBoZXJlIGluc3RlYWQgb2YgZ29pbmcgaW4gb3JkZXIKKworICAgIC8vIGZpbmQgbW9zdCBwcm9iYWJsZSBtb2RlCisgICAgZW5jdmlkLT5tb3N0UHJvYmFibGVJNE1vZGVbYmxraWR4XSA9IG1vc3RQcm9iYWJsZU1vZGUgPSBGaW5kTW9zdFByb2JhYmxlSTRNb2RlKHZpZGVvLCBibGtpZHgpOworCisgICAgbWluX2Nvc3QgPSAweEZGRkY7CisKKyAgICBmb3IgKGlwbW9kZSA9IDA7IGlwbW9kZSA8IEFWQ051bUk0UHJlZE1vZGU7IGlwbW9kZSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1vZGVfYXZhaWxbaXBtb2RlXSA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBjb3N0ICA9IChpcG1vZGUgPT0gbW9zdFByb2JhYmxlTW9kZSkgPyAwIDogZml4ZWRjb3N0OworICAgICAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtpcG1vZGVdOworCisgICAgICAgICAgICBjb3N0X2k0KG9yZywgb3JnX3BpdGNoLCBwcmVkLCAmY29zdCk7CisKKyAgICAgICAgICAgIGlmIChjb3N0IDwgbWluX2Nvc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbYmxraWR4XSA9IChBVkNJbnRyYTR4NFByZWRNb2RlKWlwbW9kZTsKKyAgICAgICAgICAgICAgICBtaW5fY29zdCAgID0gY29zdDsKKyAgICAgICAgICAgICAgICBtaW5fc2FkID0gY29zdCAtICgoaXBtb2RlID09IG1vc3RQcm9iYWJsZU1vZGUpID8gMCA6IGZpeGVkY29zdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmxraWR4ID09IDApCisgICAgeworICAgICAgICBlbmN2aWQtPmk0X3NhZCA9IG1pbl9zYWQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+aTRfc2FkICs9IG1pbl9zYWQ7CisgICAgfQorCisgICAgcmV0dXJuIG1pbl9jb3N0OworfQorCitpbnQgRmluZE1vc3RQcm9iYWJsZUk0TW9kZShBVkNDb21tb25PYmogKnZpZGVvLCBpbnQgYmxraWR4KQoreworICAgIGludCBkY09ubHlQcmVkaWN0aW9uRmxhZzsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBpbnRyYTR4NFByZWRNb2RlQSwgaW50cmE0eDRQcmVkTW9kZUIsIHByZWRJbnRyYTR4NFByZWRNb2RlOworCisKKyAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDA7CisgICAgaWYgKGJsa2lkeCYweDMpCisgICAgeworICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IGN1cnJNQi0+aTRNb2RlW2Jsa2lkeC0xXTsgLy8gYmxvY2sgdG8gdGhlIGxlZnQKKyAgICB9CisgICAgZWxzZSAvKiBmb3IgYmxrIDAsIDQsIDgsIDEyICovCisgICAgeworICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLmk0TW9kZVtibGtpZHggKyAzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMTsKKyAgICAgICAgICAgIGdvdG8gUFJFRF9SRVNVTFRfUkVBRFk7ICAvLyBza2lwIGJlbG93CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmxraWR4ID4+IDIpCisgICAgeworICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IGN1cnJNQi0+aTRNb2RlW2Jsa2lkeC00XTsgLy8gYmxvY2sgYWJvdmUKKyAgICB9CisgICAgZWxzZSAvKiBibG9jayAwLCAxLCAyLCAzICovCisgICAgeworICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLmk0TW9kZVtibGtpZHgrMTJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICB9CisgICAgfQorCitQUkVEX1JFU1VMVF9SRUFEWToKKyAgICBpZiAoZGNPbmx5UHJlZGljdGlvbkZsYWcpCisgICAgeworICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IGludHJhNHg0UHJlZE1vZGVCID0gQVZDX0k0X0RDOworICAgIH0KKworICAgIHByZWRJbnRyYTR4NFByZWRNb2RlID0gQVZDX01JTihpbnRyYTR4NFByZWRNb2RlQSwgaW50cmE0eDRQcmVkTW9kZUIpOworCisgICAgcmV0dXJuIHByZWRJbnRyYTR4NFByZWRNb2RlOworfQorCit2b2lkIGNvc3RfaTQodWludDggKm9yZywgaW50IG9yZ19waXRjaCwgdWludDggKnByZWQsIHVpbnQxNiAqY29zdCkKK3sKKyAgICBpbnQgazsKKyAgICBpbnQxNiByZXNbMTZdLCAqcHJlczsKKyAgICBpbnQgbTAsIG0xLCBtMiwgbTMsIHRtcDE7CisgICAgaW50IHNhdGQgPSAwOworCisgICAgcHJlcyA9IHJlczsKKyAgICAvLyBob3Jpem9udGFsIHRyYW5zZm9ybQorICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIG0wID0gb3JnWzBdIC0gcHJlZFswXTsKKyAgICAgICAgbTMgPSBvcmdbM10gLSBwcmVkWzNdOworICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgbTEgPSBvcmdbMV0gLSBwcmVkWzFdOworICAgICAgICBtMiA9IG9yZ1syXSAtIHByZWRbMl07CisgICAgICAgIG0xICs9IG0yOworICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgcHJlc1syXSA9IG0wIC0gbTE7CisgICAgICAgIHByZXNbMV0gPSBtMiArIG0zOworICAgICAgICBwcmVzWzNdID0gbTMgLSBtMjsKKworICAgICAgICBvcmcgKz0gb3JnX3BpdGNoOworICAgICAgICBwcmVzICs9IDQ7CisgICAgICAgIHByZWQgKz0gNDsKKyAgICAgICAgay0tOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCB0cmFuc2Zvcm0gKi8KKyAgICBwcmVzID0gcmVzOworICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgbTMgPSBwcmVzWzEyXTsKKyAgICAgICAgbTAgKz0gbTM7CisgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgIG0xID0gcHJlc1s0XTsKKyAgICAgICAgbTIgPSBwcmVzWzhdOworICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgIHByZXNbOF0gPSBtMCAtIG0xOworICAgICAgICBwcmVzWzRdID0gbTIgKyBtMzsKKyAgICAgICAgcHJlc1sxMl0gPSBtMyAtIG0yOworCisgICAgICAgIHByZXMrKzsKKyAgICAgICAgay0tOworCisgICAgfQorCisgICAgcHJlcyA9IHJlczsKKyAgICBrID0gNDsKKyAgICB3aGlsZSAoayA+IDApCisgICAgeworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgc2F0ZCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgc2F0ZCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgc2F0ZCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgc2F0ZCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICBrLS07CisgICAgfQorCisgICAgc2F0ZCA9IChzYXRkICsgMSkgPj4gMTsKKyAgICAqY29zdCArPSBzYXRkOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBjaHJvbWFfaW50cmFfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworCisgICAgaW50IHhfcG9zID0gdmlkZW8tPm1iX3ggPDwgMzsKKyAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJfeSA8PCAzOworICAgIGludCBwaXRjaCA9IGN1cnJQaWMtPnBpdGNoID4+IDE7CisgICAgaW50IG9mZnNldCA9IHlfcG9zICogcGl0Y2ggKyB4X3BvczsKKworICAgIHVpbnQ4ICpjb21wX3JlZl94LCAqY29tcF9yZWZfeSwgKnByZWQ7CisgICAgaW50ICBzdW1feDAsIHN1bV94MSwgc3VtX3kwLCBzdW1feTE7CisgICAgaW50IHByZWRfMFsyXSwgcHJlZF8xWzJdLCBwcmVkXzJbMl0sIHByZWRfM1syXTsKKyAgICB1aW50MzIgcHJlZF9hLCBwcmVkX2IsIHByZWRfYywgcHJlZF9kOworICAgIGludCBpLCBqLCBjb21wb25lbnQ7CisgICAgaW50IGFfMTYsIGIsIGMsIGZhY3Rvcl9jLCB0b3BsZWZ0OworICAgIGludCBILCBWLCB2YWx1ZTsKKyAgICB1aW50OCAqY29tcF9yZWZfeDAsICpjb21wX3JlZl94MSwgICpjb21wX3JlZl95MCwgKmNvbXBfcmVmX3kxOworCisgICAgdWludDggKmN1ckNiID0gY3VyclBpYy0+U2NiICsgb2Zmc2V0OworICAgIHVpbnQ4ICpjdXJDciA9IGN1cnJQaWMtPlNjciArIG9mZnNldDsKKworICAgIHVpbnQ4ICpvcmdDYiwgKm9yZ0NyOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IG9yZ19waXRjaDsKKyAgICBpbnQgY29zdCwgbWluY29zdDsKKworICAgIC8qIGV2YWx1YXRlIERDIG1vZGUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCICYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgICAgIGNvbXBfcmVmX3ggKz0gNDsKKyAgICAgICAgICAgIHByZWRfYiA9IChwcmVkX2EgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSArPSBwcmVkX2I7CisgICAgICAgICAgICBwcmVkX2EgKz0gKHByZWRfYSA+PiAxNik7CisgICAgICAgICAgICBzdW1feDAgPSBwcmVkX2EgJiAweEZGRkY7CisKKyAgICAgICAgICAgIHByZWRfYSA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7CisgICAgICAgICAgICBwcmVkX2IgPSAocHJlZF9hID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgKz0gcHJlZF9iOworICAgICAgICAgICAgcHJlZF9hICs9IChwcmVkX2EgPj4gMTYpOworICAgICAgICAgICAgc3VtX3gxID0gcHJlZF9hICYgMHhGRkZGOworCisgICAgICAgICAgICBwcmVkXzFbaV0gPSAoc3VtX3gxICsgMikgPj4gMjsKKworICAgICAgICAgICAgc3VtX3kwID0gKmNvbXBfcmVmX3k7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisKKyAgICAgICAgICAgIHN1bV95MSA9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisKKyAgICAgICAgICAgIHByZWRfMltpXSA9IChzdW1feTEgKyAyKSA+PiAyOworCisgICAgICAgICAgICBwcmVkXzBbaV0gPSAoc3VtX3kwICsgc3VtX3gwICsgNCkgPj4gMzsKKyAgICAgICAgICAgIHByZWRfM1tpXSA9IChzdW1feTEgKyBzdW1feDEgKyA0KSA+PiAzOworCisgICAgICAgICAgICBjb21wX3JlZl94ID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDciAtIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbHNlIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBjb21wX3JlZl95ID0gY3VyQ2IgLSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdW1feTAgPSAqY29tcF9yZWZfeTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKworICAgICAgICAgICAgc3VtX3kxID0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKworICAgICAgICAgICAgcHJlZF8wW2ldID0gcHJlZF8xW2ldID0gKHN1bV95MCArIDIpID4+IDI7CisgICAgICAgICAgICBwcmVkXzJbaV0gPSBwcmVkXzNbaV0gPSAoc3VtX3kxICsgMikgPj4gMjsKKworICAgICAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNyIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBjb21wX3JlZl94ID0gY3VyQ2IgLSBwaXRjaDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgICAgIGNvbXBfcmVmX3ggKz0gNDsKKyAgICAgICAgICAgIHByZWRfYiA9IChwcmVkX2EgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSArPSBwcmVkX2I7CisgICAgICAgICAgICBwcmVkX2EgKz0gKHByZWRfYSA+PiAxNik7CisgICAgICAgICAgICBzdW1feDAgPSBwcmVkX2EgJiAweEZGRkY7CisKKyAgICAgICAgICAgIHByZWRfYSA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7CisgICAgICAgICAgICBwcmVkX2IgPSAocHJlZF9hID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICBwcmVkX2EgKz0gcHJlZF9iOworICAgICAgICAgICAgcHJlZF9hICs9IChwcmVkX2EgPj4gMTYpOworICAgICAgICAgICAgc3VtX3gxID0gcHJlZF9hICYgMHhGRkZGOworCisgICAgICAgICAgICBwcmVkXzBbaV0gPSBwcmVkXzJbaV0gPSAoc3VtX3gwICsgMikgPj4gMjsKKyAgICAgICAgICAgIHByZWRfMVtpXSA9IHByZWRfM1tpXSA9IChzdW1feDEgKyAyKSA+PiAyOworCisgICAgICAgICAgICBjb21wX3JlZl94ID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmVkXzBbMF0gPSBwcmVkXzBbMV0gPSBwcmVkXzFbMF0gPSBwcmVkXzFbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZF8yWzBdID0gcHJlZF8yWzFdID0gcHJlZF8zWzBdID0gcHJlZF8zWzFdID0gMTI4OworICAgIH0KKworICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX0RDXTsKKworICAgIHByZWRfYSA9IHByZWRfMFswXTsKKyAgICBwcmVkX2IgPSBwcmVkXzFbMF07CisgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgOCk7CisgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgMTYpOworICAgIHByZWRfYiB8PSAocHJlZF9iIDw8IDgpOworICAgIHByZWRfYiB8PSAocHJlZF9iIDw8IDE2KTsKKworICAgIHByZWRfYyA9IHByZWRfMFsxXTsKKyAgICBwcmVkX2QgPSBwcmVkXzFbMV07CisgICAgcHJlZF9jIHw9IChwcmVkX2MgPDwgOCk7CisgICAgcHJlZF9jIHw9IChwcmVkX2MgPDwgMTYpOworICAgIHByZWRfZCB8PSAocHJlZF9kIDw8IDgpOworICAgIHByZWRfZCB8PSAocHJlZF9kIDw8IDE2KTsKKworCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgLyogNCBsaW5lcyAqLworICAgIHsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYjsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHByZWRfYzsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBwcmVkX2Q7CisgICAgICAgIHByZWQgKz0gMTY7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgIH0KKworICAgIHByZWRfYSA9IHByZWRfMlswXTsKKyAgICBwcmVkX2IgPSBwcmVkXzNbMF07CisgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgOCk7CisgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgMTYpOworICAgIHByZWRfYiB8PSAocHJlZF9iIDw8IDgpOworICAgIHByZWRfYiB8PSAocHJlZF9iIDw8IDE2KTsKKworICAgIHByZWRfYyA9IHByZWRfMlsxXTsKKyAgICBwcmVkX2QgPSBwcmVkXzNbMV07CisgICAgcHJlZF9jIHw9IChwcmVkX2MgPDwgOCk7CisgICAgcHJlZF9jIHw9IChwcmVkX2MgPDwgMTYpOworICAgIHByZWRfZCB8PSAocHJlZF9kIDw8IDgpOworICAgIHByZWRfZCB8PSAocHJlZF9kIDw8IDE2KTsKKworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIC8qIDQgbGluZXMgKi8KKyAgICB7CisgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSBwcmVkX2E7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBwcmVkX2I7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSBwcmVkX2M7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gcHJlZF9kOworICAgICAgICBwcmVkICs9IDE2OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICB9CisKKyAgICAvKiBwcmVkaWN0IGhvcml6b250YWwgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBjb21wX3JlZl95ID0gY3VyQ2IgLSAxOworICAgICAgICBjb21wX3JlZl94ID0gY3VyQ3IgLSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19Ib3Jpem9udGFsXTsKKworICAgICAgICBmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZWRfYSA9ICpjb21wX3JlZl95OworICAgICAgICAgICAgICAgIGNvbXBfcmVmX3kgKz0gcGl0Y2g7CisgICAgICAgICAgICAgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgOCk7CisgICAgICAgICAgICAgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgMTYpOworICAgICAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSBwcmVkX2E7CisgICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYTsKKworICAgICAgICAgICAgICAgIHByZWRfYSA9ICpjb21wX3JlZl94OworICAgICAgICAgICAgICAgIGNvbXBfcmVmX3ggKz0gcGl0Y2g7CisgICAgICAgICAgICAgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgOCk7CisgICAgICAgICAgICAgICAgcHJlZF9hIHw9IChwcmVkX2EgPDwgMTYpOworICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSBwcmVkX2E7CisgICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBwcmVkX2E7CisKKyAgICAgICAgICAgICAgICBwcmVkICs9IDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogdmVydGljYWwgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBjb21wX3JlZl94ID0gY3VyQ2IgLSBwaXRjaDsKKyAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNyIC0gcGl0Y2g7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX1ZlcnRpY2FsXTsKKworICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICBwcmVkX2IgPSAqKCh1aW50MzIqKShjb21wX3JlZl94ICsgNCkpOworICAgICAgICBwcmVkX2MgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3kpOworICAgICAgICBwcmVkX2QgPSAqKCh1aW50MzIqKShjb21wX3JlZl95ICsgNCkpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSBwcmVkX2E7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9iOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHByZWRfYzsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gcHJlZF9kOworICAgICAgICAgICAgcHJlZCArPSAxNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEludHJhX0Nocm9tYV9QbGFuZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDYiAtIHBpdGNoOworICAgICAgICBjb21wX3JlZl95ID0gY3VyQ2IgLSAxOworICAgICAgICB0b3BsZWZ0ID0gY3VyQ2JbLXBpdGNoLTFdOworCisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX1BsYW5lXTsKKyAgICAgICAgZm9yIChjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCAyOyBjb21wb25lbnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgSCA9IFYgPSAwOworICAgICAgICAgICAgY29tcF9yZWZfeDAgPSBjb21wX3JlZl94ICsgNDsKKyAgICAgICAgICAgIGNvbXBfcmVmX3gxID0gY29tcF9yZWZfeCArIDI7CisgICAgICAgICAgICBjb21wX3JlZl95MCA9IGNvbXBfcmVmX3kgKyAocGl0Y2ggPDwgMik7CisgICAgICAgICAgICBjb21wX3JlZl95MSA9IGNvbXBfcmVmX3kgKyAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEggKz0gaSAqICgqY29tcF9yZWZfeDArKyAtICpjb21wX3JlZl94MS0tKTsKKyAgICAgICAgICAgICAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKKyAgICAgICAgICAgICAgICBjb21wX3JlZl95MCArPSBwaXRjaDsKKyAgICAgICAgICAgICAgICBjb21wX3JlZl95MSAtPSBwaXRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEggKz0gaSAqICgqY29tcF9yZWZfeDArKyAtIHRvcGxlZnQpOworICAgICAgICAgICAgViArPSBpICogKCpjb21wX3JlZl95MCAtICpjb21wX3JlZl95MSk7CisKKyAgICAgICAgICAgIGFfMTYgPSAoKCooY29tcF9yZWZfeCArIDcpICsgKihjb21wX3JlZl95ICsgNyAqIHBpdGNoKSkgPDwgNCkgKyAxNjsKKyAgICAgICAgICAgIGIgPSAoMTcgKiBIICsgMTYpID4+IDU7CisgICAgICAgICAgICBjID0gKDE3ICogViArIDE2KSA+PiA1OworCisgICAgICAgICAgICBwcmVkX2EgPSAwOworICAgICAgICAgICAgZm9yIChpID0gNDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgPSBhXzE2ICsgYyAqIChwcmVkX2ErKyAtIDMpOworCisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jIC09IDMgKiBiOworCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDgpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMiopcHJlZCkgPSBwcmVkX2I7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYjsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCArPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZWQgLT0gMTIwOyAvKiBwb2ludCB0byBjciAqLworICAgICAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNyIC0gcGl0Y2g7CisgICAgICAgICAgICBjb21wX3JlZl95ID0gY3VyQ3IgLSAxOworICAgICAgICAgICAgdG9wbGVmdCA9IGN1ckNyWy1waXRjaC0xXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdyBldmFsdWF0ZSBpdCAqLworCisgICAgb3JnX3BpdGNoID0gKGN1cnJJbnB1dC0+cGl0Y2gpID4+IDE7CisgICAgb2Zmc2V0ID0geF9wb3MgKyB5X3BvcyAqIG9yZ19waXRjaDsKKworICAgIG9yZ0NiID0gY3VycklucHV0LT5ZQ2JDclsxXSArIG9mZnNldDsKKyAgICBvcmdDciA9IGN1cnJJbnB1dC0+WUNiQ3JbMl0gKyBvZmZzZXQ7CisKKyAgICBtaW5jb3N0ID0gMHg3ZmZmZmZmZjsKKyAgICBjb3N0ID0gU0FURENocm9tYShvcmdDYiwgb3JnQ3IsIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19EQ10sIG1pbmNvc3QpOworICAgIGlmIChjb3N0IDwgbWluY29zdCkKKyAgICB7CisgICAgICAgIG1pbmNvc3QgPSBjb3N0OworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvc3QgPSBTQVREQ2hyb21hKG9yZ0NiLCBvcmdDciwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX0hvcml6b250YWxdLCBtaW5jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCBtaW5jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICBtaW5jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19Ib3Jpem9udGFsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIGNvc3QgPSBTQVREQ2hyb21hKG9yZ0NiLCBvcmdDciwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX1ZlcnRpY2FsXSwgbWluY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgbWluY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWluY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfVmVydGljYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgeworICAgICAgICBjb3N0ID0gU0FURENocm9tYShvcmdDYiwgb3JnQ3IsIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2ljW0FWQ19JQ19QbGFuZV0sIG1pbmNvc3QpOworICAgICAgICBpZiAoY29zdCA8IG1pbmNvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbmNvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX1BsYW5lOworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXR1cm4gOworfQorCisKK2ludCBTQVREQ2hyb21hKHVpbnQ4ICpvcmdDYiwgdWludDggKm9yZ0NyLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgaW50IG1pbl9jb3N0KQoreworICAgIGludCBjb3N0OworICAgIC8qIGZpcnN0IHRha2UgZGlmZmVyZW5jZSBiZXR3ZWVuIG9yZ0NiLCBvcmdDciBhbmQgcHJlZCAqLworICAgIGludDE2IHJlc1sxMjhdLCAqcHJlczsgLy8gcmVzaWR1ZQorICAgIGludCBtMCwgbTEsIG0yLCBtMywgdG1wMTsKKyAgICBpbnQgaiwgazsKKworICAgIHByZXMgPSByZXM7CisgICAgb3JnX3BpdGNoIC09IDg7CisgICAgLy8gaG9yaXpvbnRhbCB0cmFuc2Zvcm0KKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHsKKyAgICAgICAgayA9IDI7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBvcmdDYlswXSAtIHByZWRbMF07CisgICAgICAgICAgICBtMyA9IG9yZ0NiWzNdIC0gcHJlZFszXTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gb3JnQ2JbMV0gLSBwcmVkWzFdOworICAgICAgICAgICAgbTIgPSBvcmdDYlsyXSAtIHByZWRbMl07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgICAgIHByZXNbMl0gPSBtMCAtIG0xOworICAgICAgICAgICAgcHJlc1sxXSA9IG0yICsgbTM7CisgICAgICAgICAgICBwcmVzWzNdID0gbTMgLSBtMjsKKworICAgICAgICAgICAgb3JnQ2IgKz0gNDsKKyAgICAgICAgICAgIHByZXMgKz0gNDsKKyAgICAgICAgICAgIHByZWQgKz0gNDsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgfQorICAgICAgICBvcmdDYiArPSBvcmdfcGl0Y2g7CisgICAgICAgIGsgPSAyOworICAgICAgICB3aGlsZSAoayA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gb3JnQ3JbMF0gLSBwcmVkWzBdOworICAgICAgICAgICAgbTMgPSBvcmdDclszXSAtIHByZWRbM107CisgICAgICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgICAgICBtMSA9IG9yZ0NyWzFdIC0gcHJlZFsxXTsKKyAgICAgICAgICAgIG0yID0gb3JnQ3JbMl0gLSBwcmVkWzJdOworICAgICAgICAgICAgbTEgKz0gbTI7CisgICAgICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgICAgICBwcmVzWzJdID0gbTAgLSBtMTsKKyAgICAgICAgICAgIHByZXNbMV0gPSBtMiArIG0zOworICAgICAgICAgICAgcHJlc1szXSA9IG0zIC0gbTI7CisKKyAgICAgICAgICAgIG9yZ0NyICs9IDQ7CisgICAgICAgICAgICBwcmVzICs9IDQ7CisgICAgICAgICAgICBwcmVkICs9IDQ7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICAgICAgb3JnQ3IgKz0gb3JnX3BpdGNoOworICAgIH0KKworICAgIC8qIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCisgICAgeworICAgICAgICBwcmVzID0gcmVzICsgKGogPDwgNik7CisgICAgICAgIGsgPSAxNjsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IHByZXNbMF07CisgICAgICAgICAgICBtMyA9IHByZXNbMzw8NF07CisgICAgICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgICAgICBtMSA9IHByZXNbMTw8NF07CisgICAgICAgICAgICBtMiA9IHByZXNbMjw8NF07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgICAgIHByZXNbMjw8NF0gPSBtMCAtIG0xOworICAgICAgICAgICAgcHJlc1sxPDw0XSA9IG0yICsgbTM7CisgICAgICAgICAgICBwcmVzWzM8PDRdID0gbTMgLSBtMjsKKworICAgICAgICAgICAgcHJlcysrOworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IHN1bSBvZiBhYnNvbHV0ZSB2YWx1ZSAqLworICAgIHByZXMgPSByZXM7CisgICAgY29zdCA9IDA7CisgICAgayA9IDEyODsKKyAgICB3aGlsZSAoayA+IDApCisgICAgeworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICB0bXAxID0gKnByZXMrKzsKKyAgICAgICAgY29zdCArPSAoKHRtcDEgPj0gMCkgPyB0bXAxIDogLXRtcDEpOworICAgICAgICBrIC09IDg7CisgICAgICAgIGlmIChjb3N0ID4gbWluX2Nvc3QpIC8qIGVhcmx5IGRyb3Agb3V0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvc3Q7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gb2xkIGNvZGUsIHVudXNlZAorLyogZmluZCB0aGUgYmVzdCBpbnRyYSBtb2RlIGJhc2VkIG9uIG9yaWdpbmFsICh1bmVuY29kZWQpIGZyYW1lICovCisvKiBvdXRwdXQgaXMKKyAgICBjdXJyTUItPm1iX2ludHJhLCBjdXJyTUItPm1iTW9kZSwKKyAgICBjdXJyTUItPmkxNk1vZGUgIChpZiBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIGN1cnJNQi0+aTRNb2RlWy4uXSAoaWYgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KSAqLworCisjaWZkZWYgRklYRURfSU5UUkFQUkVEX01PREUKK3ZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgbWJOdW0pCit7CisgICAgKHZvaWQpKG1iTnVtKTsKKworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgaW5keCwgYmxvY2tfeCwgYmxvY2tfeTsKKworICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5pbnRyYUF2YWlsRCA9IDA7CisKKyAgICBpZiAoIXZpZGVvLT5jdXJyUGljUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcpCisgICAgeworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJBdmFpbEE7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYkF2YWlsQjsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1iQXZhaWxDOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEQgPSB2aWRlby0+bWJBdmFpbEQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLm1iX2ludHJhOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iX2ludHJhIDsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxDKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJDXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxEKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEQgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJEXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN1cnJNQi0+bWJfaW50cmEgPSBUUlVFOworICAgIGN1cnJNQi0+bWJNb2RlID0gRklYRURfSU5UUkFQUkVEX01PREU7CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICB7CisgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEZJWEVEX0kxNl9NT0RFOworCisgICAgICAgIGlmIChGSVhFRF9JMTZfTU9ERSA9PSBBVkNfSTE2X1ZlcnRpY2FsICYmICF2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfREM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRklYRURfSTE2X01PREUgPT0gQVZDX0kxNl9Ib3Jpem9udGFsICYmICF2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfREM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRklYRURfSTE2X01PREUgPT0gQVZDX0kxNl9QbGFuZSAmJiAhKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KQorICAgIHsKKyAgICAgICAgZm9yIChpbmR4ID0gMDsgaW5keCA8IDE2OyBpbmR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrX3ggPSBibGtJZHgyYmxrWFtpbmR4XTsKKyAgICAgICAgICAgIGJsb2NrX3kgPSBibGtJZHgyYmxrWVtpbmR4XTsKKworICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gRklYRURfSTRfTU9ERTsKKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X1ZlcnRpY2FsICYmICEoYmxvY2tfeSA+IDAgfHwgdmlkZW8tPmludHJhQXZhaWxCKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9Ib3Jpem9udGFsICYmICEoYmxvY2tfeCB8fCB2aWRlby0+aW50cmFBdmFpbEEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdCAmJgorICAgICAgICAgICAgICAgICAgICAoYmxvY2tfeSA9PSAwICYmICF2aWRlby0+aW50cmFBdmFpbEIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0RpYWdvbmFsX0Rvd25fUmlnaHQgJiYKKyAgICAgICAgICAgICAgICAgICAgISgoYmxvY2tfeSAmJiBibG9ja194KQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja195ICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeCAmJiB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfVmVydGljYWxfUmlnaHQgJiYKKyAgICAgICAgICAgICAgICAgICAgISgoYmxvY2tfeSAmJiBibG9ja194KQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja195ICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeCAmJiB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfSG9yaXpvbnRhbF9Eb3duICYmCisgICAgICAgICAgICAgICAgICAgICEoKGJsb2NrX3kgJiYgYmxvY2tfeCkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeSAmJiB2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3ggJiYgdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICAgICAgICAgICAgICAgIHx8ICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxEICYmIHZpZGVvLT5pbnRyYUF2YWlsQikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X1ZlcnRpY2FsX0xlZnQgJiYKKyAgICAgICAgICAgICAgICAgICAgKGJsb2NrX3kgPT0gMCAmJiAhdmlkZW8tPmludHJhQXZhaWxCKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9Ib3Jpem9udGFsX1VwICYmICEoYmxvY2tfeCB8fCB2aWRlby0+aW50cmFBdmFpbEEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEZJWEVEX0lOVFJBX0NIUk9NQV9NT0RFOworCisgICAgaWYgKEZJWEVEX0lOVFJBX0NIUk9NQV9NT0RFID09IEFWQ19JQ19Ib3Jpem9udGFsICYmICEodmlkZW8tPmludHJhQXZhaWxBKSkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19EQzsKKyAgICB9CisKKyAgICBpZiAoRklYRURfSU5UUkFfQ0hST01BX01PREUgPT0gQVZDX0lDX1ZlcnRpY2FsICYmICEodmlkZW8tPmludHJhQXZhaWxCKSkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19EQzsKKyAgICB9CisKKyAgICBpZiAoRklYRURfSU5UUkFfQ0hST01BX01PREUgPT0gQVZDX0lDX1BsYW5lICYmICEodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworICAgIH0KKworICAgIC8qIGFsc28gcmVzZXQgdGhlIG1vdGlvbiB2ZWN0b3JzICovCisgICAgLyogc2V0IE1WIGFuZCBSZWZfSWR4IGNvZGVzIG9mIEludHJhIGJsb2NrcyBpbiBQLXNsaWNlcyAqLworICAgIG1lbXNldChjdXJyTUItPm12TDAsIDAsIHNpemVvZihpbnQzMikqMTYpOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMFswXSA9IC0xOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMFsxXSA9IC0xOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMFsyXSA9IC0xOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMFszXSA9IC0xOworCisgICAgLy8gb3V0cHV0IGZyb20gdGhpcyBmdW5jdGlvbiwgY3Vyck1CLT5tYk1vZGUgc2hvdWxkIGJlIHNldCB0byBlaXRoZXIKKyAgICAvLyBBVkNfSTQsIEFWQ19JMTYsIG9yIGVsc2UgaW4gQVZDTUJNb2RlIGVudW0sIG1iVHlwZSwgbWJfaW50cmEsIGludHJhX2Nocm9tYV9wcmVkX21vZGUgKi8KKyAgICByZXR1cm4gOworfQorI2Vsc2UgLy8gZmFzdGVyIGNvbWJpbmVkIHByZWRpY3Rpb24rU0FEIGNhbGN1bGF0aW9uCit2b2lkIE1CSW50cmFTZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IG1iTnVtKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICB1aW50OCAqY3VyTCwgKmN1ckNiLCAqY3VyQ3I7CisgICAgdWludDggKmNvbXAsICpwcmVkX2Jsb2NrOworICAgIGludCBibG9ja194LCBibG9ja195LCBvZmZzZXQ7CisgICAgdWludCBzYWQsIHNhZDQsIHNhZEk0LCBzYWRJMTY7CisgICAgaW50IGNvbXBvbmVudCwgU3ViQmxvY2tfaW5keCwgdGVtcDsKKyAgICBpbnQgcGl0Y2ggPSB2aWRlby0+Y3VyclBpYy0+cGl0Y2g7CisKKyAgICAvKiBjYWxjdWxhdGUgdGhlIGNvc3Qgb2YgZWFjaCBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgIGFuZCBjb21wYXJlIHRvIHRoZQorICAgIGludGVyIG1vZGUgKi8KKyAgICAvKiBmdWxsIHNlYXJjaCBmb3IgYWxsIGludHJhIHByZWRpY3Rpb24gKi8KKyAgICBvZmZzZXQgPSAodmlkZW8tPm1iX3kgPDwgNCkgKiBwaXRjaCArICh2aWRlby0+bWJfeCA8PCA0KTsKKyAgICBjdXJMID0gY3VycklucHV0LT5ZQ2JDclswXSArIG9mZnNldDsKKyAgICBwcmVkX2Jsb2NrID0gdmlkZW8tPnByZWRfYmxvY2sgKyA4NDsKKworICAgIC8qIEFzc3VtaW5nIHRoYXQgSW5pdE5laWdoYm9yQXZhaWxhYmlsaXR5IGhhcyBiZWVuIGNhbGxlZCBwcmlvciB0byB0aGlzIGZ1bmN0aW9uICovCisgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPmludHJhQXZhaWxEID0gMDsKKworICAgIGlmICghdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZykKKyAgICB7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYkF2YWlsQTsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1iQXZhaWxCOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJBdmFpbEM7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYkF2YWlsRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJfaW50cmEgOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckNdLm1iX2ludHJhOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckRdLm1iX2ludHJhOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY3VycmVudGx5IHdlJ3JlIGRvaW5nIGV4aGF1c3RpdmUgc2VhcmNoLiBTbWFydCBzZWFyY2ggd2lsbCBiZSB1c2VkIGxhdGVyICovCisKKyAgICAvKiBJMTYgbW9kZXMgKi8KKyAgICBjdXJMID0gY3VycklucHV0LT5ZQ2JDclswXSArIG9mZnNldDsKKyAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wID0gY3VyTCAtIHBpdGNoOworICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0ID0gY3VyTCAtIDE7CisgICAgaWYgKHZpZGVvLT5tYl95KQorICAgIHsKKyAgICAgICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdCA9ICooY3VyTCAtIHBpdGNoIC0gMSk7CisgICAgfQorCisgICAgLyogSW50cmFfMTZ4MTZfVmVydGljYWwgKi8KKyAgICBzYWRJMTYgPSA2NTUzNjsKKyAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgdG9wICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIHNhZCA9IFNBRF9JMTZfVmVydCh2aWRlbywgY3VyTCwgc2FkSTE2KTsKKworICAgICAgICBpZiAoc2FkIDwgc2FkSTE2KQorICAgICAgICB7CisgICAgICAgICAgICBzYWRJMTYgPSBzYWQ7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X1ZlcnRpY2FsOworICAgICAgICB9CisgICAgfQorICAgIC8qIEludHJhXzE2eDE2X0hvcml6b250YWwgKi8KKyAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgbGVmdCAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBzYWQgPSBTQURfSTE2X0hvcnpEQyh2aWRlbywgY3VyTCwgQVZDX0kxNl9Ib3Jpem9udGFsLCBzYWRJMTYpOworCisgICAgICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhZEkxNiA9IHNhZDsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfSG9yaXpvbnRhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEludHJhXzE2eDE2X0RDLCBkZWZhdWx0IG1vZGUgKi8KKyAgICBzYWQgPSBTQURfSTE2X0hvcnpEQyh2aWRlbywgY3VyTCwgQVZDX0kxNl9EQywgc2FkSTE2KTsKKyAgICBpZiAoc2FkIDwgc2FkSTE2KQorICAgIHsKKyAgICAgICAgc2FkSTE2ID0gc2FkOworICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0RDOworICAgIH0KKworICAgIC8qIEludHJhXzE2eDE2X1BsYW5lICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgc2FkID0gU0FEX0kxNl9QbGFuZSh2aWRlbywgY3VyTCwgc2FkSTE2KTsKKworICAgICAgICBpZiAoc2FkIDwgc2FkSTE2KQorICAgICAgICB7CisgICAgICAgICAgICBzYWRJMTYgPSBzYWQ7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X1BsYW5lOworICAgICAgICB9CisgICAgfQorCisgICAgc2FkSTE2ID4+PSAxOyAgLyogYmVmb3JlIGNvbXBhcmlzb24gKi8KKworICAgIC8qIHNlbGVjdGlvbiBiZXR3ZWVuIGludHJhNCwgaW50cmExNiBvciBpbnRlciBtb2RlICovCisgICAgaWYgKHNhZEkxNiA8IGVuY3ZpZC0+bWluX2Nvc3QpCisgICAgeworICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gVFJVRTsKKyAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTE2OworICAgICAgICBlbmN2aWQtPm1pbl9jb3N0ID0gc2FkSTE2OworICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iX2ludHJhKSAvKiBvbmx5IGRvIHRoZSBjaHJvbWluYW5jZSBzZWFyY2ggd2hlbiBpbnRyYSBpcyBkZWNpZGVkICovCisgICAgeworICAgICAgICAvKiBOb3RlIHRoYXQgd2UgbWlnaHQgYmUgYWJsZSB0byBndWVzcyB0aGUgdHlwZSBvZiBwcmVkaWN0aW9uIGZyb20KKyAgICAgICAgdGhlIGx1bWEgcHJlZGljdGlvbiB0eXBlICovCisKKyAgICAgICAgLyogbm93IHNlYXJjaCBmb3IgdGhlIGJlc3QgY2hyb21hIGludHJhIHByZWRpY3Rpb24gKi8KKyAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA+PiAyKSArICh2aWRlby0+bWJfeCA8PCAyKTsKKyAgICAgICAgY3VyQ2IgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgb2Zmc2V0OworICAgICAgICBjdXJDciA9IGN1cnJJbnB1dC0+WUNiQ3JbMl0gKyBvZmZzZXQ7CisKKyAgICAgICAgcGl0Y2ggPj49IDE7CisgICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3BfY2IgPSBjdXJDYiAtIHBpdGNoOworICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfbGVmdF9jYiA9IGN1ckNiIC0gMTsKKyAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX3RvcF9jciA9IGN1ckNyIC0gcGl0Y2g7CisgICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NyID0gY3VyQ3IgLSAxOworCisgICAgICAgIGlmICh2aWRlby0+bWJfeSkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jYiA9ICooY3VyQ2IgLSBwaXRjaCAtIDEpOworICAgICAgICAgICAgdmlkZW8tPmludHJhX3ByZWRfdG9wbGVmdF9jciA9ICooY3VyQ3IgLSBwaXRjaCAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyogSW50cmFfQ2hyb21hX0RDICovCisgICAgICAgIHNhZDQgPSBTQURfQ2hyb21hX0RDKHZpZGVvLCBjdXJDYiwgY3VyQ3IsIDY1NTM2KTsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworCisgICAgICAgIC8qIEludHJhX0Nocm9tYV9Ib3Jpem9udGFsICovCisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBsZWZ0ICovCisgICAgICAgICAgICBzYWQgPSBTQURfQ2hyb21hX0hvcnoodmlkZW8sIGN1ckNiLCBjdXJDciwgc2FkNCk7CisgICAgICAgICAgICBpZiAoc2FkIDwgc2FkNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYWQ0ID0gc2FkOworICAgICAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19Ib3Jpem9udGFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSW50cmFfQ2hyb21hX1ZlcnRpY2FsICovCisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0b3AgKi8KKyAgICAgICAgICAgIHNhZCA9IFNBRF9DaHJvbWFfVmVydCh2aWRlbywgY3VyQ2IsIGN1ckNyLCBzYWQ0KTsKKworICAgICAgICAgICAgaWYgKHNhZCA8IHNhZDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FkNCA9IHNhZDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfVmVydGljYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJbnRyYV9DaHJvbWFfUGxhbmUgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjaGVjayBhdmFpbGFiaWxpdHkgb2YgdG9wIGFuZCBsZWZ0ICovCisgICAgICAgICAgICBJbnRyYV9DaHJvbWFfUGxhbmUodmlkZW8sIHBpdGNoKTsKKworICAgICAgICAgICAgc2FkID0gU0FEQ2hyb21hKHByZWRfYmxvY2sgKyA0NTIsIGN1ckNiLCBjdXJDciwgcGl0Y2gpOworCisgICAgICAgICAgICBpZiAoc2FkIDwgc2FkNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYWQ0ID0gc2FkOworICAgICAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19QbGFuZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGFsc28gcmVzZXQgdGhlIG1vdGlvbiB2ZWN0b3JzICovCisgICAgICAgIC8qIHNldCBNViBhbmQgUmVmX0lkeCBjb2RlcyBvZiBJbnRyYSBibG9ja3MgaW4gUC1zbGljZXMgKi8KKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+bXZMMCwgMCwgc2l6ZW9mKGludDMyKSoxNik7CisgICAgICAgIG1lbXNldChjdXJyTUItPnJlZl9pZHhfTDAsIC0xLCBzaXplb2YoaW50MTYpKjQpOworCisgICAgfQorCisgICAgLy8gb3V0cHV0IGZyb20gdGhpcyBmdW5jdGlvbiwgY3Vyck1CLT5tYk1vZGUgc2hvdWxkIGJlIHNldCB0byBlaXRoZXIKKyAgICAvLyBBVkNfSTQsIEFWQ19JMTYsIG9yIGVsc2UgaW4gQVZDTUJNb2RlIGVudW0sIG1iVHlwZSwgbWJfaW50cmEsIGludHJhX2Nocm9tYV9wcmVkX21vZGUgKi8KKworICAgIHJldHVybiA7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9jb21wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzYyZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9jb21wLmNwcApAQCAtMCwwICsxLDIxNTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgImF2Y2VuY19pbnQuaCIKKworCisjZGVmaW5lIENMSVBfUkVTVUxUKHgpICAgICAgaWYoKHVpbnQpeCA+IDB4RkYpeyBcCisgICAgICAgICAgICAgICAgIHggPSAweEZGICYgKH4oeD4+MzEpKTt9CisKKy8qIChibGt3aWR0aCA8PCAyKSArIChkeSA8PCAxKSArIGR4ICovCitzdGF0aWMgdm9pZCAoKmNvbnN0IGVDaHJvbWFNQ19TSU1EWzhdKSh1aW50OCAqLCBpbnQgLCBpbnQgLCBpbnQgLCB1aW50OCAqLCBpbnQsIGludCAsIGludCkgPQoreworICAgICZlQ2hyb21hRnVsbE1DX1NJTUQsCisgICAgJmVDaHJvbWFIb3Jpem9udGFsTUNfU0lNRCwKKyAgICAmZUNocm9tYVZlcnRpY2FsTUNfU0lNRCwKKyAgICAmZUNocm9tYURpYWdvbmFsTUNfU0lNRCwKKyAgICAmZUNocm9tYUZ1bGxNQ19TSU1ELAorICAgICZlQ2hyb21hSG9yaXpvbnRhbE1DMl9TSU1ELAorICAgICZlQ2hyb21hVmVydGljYWxNQzJfU0lNRCwKKyAgICAmZUNocm9tYURpYWdvbmFsTUMyX1NJTUQKK307CisvKiBQZXJmb3JtIG1vdGlvbiBwcmVkaWN0aW9uIGFuZCBjb21wZW5zYXRpb24gd2l0aCByZXNpZHVlIGlmIGV4aXN0LiAqLwordm9pZCBBVkNNQk1vdGlvbkNvbXAoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8pCit7CisgICAgKHZvaWQpKGVuY3ZpZCk7CisKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisgICAgaW50IG1iUGFydElkeCwgc3ViTWJQYXJ0SWR4OworICAgIGludCByZWZfaWR4OworICAgIGludCBvZmZzZXRfTWJQYXJ0X2luZHggPSAwOworICAgIGludDE2ICptdjsKKyAgICB1aW50MzIgeF9wb3MsIHlfcG9zOworICAgIHVpbnQ4ICpjdXJMLCAqY3VyQ2IsICpjdXJDcjsKKyAgICB1aW50OCAqcmVmX2wsICpyZWZfQ2IsICpyZWZfQ3I7CisgICAgdWludDggKnByZWRCbG9jaywgKnByZWRDYiwgKnByZWRDcjsKKyAgICBpbnQgYmxvY2tfeCwgYmxvY2tfeSwgb2Zmc2V0X3gsIG9mZnNldF95LCBvZmZzZXRQLCBvZmZzZXQ7CisgICAgaW50IHhfcG9zaXRpb24gPSAodmlkZW8tPm1iX3ggPDwgNCk7CisgICAgaW50IHlfcG9zaXRpb24gPSAodmlkZW8tPm1iX3kgPDwgNCk7CisgICAgaW50IE1iSGVpZ2h0LCBNYldpZHRoLCBtYlBhcnRJZHhfWCwgbWJQYXJ0SWR4X1ksIG9mZnNldF9pbmR4OworICAgIGludCBwaWNXaWR0aCA9IGN1cnJQaWMtPndpZHRoOworICAgIGludCBwaWNQaXRjaCA9IGN1cnJQaWMtPnBpdGNoOworICAgIGludCBwaWNIZWlnaHQgPSBjdXJyUGljLT5oZWlnaHQ7CisgICAgdWludDMyIHRtcF93b3JkOworCisgICAgdG1wX3dvcmQgPSB5X3Bvc2l0aW9uICogcGljUGl0Y2g7CisgICAgY3VyTCA9IGN1cnJQaWMtPlNsICsgdG1wX3dvcmQgKyB4X3Bvc2l0aW9uOworICAgIG9mZnNldCA9ICh0bXBfd29yZCA+PiAyKSArICh4X3Bvc2l0aW9uID4+IDEpOworICAgIGN1ckNiID0gY3VyclBpYy0+U2NiICsgb2Zmc2V0OworICAgIGN1ckNyID0gY3VyclBpYy0+U2NyICsgb2Zmc2V0OworCisgICAgcHJlZEJsb2NrID0gY3VyTDsKKyAgICBwcmVkQ2IgPSBjdXJDYjsKKyAgICBwcmVkQ3IgPSBjdXJDcjsKKworICAgIEdldE1vdGlvblZlY3RvclByZWRpY3Rvcih2aWRlbywgMSk7CisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIE1iSGVpZ2h0ID0gY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbbWJQYXJ0SWR4XTsKKyAgICAgICAgTWJXaWR0aCA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbbWJQYXJ0SWR4XTsKKyAgICAgICAgbWJQYXJ0SWR4X1ggPSAoKG1iUGFydElkeCArIG9mZnNldF9NYlBhcnRfaW5keCkgJiAxKTsKKyAgICAgICAgbWJQYXJ0SWR4X1kgPSAobWJQYXJ0SWR4ICsgb2Zmc2V0X01iUGFydF9pbmR4KSA+PiAxOworICAgICAgICByZWZfaWR4ID0gY3Vyck1CLT5yZWZfaWR4X0wwWyhtYlBhcnRJZHhfWSA8PCAxKSArIG1iUGFydElkeF9YXTsKKyAgICAgICAgb2Zmc2V0X2luZHggPSAwOworCisgICAgICAgIHJlZl9sID0gdmlkZW8tPlJlZlBpY0xpc3QwW3JlZl9pZHhdLT5TbDsKKyAgICAgICAgcmVmX0NiID0gdmlkZW8tPlJlZlBpY0xpc3QwW3JlZl9pZHhdLT5TY2I7CisgICAgICAgIHJlZl9DciA9IHZpZGVvLT5SZWZQaWNMaXN0MFtyZWZfaWR4XS0+U2NyOworCisgICAgICAgIGZvciAoc3ViTWJQYXJ0SWR4ID0gMDsgc3ViTWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1TdWJNYlBhcnRbbWJQYXJ0SWR4XTsgc3ViTWJQYXJ0SWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrX3ggPSAobWJQYXJ0SWR4X1ggPDwgMSkgKyAoKHN1Yk1iUGFydElkeCArIG9mZnNldF9pbmR4KSAmIDEpOworICAgICAgICAgICAgYmxvY2tfeSA9IChtYlBhcnRJZHhfWSA8PCAxKSArICgoKHN1Yk1iUGFydElkeCArIG9mZnNldF9pbmR4KSA+PiAxKSAmIDEpOworICAgICAgICAgICAgbXYgPSAoaW50MTYqKShjdXJyTUItPm12TDAgKyBibG9ja194ICsgKGJsb2NrX3kgPDwgMikpOworICAgICAgICAgICAgb2Zmc2V0X3ggPSB4X3Bvc2l0aW9uICsgKGJsb2NrX3ggPDwgMik7CisgICAgICAgICAgICBvZmZzZXRfeSA9IHlfcG9zaXRpb24gKyAoYmxvY2tfeSA8PCAyKTsKKyAgICAgICAgICAgIHhfcG9zID0gKG9mZnNldF94IDw8IDIpICsgKm12Kys7ICAgLypxdWFydGVyIHBlbCAqLworICAgICAgICAgICAgeV9wb3MgPSAob2Zmc2V0X3kgPDwgMikgKyAqbXY7ICAgLypxdWFydGVyIHBlbCAqLworCisgICAgICAgICAgICAvL29mZnNldCA9IG9mZnNldF95ICogY3VyclBpYy0+d2lkdGg7CisgICAgICAgICAgICAvL29mZnNldEMgPSAob2Zmc2V0ID4+IDIpICsgKG9mZnNldF94ID4+IDEpOworICAgICAgICAgICAgb2Zmc2V0UCA9IChibG9ja195IDw8IDIpICogcGljUGl0Y2ggKyAoYmxvY2tfeCA8PCAyKTsKKyAgICAgICAgICAgIGVMdW1hTW90aW9uQ29tcChyZWZfbCwgcGljUGl0Y2gsIHBpY0hlaWdodCwgeF9wb3MsIHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TbCArIG9mZnNldCArIG9mZnNldF94LCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZEJsb2NrICsgb2Zmc2V0UCwgcGljUGl0Y2gsIE1iV2lkdGgsIE1iSGVpZ2h0KTsKKworICAgICAgICAgICAgb2Zmc2V0UCA9IChibG9ja195ICogcGljV2lkdGgpICsgKGJsb2NrX3ggPDwgMSk7CisgICAgICAgICAgICBlQ2hyb21hTW90aW9uQ29tcChyZWZfQ2IsIHBpY1dpZHRoID4+IDEsIHBpY0hlaWdodCA+PiAxLCB4X3BvcywgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbXBfU2NiICsgIG9mZnNldEMsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRDYiArIG9mZnNldFAsIHBpY1BpdGNoID4+IDEsIE1iV2lkdGggPj4gMSwgTWJIZWlnaHQgPj4gMSk7CisgICAgICAgICAgICBlQ2hyb21hTW90aW9uQ29tcChyZWZfQ3IsIHBpY1dpZHRoID4+IDEsIHBpY0hlaWdodCA+PiAxLCB4X3BvcywgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbXBfU2NyICsgIG9mZnNldEMsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRDciArIG9mZnNldFAsIHBpY1BpdGNoID4+IDEsIE1iV2lkdGggPj4gMSwgTWJIZWlnaHQgPj4gMSk7CisKKyAgICAgICAgICAgIG9mZnNldF9pbmR4ID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFttYlBhcnRJZHhdID4+IDM7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0X01iUGFydF9pbmR4ID0gY3Vyck1CLT5NYlBhcnRXaWR0aCA+PiA0OworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogcHJlZm9ybSB0aGUgYWN0dWFsICBtb3Rpb24gY29tcCBoZXJlICovCit2b2lkIGVMdW1hTW90aW9uQ29tcCh1aW50OCAqcmVmLCBpbnQgcGljcGl0Y2gsIGludCBwaWNoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkocGljaGVpZ2h0KTsKKworICAgIGludCBkeCwgZHk7CisgICAgaW50IHRlbXAyWzIxXVsyMV07IC8qIGZvciBpbnRlcm1lZGlhdGUgcmVzdWx0cyAqLworICAgIHVpbnQ4ICpyZWYyOworCisgICAgZHggPSB4X3BvcyAmIDM7CisgICAgZHkgPSB5X3BvcyAmIDM7CisgICAgeF9wb3MgPSB4X3BvcyA+PiAyOyAgLyogcm91bmQgaXQgdG8gZnVsbC1wZWwgcmVzb2x1dGlvbiAqLworICAgIHlfcG9zID0geV9wb3MgPj4gMjsKKworICAgIC8qIHBlcmZvcm0gYWN0dWFsIG1vdGlvbiBjb21wZW5zYXRpb24gKi8KKyAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKQorICAgIHsgIC8qIGZ1bGxwZWwgcG9zaXRpb24gKi8vKiBHICovCisKKyAgICAgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvczsKKworICAgICAgICBlRnVsbFBlbE1DKHJlZiwgcGljcGl0Y2gsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQpOworCisgICAgfSAgIC8qIG90aGVyIHBvc2l0aW9ucyAqLworICAgIGVsc2UgIGlmIChkeSA9PSAwKQorICAgIHsgLyogbm8gdmVydGljYWwgaW50ZXJwb2xhdGlvbiAqLy8qIGEsYixjKi8KKworICAgICAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgICAgIGVIb3J6SW50ZXJwMU1DKHJlZiwgcGljcGl0Y2gsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQsIGR4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoZHggPT0gMCkKKyAgICB7IC8qbm8gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovLyogZCxoLG4gKi8KKworICAgICAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgICAgIGVWZXJ0SW50ZXJwMU1DKHJlZiwgcGljcGl0Y2gsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQsIGR5KTsKKyAgICB9CisgICAgZWxzZSBpZiAoZHkgPT0gMikKKyAgICB7ICAvKiBob3Jpem9udGFsIGNyb3NzICovLyogaSwgaiwgayAqLworCisgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3MgLSAyOyAvKiBtb3ZlIHRvIHRoZSBsZWZ0IDIgcGl4ZWxzICovCisKKyAgICAgICAgZVZlcnRJbnRlcnAyTUMocmVmLCBwaWNwaXRjaCwgJnRlbXAyWzBdWzBdLCAyMSwgYmxrd2lkdGggKyA1LCBibGtoZWlnaHQpOworCisgICAgICAgIGVIb3J6SW50ZXJwMk1DKCZ0ZW1wMlswXVsyXSwgMjEsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQsIGR4KTsKKyAgICB9CisgICAgZWxzZSBpZiAoZHggPT0gMikKKyAgICB7IC8qIHZlcnRpY2FsIGNyb3NzICovIC8qIGYscSAqLworCisgICAgICAgIHJlZiArPSAoeV9wb3MgLSAyKSAqIHBpY3BpdGNoICsgeF9wb3M7IC8qIG1vdmUgdG8gdXAgMiBsaW5lcyAqLworCisgICAgICAgIGVIb3J6SW50ZXJwM01DKHJlZiwgcGljcGl0Y2gsICZ0ZW1wMlswXVswXSwgMjEsIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKKyAgICAgICAgZVZlcnRJbnRlcnAzTUMoJnRlbXAyWzJdWzBdLCAyMSwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHkpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBkaWFnb25hbCAqLy8qIGUsZyxwLHIgKi8KKworICAgICAgICByZWYyID0gcmVmICsgKHlfcG9zICsgKGR5IC8gMikpICogcGljcGl0Y2ggKyB4X3BvczsKKworICAgICAgICByZWYgKz0gKHlfcG9zICogcGljcGl0Y2gpICsgeF9wb3MgKyAoZHggLyAyKTsKKworICAgICAgICBlRGlhZ29uYWxJbnRlcnBNQyhyZWYyLCByZWYsIHBpY3BpdGNoLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVDcmVhdGVBbGlnbih1aW50OCAqcmVmLCBpbnQgcGljcGl0Y2gsIGludCB5X3BvcywKKyAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdXQsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgb2Zmc2V0LCBvdXRfb2Zmc2V0OworICAgIHVpbnQzMiBwcmV2X3BpeCwgcmVzdWx0LCBwaXgxLCBwaXgyLCBwaXg0OworCisgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2g7Ly8gKyB4X3BvczsKKyAgICBvdXRfb2Zmc2V0ID0gMjQgLSBibGt3aWR0aDsKKworICAgIC8vc3dpdGNoKHhfcG9zJjB4Myl7CisgICAgc3dpdGNoICgoKHVpbnQzMilyZWYpJjB4MykKKyAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG9mZnNldCA9ICBwaWNwaXRjaCAtIGJsa3dpZHRoIC0gMzsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwaXgxID0gKnJlZisrOworICAgICAgICAgICAgICAgIHBpeDIgPSAqKCh1aW50MTYqKXJlZik7CisgICAgICAgICAgICAgICAgcmVmICs9IDI7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHBpeDIgPDwgOCkgfCBwaXgxOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMzsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaXg0ID0gKigodWludDMyKilyZWYpOworICAgICAgICAgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9waXggPSAocGl4NCA8PCAyNCkgJiAweEZGMDAwMDAwOyAvKiBtYXNrIG91dCBieXRlIGJlbG9uZyB0byBwcmV2aW91cyB3b3JkICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBwcmV2X3BpeDsKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gcmVzdWx0OyAgLyogd3JpdGUgNCBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGl4NCA+PiA4OyAvKiBmb3IgdGhlIG5leHQgbG9vcCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgIG91dCArPSBvdXRfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG9mZnNldCA9ICBwaWNwaXRjaCAtIGJsa3dpZHRoIC0gMjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAqKCh1aW50MTYqKXJlZik7CisgICAgICAgICAgICAgICAgcmVmICs9IDI7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMjsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaXg0ID0gKigodWludDMyKilyZWYpOworICAgICAgICAgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9waXggPSAocGl4NCA8PCAxNikgJiAweEZGRkYwMDAwOyAvKiBtYXNrIG91dCBieXRlIGJlbG9uZyB0byBwcmV2aW91cyB3b3JkICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBwcmV2X3BpeDsKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gcmVzdWx0OyAgLyogd3JpdGUgNCBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGl4NCA+PiAxNjsgLyogZm9yIHRoZSBuZXh0IGxvb3AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBvdXQgKz0gb3V0X29mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBvZmZzZXQgPSAgcGljcGl0Y2ggLSBibGt3aWR0aCAtIDE7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxraGVpZ2h0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKnJlZisrOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBibGt3aWR0aDsgaSArPSA0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4NCA9ICooKHVpbnQzMiopcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIHByZXZfcGl4ID0gKHBpeDQgPDwgOCkgJiAweEZGRkZGRjAwOyAvKiBtYXNrIG91dCBieXRlIGJlbG9uZyB0byBwcmV2aW91cyB3b3JkICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBwcmV2X3BpeDsKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyKilvdXQpID0gcmVzdWx0OyAgLyogd3JpdGUgNCBieXRlcyAqLworICAgICAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcGl4NCA+PiAyNDsgLyogZm9yIHRoZSBuZXh0IGxvb3AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVmICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBvdXQgKz0gb3V0X29mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBlSG9yekludGVycDFNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR4KQoreworICAgIHVpbnQ4ICpwX3JlZjsKKyAgICB1aW50MzIgKnBfY3VyOworICAgIHVpbnQzMiB0bXAsIHBrcmVzOworICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIGludCBqOworICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisgICAgaW50MzIgcjEzLCByNjsKKworICAgIHBfY3VyID0gKHVpbnQzMiopb3V0OyAvKiBhc3N1bWUgaXQncyB3b3JkIGFsaWduZWQgKi8KKyAgICBjdXJyX29mZnNldCA9IChvdXRwaXRjaCAtIGJsa3dpZHRoKSA+PiAyOworICAgIHBfcmVmID0gaW47CisgICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKworICAgIGlmIChkeCYxKQorICAgIHsKKyAgICAgICAgZHggPSAoKGR4ID4+IDEpID8gLTMgOiAtNCk7IC8qIHVzZSBpbiAzLzQgcGVsICovCisgICAgICAgIHBfcmVmIC09IDI7CisgICAgICAgIHIxMyA9IDA7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICByMCA9IHBfcmVmWzBdOworICAgICAgICAgICAgcjEgPSBwX3JlZlsyXTsKKyAgICAgICAgICAgIHIwIHw9IChyMSA8PCAxNik7ICAgICAgICAgICAvKiAwLGMsMCxhICovCisgICAgICAgICAgICByMSA9IHBfcmVmWzFdOworICAgICAgICAgICAgcjIgPSBwX3JlZlszXTsKKyAgICAgICAgICAgIHIxIHw9IChyMiA8PCAxNik7ICAgICAgICAgICAvKiAwLGQsMCxiICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7IC8qIG1vdmUgcG9pbnRlciB0byBlICovCisgICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsyXTsKKyAgICAgICAgICAgICAgICByMiB8PSAocjMgPDwgMTYpOyAgICAgICAgICAgLyogMCxnLDAsZSAqLworICAgICAgICAgICAgICAgIHIzID0gcF9yZWZbMV07CisgICAgICAgICAgICAgICAgcjQgPSBwX3JlZlszXTsKKyAgICAgICAgICAgICAgICByMyB8PSAocjQgPDwgMTYpOyAgICAgICAgICAgLyogMCxoLDAsZiAqLworCisgICAgICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLworICAgICAgICAgICAgICAgIHI1ID0gcjAgKyByMTsgICAvKiBjK2QsIGErYiAqLworICAgICAgICAgICAgICAgIHI2ID0gcjIgKyByMzsgICAvKiBnK2gsIGUrZiAqLworICAgICAgICAgICAgICAgIHI1ID4+PSAxNjsKKyAgICAgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOyAgIC8qIGUrZiwgYytkICovCisgICAgICAgICAgICAgICAgcjQgKz0gcjUgKiAyMDsgICAgICAvKiBjKzIwKmUrMjAqZitoLCBhKzIwKmMrMjAqZCtmICovCisgICAgICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCisgICAgICAgICAgICAgICAgcjUgPSByMSArIHIyOyAgICAgICAvKiBkK2csIGIrZSAqLworICAgICAgICAgICAgICAgIHI0IC09IHI1ICogNTsgICAgICAgLyogYy01KmQrMjAqZSsyMCpmLTUqZytoLCBhLTUqYisyMCpjKzIwKmQtNSplK2YgKi8KKyAgICAgICAgICAgICAgICByNCA+Pj0gNTsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjQ7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKworICAgICAgICAgICAgICAgIHI1ID0gcF9yZWZbZHgrMl07CisgICAgICAgICAgICAgICAgcjYgPSBwX3JlZltkeCs0XTsKKyAgICAgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOworICAgICAgICAgICAgICAgIHI0ICs9IHI1OworICAgICAgICAgICAgICAgIHI0ICs9IDB4MTAwMDE7CisgICAgICAgICAgICAgICAgcjQgPSAocjQgPj4gMSkgJiAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHI1ID0gcF9yZWZbNF07ICAvKiBpICovCisgICAgICAgICAgICAgICAgcjYgPSAocjUgPDwgMTYpOworICAgICAgICAgICAgICAgIHI1ID0gcjYgfCAocjIgPj4gMTYpOy8qIDAsaSwwLGcgKi8KKyAgICAgICAgICAgICAgICByNSArPSByMTsgICAgICAgLyogZCtpLCBiK2cgKi8gLyogcjUgbm90IGZyZWUgKi8KKyAgICAgICAgICAgICAgICByMSA+Pj0gMTY7CisgICAgICAgICAgICAgICAgcjEgfD0gKHIzIDw8IDE2KTsgLyogMCxmLDAsZCAqLyAvKiByMSBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIHIxICs9IHIyOyAgICAgICAvKiBmK2csIGQrZSAqLworICAgICAgICAgICAgICAgIHI1ICs9IDIwICogcjE7ICAvKiBkKzIwZisyMGcraSwgYisyMGQrMjBlK2cgKi8KKyAgICAgICAgICAgICAgICByMCA+Pj0gMTY7CisgICAgICAgICAgICAgICAgcjAgfD0gKHIyIDw8IDE2KTsgLyogMCxlLDAsYyAqLyAvKiByMCBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIHIwICs9IHIzOyAgICAgICAvKiBlK2gsIGMrZiAqLworICAgICAgICAgICAgICAgIHI1ICs9IDB4MTAwMDEwOyAvKiAxNiwxNiAqLworICAgICAgICAgICAgICAgIHI1IC09IHIwICogNTsgICAgICAgLyogZC01ZSsyMGYrMjBnLTVoK2ksIGItNWMrMjBkKzIwZS01ZitnICovCisgICAgICAgICAgICAgICAgcjUgPj49IDU7CisgICAgICAgICAgICAgICAgcjEzIHw9IHI1OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisKKyAgICAgICAgICAgICAgICByMCA9IHBfcmVmW2R4KzNdOworICAgICAgICAgICAgICAgIHIxID0gcF9yZWZbZHgrNV07CisgICAgICAgICAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsKKyAgICAgICAgICAgICAgICByNSArPSByMDsKKyAgICAgICAgICAgICAgICByNSArPSAweDEwMDAxOworICAgICAgICAgICAgICAgIHI1ID0gKHI1ID4+IDEpICYgMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLworICAgICAgICAgICAgICAgICpwX2N1cisrID0gcjQ7CisgICAgICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICAgICByMCA9IHIyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgIC8qICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoLWJsa3dpZHRoOyAqLworCisgICAgICAgICAgICBpZiAocjEzJjB4RkYwMDA3MDApIC8qIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBtb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IChyZWZfb2Zmc2V0ICsgYmxrd2lkdGgpOyAgIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgcF9jdXIgLT0gKG91dHBpdGNoID4+IDIpOworCisgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeF0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgPSAocmVzdWx0ID4+IDEpIDsKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7CisgICAgICAgICAgICAgICAgICAgICpwX2N1cisrID0gcGtyZXM7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7ICAvKiBvZmZzZXQgYmFjayB0byB0aGUgbWlkZGxlIG9mIGZpbHRlciAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBfcmVmIC09IDI7CisgICAgICAgIHIxMyA9IDA7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICByMCA9IHBfcmVmWzBdOworICAgICAgICAgICAgcjEgPSBwX3JlZlsyXTsKKyAgICAgICAgICAgIHIwIHw9IChyMSA8PCAxNik7ICAgICAgICAgICAvKiAwLGMsMCxhICovCisgICAgICAgICAgICByMSA9IHBfcmVmWzFdOworICAgICAgICAgICAgcjIgPSBwX3JlZlszXTsKKyAgICAgICAgICAgIHIxIHw9IChyMiA8PCAxNik7ICAgICAgICAgICAvKiAwLGQsMCxiICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7IC8qIG1vdmUgcG9pbnRlciB0byBlICovCisgICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsyXTsKKyAgICAgICAgICAgICAgICByMiB8PSAocjMgPDwgMTYpOyAgICAgICAgICAgLyogMCxnLDAsZSAqLworICAgICAgICAgICAgICAgIHIzID0gcF9yZWZbMV07CisgICAgICAgICAgICAgICAgcjQgPSBwX3JlZlszXTsKKyAgICAgICAgICAgICAgICByMyB8PSAocjQgPDwgMTYpOyAgICAgICAgICAgLyogMCxoLDAsZiAqLworCisgICAgICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLworICAgICAgICAgICAgICAgIHI1ID0gcjAgKyByMTsgICAvKiBjK2QsIGErYiAqLworICAgICAgICAgICAgICAgIHI2ID0gcjIgKyByMzsgICAvKiBnK2gsIGUrZiAqLworICAgICAgICAgICAgICAgIHI1ID4+PSAxNjsKKyAgICAgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOyAgIC8qIGUrZiwgYytkICovCisgICAgICAgICAgICAgICAgcjQgKz0gcjUgKiAyMDsgICAgICAvKiBjKzIwKmUrMjAqZitoLCBhKzIwKmMrMjAqZCtmICovCisgICAgICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCisgICAgICAgICAgICAgICAgcjUgPSByMSArIHIyOyAgICAgICAvKiBkK2csIGIrZSAqLworICAgICAgICAgICAgICAgIHI0IC09IHI1ICogNTsgICAgICAgLyogYy01KmQrMjAqZSsyMCpmLTUqZytoLCBhLTUqYisyMCpjKzIwKmQtNSplK2YgKi8KKyAgICAgICAgICAgICAgICByNCA+Pj0gNTsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjQ7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgICAgICByNCAmPSAweEZGMDBGRjsgLyogbWFzayAqLworCisgICAgICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KKyAgICAgICAgICAgICAgICByNiA9IChyNSA8PCAxNik7CisgICAgICAgICAgICAgICAgcjUgPSByNiB8IChyMiA+PiAxNik7LyogMCxpLDAsZyAqLworICAgICAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLworICAgICAgICAgICAgICAgIHIxID4+PSAxNjsKKyAgICAgICAgICAgICAgICByMSB8PSAocjMgPDwgMTYpOyAvKiAwLGYsMCxkICovIC8qIHIxIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCisgICAgICAgICAgICAgICAgcjUgKz0gMjAgKiByMTsgIC8qIGQrMjBmKzIwZytpLCBiKzIwZCsyMGUrZyAqLworICAgICAgICAgICAgICAgIHIwID4+PSAxNjsKKyAgICAgICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgIC8qIGUraCwgYytmICovCisgICAgICAgICAgICAgICAgcjUgKz0gMHgxMDAwMTA7IC8qIDE2LDE2ICovCisgICAgICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KKyAgICAgICAgICAgICAgICByNSA+Pj0gNTsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjU7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgICAgICByNSAmPSAweEZGMDBGRjsgLyogbWFzayAqLworCisgICAgICAgICAgICAgICAgcjQgfD0gKHI1IDw8IDgpOyAgICAvKiBwYWNrIHRoZW0gdG9nZXRoZXIgKi8KKyAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHI0OworICAgICAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICAgICAgcjAgPSByMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KKworICAgICAgICAgICAgaWYgKHIxMyYweEZGMDAwNzAwKSAvKiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbW92ZSBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAocmVmX29mZnNldCArIGJsa3dpZHRoKTsgICAvKiBpbnB1dCAqLworICAgICAgICAgICAgICAgIHBfY3VyIC09IChvdXRwaXRjaCA+PiAyKTsKKworICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKKyAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgICAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSA1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZUhvcnpJbnRlcnAyTUMoaW50ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpCit7CisgICAgaW50ICpwX3JlZjsKKyAgICB1aW50MzIgKnBfY3VyOworICAgIHVpbnQzMiB0bXAsIHBrcmVzOworICAgIGludCByZXN1bHQsIHJlc3VsdDIsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIGludCBqLCByMCwgcjEsIHIyLCByMywgcjQsIHI1OworCisgICAgcF9jdXIgPSAodWludDMyKilvdXQ7IC8qIGFzc3VtZSBpdCdzIHdvcmQgYWxpZ25lZCAqLworICAgIGN1cnJfb2Zmc2V0ID0gKG91dHBpdGNoIC0gYmxrd2lkdGgpID4+IDI7CisgICAgcF9yZWYgPSBpbjsKKyAgICByZWZfb2Zmc2V0ID0gaW5waXRjaCAtIGJsa3dpZHRoOworCisgICAgaWYgKGR4JjEpCisgICAgeworICAgICAgICBkeCA9ICgoZHggPj4gMSkgPyAtMyA6IC00KTsgLyogdXNlIGluIDMvNCBwZWwgKi8KKworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwIDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHIwID0gcF9yZWZbLTJdOworICAgICAgICAgICAgICAgIHIxID0gcF9yZWZbLTFdOworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcGtyZXMgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgOCk7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeF0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKKyAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeF0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHBrcmVzOyAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IDM7ICAvKiBvZmZzZXQgYmFjayB0byB0aGUgbWlkZGxlIG9mIGZpbHRlciAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7ICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDAgOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgcjAgPSBwX3JlZlstMl07CisgICAgICAgICAgICAgICAgcjEgPSBwX3JlZlstMV07CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyAgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgOCk7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAxNik7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMjQpOworICAgICAgICAgICAgICAgICpwX2N1cisrID0gcGtyZXM7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gMzsgIC8qIG9mZnNldCBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgZmlsdGVyICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgICAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVIb3J6SW50ZXJwM01DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIGludCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICB1aW50OCAqcF9yZWY7CisgICAgaW50ICAgKnBfY3VyOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IChvdXRwaXRjaCAtIGJsa3dpZHRoKTsKKyAgICBwX3JlZiA9IGluOworICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoIC0gYmxrd2lkdGg7CisKKyAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwIDsgai0tKQorICAgIHsKKyAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgIGZvciAoOyAodWludDMyKXBfcmVmIDwgdG1wOykKKyAgICAgICAgeworCisgICAgICAgICAgICByMCA9IHBfcmVmWy0yXTsKKyAgICAgICAgICAgIHIxID0gcF9yZWZbLTFdOworICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgKnBfY3VyKysgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgKnBfY3VyKysgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKKyAgICAgICAgICAgIHBfcmVmIC09IDM7IC8qIG1vdmUgYmFjayB0byB0aGUgbWlkZGxlIG9mIHRoZSBmaWx0ZXIgKi8KKyAgICAgICAgfQorICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KK3ZvaWQgZVZlcnRJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeSkKK3sKKyAgICB1aW50OCAqcF9jdXIsICpwX3JlZjsKKyAgICB1aW50MzIgdG1wOworICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIGludCBqLCBpOworICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHIxMzsKKyAgICB1aW50OCAgdG1wX2luWzI0XVsyNF07CisKKyAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCisgICAgaWYgKCgodWludDMyKWluKSYweDMpCisgICAgeworICAgICAgICBlQ3JlYXRlQWxpZ24oaW4sIGlucGl0Y2gsIC0yLCAmdG1wX2luWzBdWzBdLCBibGt3aWR0aCwgYmxraGVpZ2h0ICsgNSk7CisgICAgICAgIGluID0gJnRtcF9pblsyXVswXTsKKyAgICAgICAgaW5waXRjaCA9IDI0OworICAgIH0KKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IDEgLSBvdXRwaXRjaCAqIChibGtoZWlnaHQgLSAxKTsgLyogb2Zmc2V0IHZlcnRpY2FsbHkgYmFjayB1cCBhbmQgb25lIHBpeGVsIHRvIHJpZ2h0ICovCisgICAgcmVmX29mZnNldCA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIGZvciBsaW1pdCAqLworCisgICAgY3Vycl9vZmZzZXQgKz0gMzsKKworICAgIGlmIChkeSYxKQorICAgIHsKKyAgICAgICAgZHkgPSAoZHkgPj4gMSkgPyAwIDogLWlucGl0Y2g7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQsIGluICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIxMyA9IDA7CisgICAgICAgICAgICBwX3JlZiA9IGluOworICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApICAvKiB0aGUgbG9vcCB1bi1yb2xsZWQgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIGxvYWQgNCBieXRlcyAqLworICAgICAgICAgICAgICAgIHBfcmVmICs9IGlucGl0Y2g7CisgICAgICAgICAgICAgICAgcjYgPSAocjAgPj4gOCkgJiAweEZGMDBGRjsgLyogc2Vjb25kIGFuZCBmb3VydGggYnl0ZSAqLworICAgICAgICAgICAgICAgIHIwICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIChpbnBpdGNoIDw8IDEpKSk7ICAvKiByMSwgcjcsIHJlZlszXSAqLworICAgICAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMCArPSByMTsKKyAgICAgICAgICAgICAgICByNiArPSByNzsKKworICAgICAgICAgICAgICAgIHIyID0gKigodWludDMyKilwX3JlZik7IC8qIHIyLCByOCwgcmVmWzFdICovCisgICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgLSBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzBdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICAgICAgcjAgKz0gMjAgKiByMTsKKyAgICAgICAgICAgICAgICByNiArPSAyMCAqIHI3OworICAgICAgICAgICAgICAgIHIwICs9IDB4MTAwMDEwOworICAgICAgICAgICAgICAgIHI2ICs9IDB4MTAwMDEwOworCisgICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIHIyLCByOCwgcmVmWy0xXSAqLworICAgICAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjIgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgaW5waXRjaCkpOyAvKiByMSwgcjcsIHJlZlsyXSAqLworICAgICAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisKKyAgICAgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgICAgIHIwIC09IDUgKiByMTsKKyAgICAgICAgICAgICAgICByNiAtPSA1ICogcjc7CisKKyAgICAgICAgICAgICAgICByMCA+Pj0gNTsKKyAgICAgICAgICAgICAgICByNiA+Pj0gNTsKKyAgICAgICAgICAgICAgICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjEzIHw9IHI2OworICAgICAgICAgICAgICAgIHIxMyB8PSByMDsKKyAgICAgICAgICAgICAgICAvL0NMSVBQQUNLKHI2LHJlc3VsdCkKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBkeSkpOworICAgICAgICAgICAgICAgIHIyID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjAgKz0gcjE7CisgICAgICAgICAgICAgICAgcjYgKz0gcjI7CisgICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgICAgICByNiArPSAweDEwMDAxOworICAgICAgICAgICAgICAgIHIwID0gKHIwID4+IDEpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjYgPSAocjYgPj4gMSkgJiAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIwIHw9IChyNiA8PCA4KTsgIC8qIHBhY2sgaXQgYmFjayAqLworICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHBfY3VyICs9IG91dHBpdGNoKSkgPSByMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG5leHQgcGl4ZWwgKi8KKyAgICAgICAgICAgIGlmIChyMTMgJiAweEZGMDAwNzAwKSAvKiB0aGlzIGNvbHVtbiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXIgLT0gNDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgPSBpbiArIGk7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworCisgICAgICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bi1yb2xsZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWY7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R5LShpbnBpdGNoPDwxKV0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R5LShpbnBpdGNoPDwxKV0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeS0oaW5waXRjaDw8MSldICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwX2N1ciArPSAoY3Vycl9vZmZzZXQgLSAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQsIGluICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIxMyA9IDA7CisgICAgICAgICAgICBwX3JlZiA9IGluOworICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApICAvKiB0aGUgbG9vcCB1bi1yb2xsZWQgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIGxvYWQgNCBieXRlcyAqLworICAgICAgICAgICAgICAgIHBfcmVmICs9IGlucGl0Y2g7CisgICAgICAgICAgICAgICAgcjYgPSAocjAgPj4gOCkgJiAweEZGMDBGRjsgLyogc2Vjb25kIGFuZCBmb3VydGggYnl0ZSAqLworICAgICAgICAgICAgICAgIHIwICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIChpbnBpdGNoIDw8IDEpKSk7ICAvKiByMSwgcjcsIHJlZlszXSAqLworICAgICAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMCArPSByMTsKKyAgICAgICAgICAgICAgICByNiArPSByNzsKKworICAgICAgICAgICAgICAgIHIyID0gKigodWludDMyKilwX3JlZik7IC8qIHIyLCByOCwgcmVmWzFdICovCisgICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgLSBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzBdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICAgICAgcjAgKz0gMjAgKiByMTsKKyAgICAgICAgICAgICAgICByNiArPSAyMCAqIHI3OworICAgICAgICAgICAgICAgIHIwICs9IDB4MTAwMDEwOworICAgICAgICAgICAgICAgIHI2ICs9IDB4MTAwMDEwOworCisgICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIHIyLCByOCwgcmVmWy0xXSAqLworICAgICAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjIgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgaW5waXRjaCkpOyAvKiByMSwgcjcsIHJlZlsyXSAqLworICAgICAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAgICAgcjEgKz0gcjI7CisKKyAgICAgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgICAgIHIwIC09IDUgKiByMTsKKyAgICAgICAgICAgICAgICByNiAtPSA1ICogcjc7CisKKyAgICAgICAgICAgICAgICByMCA+Pj0gNTsKKyAgICAgICAgICAgICAgICByNiA+Pj0gNTsKKyAgICAgICAgICAgICAgICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjEzIHw9IHI2OworICAgICAgICAgICAgICAgIHIxMyB8PSByMDsKKyAgICAgICAgICAgICAgICAvL0NMSVBQQUNLKHI2LHJlc3VsdCkKKyAgICAgICAgICAgICAgICByMCAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByNiAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMCB8PSAocjYgPDwgOCk7ICAvKiBwYWNrIGl0IGJhY2sgKi8KKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwX2N1ciArPSBvdXRwaXRjaCkpID0gcjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogb2Zmc2V0IHRvIHRoZSBuZXh0IHBpeGVsICovCisgICAgICAgICAgICBpZiAocjEzICYgMHhGRjAwMDcwMCkgLyogdGhpcyBjb2x1bW4gbmVlZCBjbGlwcGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyIC09IDQ7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfcmVmID0gaW4gKyBpOworICAgICAgICAgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwX2N1ciArPSAoY3Vycl9vZmZzZXQgLSAzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVWZXJ0SW50ZXJwMk1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIGludCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQgKnBfY3VyOworICAgIHVpbnQ4ICpwX3JlZjsKKyAgICB1aW50MzIgdG1wOworICAgIGludCByZXN1bHQsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIGludCBqLCByMCwgcjEsIHIyLCByMywgcjQsIHI1OworCisgICAgcF9jdXIgPSBvdXQ7CisgICAgY3Vycl9vZmZzZXQgPSAxIC0gb3V0cGl0Y2ggKiAoYmxraGVpZ2h0IC0gMSk7IC8qIG9mZnNldCB2ZXJ0aWNhbGx5IGJhY2sgdXAgYW5kIG9uZSBwaXhlbCB0byByaWdodCAqLworICAgIHJlZl9vZmZzZXQgPSBibGtoZWlnaHQgKiBpbnBpdGNoOyAvKiBmb3IgbGltaXQgKi8KKworICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaisrKQorICAgIHsKKyAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7IC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgcF9yZWYgPSBpbisrOworCisgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bi1yb2xsZWQgKi8KKyAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgcjIgPSAqcF9yZWY7CisgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCisgICAgICAgIH0KKyAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlVmVydEludGVycDNNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeSkKK3sKKyAgICB1aW50OCAqcF9jdXI7CisgICAgaW50ICpwX3JlZjsKKyAgICB1aW50MzIgdG1wOworICAgIGludCByZXN1bHQsIHJlc3VsdDIsIGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIGludCBqLCByMCwgcjEsIHIyLCByMywgcjQsIHI1OworCisgICAgcF9jdXIgPSBvdXQ7CisgICAgY3Vycl9vZmZzZXQgPSAxIC0gb3V0cGl0Y2ggKiAoYmxraGVpZ2h0IC0gMSk7IC8qIG9mZnNldCB2ZXJ0aWNhbGx5IGJhY2sgdXAgYW5kIG9uZSBwaXhlbCB0byByaWdodCAqLworICAgIHJlZl9vZmZzZXQgPSBibGtoZWlnaHQgKiBpbnBpdGNoOyAvKiBmb3IgbGltaXQgKi8KKworICAgIGlmIChkeSYxKQorICAgIHsKKyAgICAgICAgZHkgPSAoZHkgPj4gMSkgPyAtKGlucGl0Y2ggPDwgMSkgOiAtKGlucGl0Y2ggPDwgMSkgLSBpbnBpdGNoOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgcF9yZWYgPSBpbisrOworCisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bi1yb2xsZWQgKi8KKyAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWY7CisgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeV0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeV0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgcF9yZWYgPSBpbisrOworCisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bi1yb2xsZWQgKi8KKyAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWY7CisgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZURpYWdvbmFsSW50ZXJwTUModWludDggKmluMSwgdWludDggKmluMiwgaW50IGlucGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCBqLCBpOworICAgIGludCByZXN1bHQ7CisgICAgdWludDggKnBfY3VyLCAqcF9yZWYsICpwX3RtcDg7CisgICAgaW50IGN1cnJfb2Zmc2V0LCByZWZfb2Zmc2V0OworICAgIHVpbnQ4IHRtcF9yZXNbMjRdWzI0XSwgdG1wX2luWzI0XVsyNF07CisgICAgdWludDMyICpwX3RtcDsKKyAgICB1aW50MzIgdG1wLCBwa3JlcywgdG1wX3Jlc3VsdDsKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByMywgcjQsIHI1OworICAgIGludDMyIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMzsKKworICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoIC0gYmxrd2lkdGg7CisgICAgcF9yZWYgPSBpbjEgLSAyOworICAgIC8qIHBlcmZvcm0gaG9yaXpvbnRhbCBpbnRlcnBvbGF0aW9uICovCisgICAgLyogbm90IHdvcmQtYWxpZ25lZCAqLworICAgIC8qIEl0IGlzIGZhc3RlciB0byByZWFkIDEgYnl0ZSBhdCB0aW1lIHRvIGF2b2lkIGNhbGxpbmcgQ3JlYXRlQWxpZ24gKi8KKyAgICAvKiAgaWYoKCh1aW50MzIpcF9yZWYpJjB4MykKKyAgICAgICAgeworICAgICAgICAgICAgQ3JlYXRlQWxpZ24ocF9yZWYsaW5waXRjaCwwLCZ0bXBfaW5bMF1bMF0sYmxrd2lkdGgrOCxibGtoZWlnaHQpOworICAgICAgICAgICAgcF9yZWYgPSAmdG1wX2luWzBdWzBdOworICAgICAgICAgICAgcmVmX29mZnNldCA9IDI0LWJsa3dpZHRoOworICAgICAgICB9Ki8KKworICAgIHBfdG1wID0gKHVpbnQzMiopICYgKHRtcF9yZXNbMF1bMF0pOworICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICB7CisgICAgICAgIHIxMyA9IDA7CisgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworCisgICAgICAgIC8vcjAgPSAqKCh1aW50MzIqKXBfcmVmKTsgICAvKiBkLGMsYixhICovCisgICAgICAgIC8vcjEgPSAocjA+PjgpJjB4RkYwMEZGOyAgICAvKiAwLGQsMCxiICovCisgICAgICAgIC8vcjAgJj0gMHhGRjAwRkY7ICAgICAgICAgICAvKiAwLGMsMCxhICovCisgICAgICAgIC8qIEl0IGlzIGZhc3RlciB0byByZWFkIDEgYnl0ZSBhdCBhIHRpbWUgKi8KKyAgICAgICAgcjAgPSBwX3JlZlswXTsKKyAgICAgICAgcjEgPSBwX3JlZlsyXTsKKyAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgcjEgPSBwX3JlZlsxXTsKKyAgICAgICAgcjIgPSBwX3JlZlszXTsKKyAgICAgICAgcjEgfD0gKHIyIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZCwwLGIgKi8KKworICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9yMiA9ICooKHVpbnQzMiopKHBfcmVmKz00KSk7LyogaCxnLGYsZSAqLworICAgICAgICAgICAgLy9yMyA9IChyMj4+OCkmMHhGRjAwRkY7ICAvKiAwLGgsMCxmICovCisgICAgICAgICAgICAvL3IyICY9IDB4RkYwMEZGOyAgICAgICAgICAgLyogMCxnLDAsZSAqLworICAgICAgICAgICAgLyogSXQgaXMgZmFzdGVyIHRvIHJlYWQgMSBieXRlIGF0IGEgdGltZSAqLworICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IDQpOworICAgICAgICAgICAgcjMgPSBwX3JlZlsyXTsKKyAgICAgICAgICAgIHIyIHw9IChyMyA8PCAxNik7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICByMyA9IHBfcmVmWzFdOworICAgICAgICAgICAgcjQgPSBwX3JlZlszXTsKKyAgICAgICAgICAgIHIzIHw9IChyNCA8PCAxNik7ICAgICAgICAgICAvKiAwLGgsMCxmICovCisKKyAgICAgICAgICAgIHI0ID0gcjAgKyByMzsgICAgICAgLyogYytoLCBhK2YgKi8KKyAgICAgICAgICAgIHI1ID0gcjAgKyByMTsgICAvKiBjK2QsIGErYiAqLworICAgICAgICAgICAgcjYgPSByMiArIHIzOyAgIC8qIGcraCwgZStmICovCisgICAgICAgICAgICByNSA+Pj0gMTY7CisgICAgICAgICAgICByNSB8PSAocjYgPDwgMTYpOyAgIC8qIGUrZiwgYytkICovCisgICAgICAgICAgICByNCArPSByNSAqIDIwOyAgICAgIC8qIGMrMjAqZSsyMCpmK2gsIGErMjAqYysyMCpkK2YgKi8KKyAgICAgICAgICAgIHI0ICs9IDB4MTAwMDEwOyAvKiArMTYsICsxNiAqLworICAgICAgICAgICAgcjUgPSByMSArIHIyOyAgICAgICAvKiBkK2csIGIrZSAqLworICAgICAgICAgICAgcjQgLT0gcjUgKiA1OyAgICAgICAvKiBjLTUqZCsyMCplKzIwKmYtNSpnK2gsIGEtNSpiKzIwKmMrMjAqZC01KmUrZiAqLworICAgICAgICAgICAgcjQgPj49IDU7CisgICAgICAgICAgICByMTMgfD0gcjQ7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHI0ICY9IDB4RkYwMEZGOyAvKiBtYXNrICovCisKKyAgICAgICAgICAgIHI1ID0gcF9yZWZbNF07ICAvKiBpICovCisgICAgICAgICAgICByNiA9IChyNSA8PCAxNik7CisgICAgICAgICAgICByNSA9IHI2IHwgKHIyID4+IDE2KTsvKiAwLGksMCxnICovCisgICAgICAgICAgICByNSArPSByMTsgICAgICAgLyogZCtpLCBiK2cgKi8gLyogcjUgbm90IGZyZWUgKi8KKyAgICAgICAgICAgIHIxID4+PSAxNjsKKyAgICAgICAgICAgIHIxIHw9IChyMyA8PCAxNik7IC8qIDAsZiwwLGQgKi8gLyogcjEgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgIHIxICs9IHIyOyAgICAgICAvKiBmK2csIGQrZSAqLworICAgICAgICAgICAgcjUgKz0gMjAgKiByMTsgIC8qIGQrMjBmKzIwZytpLCBiKzIwZCsyMGUrZyAqLworICAgICAgICAgICAgcjAgPj49IDE2OworICAgICAgICAgICAgcjAgfD0gKHIyIDw8IDE2KTsgLyogMCxlLDAsYyAqLyAvKiByMCBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgIC8qIGUraCwgYytmICovCisgICAgICAgICAgICByNSArPSAweDEwMDAxMDsgLyogMTYsMTYgKi8KKyAgICAgICAgICAgIHI1IC09IHIwICogNTsgICAgICAgLyogZC01ZSsyMGYrMjBnLTVoK2ksIGItNWMrMjBkKzIwZS01ZitnICovCisgICAgICAgICAgICByNSA+Pj0gNTsKKyAgICAgICAgICAgIHIxMyB8PSByNTsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgcjUgJj0gMHhGRjAwRkY7IC8qIG1hc2sgKi8KKworICAgICAgICAgICAgcjQgfD0gKHI1IDw8IDgpOyAgICAvKiBwYWNrIHRoZW0gdG9nZXRoZXIgKi8KKyAgICAgICAgICAgICpwX3RtcCsrID0gcjQ7CisgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgcjAgPSByMjsKKyAgICAgICAgfQorICAgICAgICBwX3RtcCArPSAoKDI0IC0gYmxrd2lkdGgpID4+IDIpOyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgIC8qICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoLWJsa3dpZHRoOyAqLworCisgICAgICAgIGlmIChyMTMmMHhGRjAwMDcwMCkgLyogbmVlZCBjbGlwcGluZyAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBtb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgLT0gKHJlZl9vZmZzZXQgKyBibGt3aWR0aCk7ICAgLyogaW5wdXQgKi8KKyAgICAgICAgICAgIHBfdG1wIC09IDY7IC8qIGludGVybWVkaWF0ZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyB8PSAocmVzdWx0IDw8IDgpOworICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyB8PSAocmVzdWx0IDw8IDI0KTsKKworICAgICAgICAgICAgICAgICpwX3RtcCsrID0gcGtyZXM7IC8qIHdyaXRlIDQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiAtPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF90bXAgKz0gKCgyNCAtIGJsa3dpZHRoKSA+PiAyKTsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAgcGVyZm9ybSB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovCisgICAgLyogbm90IHdvcmQtYWxpZ25lZCAqLworICAgIGlmICgoKHVpbnQzMilpbjIpJjB4MykKKyAgICB7CisgICAgICAgIGVDcmVhdGVBbGlnbihpbjIsIGlucGl0Y2gsIC0yLCAmdG1wX2luWzBdWzBdLCBibGt3aWR0aCwgYmxraGVpZ2h0ICsgNSk7CisgICAgICAgIGluMiA9ICZ0bXBfaW5bMl1bMF07CisgICAgICAgIGlucGl0Y2ggPSAyNDsKKyAgICB9CisKKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IDEgLSBvdXRwaXRjaCAqIChibGtoZWlnaHQgLSAxKTsgLyogb2Zmc2V0IHZlcnRpY2FsbHkgdXAgYW5kIG9uZSBwaXhlbCByaWdodCAqLworICAgIHBrcmVzID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogcmV1c2UgaXQgZm9yIGxpbWl0ICovCisKKyAgICBjdXJyX29mZnNldCArPSAzOworCisgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQsIGluMiArPSA0KQorICAgIHsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgcF9yZWYgPSBpbjI7CisgICAgICAgIHBfdG1wOCA9ICYodG1wX3Jlc1swXVtqXSk7IC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgcF90bXA4IC09IDI0OyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBwa3Jlcyk7IC8qIGxpbWl0ICovCisgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKSAgLyogdGhlIGxvb3AgdW4tcm9sbGVkICAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBSZWFkIDEgYnl0ZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3csIHRvbyBtYW55IHJlYWQgYW5kIHBhY2sgb3BzLCBuZWVkIHRvIGNhbGwgQ3JlYXRlQWxpZ24gKi8KKyAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYtKGlucGl0Y2g8PDEpOyAgICAgICAgICByMCA9IHBfcmVmOFswXTsgICAgICAgICByMSA9IHBfcmVmOFsyXTsKKyAgICAgICAgICAgIHIwIHw9IChyMTw8MTYpOyAgICAgICAgIHI2ID0gcF9yZWY4WzFdOyAgICAgICAgIHIxID0gcF9yZWY4WzNdOworICAgICAgICAgICAgcjYgfD0gKHIxPDwxNik7ICAgICAgICAgcF9yZWYrPWlucGl0Y2g7ICovCisgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICBwX3JlZiArPSBpbnBpdGNoOworICAgICAgICAgICAgcjYgPSAocjAgPj4gOCkgJiAweEZGMDBGRjsgLyogc2Vjb25kIGFuZCBmb3VydGggYnl0ZSAqLworICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIC8qcF9yZWY4ID0gcF9yZWYrKGlucGl0Y2g8PDEpOworICAgICAgICAgICAgcjEgPSBwX3JlZjhbMF07ICAgICAgICAgcjcgPSBwX3JlZjhbMl07ICAgICAgICAgcjEgfD0gKHI3PDwxNik7CisgICAgICAgICAgICByNyA9IHBfcmVmOFsxXTsgICAgICAgICByMiA9IHBfcmVmOFszXTsgICAgICAgICByNyB8PSAocjI8PDE2KTsqLworICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIChpbnBpdGNoIDw8IDEpKSk7ICAvKiByMSwgcjcsIHJlZlszXSAqLworICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICByMCArPSByMTsKKyAgICAgICAgICAgIHI2ICs9IHI3OworCisgICAgICAgICAgICAvKnIyID0gcF9yZWZbMF07ICAgICAgICAgICAgcjggPSBwX3JlZlsyXTsgICAgICAgICAgcjIgfD0gKHI4PDwxNik7CisgICAgICAgICAgICByOCA9IHBfcmVmWzFdOyAgICAgICAgICByMSA9IHBfcmVmWzNdOyAgICAgICAgICByOCB8PSAocjE8PDE2KTsqLworICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KKyAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZi1pbnBpdGNoOyAgICAgICAgICAgcjEgPSBwX3JlZjhbMF07ICAgICAgICAgcjcgPSBwX3JlZjhbMl07CisgICAgICAgICAgICByMSB8PSAocjc8PDE2KTsgICAgICAgICByMSArPSByMjsgICAgICAgICAgIHI3ID0gcF9yZWY4WzFdOworICAgICAgICAgICAgcjIgPSBwX3JlZjhbM107ICAgICAgICAgcjcgfD0gKHIyPDwxNik7Ki8KKyAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgLSBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzBdICovCisgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgIHIwICs9IDIwICogcjE7CisgICAgICAgICAgICByNiArPSAyMCAqIHI3OworICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICByNiArPSAweDEwMDAxMDsKKworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZi0oaW5waXRjaDw8MSk7ICAgICAgICAgIHIyID0gcF9yZWY4WzBdOyAgICAgICAgIHI4ID0gcF9yZWY4WzJdOworICAgICAgICAgICAgcjIgfD0gKHI4PDwxNik7ICAgICAgICAgcjggPSBwX3JlZjhbMV07ICAgICAgICAgcjEgPSBwX3JlZjhbM107ICAgICAgICAgcjggfD0gKHIxPDwxNik7Ki8KKyAgICAgICAgICAgIHIyID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiByMiwgcjgsIHJlZlstMV0gKi8KKyAgICAgICAgICAgIHI4ID0gKHIyID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZitpbnBpdGNoOyAgICAgICAgICAgcjEgPSBwX3JlZjhbMF07ICAgICAgICAgcjcgPSBwX3JlZjhbMl07CisgICAgICAgICAgICByMSB8PSAocjc8PDE2KTsgICAgICAgICByMSArPSByMjsgICAgICAgICAgIHI3ID0gcF9yZWY4WzFdOworICAgICAgICAgICAgcjIgPSBwX3JlZjhbM107ICAgICAgICAgcjcgfD0gKHIyPDwxNik7Ki8KKyAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCisgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgIHIwIC09IDUgKiByMTsKKyAgICAgICAgICAgIHI2IC09IDUgKiByNzsKKworICAgICAgICAgICAgcjAgPj49IDU7CisgICAgICAgICAgICByNiA+Pj0gNTsKKyAgICAgICAgICAgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgIHIxMyB8PSByNjsKKyAgICAgICAgICAgIHIxMyB8PSByMDsKKyAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQorICAgICAgICAgICAgLyogYWRkIHdpdGggaG9yaXpvbnRhbCByZXN1bHRzICovCisgICAgICAgICAgICByMTAgPSAqKCh1aW50MzIqKShwX3RtcDggKz0gMjQpKTsKKyAgICAgICAgICAgIHI5ID0gKHIxMCA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjEwICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICByMCArPSByMTA7CisgICAgICAgICAgICByMCArPSAweDEwMDAxOworICAgICAgICAgICAgcjAgPSAocjAgPj4gMSkgJiAweEZGMDBGRjsgICAvKiBtYXNrIHRvIDggYnl0ZXMgKi8KKworICAgICAgICAgICAgcjYgKz0gcjk7CisgICAgICAgICAgICByNiArPSAweDEwMDAxOworICAgICAgICAgICAgcjYgPSAocjYgPj4gMSkgJiAweEZGMDBGRjsgICAvKiBtYXNrIHRvIDggYnl0ZXMgKi8KKworICAgICAgICAgICAgcjAgfD0gKHI2IDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCisgICAgICAgICAgICAqKCh1aW50MzIqKShwX2N1ciArPSBvdXRwaXRjaCkpID0gcjA7CisgICAgICAgIH0KKyAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgbmV4dCBwaXhlbCAqLworICAgICAgICBpZiAocjEzICYgMHhGRjAwMDcwMCkgLyogdGhpcyBjb2x1bW4gbmVlZCBjbGlwcGluZyAqLworICAgICAgICB7CisgICAgICAgICAgICBwX2N1ciAtPSA0OworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX3JlZiA9IGluMiArIGk7CisgICAgICAgICAgICAgICAgcF90bXA4ID0gJih0bXBfcmVzWzBdW2oraV0pOyAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgcF90bXA4IC09IDI0OyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcGtyZXMpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKSAgLyogdGhlIGxvb3AgdW4tcm9sbGVkICAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWY7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gKihwX3RtcDggKz0gMjQpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICB0bXBfcmVzdWx0ID0gKihwX3RtcDggKz0gMjQpOyAgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgdG1wX3Jlc3VsdCArIDEpOyAgLyogbm8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gKGlucGl0Y2ggPDwgMSk7ICAvKiBtb3ZlIGJhY2sgdG8gY2VudGVyIG9mIHRoZSBmaWx0ZXIgb2YgdGhlIG5leHQgb25lICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogcG9zaXRpb24gRyAqLwordm9pZCBlRnVsbFBlbE1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IG9mZnNldF9pbiA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKyAgICBpbnQgb2Zmc2V0X291dCA9IG91dHBpdGNoIC0gYmxrd2lkdGg7CisgICAgdWludDMyIHRlbXA7CisgICAgdWludDggYnl0ZTsKKworICAgIGlmICgoKHVpbnQzMilpbikmMykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICppbisrOworICAgICAgICAgICAgICAgIGJ5dGUgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlIDw8IDgpOworICAgICAgICAgICAgICAgIGJ5dGUgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlIDw8IDE2KTsKKyAgICAgICAgICAgICAgICBieXRlID0gKmluKys7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCAyNCk7CisKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSB0ZW1wOyAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgKz0gb2Zmc2V0X291dDsKKyAgICAgICAgICAgIGluICs9IG9mZnNldF9pbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGogPSBibGtoZWlnaHQ7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGJsa3dpZHRoOyBpID4gMDsgaSAtPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAqKCh1aW50MzIqKWluKTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSB0ZW1wOworICAgICAgICAgICAgICAgIGluICs9IDQ7CisgICAgICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgKz0gb2Zmc2V0X291dDsKKyAgICAgICAgICAgIGluICs9IG9mZnNldF9pbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGVQYWRDaHJvbWEodWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgcGljaGVpZ2h0LCBpbnQgcGljcGl0Y2gsIGludCB4X3BvcywgaW50IHlfcG9zKQoreworICAgIGludCBwYWRfaGVpZ2h0OworICAgIGludCBwYWRfd2lkdGg7CisgICAgdWludDggKnN0YXJ0OworICAgIHVpbnQzMiB3b3JkMSwgd29yZDIsIHdvcmQzOworICAgIGludCBvZmZzZXQsIGo7CisKKworICAgIHBhZF9oZWlnaHQgPSA4ICsgKCh5X3BvcyAmIDcpID8gMSA6IDApOworICAgIHBhZF93aWR0aCA9IDggKyAoKHhfcG9zICYgNykgPyAxIDogMCk7CisKKyAgICB5X3BvcyA+Pj0gMzsKKyAgICB4X3BvcyA+Pj0gMzsKKyAgICAvLyBwYWQgdmVydGljYWwgZmlyc3QKKyAgICBpZiAoeV9wb3MgPCAwKSAvLyBuZWVkIHRvIHBhZCB1cAorICAgIHsKKyAgICAgICAgaWYgKHhfcG9zIDwgLTgpIHN0YXJ0ID0gcmVmIC0gODsKKyAgICAgICAgZWxzZSBpZiAoeF9wb3MgKyBwYWRfd2lkdGggPiBwaWN3aWR0aCArIDcpIHN0YXJ0ID0gcmVmICsgcGljd2lkdGggKyA3IC0gcGFkX3dpZHRoOworICAgICAgICBlbHNlIHN0YXJ0ID0gcmVmICsgeF9wb3M7CisKKyAgICAgICAgLyogd29yZC1hbGlnbiBzdGFydCAqLworICAgICAgICBvZmZzZXQgPSAodWludDMyKXN0YXJ0ICYgMHgzOworICAgICAgICBpZiAob2Zmc2V0KSBzdGFydCAtPSBvZmZzZXQ7CisKKyAgICAgICAgd29yZDEgPSAqKCh1aW50MzIqKXN0YXJ0KTsKKyAgICAgICAgd29yZDIgPSAqKCh1aW50MzIqKShzdGFydCArIDQpKTsKKyAgICAgICAgd29yZDMgPSAqKCh1aW50MzIqKShzdGFydCArIDgpKTsKKworICAgICAgICAvKiBwYWQgdXAgTiByb3dzICovCisgICAgICAgIGogPSAteV9wb3M7CisgICAgICAgIGlmIChqID4gOCkgaiA9IDg7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0IC09IHBpY3BpdGNoKSkgPSB3b3JkMTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgNCkpID0gd29yZDI7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArIDgpKSA9IHdvcmQzOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSBpZiAoeV9wb3MgKyBwYWRfaGVpZ2h0ID49IHBpY2hlaWdodCkgLyogcGFkIGRvd24gKi8KKyAgICB7CisgICAgICAgIGlmICh4X3BvcyA8IC04KSBzdGFydCA9IHJlZiArIHBpY3BpdGNoICogKHBpY2hlaWdodCAtIDEpIC0gODsKKyAgICAgICAgZWxzZSBpZiAoeF9wb3MgKyBwYWRfd2lkdGggPiBwaWN3aWR0aCArIDcpIHN0YXJ0ID0gcmVmICsgcGljcGl0Y2ggKiAocGljaGVpZ2h0IC0gMSkgKworICAgICAgICAgICAgICAgICAgICBwaWN3aWR0aCArIDcgLSBwYWRfd2lkdGg7CisgICAgICAgIGVsc2UgICAgc3RhcnQgPSByZWYgKyBwaWNwaXRjaCAqIChwaWNoZWlnaHQgLSAxKSArIHhfcG9zOworCisgICAgICAgIC8qIHdvcmQtYWxpZ24gc3RhcnQgKi8KKyAgICAgICAgb2Zmc2V0ID0gKHVpbnQzMilzdGFydCAmIDB4MzsKKyAgICAgICAgaWYgKG9mZnNldCkgc3RhcnQgLT0gb2Zmc2V0OworCisgICAgICAgIHdvcmQxID0gKigodWludDMyKilzdGFydCk7CisgICAgICAgIHdvcmQyID0gKigodWludDMyKikoc3RhcnQgKyA0KSk7CisgICAgICAgIHdvcmQzID0gKigodWludDMyKikoc3RhcnQgKyA4KSk7CisKKyAgICAgICAgLyogcGFkIGRvd24gTiByb3dzICovCisgICAgICAgIGogPSB5X3BvcyArIHBhZF9oZWlnaHQgLSBwaWNoZWlnaHQ7CisgICAgICAgIGlmIChqID4gOCkgaiA9IDg7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICs9IHBpY3BpdGNoKSkgPSB3b3JkMTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgNCkpID0gd29yZDI7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArIDgpKSA9IHdvcmQzOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IHBhZCBob3Jpem9udGFsICovCisgICAgaWYgKHhfcG9zIDwgMCkgLy8gcGFkIGxlZnQKKyAgICB7CisgICAgICAgIGlmICh5X3BvcyA8IC04KSBzdGFydCA9IHJlZiAtIChwaWNwaXRjaCA8PCAzKTsKKyAgICAgICAgZWxzZSBpZiAoeV9wb3MgKyBwYWRfaGVpZ2h0ID4gcGljaGVpZ2h0ICsgNykgc3RhcnQgPSByZWYgKyAocGljaGVpZ2h0ICsgNyAtIHBhZF9oZWlnaHQpICogcGljcGl0Y2g7CisgICAgICAgIGVsc2Ugc3RhcnQgPSByZWYgKyB5X3BvcyAqIHBpY3BpdGNoOworCisgICAgICAgIC8vIG5vdyBwYWQgbGVmdCA4IHBpeGVscyBmb3IgcGFkX2hlaWdodCByb3dzICovCisgICAgICAgIGogPSBwYWRfaGVpZ2h0OworICAgICAgICBzdGFydCAtPSBwaWNwaXRjaDsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgd29yZDEgPSAqKHN0YXJ0ICs9IHBpY3BpdGNoKTsKKyAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMSA8PCA4KTsKKyAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMSA8PCAxNik7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCAtIDgpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgLSA0KSkgPSB3b3JkMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh4X3BvcyArIHBhZF93aWR0aCA+PSBwaWN3aWR0aCkgLyogcGFkIHJpZ2h0ICovCisgICAgeworICAgICAgICBpZiAoeV9wb3MgPCAtOCkgc3RhcnQgPSByZWYgLSAocGljcGl0Y2ggPDwgMykgKyBwaWN3aWR0aCAtIDE7CisgICAgICAgIGVsc2UgaWYgKHlfcG9zICsgcGFkX2hlaWdodCA+IHBpY2hlaWdodCArIDcpIHN0YXJ0ID0gcmVmICsgKHBpY2hlaWdodCArIDcgLSBwYWRfaGVpZ2h0KSAqIHBpY3BpdGNoICsgcGljd2lkdGggLSAxOworICAgICAgICBlbHNlIHN0YXJ0ID0gcmVmICsgeV9wb3MgKiBwaWNwaXRjaCArIHBpY3dpZHRoIC0gMTsKKworICAgICAgICAvLyBub3cgcGFkIHJpZ2h0IDggcGl4ZWxzIGZvciBwYWRfaGVpZ2h0IHJvd3MgKi8KKyAgICAgICAgaiA9IHBhZF9oZWlnaHQ7CisgICAgICAgIHN0YXJ0IC09IHBpY3BpdGNoOworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICB3b3JkMSA9ICooc3RhcnQgKz0gcGljcGl0Y2gpOworICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQxIDw8IDgpOworICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQxIDw8IDE2KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgMSkpID0gd29yZDE7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCArIDUpKSA9IHdvcmQxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIGVDaHJvbWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWN3aWR0aCwgaW50IHBpY2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcmVkLCBpbnQgcGljcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQgZHgsIGR5OworICAgIGludCBvZmZzZXRfZHgsIG9mZnNldF9keTsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBlUGFkQ2hyb21hKHJlZiwgcGljd2lkdGgsIHBpY2hlaWdodCwgcGljcGl0Y2gsIHhfcG9zLCB5X3Bvcyk7CisKKyAgICBkeCA9IHhfcG9zICYgNzsKKyAgICBkeSA9IHlfcG9zICYgNzsKKyAgICBvZmZzZXRfZHggPSAoZHggKyA3KSA+PiAzOworICAgIG9mZnNldF9keSA9IChkeSArIDcpID4+IDM7CisgICAgeF9wb3MgPSB4X3BvcyA+PiAzOyAgLyogcm91bmQgaXQgdG8gZnVsbC1wZWwgcmVzb2x1dGlvbiAqLworICAgIHlfcG9zID0geV9wb3MgPj4gMzsKKworICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICBpbmRleCA9IG9mZnNldF9keCArIChvZmZzZXRfZHkgPDwgMSkgKyAoKGJsa3dpZHRoIDw8IDEpICYgMHg3KTsKKworICAgICgqKGVDaHJvbWFNQ19TSU1EW2luZGV4XSkpKHJlZiwgcGljcGl0Y2ggLCBkeCwgZHksIHByZWQsIHBpY3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0KTsKKyAgICByZXR1cm4gOworfQorCisKKy8qIFNJTUQgcm91dGluZXMsIHVucm9sbCB0aGUgbG9vcHMgaW4gdmVydGljYWwgZGlyZWN0aW9uLCBkZWNyZWFzaW5nIGxvb3BzICh0aGluZ3MgdG8gYmUgZG9uZSkgKi8KK3ZvaWQgZUNocm9tYURpYWdvbmFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByZXN1bHQwLCByZXN1bHQxOworICAgIHVpbnQ4IHRlbXBbMjg4XTsKKyAgICB1aW50OCAqcmVmLCAqb3V0OworICAgIGludCBpLCBqOworICAgIGludCBkeF84ID0gOCAtIGR4OworICAgIGludCBkeV84ID0gOCAtIGR5OworCisgICAgLyogaG9yaXpvbnRhbCBmaXJzdCAqLworICAgIG91dCA9IHRlbXA7CisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodCArIDE7IGkrKykKKyAgICB7CisgICAgICAgIHJlZiA9IHBSZWY7CisgICAgICAgIHIwID0gcmVmWzBdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcjAgfD0gKHJlZlsyXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwID0gZHhfOCAqIHIwOworCisgICAgICAgICAgICByMSA9IHJlZlsxXSB8IChyZWZbM10gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCArPSBkeCAqIHIxOworICAgICAgICAgICAgKihpbnQzMiAqKW91dCA9IHJlc3VsdDA7CisKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeF84ICogcjE7CisKKyAgICAgICAgICAgIHIyID0gcmVmWzRdOworICAgICAgICAgICAgcjAgPSByMCA+PiAxNjsKKyAgICAgICAgICAgIHIxID0gcjAgfCAocjIgPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCArPSBkeCAqIHIxOworICAgICAgICAgICAgKihpbnQzMiAqKShvdXQgKyAxNikgPSByZXN1bHQwOworCisgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgcjAgPSByMjsKKyAgICAgICAgfQorICAgICAgICBwUmVmICs9IHNyY1BpdGNoOworICAgICAgICBvdXQgKz0gKDMyIC0gYmxrd2lkdGgpOworICAgIH0KKworLy8gIHBSZWYgLT0gc3JjUGl0Y2gqKGJsa2hlaWdodCsxKTsKKyAgICByZWYgPSB0ZW1wOworCisgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQpCisgICAgeworICAgICAgICByMCA9ICooaW50MzIgKilyZWY7CisgICAgICAgIHIxID0gKihpbnQzMiAqKShyZWYgKyAxNik7CisgICAgICAgIHJlZiArPSAzMjsKKyAgICAgICAgb3V0ID0gcE91dDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChibGtoZWlnaHQgPj4gMSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0MCA9IGR5XzggKiByMCArIDB4MDAyMDAwMjA7CisgICAgICAgICAgICByMiA9ICooaW50MzIgKilyZWY7CisgICAgICAgICAgICByZXN1bHQwICs9IGR5ICogcjI7CisgICAgICAgICAgICByZXN1bHQwID4+PSA2OworICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjAgPSByMjsKKworICAgICAgICAgICAgcmVzdWx0MSA9IGR5XzggKiByMSArIDB4MDAyMDAwMjA7CisgICAgICAgICAgICByMyA9ICooaW50MzIgKikocmVmICsgMTYpOworICAgICAgICAgICAgcmVzdWx0MSArPSBkeSAqIHIzOworICAgICAgICAgICAgcmVzdWx0MSA+Pj0gNjsKKyAgICAgICAgICAgIHJlc3VsdDEgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOworICAgICAgICAgICAgb3V0ICs9IHByZWRQaXRjaDsKKyAgICAgICAgICAgIHJlZiArPSAzMjsKKworICAgICAgICAgICAgcmVzdWx0MCA9IGR5XzggKiByMCArIDB4MDAyMDAwMjA7CisgICAgICAgICAgICByMiA9ICooaW50MzIgKilyZWY7CisgICAgICAgICAgICByZXN1bHQwICs9IGR5ICogcjI7CisgICAgICAgICAgICByZXN1bHQwID4+PSA2OworICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjAgPSByMjsKKworICAgICAgICAgICAgcmVzdWx0MSA9IGR5XzggKiByMSArIDB4MDAyMDAwMjA7CisgICAgICAgICAgICByMyA9ICooaW50MzIgKikocmVmICsgMTYpOworICAgICAgICAgICAgcmVzdWx0MSArPSBkeSAqIHIzOworICAgICAgICAgICAgcmVzdWx0MSA+Pj0gNjsKKyAgICAgICAgICAgIHJlc3VsdDEgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOworICAgICAgICAgICAgb3V0ICs9IHByZWRQaXRjaDsKKyAgICAgICAgICAgIHJlZiArPSAzMjsKKyAgICAgICAgfQorICAgICAgICBwT3V0ICs9IDQ7CisgICAgICAgIHJlZiA9IHRlbXAgKyA0OyAvKiBzaW5jZSBpdCBjYW4gb25seSBpdGVyYXRlIHR3aWNlIG1heCAqLworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZUNocm9tYUhvcml6b250YWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoZHkpOworCisgICAgaW50MzIgcjAsIHIxLCByMiwgcmVzdWx0MCwgcmVzdWx0MTsKKyAgICB1aW50OCAqcmVmLCAqb3V0OworICAgIGludCBpLCBqOworICAgIGludCBkeF84ID0gOCAtIGR4OworCisgICAgLyogaG9yaXpvbnRhbCBmaXJzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHJlZiA9IHBSZWY7CisgICAgICAgIG91dCA9IHBPdXQ7CisKKyAgICAgICAgcjAgPSByZWZbMF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICByMCB8PSAocmVmWzJdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeF84ICogcjAgKyAweDAwMDQwMDA0OworCisgICAgICAgICAgICByMSA9IHJlZlsxXSB8IChyZWZbM10gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCArPSBkeCAqIHIxOworICAgICAgICAgICAgcmVzdWx0MCA+Pj0gMzsKKyAgICAgICAgICAgIHJlc3VsdDAgJj0gMHgwMEZGMDBGRjsKKworICAgICAgICAgICAgcmVzdWx0MSA9IGR4XzggKiByMSArIDB4MDAwNDAwMDQ7CisKKyAgICAgICAgICAgIHIyID0gcmVmWzRdOworICAgICAgICAgICAgcjAgPSByMCA+PiAxNjsKKyAgICAgICAgICAgIHIxID0gcjAgfCAocjIgPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MSArPSBkeCAqIHIxOworICAgICAgICAgICAgcmVzdWx0MSA+Pj0gMzsKKyAgICAgICAgICAgIHJlc3VsdDEgJj0gMHgwMEZGMDBGRjsKKworICAgICAgICAgICAgKihpbnQzMiAqKW91dCA9IHJlc3VsdDAgfCAocmVzdWx0MSA8PCA4KTsKKworICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgIHIwID0gcjI7CisgICAgICAgIH0KKworICAgICAgICBwUmVmICs9IHNyY1BpdGNoOworICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFWZXJ0aWNhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoZHgpOworCisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHJlc3VsdDAsIHJlc3VsdDE7CisgICAgaW50IGksIGo7CisgICAgdWludDggKnJlZiwgKm91dDsKKyAgICBpbnQgZHlfOCA9IDggLSBkeTsKKyAgICAvKiB2ZXJ0aWNhbCBmaXJzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBibGt3aWR0aDsgaSArPSA0KQorICAgIHsKKyAgICAgICAgcmVmID0gcFJlZjsKKyAgICAgICAgb3V0ID0gcE91dDsKKworICAgICAgICByMCA9IHJlZlswXSB8IChyZWZbMl0gPDwgMTYpOworICAgICAgICByMSA9IHJlZlsxXSB8IChyZWZbM10gPDwgMTYpOworICAgICAgICByZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0MCA9IGR5XzggKiByMCArIDB4MDAwNDAwMDQ7CisgICAgICAgICAgICByMiA9IHJlZlswXSB8IChyZWZbMl0gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCArPSBkeSAqIHIyOworICAgICAgICAgICAgcmVzdWx0MCA+Pj0gMzsKKyAgICAgICAgICAgIHJlc3VsdDAgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIwID0gcjI7CisKKyAgICAgICAgICAgIHJlc3VsdDEgPSBkeV84ICogcjEgKyAweDAwMDQwMDA0OworICAgICAgICAgICAgcjMgPSByZWZbMV0gfCAocmVmWzNdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDEgKz0gZHkgKiByMzsKKyAgICAgICAgICAgIHJlc3VsdDEgPj49IDM7CisgICAgICAgICAgICByZXN1bHQxICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgKihpbnQzMiAqKW91dCA9IHJlc3VsdDAgfCAocmVzdWx0MSA8PCA4KTsKKyAgICAgICAgICAgIHJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgICAgIG91dCArPSBwcmVkUGl0Y2g7CisgICAgICAgIH0KKyAgICAgICAgcE91dCArPSA0OworICAgICAgICBwUmVmICs9IDQ7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hRGlhZ29uYWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsICBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKGJsa3dpZHRoKTsKKworICAgIGludDMyIHIwLCByMSwgdGVtcDAsIHRlbXAxLCByZXN1bHQ7CisgICAgaW50MzIgdGVtcFs5XTsKKyAgICBpbnQzMiAqb3V0OworICAgIGludCBpLCByX3RlbXA7CisgICAgaW50IGR5XzggPSA4IC0gZHk7CisKKyAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCisgICAgb3V0ID0gdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0ICsgMTsgaSsrKQorICAgIHsKKyAgICAgICAgcl90ZW1wID0gcFJlZlsxXTsKKyAgICAgICAgdGVtcDAgPSAocFJlZlswXSA8PCAzKSArIGR4ICogKHJfdGVtcCAtIHBSZWZbMF0pOworICAgICAgICB0ZW1wMSA9IChyX3RlbXAgPDwgMykgKyBkeCAqIChwUmVmWzJdIC0gcl90ZW1wKTsKKyAgICAgICAgcjAgPSB0ZW1wMCB8ICh0ZW1wMSA8PCAxNik7CisgICAgICAgICpvdXQrKyA9IHIwOworICAgICAgICBwUmVmICs9IHNyY1BpdGNoOworICAgIH0KKworICAgIHBSZWYgLT0gc3JjUGl0Y2ggKiAoYmxraGVpZ2h0ICsgMSk7CisKKyAgICBvdXQgPSB0ZW1wOworCisgICAgcjAgPSAqb3V0Kys7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICByZXN1bHQgPSBkeV84ICogcjAgKyAweDAwMjAwMDIwOworICAgICAgICByMSA9ICpvdXQrKzsKKyAgICAgICAgcmVzdWx0ICs9IGR5ICogcjE7CisgICAgICAgIHJlc3VsdCA+Pj0gNjsKKyAgICAgICAgcmVzdWx0ICY9IDB4MDBGRjAwRkY7CisgICAgICAgICooaW50MTYgKilwT3V0ID0gKHJlc3VsdCA+PiA4KSB8IChyZXN1bHQgJiAweEZGKTsKKyAgICAgICAgcjAgPSByMTsKKyAgICAgICAgcE91dCArPSBwcmVkUGl0Y2g7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hSG9yaXpvbnRhbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgKHZvaWQpKGR5KTsKKyAgICAodm9pZCkoYmxrd2lkdGgpOworCisgICAgaW50IGksIHRlbXAsIHRlbXAwLCB0ZW1wMTsKKworICAgIC8qIGhvcml6b250YWwgZmlyc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICB0ZW1wID0gcFJlZlsxXTsKKyAgICAgICAgdGVtcDAgPSAoKHBSZWZbMF0gPDwgMykgKyBkeCAqICh0ZW1wIC0gcFJlZlswXSkgKyA0KSA+PiAzOworICAgICAgICB0ZW1wMSA9ICgodGVtcCA8PCAzKSArIGR4ICogKHBSZWZbMl0gLSB0ZW1wKSArIDQpID4+IDM7CisKKyAgICAgICAgKihpbnQxNiAqKXBPdXQgPSB0ZW1wMCB8ICh0ZW1wMSA8PCA4KTsKKyAgICAgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgcE91dCArPSBwcmVkUGl0Y2g7CisKKyAgICB9CisgICAgcmV0dXJuOworfQordm9pZCBlQ2hyb21hVmVydGljYWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoZHgpOworICAgICh2b2lkKShibGt3aWR0aCk7CisKKyAgICBpbnQzMiByMCwgcjEsIHJlc3VsdDsKKyAgICBpbnQgaTsKKyAgICBpbnQgZHlfOCA9IDggLSBkeTsKKyAgICByMCA9IHBSZWZbMF0gfCAocFJlZlsxXSA8PCAxNik7CisgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICByZXN1bHQgPSBkeV84ICogcjAgKyAweDAwMDQwMDA0OworICAgICAgICByMSA9IHBSZWZbMF0gfCAocFJlZlsxXSA8PCAxNik7CisgICAgICAgIHJlc3VsdCArPSBkeSAqIHIxOworICAgICAgICByZXN1bHQgPj49IDM7CisgICAgICAgIHJlc3VsdCAmPSAweDAwRkYwMEZGOworICAgICAgICAqKGludDE2ICopcE91dCA9IChyZXN1bHQgPj4gOCkgfCAocmVzdWx0ICYgMHhGRik7CisgICAgICAgIHIwID0gcjE7CisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIHBPdXQgKz0gcHJlZFBpdGNoOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZUNocm9tYUZ1bGxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoZHgpOworICAgICh2b2lkKShkeSk7CisKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgb2Zmc2V0X2luID0gc3JjUGl0Y2ggLSBibGt3aWR0aDsKKyAgICBpbnQgb2Zmc2V0X291dCA9IHByZWRQaXRjaCAtIGJsa3dpZHRoOworICAgIHVpbnQxNiB0ZW1wOworICAgIHVpbnQ4IGJ5dGU7CisKKyAgICBpZiAoKCh1aW50MzIpcFJlZikmMSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICpwUmVmKys7CisgICAgICAgICAgICAgICAgYnl0ZSA9ICpwUmVmKys7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAoYnl0ZSA8PCA4KTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MTYqKXBPdXQpID0gdGVtcDsgLyogd3JpdGUgMiBieXRlcyAqLworICAgICAgICAgICAgICAgIHBPdXQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBPdXQgKz0gb2Zmc2V0X291dDsKKyAgICAgICAgICAgIHBSZWYgKz0gb2Zmc2V0X2luOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICooKHVpbnQxNiopcFJlZik7CisgICAgICAgICAgICAgICAgKigodWludDE2KilwT3V0KSA9IHRlbXA7CisgICAgICAgICAgICAgICAgcFJlZiArPSAyOworICAgICAgICAgICAgICAgIHBPdXQgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBPdXQgKz0gb2Zmc2V0X291dDsKKyAgICAgICAgICAgIHBSZWYgKz0gb2Zmc2V0X2luOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1MGVmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcApAQCAtMCwwICsxLDE3NzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisjZGVmaW5lIE1JTl9HT1AgICAgIDEgICAvKiBtaW5pbXVtIHNpemUgb2YgR09QLCAxLzIzLzAxLCBuZWVkIHRvIGJlIHRlc3RlZCAqLworCisjZGVmaW5lIERFRkFVTFRfUkVGX0lEWCAgICAgMCAgLyogYWx3YXlzIGZyb20gdGhlIGZpcnN0IGZyYW1lIGluIHRoZSByZWZsaXN0ICovCisKKyNkZWZpbmUgQUxMX0NBTkRfRVFVQUwgIDEwICAvKiAgYW55IG51bWJlciBncmVhdGVyIHRoYW4gNSB3aWxsIHdvcmsgKi8KKworCisvKiBmcm9tIFRNTiAzLjIgKi8KKyNkZWZpbmUgUFJFRl9OVUxMX1ZFQyAxMjkgICAvKiB6ZXJvIHZlY3RvciBiaWFzICovCisjZGVmaW5lIFBSRUZfMTZfVkVDIDEyOSAgICAgLyogMU1WIGJpYXMgdmVyc3VzIDRNVnMqLworI2RlZmluZSBQUkVGX0lOVFJBICAzMDI0Ly81MTIgICAgICAgLyogYmlhcyBmb3IgSU5UUkEgY29kaW5nICovCisKK2NvbnN0IHN0YXRpYyBpbnQgdGFiX2V4Y2x1ZGVbOV1bOV0gPSAgLy8gW2xhc3RfbG9jXVtjdXJyX2xvY10KK3sKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDEsIDEsIDEsIDAsIDB9LAorICAgIHswLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB7MCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMX0sCisgICAgezAsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIDF9LAorICAgIHswLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAxfSwKKyAgICB7MCwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMX0sCisgICAgezAsIDAsIDEsIDEsIDEsIDAsIDAsIDAsIDB9LAorICAgIHswLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAwfQorfTsgLy90byBkZWNpZGUgd2hldGhlciB0byBjb250aW51ZSBvciBjb21wdXRlCisKK2NvbnN0IHN0YXRpYyBpbnQgcmVmaW5lX25leHRbOF1bMl0gPSAgICAvKiBbY3Vycl9rXVtpbmNyZW1lbnRdICovCit7CisgICAgezAsIDB9LCB7MiwgMH0sIHsxLCAxfSwgezAsIDJ9LCB7IC0xLCAxfSwgeyAtMiwgMH0sIHsgLTEsIC0xfSwgezAsIC0yfQorfTsKKworI2lmZGVmIF9TQURfU1RBVAordWludDMyIG51bV9NQiA9IDA7Cit1aW50MzIgbnVtX2NhbmQgPSAwOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRIX0lOVEVSXzIgIDEwMCAgLyogdGVtcG9yYXJ5IGZvciBub3cgKi8KKworLy8jZGVmaW5lIEZJWEVEX0lOVEVSUFJFRF9NT0RFICBBVkNfUDE2CisjZGVmaW5lIEZJWEVEX1JFRl9JRFggICAwCisjZGVmaW5lIEZJWEVEX01WWCAwCisjZGVmaW5lIEZJWEVEX01WWSAwCisKKy8vIG9ubHkgdXNlIHdoZW4gQVZDX1A4IG9yIEFWQ19QOHJlZjAKKyNkZWZpbmUgRklYRURfU1VCTUJfTU9ERSAgICBBVkNfNHg0CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5pdGlhbGl6ZSBhcnJheXMgbmVjZXNzYXJ5IGZvciBtb3Rpb24gc2VhcmNoICovCitBVkNFbmNfU3RhdHVzIEluaXRNb3Rpb25TZWFyY2hNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBpbnQgc2VhcmNoX3JhbmdlID0gcmF0ZUN0cmwtPm12UmFuZ2U7CisgICAgaW50IG51bWJlcl9vZl9zdWJwZWxfcG9zaXRpb25zID0gNCAqICgyICogc2VhcmNoX3JhbmdlICsgMyk7CisgICAgaW50IG1heF9tdl9iaXRzLCBtYXhfbXZkOworICAgIGludCB0ZW1wX2JpdHMgPSAwOworICAgIHVpbnQ4ICptdmJpdHM7CisgICAgaW50IGJpdHMsIGltYXgsIGltaW4sIGk7CisgICAgdWludDgqIHN1YnBlbF9wcmVkID0gKHVpbnQ4KikgZW5jdmlkLT5zdWJwZWxfcHJlZDsgLy8gYWxsIDE2IHN1Yi1wZWwgcG9zaXRpb25zCisKKworICAgIHdoaWxlIChudW1iZXJfb2Zfc3VicGVsX3Bvc2l0aW9ucyA+IDApCisgICAgeworICAgICAgICB0ZW1wX2JpdHMrKzsKKyAgICAgICAgbnVtYmVyX29mX3N1YnBlbF9wb3NpdGlvbnMgPj49IDE7CisgICAgfQorCisgICAgbWF4X212X2JpdHMgPSAzICsgMiAqIHRlbXBfYml0czsKKyAgICBtYXhfbXZkICA9ICgxIDw8IChtYXhfbXZfYml0cyA+PiAxKSkgLSAxOworCisgICAgZW5jdmlkLT5tdmJpdHNfYXJyYXkgPSAodWludDgqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDgpICogKDIgKiBtYXhfbXZkICsgMSksIERFRkFVTFRfQVRUUik7CisKKyAgICBpZiAoZW5jdmlkLT5tdmJpdHNfYXJyYXkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgbXZiaXRzID0gZW5jdmlkLT5tdmJpdHMgID0gZW5jdmlkLT5tdmJpdHNfYXJyYXkgKyBtYXhfbXZkOworCisgICAgbXZiaXRzWzBdID0gMTsKKyAgICBmb3IgKGJpdHMgPSAzOyBiaXRzIDw9IG1heF9tdl9iaXRzOyBiaXRzICs9IDIpCisgICAgeworICAgICAgICBpbWF4ID0gMSAgICA8PCAoYml0cyA+PiAxKTsKKyAgICAgICAgaW1pbiA9IGltYXggPj4gMTsKKworICAgICAgICBmb3IgKGkgPSBpbWluOyBpIDwgaW1heDsgaSsrKSAgIG12Yml0c1staV0gPSBtdmJpdHNbaV0gPSBiaXRzOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgaGFsZi1wZWwgc2VhcmNoICovCisgICAgZW5jdmlkLT5ocGVsX2NhbmRbMF0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbMV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDEgOworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzNdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs0XSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbNV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzZdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs3XSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbOF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKworICAgIC8qIEZvciBxdWFydGVyLXBlbCBpbnRlcnBvbGF0aW9uIGFyb3VuZCBiZXN0IGhhbGYtcGVsIHJlc3VsdCAqLworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzBdWzBdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzBdWzFdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVswXVsyXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzBdWzNdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSOworCisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMV1bMF0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMV1bMV0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMV1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMV1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMl1bMF0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMl1bMV0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzJdWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsyXVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVszXVswXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbM11bMV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzNdWzJdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVszXVszXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNF1bMF0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzRdWzFdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNF1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs0XVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNV1bMF0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs1XVsxXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNV1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs1XVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNl1bMF0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs2XVsxXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzZdWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNl1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzddWzBdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzddWzFdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzddWzJdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSIC0gMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bM10gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzhdWzBdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSIC0gMjU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzhdWzFdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzhdWzJdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzhdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7CisKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogQ2xlYW4tdXAgbWVtb3J5ICovCit2b2lkIENsZWFuTW90aW9uU2VhcmNoTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworCisgICAgaWYgKGVuY3ZpZC0+bXZiaXRzX2FycmF5KQorICAgIHsKKyAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKGF2Y0hhbmRsZS0+dXNlckRhdGEsIChpbnQpKGVuY3ZpZC0+bXZiaXRzX2FycmF5KSk7CisgICAgICAgIGVuY3ZpZC0+bXZiaXRzID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK2Jvb2wgSW50cmFEZWNpc2lvbkFCRShpbnQgKm1pbl9jb3N0LCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gsIGJvb2wgYXZlKQoreworICAgIGludCBqOworICAgIHVpbnQ4ICpvdXQ7CisgICAgaW50IHRlbXAsIFNCRTsKKyAgICBPc2NsRmxvYXQgQUJFOworICAgIGJvb2wgaW50cmEgPSB0cnVlOworCisgICAgU0JFID0gMDsKKyAgICAvKiB0b3AgbmVpZ2hib3IgKi8KKyAgICBvdXQgPSBjdXIgLSBwaXRjaDsKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIHRlbXAgPSBvdXRbal0gLSBjdXJbal07CisgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgIH0KKworICAgIC8qIGxlZnQgbmVpZ2hib3IgKi8KKyAgICBvdXQgPSBjdXIgLSAxOworICAgIG91dCAtPSBwaXRjaDsKKyAgICBjdXIgLT0gcGl0Y2g7CisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgeworICAgICAgICB0ZW1wID0gKihvdXQgKz0gcGl0Y2gpIC0gKihjdXIgKz0gcGl0Y2gpOworICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICB9CisKKyAgICAvKiBjb21wYXJlIG1pbmNvc3QvMzg0IGFuZCBTQkUvNjQgKi8KKyAgICBBQkUgPSBTQkUgLyAzMi4wOyAvL0FCRSA9IFNCRS82NC4wOyAvLworICAgIGlmIChBQkUgPj0gKm1pbl9jb3N0IC8gMjU2LjApIC8vaWYoIEFCRSowLjggPj0gbWluX2Nvc3QvMzg0LjApIC8vCisgICAgeworICAgICAgICBpbnRyYSA9IGZhbHNlOyAvLyBubyBwb3NzaWJpbGl0eSBvZiBpbnRyYSwganVzdCB1c2UgaW50ZXIKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGF2ZSA9PSB0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICAqbWluX2Nvc3QgPSAoKm1pbl9jb3N0ICsgKGludCkoU0JFICogOCkpID4+IDE7IC8vIHBvc3NpYmlsaXR5IG9mIGludHJhLCBhdmVyYWdpbmcgdGhlIGNvc3QKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9IChpbnQpKFNCRSAqIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGludHJhOworfQorCisvKioqKioqKiBtYWluIGZ1bmN0aW9uIGZvciBtYWNyb2Jsb2NrIHByZWRpY3Rpb24gZm9yIHRoZSBlbnRpcmUgZnJhbWUgKioqLworLyogaWYgdHVybnMgb3V0IHRvIGJlIElEUiBmcmFtZSwgc2V0IHZpZGVvLT5uYWxfdW5pdF90eXBlIHRvIEFWQ19OQUxUWVBFX0lEUiAqLwordm9pZCBBVkNNb3Rpb25Fc3RpbWF0aW9uKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIEFWQ1BpY3R1cmVEYXRhICpyZWZQaWMgPSB2aWRlby0+UmVmUGljTGlzdDBbMF07CisgICAgaW50IGksIGosIGs7CisgICAgaW50IG1id2lkdGggPSB2aWRlby0+UGljV2lkdGhJbk1iczsKKyAgICBpbnQgbWJoZWlnaHQgPSB2aWRlby0+UGljSGVpZ2h0SW5NYnM7CisgICAgaW50IHRvdGFsTUIgPSB2aWRlby0+UGljU2l6ZUluTWJzOworICAgIGludCBwaXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCAqbWJsb2NrID0gdmlkZW8tPm1ibG9jazsKKyAgICBBVkNNViAqbW90X21iXzE2eDE2LCAqbW90MTZ4MTYgPSBlbmN2aWQtPm1vdDE2eDE2OworICAgIC8vIEFWQ01WICptb3RfbWJfMTZ4OCwgKm1vdF9tYl84eDE2LCAqbW90X21iXzh4OCwgZXRjOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgdWludDggKmludHJhU2VhcmNoID0gZW5jdmlkLT5pbnRyYVNlYXJjaDsKKyAgICB1aW50IEZTX2VuID0gZW5jdmlkLT5mdWxsc2VhcmNoX2VuYWJsZTsKKworICAgIGludCBOdW1JbnRyYVNlYXJjaCwgc3RhcnRfaSwgbnVtTG9vcCwgaW5jcl9pOworICAgIGludCBtYm51bSwgb2Zmc2V0OworICAgIHVpbnQ4ICpjdXIsICpiZXN0X2NhbmRbNV07CisgICAgaW50IHRvdGFsU0FEID0gMDsgICAvKiBhdmVyYWdlIFNBRCBmb3IgcmF0ZSBjb250cm9sICovCisgICAgaW50IHR5cGVfcHJlZDsKKyAgICBpbnQgYWJlX2Nvc3Q7CisKKyNpZmRlZiBIVEZNCisgICAgLyoqKioqIEhZUE9USEVTSVMgVEVTVElORyAqKioqKioqKi8gIC8qIDIvMjgvMDEgKi8KKyAgICBpbnQgY29sbGVjdCA9IDA7CisgICAgSFRGTV9TdGF0IGh0Zm1fc3RhdDsKKyAgICBkb3VibGUgbmV3dmFyWzE2XTsKKyAgICBkb3VibGUgZXhwX2xhbWRhWzE1XTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisgICAgaW50IGhwX2d1ZXNzID0gMDsKKyAgICB1aW50MzIgbXZfdWludDMyOworCisgICAgb2Zmc2V0ID0gMDsKKworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19JX1NMSUNFKQorICAgIHsKKyAgICAgICAgLyogY2Fubm90IGRvIEkxNiBwcmVkaWN0aW9uIGhlcmUgYmVjYXVzZSBpdCBuZWVkcyBmdWxsIGRlY29kaW5nLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxNQjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBlbmN2aWQtPm1pbl9jb3N0W2ldID0gMHg3RkZGRkZGRjsgIC8qIG1heCB2YWx1ZSBmb3IgaW50ICovCisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoaW50cmFTZWFyY2gsIDEsIHNpemVvZih1aW50OCkqdG90YWxNQik7CisKKyAgICAgICAgZW5jdmlkLT5maXJzdEludHJhUmVmcmVzaE1CSW5keCA9IDA7IC8qIHJlc2V0IHRoaXMgKi8KKworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICBlbHNlICAgLy8gUF9TTElDRQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsTUI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbWJsb2NrW2ldLm1iX2ludHJhID0gMDsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoaW50cmFTZWFyY2gsIDEsIHNpemVvZih1aW50OCkqdG90YWxNQik7CisgICAgfQorCisgICAgaWYgKHJlZlBpYy0+cGFkZGVkID09IDApCisgICAgeworICAgICAgICBBVkNQYWRkaW5nRWRnZShyZWZQaWMpOworICAgICAgICByZWZQaWMtPnBhZGRlZCA9IDE7CisgICAgfQorICAgIC8qIFJhbmRvbSBJTlRSQSB1cGRhdGUgKi8KKyAgICBpZiAocmF0ZUN0cmwtPmludHJhTUJSYXRlKQorICAgIHsKKyAgICAgICAgQVZDUmFzdGVySW50cmFVcGRhdGUoZW5jdmlkLCBtYmxvY2ssIHRvdGFsTUIsIHJhdGVDdHJsLT5pbnRyYU1CUmF0ZSk7CisgICAgfQorCisgICAgZW5jdmlkLT5zYWRfZXh0cmFfaW5mbyA9IE5VTEw7CisjaWZkZWYgSFRGTQorICAgIC8qKioqKiBIWVBPVEhFU0lTIFRFU1RJTkcgKioqKioqKiovCisgICAgSW5pdEhURk0odmlkZW8sICZodGZtX3N0YXQsIG5ld3ZhciwgJmNvbGxlY3QpOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworICAgIGlmICgocmF0ZUN0cmwtPnNjZEVuYWJsZSA9PSAxKQorICAgICAgICAgICAgJiYgKChyYXRlQ3RybC0+ZnJhbWVfcmF0ZSA8IDUuMCkgfHwgKHZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtID4gTUlOX0dPUCkpKQorICAgICAgICAvKiBkbyBub3QgdHJ5IHRvIGRldGVjdCBhIG5ldyBzY2VuZSBpZiBsb3cgZnJhbWUgcmF0ZSBhbmQgdG9vIGNsb3NlIHRvIHByZXZpb3VzIEktZnJhbWUgKi8KKyAgICB7CisgICAgICAgIGluY3JfaSA9IDI7CisgICAgICAgIG51bUxvb3AgPSAyOworICAgICAgICBzdGFydF9pID0gMTsKKyAgICAgICAgdHlwZV9wcmVkID0gMDsgLyogZm9yIGluaXRpYWwgY2FuZGlkYXRlIHNlbGVjdGlvbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmNyX2kgPSAxOworICAgICAgICBudW1Mb29wID0gMTsKKyAgICAgICAgc3RhcnRfaSA9IDA7CisgICAgICAgIHR5cGVfcHJlZCA9IDI7CisgICAgfQorCisgICAgLyogRmlyc3QgcGFzcywgbG9vcCB0aHJ1IGhhbGYgdGhlIG1hY3JvYmxvY2sgKi8KKyAgICAvKiBkZXRlcm1pbmUgc2NlbmUgY2hhbmdlICovCisgICAgLyogU2Vjb25kIHBhc3MsIGZvciB0aGUgcmVzdCBvZiBtYWNyb2Jsb2NrcyAqLworICAgIE51bUludHJhU2VhcmNoID0gMDsgLy8gdG8gYmUgaW50cmEgc2VhcmNoZWQgaW4gdGhlIGVuY29kaW5nIGxvb3AuCisgICAgd2hpbGUgKG51bUxvb3AtLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYmhlaWdodDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5jcl9pID4gMSkKKyAgICAgICAgICAgICAgICBzdGFydF9pID0gKHN0YXJ0X2kgPT0gMCA/IDEgOiAwKSA7IC8qIHRvZ2dsZSAwIGFuZCAxICovCisKKyAgICAgICAgICAgIG9mZnNldCA9IHBpdGNoICogKGogPDwgNCkgKyAoc3RhcnRfaSA8PCA0KTsKKworICAgICAgICAgICAgbWJudW0gPSBqICogbWJ3aWR0aCArIHN0YXJ0X2k7CisKKyAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0X2k7IGkgPCBtYndpZHRoOyBpICs9IGluY3JfaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+bWJOdW0gPSBtYm51bTsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3Vyck1CID0gY3Vyck1CID0gbWJsb2NrICsgbWJudW07CisgICAgICAgICAgICAgICAgbW90X21iXzE2eDE2ID0gbW90MTZ4MTYgKyBtYm51bTsKKworICAgICAgICAgICAgICAgIGN1ciA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSA9PSAwKSAvKiBmb3IgSU5URVIgbW9kZSAqLworICAgICAgICAgICAgICAgIHsKKyNpZiBkZWZpbmVkKEhURk0pCisgICAgICAgICAgICAgICAgICAgIEhURk1QcmVwYXJlQ3VyTUJfQVZDKGVuY3ZpZCwgJmh0Zm1fc3RhdCwgY3VyLCBwaXRjaCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBBVkNQcmVwYXJlQ3VyTUIoZW5jdmlkLCBjdXIsIHBpdGNoKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICAvKioqKioqKiogZnVsbC1wZWwgMU1WIHNlYXJjaCAqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAgICAgICAgIEFWQ01CTW90aW9uU2VhcmNoKGVuY3ZpZCwgY3VyLCBiZXN0X2NhbmQsIGkgPDwgNCwgaiA8PCA0LCB0eXBlX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX2VuLCAmaHBfZ3Vlc3MpOworCisgICAgICAgICAgICAgICAgICAgIGFiZV9jb3N0ID0gZW5jdmlkLT5taW5fY29zdFttYm51bV0gPSBtb3RfbWJfMTZ4MTYtPnNhZDsKKworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgbWJNb2RlIGFuZCBNVnMgKi8KKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfUDE2OworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID0gQVZDX1ByZWRfTDA7CisgICAgICAgICAgICAgICAgICAgIG12X3VpbnQzMiA9ICgobW90X21iXzE2eDE2LT55KSA8PCAxNikgfCAoKG1vdF9tYl8xNngxNi0+eCkgJiAweGZmZmYpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzI7IGsgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tdkwwW2s+PjFdID0gbXZfdWludDMyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogbWFrZSBhIGRlY2lzaW9uIHdoZXRoZXIgaXQgc2hvdWxkIGJlIHRlc3RlZCBmb3IgaW50cmEgb3Igbm90ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IG1id2lkdGggLSAxICYmIGogIT0gbWJoZWlnaHQgLSAxICYmIGkgIT0gMCAmJiBqICE9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSBJbnRyYURlY2lzaW9uQUJFKCZhYmVfY29zdCwgY3VyLCBwaXRjaCwgdHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmFTZWFyY2hbbWJudW1dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1JbnRyYVNlYXJjaCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5NQURvZk1CW21ibnVtXSA9IGFiZV9jb3N0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gYm91bmRhcnkgTUJzLCBhbHdheXMgZG8gaW50cmEgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bUludHJhU2VhcmNoKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0b3RhbFNBRCArPSAoaW50KSByYXRlQ3RybC0+TUFEb2ZNQlttYm51bV07Ly9tb3RfbWJfMTZ4MTYtPnNhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvKiBJTlRSQSB1cGRhdGUsIHVzZSBmb3IgcHJlZGljdGlvbiAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbW90X21iXzE2eDE2WzBdLnggPSBtb3RfbWJfMTZ4MTZbMF0ueSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLyogcmVzZXQgYWxsIG90aGVyIE1WcyB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgICAgIC8qIG1vdF9tYl8xNng4LCBtb3RfbWJfOHgxNiwgbW90X21iXzh4OCwgZXRjLiAqLworICAgICAgICAgICAgICAgICAgICBhYmVfY29zdCA9IGVuY3ZpZC0+bWluX2Nvc3RbbWJudW1dID0gMHg3RkZGRkZGRjsgIC8qIG1heCB2YWx1ZSBmb3IgaW50ICovCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbWJ3aWR0aCAtIDEgJiYgaiAhPSBtYmhlaWdodCAtIDEgJiYgaSAhPSAwICYmIGogIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSW50cmFEZWNpc2lvbkFCRSgmYWJlX2Nvc3QsIGN1ciwgcGl0Y2gsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gYWJlX2Nvc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNBRCArPSBhYmVfY29zdDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIE51bUludHJhU2VhcmNoKysgOworICAgICAgICAgICAgICAgICAgICAvKiBjYW5ub3QgZG8gSTE2IHByZWRpY3Rpb24gaGVyZSBiZWNhdXNlIGl0IG5lZWRzIGZ1bGwgZGVjb2RpbmcuICovCisgICAgICAgICAgICAgICAgICAgIC8vIGludHJhU2VhcmNoW21ibnVtXSA9IDE7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYm51bSArPSBpbmNyX2k7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IChpbmNyX2kgPDwgNCk7CisKKyAgICAgICAgICAgIH0gLyogZm9yIGkgKi8KKyAgICAgICAgfSAvKiBmb3IgaiAqLworCisgICAgICAgIC8qIHNpbmNlIHdlIGNhbm5vdCBkbyBpbnRyYS9pbnRlciBkZWNpc2lvbiBoZXJlLCB0aGUgU0NEIGhhcyB0byBiZQorICAgICAgICBiYXNlZCBvbiBvdGhlciBjcml0ZXJpYSBzdWNoIGFzIG1vdGlvbiB2ZWN0b3JzIGNvaGVyZW5jeSBvciB0aGUgU0FEICovCisgICAgICAgIGlmIChpbmNyX2kgPiAxICYmIG51bUxvb3ApIC8qIHNjZW5lIGNoYW5nZSBvbiBhbmQgZmlyc3QgbG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICAvL2lmKE51bUludHJhU2VhcmNoID4gKCh0b3RhbE1CPj4zKTw8MSkgKyAodG90YWxNQj4+MykpIC8qIDc1JSBvZiA1MCVNQnMgKi8KKyAgICAgICAgICAgIGlmIChOdW1JbnRyYVNlYXJjaCo5OSA+ICg0OCp0b3RhbE1CKSkgLyogMjAlIG9mIDUwJU1CcyAqLworICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gZG8gbW9yZSBpbnZlc3RpZ2F0aW9uIGFib3V0IHRoaXMgdGhyZXNob2xkIHNpbmNlIHRoZSBOdW1JbnRyYVNlYXJjaAorICAgICAgICAgICAgICAgIG9ubHkgc2hvdyBwb3RlbnRpYWwgaW50cmEgTUJzLCBub3QgdGhlIGFjdHVhbCBvbmUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB3ZSBjYW4gY2hvb3NlIHRvIGp1c3QgZW5jb2RlIElfU0xJQ0Ugd2l0aG91dCBJRFIgKi8KKyAgICAgICAgICAgICAgICAvL3ZpZGVvLT5uYWxfdW5pdF90eXBlID0gQVZDX05BTFRZUEVfSURSOworICAgICAgICAgICAgICAgIHZpZGVvLT5uYWxfdW5pdF90eXBlID0gQVZDX05BTFRZUEVfU0xJQ0U7CisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlSGRyLT5zbGljZV90eXBlID0gQVZDX0lfQUxMX1NMSUNFOworICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZV90eXBlID0gQVZDX0lfU0xJQ0U7CisgICAgICAgICAgICAgICAgbWVtc2V0KGludHJhU2VhcmNoLCAxLCBzaXplb2YodWludDgpKnRvdGFsTUIpOworICAgICAgICAgICAgICAgIGkgPSB0b3RhbE1COworICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYmxvY2tbaV0ubWJfaW50cmEgPSAxOworICAgICAgICAgICAgICAgICAgICBlbmN2aWQtPm1pbl9jb3N0W2ldID0gMHg3RkZGRkZGRjsgIC8qIG1heCB2YWx1ZSBmb3IgaW50ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPnRvdGFsU0FEID0gdG90YWxTQUQgKiAyOyAgLyogU0FEICovCisKKyAgICAgICAgICAgICAgICByZXR1cm4gOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qKioqKioqKiBubyBzY2VuZSBjaGFuZ2UsIGNvbnRpbnVlIG1vdGlvbiBzZWFyY2ggKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgc3RhcnRfaSA9IDA7CisgICAgICAgIHR5cGVfcHJlZCsrOyAvKiBzZWNvbmQgcGFzcyAqLworICAgIH0KKworICAgIHJhdGVDdHJsLT50b3RhbFNBRCA9IHRvdGFsU0FEOyAgLyogU0FEICovCisKKyNpZmRlZiBIVEZNCisgICAgLyoqKioqIEhZUE9USEVTSVMgVEVTVElORyAqKioqKioqKi8KKyAgICBpZiAoY29sbGVjdCkKKyAgICB7CisgICAgICAgIGNvbGxlY3QgPSAwOworICAgICAgICBVcGRhdGVIVEZNKGVuY3ZpZCwgbmV3dmFyLCBleHBfbGFtZGEsICZodGZtX3N0YXQpOworICAgIH0KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyAgICByZXR1cm4gOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIFBhZGRpbmdFZGdlCisgICAgRGF0ZTogICAgICAgMDkvMTYvMjAwMAorICAgIFB1cnBvc2U6ICAgIFBhZCBlZGdlIG9mIGEgVm9wCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkICBBVkNQYWRkaW5nRWRnZShBVkNQaWN0dXJlRGF0YSAqcmVmUGljKQoreworICAgIHVpbnQ4ICpzcmMsICpkc3Q7CisgICAgaW50IGk7CisgICAgaW50IHBpdGNoLCB3aWR0aCwgaGVpZ2h0OworICAgIHVpbnQzMiB0ZW1wMSwgdGVtcDI7CisKKyAgICB3aWR0aCA9IHJlZlBpYy0+d2lkdGg7CisgICAgaGVpZ2h0ID0gcmVmUGljLT5oZWlnaHQ7CisgICAgcGl0Y2ggPSByZWZQaWMtPnBpdGNoOworCisgICAgLyogcGFkIHRvcCAqLworICAgIHNyYyA9IHJlZlBpYy0+U2w7CisKKyAgICB0ZW1wMSA9ICpzcmM7IC8qIHRvcC1sZWZ0IGNvcm5lciAqLworICAgIHRlbXAyID0gc3JjW3dpZHRoLTFdOyAvKiB0b3AtcmlnaHQgY29ybmVyICovCisgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDgpOworICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCAxNik7CisgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDgpOworICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCAxNik7CisKKyAgICBkc3QgPSBzcmMgLSAocGl0Y2ggPDwgNCk7CisKKyAgICAqKCh1aW50MzIqKShkc3QgLSAxNikpID0gdGVtcDE7CisgICAgKigodWludDMyKikoZHN0IC0gMTIpKSA9IHRlbXAxOworICAgICooKHVpbnQzMiopKGRzdCAtIDgpKSA9IHRlbXAxOworICAgICooKHVpbnQzMiopKGRzdCAtIDQpKSA9IHRlbXAxOworCisgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IHRlbXAyOworICAgICooKHVpbnQzMiopKGRzdCArIDQpKSA9IHRlbXAyOworICAgICooKHVpbnQzMiopKGRzdCArIDgpKSA9IHRlbXAyOworICAgICooKHVpbnQzMiopKGRzdCArIDEyKSkgPSB0ZW1wMjsKKworICAgIGRzdCA9IGRzdCAtIHdpZHRoIC0gMTY7CisKKyAgICBpID0gMTU7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIG1lbWNweShkc3QgKyBwaXRjaCwgZHN0LCBwaXRjaCk7CisgICAgICAgIGRzdCArPSBwaXRjaDsKKyAgICB9CisKKyAgICAvKiBwYWQgc2lkZXMgKi8KKyAgICBkc3QgKz0gKHBpdGNoICsgMTYpOworICAgIHNyYyA9IGRzdDsKKyAgICBpID0gaGVpZ2h0OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB0ZW1wMSA9ICpzcmM7CisgICAgICAgIHRlbXAyID0gc3JjW3dpZHRoLTFdOworICAgICAgICB0ZW1wMSB8PSAodGVtcDEgPDwgOCk7CisgICAgICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCAxNik7CisgICAgICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCA4KTsKKyAgICAgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDE2KTsKKworICAgICAgICAqKCh1aW50MzIqKShkc3QgLSAxNikpID0gdGVtcDE7CisgICAgICAgICooKHVpbnQzMiopKGRzdCAtIDEyKSkgPSB0ZW1wMTsKKyAgICAgICAgKigodWludDMyKikoZHN0IC0gOCkpID0gdGVtcDE7CisgICAgICAgICooKHVpbnQzMiopKGRzdCAtIDQpKSA9IHRlbXAxOworCisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gdGVtcDI7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArIDQpKSA9IHRlbXAyOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKyA4KSkgPSB0ZW1wMjsKKyAgICAgICAgKigodWludDMyKikoZHN0ICsgMTIpKSA9IHRlbXAyOworCisgICAgICAgIHNyYyArPSBwaXRjaDsKKyAgICAgICAgZHN0ID0gc3JjOworICAgIH0KKworICAgIC8qIHBhZCBib3R0b20gKi8KKyAgICBkc3QgLT0gMTY7CisgICAgaSA9IDE2OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICBtZW1jcHkoZHN0LCBkc3QgLSBwaXRjaCwgcGl0Y2gpOworICAgICAgICBkc3QgKz0gcGl0Y2g7CisgICAgfQorCisKKyAgICByZXR1cm4gOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ1Jhc3RlckludHJhVXBkYXRlCisgICAgRGF0ZTogICAgICAgMi8yNi8wMQorICAgIFB1cnBvc2U6ICAgIFRvIHJhc3Rlci1zY2FuIGFzc2lnbiBJTlRSQS11cGRhdGUgLgorICAgICAgICAgICAgICAgIE4gbWFjcm9ibG9ja3MgYXJlIHVwZGF0ZWQgKGFsc28gd2FzIHByb2dyYW1tYWJsZSkuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBBVkNSYXN0ZXJJbnRyYVVwZGF0ZShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqbWJsb2NrLCBpbnQgdG90YWxNQiwgaW50IG51bVJlZnJlc2gpCit7CisgICAgaW50IGluZHgsIGk7CisKKyAgICBpbmR4ID0gZW5jdmlkLT5maXJzdEludHJhUmVmcmVzaE1CSW5keDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVmcmVzaCAmJiBpbmR4IDwgdG90YWxNQjsgaSsrKQorICAgIHsKKyAgICAgICAgKG1ibG9jayArIGluZHgpLT5tYl9pbnRyYSA9IDE7CisgICAgICAgIGVuY3ZpZC0+aW50cmFTZWFyY2hbaW5keCsrXSA9IDE7CisgICAgfQorCisgICAgLyogaWYgcmVhZCB0aGUgZW5kIG9mIGZyYW1lLCByZXNldCBhbmQgbG9vcCBhcm91bmQgKi8KKyAgICBpZiAoaW5keCA+PSB0b3RhbE1CIC0gMSkKKyAgICB7CisgICAgICAgIGluZHggPSAwOworICAgICAgICB3aGlsZSAoaSA8IG51bVJlZnJlc2ggJiYgaW5keCA8IHRvdGFsTUIpCisgICAgICAgIHsKKyAgICAgICAgICAgIChtYmxvY2sgKyBpbmR4KS0+bWJfaW50cmEgPSAxOworICAgICAgICAgICAgZW5jdmlkLT5pbnRyYVNlYXJjaFtpbmR4KytdID0gMTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY3ZpZC0+Zmlyc3RJbnRyYVJlZnJlc2hNQkluZHggPSBpbmR4OyAvKiB1cGRhdGUgd2l0aCBhIG5ldyB2YWx1ZSAqLworCisgICAgcmV0dXJuIDsKK30KKworCisjaWZkZWYgSFRGTQordm9pZCBJbml0SFRGTShWaWRlb0VuY0RhdGEgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIGRvdWJsZSAqbmV3dmFyLCBpbnQgKmNvbGxlY3QpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBpOworICAgIGludCBseCA9IHZpZGVvLT5jdXJyUGljLT53aWR0aDsgLy8gcGFkZGluZworICAgIGludCBseDIgPSBseCA8PCAxOworICAgIGludCBseDMgPSBseDIgKyBseDsKKyAgICBpbnQgcnggPSB2aWRlby0+Y3VyclBpYy0+cGl0Y2g7CisgICAgaW50IHJ4MiA9IHJ4IDw8IDE7CisgICAgaW50IHJ4MyA9IHJ4MiArIHJ4OworCisgICAgaW50ICpvZmZzZXQsICpvZmZzZXQyOworCisgICAgLyogNC8xMS8wMSwgY29sbGVjdCBkYXRhIGV2ZXJ5IDMwIGZyYW1lcywgZG9lc24ndCBoYXZlIHRvIGJlIGJhc2UgbGF5ZXIgKi8KKyAgICBpZiAoKChpbnQpdmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW0pICUgMzAgPT0gMSkKKyAgICB7CisKKyAgICAgICAgKmNvbGxlY3QgPSAxOworCisgICAgICAgIGh0Zm1fc3RhdC0+Y291bnRicmVhayA9IDA7CisgICAgICAgIGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbmV3dmFyW2ldID0gMC4wOworICAgICAgICB9CisvLyAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfUEFERElORyA9ICZTQURfTUJfUEFERElOR19IVEZNX0NvbGxlY3Q7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZTQURfTUJfSFRGTV9Db2xsZWN0OworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMF0gPSBOVUxMOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmU0FEX01CX0hQX0hURk1fQ29sbGVjdHloOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbM10gPSAmU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoeWg7CisgICAgICAgIGVuY3ZpZC0+c2FkX2V4dHJhX2luZm8gPSAodm9pZCopKGh0Zm1fc3RhdCk7CisgICAgICAgIG9mZnNldCA9IGh0Zm1fc3RhdC0+b2Zmc2V0QXJyYXk7CisgICAgICAgIG9mZnNldDIgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKy8vICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9QQURESU5HID0gJlNBRF9NQl9QQURESU5HX0hURk07CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZTQURfTUJfSFRGTTsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzBdID0gTlVMTDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJlNBRF9NQl9IUF9IVEZNeGg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZTQURfTUJfSFBfSFRGTXloOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbM10gPSAmU0FEX01CX0hQX0hURk14aHloOworICAgICAgICBlbmN2aWQtPnNhZF9leHRyYV9pbmZvID0gKHZvaWQqKShlbmN2aWQtPm5ybWx6X3RoKTsKKyAgICAgICAgb2Zmc2V0ID0gZW5jdmlkLT5ucm1sel90aCArIDE2OworICAgICAgICBvZmZzZXQyID0gZW5jdmlkLT5ucm1sel90aCArIDMyOworICAgIH0KKworICAgIG9mZnNldFswXSA9IDA7CisgICAgb2Zmc2V0WzFdID0gbHgyICsgMjsKKyAgICBvZmZzZXRbMl0gPSAyOworICAgIG9mZnNldFszXSA9IGx4MjsKKyAgICBvZmZzZXRbNF0gPSBseCArIDE7CisgICAgb2Zmc2V0WzVdID0gbHgzICsgMzsKKyAgICBvZmZzZXRbNl0gPSBseCArIDM7CisgICAgb2Zmc2V0WzddID0gbHgzICsgMTsKKyAgICBvZmZzZXRbOF0gPSBseDsKKyAgICBvZmZzZXRbOV0gPSBseDMgKyAyOworICAgIG9mZnNldFsxMF0gPSBseDMgOworICAgIG9mZnNldFsxMV0gPSBseCArIDIgOworICAgIG9mZnNldFsxMl0gPSAxOworICAgIG9mZnNldFsxM10gPSBseDIgKyAzOworICAgIG9mZnNldFsxNF0gPSBseDIgKyAxOworICAgIG9mZnNldFsxNV0gPSAzOworCisgICAgb2Zmc2V0MlswXSA9IDA7CisgICAgb2Zmc2V0MlsxXSA9IHJ4MiArIDI7CisgICAgb2Zmc2V0MlsyXSA9IDI7CisgICAgb2Zmc2V0MlszXSA9IHJ4MjsKKyAgICBvZmZzZXQyWzRdID0gcnggKyAxOworICAgIG9mZnNldDJbNV0gPSByeDMgKyAzOworICAgIG9mZnNldDJbNl0gPSByeCArIDM7CisgICAgb2Zmc2V0Mls3XSA9IHJ4MyArIDE7CisgICAgb2Zmc2V0Mls4XSA9IHJ4OworICAgIG9mZnNldDJbOV0gPSByeDMgKyAyOworICAgIG9mZnNldDJbMTBdID0gcngzIDsKKyAgICBvZmZzZXQyWzExXSA9IHJ4ICsgMiA7CisgICAgb2Zmc2V0MlsxMl0gPSAxOworICAgIG9mZnNldDJbMTNdID0gcngyICsgMzsKKyAgICBvZmZzZXQyWzE0XSA9IHJ4MiArIDE7CisgICAgb2Zmc2V0MlsxNV0gPSAzOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBVcGRhdGVIVEZNKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBkb3VibGUgKm5ld3ZhciwgZG91YmxlICpleHBfbGFtZGEsIEhURk1fU3RhdCAqaHRmbV9zdGF0KQoreworICAgIGlmIChodGZtX3N0YXQtPmNvdW50YnJlYWsgPT0gMCkKKyAgICAgICAgaHRmbV9zdGF0LT5jb3VudGJyZWFrID0gMTsKKworICAgIG5ld3ZhclswXSA9IChkb3VibGUpKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKSAvIChodGZtX3N0YXQtPmNvdW50YnJlYWsgKiAxNi4pOworCisgICAgaWYgKG5ld3ZhclswXSA8IDAuMDAxKQorICAgIHsKKyAgICAgICAgbmV3dmFyWzBdID0gMC4wMDE7IC8qIHRvIHByZXZlbnQgZmxvYXRpbmcgb3ZlcmZsb3cgKi8KKyAgICB9CisgICAgZXhwX2xhbWRhWzBdID0gIDEgLyAobmV3dmFyWzBdICogMS40MTQyMTM2KTsKKyAgICBleHBfbGFtZGFbMV0gPSBleHBfbGFtZGFbMF0gKiAxLjU4MjU7CisgICAgZXhwX2xhbWRhWzJdID0gZXhwX2xhbWRhWzBdICogMi4xNzUwOworICAgIGV4cF9sYW1kYVszXSA9IGV4cF9sYW1kYVswXSAqIDMuNTA2NTsKKyAgICBleHBfbGFtZGFbNF0gPSBleHBfbGFtZGFbMF0gKiAzLjE0MzY7CisgICAgZXhwX2xhbWRhWzVdID0gZXhwX2xhbWRhWzBdICogMy41MzE1OworICAgIGV4cF9sYW1kYVs2XSA9IGV4cF9sYW1kYVswXSAqIDMuNzQ0OTsKKyAgICBleHBfbGFtZGFbN10gPSBleHBfbGFtZGFbMF0gKiA0LjU4NTQ7CisgICAgZXhwX2xhbWRhWzhdID0gZXhwX2xhbWRhWzBdICogNC42MTkxOworICAgIGV4cF9sYW1kYVs5XSA9IGV4cF9sYW1kYVswXSAqIDUuNDA0MTsKKyAgICBleHBfbGFtZGFbMTBdID0gZXhwX2xhbWRhWzBdICogNi41OTc0OworICAgIGV4cF9sYW1kYVsxMV0gPSBleHBfbGFtZGFbMF0gKiAxMC41MzQxOworICAgIGV4cF9sYW1kYVsxMl0gPSBleHBfbGFtZGFbMF0gKiAxMC4wNzE5OworICAgIGV4cF9sYW1kYVsxM10gPSBleHBfbGFtZGFbMF0gKiAxMi4wNTE2OworICAgIGV4cF9sYW1kYVsxNF0gPSBleHBfbGFtZGFbMF0gKiAxNS40NTUyOworCisgICAgQ2FsY1RocmVzaG9sZChIVEZNX1BmLCBleHBfbGFtZGEsIGVuY3ZpZC0+bnJtbHpfdGgpOworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBDYWxjVGhyZXNob2xkKGRvdWJsZSBwZiwgZG91YmxlIGV4cF9sYW1kYVtdLCBpbnQgbnJtbHpfdGhbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgdGVtcFsxNV07CisgICAgLy8gIHByaW50ZigiXG5MYW1kYTogIik7CisKKyAgICAvKiBwYXJhbWV0cmljIFBSRU1PREVMbGluZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgIHsKKyAgICAgICAgLy8gICAgcHJpbnRmKCIlZyAiLGV4cF9sYW1kYVtpXSk7CisgICAgICAgIGlmIChwZiA8IDAuNSkKKyAgICAgICAgICAgIHRlbXBbaV0gPSAxIC8gZXhwX2xhbWRhW2ldICogTTRWRU5DX0xPRygyICogcGYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZW1wW2ldID0gLTEgLyBleHBfbGFtZGFbaV0gKiBNNFZFTkNfTE9HKDIgKiAoMSAtIHBmKSk7CisgICAgfQorCisgICAgbnJtbHpfdGhbMTVdID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgICAgICAgIC8qIHNjYWxlIHVwdG8gbm8ucGl4ZWxzICovCisgICAgICAgIG5ybWx6X3RoW2ldID0gKGludCkodGVtcFtpXSAqICgoaSArIDEpIDw8IDQpICsgMC41KTsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgICAgSFRGTVByZXBhcmVDdXJNQl9BVkMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEhURk1fU3RhdCAqaHRmbV9zdGF0LCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIHVpbnQzMiAqaHRmbU1CID0gKHVpbnQzMiopKGVuY3ZpZC0+Y3VycllNQik7CisgICAgdWludDggKnB0ciwgYnl0ZTsKKyAgICBpbnQgKm9mZnNldDsKKyAgICBpbnQgaTsKKyAgICB1aW50MzIgd29yZDsKKworICAgIGlmICgoKGludCl2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bSkgJSAzMCA9PSAxKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gaHRmbV9zdGF0LT5vZmZzZXRBcnJheTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gZW5jdmlkLT5ucm1sel90aCArIDE2OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcHRyID0gY3VyICsgb2Zmc2V0W2ldOworICAgICAgICB3b3JkID0gcHRyWzBdOworICAgICAgICBieXRlID0gcHRyWzRdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDgpOworICAgICAgICBieXRlID0gcHRyWzhdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDE2KTsKKyAgICAgICAgYnl0ZSA9IHB0clsxMl07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMjQpOworICAgICAgICAqaHRmbU1CKysgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAqKHB0ciArPSAocGl0Y2ggPDwgMikpOworICAgICAgICBieXRlID0gcHRyWzRdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDgpOworICAgICAgICBieXRlID0gcHRyWzhdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDE2KTsKKyAgICAgICAgYnl0ZSA9IHB0clsxMl07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMjQpOworICAgICAgICAqaHRmbU1CKysgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAqKHB0ciArPSAocGl0Y2ggPDwgMikpOworICAgICAgICBieXRlID0gcHRyWzRdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDgpOworICAgICAgICBieXRlID0gcHRyWzhdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDE2KTsKKyAgICAgICAgYnl0ZSA9IHB0clsxMl07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMjQpOworICAgICAgICAqaHRmbU1CKysgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAqKHB0ciArPSAocGl0Y2ggPDwgMikpOworICAgICAgICBieXRlID0gcHRyWzRdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDgpOworICAgICAgICBieXRlID0gcHRyWzhdOworICAgICAgICB3b3JkIHw9IChieXRlIDw8IDE2KTsKKyAgICAgICAgYnl0ZSA9IHB0clsxMl07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMjQpOworICAgICAgICAqaHRmbU1CKysgPSB3b3JkOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworI2VuZGlmIC8vIEhURk0KKwordm9pZCAgICBBVkNQcmVwYXJlQ3VyTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCkKK3sKKyAgICB2b2lkKiB0bXAgPSAodm9pZCopKGVuY3ZpZC0+Y3VycllNQik7CisgICAgdWludDMyICpjdXJyWU1CID0gKHVpbnQzMiopIHRtcDsKKyAgICBpbnQgaTsKKworICAgIGN1ciAtPSBwaXRjaDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKHVpbnQzMiopKGN1ciArPSBwaXRjaCkpOworICAgICAgICAqY3VycllNQisrID0gKigodWludDMyKikoY3VyICsgNCkpOworICAgICAgICAqY3VycllNQisrID0gKigodWludDMyKikoY3VyICsgOCkpOworICAgICAgICAqY3VycllNQisrID0gKigodWludDMyKikoY3VyICsgMTIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisjaWZkZWYgRklYRURfSU5URVJQUkVEX01PREUKKworLyogZHVlIHRvIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3Rvciwgd2UgbWF5IG5vdCBkZWNpZGUgdG8gc2tpcAorYSBtYWNyb2Jsb2NrIGhlcmUganVzdCB5ZXQuICovCisvKiBXZSB3aWxsIGZpbmQgdGhlIGJlc3QgbW90aW9uIHZlY3RvciBhbmQgdGhlIGJlc3QgaW50cmEgcHJlZGljdGlvbiBtb2RlIGZvciBlYWNoIGJsb2NrLiAqLworLyogb3V0cHV0IGFyZQorICAgIGN1cnJNQi0+TnVtTWJQYXJ0LCAgY3Vyck1CLT5NYlBhcnRXaWR0aCwgY3Vyck1CLT5NYlBhcnRIZWlnaHQsCisgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbXSwgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFtdLCBjdXJyTUItPlN1Yk1iUGFydEhlaWdodCwKKyAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW11bXSAoTDAgb3IgTDEgb3IgQmlQcmVkKQorICAgIGN1cnJNQi0+UmVmSWR4W10sIGN1cnJNQi0+cmVmX2lkeF9MMFtdLAorICAgIGN1cnJNQi0+bXZMMFtdLCBjdXJyTUItPm12TDFbXQorICAgICovCisKK0FWQ0VuY19TdGF0dXMgQVZDTUJNb3Rpb25TZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IG1iTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3Bhc3MpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBtYlBhcnRJZHgsIHN1Yk1iUGFydElkeDsKKyAgICBpbnQxNiAqbXY7CisgICAgaW50IGk7CisgICAgaW50IFN1Yk1iUGFydEhlaWdodCwgU3ViTWJQYXJ0V2lkdGgsIE51bVN1Yk1iUGFydDsKKworICAgIC8qIGFzc2lnbiB2YWx1ZSB0byBjdXJyTUItPk1CUGFydFByZWRNb2RlW11beF0sc3ViTWJNb2RlW10sTnVtU3ViTWJQYXJ0W10sU3ViTWJQYXJ0V2lkdGhbXSxTdWJNYlBhcnRIZWlnaHRbXSAqLworCisgICAgY3Vyck1CLT5tYk1vZGUgPSBGSVhFRF9JTlRFUlBSRURfTU9ERTsKKyAgICBjdXJyTUItPm1iX2ludHJhID0gMDsKKworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDE2KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAxOworICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gMTY7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0SGVpZ2h0ID0gMTY7CisgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzBdID0gMTY7CisgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbMF0gPSAxNjsKKyAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMF0gPSAgMTsKKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1AxNng4KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAyOworICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gMTY7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0SGVpZ2h0ID0gODsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFtpXSA9IDE2OworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbaV0gPSA4OworICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbaV0gPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHgxNikKKyAgICB7CisgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMjsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRXaWR0aCA9IDg7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0SGVpZ2h0ID0gMTY7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbaV0gPSA4OworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbaV0gPSAxNjsKKyAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0W2ldID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDggfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4cmVmMCkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gNDsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRXaWR0aCA9IDg7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0SGVpZ2h0ID0gODsKKyAgICAgICAgaWYgKEZJWEVEX1NVQk1CX01PREUgPT0gQVZDXzh4OCkKKyAgICAgICAgeworICAgICAgICAgICAgU3ViTWJQYXJ0SGVpZ2h0ID0gODsKKyAgICAgICAgICAgIFN1Yk1iUGFydFdpZHRoID0gODsKKyAgICAgICAgICAgIE51bVN1Yk1iUGFydCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRklYRURfU1VCTUJfTU9ERSA9PSBBVkNfOHg0KQorICAgICAgICB7CisgICAgICAgICAgICBTdWJNYlBhcnRIZWlnaHQgPSA0OworICAgICAgICAgICAgU3ViTWJQYXJ0V2lkdGggPSA4OworICAgICAgICAgICAgTnVtU3ViTWJQYXJ0ID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChGSVhFRF9TVUJNQl9NT0RFID09IEFWQ180eDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1Yk1iUGFydEhlaWdodCA9IDg7CisgICAgICAgICAgICBTdWJNYlBhcnRXaWR0aCA9IDQ7CisgICAgICAgICAgICBOdW1TdWJNYlBhcnQgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEZJWEVEX1NVQk1CX01PREUgPT0gQVZDXzR4NCkKKyAgICAgICAgeworICAgICAgICAgICAgU3ViTWJQYXJ0SGVpZ2h0ID0gNDsKKyAgICAgICAgICAgIFN1Yk1iUGFydFdpZHRoID0gNDsKKyAgICAgICAgICAgIE51bVN1Yk1iUGFydCA9IDQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPnN1Yk1iTW9kZVtpXSA9IEZJWEVEX1NVQk1CX01PREU7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFtpXSA9IFN1Yk1iUGFydEhlaWdodDsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbaV0gPSBTdWJNYlBhcnRXaWR0aDsKKyAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0W2ldID0gTnVtU3ViTWJQYXJ0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogaXQncyBwcm9iYWJseSBpbnRyYSBtb2RlICovCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7CisgICAgfQorCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAgPSBBVkNfUHJlZF9MMDsKKyAgICAgICAgY3Vyck1CLT5yZWZfaWR4X0wwW21iUGFydElkeF0gPSBGSVhFRF9SRUZfSURYOworICAgICAgICBjdXJyTUItPlJlZklkeFttYlBhcnRJZHhdID0gdmlkZW8tPlJlZlBpY0xpc3QwW0ZJWEVEX1JFRl9JRFhdLT5SZWZJZHg7CisKKyAgICAgICAgZm9yIChzdWJNYlBhcnRJZHggPSAwOyBzdWJNYlBhcnRJZHggPCA0OyBzdWJNYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgbXYgPSAoaW50MTYqKShjdXJyTUItPm12TDAgKyAobWJQYXJ0SWR4IDw8IDIpICsgc3ViTWJQYXJ0SWR4KTsKKworICAgICAgICAgICAgKm12KysgPSBGSVhFRF9NVlg7CisgICAgICAgICAgICAqbXYgPSBGSVhFRF9NVlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmN2aWQtPm1pbl9jb3N0ID0gMDsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworI2Vsc2UgLyogcGVyZm9ybSB0aGUgc2VhcmNoICovCisKKy8qIFRoaXMgb3B0aW9uICMxIHNlYXJjaCBpcyB2ZXJ5IHNpbWlsYXIgdG8gUFYncyBNUEVHNCBtb3Rpb24gc2VhcmNoIGFsZ29yaXRobS4KKyAgVGhlIHNlYXJjaCBpcyBkb25lIGluIGhpZXJhcmNoaWNhbCBtYW5uZXIgZnJvbSAxNngxNiBNQiBkb3duIHRvIHNtYWxsZXIgYW5kIHNtYWxsZXIKKyAgcGFydGl0aW9uLiBBdCBlYWNoIGxldmVsLCBhIGRlY2lzaW9uIGNhbiBiZSBtYWRlIHRvIHN0b3AgdGhlIHNlYXJjaCBpZiB0aGUgZXhwZWN0ZWQKKyAgcHJlZGljdGlvbiBnYWluIGlzIG5vdCB3b3J0aCB0aGUgY29tcHV0YXRpb24uIFRoZSBkZWNpc2lvbiBjYW4gYWxzbyBiZSBtYWRlIGF0IHRoZSBmaW5lc3QKKyAgbGV2ZWwgZm9yIG1vcmUgZnVsbHNlYXJjaC1saWtlIGJlaGF2aW9yIHdpdGggdGhlIHByaWNlIG9mIGhlYXZpZXIgY29tcHV0YXRpb24uICovCit2b2lkIEFWQ01CTW90aW9uU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCB1aW50OCAqYmVzdF9jYW5kW10sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpMCwgaW50IGowLCBpbnQgdHlwZV9wcmVkLCBpbnQgRlNfZW4sIGludCAqaHBfZ3Vlc3MpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgdWludDggKnJlZiwgKmNhbmQsICpuY2FuZDsKKyAgICB2b2lkICpleHRyYV9pbmZvID0gZW5jdmlkLT5zYWRfZXh0cmFfaW5mbzsKKyAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJOdW07CisgICAgaW50IHdpZHRoID0gY3VyclBpYy0+d2lkdGg7IC8qIDYvMTIvMDEsIG11c3QgYmUgbXVsdGlwbGUgb2YgMTYgKi8KKyAgICBpbnQgaGVpZ2h0ID0gY3VyclBpYy0+aGVpZ2h0OworICAgIEFWQ01WICptb3QxNngxNiA9IGVuY3ZpZC0+bW90MTZ4MTY7CisgICAgaW50ICgqU0FEX01hY3JvYmxvY2spKHVpbnQ4KiwgdWludDgqLCBpbnQsIHZvaWQqKSA9IGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jazsKKworICAgIGludCByYW5nZSA9IHJhdGVDdHJsLT5tdlJhbmdlOworCisgICAgaW50IGx4ID0gY3VyclBpYy0+cGl0Y2g7IC8qICBwYWRkaW5nICovCisgICAgaW50IGksIGosIGltaW4sIGptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaDsKKyAgICBpbnQgZCwgZG1pbiwgZG5bOV07CisgICAgaW50IGs7CisgICAgaW50IG12eFs1XSwgbXZ5WzVdOworICAgIGludCBudW1fY2FuLCBjZW50ZXJfYWdhaW47CisgICAgaW50IGxhc3RfbG9jLCBuZXdfbG9jID0gMDsKKyAgICBpbnQgc3RlcCwgbWF4X3N0ZXAgPSByYW5nZSA+PiAxOworICAgIGludCBuZXh0OworCisgICAgaW50IGNtdngsIGNtdnk7IC8qIGVzdGltYXRlZCBwcmVkaWN0ZWQgTVYgKi8KKyAgICBpbnQgbGV2X2lkeDsKKyAgICBpbnQgbGFtYmRhX21vdGlvbiA9IGVuY3ZpZC0+bGFtYmRhX21vdGlvbjsKKyAgICB1aW50OCAqbXZiaXRzID0gZW5jdmlkLT5tdmJpdHM7CisgICAgaW50IG12c2hpZnQgPSAyOworICAgIGludCBtdmNvc3Q7CisKKyAgICBpbnQgbWluX3NhZCA9IDY1NTM1OworCisgICAgcmVmID0gdmlkZW8tPlJlZlBpY0xpc3QwW0RFRkFVTFRfUkVGX0lEWF0tPlNsOyAvKiBvcmlnaW4gb2YgYWN0dWFsIGZyYW1lICovCisKKyAgICAvKiBoYXZlIHRvIGluaXRpYWxpemUgdGhlc2UgcGFyYW1zLCBuZWNlc3NhcnkgZm9yIGludGVycHJlZGljdGlvbiBwYXJ0ICovCisgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAxOworICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzBdID0gMTY7CisgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFswXSA9IDE2OworICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzBdID0gMTsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDBbMF0gPSBjdXJyTUItPnJlZl9pZHhfTDBbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDBbMl0gPSBjdXJyTUItPnJlZl9pZHhfTDBbM10gPSBERUZBVUxUX1JFRl9JRFg7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wxWzBdID0gY3Vyck1CLT5yZWZfaWR4X0wxWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5yZWZfaWR4X0wxWzJdID0gY3Vyck1CLT5yZWZfaWR4X0wxWzNdID0gREVGQVVMVF9SRUZfSURYOworICAgIGN1cnJNQi0+UmVmSWR4WzBdID0gY3Vyck1CLT5SZWZJZHhbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+UmVmSWR4WzJdID0gY3Vyck1CLT5SZWZJZHhbM10gPSB2aWRlby0+UmVmUGljTGlzdDBbREVGQVVMVF9SRUZfSURYXS0+UmVmSWR4OworCisgICAgY3VyID0gZW5jdmlkLT5jdXJyWU1COyAvKiB1c2Ugc21hbGxlciBtZW1vcnkgc3BhY2UgZm9yIGN1cnJlbnQgTUIgKi8KKworICAgIC8qICBmaW5kIGxpbWl0IG9mIHRoZSBzZWFyY2ggKGFkanVzdGluZyBzZWFyY2ggcmFuZ2UpKi8KKyAgICBsZXZfaWR4ID0gbWFwTGV2MklkeFtjdXJyU1BTLT5sZXZlbF9pZGNdOworCisgICAgLyogd2UgY2FuIG1ha2UgdGhpcyBwYXJ0IGR5bmFtaWMgYmFzZWQgb24gcHJldmlvdXMgc3RhdGlzdGljcyAqLworICAgIGlsb3cgPSBpMCAtIHJhbmdlOworICAgIGlmIChpMCAtIGlsb3cgPiAyMDQ3KSAvKiBjbGlwIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmQgKi8KKyAgICB7CisgICAgICAgIGlsb3cgPSBpMCAtIDIwNDc7CisgICAgfQorICAgIGlmIChpbG93IDwgLTEzKSAgLy8gY2hhbmdlIGl0IGZyb20gLTE1IHRvIC0xMyBiZWNhdXNlIG9mIDYtdGFwIGZpbHRlciBuZWVkcyBleHRyYSAyIGxpbmVzLgorICAgIHsKKyAgICAgICAgaWxvdyA9IC0xMzsKKyAgICB9CisKKyAgICBpaGlnaCA9IGkwICsgcmFuZ2UgLSAxOworICAgIGlmIChpaGlnaCAtIGkwID4gMjA0NykgLyogY2xpcCB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkICovCisgICAgeworICAgICAgICBpaGlnaCA9IGkwICsgMjA0NzsKKyAgICB9CisgICAgaWYgKGloaWdoID4gd2lkdGggLSAzKQorICAgIHsKKyAgICAgICAgaWhpZ2ggPSB3aWR0aCAtIDM7ICAvLyBjaGFuZ2UgZnJvbSB3aWR0aC0xIHRvIHdpZHRoLTMgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZQorICAgIH0KKworICAgIGpsb3cgPSBqMCAtIHJhbmdlOworICAgIGlmIChqMCAtIGpsb3cgPiBNYXhWbXZSW2xldl9pZHhdIC0gMSkgLyogY2xpcCB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkICovCisgICAgeworICAgICAgICBqbG93ID0gajAgLSBNYXhWbXZSW2xldl9pZHhdICsgMTsKKyAgICB9CisgICAgaWYgKGpsb3cgPCAtMTMpICAgICAvLyBzYW1lIHJlYXNvbiBhcyBhYm92ZQorICAgIHsKKyAgICAgICAgamxvdyA9IC0xMzsKKyAgICB9CisKKyAgICBqaGlnaCA9IGowICsgcmFuZ2UgLSAxOworICAgIGlmIChqaGlnaCAtIGowID4gTWF4Vm12UltsZXZfaWR4XSAtIDEpIC8qIGNsaXAgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZCAqLworICAgIHsKKyAgICAgICAgamhpZ2ggPSBqMCArIE1heFZtdlJbbGV2X2lkeF0gLSAxOworICAgIH0KKyAgICBpZiAoamhpZ2ggPiBoZWlnaHQgLSAzKSAvLyBzYW1lIHJlYXNvbiBhcyBhYm92ZQorICAgIHsKKyAgICAgICAgamhpZ2ggPSBoZWlnaHQgLSAzOworICAgIH0KKworICAgIC8qIGZpbmQgaW5pdGlhbCBtb3Rpb24gdmVjdG9yICYgcHJlZGljdGVkIE1WKi8KKyAgICBBVkNDYW5kaWRhdGVTZWxlY3Rpb24obXZ4LCBtdnksICZudW1fY2FuLCBpMCA+PiA0LCBqMCA+PiA0LCBlbmN2aWQsIHR5cGVfcHJlZCwgJmNtdngsICZjbXZ5KTsKKworICAgIGltaW4gPSBpMDsKKyAgICBqbWluID0gajA7IC8qIG5lZWRlZCBmb3IgZnVsbHNlYXJjaCAqLworICAgIG5jYW5kID0gcmVmICsgaTAgKyBqMCAqIGx4OworCisgICAgLyogZm9yIGZpcnN0IHJvdyBvZiBNQiwgZnVsbHNlYXJjaCBjYW4gYmUgdXNlZCAqLworICAgIGlmIChGU19lbikKKyAgICB7CisgICAgICAgICpocF9ndWVzcyA9IDA7IC8qIG5vIGd1ZXNzIGZvciBmYXN0IGhhbGYtcGVsICovCisKKyAgICAgICAgZG1pbiA9ICBBVkNGdWxsU2VhcmNoKGVuY3ZpZCwgcmVmLCBjdXIsICZpbWluLCAmam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoLCBjbXZ4LCBjbXZ5KTsKKworICAgICAgICBuY2FuZCA9IHJlZiArIGltaW4gKyBqbWluICogbHg7CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgLyogICAgICAgZnVsbHNlYXJjaCB0aGUgdG9wIHJvdyB0byBvbmx5IHVwdG8gKDAsMykgTUIgKi8KKyAgICAgICAgLyogICAgICAgdXB0byAzMCUgY29tcGxleGl0eSBzYXZpbmcgd2l0aCB0aGUgc2FtZSBjb21wbGV4aXR5ICovCisgICAgICAgIGlmICh2aWRlby0+UHJldlJlZkZyYW1lTnVtID09IDAgJiYgajAgPT0gMCAmJiBpMCA8PSA2NCAmJiB0eXBlX3ByZWQgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgKmhwX2d1ZXNzID0gMDsgLyogbm8gZ3Vlc3MgZm9yIGZhc3QgaGFsZi1wZWwgKi8KKyAgICAgICAgICAgIGRtaW4gPSAgQVZDRnVsbFNlYXJjaChlbmN2aWQsIHJlZiwgY3VyLCAmaW1pbiwgJmptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaCwgY212eCwgY212eSk7CisgICAgICAgICAgICBuY2FuZCA9IHJlZiArIGltaW4gKyBqbWluICogbHg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKiogaW5pdGlhbGl6ZSBjYW5kaWRhdGUgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGRtaW4gPSA2NTUzNTsKKworICAgICAgICAgICAgLyogY2hlY2sgaWYgYWxsIGFyZSBlcXVhbCAqLworICAgICAgICAgICAgaWYgKG51bV9jYW4gPT0gQUxMX0NBTkRfRVFVQUwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSA9IGkwICsgbXZ4WzBdOworICAgICAgICAgICAgICAgIGogPSBqMCArIG12eVswXTsKKworICAgICAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhbmQgPSByZWYgKyBpICsgaiAqIGx4OworCisgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgbXZjb3N0ID0gTVZfQ09TVChsYW1iZGFfbW90aW9uLCBtdnNoaWZ0LCBpIC0gaTAsIGogLSBqMCwgY212eCwgY212eSk7CisgICAgICAgICAgICAgICAgICAgIGQgKz0gIG12Y29zdDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBkIC0gbXZjb3N0OyAvLyBmb3IgcmF0ZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqIGV2YWx1YXRlIHVuaXF1ZSBjYW5kaWRhdGVzICoqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9jYW47IGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkgPSBpMCArIG12eFtrXTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGowICsgbXZ5W2tdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtdmNvc3QgPSBNVl9DT1NUKGxhbWJkYV9tb3Rpb24sIG12c2hpZnQsIGkgLSBpMCwgaiAtIGowLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gIG12Y29zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2FkID0gZCAtIG12Y29zdDsgLy8gZm9yIHJhdGUgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKiBsb2NhbCByZWZpbmVtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICBsYXN0X2xvYyA9IG5ld19sb2MgPSAwOworICAgICAgICAgICAgLy8gICAgICAgICAgbmNhbmQgPSByZWYgKyBqbWluKmx4ICsgaW1pbjsgIC8qIGNlbnRlciBvZiB0aGUgc2VhcmNoICovCisgICAgICAgICAgICBzdGVwID0gMDsKKyAgICAgICAgICAgIGRuWzBdID0gZG1pbjsKKyAgICAgICAgICAgIHdoaWxlICghY2VudGVyX2FnYWluICYmIHN0ZXAgPD0gbWF4X3N0ZXApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBBVkNNb3ZlTmVpZ2hib3JTQUQoZG4sIGxhc3RfbG9jKTsKKworICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDE7CisgICAgICAgICAgICAgICAgaSA9IGltaW47CisgICAgICAgICAgICAgICAgaiA9IGptaW4gLSAxOworICAgICAgICAgICAgICAgIGNhbmQgPSByZWYgKyBpICsgaiAqIGx4OworCisgICAgICAgICAgICAgICAgLyogIHN0YXJ0aW5nIGZyb20gWzAsLTFdICovCisgICAgICAgICAgICAgICAgLyogc3BpcmFsIGNoZWNrIG9uZSBzdGVwIGF0IGEgdGltZSovCisgICAgICAgICAgICAgICAgZm9yIChrID0gMjsgayA8PSA4OyBrICs9IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYl9leGNsdWRlW2xhc3RfbG9jXVtrXSkgLyogZXhjbHVkZSBsYXN0IHN0ZXAgY29tcHV0YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAvKiBub3QgYWxyZWFkeSBjb21wdXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmNvc3QgPSBNVl9DT1NUKGxhbWJkYV9tb3Rpb24sIG12c2hpZnQsIGkgLSBpMCwgaiAtIGowLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IG12Y29zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRuW2tdID0gZDsgLyoga2VlcCBpdCBmb3IgaGFsZiBwZWwgdXNlICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19sb2MgPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2FkID0gZCAtIG12Y29zdDsgLy8gZm9yIHJhdGUgY29udHJvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSA4KSAgLyogZW5kIHNpZGUgc2VhcmNoKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZW50ZXJfYWdhaW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IC0xOyAvKiBzdGFydCBkaWFnb25hbCBzZWFyY2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kIC09IGx4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSByZWZpbmVfbmV4dFtrXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmQgKz0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSByZWZpbmVfbmV4dFtrXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmQgKz0gbHggKiBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RfbG9jID0gbmV3X2xvYzsKKyAgICAgICAgICAgICAgICBzdGVwICsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjZW50ZXJfYWdhaW4pCisgICAgICAgICAgICAgICAgQVZDTW92ZU5laWdoYm9yU0FEKGRuLCBsYXN0X2xvYyk7CisKKyAgICAgICAgICAgICpocF9ndWVzcyA9IEFWQ0ZpbmRNaW4oZG4pOworCisgICAgICAgICAgICBlbmN2aWQtPnJhdGVDdHJsLT5NQURvZk1CW21ibnVtXSA9IG1pbl9zYWQgLyAyNTYuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1vdDE2eDE2W21ibnVtXS5zYWQgPSBkbWluOworICAgIG1vdDE2eDE2W21ibnVtXS54ID0gKGltaW4gLSBpMCkgPDwgMjsKKyAgICBtb3QxNngxNlttYm51bV0ueSA9IChqbWluIC0gajApIDw8IDI7CisgICAgYmVzdF9jYW5kWzBdID0gbmNhbmQ7CisKKyAgICBpZiAocmF0ZUN0cmwtPnN1YlBlbEVuYWJsZSkgLy8gYWx3YXlzIGVuYWJsZSBoYWxmLXBlbCBzZWFyY2gKKyAgICB7CisgICAgICAgIC8qIGZpbmQgaGFsZi1wZWwgcmVzb2x1dGlvbiBtb3Rpb24gdmVjdG9yICovCisgICAgICAgIG1pbl9zYWQgPSBBVkNGaW5kSGFsZlBlbE1CKGVuY3ZpZCwgY3VyLCBtb3QxNngxNiArIG1ibnVtLCBiZXN0X2NhbmRbMF0sIGkwLCBqMCwgKmhwX2d1ZXNzLCBjbXZ4LCBjbXZ5KTsKKworICAgICAgICBlbmN2aWQtPnJhdGVDdHJsLT5NQURvZk1CW21ibnVtXSA9IG1pbl9zYWQgLyAyNTYuMDsKKworCisgICAgICAgIGlmIChlbmN2aWQtPmJlc3RfcXBlbF9wb3MgPT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jYW5kID0gZW5jdmlkLT5ocGVsX2NhbmRbZW5jdmlkLT5iZXN0X2hwZWxfcG9zXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jYW5kID0gZW5jdmlkLT5xcGVsX2NhbmRbZW5jdmlkLT5iZXN0X3FwZWxfcG9zXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbmN2aWQtPnJhdGVDdHJsLT5NQURvZk1CW21ibnVtXSA9IG1pbl9zYWQgLyAyNTYuMDsKKyAgICB9CisKKyAgICAvKiogZG8gbW90aW9uIGNvbXAgaGVyZSBmb3Igbm93ICovCisgICAgcmVmID0gY3VyclBpYy0+U2wgKyBpMCArIGowICogbHg7CisgICAgLyogY29weSBmcm9tIHRoZSBiZXN0IHJlc3VsdCB0byBjdXJyZW50IFBpY3R1cmUgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAqcmVmKysgPSAqbmNhbmQrKzsKKyAgICAgICAgfQorICAgICAgICByZWYgKz0gKGx4IC0gMTYpOworICAgICAgICBuY2FuZCArPSA4OworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBBVkNGdWxsU2VhcmNoCisgICAgRGF0ZTogICAgICAgMDkvMTYvMjAwMAorICAgIFB1cnBvc2U6ICAgIFBlcmZvcm0gZnVsbC1zZWFyY2ggbW90aW9uIGVzdGltYXRpb24gb3ZlciB0aGUgcmFuZ2Ugb2Ygc2VhcmNoCisgICAgICAgICAgICAgICAgcmVnaW9uIGluIGEgc3BpcmFsLW91dHdhcmQgbWFubmVyLgorICAgIElucHV0L091dHB1dDogICBWaWRlb0VuY0RhdGEsIGN1cnJlbnQgVm9sLCBwcmV2aW91IFZvcCwgcG9pbnRlciB0byB0aGUgbGVmdCBjb3JuZXIgb2YKKyAgICAgICAgICAgICAgICBjdXJyZW50IFZPUCwgY3VycmVudCBjb29yZCAoYWxzbyBvdXRwdXQpLCBib3VuZGFyaWVzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgQVZDRnVsbFNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKnByZXYsIHVpbnQ4ICpjdXIsCisgICAgICAgICAgICAgICAgICBpbnQgKmltaW4sIGludCAqam1pbiwgaW50IGlsb3csIGludCBpaGlnaCwgaW50IGpsb3csIGludCBqaGlnaCwKKyAgICAgICAgICAgICAgICAgIGludCBjbXZ4LCBpbnQgY212eSkKK3sKKyAgICBpbnQgcmFuZ2UgPSBlbmN2aWQtPnJhdGVDdHJsLT5tdlJhbmdlOworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gZW5jdmlkLT5jb21tb24tPmN1cnJQaWM7CisgICAgdWludDggKmNhbmQ7CisgICAgaW50IGksIGosIGssIGw7CisgICAgaW50IGQsIGRtaW47CisgICAgaW50IGkwID0gKmltaW47IC8qIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICBpbnQgajAgPSAqam1pbjsKKyAgICBpbnQgKCpTQURfTWFjcm9ibG9jaykodWludDgqLCB1aW50OCosIGludCwgdm9pZCopID0gZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrOworICAgIHZvaWQgKmV4dHJhX2luZm8gPSBlbmN2aWQtPnNhZF9leHRyYV9pbmZvOworICAgIGludCBseCA9IGN1cnJQaWMtPnBpdGNoOyAvKiB3aXRoIHBhZGRpbmcgKi8KKworICAgIGludCBvZmZzZXQgPSBpMCArIGowICogbHg7CisKKyAgICBpbnQgbGFtYmRhX21vdGlvbiA9IGVuY3ZpZC0+bGFtYmRhX21vdGlvbjsKKyAgICB1aW50OCAqbXZiaXRzID0gZW5jdmlkLT5tdmJpdHM7CisgICAgaW50IG12c2hpZnQgPSAyOworICAgIGludCBtdmNvc3Q7CisgICAgaW50IG1pbl9zYWQ7CisKKyAgICBjYW5kID0gcHJldiArIG9mZnNldDsKKworICAgIGRtaW4gID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoNjU1MzUgPDwgMTYpIHwgbHgsICh2b2lkKilleHRyYV9pbmZvKTsKKyAgICBtdmNvc3QgPSBNVl9DT1NUKGxhbWJkYV9tb3Rpb24sIG12c2hpZnQsIDAsIDAsIGNtdngsIGNtdnkpOworICAgIG1pbl9zYWQgPSBkbWluOworICAgIGRtaW4gKz0gbXZjb3N0OworCisgICAgLyogcGVyZm9ybSBzcGlyYWwgc2VhcmNoICovCisgICAgZm9yIChrID0gMTsgayA8PSByYW5nZTsgaysrKQorICAgIHsKKworICAgICAgICBpID0gaTAgLSBrOworICAgICAgICBqID0gajAgLSBrOworCisgICAgICAgIGNhbmQgPSBwcmV2ICsgaSArIGogKiBseDsKKworICAgICAgICBmb3IgKGwgPSAwOyBsIDwgOCprOyBsKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vIG5lZWQgZm9yIGJvdW5kYXJ5IGNoZWNraW5nIGFnYWluICovCisgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsICh2b2lkKilleHRyYV9pbmZvKTsKKyAgICAgICAgICAgICAgICBtdmNvc3QgPSBNVl9DT1NUKGxhbWJkYV9tb3Rpb24sIG12c2hpZnQsIGkgLSBpMCwgaiAtIGowLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgICAgICBkICs9ICBtdmNvc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgKmltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAqam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBkIC0gbXZjb3N0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGwgPCAoayA8PCAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgY2FuZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobCA8IChrIDw8IDIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBjYW5kICs9IGx4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobCA8ICgoayA8PCAyKSArIChrIDw8IDEpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgY2FuZC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgICAgICBjYW5kIC09IGx4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW5jdmlkLT5yYXRlQ3RybC0+TUFEb2ZNQltlbmN2aWQtPmNvbW1vbi0+bWJOdW1dID0gKG1pbl9zYWQgLyAyNTYuMCk7IC8vIGZvciByYXRlIGNvbnRyb2wKKworICAgIHJldHVybiBkbWluOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBBVkNDYW5kaWRhdGVTZWxlY3Rpb24KKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgRmlsbCB1cCB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgdXNpbmcgc3BhdGlvLXRlbXBvcmFsIGNvcnJlbGF0aW9uCisgICAgICAgICAgICAgICAgYW1vbmcgbmVpZ2hib3JpbmcgYmxvY2tzLgorICAgIElucHV0L091dHB1dDogICB0eXBlX3ByZWQgPSAwOiBmaXJzdCBwYXNzLCAxOiBzZWNvbmQgcGFzcywgb3Igbm8gU0NECisgICAgTW9kaWZpZWQ6ICAgLCAwOS8yMy8wMSwgZ2V0IHJpZCBvZiByZWR1bmRhbnQgY2FuZGlkYXRlcyBiZWZvcmUgcGFzc2luZyBiYWNrLgorICAgICAgICAgICAgICAgICwgMDkvMTEvMDcsIGFkZGVkIHJldHVybiBmb3IgbW9kaWZpZWQgcHJlZGljdGVkIE1WLCB0aGlzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGZvciBib3RoIGZhc3Qgc2VhcmNoIGFuZCBmdWxsc2VhcmNoLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgQVZDQ2FuZGlkYXRlU2VsZWN0aW9uKGludCAqbXZ4LCBpbnQgKm12eSwgaW50ICpudW1fY2FuLCBpbnQgaW1iLCBpbnQgam1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCB0eXBlX3ByZWQsIGludCAqY212eCwgaW50ICpjbXZ5KQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNViAqbW90MTZ4MTYgPSBlbmN2aWQtPm1vdDE2eDE2OworICAgIEFWQ01WICpwbW90OworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYk51bTsKKyAgICBpbnQgbWJ3aWR0aCA9IHZpZGVvLT5QaWNXaWR0aEluTWJzOworICAgIGludCBtYmhlaWdodCA9IHZpZGVvLT5QaWNIZWlnaHRJbk1iczsKKyAgICBpbnQgaSwgaiwgc2FtZSwgbnVtMTsKKworICAgIC8qIHRoaXMgcGFydCBpcyBmb3IgcHJlZGljdGVkIE1WICovCisgICAgaW50IHBtdkFfeCA9IDAsIHBtdkFfeSA9IDAsIHBtdkJfeCA9IDAsIHBtdkJfeSA9IDAsIHBtdkNfeCA9IDAsIHBtdkNfeSA9IDA7CisgICAgaW50IGF2YWlsQSA9IDAsIGF2YWlsQiA9IDAsIGF2YWlsQyA9IDA7CisKKyAgICAqbnVtX2NhbiA9IDA7CisKKyAgICBpZiAodmlkZW8tPlByZXZSZWZGcmFtZU51bSAhPSAwKSAvLyBwcmV2aW91cyBmcmFtZSBpcyBhbiBJRFIgZnJhbWUKKyAgICB7CisgICAgICAgIC8qIFNwYXRpby1UZW1wb3JhbCBDYW5kaWRhdGUgKGZpdmUgY2FuZGlkYXRlcykgKi8KKyAgICAgICAgaWYgKHR5cGVfcHJlZCA9PSAwKSAvKiBmaXJzdCBwYXNzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW1dOyAvKiBzYW1lIGNvb3JkaW5hdGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIGlmIChpbWIgPj0gKG1id2lkdGggPj4gMSkgJiYgaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGltYiArIDEgPCBtYndpZHRoKSAgIC8qcmlnaHQgbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtKzFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChqbWIgPCBtYmhlaWdodCAtIDEpICAvKmJvdHRvbSBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGptYiA+IDApICAgLyp1cHBlciBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGltYiA+IDAgJiYgam1iID4gMCkgIC8qIHVwcGVyLWxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iID4gMCAmJiBpbWIgPCBtYmhlaWdodCAtIDEpICAvKiB1cHBlciByaWdodCBuZWlnaGJvciBjdXJyZW50IGZyYW1lKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAgIC8qIHNlY29uZCBwYXNzICovCisgICAgICAgICAgICAvKiBvcmlnaW5hbCBTVDEgYWxnb3JpdGhtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW1dOyAvKiBzYW1lIGNvb3JkaW5hdGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKworICAgICAgICAgICAgaWYgKGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlciBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAgLypyaWdodCBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPCBtYmhlaWdodCAtIDEpICAvKmJvdHRvbSBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBwcmVkaWN0ZWQgTVYgKi8KKyAgICAgICAgaWYgKGltYiA+IDApICAgIC8qIGdldCBNViBmcm9tIGxlZnQgKEEpIG5laWdoYm9yIGVpdGhlciBvbiBjdXJyZW50IG9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsQSA9IDE7CisgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTFdOworICAgICAgICAgICAgcG12QV94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgIHBtdkFfeSA9IHBtb3QtPnk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoam1iID4gMCkgLyogZ2V0IE1WIGZyb20gdG9wIChCKSBuZWlnaGJvciBlaXRoZXIgb24gY3VycmVudCBvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICBhdmFpbEIgPSAxOworICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgIHBtdkJfeCA9IHBtb3QtPng7CisgICAgICAgICAgICBwbXZCX3kgPSBwbW90LT55OworCisgICAgICAgICAgICBhdmFpbEMgPSAxOworCisgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpIC8qIGdldCBNViBmcm9tIHRvcC1yaWdodCAoQykgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogZ2V0IE1WIGZyb20gdG9wLWxlZnQgKEQpIG5laWdoYm9yIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbXZDX3ggPSBwbW90LT54OworICAgICAgICAgICAgcG12Q195ID0gcG1vdC0+eTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UgIC8qIG9ubHkgU3BhdGlhbCBDYW5kaWRhdGUgKGZvdXIgY2FuZGlkYXRlcykqLworICAgIHsKKyAgICAgICAgaWYgKHR5cGVfcHJlZCA9PSAwKSAvKmZpcnN0IHBhc3MqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW1iID4gMSkgIC8qIG5laWdoYm9yIHR3byBibG9ja3MgYXdheSB0byB0aGUgbGVmdCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMl07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbWIgPiAwICYmIGptYiA+IDApICAvKiB1cHBlci1sZWZ0IG5laWdoYm9yICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iID4gMCAmJiBpbWIgPCBtYmhlaWdodCAtIDEpICAvKiB1cHBlciByaWdodCBuZWlnaGJvciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnZXQgcHJlZGljdGVkIE1WICovCisgICAgICAgICAgICBpZiAoaW1iID4gMSkgICAgLyogZ2V0IE1WIGZyb20gMm5kIGxlZnQgKEEpIG5laWdoYm9yIGVpdGhlciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZhaWxBID0gMTsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTJdOworICAgICAgICAgICAgICAgIHBtdkFfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12QV95ID0gcG1vdC0+eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iID4gMCkgLyogZ2V0IE1WIGZyb20gdG9wLWxlZnQgKEIpIG5laWdoYm9yIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEIgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgICAgICBwbXZCX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkJfeSA9IHBtb3QtPnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1id2lkdGggLSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQyA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgIHBtdkNfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12Q195ID0gcG1vdC0+eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorLy8jaWZkZWYgU0NFTkVfQ0hBTkdFX0RFVEVDVElPTgorICAgICAgICAvKiBzZWNvbmQgcGFzcyAoU1QyIGFsZ29yaXRobSkqLworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0eXBlX3ByZWQgPT0gMSkgLyogIDQvNy8wMSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXIgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbWIgPCBtYndpZHRoIC0gMSkgIC8qcmlnaHQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSsxXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqbWIgPCBtYmhlaWdodCAtIDEpICAvKmJvdHRvbSBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtK21id2lkdGhdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyNlbHNlCisgICAgICAgICAgICBlbHNlIC8qIG9yaWdpbmFsIFNUMSBhbGdvcml0aG0gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTFdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXItbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlciBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW1iIDwgbWJoZWlnaHQgLSAxKSAgLyp1cHBlci1yaWdodCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZ2V0IHByZWRpY3RlZCBNViAqLworICAgICAgICAgICAgaWYgKGltYiA+IDApICAgIC8qIGdldCBNViBmcm9tIGxlZnQgKEEpIG5laWdoYm9yIGVpdGhlciBvbiBjdXJyZW50IG9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZhaWxBID0gMTsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLTFdOworICAgICAgICAgICAgICAgIHBtdkFfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12QV95ID0gcG1vdC0+eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA+IDApIC8qIGdldCBNViBmcm9tIHRvcCAoQikgbmVpZ2hib3IgZWl0aGVyIG9uIGN1cnJlbnQgb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEIgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgcG12Ql94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZCX3kgPSBwbW90LT55OworCisgICAgICAgICAgICAgICAgYXZhaWxDID0gMTsKKworICAgICAgICAgICAgICAgIGlmIChpbWIgPCBtYndpZHRoIC0gMSkgLyogZ2V0IE1WIGZyb20gdG9wLXJpZ2h0IChDKSBuZWlnaGJvciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLyogZ2V0IE1WIGZyb20gdG9wLWxlZnQgKEQpIG5laWdoYm9yIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG12Q194ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZDX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyNlbmRpZgorICAgIH0KKworICAgIC8qICAzLzIzLzAxLCByZW1vdmUgcmVkdW5kYW50IGNhbmRpZGF0ZSAocG9zc2libGUgay1tZWFuKSAqLworICAgIG51bTEgPSAqbnVtX2NhbjsKKyAgICAqbnVtX2NhbiA9IDE7CisgICAgZm9yIChpID0gMTsgaSA8IG51bTE7IGkrKykKKyAgICB7CisgICAgICAgIHNhbWUgPSAwOworICAgICAgICBqID0gMDsKKyAgICAgICAgd2hpbGUgKCFzYW1lICYmIGogPCAqbnVtX2NhbikKKyAgICAgICAgeworI2lmIChDQU5ESURBVEVfRElTVEFOQ0U9PTApCisgICAgICAgICAgICBpZiAobXZ4W2ldID09IG12eFtqXSAmJiBtdnlbaV0gPT0gbXZ5W2pdKQorI2Vsc2UKKyAgICAgICAgICAgIC8vIG1vZGlmaWVkIGstbWVhbiwgIDMvMjQvMDEsIHNob3VsZG4ndCBiZSBncmVhdGVyIHRoYW4gMworICAgICAgICAgICAgaWYgKEFWQ19BQlMobXZ4W2ldIC0gbXZ4W2pdKSArIEFWQ19BQlMobXZ5W2ldIC0gbXZ5W2pdKSA8IENBTkRJREFURV9ESVNUQU5DRSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIHNhbWUgPSAxOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIGlmICghc2FtZSkKKyAgICAgICAgeworICAgICAgICAgICAgbXZ4WypudW1fY2FuXSA9IG12eFtpXTsKKyAgICAgICAgICAgIG12eVsqbnVtX2Nhbl0gPSBtdnlbaV07CisgICAgICAgICAgICAoKm51bV9jYW4pKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnVtMSA9PSA1ICYmICpudW1fY2FuID09IDEpCisgICAgICAgICpudW1fY2FuID0gQUxMX0NBTkRfRVFVQUw7IC8qIGFsbCBhcmUgZXF1YWwgKi8KKworICAgIC8qIGNhbGN1bGF0ZSBwcmVkaWN0ZWQgTVYgKi8KKworICAgIGlmIChhdmFpbEEgJiYgIShhdmFpbEIgfHwgYXZhaWxDKSkKKyAgICB7CisgICAgICAgICpjbXZ4ID0gcG12QV94OworICAgICAgICAqY212eSA9IHBtdkFfeTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKmNtdnggPSBBVkNfTUVESUFOKHBtdkFfeCwgcG12Ql94LCBwbXZDX3gpOworICAgICAgICAqY212eSA9IEFWQ19NRURJQU4ocG12QV95LCBwbXZCX3ksIHBtdkNfeSk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZ1bmN0aW9uOiAgIEFWQ01vdmVOZWlnaGJvclNBRAorICAgIERhdGU6ICAgICAgIDMvMjcvMDEKKyAgICBQdXJwb3NlOiAgICBNb3ZlIG5laWdoYm9yaW5nIFNBRCBhcm91bmQgd2hlbiBjZW50ZXIgaGFzIHNoaWZ0ZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgQVZDTW92ZU5laWdoYm9yU0FEKGludCBkbltdLCBpbnQgbmV3X2xvYykKK3sKKyAgICBpbnQgdG1wWzldOworICAgIHRtcFswXSA9IGRuWzBdOworICAgIHRtcFsxXSA9IGRuWzFdOworICAgIHRtcFsyXSA9IGRuWzJdOworICAgIHRtcFszXSA9IGRuWzNdOworICAgIHRtcFs0XSA9IGRuWzRdOworICAgIHRtcFs1XSA9IGRuWzVdOworICAgIHRtcFs2XSA9IGRuWzZdOworICAgIHRtcFs3XSA9IGRuWzddOworICAgIHRtcFs4XSA9IGRuWzhdOworICAgIGRuWzBdID0gZG5bMV0gPSBkblsyXSA9IGRuWzNdID0gZG5bNF0gPSBkbls1XSA9IGRuWzZdID0gZG5bN10gPSBkbls4XSA9IDY1NTM2OworCisgICAgc3dpdGNoIChuZXdfbG9jKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzJdOworICAgICAgICAgICAgZG5bNV0gPSB0bXBbMF07CisgICAgICAgICAgICBkbls2XSA9IHRtcFs4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBkbls0XSA9IHRtcFszXTsKKyAgICAgICAgICAgIGRuWzVdID0gdG1wWzRdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbMF07CisgICAgICAgICAgICBkbls3XSA9IHRtcFs4XTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzRdOworICAgICAgICAgICAgZG5bN10gPSB0bXBbMF07CisgICAgICAgICAgICBkbls4XSA9IHRtcFsyXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBkblsxXSA9IHRtcFsyXTsKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzNdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbNV07CisgICAgICAgICAgICBkbls3XSA9IHRtcFs2XTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls4XSA9IHRtcFs2XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBkblsxXSA9IHRtcFs4XTsKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzBdOworICAgICAgICAgICAgZG5bM10gPSB0bXBbNF07CisgICAgICAgICAgICBkbls0XSA9IHRtcFs1XTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzddOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzhdOworICAgICAgICAgICAgZG5bM10gPSB0bXBbMF07CisgICAgICAgICAgICBkbls0XSA9IHRtcFs2XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBkblsyXSA9IHRtcFsxXTsKKyAgICAgICAgICAgIGRuWzNdID0gdG1wWzJdOworICAgICAgICAgICAgZG5bNF0gPSB0bXBbMF07CisgICAgICAgICAgICBkbls1XSA9IHRtcFs2XTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzddOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRuWzBdID0gdG1wW25ld19sb2NdOworCisgICAgcmV0dXJuIDsKK30KKworLyogIDMvMjgvMDEsIGZpbmQgbWluaW1hbCBvZiBkbls5XSAqLworCitpbnQgQVZDRmluZE1pbihpbnQgZG5bXSkKK3sKKyAgICBpbnQgbWluLCBpOworICAgIGludCBkbWluOworCisgICAgZG1pbiA9IGRuWzFdOworICAgIG1pbiA9IDE7CisgICAgZm9yIChpID0gMjsgaSA8IDk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChkbltpXSA8IGRtaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRtaW4gPSBkbltpXTsKKyAgICAgICAgICAgIG1pbiA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWluOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWI1NWZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKQEAgLTAsMCArMSw5ODEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworLyogcmF0ZSBjb250cm9sIHZhcmlhYmxlcyAqLworI2RlZmluZSBSQ19NQVhfUVVBTlQgNTEKKyNkZWZpbmUgUkNfTUlOX1FVQU5UIDAgICAvL2NhcCB0byAxMCB0byBwcmV2ZW50IHJhdGUgZmx1Y3R1YXRpb24gICAgCisKKyNkZWZpbmUgTUFEX01JTiAxIC8qIGhhbmRsZSB0aGUgY2FzZSBvZiBkZXZpc2lvbiBieSB6ZXJvIGluIFJDICovCisKKworLyogbG9jYWwgZnVuY3Rpb25zICovCitkb3VibGUgUVAyUXN0ZXAoaW50IFFQKTsKK2ludCBRc3RlcDJRUChkb3VibGUgUXN0ZXApOworCitkb3VibGUgQ29tcHV0ZUZyYW1lTUFEKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCk7CisKK3ZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24oQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApOworCit2b2lkIGNhbGN1bGF0ZVF1YW50aXplcl9NdWx0aXBhc3MoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCk7CisKK3ZvaWQgdXBkYXRlUkNfUG9zdFByb2MoQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCk7CisKK3ZvaWQgQVZDU2F2ZVJEU2FtcGxlcyhNdWx0aVBhc3MgKnBNUCwgaW50IGNvdW50ZXJfc2FtcGxlcyk7CisKK3ZvaWQgdXBkYXRlUmF0ZUNvbnRyb2woQVZDUmF0ZUNvbnRyb2wgKnJhdGVDb250cm9sLCBpbnQgbmFsX3R5cGUpOworCitpbnQgR2V0QXZnRnJhbWVRUChBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwpCit7CisgICAgcmV0dXJuIHJhdGVDdHJsLT5RYzsKK30KKworQVZDRW5jX1N0YXR1cyBSQ0RldGVybWluZUZyYW1lTnVtKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIHVpbnQzMiBtb2RUaW1lLCB1aW50ICpmcmFtZU51bSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIHVpbnQzMiBtb2RUaW1lUmVmID0gZW5jdmlkLT5tb2RUaW1lUmVmOworICAgIGludDMyICBjdXJyRnJhbWVOdW0gOworICAgIGludCAgZnJhbWVJbmM7CisKKworICAgIC8qIGNoZWNrIHdpdGggdGhlIGJ1ZmZlciBmdWxsbmVzcyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGVub3VnaCBiaXRzIHRvIGVuY29kZSB0aGlzIGZyYW1lICovCisgICAgLyogd2UgY2FuIHVzZSBhIHRocmVzaG9sZCB0byBndWFyYW50ZWUgbWluaW11bSBwaWN0dXJlIHF1YWxpdHkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIGZvciBub3csIHRoZSBkZWZhdWx0IGlzIHRvIGVuY29kZSBldmVyeSBmcmFtZSwgVG8gQmUgQ2hhbmdlZCAqLworICAgIGlmIChyYXRlQ3RybC0+Zmlyc3RfZnJhbWUpCisgICAgeworICAgICAgICBlbmN2aWQtPm1vZFRpbWVSZWYgPSBtb2RUaW1lOworICAgICAgICBlbmN2aWQtPndyYXBNb2RUaW1lID0gMDsKKyAgICAgICAgZW5jdmlkLT5wcmV2RnJhbWVOdW0gPSAwOworICAgICAgICBlbmN2aWQtPnByZXZQcm9jRnJhbWVOdW0gPSAwOworCisgICAgICAgICpmcmFtZU51bSA9IDA7CisKKyAgICAgICAgLyogc2V0IGZyYW1lIHR5cGUgdG8gSURSLWZyYW1lICovCisgICAgICAgIHZpZGVvLT5uYWxfdW5pdF90eXBlID0gQVZDX05BTFRZUEVfSURSOworICAgICAgICBzbGljZUhkci0+c2xpY2VfdHlwZSA9IEFWQ19JX0FMTF9TTElDRTsKKyAgICAgICAgdmlkZW8tPnNsaWNlX3R5cGUgPSBBVkNfSV9TTElDRTsKKworICAgICAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChtb2RUaW1lIDwgbW9kVGltZVJlZikgLyogbW9kVGltZSB3cmFwcGVkIGFyb3VuZCAqLworICAgICAgICB7CisgICAgICAgICAgICBlbmN2aWQtPndyYXBNb2RUaW1lICs9ICgodWludDMyKTB4RkZGRkZGRkYgLSBtb2RUaW1lUmVmKSArIDE7CisgICAgICAgICAgICBlbmN2aWQtPm1vZFRpbWVSZWYgPSBtb2RUaW1lUmVmID0gMDsKKyAgICAgICAgfQorICAgICAgICBtb2RUaW1lICs9IGVuY3ZpZC0+d3JhcE1vZFRpbWU7IC8qIHdyYXBNb2RUaW1lIGlzIG5vbiB6ZXJvIGFmdGVyIHdyYXAtYXJvdW5kICovCisKKyAgICAgICAgY3VyckZyYW1lTnVtID0gKGludDMyKSgoKG1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIHJhdGVDdHJsLT5mcmFtZV9yYXRlICsgMjAwKSAvIDEwMDApOyAvKiBhZGQgc21hbGwgcm91bmRpbmdzICovCisKKyAgICAgICAgaWYgKGN1cnJGcmFtZU51bSA8PSAoaW50MzIpZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7ICAvKiB0aGlzIGlzIGEgbGF0ZSBmcmFtZSBkbyBub3QgZW5jb2RlIGl0ICovCisgICAgICAgIH0KKworICAgICAgICBmcmFtZUluYyA9IGN1cnJGcmFtZU51bSAtIGVuY3ZpZC0+cHJldlByb2NGcmFtZU51bTsKKworICAgICAgICBpZiAoZnJhbWVJbmMgPCByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lICsgMSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOyAgLyogZnJhbWUgc2tpcCByZXF1aXJlZCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGJpdCByYXRlLiAqLworICAgICAgICB9CisKKyAgICAgICAgUkNVcGRhdGVCdWZmZXIodmlkZW8sIHJhdGVDdHJsLCBmcmFtZUluYyAtIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUpOyAgLyogaW4gY2FzZSBtb3JlIGZyYW1lcyBkcm9wcGVkICovCisKKyAgICAgICAgKmZyYW1lTnVtID0gY3VyckZyYW1lTnVtOworCisgICAgICAgIC8qIFRoaXMgcGFydCB3b3VsZCBiZSBzaW1pbGFyIHRvIERldGVybWluZVZvcFR5cGUgb2YgbTR2ZW5jICovCisgICAgICAgIGlmICgoKmZyYW1lTnVtID49ICh1aW50KXJhdGVDdHJsLT5pZHJQZXJpb2QgJiYgcmF0ZUN0cmwtPmlkclBlcmlvZCA+IDApIHx8ICgqZnJhbWVOdW0gPiB2aWRlby0+TWF4RnJhbWVOdW0pKSAvKiBmaXJzdCBmcmFtZSBvciBJRFIqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBzZXQgZnJhbWUgdHlwZSB0byBJRFItZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChyYXRlQ3RybC0+aWRyUGVyaW9kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiArPSAodWludDMyKShyYXRlQ3RybC0+aWRyUGVyaW9kICogMTAwMCAvIHJhdGVDdHJsLT5mcmFtZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAqZnJhbWVOdW0gLT0gcmF0ZUN0cmwtPmlkclBlcmlvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPm1vZFRpbWVSZWYgKz0gKHVpbnQzMikodmlkZW8tPk1heEZyYW1lTnVtICogMTAwMCAvIHJhdGVDdHJsLT5mcmFtZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAqZnJhbWVOdW0gLT0gdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aWRlby0+bmFsX3VuaXRfdHlwZSA9IEFWQ19OQUxUWVBFX0lEUjsKKyAgICAgICAgICAgIHNsaWNlSGRyLT5zbGljZV90eXBlID0gQVZDX0lfQUxMX1NMSUNFOworICAgICAgICAgICAgdmlkZW8tPnNsaWNlX3R5cGUgPSBBVkNfSV9TTElDRTsKKyAgICAgICAgICAgIGVuY3ZpZC0+cHJldlByb2NGcmFtZU51bSA9ICpmcmFtZU51bTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5uYWxfdW5pdF90eXBlID0gQVZDX05BTFRZUEVfU0xJQ0U7CisgICAgICAgICAgICBzbGljZUhkci0+c2xpY2VfdHlwZSA9IEFWQ19QX0FMTF9TTElDRTsKKyAgICAgICAgICAgIHZpZGVvLT5zbGljZV90eXBlID0gQVZDX1BfU0xJQ0U7CisgICAgICAgICAgICBlbmN2aWQtPnByZXZQcm9jRnJhbWVOdW0gPSBjdXJyRnJhbWVOdW07CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKwordm9pZCBSQ1VwZGF0ZUJ1ZmZlcihBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBmcmFtZUluYykKK3sKKyAgICBpbnQgdG1wOworICAgIE11bHRpUGFzcyAqcE1QID0gcmF0ZUN0cmwtPnBNUDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyh2aWRlbyk7CisKKyAgICBpZiAocmF0ZUN0cmwtPnJjRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICBpZiAoZnJhbWVJbmMgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSByYXRlQ3RybC0+Yml0c1BlckZyYW1lICogKGZyYW1lSW5jIC0gMSk7CisgICAgICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC09IHRtcDsKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMCAqIChmcmFtZUluYyAtIDEpOworCisgICAgICAgICAgICAvKiBDaGVjayBidWZmZXIgdW5kZXJmbG93ICovCisgICAgICAgICAgICBpZiAocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA8IHJhdGVDdHJsLT5sb3dfYm91bmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IHJhdGVDdHJsLT5sb3dfYm91bmQ7IC8vIC1yYXRlQ3RybC0+QnMvMjsKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+VE1OX1cgPSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC0gcmF0ZUN0cmwtPmxvd19ib3VuZDsKKyAgICAgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgPSBwTVAtPmNvdW50ZXJfQlRkc3QgKyAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPmxvd19ib3VuZCkgLyAyLjAgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK0FWQ0VuY19TdGF0dXMgSW5pdFJhdGVDb250cm9sTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopIGF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIGRvdWJsZSBMMSwgTDIsIEwzLCBicHA7CisgICAgaW50IHFwOworICAgIGludCBpLCBqOworCisgICAgcmF0ZUN0cmwtPmJhc2ljVW5pdCA9IHZpZGVvLT5QaWNTaXplSW5NYnM7CisKKyAgICByYXRlQ3RybC0+TUFEb2ZNQiA9IChkb3VibGUqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+UGljU2l6ZUluTWJzICogc2l6ZW9mKGRvdWJsZSksIERFRkFVTFRfQVRUUik7CisKKyAgICBpZiAoIXJhdGVDdHJsLT5NQURvZk1CKQorICAgIHsKKyAgICAgICAgZ290byBDTEVBTlVQX1JDOworICAgIH0KKworICAgIGlmIChyYXRlQ3RybC0+cmNFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5wTVAgPSAoTXVsdGlQYXNzKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLCBzaXplb2YoTXVsdGlQYXNzKSwgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgaWYgKCFyYXRlQ3RybC0+cE1QKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHJhdGVDdHJsLT5wTVAsIDAsIHNpemVvZihNdWx0aVBhc3MpKTsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZW5jb2RlZF9mcmFtZXMgPSAtMTsgLyogZm9yZ2V0IGFib3V0IHRoZSB2ZXJ5IGZpcnN0IEkgZnJhbWUgKi8KKworICAgICAgICAvKiBSREluZm8gKipwUkRTYW1wbGVzICovCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXMgPSAoUkRJbmZvICoqKWF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwgKDMwICogc2l6ZW9mKFJESW5mbyAqKSksIERFRkFVTFRfQVRUUik7CisgICAgICAgIGlmICghcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTlVQX1JDOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXNbaV0gPSAoUkRJbmZvICopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLCAoMzIgKiBzaXplb2YoUkRJbmZvKSksIERFRkFVTFRfQVRUUik7CisgICAgICAgICAgICBpZiAoIXJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXNbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBDTEVBTlVQX1JDOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspICAgIG1lbXNldCgmKHJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXNbaV1bal0pLCAwLCBzaXplb2YoUkRJbmZvKSk7CisgICAgICAgIH0KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSA9IChpbnQpKHJhdGVDdHJsLT5mcmFtZV9yYXRlICogMS4wKTsgLyogMS4wcyB0aW1lIGZyYW1lKi8KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSA9IEFWQ19NQVgocmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSwgNSk7CisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmZyYW1lUmFuZ2UgPSBBVkNfTUlOKHJhdGVDdHJsLT5wTVAtPmZyYW1lUmFuZ2UsIDMwKTsKKworICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZVBvcyA9IC0xOworCisKKyAgICAgICAgcmF0ZUN0cmwtPmJpdHNQZXJGcmFtZSA9IChpbnQzMikocmF0ZUN0cmwtPmJpdFJhdGUgLyByYXRlQ3RybC0+ZnJhbWVfcmF0ZSk7CisKKyAgICAgICAgLyogQlggcmF0ZSBjb250cm9sICovCisgICAgICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPSAwOyAvKiBtdXN0IGJlIGluaXRpYWxpemVkICovCisKKyAgICAgICAgcmF0ZUN0cmwtPkJzID0gcmF0ZUN0cmwtPmNwYlNpemU7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVyA9IDA7CisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPSAoaW50KShyYXRlQ3RybC0+QnMgKiAwLjUpOyAvKiByYXRlQ3RybC0+QnMgKi8KKyAgICAgICAgcmF0ZUN0cmwtPmVuY29kZWRfZnJhbWVzID0gMDsKKworICAgICAgICByYXRlQ3RybC0+VE1OX1RIID0gcmF0ZUN0cmwtPmJpdHNQZXJGcmFtZTsKKworICAgICAgICByYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSA9IChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MpIC8gKHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgLyAxMC4wKSkgLSA1OworICAgICAgICBpZiAocmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gPCAwKSByYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSArPSA1OworCisgICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBidWZmZXIgZnVsbG5lc3MKKyAgICAgICAgLyogQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCB0aGUgaW5pdGlhbCBidWZmZXIgZnVsbG5lc3MgbmVlZHMgdG8gYmUgc2V0IHRvIDEvMyAqLworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID0gKGludCkocmF0ZUN0cmwtPkJzIC8gMy4wIC0gcmF0ZUN0cmwtPkJzIC8gMi4wKTsgLyogdGhlIGJ1ZmZlciByYW5nZSBpcyBbLUJzLzIsIEJzLzJdICovCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmNvdW50ZXJfQlRzcmMgPSAoaW50KSgocmF0ZUN0cmwtPkJzIC8gMi4wIC0gcmF0ZUN0cmwtPkJzIC8gMy4wKSAvIChyYXRlQ3RybC0+Yml0c1BlckZyYW1lIC8gMTAuMCkpOworICAgICAgICByYXRlQ3RybC0+VE1OX1cgPSAoaW50KShyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzICsgcmF0ZUN0cmwtPnBNUC0+Y291bnRlcl9CVHNyYyAqIChyYXRlQ3RybC0+Yml0c1BlckZyYW1lIC8gMTAuMCkpOworCisgICAgICAgIHJhdGVDdHJsLT5sb3dfYm91bmQgPSAtcmF0ZUN0cmwtPkJzIC8gMjsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzc19vZmZzZXQgPSAwOworCisgICAgICAgIC8qIFNldHRpbmcgdGhlIGJpdHJhdGUgYW5kIGZyYW1lcmF0ZSAqLworICAgICAgICByYXRlQ3RybC0+cE1QLT5iaXRyYXRlID0gcmF0ZUN0cmwtPmJpdFJhdGU7CisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmZyYW1lcmF0ZSA9IHJhdGVDdHJsLT5mcmFtZV9yYXRlOworICAgICAgICByYXRlQ3RybC0+cE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgPSByYXRlQ3RybC0+cE1QLT5iaXRyYXRlIC8gcmF0ZUN0cmwtPnBNUC0+ZnJhbWVyYXRlOworCisgICAgICAgIC8qY29tcHV0ZSB0aGUgaW5pdGlhbCBRUCovCisgICAgICAgIGJwcCA9IDEuMCAqIHJhdGVDdHJsLT5iaXRSYXRlIC8gKHJhdGVDdHJsLT5mcmFtZV9yYXRlICogKHZpZGVvLT5QaWNTaXplSW5NYnMgPDwgOCkpOworICAgICAgICBpZiAodmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzTCA9PSAxNzYpCisgICAgICAgIHsKKyAgICAgICAgICAgIEwxID0gMC4xOworICAgICAgICAgICAgTDIgPSAwLjM7CisgICAgICAgICAgICBMMyA9IDAuNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMID09IDM1MikKKyAgICAgICAgeworICAgICAgICAgICAgTDEgPSAwLjI7CisgICAgICAgICAgICBMMiA9IDAuNjsKKyAgICAgICAgICAgIEwzID0gMS4yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTDEgPSAwLjY7CisgICAgICAgICAgICBMMiA9IDEuNDsKKyAgICAgICAgICAgIEwzID0gMi40OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5pbml0UVAgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJwcCA8PSBMMSkKKyAgICAgICAgICAgICAgICBxcCA9IDM1OworICAgICAgICAgICAgZWxzZSBpZiAoYnBwIDw9IEwyKQorICAgICAgICAgICAgICAgIHFwID0gMjU7CisgICAgICAgICAgICBlbHNlIGlmIChicHAgPD0gTDMpCisgICAgICAgICAgICAgICAgcXAgPSAyMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBxcCA9IDE1OworICAgICAgICAgICAgcmF0ZUN0cmwtPmluaXRRUCA9IHFwOworICAgICAgICB9CisKKyAgICAgICAgcmF0ZUN0cmwtPlFjID0gcmF0ZUN0cmwtPmluaXRRUDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7CisKK0NMRUFOVVBfUkM6CisKKyAgICBDbGVhbnVwUmF0ZUNvbnRyb2xNb2R1bGUoYXZjSGFuZGxlKTsKKyAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworCit9CisKKwordm9pZCBDbGVhbnVwUmF0ZUNvbnRyb2xNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBpbnQgaTsKKworICAgIGlmIChyYXRlQ3RybC0+TUFEb2ZNQikKKyAgICB7CisgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZShhdmNIYW5kbGUtPnVzZXJEYXRhLCAoaW50KShyYXRlQ3RybC0+TUFEb2ZNQikpOworICAgIH0KKworICAgIGlmIChyYXRlQ3RybC0+cE1QKQorICAgIHsKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzW2ldKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKGF2Y0hhbmRsZS0+dXNlckRhdGEsIChpbnQpcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKGF2Y0hhbmRsZS0+dXNlckRhdGEsIChpbnQpcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlcyk7CisgICAgICAgIH0KKyAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKGF2Y0hhbmRsZS0+dXNlckRhdGEsIChpbnQpKHJhdGVDdHJsLT5wTVApKTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIFJDSW5pdEdPUChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICAvKiBpbiBCWCBSQywgdGhlcmUncyBubyBHT1AtbGV2ZWwgUkMgKi8KKworICAgIE9TQ0xfVU5VU0VEX0FSRyhlbmN2aWQpOworCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIFJDSW5pdEZyYW1lUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDUGljUGFyYW1TZXQgKnBpY1BhcmFtID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgLyogZnJhbWUgbGF5ZXIgcmF0ZSBjb250cm9sICovCisgICAgICAgIGlmIChyYXRlQ3RybC0+ZW5jb2RlZF9mcmFtZXMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPlFQeSA9IHJhdGVDdHJsLT5RYyA9IHJhdGVDdHJsLT5pbml0UVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKGVuY3ZpZCwgdmlkZW8sIHJhdGVDdHJsLCBwTVApOworICAgICAgICAgICAgdmlkZW8tPlFQeSA9IHJhdGVDdHJsLT5RYzsKKyAgICAgICAgfQorCisgICAgICAgIHJhdGVDdHJsLT5OdW1iZXJvZkhlYWRlckJpdHMgPSAwOworICAgICAgICByYXRlQ3RybC0+TnVtYmVyb2ZUZXh0dXJlQml0cyA9IDA7CisgICAgICAgIHJhdGVDdHJsLT5udW1GcmFtZUJpdHMgPSAwOyAvLyByZXNldAorCisgICAgICAgIC8qIHVwZGF0ZSBwTVAtPmZyYW1lUG9zICovCisgICAgICAgIGlmICgrK3BNUC0+ZnJhbWVQb3MgPT0gcE1QLT5mcmFtZVJhbmdlKSBwTVAtPmZyYW1lUG9zID0gMDsKKworICAgICAgICBpZiAocmF0ZUN0cmwtPlQgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gKGludCkocmF0ZUN0cmwtPmZyYW1lX3JhdGUgKiA3LjUgKyAwLjUpOyAvKiAwLjc1cyB0aW1lIGZyYW1lICovCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSBBVkNfTUlOKHBNUC0+Y291bnRlcl9CVGRzdCwgKGludCkocmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gLyAyICogMC40MCkpOyAvKiAwLjc1cyB0aW1lIGZyYW1lIG1heSBnbyBiZXlvbmQgVkJWIGJ1ZmZlciBpZiB3ZSBzZXQgdGhlIGJ1ZmZlciBzaXplIHNtYWxsZXIgdGhhbiAwLjc1cyAqLworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gQVZDX01BWChwTVAtPmNvdW50ZXJfQlRkc3QsIChpbnQpKChyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcykgKiAwLjMwIC8gKHJhdGVDdHJsLT5UTU5fVEggLyAxMC4wKSArIDAuNSkpOyAvKiBBdCBsZWFzdCAzMCUgb2YgVkJWIGJ1ZmZlciBzaXplLzIgKi8KKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IEFWQ19NSU4ocE1QLT5jb3VudGVyX0JUZHN0LCAyMCk7IC8qIExpbWl0IHRoZSB0YXJnZXQgdG8gYmUgc21hbGxlciB0aGFuIDNDICovCisKKyAgICAgICAgICAgIHBNUC0+dGFyZ2V0X2JpdHMgPSByYXRlQ3RybC0+VCA9IHJhdGVDdHJsLT5UTU5fVEggPSAoaW50KShyYXRlQ3RybC0+VE1OX1RIICogKDEuMCArIHBNUC0+Y291bnRlcl9CVGRzdCAqIDAuMSkpOworICAgICAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSBwTVAtPmNvdW50ZXJfQlRkc3Q7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb2xsZWN0IHRoZSBuZWNlc3NhcnkgZGF0YTogdGFyZ2V0IGJpdHMsIGFjdHVhbCBiaXRzLCBtYWQgYW5kIFFQICovCisgICAgICAgIHBNUC0+dGFyZ2V0X2JpdHMgPSByYXRlQ3RybC0+VDsKKyAgICAgICAgcE1QLT5RUCAgPSB2aWRlby0+UVB5OworCisgICAgICAgIHBNUC0+bWFkID0gKE9zY2xGbG9hdClyYXRlQ3RybC0+dG90YWxTQUQgLyB2aWRlby0+UGljU2l6ZUluTWJzOyAvL0NvbXB1dGVGcmFtZU1BRCh2aWRlbywgcmF0ZUN0cmwpOworICAgICAgICBpZiAocE1QLT5tYWQgPCBNQURfTUlOKSBwTVAtPm1hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisKKyAgICAgICAgcE1QLT5iaXRyYXRlID0gcmF0ZUN0cmwtPmJpdFJhdGU7IC8qIGNhbGN1bGF0ZWQgaW4gUkNWb3BRUFNldHRpbmcgKi8KKyAgICAgICAgcE1QLT5mcmFtZXJhdGUgPSByYXRlQ3RybC0+ZnJhbWVfcmF0ZTsKKworICAgICAgICAvKiBmaXJzdCBwYXNzIGVuY29kaW5nICovCisgICAgICAgIHBNUC0+blJlX1F1YW50aXplZCA9IDA7CisKKyAgICB9IC8vIHJjRW5hYmxlCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW8tPlFQeSA9IHJhdGVDdHJsLT5pbml0UVA7CisgICAgfQorCisvLyAgcHJpbnRmKCIgJWQgIix2aWRlby0+UVB5KTsKKworICAgIGlmICh2aWRlby0+Q3VyclBpY051bSA9PSAwICYmIGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPT0gRkFMU0UpCisgICAgeworICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA9IDA7CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID0gdmlkZW8tPlFQeSAtIDI2OworICAgIH0KKworICAgIC8vIG5lZWQgdGhpcyBmb3IgbW90aW9uIGVzdGltYXRpb24KKyAgICBlbmN2aWQtPmxhbWJkYV9tb2RlID0gUVAyUVVBTlRbQVZDX01BWCgwLCB2aWRlby0+UVB5LVNISUZUX1FQKV07CisgICAgZW5jdmlkLT5sYW1iZGFfbW90aW9uID0gTEFNQkRBX0ZBQ1RPUihlbmN2aWQtPmxhbWJkYV9tb2RlKTsKKyAgICByZXR1cm4gOworfQorCisvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKyBRUCBjYWxjdWxhdGlvbiB3aXRoIGEgbmV3IHF1YWRyYXRpYyBtZXRob2QgKi8KK3ZvaWQgY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKQoreworICAgIGludCBwcmV2X2FjdHVhbF9iaXRzID0gMCwgY3Vycl90YXJnZXQsIC8qcG9zPTAsKi9pLCBqOworICAgIE9zY2xGbG9hdCBRc3RlcCwgcHJldl9RUCA9IDAuNjI1OworCisgICAgT3NjbEZsb2F0IGN1cnJfbWFkLCBwcmV2X21hZCwgY3Vycl9SRCwgcHJldl9SRCwgYXZlcmFnZV9tYWQsIGF2ZXJfUVA7CisKKyAgICAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKi8KKyAgICB0YXJnZXRCaXRDYWxjdWxhdGlvbihlbmN2aWQsIHZpZGVvLCByYXRlQ3RybCwgcE1QKTsKKworICAgIGlmIChyYXRlQ3RybC0+VCA8PSAwIHx8IHJhdGVDdHJsLT50b3RhbFNBRCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5UIDwgMCkgICAgcmF0ZUN0cmwtPlFjID0gUkNfTUFYX1FVQU5UOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBjdXJyZW50IGZyYW1lIFFQIGVzdGltYXRpb24gKi8KKyAgICBjdXJyX3RhcmdldCA9IHJhdGVDdHJsLT5UOworICAgIGN1cnJfbWFkID0gKE9zY2xGbG9hdClyYXRlQ3RybC0+dG90YWxTQUQgLyB2aWRlby0+UGljU2l6ZUluTWJzOworICAgIGlmIChjdXJyX21hZCA8IE1BRF9NSU4pIGN1cnJfbWFkID0gTUFEX01JTjsgLyogTUFEX01JTiBpcyBkZWZpbmVkIGFzIDEgaW4gbXA0ZGVmLmggKi8KKyAgICBjdXJyX1JEICA9IChPc2NsRmxvYXQpY3Vycl90YXJnZXQgLyBjdXJyX21hZDsKKworICAgIGlmIChyYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID09IC0xKSAvLyBwcmV2aW91cyB3YXMgc2tpcHBlZAorICAgIHsKKyAgICAgICAgaSA9IHBNUC0+ZnJhbWVQb3M7CisgICAgICAgIHByZXZfbWFkID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZDsKKyAgICAgICAgcHJldl9RUCA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5RUDsKKyAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5hY3R1YWxfYml0czsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogQW5vdGhlciB2ZXJzaW9uIG9mIHNlYXJjaCB0aGUgb3B0aW1hbCBwb2ludCAqLworICAgICAgICBwcmV2X21hZCA9IDAuMDsKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgcE1QLT5mcmFtZVJhbmdlICYmIHByZXZfbWFkIDwgMC4wMDEpIC8qIGZpbmQgZmlyc3Qgb25lIHdpdGggbm9uemVybyBwcmV2X21hZCAqLworICAgICAgICB7CisgICAgICAgICAgICBwcmV2X21hZCA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQ7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA8IHBNUC0+ZnJhbWVSYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tpLTFdWzBdLmFjdHVhbF9iaXRzOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBpIDwgcE1QLT5mcmFtZVJhbmdlOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgQVZDX0FCUyhwcmV2X21hZCAtIGN1cnJfbWFkKSA+IEFWQ19BQlMocE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZCAtIGN1cnJfbWFkKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByZXZfbWFkID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZDsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tpXVswXS5hY3R1YWxfYml0czsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9RUCA9IFFQMlFzdGVwKHBNUC0+cFJEU2FtcGxlc1tqXVswXS5RUCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBwTVAtPnNhbXBsZXNQZXJGcmFtZVtqXTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChBVkNfQUJTKHByZXZfYWN0dWFsX2JpdHMgLSBjdXJyX3RhcmdldCkgPiBBVkNfQUJTKHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5hY3R1YWxfYml0cyAtIGN1cnJfdGFyZ2V0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByZXZfYWN0dWFsX2JpdHMgPSBwTVAtPnBSRFNhbXBsZXNbal1baV0uYWN0dWFsX2JpdHM7CisgICAgICAgICAgICAgICAgICAgIHByZXZfUVAgPSBRUDJRc3RlcChwTVAtPnBSRFNhbXBsZXNbal1baV0uUVApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHF1YWRyYXRpYyBhcHByb3hpbWF0aW9uCisgICAgaWYgKHByZXZfbWFkID4gMC4wMDEpIC8vIG9ubHkgd2hlbiBwcmV2X21hZCBpcyBncmVhdGVyIHRoYW4gMCwgb3RoZXJ3aXNlIGtlZXAgdXNpbmcgdGhlIHNhbWUgUVAKKyAgICB7CisgICAgICAgIHByZXZfUkQgPSAoT3NjbEZsb2F0KXByZXZfYWN0dWFsX2JpdHMgLyBwcmV2X21hZDsKKyAgICAgICAgLy9yYXRlQ3RybC0+UWMgPSAoSW50KShwcmV2X1FQICogc3FydChwcmV2X2FjdHVhbF9iaXRzL2N1cnJfdGFyZ2V0KSArIDAuNCk7CisgICAgICAgIGlmIChwcmV2X1FQID09IDAuNjI1KSAvLyBhZGRlZCB0aGlzIHRvIGFsbG93IGdldHRpbmcgb3V0IG9mIFFQID0gMCBlYXNpbHkKKyAgICAgICAgeworICAgICAgICAgICAgUXN0ZXAgPSAoaW50KShwcmV2X1JEIC8gY3Vycl9SRCArIDAuNSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgIHJhdGVDdHJsLT5RYyA9KEludCkocHJldl9RUCAqIE00VkVOQ19TUVJUKHByZXZfUkQvY3Vycl9SRCkgKyAwLjkpOworCisgICAgICAgICAgICBpZiAocHJldl9SRCAvIGN1cnJfUkQgPiAwLjUgJiYgcHJldl9SRCAvIGN1cnJfUkQgPCAyLjApCisgICAgICAgICAgICAgICAgUXN0ZXAgPSAoaW50KShwcmV2X1FQICogKHNxcnQocHJldl9SRCAvIGN1cnJfUkQpICsgcHJldl9SRCAvIGN1cnJfUkQpIC8gMi4wICsgMC45KTsgLyogUXVhZHJhdGljIGFuZCBsaW5lYXIgYXBwcm94aW1hdGlvbiAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFFzdGVwID0gKGludCkocHJldl9RUCAqIChzcXJ0KHByZXZfUkQgLyBjdXJyX1JEKSArIHBvdyhwcmV2X1JEIC8gY3Vycl9SRCwgMS4wIC8gMy4wKSkgLyAyLjAgKyAwLjkpOworICAgICAgICB9CisgICAgICAgIC8vIGxvd2VyIGJvdW5kIG9uIFFjIHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9mIGN1cnJfbWFkCisgICAgICAgIC8vIFdoZW4gbWFkIGlzIGFscmVhZHkgbG93LCBsb3dlciBib3VuZCBvbiBRYyBkb2Vzbid0IGhhdmUgdG8gYmUgc21hbGwuCisgICAgICAgIC8vIE5vdGUsIHRoaXMgZG9lc24ndCB3b3JrIHdlbGwgZm9yIGxvdyBjb21wbGV4aXR5IGNsaXAgZW5jb2RlZCBhdCBoaWdoIGJpdCByYXRlCisgICAgICAgIC8vIGl0IGRvZXNuJ3QgaGl0IHRoZSB0YXJnZXQgYml0IHJhdGUgZHVlIHRvIHRoaXMgUVAgbG93ZXIgYm91bmQuCisgICAgICAgIC8vLyBpZigoY3Vycl9tYWQgPCA4KSAmJiAocmF0ZUN0cmwtPlFjIDwgMTIpKSAgIHJhdGVDdHJsLT5RYyA9IDEyOworICAgICAgICAvLyAgZWxzZSAgICBpZigoY3Vycl9tYWQgPCAxMjgpICYmIChyYXRlQ3RybC0+UWMgPCAzKSkgcmF0ZUN0cmwtPlFjID0gMzsKKworICAgICAgICByYXRlQ3RybC0+UWMgPSBRc3RlcDJRUChRc3RlcCk7CisKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5RYyA8IFJDX01JTl9RVUFOVCkgcmF0ZUN0cmwtPlFjID0gUkNfTUlOX1FVQU5UOworICAgICAgICBpZiAocmF0ZUN0cmwtPlFjID4gUkNfTUFYX1FVQU5UKSAgICByYXRlQ3RybC0+UWMgPSBSQ19NQVhfUVVBTlQ7CisgICAgfQorCisgICAgLyogYWN0aXZlIGJpdCByZXNvdXJjZSBwcm90ZWN0aW9uICovCisgICAgYXZlcl9RUCA9IChwTVAtPmVuY29kZWRfZnJhbWVzID09IDAgPyAwIDogcE1QLT5zdW1fUVAgLyAoT3NjbEZsb2F0KXBNUC0+ZW5jb2RlZF9mcmFtZXMpOworICAgIGF2ZXJhZ2VfbWFkID0gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPT0gMCA/IDAgOiBwTVAtPnN1bV9tYWQgLyAoT3NjbEZsb2F0KXBNUC0+ZW5jb2RlZF9mcmFtZXMpOyAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzY29uZCBlbmNvZGVkIGZyYW1lKi8KKyAgICBpZiAocE1QLT5kaWZmX2NvdW50ZXIgPT0gMCAmJgorICAgICAgICAgICAgKChPc2NsRmxvYXQpcmF0ZUN0cmwtPlFjIDw9IGF2ZXJfUVAqMS4xIHx8IGN1cnJfbWFkIDw9IGF2ZXJhZ2VfbWFkKjEuMSkgJiYKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyA8PSAocE1QLT5jb3VudGVyX0JUZHN0ICsgKGludCkocE1QLT5mcmFtZXJhdGUqMS4wICsgMC41KSkpCisgICAgeworICAgICAgICByYXRlQ3RybC0+VE1OX1RIIC09IChpbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTAuMCk7CisgICAgICAgIHJhdGVDdHJsLT5UID0gcmF0ZUN0cmwtPlRNTl9USCAtIHJhdGVDdHJsLT5UTU5fVzsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjKys7CisgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyLS07CisgICAgfQorCit9CisKK3ZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24oQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGVuY3ZpZCk7CisgICAgT3NjbEZsb2F0IGN1cnJfbWFkOy8vLCBhdmVyYWdlX21hZDsKKyAgICBpbnQgZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QsIHByZXZfY291bnRlcl9kaWZmLCBjdXJyX2NvdW50ZXJfZGlmZiwgYm91bmQ7CisgICAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGZvciBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLworCisgICAgLyogc29tZSBzdHVmZiBhYm91dCBmcmFtZSBkcm9wcGluZyByZW1haW5lZCBoZXJlIHRvIGJlIGRvbmUgYmVjYXVzZSBwTVAgY2Fubm90IGJlIGluc2VydGVkIGludG8gdXBkYXRlUmF0ZUNvbnRyb2woKSovCisgICAgdXBkYXRlUkNfUG9zdFByb2MocmF0ZUN0cmwsIHBNUCk7CisKKyAgICAvKiB1cGRhdGUgcE1QLT5jb3VudGVyX0JUc3JjIGFuZCBwTVAtPmNvdW50ZXJfQlRkc3QgdG8gYXZvaWQgaW50ZXJnZXIgb3ZlcmZsb3cgKi8KKyAgICBpZiAocE1QLT5jb3VudGVyX0JUc3JjID4gMTAwMCAmJiBwTVAtPmNvdW50ZXJfQlRkc3QgPiAxMDAwKQorICAgIHsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIC09IDEwMDA7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCAtPSAxMDAwOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogdGFyZ2V0IGNhbGN1bGF0aW9uICovCisgICAgY3Vycl9tYWQgPSAoT3NjbEZsb2F0KXJhdGVDdHJsLT50b3RhbFNBRCAvIHZpZGVvLT5QaWNTaXplSW5NYnM7CisgICAgaWYgKGN1cnJfbWFkIDwgTUFEX01JTikgY3Vycl9tYWQgPSBNQURfTUlOOyAvKiBNQURfTUlOIGlzIGRlZmluZWQgYXMgMSBpbiBtcDRkZWYuaCAqLworICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IGRpZmZfY291bnRlcl9CVGRzdCA9IDA7CisgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSAwOworCisKKyAgICAvKjEuY2FsY3VsYXRlIGF2ZXJhZ2UgbWFkICovCisgICAgcE1QLT5zdW1fbWFkICs9IGN1cnJfbWFkOworICAgIC8vYXZlcmFnZV9tYWQgPSAocE1QLT5lbmNvZGVkX2ZyYW1lcyA8IDEgPyBjdXJyX21hZCA6IHBNUC0+c3VtX21hZC8oT3NjbEZsb2F0KShwTVAtPmVuY29kZWRfZnJhbWVzKzEpKTsgLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgc2NvbmQgZW5jb2RlZCBmcmFtZSovCisgICAgLy9wTVAtPmF2ZXJfbWFkID0gYXZlcmFnZV9tYWQ7CisgICAgaWYgKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPj0gMCkgLyogcE1QLT5lbmNvZGVkX2ZyYW1lcyBpcyBzZXQgdG8gLTEgaW5pdGlhbGx5LCBzbyBmb3JnZXQgYWJvdXQgdGhlIHZlcnkgZmlyc3QgSSBmcmFtZSAqLworICAgICAgICBwTVAtPmF2ZXJfbWFkID0gKHBNUC0+YXZlcl9tYWQgKiBwTVAtPmVuY29kZWRfZnJhbWVzICsgY3Vycl9tYWQpIC8gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgKyAxKTsKKworICAgIGlmIChwTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPiAwICYmIHBNUC0+ZW5jb2RlZF9mcmFtZXNfcHJldiA+PSAwKQorICAgICAgICBwTVAtPmF2ZXJfbWFkX3ByZXYgPSAocE1QLT5hdmVyX21hZF9wcmV2ICogcE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ICsgY3Vycl9tYWQpIC8gKHBNUC0+ZW5jb2RlZF9mcmFtZXNfcHJldiArIDEpOworCisgICAgLyoyLmF2ZXJhZ2VfbWFkLCBtYWQgPT0+IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0ICovCisgICAgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogb3JpZ2luYWwgdmVyaXNvbiAqLworICAgICAgICBpZiAoY3Vycl9tYWQgPiBwTVAtPmF2ZXJfbWFkKjEuMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpID4gMikKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KShzcXJ0KGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KSgoc3FydChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkKSoyK2N1cnJfbWFkL3BNUC0+YXZlcl9tYWQpLygzKjAuMSkgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGN1cnJfbWFkIDw9IGF2ZXJhZ2VfbWFkKjEuMSAqLworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChpbnQpKChzcXJ0KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWQpICsgcG93KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWQsIDEuMC8zLjApKS8oMi4wKjAuMSkgKyAwLjQpOworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoaW50KShzcXJ0KGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpKSAqIDEwICsgMC41KTsKKworICAgICAgICAvKiBhY3RpdmVseSBmaWxsIGluIHRoZSBwb3NzaWJsZSBnYXAgKi8KKyAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYyA9PSAwICYmIGRpZmZfY291bnRlcl9CVGRzdCA9PSAwICYmCisgICAgICAgICAgICAgICAgY3Vycl9tYWQgPD0gcE1QLT5hdmVyX21hZCoxLjEgJiYgcE1QLT5jb3VudGVyX0JUc3JjIDwgcE1QLT5jb3VudGVyX0JUZHN0KQorICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTsKKworICAgIH0KKyAgICBlbHNlIGlmIChwTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPiAwKQorICAgIHsKKyAgICAgICAgLyogdHJhbnNpdGlvbiB0aW1lOiB1c2UgcHJldmlvdXMgYXZlcmFnZSBtYWQgInBNUC0+YXZlcl9tYWRfcHJldiIgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBhdmVyYWdlIG1hZCAicE1QLT5hdmVyX21hZCIgKi8KKyAgICAgICAgaWYgKGN1cnJfbWFkID4gcE1QLT5hdmVyX21hZF9wcmV2KjEuMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJfbWFkIC8gcE1QLT5hdmVyX21hZF9wcmV2ID4gMikKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KShzcXJ0KGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWRfcHJldiArIDAuMDAwMSkpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKChNNFZFTkNfU1FSVChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYpKjIrY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2KS8oMyowLjEpICsgMC40KSAtIDEwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWRfcHJldiArIDAuMDAwMSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGN1cnJfbWFkIDw9IGF2ZXJhZ2VfbWFkKjEuMSAqLworICAgICAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChJbnQpKChzcXJ0KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldikgKyBwb3coY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2LCAxLjAvMy4wKSkvKDIuMCowLjEpICsgMC40KTsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKGludCkoc3FydChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkX3ByZXYgKyAwLjAwMDEpKSAqIDEwICsgMC41KTsKKworICAgICAgICAvKiBhY3RpdmVseSBmaWxsIGluIHRoZSBwb3NzaWJsZSBnYXAgKi8KKyAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYyA9PSAwICYmIGRpZmZfY291bnRlcl9CVGRzdCA9PSAwICYmCisgICAgICAgICAgICAgICAgY3Vycl9tYWQgPD0gcE1QLT5hdmVyX21hZF9wcmV2KjEuMSAmJiBwTVAtPmNvdW50ZXJfQlRzcmMgPCBwTVAtPmNvdW50ZXJfQlRkc3QpCisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxOworCisgICAgICAgIGlmICgtLXBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA8PSAwKSAgICBwTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPSAwOworICAgIH0KKworCisgICAgLyogaWYgZGlmZmVyZW5jZSBpcyB0b28gbXVjaCwgZG8gY2xpcHBpbmcgKi8KKyAgICAvKiBGaXJzdCwgc2V0IHRoZSB1cHBlciBib3VuZCBmb3IgY3VycmVudCBiaXQgYWxsb2NhdGlvbiB2YXJpYW5jZTogODAlIG9mIGF2YWlsYWJsZSBidWZmZXIgKi8KKyAgICBib3VuZCA9IChpbnQpKChyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcykgKiAwLjYgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOyAvKiByYXRlQ3RybC0+QnMgKi8KKyAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAgQVZDX01JTihkaWZmX2NvdW50ZXJfQlRzcmMsIGJvdW5kKTsKKyAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAgQVZDX01JTihkaWZmX2NvdW50ZXJfQlRkc3QsIGJvdW5kKTsKKworICAgIC8qIFNlY29uZCwgc2V0IGFub3RoZXIgdXBwZXIgYm91bmQgZm9yIGN1cnJlbnQgYml0IGFsbG9jYXRpb246IDQtNSpiaXRyYXRlL2ZyYW1lcmF0ZSAqLworICAgIGJvdW5kID0gNTA7CisvLyAgaWYodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfTE9XREVMQVkpCisvLyAgbm90IG5lY2Vzc2FyeSAgICAgICBib3VuZCA9IDEwOyAgLS0gRm9yIExvdyBkZWxheSAqLworCisgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gIEFWQ19NSU4oZGlmZl9jb3VudGVyX0JUc3JjLCBib3VuZCk7CisgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gIEFWQ19NSU4oZGlmZl9jb3VudGVyX0JUZHN0LCBib3VuZCk7CisKKworICAgIC8qIFRoaXJkLCBjaGVjayB0aGUgYnVmZmVyICovCisgICAgcHJldl9jb3VudGVyX2RpZmYgPSBwTVAtPmNvdW50ZXJfQlRkc3QgLSBwTVAtPmNvdW50ZXJfQlRzcmM7CisgICAgY3Vycl9jb3VudGVyX2RpZmYgPSBwcmV2X2NvdW50ZXJfZGlmZiArIChkaWZmX2NvdW50ZXJfQlRkc3QgLSBkaWZmX2NvdW50ZXJfQlRzcmMpOworCisgICAgaWYgKEFWQ19BQlMocHJldl9jb3VudGVyX2RpZmYpID49IHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtIHx8IEFWQ19BQlMoY3Vycl9jb3VudGVyX2RpZmYpID49IHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtKQorICAgIHsgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IGRpZmZfY291bnRlcl9CVGRzdCA9IDA7CisKKyAgICAgICAgaWYgKGN1cnJfY291bnRlcl9kaWZmID4gcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gJiYgZGlmZl9jb3VudGVyX0JUZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAocmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gLSBwcmV2X2NvdW50ZXJfZGlmZikgKyBkaWZmX2NvdW50ZXJfQlRzcmM7CisgICAgICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUZHN0IDwgMCkgZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UgaWYgKGN1cnJfY291bnRlcl9kaWZmIDwgLXJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtICYmIGRpZmZfY291bnRlcl9CVHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0IC0gKC1yYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAtIHByZXZfY291bnRlcl9kaWZmKTsKKyAgICAgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMgPCAwKSBkaWZmX2NvdW50ZXJfQlRzcmMgPSAwOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKjMuZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QgPT0+IFRNTl9USCAqLworICAgIHJhdGVDdHJsLT5UTU5fVEggPSAoaW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSk7CisgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSAwOworCisgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYykKKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggLT0gKGludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgKiBkaWZmX2NvdW50ZXJfQlRzcmMgKiAwLjEpOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IC1kaWZmX2NvdW50ZXJfQlRzcmM7CisgICAgfQorICAgIGVsc2UgaWYgKGRpZmZfY291bnRlcl9CVGRzdCkKKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggKz0gKGludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgKiBkaWZmX2NvdW50ZXJfQlRkc3QgKiAwLjEpOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IGRpZmZfY291bnRlcl9CVGRzdDsKKyAgICB9CisKKworICAgIC8qNC51cGRhdGUgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KKyAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gZGlmZl9jb3VudGVyX0JUc3JjOworICAgIHBNUC0+Y291bnRlcl9CVGRzdCArPSBkaWZmX2NvdW50ZXJfQlRkc3Q7CisKKworICAgIC8qNS50YXJnZXQgYml0IGNhbGN1bGF0aW9uICovCisgICAgcmF0ZUN0cmwtPlQgPSByYXRlQ3RybC0+VE1OX1RIIC0gcmF0ZUN0cmwtPlRNTl9XOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCB1cGRhdGVSQ19Qb3N0UHJvYyhBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKQoreworICAgIGlmIChyYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID4gMCkgLyogc2tpcCBuZXh0IGZyYW1lICovCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gMTAgKiByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lOworCisgICAgfQorICAgIGVsc2UgaWYgKHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPT0gLTEpIC8qIHNraXAgY3VycmVudCBmcmFtZSAqLworICAgIHsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0IC09IHBNUC0+ZGlmZl9jb3VudGVyOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gMTA7CisKKyAgICAgICAgcE1QLT5zdW1fbWFkIC09IHBNUC0+bWFkOworICAgICAgICBwTVAtPmF2ZXJfbWFkID0gKHBNUC0+YXZlcl9tYWQgKiBwTVAtPmVuY29kZWRfZnJhbWVzIC0gcE1QLT5tYWQpIC8gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgLSAxICsgMC4wMDAxKTsKKyAgICAgICAgcE1QLT5zdW1fUVAgIC09IHBNUC0+UVA7CisgICAgICAgIHBNUC0+ZW5jb2RlZF9mcmFtZXMgLS07CisgICAgfQorICAgIC8qIHNvbWUgc3R1ZmYgaW4gdXBkYXRlIFZCVl9mdWxsbmVzcyByZW1haW5zIGhlcmUgKi8KKyAgICAvL2lmKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPCAtcmF0ZUN0cmwtPkJzLzIpIC8qIHJhdGVDdHJsLT5CcyAqLworICAgIGlmIChyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIDwgcmF0ZUN0cmwtPmxvd19ib3VuZCkKKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPSByYXRlQ3RybC0+bG93X2JvdW5kOyAvLyAtcmF0ZUN0cmwtPkJzLzI7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVyA9IHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLSByYXRlQ3RybC0+bG93X2JvdW5kOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgPSBwTVAtPmNvdW50ZXJfQlRkc3QgKyAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPmxvd19ib3VuZCkgLyAyLjAgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOworICAgIH0KK30KKworCit2b2lkIFJDSW5pdENocm9tYVFQKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBxX2JpdHM7CisKKyAgICAvKiB3ZSBoYXZlIHRvIGRvIHRoZSBzYW1lIHRoaW5nIGZvciBBVkNfQ0xJUDMoMCw1MSx2aWRlby0+UVN5KSAqLworCisgICAgdmlkZW8tPlFQeV9kaXZfNiA9IChjdXJyTUItPlFQeSAqIDQzKSA+PiA4OworICAgIHZpZGVvLT5RUHlfbW9kXzYgPSBjdXJyTUItPlFQeSAtIDYgKiB2aWRlby0+UVB5X2Rpdl82OworICAgIGN1cnJNQi0+UVBjID0gdmlkZW8tPlFQYyA9IG1hcFFQaTJRUGNbQVZDX0NMSVAzKDAsIDUxLCBjdXJyTUItPlFQeSArIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KV07CisgICAgdmlkZW8tPlFQY19kaXZfNiA9ICh2aWRlby0+UVBjICogNDMpID4+IDg7CisgICAgdmlkZW8tPlFQY19tb2RfNiA9IHZpZGVvLT5RUGMgLSA2ICogdmlkZW8tPlFQY19kaXZfNjsKKworICAgIC8qIHByZS1jYWxjdWxhdGUgdGhpcyB0byBzYXZlIGNvbXB1dGF0aW9uICovCisgICAgcV9iaXRzID0gNCArIHZpZGVvLT5RUHlfZGl2XzY7CisgICAgaWYgKHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19JX1NMSUNFKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdCA9IDY4MiA8PCBxX2JpdHM7ICAgICAgIC8vIGludHJhCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+cXBfY29uc3QgPSAzNDIgPDwgcV9iaXRzOyAgICAgICAvLyBpbnRlcgorICAgIH0KKworICAgIHFfYml0cyA9IDQgKyB2aWRlby0+UVBjX2Rpdl82OworICAgIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfSV9TTElDRSkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+cXBfY29uc3RfYyA9IDY4MiA8PCBxX2JpdHM7ICAgIC8vIGludHJhCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+cXBfY29uc3RfYyA9IDM0MiA8PCBxX2JpdHM7ICAgIC8vIGludGVyCisgICAgfQorCisgICAgZW5jdmlkLT5sYW1iZGFfbW9kZSA9IFFQMlFVQU5UW0FWQ19NQVgoMCwgY3Vyck1CLT5RUHktU0hJRlRfUVApXTsKKyAgICBlbmN2aWQtPmxhbWJkYV9tb3Rpb24gPSBMQU1CREFfRkFDVE9SKGVuY3ZpZC0+bGFtYmRhX21vZGUpOworCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIFJDSW5pdE1CUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9ICBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworCisgICAgY3Vyck1CLT5RUHkgPSB2aWRlby0+UVB5OyAvKiBzZXQgdG8gcHJldmlvdXMgdmFsdWUgb3IgcGljdHVyZSBsZXZlbCAqLworCisgICAgUkNJbml0Q2hyb21hUVAoZW5jdmlkKTsKKworfQorCit2b2lkIFJDUG9zdE1CKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgaW50IG51bV9oZWFkZXJfYml0cywgaW50IG51bV90ZXh0dXJlX2JpdHMpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKHZpZGVvKTsKKyAgICByYXRlQ3RybC0+bnVtTUJIZWFkZXJCaXRzID0gbnVtX2hlYWRlcl9iaXRzOworICAgIHJhdGVDdHJsLT5udW1NQlRleHR1cmVCaXRzID0gbnVtX3RleHR1cmVfYml0czsKKyAgICByYXRlQ3RybC0+TnVtYmVyb2ZIZWFkZXJCaXRzICs9IHJhdGVDdHJsLT5udW1NQkhlYWRlckJpdHM7CisgICAgcmF0ZUN0cmwtPk51bWJlcm9mVGV4dHVyZUJpdHMgKz0gcmF0ZUN0cmwtPm51bU1CVGV4dHVyZUJpdHM7Cit9CisKK3ZvaWQgUkNSZXN0b3JlUVAoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNDb21tb25PYmogKnZpZGVvLCBBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBjdXJyTUItPlFQeSA9IHZpZGVvLT5RUHk7IC8qIHVzZSBwcmV2aW91cyBRUCAqLworICAgIFJDSW5pdENocm9tYVFQKGVuY3ZpZCk7CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgUkNDYWxjdWxhdGVNQUQoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgdWludDggKm9yZ0wsIGludCBvcmdQaXRjaCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICB1aW50MzIgZG1pbl9seDsKKworICAgIGlmIChyYXRlQ3RybC0+cmNFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPm1iX2ludHJhKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbWluX2x4ID0gKDB4RkZGRiA8PCAxNikgfCBvcmdQaXRjaDsKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+TUFEb2ZNQlt2aWRlby0+bWJOdW1dID0gQVZDU0FEX01hY3JvYmxvY2tfQyhvcmdMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN2aWQtPnByZWRfaTE2W2N1cnJNQi0+aTE2TW9kZV0sIGRtaW5fbHgsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBpNCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5NQURvZk1CW3ZpZGVvLT5tYk51bV0gPSBlbmN2aWQtPmk0X3NhZCAvIDI1Ni47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogZm9yIElOVEVSLCB3ZSBoYXZlIGFscmVhZHkgc2F2ZWQgaXQgd2l0aCB0aGUgTVYgc2VhcmNoICovCisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisKK0FWQ0VuY19TdGF0dXMgUkNVcGRhdGVGcmFtZShBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIE11bHRpUGFzcyAqcE1QID0gcmF0ZUN0cmwtPnBNUDsKKyAgICBpbnQgZGlmZl9CVENvdW50ZXI7CisgICAgaW50IG5hbF90eXBlID0gdmlkZW8tPm5hbF91bml0X3R5cGU7CisKKyAgICAvKiB1cGRhdGUgdGhlIGNvbXBsZXhpdHkgd2VpZ2h0IG9mIEksIFAsIEIgZnJhbWUgKi8KKworICAgIGlmIChyYXRlQ3RybC0+cmNFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHBNUC0+YWN0dWFsX2JpdHMgPSByYXRlQ3RybC0+bnVtRnJhbWVCaXRzOworICAgICAgICBwTVAtPm1hZCA9IChPc2NsRmxvYXQpcmF0ZUN0cmwtPnRvdGFsU0FEIC8gdmlkZW8tPlBpY1NpemVJbk1iczsgLy9Db21wdXRlRnJhbWVNQUQodmlkZW8sIHJhdGVDdHJsKTsKKworICAgICAgICBBVkNTYXZlUkRTYW1wbGVzKHBNUCwgMCk7CisKKyAgICAgICAgcE1QLT5lbmNvZGVkX2ZyYW1lcysrOworCisgICAgICAgIC8qIGZvciBwTVAtPnNhbXBsZXNQZXJGcmFtZSAqLworICAgICAgICBwTVAtPnNhbXBsZXNQZXJGcmFtZVtwTVAtPmZyYW1lUG9zXSA9IDA7CisKKyAgICAgICAgcE1QLT5zdW1fUVAgKz0gcE1QLT5RUDsKKworICAgICAgICAvKiB1cGRhdGUgcE1QLT5jb3VudGVyX0JUc3JjLCBwTVAtPmNvdW50ZXJfQlRkc3QgKi8KKyAgICAgICAgLyogcmUtYWxsb2NhdGUgdGhlIHRhcmdldCBiaXQgYWdhaW4gYW5kIHRoZW4gc3RvcCBlbmNvZGluZyAqLworICAgICAgICBkaWZmX0JUQ291bnRlciA9IChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5UTU5fVEggLSByYXRlQ3RybC0+VE1OX1cgLSBwTVAtPmFjdHVhbF9iaXRzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBNUC0+Yml0cmF0ZSAvIChwTVAtPmZyYW1lcmF0ZSArIDAuMDAwMSkgKyAwLjAwMDEpIC8gMC4xKTsKKyAgICAgICAgaWYgKGRpZmZfQlRDb3VudGVyID49IDApCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gZGlmZl9CVENvdW50ZXI7IC8qIHBNUC0+YWN0dWFsX2JpdHMgaXMgc21hbGxlciAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gZGlmZl9CVENvdW50ZXI7IC8qIHBNUC0+YWN0dWFsX2JpdHMgaXMgYmlnZ2VyICovCisKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCAtPSAoaW50KSgoT3NjbEZsb2F0KXBNUC0+Yml0cmF0ZSAvIChwTVAtPmZyYW1lcmF0ZSArIDAuMDAwMSkgKiAoZGlmZl9CVENvdW50ZXIgKiAwLjEpKTsKKyAgICAgICAgcmF0ZUN0cmwtPlQgPSBwTVAtPnRhcmdldF9iaXRzID0gcmF0ZUN0cmwtPlRNTl9USCAtIHJhdGVDdHJsLT5UTU5fVzsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgLT0gZGlmZl9CVENvdW50ZXI7CisKKyAgICAgICAgcmF0ZUN0cmwtPlJjID0gcmF0ZUN0cmwtPm51bUZyYW1lQml0czsgIC8qIFRvdGFsIEJpdHMgZm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgcmF0ZUN0cmwtPkhjID0gcmF0ZUN0cmwtPk51bWJlcm9mSGVhZGVyQml0czsgICAgLyogVG90YWwgQml0cyBpbiBIZWFkZXIgYW5kIE1vdGlvbiBWZWN0b3IgKi8KKworICAgICAgICAvKiBCWF9SQyAqLworICAgICAgICB1cGRhdGVSYXRlQ29udHJvbChyYXRlQ3RybCwgbmFsX3R5cGUpOworICAgICAgICBpZiAocmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9PSAtMSkgLy8gc2tpcCBjdXJyZW50IGZyYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYXRlQ3RybC0+Zmlyc3RfZnJhbWUgPSAwOyAgLy8gcmVzZXQgaGVyZSBhZnRlciB3ZSBlbmNvZGUgdGhlIGZpcnN0IGZyYW1lLgorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBVkNTYXZlUkRTYW1wbGVzKE11bHRpUGFzcyAqcE1QLCBpbnQgY291bnRlcl9zYW1wbGVzKQoreworICAgIC8qIGZvciBwTVAtPnBSRFNhbXBsZXMgKi8KKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5RUCAgICA9IHBNUC0+UVA7CisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10uYWN0dWFsX2JpdHMgPSBwTVAtPmFjdHVhbF9iaXRzOworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLm1hZCAgID0gcE1QLT5tYWQ7CisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10uUl9EID0gKE9zY2xGbG9hdClwTVAtPmFjdHVhbF9iaXRzIC8gKHBNUC0+bWFkICsgMC4wMDAxKTsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgdXBkYXRlUmF0ZUNvbnRyb2woQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgbmFsX3R5cGUpCit7CisgICAgaW50ICBmcmFtZV9iaXRzOworICAgIE11bHRpUGFzcyAqcE1QID0gcmF0ZUN0cmwtPnBNUDsKKworICAgIC8qIEJYIHJhdGUgY29udHJvXGwgKi8KKyAgICBmcmFtZV9iaXRzID0gKGludCkocmF0ZUN0cmwtPmJpdFJhdGUgLyByYXRlQ3RybC0+ZnJhbWVfcmF0ZSk7CisgICAgcmF0ZUN0cmwtPlRNTl9XICs9IChyYXRlQ3RybC0+UmMgLSByYXRlQ3RybC0+VE1OX1RIKTsKKyAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzICs9IChyYXRlQ3RybC0+UmMgLSBmcmFtZV9iaXRzKTsgLy9yYXRlQ3RybC0+UnApOworICAgIC8vaWYocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA8IDApIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPSAtMTsKKworICAgIHJhdGVDdHJsLT5lbmNvZGVkX2ZyYW1lcysrOworCisgICAgLyogZnJhbWUgZHJvcHBpbmcgKi8KKyAgICByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID0gMDsKKworICAgIGlmICgocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA+IHJhdGVDdHJsLT5CcyAvIDIpICYmIG5hbF90eXBlICE9IEFWQ19OQUxUWVBFX0lEUikgLyogc2tpcCB0aGUgY3VycmVudCBmcmFtZSAqLyAvKiByYXRlQ3RybC0+QnMgKi8KKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVyAtPSAocmF0ZUN0cmwtPlJjIC0gcmF0ZUN0cmwtPlRNTl9USCk7CisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLT0gcmF0ZUN0cmwtPlJjOworICAgICAgICByYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCkgPiAocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSowLjk1KSAvKiBza2lwIG5leHQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLT0gZnJhbWVfYml0czsgLy9yYXRlQ3RybC0+UnA7CisgICAgICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPSAxOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgLT0gKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5sb3dfYm91bmQpIC8gMi4wIC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsKKyAgICAgICAgLyogQlhfMSwgc2tpcCBtb3JlIHRoYW4gMSBmcmFtZXMgICovCisgICAgICAgIC8vd2hpbGUocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA+IHJhdGVDdHJsLT5CcyowLjQ3NSkKKyAgICAgICAgd2hpbGUgKChyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzc19vZmZzZXQpID4gKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCkqMC45NSkKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtPSBmcmFtZV9iaXRzOyAvL3JhdGVDdHJsLT5ScDsKKyAgICAgICAgICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUrKzsKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyAtPSAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPmxvd19ib3VuZCkgLyAyLjAgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOworICAgICAgICB9CisKKyAgICAgICAgLyogRU5EIEJYXzEgKi8KKyAgICB9Cit9CisKKworZG91YmxlIENvbXB1dGVGcmFtZU1BRChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwpCit7CisgICAgZG91YmxlIFRvdGFsTUFEOworICAgIGludCBpOworICAgIFRvdGFsTUFEID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KXZpZGVvLT5QaWNTaXplSW5NYnM7IGkrKykKKyAgICAgICAgVG90YWxNQUQgKz0gcmF0ZUN0cmwtPk1BRG9mTUJbaV07CisgICAgVG90YWxNQUQgLz0gdmlkZW8tPlBpY1NpemVJbk1iczsKKyAgICByZXR1cm4gVG90YWxNQUQ7Cit9CisKKworCisKKworLyogY29udmVydCBmcm9tIFFQIHRvIFFzdGVwICovCitkb3VibGUgUVAyUXN0ZXAoaW50IFFQKQoreworICAgIGludCBpOworICAgIGRvdWJsZSBRc3RlcDsKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIFFQMlFTVEVQWzZdID0geyAwLjYyNSwgMC42ODc1LCAwLjgxMjUsIDAuODc1LCAxLjAsIDEuMTI1IH07CisKKyAgICBRc3RlcCA9IFFQMlFTVEVQW1FQICUgNl07CisgICAgZm9yIChpID0gMDsgaSA8IChRUCAvIDYpOyBpKyspCisgICAgICAgIFFzdGVwICo9IDI7CisKKyAgICByZXR1cm4gUXN0ZXA7Cit9CisKKy8qIGNvbnZlcnQgZnJvbSBzdGVwIHNpemUgdG8gUVAgKi8KK2ludCBRc3RlcDJRUChkb3VibGUgUXN0ZXApCit7CisgICAgaW50IHFfcGVyID0gMCwgcV9yZW0gPSAwOworCisgICAgLy8gIGFzc2VydCggUXN0ZXAgPj0gUVAyUXN0ZXAoMCkgJiYgUXN0ZXAgPD0gUVAyUXN0ZXAoNTEpICk7CisgICAgaWYgKFFzdGVwIDwgUVAyUXN0ZXAoMCkpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKFFzdGVwID4gUVAyUXN0ZXAoNTEpKQorICAgICAgICByZXR1cm4gNTE7CisKKyAgICB3aGlsZSAoUXN0ZXAgPiBRUDJRc3RlcCg1KSkKKyAgICB7CisgICAgICAgIFFzdGVwIC89IDI7CisgICAgICAgIHFfcGVyICs9IDE7CisgICAgfQorCisgICAgaWYgKFFzdGVwIDw9ICgwLjYyNSArIDAuNjg3NSkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAwLjYyNTsKKyAgICAgICAgcV9yZW0gPSAwOworICAgIH0KKyAgICBlbHNlIGlmIChRc3RlcCA8PSAoMC42ODc1ICsgMC44MTI1KSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDAuNjg3NTsKKyAgICAgICAgcV9yZW0gPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChRc3RlcCA8PSAoMC44MTI1ICsgMC44NzUpIC8gMikKKyAgICB7CisgICAgICAgIFFzdGVwID0gMC44MTI1OworICAgICAgICBxX3JlbSA9IDI7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgwLjg3NSArIDEuMCkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAwLjg3NTsKKyAgICAgICAgcV9yZW0gPSAzOworICAgIH0KKyAgICBlbHNlIGlmIChRc3RlcCA8PSAoMS4wICsgMS4xMjUpIC8gMikKKyAgICB7CisgICAgICAgIFFzdGVwID0gMS4wOworICAgICAgICBxX3JlbSA9IDQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFFzdGVwID0gMS4xMjU7CisgICAgICAgIHFfcmVtID0gNTsKKyAgICB9CisKKyAgICByZXR1cm4gKHFfcGVyICogNiArIHFfcmVtKTsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yZXNpZHVhbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmVzaWR1YWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWI5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmVzaWR1YWwuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworQVZDRW5jX1N0YXR1cyBFbmNvZGVJbnRyYVBDTShBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZUlPICAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICBpbnQgeF9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeCA8PCA0KTsKKyAgICBpbnQgeV9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeSA8PCA0KTsKKyAgICBpbnQgb3JnUGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGludCBvZmZzZXQxID0geV9wb3NpdGlvbiAqIG9yZ1BpdGNoICsgeF9wb3NpdGlvbjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgb2Zmc2V0OworICAgIHVpbnQ4ICpwRHN0LCAqcFNyYzsKKyAgICB1aW50IGNvZGU7CisKKyAgICB1ZV92KHN0cmVhbSwgMjUpOworCisgICAgaSA9IHN0cmVhbS0+Yml0X2xlZnQgJiAweDc7CisgICAgaWYgKGkpIC8qIG5vdCBieXRlLWFsaWduZWQgKi8KKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDAsIGkpOworICAgIH0KKworICAgIHBTcmMgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0MTsKKyAgICBwRHN0ID0gdmlkZW8tPmN1cnJQaWMtPlNsICsgb2Zmc2V0MTsKKyAgICBvZmZzZXQgPSB2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMIC0gMTY7CisKKyAgICAvKiBhdCB0aGlzIHBvaW50IGJpdHN0cmVhbSBpcyBieXRlLWFsaWduZWQgKi8KKyAgICBqID0gMTY7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyNpZiAoV09SRF9TSVpFPT0zMikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSA0OworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMzIsIGNvZGUpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDI7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgY29kZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwRHN0ICs9IG9mZnNldDsKKyAgICAgICAgcFNyYyArPSBvZmZzZXQ7CisgICAgICAgIGotLTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIGNoZWNrIG9ubHkgb25jZSBwZXIgbGluZSAqLworICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgcERzdCA9IHZpZGVvLT5jdXJyUGljLT5TY2IgKyAoKG9mZnNldDEgKyB4X3Bvc2l0aW9uKSA+PiAyKTsKKyAgICBwU3JjID0gY3VycklucHV0LT5ZQ2JDclsxXSArICgob2Zmc2V0MSArIHhfcG9zaXRpb24pID4+IDIpOworICAgIG9mZnNldCA+Pj0gMTsKKworICAgIGogPSA4OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisjaWYgKFdPUkRfU0laRT09MzIpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gNDsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMyLCBjb2RlKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSAyOworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTYsIGNvZGUpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcERzdCArPSBvZmZzZXQ7CisgICAgICAgIHBTcmMgKz0gb2Zmc2V0OworICAgICAgICBqLS07CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIGNoZWNrIG9ubHkgb25jZSBwZXIgbGluZSAqLworICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgcERzdCA9IHZpZGVvLT5jdXJyUGljLT5TY3IgKyAoKG9mZnNldDEgKyB4X3Bvc2l0aW9uKSA+PiAyKTsKKyAgICBwU3JjID0gY3VycklucHV0LT5ZQ2JDclsyXSArICgob2Zmc2V0MSArIHhfcG9zaXRpb24pID4+IDIpOworCisgICAgaiA9IDg7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyNpZiAoV09SRF9TSVpFPT0zMikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSA0OworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMzIsIGNvZGUpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDI7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgY29kZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwRHN0ICs9IG9mZnNldDsKKyAgICAgICAgcFNyYyArPSBvZmZzZXQ7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK0FWQ0VuY19TdGF0dXMgZW5jX3Jlc2lkdWFsX2Jsb2NrKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNSZXNpZHVhbFR5cGUgdHlwZSwgaW50IGNpbmR4LCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IGksIG1heE51bUNvZWZmLCBuQzsKKyAgICBpbnQgY2RjID0gMCwgY2FjID0gMDsKKyAgICBpbnQgVHJhaWxpbmdPbmVzOworICAgIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisgICAgdWludCB0cmFpbGluZ19vbmVzX3NpZ25fZmxhZzsKKyAgICBpbnQgemVyb3NMZWZ0OworICAgIGludCAqbGV2ZWwsICpydW47CisgICAgaW50IFRvdGFsQ29lZmY7CisgICAgY29uc3Qgc3RhdGljIGludCBpbmNWbGNbXSA9IHswLCAzLCA2LCAxMiwgMjQsIDQ4LCAzMjc2OH07ICAvLyBtYXhpbXVtIHZsYyA9IDYKKyAgICBpbnQgZXNjYXBlLCBudW1QcmVmaXgsIHN1Zm1hc2ssIHN1ZmZpeCwgc2hpZnQsIHNpZ24sIHZhbHVlLCBhYnN2YWx1ZSwgdmxjbnVtLCBsZXZlbF90d29fb3JfaGlnaGVyOworICAgIGludCBiaW5keCA9IGJsa0lkeDJibGtYWVtjaW5keD4+Ml1bY2luZHgmM10gOyAvLyByYXN0ZXIgc2NhbiBpbmRleAorCisgICAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBBVkNfTHVtYToKKyAgICAgICAgICAgIG1heE51bUNvZWZmID0gMTY7CisgICAgICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbY2luZHhdOworICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5bY2luZHhdOworICAgICAgICAgICAgVG90YWxDb2VmZiA9IGN1cnJNQi0+bnpfY29lZmZbYmluZHhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDX0ludHJhMTZEQzoKKyAgICAgICAgICAgIG1heE51bUNvZWZmID0gMTY7CisgICAgICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxkYzsKKyAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuZGM7CisgICAgICAgICAgICBUb3RhbENvZWZmID0gY2luZHg7IC8qIHNwZWNpYWwgY2FzZSAqLworICAgICAgICAgICAgYmluZHggPSAwOworICAgICAgICAgICAgY2luZHggPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDX0ludHJhMTZBQzoKKyAgICAgICAgICAgIG1heE51bUNvZWZmID0gMTU7CisgICAgICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbY2luZHhdOworICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5bY2luZHhdOworICAgICAgICAgICAgVG90YWxDb2VmZiA9IGN1cnJNQi0+bnpfY29lZmZbYmluZHhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDX0Nocm9tYURDOiAgLyogaG93IHRvIGRpZmZlcmVudGlhdGUgQ2IgZnJvbSBDciAqLworICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSA0OworICAgICAgICAgICAgY2RjID0gMTsKKyAgICAgICAgICAgIGlmIChjaW5keCA+PSA4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGNkYyArIDQ7CisgICAgICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5jZGMgKyA0OworICAgICAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjaW5keCAtIDg7ICAvKiBzcGVjaWFsIGNhc2UgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxjZGM7CisgICAgICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5jZGM7CisgICAgICAgICAgICAgICAgVG90YWxDb2VmZiA9IGNpbmR4OyAgLyogc3BlY2lhbCBjYXNlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfQ2hyb21hQUM6CisgICAgICAgICAgICBtYXhOdW1Db2VmZiA9IDE1OworICAgICAgICAgICAgY2FjID0gMTsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtjaW5keF07CisgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bltjaW5keF07CisgICAgICAgICAgICBjaW5keCAtPSAxNjsKKyAgICAgICAgICAgIGJpbmR4ID0gMTYgKyBibGtJZHgyYmxrWFlbY2luZHg+PjJdW2NpbmR4JjNdOworICAgICAgICAgICAgY2luZHggKz0gMTY7CisgICAgICAgICAgICBUb3RhbENvZWZmID0gY3Vyck1CLT5uel9jb2VmZltiaW5keF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICB9CisKKworICAgIC8qIGZpbmQgVHJhaWxpbmdPbmVzICovCisgICAgVHJhaWxpbmdPbmVzID0gMDsKKyAgICB6ZXJvc0xlZnQgPSAwOworICAgIGkgPSBUb3RhbENvZWZmIC0gMTsKKyAgICBuQyA9IDE7CisgICAgd2hpbGUgKGkgPj0gMCkKKyAgICB7CisgICAgICAgIHplcm9zTGVmdCArPSBydW5baV07CisgICAgICAgIGlmIChuQyAmJiAobGV2ZWxbaV0gPT0gMSB8fCBsZXZlbFtpXSA9PSAtMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYWlsaW5nT25lcysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbkMgPSAwOworICAgICAgICB9CisgICAgICAgIGktLTsKKyAgICB9CisgICAgaWYgKFRyYWlsaW5nT25lcyA+IDMpCisgICAgeworICAgICAgICBUcmFpbGluZ09uZXMgPSAzOyAvKiBjbGlwIGl0ICovCisgICAgfQorCisgICAgaWYgKCFjZGMpCisgICAgeworICAgICAgICBpZiAoIWNhYykgIC8qIG5vdCBjaHJvbWEgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbkMgPSBwcmVkaWN0X25ueih2aWRlbywgYmluZHggJiAzLCBiaW5keCA+PiAyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGNocm9tYSBhYyBidXQgbm90IGNocm9tYSBkYyAqLworICAgICAgICB7CisgICAgICAgICAgICBuQyA9IHByZWRpY3Rfbm56X2Nocm9tYSh2aWRlbywgYmluZHggJiAzLCBiaW5keCA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXMoc3RyZWFtLCBUcmFpbGluZ09uZXMsIFRvdGFsQ29lZmYsIG5DKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbkMgPSAtMTsgLyogQ2hyb21hIERDIGxldmVsICovCisgICAgICAgIHN0YXR1cyA9IGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXNDaHJvbWFEQyhzdHJlYW0sIFRyYWlsaW5nT25lcywgVG90YWxDb2VmZik7CisgICAgfQorCisgICAgLyogVGhpcyBwYXJ0IGlzIGRvbmUgcXVpdGUgZGlmZmVyZW50bHkgaW4gUmVhZENvZWY0eDRfQ0FWTEMoKSAqLworICAgIGlmIChUb3RhbENvZWZmID4gMCkKKyAgICB7CisKKyAgICAgICAgaSA9IFRvdGFsQ29lZmYgLSAxOworCisgICAgICAgIGlmIChUcmFpbGluZ09uZXMpIC8qIGtlZXAgcmVhZGluZyB0aGUgc2lnbiBvZiB0aG9zZSB0cmFpbGluZyBvbmVzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG5DID0gVHJhaWxpbmdPbmVzOworICAgICAgICAgICAgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcgPSAwOworICAgICAgICAgICAgd2hpbGUgKG5DKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnIDw8PSAxOworICAgICAgICAgICAgICAgIHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnIHw9ICgodWludDMyKWxldmVsW2ktLV0gPj4gMzEpOyAvKiAwIG9yIHBvc2l0aXZlLCAxIGZvciBuZWdhdGl2ZSAqLworICAgICAgICAgICAgICAgIG5DLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGluc3RlYWQgb2Ygd3JpdGluZyBvbmUgYml0IGF0IGEgdGltZSwgcmVhZCB0aGUgd2hvbGUgdGhpbmcgYXQgb25jZSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgVHJhaWxpbmdPbmVzLCB0cmFpbGluZ19vbmVzX3NpZ25fZmxhZyk7CisgICAgICAgIH0KKworICAgICAgICBsZXZlbF90d29fb3JfaGlnaGVyID0gMTsKKyAgICAgICAgaWYgKFRvdGFsQ29lZmYgPiAzICYmIFRyYWlsaW5nT25lcyA9PSAzKQorICAgICAgICB7CisgICAgICAgICAgICBsZXZlbF90d29fb3JfaGlnaGVyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUb3RhbENvZWZmID4gMTAgJiYgVHJhaWxpbmdPbmVzIDwgMykKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZsY251bSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiB0aGVuIGRvIHRoaXMgVG90YWxDb2VmZi1UcmFpbGluZ09uZXMgdGltZXMgKi8KKyAgICAgICAgZm9yIChpID0gVG90YWxDb2VmZiAtIFRyYWlsaW5nT25lcyAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB2YWx1ZSA9IGxldmVsW2ldOworICAgICAgICAgICAgYWJzdmFsdWUgPSAodmFsdWUgPj0gMCkgPyB2YWx1ZSA6IC12YWx1ZTsKKworICAgICAgICAgICAgaWYgKGxldmVsX3R3b19vcl9oaWdoZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gMCkgdmFsdWUtLTsKKyAgICAgICAgICAgICAgICBlbHNlICAgIHZhbHVlKys7CisgICAgICAgICAgICAgICAgbGV2ZWxfdHdvX29yX2hpZ2hlciA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgICAgIHZhbHVlID0gLXZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmxjbnVtID09IDApIC8vIFZMQzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgdmFsdWUgKiAyICsgc2lnbiAtIDEsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA8IDggKyA4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTQgKyAxICsgNCwgKDEgPDwgNCkgfCAoKHZhbHVlIC0gOCkgPDwgMSkgfCBzaWduKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTQgKyAyICsgMTIsICgxIDw8IDEyKSB8ICgodmFsdWUgLSAxNikgPDwgMSkgfCBzaWduKSA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgLy8gVkxDTgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoaWZ0ID0gdmxjbnVtIC0gMTsKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSAoMTUgPDwgc2hpZnQpICsgMTsKKyAgICAgICAgICAgICAgICBudW1QcmVmaXggPSAodmFsdWUgLSAxKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICBzdWZtYXNrID0gfigoMHhmZmZmZmZmZikgPDwgc2hpZnQpOworICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICh2YWx1ZSAtIDEpICYgc3VmbWFzazsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBlc2NhcGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBudW1QcmVmaXggKyB2bGNudW0gKyAxLCAoMSA8PCAoc2hpZnQgKyAxKSkgfCAoc3VmZml4IDw8IDEpIHwgc2lnbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDI4LCAoMSA8PCAxMikgfCAoKHZhbHVlIC0gZXNjYXBlKSA8PCAxKSB8IHNpZ24pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWJzdmFsdWUgPiBpbmNWbGNbdmxjbnVtXSkKKyAgICAgICAgICAgICAgICB2bGNudW0rKzsKKworICAgICAgICAgICAgaWYgKGkgPT0gVG90YWxDb2VmZiAtIFRyYWlsaW5nT25lcyAtIDEgJiYgYWJzdmFsdWUgPiAzKQorICAgICAgICAgICAgICAgIHZsY251bSA9IDI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogb2NjYXNpb25hbGx5IGNoZWNrIHRoZSBiaXRzdHJlYW0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoVG90YWxDb2VmZiA8IG1heE51bUNvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNkYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZV9Ub3RhbFplcm9zKHN0cmVhbSwgemVyb3NMZWZ0LCBUb3RhbENvZWZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZV9Ub3RhbFplcm9zQ2hyb21hREMoc3RyZWFtLCB6ZXJvc0xlZnQsIFRvdGFsQ29lZmYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb3NMZWZ0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGkgPSBUb3RhbENvZWZmIC0gMTsKKyAgICAgICAgd2hpbGUgKGkgPiAwKSAvKiBkb24ndCBkbyB0aGUgbGFzdCBvbmUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHplcm9zTGVmdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2VfUnVuQmVmb3JlKHN0cmVhbSwgcnVuW2ldLCB6ZXJvc0xlZnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6ZXJvc0xlZnQgPSB6ZXJvc0xlZnQgLSBydW5baV07CisgICAgICAgICAgICBpLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTdhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZC5jcHAKQEAgLTAsMCArMSwyOTAgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhZF9pbmxpbmUuaCIKKworI2RlZmluZSBDYWNoZWRfbHggMTc2CisKKyNpZmRlZiBfU0FEX1NUQVQKK3VpbnQzMiBudW1fc2FkX01CID0gMDsKK3VpbnQzMiBudW1fc2FkX0JsayA9IDA7Cit1aW50MzIgbnVtX3NhZF9NQl9jYWxsID0gMDsKK3VpbnQzMiBudW1fc2FkX0Jsa19jYWxsID0gMDsKKworI2RlZmluZSBOVU1fU0FEX01CX0NBTEwoKSAgICAgICBudW1fc2FkX01CX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX01CKCkgICAgICAgICAgICBudW1fc2FkX01CKysKKyNkZWZpbmUgTlVNX1NBRF9CTEtfQ0FMTCgpICAgICAgbnVtX3NhZF9CbGtfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfQkxLKCkgICAgICAgICAgIG51bV9zYWRfQmxrKysKKworI2Vsc2UKKworI2RlZmluZSBOVU1fU0FEX01CX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX01CKCkKKyNkZWZpbmUgTlVNX1NBRF9CTEtfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfQkxLKCkKKworI2VuZGlmCisKKworLyogY29uc2lzdCBvZgoraW50IEFWQ1NBRF9NYWNyb2Jsb2NrX0ModWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCBseCx2b2lkICpleHRyYV9pbmZvKQoraW50IEFWQ1NBRF9NQl9IVEZNX0NvbGxlY3QodWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCBseCx2b2lkICpleHRyYV9pbmZvKQoraW50IEFWQ1NBRF9NQl9IVEZNKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKKyovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBTQURfTWFjcm9ibG9jaworICAgIERhdGU6ICAgICAgIDA5LzA3LzIwMDAKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIFNBRCAxNngxNiBiZXR3ZWVuIGJsayBhbmQgcmVmLgorICAgIFRvIGRvOiAgICAgIFVuaWZvcm0gc3Vic2FtcGxpbmcgd2lsbCBiZSBpbnNlcnRlZCBsYXRlciEKKyAgICAgICAgICAgICAgICBIeXBvdGhlc2lzIFRlc3RpbmcgRmFzdCBNYXRjaGluZyB0byBiZSB1c2VkIGxhdGVyIQorICAgIENoYW5nZXM6CisgICAgMTEvNy8wMDogICAgaW1wbGVtZW50ZWQgTU1YCisgICAgMS8yNC8wMTogICAgaW1wbGVtZW50ZWQgU1NFCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqKioqKioqKiogQyAqKioqKioqKioqKiovCitpbnQgQVZDU0FEX01hY3JvYmxvY2tfQyh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICAodm9pZCkoZXh0cmFfaW5mbyk7CisKKyAgICBpbnQzMiB4MTA7CisgICAgaW50IGRtaW4gPSAodWludDMyKWRtaW5fbHggPj4gMTY7CisgICAgaW50IGx4ID0gZG1pbl9seCAmIDB4RkZGRjsKKworICAgIE5VTV9TQURfTUJfQ0FMTCgpOworCisgICAgeDEwID0gc2ltZF9zYWRfbWIocmVmLCBibGssIGRtaW4sIGx4KTsKKworICAgIHJldHVybiB4MTA7Cit9CisKKyNpZmRlZiBIVEZNICAgLyogSFRGTSB3aXRoIHVuaWZvcm0gc3Vic2FtcGxpbmcgaW1wbGVtZW50YXRpb24gMi8yOC8wMSAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBBVkNBVkNTQURfTUJfSFRGTV9Db2xsZWN0IGFuZCBBVkNTQURfTUJfSFRGTQorICAgIERhdGU6ICAgICAgIDMvMi8xCisgICAgUHVycG9zZTogICAgQ29tcHV0ZSB0aGUgU0FEIG9uIGEgMTZ4MTYgYmxvY2sgdXNpbmcKKyAgICAgICAgICAgICAgICB1bmlmb3JtIHN1YnNhbXBsaW5nIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmcgZmFzdCBtYXRjaGluZworICAgICAgICAgICAgICAgIGZvciBlYXJseSBkcm9wb3V0LiBTQURfTUJfSFBfSFRGTV9Db2xsZWN0IGlzIHRvIGNvbGxlY3QKKyAgICAgICAgICAgICAgICB0aGUgc3RhdGlzdGljcyB0byBjb21wdXRlIHRoZSB0aHJlc2hvbGRzIHRvIGJlIHVzZWQgaW4KKyAgICAgICAgICAgICAgICBTQURfTUJfSFBfSFRGTS4KKyAgICBJbnB1dC9PdXRwdXQ6CisgICAgQ2hhbmdlczoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IEFWQ0FWQ1NBRF9NQl9IVEZNX0NvbGxlY3QodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGk7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxOworICAgIGludCBseDQgPSAoZG1pbl9seCA8PCAyKSAmIDB4M0ZGRkM7CisgICAgdWludDMyIGN1cl93b3JkOworICAgIGludCBzYWRkYXRhWzE2XSwgdG1wLCB0bXAyOyAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgaW50IGRpZm1hZDsKKyAgICBpbnQgbWFkc3RhcjsKKyAgICBIVEZNX1N0YXQgKmh0Zm1fc3RhdCA9IChIVEZNX1N0YXQqKSBleHRyYV9pbmZvOworICAgIGludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgdWludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICBpbnQgKm9mZnNldFJlZiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9seCA+PiAyMDsKKworICAgIE5VTV9TQURfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIE5VTV9TQURfTUIoKTsKKworICAgICAgICBzYWRkYXRhW2ldID0gc2FkOworCisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCh1aW50MzIpc2FkID4gKCh1aW50MzIpZG1pbl9seCA+PiAxNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IVEZNKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMTsKKworICAgIGludCBpOworICAgIGludCB0bXAsIHRtcDI7CisgICAgaW50IGx4NCA9IChkbWluX2x4IDw8IDIpICYgMHgzRkZGQzsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gKGludCopIGV4dHJhX2luZm8gKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX2x4ID4+IDIwOworCisgICAgTlVNX1NBRF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgTlVNX1NBRF9NQigpOworCisgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgaWYgKCgodWludDMyKXNhZCA8PSAoKHVpbnQzMilkbWluX2x4ID4+IDE2KSkgJiYgKHNhZCA8PSAoc2Fkc3RhciAtICpucm1sel90aCsrKSkpCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICB9CisKKyAgICByZXR1cm4gc2FkOworfQorI2VuZGlmIC8qIEhURk0gKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjIxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwCkBAIC0wLDAgKzEsNjI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyogY29udGFpbnMKK2ludCBBVkNIYWxmUGVsMV9TQURfTUIodWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgaWgsaW50IGpoKQoraW50IEFWQ0hhbGZQZWwyX1NBRF9NQih1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoKQoraW50IEFWQ0hhbGZQZWwxX1NBRF9CbGsodWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgaWgsaW50IGpoKQoraW50IEFWQ0hhbGZQZWwyX1NBRF9CbGsodWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCkKKworaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0ModWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgcngsaW50IHhoLGludCB5aCx2b2lkICpleHRyYV9pbmZvKQoraW50IEFWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3QodWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgcngsaW50IHhoLGludCB5aCx2b2lkICpleHRyYV9pbmZvKQoraW50IEFWQ1NBRF9NQl9IUF9IVEZNKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IHJ4LGludCB4aCxpbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKK2ludCBBVkNTQURfQmxrX0hhbGZQZWxfQyh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCByeCxpbnQgeGgsaW50IHloLHZvaWQgKmV4dHJhX2luZm8pCisqLworCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgInNhZF9oYWxmcGVsX2lubGluZS5oIgorCisjaWZkZWYgX1NBRF9TVEFUCit1aW50MzIgbnVtX3NhZF9IUF9NQiA9IDA7Cit1aW50MzIgbnVtX3NhZF9IUF9CbGsgPSAwOwordWludDMyIG51bV9zYWRfSFBfTUJfY2FsbCA9IDA7Cit1aW50MzIgbnVtX3NhZF9IUF9CbGtfY2FsbCA9IDA7CisjZGVmaW5lIE5VTV9TQURfSFBfTUJfQ0FMTCgpICAgIG51bV9zYWRfSFBfTUJfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfSFBfTUIoKSAgICAgICAgIG51bV9zYWRfSFBfTUIrKworI2RlZmluZSBOVU1fU0FEX0hQX0JMS19DQUxMKCkgICBudW1fc2FkX0hQX0Jsa19jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEsoKSAgICAgICAgbnVtX3NhZF9IUF9CbGsrKworI2Vsc2UKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQl9DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQigpCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX0hQX0JMSygpCisjZW5kaWYKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgU0FEX01CX0hhbGZQZWwKKyAgICBEYXRlOiAgICAgICAwOS8xNy8yMDAwCisgICAgUHVycG9zZTogICAgQ29tcHV0ZSB0aGUgU0FEIG9uIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uCisgICAgSW5wdXQvT3V0cHV0OiAgIGhtZW0gaXMgYXNzdW1lZCB0byBiZSBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nCisgICAgICAgICAgICAgICAgcG9pbnQgb2YgdGhlIHNlYXJjaCBpbiB0aGUgMzN4MzMgbWF0cml4IHNlYXJjaCByZWdpb24KKyAgICBDaGFuZ2VzOgorICAgIDExLzcvMDA6ICAgIGltcGxlbWVudGVkIE1NWAorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBBVkNTQURfTUJfSGFsZlBlbF9DCisgICAgRGF0ZTogICAgICAgMDQvMzAvMjAwMQorICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYgaW4gaGFsZnBlbAorICAgICAgICAgICAgICAgIHJlc29sdXRpb24sCisgICAgQ2hhbmdlczoKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIE9uZSBjb21wb25lbnQgaXMgaGFsZi1wZWwgKi8KK2ludCBBVkNTQURfTUJfSGFsZlBlbF9DeGh5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICAodm9pZCkoZXh0cmFfaW5mbyk7CisKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqa2ssICpwMSwgKnAyLCAqcDMsICpwNDsKKy8vICBpbnQgc3VtcmVmPTA7CisgICAgaW50IHRlbXA7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgcDEgPSByZWY7CisgICAgcDIgPSByZWYgKyAxOworICAgIHAzID0gcmVmICsgcng7CisgICAgcDQgPSByZWYgKyByeCArIDE7CisgICAga2sgID0gYmxrOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworCisgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAyW2pdICsgcDNbal0gKyBwNFtqXSArIDIpID4+IDIpIC0gKmtrKys7CisgICAgICAgICAgICBzYWQgKz0gQVZDX0FCUyh0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBpZiAoc2FkID4gKGludCkoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHJldHVybiBzYWQ7CisKKyAgICAgICAgcDEgKz0gcng7CisgICAgICAgIHAzICs9IHJ4OworICAgICAgICBwMiArPSByeDsKKyAgICAgICAgcDQgKz0gcng7CisgICAgfQorICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSGFsZlBlbF9DeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgKHZvaWQpKGV4dHJhX2luZm8pOworCisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKmtrLCAqcDEsICpwMjsKKy8vICBpbnQgc3VtcmVmPTA7CisgICAgaW50IHRlbXA7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgcDEgPSByZWY7CisgICAgcDIgPSByZWYgKyByeDsgLyogZWl0aGVyIGxlZnQvcmlnaHQgb3IgdG9wL2JvdHRvbSBwaXhlbCAqLworICAgIGtrICA9IGJsazsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMltqXSArIDEpID4+IDEpIC0gKmtrKys7CisgICAgICAgICAgICBzYWQgKz0gQVZDX0FCUyh0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBpZiAoc2FkID4gKGludCkoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgIHAxICs9IHJ4OworICAgICAgICBwMiArPSByeDsKKyAgICB9CisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N4aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICAodm9pZCkoZXh0cmFfaW5mbyk7CisKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqa2ssICpwMTsKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBwMSA9IHJlZjsKKyAgICBrayAgPSBibGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDFbaisxXSArIDEpID4+IDEpIC0gKmtrKys7CisgICAgICAgICAgICBzYWQgKz0gQVZDX0FCUyh0ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBpZiAoc2FkID4gKGludCkoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgIHAxICs9IHJ4OworICAgIH0KKyAgICByZXR1cm4gc2FkOworfQorCisjaWZkZWYgSFRGTSAgLyogSFRGTSB3aXRoIHVuaWZvcm0gc3Vic2FtcGxpbmcgaW1wbGVtZW50YXRpb24sICAyLzI4LzAxICovCisKKy8vQ2hlY2hlY2sgaGVyZQoraW50IEFWQ0FWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMSwgKnAyOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZGRhdGFbMTZdOyAgICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICBpbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgaW50IG1hZHN0YXI7CisgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKmFic19kaWZfbWFkX2F2ZyA9ICYoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpOworICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgaW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisKKyAgICAgICAgaiA9IDQ7LyogNCBsaW5lcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl0gKyBwMlsxMl07CisgICAgICAgICAgICB0bXAyID0gcDFbMTNdICsgcDJbMTNdOworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF0gKyBwMls4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs5XSArIHAyWzldOworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF0gKyBwMls0XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs1XSArIHAyWzVdOworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAyID0gcDFbMV0gKyBwMlsxXTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdICsgcDJbMF07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgKCpjb3VudGJyZWFrKSsrOworCisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ0FWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqcDEsICpwMjsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgaW50IGRpZm1hZCwgdG1wLCB0bXAyOworICAgIGludCBtYWRzdGFyOworICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgaW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICBVSW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgIGludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgcDIgPSBwMSArIHJ4OworICAgICAgICBqID0gNDsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAyWzEyXTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gcDJbOF07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IHAyWzRdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wMiA9IHAyWzBdOworICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgKCpjb3VudGJyZWFrKSsrOworCisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ0FWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqcDE7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgIGludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICBpbnQgbWFkc3RhcjsKKyAgICBIVEZNX1N0YXQgKmh0Zm1fc3RhdCA9IChIVEZNX1N0YXQqKSBleHRyYV9pbmZvOworICAgIGludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICBpbnQgKm9mZnNldFJlZiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisKKyAgICAgICAgaiA9IDQ7IC8qIDQgbGluZXMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAxWzEzXTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gcDFbOV07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IHAxWzVdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgdG1wMiA9IHAxWzFdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgKCpjb3VudGJyZWFrKSsrOworICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgKCpjb3VudGJyZWFrKSsrOworCisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IUF9IVEZNeGh5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMCwgdG1wLCB0bXAyOworICAgIHVpbnQ4ICpwMSwgKnAyOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgIGludCAqbnJtbHpfdGggPSAoaW50KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKm9mZnNldFJlZiA9IG5ybWx6X3RoICsgMzI7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgcDIgPSBwMSArIHJ4OworCisgICAgICAgIGogPSA0OyAvKiA0IGxpbmVzICovCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXSArIHAyWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxM10gKyBwMlsxM107CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XSArIHAyWzhdOworICAgICAgICAgICAgdG1wMiA9IHAxWzldICsgcDJbOV07CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XSArIHAyWzRdOworICAgICAgICAgICAgdG1wMiA9IHAxWzVdICsgcDJbNV07CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxXSArIHAyWzFdOworICAgICAgICAgICAgdG1wID0gcDFbMF0gKyBwMlswXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHAyICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2Fkc3RhciArPSBtYWRzdGFyOworICAgICAgICBpZiAoc2FkID4gc2Fkc3RhciAtIG5ybWx6X3RoW2ldIHx8IHNhZCA+ICgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gNjU1MzY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hQX0hURk15aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMCwgdG1wLCB0bXAyOworICAgIHVpbnQ4ICpwMSwgKnAyOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgIGludCAqbnJtbHpfdGggPSAoaW50KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKm9mZnNldFJlZiA9IG5ybWx6X3RoICsgMzI7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgcDIgPSBwMSArIHJ4OworICAgICAgICBqID0gNDsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAyWzEyXTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gcDJbOF07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IHAyWzRdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wMiA9IHAyWzBdOworICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSFBfSFRGTXhoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgdWludDggKnAxOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgIGludCAqbnJtbHpfdGggPSAoaW50KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKm9mZnNldFJlZiA9IG5ybWx6X3RoICsgMzI7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKworICAgICAgICBqID0gNDsvKiA0IGxpbmVzICovCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxM107CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IHAxWzldOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs1XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzYWQ7Cit9CisKKyNlbmRpZiAvKiBIVEZNICovCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjE2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKQEAgLTAsMCArMSw5NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmbmRlZiBfU0FEX0hBTEZQRUxfSU5MSU5FX0hfCisjZGVmaW5lIF9TQURfSEFMRlBFTF9JTkxJTkVfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHRtcCA9ICh0bXAyID4+IDEpIC0gdG1wOworICAgICAgICBpZiAodG1wID4gMCkgc2FkICs9IHRtcDsKKyAgICAgICAgZWxzZSBzYWQgLT0gdG1wOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMl9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgdG1wID0gKHRtcCA+PiAyKSAtIHRtcDI7CisgICAgICAgIGlmICh0bXAgPiAwKSBzYWQgKz0gdG1wOworICAgICAgICBlbHNlIHNhZCAtPSB0bXA7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzYnMgICAgdG1wLCB0bXAsIHRtcDIsIGFzciAjMSA7CisgICAgICAgICAgICByc2JtaSAgIHRtcCwgdG1wLCAjMCA7CisgICAgICAgICAgICBhZGQgICAgIHNhZCwgc2FkLCB0bXAgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAyX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICByc2JzICAgIHRtcCwgdG1wMiwgdG1wLCBhc3IgIzIgOworICAgICAgICAgICAgcnNibWkgICB0bXAsIHRtcCwgIzAgOworICAgICAgICAgICAgYWRkICAgICBzYWQsIHNhZCwgdG1wIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAxX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworX19hc21fXyB2b2xhdGlsZSgicnNicwklMSwgJTEsICUyLCBhc3IgIzFcblx0cnNibWkgJTEsICUxLCAjMFxuXHRhZGQgICUwLCAlMCwgJTEiOiAiPXIiKHNhZCksICI9ciIodG1wKTogInIiKHRtcDIpKTsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDJfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CitfX2FzbV9fIHZvbGF0aWxlKCJyc2JzCSUxLCAlMiwgJTEsIGFzciAjMlxuXHRyc2JtaSAlMSwgJTEsICMwXG5cdGFkZAklMCwgJTAsICUxIjogIj1yIihzYWQpLCAiPXIiKHRtcCk6ICJyIih0bXAyKSk7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy9fU0FEX0hBTEZQRUxfSU5MSU5FX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2lubGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTc5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2lubGluZS5oCkBAIC0wLDAgKzEsNDg4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfU0FEX0lOTElORV9IXworI2RlZmluZSBfU0FEX0lOTElORV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHRtcCA9IHRtcCAtIHRtcDI7CisgICAgICAgIGlmICh0bXAgPiAwKSBzYWQgKz0gdG1wOworICAgICAgICBlbHNlIHNhZCAtPSB0bXA7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworICAgICAgICB4NyA9IHNyYzIgXiBzcmMxOyAgICAgICAvKiBjaGVjayBvZGQvZXZlbiBjb21iaW5hdGlvbiAqLworICAgICAgICBpZiAoKHVpbnQzMilzcmMyID49ICh1aW50MzIpc3JjMSkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjMSA9IHNyYzIgLSBzcmMxOyAgICAgLyogc3VicyAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3JjMSA9IHNyYzEgLSBzcmMyOworICAgICAgICB9CisgICAgICAgIHg3ID0geDcgXiBzcmMxOyAgICAgLyogb25seSBvZGQgYnl0ZXMgbmVlZCB0byBhZGQgY2FycnkgKi8KKyAgICAgICAgeDcgPSBtYXNrICYgKCh1aW50MzIpeDcgPj4gMSk7CisgICAgICAgIHg3ID0gKHg3IDw8IDgpIC0geDc7CisgICAgICAgIHNyYzEgPSBzcmMxICsgKHg3ID4+IDcpOyAvKiBhZGQgMHhGRiB0byB0aGUgbmVnYXRpdmUgYnl0ZSwgYWRkIGJhY2sgY2FycnkgKi8KKyAgICAgICAgc3JjMSA9IHNyYzEgXih4NyA+PiA3KTsgICAvKiB0YWtlIGFic29sdXRlIHZhbHVlIG9mIG5lZ2F0aXZlIGJ5dGUgKi8KKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyNkZWZpbmUgTlVNQkVSIDMKKyNkZWZpbmUgU0hJRlQgMjQKKworI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMgorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDE2CisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAxCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgOAorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworCisgICAgX19pbmxpbmUgaW50MzIgc2ltZF9zYWRfbWIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW4sIGludCBseCkKKyAgICB7CisgICAgICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisKKyAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgaWYgKHg4ID09IDMpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgaWYgKHg4ID09IDIpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgaWYgKHg4ID09IDEpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MTsKKworLy8gIHg1ID0gKHg0PDw4KS14NDsgLyogeDUgPSB4NCoyNTU7ICovCisgICAgICAgIHg0ID0geDUgPSAwOworCisgICAgICAgIHg2ID0gMHhGRkZGMDBGRjsKKworICAgICAgICByZWYgLT0gbHg7CisgICAgICAgIGJsayAtPSAxNjsKKworICAgICAgICB4OCA9IDE2OworCitMT09QX1NBRDA6CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArPSBseCkpOworICAgICAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyA0KSk7CisgICAgICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArPSAxNikpOworICAgICAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyA0KSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7CisgICAgICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDEyKSk7CisgICAgICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArIDgpKTsKKyAgICAgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgMTIpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgICAgICBpZiAoKGludCkoKHVpbnQzMil4MTAgPj4gMTYpIDw9IGRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgtLXg4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gTE9PUF9TQUQwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKKworU2FkTUJPZmZzZXQzOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MyhyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDI6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQyKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MToKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDEocmVmLCBibGssIGx4LCBkbWluKTsKKworICAgIH0KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisgICAgX19pbmxpbmUgaW50MzIgU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzYnMgICAgdG1wLCB0bXAsIHRtcDIgOworICAgICAgICAgICAgcnNibWkgICB0bXAsIHRtcCwgIzAgOworICAgICAgICAgICAgYWRkICAgICBzYWQsIHNhZCwgdG1wIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbChpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgRU9SICAgICB4Nywgc3JjMiwgc3JjMTsgICAgIC8qIGNoZWNrIG9kZC9ldmVuIGNvbWJpbmF0aW9uICovCisgICAgICAgICAgICBTVUJTICAgIHNyYzEsIHNyYzIsIHNyYzE7CisgICAgICAgICAgICBFT1IgICAgIHg3LCB4Nywgc3JjMTsKKyAgICAgICAgICAgIEFORCAgICAgeDcsIG1hc2ssIHg3LCBsc3IgIzE7CisgICAgICAgICAgICBPUlJDQyAgIHg3LCB4NywgIzB4ODAwMDAwMDA7CisgICAgICAgICAgICBSU0IgICAgIHg3LCB4NywgeDcsIGxzbCAjODsKKyAgICAgICAgICAgIEFERCAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgICAvKiBhZGQgMHhGRiB0byB0aGUgbmVnYXRpdmUgYnl0ZSwgYWRkIGJhY2sgY2FycnkgKi8KKyAgICAgICAgICAgIEVPUiAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgICAvKiB0YWtlIGFic29sdXRlIHZhbHVlIG9mIG5lZ2F0aXZlIGJ5dGUgKi8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWxOKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBFT1IgICAgICB4Nywgc3JjMiwgc3JjMTsgICAgICAgIC8qIGNoZWNrIG9kZC9ldmVuIGNvbWJpbmF0aW9uICovCisgICAgICAgICAgICBBRERTICAgICBzcmMxLCBzcmMyLCBzcmMxOworICAgICAgICAgICAgRU9SICAgICAgeDcsIHg3LCBzcmMxOyAgICAgIC8qIG9ubHkgb2RkIGJ5dGVzIG5lZWQgdG8gYWRkIGNhcnJ5ICovCisgICAgICAgICAgICBBTkRTICAgICB4NywgbWFzaywgeDcsIHJyeDsKKyAgICAgICAgICAgIFJTQiAgICAgIHg3LCB4NywgeDcsIGxzbCAjODsKKyAgICAgICAgICAgIFNVQiAgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7ICAvKiBhZGQgMHhGRiB0byB0aGUgbmVnYXRpdmUgYnl0ZSwgYWRkIGJhY2sgY2FycnkgKi8KKyAgICAgICAgICAgIEVPUiAgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7IC8qIHRha2UgYWJzb2x1dGUgdmFsdWUgb2YgbmVnYXRpdmUgYnl0ZSAqLworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisjZGVmaW5lIHN1bV9hY2N1bXVsYXRlICBfX2FzbXsgICAgICBTQkMgICAgICB4NSwgeDUsIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovIFwKKyAgICAgICAgQklDICAgICAgeDEwLCB4NiwgeDEwOyAgIC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8gXAorICAgICAgICBBREQgICAgICB4NCwgeDQsIHgxMCxsc3IgIzg7ICAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovIFwKKyAgICAgICAgU0JDICAgICAgeDUsIHg1LCB4MTE7ICAgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovIFwKKyAgICAgICAgQklDICAgICAgeDExLCB4NiwgeDExOyAgIC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8gXAorICAgICAgICBBREQgICAgICB4NCwgeDQsIHgxMSxsc3IgIzg7IH0gLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MTAwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbiwgaW50IGx4KQorICAgIHsKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgTU9WUyAgICB4OCwgcmVmLCBsc2wgIzMxIDsKKyAgICAgICAgICAgIEJISSAgICAgU2FkTUJPZmZzZXQzOworICAgICAgICAgICAgQkNTICAgICBTYWRNQk9mZnNldDI7CisgICAgICAgICAgICBCTUkgICAgIFNhZE1CT2Zmc2V0MTsKKworICAgICAgICAgICAgTVZOICAgICB4NiwgIzB4RkYwMDsKKyAgICAgICAgfQorTE9PUF9TQUQwOgorICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDEyKSk7CisgICAgICAgIHgxMCA9ICooKGludDMyKikocmVmICsgOCkpOworICAgICAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisgICAgICAgIHgxMiA9ICooKGludDMyKikoYmxrICsgOCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgICAgIExEUiAgICAgeDExLCBbcmVmLCAjNF07CisgICAgICAgICAgICBMRFIgICAgIHgxMCwgW3JlZl0sIGx4IDsKKyAgICAgICAgICAgIExEUiAgICAgeDE0LCBbYmxrLCAjNF07CisgICAgICAgICAgICBMRFIgICAgIHgxMiwgW2Jsa10sICMxNiA7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIFJTQlMgICAgeDExLCBkbWluLCB4MTAsIGxzciAjMTY7CisgICAgICAgICAgICBBRERMU1MgIHg4LCB4OCwgIzB4MTAwMDAwMDE7CisgICAgICAgICAgICBCTFMgICAgIExPT1BfU0FEMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworCitTYWRNQk9mZnNldDM6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQzKHJlZiwgYmxrLCBseCwgZG1pbiwgeDgpOworCitTYWRNQk9mZnNldDI6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQyKHJlZiwgYmxrLCBseCwgZG1pbiwgeDgpOworCitTYWRNQk9mZnNldDE6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQxKHJlZiwgYmxrLCBseCwgZG1pbiwgeDgpOworICAgIH0KKworCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBTVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKK19fYXNtX18gdm9sYXRpbGUoInJzYnMJJTEsICUxLCAlMlxuXHRyc2JtaSAlMSwgJTEsICMwXG5cdGFkZAklMCwgJTAsICUxIjogIj1yIihzYWQpOiAiciIodG1wKSwgInIiKHRtcDIpKTsKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworX19hc21fXyB2b2xhdGlsZSgiRU9SCSUxLCAlMiwgJTBcblx0U1VCUyAgJTAsICUyLCAlMFxuXHRFT1IJJTEsICUxLCAlMFxuXHRBTkQgICUxLCAlMywgJTEsIGxzciAjMVxuXHRPUlJDQwklMSwgJTEsICMweDgwMDAwMDAwXG5cdFJTQiAgJTEsICUxLCAlMSwgbHNsICM4XG5cdEFERCAgJTAsICUwLCAlMSwgYXNyICM3XG5cdEVPUiAgJTAsICUwLCAlMSwgYXNyICM3IjogIj1yIihzcmMxKSwgIj0mciIoeDcpOiAiciIoc3JjMiksICJyIihtYXNrKSk7CisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbE4oaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCitfX2FzbV9fIHZvbGF0aWxlKCJFT1IJJTEsICUyLCAlMFxuXHRBRERTICAlMCwgJTIsICUwXG5cdEVPUiAgJTEsICUxLCAlMFxuXHRBTkRTICAlMSwgJTMsICUxLCBycnhcblx0UlNCICAlMSwgJTEsICUxLCBsc2wgIzhcblx0U1VCCSUwLCAlMCwgJTEsIGFzciAjN1xuXHRFT1IgICAlMCwgJTAsICUxLCBhc3IgIzciOiAiPXIiKHNyYzEpLCAiPSZyIih4Nyk6ICJyIihzcmMyKSwgInIiKG1hc2spKTsKKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyNkZWZpbmUgc3VtX2FjY3VtdWxhdGUgIF9fYXNtX18gdm9sYXRpbGUoIlNCQyAgJTAsICUwLCAlMVxuXHRCSUMgICAlMSwgJTQsICUxXG5cdEFERCAgICUyLCAlMiwgJTEsIGxzciAjOFxuXHRTQkMgICAlMCwgJTAsICUzXG5cdEJJQyAgICUzLCAlNCwgJTNcblx0QUREICAgJTIsICUyLCAlMywgbHNyICM4IjogIj0mciIgKHg1KSwgIj0mciIgKHgxMCksICI9JnIiICh4NCksICI9JnIiICh4MTEpOiAiciIgKHg2KSk7CisKKyNkZWZpbmUgTlVNQkVSIDMKKyNkZWZpbmUgU0hJRlQgMjQKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKworI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMgorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDE2CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDEwMDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAxCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgOAorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworCisgICAgX19pbmxpbmUgaW50MzIgc2ltZF9zYWRfbWIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW4sIGludCBseCkKKyAgICB7CisgICAgICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgICAgIHg0ID0geDUgPSAwOworCisgICAgICAgIHg4ID0gKHVpbnQzMilyZWYgJiAweDM7CisgICAgICAgIGlmICh4OCA9PSAzKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDM7CisgICAgICAgIGlmICh4OCA9PSAyKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDI7CisgICAgICAgIGlmICh4OCA9PSAxKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDE7CisKKyAgICAgICAgeDggPSAxNjsKKy8vLworX19hc21fXyB2b2xhdGlsZSgiTVZOCSUwLCAjMHhGRjAwIjogIj1yIih4NikpOworCitMT09QX1NBRDA6CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMSA9ICooKGludDMyKikocmVmICsgMTIpKTsKKyAgICAgICAgeDEwID0gKigoaW50MzIqKShyZWYgKyA4KSk7CisgICAgICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgMTIpKTsKKyAgICAgICAgeDEyID0gKigoaW50MzIqKShibGsgKyA4KSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDQpKTsKK19fYXNtX18gdm9sYXRpbGUoIkxEUgklMCwgWyUxXSwgJTIiOiAiPSZyIih4MTApLCAiPXIiKHJlZik6ICJyIihseCkpOworICAgICAgICAvL3gxMCA9ICooKGludDMyKilyZWYpOyByZWYrPWx4OworICAgICAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDQpKTsKK19fYXNtX18gdm9sYXRpbGUoIkxEUgklMCwgWyUxXSwgIzE2IjogIj0mciIoeDEyKSwgIj1yIihibGspKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKworICAgICAgICBpZiAoKCh1aW50MzIpeDEwID4+IDE2KSA8PSBkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIExPT1BfU0FEMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7CisKK1NhZE1CT2Zmc2V0MzoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDMocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQyOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MihyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDE6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQxKHJlZiwgYmxrLCBseCwgZG1pbik7CisgICAgfQorCisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gX1NBRF9JTkxJTkVfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkNGE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyNpZiAoTlVNQkVSPT0zKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDModWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbGlmIChOVU1CRVI9PTIpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Mih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MSkKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQxKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZW5kaWYKK3sKKyAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgIC8vICB4NSA9ICh4NDw8OCkgLSB4NDsKKyAgICB4NCA9IHg1ID0gMDsKKyAgICB4NiA9IDB4RkZGRjAwRkY7CisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICByZWYgLT0gTlVNQkVSOyAvKiBiaWMgcmVmLCByZWYsICMzICovCisgICAgcmVmIC09IGx4OworICAgIGJsayAtPSAxNjsKKyAgICB4OCA9IDE2OworCisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKz0gbHgpKTsgLyogRCBDIEIgQSAqLworICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDQpKTsgICAgLyogSCBHIEYgRSAqLworICAgIHgxMiA9ICooKHVpbnQzMiopKHJlZiArIDgpKTsgICAgLyogTCBLIEogSSAqLworCisgICAgeDEwID0gKCh1aW50MzIpeDEwID4+IFNISUZUKTsgLyogMCAwIDAgRCAqLworICAgIHgxMCA9IHgxMCB8ICh4MTEgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIEcgRiBFIEQgKi8KKyAgICB4MTEgPSAoKHVpbnQzMil4MTEgPj4gU0hJRlQpOyAvKiAwIDAgMCBIICovCisgICAgeDExID0geDExIHwgKHgxMiA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogSyBKIEkgSCAqLworCisgICAgeDEyID0gKigodWludDMyKikoYmxrICs9IDE2KSk7CisgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgNCkpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDEwID0gKigodWludDMyKikocmVmICsgOCkpOyAvKiBEIEMgQiBBICovCisgICAgeDExID0gKigodWludDMyKikocmVmICsgMTIpKTsgICAvKiBIIEcgRiBFICovCisgICAgeDEyID0gKigodWludDMyKikocmVmICsgMTYpKTsgICAvKiBMIEsgSiBJICovCisKKyAgICB4MTAgPSAoKHVpbnQzMil4MTAgPj4gU0hJRlQpOyAvKiBtdm4geDEwLCB4MTAsIGxzciAjMjQgID0gMHhGRiAweEZGIDB4RkYgfkQgKi8KKyAgICB4MTAgPSB4MTAgfCAoeDExIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiBiaWMgeDEwLCB4MTAsIHgxMSwgbHNsICM4ID0gfkcgfkYgfkUgfkQgKi8KKyAgICB4MTEgPSAoKHVpbnQzMil4MTEgPj4gU0hJRlQpOyAvKiAweEZGIDB4RkYgMHhGRiB+SCAqLworICAgIHgxMSA9IHgxMSB8ICh4MTIgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIH5LIH5KIH5JIH5IICovCisKKyAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKyA4KSk7CisgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgMTIpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICB4NSA9IHg1ICsgeDEwOyAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICBpZiAoKGludCkoKHVpbnQzMil4MTAgPj4gMTYpIDw9IGRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgeworICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgeworI2lmIChOVU1CRVI9PTMpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQzOworI2VsaWYgKE5VTUJFUj09MikKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDI7CisjZWxpZiAoTlVNQkVSPT0xKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKK30KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisjaWYgKE5VTUJFUj09MykKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQzKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4sIGludDMyIHg4KQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4sIGludDMyIHg4KQorI2VsaWYgKE5VTUJFUj09MSkKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQxKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4sIGludDMyIHg4KQorI2VuZGlmCit7CisgICAgaW50MzIgeDQsIHg1LCB4NiwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgeDQgPSB4NSA9IDA7CisKKyAgICBfX2FzbXsKKyAgICAgICAgTVZOICAgICAgeDYsICMweGZmMDAwMDsKKyNpZiAoTlVNQkVSPT0zKQorTE9PUF9TQUQzOgorI2VsaWYgKE5VTUJFUj09MikKK0xPT1BfU0FEMjoKKyNlbGlmIChOVU1CRVI9PTEpCitMT09QX1NBRDE6CisjZW5kaWYKKyAgICAgICAgQklDICAgICAgcmVmLCByZWYsICMzOworICAgIH0KKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMSA9ICooKGludDMyKikocmVmICsgMTIpKTsKKyAgICB4MTIgPSAqKChpbnQzMiopKHJlZiArIDE2KSk7CisgICAgeDEwID0gKigoaW50MzIqKShyZWYgKyA4KSk7CisgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworCisgICAgX19hc217CisgICAgICAgIE1WTiAgICAgIHgxMCwgeDEwLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTAsIHgxMCwgeDExLCBsc2wgIygzMi1TSElGVCk7CisgICAgICAgIE1WTiAgICAgIHgxMSwgeDExLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTEsIHgxMSwgeDEyLCBsc2wgIygzMi1TSElGVCk7CisKKyAgICAgICAgTERSICAgICAgeDEyLCBbYmxrLCAjOF07CisgICAgfQorCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsTih4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsTih4MTAsIHgxMiwgeDkpOworCisgICAgc3VtX2FjY3VtdWxhdGU7CisKKyAgICBfX2FzbXsKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgTERSICAgICAgeDExLCBbcmVmLCAjNF07CisgICAgICAgIExEUiAgICAgIHgxMiwgW3JlZiwgIzhdOworICAgICAgICBMRFIgIHgxMCwgW3JlZl0sIGx4IDsKKyAgICAgICAgTERSICB4MTQsIFtibGssICM0XTsKKworICAgICAgICBNVk4gICAgICB4MTAsIHgxMCwgbHNyICNTSElGVDsKKyAgICAgICAgQklDICAgICAgeDEwLCB4MTAsIHgxMSwgbHNsICMoMzItU0hJRlQpOworICAgICAgICBNVk4gICAgICB4MTEsIHgxMSwgbHNyICNTSElGVDsKKyAgICAgICAgQklDICAgICAgeDExLCB4MTEsIHgxMiwgbHNsICMoMzItU0hJRlQpOworCisgICAgICAgIExEUiAgICAgIHgxMiwgW2Jsa10sICMxNjsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIF9fYXNteworICAgICAgICBSU0JTICAgICB4MTEsIGRtaW4sIHgxMCwgbHNyICMxNgorICAgICAgICBBRERMU1MgICB4OCwgeDgsICNJTkNfWDgKKyNpZiAoTlVNQkVSPT0zKQorICAgICAgICBCTFMgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorQkxTICAgICAgTE9PUF9TQUQyOworI2VsaWYgKE5VTUJFUj09MSkKK0JMUyAgICAgIExPT1BfU0FEMTsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyNpZiAoTlVNQkVSPT0zKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDModWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbGlmIChOVU1CRVI9PTIpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Mih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MSkKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQxKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZW5kaWYKK3sKKyAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgeDQgPSB4NSA9IDA7CisgICAgeDggPSAxNjsgLy88PD09PT09PT09PT09KioqKioqKgorCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4JJTAsICMweEZGMDAwMCI6ICI9ciIoeDYpKTsKKworI2lmIChOVU1CRVI9PTMpCitMT09QX1NBRDM6CisjZWxpZiAoTlVNQkVSPT0yKQorTE9PUF9TQUQyOgorI2VsaWYgKE5VTUJFUj09MSkKK0xPT1BfU0FEMToKKyNlbmRpZgorX19hc21fXyB2b2xhdGlsZSgiQklDICAlMCwgJTAsICMzIjogIj1yIihyZWYpKTsKKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMSA9ICooKGludDMyKikocmVmICsgMTIpKTsKKyAgICB4MTIgPSAqKChpbnQzMiopKHJlZiArIDE2KSk7CisgICAgeDEwID0gKigoaW50MzIqKShyZWYgKyA4KSk7CisgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworCisjaWYgKFNISUZUPT04KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzhcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzI0XG5cdE1WTiAgICUxLCAlMSxsc3IgIzhcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzI0IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VsaWYgKFNISUZUPT0xNikKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICMxNlxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjMTZcblx0TVZOICAgJTEsICUxLGxzciAjMTZcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzE2IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VsaWYgKFNISUZUPT0yNCkKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICMyNFxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjOFxuXHRNVk4gICAlMSwgJTEsbHNyICMyNFxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjOCI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbmRpZgorCisgICAgeDEyID0gKigoaW50MzIqKShibGsgKyA4KSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDExID0gKigoaW50MzIqKShyZWYgKyA0KSk7CisgICAgeDEyID0gKigoaW50MzIqKShyZWYgKyA4KSk7CisgICAgeDEwID0gKigoaW50MzIqKXJlZik7IHJlZiArPSBseDsKKyAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDQpKTsKKworI2lmIChTSElGVD09OCkKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICM4XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICMyNFxuXHRNVk4gICAlMSwgJTEsbHNyICM4XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICMyNCI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbGlmIChTSElGVD09MTYpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjMTZcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzE2XG5cdE1WTiAgICUxLCAlMSxsc3IgIzE2XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICMxNiI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbGlmIChTSElGVD09MjQpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjMjRcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzhcblx0TVZOICAgJTEsICUxLGxzciAjMjRcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzgiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZW5kaWYKK19fYXNtX18gdm9sYXRpbGUoIkxEUiAgICUwLCBbJTFdLCAjMTYiOiAiPSZyIih4MTIpLCAiPXIiKGJsaykpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsTih4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsTih4MTAsIHgxMiwgeDkpOworCisgICAgc3VtX2FjY3VtdWxhdGU7CisKKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICBpZiAoKCh1aW50MzIpeDEwID4+IDE2KSA8PSAodWludDMyKWRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgeworICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgeworI2lmIChOVU1CRVI9PTMpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQzOworI2VsaWYgKE5VTUJFUj09MikKK2dvdG8gICAgICAgICBMT09QX1NBRDI7CisjZWxpZiAoTlVNQkVSPT0xKQorZ290byAgICAgICAgIExPT1BfU0FEMTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zbGljZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2xpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDA2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2xpY2UuY3BwCkBAIC0wLDAgKzEsMTAyNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKworQVZDRW5jX1N0YXR1cyBBVkNFbmNvZGVTbGljZShBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNQaWNQYXJhbVNldCAqcHBzID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA7CisgICAgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICB1aW50IHNsaWNlX2dyb3VwX2lkOworICAgIGludCBDdXJyTWJBZGRyLCBzbGljZV90eXBlOworCisgICAgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworCisgICAgLyogc2V0IHRoZSBmaXJzdCBtYiBpbiBzbGljZSAqLworICAgIHZpZGVvLT5tYk51bSA9IEN1cnJNYkFkZHIgPSBzbGljZUhkci0+Zmlyc3RfbWJfaW5fc2xpY2U7Ly8gKiAoMSt2aWRlby0+TWJhZmZGcmFtZUZsYWcpOworICAgIHNsaWNlX2dyb3VwX2lkID0gdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwW0N1cnJNYkFkZHJdOworCisgICAgdmlkZW8tPm1iX3NraXBfcnVuID0gMDsKKworICAgIC8qIHdoaWxlIGxvb3AgLCBzZWUgc3ViY2xhdXNlIDcuMy40ICovCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICB2aWRlby0+bWJOdW0gPSBDdXJyTWJBZGRyOworICAgICAgICBjdXJyTUIgPSB2aWRlby0+Y3Vyck1CID0gJih2aWRlby0+bWJsb2NrW0N1cnJNYkFkZHJdKTsKKyAgICAgICAgY3Vyck1CLT5zbGljZV9pZCA9IHZpZGVvLT5zbGljZV9pZDsgIC8vIGZvciBkZWJsb2NraW5nCisKKyAgICAgICAgdmlkZW8tPm1iX3ggPSBDdXJyTWJBZGRyICUgdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisgICAgICAgIHZpZGVvLT5tYl95ID0gQ3Vyck1iQWRkciAvIHZpZGVvLT5QaWNXaWR0aEluTWJzOworCisgICAgICAgIC8qIGluaXRpYWxpemUgUVAgZm9yIHRoaXMgTUIgaGVyZSovCisgICAgICAgIC8qIGNhbGN1bGF0ZSBjdXJyTUItPlFQeSAqLworICAgICAgICBSQ0luaXRNQlFQKGVuY3ZpZCk7CisKKyAgICAgICAgLyogY2hlY2sgdGhlIGF2YWlsYWJpbGl0eSBvZiBuZWlnaGJvcmluZyBtYWNyb2Jsb2NrcyAqLworICAgICAgICBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkodmlkZW8sIEN1cnJNYkFkZHIpOworCisgICAgICAgIC8qIEFzc3VtaW5nIHRoYXQgSW5pdE5laWdoYm9yQXZhaWxhYmlsaXR5IGhhcyBiZWVuIGNhbGxlZCBwcmlvciB0byB0aGlzIGZ1bmN0aW9uICovCisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5pbnRyYUF2YWlsRCA9IDA7CisgICAgICAgIC8qIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBhbGwgc3Vic2VxdWVudCBpbnRyYSBzZWFyY2ggKi8KKworICAgICAgICBpZiAoIXZpZGVvLT5jdXJyUGljUGFyYW1zLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYkF2YWlsQTsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYkF2YWlsQjsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYkF2YWlsQzsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYkF2YWlsRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJfaW50cmE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxCKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLm1iX2ludHJhIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQ10ubWJfaW50cmE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckRdLm1iX2ludHJhOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZW5jb2RlX29uZV9tYWNyb2Jsb2NrKCkgKi8KKyAgICAgICAgc3RhdHVzID0gRW5jb2RlTUIoZW5jdmlkKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBnbyB0byBuZXh0IE1CICovCisgICAgICAgIEN1cnJNYkFkZHIrKzsKKworICAgICAgICB3aGlsZSAoKHVpbnQpdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwW0N1cnJNYkFkZHJdICE9IHNsaWNlX2dyb3VwX2lkICYmCisgICAgICAgICAgICAgICAgKHVpbnQpQ3Vyck1iQWRkciA8IHZpZGVvLT5QaWNTaXplSW5NYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJNYkFkZHIrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodWludClDdXJyTWJBZGRyID49IHZpZGVvLT5QaWNTaXplSW5NYnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGVuZCBvZiBzbGljZSwgcmV0dXJuLCBidXQgYmVmb3JlIHRoYXQgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBvdGhlciBzbGljZXMKKyAgICAgICAgICAgIHRvIGJlIGVuY29kZWQuICovCisgICAgICAgICAgICBlbmN2aWQtPmN1cnJTbGljZUdyb3VwKys7CisgICAgICAgICAgICBpZiAoZW5jdmlkLT5jdXJyU2xpY2VHcm91cCA+IChpbnQpcHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSkgLyogbm8gbW9yZSBzbGljZSBncm91cCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19QSUNUVVJFX1JFQURZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGZpbmQgZmlyc3RfbWJfbnVtIGZvciB0aGUgbmV4dCBzbGljZSAqLworICAgICAgICAgICAgICAgIEN1cnJNYkFkZHIgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXBbQ3Vyck1iQWRkcl0gIT0gZW5jdmlkLT5jdXJyU2xpY2VHcm91cCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQpQ3Vyck1iQWRkciA8IHZpZGVvLT5QaWNTaXplSW5NYnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdXJyTWJBZGRyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgodWludClDdXJyTWJBZGRyID49IHZpZGVvLT5QaWNTaXplSW5NYnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfU0xJQ0VfRU1QVFk7IC8qIGVycm9yLCBvbmUgc2xpY2UgZ3JvdXAgaGFzIG5vIE1CcyBpbiBpdCAqLworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpZGVvLT5tYk51bSA9IEN1cnJNYkFkZHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPm1iX3NraXBfcnVuID4gMCkKKyAgICB7CisgICAgICAgIC8qIHdyaXRlIHNraXBfcnVuICovCisgICAgICAgIGlmIChzbGljZV90eXBlICE9IEFWQ19JX1NMSUNFICYmIHNsaWNlX3R5cGUgIT0gQVZDX1NJX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICB1ZV92KHN0cmVhbSwgdmlkZW8tPm1iX3NraXBfcnVuKTsKKyAgICAgICAgICAgIHZpZGVvLT5tYl9za2lwX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAvKiBzaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitBVkNFbmNfU3RhdHVzIEVuY29kZU1CKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisgICAgQVZDRnJhbWVJTyAgKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgQVZDTWFjcm9ibG9jayAqTUJfQSwgKk1CX0I7CisgICAgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIHVpbnQ4ICpjdXIsICpjdXJMLCAqY3VyQ2IsICpjdXJDcjsKKyAgICB1aW50OCAqb3JnTCwgKm9yZ0NiLCAqb3JnQ3IsICpvcmc0OworICAgIGludCBDdXJyTWJBZGRyID0gdmlkZW8tPm1iTnVtOworICAgIGludCBwaWNQaXRjaCA9IGN1cnJQaWMtPnBpdGNoOworICAgIGludCBvcmdQaXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgaW50IHhfcG9zaXRpb24gPSAodmlkZW8tPm1iX3ggPDwgNCk7CisgICAgaW50IHlfcG9zaXRpb24gPSAodmlkZW8tPm1iX3kgPDwgNCk7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgYjgsIGI0LCBibGtpZHg7CisgICAgQVZDUmVzaWR1YWxUeXBlICByZXNUeXBlOworICAgIGludCBzbGljZV90eXBlOworICAgIGludCBudW1jb2VmZjsgLyogb3V0cHV0IGZyb20gcmVzaWR1YWxfYmxvY2tfY2F2bGMgKi8KKyAgICBpbnQgY29zdDE2LCBjb3N0ODsKKworICAgIGludCBudW1fYml0cywgc3RhcnRfbWJfYml0cywgc3RhcnRfdGV4dF9iaXRzOworCisgICAgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworCisgICAgLyogbm93LCBwb2ludCB0byB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSAqLworICAgIG9mZnNldCA9IHlfcG9zaXRpb24gKiBwaWNQaXRjaCArIHhfcG9zaXRpb247CisgICAgY3VyTCA9IGN1cnJQaWMtPlNsICsgb2Zmc2V0OworICAgIG9yZ0wgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0OworICAgIG9mZnNldCA9IChvZmZzZXQgKyB4X3Bvc2l0aW9uKSA+PiAyOworICAgIGN1ckNiID0gY3VyclBpYy0+U2NiICsgb2Zmc2V0OworICAgIGN1ckNyID0gY3VyclBpYy0+U2NyICsgb2Zmc2V0OworICAgIG9yZ0NiID0gY3VycklucHV0LT5ZQ2JDclsxXSArIG9mZnNldDsKKyAgICBvcmdDciA9IGN1cnJJbnB1dC0+WUNiQ3JbMl0gKyBvZmZzZXQ7CisKKyAgICBpZiAob3JnUGl0Y2ggIT0gcGljUGl0Y2gpCisgICAgeworICAgICAgICBvZmZzZXQgPSB5X3Bvc2l0aW9uICogKG9yZ1BpdGNoIC0gcGljUGl0Y2gpOworICAgICAgICBvcmdMICs9IG9mZnNldDsKKyAgICAgICAgb2Zmc2V0ID4+PSAyOworICAgICAgICBvcmdDYiArPSBvZmZzZXQ7CisgICAgICAgIG9yZ0NyICs9IG9mZnNldDsKKyAgICB9CisKKyAgICAvKioqKioqKiBkZXRlcm1pbmUgTUIgcHJlZGljdGlvbiBtb2RlICoqKioqKiovCisgICAgaWYgKGVuY3ZpZC0+aW50cmFTZWFyY2hbQ3Vyck1iQWRkcl0pCisgICAgeworICAgICAgICBNQkludHJhU2VhcmNoKGVuY3ZpZCwgQ3Vyck1iQWRkciwgY3VyTCwgcGljUGl0Y2gpOworICAgIH0KKyAgICAvKioqKioqKiBUaGlzIHBhcnQgc2hvdWxkIGJlIGRldGVybWluZWQgc29tZWhvdyAqKioqKioqKioqKioqKiovCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JX1BDTSkKKyAgICB7CisgICAgICAgIC8qIHdyaXRlIGRvd24gbWJfdHlwZSBhbmQgUENNIGRhdGEgKi8KKyAgICAgICAgLyogYW5kIGNvcHkgZnJvbSBjdXJySW5wdXQgdG8gY3VyclBpYyAqLworICAgICAgICBzdGF0dXMgPSBFbmNvZGVJbnRyYVBDTShlbmN2aWQpOworCisKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKioqKioqIGZvciBpbnRyYSBwcmVkaWN0aW9uLCBwcmVkIGlzIGFscmVhZHkgZG9uZSAqKioqKioqLworICAgIC8qKioqKiogZm9yIEk0LCB0aGUgcmVjb24gaXMgcmVhZHkgYW5kIFhmcm0gY29lZnMgYXJlIHJlYWR5IHRvIGJlIGVuY29kZWQgKioqKiovCisKKyAgICAvL1JDQ2FsY3VsYXRlTUFEKGVuY3ZpZCxjdXJyTUIsb3JnTCxvcmdQaXRjaCk7IC8vIG5vIG5lZWQgdG8gcmUtY2FsY3VsYXRlIE1BRCBmb3IgSW50cmEKKyAgICAvLyBub3QgdXNlZCBzaW5jZSB0b3RhbFNBRCBpcyB1c2VkIGluc3RlYWQKKworICAgIC8qIGNvbXB1dGUgdGhlIHByZWRpY3Rpb24gKi8KKyAgICAvKiBvdXRwdXQgaXMgdmlkZW8tPnByZWRfYmxvY2sgKi8KKyAgICBpZiAoIWN1cnJNQi0+bWJfaW50cmEpCisgICAgeworICAgICAgICBBVkNNQk1vdGlvbkNvbXAoZW5jdmlkLCB2aWRlbyk7IC8qIHBlcmZvcm0gcHJlZGljdGlvbiBhbmQgcmVzaWR1ZSBjYWxjdWxhdGlvbiAqLworICAgICAgICAvKiB3ZSBjYW4gZG8gdGhlIGxvb3AgaGVyZSBhbmQgY2FsbCBkY3RfbHVtYSAqLworICAgICAgICB2aWRlby0+cHJlZF9waXRjaCA9IHBpY1BpdGNoOworICAgICAgICBjdXJyTUItPkNCUCA9IDA7CisgICAgICAgIGNvc3QxNiA9IDA7CisgICAgICAgIGN1ciA9IGN1ckw7CisgICAgICAgIG9yZzQgPSBvcmdMOworCisgICAgICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvc3Q4ID0gMDsKKworICAgICAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBibGtpZHggPSBibGtJZHgyYmxrWFlbYjhdW2I0XTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJlZF9ibG9jayA9IGN1cjsKKyAgICAgICAgICAgICAgICBudW1jb2VmZiA9IGRjdF9sdW1hKGVuY3ZpZCwgYmxraWR4LCBjdXIsIG9yZzQsICZjb3N0OCk7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHhdID0gbnVtY29lZmY7CisgICAgICAgICAgICAgICAgaWYgKG51bWNvZWZmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmNicDR4NCB8PSAoMSA8PCBibGtpZHgpOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCB8PSAoMSA8PCBiOCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGI0JjEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXIgKz0gKChwaWNQaXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgICAgICAgICBvcmc0ICs9ICgob3JnUGl0Y2ggPDwgMikgLSA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIG9yZzQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG1vdmUgdGhlIElEQ1QgcGFydCBvdXQgb2YgZGN0X2x1bWEgdG8gYWNjb21tb2RhdGUgdGhlIGNoZWNrCisgICAgICAgICAgICAgICBmb3IgY29lZmZfY29zdC4gKi8KKworICAgICAgICAgICAgaWYgKChjdXJyTUItPkNCUCYoMSA8PCBiOCkpICYmIChjb3N0OCA8PSBfTFVNQV9DT0VGRl9DT1NUXykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29zdDggPSAwOyAvLyByZXNldCBpdAorCisgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgXj0gKDEgPDwgYjgpOworICAgICAgICAgICAgICAgIGJsa2lkeCA9IGJsa0lkeDJibGtYWVtiOF1bMF07CisKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0gPSAwOworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4KzFdID0gMDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeCs0XSA9IDA7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHgrNV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb3N0MTYgKz0gY29zdDg7CisKKyAgICAgICAgICAgIGlmIChiOCYxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1ciAtPSA4OworICAgICAgICAgICAgICAgIG9yZzQgLT0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXIgKz0gKDggLSAocGljUGl0Y2ggPDwgMykpOworICAgICAgICAgICAgICAgIG9yZzQgKz0gKDggLSAob3JnUGl0Y2ggPDwgMykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYWZ0ZXIgdGhlIHdob2xlIE1CLCB3ZSBkbyBhbm90aGVyIGNoZWNrIGZvciBjb2VmZl9jb3N0ICovCisgICAgICAgIGlmICgoY3Vyck1CLT5DQlAmMHhGKSAmJiAoY29zdDE2IDw9IF9MVU1BX01CX0NPRUZGX0NPU1RfKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5DQlAgPSAwOyAgLy8gcmVzZXQgaXQgdG8gemVybworICAgICAgICAgICAgbWVtc2V0KGN1cnJNQi0+bnpfY29lZmYsIDAsIHNpemVvZih1aW50OCkqMTYpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IHdlIGRvIElEQ1QKKyAgICAgICAgTUJJbnRlcklkY3QodmlkZW8sIGN1ckwsIGN1cnJNQiwgcGljUGl0Y2gpOworCisvLyAgICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gdmlkZW8tPnByZWQgKyAyNTY7CisgICAgfQorICAgIGVsc2UgICAgLyogSW50cmEgcHJlZGljdGlvbiAqLworICAgIHsKKyAgICAgICAgZW5jdmlkLT5udW1JbnRyYU1CKys7CisKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpIC8qIGRvIHByZWRpY3Rpb24gZm9yIHRoZSB3aG9sZSBtYWNyb2Jsb2NrICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+Q0JQID0gMDsKKyAgICAgICAgICAgIC8qIGdldCB0aGUgcHJlZGljdGlvbiBmcm9tIGVuY3ZpZC0+cHJlZF9pMTYgKi8KKyAgICAgICAgICAgIGRjdF9sdW1hXzE2eDE2KGVuY3ZpZCwgY3VyTCwgb3JnTCk7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW8tPnByZWRfYmxvY2sgPSBlbmN2aWQtPnByZWRfaWNbY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlXTsKKyAgICB9CisKKyAgICAvKiBjaHJvbWluYW5jZSAqLworICAgIC8qIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nLCB0aGUgcmVzdWx0IGlzIGluIGVuY3ZpZC0+cHJlZF9pYworICAgIGNocm9tYSBkY3QgbXVzdCBiZSBhd2FyZSB0aGF0IHByZWRpY3Rpb24gYmxvY2sgY2FuIGNvbWUgZnJvbSBlaXRoZXIgaW50cmEgb3IgaW50ZXIuICovCisKKyAgICBkY3RfY2hyb21hKGVuY3ZpZCwgY3VyQ2IsIG9yZ0NiLCAwKTsKKworICAgIGRjdF9jaHJvbWEoZW5jdmlkLCBjdXJDciwgb3JnQ3IsIDEpOworCisKKyAgICAvKiA0LjEgaWYgdGhlcmUncyBub3RoaW5nIGluIHRoZXJlLCB2aWRlby0+bWJfc2tpcF9ydW4rKyAqLworICAgIC8qIDQuMiBpZiBjb2RlZCwgY2hlY2sgaWYgdGhlcmUgaXMgYSBydW4gb2Ygc2tpcHBlZCBNQiwgZW5jb2RlcyBpdCwKKyAgICAgICAgICAgIHNldCB2aWRlby0+UVB5cHJldiA9IGN1cnJNQi0+UVB5OyAqLworCisgICAgLyogNS4gdmxjIGVuY29kZSAqLworCisgICAgLyogY2hlY2sgZm9yIHNraXBwZWQgbWFjcm9ibG9jaywgSU5URVIgb25seSAqLworICAgIGlmICghY3Vyck1CLT5tYl9pbnRyYSkKKyAgICB7CisgICAgICAgIC8qIGRlY2lkZSB3aGV0aGVyIHRoaXMgTUIgKGZvciBpbnRlciBNQikgc2hvdWxkIGJlIHNraXBwZWQgaWYgdGhlcmUncyBub3RoaW5nIGxlZnQuICovCisgICAgICAgIGlmICghY3Vyck1CLT5DQlAgJiYgY3Vyck1CLT5OdW1NYlBhcnQgPT0gMSAmJiBjdXJyTUItPlFQeSA9PSB2aWRlby0+UVB5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXSA9PSBBVkNfUHJlZF9MMCAmJiBjdXJyTUItPnJlZl9pZHhfTDBbMF0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNQl9BID0gJnZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdOworICAgICAgICAgICAgICAgIE1CX0IgPSAmdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl07CisKKyAgICAgICAgICAgICAgICBpZiAoIXZpZGVvLT5tYkF2YWlsQSB8fCAhdmlkZW8tPm1iQXZhaWxCKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJNQi0+bXZMMFswXSA9PSAwKSAvKiBib3RoIG12IGNvbXBvbmVudHMgYXJlIHplcm9zLiovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bXZkX2wwWzBdWzBdWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tdmRfbDBbMF1bMF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoTUJfQS0+cmVmX2lkeF9MMFsxXSA9PSAwICYmIE1CX0EtPm12TDBbM10gPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUJfQi0+cmVmX2lkeF9MMFsyXSA9PSAwICYmIE1CX0ItPm12TDBbMTJdID09IDApKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyck1CLT5tdkwwWzBdID09IDApIC8qIGJvdGggbXYgY29tcG9uZW50cyBhcmUgemVyb3MuKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19TS0lQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tdmRfbDBbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tdmRfbDBbMF1bMF1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5tdmRfbDBbMF1bMF1bMF0gPT0gMCAmJiB2aWRlby0+bXZkX2wwWzBdWzBdWzFdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfU0tJUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+bWJfc2tpcF9ydW4rKzsKKworICAgICAgICAgICAgICAgIC8qIHNldCBwYXJhbWV0ZXJzICovCisgICAgICAgICAgICAgICAgLyogbm90IHN1cmUgd2hldGhlciB3ZSBuZWVkIHRoZSBmb2xsb3dpbmdzICovCisgICAgICAgICAgICAgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19TS0lQOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXSA9IEFWQ19QcmVkX0wwOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzBdID0gY3Vyck1CLT5OdW1TdWJNYlBhcnRbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFsyXSA9IGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzNdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFswXSA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbMl0gPSBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzNdID0gY3Vyck1CLT5NYlBhcnRXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMF0gPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzJdID0gY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbM10gPSBjdXJyTUItPk1iUGFydEhlaWdodDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NYlBhcnRXaWR0aCA9IGN1cnJNQi0+TWJQYXJ0SGVpZ2h0ID0gODsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXSA9IEFWQ19EaXJlY3Q7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZm9yIHNraXBwZWQgTUIsIGFsd2F5cyBsb29rIGF0IHRoZSBmaXJzdCBlbnRyeSBpbiBSZWZQaWNMaXN0ICovCisgICAgICAgICAgICAgICAgY3Vyck1CLT5SZWZJZHhbMF0gPSBjdXJyTUItPlJlZklkeFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5SZWZJZHhbMl0gPSBjdXJyTUItPlJlZklkeFszXSA9IHZpZGVvLT5SZWZQaWNMaXN0MFswXS0+UmVmSWR4OworCisgICAgICAgICAgICAgICAgLyogZG8gbm90IHJldHVybiB5ZXQsIG5lZWQgdG8gZG8gc29tZSBjb3BpZXMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBub24tc2tpcHBlZCBNQiAqLworCisKKyAgICAvKioqKioqKioqKioqKiBTVEFSVCBFTlRST1BZIENPRElORyAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgc3RhcnRfbWJfYml0cyA9IDMyICsgKGVuY3ZpZC0+Yml0c3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBlbmN2aWQtPmJpdHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICAvKiBlbmNvZGUgbWJfdHlwZSwgbWJfcHJlZCwgc3ViX21iX3ByZWQsIENCUCAqLworICAgIGlmIChzbGljZV90eXBlICE9IEFWQ19JX1NMSUNFICYmIHNsaWNlX3R5cGUgIT0gQVZDX1NJX1NMSUNFICYmIGN1cnJNQi0+bWJNb2RlICE9IEFWQ19TS0lQKQorICAgIHsKKyAgICAgICAgLy9pZighcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcpICBBTFdBWVMgdHJ1ZQorICAgICAgICB7CisgICAgICAgICAgICB1ZV92KHN0cmVhbSwgdmlkZW8tPm1iX3NraXBfcnVuKTsKKyAgICAgICAgICAgIHZpZGVvLT5tYl9za2lwX3J1biA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgIT0gQVZDX1NLSVApCisgICAgeworICAgICAgICBzdGF0dXMgPSBFbmNvZGVNQkhlYWRlcihjdXJyTUIsIGVuY3ZpZCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGFydF90ZXh0X2JpdHMgPSAzMiArIChlbmN2aWQtPmJpdHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gZW5jdmlkLT5iaXRzdHJlYW0tPmJpdF9sZWZ0OworCisgICAgLyoqKiogbm93IGRlY29kaW5nIHBhcnQgKioqKioqKi8KKyAgICByZXNUeXBlID0gQVZDX0x1bWE7CisKKyAgICAvKiBEQyB0cmFuc2Zvcm0gZm9yIGx1bWEgSTE2IG1vZGUgKi8KKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICB7CisgICAgICAgIC8qIHZsYyBlbmNvZGUgbGV2ZWwvcnVuICovCisgICAgICAgIHN0YXR1cyA9IGVuY19yZXNpZHVhbF9ibG9jayhlbmN2aWQsIEFWQ19JbnRyYTE2REMsIGVuY3ZpZC0+bnVtY29lZmRjLCBjdXJyTUIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJlc1R5cGUgPSBBVkNfSW50cmExNkFDOworICAgIH0KKworICAgIC8qIFZMQyBlbmNvZGluZyBmb3IgbHVtYSAqLworICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5DQlAmKDEgPDwgYjgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHZsYyBlbmNvZGUgbGV2ZWwvcnVuICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gZW5jX3Jlc2lkdWFsX2Jsb2NrKGVuY3ZpZCwgcmVzVHlwZSwgKGI4IDw8IDIpICsgYjQsIGN1cnJNQik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hyb21hICovCisgICAgaWYgKGN1cnJNQi0+Q0JQICYgKDMgPDwgNCkpIC8qIGNocm9tYSBEQyByZXNpZHVhbCBwcmVzZW50ICovCisgICAgeworICAgICAgICBmb3IgKGI4ID0gMDsgYjggPCAyOyBiOCsrKSAvKiBmb3IgaUNiQ3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IGVuY19yZXNpZHVhbF9ibG9jayhlbmN2aWQsIEFWQ19DaHJvbWFEQywgZW5jdmlkLT5udW1jb2VmY2RjW2I4XSArIChiOCA8PCAzKSwgY3Vyck1CKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyTUItPkNCUCAmICgyIDw8IDQpKQorICAgIHsKKyAgICAgICAgLyogQUMgcGFydCAqLworICAgICAgICBmb3IgKGI4ID0gMDsgYjggPCAyOyBiOCsrKSAvKiBmb3IgaUNiQ3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykgIC8qIGZvciBlYWNoIGJsb2NrIGluc2lkZSBDYiBvciBDciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHZsYyBlbmNvZGUgbGV2ZWwvcnVuICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gZW5jX3Jlc2lkdWFsX2Jsb2NrKGVuY3ZpZCwgQVZDX0Nocm9tYUFDLCAxNiArIChiOCA8PCAyKSArIGI0LCBjdXJyTUIpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgbnVtX2JpdHMgPSAzMiArIChlbmN2aWQtPmJpdHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gZW5jdmlkLT5iaXRzdHJlYW0tPmJpdF9sZWZ0OworCisgICAgUkNQb3N0TUIodmlkZW8sIHJhdGVDdHJsLCBzdGFydF90ZXh0X2JpdHMgLSBzdGFydF9tYl9iaXRzLAorICAgICAgICAgICAgIG51bV9iaXRzIC0gc3RhcnRfdGV4dF9iaXRzKTsKKworLy8gIG51bV9iaXRzIC09IHN0YXJ0X21iX2JpdHM7CisvLyAgZnByaW50ZihmZGVidWcsIk1CICMlZDogJWQgYml0c1xuIixDdXJyTWJBZGRyLG51bV9iaXRzKTsKKy8vICBmY2xvc2UoZmRlYnVnKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBjb3B5IHRoZSBjb250ZW50IGZyb20gcHJlZEJsb2NrIGJhY2sgdG8gdGhlIHJlY29uc3RydWN0ZWQgWVVWIGZyYW1lICovCit2b2lkIENvcHlfTUIodWludDggKmN1ckwsIHVpbnQ4ICpjdXJDYiwgdWludDggKmN1ckNyLCB1aW50OCAqcHJlZEJsb2NrLCBpbnQgcGljUGl0Y2gpCit7CisgICAgaW50IGosIG9mZnNldDsKKyAgICB1aW50MzIgKmRzdCwgKmRzdDIsICpzcmM7CisKKyAgICBkc3QgPSAodWludDMyKiljdXJMOworICAgIHNyYyA9ICh1aW50MzIqKXByZWRCbG9jazsKKworICAgIG9mZnNldCA9IChwaWNQaXRjaCAtIDE2KSA+PiAyOworCisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgeworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisKKyAgICAgICAgZHN0ICs9IG9mZnNldDsKKyAgICB9CisKKyAgICBkc3QgPSAodWludDMyKiljdXJDYjsKKyAgICBkc3QyID0gKHVpbnQzMiopY3VyQ3I7CisgICAgb2Zmc2V0ID4+PSAxOworCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0MisrID0gKnNyYysrOworICAgICAgICAqZHN0MisrID0gKnNyYysrOworCisgICAgICAgIGRzdCArPSBvZmZzZXQ7CisgICAgICAgIGRzdDIgKz0gb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gOworfQorCisvKiBlbmNvZGUgbWJfdHlwZSwgbWJfcHJlZCwgc3ViX21iX3ByZWQsIENCUCAqLworLyogZGVjaWRlIHdoZXRoZXIgdGhpcyBNQiAoZm9yIGludGVyIE1CKSBzaG91bGQgYmUgc2tpcHBlZCAqLworQVZDRW5jX1N0YXR1cyBFbmNvZGVNQkhlYWRlcihBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgdWludCBtYl90eXBlOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworCisgICAgaWYgKGN1cnJNQi0+Q0JQID4gNDcpICAgLyogY2hyb21hIENCUCBpcyAxMSAqLworICAgIHsKKyAgICAgICAgY3Vyck1CLT5DQlAgLT0gMTY7ICAvKiByZW1vdmUgdGhlIDV0aCBiaXQgZnJvbSB0aGUgcmlnaHQgKi8KKyAgICB9CisKKyAgICBtYl90eXBlID0gSW50ZXJwcmV0TUJUeXBlKGN1cnJNQiwgdmlkZW8tPnNsaWNlX3R5cGUpOworCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIG1iX3R5cGUpOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDhyZWYwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gc3ViX21iX3ByZWQodmlkZW8sIGN1cnJNQiwgc3RyZWFtKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gbWJfcHJlZCh2aWRlbywgY3Vyck1CLCBzdHJlYW0pIDsKKyAgICB9CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgIT0gQVZDX0kxNikKKyAgICB7CisgICAgICAgIC8qIGRlY29kZSBjb2RlZF9ibG9ja19wYXR0ZXJuICovCisgICAgICAgIHN0YXR1cyA9IEVuY29kZUNCUChjdXJyTUIsIHN0cmVhbSk7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIGN1cnJNQi0+bWJfcXBfZGVsdGEgPSBjdXJyTUItPlFQeSAtIHZpZGVvLT5RUHlwcmV2ICovCisgICAgaWYgKGN1cnJNQi0+Q0JQID4gMCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIGN1cnJNQi0+UVB5IC0gdmlkZW8tPlFQeSk7CisgICAgICAgIHZpZGVvLT5RUHkgPSBjdXJyTUItPlFQeTsgLyogPSAodmlkZW8tPlFQeXByZXYgKyBjdXJyTUItPm1iX3FwX2RlbHRhICsgNTIpJTUyOyAqLworICAgICAgICAvLyBubyBuZWVkIHZpZGVvLT5RUGMgPSBjdXJyTUItPlFQYzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+UVB5ICE9IHZpZGVvLT5RUHkpIC8vIGN1cnJlbnQgUVAgaXMgbm90IHRoZSBzYW1lIGFzIHByZXZpb3VzIFFQCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHJlc3RvcmUgdGhlc2UgdmFsdWVzICovCisgICAgICAgICAgICBSQ1Jlc3RvcmVRUChjdXJyTUIsIHZpZGVvLCBlbmN2aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBpbnB1dHMgYXJlIG1iTW9kZSwgbWJfaW50cmEsIGkxNk1vZGUsIENCUCwgTnVtTWJQYXJ0LCBNYlBhcnRXaWR0aCwgTWJQYXJ0SGVpZ2h0ICovCit1aW50IEludGVycHJldE1CVHlwZShBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBzbGljZV90eXBlKQoreworICAgIGludCBDQlBfY2hyb207CisgICAgaW50IG1iX3R5cGU7Ly8gcGFydDEsIHBhcnQyLCBwYXJ0MzsKKy8vICBjb25zdCBzdGF0aWMgaW50IE1hcFBhcnRzMlR5cGVbMl1bM11bM109e3t7NCw4LDEyfSx7MTAsNiwxNH0sezE2LDE4LDIwfX0sCisvLyAge3s1LDksMTN9LHsxMSw3LDE1fSx7MTcsMTksMjF9fX07CisKKyAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iX3R5cGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIENCUF9jaHJvbSA9IChjdXJyTUItPkNCUCAmIDB4MzApOworICAgICAgICAgICAgaWYgKGN1cnJNQi0+Q0JQJjB4RikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCB8PSAweEY7ICAvKiBlaXRoZXIgMHgwIG9yIDB4RiAqLworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAxMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1iX3R5cGUgKz0gKENCUF9jaHJvbSA+PiAyKSArIGN1cnJNQi0+aTE2TW9kZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JX1BDTSkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbWJfdHlwZSA9IDI1OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7ICAvKiBQLU1CICovLyogbm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgZW51bSBBVkNNQk1vZGUgY2Fubm90IGJlIGNoYW5nZWQKKyAgICAgICAgc2luY2Ugd2UgdXNlIGl0IGhlcmUuICovCisgICAgICAgIG1iX3R5cGUgPSBjdXJyTUItPm1iTW9kZSAtIEFWQ19QMTY7CisgICAgfQorCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UpCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5tYl9pbnRyYSkKKyAgICAgICAgeworICAgICAgICAgICAgbWJfdHlwZSArPSA1OworICAgICAgICB9CisgICAgfQorICAgIC8vIGZvbGxvd2luZyBjb2RlcyBoYXZlIG5vdCBiZWVuIHRlc3RlZCB5ZXQsIG5vdCBuZWVkZWQuCisgICAgLyogIGVsc2UgaWYoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0JEaXJlY3QxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1AxNikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXSArIDE7IC8vIDEgb3IgMgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDI2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDhyZWYwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAyNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJ0MSA9IGN1cnJNQi0+bWJNb2RlIC0gQVZDX1AxNng4OworICAgICAgICAgICAgICAgIHBhcnQyID0gY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXTsKKyAgICAgICAgICAgICAgICBwYXJ0MyA9IGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMV1bMF07CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IE1hcFBhcnRzMlR5cGVbcGFydDFdW3BhcnQyXVtwYXJ0M107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihzbGljZV90eXBlID09IEFWQ19TSV9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgbWJfdHlwZSsrOworICAgICAgICB9CisgICAgKi8KKyAgICByZXR1cm4gKHVpbnQpbWJfdHlwZTsKK30KKworLy9jb25zdCBzdGF0aWMgaW50IG1iUGFydDJyYXN0ZXJbM11bNF0gPSB7ezAsMCwwLDB9LHsxLDEsMCwwfSx7MSwwLDEsMH19OworCisvKiBzZWUgc3ViY2xhdXNlIDcuMy41LjEgKi8KK0FWQ0VuY19TdGF0dXMgbWJfcHJlZChBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgaW50IG1iUGFydElkeDsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgaW50IG1heF9yZWZfaWR4OworICAgIHVpbnQgY29kZTsKKworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQgfHwgY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHBlcmZvcm0gcHJlZGljdGlvbiB0byBnZXQgdGhlIGFjdHVhbCBpbnRyYSA0eDQgcHJlZCBtb2RlICovCisgICAgICAgICAgICBFbmNvZGVJbnRyYTR4NE1vZGUodmlkZW8sIGN1cnJNQiwgc3RyZWFtKTsKKyAgICAgICAgICAgIC8qIG91dHB1dCB3aWxsIGJlIGluIGN1cnJNQi0+aTRNb2RlWzRdWzRdICovCisgICAgICAgIH0KKworICAgICAgICAvKiBhc3N1bWUgYWxyZWFkeSBzZXQgZnJvbSBNQlByZWRpY3Rpb24oKSAqLworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVswXVswXSAhPSBBVkNfRGlyZWN0KQorICAgIHsKKworICAgICAgICBtZW1zZXQoY3Vyck1CLT5yZWZfaWR4X0wwLCAwLCBzaXplb2YoaW50MTYpKjQpOworCisgICAgICAgIC8qIHNlZSBzdWJjbGF1c2UgNy40LjUuMSBmb3IgdGhlIHJhbmdlIG9mIHJlZl9pZHhfbFggKi8KKyAgICAgICAgbWF4X3JlZl9pZHggPSBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKKyAgICAgICAgLyogICAgICBpZih2aWRlby0+TWJhZmZGcmFtZUZsYWcgJiYgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKQorICAgICAgICAgICAgICAgICAgICBtYXhfcmVmX2lkeCA9IDIqc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKyAxOworICAgICAgICAqLworICAgICAgICAvKiBkZWNvZGUgcmVmIGluZGV4IGZvciBMMCAqLworICAgICAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoLyooc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE+MCB8fCBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpICYmKi8KKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IGN1cnJNQi0+cmVmX2lkeF9MMFttYlBhcnRJZHhdOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY29kZSwgbWF4X3JlZl9pZHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNlZSBzdWJjbGF1c2UgNy40LjUuMSBmb3IgdGhlIHJhbmdlIG9mIHJlZl9pZHhfbFggKi8KKyAgICAgICAgbWF4X3JlZl9pZHggPSBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsKKyAgICAgICAgLyogICAgICBpZih2aWRlby0+TWJhZmZGcmFtZUZsYWcgJiYgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKQorICAgICAgICAgICAgICAgICAgICBtYXhfcmVmX2lkeCA9IDIqc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKyAxOworICAgICAgICAqLworICAgICAgICAvKiBkZWNvZGUgcmVmIGluZGV4IGZvciBMMSAqLworICAgICAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoLyooc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE+MCB8fCBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpICYmKi8KKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGVfdihzdHJlYW0sIGN1cnJNQi0+cmVmX2lkeF9MMVttYlBhcnRJZHhdLCBtYXhfcmVmX2lkeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZW5jb2RlIG12ZF9sMCAqLworICAgICAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IGN1cnJNQi0+TnVtTWJQYXJ0OyBtYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMFttYlBhcnRJZHhdWzBdWzBdKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMFttYlBhcnRJZHhdWzBdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBlbmNvZGUgbXZkX2wxICovCisgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wxW21iUGFydElkeF1bMF1bMF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wxW21iUGFydElkeF1bMF1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIHN1YmNsYXVzZSA3LjMuNS4yICovCitBVkNFbmNfU3RhdHVzIHN1Yl9tYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBpbnQgbWJQYXJ0SWR4LCBzdWJNYlBhcnRJZHg7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIHVpbnQgbWF4X3JlZl9pZHg7CisgICAgdWludCBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisgICAgdWludCBzdWJfbWJfdHlwZVs0XTsKKworICAgIC8qIHRoaXMgc2hvdWxkIG1vdmUgc29tZXdoZXJlIGVsc2Ugd2hlcmUgd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIHRoaXMgY2hlY2sgKi8KKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4cmVmMCkKKyAgICB7CisgICAgICAgIG1lbXNldChjdXJyTUItPnJlZl9pZHhfTDAsIDAsIHNpemVvZihpbnQxNikqNCk7CisgICAgfQorCisgICAgLyogd2UgaGF2ZSB0byBjaGVjayB0aGUgdmFsdWVzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSB2YWxpZCAgKi8KKyAgICAvKiBhc3NpZ24gdmFsdWVzIHRvIGN1cnJNQi0+c3ViX21iX3R5cGVbXSAqLworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFKQorICAgIHsKKyAgICAgICAgSW50ZXJwcmV0U3ViTUJUeXBlUChjdXJyTUIsIHN1Yl9tYl90eXBlKTsKKyAgICB9CisgICAgLyogbm8gbmVlZCB0byBjaGVjayBmb3IgQi1zbGljZQorICAgICAgICBlbHNlIGlmKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIEludGVycHJldFN1Yk1CVHlwZUIoY3Vyck1CLHN1Yl9tYl90eXBlKTsKKyAgICAgICAgfSovCisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHN1Yl9tYl90eXBlW21iUGFydElkeF0pOworICAgIH0KKworICAgIC8qIHNlZSBzdWJjbGF1c2UgNy40LjUuMSBmb3IgdGhlIHJhbmdlIG9mIHJlZl9pZHhfbFggKi8KKyAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOworICAgIC8qICBpZih2aWRlby0+TWJhZmZGcmFtZUZsYWcgJiYgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKQorICAgICAgICAgICAgbWF4X3JlZl9pZHggPSAyKnNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICsgMTsgKi8KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBpZiAoKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID4gMCAvKnx8IGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZyovKSAmJgorICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlICE9IEFWQ19QOHJlZjAgJiYgLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gdGVfdihzdHJlYW0sIGN1cnJNQi0+cmVmX2lkeF9MMFttYlBhcnRJZHhdLCBtYXhfcmVmX2lkeCk7CisgICAgICAgIH0KKyAgICAgICAgLyogdXNlZCBpbiBkZWJsb2NraW5nICovCisgICAgICAgIGN1cnJNQi0+UmVmSWR4W21iUGFydElkeF0gPSB2aWRlby0+UmVmUGljTGlzdDBbY3Vyck1CLT5yZWZfaWR4X0wwW21iUGFydElkeF1dLT5SZWZJZHg7CisgICAgfQorICAgIC8qIHNlZSBzdWJjbGF1c2UgNy40LjUuMSBmb3IgdGhlIHJhbmdlIG9mIHJlZl9pZHhfbFggKi8KKyAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOworICAgIC8qICBpZih2aWRlby0+TWJhZmZGcmFtZUZsYWcgJiYgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKQorICAgICAgICAgICAgbWF4X3JlZl9pZHggPSAyKnNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICsgMTsqLworCisgICAgaWYgKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID4gMCkKKyAgICB7CisgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgvKihzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMT4wIHx8IGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykgJiYqLworICAgICAgICAgICAgICAgIC8qY3Vyck1CLT5zdWJNYk1vZGVbbWJQYXJ0SWR4XSE9QVZDX0JEaXJlY3Q4ICYmKi8KKyAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGVfdihzdHJlYW0sIGN1cnJNQi0+cmVmX2lkeF9MMVttYlBhcnRJZHhdLCBtYXhfcmVmX2lkeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgaWYgKC8qY3Vyck1CLT5zdWJNYk1vZGVbbWJQYXJ0SWR4XSE9QVZDX0JEaXJlY3Q4ICYmKi8KKyAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzdWJNYlBhcnRJZHggPSAwOyBzdWJNYlBhcnRJZHggPCBjdXJyTUItPk51bVN1Yk1iUGFydFttYlBhcnRJZHhdOyBzdWJNYlBhcnRJZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMFttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF1bMF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgaWYgKC8qY3Vyck1CLT5zdWJNYk1vZGVbbWJQYXJ0SWR4XSE9QVZDX0JEaXJlY3Q4ICYmKi8KKyAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzdWJNYlBhcnRJZHggPSAwOyBzdWJNYlBhcnRJZHggPCBjdXJyTUItPk51bVN1Yk1iUGFydFttYlBhcnRJZHhdOyBzdWJNYlBhcnRJZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgdmlkZW8tPm12ZF9sMVttYlBhcnRJZHhdW3N1Yk1iUGFydElkeF1bMF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wxW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBpbnB1dCBpcyBtYmxvY2stPnN1Yl9tYl90eXBlW10gKi8KK3ZvaWQgSW50ZXJwcmV0U3ViTUJUeXBlUChBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKQoreworICAgIGludCBpOworICAgIC8qIHNlZSBlbnVtIEFWQ01CVHlwZSBkZWNsYXJhdGlvbiAqLworICAgIC8qY29uc3Qgc3RhdGljIEFWQ1N1Yk1CTW9kZSBtYXAyc3ViTWJNb2RlWzRdID0ge0FWQ184eDgsQVZDXzh4NCxBVkNfNHg4LEFWQ180eDR9OworICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRXaWR0aFs0XSA9IHs4LDgsNCw0fTsKKyAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJzdWJQYXJ0SGVpZ2h0WzRdID0gezgsNCw4LDR9OworICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMm51bVN1YlBhcnRbNF0gPSB7MSwyLDIsNH07Ki8KKworICAgIGZvciAoaSA9IDA7IGkgPCA0IDsgaSsrKQorICAgIHsKKyAgICAgICAgc3ViX21iX3R5cGVbaV0gPSBtYmxvY2stPnN1Yk1iTW9kZVtpXSAtIEFWQ184eDg7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBJbnRlcnByZXRTdWJNQlR5cGVCKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpCit7CisgICAgaW50IGk7CisgICAgLyogc2VlIGVudW0gQVZDTUJUeXBlIGRlY2xhcmF0aW9uICovCisgICAgLyogIGNvbnN0IHN0YXRpYyBBVkNTdWJNQk1vZGUgbWFwMnN1Yk1iTW9kZVsxM10gPSB7QVZDX0JEaXJlY3Q4LEFWQ184eDgsQVZDXzh4OCwKKyAgICAgICAgICAgIEFWQ184eDgsQVZDXzh4NCxBVkNfNHg4LEFWQ184eDQsQVZDXzR4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzR4NCxBVkNfNHg0LEFWQ180eDR9OworICAgICAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJzdWJQYXJ0V2lkdGhbMTNdID0gezQsOCw4LDgsOCw0LDgsNCw4LDQsNCw0LDR9OworICAgICAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJzdWJQYXJ0SGVpZ2h0WzEzXSA9IHs0LDgsOCw4LDQsOCw0LDgsNCw4LDQsNCw0fTsKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBtYXAybnVtU3ViUGFydFsxM10gPSB7NCwxLDEsMSwyLDIsMiwyLDIsMiw0LDQsNH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnByZWRNb2RlWzEzXSA9IHszLDAsMSwyLDAsMCwxLDEsMiwyLDAsMSwyfTsqLworCisgICAgZm9yIChpID0gMDsgaSA8IDQgOyBpKyspCisgICAgeworICAgICAgICBpZiAobWJsb2NrLT5zdWJNYk1vZGVbaV0gPT0gQVZDX0JEaXJlY3Q4KQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobWJsb2NrLT5zdWJNYk1vZGVbaV0gPT0gQVZDXzh4OCkKKyAgICAgICAgeworICAgICAgICAgICAgc3ViX21iX3R5cGVbaV0gPSAxICsgbWJsb2NrLT5NQlBhcnRQcmVkTW9kZVtpXVswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtYmxvY2stPnN1Yk1iTW9kZVtpXSA9PSBBVkNfNHg0KQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IDEwICsgbWJsb2NrLT5NQlBhcnRQcmVkTW9kZVtpXVswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gNCArIChtYmxvY2stPk1CUGFydFByZWRNb2RlW2ldWzBdIDw8IDEpICsgKG1ibG9jay0+c3ViTWJNb2RlW2ldIC0gQVZDXzh4NCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisvKiBzZWUgc3ViY2xhdXNlIDguMy4xICovCitBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhNHg0TW9kZShBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIGludCBpbnRyYTR4NFByZWRNb2RlQSA9IDA7CisgICAgaW50IGludHJhNHg0UHJlZE1vZGVCLCBwcmVkSW50cmE0eDRQcmVkTW9kZTsKKyAgICBpbnQgY29tcG9uZW50LCBTdWJCbG9ja19pbmR4LCBibG9ja194LCBibG9ja195OworICAgIGludCBkY09ubHlQcmVkaWN0aW9uRmxhZzsKKyAgICB1aW50ICAgIGZsYWc7CisgICAgaW50ICAgICByZW0gPSAwOworICAgIGludCAgICAgbW9kZTsKKyAgICBpbnQgYmluZHggPSAwOworCisgICAgZm9yIChjb21wb25lbnQgPSAwOyBjb21wb25lbnQgPCA0OyBjb21wb25lbnQrKykgLyogcGFydGl0aW9uIGluZGV4ICovCisgICAgeworICAgICAgICBibG9ja194ID0gKChjb21wb25lbnQgJiAxKSA8PCAxKTsKKyAgICAgICAgYmxvY2tfeSA9ICgoY29tcG9uZW50ID4+IDEpIDw8IDEpOworCisgICAgICAgIGZvciAoU3ViQmxvY2tfaW5keCA9IDA7IFN1YkJsb2NrX2luZHggPCA0OyBTdWJCbG9ja19pbmR4KyspIC8qIHN1Yi1wYXJ0aXRpb24gaW5kZXggKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAwOworICAgICAgICAgICAgaWYgKGJsb2NrX3ggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3kgPDwgMikgKyBibG9ja194IC0gMSBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5pNE1vZGVbKGJsb2NrX3kgPDwgMikgKyAzXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gQVZDX0k0X0RDOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChibG9ja195ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IGN1cnJNQi0+aTRNb2RlWygoYmxvY2tfeS0xKSA8PCAyKSArIGJsb2NrX3hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5pNE1vZGVbKDMgPDwgMikgKyBibG9ja194XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gQVZDX0k0X0RDOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkY09ubHlQcmVkaWN0aW9uRmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IGludHJhNHg0UHJlZE1vZGVCID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmVkSW50cmE0eDRQcmVkTW9kZSA9IEFWQ19NSU4oaW50cmE0eDRQcmVkTW9kZUEsIGludHJhNHg0UHJlZE1vZGVCKTsKKworICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICBtb2RlID0gY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdOworCisgICAgICAgICAgICBpZiAobW9kZSA9PSAoQVZDSW50cmE0eDRQcmVkTW9kZSlwcmVkSW50cmE0eDRQcmVkTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgPCBwcmVkSW50cmE0eDRQcmVkTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW0gPSBtb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbSA9IG1vZGUgLSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBmbGFnKTsKKworICAgICAgICAgICAgaWYgKCFmbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMsIHJlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpbmR4Kys7CisgICAgICAgICAgICBibG9ja195ICs9IChTdWJCbG9ja19pbmR4ICYgMSkgOworICAgICAgICAgICAgYmxvY2tfeCArPSAoMSAtIDIgKiAoU3ViQmxvY2tfaW5keCAmIDEpKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyZTcwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApAQCAtMCwwICsxLDMzNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKy8qKgorU2VlIGFsZ29yaXRobSBpbiBzdWJjbGF1c2UgOS4xLCBUYWJsZSA5LTEsIFRhYmxlIDktMi4gKi8KK0FWQ0VuY19TdGF0dXMgdWVfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCBjb2RlTnVtKQoreworICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPSBTZXRFR0JpdHN0cmluZyhiaXRzdHJlYW0sIGNvZGVOdW0pKQorICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qKgorU2VlIHN1YmNsYXVzZSA5LjEuMSwgVGFibGUgOS0zICovCitBVkNFbmNfU3RhdHVzICBzZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCBpbnQgdmFsdWUpCit7CisgICAgdWludCBjb2RlTnVtOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgaWYgKHZhbHVlIDw9IDApCisgICAgeworICAgICAgICBjb2RlTnVtID0gLXZhbHVlICogMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IHZhbHVlICogMiAtIDE7CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihiaXRzdHJlYW0sIGNvZGVOdW0pOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworQVZDRW5jX1N0YXR1cyB0ZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IHZhbHVlLCB1aW50IHJhbmdlKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgaWYgKHJhbmdlID4gMSkKKyAgICB7CisgICAgICAgIHJldHVybiB1ZV92KGJpdHN0cmVhbSwgdmFsdWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoYml0c3RyZWFtLCAxIC0gdmFsdWUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KK30KKworLyoqCitTZWUgc3ViY2xhdXNlIDkuMSwgVGFibGUgOS0xLCA5LTIuICovCisvLyBjb21wdXRlIGxlYWRpbmdaZXJvcyBhbmQgaW5mb3JiaXRzCisvL2NvZGVOdW0gPSAoMTw8bGVhZGluZ1plcm9zKS0xK2luZm9iaXRzOworQVZDRW5jX1N0YXR1cyBTZXRFR0JpdHN0cmluZyhBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgdWludCBjb2RlTnVtKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIGludCBsZWFkaW5nWmVyb3M7CisgICAgaW50IGluZm9iaXRzOworCisgICAgaWYgKCFjb2RlTnVtKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KGJpdHN0cmVhbSwgMSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIGxlYWRpbmdaZXJvcyBhbmQgaW5mb2JpdHMgKi8KKyAgICBsZWFkaW5nWmVyb3MgPSAxOworICAgIHdoaWxlICgodWludCkoMSA8PCBsZWFkaW5nWmVyb3MpIDwgY29kZU51bSArIDIpCisgICAgeworICAgICAgICBsZWFkaW5nWmVyb3MrKzsKKyAgICB9CisgICAgbGVhZGluZ1plcm9zLS07CisgICAgaW5mb2JpdHMgPSBjb2RlTnVtIC0gKDEgPDwgbGVhZGluZ1plcm9zKSArIDE7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCBsZWFkaW5nWmVyb3MsIDApOworICAgIGluZm9iaXRzIHw9ICgxIDw8IGxlYWRpbmdaZXJvcyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgbGVhZGluZ1plcm9zICsgMSwgaW5mb2JpdHMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBUYWJsZSA5LTQgYXNzaWdubWVudCBvZiBjb2RlTnVtIHRvIHZhbHVlcyBvZiBjb2RlZF9ibG9ja19wYXR0ZXJuLiAqLworY29uc3Qgc3RhdGljIHVpbnQ4IE1hcENCUDJjb2RlWzQ4XVsyXSA9Cit7CisgICAgezMsIDB9LCB7MjksIDJ9LCB7MzAsIDN9LCB7MTcsIDd9LCB7MzEsIDR9LCB7MTgsIDh9LCB7MzcsIDE3fSwgezgsIDEzfSwgezMyLCA1fSwgezM4LCAxOH0sIHsxOSwgOX0sIHs5LCAxNH0sCisgICAgezIwLCAxMH0sIHsxMCwgMTV9LCB7MTEsIDE2fSwgezIsIDExfSwgezE2LCAxfSwgezMzLCAzMn0sIHszNCwgMzN9LCB7MjEsIDM2fSwgezM1LCAzNH0sIHsyMiwgMzd9LCB7MzksIDQ0fSwgezQsIDQwfSwKKyAgICB7MzYsIDM1fSwgezQwLCA0NX0sIHsyMywgMzh9LCB7NSwgNDF9LCB7MjQsIDM5fSwgezYsIDQyfSwgezcsIDQzfSwgezEsIDE5fSwgezQxLCA2fSwgezQyLCAyNH0sIHs0MywgMjV9LCB7MjUsIDIwfSwKKyAgICB7NDQsIDI2fSwgezI2LCAyMX0sIHs0NiwgNDZ9LCB7MTIsIDI4fSwgezQ1LCAyN30sIHs0NywgNDd9LCB7MjcsIDIyfSwgezEzLCAyOX0sIHsyOCwgMjN9LCB7MTQsIDMwfSwgezE1LCAzMX0sIHswLCAxMn0KK307CisKK0FWQ0VuY19TdGF0dXMgRW5jb2RlQ0JQKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgdWludCBjb2RlTnVtOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSBNYXBDQlAyY29kZVtjdXJyTUItPkNCUF1bMF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSBNYXBDQlAyY29kZVtjdXJyTUItPkNCUF1bMV07CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIGNvZGVOdW0pOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgVHJhaWxpbmdPbmVzLCBpbnQgVG90YWxDb2VmZiwgaW50IG5DKQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OCB0b3RDb2VmZlRyYWlsT25lWzNdWzRdWzE3XVsyXSA9CisgICAgeworICAgICAgICB7ICAgLy8gMDcwMgorICAgICAgICAgICAge3sxLCAxfSwgezYsIDV9LCB7OCwgN30sIHs5LCA3fSwgezEwLCA3fSwgezExLCA3fSwgezEzLCAxNX0sIHsxMywgMTF9LCB7MTMsIDh9LCB7MTQsIDE1fSwgezE0LCAxMX0sIHsxNSwgMTV9LCB7MTUsIDExfSwgezE2LCAxNX0sIHsxNiwgMTF9LCB7MTYsIDd9LCB7MTYsIDR9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHsyLCAxfSwgezYsIDR9LCB7OCwgNn0sIHs5LCA2fSwgezEwLCA2fSwgezExLCA2fSwgezEzLCAxNH0sIHsxMywgMTB9LCB7MTQsIDE0fSwgezE0LCAxMH0sIHsxNSwgMTR9LCB7MTUsIDEwfSwgezE1LCAxfSwgezE2LCAxNH0sIHsxNiwgMTB9LCB7MTYsIDZ9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezMsIDF9LCB7NywgNX0sIHs4LCA1fSwgezksIDV9LCB7MTAsIDV9LCB7MTEsIDV9LCB7MTMsIDEzfSwgezEzLCA5fSwgezE0LCAxM30sIHsxNCwgOX0sIHsxNSwgMTN9LCB7MTUsIDl9LCB7MTYsIDEzfSwgezE2LCA5fSwgezE2LCA1fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezUsIDN9LCB7NiwgM30sIHs3LCA0fSwgezgsIDR9LCB7OSwgNH0sIHsxMCwgNH0sIHsxMSwgNH0sIHsxMywgMTJ9LCB7MTQsIDEyfSwgezE0LCA4fSwgezE1LCAxMn0sIHsxNSwgOH0sIHsxNiwgMTJ9LCB7MTYsIDh9fSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAge3syLCAzfSwgezYsIDExfSwgezYsIDd9LCB7NywgN30sIHs4LCA3fSwgezgsIDR9LCB7OSwgN30sIHsxMSwgMTV9LCB7MTEsIDExfSwgezEyLCAxNX0sIHsxMiwgMTF9LCB7MTIsIDh9LCB7MTMsIDE1fSwgezEzLCAxMX0sIHsxMywgN30sIHsxNCwgOX0sIHsxNCwgN319LAorICAgICAgICAgICAge3swLCAwfSwgezIsIDJ9LCB7NSwgN30sIHs2LCAxMH0sIHs2LCA2fSwgezcsIDZ9LCB7OCwgNn0sIHs5LCA2fSwgezExLCAxNH0sIHsxMSwgMTB9LCB7MTIsIDE0fSwgezEyLCAxMH0sIHsxMywgMTR9LCB7MTMsIDEwfSwgezE0LCAxMX0sIHsxNCwgOH0sIHsxNCwgNn19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7MywgM30sIHs2LCA5fSwgezYsIDV9LCB7NywgNX0sIHs4LCA1fSwgezksIDV9LCB7MTEsIDEzfSwgezExLCA5fSwgezEyLCAxM30sIHsxMiwgOX0sIHsxMywgMTN9LCB7MTMsIDl9LCB7MTMsIDZ9LCB7MTQsIDEwfSwgezE0LCA1fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezQsIDV9LCB7NCwgNH0sIHs1LCA2fSwgezYsIDh9LCB7NiwgNH0sIHs3LCA0fSwgezksIDR9LCB7MTEsIDEyfSwgezExLCA4fSwgezEyLCAxMn0sIHsxMywgMTJ9LCB7MTMsIDh9LCB7MTMsIDF9LCB7MTQsIDR9fSwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAge3s0LCAxNX0sIHs2LCAxNX0sIHs2LCAxMX0sIHs2LCA4fSwgezcsIDE1fSwgezcsIDExfSwgezcsIDl9LCB7NywgOH0sIHs4LCAxNX0sIHs4LCAxMX0sIHs5LCAxNX0sIHs5LCAxMX0sIHs5LCA4fSwgezEwLCAxM30sIHsxMCwgOX0sIHsxMCwgNX0sIHsxMCwgMX19LAorICAgICAgICAgICAge3swLCAwfSwgezQsIDE0fSwgezUsIDE1fSwgezUsIDEyfSwgezUsIDEwfSwgezUsIDh9LCB7NiwgMTR9LCB7NiwgMTB9LCB7NywgMTR9LCB7OCwgMTR9LCB7OCwgMTB9LCB7OSwgMTR9LCB7OSwgMTB9LCB7OSwgN30sIHsxMCwgMTJ9LCB7MTAsIDh9LCB7MTAsIDR9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezQsIDEzfSwgezUsIDE0fSwgezUsIDExfSwgezUsIDl9LCB7NiwgMTN9LCB7NiwgOX0sIHs3LCAxM30sIHs3LCAxMH0sIHs4LCAxM30sIHs4LCA5fSwgezksIDEzfSwgezksIDl9LCB7MTAsIDExfSwgezEwLCA3fSwgezEwLCAzfX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezQsIDEyfSwgezQsIDExfSwgezQsIDEwfSwgezQsIDl9LCB7NCwgOH0sIHs1LCAxM30sIHs2LCAxMn0sIHs3LCAxMn0sIHs4LCAxMn0sIHs4LCA4fSwgezksIDEyfSwgezEwLCAxMH0sIHsxMCwgNn0sIHsxMCwgMn19CisgICAgICAgIH0KKyAgICB9OworCisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIHVpbnQgY29kZSwgbGVuOworICAgIGludCB2bGNudW07CisKKyAgICBpZiAoVHJhaWxpbmdPbmVzID4gMykKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfVFJBSUxJTkdPTkVTX0ZBSUw7CisgICAgfQorCisgICAgaWYgKG5DID49IDgpCisgICAgeworICAgICAgICBpZiAoVG90YWxDb2VmZikKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICgoVG90YWxDb2VmZiAtIDEpIDw8IDIpIHwgKFRyYWlsaW5nT25lcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gMzsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA2LCBjb2RlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKG5DIDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChuQyA8IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZsY251bSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAyOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gdG90Q29lZmZUcmFpbE9uZVt2bGNudW1dW1RyYWlsaW5nT25lc11bVG90YWxDb2VmZl1bMF07CisgICAgICAgIGNvZGUgPSB0b3RDb2VmZlRyYWlsT25lW3ZsY251bV1bVHJhaWxpbmdPbmVzXVtUb3RhbENvZWZmXVsxXTsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBVkNFbmNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXNDaHJvbWFEQyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IFRyYWlsaW5nT25lcywgaW50IFRvdGFsQ29lZmYpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IHRvdENvZWZmVHJhaWxPbmVDaHJvbVs0XVs1XVsyXSA9CisgICAgeworICAgICAgICB7IHsyLCAxfSwgezYsIDd9LCB7NiwgNH0sIHs2LCAzfSwgezYsIDJ9fSwKKyAgICAgICAgeyB7MCwgMH0sIHsxLCAxfSwgezYsIDZ9LCB7NywgM30sIHs4LCAzfX0sCisgICAgICAgIHsgezAsIDB9LCB7MCwgMH0sIHszLCAxfSwgezcsIDJ9LCB7OCwgMn19LAorICAgICAgICB7IHswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHs2LCA1fSwgezcsIDB9fSwKKyAgICB9OworCisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICB1aW50IGNvZGUsIGxlbjsKKworICAgIGxlbiA9IHRvdENvZWZmVHJhaWxPbmVDaHJvbVtUcmFpbGluZ09uZXNdW1RvdGFsQ29lZmZdWzBdOworICAgIGNvZGUgPSB0b3RDb2VmZlRyYWlsT25lQ2hyb21bVHJhaWxpbmdPbmVzXVtUb3RhbENvZWZmXVsxXTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBsZW4sIGNvZGUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIFRhYmxlIDktNyBhbmQgOS04ICovCitBVkNFbmNfU3RhdHVzIGNlX1RvdGFsWmVyb3MoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCB0b3RhbF96ZXJvcywgaW50IFRvdGFsQ29lZmYpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGxlblRvdGFsWmVyb3NbMTVdWzE2XSA9CisgICAgeworICAgICAgICB7IDEsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksIDl9LAorICAgICAgICB7IDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDUsIDUsIDYsIDYsIDYsIDZ9LAorICAgICAgICB7IDQsIDMsIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDUsIDUsIDYsIDUsIDZ9LAorICAgICAgICB7IDUsIDMsIDQsIDQsIDMsIDMsIDMsIDQsIDMsIDQsIDUsIDUsIDV9LAorICAgICAgICB7IDQsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDQsIDUsIDQsIDV9LAorICAgICAgICB7IDYsIDUsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDMsIDZ9LAorICAgICAgICB7IDYsIDUsIDMsIDMsIDMsIDIsIDMsIDQsIDMsIDZ9LAorICAgICAgICB7IDYsIDQsIDUsIDMsIDIsIDIsIDMsIDMsIDZ9LAorICAgICAgICB7IDYsIDYsIDQsIDIsIDIsIDMsIDIsIDV9LAorICAgICAgICB7IDUsIDUsIDMsIDIsIDIsIDIsIDR9LAorICAgICAgICB7IDQsIDQsIDMsIDMsIDEsIDN9LAorICAgICAgICB7IDQsIDQsIDIsIDEsIDN9LAorICAgICAgICB7IDMsIDMsIDEsIDJ9LAorICAgICAgICB7IDIsIDIsIDF9LAorICAgICAgICB7IDEsIDF9LAorICAgIH07CisKKyAgICBjb25zdCBzdGF0aWMgdWludDggY29kVG90YWxaZXJvc1sxNV1bMTZdID0KKyAgICB7CisgICAgICAgIHsxLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAzLCAyLCAxfSwKKyAgICAgICAgezcsIDYsIDUsIDQsIDMsIDUsIDQsIDMsIDIsIDMsIDIsIDMsIDIsIDEsIDB9LAorICAgICAgICB7NSwgNywgNiwgNSwgNCwgMywgNCwgMywgMiwgMywgMiwgMSwgMSwgMH0sCisgICAgICAgIHszLCA3LCA1LCA0LCA2LCA1LCA0LCAzLCAzLCAyLCAyLCAxLCAwfSwKKyAgICAgICAgezUsIDQsIDMsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDEsIDB9LAorICAgICAgICB7MSwgMSwgNywgNiwgNSwgNCwgMywgMiwgMSwgMSwgMH0sCisgICAgICAgIHsxLCAxLCA1LCA0LCAzLCAzLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezEsIDEsIDEsIDMsIDMsIDIsIDIsIDEsIDB9LAorICAgICAgICB7MSwgMCwgMSwgMywgMiwgMSwgMSwgMSwgfSwKKyAgICAgICAgezEsIDAsIDEsIDMsIDIsIDEsIDEsIH0sCisgICAgICAgIHswLCAxLCAxLCAyLCAxLCAzfSwKKyAgICAgICAgezAsIDEsIDEsIDEsIDF9LAorICAgICAgICB7MCwgMSwgMSwgMX0sCisgICAgICAgIHswLCAxLCAxfSwKKyAgICAgICAgezAsIDF9LAorICAgIH07CisgICAgaW50IGxlbiwgY29kZTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGxlbiA9IGxlblRvdGFsWmVyb3NbVG90YWxDb2VmZi0xXVt0b3RhbF96ZXJvc107CisgICAgY29kZSA9IGNvZFRvdGFsWmVyb3NbVG90YWxDb2VmZi0xXVt0b3RhbF96ZXJvc107CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBsZW4sIGNvZGUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIFRhYmxlIDktOSAqLworQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbFplcm9zQ2hyb21hREMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCB0b3RhbF96ZXJvcywgaW50IFRvdGFsQ29lZmYpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGxlblRvdGFsWmVyb3NDaHJvbWFEQ1szXVs0XSA9CisgICAgeworICAgICAgICB7IDEsIDIsIDMsIDMsIH0sCisgICAgICAgIHsgMSwgMiwgMiwgMCwgfSwKKyAgICAgICAgeyAxLCAxLCAwLCAwLCB9LAorICAgIH07CisKKyAgICBjb25zdCBzdGF0aWMgdWludDggY29kVG90YWxaZXJvc0Nocm9tYURDWzNdWzRdID0KKyAgICB7CisgICAgICAgIHsgMSwgMSwgMSwgMCwgfSwKKyAgICAgICAgeyAxLCAxLCAwLCAwLCB9LAorICAgICAgICB7IDEsIDAsIDAsIDAsIH0sCisgICAgfTsKKworICAgIGludCBsZW4sIGNvZGU7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBsZW4gPSBsZW5Ub3RhbFplcm9zQ2hyb21hRENbVG90YWxDb2VmZi0xXVt0b3RhbF96ZXJvc107CisgICAgY29kZSA9IGNvZFRvdGFsWmVyb3NDaHJvbWFEQ1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgVGFibGUgOS0xMCAqLworQVZDRW5jX1N0YXR1cyBjZV9SdW5CZWZvcmUoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBydW5fYmVmb3JlLCBpbnQgemVyb3NMZWZ0KQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBsZW5SdW5CZWZvcmVbN11bMTZdID0KKyAgICB7CisgICAgICAgIHsxLCAxfSwKKyAgICAgICAgezEsIDIsIDJ9LAorICAgICAgICB7MiwgMiwgMiwgMn0sCisgICAgICAgIHsyLCAyLCAyLCAzLCAzfSwKKyAgICAgICAgezIsIDIsIDMsIDMsIDMsIDN9LAorICAgICAgICB7MiwgMywgMywgMywgMywgMywgM30sCisgICAgICAgIHszLCAzLCAzLCAzLCAzLCAzLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTF9LAorICAgIH07CisKKyAgICBjb25zdCBzdGF0aWMgdWludDggY29kUnVuQmVmb3JlWzddWzE2XSA9CisgICAgeworICAgICAgICB7MSwgMH0sCisgICAgICAgIHsxLCAxLCAwfSwKKyAgICAgICAgezMsIDIsIDEsIDB9LAorICAgICAgICB7MywgMiwgMSwgMSwgMH0sCisgICAgICAgIHszLCAyLCAzLCAyLCAxLCAwfSwKKyAgICAgICAgezMsIDAsIDEsIDMsIDIsIDUsIDR9LAorICAgICAgICB7NywgNiwgNSwgNCwgMywgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMX0sCisgICAgfTsKKworICAgIGludCBsZW4sIGNvZGU7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAoemVyb3NMZWZ0IDw9IDYpCisgICAgeworICAgICAgICBsZW4gPSBsZW5SdW5CZWZvcmVbemVyb3NMZWZ0LTFdW3J1bl9iZWZvcmVdOworICAgICAgICBjb2RlID0gY29kUnVuQmVmb3JlW3plcm9zTGVmdC0xXVtydW5fYmVmb3JlXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGVuID0gbGVuUnVuQmVmb3JlWzZdW3J1bl9iZWZvcmVdOworICAgICAgICBjb2RlID0gY29kUnVuQmVmb3JlWzZdW3J1bl9iZWZvcmVdOworICAgIH0KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisKKworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmYjJhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5tawpAQCAtMCwwICsxLDMzIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfUFJFTElOS19NT0RVTEUgOj0gZmFsc2UKKworTE9DQUxfU1JDX0ZJTEVTIDo9IGNtbk1lbW9yeS5jCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgOj0gJChWT19DRkxBR1MpCisKK2lmZXEgKCQoVk9UVCksIHY1KQorTE9DQUxfQ0ZMQUdTICs9IC1EQVJNIC1EQVNNX09QVAorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjVFCitlbmRpZgorCitpZmVxICgkKFZPVFQpLCB2NykKK0xPQ0FMX0NGTEFHUyArPSAtREFSTSAtREFSTVY3IC1EQVNNX09QVAorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYy9hc20vQVJNVjVFCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvc3JjL2FzbS9BUk1WNworZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ExN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9Db25maWcubWsKQEAgLTAsMCArMSwyNCBAQAorIyANCisjIFRoaXMgY29uZmlndXJlIGZpbGUgaXMganVzdCBmb3IgTGludXggcHJvamVjdHMgYWdhaW5zdCBBbmRyb2lkDQorIw0KKw0KK1ZPUFJKIDo9IA0KK1ZPTkogOj0NCisNCisjIFdBUk5JTkc6DQorIyBVc2luZyB2NyBicmVha3MgZ2VuZXJpYyBidWlsZA0KK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkNCitWT1RUIDo9IHY1DQorZWxzZQ0KK1ZPVFQgOj0gcGMNCitlbmRpZg0KKw0KKyMgRG8gd2UgYWxzbyBuZWVkIHRvIGNoZWNrIG9uIEFSQ0hfQVJNX0hBVkVfQVJNVjdBPyAtIHByb2JhYmx5IG5vdA0KK2lmZXEgKCQoQVJDSF9BUk1fSEFWRV9ORU9OKSx0cnVlKQ0KK1ZPVFQgOj0gdjcNCitlbmRpZg0KKw0KK1ZPVEVTVCA6PSAwDQorDQorVk9fQ0ZMQUdTOj0tRExJTlVYIA0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vY21uTWVtb3J5LmMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNzI2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2Ntbk1lbW9yeS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCWNtbk1lbW9yeS5jDQorDQorCUNvbnRlbnQ6CXNhbXBsZSBjb2RlIGZvciBtZW1vcnkgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpbmNsdWRlICJjbW5NZW1vcnkuaCINCisNCisjaW5jbHVkZSA8bWFsbG9jLmg+DQorI2lmIGRlZmluZWQgTElOVVgNCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2VuZGlmDQorDQorLy9WT19NRU1fT1BFUkFUT1IJCWdfbWVtT1A7DQorDQorVk9fVTMyIGNtbk1lbUFsbG9jIChWT19TMzIgdUlELCAgVk9fTUVNX0lORk8gKiBwTWVtSW5mbykNCit7DQorCWlmICghcE1lbUluZm8pDQorCQlyZXR1cm4gVk9fRVJSX0lOVkFMSURfQVJHOw0KKw0KKwlwTWVtSW5mby0+VkJ1ZmZlciA9IG1hbGxvYyAocE1lbUluZm8tPlNpemUpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorVk9fVTMyIGNtbk1lbUZyZWUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwTWVtKQ0KK3sNCisJZnJlZSAocE1lbSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIJY21uTWVtU2V0IChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmYsIFZPX1U4IHVWYWx1ZSwgVk9fVTMyIHVTaXplKQ0KK3sNCisJbWVtc2V0IChwQnVmZiwgdVZhbHVlLCB1U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCitWT19VMzIJY21uTWVtQ29weSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKQ0KK3sNCisJbWVtY3B5IChwRGVzdCwgcFNvdXJjZSwgdVNpemUpOw0KKwlyZXR1cm4gMDsNCit9DQorDQorVk9fVTMyCWNtbk1lbUNoZWNrIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlciwgVk9fVTMyIHVTaXplKQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KK1ZPX1MzMiBjbW5NZW1Db21wYXJlIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmZlcjEsIFZPX1BUUiBwQnVmZmVyMiwgVk9fVTMyIHVTaXplKQ0KK3sNCisJcmV0dXJuIG1lbWNtcChwQnVmZmVyMSwgcEJ1ZmZlcjIsIHVTaXplKTsNCit9DQorDQorVk9fVTMyCWNtbk1lbU1vdmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwRGVzdCwgVk9fUFRSIHBTb3VyY2UsIFZPX1UzMiB1U2l6ZSkNCit7DQorCW1lbW1vdmUgKHBEZXN0LCBwU291cmNlLCB1U2l6ZSk7DQorCXJldHVybiAwOw0KK30NCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvY21uTWVtb3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvY21uTWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNTYwMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS9jbW5NZW1vcnkuaApAQCAtMCwwICsxLDEwNiBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJY21uTWVtb3J5LmgNCisNCisJQ29udGVudDoJbWVtb3J5IG9wZXJhdG9yIGltcGxlbWVudGF0aW9uIGhlYWRlciBmaWxlDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fY21uTWVtb3J5X0hfXw0KKyNkZWZpbmUgX19jbW5NZW1vcnlfSF9fDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2luY2x1ZGUgPHZvTWVtLmg+DQorDQorLy9leHRlcm4gVk9fTUVNX09QRVJBVE9SCWdfbWVtT1A7DQorDQorLyoqDQorICogQWxsb2NhdGUgbWVtb3J5DQorICogXHBhcmFtIHVJRCBbaW5dIG1vZHVsZSBJRA0KKyAqIFxwYXJhbSB1U2l6ZSBbaW5dIHNpemUgb2YgbWVtb3J5DQorICogXHJldHVybiB2YWx1ZSBpcyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhZGRyZXNzLiBOVUxMIGlzIGZhaWxlZC4NCisgKi8NCitWT19VMzIJY21uTWVtQWxsb2MgKFZPX1MzMiB1SUQsICBWT19NRU1fSU5GTyAqIHBNZW1JbmZvKTsNCisNCisvKioNCisgKiBGcmVlIHVwIG1lbW9yeQ0KKyAqIFxwYXJhbSB1SUQgW2luXSBtb2R1bGUgSUQNCisgKiBccGFyYW0gcE1lbSBbaW5dIGFkZHJlc3Mgb2YgbWVtb3J5DQorICogXHJldHVybiB2YWx1ZSAwLCBpZiBzdWNjZWVkZWQuDQorICovDQorVk9fVTMyCWNtbk1lbUZyZWUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyKTsNCisNCisvKioNCisgKiBtZW1vcnkgc2V0IGZ1bmN0aW9uDQorICogXHBhcmFtIHVJRCBbaW5dIG1vZHVsZSBJRA0KKyAqIFxwYXJhbSBwQnVmZiBbaW4vb3V0XSBhZGRyZXNzIG9mIG1lbW9yeQ0KKyAqIFxwYXJhbSB1VmFsdWUgW2luXSB0aGUgdmFsdWUgdG8gYmUgc2V0DQorICogXHBhcmFtIHVTaXplIFtpbl0gdGhlIHNpemUgdG8gYmUgc2V0DQorICogXHJldHVybiB2YWx1ZSAwLCBpZiBzdWNjZWVkZWQuDQorICovDQorVk9fVTMyCWNtbk1lbVNldCAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmLCBWT19VOCB1VmFsdWUsIFZPX1UzMiB1U2l6ZSk7DQorDQorLyoqDQorICogbWVtb3J5IGNvcHkgZnVuY3Rpb24NCisgKiBccGFyYW0gdUlEIFtpbl0gbW9kdWxlIElEDQorICogXHBhcmFtIHBEZXN0IFtpbi9vdXRdIGFkZHJlc3Mgb2YgZGVzdGluYXRpb24gbWVtb3J5DQorICogXHBhcmFtIHBTb3VyY2UgW2luXSBhZGRyZXNzIG9mIHNvdXJjZSBtZW1vcnkNCisgKiBccGFyYW0gdVNpemUgW2luXSB0aGUgc2l6ZSB0byBiZSBjb3BpZWQNCisgKiBccmV0dXJuIHZhbHVlIDAsIGlmIHN1Y2NlZWRlZC4NCisgKi8NCitWT19VMzIJY21uTWVtQ29weSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKTsNCisNCisvKioNCisgKiBtZW1vcnkgY2hlY2sgZnVuY3Rpb24NCisgKiBccGFyYW0gdUlEIFtpbl0gbW9kdWxlIElEDQorICogXHBhcmFtIHBCdWZmIFtpbl0gYWRkcmVzcyBvZiBidWZmZXIgdG8gYmUgY2hlY2tlZA0KKyAqIFxwYXJhbSB1U2l6ZSBbaW5dIHRoZSBzaXplIHRvIGJlIGNoZWNrZWQNCisgKiBccmV0dXJuIHZhbHVlIDAsIGlmIHN1Y2NlZWRlZC4NCisgKi8NCitWT19VMzIJY21uTWVtQ2hlY2sgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyLCBWT19VMzIgdVNpemUpOw0KKw0KKy8qKg0KKyAqIG1lbW9yeSBjb21wYXJlIGZ1bmN0aW9uDQorICogXHBhcmFtIHVJRCBbaW5dIG1vZHVsZSBJRA0KKyAqIFxwYXJhbSBwQnVmZmVyMSBbaW5dIGFkZHJlc3Mgb2YgYnVmZmVyIDEgdG8gYmUgY29tcGFyZWQNCisgKiBccGFyYW0gcEJ1ZmZlcjIgW2luXSBhZGRyZXNzIG9mIGJ1ZmZlciAyIHRvIGJlIGNvbXBhcmVkDQorICogXHBhcmFtIHVTaXplIFtpbl0gdGhlIHNpemUgdG8gYmUgY29tcGFyZWQNCisgKiBccmV0dXJuIHZhbHVlOiBzYW1lIGFzIHN0YW5kYXJkIEMgcnVuLXRpbWUgbWVtY21wKCkgZnVuY3Rpb24uDQorICovDQorVk9fUzMyCWNtbk1lbUNvbXBhcmUgKFZPX1MzMiB1SUQsIFZPX1BUUiBwQnVmZmVyMSwgVk9fUFRSIHBCdWZmZXIyLCBWT19VMzIgdVNpemUpOw0KKw0KKy8qKg0KKyAqIG1lbW9yeSBtb3ZlIGZ1bmN0aW9uDQorICogXHBhcmFtIHVJRCBbaW5dIG1vZHVsZSBJRA0KKyAqIFxwYXJhbSBwRGVzdCBbaW4vb3V0XSBhZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG1lbW9yeQ0KKyAqIFxwYXJhbSBwU291cmNlIFtpbl0gYWRkcmVzcyBvZiBzb3VyY2UgbWVtb3J5DQorICogXHBhcmFtIHVTaXplIFtpbl0gdGhlIHNpemUgdG8gYmUgbW92ZWQNCisgKiBccmV0dXJuIHZhbHVlIDAsIGlmIHN1Y2NlZWRlZC4NCisgKi8NCitWT19VMzIJY21uTWVtTW92ZSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKTsNCisNCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCit9DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2VuZGlmIC8vIF9fY21uTWVtb3J5X0hfXw0KKw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0FBQy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQUFDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0FBQy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qDQorICoqIENvcHlyaWdodCAyMDAzLTIwMTAsIFZpc3VhbE9uLCBJbmMuDQorICoqDQorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KKyAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqKg0KKyAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoqDQorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisJRmlsZToJCXZvQUFDLmgNCisNCisJQ29udGVudDoJQUFDIGNvZGVjIEFQSXMgJiBkYXRhIHR5cGVzDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fdm9BQUNfSF9fDQorI2RlZmluZSBfX3ZvQUFDX0hfXw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNpbmNsdWRlICJ2b0F1ZGlvLmgiDQorDQorLyohDQorICogdGhlIGZyYW1lIHR5cGUgdGhhdCB0aGUgZGVjb2RlciBzdXBwb3J0cw0KKyAqLw0KK3R5cGVkZWYgZW51bSB7DQorCVZPQUFDX1JBV0RBVEEJCQk9IDAsCS8qITxjb250YWlucyBvbmx5IHJhdyBhYWMgZGF0YSBpbiBhIGZyYW1lKi8NCisJVk9BQUNfQURUUwkJCQk9IDEsCS8qITxjb250YWlucyBBRFRTIGhlYWRlciArIHJhdyBBQUMgZGF0YSBpbiBhIGZyYW1lKi8NCisJVk9BQUNfRlRfTUFYCQkJPSBWT19NQVhfRU5VTV9WQUxVRQ0KK30gVk9BQUNGUkFNRVRZUEU7DQorDQorLyohDQorICogdGhlIHN0cnVjdHVyZSBmb3IgQUFDIGVuY29kZXIgaW5wdXQgcGFyYW1ldGVyDQorICovDQordHlwZWRlZiAgc3RydWN0IHsNCisgIGludAkgIHNhbXBsZVJhdGU7ICAgICAgICAgIC8qISBhdWRpbyBmaWxlIHNhbXBsZSByYXRlICovDQorICBpbnQJICBiaXRSYXRlOyAgICAgICAgICAgICAvKiEgZW5jb2RlciBiaXQgcmF0ZSBpbiBiaXRzL3NlYyAqLw0KKyAgc2hvcnQgICBuQ2hhbm5lbHM7CQkgICAvKiEgbnVtYmVyIG9mIGNoYW5uZWxzIG9uIGlucHV0ICgxLDIpICovDQorICBzaG9ydCAgIGFkdHNVc2VkOwkJCSAgIC8qISB3aGV0aGVyIHdyaXRlIGFkdHMgaGVhZGVyICovDQorfSBBQUNFTkNfUEFSQU07DQorDQorLyogQUFDIFBhcmFtIElEICovDQorI2RlZmluZSBWT19QSURfQUFDX01kb3VsZQkJCQkweDQyMjExMDAwDQorI2RlZmluZSBWT19QSURfQUFDX0VOQ1BBUkFNCQkJCVZPX1BJRF9BQUNfTWRvdWxlIHwgMHgwMDQwICAvKiE8IGdldC9zZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVyLCB0aGUgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBBQUNFTkNfUEFSQU0gKi8NCisNCisvKiBBQUMgZGVjb2RlciBlcnJvciBJRCAqLw0KKyNkZWZpbmUgVk9fRVJSX0FBQ19NZG91bGUJCQkJMHg4MjIxMDAwMA0KKyNkZWZpbmUgVk9fRVJSX0FBQ19VTlNGSUxFRk9STUFUCQkoVk9fRVJSX0FBQ19NZG91bGUgfCAweEYwMDEpDQorI2RlZmluZSBWT19FUlJfQUFDX1VOU1BST0ZJTEUJCQkoVk9fRVJSX0FBQ19NZG91bGUgfCAweEYwMDIpDQorDQorLyoqDQorICogR2V0IGF1ZGlvIGVuY29kZXIgQVBJIGludGVyZmFjZQ0KKyAqIFxwYXJhbSBwRW5jSGFuZGxlIFtvdXRdIFJldHVybiB0aGUgQUFDIEVuY29kZXIgaGFuZGxlLg0KKyAqIFxyZXR2YWwgVk9fRVJSX09LIFN1Y2NlZWRlZC4NCisgKi8NCitWT19TMzIgVk9fQVBJIHZvR2V0QUFDRW5jQVBJIChWT19BVURJT19DT0RFQ0FQSSAqIHBFbmNIYW5kbGUpOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjZW5kaWYgLy8gX192b0FBQ19IX18NCisNCisNCisNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BTVJXQi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQU1SV0IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkzZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvQU1SV0IuaApAQCAtMCwwICsxLDg3IEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl2b0FNUldCLmgNCisNCisJQ29udGVudDoJQU1SLVdCIGNvZGVjIEFQSXMgJiBkYXRhIHR5cGVzDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisjaWZuZGVmICBfX1ZPQU1SV0JfSF9fDQorI2RlZmluZSAgX19WT0FNUldCX0hfXw0KKw0KKyNpbmNsdWRlICAidm9BdWRpby5oIg0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKyNwcmFnbWEgcGFjayhwdXNoLCA0KQ0KKw0KKy8qISogdGhlIGJpdCByYXRlIHRoZSBjb2RlYyBzdXBwb3J0cyovDQordHlwZWRlZiBlbnVtIHsgDQorCVZPQU1SV0JfTUROT05FCQk9IC0xLAkvKiE8IEludmFsaWQgbW9kZSAqLw0KKwlWT0FNUldCX01ENjYJCT0gMCwJLyohPCA2LjYwa2JwcyAgICovDQorCVZPQU1SV0JfTUQ4ODUJCT0gMSwgICAgLyohPCA4Ljg1a2JwcyAgICovICAgICAgIA0KKwlWT0FNUldCX01EMTI2NQkJPSAyLAkvKiE8IDEyLjY1a2JwcyAgKi8NCisJVk9BTVJXQl9NRDE0MjUJCT0gMywJLyohPCAxNC4yNWticHMgICovDQorCVZPQU1SV0JfTUQxNTg1CQk9IDQsCS8qITwgMTUuODVicHMgICAqLw0KKwlWT0FNUldCX01EMTgyNQkJPSA1LAkvKiE8IDE4LjI1YnBzICAgKi8NCisJVk9BTVJXQl9NRDE5ODUJCT0gNiwJLyohPCAxOS44NWticHMgICovDQorCVZPQU1SV0JfTUQyMzA1CQk9IDcsICAgIC8qITwgMjMuMDVrYnBzICAqLw0KKwlWT0FNUldCX01EMjM4NSAgICAgICAgICA9IDgsICAgIC8qITwgMjMuODVrYnBzPiAqLwkNCisJVk9BTVJXQl9OX01PREVTIAk9IDksCS8qITwgSW52YWxpZCBtb2RlICovDQorCVZPQU1SV0JfTU9ERV9NQVggICAgPSBWT19NQVhfRU5VTV9WQUxVRQ0KKwkNCit9Vk9BTVJXQk1PREU7DQorDQorLyohKiB0aGUgZnJhbWUgZm9ybWF0IHRoZSBjb2RlYyBzdXBwb3J0cyovDQordHlwZWRlZiBlbnVtIHsNCisJVk9BTVJXQl9ERUZBVUxUICAJPSAwLAkvKiE8IHRoZSBmcmFtZSB0eXBlIGlzIHRoZSBoZWFkZXIgKGRlZmluZWQgaW4gUkZDMzI2NykgKyByYXdkYXRhKi8NCisJLypPbmUgd29yZCAoMi1ieXRlKSBmb3Igc3luYyB3b3JkICgweDZiMjEpKi8NCisJLypPbmUgd29yZCAoMi1ieXRlKSBmb3IgZnJhbWUgbGVuZ3RoIE4uKi8NCisJLypOIHdvcmRzICgyLWJ5dGUpIGNvbnRhaW5pbmcgTiBiaXRzIChiaXQgMCA9IDB4MDA3ZiwgYml0IDEgPSAweDAwODEpLiovDQorCVZPQU1SV0JfSVRVICAgICAgICAgPSAxLCANCisJLypPbmUgd29yZCAoMi1ieXRlKSBmb3Igc3luYyB3b3JkICgweDZiMjEpLiovDQorCS8qT25lIHdvcmQgKDItYnl0ZSkgdG8gaW5kaWNhdGUgdGhlIGZyYW1lIHR5cGUuKi8JDQorCS8qT25lIHdvcmQgKDItYnl0ZSkgdG8gaW5kaWNhdGUgdGhlIG1vZGUuKi8NCisJLypOIHdvcmRzICAoMi1ieXRlKSBjb250YWluaW5nIE4gYml0cyAoYml0IDAgPSAweGZmODEsIGJpdCAxID0gMHgwMDdmKS4qLw0KKwlWT0FNUldCX1JGQzMyNjcJCT0gMiwJLyogc2VlIFJGQyAzMjY3ICovICANCisgICAgVk9BTVJXQl9UTUFYICAgICAgICA9IFZPX01BWF9FTlVNX1ZBTFVFCQ0KK31WT0FNUldCRlJBTUVUWVBFOw0KKw0KKw0KKyNkZWZpbmUgICAgVk9fUElEX0FNUldCX01vZHVsZQkJCQkJCQkweDQyMjYxMDAwIA0KKyNkZWZpbmUgICAgVk9fUElEX0FNUldCX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKFZPX1BJRF9BTVJXQl9Nb2R1bGUgfCAweDAwMDIpDQorI2RlZmluZSAgICBWT19QSURfQU1SV0JfQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAgICAoVk9fUElEX0FNUldCX01vZHVsZSB8IDB4MDAwMykNCisjZGVmaW5lICAgIFZPX1BJRF9BTVJXQl9TQU1QTEVSQVRFICAgICAgICAgICAgICAgICAgICAgIChWT19QSURfQU1SV0JfTW9kdWxlIHwgMHgwMDA0KQ0KKyNkZWZpbmUgICAgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSAgICAgICAgICAgICAgICAgICAgICAgKFZPX1BJRF9BTVJXQl9Nb2R1bGUgfCAweDAwMDUpDQorI2RlZmluZSAgICBWT19QSURfQU1SV0JfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9fUElEX0FNUldCX01vZHVsZSB8IDB4MDAwNikNCisjZGVmaW5lICAgIFZPX1BJRF9BTVJXQl9EVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWT19QSURfQU1SV0JfTW9kdWxlIHwgMHgwMDA3KQ0KKw0KKy8qKg0KKyAqIEdldCBhdWRpbyBjb2RlYyBBUEkgaW50ZXJmYWNlDQorICogXHBhcmFtIHBFbmNIYW5kbGUgW291dF0gUmV0dXJuIHRoZSBBTVJXQiBFbmNvZGVyIGhhbmRsZS4NCisgKiBccmV0dmFsIFZPX0VSUl9PSyBTdWNjZWVkZWQuDQorICovDQorVk9fUzMyIFZPX0FQSSB2b0dldEFNUldCRW5jQVBJKFZPX0FVRElPX0NPREVDQVBJICpwRW5jSGFuZGxlKTsNCisNCisNCisjcHJhZ21hIHBhY2socG9wKQ0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30gLyogZXh0ZXJuICJDIiAqLw0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKw0KKyNlbmRpZiAgIC8vX19WT0FNUldCX0hfXw0KKw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0F1ZGlvLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzlkZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9BdWRpby5oCkBAIC0wLDAgKzEsMTczIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl2b0F1ZGlvLmgNCisNCisJQ29udGVudDoJQXVkaW8gdHlwZXMgYW5kIGZ1bmN0aW9ucw0KKw0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBfX3ZvQXVkaW9fSF9fDQorI2RlZmluZSBfX3ZvQXVkaW9fSF9fDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovDQorDQorI2luY2x1ZGUgInZvSW5kZXguaCINCisjaW5jbHVkZSAidm9NZW0uaCINCisNCisjZGVmaW5lCVZPX1BJRF9BVURJT19CQVNFCQkJIDB4NDIwMDAwMDAJCQkJCQkJLyohPCBUaGUgYmFzZSBwYXJhbSBJRCBmb3IgQVVESU8gY29kZWMgKi8NCisjZGVmaW5lCVZPX1BJRF9BVURJT19GT1JNQVQJCQkoVk9fUElEX0FVRElPX0JBU0UgfCAwWDAwMDEpCQkvKiE8IFRoZSBmb3JtYXQgZGF0YSBvZiBhdWRpbyBpbiB0cmFjayAqLw0KKyNkZWZpbmUJVk9fUElEX0FVRElPX1NBTVBMRVJFQVRFCShWT19QSURfQVVESU9fQkFTRSB8IDBYMDAwMikJCS8qITwgVGhlIHNhbXBsZSByYXRlIG9mIGF1ZGlvICAqLw0KKyNkZWZpbmUJVk9fUElEX0FVRElPX0NIQU5ORUxTCQkoVk9fUElEX0FVRElPX0JBU0UgfCAwWDAwMDMpCQkvKiE8IFRoZSBjaGFubmVsIG9mIGF1ZGlvICovDQorI2RlZmluZQlWT19QSURfQVVESU9fQklUUkFURQkJKFZPX1BJRF9BVURJT19CQVNFIHwgMFgwMDA0KQkJLyohPCBUaGUgYml0IHJhdGUgb2YgYXVkaW8gKi8NCisjZGVmaW5lIFZPX1BJRF9BVURJT19DSEFOTkVMTU9ERQkoVk9fUElEX0FVRElPX0JBU0UgfCAwWDAwMDUpCQkvKiE8IFRoZSBjaGFubmVsIG1vZGUgb2YgYXVkaW8gKi8NCisNCisjZGVmaW5lCVZPX0VSUl9BVURJT19CQVNFCQkJMHg4MjAwMDAwMA0KKyNkZWZpbmUgVk9fRVJSX0FVRElPX1VOU0NIQU5ORUwJCVZPX0VSUl9BVURJT19CQVNFIHwgMHgwMDAxDQorI2RlZmluZSBWT19FUlJfQVVESU9fVU5TU0FNUExFUkFURQlWT19FUlJfQVVESU9fQkFTRSB8IDB4MDAwMg0KKyNkZWZpbmUgVk9fRVJSX0FVRElPX1VOU0ZFQVRVUkUJCVZPX0VSUl9BVURJT19CQVNFIHwgMHgwMDAzDQorDQorDQorLyoqDQorICpFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgYXVkaW8gY29kaW5nIGZvcm1hdHMuDQorICovDQordHlwZWRlZiBlbnVtIFZPX0FVRElPX0NPRElOR1RZUEUgew0KKwlWT19BVURJT19Db2RpbmdVbnVzZWQgPSAwLCAgLyoqPCBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGNvZGluZyBpcyBOL0EgICovDQorCVZPX0FVRElPX0NvZGluZ1BDTSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBDTSBjb2RpbmcgKi8NCisJVk9fQVVESU9fQ29kaW5nQURQQ00sICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQURQQ00gZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ0FNUk5CLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFNUiBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nQU1SV0IsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQU1SIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdBTVJXQlAsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBTVIgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ1FDRUxQMTMsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDEza2JwcyBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nRVZSQywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRVZSQyBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nQUFDLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQUFDIGVuY29kZWQgZGF0YSwgMHhBMTA2IC0gSVNPL01QRUctNCBBQUMsIDB4RkYgLSBBQUMgKi8NCisJVk9fQVVESU9fQ29kaW5nQUMzLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQUMzIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdGTEFDLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBGTEFDIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdNUDEsCQkJLyoqPCBBbnkgdmFyaWFudCBvZiBNUDEgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ01QMywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIE1QMyBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nT0dHLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgT0dHIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdXTUEsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBXTUEgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ1JBLCAgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFJBIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdNSURJLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNSURJIGVuY29kZWQgZGF0YSAqLw0KKwlWT19BVURJT19Db2RpbmdEUkEsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBkcmEgZW5jb2RlZCBkYXRhICovDQorCVZPX0FVRElPX0NvZGluZ0c3MjksICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIGRyYSBlbmNvZGVkIGRhdGEgKi8NCisJVk9fQVVESU9fQ29kaW5nX01BWAkJPSBWT19NQVhfRU5VTV9WQUxVRQ0KK30gVk9fQVVESU9fQ09ESU5HVFlQRTsNCisNCisvKiENCisqIHRoZSBjaGFubmVsIHR5cGUgdmFsdWUNCisqLw0KK3R5cGVkZWYgZW51bSB7DQorCVZPX0NIQU5ORUxfQ0VOVEVSCQkJCT0gMSwJLyohPGNlbnRlciBjaGFubmVsKi8NCisJVk9fQ0hBTk5FTF9GUk9OVF9MRUZUCQkJPSAxPDwxLAkvKiE8ZnJvbnQgbGVmdCBjaGFubmVsKi8NCisJVk9fQ0hBTk5FTF9GUk9OVF9SSUdIVAkJCT0gMTw8MiwJLyohPGZyb250IHJpZ2h0IGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX1NJREVfTEVGVCAgCQkJPSAxPDwzLCAvKiE8c2lkZSBsZWZ0IGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX1NJREVfUklHSFQJCQk9IDE8PDQsIC8qITxzaWRlIHJpZ2h0IGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0JBQ0tfTEVGVAkJCT0gMTw8NSwJLyohPGJhY2sgbGVmdCBjaGFubmVsKi8NCisJVk9fQ0hBTk5FTF9CQUNLX1JJR0hUCQkJPSAxPDw2LAkvKiE8YmFjayByaWdodCBjaGFubmVsKi8NCisJVk9fQ0hBTk5FTF9CQUNLX0NFTlRFUgkJCT0gMTw8NywJLyohPGJhY2sgY2VudGVyIGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0xGRV9CQVNTCQkJCT0gMTw8OCwJLyohPGxvdy1mcmVxdWVuY3kgZWZmZWN0cyBiYXNzIGNoYW5uZWwqLw0KKwlWT19DSEFOTkVMX0FMTAkJCQkJPSAweGZmZmYsLyohPFtkZWZhdWx0XSBpbmNsdWRlIGFsbCBjaGFubmVscyAqLw0KKwlWT19DSEFOTkVMX01BWAkJCQkJPSBWT19NQVhfRU5VTV9WQUxVRQ0KK30gVk9fQVVESU9fQ0hBTk5FTFRZUEU7DQorDQorLyoqDQorICogR2VuZXJhbCBhdWRpbyBmb3JtYXQgaW5mbw0KKyAqLw0KK3R5cGVkZWYgc3RydWN0DQorew0KKwlWT19TMzIJU2FtcGxlUmF0ZTsgIC8qITwgU2FtcGxlIHJhdGUgKi8NCisJVk9fUzMyCUNoYW5uZWxzOyAgICAvKiE8IENoYW5uZWwgY291bnQgKi8NCisJVk9fUzMyCVNhbXBsZUJpdHM7ICAvKiE8IEJpdHMgcGVyIHNhbXBsZSAqLw0KK30gVk9fQVVESU9fRk9STUFUOw0KKw0KKy8qKg0KKyAqIEdlbmVyYWwgYXVkaW8gb3V0cHV0IGluZm8NCisgKi8NCit0eXBlZGVmIHN0cnVjdA0KK3sNCisJVk9fQVVESU9fRk9STUFUCUZvcm1hdDsJCQkvKiE8IFNhbXBsZSByYXRlICovDQorCVZPX1UzMgkJCUlucHV0VXNlZDsJCS8qITwgQ2hhbm5lbCBjb3VudCAqLw0KKwlWT19VMzIJCQlSZXNldmVyOwkJLyohPCBSZXNldmVyZWQgKi8NCit9IFZPX0FVRElPX09VVFBVVElORk87DQorDQorLyoqDQorICogR2VuZXJhbCBhdWRpbyBjb2RlYyBmdW5jdGlvbiBzZXQNCisgKi8NCit0eXBlZGVmIHN0cnVjdCBWT19BVURJT19DT0RFQ0FQSQ0KK3sNCisJLyoqDQorCSAqIEluaXQgdGhlIGF1ZGlvIGNvZGVjIG1vZHVsZSBhbmQgcmV0dXJuIGNvZGVjIGhhbmRsZQ0KKwkgKiBccGFyYW0gcGhDb2RlYyBbT1VUXSBSZXR1cm4gdGhlIHZpZGVvIGNvZGVjIGhhbmRsZQ0KKwkgKiBccGFyYW0gdlR5cGUJW0lOXSBUaGUgY29kZWMgdHlwZSBpZiB0aGUgbW9kdWxlIHN1cHBvcnQgbXVsdGkgY29kZWMuDQorCSAqIFxwYXJhbSBwVXNlckRhdGEJW0lOXSBUaGUgaW5pdCBwYXJhbS4gSXQgaXMgZWl0aGVyIGEgbWVtb3J5IG9wZXJhdG9yIG9yIGFuIGFsbG9jYXRlZCBtZW1vcnkNCisJICogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorCSAqLw0KKwlWT19VMzIgKFZPX0FQSSAqIEluaXQpIChWT19IQU5ETEUgKiBwaENvZGVjLCBWT19BVURJT19DT0RJTkdUWVBFIHZUeXBlLCBWT19DT0RFQ19JTklUX1VTRVJEQVRBICogcFVzZXJEYXRhICk7DQorDQorCS8qKg0KKwkgKiBTZXQgaW5wdXQgYXVkaW8gZGF0YS4NCisJICogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgY29kZWMgaGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uDQorCSAqIFxwYXJhbSBwSW5wdXQgW0lOXSBUaGUgaW5wdXQgYnVmZmVyIHBhcmFtLg0KKwkgKiBccmV0dmFsIFZPX0VSUl9OT05FIFN1Y2NlZWRlZC4NCisJICovDQorCVZPX1UzMiAoVk9fQVBJICogU2V0SW5wdXREYXRhKSAoVk9fSEFORExFIGhDb2RlYywgVk9fQ09ERUNCVUZGRVIgKiBwSW5wdXQpOw0KKw0KKwkvKioNCisJICogR2V0IHRoZSBvdXR1dCBhdWRpbyBkYXRhDQorCSAqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIGNvZGVjIGhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKwkgKiBccGFyYW0gcE91dEJ1ZmZlciBbT1VUXSBUaGUgb3V0cHV0IGF1ZGlvIGRhdGENCisJICogXHBhcmFtIHBPdXRJbmZvIFtPVVRdIFRoZSBjb2RlYyBmaWxscyBhdWRpbyBmb3JtYXQgYW5kIHRoZSBpbnB1dCBkYXRhIHNpemUgdXNlZCBpbiBjdXJyZW50IGNhbGwuDQorCSAqCQkJCQkJIHBPdXRJbmZvLT5JbnB1dFVzZWQgaXMgdG90YWwgdXNlZCBpbnB1dCBkYXRhIHNpemUgaW4gYnl0ZS4NCisJICogXHJldHZhbCAgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKwkgKgkJCVZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwuIFRoZSBpbnB1dCB3YXMgZmluaXNoZWQgb3IgdGhlIGlucHV0IGRhdGEgd2FzIG5vdCBlbm91Z2h0LiBDb250aW51ZSB0byBpbnB1dCANCisJICoJCQkJCQkJCQkJZGF0YSBiZWZvcmUgbmV4dCBjYWxsLg0KKwkgKi8NCisJVk9fVTMyIChWT19BUEkgKiBHZXRPdXRwdXREYXRhKSAoVk9fSEFORExFIGhDb2RlYywgVk9fQ09ERUNCVUZGRVIgKiBwT3V0QnVmZmVyLCBWT19BVURJT19PVVRQVVRJTkZPICogcE91dEluZm8pOw0KKw0KKwkvKioNCisJICogU2V0IHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcGFyYW0gSUQuDQorCSAqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIGNvZGVjIGhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKwkgKiBccGFyYW0gdVBhcmFtSUQgW0lOXSBUaGUgcGFyYW0gSUQuDQorCSAqIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZS4NCisJICogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorCSAqLw0KKwlWT19VMzIgKFZPX0FQSSAqIFNldFBhcmFtKSAoVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpOw0KKw0KKwkvKioNCisJICogR2V0IHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcGFyYW0gSUQuDQorCSAqIFxwYXJhbSBoQ29kZWMgW0lOXV0gVGhlIGNvZGVjIGhhbmRsZSB3aGljaCB3YXMgY3JlYXRlZCBieSBJbml0IGZ1bmN0aW9uLg0KKwkgKiBccGFyYW0gdVBhcmFtSUQgW0lOXSBUaGUgcGFyYW0gSUQuDQorCSAqIFxwYXJhbSBwRGF0YSBbSU5dIFRoZSBwYXJhbSB2YWx1ZS4NCisJICogXHJldHZhbCBWT19FUlJfTk9ORSBTdWNjZWVkZWQuDQorCSAqLw0KKwlWT19VMzIgKFZPX0FQSSAqIEdldFBhcmFtKSAoVk9fSEFORExFIGhDb2RlYywgVk9fUzMyIHVQYXJhbUlELCBWT19QVFIgcERhdGEpOw0KKw0KKwkvKioNCisJICogVW5pbml0IHRoZSBDb2RlYy4NCisJICogXHBhcmFtIGhDb2RlYyBbSU5dXSBUaGUgY29kZWMgaGFuZGxlIHdoaWNoIHdhcyBjcmVhdGVkIGJ5IEluaXQgZnVuY3Rpb24uDQorCSAqIFxyZXR2YWwgVk9fRVJSX05PTkUgU3VjY2VlZGVkLg0KKwkgKi8NCisJVk9fVTMyIChWT19BUEkgKiBVbmluaXQpIChWT19IQU5ETEUgaENvZGVjKTsNCit9IFZPX0FVRElPX0NPREVDQVBJOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjZW5kaWYgLy8gX192b0F1ZGlvX0hfXw0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b0luZGV4LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9JbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWEwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9JbmRleC5oCkBAIC0wLDAgKzEsMTkzIEBACisvKg0KKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLg0KKyAqKg0KKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKioNCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqKg0KKyAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorCUZpbGU6CQl2b0luZGV4LmgNCisNCisJQ29udGVudDoJbW9kdWxlIGFuZCBJRCBkZWZpbml0aW9uDQorDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9fdm9JbmRleF9IX18NCisjZGVmaW5lIF9fdm9JbmRleF9IX18NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjaW5jbHVkZSAidm9UeXBlLmgiDQorDQorLyogRGVmaW5lIHRoZSBtb2R1bGUgSUQgKi8NCisjZGVmaW5lIF9NQUtFX1NPVVJDRV9JRChpZCwgbmFtZSkgXA0KK1ZPX0lOREVYX1NSQ18jI25hbWUgPSBfVk9fSU5ERVhfU09VUkNFIHwgaWQsDQorDQorI2RlZmluZSBfTUFLRV9DT0RFQ19JRChpZCwgbmFtZSkgXA0KK1ZPX0lOREVYX0RFQ18jI25hbWUgPSBfVk9fSU5ERVhfREVDIHwgaWQsIFwNCitWT19JTkRFWF9FTkNfIyNuYW1lID0gX1ZPX0lOREVYX0VOQyB8IGlkLA0KKw0KKyNkZWZpbmUgX01BS0VfRUZGRUNUX0lEKGlkLCBuYW1lKSBcDQorVk9fSU5ERVhfRUZUXyMjbmFtZSA9IF9WT19JTkRFWF9FRkZFQ1QgfCBpZCwNCisNCisjZGVmaW5lIF9NQUtFX1NJTktfSUQoaWQsIG5hbWUpIFwNCitWT19JTkRFWF9TTktfIyNuYW1lID0gX1ZPX0lOREVYX1NJTksgfCBpZCwNCisNCisjZGVmaW5lIF9NQUtFX0ZJTFRFUl9JRChpZCwgbmFtZSkgXA0KK1ZPX0lOREVYX0ZMVF8jI25hbWUgPSBfVk9fSU5ERVhfRklMVEVSIHwgaWQsDQorDQorI2RlZmluZSBfTUFLRV9PTVhfSUQoaWQsIG5hbWUpIFwNCitWT19JTkRFWF9PTVhfIyNuYW1lID0gX1ZPX0lOREVYX09NWCB8IGlkLA0KKw0KKyNkZWZpbmUgX01BS0VfTUZXX0lEKGlkLCBuYW1lKSBcDQorVk9fSU5ERVhfTUZXXyMjbmFtZSA9IF9WT19JTkRFWF9NRlcgfCBpZCwNCisNCitlbnVtDQorew0KKwlfVk9fSU5ERVhfU09VUkNFCQk9IDB4MDEwMDAwMDAsDQorCV9WT19JTkRFWF9ERUMJCQk9IDB4MDIwMDAwMDAsDQorCV9WT19JTkRFWF9FTkMJCQk9IDB4MDMwMDAwMDAsDQorCV9WT19JTkRFWF9FRkZFQ1QJCT0gMHgwNDAwMDAwMCwNCisJX1ZPX0lOREVYX1NJTksJCQk9IDB4MDUwMDAwMDAsDQorCV9WT19JTkRFWF9GSUxURVIJCT0gMHgwNjAwMDAwMCwNCisJX1ZPX0lOREVYX09NWAkJCT0gMHgwNzAwMDAwMCwNCisJX1ZPX0lOREVYX01GVwkJCT0gMHgwODAwMDAwMCwNCisNCisJLy8gZGVmaW5lIGZpbGUgcGFyc2VyIG1vZHVsZXMNCisJX01BS0VfU09VUkNFX0lEICgweDAxMDAwMCwgTVA0KQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MDIwMDAwLCBBVkkpDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgwMzAwMDAsIEFTRikNCisJX01BS0VfU09VUkNFX0lEICgweDA0MDAwMCwgUkVBTCkNCisJX01BS0VfU09VUkNFX0lEICgweDA1MDAwMCwgQVVESU8pDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgwNjAwMDAsIEZMQVNIKQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MDcwMDAwLCBPR0cpDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgwODAwMDAsIE1LVikNCisNCisJLy8gZGVmaW5lIG5ldHdvcmsgc291cmNlIG1vZHVsZXMNCisJX01BS0VfU09VUkNFX0lEICgweDExMDAwMCwgUlRTUCkNCisJX01BS0VfU09VUkNFX0lEICgweDEyMDAwMCwgSFRUUCkNCisNCisJLy8gZGVmaW5lIENNTUIgc291cmNlIG1vZHVsZXMNCisJX01BS0VfU09VUkNFX0lEICgweDIwMDAwMCwgQ01NQikNCisJX01BS0VfU09VUkNFX0lEICgweDIxMDAwMCwgQ01NQl9JTk5PKQ0KKwlfTUFLRV9TT1VSQ0VfSUQgKDB4MjIwMDAwLCBDTU1CX1RFTEUpDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgyMzAwMDAsIENNTUJfU0lBTk8pDQorDQorCS8vIGRlZmluZSBEVkJUIHNvdXJjZSBtb2R1bGVzDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgzMDAwMDAsIERWQlQpDQorCV9NQUtFX1NPVVJDRV9JRCAoMHgzMTAwMDAsIERWQlRfRElCQ09NKQ0KKw0KKwkvLyBkZWZpbmUgb3RoZXIgc291cmNlIG1vZHVsZXMNCisJX01BS0VfU09VUkNFX0lEICgweDQwMDAwMCwgSUQzKQ0KKw0KKwkvLyBkZWZpbmUgdmlkZW8gY29kZWMgbW9kdWxlcw0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwMTAwMDAsIEgyNjQpDQorCV9NQUtFX0NPREVDX0lEICgweDAyMDAwMCwgTVBFRzQpDQorCV9NQUtFX0NPREVDX0lEICgweDAzMDAwMCwgSDI2MykNCisJX01BS0VfQ09ERUNfSUQgKDB4MDQwMDAwLCBTMjYzKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwNTAwMDAsIFJWKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgwNjAwMDAsIFdNVikNCisJX01BS0VfQ09ERUNfSUQgKDB4MDcwMDAwLCBESVZYMykNCisJX01BS0VfQ09ERUNfSUQgKDB4MDgwMDAwLCBNSlBFRykNCisJX01BS0VfQ09ERUNfSUQgKDB4MDkwMDAwLCBNUEVHMikNCisJX01BS0VfQ09ERUNfSUQgKDB4MEEwMDAwLCBWUDYpDQorDQorCS8vIGRlZmluZSBhdWRpbyBjb2RlYyBtb2R1bGVzDQorCV9NQUtFX0NPREVDX0lEICgweDIxMDAwMCwgQUFDKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgyMjAwMDAsIE1QMykNCisJX01BS0VfQ09ERUNfSUQgKDB4MjMwMDAwLCBXTUEpDQorCV9NQUtFX0NPREVDX0lEICgweDI0MDAwMCwgUkEpDQorCV9NQUtFX0NPREVDX0lEICgweDI1MDAwMCwgQU1STkIpDQorCV9NQUtFX0NPREVDX0lEICgweDI2MDAwMCwgQU1SV0IpDQorCV9NQUtFX0NPREVDX0lEICgweDI3MDAwMCwgQU1SV0JQKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgyODAwMDAsIFFDRUxQKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgyOTAwMDAsIEVWUkMpDQorCV9NQUtFX0NPREVDX0lEICgweDJBMDAwMCwgQURQQ00pDQorCV9NQUtFX0NPREVDX0lEICgweDJCMDAwMCwgTUlESSkNCisJX01BS0VfQ09ERUNfSUQgKDB4MkMwMDAwLCBBQzMpDQorCV9NQUtFX0NPREVDX0lEICgweDJEMDAwMCwgRkxBQykNCisJX01BS0VfQ09ERUNfSUQgKDB4MkUwMDAwLCBEUkEpDQorCV9NQUtFX0NPREVDX0lEICgweDJGMDAwMCwgT0dHKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHgzMDAwMDAsIEc3MjkpDQorDQorCS8vIGRlZmluZSBpbWFnZSBjb2RlYyBtb2R1bGVzDQorCV9NQUtFX0NPREVDX0lEICgweDQxMDAwMCwgSlBFRykNCisJX01BS0VfQ09ERUNfSUQgKDB4NDIwMDAwLCBHSUYpDQorCV9NQUtFX0NPREVDX0lEICgweDQzMDAwMCwgUE5HKQ0KKwlfTUFLRV9DT0RFQ19JRCAoMHg0NDAwMDAsIFRJRikNCisNCisJLy8gZGVmaW5lIGVmZmVjdCBtb2R1bGVzDQorCV9NQUtFX0VGRkVDVF9JRCAoMHgwMTAwMDAsIEVRKQ0KKw0KKwkvLyBkZWZpbmUgc2luayBtb2R1bGVzDQorCV9NQUtFX1NJTktfSUQgKDB4MDEwMDAwLCBWSURFTykNCisJX01BS0VfU0lOS19JRCAoMHgwMjAwMDAsIEFVRElPKQ0KKwlfTUFLRV9TSU5LX0lEICgweDAzMDAwMCwgQ0NSUlIpDQorCV9NQUtFX1NJTktfSUQgKDB4MDQwMDAwLCBDQ1JSVikNCisNCisJX01BS0VfU0lOS19JRCAoMHgxMTAwMDAsIE1QNCkNCisJX01BS0VfU0lOS19JRCAoMHgxMjAwMDAsIEFWSSkNCisJX01BS0VfU0lOS19JRCAoMHgxMzAwMDAsIEFGVykNCisNCisJLy8gZGVmaW5lIG1lZGlhIGZyYW1lIG1vZHVsZSBJRA0KKwlfTUFLRV9NRldfSUQgKDB4MDEwMDAwLCBWT01NUExBWSkNCisJX01BS0VfTUZXX0lEICgweDAyMDAwMCwgVk9NTVJFQykNCisJX01BS0VfTUZXX0lEICgweDAzMDAwMCwgVk9NRSkNCit9Ow0KKw0KKw0KKy8qIGRlZmluZSB0aGUgZXJyb3IgSUQgKi8NCisjZGVmaW5lIFZPX0VSUl9OT05FCQkJCQkJMHgwMDAwMDAwMA0KKyNkZWZpbmUgVk9fRVJSX0ZJTklTSAkJCQkJMHgwMDAwMDAwMQ0KKyNkZWZpbmUgVk9fRVJSX0JBU0UJCQkJCQkwWDgwMDAwMDAwDQorI2RlZmluZSBWT19FUlJfRkFJTEVECQkJCQkweDgwMDAwMDAxDQorI2RlZmluZSBWT19FUlJfT1VUT0ZfTUVNT1JZCQkJCTB4ODAwMDAwMDINCisjZGVmaW5lIFZPX0VSUl9OT1RfSU1QTEVNRU5UCQkJMHg4MDAwMDAwMw0KKyNkZWZpbmUgVk9fRVJSX0lOVkFMSURfQVJHCQkJCTB4ODAwMDAwMDQNCisjZGVmaW5lIFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwJCTB4ODAwMDAwMDUNCisjZGVmaW5lIFZPX0VSUl9PVVRQVVRfQlVGRkVSX1NNQUxMCQkweDgwMDAwMDA2DQorI2RlZmluZSBWT19FUlJfV1JPTkdfU1RBVFVTCQkJCTB4ODAwMDAwMDcNCisjZGVmaW5lIFZPX0VSUl9XUk9OR19QQVJBTV9JRAkJCTB4ODAwMDAwMDgNCisjZGVmaW5lIFZPX0VSUl9MSUNFTlNFX0VSUk9SCQkJMHg4MDAwMDAwOQ0KKw0KKy8qIHh4eCBpcyB0aGUgbW9kdWxlIElEDQorI2RlZmluZSBWT19FUlJfRkFJTEVECQkJCQkweDh4eHgwMDAxDQorI2RlZmluZSBWT19FUlJfT1VUT0ZfTUVNT1JZCQkJCTB4OHh4eDAwMDINCisjZGVmaW5lIFZPX0VSUl9OT1RfSU1QTEVNRU5UCQkJMHg4eHh4MDAwMw0KKyNkZWZpbmUgVk9fRVJSX0lOVkFMSURfQVJHCQkJCTB4OHh4eDAwMDQNCisjZGVmaW5lIFZPX0VSUl9JTlBVVF9CVUZGRVJfU01BTEwJCTB4OHh4eDAwMDUNCisjZGVmaW5lIFZPX0VSUl9PVVRQVVRfQlVGRkVSX1NNQUxMCQkweDh4eHgwMDA2DQorI2RlZmluZSBWT19FUlJfV1JPTkdfU1RBVFVTCQkJCTB4OHh4eDAwMDcNCisjZGVmaW5lIFZPX0VSUl9XUk9OR19QQVJBTV9JRAkJCTB4OHh4eDAwMDgNCisjZGVmaW5lIFZPX0VSUl9MSUNFTlNFX0VSUk9SCQkJMHg4eHh4MDAwOQ0KKy8vIE1vZHVsZSBvd24gZXJyb3IgSUQNCisjZGVmaW5lIFZPX0VSUl9Nb2R1bGUJCQkJCTB4OHh4eDBYMDANCisqLw0KKyANCisjZGVmaW5lCVZPX1BJRF9DT01NT05fQkFTRQkJCQkgMHg0MDAwMDAwMAkJCQkJCS8qITwgVGhlIGJhc2Ugb2YgY29tbW9uIHBhcmFtIElEICovDQorI2RlZmluZQlWT19QSURfQ09NTU9OX1FVRVJZTUVNCQkJKFZPX1BJRF9DT01NT05fQkFTRSB8IDBYMDAwMSkJLyohPCBRdWVyeSB0aGUgbWVtb3J5IG5lZWRlZDsgUmVzZXJ2ZWQuICovDQorI2RlZmluZQlWT19QSURfQ09NTU9OX0lOUFVUVFlQRQkJCShWT19QSURfQ09NTU9OX0JBU0UgfCAwWDAwMDIpCS8qITwgU2V0IG9yIGdldCB0aGUgaW5wdXQgYnVmZmVyIHR5cGUuIFZPX0lOUFVUX1RZUEUgKi8NCisjZGVmaW5lCVZPX1BJRF9DT01NT05fSEFTUkVTT1VSQ0UJCShWT19QSURfQ09NTU9OX0JBU0UgfCAwWDAwMDMpCS8qITwgUXVlcnkgaXQgaGFzIHJlc291cmNlIHRvIGJlIHVzZWQuIFZPX1UzMiAqLCAxIGhhdmUsIDAgTm8gKi8NCisjZGVmaW5lCVZPX1BJRF9DT01NT05fSEVBRERBVEEJCQkoVk9fUElEX0NPTU1PTl9CQVNFIHwgMFgwMDA0KQkvKiE8IERlY29kZXIgdHJhY2sgaGVhZGVyIGRhdGEuIFZPX0NPREVDQlVGRkVSICogKi8NCisjZGVmaW5lCVZPX1BJRF9DT01NT05fRkxVU0gJCQkJKFZPX1BJRF9DT01NT05fQkFTRSB8IDBYMDAwNSkJLyohPCBGbHVzaCB0aGUgY29kZWMgYnVmZmVyLiBWT19VMzIgKiwgMSBGbHVzaCwgMCBObyAqICovDQorDQorLyoNCisvLyBNb2R1bGUgUGFyYW0gSUQNCisjZGVmaW5lIFZPX0lEX01kb3VsZQkJCQkJMHgweHh4MTAwMA0KKyovDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNlbmRpZiAvLyBfX3ZvSW5kZXhfSF9fDQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvTWVtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9NZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGZiNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvTWVtLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCUZpbGU6CQl2b01lbS5oCisKKwlDb250ZW50OgltZW1vcnkgZnVuY3Rpb25zICYgZGF0YSBzdHJ1Y3R1cmVzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX192b01lbV9IX18KKyNkZWZpbmUgX192b01lbV9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjaW5jbHVkZSAidm9JbmRleC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworCVZPX1MzMgkJCQlTaXplOwkJCQkvKiE8IEJ1ZmZlciBzdHJpZGUgKi8KKwlWT19TMzIJCQkJRmxhZzsKKwlWT19QVFIJCQkJVkJ1ZmZlcjsJCQkvKiE8IHVzZXIgZGF0YSBwb2ludGVyICovCisJVk9fUFRSCQkJCVBCdWZmZXI7CQkJLyohPCB1c2VyIGRhdGEgcG9pbnRlciAqLworfQorVk9fTUVNX0lORk87CisKK3R5cGVkZWYgc3RydWN0IFZPX01FTV9PUEVSQVRPUgoreworCVZPX1UzMiAoVk9fQVBJICogQWxsb2MpIChWT19TMzIgdUlELCBWT19NRU1fSU5GTyAqIHBNZW1JbmZvKTsKKwlWT19VMzIgKFZPX0FQSSAqIEZyZWUpIChWT19TMzIgdUlELCBWT19QVFIgcEJ1ZmYpOworCVZPX1UzMiAoVk9fQVBJICogU2V0KSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmLCBWT19VOCB1VmFsdWUsIFZPX1UzMiB1U2l6ZSk7CisJVk9fVTMyIChWT19BUEkgKiBDb3B5KSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKTsKKwlWT19VMzIgKFZPX0FQSSAqIENoZWNrKSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIsIFZPX1UzMiB1U2l6ZSk7CisJVk9fUzMyIChWT19BUEkgKiBDb21wYXJlKSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBCdWZmZXIxLCBWT19QVFIgcEJ1ZmZlcjIsIFZPX1UzMiB1U2l6ZSk7CisJVk9fVTMyIChWT19BUEkgKiBNb3ZlKSAoVk9fUzMyIHVJRCwgVk9fUFRSIHBEZXN0LCBWT19QVFIgcFNvdXJjZSwgVk9fVTMyIHVTaXplKTsKK30gVk9fTUVNX09QRVJBVE9SOworCisjZGVmaW5lIHZvTWVtQWxsb2MocEJ1ZmYsIHBNZW1PUCwgSUQsIG5TaXplKSBcCit7IFwKKwlWT19NRU1fSU5GTyB2b01lbUluZm87IFwKKwl2b01lbUluZm8uU2l6ZT1uU2l6ZTsgXAorCXBNZW1PUC0+QWxsb2MoSUQsICZ2b01lbUluZm8pOyBcCisJcEJ1ZmY9KFZPX1BCWVRFKXZvTWVtSW5mby5WQnVmZmVyOyBcCit9CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8vIF9fdm9NZW1fSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9UeXBlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9UeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY2OTEzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b1R5cGUuaApAQCAtMCwwICsxLDIyMSBAQAorLyoNCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4NCisgKioNCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoqDQorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKioNCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KKyAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKwlGaWxlOgkJdm9UeXBlLmgNCisNCisJQ29udGVudDoJZGF0YSB0eXBlIGRlZmluaXRpb24NCisNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNpZm5kZWYgX192b1R5cGVfSF9fDQorI2RlZmluZSBfX3ZvVHlwZV9IX18NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8NCisNCisjaWZkZWYgX1dJTjMyDQorIwlkZWZpbmUgVk9fQVBJIF9fY2RlY2wNCisjCWRlZmluZSBWT19DQkkgX19zdGRjYWxsDQorI2Vsc2UNCisjCWRlZmluZSBWT19BUEkNCisjCWRlZmluZSBWT19DQkkNCisjZW5kaWYgLy9fV0lOMzINCisNCisvKiogVk9fSU4gaXMgdXNlZCB0byBpZGVudGlmeSBpbnB1dHMgdG8gYW4gVk8gZnVuY3Rpb24uICBUaGlzIGRlc2lnbmF0aW9uDQorICAgIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIHBhcmFtZXRlcg0KKyAgICB0aGF0IGlzIHVzZWQgYXMgYW4gb3V0cHV0LiAqLw0KKyNpZm5kZWYgVk9fSU4NCisjZGVmaW5lIFZPX0lODQorI2VuZGlmDQorDQorLyoqIFZPX09VVCBpcyB1c2VkIHRvIGlkZW50aWZ5IG91dHB1dHMgZnJvbSBhbiBWTyBmdW5jdGlvbi4gIFRoaXMNCisgICAgZGVzaWduYXRpb24gd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzDQorICAgIHRvIGEgcGFyYW1ldGVyIHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dC4gKi8NCisjaWZuZGVmIFZPX09VVA0KKyNkZWZpbmUgVk9fT1VUDQorI2VuZGlmDQorDQorLyoqIFZPX0lOT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgcGFyYW1ldGVycyB0aGF0IG1heSBiZSBlaXRoZXIgaW5wdXRzIG9yDQorICAgIG91dHB1dHMgZnJvbSBhbiBWTyBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lLiAgVGhpcyBkZXNpZ25hdGlvbiB3aWxsDQorICAgIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCAgcG9pbnRzIHRvIGEgcGFyYW1ldGVyIHRoYXQNCisgICAgaXMgdXNlZCBib3RoIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQuICovDQorI2lmbmRlZiBWT19JTk9VVA0KKyNkZWZpbmUgVk9fSU5PVVQNCisjZW5kaWYNCisNCisjZGVmaW5lIFZPX01BWF9FTlVNX1ZBTFVFCTBYN0ZGRkZGRkYNCisNCisvKiogVk9fVk9JRCAqLw0KK3R5cGVkZWYgdm9pZCBWT19WT0lEOw0KKw0KKy8qKiBWT19VOCBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLw0KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBWT19VODsNCisNCisvKiogVk9fQllURSBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLw0KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBWT19CWVRFOw0KKw0KKy8qKiBWT19TOCBpcyBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8NCit0eXBlZGVmIHNpZ25lZCBjaGFyIFZPX1M4Ow0KKw0KKy8qKiBWT19DSEFSIGlzIGFuIDggYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLw0KK3R5cGVkZWYgY2hhciBWT19DSEFSOw0KKw0KKy8qKiBWT19VMTYgaXMgYSAxNiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovDQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBWT19VMTY7DQorDQorLyoqIFZPX1dDSEFSIGlzIGEgMTYgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLw0KKyNpZiBkZWZpbmVkIF9XSU4zMg0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgVk9fV0NIQVI7DQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCogVk9fUFdDSEFSOw0KKyNlbGlmIGRlZmluZWQgTElOVVgNCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVk9fV0NIQVI7DQordHlwZWRlZiB1bnNpZ25lZCBjaGFyKiBWT19QV0NIQVI7DQorI2VuZGlmDQorDQorLyoqIFZPX1MxNiBpcyBhIDE2IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovDQordHlwZWRlZiBzaWduZWQgc2hvcnQgVk9fUzE2Ow0KKw0KKy8qKiBWT19VMzIgaXMgYSAzMiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovDQordHlwZWRlZiB1bnNpZ25lZCBsb25nIFZPX1UzMjsNCisNCisvKiogVk9fUzMyIGlzIGEgMzIgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHNpZ25lZCBsb25nIFZPX1MzMjsNCisNCisvKiBVc2VycyB3aXRoIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBhY2NlcHQgdGhlICJsb25nIGxvbmciIGRlc2lnbmF0aW9uIHNob3VsZA0KKyAgIGRlZmluZSB0aGUgVk9fU0tJUDY0QklUIG1hY3JvLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyBtYXkgY2F1c2UNCisgICBzb21lIGNvbXBvbmVudHMgdG8gZmFpbCB0byBjb21waWxlIGlmIHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4gdG8gcmVxdWlyZQ0KKyAgIDY0IGJpdCBpbnRlZ3JhbCB0eXBlcy4gIEhvd2V2ZXIsIHRoZXNlIGNvbXBvbmVudHMgd291bGQgTk9UIGNvbXBpbGUgYW55d2F5DQorICAgc2luY2UgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHdheSB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuLg0KKyovDQorI2lmbmRlZiBWT19TS0lQNjRCSVQNCisjaWZkZWYgX1dJTjMyDQorLyoqIFZPX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIFZPX1U2NDsNCisvKiogVk9fUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8NCit0eXBlZGVmIHNpZ25lZCAgIF9faW50NjQgIFZPX1M2NDsNCisjZWxzZSAvLyBXSU4zMg0KKy8qKiBWT19VNjQgaXMgYSA2NCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovDQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgVk9fVTY0Ow0KKy8qKiBWT19TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLw0KK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBWT19TNjQ7DQorI2VuZGlmIC8vIFdJTjMyDQorI2VuZGlmIC8vIFZPX1NLSVA2NEJJVA0KKw0KKy8qKiBUaGUgVk9fQk9PTCB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdHJ1ZSBvciBhIGZhbHNlDQorICAgIHZhbHVlIHdoZW4gcGFzc2luZyBwYXJhbWV0ZXJzIHRvIGFuZCBmcm9tIHRoZSBWTyBjb3JlIGFuZCBjb21wb25lbnRzLiAgVGhlDQorICAgIFZPX0JPT0wgaXMgYSAzMiBiaXQgcXVhbnRpdHkgYW5kIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgd29yZCBib3VuZGFyeS4NCisgKi8NCit0eXBlZGVmIGVudW0gVk9fQk9PTCB7DQorICAgIFZPX0ZBTFNFID0gMCwNCisgICAgVk9fVFJVRSA9ICFWT19GQUxTRSwNCisJVk9fQk9PTF9NQVggPSBWT19NQVhfRU5VTV9WQUxVRQ0KK30gVk9fQk9PTDsNCisNCisvKiogVGhlIFZPX1BUUiB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBwb2ludGVycyBiZXR3ZWVuIHRoZSBWTw0KKyAgICBhcHBsaWNhdGlvbnMgYW5kIHRoZSBWTyBDb3JlIGFuZCBjb21wb25lbnRzLiAgVGhpcyBpcyBhIDMyIGJpdCBwb2ludGVyIGFuZA0KKyAgICBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IGJvdW5kYXJ5Lg0KKyAqLw0KK3R5cGVkZWYgdm9pZCogVk9fUFRSOw0KKw0KKy8qKiBUaGUgVk9fSEFORExFIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIHBvaW50ZXJzIGJldHdlZW4gdGhlIFZPDQorICAgIGFwcGxpY2F0aW9ucyBhbmQgdGhlIFZPIENvcmUgYW5kIGNvbXBvbmVudHMuICBUaGlzIGlzIGEgMzIgYml0IHBvaW50ZXIgYW5kDQorICAgIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgYm91bmRhcnkuDQorICovDQordHlwZWRlZiB2b2lkKiBWT19IQU5ETEU7DQorDQorLyoqIFRoZSBWT19TVFJJTkcgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgIkMiIHR5cGUgc3RyaW5ncyBiZXR3ZWVuDQorICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvcmUgYW5kIGNvbXBvbmVudC4gIFRoZSBWT19TVFJJTkcgdHlwZSBpcyBhIDMyDQorICAgIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkIGFsaWduZWQgYW5kDQorICAgIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLg0KKyAqLw0KK3R5cGVkZWYgY2hhciogVk9fUENIQVI7DQorDQorLyoqIFRoZSBWT19QQllURSB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBhcnJheXMgb2YgYnl0ZXMgc3VjaCBhcw0KKyAgICBidWZmZXJzIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IGFuZCBjb3JlLiAgVGhlIFZPX1BCWVRFDQorICAgIHR5cGUgaXMgYSAzMiBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZA0KKyAgICBhbGlnbmVkIGFuZCB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4NCisgKi8NCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIqIFZPX1BCWVRFOw0KKw0KKy8qKiBUaGUgVk9fUFRDSEFSIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIGFycmF5cyBvZiB3Y2hhciBzdWNoIGFzDQorICAgIHVuaWNvZGUgY2hhciBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudCBhbmQgY29yZS4gIFRoZSBWT19QVENIQVINCisgICAgdHlwZSBpcyBhIDMyIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkDQorICAgIGFsaWduZWQgYW5kIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLg0KKyAqLw0KKy8qDQorI2lmICFkZWZpbmVkIExJTlVYDQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCogVk9fUFRDSEFSOw0KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQqIFZPX1RDSEFSOw0KKyNlbHNlDQordHlwZWRlZiBjaGFyKiBWT19QVENIQVI7DQordHlwZWRlZiBjaGFyIFZPX1RDSEFSOw0KKyNlbmRpZg0KKyovDQorDQorI2lmbmRlZiBOVUxMDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorI2RlZmluZSBOVUxMICAgIDANCisjZWxzZQ0KKyNkZWZpbmUgTlVMTCAgICAoKHZvaWQgKikwKQ0KKyNlbmRpZg0KKyNlbmRpZg0KKw0KKy8qKg0KKyAqIElucHV0IHN0cmVhbSBmb3JtYXQsIEZyYW1lIG9yIFN0cmVhbS4uDQorICovDQordHlwZWRlZiBlbnVtIHsNCisgICAgVk9fSU5QVVRfRlJBTUUJPSAxLAkvKiE8IElucHV0IGNvbnRhaW5zIGNvbXBsZXRlbHkgZnJhbWUocykgZGF0YS4gKi8NCisgICAgVk9fSU5QVVRfU1RSRUFNLAkJLyohPCBJbnB1dCBpcyBzdHJlYW0gZGF0YS4gKi8NCisJVk9fSU5QVVRfU1RSRUFNX01BWCA9IFZPX01BWF9FTlVNX1ZBTFVFDQorfSBWT19JTlBVVF9UWVBFOw0KKw0KKw0KKy8qKg0KKyAqIEdlbmVyYWwgZGF0YSBidWZmZXIsIHVzZWQgYXMgaW5wdXQgb3Igb3V0cHV0Lg0KKyAqLw0KK3R5cGVkZWYgc3RydWN0IHsNCisJVk9fUEJZVEUJQnVmZmVyOwkJLyohPCBCdWZmZXIgcG9pbnRlciAqLw0KKwlWT19VMzIJCUxlbmd0aDsJCS8qITwgQnVmZmVyIHNpemUgaW4gYnl0ZSAqLw0KKwlWT19TNjQJCVRpbWU7CQkvKiE8IFRoZSB0aW1lIG9mIHRoZSBidWZmZXIgKi8NCit9IFZPX0NPREVDQlVGRkVSOw0KKw0KKw0KKy8qKg0KKyAqIFRoZSBpbml0IG1lbWRhdGEgZmxhZy4NCisgKi8NCit0eXBlZGVmIGVudW17DQorCVZPX0lNRl9VU0VSTUVNT1BFUkFUT1IJCT0wLAkvKiE8IG1lbURhdGEgaXMgIHRoZSBwb2ludGVyIG9mIG1lbW9wZXJhdG9yIGZ1bmN0aW9uKi8NCisJVk9fSU1GX1BSRUFMTE9DQVRFREJVRkZFUgk9MSwJLyohPCBtZW1EYXRhIGlzICBwcmVhbGxvY2F0ZWQgbWVtb3J5Ki8NCisJVk9fSU1GX01BWCA9IFZPX01BWF9FTlVNX1ZBTFVFDQorfVZPX0lOSVRfTUVNX0ZsQUc7DQorDQorDQorLyoqDQorICogVGhlIGluaXQgbWVtb3J5IHN0cnVjdHVyZS4uDQorICovDQordHlwZWRlZiBzdHJ1Y3R7DQorCVZPX0lOSVRfTUVNX0ZsQUcJCQltZW1mbGFnOwkvKiE8bWVtb3J5IGZsYWcgICovDQorCVZPX1BUUgkJCQkJCW1lbURhdGE7CS8qITxhIHBvaW50ZXIgdG8gVk9fTUVNX09QRVJBVE9SIG9yIGEgcHJlYWxsb2NhdGVkIGJ1ZmZlciAgKi8NCisJVk9fVTMyCQkJCQkJcmVzZXJ2ZWQxOwkvKiE8cmVzZXJ2ZWQgICovDQorCVZPX1UzMgkJCQkJCXJlc2VydmVkMjsJLyohPHJlc2VydmVkICovDQorfVZPX0NPREVDX0lOSVRfVVNFUkRBVEE7DQorDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfQ0KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLw0KKw0KKyNlbmRpZiAvLyBfX3ZvVHlwZV9IX18NCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQzMTIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiOWZlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTIgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgRzcxMURlY29kZXIuY3BwCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9nNzExZGVjCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9HNzExRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvRzcxMURlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MTRlNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvRzcxMURlY29kZXIuY3BwCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJHNzExRGVjb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkc3MTFEZWNvZGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4TnVtU2FtcGxlc1BlckZyYW1lID0gMTYzODQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRzcxMURlY29kZXI6Okc3MTFEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpIHsKK30KKworRzcxMURlY29kZXI6On5HNzExRGVjb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgRzcxMURlY29kZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgbUlzTUxhdyA9IGZhbHNlOworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpKSB7CisgICAgICAgIG1Jc01MYXcgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoCisgICAgICAgICAgICBuZXcgTWVkaWFCdWZmZXIoa01heE51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KSkpOworCisgICAgbVNvdXJjZS0+c3RhcnQoKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRzcxMURlY29kZXI6OnN0b3AoKSB7CisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOworCisgICAgbVNvdXJjZS0+c3RvcCgpOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IEc3MTFEZWNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKKworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKyAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgfQorCisgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIkc3MTFEZWNvZGVyIik7CisKKyAgICByZXR1cm4gbWV0YTsKK30KKworc3RhdHVzX3QgRzcxMURlY29kZXI6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgIHN0YXR1c190IGVycjsKKworICAgICpvdXQgPSBOVUxMOworCisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2Vla1RpbWVVcyA9IC0xOworICAgIH0KKworICAgIE1lZGlhQnVmZmVyICppbkJ1ZmZlcjsKKyAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZpbkJ1ZmZlciwgb3B0aW9ucyk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUpIHsKKyAgICAgICAgTE9HRSgiaW5wdXQgYnVmZmVyIHRvbyBsYXJnZSAoJWQpLiIsIGluQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgaW5CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgaW5CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhpbkJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgY29uc3QgdWludDhfdCAqaW5wdXRQdHIgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWluQnVmZmVyLT5kYXRhKCkgKyBpbkJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBNZWRpYUJ1ZmZlciAqb3V0QnVmZmVyOworICAgIENIRUNLX0VRKG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dEJ1ZmZlciksIE9LKTsKKworICAgIGlmIChtSXNNTGF3KSB7CisgICAgICAgIERlY29kZU1MYXcoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MTZfdCAqPihvdXRCdWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgaW5wdXRQdHIsIGluQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRGVjb2RlQUxhdygKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90ICo+KG91dEJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBpbnB1dFB0ciwgaW5CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICB9CisKKyAgICAvLyBFYWNoIDgtYml0IGJ5dGUgaXMgY29udmVydGVkIGludG8gYSAxNi1iaXQgc2FtcGxlLgorICAgIG91dEJ1ZmZlci0+c2V0X3JhbmdlKDAsIGluQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAqIDIpOworCisgICAgb3V0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICBpbkJ1ZmZlci0+cmVsZWFzZSgpOworICAgIGluQnVmZmVyID0gTlVMTDsKKworICAgICpvdXQgPSBvdXRCdWZmZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYwordm9pZCBHNzExRGVjb2Rlcjo6RGVjb2RlQUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUtLSA+IDApIHsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBHNzExRGVjb2Rlcjo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUtLSA+IDApIHsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OworICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgICBtYW50aXNzYSAmPSAweDBmOworCisgICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL000dkgyNjNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTTR2SDI2M0RlY29kZXIuY3BwCmluZGV4IDgzNTBmN2EuLjBmMDhmNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTTR2SDI2M0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTTR2SDI2M0RlY29kZXIuY3BwCkBAIC0zNyw3ICszNyw4IEBACiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtSGFuZGxlKG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzKSwKICAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKLSAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApIHsKKyAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAorICAgICAgbVRhcmdldFRpbWVVcygtMSkgewogCiAgICAgTE9HVigiTTR2SDI2M0RlY29kZXIiKTsKICAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKQEAgLTE0Niw2ICsxNDcsNyBAQAogICAgIG1Tb3VyY2UtPnN0YXJ0KCk7CiAKICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbVRhcmdldFRpbWVVcyA9IC0xOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAogICAgIHJldHVybiBPSzsKQEAgLTE3NSw4ICsxNzcsMTEgQEAKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKKyAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisgICAgICAgIHNlZWtpbmcgPSB0cnVlOwogICAgICAgICBDSEVDS19FUShQVlJlc2V0VmlkZW9EZWNvZGVyKG1IYW5kbGUpLCBQVl9UUlVFKTsKICAgICB9CiAKQEAgLTE4Niw2ICsxOTEsMTYgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBpZiAoc2Vla2luZykgeworICAgICAgICBpbnQ2NF90IHRhcmdldFRpbWVVczsKKyAgICAgICAgaWYgKGlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUYXJnZXRUaW1lLCAmdGFyZ2V0VGltZVVzKQorICAgICAgICAgICAgICAgICYmIHRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gdGFyZ2V0VGltZVVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICB9CisgICAgfQorCiAgICAgdWludDhfdCAqYml0c3RyZWFtID0KICAgICAgICAgKHVpbnQ4X3QgKikgaW5wdXRCdWZmZXItPmRhdGEoKSArIGlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIApAQCAtMjIxLDE3ICsyMzYsNDAgQEAKICAgICAgICAgcmV0dXJuIElORk9fRk9STUFUX0NIQU5HRUQ7CiAgICAgfQogCi0gICAgKm91dCA9IG1GcmFtZXNbbU51bVNhbXBsZXNPdXRwdXQgJiAweDAxXTsKLSAgICAoKm91dCktPmFkZF9yZWYoKTsKLQogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKGlucHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgKCpvdXQpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CiAKLSAgICArK21OdW1TYW1wbGVzT3V0cHV0OwogICAgIGlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgaW5wdXRCdWZmZXIgPSBOVUxMOwogCisgICAgYm9vbCBza2lwRnJhbWUgPSBmYWxzZTsKKworICAgIGlmIChtVGFyZ2V0VGltZVVzID49IDApIHsKKyAgICAgICAgQ0hFQ0sodGltZVVzIDw9IG1UYXJnZXRUaW1lVXMpOworCisgICAgICAgIGlmICh0aW1lVXMgPCBtVGFyZ2V0VGltZVVzKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgZnJhbWUgd2l0aCB0aGUgbWF0Y2hpbmcKKyAgICAgICAgICAgIC8vIHRpbWVzdGFtcCBhbmQgd2Ugd29uJ3QgcmV0dXJuIHRoZSBjdXJyZW50IG9uZS4KKyAgICAgICAgICAgIHNraXBGcmFtZSA9IHRydWU7CisKKyAgICAgICAgICAgIExPR1YoInNraXBwaW5nIGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HVigiZm91bmQgdGFyZ2V0IGZyYW1lIGF0ICVsbGQgdXMiLCB0aW1lVXMpOworCisgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2tpcEZyYW1lKSB7CisgICAgICAgICpvdXQgPSBuZXcgTWVkaWFCdWZmZXIoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm91dCA9IG1GcmFtZXNbbU51bVNhbXBsZXNPdXRwdXQgJiAweDAxXTsKKyAgICAgICAgKCpvdXQpLT5hZGRfcmVmKCk7CisgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIH0KKworICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmM5MzIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIE00dkgyNjNFbmNvZGVyLmNwcCBcCisgICAgc3JjL2JpdHN0cmVhbV9pby5jcHAgXAorICAgIHNyYy9jb21iaW5lZF9lbmNvZGUuY3BwIFwKKyAgICBzcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCBcCisgICAgc3JjL2RjdC5jcHAgXAorICAgIHNyYy9maW5kaGFsZnBlbC5jcHAgXAorICAgIHNyYy9mYXN0Y29kZW1iLmNwcCBcCisgICAgc3JjL2Zhc3RpZGN0LmNwcCBcCisgICAgc3JjL2Zhc3RxdWFudC5jcHAgXAorICAgIHNyYy9tZV91dGlscy5jcHAgXAorICAgIHNyYy9tcDRlbmNfYXBpLmNwcCBcCisgICAgc3JjL3JhdGVfY29udHJvbC5jcHAgXAorICAgIHNyYy9tb3Rpb25fZXN0LmNwcCBcCisgICAgc3JjL21vdGlvbl9jb21wLmNwcCBcCisgICAgc3JjL3NhZC5jcHAgXAorICAgIHNyYy9zYWRfaGFsZnBlbC5jcHAgXAorICAgIHNyYy92bGNfZW5jb2RlLmNwcCBcCisgICAgc3JjL3ZvcC5jcHAKKworCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYworCitMT0NBTF9DRkxBR1MgOj0gXAorICAgIC1EQlhfUkMgXAorICAgIC1ET1NDTF9JTVBPUlRfUkVGPSAtRE9TQ0xfVU5VU0VEX0FSRz0gLURPU0NMX0VYUE9SVF9SRUY9CisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvc3JjIFwKKyAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAorICAgICQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTTR2SDI2M0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9NNHZIMjYzRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxMTEzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTTR2SDI2M0VuY29kZXIuY3BwCkBAIC0wLDAgKzEsMzc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNNHZIMjYzRW5jb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk00dkgyNjNFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2lubGluZSBzdGF0aWMgdm9pZCBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICB1aW50OF90ICppbnl1diwgdWludDhfdCogb3V0eXV2LAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworCisgICAgaW50MzJfdCBvdXRZc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIHVpbnQzMl90ICpvdXR5ID0gKHVpbnQzMl90ICopICBvdXR5dXY7CisgICAgdWludDE2X3QgKm91dGNiID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSk7CisgICAgdWludDE2X3QgKm91dGNyID0gKHVpbnQxNl90ICopIChvdXR5dXYgKyBvdXRZc2l6ZSArIChvdXRZc2l6ZSA+PiAyKSk7CisKKyAgICAvKiBZIGNvcHlpbmcgKi8KKyAgICBtZW1jcHkob3V0eSwgaW55dXYsIG91dFlzaXplKTsKKworICAgIC8qIFUgJiBWIGNvcHlpbmcgKi8KKyAgICB1aW50MzJfdCAqaW55dXZfNCA9ICh1aW50MzJfdCAqKSAoaW55dXYgKyBvdXRZc2l6ZSk7CisgICAgZm9yIChpbnQzMl90IGkgPSBoZWlnaHQgPj4gMTsgaSA+IDA7IC0taSkgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IHdpZHRoID4+IDI7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSAqaW55dXZfNCsrOworICAgICAgICAgICAgdWludDMyX3QgdGVtcFUgPSB0ZW1wICYgMHhGRjsKKyAgICAgICAgICAgIHRlbXBVID0gdGVtcFUgfCAoKHRlbXAgPj4gOCkgJiAweEZGMDApOworCisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wViA9ICh0ZW1wID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHRlbXBWID0gdGVtcFYgfCAoKHRlbXAgPj4gMTYpICYgMHhGRjAwKTsKKworICAgICAgICAgICAgLy8gRmxpcCBVIGFuZCBWCisgICAgICAgICAgICAqb3V0Y2IrKyA9IHRlbXBWOworICAgICAgICAgICAgKm91dGNyKysgPSB0ZW1wVTsKKyAgICAgICAgfQorICAgIH0KK30KKworTTR2SDI2M0VuY29kZXI6Ok00dkgyNjNFbmNvZGVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtTnVtSW5wdXRGcmFtZXMoLTEpLAorICAgICAgbU5leHRNb2RUaW1lVXMoMCksCisgICAgICBtUHJldlRpbWVzdGFtcFVzKC0xKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1JbnB1dEZyYW1lRGF0YShOVUxMKSwKKyAgICAgIG1Hcm91cChOVUxMKSB7CisKKyAgICBMT0dWKCJDb25zdHJ1Y3Qgc29mdHdhcmUgTTR2SDI2M0VuY29kZXIiKTsKKworICAgIG1IYW5kbGUgPSBuZXcgdGFndmlkZW9FbmNDb250cm9sczsKKyAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRW5jQ29udHJvbHMpKTsKKworICAgIG1Jbml0Q2hlY2sgPSBpbml0Q2hlY2sobWV0YSk7Cit9CisKK000dkgyNjNFbmNvZGVyOjp+TTR2SDI2M0VuY29kZXIoKSB7CisgICAgTE9HVigiRGVzdHJ1Y3Qgc29mdHdhcmUgTTR2SDI2M0VuY29kZXIiKTsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKworICAgIGRlbGV0ZSBtRW5jUGFyYW1zOworICAgIGRlbGV0ZSBtSGFuZGxlOworfQorCitzdGF0dXNfdCBNNHZIMjYzRW5jb2Rlcjo6aW5pdENoZWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSkgeworICAgIExPR1YoImluaXRDaGVjayIpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtVmlkZW9XaWR0aCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbVZpZGVvSGVpZ2h0KSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVZpZGVvRnJhbWVSYXRlKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmbVZpZGVvQml0UmF0ZSkpOworCisgICAgLy8gWFhYOiBBZGQgbW9yZSBjb2xvciBmb3JtYXQgc3VwcG9ydAorICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZtVmlkZW9Db2xvckZvcm1hdCkpOworICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAgICAgTE9HRSgiQ29sb3IgZm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBtVmlkZW9Db2xvckZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8vIEFsbG9jYXRlIHNwYXJlIGJ1ZmZlciBvbmx5IHdoZW4gY29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCisgICAgICAgIC8vIEFzc3VtZSB0aGUgY29sb3IgZm9ybWF0IGlzIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLgorICAgICAgICBtSW5wdXRGcmFtZURhdGEgPQorICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKKyAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhKTsKKyAgICB9CisKKyAgICAvLyBYWFg6IFJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uCisgICAgaWYgKG1WaWRlb1dpZHRoICUgMTYgIT0gMCB8fCBtVmlkZW9IZWlnaHQgJSAxNiAhPSAwKSB7CisgICAgICAgIExPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1FbmNQYXJhbXMgPSBuZXcgdGFndmlkZW9FbmNPcHRpb25zOworICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YodGFndmlkZW9FbmNPcHRpb25zKSk7CisgICAgaWYgKCFQVkdldERlZmF1bHRFbmNPcHRpb24obUVuY1BhcmFtcywgMCkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGdldCBkZWZhdWx0IGVuY29kaW5nIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGtub3cgd2hpY2ggcm9sZSB0aGUgZW5jb2RlciBpcyBpbi4KKyAgICAvLyBYWFg6IFNldCB0aGUgbW9kZSBwcm9wZXIgZm9yIG90aGVyIHR5cGVzIG9mIGFwcGxpY2F0aW9ucworICAgIC8vICAgICAgbGlrZSBzdHJlYW1pbmcgb3IgdmlkZW8gY29uZmVyZW5jZQorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpIHx8CisgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzKSk7CisgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmVuY01vZGUgPSBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmVuY01vZGUgPSBIMjYzX01PREU7CisgICAgfQorICAgIG1FbmNQYXJhbXMtPmVuY1dpZHRoWzBdID0gbVZpZGVvV2lkdGg7CisgICAgbUVuY1BhcmFtcy0+ZW5jSGVpZ2h0WzBdID0gbVZpZGVvSGVpZ2h0OworICAgIG1FbmNQYXJhbXMtPmVuY0ZyYW1lUmF0ZVswXSA9IG1WaWRlb0ZyYW1lUmF0ZTsKKyAgICBtRW5jUGFyYW1zLT5yY1R5cGUgPSBWQlJfMTsKKyAgICBtRW5jUGFyYW1zLT52YnZEZWxheSA9IChmbG9hdCk1LjA7CisKKyAgICAvLyBTZXQgcHJvZmlsZSBhbmQgbGV2ZWwKKyAgICAvLyBJZiBwcm9maWxlIGFuZCBsZXZlbCBzZXR0aW5nIGlzIG5vdCBjb3JyZWN0LCBmYWlsdXJlCisgICAgLy8gaXMgcmVwb3J0ZWQgd2hlbiB0aGUgZW5jb2RlciBpcyBpbml0aWFsaXplZC4KKyAgICBtRW5jUGFyYW1zLT5wcm9maWxlX2xldmVsID0gQ09SRV9QUk9GSUxFX0xFVkVMMjsKKyAgICBpbnQzMl90IHByb2ZpbGVMZXZlbDsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlWaWRlb0xldmVsLCAmcHJvZmlsZUxldmVsKSkgeworICAgICAgICBtRW5jUGFyYW1zLT5wcm9maWxlX2xldmVsID0gKFByb2ZpbGVMZXZlbFR5cGUpcHJvZmlsZUxldmVsOworICAgIH0KKworICAgIG1FbmNQYXJhbXMtPnBhY2tldFNpemUgPSAzMjsKKyAgICBtRW5jUGFyYW1zLT5ydmxjRW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPm51bUxheWVycyA9IDE7CisgICAgbUVuY1BhcmFtcy0+dGltZUluY1JlcyA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy0+dGlja1BlclNyYyA9IG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgLyBtVmlkZW9GcmFtZVJhdGU7CisKKyAgICBtRW5jUGFyYW1zLT5iaXRSYXRlWzBdID0gbVZpZGVvQml0UmF0ZTsKKyAgICBtRW5jUGFyYW1zLT5pUXVhbnRbMF0gPSAxNTsKKyAgICBtRW5jUGFyYW1zLT5wUXVhbnRbMF0gPSAxMjsKKyAgICBtRW5jUGFyYW1zLT5xdWFudFR5cGVbMF0gPSAwOworICAgIG1FbmNQYXJhbXMtPm5vRnJhbWVTa2lwcGVkID0gUFZfT0ZGOworCisgICAgLy8gU2V0IElEUiBmcmFtZSByZWZyZXNoIGludGVydmFsCisgICAgaW50MzJfdCBpRnJhbWVzSW50ZXJ2YWxTZWM7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsICZpRnJhbWVzSW50ZXJ2YWxTZWMpKTsKKyAgICBpZiAoaUZyYW1lc0ludGVydmFsU2VjIDwgMCkgeworICAgICAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IC0xOworICAgIH0gZWxzZSBpZiAoaUZyYW1lc0ludGVydmFsU2VjID09IDApIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aW50cmFQZXJpb2QgPSAxOyAgLy8gQWxsIEkgZnJhbWVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuY1BhcmFtcy0+aW50cmFQZXJpb2QgPQorICAgICAgICAgICAgKGlGcmFtZXNJbnRlcnZhbFNlYyAqIG1WaWRlb0ZyYW1lUmF0ZSk7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+bnVtSW50cmFNQiA9IDA7CisgICAgbUVuY1BhcmFtcy0+c2NlbmVEZXRlY3QgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5zZWFyY2hSYW5nZSA9IDE2OworICAgIG1FbmNQYXJhbXMtPm12OHg4RW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPmdvYkhlYWRlckludGVydmFsID0gMDsKKyAgICBtRW5jUGFyYW1zLT51c2VBQ1ByZWQgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5pbnRyYURDVmxjVGggPSAwOworCisgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIG1WaWRlb1dpZHRoKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBtVmlkZW9IZWlnaHQpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpZGVvRnJhbWVSYXRlKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIG1WaWRlb0NvbG9yRm9ybWF0KTsKKworICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiTTR2SDI2M0VuY29kZXIiKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE00dkgyNjNFbmNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgTE9HVigic3RhcnQiKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdGFydCgpIHdoZW4gZW5jb2RlciBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmICghUFZJbml0VmlkZW9FbmNvZGVyKG1IYW5kbGUsIG1FbmNQYXJhbXMpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgaW50MzJfdCBtYXhTaXplOworICAgIGlmICghUFZHZXRNYXhWaWRlb0ZyYW1lU2l6ZShtSGFuZGxlLCAmbWF4U2l6ZSkpIHsKKyAgICAgICAgbWF4U2l6ZSA9IDI1NiAqIDEwMjQ7ICAvLyBNYWdpYyAjCisgICAgfQorICAgIExPR1YoIk1heCBvdXRwdXQgYnVmZmVyIHNpemU6ICVkIiwgbWF4U2l6ZSk7CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtYXhTaXplKSk7CisKKyAgICBtU291cmNlLT5zdGFydChwYXJhbXMpOworICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0xOyAgLy8gMXN0IGZyYW1lIGNvbnRhaW5zIGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICBtU3RhcnRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE00dkgyNjNFbmNvZGVyOjpzdG9wKCkgeworICAgIExPR1YoInN0b3AiKTsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIExPR1coIkNhbGwgc3RvcCgpIHdoZW4gZW5jb2RlciBoYXMgbm90IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1Hcm91cCkgeworICAgICAgICBkZWxldGUgbUdyb3VwOworICAgICAgICBtR3JvdXAgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtSW5wdXRGcmFtZURhdGEpIHsKKyAgICAgICAgZGVsZXRlIG1JbnB1dEZyYW1lRGF0YTsKKyAgICAgICAgbUlucHV0RnJhbWVEYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBDSEVDSyhQVkNsZWFuVXBWaWRlb0VuY29kZXIobUhhbmRsZSkpOworCisgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBNNHZIMjYzRW5jb2Rlcjo6Z2V0Rm9ybWF0KCkgeworICAgIExPR1YoImdldEZvcm1hdCIpOworICAgIHJldHVybiBtRm9ybWF0OworfQorCitzdGF0dXNfdCBNNHZIMjYzRW5jb2Rlcjo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXI7CisgICAgQ0hFQ0tfRVEoT0ssIG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dHB1dEJ1ZmZlcikpOworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopIG91dHB1dEJ1ZmZlci0+ZGF0YSgpOworICAgIGludDMyX3QgZGF0YUxlbmd0aCA9IG91dHB1dEJ1ZmZlci0+c2l6ZSgpOworCisgICAgLy8gT3V0cHV0IGNvZGVjIHNwZWNpZmljIGRhdGEKKyAgICBpZiAobU51bUlucHV0RnJhbWVzIDwgMCkgeworICAgICAgICBpZiAoIVBWR2V0Vm9sSGVhZGVyKG1IYW5kbGUsIG91dFB0ciwgJmRhdGFMZW5ndGgsIDApKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZ2V0IFZPTCBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIExPR1YoIk91dHB1dCBWT0wgaGVhZGVyOiAlZCBieXRlcyIsIGRhdGFMZW5ndGgpOworICAgICAgICBvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQzMihrS2V5SXNDb2RlY0NvbmZpZywgMSk7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRhdGFMZW5ndGgpOworICAgICAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIFJlYWR5IGZvciBhY2NlcHRpbmcgYW4gaW5wdXQgdmlkZW8gZnJhbWUKKyAgICBpZiAoT0sgIT0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCBvcHRpb25zKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gcmVhZCBmcm9tIGRhdGEgc291cmNlIik7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobUlucHV0QnVmZmVyLT5zaXplKCkgLSAoKG1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ICogMykgPj4gMSkgIT0gMCkgeworICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgLy8gV2hlbiB0aGUgdGltZXN0YW1wIG9mIHRoZSBjdXJyZW50IHNhbXBsZSBpcyB0aGUgc2FtZSBhcyB0aGF0CisgICAgLy8gb2YgdGhlIHByZXZpb3VzIHNhbXBsZSwgZW5jb2Rpbmcgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGlzCisgICAgLy8gYnlwYXNzZWQsIGFuZCB0aGUgb3V0cHV0IGxlbmd0aCBvZiB0aGUgc2FtcGxlIGlzIHNldCB0byAwCisgICAgaWYgKG1OdW1JbnB1dEZyYW1lcyA+PSAxICYmCisgICAgICAgIChtTmV4dE1vZFRpbWVVcyA+IHRpbWVVcyB8fCBtUHJldlRpbWVzdGFtcFVzID09IHRpbWVVcykpIHsKKyAgICAgICAgLy8gRnJhbWUgYXJyaXZlcyB0b28gbGF0ZQorICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCAwKTsKKyAgICAgICAgKm91dCA9IG91dHB1dEJ1ZmZlcjsKKyAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBEb24ndCBhY2NlcHQgb3V0LW9mLW9yZGVyIHNhbXBsZXMKKyAgICBDSEVDSyhtUHJldlRpbWVzdGFtcFVzIDwgdGltZVVzKTsKKyAgICBtUHJldlRpbWVzdGFtcFVzID0gdGltZVVzOworCisgICAgLy8gQ29sb3IgY29udmVydCB0byBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIGlmIG5lY2Vzc2FyeQorICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIHVpbnQ4X3QgKmluUHRyID0gKHVpbnQ4X3QgKikgbUlucHV0QnVmZmVyLT5kYXRhKCk7CisgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhKTsKKyAgICAgICAgQ0hFQ0sobVZpZGVvQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIpOworICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgaW5QdHIsIG1JbnB1dEZyYW1lRGF0YSwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIGluUHRyID0gbUlucHV0RnJhbWVEYXRhOworICAgIH0KKyAgICBDSEVDSyhpblB0ciAhPSBOVUxMKTsKKworICAgIC8vIFJlYWR5IGZvciBlbmNvZGluZyBhIHZpZGVvIGZyYW1lCisgICAgVmlkZW9FbmNGcmFtZUlPIHZpbiwgdm91dDsKKyAgICB2aW4uaGVpZ2h0ID0gKChtVmlkZW9IZWlnaHQgKyAxNSkgPj4gNCkgPDwgNDsKKyAgICB2aW4ucGl0Y2ggID0gKChtVmlkZW9XaWR0aCAgKyAxNSkgPj4gNCkgPDwgNDsKKyAgICB2aW4udGltZXN0YW1wID0gKHRpbWVVcyArIDUwMCkgLyAxMDAwOyAvLyBpbiBtcworICAgIHZpbi55Q2hhbiA9IGluUHRyOworICAgIHZpbi51Q2hhbiA9IHZpbi55Q2hhbiArIHZpbi5oZWlnaHQgKiB2aW4ucGl0Y2g7CisgICAgdmluLnZDaGFuID0gdmluLnVDaGFuICsgKCh2aW4uaGVpZ2h0ICogdmluLnBpdGNoKSA+PiAyKTsKKyAgICB1bnNpZ25lZCBsb25nIG1vZFRpbWVNcyA9IDA7CisgICAgaW50MzJfdCBuTGF5ZXIgPSAwOworICAgIE1QNEhpbnRUcmFjayBoaW50VHJhY2s7CisgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsCisgICAgICAgICAgICAmbW9kVGltZU1zLCBvdXRQdHIsICZkYXRhTGVuZ3RoLCAmbkxheWVyKSB8fAorICAgICAgICAhUFZHZXRIaW50VHJhY2sobUhhbmRsZSwgJmhpbnRUcmFjaykpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSBvciBnZXQgaGluayB0cmFjayBhdCBmcmFtZSAlbGxkIiwKKyAgICAgICAgICAgIG1OdW1JbnB1dEZyYW1lcyk7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIENIRUNLX0VRKE5VTEwsIFBWR2V0T3ZlcnJ1bkJ1ZmZlcihtSGFuZGxlKSk7CisgICAgaWYgKGhpbnRUcmFjay5Db2RlVHlwZSA9PSAwKSB7ICAvLyBJLWZyYW1lIHNlcnZlcyBhcyBzeW5jIGZyYW1lCisgICAgICAgIG91dHB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgfQorCisgICAgKyttTnVtSW5wdXRGcmFtZXM7CisgICAgbU5leHRNb2RUaW1lVXMgPSBtb2RUaW1lTXMgKiAxMDAwTEw7CisgICAgb3V0cHV0QnVmZmVyLT5zZXRfcmFuZ2UoMCwgZGF0YUxlbmd0aCk7CisgICAgKm91dCA9IG91dHB1dEJ1ZmZlcjsKKyAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNNHZIMjYzRW5jb2Rlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9jdmVpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlNTRkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9jdmVpLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIEZpbGU6IGN2ZWkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldmlzaW9uIEhpc3Rvcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqIEBpbnRyb2R1Y3Rpb24gICBDb21tb24gVmlkZW8gRW5jb2RlciBJbnRlcmZhY2UgKENWRUkpIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkKKyAgICBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIHdobyB3YW50IHRvIGNyZWF0ZSBhIG11bHRpbWVkaWEgYXBwbGljYXRpb24gd2l0aCB2aWRlbworICAgIGVuY29kaW5nIGZlYXR1cmUuIENWRUkgaXMgZGVzaWduZWQgc3VjaCB0aGF0IG5ldyB2aWRlbyBlbmNvZGVyIGFsZ29yaXRobXMgb3IKKyAgICBtb2R1bGVzIGNhbiBiZSBwbHVnZ2VkIGluIHNlYW1sZXNzbHkgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiBJbiBvdGhlciB3b3JkcywKKyAgICBhbnkgY2hhbmdlcyB0byB0aGUgQ1ZFSSBsaWJyYXJ5IGFyZSB0cmFuc3BhcmVudCB0byB0aGUgdXNlcnMuIFVzZXJzIGNhbiBzdGlsbAorICAgIHVzZSB0aGUgc2FtZSBzZXQgb2YgQVBJcyBmb3IgbmV3IGVuY29kaW5nIHRvb2xzLgorCisgICAgQHJlcXVpcmVtZW50ICAgIENWRUkgd2lsbCB0YWtlIGFuIGlucHV0IGZyYW1lIGluIG9uZSBvZiBzZXZlcmFsIGZvcm1hdCBzdXBwb3J0ZWQKKyAgICBieSBQViBhbmQgZW5jb2RlIGl0IHRvIGFuIE1QRUc0IGJpdHN0cmVhbS4gSXQgd2lsbCBhbHNvIHJldHVybiBhIHJlY29uc3RydWN0ZWQKKyAgICBpbWFnZSBpbiBZVVYgNDoyOjAgZm9ybWF0LiBDdXJyZW50bHkgdGhlIGlucHV0IGZvcm1hdCBzdXBwb3J0ZWQgYXJlIFlVViA0OjI6MCwKKyAgICBSR0IyNCBhbmQgVVlWWSA0OjI6Mi4KKworICAgIENWRUkgaXMgZGVzaWduZWQgc3VjaCB0aGF0IGl0IGlzIHNpbXBsZSB0byB1c2UuIEl0IHNob3VsZCBoaWRlcyBpbXBsZW1lbnRhdGlvbgorICAgIGRlcGVuZGVuY3kgIGZyb20gdGhlIHVzZXJzLiBJbiB0aGlzIHZlcnNpb24sIHdlIGRlY2lkZWQgdGhhdCB0aGUgb3BlcmF0aW9uIHdpbGwKKyAgICBiZSBzeW5jaHJvbm91cywgaS5lLiwgdGhlIGVuY29kaW5nIHdpbGwgYmUgYSBibG9ja2VkIGNhbGwuIEFzeW5jaHJvbm91cyBvcGVyYXRpb24KKyAgICB3aWxsIGJlIGluIHRoZSBsZXZlbCBhYm92ZSBDVkVJLCBpLmUuLCBpbiBBdXRob3IgRW5naW5lIFZpZGVvIE1vZHVsZSB3aGljaCB3aWxsCisgICAgdGFrZSBjYXJlIG9mIGNhcHR1cmluZyBkZXZpY2UgYXMgd2VsbC4KKworICAgIEBicmllZiAgVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSB1c2VkIHRvIGludGVyZmFjZSB3aXRoIGNvZGVjcy4gVGhlaXIgbmFtZXMKKyAgICBhcmUgQ1BWeHh4VmlkZW9FbmNvZGVyIHdoZXJlIHh4eCBpcyBjb2RlYyBzcGVjaWZpYyBzdWNoIGFzIE1QRUc0LCBIMjYzLCBIMjZMLAorICAgIGV0Yy4gQWxsIG9mIHRoZW0gYXJlIHN1YmNsYXNzZXMgb2YgQ1BWQ29tbW9uVmlkZW9FbmNvZGVyLgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX19DVkVJX0gKKyNkZWZpbmUgX19DVkVJX0gKKworI2luY2x1ZGUgIm9zY2xfc2NoZWR1bGVyX2FvLmgiCisjaW5jbHVkZSAib3NjbF9iYXNlLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIiAvKiBmb3IgTVA0SGludFRyYWNrICovCisKKyNkZWZpbmUgTUFYX0xBWUVSIDIKKworLyoqIEdlbmVyYWwgcmV0dXJuZWQgdmFsdWVzLiAqLworZW51bSBUQ1ZFSV9SRVRWQUwKK3sKKyAgICBFQ1ZFSV9TVUNDRVNTLAorICAgIEVDVkVJX0ZBSUwsCisgICAgRUNWRUlfRkxVU0gsCisgICAgRUNWRUlfTU9SRV9PVVRQVVQKK30gOworCisvKiogUmV0dXJuZWQgZXZlbnRzIHdpdGggdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAqLworZW51bSBUQ1ZFSV9FVkVOVAoreworICAgIC8qKiBDYWxsZWQgd2hlbiBhIHBhY2tldCBvciBhIGZyYW1lIG9mIG91dHB1dCBiaXRzdHJlYW0gaXMgcmVhZHkuICovCisgICAgRUNWRUlfQlVGRkVSX1JFQURZLAorCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBsYXN0IHBhY2tldCBvZiBhIGZyYW1lIG9mIG91dHB1dCBiaXRzdHJlYW0gaXMgcmVhZHkuICovCisgICAgRUNWRUlfRlJBTUVfRE9ORSwKKworICAgIC8qKiBDYWxsZWQgd2hlbiBubyBidWZmZXJzIGlzIGF2YWlsYWJsZSBmb3Igb3V0cHV0IGJpdHN0cmVhbS4gQSBidWZmZXIgY2FuIGJlIGFkZGVkIHRocnUgQWRkQnVmZmVyIEFQSS4gKi8KKyAgICBFQ1ZFSV9OT19CVUZGRVJTLAorCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIGVuY29kaW5nIG9wZXJhdGlvbi4gKi8KKyAgICBFQ1ZFSV9FUlJPUgorfTsKKworLyoqIENvbnRhaW5zIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXQgKi8KK2VudW0gVFBWVmlkZW9Gb3JtYXQKK3sKKyAgICBFQ1ZFSV9SR0IyNCwKKyAgICBFQ1ZFSV9SR0IxMiwKKyAgICBFQ1ZFSV9ZVVY0MjAsCisgICAgRUNWRUlfVVlWWSwKKyAgICBFQ1ZFSV9ZVVY0MjBTRU1JUExBTkFSCit9OworCisvKiogVHlwZSBvZiBjb250ZW50cyBmb3Igb3B0aW1hbCBlbmNvZGluZyBtb2RlLiAqLworZW51bSBUUFZDb250ZW50VHlwZQoreworICAgIC8qKiBDb250ZW50IGlzIHRvIGJlIHN0cmVhbWVkIGluIHJlYWwtdGltZS4gKi8KKyAgICBFQ1ZFSV9TVFJFQU1JTkcsCisKKyAgICAvKiogQ29udGVudCBpcyB0byBiZSBkb3dubG9hZGVkIGFuZCBwbGF5YmFja2VkIGxhdGVyLiovCisgICAgRUNWRUlfRE9XTkxPQUQsCisKKyAgICAvKiogQ29udGVudCBpcyB0byBiZSAzZ3BwIGJhc2VsaW5lIGNvbXBsaWFudC4gKi8KKyAgICBFQ1ZFSV9IMjYzCit9OworCisvKiogUmF0ZSBjb250cm9sIHR5cGUuICovCitlbnVtIFRNUDRSYXRlQ29udHJvbFR5cGUKK3sKKyAgICAvKiogQ29uc3RhbnQgcXVhbGl0eSwgdmFyaWFibGUgYml0IHJhdGUsIGZpeGVkIHF1YW50aXphdGlvbiBsZXZlbC4gKi8KKyAgICBFQ09OU1RBTlRfUSwKKworICAgIC8qKiBTaG9ydC10ZXJtIGNvbnN0YW50IGJpdCByYXRlIGNvbnRyb2wuICovCisgICAgRUNCUl8xLAorCisgICAgLyoqIExvbmctdGVybSBjb25zdGFudCBiaXQgcmF0ZSBjb250cm9sLiAqLworICAgIEVWQlJfMQorfTsKKworLyoqIFRhcmdldGVkIHByb2ZpbGUgYW5kIGxldmVsIHRvIGVuY29kZS4gKi8KK2VudW0gVFBWTTRWUHJvZmlsZUxldmVsCit7CisgICAgLyogTm9uLXNjYWxhYmxlIHByb2ZpbGUgKi8KKyAgICBFQ1ZFSV9TSU1QTEVfTEVWRUwwID0gMCwKKyAgICBFQ1ZFSV9TSU1QTEVfTEVWRUwxLAorICAgIEVDVkVJX1NJTVBMRV9MRVZFTDIsCisgICAgRUNWRUlfU0lNUExFX0xFVkVMMywKKyAgICBFQ1ZFSV9DT1JFX0xFVkVMMSwKKyAgICBFQ1ZFSV9DT1JFX0xFVkVMMiwKKworICAgIC8qIFNjYWxhYmxlIHByb2ZpbGUgKi8KKyAgICBFQ1ZFSV9TSU1QTEVfU0NBTEFCTEVfTEVWRUwwID0gNiwKKyAgICBFQ1ZFSV9TSU1QTEVfU0NBTEFCTEVfTEVWRUwxLAorICAgIEVDVkVJX1NJTVBMRV9TQ0FMQUJMRV9MRVZFTDIsCisKKyAgICBFQ1ZFSV9DT1JFX1NDQUxBQkxFX0xFVkVMMSA9IDEwLAorICAgIEVDVkVJX0NPUkVfU0NBTEFCTEVfTEVWRUwyLAorICAgIEVDVkVJX0NPUkVfU0NBTEFCTEVfTEVWRUwzCit9OworCisvKiogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZW5jb2RlciBzZXR0aW5ncy4gKi8KK3N0cnVjdCBUUFZWaWRlb0VuY29kZVBhcmFtCit7CisgICAgLyoqIFNwZWNpZmllcyBhbiAgSUQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGlzIGVuY29kZXIgd2hpbGUgcmV0dXJuaW5nCisgICAgdGhlIGJpdHN0cmVhbSBpbiBhc3luY2hyb25vdXMgbW9kZS4gKi8KKyAgICB1aW50MzIgICAgICAgICAgICAgIGlFbmNvZGVJRDsKKworICAgIC8qKiBTcGVjaWZpZXMgd2hldGhlciBiYXNlIG9ubHkgKGlOdW1MYXllciA9IDEpIG9yIGJhc2UgKyBlbmhhbmNlbWVudCBsYXllcgorICAgIChpTnVtTGF5ZXIgPTIgKSBpcyB0byBiZSB1c2VkLiAqLworICAgIGludDMyICAgICAgICAgICAgICAgaU51bUxheWVyOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBlbmNvZGVkIGZyYW1lcy4gSUZyYW1lV2lkdGhbMF0gaXMgZm9yCisgICAgYmFzZSBsYXllciBhbmQgaUZyYW1lV2lkdGhbMV0gaXMgZm9yIGVuaGFuY2VkIGxheWVyLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaUZyYW1lV2lkdGhbTUFYX0xBWUVSXTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIGhlaWdodCBpbiBwaXhlbHMgb2YgdGhlIGVuY29kZWQgZnJhbWVzLiBJRnJhbWVIZWlnaHRbMF0gaXMgZm9yCisgICAgYmFzZSBsYXllciBhbmQgaUZyYW1lSGVpZ2h0WzFdIGlzIGZvciBlbmhhbmNlZCBsYXllci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlGcmFtZUhlaWdodFtNQVhfTEFZRVJdOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgY3VtdWxhdGl2ZSBiaXQgcmF0ZSBpbiBiaXQgcGVyIHNlY29uZC4gSUJpdFJhdGVbMF0gaXMgZm9yIGJhc2UKKyAgICBsYXllciBhbmQgaUJpdFJhdGVbMV0gaXMgZm9yIGJhc2UrZW5oYW5jZWQgbGF5ZXIuKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlCaXRSYXRlW01BWF9MQVlFUl07CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBjdW11bGF0aXZlIGZyYW1lIHJhdGUgaW4gZnJhbWUgcGVyIHNlY29uZC4gSUZyYW1lUmF0ZVswXSBpcyBmb3IKKyAgICBiYXNlIGxheWVyIGFuZCBpRnJhbWVSYXRlWzFdIGlzIGZvciBiYXNlK2VuaGFuY2VkIGxheWVyLiAqLworICAgIGZsb2F0ICAgICAgICAgICAgICAgaUZyYW1lUmF0ZVtNQVhfTEFZRVJdOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgcGljdHVyZSBxdWFsaXR5IGZhY3RvciBvbiB0aGUgc2NhbGUgb2YgMSB0byAxMC4gSXQgdHJhZGVzIG9mZgorICAgIHRoZSBwaWN0dXJlIHF1YWxpdHkgd2l0aCB0aGUgZnJhbWUgcmF0ZS4gSGlnaGVyIGZyYW1lIHF1YWxpdHkgbWVhbnMgbG93ZXIgZnJhbWUgcmF0ZS4KKyAgICBMb3dlciBmcmFtZSBxdWFsaXR5IGZvciBoaWdoZXIgZnJhbWUgcmF0ZS4qLworICAgIGludDMyICAgICAgICAgICAgICAgaUZyYW1lUXVhbGl0eTsKKworICAgIC8qKiBFbmFibGUgdGhlIHVzZSBvZiBpRnJhbWVRdWFsaXR5IHRvIGRldGVybWluZSB0aGUgZnJhbWUgcmF0ZS4gSWYgaXQgaXMgZmFsc2UsCisgICAgdGhlIGVuY29kZXIgd2lsbCB0cnkgdG8gbWVldCB0aGUgc3BlY2lmaWVkIGZyYW1lIHJhdGUgcmVnYXJkbGVzcyBvZiB0aGUgZnJhbWUgcXVhbGl0eS4qLworICAgIGJvb2wgICAgICAgICAgICAgICAgaUVuYWJsZUZyYW1lUXVhbGl0eTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFAtZnJhbWVzIGJldHdlZW4gMiBJTlRSQSBmcmFtZXMuIEFuIElOVFJBIG1vZGUgaXMKKyAgICBmb3JjZWQgdG8gYSBmcmFtZSBvbmNlIHRoaXMgaW50ZXJ2YWwgaXMgcmVhY2hlZC4gV2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBJLWZyYW1lIGlzIHByZXNlbnQKKyAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGlwLCBpSUZyYW1lSW50ZXJ2YWwgc2hvdWxkIGJlIHNldCB0byAtMS4gKi8KKyAgICBpbnQzMiAgICAgICAgICAgICAgIGlJRnJhbWVJbnRlcnZhbDsKKworICAgIC8qKiBBY2NvcmRpbmcgdG8gaUlGcmFtZUludGVydmFsIHNldHRpbmcsIHRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRyYSBNQiBwZXIgZnJhbWUgaXMKKyAgICBvcHRpbWFsbHkgY2FsY3VsYXRlZCBmb3IgZXJyb3IgcmVzaWxpZW5jeS4gSG93ZXZlciwgd2hlbiBpSUZyYW1lSW50ZXJ2YWwgaXMgc2V0IHRvIC0xLAorICAgIGlOdW1JbnRyYU1CUmVmcmVzaCBtdXN0IGJlIHNwZWNpZmllZCB0byBndWFyYW50ZWUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludHJhCisgICAgbWFjcm9ibG9ja3MgcGVyIGZyYW1lLiovCisgICAgdWludDMyICAgICAgICAgICAgICBpTnVtSW50cmFNQlJlZnJlc2g7CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBWQlYgYnVmZmVyIHNpemUgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgZW5kLXRvLWVuZCBkZWxheSBiZXR3ZWVuIHRoZQorICAgIGVuY29kZXIgYW5kIHRoZSBkZWNvZGVyLiAgVGhlIHNpemUgaXMgaW4gdW5pdCBvZiBzZWNvbmRzLiBGb3IgZG93bmxvYWQgYXBwbGljYXRpb24sCisgICAgdGhlIGJ1ZmZlciBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgc3RyZWFtaW5nIGFwcGxpY2F0aW9uLiBGb3IgMi13YXkgYXBwbGljYXRpb24sCisgICAgdGhpcyBidWZmZXIgc2hhbGwgYmUga2VwdCBtaW5pbWFsLiBGb3IgYSBzcGVjaWFsIGNhc2UsIGluIFZCUiBtb2RlLCBpQnVmZmVyRGVsYXkgd2lsbAorICAgIGJlIHNldCB0byAtMSB0byBhbGxvdyBidWZmZXIgdW5kZXJmbG93LiAqLworICAgIGZsb2F0ICAgICAgICAgICAgICAgaUJ1ZmZlckRlbGF5OworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgYWNjZXNzIHdoZXRoZXIgaXQgaXMgc3RyZWFtaW5nLCBDVkVJX1NUUkVBTUlORworICAgIChkYXRhIHBhcnRpdGlvbmluZyBtb2RlKSBvciBkb3dubG9hZCwgQ1ZFSV9ET1dOTE9BRCAoY29tYmluZWQgbW9kZSkuKi8KKyAgICBUUFZDb250ZW50VHlwZSAgICAgIGlDb250ZW50VHlwZTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gYW1vbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgUSwKKyAgICBDQlIgYW5kIFZCUi4gIFRoZSBzdHJ1Y3R1cmUgVE1QNFJhdGVDb250cm9sVHlwZSBpcyBkZWZpbmVkIGJlbG93LiovCisgICAgVE1QNFJhdGVDb250cm9sVHlwZSBpUmF0ZUNvbnRyb2xUeXBlOworCisgICAgLyoqIFNwZWNpZmllcyBoaWdoIHF1YWxpdHkgYnV0IGFsc28gaGlnaCBjb21wbGV4aXR5IG1vZGUgZm9yIHJhdGUgY29udHJvbC4gKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGlSRE9wdGltYWw7CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBmaXJzdCBJLWZyYW1lLiBJZiBjb25zdGFudCBRCisgICAgcmF0ZSBjb250cm9sIGlzIHVzZWQsIHRoaXMgUVAgd2lsbCBiZSB1c2VkIGZvciBhbGwgdGhlIEktZnJhbWVzLiBUaGlzIG51bWJlciBtdXN0IGJlCisgICAgc2V0IGJldHdlZW4gMSBhbmQgMzEsIG90aGVyd2lzZSwgSW5pdGlhbGl6ZSgpIHdpbGwgZmFpbC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlJcXVhbnRbMl07CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBmaXJzdCBQLWZyYW1lLiBJZiBjb25zdGFudCBRCisgICAgcmF0ZSBjb250cm9sIGlzIHVzZWQsIHRoaXMgUVAgd2lsbCBiZSB1c2VkIGZvciBhbGwgdGhlIFAtZnJhbWVzLiBUaGlzIG51bWJlciBtdXN0IGJlCisgICAgc2V0IGJldHdlZW4gMSBhbmQgMzEsIG90aGVyd2lzZSwgSW5pdGlhbGl6ZSgpIHdpbGwgZmFpbC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlQcXVhbnRbMl07CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBmaXJzdCBCLWZyYW1lLiBJZiBjb25zdGFudCBRCisgICAgcmF0ZSBjb250cm9sIGlzIHVzZWQsIHRoaXMgUVAgd2lsbCBiZSB1c2VkIGZvciBhbGwgdGhlIEItZnJhbWVzLiBUaGlzIG51bWJlciBtdXN0IGJlCisgICAgc2V0IGJldHdlZW4gMSBhbmQgMzEsIG90aGVyd2lzZSwgSW5pdGlhbGl6ZSgpIHdpbGwgZmFpbC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlCcXVhbnRbMl07CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSBzZWFyY2ggcmFuZ2UgaW4gcGl4ZWwgdW5pdCBmb3IgbW90aW9uIHZlY3Rvci4gVGhlIHJhbmdlIG9mIHRoZQorICAgIG1vdGlvbiB2ZWN0b3Igd2lsbCBiZSBvZiBkaW1lbnNpb24gWy1pU2VhcmNoUmFuZ2UuNSwgK2lTZWFyY2hSYW5nZS4wXS4gKi8KKyAgICBpbnQzMiAgICAgICAgICAgICAgIGlTZWFyY2hSYW5nZTsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIHVzZSBvZiA4eDggbW90aW9uIHZlY3RvcnMuICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBpTVY4eDg7CisKKyAgICAvKiogU3BlY2lmaWVzIHRoZSB1c2Ugb2YgaGFsZi1wZWwgbW90aW9uIHZlY3RvcnMuICovCisgICAgYm9vbCAgICAgICAgICAgICAgICBpTVZIYWxmUGVsOworCisgICAgLyoqIFNwZWNpZmllcyBhdXRvbWF0aWMgc2NlbmUgZGV0ZWN0aW9uIHdoZXJlIEktZnJhbWUgd2lsbCBiZSB1c2VkIHRoZSB0aGUgZmlyc3QgZnJhbWUKKyAgICBpbiBhIG5ldyBzY2VuZS4gKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGlTY2VuZURldGVjdGlvbjsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIHBhY2tldCBzaXplIGluIGJ5dGVzIHdoaWNoIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHR3byByZXN5bmMgbWFya2Vycy4KKyAgICBGb3IgRUNWRUlfRE9XTkxPQUQgYW5kIEVDVkVJX0gyNjMsIGlmIGlQYWNrZXRTaXplIGlzIHNldCB0byAwLCB0aGVyZSB3aWxsIGJlIG5vIHJlc3luYyBtYXJrZXJzIGluIHRoZSBiaXRzdHJlYW0uCisgICAgRm9yIEVDVkVJX1NUUkVBTUlORyBpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4qLworICAgIHVpbnQzMiAgICAgICAgICAgICAgaVBhY2tldFNpemU7CisKKyAgICAvKiogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgZnJhbWUgc2tpcHBpbmcgZGVjaXNpb24gaXMgYWxsb3dlZCBhZnRlciBlbmNvZGluZworICAgIHRoZSBjdXJyZW50IGZyYW1lLiBJZiB0aGVyZSBpcyBubyBtZW1vcnkgb2Ygd2hhdCBoYXMgYmVlbiBjb2RlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUsCisgICAgaU5vQ3VycmVudFNraXAgaGFzIHRvIGJlIG9uLiAqLworICAgIGJvb2wgICAgICAgICAgICAgICAgaU5vQ3VycmVudFNraXA7CisKKyAgICAvKiogU3BlY2lmaWVzIHRoYXQgbm8gZnJhbWUgc2tpcHBpbmcgaXMgYWxsb3dlZC4gRnJhbWUgc2tpcHBpbmcgaXMgYSB0b29sIHVzZWQgdG8KKyAgICBjb250cm9sIHRoZSBhdmVyYWdlIG51bWJlciBvZiBiaXRzIHNwZW50IHRvIG1lZXQgdGhlIHRhcmdldCBiaXQgcmF0ZS4gKi8KKyAgICBib29sICAgICAgICAgICAgICAgIGlOb0ZyYW1lU2tpcDsKKworICAgIC8qKiBTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBjbGlwIGluIG1pbGxpc2Vjb25kLiovCisgICAgaW50MzIgICAgICAgICAgICAgICBpQ2xpcER1cmF0aW9uOworCisgICAgLyoqIFNwZWNpZmllcyB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgdXNlZCB0byBlbmNvZGUgdGhlIGJpdHN0cmVhbS4gV2hlbiBwcmVzZW50LAorICAgIG90aGVyIHNldHRpbmdzIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSByYW5nZSBhbGxvd2FibGUgYnkgdGhpcyB0YXJnZXQgcHJvZmlsZQorICAgIGFuZCBsZXZlbC4gRmFpbCBtYXkgYmUgcmV0dXJuZWQgZnJvbSB0aGUgSW5pdGlhbGl6ZSBjYWxsLiAqLworICAgIFRQVk00VlByb2ZpbGVMZXZlbCAgaVByb2ZpbGVMZXZlbDsKKworICAgIC8qKiBTcGVjaWZpZXMgRlNJIEJ1ZmZlciBpbnB1dCAqLworICAgIHVpbnQ4KiAgICAgICAgICAgICAgaUZTSUJ1ZmY7CisKKyAgICAvKiogU3BlY2lmaWVzIEZTSSBCdWZmZXIgTGVuZ3RoICovCisgICAgaW50ICAgICAgICAgICAgIGlGU0lCdWZmTGVuZ3RoOworCisKK307CisKKworLyoqIFN0cnVjdHVyZSBmb3IgaW5wdXQgZm9ybWF0IGluZm9ybWF0aW9uICovCitzdHJ1Y3QgVFBWVmlkZW9JbnB1dEZvcm1hdAoreworICAgIC8qKiBDb250YWlucyB0aGUgd2lkdGggaW4gcGl4ZWxzIG9mIHRoZSBpbnB1dCBmcmFtZS4gKi8KKyAgICBpbnQzMiAgICAgICAgICAgaUZyYW1lV2lkdGg7CisKKyAgICAvKiogQ29udGFpbnMgdGhlIGhlaWdodCBpbiBwaXhlbHMgb2YgdGhlIGlucHV0IGZyYW1lLiAqLworICAgIGludDMyICAgICAgICAgICBpRnJhbWVIZWlnaHQ7CisKKyAgICAvKiogQ29udGFpbnMgdGhlIGlucHV0IGZyYW1lIHJhdGUgaW4gdGhlIHVuaXQgb2YgZnJhbWUgcGVyIHNlY29uZC4gKi8KKyAgICBmbG9hdCAgICAgICAgICAgaUZyYW1lUmF0ZTsKKworICAgIC8qKiBDb250YWlucyBGcmFtZSBPcmllbnRhdGlvbi4gVXNlZCBmb3IgUkdCIGlucHV0LiAxIG1lYW5zIEJvdHRvbV9VUCBSR0IsIDAgbWVhbnMgVG9wX0Rvd24gUkdCLCAtMSBmb3IgdmlkZW8gZm9ybWF0cyBvdGhlciB0aGFuIFJHQiovCisgICAgaW50ICAgICAgICAgICAgIGlGcmFtZU9yaWVudGF0aW9uOworCisgICAgLyoqIENvbnRhaW5zIHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0IHZpZGVvLCBlLmcuLCBZVVYgNDoyOjAsIFVZVlksIFJHQjI0LCBldGMuICovCisgICAgVFBWVmlkZW9Gb3JtYXQgIGlWaWRlb0Zvcm1hdDsKK307CisKKworLyoqIENvbnRhaW5zIHRoZSBpbnB1dCBkYXRhIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgVFBWVmlkZW9JbnB1dERhdGEKK3sKKyAgICAvKiogUG9pbnRlciB0byBhbiBpbnB1dCBmcmFtZSBidWZmZXIgaW4gaW5wdXQgc291cmNlIGZvcm1hdC4qLworICAgIHVpbnQ4ICAgICAgICppU291cmNlOworCisgICAgLyoqIFRoZSBjb3JyZXNwb25kaW5nIHRpbWUgc3RhbXAgb2YgdGhlIGlucHV0IGZyYW1lLiAqLworICAgIHVpbnQzMiAgICAgIGlUaW1lU3RhbXA7Cit9OworCisvKiogQ29udGFpbnMgdGhlIG91dHB1dCBkYXRhIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgVFBWVmlkZW9PdXRwdXREYXRhCit7CisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgYnVmZmVyIGluIFlVViA0OjI6MCBkb21haW4uICovCisgICAgdWludDggICAgICAgICAgICppRnJhbWU7CisKKyAgICAvKiogVGhlIG51bWJlciBvZiBsYXllciBlbmNvZGVkLCAwIGZvciBiYXNlLCAxIGZvciBlbmhhbmNlZC4gKi8KKyAgICBpbnQzMiAgICAgICAgICAgaUxheWVyTnVtYmVyOworCisgICAgLyoqIFBvaW50ZXIgdG8gdGhlIGVuY29kZWQgYml0c3RyZWFtIGJ1ZmZlci4gKi8KKyAgICB1aW50OCAgICAgICAgICAgKmlCaXRTdHJlYW07CisKKyAgICAvKiogVGhlIHNpemUgaW4gYnl0ZXMgb2YgaUJTdHJlYW0uICovCisgICAgaW50MzIgICAgICAgICAgIGlCaXRTdHJlYW1TaXplOworCisgICAgLyoqIFRoZSB0aW1lIHN0YW1wIG9mIHRoZSBlbmNvZGVkIGZyYW1lIGFjY29yZGluZyB0byB0aGUgYml0c3RyZWFtLiAqLworICAgIHVpbnQzMiAgICAgICAgICBpVmlkZW9UaW1lU3RhbXA7CisKKyAgICAvKiogVGhlIHRpbWUgc3RhbXAgb2YgdGhlIGVuY29kZWQgZnJhbWUgYXMgZ2l2ZW4gYmVmb3JlIHRoZSBlbmNvZGluZy4gKi8KKyAgICB1aW50MzIgICAgICAgICAgaUV4dGVybmFsVGltZVN0YW1wOworCisgICAgLyoqIFRoZSBoaW50IHRyYWNrIGluZm9ybWF0aW9uLiAqLworICAgIE1QNEhpbnRUcmFjayAgICBpSGludFRyYWNrOworfTsKKworLyoqIEFuIG9ic2VydmVyIGNsYXNzIGZvciBjYWxsYmFja3MgdG8gcmVwb3J0IHRoZSBzdGF0dXMgb2YgdGhlIENWRUkgKi8KK2NsYXNzIE1QVkNWRUlPYnNlcnZlcgoreworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIFRoZSBjYWxsYmFjayBmdW50aW9uIHdpdGggYUV2ZW50IGJlaW5nIG9uZSBvZiBUQ1ZFSUV2ZW50IGVudW1lcmF0aW9uLiAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgSGFuZGxlUFZDVkVJRXZlbnQKKyAgICAgICAgKHVpbnQzMiBhSWQsIHVpbnQzMiBhRXZlbnQsIHVpbnQzMiBhUGFyYW0xID0gMCkgPSAwOworICAgICAgICB2aXJ0dWFsIH5NUFZDVkVJT2JzZXJ2ZXIoKSB7fQorfTsKKworLyoqIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGNvZGVjIHNwZWNpZmljIGludGVyZmFjZSBjbGFzcy4KK1RoZSB1c2VycyBtdXN0IG1haW50YWluIGFuIGluc3RhbmNlIG9mIHRoZSBjb2RlYyBzcGVjaWZpYyBjbGFzcyB0aHJvdWdob3V0Cit0aGUgZW5jb2Rpbmcgc2Vzc2lvbi4KKyovCitjbGFzcyBDb21tb25WaWRlb0VuY29kZXIgOiBwdWJsaWMgT3NjbFRpbWVyT2JqZWN0Cit7CisgICAgcHVibGljOgorICAgICAgICAvKiogQ29uc3RydWN0b3IgZm9yIENWRUkgY2xhc3MuICovCisgICAgICAgIENvbW1vblZpZGVvRW5jb2RlcigpIDogT3NjbFRpbWVyT2JqZWN0KE9zY2xBY3RpdmVPYmplY3Q6OkVQcmlvcml0eU5vbWluYWwsICJQVkVuY29kZXIiKSB7fTsKKworICAgICAgICAvKiogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gdG8gc2V0IHRoZSBpbnB1dCB2aWRlbyBmb3JtYXQgYW5kIHRoZQorICAgICAgICBlbmNvZGluZyBwYXJhbWV0ZXJzLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgQ1ZFSV9FUlJPUiBpZiB0aGVyZSBpcworICAgICAgICBhbnkgZXJyb3JzLiBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiByZXR1cm5zIENWRUlfU1VDQ0VTUy4qLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgSW5pdGlhbGl6ZShUUFZWaWRlb0lucHV0Rm9ybWF0ICphVmlkSW5Gb3JtYXQsIFRQVlZpZGVvRW5jb2RlUGFyYW0gKmFFbmNQYXJhbSkgPSAwOworCisgICAgICAgIC8qKiBTZXQgdGhlIG9ic2VydmVyIGZvciBhc3luY2hyb25vdXMgZW5jb2RpbmcgbW9kZS4gKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIFNldE9ic2VydmVyKE1QVkNWRUlPYnNlcnZlciAqYU9ic2VydmVyKSA9IDA7CisKKyAgICAgICAgLyoqIEFkZCBhIGJ1ZmZlciB0byB0aGUgcXVldWUgb2Ygb3V0cHV0IGJ1ZmZlcnMgZm9yIG91dHB1dCBiaXRzdHJlYW0gaW4KKyAgICAgICAgYXN5bmNocm9ub3VzIGVuY29kaW5nIG1vZGUuICovCisgICAgICAgIHZpcnR1YWwgIFRDVkVJX1JFVFZBTCBBZGRCdWZmZXIoVFBWVmlkZW9PdXRwdXREYXRhICphVmlkT3V0KSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gc2VuZHMgaW4gYW4gaW5wdXQgdmlkZW8gZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHNvdXJjZQorICAgICAgICBmcmFtZSBhbmQgdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wLiBUaGUgZW5jb2RlZCBiaXRzdHJlYW0gd2lsbCBiZSByZXR1cm5lZCBieQorICAgICAgICBvYnNlcnZlciBjYWxsYmFjay4KKyAgICAgICAgVGhlIGFib3ZlIDMgQVBJcyBvbmx5IHJlcGxhY2UgRW5jb2RlRnJhbWUoKSBBUEkuIE90aGVyIEFQSXMgc3VjaCBhcyBpbml0aWFsaXphdGlvbgorICAgICAgICBhbmQgdXBkYXRlIHBhcmFtZXRlcnMgcmVtYWluIHRoZSBzYW1lLiAqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgRW5jb2RlKFRQVlZpZGVvSW5wdXREYXRhICphVmlkSW4pID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIFZCViBidWZmZXIgc2l6ZSBzdWNoIHRoYXQgdGhlCisgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gYWxsb2NhdGUgYSBidWZmZXIgdGhhdCBndWFyYW50ZWVzIHRvIGZpdCBvbmUgZnJhbWUuKi8KKyAgICAgICAgdmlydHVhbCAgaW50MzIgR2V0QnVmZmVyU2l6ZSgpID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBWT0wgaGVhZGVyIHBhcnQgKHN0YXJ0aW5nIGZyb20gdGhlIFZPUyBoZWFkZXIpCisgICAgICAgIG9mIHRoZSBlbmNvZGVkIGJpdHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBJbml0aWFsaXplLgorICAgICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIG1lbW9yeSAodm9sSGVhZGVyKSBhbGxvY2F0ZWQgYnkgdGhlIHVzZXJzLiovCisgICAgICAgIHZpcnR1YWwgIFRDVkVJX1JFVFZBTCBHZXRWb2xIZWFkZXIodWludDggKnZvbEhlYWRlciwgaW50MzIgKnNpemUsIGludDMyIGxheWVyKSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gc2VuZHMgaW4gYW4gaW5wdXQgdmlkZW8gZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHNvdXJjZQorICAgICAgICBmcmFtZSBhbmQgdGhlIGFzc29jaWF0ZWQgdGltZXN0YW1wLiBJdCByZXR1cm5zIGFuIG91dHB1dCB2aWRlbyBkYXRhIHN0cnVjdHVyZQorICAgICAgICBjb250YWluaW5nIGNvZGVkIGJpdCBzdHJlYW0sIHJlY29uc3RydWN0ZWQgZnJhbWUgaW4gWVVWIDQ6MjowIChjYW4gYmUgY2hhbmdlZAorICAgICAgICB0byBzb3VyY2UgZm9ybWF0KSBhbmQgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZGVkIGZyYW1lLgorICAgICAgICBUaGUgaW5wdXQgdGltZXN0YW1wIG1heSBub3QgY29ycmVzcG9uZCB0byB0aGUgb3V0cHV0IHRpbWVzdGFtcC4gVXNlciBjYW4gc2VuZAorICAgICAgICBhbiBpbnB1dCBzdHJ1Y3R1cmUgaW4gd2l0aG91dCBnZXR0aW5nIGFueSBlbmNvZGVkIGRhdGEgYmFjayBvciBnZXR0aW5nIGFuIGVuY29kZWQKKyAgICAgICAgZnJhbWUgaW4gdGhlIHBhc3QuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBFQ1ZFSV9FUlJPUiBpZiB0aGVyZSBpcyBhbnkgZXJyb3JzLgorICAgICAgICBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEVDVkVJX1NVQ0NFU1MuCisgICAgICAgIEluIGNhc2Ugb2YgT3ZlcnJ1biBCdWZmZXIgdXNhZ2UsIGl0IGlzIHBvc3NpYmxlIHRoYXQgcmV0dXJuIHZhbHVlIGlzIEVDVkVJX01PUkVfT1VUUFVUCisgICAgICAgIHdoaWNoIGluZGljYXRlcyB0aGF0IGZyYW1lIGNhbm5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIEVuY29kZUZyYW1lKFRQVlZpZGVvSW5wdXREYXRhICAqYVZpZEluLCBUUFZWaWRlb091dHB1dERhdGEgKmFWaWRPdXQsIGludCAqYVJlbWFpbmluZ0J5dGVzCisjaWZkZWYgUFZBVVRIT1JfUFJPRklMSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHZvaWQgKmFQYXJhbTEgPSAwCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA9IDA7CisKKyAgICAgICAgLyoqIEJlZm9yZSB0aGUgdGVybWluYXRpb24gb2YgdGhlIGVuY29kaW5nIHByb2Nlc3MsIHRoZSB1c2VycyBoYXZlIHRvIHF1ZXJ5CisgICAgICAgIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBlbmNvZGVkIGZyYW1lIHBlbmRpbmcgaW5zaWRlIHRoZSBDVkVJLiBUaGUgcmV0dXJuZWQgdmFsdWUKKyAgICAgICAgd2lsbCBpbmRpY2F0ZSB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyB0byBiZSBmbHVzaGVkIChFQ1ZFSV9GTFVTSCkuCisgICAgICAgIEZsdXNoT3V0cHV0IGhhcyB0byBiZSBjYWxsZWQgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgZnJhbWVzLCBpLmUuLCBpdCByZXR1cm5zCisgICAgICAgIEVDVkVJX1NVQ0NFU1MuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBkdXJpbmcgdGhlIGVuY29kaW5nIG9wZXJhdGlvbiBpZgorICAgICAgICB0aGVyZSBpcyBubyBpbnB1dCBmcmFtZSBhbmQgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHdhbnQgdG8gd2FzdGUgdGhlIHRpbWUKKyAgICAgICAgd2FpdGluZyBmb3IgaW5wdXQgZnJhbWUuIEl0IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZmx1c2ggZW5jb2RlZCBmcmFtZQorICAgICAgICBvdXQgb2YgdGhlIG1lbW9yeS4gKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIEZsdXNoT3V0cHV0KFRQVlZpZGVvT3V0cHV0RGF0YSAqYVZpZE91dCkgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIGNsZWFudXAgdGhlIENWRUkgYWxsb2NhdGVkIHJlc291cmNlcy4gKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIFRlcm1pbmF0ZSgpID0gMDsKKworICAgICAgICAvKipUaGlzIGZ1bmN0aW9uIGR5bmFtaWNhbGx5IGNoYW5nZXMgdGhlIHRhcmdldCBiaXQgcmF0ZSBvZiB0aGUgZW5jb2RlcgorICAgICAgICB3aGlsZSBlbmNvZGluZy4gYUJpdFJhdGVbbl0gaXMgdGhlIG5ldyBhY2N1bXVsYXRlIHRhcmdldCBiaXQgcmF0ZSBvZiBsYXllciBuLgorICAgICAgICBTdWNjZXNzZnVsIHVwZGF0ZSBpcyByZXR1cm5lZCB3aXRoIEVDVkVJX1NVQ0NFU1MuKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIFVwZGF0ZUJpdFJhdGUoaW50MzIgYU51bUxheWVyLCBpbnQzMiAqYUJpdFJhdGUpID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiBkeW5hbWljYWxseSBjaGFuZ2VzIHRoZSB0YXJnZXQgZnJhbWUgcmF0ZSBvZiB0aGUgZW5jb2RlcgorICAgICAgICB3aGlsZSBlbmNvZGluZy4gYUZyYW1lUmF0ZVtuXSBpcyB0aGUgbmV3IGFjY3VtdWxhdGUgdGFyZ2V0IGZyYW1lIHJhdGUgb2YKKyAgICAgICAgbGF5ZXIgbi4gU3VjY2Vzc2Z1bCB1cGRhdGUgaXMgcmV0dXJuZWQgd2l0aCBFQ1ZFSV9TVUNDRVNTLiAqLworICAgICAgICB2aXJ0dWFsICBUQ1ZFSV9SRVRWQUwgVXBkYXRlRnJhbWVSYXRlKGludDMyIGFOdW1MYXllciwgZmxvYXQgKmFGcmFtZVJhdGUpID0gMDsKKworICAgICAgICAvKiogVGhpcyBmdW5jdGlvbiBkeW5hbWljYWxseSBjaGFuZ2VzIHRoZSBJLVZvcCB1cGRhdGUgaW50ZXJ2YWwgd2hpbGUKKyAgICAgICAgZW5jb2RpbmcgdG8gYSBuZXcgdmFsdWUsIGFJRnJhbWVJbnRlcnZhbC4gKi8KKyAgICAgICAgdmlydHVhbCAgVENWRUlfUkVUVkFMIFVwZGF0ZUlGcmFtZUludGVydmFsKGludDMyIGFJRnJhbWVJbnRlcnZhbCkgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIGZvcmNlcyBhbiBJLVZvcCBtb2RlIHRvIHRoZSBuZXh0IGZyYW1lIHRvIGJlIGVuY29kZWQuICovCisgICAgICAgIHZpcnR1YWwgIFRDVkVJX1JFVFZBTCBJRnJhbWVSZXF1ZXN0KCkgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IHdpZHRoIG9mIGEgc3BlY2lmaWMgbGF5ZXIKKyAgICAgICAgKG5vdCBuZWNlc3NhcmlseSBtdWx0aXBsZSBvZiAxNikuICovCisgICAgICAgIHZpcnR1YWwgIGludDMyIEdldEVuY29kZVdpZHRoKGludDMyIGFMYXllcikgPSAwOworCisgICAgICAgIC8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGlucHV0IGhlaWdodCBvZiBhIHNwZWNpZmljIGxheWVyCisgICAgICAgIChub3QgbmVjZXNzYXJpbHkgbXVsdGlwbGUgb2YgMTYpLiAqLworICAgICAgICB2aXJ0dWFsICBpbnQzMiBHZXRFbmNvZGVIZWlnaHQoaW50MzIgYUxheWVyKSA9IDA7CisKKyAgICAgICAgLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdGFyZ2V0IGVuY29kZWQgZnJhbWUgcmF0ZSBvZiBhIHNwZWNpZmljIGxheWVyLiAqLworICAgICAgICB2aXJ0dWFsICBmbG9hdCBHZXRFbmNvZGVGcmFtZVJhdGUoaW50MzIgYUxheWVyKSA9IDA7CisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIHZvaWQgUnVuKHZvaWQpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIERvQ2FuY2VsKHZvaWQpID0gMDsKKyAgICAgICAgLyogaW50ZXJuYWwgZW51bSAqLworICAgICAgICBlbnVtIFRDVkVJU3RhdGUKKyAgICAgICAgeworICAgICAgICAgICAgRUlkbGUsCisgICAgICAgICAgICBFRW5jb2RlCisgICAgICAgIH07CisKKyAgICAgICAgVENWRUlTdGF0ZSAgaVN0YXRlOworICAgICAgICB1aW50MzIgICAgICBpSWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NGZkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCkBAIC0wLDAgKzEsNDU0IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfTVA0RU5DX0FQSV9IXworI2RlZmluZSBfTVA0RU5DX0FQSV9IXworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgX1BWX1RZUEVTXworI2RlZmluZSBfUFZfVFlQRVNfCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNoYXI7Cit0eXBlZGVmIGNoYXIgQ2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7Cit0eXBlZGVmIGludCBJbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTaG9ydDsKK3R5cGVkZWYgc2hvcnQgU2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVMb25nOworCisjZGVmaW5lIFBWX0NPREVDX0lOSVQgIDAKKyNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgMQorI2VuZGlmCisKKyNkZWZpbmUgUFZfVFJVRSAgMQorI2RlZmluZSBQVl9GQUxTRSAwCisKK3R5cGVkZWYgZW51bQoreworICAgIFNIT1JUX0hFQURFUiwKKyAgICBTSE9SVF9IRUFERVJfV0lUSF9FUlJfUkVTLAorICAgIEgyNjNfTU9ERSwKKyAgICBIMjYzX01PREVfV0lUSF9FUlJfUkVTLAorICAgIERBVEFfUEFSVElUSU9OSU5HX01PREUsCisgICAgQ09NQklORV9NT0RFX05PX0VSUl9SRVMsCisgICAgQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUworCit9IE1QNEVuY29kaW5nTW9kZTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ09OU1RBTlRfUSwKKyAgICBDQlJfMSwKKyAgICBWQlJfMSwKKyAgICBDQlJfMiwKKyAgICBWQlJfMiwKKyAgICBDQlJfTE9XREVMQVkKK30gTVA0UmF0ZUNvbnRyb2xUeXBlOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQQVNTMSwKKyAgICBQQVNTMgorfSBQYXNzTnVtOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBQVl9PRkYsCisgICAgUFZfT04KK30gUGFyYW1FbmNNb2RlOworCisKKy8qIHtTUEwwLCBTUEwxLCBTUEwyLCBTUEwzLCBDUEwxLCBDUEwyLCBDUEwyLCBDUEwyfSAsIFNQTDA6IFNpbXBsZSBQcm9maWxlQExldmVsMCAsIENQTDE6IENvcmUgUHJvZmlsZUBMZXZlbDEgKi8KKy8qIHtTU1BMMCwgU1NQTDEsIFNTUEwyLCBTU1BMMiwgQ1NQTDEsIENTUEwyLCBDU1BMMywgQ1NQTDN9ICwgU1NQTDA6IFNpbXBsZSBTY2FsYWJsZSBQcm9maWxlQExldmVsMCwgQ1BMMTogQ29yZSBTY2FsYWJsZSBQcm9maWxlQExldmVsMSAqLworCit0eXBlZGVmIGVudW0KK3sKKyAgICAvKiBOb24tc2NhbGFibGUgcHJvZmlsZSAqLworICAgIFNJTVBMRV9QUk9GSUxFX0xFVkVMMCA9IDAsCisgICAgU0lNUExFX1BST0ZJTEVfTEVWRUwxLAorICAgIFNJTVBMRV9QUk9GSUxFX0xFVkVMMiwKKyAgICBTSU1QTEVfUFJPRklMRV9MRVZFTDMsCisgICAgQ09SRV9QUk9GSUxFX0xFVkVMMSwKKyAgICBDT1JFX1BST0ZJTEVfTEVWRUwyLAorCisgICAgLyogU2NhbGFibGUgcHJvZmlsZSAqLworICAgIFNJTVBMRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMCA9IDYsCisgICAgU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwxLAorICAgIFNJTVBMRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMiwKKworICAgIENPUkVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDEgPSAxMCwKKyAgICBDT1JFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwyLAorICAgIENPUkVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDMKKworfSBQcm9maWxlTGV2ZWxUeXBlOworCisKK3R5cGVkZWYgc3RydWN0IHRhZ01QNEhpbnRUcmFjaworeworICAgIFVDaGFyICAgTVRCOworICAgIFVDaGFyICAgTGF5ZXJJRDsKKyAgICBVQ2hhciAgIENvZGVUeXBlOworICAgIFVDaGFyICAgUmVmU2VsQ29kZTsKK30gTVA0SGludFRyYWNrOworCit0eXBlZGVmIHN0cnVjdCB0YWd2aWRlb0VuY0NvbnRyb2xzCit7CisgICAgdm9pZCAgICAgICAgICAgICp2aWRlb0VuY29kZXJEYXRhOworICAgIEludCAgICAgICAgICAgICB2aWRlb0VuY29kZXJJbml0OworfSBWaWRlb0VuY0NvbnRyb2xzOworCisKK3R5cGVkZWYgc3RydWN0IHRhZ3ZpZGVvRW5jRnJhbWVJTworeworICAgIFVDaGFyICAgKnlDaGFuOyAvKiBwb2ludGVyIHRvIFkgKi8KKyAgICBVQ2hhciAgICp1Q2hhbjsgLyogcG9pbnRlciB0byBVICovCisgICAgVUNoYXIgICAqdkNoYW47IC8qIHBvaW50ZXIgdG8gViAqLworICAgIEludCAgICAgaGVpZ2h0OyAvKiBoZWlnaHQgZm9yIFkgKi8KKyAgICBJbnQgICAgIHBpdGNoOyAgLyogc3RyaWRlICBmb3IgWSAqLworICAgIFVMb25nICAgdGltZXN0YW1wOyAvKiBtb2R1bG8gdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kKi8KKworfSAgIFZpZGVvRW5jRnJhbWVJTyAgOworCisvKioKK0BicmllZiAgRW5jb2Rpbmcgb3B0aW9ucyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ3ZpZGVvRW5jT3B0aW9ucworeworICAgIC8qKiBAYnJpZWYgU2V0cyB0aGUgZW5jb2RpbmcgbW9kZSwgZGVmaW5lZCBieSB0aGUgYWJvdmUgZW51bWFyYXRpb24uIElmIHRoZXJlIGFyZSBjb25mbGljdHMgYmV0d2VlbiB0aGUgZW5jb2RpbmcgbW9kZQorICAgICogICBhbmQgc3Vic2VxdWVudCBlbmNvZGluZyBvcHRpb25zLCBlbmNvZGluZyBtb2RlIHRha2UgcHJlY2VkZW50IG92ZXIgZW5jb2Rpbmcgb3B0aW9ucy4gKi8KKyAgICBNUDRFbmNvZGluZ01vZGUgICAgIGVuY01vZGU7CisKKyAgICAvKiogQGJyaWVmIFNldHMgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgcGFja2V0LCBvbmx5IHVzZWQgaW4gREFUQV9QQVJUSVRJT05JTkdfTU9ERSBvciBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTIG1vZGUuCisgICAgKiAgICAgICAgICAgVGhlIHJlc3luYyBtYXJrZXIgd2lsbCBiZSBpbnNlcnRlZCBhcyBvZnRlbiBhcyB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0LiovCisgICAgSW50ICAgICAgICAgICAgICAgICBwYWNrZXRTaXplOworCisgICAgLyoqIEBicmllZiBTZWxlY3RzIE1QRUctNC9ILjI2MyBwcm9maWxlIGFuZCBsZXZlbCwgaWYgc3BlY2lmaWVkIG90aGVyIGVuY29kaW5nIG9wdGlvbnMgbXVzdCBjb25mb3JtIHdpdGggaXQuICovCisgICAgUHJvZmlsZUxldmVsVHlwZSAgICBwcm9maWxlX2xldmVsOworCisgICAgLyoqIEBicmllZiBFbmFibGVzIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIGNvZGUgKFJWTEMpIG1vZGUuIE5vcm1hbGx5IGl0IGlzIHNldCB0byBQVl9PRkYuKi8KKyAgICBQYXJhbUVuY01vZGUgICAgICAgIHJ2bGNFbmFibGU7CisKKyAgICAvKiogQGJyaWVmIFNldCB0aGUgZnJlcXVlbmN5IG9mIEdPQiBoZWFkZXIgaW50ZXJ2YWwgKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIGdvYkhlYWRlckludGVydmFsOworCisgICAgLyoqIEBicmllZiBTZXRzIHRoZSBudW1iZXIgb2YgYml0c3RyZWFtIGxheWVyczogMSBpcyBiYXNlIG9ubHk6IDIgaXMgYmFzZSArIGVuaGFuY2VtZW50ICovCisgICAgSW50ICAgICAgICAgICAgICAgICBudW1MYXllcnM7CisKKyAgICAvKiogQGJyaWVmIFNldHMgdGhlIG51bWJlciBvZiB0aWNrcyBwZXIgc2Vjb25kIHVzZWQgZm9yIHRpbWluZyBpbmZvcm1hdGlvbiBlbmNvZGVkIGluIE1QRUc0IGJpdHN0cmVhbS4qLworICAgIEludCAgICAgICAgICAgICAgICAgdGltZUluY1JlczsKKworICAgIC8qKiBAYnJpZWYgU2V0cyB0aGUgbnVtYmVyIG9mIHRpY2tzIGluIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gYmV0d2VlbiAyIHNvdXJjZSBmcmFtZXMgKGVxdWl2YWxlbnQgdG8gc291cmNlIGZyYW1lIHJhdGUpLiAqLworICAgIEludCAgICAgICAgICAgICAgICAgdGlja1BlclNyYzsKKworICAgIC8qKiBAYnJpZWYgU3BlY2lmaWVzIGVuY29kZWQgaGVpZ2h0cyBpbiBwaXhlbHMsIGhlaWdodFtuXSByZXByZXNlbnRzIHRoZSBuLXRoIGxheWVyJ3MgaGVpZ2h0LiAqLworICAgIEludCAgICAgICAgICAgICAgICAgZW5jSGVpZ2h0WzJdOworCisgICAgLyoqIEBicmllZiBTcGVjaWZpZXMgZW5jb2RlZCB3aWR0aHMgaW4gcGl4ZWxzLCB3aWR0aFtuXSByZXByZXNlbnRzIHRoZSBuLXRoIGxheWVyJ3Mgd2lkdGguKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIGVuY1dpZHRoWzJdOworCisgICAgLyoqIEBicmllZiBTcGVjaWZpZXMgdGFyZ2V0IGZyYW1lIHJhdGVzIGluIGZyYW1lcyBwZXIgc2Vjb25kLCBmcmFtZVJhdGVbbl0gcmVwcmVzZW50cyB0aGUgbi10aCBsYXllcidzIHRhcmdldCBmcmFtZSByYXRlLiovCisgICAgZmxvYXQgICAgICAgICAgICAgICBlbmNGcmFtZVJhdGVbMl07CisKKyAgICAvKiogQGJyaWVmIFNwZWNpZmllcyB0YXJnZXQgYml0IHJhdGVzIGluIGJpdHMgcGVyIHNlY29uZCB1bml0LCBiaXRSYXRlW25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIncyB0YXJnZXQgYml0IHJhdGUuICovCisgICAgSW50ICAgICAgICAgICAgICAgICBiaXRSYXRlWzJdOworCisgICAgLyoqIEBicmllZiBTcGVjaWZpZXMgZGVmYXVsdCBxdWFudGl6YXRpb24gcGFyYW1ldGVycyBmb3IgSS1Wb3AuIElxdWFudFtuXSByZXByZXNlbnRzIHRoZSBuLXRoIGxheWVyIGRlZmF1bHQgcXVhbnRpemF0aW9uIHBhcmFtZXRlci4gVGhlIGRlZmF1bHQgaXMgSXF1YW50WzBdPTEyLiovCisgICAgSW50ICAgICAgICAgICAgICAgICBpUXVhbnRbMl07CisKKyAgICAvKiogQGJyaWVmIFNwZWNpZmllcyBkZWZhdWx0IHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGZvciBQLVZvcC4gUHF1YW50W25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIgZGVmYXVsdCBxdWFudGl6YXRpb24gcGFyYW1ldGVyLiBUaGUgZGVmYXVsdCBpcyBQcXVhbnRbMF09MTAuKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIHBRdWFudFsyXTsKKworICAgIC8qKiBAYnJpZWYgIHNwZWNpZmllcyBxdWFudGl6YXRpb24gbW9kZSAoSDI2MyBtb2RlIG9yIE1QRUcgbW9kZSkgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSBsYXllciAoaWYgYW55KS4KKyAgICAqICAgICAgICAgICBJbiBTaW1wbGUgYW5kIFNpbXBsZSBTY2FsYWJsZSBwcm9maWxlLCB3ZSB1c2Ugb25seSBIMjYzIG1vZGUuKi8KKyAgICBJbnQgICAgICAgICAgICAgICAgIHF1YW50VHlwZVsyXTsKKworICAgIC8qKiBAYnJpZWYgU2V0cyByYXRlIGNvbnRyb2wgYWxnb3JpdGhtLCBvbmUgb2YgKENPTlNUQU5UX1EsIENCUl8xLCBvciBWQlJfMSkuCisgICAgKiAgICAgICAgICAgQ09OU1RBTlRfUSB1c2VzIHRoZSBkZWZhdWx0IHF1YW50aXphdGlvbiB2YWx1ZXMgdG8gZW5jb2RlIHRoZSBzZXF1ZW5jZS4KKyAgICAqICAgICAgICAgICBDQlJfMSAoY29uc3RhbnQgYml0IHJhdGUpIGNvbnRyb2xzIHRoZSBvdXRwdXQgYXQgYSBkZXNpcmVkIGJpdCByYXRlCisgICAgKiAgICAgICAgICAgVkJSXzEgKHZhcmlhYmxlIGJpdCByYXRlKSBnaXZlcyBiZXR0ZXIgcGljdHVyZSBxdWFsaXR5IGF0IHRoZSBleHBlbnNlIG9mIGJpdCByYXRlIGZsdWN0dWF0aW9uCisgICAgKiAgICAgICAgICAgTm90ZTogICB0eXBlPUNPTlNUQU5UX1EgcHJvZHVjZXMgc2VxdWVuY2VzIHdpdGggYXJiaXRyYXJ5IGJpdCByYXRlLgorICAgICogICAgICAgICAgICAgICAgICAgdHlwZT1DQlJfMSBwcm9kdWNlcyBzZXF1ZW5jZXMgc3VpdGFibGUgZm9yIHN0cmVhbWluZy4KKyAgICAqICAgICAgICAgICAgICAgICAgIHR5cGU9VkJSXzEgcHJvZHVjZXMgc2VxdWVuY2VzIHN1aXRhYmxlIGZvciBkb3dubG9hZC4gKi8KKyAgICBNUDRSYXRlQ29udHJvbFR5cGUgIHJjVHlwZTsKKworICAgIC8qKiBAYnJpZWYgIFNldHMgdGhlIFZCViBidWZmZXIgc2l6ZSAoaW4gdGhlIHVuaXQgb2Ygc2Vjb25kIGRlbGF5KSB1c2VkIHRvIHByZXZlbnQgYnVmZmVyIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cKKyAgICAqICAgICAgICAgICBvbiB0aGUgZGVjb2RlciBzaWRlLiBUaGlzIGZ1bmN0aW9uIGlzIHJlZHVuZGFudCB0byBQVlNldFZCVlNpemUuIEVpdGhlciBvbmUgb2YgdGhlbSBpcyB1c2VkIGF0IGEgdGltZS4gKi8KKyAgICBmbG9hdCAgICAgICAgICAgICAgIHZidkRlbGF5OworCisgICAgLyoqIEBicmllZiAgU3BlY2lmaWVzIHdoZXRoZXIgZnJhbWUgc2tpcHBpbmcgaXMgcGVybWl0dGVkIG9yIG5vdC4gV2hlbiByYXRlIGNvbnRyb2wgdHlwZSBpcyBzZXQgdG8gQ09OU1RBTlRfUQorICAgICogICAgICAgICAgIGZyYW1lIHNraXBwaW5nIGlzIGF1dG9tYXRpY2FsbHkgYmFubmVkLiAgSW4gQ0JSXzEgYW5kIFZCUl8xIHJhdGUgY29udHJvbCwgZnJhbWUgc2tpcHBpbmcgaXMgYWxsb3dlZCBieSBkZWZhdWx0LgorICAgICogICAgICAgICAgIEhvd2V2ZXIsIHVzZXJzIGNhbiBmb3JjZSBubyBmcmFtZSBza2lwcGluZyB3aXRoIHRoaXMgZmxhZywgYnV0IGJ1ZmZlciBjb25zdHJhaW50IG1heSBiZSB2aW9sYXRlZC4qLworICAgIFBhcmFtRW5jTW9kZSAgICAgICAgbm9GcmFtZVNraXBwZWQ7CisKKyAgICAvKiogQGJyaWVmIFNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIFAtZnJhbWVzIGJldHdlZW4gdHdvIEktZnJhbWVzLiBJLWZyYW1lIG1vZGUgaXMgcGVyaW9kaWNhbGx5IGZvcmNlZAorICAgICogICAgICAgICAgIGlmIG5vIEktZnJhbWUgaXMgZW5jb2RlZCBhZnRlciB0aGUgc3BlY2lmaWVkIHBlcmlvZCB0byBhZGQgZXJyb3IgcmVzaWxpZW5jeSBhbmQgaGVscCByZXN5bmNocm9uaXplIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgICogICAgICAgICAgIElmIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gY2FuIGFkZCBhZGRpdGlvbmFsIEktZnJhbWUgaWYgbmV3IHNjZW5lcyBhcmUgZGV0ZWN0ZWQuCisgICAgKiAgICAgICAgICAgaW50cmFQZXJpb2QgaXMgdGhlIEkgZnJhbWUgaW50ZXJ2YWwgaW4gdGVybXMgb2Ygc2Vjb25kLgorICAgICogICAgICAgICAgIGludHJhUGVyaW9kID0wIGluZGljYXRlcyBJLWZyYW1lIGVuY29kaW5nIG9ubHk7CisgICAgKiAgICAgICAgICAgaW50cmFQZXJpb2QgPSAtMSAgaW5kaWNhdGVzIEktZnJhbWUgZm9sbG93ZWQgYnkgYWxsIFAtZnJhbWVzOyAoZGVmYXVsdCkKKyAgICAqICAgICAgICAgICBpbnRyYVBlcmlvZCA9IE4sIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIFAtZnJhbWVzIGJldHdlZW4gMiBJLWZyYW1lcy4qLworICAgIEludCAgICAgICAgICAgICAgICAgaW50cmFQZXJpb2Q7CisKKworICAgIC8qKiBAYnJpZWYgIFNwZWNpZmllcyB0aGUgbnVtYmVyIEludHJhIE1CcyB0byBiZSByZWZyZXNoZWQgaW4gYSBQLWZyYW1lLiAqLworICAgIEludCAgICAgICAgICAgICAgICAgbnVtSW50cmFNQjsKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uIChTQ0QpIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisgICAgKiAgICAgICAgICAgV2l0aCBTQ0QgZW5hYmxlLCB3aGVuIGEgbmV3IHNjZW5lIGlzIGRldGVjdGVkLCBJLVZvcCBtb2RlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mCisgICAgKiAgICAgICAgICAgdGhlIG5ldyBzY2VuZSByZXN1bHRpbmcgaW4gYmV0dGVyIHBpY3R1cmUgcXVhbGl0eS4gQW4gaW5zZXJ0aW9uIG9mIGFuIEktVk9QIHJlc2V0cyB0aGUgaW50cmFQZXJpb2QKKyAgICAqICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIEludHJhUGVyaW9kQVBJKCkuKi8KKyAgICBQYXJhbUVuY01vZGUgICAgICAgIHNjZW5lRGV0ZWN0OworCisgICAgLyoqIEBicmllZiAgU3BlY2lmaWVzIHRoZSBzZWFyY2ggcmFuZ2Ugb2YgbW90aW9uIGVzdGltYXRpb24gc2VhcmNoLiAgTGFyZ2VyIHZhbHVlIGltcGxpZXMKKyAgICAqICAgICAgICAgICBsYXJnZXIgc2VhcmNoIHJhbmdlLCBiZXR0ZXIgbW90aW9uIHZlY3RvciBtYXRjaCwgYnV0IG1vcmUgY29tcGxleGl0eS4KKyAgICAqICAgICAgICAgICBJZiBzZWFyY2hSYW5nZT1uLCB0aGUgbW90aW9uIHZlY3RvciBzZWFyY2ggaXMgaW4gdGhlIHJhbmdlIG9mIFstbixuLTFdIHBpeGVscy4KKyAgICAqICAgICAgICAgICBJZiBoYWxmLXBlbCAgbW9kZSBpcyBvbiwgdGhlIHJhbmdlIGlzIFstbiwgKG4tMSkrMS8yXSBwaXhlbHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE2LiovCisgICAgSW50ICAgICAgICAgICAgICAgICBzZWFyY2hSYW5nZTsKKworICAgIC8qKiBAYnJpZWYgIFR1cm5zIG9uL29mZiA4eDggYmxvY2sgbW90aW9uIGVzdGltYXRpb24gYW5kIGNvbXBlbnNhdGlvbi4KKyAgICAqICAgICAgICAgICBJZiBvbiwgZm91ciBtb3Rpb24gdmVjdG9ycyBtYXkgYmUgdXNlZCBmb3IgbW90aW9uIGVzdGltYXRpb24gYW5kIGNvbXBlbnNhdGlvbiBvZiBhIG1hY3JvYmxvY2ssCisgICAgKiAgICAgICAgICAgb3RoZXJ3aXNlIG9uZSBtb3Rpb24gdmVjdG9yIHBlciBtYWNyb2Jsb2NrIGlzIHVzZWQuIFdoZW4gdGhlIDh4OCBNViBpcyBvZmYsIHRoZSB0b3RhbCBlbmNvZGluZyBjb21wbGV4aXR5CisgICAgKiAgICAgICAgICAgaXMgbGVzcyBidXQgdGhlIGltYWdlIHF1YWxpdHkgaXMgYWxzbyB3b3JzZS4gVGhlcmVmb3JlLCBpdCBjYW4gYmUgdXNlZCBpbiBjb21wbGV4aXR5IGxpbWl0ZWQgZW52aXJvbm1lbnQuKi8KKyAgICBQYXJhbUVuY01vZGUgICAgICAgIG12OHg4RW5hYmxlOworCisKKyAgICAvKiogQGJyaWVmIFNldCB0aGUgdGhyZXNob2xkIGZvciB1c2luZyBpbnRyYSBEQyBWTEMuCisgICAgKiAgICAgICAgICAgVmFsdWUgbXVzdCByYW5nZSBmcm9tIDAtNy4qLworICAgIEludCAgICAgICAgICAgICAgICAgaW50cmFEQ1ZsY1RoOworCisgICAgLyoqIEBicmllZiBUaGlzIGZsYWcgdHVybnMgb24gdGhlIHVzZSBvZiBBQyBwcmVkaWN0aW9uICovCisgICAgQm9vbCAgICAgICAgICAgICAgICB1c2VBQ1ByZWQ7CisKK30gVmlkZW9FbmNPcHRpb25zOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisKKyAgICAvKiBBUEkncyAqLworICAgIC8qIEFsd2F5cyBzdGFydCB3aXRoIHRoaXMgb25lICEhKi8KKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBHZXRzIGRlZmF1bHQgZW5jb2Rpbmcgb3B0aW9ucy4gVGhpcyB3YXkgdXNlcnMgb25seSBoYXZlIHRvIHNldCByZWxldmFudCBlbmNvZGluZyBvcHRpb25zIGFuZCBsZWF2ZSB0aGUgb25lCisgICAgKiAgICAgICAgICAgdGhleSBhcmUgdW5zdXJlIG9mLgorICAgICogICBAZW5jT3B0aW9uICBQb2ludGVyIHRvIFZpZGVvRW5jT3B0aW9uIHN0cnVjdHVyZS4KKyAgICAqICAgQGVuY1VzZUNhc2UgVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgZGVmYXVsdCBlbmNvZGluZyBvcHRpb25zLCBmb3IgZXhhbXBsZSwgZGlmZmVyZW50IGVuY29kaW5nIG9wdGlvbnMKKyAgICAqICAgICAgICAgICAgYXJlIGFzc2lnbmVkIHRvIHN0cmVhbWluZyB1c2UtY2FzZSBhcyBjb21wYXJlZCB0byBkb3dubG9hZCB1c2UtY2FzZS4gSXQgY2FuIGJlIHByb2plY3QgZGVwZW5kZW50IHRvby4KKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgUFZHZXREZWZhdWx0RW5jT3B0aW9uKFZpZGVvRW5jT3B0aW9ucyAqZW5jT3B0aW9uLCBJbnQgZW5jVXNlQ2FzZSk7CisKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBWZXJpZmllcyB0aGUgY29uc2lzdGVuY3kgb2YgZW5jb2RpbmcgcGFyYW1ldGVycywgYWxsb2NhdGVzIG1lbW9yeSBuZWVkZWQgYW5kIHNldCBuZWNlc3NhcnkgaW50ZXJuYWwgdmFyaWFibGVzLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZJbml0VmlkZW9FbmNvZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFZpZGVvRW5jT3B0aW9ucyAqZW5jT3B0aW9uKTsKKworICAgIC8qIGFjcXVpcmluZyBlbmNvZGVyIGluZm8gQVBJcyAqLworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBWT0wgaGVhZGVyLiBJdCBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhbWUgaXMgZW5jb2RlZC4gIElmIHNvLAorICAgICogICAgICAgICAgIHRoZW4gdGhlIFZPTCBIZWFkZXIgaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLiBUaGVuIGFsbCBmcmFtZXMgdGhhdCBhcmUgZW5jb2RlZCBkbyBub3QgY29udGFpbiB0aGUgVk9MIEhlYWRlci4KKyAgICAqICAgICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhlIEFQSSB0aGVuIHRoZSBWT0wgSGVhZGVyIGlzIHBhc3NlZCB3aXRoaW4gdGhlIGZpcnN0IGZyYW1lIHRoYXQgaXMgZW5jb2RlZC4KKyAgICAqICAgICAgICAgICBUaGUgYmVoYXZpb3IgaXMgdW5rbm93biBpZiBpdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGZpcnN0IGZyYW1lIGlzIGVuY29kZWQuIEl0IGlzIG1haW5seSB1c2VkIGZvciBNUDQgZmlsZSBmb3JtYXQgYXV0aG9yaW5nLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMuCisgICAgKiAgIEBwYXJhbSAgdm9sSGVhZGVyIGlzIHRoZSBCdWZmZXIgZm9yIFZPTCBoZWFkZXIuCisgICAgKiAgIEBwYXJhbSAgc2l6ZSBpcyB0aGUgc2l6ZSBvZiBWT0wgaGVhZGVyIGluIGJ5dGVzLgorICAgICogICBAcGFyYW0gIGxheWVyIGlzIHRoZSBsYXllciBvZiB0aGUgcmVxdWVzdGVkIFZPTCBoZWFkZXIuCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMuCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkdldFZvbEhlYWRlcihWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBVQ2hhciAqdm9sSGVhZGVyLCBJbnQgKnNpemUsIEludCBsYXllcik7CisKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByb2ZpbGUgYW5kIGxldmVsIGluIEguMjYzIGNvZGluZyB3aGVuIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIGFyZSBzZXQKKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzLgorICAgICogICBAcGFyYW0gIHByb2ZpbGVJRCBpcyB0aGUgcG9pbnRlciBvZiB0aGUgcHJvZmlsZSBJRC4gUmlnaHQgbm93IHdlIG9ubHkgc3VwcG9ydCBwcm9maWxlIDAKKyAgICAqICAgQHBhcmFtICBsZXZlbElEIGlzIHRoZSBwb2ludGVyIG9mIHRoZSBsZXZlbCBJRCB0aGF0IGNvdWxkIGJlIDEwLTcwLgorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zLgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZHZXRIMjYzUHJvZmlsZUxldmVsSUQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpwcm9maWxlSUQsIEludCAqbGV2ZWxJRCk7CisKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByb2ZpbGUgYW5kIGxldmVsIG9mIE1QRUc0IHdoZW4gdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgYXJlIHNldAorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMuCisgICAgKiAgIEBwYXJhbSAgcHJvZmlsZV9sZXZlbCBpcyB0aGUgcG9pbnRlciBvZiB0aGUgcHJvZmlsZSBlbnVtZXJhdGlvbgorICAgICogICBAcGFyYW0gIG5MYXllciBpcyB0aGUgaW5kZXggb2YgdGhlIGxheWVyIG9mIGludGVyZXN0CisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMuCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkdldE1QRUc0UHJvZmlsZUxldmVsSUQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpwcm9maWxlX2xldmVsLCBJbnQgbkxheWVyKTsKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBtYXhpbXVtIGZyYW1lIHNpemUgaW4gYnl0ZXMKKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgbWF4VmlkZW9GcmFtZVNpemUgaXMgdGhlIHBvaW50ZXIgb2YgdGhlIG1heGltdW0gZnJhbWUgc2l6ZQorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkdldE1heFZpZGVvRnJhbWVTaXplKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqbWF4VmlkZW9GcmFtZVNpemUpOworCisjaWZuZGVmIExJTUlURURfQVBJCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IChpbiBieXRlcykgYWxsb2NhdGVkIGJ5IHRoZSBlbmNvZGVyIGxpYnJhcnkuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgSW50ICAgICBQVkdldEVuY01lbW9yeVVzYWdlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IFBWQXV0aG9yIHRvIGdldCB0aGUgc2l6ZSBvZiB0aGUgVkJWIGJ1ZmZlci4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgVkJWU2l6ZSBpcyB0aGUgcG9pbnRlciBvZiBUaGUgc2l6ZSBvZiB0aGUgVkJWIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZHZXRWQlZTaXplKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqVkJWU2l6ZSk7CisjZW5kaWYKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBhIGZyYW1lIGluIFlVViA0OjI6MCBmb3JtYXQgZnJvbSB0aGUgKnZpZGVvX2luIGlucHV0IGZyYW1lIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBZVVYKKyAgICAqICAgICAgICAgICBmb3IgcmVjb25zdHJ1Y3RlZCBmcmFtZSBhbmQgYnN0cmVhbSBmb3IgTVBFRzQgYml0c3RyZWFtLiBUaGUgYXBwbGljYXRpb24gaXMgcmVxdWlyZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvcgorICAgICogICAgICAgICAgIGJpdHN0cmVhbSBidWZmZXIuVGhlIHNpemUgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSBtZW1vcnkgYW5kIHRoZSByZXR1cm5lZCBvdXRwdXQgYnVmZmVyIGFyZSBzcGVjaWZpZWQgaW4gdGhlCisgICAgKiAgICAgICAgICAgc2l6ZSBmaWVsZC4gVGhlIGVuY29kZWQgbGF5ZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBuTGF5ZXIgZmllbGQuIElmIHRoZSBjdXJyZW50IGZyYW1lIGlzIG5vdCBlbmNvZGVkLCBzaXplPTAgYW5kIG5MYXllcj0tMS4KKyAgICAqICAgICAgICAgICBOb3RlOiBJZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbCB0byBmaXQgYSBiaXRzdHJlYW0gb2YgYSBmcmFtZSwgdGhlbiB0aG9zZSBleHRyYSBiaXRzIHdpbGwgYmUgbGVmdCBvdXQKKyAgICAqICAgICAgICAgICAgICAgICB3aGljaCBjYW4gY2F1c2Ugc3ludGFjdGljIGVycm9yIGF0IHRoZSBkZWNvZGVyIHNpZGUuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcGFyYW0gIHZpZF9pbiBpcyB0aGUgcG9pbnRlciB0byBWaWRlb0VuY0ZyYW1lSU8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIFlVViBpbnB1dCBkYXRhCisgICAgKiAgIEBwYXJhbSAgdmlkX291dCBpcyB0aGUgcG9pbnRlciB0byBWaWRlb0VuY0ZyYW1lSU8gc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHJlY29uc3RydWN0ZWQgWVVWIG91dHB1dCBkYXRhIGFmdGVyIGVuY29kaW5nCisgICAgKiAgIEBwYXJhbSAgbmV4dE1vZFRpbWUgaXMgdGhlIHRpbWVzdGFtcCBlbmNvZGVyIGV4cGVjdHMgZnJvbSB0aGUgbmV4dCBpbnB1dAorICAgICogICBAcGFyYW0gIGJzdHJlYW0gaXMgdGhlIHBvaW50ZXIgdG8gTVBFRzQgYml0c3RyZWFtIGJ1ZmZlcgorICAgICogICBAcGFyYW0gIHNpemUgaXMgdGhlIHNpemUgb2YgYml0c3RyZWFtIGJ1ZmZlciBhbGxvY2F0ZWQgKGlucHV0KSBhbmQgc2l6ZSBvZiB0aGUgZW5jb2RlZCBiaXRzdHJlYW0gKG91dHB1dCkuCisgICAgKiAgIEBwYXJhbSAgbkxheWVyIGlzIHRoZSBsYXllciBvZiB0aGUgZW5jb2RlZCBmcmFtZSBlaXRoZXIgMCBmb3IgYmFzZSBvciAxIGZvciBlbmhhbmNlbWVudCBsYXllci4gVGhlIHZhbHVlIC0xIGluZGljYXRlcyBza2lwcGVkIGZyYW1lIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3cuCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBuZXdmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWRW5jb2RlVmlkZW9GcmFtZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9pbiwgVmlkZW9FbmNGcmFtZUlPICp2aWRfb3V0LAorICAgICAgICAgICAgVUxvbmcgKm5leHRNb2RUaW1lLCBVQ2hhciAqYnN0cmVhbSwgSW50ICpzaXplLCBJbnQgKm5MYXllcik7CisKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBxdWVyeSBvdmVycnVuIGJ1ZmZlci4gSXQgaXMgdXNlZCB3aGVuIFBWRW5jb2RlVmlkZW9GcmFtZS5yZXR1cm5zIHNpemUgdGhhdCBpcworICAgICogICAgICAgICAgIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBzaXplLgorICAgICogICBAcGFyYW0gIGVuY0N0cmwgaXMgdmlkZW8gZW5jb2RlciBjb250cm9sIHN0cnVjdHVyZSB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgYXMgaW5wdXQgaW4gYWxsIEFQSXMKKyAgICAqICAgQHJldHVybiBQb2ludGVyIHRvIHRoZSBvdmVycnVuIGJ1ZmZlci4gTlVMTCBpZiBvdmVycnVuIGJ1ZmZlciBpcyBub3QgdXNlZC4KKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBVQ2hhciogUFZHZXRPdmVycnVuQnVmZmVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworCisjaWZuZGVmIE5PX1NMSUNFX0VOQ09ERSAgIC8qIFRoaXMgc2V0IG9mIEFQSXMgYXJlIG5vdCB3b3JraW5nLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gcGFydGlhbGx5IAorICAgIHJlcGxhY2VkIGJ5IHRoZSBpbnRyb2R1Y3Rpb24gb2Ygb3ZlcnJ1biBidWZmZXIuICovCisKKyAgICAvKiBzbGljZS1iYXNlZCBjb2RpbmcgKi8KKyAgICAvKioKKyAgICAqICAgQGJyaWVmICBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGlucHV0IFlVViBmcmFtZSBhbmQgdGltZXN0YW1wIHRvIGJlIGVuY29kZWQgYnkgdGhlIHNsaWNlLWJhc2VkIGVuY29kaW5nIGZ1bmN0aW9uIFBWRW5jb2RlU2xpY2UoKS4KKyAgICAqICAgICAgICAgICBJdCBhbHNvIHJldHVybiB0aGUgbWVtb3J5IGFkZHJlc3MgdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgd2lsbCBiZSBjb3BpZWQgdG8gKGluIGFkdmFuY2UpIGFuZCB0aGUgY29kZWQgbGF5ZXIgbnVtYmVyLgorICAgICogICAgICAgICAgIFRoZSBlbmNvZGVyIGxpYnJhcnkgcHJvY2Vzc2VzIHRoZSB0aW1lc3RhbXAgYW5kIGRldGVybWluZSBpZiB0aGlzIGZyYW1lIGlzIHRvIGJlIGVuY29kZWQgb3Igbm90LiBJZiB0aGUgY3VycmVudCBmcmFtZQorICAgICogICAgICAgICAgIGlzIG5vdCBlbmNvZGVkLCBuTGF5ZXI9LTEuIEZvciBmcmFtZS1iYXNlZCBtb3Rpb24gZXN0aW1hdGlvbiwgdGhlIG1vdGlvbiBlc3RpbWF0aW9uIG9mIHRoZSBlbnRpcmUgZnJhbWUgaXMgYWxzbyBwZXJmb3JtZWQKKyAgICAqICAgICAgICAgICBpbiB0aGlzIGZ1bmN0aW9uLiBGb3IgTUItYmFzZWQgbW90aW9uIGVzdGltYXRpb24sIHRoZSBtb3Rpb24gdmVjdG9yIGlzIHNlYXJjaGVkIHdoaWxlIGNvZGluZyBlYWNoIE1CIGluIFBWRW5jb2RlU2xpY2UoKS4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgdmlkX2luIGlzIHRoZSBwb2ludGVyIHRvIFZpZGVvRW5jRnJhbWVJTyBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgWVVWIGlucHV0IGRhdGEKKyAgICAqICAgQHBhcmFtICBuZXh0TW9kVGltZSBpcyB0aGUgdGltZXN0YW1wIGVuY29kZXIgZXhwZWN0cyBmcm9tIHRoZSBuZXh0IGlucHV0IGlmIHRoaXMgaW5wdXQgaXMgcmVqZWN0ZWQgYW5kIG5MYXllciBpcyBzZXQgdG8gLTEuCisgICAgKiAgIEBwYXJhbSAgbkxheWVyIGlzIHRoZSBsYXllciBvZiB0aGUgZW5jb2RlZCBmcmFtZSBlaXRoZXIgMCBmb3IgYmFzZSBvciAxIGZvciBlbmhhbmNlbWVudCBsYXllci4gVGhlIHZhbHVlIC0xIGluZGljYXRlcyBza2lwcGVkIGZyYW1lIGR1ZSB0byBidWZmZXIgb3ZlcmZsb3cuCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBuZXdmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWRW5jb2RlRnJhbWVTZXQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVmlkZW9FbmNGcmFtZUlPICp2aWRfaW4sIFVMb25nICpuZXh0TW9kVGltZSwgSW50ICpuTGF5ZXIpOworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBhIEdPQiAoc2hvcnQgaGVhZGVyIG1vZGUpIG9yIGEgcGFja2V0IChkYXRhIHBhcnRpdGlvbmluZyBtb2RlIG9yIGNvbWJpbmVkIG1vZGUgd2l0aCByZXN5bmMgbWFya2VyKQorICAgICogICAgICAgICAgIGFuZCBvdXRwdXQgdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgYW5kIE1QRUc0IGJpdHN0cmVhbS4gVGhlIGFwcGxpY2F0aW9uIGlzIHJlcXVpcmVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJpdHN0cmVhbSBidWZmZXIuCisgICAgKiAgICAgICAgICAgVGhlIHNpemUgb2YgdGhlIGlucHV0IGJpdHN0cmVhbSBtZW1vcnkgYW5kIHRoZSByZXR1cm5lZCBvdXRwdXQgYnVmZmVyIGFyZSBzcGVjaWZpZWQgaW4gdGhlIHNpemUgZmllbGQuICBJZiB0aGUgYnVmZmVyIHNpemUgaXMKKyAgICAqICAgICAgICAgICBzbWFsbGVyIHRoYW4gdGhlIHJlcXVlc3RlZCBwYWNrZXQgc2l6ZSwgdXNlciBoYXMgdG8gY2FsbCBQVkVuY29kZVNsaWNlIGFnYWluIHRvIGdldCB0aGUgcmVzdCBvZiB0aGF0IHBlbmRpbmcgcGFja2V0IGJlZm9yZSBtb3ZpbmcKKyAgICAqICAgICAgICAgICBvbiB0byB0aGUgbmV4dCBwYWNrZXQuIEZvciB0aGUgY29tYmluZWQgbW9kZSB3aXRob3V0IHJlc3luYyBtYXJrZXIsIHRoZSBmdW5jdGlvbiByZXR1cm5zIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsLgorICAgICogICAgICAgICAgIFRoZSBlbmQtb2YtZnJhbWUgZmxhZyAgaW5kaWNhdGVzIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBmcmFtZSBlbmNvZGluZy4gIE5leHQgZnJhbWUgbXVzdCBiZSBzZW50IGluIHdpdGggUFZFbmNvZGVGcmFtZVNldCgpLgorICAgICogICAgICAgICAgIEF0IHRoZSBlbmQtb2YtZnJhbWUsIHRoZSBuZXh0IHZpZGVvIGlucHV0IGFkZHJlc3MgYW5kIHRoZSBuZXh0IHZpZGVvIG1vZHVsbyB0aW1lc3RhbXAgd2lsbCBiZSBzZXQuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcGFyYW0gIGJzdHJlYW0gaXMgdGhlIHBvaW50ZXIgdG8gTVBFRzQgYml0c3RyZWFtIGJ1ZmZlci4KKyAgICAqICAgQHBhcmFtICBzaXplIGlzIHRoZSBzaXplIG9mIGJpdHN0cmVhbSBidWZmZXIgYWxsb2NhdGVkIChpbnB1dCkgYW5kIHNpemUgb2YgdGhlIGVuY29kZWQgYml0c3RyZWFtIChvdXRwdXQpLgorICAgICogICBAcGFyYW0gIGVuZG9mRnJhbWUgaXMgYSBmbGFnIGluZGljYXRpbmcgdGhlIGVuZC1vZi1mcmFtZSwgJzEnLiBPdGhlcndpc2UsICcwJy4gIFdoZW4gUFZTZXROb0N1cnJlbnRGcmFtZVNraXAgaXMgT0ZGLAorICAgICogICAgICAgICAgIGVuZC1vZi1mcmFtZSAnLTEnIGluZGljYXRlcyBjdXJyZW50IGZyYW1lIGJpdHN0cmVhbSBtdXN0IGJlIGRpc3JlZ2FyZGVkLgorICAgICogICBAcGFyYW0gIHZpZF9vdXQgaXMgdGhlIHBvaW50ZXIgdG8gVmlkZW9FbmNGcmFtZUlPIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSByZWNvbnN0cnVjdGVkIFlVViBvdXRwdXQgZGF0YSBhZnRlciBlbmNvZGluZworICAgICogICBAcGFyYW0gIG5leHRNb2RUaW1lIGlzIHRoZSB0aW1lc3RhbXAgZW5jb2RlciBleHBlY3RzIGZyb20gdGhlIG5leHQgaW5wdXQKKyAgICAqICAgQHJldHVybiB0cnVlIG5ld2ZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZFbmNvZGVTbGljZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBVQ2hhciAqYnN0cmVhbSwgSW50ICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ICplbmRvZkZyYW1lLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9vdXQsIFVMb25nICpuZXh0TW9kVGltZSk7CisjZW5kaWYKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBNUDQgZmlsZSBmb3JtYXQgaGludCB0cmFjayBpbmZvcm1hdGlvbi4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgaW5mbyBpcyB0aGUgc3RydWN0dXJlIGZvciBNUDQgaGludCB0cmFjayBpbmZvcm1hdGlvbgorICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkdldEhpbnRUcmFjayhWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBNUDRIaW50VHJhY2sgKmluZm8pOworCisjaWZuZGVmIExJTUlURURfQVBJCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgdXBkYXRlcyB0YXJnZXQgZnJhbWUgcmF0ZXMgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSBsYXllciAoaWYgYW55KSB3aGlsZSBlbmNvZGluZyBvcGVyYXRpb24gaXMgb25nb2luZy4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgZnJhbWVSYXRlIGlzIHRoZSBwb2ludGVycyB0byBhcnJheSBvZiB0YXJnZXQgZnJhbWUgcmF0ZXMgaW4gZnJhbWVzIHBlciBzZWNvbmQsCisgICAgKiAgICAgICAgICAgZnJhbWVSYXRlW25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIncyB0YXJnZXQgZnJhbWUgcmF0ZS4KKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZVcGRhdGVFbmNGcmFtZVJhdGUoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgZmxvYXQgKmZyYW1lUmF0ZSk7IC8qIGZvciAyLXdheSAqLworCisKKyAgICAvKioKKyAgICAqICAgQGJyaWVmICB1cGRhdGVzIHRhcmdldCBiaXQgcmF0ZXMgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSBsYXllciAoaWYgYW55KSB3aGlsZSBlbmNvZGluZyBvcGVyYXRpb24gaXMgb25nb2luZy4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgYml0UmF0ZSBpcyB0aGUgcG9pbnRlcnMgdG8gYXJyYXkgb2YgdGFyZ2V0IGJpdCByYXRlcyBpbiBiaXRzIHBlciBzZWNvbmQgdW5pdCwKKyAgICAqICAgICAgICAgICBiaXRSYXRlW25dIHJlcHJlc2VudHMgdGhlIG4tdGggbGF5ZXIncyB0YXJnZXQgYml0IHJhdGUuCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWVXBkYXRlQml0UmF0ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKmJpdFJhdGUpOyAgICAgICAgICAgLyogZm9yIDItd2F5ICovCisKKworICAgIC8qKgorICAgICogICBAYnJpZWYgIHVwZGF0ZXMgdGhlIElOVFJBIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwgd2hpbGUgZW5jb2Rpbmcgb3BlcmF0aW9uIGlzIG9uZ29pbmcuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcGFyYW0gIGFJRnJhbWVQZXJpb2QgaXMgYSBuZXcgdmFsdWUgb2YgSU5UUkEgZnJhbWUgaW50ZXJ2YWwgaW4gdGhlIHVuaXQgb2YgbnVtYmVyIG9mIGNvZGVkIGZyYW1lcy4KKyAgICAqICAgQHJldHVybiB0cnVlIGZvciBjb3JyZWN0IG9wZXJhdGlvbjsgZmFsc2UgaWYgZXJyb3IgaGFwcGVucworICAgICovCisKKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVlVwZGF0ZUlGcmFtZUludGVydmFsKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCBhSUZyYW1lUGVyaW9kKTsvKiBmb3IgMi13YXkgKi8KKworICAgIC8qKgorICAgICogICBAYnJpZWYgIHNwZWNpZmllcyB0aGUgbnVtYmVyIEludHJhIE1CcyB0byBiZSByZWZyZXNoZWQKKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEBwYXJhbSAgbnVtTUIgaXMgdGhlIG51bWJlciBvZiBJbnRyYSBNQnMgdG8gYmUgcmVmcmVzaGVkCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWVXBkYXRlTnVtSW50cmFNQlJlZnJlc2goVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50IG51bU1CKTsgIC8qIGZvciAyLXdheSAqLworCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgdXNlcnMgd2FudCB0aGUgbmV4dCBiYXNlIGZyYW1lIHRvIGJlIGVuY29kZWQgYXMgYW4gSS1Wb3AuCisgICAgKiAgIEBwYXJhbSAgZW5jQ3RybCBpcyB2aWRlbyBlbmNvZGVyIGNvbnRyb2wgc3RydWN0dXJlIHRoYXQgaXMgYWx3YXlzIHBhc3NlZCBhcyBpbnB1dCBpbiBhbGwgQVBJcworICAgICogICBAcmV0dXJuIHRydWUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uOyBmYWxzZSBpZiBlcnJvciBoYXBwZW5zCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVklGcmFtZVJlcXVlc3QoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAyLXdheSAqLworCisjZW5kaWYgLy8gTElNSVRFRF9BUEkKKworICAgIC8qIGZpbmlzaGluZyBlbmNvZGVyICovCisgICAgLyoqCisgICAgKiAgIEBicmllZiAgVGhpcyBmdW5jdGlvbiBmcmVlcyB1cCBhbGwgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGVuY29kZXIgbGlicmFyeS4KKyAgICAqICAgQHBhcmFtICBlbmNDdHJsIGlzIHZpZGVvIGVuY29kZXIgY29udHJvbCBzdHJ1Y3R1cmUgdGhhdCBpcyBhbHdheXMgcGFzc2VkIGFzIGlucHV0IGluIGFsbCBBUElzCisgICAgKiAgIEByZXR1cm4gdHJ1ZSBmb3IgY29ycmVjdCBvcGVyYXRpb247IGZhbHNlIGlmIGVycm9yIGhhcHBlbnMKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfTVA0RU5DX0FQSV9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRjNGFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApAQCAtMCwwICsxLDg1OSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIERhdGU6IDgvMDIvMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDaGFuZ2UgdGhlIGJpdHN0cmVhbSBwYXJzaW5nIGFsZ29yaXRobS4gVXNlIHRlbXBvcmFyeSB3b3JkIG9mIDIgb3IgNCBieXRlcyAgKi8KKy8qICBiZWZvcmUgd3JpdGluZyBpdCB0byB0aGUgYml0c3RyZWFtIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlIGJ5dGVDb3VudCBkb2Vzbid0IGhhdmUgdG8gYmUgbXVsdGlwbGUgb2YgMiBvciA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJiaXRzdHJlYW1faW8uaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgY29uc3QgVUNoYXIgTWFza1sgXSA9Cit7CisgICAgMHgwMCwgMHgwMSwgMHgwMywgMHgwNywgMHgwRiwgMHgxRiwgMHgzRiwgMHg3RiwgMHhGRgorfTsKKworI2RlZmluZSBXT1JEX1NJWkUgICA0ICAgLyogZm9yIDMyLWJpdCBtYWNoaW5lICovCisKKy8qTm90ZToKKyAgICAxLiBUaGVyZSBpcyBhIHByb2JsZW0gd2hlbiBvdXRwdXQgdGhlIGxhc3QgYml0cyh3aGljaCBjYW4gbm90IGZvcm0gYSBieXRlIHlldAorICAgIHNvIHdoZW4geW91IG91dHB1dCwgeW91IG5lZWQgdG8gc3R1ZmYgdG8gbWFrZSBzdXJlIGl0IGlzIGEgYnl0ZQorICAgIDIuICBJIG5vdyBoYXJkIGNvZGVkIGJ5dGUgdG8gYmUgOCBiaXRzKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdFN0cmVhbUNyZWF0ZUVuYyhJbnQgYnVmZmVyU2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBDcmVhdGUgYSBiaXRzdHJlYW0gdG8gaG9sZCBvbmUgZW5jb2RlZCB2aWRlbyBwYWNrZXQgb3IgZnJhbWUgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBidWZmZXJTaXplICA6ICAgc2l6ZSBvZiB0aGUgYml0c3RyZWFtIGJ1ZmZlciBpbiBieXRlcyAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQb2ludGVyIHRvIHRoZSBCaXRzdHJlYW1FbmNWaWRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK0JpdHN0cmVhbUVuY1ZpZGVvICpCaXRTdHJlYW1DcmVhdGVFbmMoSW50IGJ1ZmZlclNpemUpCit7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbTsKKyAgICBzdHJlYW0gPSAoQml0c3RyZWFtRW5jVmlkZW8gKikgTTRWRU5DX01BTExPQyhzaXplb2YoQml0c3RyZWFtRW5jVmlkZW8pKTsKKyAgICBpZiAoc3RyZWFtID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyZWFtLT5idWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKyAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKHN0cmVhbS0+YnVmZmVyU2l6ZSAqIHNpemVvZihVQ2hhcikpOworICAgIGlmIChzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTTRWRU5DX0ZSRUUoc3RyZWFtKTsKKyAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIE00VkVOQ19NRU1TRVQoc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIsIDAsIHN0cmVhbS0+YnVmZmVyU2l6ZSpzaXplb2YoVUNoYXIpKTsKKyAgICBzdHJlYW0tPndvcmQgPSAwOworI2lmIFdPUkRfU0laRT09NAorICAgIHN0cmVhbS0+Yml0TGVmdCA9IDMyOworI2Vsc2UKKyAgICBzdHJlYW0tPmJpdExlZnQgPSAxNjsKKyNlbmRpZgorICAgIHN0cmVhbS0+Ynl0ZUNvdW50ID0gMDsKKworICAgIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9IE5VTEw7CisgICAgc3RyZWFtLT5vQlNpemUgPSAwOworCisgICAgcmV0dXJuIHN0cmVhbTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1DbG9zZUVuYyggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogY2xvc2UgYSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOgorICAgICAgICBzdHJlYW0gIDogICB0aGUgYml0c3RyZWFtIHRvIGJlIGNsb3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZvaWQgIEJpdHN0cmVhbUNsb3NlRW5jKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pCit7CisgICAgaWYgKHN0cmVhbSkKKyAgICB7CisgICAgICAgIGlmIChzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTTRWRU5DX0ZSRUUoc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgTTRWRU5DX0ZSRUUoc3RyZWFtKTsKKyAgICB9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1QdXRCaXRzKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIEludCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW50IFZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogcHV0IExlbmd0aCAoMS0xNikgbnVtYmVyIG9mIGJpdHMgdG8gdGhlIHN0cmVhbSAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIGZvciAzMi1iaXQgbWFjaGluZSB0aGlzIGZ1bmN0aW9uIGNhbiBkbyB1cHRvIDMyIGJpdCBpbnB1dCAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdHJlYW0gICAgICB0aGUgYml0c3RyZWFtIHdoZXJlIHRoZSBiaXRzIGFyZSBwdXQgaW4gICAgICAgICAgICAgICAgICovCisvKiAgICAgIExlbmd0aCAgICAgIGJpdHMgbGVuZ3RoIChzaG91bGQgYmVsb25nIHRvIDEgdG8gMTYpICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgVmFsdWUgICAgICAgdGhvc2UgYml0cyB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogIFBWX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEJpdHN0cmVhbVB1dEJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50IExlbmd0aCwgVUludCBWYWx1ZSkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworCisgICAgaWYgKHN0cmVhbS0+Yml0TGVmdCA+IExlbmd0aCkKKyAgICB7CisgICAgICAgIHN0cmVhbS0+d29yZCA8PD0gTGVuZ3RoOworICAgICAgICBzdHJlYW0tPndvcmQgfD0gVmFsdWU7ICAvKiBhc3N1bWluZyBWYWx1ZSBpcyBub3QgbGFyZ2VyIHRoYW4gTGVuZ3RoICovCisgICAgICAgIHN0cmVhbS0+Yml0TGVmdCAtPSBMZW5ndGg7CisgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIHN0cmVhbS0+d29yZCA8PD0gc3RyZWFtLT5iaXRMZWZ0OworICAgICAgICBMZW5ndGggLT0gc3RyZWFtLT5iaXRMZWZ0OworICAgICAgICBzdHJlYW0tPndvcmQgfD0gKChVSW50KVZhbHVlID4+IExlbmd0aCk7CisKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgZ290IG5ldyBMZW5ndGggYW5kIFZhbHVlICovCisgICAgICAgIC8qIG5vdGUgdGhhdCBWYWx1ZSBpcyBub3QgImNsZWFuIiBiZWNhdXNlIG9mIG1zYiBhcmUgbm90IG1hc2tlZCBvdXQgKi8KKyAgICAgICAgc3RyZWFtLT53b3JkID0gVmFsdWU7CisgICAgICAgIHN0cmVhbS0+Yml0TGVmdCAtPSBMZW5ndGg7CisgICAgICAgIC8qIGFzc3VtaW5nIHRoYXQgTGVuZ3RoIGlzIG5vIG1vcmUgdGhhbiAxNiBiaXRzICovCisgICAgICAgIC8qIHN0cmVhbS0+Yml0TGVmdCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm8gYXQgdGhpcyBwb2ludCAqLworICAgICAgICAvL2lmKHN0cmVhbS0+Yml0TGVmdDw9MCkKKyAgICAgICAgLy8gIGV4aXQoLTEpOworICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtUHV0R1QxNkJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50IExlbmd0aCwgVUludDMyIFZhbHVlKSAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBVc2UgdGhpcyBmdW5jdGlvbiB0byBwdXQgTGVuZ3RoICgxNy0zMikgbnVtYmVyIG9mIGJpdHMgdG8gICAgKi8KKy8qICAgICAgICAgICAgICBmb3IgMTYtYml0IG1hY2hpbmUgIHRoZSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN0cmVhbSAgICAgIHRoZSBiaXRzdHJlYW0gd2hlcmUgdGhlIGJpdHMgYXJlIHB1dCBpbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgTGVuZ3RoICAgICAgYml0cyBsZW5ndGggKHNob3VsZCBiZWxvbmcgdG8gMTcgdG8gMzIpICAgICAgICAgICAgICAgICAqLworLyogICAgICBWYWx1ZSAgICAgICB0aG9zZSBiaXRzIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgQml0c3RyZWFtUHV0R1QxNkJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50IExlbmd0aCwgVUxvbmcgVmFsdWUpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICBVSW50IHRvcFZhbHVlOworICAgIEludCB0b3BMZW5ndGg7CisKKyAgICB0b3BWYWx1ZSA9IChWYWx1ZSA+PiAxNik7CisgICAgdG9wTGVuZ3RoID0gTGVuZ3RoIC0gMTY7CisKKyAgICBpZiAodG9wTGVuZ3RoID4gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCB0b3BMZW5ndGgsIHRvcFZhbHVlKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgMTYsIChVSW50KShWYWx1ZSAmIDB4RkZGRikpOworCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCBMZW5ndGgsIChVSW50KVZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtU2F2ZVdvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8wMy8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IHNhdmUgd3JpdHRlbiB3b3JkIGludG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHN0cmVhbSAgICAgIHRoZSBiaXRzdHJlYW0gd2hlcmUgdGhlIGJpdHMgYXJlIHB1dCBpbiAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBQVl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIEJpdHN0cmVhbVNhdmVXb3JkKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pCit7CisgICAgVUNoYXIgKnB0cjsKKyAgICBVSW50IHdvcmQ7CisKKyAgICAvKiBhc3N1bWUgdGhhdCBzdHJlYW0tPmJpdExlZnQgaXMgYWx3YXlzIHplcm8gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAqLworICAgIGlmIChzdHJlYW0tPmJ5dGVDb3VudCArIFdPUkRfU0laRSA+IHN0cmVhbS0+YnVmZmVyU2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChQVl9TVUNDRVNTICE9IEJpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoc3RyZWFtLCBXT1JEX1NJWkUpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0tPmJ5dGVDb3VudCArPSBXT1JEX1NJWkU7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0ciA9IHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICsgc3RyZWFtLT5ieXRlQ291bnQ7CisgICAgd29yZCA9IHN0cmVhbS0+d29yZDsKKyAgICBzdHJlYW0tPndvcmQgPSAwOyAvKiBpbXBvcnRhbnQgdG8gcmVzZXQgdG8gemVybyAqLworCisgICAgLyogTk9URTogYnl0ZUNvdW50IGRvZXMgbm90IGhhdmUgdG8gYmUgbXVsdGlwbGUgb2YgMiBvciA0ICovCisjaWYgKFdPUkRfU0laRSA9PSA0KQorICAgICpwdHIrKyA9IHdvcmQgPj4gMjQ7CisgICAgKnB0cisrID0gMHhGRiAmICh3b3JkID4+IDE2KTsKKyNlbmRpZgorCisgICAgKnB0cisrID0gMHhGRiAmICh3b3JkID4+IDgpOworICAgICpwdHIgPSAweEZGICYgd29yZDsKKworI2lmIChXT1JEX1NJWkUgPT0gNCkKKyAgICBzdHJlYW0tPmJ5dGVDb3VudCArPSA0OworICAgIHN0cmVhbS0+Yml0TGVmdCA9IDMyOworI2Vsc2UKKyAgICBzdHJlYW0tPmJ5dGVDb3VudCArPSAyOworICAgIHN0cmVhbS0+Yml0TGVmdCA9IDE2OworI2VuZGlmCisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbVNhdmVQYXJ0aWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMDMvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBzYXZlIHVuZmluaXNoZWQgd3JpdHRlbiB3b3JkIGludG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBzdHJlYW0gICAgICB0aGUgYml0c3RyZWFtIHdoZXJlIHRoZSBiaXRzIGFyZSBwdXQgaW4gICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBCaXRzdHJlYW1TYXZlUGFydGlhbChCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBJbnQgKmZyYWN0aW9uKQoreworICAgIFVDaGFyICpwdHI7CisgICAgVUludCB3b3JkLCBzaGlmdDsKKyAgICBJbnQgbnVtYnl0ZSwgYml0bGVmdCwgYml0dXNlZDsKKworICAgIGJpdGxlZnQgPSBzdHJlYW0tPmJpdExlZnQ7CisgICAgYml0dXNlZCA9IChXT1JEX1NJWkUgPDwgMykgLSBiaXRsZWZ0OyAvKiBudW1iZXIgb2YgYml0cyB1c2VkICovCisgICAgbnVtYnl0ZSA9IGJpdHVzZWQgPj4gMzsgLyogbnVtYmVyIG9mIGJ5dGUgZnVsbHkgdXNlZCAqLworCisgICAgaWYgKHN0cmVhbS0+Ynl0ZUNvdW50ICsgbnVtYnl0ZSA+IHN0cmVhbS0+YnVmZmVyU2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChQVl9TVUNDRVNTICE9IEJpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoc3RyZWFtLCBudW1ieXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLT5ieXRlQ291bnQgKz0gbnVtYnl0ZTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgcHRyID0gc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgKyBzdHJlYW0tPmJ5dGVDb3VudDsKKyAgICB3b3JkID0gc3RyZWFtLT53b3JkOworICAgIHdvcmQgPDw9IGJpdGxlZnQ7ICAgLyogd29yZCBpcyBub3QgYWxsIGNvbnN1bWVkICovCisgICAgYml0bGVmdCA9IGJpdHVzZWQgLSAobnVtYnl0ZSA8PCAzKTsgLyogbnVtYmVyIG9mIGJpdHMgdXNlZCAoZnJhY3Rpb24pICovCisgICAgc3RyZWFtLT5ieXRlQ291bnQgKz0gbnVtYnl0ZTsKKyAgICBpZiAoYml0bGVmdCkKKyAgICB7CisgICAgICAgICpmcmFjdGlvbiA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpmcmFjdGlvbiA9IDA7CisgICAgfQorICAgIGJpdGxlZnQgPSAoV09SRF9TSVpFIDw8IDMpIC0gYml0bGVmdDsKKyAgICAvKiBzYXZlIG5ldyB2YWx1ZSAqLworICAgIHN0cmVhbS0+Yml0TGVmdCA9IGJpdGxlZnQ7CisKKyAgICBzaGlmdCA9ICgoV09SRF9TSVpFIC0gMSkgPDwgMyk7CisgICAgd2hpbGUgKG51bWJ5dGUpCisgICAgeworICAgICAgICAqcHRyKysgPSAoVUNoYXIpKCh3b3JkID4+IHNoaWZ0KSAmIDB4RkYpOworICAgICAgICB3b3JkIDw8PSA4OworICAgICAgICBudW1ieXRlLS07CisgICAgfQorCisgICAgaWYgKCpmcmFjdGlvbikKKyAgICB7Ly8gdGhpcyBjb3VsZCBsZWFkIHRvIGJ1ZmZlciBvdmVycnVuIHdoZW4gcHRyIGlzIGFscmVhZHkgb3V0IG9mIGJvdW5kLgorICAgICAgICAvLyAgKnB0ciA9IChVQ2hhcikoKHdvcmQ+PnNoaWZ0KSYweEZGKTsgLyogbmVlZCB0byBkbyBpdCBmb3IgdGhlIGxhc3QgZnJhY3Rpb25hbCBieXRlICovCisgICAgfQorCisgICAgLyogc2F2ZSBuZXcgdmFsdWVzICovCisgICAgc3RyZWFtLT53b3JkID0gd29yZCA+PiBiaXRsZWZ0OworCisgICAgLyogbm90ZSB3ZSBkb24ndCB1cGRhdGUgYnl0ZUNvdW50LCBiaXRMZWZ0IGFuZCB3b3JkICovCisgICAgLyogc28gdGhhdCBlbmNvZGVyIGNhbiBjb250aW51ZSBQdXRCaXRzIGlmIHRoZXkgZG9uJ3QgKi8KKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtU2hvcnRIZWFkZXJCeXRlQWxpZ25TdHVmZmluZyggICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSkgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogYml0IHN0dWZmaW5nIGZvciBuZXh0IHN0YXJ0IGNvZGUgaW4gc2hvcnQgdmlkZW8gaGVhZGVyICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICBudW1iZXIgb2YgYml0cyB0byBiZSBzdHVmZmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworSW50IEJpdHN0cmVhbVNob3J0SGVhZGVyQnl0ZUFsaWduU3R1ZmZpbmcoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSkKK3sKKyAgICBVSW50IHJlc3RCaXRzOworICAgIEludCBmcmFjdGlvbjsKKworICAgIHJlc3RCaXRzID0gKHN0cmVhbS0+Yml0TGVmdCAmIDB4Nyk7IC8qIG1vZHVsbyA4ICovCisKKyAgICBpZiAocmVzdEJpdHMpICAvKnNob3J0X3ZpZGVvX2hlYWRlclswXSBpcyAxIGluIGgyNjMgYmFzZWxpbmUqLworICAgIHsKKyAgICAgICAgLyogSC4yNjMgc3R5bGUgc3R1ZmZpbmcgKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIHJlc3RCaXRzLCAwKTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtLT5iaXRMZWZ0ICE9IChXT1JEX1NJWkUgPDwgMykpCisgICAgeworICAgICAgICBCaXRzdHJlYW1TYXZlUGFydGlhbChzdHJlYW0sICZmcmFjdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3RCaXRzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSkgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBiaXQgc3R1ZmZpbmcgZm9yIG5leHQgc3RhcnQgY29kZSBpbiBNUEVHLTQgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgbnVtYmVyIG9mIGJpdHMgdG8gYmUgc3R1ZmZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitJbnQgQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKQoreworCisgICAgVUludCByZXN0Qml0czsKKyAgICBJbnQgZnJhY3Rpb247CisgICAgLyogUXVlc3Rpb246IGluIE1QRUctNCAsIHNob3J0X3ZpZGVvX2hlYWRlclswXT09MCA9PiBldmVuIGFscmVhZHkgYnl0ZSBhbGlnbmVkLCB3aWxsIHN0aWxsIHN0dWZmIDggYml0cworICAgICAgIG5lZWQgdG8gY2hlY2sgd2l0aCAgKi8KKyAgICAvKmlmICghKGdldFBvaW50ZXJFTkMoaW5kZXgxLCBpbmRleDIpJTgpICYmIHNob3J0X3ZpZGVvX2hlYWRlclswXSkgcmV0dXJuIDA7Ki8KKworICAgIC8qIG5lZWQgc3R1ZmZpbmcgYml0cywgKi8KKyAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgMSwgMCk7CisKKyAgICByZXN0Qml0cyA9IChzdHJlYW0tPmJpdExlZnQgJiAweDcpOyAvKiBtb2R1bG8gOCAqLworCisgICAgaWYgKHJlc3RCaXRzKSAgLypzaG9ydF92aWRlb19oZWFkZXJbMF0gaXMgMSBpbiBoMjYzIGJhc2VsaW5lKi8KKyAgICB7CisgICAgICAgIC8qIG5lZWQgc3R1ZmZpbmcgYml0cywgKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIHJlc3RCaXRzLCBNYXNrW3Jlc3RCaXRzXSk7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+Yml0TGVmdCAhPSAoV09SRF9TSVpFIDw8IDMpKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtU2F2ZVBhcnRpYWwoc3RyZWFtLCAmZnJhY3Rpb24pOworICAgIH0KKworICAgIHJldHVybiAocmVzdEJpdHMpOworfQorCisvKmRvZXMgYml0IHN0dWZmaW5nIGZvciBuZXh0IHJlc3luYyBtYXJrZXIqLworLyogIGRvZXMgYml0IHN0dWZmaW5nIGZvciBuZXh0IHJlc3luYyBtYXJrZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDExMSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTExMSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMTExMSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDExMTExMSIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTExMTExMSIgICAoOC1iaXQgY29kZXdvcmQpCisgKi8KKworLypJbnQgQml0c3RyZWFtTmV4dFJlc3luY01hcmtlckVuYyhCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKQoreworICBJbnQgY291bnQ7CisgIEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwwKTsKKyAgY291bnQ9OC1zdHJlYW0tPnRvdGFsQml0cyAmIDg7CisgIEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLGNvdW50LE1hc2tbY291bnRdKTsKKyAgcmV0dXJuIGNvdW50OworfSovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtQXBwZW5kRW5jKCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIgICApICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogQXBwZW5kIHRoZSBpbnRlcm1lZGlhdGUgYml0c3RyZWFtIChiaXRzdHJlYW0yKSB0byB0aGUgZW5kIG9mICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBiaXRzdHJlYW0oYml0c3RyZWFtMSkgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisKK1BWX1NUQVRVUyBCaXRzdHJlYW1BcHBlbmRFbmMoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXM7CisgICAgVUNoYXIgKnB0ckJTMiwgKnB0ckJTMTsKKyAgICBVQ2hhciBieXRlQlMyLCBieXRlQlMxOworICAgIEludCAgbnVtYnl0ZTI7CisgICAgSW50IGJpdHVzZWQsIGJpdGxlZnQsIG9mZnNldCwgZnJhY3Rpb247CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1TYXZlUGFydGlhbChiaXRzdHJlYW0xLCAmZnJhY3Rpb24pOworICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgb2Zmc2V0ID0gZnJhY3Rpb247CisgICAgc3RhdHVzID0gQml0c3RyZWFtU2F2ZVBhcnRpYWwoYml0c3RyZWFtMiwgJmZyYWN0aW9uKTsKKyAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmICghb2Zmc2V0KSAvKiBiaXRzdHJlYW0xIGlzIGJ5dGUtYWxpZ25lZCAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEJpdHN0cmVhbUFwcGVuZFBhY2tldChiaXRzdHJlYW0xLCBiaXRzdHJlYW0yKTsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gZnJhY3Rpb247CisKKyAgICAvKiBzaW5jZSBiaXRzdHJlYW0xIGRvZXNuJ3QgaGF2ZSB0byBiZSBieXRlLWFsaWduZWQsIHdlIGhhdmUgdG8gcHJvY2VzcyBieXRlIGJ5IGJ5dGUgKi8KKyAgICAvKiB3ZSByZWFkIG9uZSBieXRlIGZyb20gYml0c3RyZWFtMiBhbmQgdXNlIEJpdHN0cmVhbVB1dEJpdHMgdG8gZG8gdGhlIGpvYiAqLworICAgIGlmIChiaXRzdHJlYW0xLT5ieXRlQ291bnQgKyBiaXRzdHJlYW0yLT5ieXRlQ291bnQgKyBvZmZzZXQgPiBiaXRzdHJlYW0xLT5idWZmZXJTaXplKQorICAgIHsKKyAgICAgICAgaWYgKFBWX1NVQ0NFU1MgIT0gQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihiaXRzdHJlYW0xLCBiaXRzdHJlYW0yLT5ieXRlQ291bnQgKyBvZmZzZXQpKQorICAgICAgICB7CisgICAgICAgICAgICBiaXRzdHJlYW0xLT5ieXRlQ291bnQgKz0gKGJpdHN0cmVhbTItPmJ5dGVDb3VudCArIG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0ckJTMSA9IGJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciArIGJpdHN0cmVhbTEtPmJ5dGVDb3VudDsgLyogbW92ZSBwdHIgYnMxKi8KKyAgICBwdHJCUzIgPSBiaXRzdHJlYW0yLT5iaXRzdHJlYW1CdWZmZXI7CisKKyAgICBiaXR1c2VkID0gKFdPUkRfU0laRSA8PCAzKSAtIGJpdHN0cmVhbTEtPmJpdExlZnQ7IC8qIHRoaXMgbXVzdCBiZSBiZXR3ZWVuIDEtNyAqLworICAgIGJpdGxlZnQgPSA4IC0gYml0dXNlZDsKKworICAgIG51bWJ5dGUyID0gYml0c3RyZWFtMi0+Ynl0ZUNvdW50OyAgIC8qIG51bWJlciBvZiBieXRlIHRvIGNvcHkgZnJvbSBiczIgKi8KKyAgICBiaXRzdHJlYW0xLT5ieXRlQ291bnQgKz0gbnVtYnl0ZTI7ICAvKiBuZXcgYnl0ZUNvdW50ICovCisKKyAgICBieXRlQlMxID0gKChVQ2hhcikgYml0c3RyZWFtMS0+d29yZCkgPDwgYml0bGVmdDsgICAgLyogZnJhY3Rpb24gYnl0ZSBmcm9tIGJzMSAqLworCisgICAgd2hpbGUgKG51bWJ5dGUyKQorICAgIHsKKyAgICAgICAgYnl0ZUJTMiA9ICpwdHJCUzIrKzsKKyAgICAgICAgYnl0ZUJTMSB8PSAoYnl0ZUJTMiA+PiBiaXR1c2VkKTsKKyAgICAgICAgKnB0ckJTMSsrID0gYnl0ZUJTMTsKKyAgICAgICAgYnl0ZUJTMSA9IGJ5dGVCUzIgPDwgYml0bGVmdDsKKyAgICAgICAgbnVtYnl0ZTItLTsKKyAgICB9CisKKyAgICBiaXRzdHJlYW0xLT53b3JkID0gYnl0ZUJTMSA+PiBiaXRsZWZ0OyAgLyogYml0c3RyZWFtLT5iaXRMZWZ0IHJlbWFpbnMgdGhlIHNhbWUgKi8KKworICAgIC8qIG5vdyBzYXZlIGJzMi0+d29yZCBpbiBiczEgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbTEsIChXT1JEX1NJWkUgPDwgMykgLSBiaXRzdHJlYW0yLT5iaXRMZWZ0LCBiaXRzdHJlYW0yLT53b3JkKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtQXBwZW5kUGFja2V0KCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIgICApICAgKi8KKy8qICBEYXRlICAgICA6IDA1LzMxLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogQXBwZW5kIHRoZSBpbnRlcm1lZGlhdGUgYml0c3RyZWFtIChiaXRzdHJlYW0yKSB0byB0aGUgZW5kIG9mICovCisvKiAgICAgICAgICAgICAgb3V0cHV0IGJpdHN0cmVhbShiaXRzdHJlYW0xKSBrbm93aW5nIHRoYXQgYml0c3RyZWFtMSBpcyBieXRlLWFsaWduZWQqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgQml0c3RyZWFtQXBwZW5kUGFja2V0KEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMikKK3sKKyAgICBVQ2hhciAqcHRyQlMyLCAqcHRyQlMxOworICAgIEludCAgbnVtYnl0ZTI7CisKKyAgICBpZiAoYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICsgYml0c3RyZWFtMi0+Ynl0ZUNvdW50ICA+IGJpdHN0cmVhbTEtPmJ1ZmZlclNpemUpCisgICAgeworICAgICAgICBpZiAoUFZfU1VDQ0VTUyAhPSBCaXRzdHJlYW1Vc2VPdmVycnVuQnVmZmVyKGJpdHN0cmVhbTEsIGJpdHN0cmVhbTItPmJ5dGVDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArPSBiaXRzdHJlYW0yLT5ieXRlQ291bnQ7IC8qIGxlZ2FjeSwgdG8ga2VlcCB0cmFjayBvZiB0b3RhbCBieXRlcyAqLworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdHJCUzEgPSBiaXRzdHJlYW0xLT5iaXRzdHJlYW1CdWZmZXIgKyBiaXRzdHJlYW0xLT5ieXRlQ291bnQ7IC8qIG1vdmUgcHRyIGJzMSovCisgICAgcHRyQlMyID0gYml0c3RyZWFtMi0+Yml0c3RyZWFtQnVmZmVyOworCisgICAgbnVtYnl0ZTIgPSBiaXRzdHJlYW0yLT5ieXRlQ291bnQ7CisgICAgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICs9IG51bWJ5dGUyOyAvKiBuZXcgYnl0ZUNvdW50ICovCisKKyAgICAvKmNvcHkgYWxsIHRoZSBieXRlcyBpbiBiaXRzdHJlYW0yKi8KKyAgICBNNFZFTkNfTUVNQ1BZKHB0ckJTMSwgcHRyQlMyLCBzaXplb2YoVUNoYXIpKm51bWJ5dGUyKTsKKworICAgIGJpdHN0cmVhbTEtPndvcmQgPSBiaXRzdHJlYW0yLT53b3JkOyAgLyogYml0c3RyZWFtMS0+Yml0TGVmdCBpcyB0aGUgc2FtZSAqLworICAgIGJpdHN0cmVhbTEtPmJpdExlZnQgPSBiaXRzdHJlYW0yLT5iaXRMZWZ0OworCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIgICApICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzIzLzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogQXBwZW5kIHRoZSBpbnRlcm1lZGlhdGUgYml0c3RyZWFtIChiaXRzdHJlYW0yKSB0byB0aGUgZW5kIG9mICovCisvKiAgICAgICAgICAgICAgb3V0cHV0IGJpdHN0cmVhbShiaXRzdHJlYW0xKSAsIGZvciBzbGljZS1iYXNlZCBjb2Rpbmcgb25seSAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFVDaGFyICpwdHJCUzIsICpwdHJCUzE7CisgICAgSW50ICBudW1ieXRlMjsKKyAgICBJbnQgIGJ5dGVsZWZ0OworCisgICAgbnVtYnl0ZTIgPSBiaXRzdHJlYW0yLT5ieXRlQ291bnQ7CisKKyAgICBpZiAoYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICsgYml0c3RyZWFtMi0+Ynl0ZUNvdW50ID4gYml0c3RyZWFtMS0+YnVmZmVyU2l6ZSkKKyAgICB7CisgICAgICAgIG51bWJ5dGUyID0gIGJpdHN0cmVhbTEtPmJ1ZmZlclNpemUgLSBiaXRzdHJlYW0xLT5ieXRlQ291bnQ7CisgICAgICAgIHN0YXR1cyA9ICBQVl9FTkRfT0ZfQlVGOyAgICAvKiBzaWduYWwgZW5kIG9mIGJ1ZmZlciAqLworICAgIH0KKworICAgIHB0ckJTMSA9IGJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlcjsgLyogbW92ZSBwdHIgYnMxKi8KKyAgICBwdHJCUzIgPSBiaXRzdHJlYW0yLT5iaXRzdHJlYW1CdWZmZXI7CisKKyAgICBiaXRzdHJlYW0xLT5ieXRlQ291bnQgKz0gbnVtYnl0ZTI7IC8qIHNob3VsZCBiZSBlcXVhbCB0byBidWZmZXJTaXplICovCisKKyAgICAvKmNvcHkgYWxsIHRoZSBieXRlcyBpbiBiaXRzdHJlYW0yKi8KKyAgICBNNFZFTkNfTUVNQ1BZKHB0ckJTMSwgcHRyQlMyLCBzaXplb2YoVUNoYXIpKm51bWJ5dGUyKTsKKyAgICBiaXRzdHJlYW0xLT53b3JkID0gMDsKKyAgICBiaXRzdHJlYW0xLT5iaXRMZWZ0ID0gKFdPUkRfU0laRSA8PCAzKTsKKworICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX0JVRikgLyogcmUtcG9zaXRpb24gYml0c3RyZWFtMiAqLworICAgIHsKKyAgICAgICAgYnl0ZWxlZnQgPSBiaXRzdHJlYW0yLT5ieXRlQ291bnQgLSBudW1ieXRlMjsKKworICAgICAgICBNNFZFTkNfTUVNQ1BZKHB0ckJTMiwgcHRyQlMyICsgbnVtYnl0ZTIsIHNpemVvZihVQ2hhcikqYnl0ZWxlZnQpOworCisgICAgICAgIGJpdHN0cmVhbTItPmJ5dGVDb3VudCA9IGJ5dGVsZWZ0OworICAgICAgICAvKiBiaXRzdHJlYW0yLT53b3JkIGFuZCBiaXRzdHJlYW0tPmJpdExlZnQgYXJlIHVuY2hhbmdlZC4KKyAgICAgICAgICAgdGhleSBzaG91bGQgYmUgMCBhbmQgKFdPUkRfU0laRTw8MykgKi8KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjaWZuZGVmIE5PX1NMSUNFX0VOQ09ERQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1SZXBvcyggQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSwgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgYnl0ZUNvdW50LCBJbnQgYml0Q291bnQpICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMjgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBSZXBvc2l0aW9uIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgY29udGVudCAoY3VydGFpbCkgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTICAgQml0c3RyZWFtUmVwb3MoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSwgSW50IGJ5dGVDb3VudCwgSW50IGJpdENvdW50KQoreworICAgIFVDaGFyICpwdHIsIGJ5dGU7CisgICAgVUludCB3b3JkOworICAgIEludCBmcmFjdGlvbjsKKworICAgIEJpdHN0cmVhbVNhdmVQYXJ0aWFsKGJpdHN0cmVhbSwgJmZyYWN0aW9uKTsKKworICAgIGJpdHN0cmVhbS0+Ynl0ZUNvdW50ID0gYnl0ZUNvdW50OworICAgIHB0ciA9IGJpdHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICsgYnl0ZUNvdW50OyAvKiBnZXQgZnJhY3Rpb24gb2YgdGhlIGJ5dGUgKi8KKyAgICBpZiAoYml0Q291bnQpCisgICAgeworICAgICAgICBiaXRzdHJlYW0tPmJpdExlZnQgPSAoV09SRF9TSVpFIDw8IDMpIC0gYml0Q291bnQ7IC8qIGJpdENvdW50IHNob3VsZCBiZSAwLTMxICovCisgICAgICAgIHdvcmQgPSAqcHRyKys7CisgICAgICAgIGJ5dGUgPSAqcHRyKys7CisgICAgICAgIHdvcmQgPSBieXRlIHwgKHdvcmQgPDwgOCk7CisjaWYgKFdPUkRfU0laRSA9PSA0KQorICAgICAgICBieXRlID0gKnB0cisrOworICAgICAgICB3b3JkID0gYnl0ZSB8ICh3b3JkIDw8IDgpOworICAgICAgICBieXRlID0gKnB0cisrOworICAgICAgICB3b3JkID0gYnl0ZSB8ICh3b3JkIDw8IDgpOworI2VuZGlmCisgICAgICAgIGJpdHN0cmVhbS0+d29yZCA9IHdvcmQgPj4gKGJpdHN0cmVhbS0+Yml0TGVmdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJpdHN0cmVhbS0+d29yZCA9IDA7CisgICAgICAgIGJpdHN0cmVhbS0+Yml0TGVmdCA9IChXT1JEX1NJWkUgPDwgMyk7CisgICAgfQorCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtRmx1c2hCaXRzKEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBudW1fYml0X2xlZnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzI0LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRmx1c2ggYnVmZmVyIGV4Y2VwdCB0aGUgbGFzdCBudW1fYml0X2xlZnQgYml0cy4gICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitQVl9TVEFUVVMgQml0c3RyZWFtRmx1c2hCaXRzKEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCBJbnQgbnVtX2JpdF9sZWZ0KQoreworICAgIEludCBpOworICAgIFVDaGFyICpwdHJEc3QsICpwdHJTcmM7CisgICAgSW50IGxlZnRvdmVyLCBiaXR1c2VkOworICAgIEludCBuZXdfYnl0ZSA9IChudW1fYml0X2xlZnQgPj4gMyk7CisgICAgSW50IG5ld19iaXQgPSBudW1fYml0X2xlZnQgLSAobmV3X2J5dGUgPDwgMyk7IC8qIGJldHdlZW4gMC03ICovCisKKyAgICBwdHJTcmMgPSBiaXRzdHJlYW0xLT5iaXRzdHJlYW1CdWZmZXIgKyBiaXRzdHJlYW0xLT5ieXRlQ291bnQ7CisgICAgcHRyRHN0ID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyOworCisgICAgYml0dXNlZCA9IChXT1JEX1NJWkUgPDwgMykgLSBiaXRzdHJlYW0xLT5iaXRMZWZ0OworCisgICAgbGVmdG92ZXIgPSA4IC0gYml0dXNlZDsgLyogYml0dXNlZCBzaG91bGQgYmUgYmV0d2VlbiAwLTcgKi8KKworICAgIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCA9IG5ld19ieXRlOworICAgIGJpdHN0cmVhbTEtPmJpdExlZnQgPSAoV09SRF9TSVpFIDw8IDMpIC0gbmV3X2JpdDsKKworICAgIGlmICghYml0dXNlZCkgLyogYnl0ZSBhbGlnbmVkICovCisgICAgeworICAgICAgICBNNFZFTkNfTUVNQ1BZKHB0ckRzdCwgcHRyU3JjLCBuZXdfYnl0ZSArIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKmNvcHkgYWxsIHRoZSBieXRlcyBpbiBiaXRzdHJlYW0yKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ld19ieXRlOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpwdHJEc3QrKyA9IChwdHJTcmNbMF0gPDwgYml0dXNlZCkgfCAocHRyU3JjWzFdID4+IGxlZnRvdmVyKTsKKyAgICAgICAgICAgIHB0clNyYysrOworICAgICAgICB9CisgICAgICAgIC8qIGNvcHkgZm9yIHRoZSBsYXN0IGJ5dGUgb2YgcHRyU3JjLCBjb3B5IGV4dHJhIGJpdHMgZG9lc24ndCBodXJ0ICovCisgICAgICAgIGlmIChuZXdfYml0KQorICAgICAgICB7CisgICAgICAgICAgICAqcHRyRHN0KysgPSAocHRyU3JjWzBdIDw8IGJpdHVzZWQpIHwgKHB0clNyY1sxXSA+PiBsZWZ0b3Zlcik7CisgICAgICAgICAgICBwdHJTcmMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3X2JpdCkKKyAgICB7CisgICAgICAgIHB0clNyYyA9IGJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciArIG5ld19ieXRlOworICAgICAgICBiaXRzdHJlYW0xLT53b3JkID0gKCpwdHJTcmMpID4+ICg4IC0gbmV3X2JpdCk7CisgICAgfQorCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogQml0c3RyZWFtUHJlcGVuZFBhY2tldCggQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTIgICApICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzI2LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogUHJlcGVuZCB0aGUgaW50ZXJtZWRpYXRlIGJpdHN0cmVhbSAoYml0c3RyZWFtMikgdG8gdGhlIGJlZ2lubmluZyBvZiAqLworLyogICAgICAgICAgICAgIG91dHB1dCBiaXRzdHJlYW0oYml0c3RyZWFtMSkgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEJpdHN0cmVhbVByZXBlbmRQYWNrZXQoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKQoreworICAgIFVDaGFyICpwU3JjLCAqcERzdCwgYnl0ZTsKKyAgICBJbnQgICAgIG1vdmVieXRlLCBiaXR1c2VkLCBsZWZ0b3ZlciwgaSwgZnJhY3Rpb247CisKKyAgICBCaXRzdHJlYW1TYXZlUGFydGlhbChiaXRzdHJlYW0yLCAmZnJhY3Rpb24pOyAvKiBtYWtlIHN1cmUgb25seSBmcmFjdGlvbiBvZiBieXRlIGxlZnQgKi8KKyAgICBCaXRzdHJlYW1TYXZlUGFydGlhbChiaXRzdHJlYW0xLCAmZnJhY3Rpb24pOworCisgICAgaWYgKGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArIGJpdHN0cmVhbTItPmJ5dGVDb3VudCA+PSBiaXRzdHJlYW0xLT5idWZmZXJTaXplKQorICAgIHsKKyAgICAgICAgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICs9IGJpdHN0cmVhbTItPmJ5dGVDb3VudDsKKyAgICAgICAgcmV0dXJuIFBWX0VORF9PRl9CVUY7CisgICAgfQorCisgICAgbW92ZWJ5dGUgPSBiaXRzdHJlYW0xLT5ieXRlQ291bnQ7CisgICAgaWYgKG1vdmVieXRlIDwgYml0c3RyZWFtMi0+Ynl0ZUNvdW50KQorICAgICAgICBtb3ZlYnl0ZSA9IGJpdHN0cmVhbTItPmJ5dGVDb3VudDsKKyAgICBtb3ZlYnl0ZSsrOworCisgICAgLyogc2hpZnQgYml0c3RyZWFtMSB0byB0aGUgcmlnaHQgYnkgbW92ZWJ5dGUgKi8KKyAgICBwU3JjID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyOworICAgIHBEc3QgPSBwU3JjICsgbW92ZWJ5dGU7CisKKyAgICBNNFZFTkNfTUVNQ1BZKHBEc3QsIHBTcmMsIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArIDEpOworCisgICAgLyogY29weSBiaXRzdHJlYW0yIHRvIHRoZSBiZWdpbm5pbmcgb2YgYml0c3RyZWFtMSAqLworICAgIE00VkVOQ19NRU1DUFkocFNyYywgYml0c3RyZWFtMi0+Yml0c3RyZWFtQnVmZmVyLCBiaXRzdHJlYW0yLT5ieXRlQ291bnQgKyAxKTsKKworICAgIC8qIG5vdyBzaGlmdCBiYWNrIHByZXZpb3VzIGJpdHN0cmVhbTEgYnVmZmVyIHRvIHRoZSBlbmQgKi8KKyAgICBwU3JjID0gcERzdDsKKyAgICBwRHN0ID0gYml0c3RyZWFtMS0+Yml0c3RyZWFtQnVmZmVyICsgYml0c3RyZWFtMi0+Ynl0ZUNvdW50OworCisgICAgYml0dXNlZCA9IChXT1JEX1NJWkUgPDwgMykgLSBiaXRzdHJlYW0yLT5iaXRMZWZ0OworICAgIGxlZnRvdmVyID0gOCAtIGJpdHVzZWQ7ICAgICAvKiBiaXR1c2VkIHNob3VsZCBiZSAwLTcgKi8KKworICAgIGJ5dGUgPSAoYml0c3RyZWFtMi0+d29yZCkgPDwgbGVmdG92ZXI7CisKKyAgICAqcERzdCsrID0gYnl0ZSB8IChwU3JjWzBdID4+IGJpdHVzZWQpOworCisgICAgZm9yIChpID0gMDsgaSA8IGJpdHN0cmVhbTEtPmJ5dGVDb3VudCArIDE7IGkrKykKKyAgICB7CisgICAgICAgICpwRHN0KysgPSAoKHBTcmNbMF0gPDwgbGVmdG92ZXIpIHwgKHBTcmNbMV0gPj4gYml0dXNlZCkpOworICAgICAgICBwU3JjKys7CisgICAgfQorCisgICAgYml0c3RyZWFtMS0+Ynl0ZUNvdW50ICs9IGJpdHN0cmVhbTItPmJ5dGVDb3VudDsKKyAgICAvL2JpdHN0cmVhbTEtPmJpdENvdW50ICs9IGJpdHN0cmVhbTItPmJpdENvdW50OworICAgIGJpdHVzZWQgPSAoV09SRF9TSVpFIDw8IDQpIC0gKGJpdHN0cmVhbTEtPmJpdExlZnQgKyBiaXRzdHJlYW0yLT5iaXRMZWZ0KTsKKworICAgIGlmIChiaXR1c2VkID49IDgpCisgICAgeworICAgICAgICBiaXR1c2VkIC09IDg7CisgICAgICAgIGJpdHN0cmVhbTEtPmJ5dGVDb3VudCsrOworICAgIH0KKworICAgIGJpdHN0cmVhbTEtPmJpdExlZnQgPSAoV09SRF9TSVpFIDw8IDMpIC0gYml0dXNlZDsKKworICAgIGJpdHN0cmVhbTItPmJ5dGVDb3VudCA9IGJpdHN0cmVhbTItPndvcmQgPSAwOworICAgIGJpdHN0cmVhbTItPmJpdExlZnQgPSAoV09SRF9TSVpFIDw8IDMpOworCisgICAgcFNyYyA9IGJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciArIGJpdHN0cmVhbTEtPmJ5dGVDb3VudDsKKyAgICBsZWZ0b3ZlciA9IDggLSBiaXR1c2VkOworICAgIC8vKnBTcmMgPSAocFNyY1swXT4+bGVmdG92ZXIpPDxsZWZ0b3ZlcjsgLyogbWFrZSBzdXJlIHRoZSByZXN0IG9mIGJpdHMgYXJlIHplcm9zICovCisKKyAgICBiaXRzdHJlYW0xLT53b3JkID0gKFVJbnQpKChwU3JjWzBdKSA+PiBsZWZ0b3Zlcik7CisKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKyNlbmRpZiAgLyogTk9fU0xJQ0VfRU5DT0RFICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1HZXRQb3MoIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzA1LzIwMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IHRoZSBiaXQgcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0ludCBCaXRzdHJlYW1HZXRQb3MoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSkKK3sKKworICAgIHJldHVybiBzdHJlYW0tPmJ5dGVDb3VudCo4ICsgKFdPUkRfU0laRSA8PCAzKSAtIHN0cmVhbS0+Yml0TGVmdDsKK30KKwordm9pZCBCaXRzdHJlYW1FbmNSZXNldChCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKQoreworICAgIHN0cmVhbS0+Yml0TGVmdCA9IChXT1JEX1NJWkUgPDwgMyk7CisgICAgc3RyZWFtLT53b3JkID0gMDsKKyAgICBzdHJlYW0tPmJ5dGVDb3VudCA9IDA7CisgICAgcmV0dXJuIDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzZXQgdGhlIG92ZXJydW4gYnVmZmVyLCBhbmQgVmlkZW9FbmNEYXRhIGNvbnRleHQgZm9yIGNhbGxiYWNrIHRvIHJlYWxsb2NhdGUKK292ZXJydW4gYnVmZmVyLiAgKi8KK1ZvaWQgIEJpdHN0cmVhbVNldE92ZXJydW5CdWZmZXIoQml0c3RyZWFtRW5jVmlkZW8qIHN0cmVhbSwgVUNoYXIqIG92ZXJydW5CdWZmZXIsIEludCBvQlNpemUsIFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gb3ZlcnJ1bkJ1ZmZlcjsKKyAgICBzdHJlYW0tPm9CU2l6ZSA9IG9CU2l6ZTsKKyAgICBzdHJlYW0tPnZpZGVvID0gdmlkZW87CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIGRldGVybWluZSB3aGV0aGVyIG92ZXJydW4gYnVmZmVyIGNhbiBiZSB1c2VkIG9yIG5vdCAqLworUFZfU1RBVFVTIEJpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoQml0c3RyZWFtRW5jVmlkZW8qIHN0cmVhbSwgSW50IG51bUV4dHJhQnl0ZXMpCit7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IHN0cmVhbS0+dmlkZW87CisKKyAgICBpZiAoc3RyZWFtLT5vdmVycnVuQnVmZmVyICE9IE5VTEwpIC8vIG92ZXJydW5CdWZmZXIgaXMgc2V0CisgICAgeworICAgICAgICBpZiAoc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgIT0gc3RyZWFtLT5vdmVycnVuQnVmZmVyKSAvLyBub3QgYWxyZWFkeSB1c2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmJ5dGVDb3VudCArIG51bUV4dHJhQnl0ZXMgPj0gc3RyZWFtLT5vQlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgPSBzdHJlYW0tPmJ5dGVDb3VudCArIG51bUV4dHJhQnl0ZXMgKyAxMDA7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgJj0gKH4weDMpOyAvLyBtYWtlIGl0IG11bHRpcGxlIG9mIDQKKworICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIG5ldyBvdmVycnVuIEJ1ZmZlcgorICAgICAgICAgICAgICAgIGlmICh2aWRlby0+b3ZlcnJ1bkJ1ZmZlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5vdmVycnVuQnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlkZW8tPm9CU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICAgICAgICAgIHZpZGVvLT5vdmVycnVuQnVmZmVyID0gKFVDaGFyKikgTTRWRU5DX01BTExPQyhzaXplb2YoVUNoYXIpICogc3RyZWFtLT5vQlNpemUpOworICAgICAgICAgICAgICAgIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9IHZpZGVvLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSBldmVyeXRoaW5nIHRvIG92ZXJydW4gYnVmZmVyIGFuZCBzdGFydCB1c2luZyBpdC4KKyAgICAgICAgICAgIG1lbWNweShzdHJlYW0tPm92ZXJydW5CdWZmZXIsIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyLCBzdHJlYW0tPmJ5dGVDb3VudCk7CisgICAgICAgICAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gb3ZlcnJ1biBidWZmZXIgaXMgYWxyZWFkeSB1c2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmJ5dGVDb3VudCArIG51bUV4dHJhQnl0ZXMgPj0gc3RyZWFtLT5vQlNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgPSBzdHJlYW0tPmJ5dGVDb3VudCArIG51bUV4dHJhQnl0ZXMgKyAxMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFsbG9jYXRlIG5ldyBvdmVycnVuIGJ1ZmZlcgorICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgJj0gKH4weDMpOyAvLyBtYWtlIGl0IG11bHRpcGxlIG9mIDQKKyAgICAgICAgICAgIHZpZGVvLT5vQlNpemUgPSBzdHJlYW0tPm9CU2l6ZTsKKyAgICAgICAgICAgIHZpZGVvLT5vdmVycnVuQnVmZmVyID0gKFVDaGFyKikgTTRWRU5DX01BTExPQyhzaXplb2YoVUNoYXIpICogc3RyZWFtLT5vQlNpemUpOworICAgICAgICAgICAgaWYgKHZpZGVvLT5vdmVycnVuQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0aGUgb2xkIGJ1ZmZlciB0byBuZXcgYnVmZmVyCisgICAgICAgICAgICBtZW1jcHkodmlkZW8tPm92ZXJydW5CdWZmZXIsIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5ieXRlQ291bnQpOworICAgICAgICAgICAgLy8gZnJlZSBvbGQgYnVmZmVyCisgICAgICAgICAgICBNNFZFTkNfRlJFRShzdHJlYW0tPm92ZXJydW5CdWZmZXIpOworICAgICAgICAgICAgLy8gYXNzaWduIHBvaW50ZXIgdG8gbmV3IGJ1ZmZlcgorICAgICAgICAgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gdmlkZW8tPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgIHN0cmVhbS0+YnVmZmVyU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFBWX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UgLy8gb3ZlcnJ1bkJ1ZmZlciBpcyBub3QgZW5hYmxlLgorICAgIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgfQorCit9CisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjZTI1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9CSVRTVFJFQU1fSU9fSF8KKyNkZWZpbmUgX0JJVFNUUkVBTV9JT19IXworCisjZGVmaW5lIEJpdHN0cmVhbVB1dDFCaXRzKHgseSkgIEJpdHN0cmVhbVB1dEJpdHMoeCwxLHkpCisjZGVmaW5lIEJpdHN0cmVhbVB1dEdUOEJpdHMoeCx5LHopIEJpdHN0cmVhbVB1dEJpdHMoeCx5LHopCisKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgQml0c3RyZWFtRW5jVmlkZW8gKkJpdFN0cmVhbUNyZWF0ZUVuYyhJbnQgYnVmZmVyU2l6ZSk7CisgICAgVm9pZCAgQml0c3RyZWFtQ2xvc2VFbmMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbVB1dEJpdHMoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgSW50IExlbmd0aCwgVUludCBWYWx1ZSk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbVB1dEdUMTZCaXRzKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIEludCBMZW5ndGgsIFVMb25nIFZhbHVlKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtU2F2ZVdvcmQoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbVNhdmVQYXJ0aWFsKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIEludCAqZnJhY3Rpb24pOworICAgIEludCBCaXRzdHJlYW1HZXRQb3MoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSk7CisgICAgdm9pZCBCaXRzdHJlYW1FbmNSZXNldChCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtKTsKKworICAgIEludCBCaXRzdHJlYW1TaG9ydEhlYWRlckJ5dGVBbGlnblN0dWZmaW5nKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pOworICAgIEludCBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0pOworICAgIFBWX1NUQVRVUyBCaXRzdHJlYW1BcHBlbmRFbmMoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKTsKKyAgICBQVl9TVEFUVVMgQml0c3RyZWFtQXBwZW5kUGFja2V0KEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMik7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0xLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMik7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbVJlcG9zKEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0sIEludCBieXRlQ291bnQsIEludCBiaXRDb3VudCk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbUZsdXNoQml0cyhCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtMSwgSW50IG51bV9iaXRfbGVmdCk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbVByZXBlbmRQYWNrZXQoQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbTEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0yKTsKKworCisgICAgVm9pZCAgQml0c3RyZWFtU2V0T3ZlcnJ1bkJ1ZmZlcihCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBVQ2hhciAqb3ZlcnJ1bkJ1ZmZlciwgSW50IG9CU2l6ZSwgVmlkZW9FbmNEYXRhICp2aWRlbyk7CisgICAgUFZfU1RBVFVTIEJpdHN0cmVhbVVzZU92ZXJydW5CdWZmZXIoQml0c3RyZWFtRW5jVmlkZW8qIHN0cmVhbSwgSW50IG51bUV4dHJhQnl0ZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfQklUU1RSRUFNX0lPX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvY29tYmluZWRfZW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI1NjgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvY29tYmluZWRfZW5jb2RlLmNwcApAQCAtMCwwICsxLDY5MyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgorI2luY2x1ZGUgInZsY19lbmNvZGUuaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCitQVl9TVEFUVVMgRW5jb2RlR09CSGVhZGVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBHT0JfbnVtYmVyLCBJbnQgcXVhbnRfc2NhbGUsIEludCBiczFzdHJlYW0pOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZUZyYW1lQ29tYmluZWRNb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDkvMDEvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGlzdG9yeSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBhIGZyYW1lIG9mIE1QRUc0IGJpdHN0cmVhbSBpbiBDb21iaW5lZCBtb2RlLiAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsIGVsc2UgUFZfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBFbmNvZGVGcmFtZUNvbWJpbmVkTW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgSW50IHdpZHRoID0gY3VyclZvcC0+d2lkdGg7IC8qIGhhcyB0byBiZSBWb3AsIGZvciBtdWx0aXBsZSBvZiAxNiAqLworICAgIEludCBseCA9IGN1cnJWb3AtPnBpdGNoOyAvKiB3aXRoIHBhZGRpbmcgKi8KKyAgICBJbnQgb2Zmc2V0ID0gMDsKKyAgICBJbnQgaW5kX3gsIGluZF95OworICAgIEludCBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICBVQ2hhciAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIEludCBRUDsKKyAgICBJbnQgbWJudW0gPSAwLCBzbGljZV9jb3VudGVyID0gMCwgY3Vycl9zbGljZV9jb3VudGVyID0gMDsKKyAgICBJbnQgbnVtX2JpdHMsIHBhY2tldF9zaXplID0gZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplOworICAgIEludCBHT0JfSGVhZGVyX0ludGVydmFsID0gZW5jUGFyYW1zLT5HT0JfSGVhZGVyX0ludGVydmFsOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczEgPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBJbnQgbnVtSGVhZGVyQml0czsKKyAgICBhcHByb3hEQ1QgZmFzdERDVGZ1bmN0aW9uOworICAgIEludCBuY29lZmJsY2tbNl0gPSB7NjQsIDY0LCA2NCwgNjQsIDY0LCA2NH07IC8qIGZvciBGYXN0Q29kZU1CLCAgNS8xOC8yMDAxICovCisgICAgUFZfU1RBVFVTKCpDb2RlTUIpKFZpZGVvRW5jRGF0YSAqLCBhcHByb3hEQ1QgKiwgSW50LCBJbnRbXSk7CisgICAgdm9pZCAoKk1CVmxjRW5jb2RlKShWaWRlb0VuY0RhdGEqLCBJbnRbXSwgdm9pZCAqKTsKKyAgICB2b2lkICgqQmxvY2tDb2RlQ29lZmYpKFJ1bkxldmVsQmxvY2sqLCBCaXRzdHJlYW1FbmNWaWRlbyosIEludCwgSW50LCBVQ2hhcik7CisKKyAgICAvKiBmb3IgSDI2MyBHT0IgY2hhbmdlcyAqLworLy9NUDRSYXRlQ29udHJvbFR5cGUgcmNfdHlwZSA9IGVuY1BhcmFtcy0+UkNfVHlwZTsKKworICAgIHZpZGVvLT5RUF9wcmV2ID0gY3VyclZvcC0+cXVhbnRpemVyOworCisgICAgbnVtSGVhZGVyQml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpOworCisgICAgLyogZGV0ZXJtaW5lIHR5cGUgb2YgcXVhbnRpemF0aW9uICAgKi8KKyNpZm5kZWYgTk9fTVBFR19RVUFOVAorICAgIGlmIChjdXJyVm9sLT5xdWFudFR5cGUgPT0gMCkKKyAgICAgICAgQ29kZU1CID0gJkNvZGVNQl9IMjYzOworICAgIGVsc2UKKyAgICAgICAgQ29kZU1CID0gJkNvZGVNQl9NUEVHOworI2Vsc2UKKyAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisjZW5kaWYKKworICAgIC8qIGRldGVybWluZSB3aGljaCBmdW5jdGlvbnMgdG8gYmUgdXNlZCwgaW4gTUItbGV2ZWwgKi8KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgICAgIE1CVmxjRW5jb2RlID0gJk1CVmxjRW5jb2RlQ29tYmluZWRfUF9WT1A7CisgICAgZWxzZSBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIE1CVmxjRW5jb2RlID0gJk1CVmxjRW5jb2RlQ29tYmluZWRfSV9WT1A7CisgICAgZWxzZSAvKiBCX1ZPUCBub3QgaW1wbGVtZW50ZWQgeWV0ICovCisgICAgICAgIHJldHVybiBQVl9GQUlMOworCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIFZMQyB0YWJsZSB0byBiZSB1c2VkICovCisjaWZuZGVmIEgyNjNfT05MWQorICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICBCbG9ja0NvZGVDb2VmZiA9ICZCbG9ja0NvZGVDb2VmZl9TaG9ydEhlYWRlcjsKKyNpZm5kZWYgTk9fUlZMQworICAgIGVsc2UgaWYgKGN1cnJWb2wtPnVzZVJldmVyc2VWTEMpCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1JWTEM7CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX05vcm1hbDsKKyNlbHNlCisgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfU2hvcnRIZWFkZXI7CisjZW5kaWYKKworICAgIC8qIGdvYl9mcmFtZV9pZCBpcyB0aGUgc2FtZSBmb3IgZGlmZmVyZW50IHZvcCB0eXBlcyAtIHRoZSByZWFzb24gc2hvdWxkIGJlIFNDRCAqLworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyICYmIGN1cnJWb3AtPmdvYkZyYW1lSUQgIT0gY3VyclZvcC0+cHJlZGljdGlvblR5cGUpCisgICAgICAgIGN1cnJWb3AtPmdvYkZyYW1lSUQgPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKworCisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisKKyAgICBmb3IgKGluZF95ID0gMDsgaW5kX3kgPCBjdXJyVm9sLT5uTUJQZXJDb2w7IGluZF95KyspICAgIC8qIENvbCBNQiBMb29wICovCisgICAgeworCisgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeSA9IGluZF95OyAvKiAgNS8yOC8wMSAqLworCisgICAgICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAgLyogU2hvcnRWaWRlb0hlYWRlciBNb2RlICovCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKHNsaWNlX2NvdW50ZXIgJiYgR09CX0hlYWRlcl9JbnRlcnZhbCAmJiAoaW5kX3kgJSBHT0JfSGVhZGVyX0ludGVydmFsID09IDApKSAgICAgLyogRW5jb2RlIEdPQiBIZWFkZXIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBRUCA9IFFQTUJbbWJudW1dOyAgICAvKiBHZXQgcXVhbnRfc2NhbGUgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgLT0gQml0c3RyZWFtR2V0UG9zKGN1cnJWb2wtPnN0cmVhbSk7IC8qIEhlYWRlciBCaXRzICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlR09CSGVhZGVyKHZpZGVvLCBzbGljZV9jb3VudGVyLCBRUCwgMCk7ICAvL2luZF95ICAgICAvKiBFbmNvZGUgR09CIEhlYWRlciAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1HZXRQb3MoY3VyclZvbC0+c3RyZWFtKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICBjdXJyX3NsaWNlX2NvdW50ZXIgPSBzbGljZV9jb3VudGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbmRfeCA9IDA7IGluZF94IDwgY3VyclZvbC0+bk1CUGVyUm93OyBpbmRfeCsrKSAgLyogUm93IE1CIExvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl94ID0gaW5kX3g7IC8qICA1LzI4LzAxICovCisgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICAgICAgICAgIFFQID0gUVBNQlttYm51bV07ICAgLyogYWx3YXlzIHJlYWQgbmV3IFFQICovCisKKyAgICAgICAgICAgIGlmIChHT0JfSGVhZGVyX0ludGVydmFsKQorICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IGN1cnJfc2xpY2VfY291bnRlcjsgLyogVXBkYXRlIE1CIHNsaWNlIG51bWJlciAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTUIgUHJlZGljdGlvbjpQdXQgaW50byBNQyBtYWNyb2Jsb2NrLCBzdWJzdHJhY3QgZnJvbSBjdXJyVm9wLCBwdXQgaW4gcHJlZE1CICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGdldE1vdGlvbkNvbXBlbnNhdGVkTUIodmlkZW8sIGluZF94LCBpbmRfeSwgb2Zmc2V0KTsKKworI2lmbmRlZiBIMjYzX09OTFkKKyAgICAgICAgICAgIGlmIChzdGFydF9wYWNrZXRfaGVhZGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlX2NvdW50ZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgc2xpY2UgY291bnRlciAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7ICAvKiBVcGRhdGUgTUIgc2xpY2UgbnVtYmVyKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgLT0gQml0c3RyZWFtR2V0UG9zKGJzMSk7IC8qIEhlYWRlciBCaXRzICovCisgICAgICAgICAgICAgICAgdmlkZW8tPlFQX3ByZXYgPSBjdXJyVm9wLT5xdWFudGl6ZXI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlVmlkZW9QYWNrZXRIZWFkZXIodmlkZW8sIG1ibnVtLCB2aWRlby0+UVBfcHJldiwgMCk7CisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICAgICAgICAgIG51bUhlYWRlckJpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogQ29kZV9NQjogIERDVCwgUSwgUV4oLTEpLCBJRENULCBNb3Rpb24gQ29tcCAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICBzdGF0dXMgPSAoKkNvZGVNQikodmlkZW8sICZmYXN0RENUZnVuY3Rpb24sIChvZmZzZXQgPDwgNSkgKyBRUCwgbmNvZWZibGNrKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIE1CIFZMQyBFbmNvZGU6IFZMQyBFbmNvZGUgTUIgICAgICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAoKk1CVmxjRW5jb2RlKSh2aWRlbywgbmNvZWZibGNrLCAodm9pZCopQmxvY2tDb2RlQ29lZmYpOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIEFzc2VtYmxlIFBhY2tldHM6ICBBc3NlbWJsZSB0aGUgTUIgVkxDIGNvZGVzIGludG8gUGFja2V0cyAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8qIEFzc2VtYmxlX1BhY2tldCh2aWRlbykgKi8KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgICAgICAgICBpZiAoIWN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpIC8qIE5vdCBpbiBTaG9ydFZpZGVvSGVhZGVyIG1vZGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJWb2wtPlJlc3luY01hcmtlckRpc2FibGUpIC8qIFJFU1lOQyBNQVJLRVIgTU9ERSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKSAtIG51bUhlYWRlckJpdHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1fYml0cyA+IHBhY2tldF9zaXplKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOyAvKiBCeXRlIGFsaWduIFBhY2tldCAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOyAvKiBQdXQgUGFja2V0IHRvIEJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGludWUgZXZlbiBpZiBzdGF0dXMgPT0gUFZfRU5EX09GX0JVRiwgdG8gZ2V0IHRoZSBzdGF0cyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgLyogTk8gUkVTWU5DIE1BUktFUiBNT0RFICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRFbmMoY3VyclZvbC0+c3RyZWFtLCBiczEpOyAvKiBJbml0aWFsaXplIHRvIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogY29udGludWUgZXZlbiBpZiBzdGF0dXMgPT0gUFZfRU5EX09GX0JVRiwgdG8gZ2V0IHRoZSBzdGF0cyAqLworCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorI2VuZGlmIC8qIEgyNjNfT05MWSAqLworICAgICAgICAgICAgeyAgIC8qIFNob3J0VmlkZW9IZWFkZXIgTW9kZSAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZEVuYyhjdXJyVm9sLT5zdHJlYW0sIGJzMSk7ICAvKiBJbml0aWFsaXplIHRvIDAgKi8KKyAgICAgICAgICAgICAgICAvKiBjb250aW51ZSBldmVuIGlmIHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGLCB0byBnZXQgdGhlIHN0YXRzICovCisKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWJudW0rKzsKKyAgICAgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgfSAvKiBFbmQgb2YgRm9yIGluZF94ICovCisKKyAgICAgICAgb2Zmc2V0ICs9IChseCA8PCA0KSAtIHdpZHRoOworICAgICAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikgIC8qIFNob3J0VmlkZW9IZWFkZXIgPSAxICovCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKEdPQl9IZWFkZXJfSW50ZXJ2YWwpICBzbGljZV9jb3VudGVyKys7CisgICAgICAgIH0KKworICAgIH0gLyogRW5kIG9mIEZvciBpbmRfeSAqLworCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpIC8qIFNob3J0VmlkZW9IZWFkZXIgPSAxICovCisgICAgeworCisgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1TaG9ydEhlYWRlckJ5dGVBbGlnblN0dWZmaW5nKGN1cnJWb2wtPnN0cmVhbSk7IC8qIEJ5dGUgQWxpZ24gKi8KKyAgICB9CisjaWZuZGVmIEgyNjNfT05MWQorICAgIGVsc2UgICAvKiBDb21iaW5lZCBNb2RlKi8KKyAgICB7CisgICAgICAgIGlmICghY3VyclZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSkgLyogUmVzeW5jIE1hcmtlcnMgKi8KKyAgICAgICAgeworCisgICAgICAgICAgICBpZiAoIXN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoYnMxKTsvKiBCeXRlIEFsaWduICAqLworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsgICAvKiBQdXQgUGFja2V0IHRvIEJ1ZmZlciAqLworICAgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIGV2ZW4gaWYgc3RhdHVzID09IFBWX0VORF9PRl9CVUYsIHRvIGdldCB0aGUgc3RhdHMgKi8KKworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8qIE5vIFJlc3luYyBNYXJrZXJzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGN1cnJWb2wtPnN0cmVhbSk7IC8qIEJ5dGUgQWxpZ24gKi8KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKworICAgIHJldHVybiBzdGF0dXM7IC8qIGlmIHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGLCB0aGlzIGZyYW1lIHdpbGwgYmUgcHJlLXNraXBwZWQgKi8KK30KKworI2lmbmRlZiBOT19TTElDRV9FTkNPREUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlU2xpY2VDb21iaW5lZE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xOS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIGEgc2xpY2Ugb2YgTVBFRzQgYml0c3RyZWFtIGluIENvbWJpbmVkIG1vZGUgYW5kIHNhdmUgICovCisvKiAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgTUIgdG8gY29udGludWUgbmV4dCB0aW1lIGl0IGlzIGNhbGxlZC4gICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogIFBWX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCBlbHNlIFBWX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlU2xpY2VDb21iaW5lZE1vZGUoVmlkZW9FbmNEYXRhICp2aWRlbykKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIFVDaGFyIG1vZGUgPSBNT0RFX0lOVFJBOworICAgIFVDaGFyICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgblRvdGFsTUIgPSBjdXJyVm9sLT5uVG90YWxNQjsKKyAgICBJbnQgd2lkdGggPSBjdXJyVm9wLT53aWR0aDsgLyogaGFzIHRvIGJlIFZvcCwgZm9yIG11bHRpcGxlIG9mIDE2ICovCisgICAgSW50IGx4ID0gY3VyclZvcC0+cGl0Y2g7IC8qICwgd2l0aCBwYWRkaW5nICovCisvLyAgcmF0ZUNvbnRyb2wgKnJjID0gZW5jUGFyYW1zLT5yY1t2aWRlby0+Y3VyckxheWVyXTsKKyAgICBVQ2hhciAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIEludCBRUDsKKyAgICBJbnQgaW5kX3ggPSB2aWRlby0+b3V0cHV0TUItPm1iX3gsIGluZF95ID0gdmlkZW8tPm91dHB1dE1CLT5tYl95OworICAgIEludCBvZmZzZXQgPSB2aWRlby0+b2Zmc2V0OyAgICAgICAgICAgICAgICAgLyogZ2V0IGN1cnJlbnQgTUIgbG9jYXRpb24gKi8KKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW0sIHNsaWNlX2NvdW50ZXIgPSB2aWRlby0+c2xpY2VOb1ttYm51bV07IC8qIGdldCBjdXJyZW50IE1CIGxvY2F0aW9uICovCisgICAgSW50IGZpcnN0TUIgPSBtYm51bTsKKyAgICBJbnQgc3RhcnRfcGFja2V0X2hlYWRlciA9IDA7CisgICAgSW50IG51bV9iaXRzID0gMDsKKyAgICBJbnQgcGFja2V0X3NpemUgPSBlbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemUgLSAxOworICAgIEludCByZXN5bmNfbWFya2VyID0gKCghY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikgJiYgKCFjdXJyVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlKSk7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMSA9IHZpZGVvLT5iaXRzdHJlYW0xOworICAgIEludCBieXRlQ291bnQgPSAwLCBieXRlQ291bnQxID0gMCwgYml0Q291bnQgPSAwOworICAgIEludCBudW1IZWFkZXJCaXRzID0gMDsKKyAgICBhcHByb3hEQ1QgZmFzdERDVGZ1bmN0aW9uOworICAgIEludCBuY29lZmJsY2tbNl0gPSB7NjQsIDY0LCA2NCwgNjQsIDY0LCA2NH07IC8qIGZvciBGYXN0Q29kZU1CLCAgNS8xOC8yMDAxICovCisgICAgVUNoYXIgQ0JQID0gMDsKKyAgICBTaG9ydCBvdXRwdXRNQls2XVs2NF07CisgICAgSW50IGs7CisgICAgUFZfU1RBVFVTKCpDb2RlTUIpKFZpZGVvRW5jRGF0YSAqLCBhcHByb3hEQ1QgKiwgSW50LCBJbnRbXSk7CisgICAgdm9pZCAoKk1CVmxjRW5jb2RlKShWaWRlb0VuY0RhdGEqLCBJbnRbXSwgdm9pZCAqKTsKKyAgICB2b2lkICgqQmxvY2tDb2RlQ29lZmYpKFJ1bkxldmVsQmxvY2sqLCBCaXRzdHJlYW1FbmNWaWRlbyosIEludCwgSW50LCBVQ2hhcik7CisKKyAgICB2aWRlby0+UVBfcHJldiA9IDMxOworCisjZGVmaW5lIEgyNjNfR09CX0NIQU5HRVMKKworCisgICAgaWYgKHZpZGVvLT5lbmRfb2ZfYnVmKSAvKiBsZWZ0LW92ZXIgZnJvbSBwcmV2aW91cyBydW4gKi8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9FTkRfT0ZfQlVGKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisKKyAgICBpZiAobWJudW0gPT0gMCkgLyogb25seSBkbyB0aGlzIGF0IHRoZSBzdGFydCBvZiBhIGZyYW1lICovCisgICAgeworICAgICAgICBRUE1CWzBdID0gdmlkZW8tPlFQX3ByZXYgPSBRUCA9IGN1cnJWb3AtPnF1YW50aXplcjsKKyAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisKKyAgICAgICAgbnVtSGVhZGVyQml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpOworICAgIH0KKworICAgIC8qIFJlLWFzc2lnbiBmYXN0IGZ1bmN0aW9ucyBvbiBldmVyeSBzbGljZSwgZG9uJ3QgaGF2ZSB0byBwdXQgaXQgaW4gdGhlIG1lbW9yeSAqLworICAgIFFQID0gUVBNQlttYm51bV07CisgICAgaWYgKG1ibnVtID4gMCkgICB2aWRlby0+UVBfcHJldiA9IFFQTUJbbWJudW0tMV07CisKKyAgICAvKiBkZXRlcm1pbmUgdHlwZSBvZiBxdWFudGl6YXRpb24gICAqLworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSA9PSAwKQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisgICAgZWxzZQorICAgICAgICBDb2RlTUIgPSAmQ29kZU1CX01QRUc7CisjZWxzZQorICAgIENvZGVNQiA9ICZDb2RlTUJfSDI2MzsKKyNlbmRpZgorCisgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9ucyB0byBiZSB1c2VkLCBpbiBNQi1sZXZlbCAqLworICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVDb21iaW5lZF9QX1ZPUDsKKyAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVDb21iaW5lZF9JX1ZPUDsKKyAgICBlbHNlIC8qIEJfVk9QIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKyAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAvKiBkZXRlcm1pbmUgd2hpY2ggVkxDIHRhYmxlIHRvIGJlIHVzZWQgKi8KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1Nob3J0SGVhZGVyOworI2lmbmRlZiBOT19SVkxDCisgICAgZWxzZSBpZiAoY3VyclZvbC0+dXNlUmV2ZXJzZVZMQykKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfUlZMQzsKKyNlbmRpZgorICAgIGVsc2UKKyAgICAgICAgQmxvY2tDb2RlQ29lZmYgPSAmQmxvY2tDb2RlQ29lZmZfTm9ybWFsOworI2Vsc2UKKyAgICBCbG9ja0NvZGVDb2VmZiA9ICZCbG9ja0NvZGVDb2VmZl9TaG9ydEhlYWRlcjsKKyNlbmRpZgorCisgICAgLyogIChnb2JfZnJhbWVfaWQgaXMgdGhlIHNhbWUgZm9yIGRpZmZlcmVudCB2b3AgdHlwZXMpIFRoZSByZWFzb24gc2hvdWxkIGJlIFNDRCAqLworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyICYmIGN1cnJWb3AtPmdvYkZyYW1lSUQgIT0gY3VyclZvcC0+cHJlZGljdGlvblR5cGUpCisgICAgICAgIGN1cnJWb3AtPmdvYkZyYW1lSUQgPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKworCisgICAgaWYgKG1ibnVtICE9IDApCisgICAgeworICAgICAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgLyogRW5jb2RlIEdPQiBIZWFkZXIgKi8KKyAgICAgICAgICAgIGJpdENvdW50ID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgICAgICAgICBieXRlQ291bnQxID0gYnl0ZUNvdW50ID0gYml0Q291bnQgPj4gMzsgLyogc2F2ZSB0aGUgcG9zaXRpb24gYmVmb3JlIEdPQiBoZWFkZXIgKi8KKyAgICAgICAgICAgIGJpdENvdW50ID0gYml0Q291bnQgJiAweDc7CisKKyNpZmRlZiBIMjYzX0dPQl9DSEFOR0VTCisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgLT0gQml0c3RyZWFtR2V0UG9zKGJzMSk7IC8qIEhlYWRlciBCaXRzICovCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVHT0JIZWFkZXIodmlkZW8sIHNsaWNlX2NvdW50ZXIsIFFQLCAxKTsgIC8vaW5kX3kgICAgLyogRW5jb2RlIEdPQiBIZWFkZXIgKi8KKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgZ290byBKVU1QX0lOX1NIOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGN1cnJWb2wtPlJlc3luY01hcmtlckRpc2FibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gSlVNUF9JTl9TSDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAxOworICAgICAgICAgICAgZ290byBKVU1QX0lOOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpbmRfeSA9IDA7IGluZF95IDwgY3VyclZvbC0+bk1CUGVyQ29sOyBpbmRfeSsrKSAgICAvKiBDb2wgTUIgTG9vcCAqLworICAgIHsKKworICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3kgPSBpbmRfeTsgLyogIDUvMjgvMDEsIGRvIG5vdCByZW1vdmUgKi8KKworICAgICAgICBmb3IgKGluZF94ID0gMDsgaW5kX3ggPCBjdXJyVm9sLT5uTUJQZXJSb3c7IGluZF94KyspICAvKiBSb3cgTUIgTG9vcCAqLworICAgICAgICB7CisKKyAgICAgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeCA9IGluZF94OyAvKiAgNS8yOC8wMSwgZG8gbm90IHJlbW92ZSAqLworICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOyAgICAgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIgKi8KK0pVTVBfSU5fU0g6CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIE1CIFByZWRpY3Rpb246UHV0IGludG8gTUMgbWFjcm9ibG9jaywgc3Vic3RyYWN0IGZyb20gY3VyclZvcCwgcHV0IGluIHByZWRNQiAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBnZXRNb3Rpb25Db21wZW5zYXRlZE1CKHZpZGVvLCBpbmRfeCwgaW5kX3ksIG9mZnNldCk7CisKK0pVTVBfSU46CisgICAgICAgICAgICBRUCA9IFFQTUJbbWJudW1dOyAgIC8qIGFsd2F5cyByZWFkIG5ldyBRUCAqLworI2lmbmRlZiBIMjYzX09OTFkKKyAgICAgICAgICAgIGlmIChzdGFydF9wYWNrZXRfaGVhZGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlX2NvdW50ZXIrKzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgc2xpY2UgY291bnRlciAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7ICAvKiBVcGRhdGUgTUIgc2xpY2UgbnVtYmVyKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+UVBfcHJldiA9IGN1cnJWb3AtPnF1YW50aXplcjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBRUCAqLworICAgICAgICAgICAgICAgIG51bV9iaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlVmlkZW9QYWNrZXRIZWFkZXIodmlkZW8sIG1ibnVtLCB2aWRlby0+UVBfcHJldiwgMSk7CisgICAgICAgICAgICAgICAgbnVtSGVhZGVyQml0cyA9IEJpdHN0cmVhbUdldFBvcyhiczEpIC0gbnVtX2JpdHM7CisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IG51bUhlYWRlckJpdHM7IC8qIEhlYWRlciBCaXRzICovCisgICAgICAgICAgICAgICAgc3RhcnRfcGFja2V0X2hlYWRlciA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAvKiBkb24ndCBlbmNvZGUgdGhlIGZpcnN0IE1CIGluIHBhY2tldCBhZ2FpbiAqLworI2VuZGlmIC8qIEgyNjNfT05MWSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAvKiBDb2RlX01COiAgRENULCBRLCBRXigtMSksIElEQ1QsIE1vdGlvbiBDb21wICovCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9ICgqQ29kZU1CKSh2aWRlbywgJmZhc3REQ1RmdW5jdGlvbiwgKG9mZnNldCA8PCA1KSArIFFQLCBuY29lZmJsY2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTUIgVkxDIEVuY29kZTogVkxDIEVuY29kZSBNQiAgICAgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIC8qIHNhdmUgdGhlIHN0YXRlIGJlZm9yZSBWTEMgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgIGlmIChyZXN5bmNfbWFya2VyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdENvdW50ID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgICAgICAgICAgICAgYnl0ZUNvdW50ID0gYml0Q291bnQgPj4gMzsgLyogc2F2ZSB0aGUgc3RhdGUgYmVmb3JlIGVuY29kaW5nICovCisgICAgICAgICAgICAgICAgYml0Q291bnQgPSBiaXRDb3VudCAmIDB4NzsKKyAgICAgICAgICAgICAgICBtb2RlID0gTW9kZVttYm51bV07CisgICAgICAgICAgICAgICAgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTTRWRU5DX01FTUNQWShvdXRwdXRNQltrXSwgdmlkZW8tPm91dHB1dE1CLT5ibG9ja1trXSwgc2l6ZW9mKFNob3J0KSA8PCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgKCpNQlZsY0VuY29kZSkodmlkZW8sIG5jb2VmYmxjaywgKHZvaWQqKUJsb2NrQ29kZUNvZWZmKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBBc3NlbWJsZSBQYWNrZXRzOiAgQXNzZW1ibGUgdGhlIE1CIFZMQyBjb2RlcyBpbnRvIFBhY2tldHMgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvKiBBc3NlbWJsZV9QYWNrZXQodmlkZW8pICovCisjaWZuZGVmIEgyNjNfT05MWQorICAgICAgICAgICAgaWYgKCFjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghY3VyclZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBpbiBTaG9ydFZpZGVvSGVhZGVyIG1vZGUgYW5kIFJFU1lOQyBNQVJLRVIgTU9ERSAqLworCisgICAgICAgICAgICAgICAgICAgIG51bV9iaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSkgOy8vLSBudW1IZWFkZXJCaXRzOyAvLyBpbmNsdWRlIGhlYWRlcgorCisgICAgICAgICAgICAgICAgICAgIC8qIEFzc2VtYmxlIHBhY2tldCBhbmQgcmV0dXJuIHdoZW4gc2l6ZSByZWFjaGVkICovCisgICAgICAgICAgICAgICAgICAgIGlmIChudW1fYml0cyA+IHBhY2tldF9zaXplICYmIG1ibnVtICE9IGZpcnN0TUIpCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVwb3MoYnMxLCBieXRlQ291bnQsIGJpdENvdW50KTsgLyogcmV3aW5kIG9uZSBNQiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOyAvKiBCeXRlIGFsaWduIFBhY2tldCAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7IC8qIFB1dCBQYWNrZXQgdG8gQnVmZmVyICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX0JVRikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcGFja2V0X2hlYWRlciA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYm51bSA8IG5Ub3RhbE1CIHx8IHZpZGVvLT5lbmRfb2ZfYnVmKSAvKiByZXR1cm4gaGVyZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlW21ibnVtXSA9IG1vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9IENCUDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA2OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFTkNfTUVNQ1BZKHZpZGVvLT5vdXRwdXRNQi0+YmxvY2tba10sIG91dHB1dE1CW2tdLCBzaXplb2YoU2hvcnQpIDw8IDYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgLyogTk8gUkVTWU5DIE1BUktFUiAsIHJldHVybiB3aGVuIGJ1ZmZlciBpcyBmdWxsKi8KKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtIDwgblRvdGFsTUIgLSAxICYmIGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50ICsgYnMxLT5ieXRlQ291bnQgKyAxID49IGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogZmluZCBtYXhpbXVtIGJ5dGVzIHRvIGZpdCBpbiB0aGUgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQgPSBjdXJyVm9sLT5zdHJlYW0tPmJ1ZmZlclNpemUgLSBjdXJyVm9sLT5zdHJlYW0tPmJ5dGVDb3VudCAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9iaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSkgLSAoYnl0ZUNvdW50IDw8IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUmVwb3MoYnMxLCBieXRlQ291bnQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOworICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRmx1c2hCaXRzKGJzMSwgbnVtX2JpdHMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIG9uIHRvIG5leHQgTUIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ibnVtKysgOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl94Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPm91dHB1dE1CLT5tYl94ID49IGN1cnJWb2wtPm5NQlBlclJvdykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3ggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5vdXRwdXRNQi0+bWJfeSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAobHggPDwgNCkgLSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmIC8qIEgyNjNfT05MWSAqLworICAgICAgICAgICAgb2Zmc2V0ICs9IDE2OworICAgICAgICAgICAgbWJudW0rKzsgLyogaGFzIHRvIGluY3JlbWVudCBiZWZvcmUgU0NELCB0byBwcmVzZXJ2ZSBNb2RlW21ibnVtXSAqLworCisgICAgICAgIH0gLyogRW5kIG9mIEZvciBpbmRfeCAqLworCisgICAgICAgIG9mZnNldCArPSAobHggPDwgNCkgLSB3aWR0aDsKKworICAgICAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikgIC8qIFNob3J0VmlkZW9IZWFkZXIgPSAxICovCisgICAgICAgIHsKKyNpZmRlZiBIMjYzX0dPQl9DSEFOR0VTCisgICAgICAgICAgICBzbGljZV9jb3VudGVyKys7CisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtU2hvcnRIZWFkZXJCeXRlQWxpZ25TdHVmZmluZyhiczEpOworI2VuZGlmCisgICAgICAgICAgICAvL3ZpZGVvLT5oZWFkZXJfYml0cys9Qml0c3RyZWFtU2hvcnRIZWFkZXJCeXRlQWxpZ25TdHVmZmluZyhiczEpOworCisgICAgICAgICAgICAvKiBjaGVjayBpZiB0aW1lIHRvIHBhY2tldGl6ZSAqLworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50ICsgYnMxLT5ieXRlQ291bnQgPiBjdXJyVm9sLT5zdHJlYW0tPmJ1ZmZlclNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVDb3VudCA9PSBieXRlQ291bnQxKSAvKiBhIHNpbmdsZSBHT0IgYmlnZ2VyIHRoYW4gcGFja2V0IHNpemUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRU5EX09GX0JVRjsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAxOworICAgICAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvKiBmb3Igc2hvcnRfaGVhZGVyIHNjb29jaCBiYWNrIHRvIHByZXZpb3VzIEdPQiAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSAoKGJzMS0+Ynl0ZUNvdW50IC0gYnl0ZUNvdW50KSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgICAgLy9udW1fYml0cyA9ICgoYnMxLT5ieXRlQ291bnQ8PDMpICsgYnMxLT5iaXRDb3VudCkgLSAoKGJ5dGVDb3VudDw8MykgKyBiaXRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlcG9zKGJzMSwgYnl0ZUNvdW50LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy9CaXRzdHJlYW1SZXBvcyhiczEsYnl0ZUNvdW50LGJpdENvdW50KTsKKy8vICAgICAgICAgICAgICAgICAgayA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50OyAvKiBzYXZlIHN0YXRlIGJlZm9yZSBhcHBlbmRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kUGFja2V0Tm9PZmZzZXQoY3VyclZvbC0+c3RyZWFtLCBiczEpOworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1GbHVzaEJpdHMoYnMxLCBudW1fYml0cyk7CisvLyAgICAgICAgICAgICAgICAgIGlmKG1ibnVtID09IG5Ub3RhbE1CIHx8IGsgKyBiczEtPmJ5dGVDb3VudCA+PSBjdXJyVm9sLT5zdHJlYW0tPmJ1ZmZlclNpemUpeworICAgICAgICAgICAgICAgICAgICAvKiBsYXN0IEdPQiBvciBjdXJyZW50IG9uZSB3aXRoIGxhcmdlciBzaXplIHdpbGwgYmUgcmV0dXJuZWQgbmV4dCBydW4gKi8KKy8vICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0VORF9PRl9CVUY7CisvLyAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDE7CisvLyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfcGFja2V0X2hlYWRlciA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYm51bSA9PSBuVG90YWxNQikgLyogdGhlcmUncyBvbmUgbW9yZSBHT0IgdG8gcGFja2V0aXplIGZvciB0aGUgbmV4dCByb3VuZCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9FTkRfT0ZfQlVGOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1ibnVtIDwgblRvdGFsTUIpIC8qIHJldHVybiBoZXJlICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBtb3ZlIG9uIHRvIG5leHQgTUIgKi8KKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl94ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl95Kys7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+b2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSBzbGljZV9jb3VudGVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG1ibnVtIDwgblRvdGFsTUIpIC8qIGRvIG5vdCB3cml0ZSBHT0IgaGVhZGVyIGlmIGVuZCBvZiB2b3AgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiaXRDb3VudCA9IEJpdHN0cmVhbUdldFBvcyhiczEpOworICAgICAgICAgICAgICAgIGJ5dGVDb3VudCA9IGJpdENvdW50ID4+IDM7ICAvKiBzYXZlIHRoZSBwb3NpdGlvbiBiZWZvcmUgR09CIGhlYWRlciAqLworICAgICAgICAgICAgICAgIGJpdENvdW50ID0gYml0Q291bnQgJiAweDc7CisjaWZkZWYgSDI2M19HT0JfQ0hBTkdFUworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyAtPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVHT0JIZWFkZXIodmlkZW8sIHNsaWNlX2NvdW50ZXIsIFFQLCAxKTsgICAgICAgICAvKiBFbmNvZGUgR09CIEhlYWRlciAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IC8qIEVuZCBvZiBGb3IgaW5kX3kgKi8KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgaWYgKCFjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAvKiBDb21iaW5lZCBNb2RlKi8KKyAgICB7CisgICAgICAgIGlmICghY3VyclZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSkgLyogUmVzeW5jIE1hcmtlcnMgKi8KKyAgICAgICAgeworCisgICAgICAgICAgICBpZiAoIXN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOy8qIEJ5dGUgQWxpZ24gICovCisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7ICAgLyogUHV0IFBhY2tldCB0byBCdWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9CVUYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgICAvKiBObyBSZXN5bmMgTWFya2VycyAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOyAvKiBCeXRlIEFsaWduICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7IC8qIEluaXRpYWxpemUgdG8gMCAqLworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKyAgICB7CisgICAgICAgIGlmICghc3RhcnRfcGFja2V0X2hlYWRlcikgLyogbm90IHlldCBwYWNrZXRpemVkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1TaG9ydEhlYWRlckJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9CVUYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgaWYgKG1ibnVtIDwgblRvdGFsTUIpCisgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7CisgICAgdmlkZW8tPm9mZnNldCA9IG9mZnNldDsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgIC8qIE5PX1NMSUNFX0VOQ09ERSAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZUdPQkhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDkvMDUvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGlzdG9yeSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBhIGZyYW1lIG9mIE1QRUc0IGJpdHN0cmVhbSBpbiBDb21iaW5lZCBtb2RlLiAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsIGVsc2UgUFZfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIEVuY29kZUdPQkhlYWRlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgR09CX251bWJlciwgSW50IHF1YW50X3NjYWxlLCBJbnQgYnMxc3RyZWFtKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSAoYnMxc3RyZWFtID8gdmlkZW8tPmJpdHN0cmVhbTEgOiB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5zdHJlYW0pOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAxNywgR09CX1JFU1lOQ19NQVJLRVIpOyAvKiBnb2JfcmVzeW5jX21hcmtlciAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBHT0JfbnVtYmVyKTsgICAgICAgICAgIC8qIEN1cnJlbnQgZ29iX251bWJlciAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAyLCB2aWRlby0+Y3VyclZvcC0+Z29iRnJhbWVJRCk7IC8qIGdvYl9mcmFtZV9pZCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBxdWFudF9zY2FsZSk7ICAgICAgICAgICAgICAvKiBxdWFudF9zY2FsZSAqLworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjOGU3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAKQEAgLTAsMCArMSw0ODIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIEgyNjNfT05MWQorCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZUZyYW1lRGF0YVBhcnRNb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDkvNi8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGlzdG9yeSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBhIGZyYW1lIG9mIE1QRUc0IGJpdHN0cmVhbSBpbiBkYXRhcGFydGl0aW9uaW5nIG1vZGUuICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZnVsIGVsc2UgUFZfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBFbmNvZGVGcmFtZURhdGFQYXJ0TW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgSW50IHdpZHRoID0gY3VyclZvcC0+d2lkdGg7IC8qIGhhcyB0byBiZSBWb3AsIGZvciBtdWx0aXBsZSBvZiAxNiAqLworICAgIEludCBseCA9IGN1cnJWb3AtPnBpdGNoOyAvKiAgd2l0aCBwYWRkaW5nICovCisgICAgSW50IG9mZnNldCA9IDA7CisgICAgSW50IGluZF94LCBpbmRfeTsKKyAgICBJbnQgc3RhcnRfcGFja2V0X2hlYWRlciA9IDA7CisgICAgVUNoYXIgKlFQTUIgPSB2aWRlby0+UVBNQjsKKyAgICBJbnQgUVA7CisgICAgSW50IG1ibnVtID0gMCwgc2xpY2VfY291bnRlciA9IDA7CisgICAgSW50IG51bV9iaXRzLCBwYWNrZXRfc2l6ZSA9IGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMxID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMiA9IHZpZGVvLT5iaXRzdHJlYW0yOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczMgPSB2aWRlby0+Yml0c3RyZWFtMzsKKyAgICBJbnQgbnVtSGVhZGVyQml0czsKKyAgICBhcHByb3hEQ1QgZmFzdERDVGZ1bmN0aW9uOworICAgIEludCBuY29lZmJsY2tbNl0gPSB7NjQsIDY0LCA2NCwgNjQsIDY0LCA2NH07IC8qIGZvciBGYXN0Q29kZU1CLCAgNS8xOC8yMDAxICovCisgICAgUFZfU1RBVFVTKCpDb2RlTUIpKFZpZGVvRW5jRGF0YSAqLCBhcHByb3hEQ1QgKiwgSW50LCBJbnRbXSk7CisgICAgdm9pZCAoKk1CVmxjRW5jb2RlKShWaWRlb0VuY0RhdGEqLCBJbnRbXSwgdm9pZCAqKTsKKyAgICB2b2lkICgqQmxvY2tDb2RlQ29lZmYpKFJ1bkxldmVsQmxvY2sqLCBCaXRzdHJlYW1FbmNWaWRlbyosIEludCwgSW50LCBVQ2hhcik7CisKKyAgICB2aWRlby0+UVBfcHJldiA9IGN1cnJWb3AtPnF1YW50aXplcjsKKworICAgIG51bUhlYWRlckJpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogTnVtYmVyIG9mIGJpdHMgaW4gVk9QIEhlYWRlciAqLworCisgICAgLyogZGV0ZXJtaW5lIHR5cGUgb2YgcXVhbnRpemF0aW9uICAgKi8KKyNpZm5kZWYgTk9fTVBFR19RVUFOVAorICAgIGlmIChjdXJyVm9sLT5xdWFudFR5cGUgPT0gMCkKKyAgICAgICAgQ29kZU1CID0gJkNvZGVNQl9IMjYzOworICAgIGVsc2UKKyAgICAgICAgQ29kZU1CID0gJkNvZGVNQl9NUEVHOworI2Vsc2UKKyAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisjZW5kaWYKKworICAgIC8qIGRldGVybWluZSB3aGljaCBmdW5jdGlvbnMgdG8gYmUgdXNlZCwgaW4gTUItbGV2ZWwgKi8KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgICAgIE1CVmxjRW5jb2RlID0gJk1CVmxjRW5jb2RlRGF0YVBhcl9QX1ZPUDsKKyAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVEYXRhUGFyX0lfVk9QOworICAgIGVsc2UgLyogQl9WT1Agbm90IGltcGxlbWVudGVkIHlldCAqLworICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworICAgIC8qIGRldGVybWluZSB3aGljaCBWTEMgdGFibGUgdG8gYmUgdXNlZCAqLworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICBCbG9ja0NvZGVDb2VmZiA9ICZCbG9ja0NvZGVDb2VmZl9TaG9ydEhlYWRlcjsKKyNpZm5kZWYgTk9fUlZMQworICAgIGVsc2UgaWYgKGN1cnJWb2wtPnVzZVJldmVyc2VWTEMpCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1JWTEM7CisjZW5kaWYKKyAgICBlbHNlCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX05vcm1hbDsKKworICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOworCisgICAgZm9yIChpbmRfeSA9IDA7IGluZF95IDwgY3VyclZvbC0+bk1CUGVyQ29sOyBpbmRfeSsrKSAgICAvKiBDb2wgTUIgTG9vcCAqLworICAgIHsKKworICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3kgPSBpbmRfeTsgLyogIDUvMjgvMDEgKi8KKworICAgICAgICBmb3IgKGluZF94ID0gMDsgaW5kX3ggPCBjdXJyVm9sLT5uTUJQZXJSb3c7IGluZF94KyspICAvKiBSb3cgTUIgTG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3ggPSBpbmRfeDsgLyogIDUvMjgvMDEgKi8KKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsgICAgICAvKiBVcGRhdGUgTUIgc2xpY2UgbnVtYmVyICovCisgICAgICAgICAgICBRUCA9IFFQTUJbbWJudW1dOyAgIC8qIGFsd2F5cyByZWFkIG5ldyBRUCAqLworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIE1CIFByZWRpY3Rpb246UHV0IGludG8gTUMgbWFjcm9ibG9jaywgc3Vic3RyYWN0IGZyb20gY3VyclZvcCwgcHV0IGluIHByZWRNQiAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIGdldE1vdGlvbkNvbXBlbnNhdGVkTUIodmlkZW8sIGluZF94LCBpbmRfeSwgb2Zmc2V0KTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VfY291bnRlcisrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBzbGljZSBjb3VudGVyICovCisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIqLworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyAtPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+UVBfcHJldiA9IGN1cnJWb3AtPnF1YW50aXplcjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSBRUCAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVZpZGVvUGFja2V0SGVhZGVyKHZpZGVvLCBtYm51bSwgdmlkZW8tPlFQX3ByZXYsIDApOworICAgICAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICBudW1IZWFkZXJCaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgICAgICAgICAgICAgc3RhcnRfcGFja2V0X2hlYWRlciA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIENvZGVfTUI6ICBEQ1QsIFEsIFFeKC0xKSwgSURDVCwgTW90aW9uIENvbXAgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgc3RhdHVzID0gKCpDb2RlTUIpKHZpZGVvLCAmZmFzdERDVGZ1bmN0aW9uLCAob2Zmc2V0IDw8IDUpICsgUVAsIG5jb2VmYmxjayk7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBNQiBWTEMgRW5jb2RlOiBWTEMgRW5jb2RlIE1CICAgICAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgTUJWbGNFbmNvZGUodmlkZW8sIG5jb2VmYmxjaywgKHZvaWQqKUJsb2NrQ29kZUNvZWZmKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBBc3NlbWJsZSBQYWNrZXRzOiAgQXNzZW1ibGUgdGhlIE1CIFZMQyBjb2RlcyBpbnRvIFBhY2tldHMgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvKiBJTkNMVURFIFZPUCBIRUFERVIgSU4gQ09VTlQgKi8KKworICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKSArIEJpdHN0cmVhbUdldFBvcyhiczIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtR2V0UG9zKGJzMykgLSBudW1IZWFkZXJCaXRzOworCisgICAgICAgICAgICAvKiBBc3NlbWJsZV9QYWNrZXQodmlkZW8pICovCisKKyAgICAgICAgICAgIGlmIChudW1fYml0cyA+IHBhY2tldF9zaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzMSwgMTksIERDX01BUktFUik7ICAgLyogQWRkIGRjX21hcmtlciAqLworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMxLCAxNywgTU9USU9OX01BUktFUl9DT01CKTsgLypBZGQgbW90aW9uX21hcmtlciovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMyKTsgICAvKiBDb21iaW5lIGJzMSBhbmQgYnMyICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMzKTsgICAvKiBDb21iaW5lIGJzMSBhbmQgYnMzICovCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoYnMxKTsgLyogQnl0ZSBhbGlnbiBQYWNrZXQgKi8KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7IC8qIFB1dCBQYWNrZXQgdG8gQnVmZmVyICovCisgICAgICAgICAgICAgICAgLyogY29udGludWUgZXZlbiBpZiBzdGF0dXMgPT0gUFZfRU5EX09GX0JVRiwgdG8gZ2V0IHRoZSBzdGF0cyAqLworCisgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsgLyogSW5pdGlhbGl6ZSB0byAwICovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMyKTsKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczMpOworICAgICAgICAgICAgICAgIHN0YXJ0X3BhY2tldF9oZWFkZXIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWJudW0rKzsKKyAgICAgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgfSAvKiBFbmQgb2YgRm9yIGluZF94ICovCisKKyAgICAgICAgb2Zmc2V0ICs9IChseCA8PCA0KSAtIHdpZHRoOworICAgIH0gLyogRW5kIG9mIEZvciBpbmRfeSAqLworCisgICAgaWYgKCFzdGFydF9wYWNrZXRfaGVhZGVyKQorICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMxLCAxOSwgRENfTUFSS0VSKTsgICAvKiBBZGQgZGNfbWFya2VyICovCisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gMTk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDE2Qml0cyhiczEsIDE3LCBNT1RJT05fTUFSS0VSX0NPTUIpOyAvKiBBZGQgbW90aW9uX21hcmtlciAqLworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IDE3OworICAgICAgICB9CisgICAgICAgIEJpdHN0cmVhbUFwcGVuZEVuYyhiczEsIGJzMik7CisgICAgICAgIEJpdHN0cmVhbUFwcGVuZEVuYyhiczEsIGJzMyk7CisgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKGJzMSk7IC8qIEJ5dGUgYWxpZ24gUGFja2V0ICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7IC8qIFB1dCBQYWNrZXQgdG8gQnVmZmVyICovCisgICAgICAgIC8qIGNvbnRpbnVlIGV2ZW4gaWYgc3RhdHVzID09IFBWX0VORF9PRl9CVUYsIHRvIGdldCB0aGUgc3RhdHMgKi8KKyAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsgLyogSW5pdGlhbGl6ZSB0byAwICovCisgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMik7CisgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMyk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsgLyogaWYgc3RhdHVzID09IFBWX0VORF9PRl9CVUYsIHRoaXMgZnJhbWUgd2lsbCBiZSBwcmUtc2tpcHBlZCAqLworfQorCisjaWZuZGVmICBOT19TTElDRV9FTkNPREUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlU2xpY2VEYXRhUGFydE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xOS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIGEgc2xpY2Ugb2YgTVBFRzQgYml0c3RyZWFtIGluIERhdGFQYXIgbW9kZSBhbmQgc2F2ZSAgICovCisvKiAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgTUIgdG8gY29udGludWUgbmV4dCB0aW1lIGl0IGlzIGNhbGxlZC4gICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogIFBWX1NVQ0NFU1MgaWYgc3VjY2Vzc2Z1bCBlbHNlIFBWX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlU2xpY2VEYXRhUGFydE1vZGUoVmlkZW9FbmNEYXRhICp2aWRlbykKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIFVDaGFyIG1vZGUsICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgblRvdGFsTUIgPSBjdXJyVm9sLT5uVG90YWxNQjsKKyAgICBJbnQgd2lkdGggPSBjdXJyVm9wLT53aWR0aDsgLyogaGFzIHRvIGJlIFZvcCwgZm9yIG11bHRpcGxlIG9mIDE2ICovCisgICAgSW50IGx4ID0gY3VyclZvcC0+cGl0Y2g7IC8qICwgd2l0aCBwYWRpbmcgKi8KKyAgICBVQ2hhciAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIEludCBRUDsKKyAgICBJbnQgaW5kX3ggPSB2aWRlby0+b3V0cHV0TUItPm1iX3gsIGluZF95ID0gdmlkZW8tPm91dHB1dE1CLT5tYl95OworICAgIEludCBvZmZzZXQgPSB2aWRlby0+b2Zmc2V0OyAgICAgICAgICAgICAgICAgLyogZ2V0IGN1cnJlbnQgTUIgbG9jYXRpb24gKi8KKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW0sIHNsaWNlX2NvdW50ZXIgPSB2aWRlby0+c2xpY2VOb1ttYm51bV07IC8qIGdldCBjdXJyZW50IE1CIGxvY2F0aW9uICovCisgICAgSW50IGZpcnN0TUIgPSBtYm51bTsKKyAgICBJbnQgc3RhcnRfcGFja2V0X2hlYWRlciA9IChtYm51bSAhPSAwKTsKKyAgICBJbnQgbnVtX2JpdHMgPSAwOworICAgIEludCBwYWNrZXRfc2l6ZSA9IGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSAtIDEgLSAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1AgPyAxOSA6IDE3KTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMxID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMiA9IHZpZGVvLT5iaXRzdHJlYW0yOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczMgPSB2aWRlby0+Yml0c3RyZWFtMzsKKyAgICBJbnQgYml0Q291bnQxID0gMCwgYml0Q291bnQyID0gMCwgYml0Q291bnQzID0gMCwgYnl0ZUNvdW50MSA9IDAsIGJ5dGVDb3VudDIgPSAwLCBieXRlQ291bnQzID0gMDsKKyAgICBJbnQgbnVtSGVhZGVyQml0cyA9IDA7CisgICAgYXBwcm94RENUIGZhc3REQ1RmdW5jdGlvbjsKKyAgICBJbnQgbmNvZWZibGNrWzZdID0gezY0LCA2NCwgNjQsIDY0LCA2NCwgNjR9OyAvKiBmb3IgRmFzdENvZGVNQiwgIDUvMTgvMjAwMSAqLworICAgIFVDaGFyIENCUDsKKyAgICBTaG9ydCBvdXRwdXRNQls2XVs2NF07CisgICAgUFZfU1RBVFVTKCpDb2RlTUIpKFZpZGVvRW5jRGF0YSAqLCBhcHByb3hEQ1QgKiwgSW50LCBJbnRbXSk7CisgICAgdm9pZCAoKk1CVmxjRW5jb2RlKShWaWRlb0VuY0RhdGEqLCBJbnRbXSwgdm9pZCAqKTsKKyAgICB2b2lkICgqQmxvY2tDb2RlQ29lZmYpKFJ1bkxldmVsQmxvY2sqLCBCaXRzdHJlYW1FbmNWaWRlbyosIEludCwgSW50LCBVQ2hhcik7CisgICAgSW50IGs7CisKKyAgICB2aWRlby0+UVBfcHJldiA9IDMxOworCisgICAgaWYgKHZpZGVvLT5lbmRfb2ZfYnVmKSAvKiBsZWZ0LW92ZXIgZnJvbSBwcmV2aW91cyBydW4gKi8KKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbUFwcGVuZFBhY2tldE5vT2Zmc2V0KGN1cnJWb2wtPnN0cmVhbSwgYnMxKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9FTkRfT0ZfQlVGKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczEpOworICAgICAgICAgICAgdmlkZW8tPmVuZF9vZl9idWYgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKG1ibnVtID09IDApIC8qIG9ubHkgZG8gdGhpcyBhdCB0aGUgc3RhcnQgb2YgYSBmcmFtZSAqLworICAgIHsKKyAgICAgICAgUVBNQlswXSA9IHZpZGVvLT5RUF9wcmV2ID0gUVAgPSBjdXJyVm9wLT5xdWFudGl6ZXI7CisgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOworCisgICAgICAgIG51bUhlYWRlckJpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogTnVtYmVyIG9mIGJpdHMgaW4gVk9QIEhlYWRlciAqLworCisgICAgfQorCisKKyAgICAvKiBSZS1hc3NpZ24gZmFzdCBmdW5jdGlvbnMgb24gZXZlcnkgc2xpY2UsIGRvbid0IGhhdmUgdG8gcHV0IGl0IGluIHRoZSBtZW1vcnkgKi8KKyAgICBRUCA9IFFQTUJbbWJudW1dOworICAgIGlmIChtYm51bSA+IDApICAgdmlkZW8tPlFQX3ByZXYgPSBRUE1CW21ibnVtLTFdOworCisgICAgLyogZGV0ZXJtaW5lIHR5cGUgb2YgcXVhbnRpemF0aW9uICAgKi8KKyNpZm5kZWYgTk9fTVBFR19RVUFOVAorICAgIGlmIChjdXJyVm9sLT5xdWFudFR5cGUgPT0gMCkKKyAgICAgICAgQ29kZU1CID0gJkNvZGVNQl9IMjYzOworICAgIGVsc2UKKyAgICAgICAgQ29kZU1CID0gJkNvZGVNQl9NUEVHOworI2Vsc2UKKyAgICBDb2RlTUIgPSAmQ29kZU1CX0gyNjM7CisjZW5kaWYKKworICAgIC8qIGRldGVybWluZSB3aGljaCBmdW5jdGlvbnMgdG8gYmUgdXNlZCwgaW4gTUItbGV2ZWwgKi8KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgICAgIE1CVmxjRW5jb2RlID0gJk1CVmxjRW5jb2RlRGF0YVBhcl9QX1ZPUDsKKyAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgTUJWbGNFbmNvZGUgPSAmTUJWbGNFbmNvZGVEYXRhUGFyX0lfVk9QOworICAgIGVsc2UgLyogQl9WT1Agbm90IGltcGxlbWVudGVkIHlldCAqLworICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworICAgIC8qIGRldGVybWluZSB3aGljaCBWTEMgdGFibGUgdG8gYmUgdXNlZCAqLworI2lmbmRlZiBOT19SVkxDCisgICAgaWYgKGN1cnJWb2wtPnVzZVJldmVyc2VWTEMpCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX1JWTEM7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIEJsb2NrQ29kZUNvZWZmID0gJkJsb2NrQ29kZUNvZWZmX05vcm1hbDsKKworICAgIGlmIChtYm51bSAhPSAwKQorICAgIHsKKyAgICAgICAgZ290byBKVU1QX0lOOworICAgIH0KKworICAgIGZvciAoaW5kX3kgPSAwOyBpbmRfeSA8IGN1cnJWb2wtPm5NQlBlckNvbDsgaW5kX3krKykgICAgLyogQ29sIE1CIExvb3AgKi8KKyAgICB7CisKKyAgICAgICAgdmlkZW8tPm91dHB1dE1CLT5tYl95ID0gaW5kX3k7IC8qICA1LzI4LzAxICovCisKKyAgICAgICAgZm9yIChpbmRfeCA9IDA7IGluZF94IDwgY3VyclZvbC0+bk1CUGVyUm93OyBpbmRfeCsrKSAgLyogUm93IE1CIExvb3AgKi8KKyAgICAgICAgeworCisgICAgICAgICAgICB2aWRlby0+b3V0cHV0TUItPm1iX3ggPSBpbmRfeDsgLyogIDUvMjgvMDEgKi8KKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsgICAgICAvKiBVcGRhdGUgTUIgc2xpY2UgbnVtYmVyICovCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogTUIgUHJlZGljdGlvbjpQdXQgaW50byBNQyBtYWNyb2Jsb2NrLCBzdWJzdHJhY3QgZnJvbSBjdXJyVm9wLCBwdXQgaW4gcHJlZE1CICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGdldE1vdGlvbkNvbXBlbnNhdGVkTUIodmlkZW8sIGluZF94LCBpbmRfeSwgb2Zmc2V0KTsKKworSlVNUF9JTjoKKworICAgICAgICAgICAgUVAgPSBRUE1CW21ibnVtXTsgICAvKiBhbHdheXMgcmVhZCBuZXcgUVAgKi8KKworICAgICAgICAgICAgaWYgKHN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2xpY2VfY291bnRlcisrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBzbGljZSBjb3VudGVyICovCisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsgIC8qIFVwZGF0ZSBNQiBzbGljZSBudW1iZXIqLworICAgICAgICAgICAgICAgIHZpZGVvLT5RUF9wcmV2ID0gY3VyclZvcC0+cXVhbnRpemVyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlIFFQICovCisgICAgICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVWaWRlb1BhY2tldEhlYWRlcih2aWRlbywgbWJudW0sIHZpZGVvLT5RUF9wcmV2LCAwKTsKKyAgICAgICAgICAgICAgICBudW1IZWFkZXJCaXRzID0gQml0c3RyZWFtR2V0UG9zKGJzMSkgLSBudW1fYml0czsKKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gbnVtSGVhZGVyQml0czsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8qIGRvbid0IGVuY29kZSB0aGUgZmlyc3QgTUIgaW4gcGFja2V0IGFnYWluICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIENvZGVfTUI6ICBEQ1QsIFEsIFFeKC0xKSwgSURDVCwgTW90aW9uIENvbXAgKi8KKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAoKkNvZGVNQikodmlkZW8sICZmYXN0RENUZnVuY3Rpb24sIChvZmZzZXQgPDwgNSkgKyBRUCwgbmNvZWZibGNrKTsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTTRWRU5DX01FTUNQWShvdXRwdXRNQltrXSwgdmlkZW8tPm91dHB1dE1CLT5ibG9ja1trXSwgc2l6ZW9mKFNob3J0KSA8PCA2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiBNQiBWTEMgRW5jb2RlOiBWTEMgRW5jb2RlIE1CICAgICAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLyogc2F2ZSB0aGUgc3RhdGUgYmVmb3JlIFZMQyBlbmNvZGluZyAqLworICAgICAgICAgICAgYml0Q291bnQxID0gQml0c3RyZWFtR2V0UG9zKGJzMSk7CisgICAgICAgICAgICBiaXRDb3VudDIgPSBCaXRzdHJlYW1HZXRQb3MoYnMyKTsKKyAgICAgICAgICAgIGJpdENvdW50MyA9IEJpdHN0cmVhbUdldFBvcyhiczMpOworICAgICAgICAgICAgYnl0ZUNvdW50MSA9IGJpdENvdW50MSA+PiAzOworICAgICAgICAgICAgYnl0ZUNvdW50MiA9IGJpdENvdW50MiA+PiAzOworICAgICAgICAgICAgYnl0ZUNvdW50MyA9IGJpdENvdW50MyA+PiAzOworICAgICAgICAgICAgYml0Q291bnQxICY9IDB4NzsKKyAgICAgICAgICAgIGJpdENvdW50MiAmPSAweDc7CisgICAgICAgICAgICBiaXRDb3VudDMgJj0gMHg3OworICAgICAgICAgICAgbW9kZSA9IE1vZGVbbWJudW1dOworICAgICAgICAgICAgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgIE1CVmxjRW5jb2RlKHZpZGVvLCBuY29lZmJsY2ssICh2b2lkKilCbG9ja0NvZGVDb2VmZik7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogQXNzZW1ibGUgUGFja2V0czogIEFzc2VtYmxlIHRoZSBNQiBWTEMgY29kZXMgaW50byBQYWNrZXRzICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgbnVtX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3MoYnMxKSArIEJpdHN0cmVhbUdldFBvcyhiczIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtR2V0UG9zKGJzMyk7Ly8gLSBudW1IZWFkZXJCaXRzOyAvL2luY2x1ZGUgaGVhZGVyIGJpdHMKKworICAgICAgICAgICAgLyogQXNzZW1ibGVfUGFja2V0KHZpZGVvKSAqLworICAgICAgICAgICAgaWYgKG51bV9iaXRzID4gcGFja2V0X3NpemUgJiYgbWJudW0gIT0gZmlyc3RNQikgIC8qIGVuY29kaW5nIGF0IGxlYXN0IG9uZSBtb3JlIE1CKi8KKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlcG9zKGJzMSwgYnl0ZUNvdW50MSwgYml0Q291bnQxKTsgLyogcmV3aW5kIG9uZSBNQiAqLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlcG9zKGJzMiwgYnl0ZUNvdW50MiwgYml0Q291bnQyKTsgLyogcmV3aW5kIG9uZSBNQiAqLworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlcG9zKGJzMywgYnl0ZUNvdW50MywgYml0Q291bnQzKTsgLyogcmV3aW5kIG9uZSBNQiAqLworCisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzMSwgMTksIERDX01BUktFUik7ICAgLyogQWRkIGRjX21hcmtlciAqLworICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gMTk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzMSwgMTcsIE1PVElPTl9NQVJLRVJfQ09NQik7IC8qQWRkIG1vdGlvbl9tYXJrZXIqLworICAgICAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gMTc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMyKTsgIC8qIENvbWJpbmUgd2l0aCBiczIgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRFbmMoYnMxLCBiczMpOyAgLyogQ29tYmluZSB3aXRoIGJzMyAqLworCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IEJpdHN0cmVhbU1wZWc0Qnl0ZUFsaWduU3R1ZmZpbmcoYnMxKTsgLyogQnl0ZSBhbGlnbiBQYWNrZXQgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7CisKKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1FbmNSZXNldChiczIpOworICAgICAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9CVUYpIC8qIGlmIGNhbm5vdCBmaXQgYSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGFydF9wYWNrZXRfaGVhZGVyID0gMTsKKworICAgICAgICAgICAgICAgIGlmIChtYm51bSA8IG5Ub3RhbE1CIHx8IHZpZGVvLT5lbmRfb2ZfYnVmKSAvKiByZXR1cm4gaGVyZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9IHNsaWNlX2NvdW50ZXI7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIE1vZGVbbWJudW1dID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9IENCUDsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNNFZFTkNfTUVNQ1BZKHZpZGVvLT5vdXRwdXRNQi0+YmxvY2tba10sIG91dHB1dE1CW2tdLCBzaXplb2YoU2hvcnQpIDw8IDYpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICAgICAgICAgIG1ibnVtKys7IC8qIGhhcyB0byBpbmNyZW1lbnQgYmVmb3JlIFNDRCwgdG8gcHJlc2VydmUgTW9kZVttYm51bV0gKi8KKyAgICAgICAgfSAvKiBFbmQgb2YgRm9yIGluZF94ICovCisKKyAgICAgICAgb2Zmc2V0ICs9IChseCA8PCA0KSAtIHdpZHRoOworCisgICAgfSAvKiBFbmQgb2YgRm9yIGluZF95ICovCisKKyAgICBpZiAoIXN0YXJ0X3BhY2tldF9oZWFkZXIpCisgICAgeworICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDE2Qml0cyhiczEsIDE5LCBEQ19NQVJLRVIpOyAgIC8qIEFkZCBkY19tYXJrZXIgKi8KKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSAxOTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzMSwgMTcsIE1PVElPTl9NQVJLRVJfQ09NQik7IC8qQWRkIG1vdGlvbl9tYXJrZXIqLworICAgICAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzICs9IDE3OworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMyKTsgIC8qIENvbWJpbmUgd2l0aCBiczIgKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtQXBwZW5kRW5jKGJzMSwgYnMzKTsgIC8qIENvbWJpbmUgd2l0aCBiczMgKi8KKworICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhiczEpOyAvKiBCeXRlIGFsaWduIFBhY2tldCAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1BcHBlbmRQYWNrZXROb09mZnNldChjdXJyVm9sLT5zdHJlYW0sIGJzMSk7CisKKyAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMyKTsKKyAgICAgICAgQml0c3RyZWFtRW5jUmVzZXQoYnMzKTsKKworICAgICAgICBpZiAoc3RhdHVzID09IFBWX0VORF9PRl9CVUYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5lbmRfb2ZfYnVmID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGJzMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKyAgICBpZiAobWJudW0gPCBuVG90YWxNQikKKyAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gc2xpY2VfY291bnRlcjsKKyAgICB2aWRlby0+b2Zmc2V0ID0gb2Zmc2V0OworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBOT19TTElDRV9FTkNPREUgKi8KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTUwZWViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmNwcApAQCAtMCwwICsxLDEyODMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJkY3RfaW5saW5lLmgiCisKKyNkZWZpbmUgRkRDVF9TSElGVCAxMAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICBGdW5jdGlvbjogICBCbG9ja0RDVF9BQU53U3ViCisgICAgICAgIERhdGU6ICAgICAgIDcvMzEvMDEKKyAgICAgICAgSW5wdXQ6CisgICAgICAgIE91dHB1dDogICAgIG91dFs2NF0gPT0+IG5leHQgYmxvY2sKKyAgICAgICAgUHVycG9zZTogICAgRG8gc3VidHJhY3Rpb24gZm9yIHplcm8gTVYgZmlyc3QKKyAgICAgICAgTW9kaWZpZWQ6CisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBWb2lkIEJsb2NrRENUX0FBTndTdWIoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKnByZWQsIEludCB3aWR0aCkKKyAgICB7CisgICAgICAgIFNob3J0ICpkc3Q7CisgICAgICAgIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CisgICAgICAgIEludCByb3VuZDsKKyAgICAgICAgSW50IGsxMiA9IDB4MDIyQTAyRDQ7CisgICAgICAgIEludCBrMTQgPSAweDAxODgwNTNBOworICAgICAgICBJbnQgYWJzX3N1bTsKKyAgICAgICAgSW50IG1hc2s7CisgICAgICAgIEludCB0bXAsIHRtcDI7CisgICAgICAgIEludCBDb2xUaDsKKworICAgICAgICBkc3QgPSBvdXQgKyA2NCA7CisgICAgICAgIENvbFRoID0gKmRzdDsKKyAgICAgICAgb3V0ICs9IDEyODsKKyAgICAgICAgcm91bmQgPSAxIDw8IChGRENUX1NISUZUIC0gMSk7CisKKyAgICAgICAgZG8gIC8qIGZkY3RfbmV4dHJvdyAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBhc3N1bWluZyB0aGUgYmxvY2sgaXMgd29yZC1hbGlnbmVkICovCisgICAgICAgICAgICBtYXNrID0gMHgxRkU7CisgICAgICAgICAgICB0bXAgPSAqKChJbnQqKSBjdXIpOyAgICAvKiBjb250YWlucyA0IHBpeGVscyAqLworICAgICAgICAgICAgdG1wMiA9ICooKEludCopIHByZWQpOyAvKiBwcmVkaWN0aW9uIDQgcGl4ZWxzICovCisgICAgICAgICAgICBrMCA9IHRtcDIgJiAweEZGOworICAgICAgICAgICAgazEgPSBtYXNrICYgKHRtcCA8PCAxKTsKKyAgICAgICAgICAgIGswID0gazEgLSAoazAgPDwgMSk7CisgICAgICAgICAgICBrMSA9ICh0bXAyID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIGsyID0gbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrMSA9IGsyIC0gKGsxIDw8IDEpOworICAgICAgICAgICAgazIgPSAodG1wMiA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgazMgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrMiA9IGszIC0gKGsyIDw8IDEpOworICAgICAgICAgICAgazMgPSAodG1wMiA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgazQgPSBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICBrMyA9IGs0IC0gKGszIDw8IDEpOworICAgICAgICAgICAgdG1wID0gKigoSW50KikoY3VyICsgNCkpOyAgIC8qIGFub3RoZXIgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIHRtcDIgPSAqKChJbnQqKShwcmVkICsgNCkpOworICAgICAgICAgICAgazQgPSB0bXAyICYgMHhGRjsKKyAgICAgICAgICAgIGs1ID0gbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrNCA9IGs1IC0gKGs0IDw8IDEpOworICAgICAgICAgICAgazUgPSAodG1wMiA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBrNiA9IG1hc2sgJiAodG1wID4+IDcpOworICAgICAgICAgICAgazUgPSBrNiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGs2ID0gKHRtcDIgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIGs3ID0gbWFzayAmICh0bXAgPj4gMTUpOworICAgICAgICAgICAgazYgPSBrNyAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGs3ID0gKHRtcDIgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGs3ID0gdG1wIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgY3VyICs9IHdpZHRoOworICAgICAgICAgICAgcHJlZCArPSAxNjsKKworICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgazEgPSBrMCAtIChrMSA8PCAxKTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgZHN0WzBdID0gazA7CisgICAgICAgICAgICBkc3RbNF0gPSBrMTsgLyogY29sLiA0ICovCisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTcyNChrMTIsIGsyLCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGsyID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIGszID0gKGszIDw8IDEpIC0gazI7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMl0gPSBrMjsgICAgICAgIC8qIGNvbC4gMiAqLworICAgICAgICAgICAgazMgPDw9IDE7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC4gNiAqLworICAgICAgICAgICAgZHN0WzZdID0gazM7IC8qIGNvbC4gNiAqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMCA9IGs0IC0gazY7CisKKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGswLCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNTU0KGs0LCBrMTIsIGsxKTsKKyAgICAgICAgICAgIGsxID0gbWxhMTMzOChrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs0ID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazU7CisgICAgICAgICAgICBrNCA9IGs0ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs0OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazQgPDw9IDE7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC41ICovCisgICAgICAgICAgICBrNiA9IGs1IC0gKGs2IDw8IDEpOworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgZHN0WzVdID0gazQ7ICAgIC8qIGNvbC4gNSAqLworICAgICAgICAgICAgazYgPDw9IDI7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC4gNyAqLworICAgICAgICAgICAgZHN0WzFdID0gazU7ICAgIC8qIGNvbC4gMSAqLworICAgICAgICAgICAgZHN0WzddID0gazY7ICAgIC8qIGNvbC4gNyAqLworICAgICAgICAgICAgZHN0WzNdID0gazc7ICAgIC8qIGNvbC4gMyAqLworICAgICAgICAgICAgZHN0ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGRzdCA8IG91dCk7CisKKyAgICAgICAgb3V0IC09IDY0OworICAgICAgICBkc3QgPSBvdXQgKyA4OworCisgICAgICAgIC8qICBWZXJ0aWNhbCBCbG9jayBMb29wICAqLworICAgICAgICBkbyAgLyogVmVydGljYWwgOHhEQ1QgbG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICBrMCA9IG91dFswXTsKKyAgICAgICAgICAgIGsxID0gb3V0WzhdOworICAgICAgICAgICAgazIgPSBvdXRbMTZdOworICAgICAgICAgICAgazMgPSBvdXRbMjRdOworICAgICAgICAgICAgazQgPSBvdXRbMzJdOworICAgICAgICAgICAgazUgPSBvdXRbNDBdOworICAgICAgICAgICAgazYgPSBvdXRbNDhdOworICAgICAgICAgICAgazcgPSBvdXRbNTZdOworICAgICAgICAgICAgLyogZGVhZHpvbmUgdGhyZXNob2xkaW5nIGZvciBjb2x1bW4gKi8KKworICAgICAgICAgICAgYWJzX3N1bSA9IHN1bV9hYnMoazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3KTsKKworICAgICAgICAgICAgaWYgKGFic19zdW0gPCBDb2xUaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSAweDdmZmY7CisgICAgICAgICAgICAgICAgb3V0Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIGsxID0gazAgLSAoazEgPDwgMSk7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIG91dFszMl0gPSBrMTsgLyogcm93IDQgKi8KKyAgICAgICAgICAgIG91dFswXSA9IGswOyAvKiByb3cgMCAqLworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE3MjQoazEyLCBrMiwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrMiA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICBrMyA9IChrMyA8PCAxKSAtIGsyOworICAgICAgICAgICAgazMgPDw9IDE7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC4gNiAqLworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgb3V0WzQ4XSA9IGszOyAgIC8qIHJvdyA2ICovCisgICAgICAgICAgICBvdXRbMTZdID0gazI7ICAgLyogcm93IDIgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazAgPSBrNCAtIGs2OworCisgICAgICAgICAgICBrMSA9IG1sYTM5MihrMCwgazE0LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTU1NChrNCwgazEyLCBrMSk7CisgICAgICAgICAgICBrMSA9IG1sYTEzMzgoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNCA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs1OworICAgICAgICAgICAgazQgPSBrNCArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNDsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs0IDw8PSAxOyAgICAgICAvKiBzY2FsZSB1cCBjb2wuIDUgKi8KKyAgICAgICAgICAgIGs2ID0gazUgLSAoazYgPDwgMSk7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbMjRdID0gazcgOyAgICAvKiByb3cgMyAqLworICAgICAgICAgICAgazYgPDw9IDI7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC4gNyAqLworICAgICAgICAgICAgb3V0WzU2XSA9IGs2IDsgICAvKiByb3cgNyAqLworICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAvKiByb3cgMSAqLworICAgICAgICAgICAgb3V0WzQwXSA9IGs0IDsgICAvKiByb3cgNSAqLworICAgICAgICAgICAgb3V0Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICBGdW5jdGlvbjogICBCbG9jazR4NERDVF9BQU53U3ViCisgICAgICAgIERhdGU6ICAgICAgIDcvMzEvMDEKKyAgICAgICAgSW5wdXQ6CisgICAgICAgIE91dHB1dDogICAgIG91dFs2NF0gPT0+IG5leHQgYmxvY2sKKyAgICAgICAgUHVycG9zZTogICAgRG8gc3VidHJhY3Rpb24gZm9yIHplcm8gTVYgZmlyc3QgYmVmb3JlIDR4NCBEQ1QKKyAgICAgICAgTW9kaWZpZWQ6CisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBWb2lkIEJsb2NrNHg0RENUX0FBTndTdWIoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKnByZWQsIEludCB3aWR0aCkKKyAgICB7CisgICAgICAgIFNob3J0ICpkc3Q7CisgICAgICAgIHJlZ2lzdGVyIEludCBrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazc7CisgICAgICAgIEludCByb3VuZDsKKyAgICAgICAgSW50IGsxMiA9IDB4MDIyQTAyRDQ7CisgICAgICAgIEludCBrMTQgPSAweDAxODgwNTNBOworICAgICAgICBJbnQgbWFzazsKKyAgICAgICAgSW50IHRtcCwgdG1wMjsKKyAgICAgICAgSW50IGFic19zdW07CisgICAgICAgIEludCBDb2xUaDsKKworICAgICAgICBkc3QgPSBvdXQgKyA2NCA7CisgICAgICAgIENvbFRoID0gKmRzdDsKKyAgICAgICAgb3V0ICs9IDEyODsKKyAgICAgICAgcm91bmQgPSAxIDw8IChGRENUX1NISUZUIC0gMSk7CisKKyAgICAgICAgZG8gIC8qIGZkY3RfbmV4dHJvdyAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBhc3N1bWluZyB0aGUgYmxvY2sgaXMgd29yZC1hbGlnbmVkICovCisgICAgICAgICAgICBtYXNrID0gMHgxRkU7CisgICAgICAgICAgICB0bXAgPSAqKChJbnQqKSBjdXIpOyAgICAvKiBjb250YWlucyA0IHBpeGVscyAqLworICAgICAgICAgICAgdG1wMiA9ICooKEludCopIHByZWQpOyAvKiBwcmVkaWN0aW9uIDQgcGl4ZWxzICovCisgICAgICAgICAgICBrMCA9IHRtcDIgJiAweEZGOworICAgICAgICAgICAgazEgPSBtYXNrICYgKHRtcCA8PCAxKTsKKyAgICAgICAgICAgIGswID0gazEgLSAoazAgPDwgMSk7CisgICAgICAgICAgICBrMSA9ICh0bXAyID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIGsyID0gbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrMSA9IGsyIC0gKGsxIDw8IDEpOworICAgICAgICAgICAgazIgPSAodG1wMiA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgazMgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrMiA9IGszIC0gKGsyIDw8IDEpOworICAgICAgICAgICAgazMgPSAodG1wMiA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgazQgPSBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICBrMyA9IGs0IC0gKGszIDw8IDEpOworICAgICAgICAgICAgdG1wID0gKigoSW50KikoY3VyICsgNCkpOyAgIC8qIGFub3RoZXIgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIHRtcDIgPSAqKChJbnQqKShwcmVkICsgNCkpOworICAgICAgICAgICAgazQgPSB0bXAyICYgMHhGRjsKKyAgICAgICAgICAgIGs1ID0gbWFzayAmICh0bXAgPDwgMSk7CisgICAgICAgICAgICBrNCA9IGs1IC0gKGs0IDw8IDEpOworICAgICAgICAgICAgazUgPSAodG1wMiA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBrNiA9IG1hc2sgJiAodG1wID4+IDcpOworICAgICAgICAgICAgazUgPSBrNiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGs2ID0gKHRtcDIgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIGs3ID0gbWFzayAmICh0bXAgPj4gMTUpOworICAgICAgICAgICAgazYgPSBrNyAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGs3ID0gKHRtcDIgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGs3ID0gdG1wIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgY3VyICs9IHdpZHRoOworICAgICAgICAgICAgcHJlZCArPSAxNjsKKworICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBkc3RbMF0gPSBrMDsKKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNzI0KGsxMiwgazIsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazIgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgZHN0WzJdID0gazI7ICAgICAgICAvKiBjb2wuIDIgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazAgPSBrNCAtIGs2OworCisgICAgICAgICAgICBrMSA9IG1sYTM5MihrMCwgazE0LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTU1NChrNCwgazEyLCBrMSk7CisgICAgICAgICAgICBrMSA9IG1sYTEzMzgoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNCA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs1OworICAgICAgICAgICAgazcgPSBrNyAtIGs0OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgZHN0WzFdID0gazU7ICAgICAgICAvKiBjb2wuIDEgKi8KKyAgICAgICAgICAgIGRzdFszXSA9IGs3OyAgICAgICAgLyogY29sLiAzICovCisgICAgICAgICAgICBkc3QgKz0gODsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZHN0IDwgb3V0KTsKKworICAgICAgICBvdXQgLT0gNjQ7CisgICAgICAgIGRzdCA9IG91dCArIDQ7CisKKyAgICAgICAgLyogIFZlcnRpY2FsIEJsb2NrIExvb3AgICovCisgICAgICAgIGRvICAvKiBWZXJ0aWNhbCA4eERDVCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGswID0gb3V0WzBdOworICAgICAgICAgICAgazEgPSBvdXRbOF07CisgICAgICAgICAgICBrMiA9IG91dFsxNl07CisgICAgICAgICAgICBrMyA9IG91dFsyNF07CisgICAgICAgICAgICBrNCA9IG91dFszMl07CisgICAgICAgICAgICBrNSA9IG91dFs0MF07CisgICAgICAgICAgICBrNiA9IG91dFs0OF07CisgICAgICAgICAgICBrNyA9IG91dFs1Nl07CisKKyAgICAgICAgICAgIGFic19zdW0gPSBzdW1fYWJzKGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNyk7CisKKyAgICAgICAgICAgIGlmIChhYnNfc3VtIDwgQ29sVGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0WzBdID0gMHg3ZmZmOworICAgICAgICAgICAgICAgIG91dCsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBvdXRbMF0gPSBrMDsgICAvKiByb3cgMCAqLworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE3MjQoazEyLCBrMiwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrMiA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbMTZdID0gazI7ICAgICAgICAgICAvKiByb3cgMiAqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMCA9IGs0IC0gazY7CisKKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGswLCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNTU0KGs0LCBrMTIsIGsxKTsKKyAgICAgICAgICAgIGsxID0gbWxhMTMzOChrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs0ID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazU7CisgICAgICAgICAgICBrNyA9IGs3IC0gazQgOworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgb3V0WzI0XSA9IGs3IDsgICAgICAvKiByb3cgMyAqLworICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLworICAgICAgICAgICAgb3V0Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICBGdW5jdGlvbjogICBCbG9jazJ4MkRDVF9BQU53U3ViCisgICAgICAgIERhdGU6ICAgICAgIDcvMzEvMDEKKyAgICAgICAgSW5wdXQ6CisgICAgICAgIE91dHB1dDogICAgIG91dFs2NF0gPT0+IG5leHQgYmxvY2sKKyAgICAgICAgUHVycG9zZTogICAgRG8gc3VidHJhY3Rpb24gZm9yIHplcm8gTVYgZmlyc3QgYmVmb3JlIDJ4MiBEQ1QKKyAgICAgICAgTW9kaWZpZWQ6CisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAgIFZvaWQgQmxvY2syeDJEQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJlZCwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgU2hvcnQgKmRzdDsKKyAgICAgICAgcmVnaXN0ZXIgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IHJvdW5kOworICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKKyAgICAgICAgSW50IGsxNCA9IDB4MDE4ODAzQjI7CisgICAgICAgIEludCBtYXNrOworICAgICAgICBJbnQgdG1wLCB0bXAyOworICAgICAgICBJbnQgYWJzX3N1bTsKKyAgICAgICAgSW50IENvbFRoOworCisgICAgICAgIGRzdCA9IG91dCArIDY0IDsKKyAgICAgICAgQ29sVGggPSAqZHN0OworICAgICAgICBvdXQgKz0gMTI4OworICAgICAgICByb3VuZCA9IDEgPDwgKEZEQ1RfU0hJRlQgLSAxKTsKKworICAgICAgICBkbyAgLyogZmRjdF9uZXh0cm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFzc3VtaW5nIHRoZSBibG9jayBpcyB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgICAgIG1hc2sgPSAweDFGRTsKKyAgICAgICAgICAgIHRtcCA9ICooKEludCopIGN1cik7ICAgIC8qIGNvbnRhaW5zIDQgcGl4ZWxzICovCisgICAgICAgICAgICB0bXAyID0gKigoSW50KikgcHJlZCk7IC8qIHByZWRpY3Rpb24gNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGswID0gdG1wMiAmIDB4RkY7CisgICAgICAgICAgICBrMSA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazAgPSBrMSAtIChrMCA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gKHRtcDIgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgazIgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGsxID0gazIgLSAoazEgPDwgMSk7CisgICAgICAgICAgICBrMiA9ICh0bXAyID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBrMyA9IG1hc2sgJiAodG1wID4+IDE1KTsKKyAgICAgICAgICAgIGsyID0gazMgLSAoazIgPDwgMSk7CisgICAgICAgICAgICBrMyA9ICh0bXAyID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBrNCA9IG1hc2sgJiAodG1wID4+IDIzKTsKKyAgICAgICAgICAgIGszID0gazQgLSAoazMgPDwgMSk7CisgICAgICAgICAgICB0bXAgPSAqKChJbnQqKShjdXIgKyA0KSk7ICAgLyogYW5vdGhlciA0IHBpeGVscyAqLworICAgICAgICAgICAgdG1wMiA9ICooKEludCopKHByZWQgKyA0KSk7CisgICAgICAgICAgICBrNCA9IHRtcDIgJiAweEZGOworICAgICAgICAgICAgazUgPSBtYXNrICYgKHRtcCA8PCAxKTsKKyAgICAgICAgICAgIGs0ID0gazUgLSAoazQgPDwgMSk7CisgICAgICAgICAgICBrNSA9ICh0bXAyID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIGs2ID0gbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrNSA9IGs2IC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazYgPSAodG1wMiA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgazcgPSBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrNiA9IGs3IC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazcgPSAodG1wMiA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgdG1wID0gbWFzayAmICh0bXAgPj4gMjMpOworICAgICAgICAgICAgazcgPSB0bXAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisgICAgICAgICAgICBwcmVkICs9IDE2OworCisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIGRzdFswXSA9IGswOworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGs0LCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGsxID0gbWxhOTQ2KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgZHN0WzFdID0gazU7CisgICAgICAgICAgICBkc3QgKz0gODsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZHN0IDwgb3V0KTsKKyAgICAgICAgb3V0IC09IDY0OworICAgICAgICBkc3QgPSBvdXQgKyAyOworICAgICAgICAvKiAgVmVydGljYWwgQmxvY2sgTG9vcCAgKi8KKyAgICAgICAgZG8gIC8qIFZlcnRpY2FsIDh4RENUIGxvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgazAgPSBvdXRbMF07CisgICAgICAgICAgICBrMSA9IG91dFs4XTsKKyAgICAgICAgICAgIGsyID0gb3V0WzE2XTsKKyAgICAgICAgICAgIGszID0gb3V0WzI0XTsKKyAgICAgICAgICAgIGs0ID0gb3V0WzMyXTsKKyAgICAgICAgICAgIGs1ID0gb3V0WzQwXTsKKyAgICAgICAgICAgIGs2ID0gb3V0WzQ4XTsKKyAgICAgICAgICAgIGs3ID0gb3V0WzU2XTsKKworICAgICAgICAgICAgYWJzX3N1bSA9IHN1bV9hYnMoazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3KTsKKworICAgICAgICAgICAgaWYgKGFic19zdW0gPCBDb2xUaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSAweDdmZmY7CisgICAgICAgICAgICAgICAgb3V0Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIG91dFswXSA9IGswOyAgICAgICAgLyogcm93IDAgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMSA9IG1sYTM5MihrNCwgazE0LCByb3VuZCk7CisgICAgICAgICAgICBrMSA9IG1sYTk0NihrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFs4XSA9IGs1IDsgICAgICAgLyogcm93IDEgKi8KKyAgICAgICAgICAgIG91dCsrOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgoVUludClvdXQgPCAoVUludClkc3QpIDsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgRnVuY3Rpb246ICAgQmxvY2tEQ1RfQUFOSW50cmEKKyAgICAgICAgRGF0ZTogICAgICAgOC85LzAxCisgICAgICAgIElucHV0OiAgICAgIHJlYworICAgICAgICBPdXRwdXQ6ICAgICBvdXRbNjRdID09PiBuZXh0IGJsb2NrCisgICAgICAgIFB1cnBvc2U6ICAgIElucHV0IGRpcmVjdGx5IGZyb20gcmVjIGZyYW1lLgorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIFZvaWQgQmxvY2tEQ1RfQUFOSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MiwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgU2hvcnQgKmRzdDsKKyAgICAgICAgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IHJvdW5kOworICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKKyAgICAgICAgSW50IGsxNCA9IDB4MDE4ODA1M0E7CisgICAgICAgIEludCBhYnNfc3VtOworICAgICAgICBJbnQgbWFzazsKKyAgICAgICAgSW50ICpjdXJJbnQsIHRtcDsKKyAgICAgICAgSW50IENvbFRoOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhkdW1teTIpOworCisgICAgICAgIGRzdCA9IG91dCArIDY0IDsKKyAgICAgICAgQ29sVGggPSAqZHN0OworICAgICAgICBvdXQgKz0gMTI4OworICAgICAgICByb3VuZCA9IDEgPDwgKEZEQ1RfU0hJRlQgLSAxKTsKKworICAgICAgICBkbyAgLyogZmRjdF9uZXh0cm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2sgPSAweDFGRTsKKyAgICAgICAgICAgIGN1ckludCA9IChJbnQqKSBjdXI7CisgICAgICAgICAgICB0bXAgPSBjdXJJbnRbMF07ICAgIC8qIGNvbnRhaW5zIDQgcGl4ZWxzICovCisgICAgICAgICAgICBrMCA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazEgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGsyID0gbWFzayAmICh0bXAgPj4gMTUpOworICAgICAgICAgICAgazMgPSBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICB0bXAgPSBjdXJJbnRbMV07ICAgIC8qIGFub3RoZXIgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGs0ID0gIG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazUgPSAgbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrNiA9ICBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrNyA9ICBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICBrMSA9IGswIC0gKGsxIDw8IDEpOworICAgICAgICAgICAgLyoqKioqKioqKiovCisgICAgICAgICAgICBkc3RbMF0gPSBrMDsKKyAgICAgICAgICAgIGRzdFs0XSA9IGsxOyAvKiBjb2wuIDQgKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMiAqLworICAgICAgICAgICAgazQgPSBrNCArIGs1OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazYgPSBrNiArIGs3OworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgLyogTVVMMkMgazIsazUsNzI0LEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBiZWNvbWUgc2NyYXRjaCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIGsxID0gbWxhNzI0KGsxMiwgazUsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNzI0KGsxMiwgazIsIHJvdW5kKTsKKworICAgICAgICAgICAgazUgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazIgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazIgPSBrMiArIGszOworICAgICAgICAgICAgazMgPSAoazMgPDwgMSkgLSBrMjsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIGRzdFsyXSA9IGsyOyAgICAgICAgLyogY29sLiAyICovCisgICAgICAgICAgICBrMyA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLiA2ICovCisgICAgICAgICAgICBkc3RbNl0gPSBrMzsgLyogY29sLiA2ICovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGswID0gazQgLSBrNjsKKworICAgICAgICAgICAgazEgPSBtbGEzOTIoazAsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE1NTQoazQsIGsxMiwgazEpOworICAgICAgICAgICAgazEgPSBtbGExMzM4KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazQgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNTsKKyAgICAgICAgICAgIGs0ID0gazQgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazQ7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNCA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLjUgKi8KKyAgICAgICAgICAgIGs2ID0gazUgLSAoazYgPDwgMSk7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbNV0gPSBrNDsgICAgLyogY29sLiA1ICovCisgICAgICAgICAgICBrNiA8PD0gMjsgICAgICAgLyogc2NhbGUgdXAgY29sLiA3ICovCisgICAgICAgICAgICBkc3RbMV0gPSBrNTsgICAgLyogY29sLiAxICovCisgICAgICAgICAgICBkc3RbN10gPSBrNjsgICAgLyogY29sLiA3ICovCisgICAgICAgICAgICBkc3RbM10gPSBrNzsgICAgLyogY29sLiAzICovCisgICAgICAgICAgICBkc3QgKz0gODsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZHN0IDwgb3V0KTsKKworICAgICAgICBvdXQgLT0gNjQ7CisgICAgICAgIGRzdCA9IG91dCArIDg7CisKKyAgICAgICAgLyogIFZlcnRpY2FsIEJsb2NrIExvb3AgICovCisgICAgICAgIGRvICAvKiBWZXJ0aWNhbCA4eERDVCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGswID0gb3V0WzBdOworICAgICAgICAgICAgazEgPSBvdXRbOF07CisgICAgICAgICAgICBrMiA9IG91dFsxNl07CisgICAgICAgICAgICBrMyA9IG91dFsyNF07CisgICAgICAgICAgICBrNCA9IG91dFszMl07CisgICAgICAgICAgICBrNSA9IG91dFs0MF07CisgICAgICAgICAgICBrNiA9IG91dFs0OF07CisgICAgICAgICAgICBrNyA9IG91dFs1Nl07CisgICAgICAgICAgICAvKiBkZWFkem9uZSB0aHJlc2hvbGRpbmcgZm9yIGNvbHVtbiAqLworCisgICAgICAgICAgICBhYnNfc3VtID0gc3VtX2FicyhrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcpOworCisgICAgICAgICAgICBpZiAoYWJzX3N1bSA8IENvbFRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dFswXSA9IDB4N2ZmZjsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmRjdF8xICovCisgICAgICAgICAgICBrMCA9IGswICsgazc7CisgICAgICAgICAgICBrNyA9IGswIC0gKGs3IDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGs2OworICAgICAgICAgICAgazYgPSBrMSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIGsyID0gazIgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazIgLSAoazUgPDwgMSk7CisgICAgICAgICAgICBrMyA9IGszICsgazQ7CisgICAgICAgICAgICBrNCA9IGszIC0gKGs0IDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazM7CisgICAgICAgICAgICBrMyA9IGswIC0gKGszIDw8IDEpOworICAgICAgICAgICAgazEgPSBrMSArIGsyOworICAgICAgICAgICAgazIgPSBrMSAtIChrMiA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGsxOworICAgICAgICAgICAgazEgPSBrMCAtIChrMSA8PCAxKTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgb3V0WzMyXSA9IGsxOyAvKiByb3cgNCAqLworICAgICAgICAgICAgb3V0WzBdID0gazA7IC8qIHJvdyAwICovCisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTcyNChrMTIsIGsyLCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGsyID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIGszID0gKGszIDw8IDEpIC0gazI7CisgICAgICAgICAgICBrMyA8PD0gMTsgICAgICAgLyogc2NhbGUgdXAgY29sLiA2ICovCisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbNDhdID0gazM7ICAgLyogcm93IDYgKi8KKyAgICAgICAgICAgIG91dFsxNl0gPSBrMjsgICAvKiByb3cgMiAqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMCA9IGs0IC0gazY7CisKKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGswLCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNTU0KGs0LCBrMTIsIGsxKTsKKyAgICAgICAgICAgIGsxID0gbWxhMTMzOChrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs0ID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazU7CisgICAgICAgICAgICBrNCA9IGs0ICsgazc7CisgICAgICAgICAgICBrNyA9IChrNyA8PCAxKSAtIGs0OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgazQgPDw9IDE7ICAgICAgIC8qIHNjYWxlIHVwIGNvbC4gNSAqLworICAgICAgICAgICAgazYgPSBrNSAtIChrNiA8PCAxKTsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFsyNF0gPSBrNyA7ICAgIC8qIHJvdyAzICovCisgICAgICAgICAgICBrNiA8PD0gMjsgICAgICAgLyogc2NhbGUgdXAgY29sLiA3ICovCisgICAgICAgICAgICBvdXRbNTZdID0gazYgOyAgIC8qIHJvdyA3ICovCisgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgIC8qIHJvdyAxICovCisgICAgICAgICAgICBvdXRbNDBdID0gazQgOyAgIC8qIHJvdyA1ICovCisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogIEZ1bmN0aW9uOiAgIEJsb2NrNHg0RENUX0FBTkludHJhCisgICAgICAgIERhdGU6ICAgICAgIDgvOS8wMQorICAgICAgICBJbnB1dDogICAgICBwcmV2CisgICAgICAgIE91dHB1dDogICAgIG91dFs2NF0gPT0+IG5leHQgYmxvY2sKKyAgICAgICAgUHVycG9zZTogICAgSW5wdXQgZGlyZWN0bHkgZnJvbSBwcmV2IGZyYW1lLiBvdXRwdXQgMngyIERDVAorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIFZvaWQgQmxvY2s0eDREQ1RfQUFOSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MiwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgU2hvcnQgKmRzdDsKKyAgICAgICAgcmVnaXN0ZXIgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IHJvdW5kOworICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKKyAgICAgICAgSW50IGsxNCA9IDB4MDE4ODA1M0E7CisgICAgICAgIEludCBtYXNrOworICAgICAgICBJbnQgKmN1ckludCwgdG1wOworICAgICAgICBJbnQgYWJzX3N1bTsKKyAgICAgICAgSW50IENvbFRoOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhkdW1teTIpOworCisgICAgICAgIGRzdCA9IG91dCArIDY0IDsKKyAgICAgICAgQ29sVGggPSAqZHN0OworICAgICAgICBvdXQgKz0gMTI4OworICAgICAgICByb3VuZCA9IDEgPDwgKEZEQ1RfU0hJRlQgLSAxKTsKKworICAgICAgICBkbyAgLyogZmRjdF9uZXh0cm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2sgPSAweDFGRTsKKyAgICAgICAgICAgIGN1ckludCA9IChJbnQqKSBjdXI7CisgICAgICAgICAgICB0bXAgPSBjdXJJbnRbMF07ICAgIC8qIGNvbnRhaW5zIDQgcGl4ZWxzICovCisgICAgICAgICAgICBrMCA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazEgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGsyID0gbWFzayAmICh0bXAgPj4gMTUpOworICAgICAgICAgICAgazMgPSBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICB0bXAgPSBjdXJJbnRbMV07ICAgIC8qIGFub3RoZXIgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGs0ID0gIG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazUgPSAgbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrNiA9ICBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrNyA9ICBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIGRzdFswXSA9IGswOworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE3MjQoazEyLCBrMiwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICBrMiA9IGswID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrMiA9IGsyICsgazM7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMl0gPSBrMjsgICAgICAgIC8qIGNvbC4gMiAqLworICAgICAgICAgICAgLyogZmRjdF8zICovCisgICAgICAgICAgICAvKiBST1RBVEUgazQsazYsMzkyLDk0NiwgRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogYXNzdW1lIEZBU1QgTVVMVElQTFkgKi8KKyAgICAgICAgICAgIC8qIGswLCBrMSBhcmUgb3V0cHV0ICovCisgICAgICAgICAgICBrMCA9IGs0IC0gazY7CisKKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGswLCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGswID0gbWxhNTU0KGs0LCBrMTIsIGsxKTsKKyAgICAgICAgICAgIGsxID0gbWxhMTMzOChrNiwgazE0LCBrMSk7CisKKyAgICAgICAgICAgIGs0ID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGs2ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGs1ID0gazUgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gKGs3IDw8IDEpIC0gazU7CisgICAgICAgICAgICBrNyA9IGs3IC0gazQ7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMV0gPSBrNTsgICAgICAgIC8qIGNvbC4gMSAqLworICAgICAgICAgICAgZHN0WzNdID0gazc7ICAgICAgICAvKiBjb2wuIDMgKi8KKyAgICAgICAgICAgIGRzdCArPSA4OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChkc3QgPCBvdXQpOworCisgICAgICAgIG91dCAtPSA2NDsKKyAgICAgICAgZHN0ID0gb3V0ICsgNDsKKworICAgICAgICAvKiAgVmVydGljYWwgQmxvY2sgTG9vcCAgKi8KKyAgICAgICAgZG8gIC8qIFZlcnRpY2FsIDh4RENUIGxvb3AgKi8KKyAgICAgICAgeworICAgICAgICAgICAgazAgPSBvdXRbMF07CisgICAgICAgICAgICBrMSA9IG91dFs4XTsKKyAgICAgICAgICAgIGsyID0gb3V0WzE2XTsKKyAgICAgICAgICAgIGszID0gb3V0WzI0XTsKKyAgICAgICAgICAgIGs0ID0gb3V0WzMyXTsKKyAgICAgICAgICAgIGs1ID0gb3V0WzQwXTsKKyAgICAgICAgICAgIGs2ID0gb3V0WzQ4XTsKKyAgICAgICAgICAgIGs3ID0gb3V0WzU2XTsKKworICAgICAgICAgICAgYWJzX3N1bSA9IHN1bV9hYnMoazAsIGsxLCBrMiwgazMsIGs0LCBrNSwgazYsIGs3KTsKKworICAgICAgICAgICAgaWYgKGFic19zdW0gPCBDb2xUaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSAweDdmZmY7CisgICAgICAgICAgICAgICAgb3V0Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBmZGN0XzEgKi8KKyAgICAgICAgICAgIGswID0gazAgKyBrNzsKKyAgICAgICAgICAgIGs3ID0gazAgLSAoazcgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazY7CisgICAgICAgICAgICBrNiA9IGsxIC0gKGs2IDw8IDEpOworICAgICAgICAgICAgazIgPSBrMiArIGs1OworICAgICAgICAgICAgazUgPSBrMiAtIChrNSA8PCAxKTsKKyAgICAgICAgICAgIGszID0gazMgKyBrNDsKKyAgICAgICAgICAgIGs0ID0gazMgLSAoazQgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMzsKKyAgICAgICAgICAgIGszID0gazAgLSAoazMgPDwgMSk7CisgICAgICAgICAgICBrMSA9IGsxICsgazI7CisgICAgICAgICAgICBrMiA9IGsxIC0gKGsyIDw8IDEpOworCisgICAgICAgICAgICBrMCA9IGswICsgazE7CisgICAgICAgICAgICAvKioqKioqKioqKi8KKyAgICAgICAgICAgIG91dFswXSA9IGswOyAgIC8qIHJvdyAwICovCisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisgICAgICAgICAgICBrMCA9IG1sYTcyNChrMTIsIGsyLCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIGsyID0gazAgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGsyID0gazIgKyBrMzsKKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIG91dFsxNl0gPSBrMjsgICAgICAgICAgIC8qIHJvdyAyICovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGswID0gazQgLSBrNjsKKworICAgICAgICAgICAgazEgPSBtbGEzOTIoazAsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazAgPSBtbGE1NTQoazQsIGsxMiwgazEpOworICAgICAgICAgICAgazEgPSBtbGExMzM4KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazQgPSBrMCA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazcgPSAoazcgPDwgMSkgLSBrNTsKKyAgICAgICAgICAgIGs3ID0gazcgLSBrNCA7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBvdXRbMjRdID0gazcgOyAgICAgIC8qIHJvdyAzICovCisgICAgICAgICAgICBvdXRbOF0gPSBrNSA7ICAgICAgIC8qIHJvdyAxICovCisgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoKFVJbnQpb3V0IDwgKFVJbnQpZHN0KSA7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogIEZ1bmN0aW9uOiAgIEJsb2NrMngyRENUX0FBTkludHJhCisgICAgICAgIERhdGU6ICAgICAgIDgvOS8wMQorICAgICAgICBJbnB1dDogICAgICBwcmV2CisgICAgICAgIE91dHB1dDogICAgIG91dFs2NF0gPT0+IG5leHQgYmxvY2sKKyAgICAgICAgUHVycG9zZTogICAgSW5wdXQgZGlyZWN0bHkgZnJvbSBwcmV2IGZyYW1lLiBvdXRwdXQgMngyIERDVAorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIFZvaWQgQmxvY2syeDJEQ1RfQUFOSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MiwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgU2hvcnQgKmRzdDsKKyAgICAgICAgcmVnaXN0ZXIgSW50IGswLCBrMSwgazIsIGszLCBrNCwgazUsIGs2LCBrNzsKKyAgICAgICAgSW50IHJvdW5kOworICAgICAgICBJbnQgazEyID0gMHgwMjJBMDJENDsKKyAgICAgICAgSW50IGsxNCA9IDB4MDE4ODAzQjI7CisgICAgICAgIEludCBtYXNrOworICAgICAgICBJbnQgKmN1ckludCwgdG1wOworICAgICAgICBJbnQgYWJzX3N1bTsKKyAgICAgICAgSW50IENvbFRoOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhkdW1teTIpOworCisgICAgICAgIGRzdCA9IG91dCArIDY0IDsKKyAgICAgICAgQ29sVGggPSAqZHN0OworICAgICAgICBvdXQgKz0gMTI4OworICAgICAgICByb3VuZCA9IDEgPDwgKEZEQ1RfU0hJRlQgLSAxKTsKKworICAgICAgICBkbyAgLyogZmRjdF9uZXh0cm93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2sgPSAweDFGRTsKKyAgICAgICAgICAgIGN1ckludCA9IChJbnQqKSBjdXI7CisgICAgICAgICAgICB0bXAgPSBjdXJJbnRbMF07ICAgIC8qIGNvbnRhaW5zIDQgcGl4ZWxzICovCisgICAgICAgICAgICBrMCA9IG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazEgPSBtYXNrICYgKHRtcCA+PiA3KTsKKyAgICAgICAgICAgIGsyID0gbWFzayAmICh0bXAgPj4gMTUpOworICAgICAgICAgICAgazMgPSBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICB0bXAgPSBjdXJJbnRbMV07ICAgIC8qIGFub3RoZXIgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgIGs0ID0gIG1hc2sgJiAodG1wIDw8IDEpOworICAgICAgICAgICAgazUgPSAgbWFzayAmICh0bXAgPj4gNyk7CisgICAgICAgICAgICBrNiA9ICBtYXNrICYgKHRtcCA+PiAxNSk7CisgICAgICAgICAgICBrNyA9ICBtYXNrICYgKHRtcCA+PiAyMyk7CisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisKKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgZHN0WzBdID0gazA7CisgICAgICAgICAgICAvKiBmZGN0XzIgKi8KKyAgICAgICAgICAgIGs0ID0gazQgKyBrNTsKKyAgICAgICAgICAgIGs1ID0gazUgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazYgKyBrNzsKKyAgICAgICAgICAgIC8qIE1VTDJDIGsyLGs1LDcyNCxGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBrMCwgazEgYmVjb21lIHNjcmF0Y2ggKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICBrMSA9IG1sYTcyNChrMTIsIGs1LCByb3VuZCk7CisKKyAgICAgICAgICAgIGs1ID0gazEgPj4gRkRDVF9TSElGVDsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qKioqKioqKi8KKyAgICAgICAgICAgIC8qIGZkY3RfMyAqLworICAgICAgICAgICAgLyogUk9UQVRFIGs0LGs2LDM5Miw5NDYsIEZEQ1RfU0hJRlQgKi8KKyAgICAgICAgICAgIC8qIGFzc3VtZSBGQVNUIE1VTFRJUExZICovCisgICAgICAgICAgICAvKiBrMCwgazEgYXJlIG91dHB1dCAqLworICAgICAgICAgICAgazEgPSBtbGEzOTIoazQsIGsxNCwgcm91bmQpOworICAgICAgICAgICAgazEgPSBtbGE5NDYoazYsIGsxNCwgazEpOworCisgICAgICAgICAgICBrNiA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBrNSA9IGs1ICsgazc7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICBkc3RbMV0gPSBrNTsKKyAgICAgICAgICAgIGRzdCArPSA4OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChkc3QgPCBvdXQpOworICAgICAgICBvdXQgLT0gNjQ7CisgICAgICAgIGRzdCA9IG91dCArIDI7CisgICAgICAgIC8qICBWZXJ0aWNhbCBCbG9jayBMb29wICAqLworICAgICAgICBkbyAgLyogVmVydGljYWwgOHhEQ1QgbG9vcCAqLworICAgICAgICB7CisgICAgICAgICAgICBrMCA9IG91dFswXTsKKyAgICAgICAgICAgIGsxID0gb3V0WzhdOworICAgICAgICAgICAgazIgPSBvdXRbMTZdOworICAgICAgICAgICAgazMgPSBvdXRbMjRdOworICAgICAgICAgICAgazQgPSBvdXRbMzJdOworICAgICAgICAgICAgazUgPSBvdXRbNDBdOworICAgICAgICAgICAgazYgPSBvdXRbNDhdOworICAgICAgICAgICAgazcgPSBvdXRbNTZdOworCisgICAgICAgICAgICBhYnNfc3VtID0gc3VtX2FicyhrMCwgazEsIGsyLCBrMywgazQsIGs1LCBrNiwgazcpOworCisgICAgICAgICAgICBpZiAoYWJzX3N1bSA8IENvbFRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dFswXSA9IDB4N2ZmZjsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGZkY3RfMSAqLworICAgICAgICAgICAgazAgPSBrMCArIGs3OworICAgICAgICAgICAgazcgPSBrMCAtIChrNyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrNjsKKyAgICAgICAgICAgIGs2ID0gazEgLSAoazYgPDwgMSk7CisgICAgICAgICAgICBrMiA9IGsyICsgazU7CisgICAgICAgICAgICBrNSA9IGsyIC0gKGs1IDw8IDEpOworICAgICAgICAgICAgazMgPSBrMyArIGs0OworICAgICAgICAgICAgazQgPSBrMyAtIChrNCA8PCAxKTsKKworICAgICAgICAgICAgazAgPSBrMCArIGszOworICAgICAgICAgICAgazMgPSBrMCAtIChrMyA8PCAxKTsKKyAgICAgICAgICAgIGsxID0gazEgKyBrMjsKKyAgICAgICAgICAgIGsyID0gazEgLSAoazIgPDwgMSk7CisKKyAgICAgICAgICAgIGswID0gazAgKyBrMTsKKyAgICAgICAgICAgIC8qKioqKioqKioqLworICAgICAgICAgICAgb3V0WzBdID0gazA7ICAgICAgICAvKiByb3cgMCAqLworICAgICAgICAgICAgLyogZmRjdF8yICovCisgICAgICAgICAgICBrNCA9IGs0ICsgazU7CisgICAgICAgICAgICBrNSA9IGs1ICsgazY7CisgICAgICAgICAgICBrNiA9IGs2ICsgazc7CisgICAgICAgICAgICAvKiBNVUwyQyBrMixrNSw3MjQsRkRDVF9TSElGVCAqLworICAgICAgICAgICAgLyogazAsIGsxIGJlY29tZSBzY3JhdGNoICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgazEgPSBtbGE3MjQoazEyLCBrNSwgcm91bmQpOworCisgICAgICAgICAgICBrNSA9IGsxID4+IEZEQ1RfU0hJRlQ7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKioqKioqKiovCisgICAgICAgICAgICAvKiBmZGN0XzMgKi8KKyAgICAgICAgICAgIC8qIFJPVEFURSBrNCxrNiwzOTIsOTQ2LCBGRENUX1NISUZUICovCisgICAgICAgICAgICAvKiBhc3N1bWUgRkFTVCBNVUxUSVBMWSAqLworICAgICAgICAgICAgLyogazAsIGsxIGFyZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIGsxID0gbWxhMzkyKGs0LCBrMTQsIHJvdW5kKTsKKyAgICAgICAgICAgIGsxID0gbWxhOTQ2KGs2LCBrMTQsIGsxKTsKKworICAgICAgICAgICAgazYgPSBrMSA+PiBGRENUX1NISUZUOworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgazUgPSBrNSArIGs3OworICAgICAgICAgICAgazUgPSBrNSArIGs2OworICAgICAgICAgICAgLyoqKioqKioqLworICAgICAgICAgICAgb3V0WzhdID0gazUgOyAgICAgICAvKiByb3cgMSAqLworICAgICAgICAgICAgb3V0Kys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKChVSW50KW91dCA8IChVSW50KWRzdCkgOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgRnVuY3Rpb246ICAgQmxvY2sxeDFEQ1R3U3ViCisgICAgICAgIERhdGU6ICAgICAgIDgvOS8wMQorICAgICAgICBJbnB1dDogICAgICBibG9jaworICAgICAgICBPdXRwdXQ6ICAgICB5CisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgREMgdmFsdWUgb25seQorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2b2lkIEJsb2NrMXgxRENUd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJlZCwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgVUNoYXIgKmVuZDsKKyAgICAgICAgSW50IHRlbXAgPSAwOworICAgICAgICBJbnQgb2Zmc2V0MjsKKworICAgICAgICBvZmZzZXQyID0gd2lkdGggLSA4OworICAgICAgICBlbmQgPSBwcmVkICsgKDE2IDw8IDMpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICB0ZW1wICs9ICgqY3VyKysgLSAqcHJlZCsrKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCpjdXIrKyAtICpwcmVkKyspOworICAgICAgICAgICAgdGVtcCArPSAoKmN1cisrIC0gKnByZWQrKyk7CisgICAgICAgICAgICB0ZW1wICs9ICgqY3VyKysgLSAqcHJlZCsrKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCpjdXIrKyAtICpwcmVkKyspOworICAgICAgICAgICAgdGVtcCArPSAoKmN1cisrIC0gKnByZWQrKyk7CisgICAgICAgICAgICB0ZW1wICs9ICgqY3VyKysgLSAqcHJlZCsrKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCpjdXIrKyAtICpwcmVkKyspOworICAgICAgICAgICAgY3VyICs9IG9mZnNldDI7CisgICAgICAgICAgICBwcmVkICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHByZWQgPCBlbmQpIDsKKworICAgICAgICBvdXRbMV0gPSBvdXRbMl0gPSBvdXRbM10gPSBvdXRbNF0gPSBvdXRbNV0gPSBvdXRbNl0gPSBvdXRbN10gPSAwOworICAgICAgICBvdXRbMF0gPSB0ZW1wID4+IDM7CisKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogIEZ1bmN0aW9uOiAgIEJsb2NrMXgxRENUSW50cmEKKyAgICAgICAgRGF0ZTogICAgICAgOC85LzAxCisgICAgICAgIElucHV0OiAgICAgIHByZXYKKyAgICAgICAgT3V0cHV0OiAgICAgb3V0CisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgREMgdmFsdWUgb25seQorICAgICAgICBNb2RpZmllZDoKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2b2lkIEJsb2NrMXgxRENUSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MiwgSW50IHdpZHRoKQorICAgIHsKKyAgICAgICAgVUNoYXIgKmVuZDsKKyAgICAgICAgSW50IHRlbXAgPSAwOworICAgICAgICBVTG9uZyB3b3JkOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhkdW1teTIpOworCisgICAgICAgIGVuZCA9IGN1ciArICh3aWR0aCA8PCAzKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgd29yZCA9ICooKFVMb25nKiljdXIpOworICAgICAgICAgICAgdGVtcCArPSAod29yZCA+PiAyNCk7CisgICAgICAgICAgICB0ZW1wICs9ICgod29yZCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKCh3b3JkID4+IDgpICYgMHhGRik7CisgICAgICAgICAgICB0ZW1wICs9ICh3b3JkICYgMHhGRik7CisKKyAgICAgICAgICAgIHdvcmQgPSAqKChVTG9uZyopKGN1ciArIDQpKTsKKyAgICAgICAgICAgIHRlbXAgKz0gKHdvcmQgPj4gMjQpOworICAgICAgICAgICAgdGVtcCArPSAoKHdvcmQgPj4gMTYpICYgMHhGRik7CisgICAgICAgICAgICB0ZW1wICs9ICgod29yZCA+PiA4KSAmIDB4RkYpOworICAgICAgICAgICAgdGVtcCArPSAod29yZCAmIDB4RkYpOworCisgICAgICAgICAgICBjdXIgKz0gd2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGN1ciA8IGVuZCkgOworCisgICAgICAgIG91dFsxXSA9IG91dFsyXSA9IG91dFszXSA9IG91dFs0XSA9IG91dFs1XSA9IG91dFs2XSA9IG91dFs3XSA9IDA7CisgICAgICAgIG91dFswXSA9IHRlbXAgPj4gMzsKKworICAgICAgICByZXR1cm4gOworICAgIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNlYjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9EQ1RfSF8KKyNkZWZpbmUgX0RDVF9IXworCitjb25zdCBzdGF0aWMgSW50IENvbFRoSW50ZXJbMzJdID0gezAsIDB4MUMsIDB4NEMsIDB4NkMsIDB4OUMsIDB4QkMsIDB4RUMsIDB4MTBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEzQywgMHgxNUMsIDB4MThDLCAweDFBQywgMHgxREMsIDB4MUZDLCAweDIyQywgMHgyNEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjdDLCAweDI5QywgMHgyQ0MsIDB4MkVDLCAweDMxQywgMHgzM0MsIDB4MzZDLCAweDM4QywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQkMsIDB4M0RDLCAweDQwQywgMHg0MkMsIDB4NDVDLCAweDQ3QywgMHg0QUMsIDB4NENDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworY29uc3Qgc3RhdGljIEludCBDb2xUaEludHJhWzMyXSA9IHswLCAweDFDLCAweDNDLCAweDVDLCAweDdDLCAweDlDLCAweEJDLCAweERDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZDLCAweDExQywgMHgxM0MsIDB4MTVDLCAweDE3QywgMHgxOUMsIDB4MUJDLCAweDFEQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRkMsIDB4MjFDLCAweDIzQywgMHgyNUMsIDB4MjdDLCAweDI5QywgMHgyQkMsIDB4MkRDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDJGQywgMHgzMUMsIDB4MzNDLCAweDM1QywgMHgzN0MsIDB4MzlDLCAweDNCQywgMHgzREMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKiogSURDVCBwYXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgaW1hc2tbOF0gPSB7MTI4LCA2NCwgMzIsIDE2LCA4LCA0LCAyLCAxfTsKK2NvbnN0IHN0YXRpYyB1bnNpZ25lZCBjaGFyIG1hc2tbOF0gPSB7MHg3ZiwgMHhiZiwgMHhkZiwgMHhlZiwgMHhmNywgMHhmYiwgMHhmZCwgMHhmZX07CisKKyNkZWZpbmUgVzEgMjg0MSAgICAgICAgICAgICAgICAgLyogMjA0OCpzcXJ0KDIpKmNvcygxKnBpLzE2KSAqLworI2RlZmluZSBXMiAyNjc2ICAgICAgICAgICAgICAgICAvKiAyMDQ4KnNxcnQoMikqY29zKDIqcGkvMTYpICovCisjZGVmaW5lIFczIDI0MDggICAgICAgICAgICAgICAgIC8qIDIwNDgqc3FydCgyKSpjb3MoMypwaS8xNikgKi8KKyNkZWZpbmUgVzUgMTYwOSAgICAgICAgICAgICAgICAgLyogMjA0OCpzcXJ0KDIpKmNvcyg1KnBpLzE2KSAqLworI2RlZmluZSBXNiAxMTA4ICAgICAgICAgICAgICAgICAvKiAyMDQ4KnNxcnQoMikqY29zKDYqcGkvMTYpICovCisjZGVmaW5lIFc3IDU2NSAgICAgICAgICAgICAgICAgIC8qIDIwNDgqc3FydCgyKSpjb3MoNypwaS8xNikgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworICAgIC8qIFJlZHVjZWQgaW5wdXQgSURDVCAqLworICAgIHZvaWQgaWRjdF9jb2wwKFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2wxKFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2wyKFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2wzKFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2w0KFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2wweDQwKFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2wweDIwKFNob3J0ICpibGspOworICAgIHZvaWQgaWRjdF9jb2wweDEwKFNob3J0ICpibGspOworCisgICAgdm9pZCBpZGN0X3Jvd0ludGVyKFNob3J0ICpzcmNlLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MUludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzJJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3czSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93NEludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzB4NDBJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDIwSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHgxMEludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzB4Q0NJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3dJbnRyYShTaG9ydCAqc3JjZSwgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzFJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cySW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93M0ludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzRJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweDQwSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHgyMEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCk7CisgICAgdm9pZCBpZGN0X3JvdzB4MTBJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpOworICAgIHZvaWQgaWRjdF9yb3cweENDSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93em12KFNob3J0ICpzcmNlLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MXptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MnptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93M3ptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93NHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHg0MHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHgyMHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHgxMHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICB2b2lkIGlkY3Rfcm93MHhDQ3ptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBMb29rLXVwIHRhYmxlIG1hcHBpbmcgdG8gUklEQ1QgZnJvbSBiaXRtYXAgKi8KKyNpZmRlZiBTTUFMTF9EQ1QKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0Y29sVkNBWzE2XSkoU2hvcnQqKSA9Cit7CisgICAgJmlkY3RfY29sMCwgJmlkY3RfY29sNCwgJmlkY3RfY29sMywgJmlkY3RfY29sNCwKKyAgICAmaWRjdF9jb2wyLCAmaWRjdF9jb2w0LCAmaWRjdF9jb2wzLCAmaWRjdF9jb2w0LAorICAgICZpZGN0X2NvbDEsICZpZGN0X2NvbDQsICZpZGN0X2NvbDMsICZpZGN0X2NvbDQsCisgICAgJmlkY3RfY29sMiwgJmlkY3RfY29sNCwgJmlkY3RfY29sMywgJmlkY3RfY29sNAorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBSW50ZXJbMTZdKShTaG9ydCosIFVDaGFyKiwgSW50KSA9Cit7CisgICAgJmlkY3Rfcm93MEludGVyLCAmaWRjdF9yb3c0SW50ZXIsICZpZGN0X3JvdzNJbnRlciwgJmlkY3Rfcm93NEludGVyLAorICAgICZpZGN0X3JvdzJJbnRlciwgJmlkY3Rfcm93NEludGVyLCAmaWRjdF9yb3czSW50ZXIsICZpZGN0X3JvdzRJbnRlciwKKyAgICAmaWRjdF9yb3cxSW50ZXIsICZpZGN0X3JvdzRJbnRlciwgJmlkY3Rfcm93M0ludGVyLCAmaWRjdF9yb3c0SW50ZXIsCisgICAgJmlkY3Rfcm93MkludGVyLCAmaWRjdF9yb3c0SW50ZXIsICZpZGN0X3JvdzNJbnRlciwgJmlkY3Rfcm93NEludGVyCit9OworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0F6bXZbMTZdKShTaG9ydCosIFVDaGFyKiwgVUNoYXIqLCBJbnQpID0KK3sKKyAgICAmaWRjdF9yb3cwem12LCAmaWRjdF9yb3c0em12LCAmaWRjdF9yb3czem12LCAmaWRjdF9yb3c0em12LAorICAgICZpZGN0X3JvdzJ6bXYsICZpZGN0X3JvdzR6bXYsICZpZGN0X3JvdzN6bXYsICZpZGN0X3JvdzR6bXYsCisgICAgJmlkY3Rfcm93MXptdiwgJmlkY3Rfcm93NHptdiwgJmlkY3Rfcm93M3ptdiwgJmlkY3Rfcm93NHptdiwKKyAgICAmaWRjdF9yb3cyem12LCAmaWRjdF9yb3c0em12LCAmaWRjdF9yb3czem12LCAmaWRjdF9yb3c0em12Cit9OworCisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQUludHJhWzE2XSkoU2hvcnQqLCBVQ2hhciosIEludCkgPQoreworICAgICZpZGN0X3JvdzBJbnRyYSwgJmlkY3Rfcm93NEludHJhLCAmaWRjdF9yb3czSW50cmEsICZpZGN0X3JvdzRJbnRyYSwKKyAgICAmaWRjdF9yb3cySW50cmEsICZpZGN0X3JvdzRJbnRyYSwgJmlkY3Rfcm93M0ludHJhLCAmaWRjdF9yb3c0SW50cmEsCisgICAgJmlkY3Rfcm93MUludHJhLCAmaWRjdF9yb3c0SW50cmEsICZpZGN0X3JvdzNJbnRyYSwgJmlkY3Rfcm93NEludHJhLAorICAgICZpZGN0X3JvdzJJbnRyYSwgJmlkY3Rfcm93NEludHJhLCAmaWRjdF9yb3czSW50cmEsICZpZGN0X3JvdzRJbnRyYQorfTsKKworI2Vsc2UgLyogU01BTExfRENUICovCisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdGNvbFZDQVsxNl0pKFNob3J0KikgPQoreworICAgICZpZGN0X2NvbDAsICZpZGN0X2NvbDB4MTAsICZpZGN0X2NvbDB4MjAsICZpZGN0X2NvbDQsCisgICAgJmlkY3RfY29sMHg0MCwgJmlkY3RfY29sNCwgJmlkY3RfY29sMywgJmlkY3RfY29sNCwKKyAgICAmaWRjdF9jb2wxLCAmaWRjdF9jb2w0LCAmaWRjdF9jb2wzLCAmaWRjdF9jb2w0LAorICAgICZpZGN0X2NvbDIsICZpZGN0X2NvbDQsICZpZGN0X2NvbDMsICZpZGN0X2NvbDQKK307CisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQUludGVyWzE2XSkoU2hvcnQqLCBVQ2hhciosIEludCkgPQoreworICAgICZpZGN0X3JvdzBJbnRlciwgJmlkY3Rfcm93MHgxMEludGVyLCAmaWRjdF9yb3cweDIwSW50ZXIsICZpZGN0X3JvdzRJbnRlciwKKyAgICAmaWRjdF9yb3cweDQwSW50ZXIsICZpZGN0X3JvdzRJbnRlciwgJmlkY3Rfcm93M0ludGVyLCAmaWRjdF9yb3c0SW50ZXIsCisgICAgJmlkY3Rfcm93MUludGVyLCAmaWRjdF9yb3c0SW50ZXIsICZpZGN0X3JvdzNJbnRlciwgJmlkY3Rfcm93NEludGVyLAorICAgICZpZGN0X3JvdzJJbnRlciwgJmlkY3Rfcm93NEludGVyLCAmaWRjdF9yb3czSW50ZXIsICZpZGN0X3JvdzRJbnRlcgorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBem12WzE2XSkoU2hvcnQqLCBVQ2hhciosIFVDaGFyKiwgSW50KSA9Cit7CisgICAgJmlkY3Rfcm93MHptdiwgJmlkY3Rfcm93MHgxMHptdiwgJmlkY3Rfcm93MHgyMHptdiwgJmlkY3Rfcm93NHptdiwKKyAgICAmaWRjdF9yb3cweDQwem12LCAmaWRjdF9yb3c0em12LCAmaWRjdF9yb3czem12LCAmaWRjdF9yb3c0em12LAorICAgICZpZGN0X3JvdzF6bXYsICZpZGN0X3JvdzR6bXYsICZpZGN0X3JvdzN6bXYsICZpZGN0X3JvdzR6bXYsCisgICAgJmlkY3Rfcm93MnptdiwgJmlkY3Rfcm93NHptdiwgJmlkY3Rfcm93M3ptdiwgJmlkY3Rfcm93NHptdgorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBSW50cmFbMTZdKShTaG9ydCosIFVDaGFyKiwgSW50KSA9Cit7CisgICAgJmlkY3Rfcm93MEludHJhLCAmaWRjdF9yb3cweDEwSW50cmEsICZpZGN0X3JvdzB4MjBJbnRyYSwgJmlkY3Rfcm93NEludHJhLAorICAgICZpZGN0X3JvdzB4NDBJbnRyYSwgJmlkY3Rfcm93NEludHJhLCAmaWRjdF9yb3czSW50cmEsICZpZGN0X3JvdzRJbnRyYSwKKyAgICAmaWRjdF9yb3cxSW50cmEsICZpZGN0X3JvdzRJbnRyYSwgJmlkY3Rfcm93M0ludHJhLCAmaWRjdF9yb3c0SW50cmEsCisgICAgJmlkY3Rfcm93MkludHJhLCAmaWRjdF9yb3c0SW50cmEsICZpZGN0X3JvdzNJbnRyYSwgJmlkY3Rfcm93NEludHJhCit9OworCisjZW5kaWYgLyogU01BTExfRENUICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgLyogcGFydCBpbiBBcHBWQ0FfZGN0LmMgKi8KKy8vdm9pZCBCbG9jazF4MURDVHptdiAoU2hvcnQgKm91dCxVQ2hhciAqcHJldixVQ2hhciAqY3VyLFVDaGFyICpyZWMsSW50IGx4LEludCBjaHJvbWEpOworICAgIHZvaWQgQmxvY2sxeDFEQ1R3U3ViKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpwcmV2LCBJbnQgcGl0Y2hfY2hyb21hKTsKKyAgICB2b2lkIEJsb2NrMXgxRENUSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MSwgSW50IHBpdGNoX2Nocm9tYSk7CisgICAgLyogVGhpcyBwYXJ0IGlzIGluIGRjdF9hYW4uYyAqLworICAgIFZvaWQgQmxvY2tEQ1RfQUFOd1N1YihTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqcHJldiwgSW50IHBpdGNoX2Nocm9tYSk7CisgICAgVm9pZCBCbG9jazR4NERDVF9BQU53U3ViKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpwcmV2LCBJbnQgcGl0Y2hfY2hyb21hKTsKKyAgICBWb2lkIEJsb2NrMngyRENUX0FBTndTdWIoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKnByZXYsIEludCBwaXRjaF9jaHJvbWEpOworLy9Wb2lkIEJsb2NrRENUX0FBTnptdihTaG9ydCAqb3V0LFVDaGFyICpwcmV2LFVDaGFyICpjdXIsVUNoYXIgKnJlYyxJbnQgQ29sVGgsSW50IGx4LEludCBjaHJvbWEpOworLy9Wb2lkIEJsb2NrNHg0RENUX0FBTnptdihTaG9ydCAqb3V0LFVDaGFyICpwcmV2LFVDaGFyICpjdXIsVUNoYXIgKnJlYyxJbnQgQ29sVGgsSW50IGx4LEludCBjaHJvbWEpOworLy9Wb2lkIEJsb2NrMngyRENUX0FBTnptdihTaG9ydCAqb3V0LFVDaGFyICpwcmV2LFVDaGFyICpjdXIsVUNoYXIgKnJlYyxJbnQgQ29sVGgsSW50IGx4LEludCBjaHJvbWEpOworICAgIFZvaWQgQmxvY2tEQ1RfQUFOSW50cmEoU2hvcnQgKm91dCwgVUNoYXIgKmN1ciwgVUNoYXIgKmR1bW15MSwgSW50IHBpdGNoX2Nocm9tYSk7CisgICAgVm9pZCBCbG9jazR4NERDVF9BQU5JbnRyYShTaG9ydCAqb3V0LCBVQ2hhciAqY3VyLCBVQ2hhciAqZHVtbXkxLCBJbnQgcGl0Y2hfY2hyb21hKTsKKyAgICBWb2lkIEJsb2NrMngyRENUX0FBTkludHJhKFNob3J0ICpvdXQsIFVDaGFyICpjdXIsIFVDaGFyICpkdW1teTEsIEludCBwaXRjaF9jaHJvbWEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy9fRENUX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3RfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3RfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5NWJkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaApAQCAtMCwwICsxLDM5NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICBGaWxlbmFtZTogZGN0X2lubGluZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZXNjcmlwdGlvbjogSW1wbGVtZW50YXRpb24gZm9yIGluLWxpbmUgZnVuY3Rpb25zIHVzZWQgaW4gZGN0LmNwcCAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9EQ1RfSU5MSU5FX0hfCisjZGVmaW5lIF9EQ1RfSU5MSU5FX0hfCisKKyNpZiAhZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSAmJiAhZGVmaW5lZChQVl9BUk1fR0NDX1Y0KQorCitfX2lubGluZSBpbnQzMiBtbGE3MjQoaW50MzIgb3AxLCBpbnQzMiBvcDIsIGludDMyIG9wMykKK3sKKyAgICBpbnQzMiBvdXQ7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcob3AxKTsKKworICAgIG91dCA9IG9wMiAqIDcyNCArIG9wMzsgLyogb3AxIGlzIG5vdCB1c2VkIGhlcmUgKi8KKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTM5MihpbnQzMiBrMCwgaW50MzIgazE0LCBpbnQzMiByb3VuZCkKK3sKKyAgICBpbnQzMiBrMTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhrMTQpOworCisgICAgazEgPSBrMCAqIDM5MiArIHJvdW5kOworCisgICAgcmV0dXJuIGsxOworfQorCitfX2lubGluZSBpbnQzMiBtbGE1NTQoaW50MzIgazQsIGludDMyIGsxMiwgaW50MzIgazEpCit7CisgICAgaW50MzIgazA7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoazEyKTsKKworICAgIGswID0gazQgKiA1NTQgKyBrMTsKKworICAgIHJldHVybiBrMDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhMTMzOChpbnQzMiBrNiwgaW50MzIgazE0LCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBvdXQ7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoazE0KTsKKworICAgIG91dCA9IGs2ICogMTMzOCArIGsxOworCisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhOTQ2KGludDMyIGs2LCBpbnQzMiBrMTQsIGludDMyIGsxKQoreworICAgIGludDMyIG91dDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhrMTQpOworCisgICAgb3V0ID0gazYgKiA5NDYgKyBrMTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIHN1bV9hYnMoaW50MzIgazAsIGludDMyIGsxLCBpbnQzMiBrMiwgaW50MzIgazMsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyIGs0LCBpbnQzMiBrNSwgaW50MzIgazYsIGludDMyIGs3KQoreworICAgIGludDMyIGNhcnJ5LCBhYnNfc3VtOworCisgICAgY2FycnkgPSBrMCA+PiAzMTsKKyAgICBhYnNfc3VtID0gKGswIF4gY2FycnkpOworICAgIGNhcnJ5ID0gazEgPj4gMzE7CisgICAgYWJzX3N1bSArPSAoazEgXiBjYXJyeSkgLSBjYXJyeTsKKyAgICBjYXJyeSA9IGsyID4+IDMxOworICAgIGFic19zdW0gKz0gKGsyIF4gY2FycnkpIC0gY2Fycnk7CisgICAgY2FycnkgPSBrMyA+PiAzMTsKKyAgICBhYnNfc3VtICs9IChrMyBeIGNhcnJ5KSAtIGNhcnJ5OworICAgIGNhcnJ5ID0gazQgPj4gMzE7CisgICAgYWJzX3N1bSArPSAoazQgXiBjYXJyeSkgLSBjYXJyeTsKKyAgICBjYXJyeSA9IGs1ID4+IDMxOworICAgIGFic19zdW0gKz0gKGs1IF4gY2FycnkpIC0gY2Fycnk7CisgICAgY2FycnkgPSBrNiA+PiAzMTsKKyAgICBhYnNfc3VtICs9IChrNiBeIGNhcnJ5KSAtIGNhcnJ5OworICAgIGNhcnJ5ID0gazcgPj4gMzE7CisgICAgYWJzX3N1bSArPSAoazcgXiBjYXJyeSkgLSBjYXJyeTsKKworICAgIHJldHVybiBhYnNfc3VtOworfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyNpZiBkZWZpbmVkKF9fVEFSR0VUX0FSQ0hfNVRFKQorCitfX2lubGluZSBpbnQzMiBtbGE3MjQoaW50MzIgb3AxLCBpbnQzMiBvcDIsIGludDMyIG9wMykKK3sKKyAgICBpbnQzMiBvdXQ7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgc21sYWJiIG91dCwgb3AxLCBvcDIsIG9wMworICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTM5MihpbnQzMiBrMCwgaW50MzIgazE0LCBpbnQzMiByb3VuZCkKK3sKKyAgICBpbnQzMiBrMTsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbWxhYnQgazEsIGswLCBrMTQsIHJvdW5kCisgICAgfQorCisgICAgcmV0dXJuIGsxOworfQorCitfX2lubGluZSBpbnQzMiBtbGE1NTQoaW50MzIgazQsIGludDMyIGsxMiwgaW50MzIgazEpCit7CisgICAgaW50MzIgazA7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgc21sYWJ0IGswLCBrNCwgazEyLCBrMQorICAgIH0KKworICAgIHJldHVybiBrMDsKK30KKworX19pbmxpbmUgaW50MzIgbWxhMTMzOChpbnQzMiBrNiwgaW50MzIgazE0LCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBvdXQ7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgc21sYWJiIG91dCwgazYsIGsxNCwgazEKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBtbGE5NDYoaW50MzIgazYsIGludDMyIGsxNCwgaW50MzIgazEpCit7CisgICAgaW50MzIgb3V0OworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIHNtbGFiYiBvdXQsIGs2LCBrMTQsIGsxCisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKworI2Vsc2UgLy8gbm90IEFSTTVURQorCisKK19faW5saW5lIGludDMyIG1sYTcyNChpbnQzMiBvcDEsIGludDMyIG9wMiwgaW50MzIgb3AzKQoreworICAgIGludDMyIG91dDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBhbmQgb3V0LCBvcDIsICMweEZGRkYKKyAgICAgICAgbWxhIG91dCwgb3AxLCBvdXQsIG9wMworICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTM5MihpbnQzMiBrMCwgaW50MzIgazE0LCBpbnQzMiByb3VuZCkKK3sKKyAgICBpbnQzMiBrMTsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBtb3YgazEsIGsxNCwgYXNyICMxNgorICAgICAgICBtbGEgazEsIGswLCBrMSwgcm91bmQKKyAgICB9CisKKyAgICByZXR1cm4gazE7Cit9CisKK19faW5saW5lIGludDMyIG1sYTU1NChpbnQzMiBrNCwgaW50MzIgazEyLCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBrMDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBtb3YgIGswLCBrMTIsIGFzciAjMTYKKyAgICAgICAgbWxhIGswLCBrNCwgazAsIGsxCisgICAgfQorCisgICAgcmV0dXJuIGswOworfQorCitfX2lubGluZSBpbnQzMiBtbGExMzM4KGludDMyIGs2LCBpbnQzMiBrMTQsIGludDMyIGsxKQoreworICAgIGludDMyIG91dDsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBhbmQgb3V0LCBrMTQsIDB4RkZGRgorICAgICAgICBtbGEgb3V0LCBrNiwgb3V0LCBrMQorICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTk0NihpbnQzMiBrNiwgaW50MzIgazE0LCBpbnQzMiBrMSkKK3sKKyAgICBpbnQzMiBvdXQ7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgYW5kIG91dCwgazE0LCAweEZGRkYKKyAgICAgICAgbWxhIG91dCwgazYsIG91dCwgazEKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworfQorCisjZW5kaWYKKworX19pbmxpbmUgaW50MzIgc3VtX2FicyhpbnQzMiBrMCwgaW50MzIgazEsIGludDMyIGsyLCBpbnQzMiBrMywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgazQsIGludDMyIGs1LCBpbnQzMiBrNiwgaW50MzIgazcpCit7CisgICAgaW50MzIgY2FycnksIGFic19zdW07CisgICAgX19hc20KKyAgICB7CisgICAgICAgIGVvciAgICAgY2FycnksIGswLCBrMCwgYXNyICMzMSA7CisgICAgICAgIGVvcnMgICAgYWJzX3N1bSwgazEsIGsxLCBhc3IgIzMxIDsKKyAgICAgICAgYWRjICAgICBhYnNfc3VtLCBhYnNfc3VtLCBjYXJyeSA7CisgICAgICAgIGVvcnMgICAgY2FycnksICBrMiwgazIsIGFzciAjMzEgOworICAgICAgICBhZGMgICAgIGFic19zdW0sIGFic19zdW0sIGNhcnJ5IDsKKyAgICAgICAgZW9ycyAgICBjYXJyeSwgIGszLCBrMywgYXNyICMzMSA7CisgICAgICAgIGFkYyAgICAgYWJzX3N1bSwgYWJzX3N1bSwgY2FycnkgOworICAgICAgICBlb3JzICAgIGNhcnJ5LCAgazQsIGs0LCBhc3IgIzMxIDsKKyAgICAgICAgYWRjICAgICBhYnNfc3VtLCBhYnNfc3VtLCBjYXJyeSA7CisgICAgICAgIGVvcnMgICAgY2FycnksICBrNSwgazUsIGFzciAjMzEgOworICAgICAgICBhZGMgICAgIGFic19zdW0sIGFic19zdW0sIGNhcnJ5IDsKKyAgICAgICAgZW9ycyAgICBjYXJyeSwgIGs2LCBrNiwgYXNyICMzMSA7CisgICAgICAgIGFkYyAgICAgYWJzX3N1bSwgYWJzX3N1bSwgY2FycnkgOworICAgICAgICBlb3JzICAgIGNhcnJ5LCAgazcsIGs3LCBhc3IgIzMxIDsKKyAgICAgICAgYWRjICAgICBhYnNfc3VtLCBhYnNfc3VtLCBjYXJyeSA7CisgICAgfQorCisgICAgcmV0dXJuIGFic19zdW07Cit9CisKKyNlbGlmICggZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSB8fCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpICkgIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKK19faW5saW5lIGludDMyIG1sYTcyNChpbnQzMiBvcDEsIGludDMyIG9wMiwgaW50MzIgb3AzKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiBhYSA9IChpbnQzMilvcDE7CisgICAgcmVnaXN0ZXIgaW50MzIgYmIgPSAoaW50MzIpb3AyOworICAgIHJlZ2lzdGVyIGludDMyIGNjID0gKGludDMyKW9wMzsKKworICAgIGFzbSB2b2xhdGlsZSgic21sYWJiICUwLCAlMSwgJTIsICUzIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihjYykpOworICAgIHJldHVybiBvdXQ7Cit9CisKKworX19pbmxpbmUgaW50MzIgbWxhMzkyKGludDMyIGswLCBpbnQzMiBrMTQsIGludDMyIHJvdW5kKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiBhYSA9IChpbnQzMilrMDsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMilrMTQ7CisgICAgcmVnaXN0ZXIgaW50MzIgY2MgPSAoaW50MzIpcm91bmQ7CisKKyAgICBhc20gdm9sYXRpbGUoInNtbGFidCAlMCwgJTEsICUyLCAlMyIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihhYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGJiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoY2MpKTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIG1sYTU1NChpbnQzMiBrNCwgaW50MzIgazEyLCBpbnQzMiBrMSkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgcmVnaXN0ZXIgaW50MzIgYWEgPSAoaW50MzIpazQ7CisgICAgcmVnaXN0ZXIgaW50MzIgYmIgPSAoaW50MzIpazEyOworICAgIHJlZ2lzdGVyIGludDMyIGNjID0gKGludDMyKWsxOworCisgICAgYXNtIHZvbGF0aWxlKCJzbWxhYnQgJTAsICUxLCAlMiwgJTMiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoYWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihiYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGNjKSk7CisKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBtbGExMzM4KGludDMyIGs2LCBpbnQzMiBrMTQsIGludDMyIGsxKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiBhYSA9IChpbnQzMilrNjsKKyAgICByZWdpc3RlciBpbnQzMiBiYiA9IChpbnQzMilrMTQ7CisgICAgcmVnaXN0ZXIgaW50MzIgY2MgPSAoaW50MzIpazE7CisKKyAgICBhc20gdm9sYXRpbGUoInNtbGFiYiAlMCwgJTEsICUyLCAlMyIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihhYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGJiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoY2MpKTsKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBtbGE5NDYoaW50MzIgazYsIGludDMyIGsxNCwgaW50MzIgazEpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGFhID0gKGludDMyKWs2OworICAgIHJlZ2lzdGVyIGludDMyIGJiID0gKGludDMyKWsxNDsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IChpbnQzMilrMTsKKworICAgIGFzbSB2b2xhdGlsZSgic21sYWJiICUwLCAlMSwgJTIsICUzIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihjYykpOworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIHN1bV9hYnMoaW50MzIgazAsIGludDMyIGsxLCBpbnQzMiBrMiwgaW50MzIgazMsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyIGs0LCBpbnQzMiBrNSwgaW50MzIgazYsIGludDMyIGs3KQoreworICAgIHJlZ2lzdGVyIGludDMyIGNhcnJ5OworICAgIHJlZ2lzdGVyIGludDMyIGFic19zdW07CisgICAgcmVnaXN0ZXIgaW50MzIgYWEgPSAoaW50MzIpazA7CisgICAgcmVnaXN0ZXIgaW50MzIgYmIgPSAoaW50MzIpazE7CisgICAgcmVnaXN0ZXIgaW50MzIgY2MgPSAoaW50MzIpazI7CisgICAgcmVnaXN0ZXIgaW50MzIgZGQgPSAoaW50MzIpazM7CisgICAgcmVnaXN0ZXIgaW50MzIgZWUgPSAoaW50MzIpazQ7CisgICAgcmVnaXN0ZXIgaW50MzIgZmYgPSAoaW50MzIpazU7CisgICAgcmVnaXN0ZXIgaW50MzIgZ2cgPSAoaW50MzIpazY7CisgICAgcmVnaXN0ZXIgaW50MzIgaGggPSAoaW50MzIpazc7CisKKyAgICBhc20gdm9sYXRpbGUoImVvciAgJTAsICUyLCAlMiwgYXNyICMzMVxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JzICUxLCAlMywgJTMsIGFzciAjMzFcblx0IgorICAgICAgICAgICAgICAgICAiYWRjICAlMSwgJTEsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcnMgJTAsICU0LCAlNCwgYXNyICMzMVxuXHQiCisgICAgICAgICAgICAgICAgICJhZGMgICUxLCAlMSwgJTBcblx0IgorICAgICAgICAgICAgICAgICAiZW9ycyAlMCwgJTUsICU1LCBhc3IgIzMxXG5cdCIKKyAgICAgICAgICAgICAgICAgImFkYyAgJTEsICUxLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JzICUwLCAlNiwgJTYsIGFzciAjMzFcblx0IgorICAgICAgICAgICAgICAgICAiYWRjICAlMSwgJTEsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcnMgJTAsICU3LCAlNywgYXNyICMzMVxuXHQiCisgICAgICAgICAgICAgICAgICJhZGMgICUxLCAlMSwgJTBcblx0IgorICAgICAgICAgICAgICAgICAiZW9ycyAlMCwgJTgsICU4LCBhc3IgIzMxXG5cdCIKKyAgICAgICAgICAgICAgICAgImFkYyAgJTEsICUxLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JzICUwLCAlOSwgJTksIGFzciAjMzFcblx0IgorICAgICAgICAgICAgICAgICAiYWRjICAlMSwgJTEsICUwXG5cdCIKKworICAgICAgICAgICAgIDogIj0mciIoY2FycnkpLAorICAgICAgICAgICAgICAgICAiPSZyIihhYnNfc3VtKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihiYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoZGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihlZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoZ2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihoaCkpOworCisgICAgcmV0dXJuIGFic19zdW07Cit9CisKKyNlbmRpZiAvLyBEaWZmLiBPUworCisjZW5kaWYgLy9fRENUX0lOTElORV9IXworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkNDFjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwCkBAIC0wLDAgKzEsNjIyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAiZGN0LmgiCisjaW5jbHVkZSAibTR2ZW5jX29zY2wuaCIKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBDb2RlTUJfSDI2MyggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDgvMTUvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogUGVyZm9ybSByZXNpZHVlIGNhbGMgKG9ubHkgemVybyBNViksIERDVCwgSDI2MyBRdWFudC9EZXF1YW50LCovCisvKiAgICAgICAgICAgICAgSURDVCBhbmQgbW90aW9uIGNvbXBlbnNhdGlvbi5Nb2RpZmllZCBmcm9tIEZhc3RDb2RlTUIoKSAgICAgKi8KKy8qICBJbnB1dCAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB2aWRlbyAgICAgICBWaWRlbyBlbmNvZGVyIGRhdGEgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGZ1bmN0aW9uICAgIEFwcHJveGltYXRlIERDVCBmdW5jdGlvbiwgc2NhbGluZyBhbmQgdGhyZXNob2xkICAgICAgICAgKi8KKy8qICAgICAgbmNvZWZibGNrICAgQXJyYXkgZm9yIGxhc3Qgbm9uemVybyBjb2VmZiBmb3Igc3BlZWR1cCBpbiBWbGNFbmNvZGUgICAqLworLyogICAgICBRUCAgICAgIENvbWJpbmVkIG9mZnNldCBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlIGN1cnJlbnQgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgbWFjcm9ibG9jayAgYW5kIFFQICBmb3IgY3VycmVudCBNQi4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgT3V0cHV0ICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZpZGVvLT5vdXRwdXRNQiAgICAgUXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgY3VyclZvcC0+eUNoYW4sdUNoYW4sdkNoYW4gIFJlY29uc3RydWN0ZWQgcGl4ZWxzICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgIFBWX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgIDIvMjYvMDEKKyAgICAgICAgICAgIC1tb2RpZmllZCB0aHJlc2hvbGQgYmFzZWQgb24gY29ycmVsYXRpb24gY29lZmYgMC43NSBvbmx5IGZvciBtb2RlIEguMjYzCisgICAgICAgICAgICAtbmNvZWZibGNrW10gYXMgaW5wdXQsICB0byBrZWVwIHBvc2l0aW9uIG9mIGxhc3Qgbm9uLXplcm8gY29lZmYqLworLyogICAgICAgICAgIDgvMTAvMDEKKyAgICAgICAgICAgIC1tb2RpZmllZCB0aHJlc2hvbGQgYmFzZWQgb24gY29ycmVsYXRpb24gY29lZmYgMC41CisgICAgICAgICAgICAtdXNlZCBjb2x1bW4gdGhyZXNob2xkIHRvIHNwZWVkdXAgY29sdW1uIERDVC4KKyAgICAgICAgICAgIC11c2VkIGJpdG1hcCB6aWd6YWcgdG8gc3BlZWR1cCBSdW5MZXZlbCgpLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBDb2RlTUJfSDI2MyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBhcHByb3hEQ1QgKmZ1bmN0aW9uLCBJbnQgUVAsIEludCBuY29lZmJsY2tbXSkKK3sKKyAgICBJbnQgc2FkLCBrLCBDQlAsIG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIFNob3J0ICpvdXRwdXQsICpkYXRhQmxvY2s7CisgICAgVUNoYXIgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworICAgIFVDaGFyICpiaXRtYXBjb2wsICpiaXRtYXByb3cgPSB2aWRlby0+Yml0bWFwcm93OworICAgIFVJbnQgICpiaXRtYXB6eiA7CisgICAgVUNoYXIgc2hvcnRIZWFkZXIgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5zaG9ydFZpZGVvSGVhZGVyOworICAgIEludCBkY19zY2FsZXIgPSA4OworICAgIEludCBpbnRyYSA9IChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVFJBX1EpOworICAgIHN0cnVjdCBRUHN0cnVjdCBRdWFudFBhcmFtOworICAgIEludCBkY3RNb2RlLCBEY3RUaDE7CisgICAgSW50IENvbFRoOworICAgIEludCgqQmxvY2tRdWFudERlcXVhbnRIMjYzKShTaG9ydCAqLCBTaG9ydCAqLCBzdHJ1Y3QgUVBzdHJ1Y3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXJbXSwgVUNoYXIgKiwgVUludCAqLCBJbnQsIEludCwgSW50LCBVQ2hhcik7CisgICAgSW50KCpCbG9ja1F1YW50RGVxdWFudEgyNjNEQykoU2hvcnQgKiwgU2hvcnQgKiwgc3RydWN0IFFQc3RydWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKiwgVUludCAqLCBJbnQsIFVDaGFyKTsKKyAgICB2b2lkICgqQmxvY2tEQ1QxeDEpKFNob3J0ICosIFVDaGFyICosIFVDaGFyICosIEludCk7CisgICAgdm9pZCAoKkJsb2NrRENUMngyKShTaG9ydCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQpOworICAgIHZvaWQgKCpCbG9ja0RDVDR4NCkoU2hvcnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50KTsKKyAgICB2b2lkICgqQmxvY2tEQ1Q4eDgpKFNob3J0ICosIFVDaGFyICosIFVDaGFyICosIEludCk7CisKKyAgICAvKiBtb3Rpb24gY29tcC4gcmVsYXRlZCB2YXIuICovCisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVmlkZW9FbmNGcmFtZUlPICppbnB1dEZyYW1lID0gdmlkZW8tPmlucHV0OworICAgIEludCBpbmRfeCA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeDsKKyAgICBJbnQgaW5kX3kgPSB2aWRlby0+b3V0cHV0TUItPm1iX3k7CisgICAgSW50IGx4ID0gY3VyclZvcC0+cGl0Y2g7CisgICAgSW50IHdpZHRoID0gY3VyclZvcC0+d2lkdGg7CisgICAgVUNoYXIgKnJlYywgKmlucHV0LCAqcHJlZDsKKyAgICBJbnQgb2Zmc2V0ID0gUVAgPj4gNTsgIC8qIFFQIGlzIGNvbWJpbmVkIG9mZnNldCBhbmQgUVAgKi8KKyAgICBJbnQgb2Zmc2V0YyA9IChvZmZzZXQgPj4gMikgKyAoaW5kX3ggPDwgMik7IC8qIG9mZnNldCBmb3IgY2hyb20gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBPU0NMX1VOVVNFRF9BUkcoZnVuY3Rpb24pOworCisgICAgb3V0cHV0ID0gdmlkZW8tPm91dHB1dE1CLT5ibG9ja1swXTsKKyAgICBDQlAgPSAwOworICAgIFFQID0gUVAgJiAweDFGOworLy8gIE00VkVOQ19NRU1TRVQob3V0cHV0LDAsKHNpemVvZihTaG9ydCk8PDYpKjYpOyAvKiByZXNldCBxdWFudGl6ZWQgY29lZmYuIHRvIHplcm8gLCA3LzI0LzAxKi8KKworICAgIFF1YW50UGFyYW0uUVB4MiA9IFFQIDw8IDE7CisgICAgUXVhbnRQYXJhbS5RUCA9IFFQOworICAgIFF1YW50UGFyYW0uUVBkaXYyID0gUVAgPj4gMTsKKyAgICBRdWFudFBhcmFtLlFQeDJwbHVzID0gUXVhbnRQYXJhbS5RUHgyICsgUXVhbnRQYXJhbS5RUGRpdjI7CisgICAgUXVhbnRQYXJhbS5BZGRpdGlvbiA9IFFQIC0gMSArIChRUCAmIDB4MSk7CisKKyAgICBpZiAoaW50cmEpCisgICAgeworICAgICAgICBCbG9ja0RDVDF4MSA9ICZCbG9jazF4MURDVEludHJhOworICAgICAgICBCbG9ja0RDVDJ4MiA9ICZCbG9jazJ4MkRDVF9BQU5JbnRyYTsKKyAgICAgICAgQmxvY2tEQ1Q0eDQgPSAmQmxvY2s0eDREQ1RfQUFOSW50cmE7CisgICAgICAgIEJsb2NrRENUOHg4ID0gJkJsb2NrRENUX0FBTkludHJhOworICAgICAgICBCbG9ja1F1YW50RGVxdWFudEgyNjMgPSAmQmxvY2tRdWFudERlcXVhbnRIMjYzSW50cmE7CisgICAgICAgIEJsb2NrUXVhbnREZXF1YW50SDI2M0RDID0gJkJsb2NrUXVhbnREZXF1YW50SDI2M0RDSW50cmE7CisgICAgICAgIGlmIChzaG9ydEhlYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgZGNfc2NhbGVyID0gODsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjX3NjYWxlciA9IGNhbF9kY19zY2FsZXJFTkMoUVAsIDEpOyAvKiBsdW1pbmFuY2UgYmxvY2tzICovCisgICAgICAgIH0KKyAgICAgICAgRGN0VGgxID0gKEludCkoZGNfc2NhbGVyICogMyk7Ly8qMS44MjkKKyAgICAgICAgQ29sVGggPSBDb2xUaEludHJhW1FQXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQmxvY2tEQ1QxeDEgPSAmQmxvY2sxeDFEQ1R3U3ViOworICAgICAgICBCbG9ja0RDVDJ4MiA9ICZCbG9jazJ4MkRDVF9BQU53U3ViOworICAgICAgICBCbG9ja0RDVDR4NCA9ICZCbG9jazR4NERDVF9BQU53U3ViOworICAgICAgICBCbG9ja0RDVDh4OCA9ICZCbG9ja0RDVF9BQU53U3ViOworCisgICAgICAgIEJsb2NrUXVhbnREZXF1YW50SDI2MyA9ICZCbG9ja1F1YW50RGVxdWFudEgyNjNJbnRlcjsKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRIMjYzREMgPSAmQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRlcjsKKyAgICAgICAgQ29sVGggPSBDb2xUaEludGVyW1FQXTsKKyAgICAgICAgRGN0VGgxID0gKEludCkoMTYgKiBRUCk7ICAvLzkqUVA7CisgICAgfQorCisgICAgcmVjID0gY3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7CisgICAgaW5wdXQgPSBpbnB1dEZyYW1lLT55Q2hhbiArIG9mZnNldDsKKyAgICBpZiAobHggIT0gd2lkdGgpIGlucHV0IC09IChpbmRfeSA8PCA5KTsgIC8qIG5vbi1wYWRkZWQgb2Zmc2V0ICovCisKKyAgICBkYXRhQmxvY2sgPSB2aWRlby0+ZGF0YUJsb2NrOworICAgIHByZWQgPSB2aWRlby0+cHJlZGljdGVkTUI7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgIHsKKyAgICAgICAgQ0JQIDw8PSAxOworICAgICAgICBiaXRtYXBjb2wgPSB2aWRlby0+Yml0bWFwY29sW2tdOworICAgICAgICBiaXRtYXB6eiA9IHZpZGVvLT5iaXRtYXB6eltrXTsgIC8qICA3LzMwLzAxICovCisgICAgICAgIGlmIChrIDwgNCkKKyAgICAgICAgeworICAgICAgICAgICAgc2FkID0gdmlkZW8tPm1vdFttYm51bV1baysxXS5zYWQ7CisgICAgICAgICAgICBpZiAoayYxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYyArPSA4OworICAgICAgICAgICAgICAgIGlucHV0ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9ICgod2lkdGggPDwgMykgLSA4KTsKKyAgICAgICAgICAgICAgICBpbnB1dCArPSBkY3RNb2RlOworICAgICAgICAgICAgICAgIGRjdE1vZGUgPSAoKGx4IDw8IDMpIC0gOCk7CisgICAgICAgICAgICAgICAgcmVjICs9IGRjdE1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoayA9PSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYyA9IGN1cnJWb3AtPnVDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0RnJhbWUtPnVDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpZiAobHggIT0gd2lkdGgpIGlucHV0IC09IChpbmRfeSA8PCA3KTsKKyAgICAgICAgICAgICAgICBseCA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3aWR0aCA+Pj0gMTsKKyAgICAgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYWQgPSBnZXRCbG9ja1N1bShpbnB1dCwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hvcnRIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBkY19zY2FsZXIgPSA4OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRjX3NjYWxlciA9IGNhbF9kY19zY2FsZXJFTkMoUVAsIDIpOyAvKiBjaHJvbWluYW5jZSBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBEY3RUaDEgPSAoSW50KShkY19zY2FsZXIgKiAzKTsvLyoxLjgyOQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNhZCA9IFNhZDh4OChpbnB1dCwgcHJlZCwgd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYyA9IGN1cnJWb3AtPnZDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0RnJhbWUtPnZDaGFuICsgb2Zmc2V0YzsKKyAgICAgICAgICAgICAgICBpZiAobHggIT0gd2lkdGgpIGlucHV0IC09IChpbmRfeSA8PCA3KTsKKyAgICAgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzYWQgPSBnZXRCbG9ja1N1bShpbnB1dCwgd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNhZCA9IFNhZDh4OChpbnB1dCwgcHJlZCwgd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhZCA8IERjdFRoMSAmJiAhKHNob3J0SGVhZGVyICYmIGludHJhKSkgLyogYWxsLXplcm8gKi8KKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIHNob3J0SGVhZGVyIGludHJhIGJsb2NrLCBEQyB2YWx1ZSBjYW5ub3QgYmUgemVybyAqLworICAgICAgICAgICAgZGN0TW9kZSA9IDA7CisgICAgICAgICAgICBDQlAgfD0gMDsKKyAgICAgICAgICAgIG5jb2VmYmxja1trXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2FkIDwgMTgqUVAvKihRUDw8NCkqLykgLyogREMtb25seSAqLworICAgICAgICB7CisgICAgICAgICAgICBkY3RNb2RlID0gMTsKKyAgICAgICAgICAgIEJsb2NrRENUMXgxKGRhdGFCbG9jaywgaW5wdXQsIHByZWQsIHdpZHRoKTsKKworICAgICAgICAgICAgQ0JQIHw9ICgqQmxvY2tRdWFudERlcXVhbnRIMjYzREMpKGRhdGFCbG9jaywgb3V0cHV0LCAmUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXByb3cgKyBrLCBiaXRtYXB6eiwgZGNfc2NhbGVyLCBzaG9ydEhlYWRlcik7CisgICAgICAgICAgICBuY29lZmJsY2tba10gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBkYXRhQmxvY2tbNjRdID0gQ29sVGg7CisKKyAgICAgICAgICAgIGlmIChzYWQgPCAyMipRUC8qKFFQPDw0KSsoUVA8PDEpKi8pICAvKiAyeDIgRENUICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9IDI7CisgICAgICAgICAgICAgICAgQmxvY2tEQ1QyeDIoZGF0YUJsb2NrLCBpbnB1dCwgcHJlZCwgd2lkdGgpOworICAgICAgICAgICAgICAgIG5jb2VmYmxja1trXSA9IDY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzYWQgPCAoUVAgPDwgNSkpIC8qIDR4NCBEQ1QgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gNDsKKyAgICAgICAgICAgICAgICBCbG9ja0RDVDR4NChkYXRhQmxvY2ssIGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIEZ1bGwtRENUICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9IDg7CisgICAgICAgICAgICAgICAgQmxvY2tEQ1Q4eDgoZGF0YUJsb2NrLCBpbnB1dCwgcHJlZCwgd2lkdGgpOworICAgICAgICAgICAgICAgIG5jb2VmYmxja1trXSA9IDY0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDQlAgfD0gKCpCbG9ja1F1YW50RGVxdWFudEgyNjMpKGRhdGFCbG9jaywgb3V0cHV0LCAmUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwY29sLCBiaXRtYXByb3cgKyBrLCBiaXRtYXB6eiwgZGN0TW9kZSwgaywgZGNfc2NhbGVyLCBzaG9ydEhlYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgQmxvY2tJRENUTW90aW9uQ29tcChkYXRhQmxvY2ssIGJpdG1hcGNvbCwgYml0bWFwcm93W2tdLCBkY3RNb2RlLCByZWMsIHByZWQsIChseCA8PCAxKSB8IGludHJhKTsKKyAgICAgICAgb3V0cHV0ICs9IDY0OworICAgICAgICBpZiAoIShrJjEpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkICs9IDEyMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gPSBDQlA7IC8qICA1LzE4LzIwMDEgKi8KKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IENvZGVNQl9NUEVHKCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogOC8xNS8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBQZXJmb3JtIHJlc2lkdWUgY2FsYyAob25seSB6ZXJvIE1WKSwgRENULCBNUEVHIFF1YW50L0RlcXVhbnQsKi8KKy8qICAgICAgICAgICAgICBJRENUIGFuZCBtb3Rpb24gY29tcGVuc2F0aW9uLk1vZGlmaWVkIGZyb20gRmFzdENvZGVNQigpICAgICAqLworLyogIElucHV0ICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHZpZGVvICAgICAgIFZpZGVvIGVuY29kZXIgZGF0YSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgZnVuY3Rpb24gICAgQXBwcm94aW1hdGUgRENUIGZ1bmN0aW9uLCBzY2FsaW5nIGFuZCB0aHJlc2hvbGQgICAgICAgICAqLworLyogICAgICBuY29lZmJsY2sgICBBcnJheSBmb3IgbGFzdCBub256ZXJvIGNvZWZmIGZvciBzcGVlZHVwIGluIFZsY0VuY29kZSAgICovCisvKiAgICAgIFFQICAgICAgQ29tYmluZWQgb2Zmc2V0IGZyb20gdGhlIG9yaWdpbiB0byB0aGUgY3VycmVudCAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBtYWNyb2Jsb2NrICBhbmQgUVAgIGZvciBjdXJyZW50IE1CLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBPdXRwdXQgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgdmlkZW8tPm91dHB1dE1CICAgICBRdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBjdXJyVm9wLT55Q2hhbix1Q2hhbix2Q2hhbiAgUmVjb25zdHJ1Y3RlZCBwaXhlbHMgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgUFZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgMi8yNi8wMQorICAgICAgICAgICAgLW1vZGlmaWVkIHRocmVzaG9sZCBiYXNlZCBvbiBjb3JyZWxhdGlvbiBjb2VmZiAwLjc1IG9ubHkgZm9yIG1vZGUgSC4yNjMKKyAgICAgICAgICAgIC1uY29lZmJsY2tbXSBhcyBpbnB1dCwga2VlcCBwb3NpdGlvbiBvZiBsYXN0IG5vbi16ZXJvIGNvZWZmKi8KKy8qICAgICAgICAgICA4LzEwLzAxCisgICAgICAgICAgICAtbW9kaWZpZWQgdGhyZXNob2xkIGJhc2VkIG9uIGNvcnJlbGF0aW9uIGNvZWZmIDAuNQorICAgICAgICAgICAgLXVzZWQgY29sdW1uIHRocmVzaG9sZCB0byBzcGVlZHVwIGNvbHVtbiBEQ1QuCisgICAgICAgICAgICAtdXNlZCBiaXRtYXAgemlnemFnIHRvIHNwZWVkdXAgUnVuTGV2ZWwoKS4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgQ29kZU1CX01QRUcoVmlkZW9FbmNEYXRhICp2aWRlbywgYXBwcm94RENUICpmdW5jdGlvbiwgSW50IFFQLCBJbnQgbmNvZWZibGNrW10pCit7CisgICAgSW50IHNhZCwgaywgQ0JQLCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICBTaG9ydCAqb3V0cHV0LCAqZGF0YUJsb2NrOworICAgIFVDaGFyIE1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKKyAgICBVQ2hhciAqYml0bWFwY29sLCAqYml0bWFwcm93ID0gdmlkZW8tPmJpdG1hcHJvdzsKKyAgICBVSW50ICAqYml0bWFwenogOworICAgIEludCBkY19zY2FsZXIgPSA4OworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgSW50IGludHJhID0gKE1vZGUgPT0gTU9ERV9JTlRSQSB8fCBNb2RlID09IE1PREVfSU5UUkFfUSk7CisgICAgSW50ICpxbWF0OworICAgIEludCBkY3RNb2RlLCBEY3RUaDEsIERjdFRoMiwgRGN0VGgzLCBEY3RUaDQ7CisgICAgSW50IENvbFRoOworCisgICAgSW50KCpCbG9ja1F1YW50RGVxdWFudE1QRUcpKFNob3J0ICosIFNob3J0ICosIEludCwgSW50ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIFtdLCBVQ2hhciAqLCBVSW50ICosIEludCwgIEludCwgSW50KTsKKyAgICBJbnQoKkJsb2NrUXVhbnREZXF1YW50TVBFR0RDKShTaG9ydCAqLCBTaG9ydCAqLCBJbnQsIEludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIFtdLCBVQ2hhciAqLCBVSW50ICosIEludCk7CisKKyAgICB2b2lkICgqQmxvY2tEQ1QxeDEpKFNob3J0ICosIFVDaGFyICosIFVDaGFyICosIEludCk7CisgICAgdm9pZCAoKkJsb2NrRENUMngyKShTaG9ydCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQpOworICAgIHZvaWQgKCpCbG9ja0RDVDR4NCkoU2hvcnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50KTsKKyAgICB2b2lkICgqQmxvY2tEQ1Q4eDgpKFNob3J0ICosIFVDaGFyICosIFVDaGFyICosIEludCk7CisKKyAgICAvKiBtb3Rpb24gY29tcC4gcmVsYXRlZCB2YXIuICovCisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVmlkZW9FbmNGcmFtZUlPICppbnB1dEZyYW1lID0gdmlkZW8tPmlucHV0OworICAgIEludCBpbmRfeCA9IHZpZGVvLT5vdXRwdXRNQi0+bWJfeDsKKyAgICBJbnQgaW5kX3kgPSB2aWRlby0+b3V0cHV0TUItPm1iX3k7CisgICAgSW50IGx4ID0gY3VyclZvcC0+cGl0Y2g7CisgICAgSW50IHdpZHRoID0gY3VyclZvcC0+d2lkdGg7CisgICAgVUNoYXIgKnJlYywgKmlucHV0LCAqcHJlZDsKKyAgICBJbnQgb2Zmc2V0ID0gUVAgPj4gNTsKKyAgICBJbnQgb2Zmc2V0YyA9IChvZmZzZXQgPj4gMikgKyAoaW5kX3ggPDwgMik7IC8qIG9mZnNldCBmb3IgY2hyb20gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBPU0NMX1VOVVNFRF9BUkcoZnVuY3Rpb24pOworCisgICAgb3V0cHV0ID0gdmlkZW8tPm91dHB1dE1CLT5ibG9ja1swXTsKKyAgICBDQlAgPSAwOworICAgIFFQID0gUVAgJiAweDFGOworLy8gIE00VkVOQ19NRU1TRVQob3V0cHV0LDAsKHNpemVvZihTaG9ydCk8PDYpKjYpOyAvKiByZXNldCBxdWFudGl6ZWQgY29lZmYuIHRvIHplcm8gLCAgNy8yNC8wMSovCisKKyAgICBpZiAoaW50cmEpCisgICAgeworICAgICAgICBCbG9ja0RDVDF4MSA9ICZCbG9jazF4MURDVEludHJhOworICAgICAgICBCbG9ja0RDVDJ4MiA9ICZCbG9jazJ4MkRDVF9BQU5JbnRyYTsKKyAgICAgICAgQmxvY2tEQ1Q0eDQgPSAmQmxvY2s0eDREQ1RfQUFOSW50cmE7CisgICAgICAgIEJsb2NrRENUOHg4ID0gJkJsb2NrRENUX0FBTkludHJhOworCisgICAgICAgIEJsb2NrUXVhbnREZXF1YW50TVBFRyA9ICZCbG9ja1F1YW50RGVxdWFudE1QRUdJbnRyYTsKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRNUEVHREMgPSAmQmxvY2tRdWFudERlcXVhbnRNUEVHRENJbnRyYTsKKyAgICAgICAgZGNfc2NhbGVyID0gY2FsX2RjX3NjYWxlckVOQyhRUCwgMSk7IC8qIGx1bWluYW5jZSBibG9ja3MgKi8KKyAgICAgICAgcW1hdCA9IGN1cnJWb2wtPmlxbWF0OworICAgICAgICBEY3RUaDEgPSAoSW50KSgzICogZGNfc2NhbGVyKTsvLzIqZGNfc2NhbGVyKTsKKyAgICAgICAgRGN0VGgyID0gKEludCkoKDEuMjUgKiBRUCAtIDEpICogcW1hdFsxXSAqIDAuNDUpOy8vMC41NjcpOy8vMC41NjcpOworICAgICAgICBEY3RUaDMgPSAoSW50KSgoMS4yNSAqIFFQIC0gMSkgKiBxbWF0WzJdICogMC41NSk7Ly8xLjE2Mik7IC8qICA4LzIvMjAwMSAqLworICAgICAgICBEY3RUaDQgPSAoSW50KSgoMS4yNSAqIFFQIC0gMSkgKiBxbWF0WzMyXSAqIDAuOCk7Ly8xLjc1ODMpOy8vMC43OTQyKTsKKyAgICAgICAgQ29sVGggPSBDb2xUaEludHJhW1FQXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQmxvY2tEQ1QxeDEgPSAmQmxvY2sxeDFEQ1R3U3ViOworICAgICAgICBCbG9ja0RDVDJ4MiA9ICZCbG9jazJ4MkRDVF9BQU53U3ViOworICAgICAgICBCbG9ja0RDVDR4NCA9ICZCbG9jazR4NERDVF9BQU53U3ViOworICAgICAgICBCbG9ja0RDVDh4OCA9ICZCbG9ja0RDVF9BQU53U3ViOworCisgICAgICAgIEJsb2NrUXVhbnREZXF1YW50TVBFRyA9ICZCbG9ja1F1YW50RGVxdWFudE1QRUdJbnRlcjsKKyAgICAgICAgQmxvY2tRdWFudERlcXVhbnRNUEVHREMgPSAmQmxvY2tRdWFudERlcXVhbnRNUEVHRENJbnRlcjsKKyAgICAgICAgcW1hdCA9IGN1cnJWb2wtPm5pcW1hdDsKKyAgICAgICAgRGN0VGgxID0gKEludCkoKChRUCA8PCAxKSAtIDAuNSkgKiBxbWF0WzBdICogMC40KTsvLzAuMjI4Nik7Ly8wLjMwNjIpOworICAgICAgICBEY3RUaDIgPSAoSW50KSgoKFFQIDw8IDEpIC0gMC41KSAqIHFtYXRbMV0gKiAwLjQ1KTsvLzAuNTY3KTsvLzAuNCk7CisgICAgICAgIERjdFRoMyA9IChJbnQpKCgoUVAgPDwgMSkgLSAwLjUpICogcW1hdFsyXSAqIDAuNTUpOy8vMS4xNjIpOyAvKiAgOC8yLzIwMDEgKi8KKyAgICAgICAgRGN0VGg0ID0gKEludCkoKChRUCA8PCAxKSAtIDAuNSkgKiBxbWF0WzMyXSAqIDAuOCk7Ly8xLjc1ODMpOy8vMC43OTQyKTsKKyAgICAgICAgQ29sVGggPSBDb2xUaEludGVyW1FQXTsKKyAgICB9Ly8gZ2V0IHFtYXQsIERjdFRoMSwgRGN0VGgyLCBEY3RUaDMKKworICAgIHJlYyA9IGN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OworICAgIGlucHV0ID0gaW5wdXRGcmFtZS0+eUNoYW4gKyBvZmZzZXQ7CisgICAgaWYgKGx4ICE9IHdpZHRoKSBpbnB1dCAtPSAoaW5kX3kgPDwgOSk7ICAvKiBub24tcGFkZGVkIG9mZnNldCAqLworCisgICAgZGF0YUJsb2NrID0gdmlkZW8tPmRhdGFCbG9jazsKKyAgICBwcmVkID0gdmlkZW8tPnByZWRpY3RlZE1COworCisgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykKKyAgICB7CisgICAgICAgIENCUCA8PD0gMTsKKyAgICAgICAgYml0bWFwY29sID0gdmlkZW8tPmJpdG1hcGNvbFtrXTsKKyAgICAgICAgYml0bWFwenogPSB2aWRlby0+Yml0bWFwenpba107ICAvKiAgOC8yLzAxICovCisgICAgICAgIGlmIChrIDwgNCkKKyAgICAgICAgey8vWSBibG9jaworICAgICAgICAgICAgc2FkID0gdmlkZW8tPm1vdFttYm51bV1baysxXS5zYWQ7CisgICAgICAgICAgICBpZiAoayYxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYyArPSA4OworICAgICAgICAgICAgICAgIGlucHV0ICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChrID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGN0TW9kZSA9ICgod2lkdGggPDwgMykgLSA4KTsKKyAgICAgICAgICAgICAgICBpbnB1dCArPSBkY3RNb2RlOworICAgICAgICAgICAgICAgIGRjdE1vZGUgPSAoKGx4IDw8IDMpIC0gOCk7CisgICAgICAgICAgICAgICAgcmVjICs9IGRjdE1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7Ly8gVSwgViBibG9jaworICAgICAgICAgICAgaWYgKGsgPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWMgPSBjdXJyVm9wLT51Q2hhbiArIG9mZnNldGM7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dEZyYW1lLT51Q2hhbiArIG9mZnNldGM7CisgICAgICAgICAgICAgICAgaWYgKGx4ICE9IHdpZHRoKSBpbnB1dCAtPSAoaW5kX3kgPDwgNyk7CisgICAgICAgICAgICAgICAgbHggPj49IDE7CisgICAgICAgICAgICAgICAgd2lkdGggPj49IDE7CisgICAgICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGNfc2NhbGVyID0gY2FsX2RjX3NjYWxlckVOQyhRUCwgMik7IC8qIGx1bWluYW5jZSBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICAgICAgRGN0VGgxID0gZGNfc2NhbGVyICogMzsKKyAgICAgICAgICAgICAgICAgICAgc2FkID0gZ2V0QmxvY2tTdW0oaW5wdXQsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzYWQgPSBTYWQ4eDgoaW5wdXQsIHByZWQsIHdpZHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWMgPSBjdXJyVm9wLT52Q2hhbiArIG9mZnNldGM7CisgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dEZyYW1lLT52Q2hhbiArIG9mZnNldGM7CisgICAgICAgICAgICAgICAgaWYgKGx4ICE9IHdpZHRoKSBpbnB1dCAtPSAoaW5kX3kgPDwgNyk7CisgICAgICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgICAgICAgICBzYWQgPSBnZXRCbG9ja1N1bShpbnB1dCwgd2lkdGgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2FkID0gU2FkOHg4KGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2FkIDwgRGN0VGgxKSAvKiBhbGwtemVybyAqLworICAgICAgICB7CisgICAgICAgICAgICBkY3RNb2RlID0gMDsKKyAgICAgICAgICAgIENCUCB8PSAwOworICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzYWQgPCBEY3RUaDIpIC8qIERDLW9ubHkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZGN0TW9kZSA9IDE7CisgICAgICAgICAgICBCbG9ja0RDVDF4MShkYXRhQmxvY2ssIGlucHV0LCBwcmVkLCB3aWR0aCk7CisKKyAgICAgICAgICAgIENCUCB8PSAoKkJsb2NrUXVhbnREZXF1YW50TVBFR0RDKShkYXRhQmxvY2ssIG91dHB1dCwgUVAsIHFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwY29sLCBiaXRtYXByb3cgKyBrLCBiaXRtYXB6eiwgZGNfc2NhbGVyKTsKKyAgICAgICAgICAgIG5jb2VmYmxja1trXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhQmxvY2tbNjRdID0gQ29sVGg7CisKKyAgICAgICAgICAgIGlmIChzYWQgPCBEY3RUaDMpIC8qIDJ4Mi1EQ1QgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gMjsKKyAgICAgICAgICAgICAgICBCbG9ja0RDVDJ4MihkYXRhQmxvY2ssIGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNhZCA8IERjdFRoNCkgLyogNHg0IERDVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRjdE1vZGUgPSA0OworICAgICAgICAgICAgICAgIEJsb2NrRENUNHg0KGRhdGFCbG9jaywgaW5wdXQsIHByZWQsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBuY29lZmJsY2tba10gPSAyNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogZnVsbC1EQ1QgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkY3RNb2RlID0gODsKKyAgICAgICAgICAgICAgICBCbG9ja0RDVDh4OChkYXRhQmxvY2ssIGlucHV0LCBwcmVkLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgbmNvZWZibGNrW2tdID0gNjQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENCUCB8PSAoKkJsb2NrUXVhbnREZXF1YW50TVBFRykoZGF0YUJsb2NrLCBvdXRwdXQsIFFQLCBxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBjb2wsIGJpdG1hcHJvdyArIGssIGJpdG1hcHp6LCBkY3RNb2RlLCBrLCBkY19zY2FsZXIpOyAvLworICAgICAgICB9CisgICAgICAgIGRjdE1vZGUgPSA4OyAvKiBmb3IgbWlzbWF0Y2ggaGFuZGxlICovCisgICAgICAgIEJsb2NrSURDVE1vdGlvbkNvbXAoZGF0YUJsb2NrLCBiaXRtYXBjb2wsIGJpdG1hcHJvd1trXSwgZGN0TW9kZSwgcmVjLCBwcmVkLCAobHggPDwgMSkgfCAoaW50cmEpKTsKKworICAgICAgICBvdXRwdXQgKz0gNjQ7CisgICAgICAgIGlmICghKGsmMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgKz0gODsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgKz0gMTIwOworICAgICAgICB9CisgICAgfQorCisgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9IENCUDsgLyogIDUvMTgvMjAwMSAqLworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBnZXRCbG9ja1NBViggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDgvMTAvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IFNBViBmb3Igb25lIGJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBibG9ja1s2NF0gY29udGFpbiBvbmUgYmxvY2sgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qIGNhbiBiZSB3cml0dGVuIGluIE1NWCBvciBTU0UsICAyLzIyLzIwMDEgKi8KK0ludCBnZXRCbG9ja1NBVihTaG9ydCBibG9ja1tdKQoreworICAgIEludCBpLCB2YWwsIHNhdiA9IDA7CisKKyAgICBpID0gODsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdmFsID0gKmJsb2NrKys7CisgICAgICAgIGlmICh2YWwgPiAwKSAgICBzYXYgKz0gdmFsOworICAgICAgICBlbHNlICAgICAgICBzYXYgLT0gdmFsOworICAgICAgICB2YWwgPSAqYmxvY2srKzsKKyAgICAgICAgaWYgKHZhbCA+IDApICAgIHNhdiArPSB2YWw7CisgICAgICAgIGVsc2UgICAgICAgIHNhdiAtPSB2YWw7CisgICAgICAgIHZhbCA9ICpibG9jaysrOworICAgICAgICBpZiAodmFsID4gMCkgICAgc2F2ICs9IHZhbDsKKyAgICAgICAgZWxzZSAgICAgICAgc2F2IC09IHZhbDsKKyAgICAgICAgdmFsID0gKmJsb2NrKys7CisgICAgICAgIGlmICh2YWwgPiAwKSAgICBzYXYgKz0gdmFsOworICAgICAgICBlbHNlICAgICAgICBzYXYgLT0gdmFsOworICAgICAgICB2YWwgPSAqYmxvY2srKzsKKyAgICAgICAgaWYgKHZhbCA+IDApICAgIHNhdiArPSB2YWw7CisgICAgICAgIGVsc2UgICAgICAgIHNhdiAtPSB2YWw7CisgICAgICAgIHZhbCA9ICpibG9jaysrOworICAgICAgICBpZiAodmFsID4gMCkgICAgc2F2ICs9IHZhbDsKKyAgICAgICAgZWxzZSAgICAgICAgc2F2IC09IHZhbDsKKyAgICAgICAgdmFsID0gKmJsb2NrKys7CisgICAgICAgIGlmICh2YWwgPiAwKSAgICBzYXYgKz0gdmFsOworICAgICAgICBlbHNlICAgICAgICBzYXYgLT0gdmFsOworICAgICAgICB2YWwgPSAqYmxvY2srKzsKKyAgICAgICAgaWYgKHZhbCA+IDApICAgIHNhdiArPSB2YWw7CisgICAgICAgIGVsc2UgICAgICAgIHNhdiAtPSB2YWw7CisgICAgfQorCisgICAgcmV0dXJuIHNhdjsKKworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFNhZDh4OCggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogOC8xMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGaW5kIFNBRCBiZXR3ZWVuIHByZXYgYmxvY2sgYW5kIGN1cnJlbnQgYmxvY2sgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IFByZXZpb3VzIGFuZCBjdXJyZW50IGZyYW1lIGJsb2NrIHBvaW50ZXJzLCBhbmQgZnJhbWUgd2lkdGggICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgOC8xNS8wMSwgIC0gZG8gNCBwaXhlbCBhdCBhIHRpbWUgICAgYXNzdW1pbmcgMzIgYml0IHJlZ2lzdGVyICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitJbnQgU2FkOHg4KFVDaGFyICpjdXIsIFVDaGFyICpwcmV2LCBJbnQgd2lkdGgpCit7CisgICAgVUNoYXIgKmVuZCA9IGN1ciArICh3aWR0aCA8PCAzKTsKKyAgICBJbnQgc2FkID0gMDsKKyAgICBJbnQgKmN1ckludCA9IChJbnQqKSBjdXI7CisgICAgSW50ICpwcmV2SW50ID0gKEludCopIHByZXY7CisgICAgSW50IGN1cjEsIGN1cjIsIHByZXYxLCBwcmV2MjsKKyAgICBVSW50IG1hc2ssIHNnbl9tc2sgPSAweDgwODA4MDgwOworICAgIEludCAgc3VtMiA9IDAsIHN1bTQgPSAwOworICAgIEludCAgdG1wOworICAgIGRvCisgICAgeworICAgICAgICBtYXNrICAgID0gfigweEZGMDApOworICAgICAgICBjdXIxICAgID0gY3VySW50WzFdOyAgICAgICAgLyogbG9hZCBjdXJbNC4uN10gKi8KKyAgICAgICAgY3VyMiAgICA9IGN1ckludFswXTsKKyAgICAgICAgY3VySW50ICs9ICh3aWR0aCA+PiAyKTsgICAgIC8qIGxvYWQgY3VyWzAuLjNdIGFuZCArPWx4ICovCisgICAgICAgIHByZXYxICAgPSBwcmV2SW50WzFdOworICAgICAgICBwcmV2MiAgID0gcHJldkludFswXTsKKyAgICAgICAgcHJldkludCArPSA0OworCisgICAgICAgIHRtcCAgICAgPSBwcmV2MiBeIGN1cjI7CisgICAgICAgIGN1cjIgICAgPSBwcmV2MiAtIGN1cjI7CisgICAgICAgIHRtcCAgICAgPSB0bXAgXiBjdXIyOyAgICAgICAvKiAoXileKC0pIGxhc3QgYml0IGlzIG9uZSBpZiBjYXJyeSAqLworICAgICAgICB0bXAgICAgID0gc2duX21zayAmICgoVUludCl0bXAgPj4gMSk7IC8qIGNoZWNrIHRoZSBzaWduIG9mIGVhY2ggYnl0ZSAqLworICAgICAgICBpZiAoY3VyMiA8IDApICAgdG1wID0gdG1wIHwgMHg4MDAwMDAwMDsgLyogY29yY3VydCBzaWduIG9mIGZpcnN0IGJ5dGUgKi8KKyAgICAgICAgdG1wICAgICA9ICh0bXAgPDwgOCkgLSB0bXA7ICAgICAvKiBjYXJyeSBib3Jyb3dlZCBieXRlcyBhcmUgbWFya2VkIHdpdGggMHgxRkUgKi8KKyAgICAgICAgY3VyMiAgICA9IGN1cjIgKyAodG1wID4+IDcpOyAgICAgLyogbmVnYXRpdmUgYnl0ZXMgaXMgYWRkZWQgd2l0aCAweEZGLCAtMSAqLworICAgICAgICBjdXIyICAgID0gY3VyMiBeKHRtcCA+PiA3KTsgLyogdGFrZSBhYnNvbHV0ZSBieSBpbnZlcnRpbmcgYml0cyAoRU9SKSAqLworCisgICAgICAgIHRtcCAgICAgPSBwcmV2MSBeIGN1cjE7CisgICAgICAgIGN1cjEgICAgPSBwcmV2MSAtIGN1cjE7CisgICAgICAgIHRtcCAgICAgPSB0bXAgXiBjdXIxOyAgICAgICAvKiAoXileKC0pIGxhc3QgYml0IGlzIG9uZSBpZiBjYXJyeSAqLworICAgICAgICB0bXAgICAgID0gc2duX21zayAmICgoVUludCl0bXAgPj4gMSk7IC8qIGNoZWNrIHRoZSBzaWduIG9mIGVhY2ggYnl0ZSAqLworICAgICAgICBpZiAoY3VyMSA8IDApICAgdG1wID0gdG1wIHwgMHg4MDAwMDAwMDsgLyogY29yY3VydCBzaWduIG9mIGZpcnN0IGJ5dGUgKi8KKyAgICAgICAgdG1wICAgICA9ICh0bXAgPDwgOCkgLSB0bXA7ICAgICAvKiBjYXJyeSBib3Jyb3dlZCBieXRlcyBhcmUgbWFya2VkIHdpdGggMHgxRkUgKi8KKyAgICAgICAgY3VyMSAgICA9IGN1cjEgKyAodG1wID4+IDcpOyAgICAgLyogbmVnYXRpdmUgYnl0ZXMgaXMgYWRkZWQgd2l0aCAweEZGLCAtMSAqLworICAgICAgICBjdXIxICAgID0gY3VyMSBeKHRtcCA+PiA3KTsgLyogdGFrZSBhYnNvbHV0ZSBieSBpbnZlcnRpbmcgYml0cyAoRU9SKSAqLworCisgICAgICAgIHN1bTQgICAgPSBzdW00ICsgY3VyMTsKKyAgICAgICAgY3VyMSAgICA9IGN1cjEgJiAobWFzayA8PCA4KTsgICAvKiBtYXNrIGZpcnN0IGFuZCB0aGlyZCBieXRlcyAqLworICAgICAgICBzdW0yICAgID0gc3VtMiArICgoVUludCljdXIxID4+IDgpOworICAgICAgICBzdW00ICAgID0gc3VtNCArIGN1cjI7CisgICAgICAgIGN1cjIgICAgPSBjdXIyICYgKG1hc2sgPDwgOCk7ICAgLyogbWFzayBmaXJzdCBhbmQgdGhpcmQgYnl0ZXMgKi8KKyAgICAgICAgc3VtMiAgICA9IHN1bTIgKyAoKFVJbnQpY3VyMiA+PiA4KTsKKyAgICB9CisgICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisKKyAgICBjdXIxID0gc3VtNCAtIChzdW0yIDw8IDgpOyAgLyogZ2V0IGV2ZW4tc3VtICovCisgICAgY3VyMSA9IGN1cjEgKyBzdW0yOyAgICAgICAgIC8qIGFkZCAxNiBiaXQgZXZlbi1zdW0gYW5kIG9kZC1zdW0qLworICAgIGN1cjEgPSBjdXIxICsgKGN1cjEgPDwgMTYpOyAvKiBhZGQgdXBwZXIgYW5kIGxvd2VyIDE2IGJpdCBzdW0gKi8KKyAgICBzYWQgID0gKChVSW50KWN1cjEgPj4gMTYpOyAgLyogdGFrZSB1cHBlciAxNiBiaXQgKi8KKyAgICByZXR1cm4gc2FkOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IGdldEJsb2NrU3VtKCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogOC8xMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGaW5kIHN1bW1hdGlvbiBvZiB2YWx1ZSB3aXRoaW4gYSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IFBvaW50ZXIgdG8gY3VycmVudCBibG9jayBpbiBhIGZyYW1lIGFuZCBmcmFtZSB3aWR0aCAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDgvMTUvMDEsICAtIFNJTUQgNCBwaXhlbHMgYXQgYSB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworSW50IGdldEJsb2NrU3VtKFVDaGFyICpjdXIsIEludCB3aWR0aCkKK3sKKyAgICBJbnQgc2FkID0gMCwgc3VtNCA9IDAsIHN1bTIgPSAwOworICAgIFVDaGFyICplbmQgPSBjdXIgKyAod2lkdGggPDwgMyk7CisgICAgSW50ICpjdXJJbnQgPSAoSW50KiljdXI7CisgICAgVUludCBtYXNrICAgPSB+KDB4RkYwMCk7CisgICAgSW50IGxvYWQxLCBsb2FkMjsKKworICAgIGRvCisgICAgeworICAgICAgICBsb2FkMSA9IGN1ckludFsxXTsKKyAgICAgICAgbG9hZDIgPSBjdXJJbnRbMF07CisgICAgICAgIGN1ckludCArPSAod2lkdGggPj4gMik7CisgICAgICAgIHN1bTQgKz0gbG9hZDE7CisgICAgICAgIGxvYWQxID0gbG9hZDEgJiAobWFzayA8PCA4KTsgLyogZXZlbiBieXRlcyAqLworICAgICAgICBzdW0yICs9ICgoVUludClsb2FkMSA+PiA4KTsgLyogc3VtIGV2ZW4gYnl0ZXMsIDE2IGJpdCAqLworICAgICAgICBzdW00ICs9IGxvYWQyOworICAgICAgICBsb2FkMiA9IGxvYWQyICYgKG1hc2sgPDwgOCk7IC8qIGV2ZW4gYnl0ZXMgKi8KKyAgICAgICAgc3VtMiArPSAoKFVJbnQpbG9hZDIgPj4gOCk7IC8qIHN1bSBldmVuIGJ5dGVzLCAxNiBiaXQgKi8KKyAgICB9CisgICAgd2hpbGUgKChVSW50KWN1ckludCA8IChVSW50KWVuZCk7CisgICAgbG9hZDEgPSBzdW00IC0gKHN1bTIgPDwgOCk7ICAgICAvKiBnZXQgZXZlbi1zdW0gKi8KKyAgICBsb2FkMSA9IGxvYWQxICsgc3VtMjsgICAgICAgICAgIC8qIGFkZCAxNiBiaXQgZXZlbi1zdW0gYW5kIG9kZC1zdW0qLworICAgIGxvYWQxID0gbG9hZDEgKyAobG9hZDEgPDwgMTYpOyAgLyogYWRkIHVwcGVyIGFuZCBsb3dlciAxNiBiaXQgc3VtICovCisgICAgc2FkICA9ICgoVUludClsb2FkMSA+PiAxNik7IC8qIHRha2UgdXBwZXIgMTYgYml0ICovCisKKyAgICByZXR1cm4gc2FkOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2YTY2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuaApAQCAtMCwwICsxLDEwMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAqLworLyogIEZpbGU6IEZhc3RDb2RlTUIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVzY3JpcHRpb246IFRoaXMgZmlsZSBjb250YWlucyBzdHJ1Y3R1cmUgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgdXNlZAorICAgICAgICAgICAgaW4gRmFzdENvZGVNQigpIGZ1bmN0aW9uLiBXaGVuIGl0IGlzIGRlY2lkZWQgdG8gdXNlIEZhc3RDb2RlTUIKKyAgICAgICAgICAgIGluc3RlYWQgb2YgQ29kZU1CLCBhbGwgb2YgdGhpcyBwcm90b3R5cGVzIHNob3VsZCBiZSBtaWdyYXRlZCB0bworICAgICAgICAgICAgbXA0ZW5jX2xpYi5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGVkOiA4LzE0LzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKK3R5cGVkZWYgc3RydWN0IHN0cnVjdF9hcHByb3hEQ1QgIGFwcHJveERDVDsKK3N0cnVjdCBzdHJ1Y3RfYXBwcm94RENUCit7CisgICAgY29uc3QgSW50ICpzY2FsZTsKKyAgICBJbnQoKkRDVCkoSW50IGJsb2NrWyBdLCBJbnQgY29lZmZbIF0sIGFwcHJveERDVCAqKTsKKworICAgIC8vIFRocmVzaG9sZCB2YWx1ZSBmb3IgSC4yNjMgUXVhbnRpemVyCisgICAgSW50IHRoX2FwcF9hbGxbOF07CisgICAgSW50IHRoX2FwcF9vZGRbOF07CisgICAgSW50IHRoX2FwcF9ldmVuWzhdOworICAgIEludCB0aF9hcHBfZXZlbjFbOF07CisgICAgSW50IHRoX2FwcF9ldmVuMls4XTsKK307CisKK3N0cnVjdCBRUHN0cnVjdAoreworICAgIEludCBRUHgyIDsKKyAgICBJbnQgUVA7CisgICAgSW50IFFQZGl2MjsKKyAgICBJbnQgUVB4MnBsdXM7CisgICAgSW50IEFkZGl0aW9uOworfTsKKworLyotLS0tIEZhc3RDb2RlTUIuYyAtLS0tLSovCit2b2lkIGluaXRDb2RlTUIoYXBwcm94RENUICpmdW5jdGlvbiwgSW50IFFQKTsKK1BWX1NUQVRVUyBDb2RlTUJfSDI2MyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBhcHByb3hEQ1QgKmZ1bmN0aW9uLCBJbnQgUVAsIEludCBuY29lZmJsY2tbXSwgSW50IG9mZnNldCk7CitQVl9TVEFUVVMgQ29kZU1CX01QRUcoVmlkZW9FbmNEYXRhICp2aWRlbywgYXBwcm94RENUICpmdW5jdGlvbiwgSW50IFFQLCBJbnQgbmNvZWZibGNrW10sIEludCBvZmZzZXQpOworSW50IGdldEJsb2NrU0FWKEludCBibG9ja1tdKTsKK0ludCBTYWQ4eDgoVUNoYXIgKnJlYywgVUNoYXIgKnByZXYsIEludCBseCk7CitJbnQgZ2V0QmxvY2tTdW0oVUNoYXIgKnJlYywgSW50IGx4KTsKKworLyotLS0tIEFwcFZDQV9kY3QuYyAtLS0tLSovCitJbnQgICAgIEFwcFZDQTFfZGN0KEludCBibG9ja1tdLCBJbnQgb3V0WyBdLCBhcHByb3hEQ1QgKmZ1bmN0aW9uKTsKK0ludCAgICAgQXBwVkNBMl9kY3QoSW50IGJsb2NrW10sIEludCBvdXRbIF0sIGFwcHJveERDVCAqZnVuY3Rpb24pOworSW50ICAgICBBcHBWQ0EzX2RjdChJbnQgYmxvY2tbXSwgSW50IG91dFsgXSwgYXBwcm94RENUICpmdW5jdGlvbik7CitJbnQgICAgIEFwcFZDQTRfZGN0KEludCBibG9ja1tdLCBJbnQgb3V0WyBdLCBhcHByb3hEQ1QgKmZ1bmN0aW9uKTsKK0ludCAgICAgQXBwVkNBNV9kY3QoSW50IGJsb2NrW10sIEludCBvdXRbIF0sIGFwcHJveERDVCAqZnVuY3Rpb24pOworCisvKi0tLS0gRmFzdFF1YW50LmMgLS0tLS0qLworSW50IGNhbF9kY19zY2FsZXJFTkMoSW50IFFQLCBJbnQgdHlwZSkgOworSW50IEJsb2NrUXVhbnREZXF1YW50SDI2M0ludGVyKEludCAqcmNvZWZmLCBJbnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIEludCBjb21wLCBJbnQgZHVtbXkpOworCitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzSW50cmEoSW50ICpyY29lZmYsIEludCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgSW50IGNvbXAsIEludCBkY19zY2FsZXIpOworCitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRlcihJbnQgKnJjb2VmZiwgSW50ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZHVtbXkpOworCitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRyYShJbnQgKnJjb2VmZiwgSW50ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZGNfc2NhbGVyKTsKKworSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0ludGVyKEludCAqcmNvZWZmLCBJbnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgRGN0TW9kZSwgSW50IGNvbXAsIEludCBkY19zY2FsZXIpOworCitJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHSW50cmEoSW50ICpyY29lZmYsIEludCAqcWNvZWZmLCBJbnQgUVAsIEludCAqcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBEY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlcik7CisKK0ludCBCbG9ja1F1YW50RGVxdWFudE1QRUdEQ0ludGVyKEludCAqcmNvZWZmLCBJbnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZHVtbXkpOworCitJbnQgQmxvY2tRdWFudERlcXVhbnRNUEVHRENJbnRyYShJbnQgKnJjb2VmZiwgSW50ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGRjX3NjYWxlcik7CisKKy8qLS0tLSBGYXN0SURDVC5jIC0tLS0tKi8KK3ZvaWQgQmxvY2tJRENUTW90aW9uQ29tcChJbnQgKmJsb2NrLCBVQ2hhciAqYml0bWFwY29sLCBVQ2hhciBiaXRtYXByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIFVDaGFyICpyZWMsIEludCBseCwgSW50IGludHJhKTsKKworLyotLS0tIG1vdGlvbl9jb21wLmMgLS0tLS0qLwordm9pZCBQdXRTa2lwcGVkQmxvY2soVUNoYXIgKnJlYywgVUNoYXIgKnByZXYsIEludCBseCk7CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDc0MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKQEAgLTAsMCArMSwyMDIwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVWSVNJT04gSElTVE9SWQorIFdobzogICBEYXRlOiBKdWx5LzIwMDEKKyBEZXNjcmlwdGlvbjogICAxLiBPcHRpbWl6ZWQgQmxvY2tJRENUIGJpdG1hcCBjaGVja2luZy4KKyAgICAgICAgICAgICAgICAyLiBSZWFycmFuZ2VkIGZ1bmN0aW9ucy4KKyAgICAgICAgICAgICAgICAzLiBEbyBjb2x1bW4gSURDVCBmaXJzdCwgdGhlbiByb3cgSURDVC4KKyAgICAgICAgICAgICAgICA0LiBDb21iaW5lIG1vdGlvbiBjb21wIGFuZCBJRENULCByZXF1aXJlCisgICAgICAgICAgICAgICAgICAgdHdvIHNldHMgb2Ygcm93IElEQ1RzIG9uZSBmb3IgSU5UUkEKKyAgICAgICAgICAgICAgICAgICBhbmQgb25lIGZvciBJTlRFUi4KKyAgICAgICAgICAgICAgICA1LiBBZGQgQUFOIElEQ1QKKworIFdobzogICBEYXRlOiA4LzE2LzAxCisgICAgICAgICAgICAgICAgMS4gSW5jcmVhc2UgdGhlIGlucHV0IHByZWNpc2lvbiB0byA4IGJpdHMsIGkuZS4gY2hhbmdlIFJEQ1RCSVRTCisgICAgICAgICAgICAgICAgICAgdG8gMTEsIGhhdmUgdG8gY29tbWVudCBvdXQgYWxsIGluLWxpbmUgYXNzZW1ibHkgc2luY2UgMTYgYml0CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpY2F0aW9uIGRvZXNuJ3Qgd29yay4gVHJ5IHRvIHVzZSBkaWZmZW50IHByZWNpc2lvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgIDMyIGJpdCBtdWx0LiBidXQgaGFzbid0IGZpbmlzaGVkLiBUdXJucyBvdXQgdGhhdCB3aXRob3V0IGluLWxpbmUKKyAgICAgICAgICAgICAgICAgICAgYXNzZW1ibHkgdGhlIHBlcmZvcm1hbmNlIGRvZXNuJ3QgY2hhbmdlIG11Y2ggKG9ubHkgMSUpLgorIFdobzogICBEYXRlOiA5LzA0LzA1CisgICAgICAgICAgICAgICAgMS4gUmVwbGFjZSBBQU4gSURDVCB3aXRoIENoZW4ncyBJRENUIHRvIGFjY29tbW9kYXRlIDE2IGJpdCBkYXRhIHR5cGUuCisKKyovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJkY3QuaCIKKworI2RlZmluZSBBRERfQ0xJUCAgICB7IFwKKyAgICAgICAgICAgIHRtcCA9ICpyZWMgKyB0bXA7IFwKKyAgICAgICAgaWYoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayYofih0bXA+PjMxKSk7IFwKKyAgICAgICAgKnJlYysrID0gdG1wOyAgIFwKKyAgICAgICAgfQorCisjZGVmaW5lIElOVFJBX0NMSVAgIHsgXAorICAgICAgICBpZigoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrJih+KHRtcD4+MzEpKTsgXAorICAgICAgICAqcmVjKysgPSB0bXA7ICAgXAorICAgICAgICB9CisKKworI2RlZmluZSBDTElQX1JFU1VMVCh4KSAgICAgIGlmKChVSW50KXggPiAweEZGKXt4ID0gMHhGRiAmICh+KHg+PjMxKSk7fQorI2RlZmluZSBBRERfQU5EX0NMSVAxKHgpICAgIHggKz0gKHByZWRfd29yZCYweEZGKTsgQ0xJUF9SRVNVTFQoeCk7CisjZGVmaW5lIEFERF9BTkRfQ0xJUDIoeCkgICAgeCArPSAoKHByZWRfd29yZD4+OCkmMHhGRik7IENMSVBfUkVTVUxUKHgpOworI2RlZmluZSBBRERfQU5EX0NMSVAzKHgpICAgIHggKz0gKChwcmVkX3dvcmQ+PjE2KSYweEZGKTsgQ0xJUF9SRVNVTFQoeCk7CisjZGVmaW5lIEFERF9BTkRfQ0xJUDQoeCkgICAgeCArPSAoKHByZWRfd29yZD4+MjQpJjB4RkYpOyBDTElQX1JFU1VMVCh4KTsKKworCit2b2lkIGlkY3RfY29sMChTaG9ydCAqYmxrKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhibGspOworCisgICAgcmV0dXJuOworfQorCit2b2lkIGlkY3RfY29sMShTaG9ydCAqYmxrKQoreworICAgIGJsa1swXSA9IGJsa1s4XSA9IGJsa1sxNl0gPSBibGtbMjRdID0gYmxrWzMyXSA9IGJsa1s0MF0gPSBibGtbNDhdID0gYmxrWzU2XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrWzBdIDw8IDM7CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X2NvbDIoU2hvcnQgKmJsaykKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgzLCB4NSwgeDc7Ly8sIHg4OworCisgICAgeDEgPSBibGtbOF07CisgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCAxMSkgKyAxMjg7CisgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworCisgICAgeDcgPSBXNyAqIHgxOworICAgIHgxID0gVzEgKiB4MTsKKworICAgIHgzID0geDc7CisgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OworICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKKworICAgIGJsa1swXSA9ICh4MCArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICh4MCArIHg3KSA+PiA4OworICAgIGJsa1sxNl0gPSAoeDAgKyB4NSkgPj4gODsKKyAgICBibGtbMjRdID0gKHgwICsgeDMpID4+IDg7CisgICAgYmxrWzU2XSA9ICh4MCAtIHgxKSA+PiA4OworICAgIGJsa1s0OF0gPSAoeDAgLSB4NykgPj4gODsKKyAgICBibGtbNDBdID0gKHgwIC0geDUpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4MCAtIHgzKSA+PiA4OworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9jb2wzKFNob3J0ICpibGspCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKworICAgIHgyID0gYmxrWzE2XTsKKyAgICB4MSA9IGJsa1s4XTsKKyAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKKworICAgIHg0ID0geDA7CisgICAgeDYgPSBXNiAqIHgyOworICAgIHgyID0gVzIgKiB4MjsKKyAgICB4OCA9IHgwIC0geDI7CisgICAgeDAgKz0geDI7CisgICAgeDIgPSB4ODsKKyAgICB4OCA9IHg0IC0geDY7CisgICAgeDQgKz0geDY7CisgICAgeDYgPSB4ODsKKworICAgIHg3ID0gVzcgKiB4MTsKKyAgICB4MSA9IFcxICogeDE7CisgICAgeDMgPSB4NzsKKyAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgYmxrWzBdID0gKHgwICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKHg0ICsgeDcpID4+IDg7CisgICAgYmxrWzE2XSA9ICh4NiArIHg1KSA+PiA4OworICAgIGJsa1syNF0gPSAoeDIgKyB4MykgPj4gODsKKyAgICBibGtbNTZdID0gKHgwIC0geDEpID4+IDg7CisgICAgYmxrWzQ4XSA9ICh4NCAtIHg3KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDYgLSB4NSkgPj4gODsKKyAgICBibGtbMzJdID0gKHgyIC0geDMpID4+IDg7CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X2NvbDQoU2hvcnQgKmJsaykKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIHgyID0gYmxrWzE2XTsKKyAgICB4MSA9IGJsa1s4XTsKKyAgICB4MyA9IGJsa1syNF07CisgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCAxMSkgKyAxMjg7CisKKyAgICB4NCA9IHgwOworICAgIHg2ID0gVzYgKiB4MjsKKyAgICB4MiA9IFcyICogeDI7CisgICAgeDggPSB4MCAtIHgyOworICAgIHgwICs9IHgyOworICAgIHgyID0geDg7CisgICAgeDggPSB4NCAtIHg2OworICAgIHg0ICs9IHg2OworICAgIHg2ID0geDg7CisKKyAgICB4NyA9IFc3ICogeDE7CisgICAgeDEgPSBXMSAqIHgxOworICAgIHg1ID0gVzMgKiB4MzsKKyAgICB4MyA9IC1XNSAqIHgzOworICAgIHg4ID0geDEgLSB4NTsKKyAgICB4MSArPSB4NTsKKyAgICB4NSA9IHg4OworICAgIHg4ID0geDcgLSB4MzsKKyAgICB4MyArPSB4NzsKKyAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7CisgICAgeDUgPSAoMTgxICogKHg1IC0geDgpICsgMTI4KSA+PiA4OworCisKKyAgICBibGtbMF0gPSAoeDAgKyB4MSkgPj4gODsKKyAgICBibGtbOF0gPSAoeDQgKyB4NykgPj4gODsKKyAgICBibGtbMTZdID0gKHg2ICsgeDUpID4+IDg7CisgICAgYmxrWzI0XSA9ICh4MiArIHgzKSA+PiA4OworICAgIGJsa1s1Nl0gPSAoeDAgLSB4MSkgPj4gODsKKyAgICBibGtbNDhdID0gKHg0IC0geDcpID4+IDg7CisgICAgYmxrWzQwXSA9ICh4NiAtIHg1KSA+PiA4OworICAgIGJsa1szMl0gPSAoeDIgLSB4MykgPj4gODsKKyAgICByZXR1cm4gOworfQorCisjaWZuZGVmIFNNQUxMX0RDVAordm9pZCBpZGN0X2NvbDB4NDAoU2hvcnQgKmJsaykKK3sKKyAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsvLywgeDg7CisKKyAgICB4MSA9IGJsa1s4XTsKKyAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisKKyAgICB4NyA9IFc3ICogeDE7CisgICAgeDEgPSBXMSAqIHgxOworCisgICAgeDMgPSB4NzsKKyAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7CisgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgYmxrWzBdID0gKDEyOCArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICgxMjggKyB4NykgPj4gODsKKyAgICBibGtbMTZdID0gKDEyOCArIHg1KSA+PiA4OworICAgIGJsa1syNF0gPSAoMTI4ICsgeDMpID4+IDg7CisgICAgYmxrWzU2XSA9ICgxMjggLSB4MSkgPj4gODsKKyAgICBibGtbNDhdID0gKDEyOCAtIHg3KSA+PiA4OworICAgIGJsa1s0MF0gPSAoMTI4IC0geDUpID4+IDg7CisgICAgYmxrWzMyXSA9ICgxMjggLSB4MykgPj4gODsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9jb2wweDIwKFNob3J0ICpibGspCit7CisgICAgaW50MzIgeDAsIHgyLCB4NCwgeDY7CisKKyAgICB4MiA9IGJsa1sxNl07CisgICAgeDYgPSBXNiAqIHgyOworICAgIHgyID0gVzIgKiB4MjsKKyAgICB4MCA9IDEyOCArIHgyOworICAgIHgyID0gMTI4IC0geDI7CisgICAgeDQgPSAxMjggKyB4NjsKKyAgICB4NiA9IDEyOCAtIHg2OworCisgICAgYmxrWzBdID0gKHgwKSA+PiA4OworICAgIGJsa1s1Nl0gPSAoeDApID4+IDg7CisgICAgYmxrWzhdID0gKHg0KSA+PiA4OworICAgIGJsa1s0OF0gPSAoeDQpID4+IDg7CisgICAgYmxrWzE2XSA9ICh4NikgPj4gODsKKyAgICBibGtbNDBdID0gKHg2KSA+PiA4OworICAgIGJsa1syNF0gPSAoeDIpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4MikgPj4gODsKKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9jb2wweDEwKFNob3J0ICpibGspCit7CisgICAgaW50MzIgeDEsIHgzLCB4NSwgIHg3OworCisgICAgeDMgPSBibGtbMjRdOworICAgIHgxID0gVzMgKiB4MzsKKyAgICB4MyA9IFc1ICogeDM7CisKKyAgICB4NyA9ICgxODEgKiAoeDMgLSB4MSkgKyAxMjgpID4+IDg7CisgICAgeDUgPSAoLTE4MSAqICh4MSArIHgzKSArIDEyOCkgPj4gODsKKworCisgICAgYmxrWzBdID0gKDEyOCArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICgxMjggKyB4NykgPj4gODsKKyAgICBibGtbMTZdID0gKDEyOCArIHg1KSA+PiA4OworICAgIGJsa1syNF0gPSAoMTI4IC0geDMpID4+IDg7CisgICAgYmxrWzU2XSA9ICgxMjggLSB4MSkgPj4gODsKKyAgICBibGtbNDhdID0gKDEyOCAtIHg3KSA+PiA4OworICAgIGJsa1s0MF0gPSAoMTI4IC0geDUpID4+IDg7CisgICAgYmxrWzMyXSA9ICgxMjggKyB4MykgPj4gODsKKworICAgIHJldHVybiA7Cit9CisKKyNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KKwordm9pZCBpZGN0X2NvbChTaG9ydCAqYmxrKQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisKKyAgICB4MSA9IChpbnQzMilibGtbMzJdIDw8IDExOworICAgIHgyID0gYmxrWzQ4XTsKKyAgICB4MyA9IGJsa1sxNl07CisgICAgeDQgPSBibGtbOF07CisgICAgeDUgPSBibGtbNTZdOworICAgIHg2ID0gYmxrWzQwXTsKKyAgICB4NyA9IGJsa1syNF07CisgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCAxMSkgKyAxMjg7CisKKyAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgIHg4ID0gVzcgKiAoeDQgKyB4NSk7CisgICAgeDQgPSB4OCArIChXMSAtIFc3KSAqIHg0OworICAgIHg1ID0geDggLSAoVzEgKyBXNykgKiB4NTsKKyAgICB4OCA9IFczICogKHg2ICsgeDcpOworICAgIHg2ID0geDggLSAoVzMgLSBXNSkgKiB4NjsKKyAgICB4NyA9IHg4IC0gKFczICsgVzUpICogeDc7CisKKyAgICAvKiBzZWNvbmQgc3RhZ2UgKi8KKyAgICB4OCA9IHgwICsgeDE7CisgICAgeDAgLT0geDE7CisgICAgeDEgPSBXNiAqICh4MyArIHgyKTsKKyAgICB4MiA9IHgxIC0gKFcyICsgVzYpICogeDI7CisgICAgeDMgPSB4MSArIChXMiAtIFc2KSAqIHgzOworICAgIHgxID0geDQgKyB4NjsKKyAgICB4NCAtPSB4NjsKKyAgICB4NiA9IHg1ICsgeDc7CisgICAgeDUgLT0geDc7CisKKyAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgIHg3ID0geDggKyB4MzsKKyAgICB4OCAtPSB4MzsKKyAgICB4MyA9IHgwICsgeDI7CisgICAgeDAgLT0geDI7CisgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgIGJsa1swXSAgICA9ICh4NyArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICh4MyArIHgyKSA+PiA4OworICAgIGJsa1sxNl0gPSAoeDAgKyB4NCkgPj4gODsKKyAgICBibGtbMjRdID0gKHg4ICsgeDYpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4OCAtIHg2KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDAgLSB4NCkgPj4gODsKKyAgICBibGtbNDhdID0gKHgzIC0geDIpID4+IDg7CisgICAgYmxrWzU2XSA9ICh4NyAtIHgxKSA+PiA4OworCisgICAgcmV0dXJuIDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBhdCBhbGwgKioqKi8KK3ZvaWQgaWRjdF9yb3cwSW50ZXIoU2hvcnQgKnNyY2UsIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoc3JjZSk7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcocmVjKTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhseCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cxSW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludCB0bXA7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHRtcCA9ICgqKGJsayArPSA4KSArIDMyKSA+PiA2OworICAgICAgICAqYmxrID0gMDsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKz0gbHgpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSB0bXAgKyAocHJlZF93b3JkICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIHJlczIgPSB0bXAgKyAoKHByZWRfd29yZCA+PiA4KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMTYpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopcmVjKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9IHRtcCArIChwcmVkX3dvcmQgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgcmVzMiA9IHRtcCArICgocHJlZF93b3JkID4+IDgpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDI0KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGlkY3Rfcm93MkludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4NSA9IChXNyAqIHg0ICsgNCkgPj4gMzsKKyAgICAgICAgeDQgPSAoVzEgKiB4NCArIDQpID4+IDM7CisKKyAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgICAgICB4MSA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArPSBseCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCArIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgwICsgeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MCArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwIC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MCAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93M0ludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBibGsgLT0gODsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1sxMF07CisgICAgICAgIGJsa1sxMF0gPSAwOworICAgICAgICB4MSA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisgICAgICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KKyAgICAgICAgLyogYm90aCB4Mm9yeDYgYW5kIHgwb3J4NCAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgzID0geDc7CisgICAgICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArPSBseCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg0ICsgeDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDYgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MiArIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgyIC0geDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDYgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NCAtIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3c0SW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDUgPSAoVzMgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHgzID0gKC0gVzUgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDEgLSB4NTsKKyAgICAgICAgeDEgKz0geDU7CisgICAgICAgIHg1ID0geDg7CisgICAgICAgIHg4ID0geDcgLSB4MzsKKyAgICAgICAgeDMgKz0geDc7CisgICAgICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDUgPSAoMTgxICogKHg1IC0geDgpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArPSBseCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg0ICsgeDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDYgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MiArIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgyIC0geDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDYgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NCAtIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCisjaWZuZGVmIFNNQUxMX0RDVAordm9pZCBpZGN0X3JvdzB4NDBJbnRlcihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzFdOworICAgICAgICBibGtbMV0gPSAwOworICAgICAgICBibGsgKz0gODsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKDgxOTIgKyB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICg4MTkyICsgeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoODE5MiArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKDgxOTIgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopcmVjKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICg4MTkyIC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoODE5MiAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKDgxOTIgLSB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICg4MTkyIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93MHgyMEludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDIsIHg0LCB4NjsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDIgPSBibGtbMl07CisgICAgICAgIGJsa1syXSA9IDA7CisgICAgICAgIGJsayArPSA4OyAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDAgPSA4MTkyICsgeDI7CisgICAgICAgIHgyID0gODE5MiAtIHgyOworICAgICAgICB4NCA9IDgxOTIgKyB4NjsKKyAgICAgICAgeDYgPSA4MTkyIC0geDY7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKilyZWMpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShyZWMgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93MHgxMEludGVyKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MSwgeDMsIHg1LCB4NzsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDMgPSBibGtbM107CisgICAgICAgIGJsa1szXSA9IDA7CisgICAgICAgIGJsayArPSA4OworCisgICAgICAgIHgxID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9ICgtVzUgKiB4MyArIDQpID4+IDM7CisKKyAgICAgICAgeDcgPSAoLTE4MSAqICh4MyArIHgxKSArIDEyOCkgPj4gODsKKyAgICAgICAgeDUgPSAoMTgxICogKHgzIC0geDEpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArPSBseCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICg4MTkyICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoODE5MiArIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKDgxOTIgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICg4MTkyICsgeDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKXJlYykgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHJlYyArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoODE5MiAtIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKDgxOTIgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICg4MTkyIC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoODE5MiAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmIC8qIFNNQUxMX0RDVCAqLworCit2b2lkIGlkY3Rfcm93SW50ZXIoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IGkgPSA4OworICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOworICAgIGludCByZXMsIHJlczI7CisKKyAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgxID0gKGludDMyKWJsa1sxMl0gPDwgODsKKyAgICAgICAgYmxrWzEyXSA9IDA7CisgICAgICAgIHgyID0gYmxrWzE0XTsKKyAgICAgICAgYmxrWzE0XSA9IDA7CisgICAgICAgIHgzID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4NSA9IGJsa1sxNV07CisgICAgICAgIGJsa1sxNV0gPSAwOworICAgICAgICB4NiA9IGJsa1sxM107CisgICAgICAgIGJsa1sxM10gPSAwOworICAgICAgICB4NyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDggPSBXNyAqICh4NCArIHg1KSArIDQ7CisgICAgICAgIHg0ID0gKHg4ICsgKFcxIC0gVzcpICogeDQpID4+IDM7CisgICAgICAgIHg1ID0gKHg4IC0gKFcxICsgVzcpICogeDUpID4+IDM7CisgICAgICAgIHg4ID0gVzMgKiAoeDYgKyB4NykgKyA0OworICAgICAgICB4NiA9ICh4OCAtIChXMyAtIFc1KSAqIHg2KSA+PiAzOworICAgICAgICB4NyA9ICh4OCAtIChXMyArIFc1KSAqIHg3KSA+PiAzOworCisgICAgICAgIC8qIHNlY29uZCBzdGFnZSAqLworICAgICAgICB4OCA9IHgwICsgeDE7CisgICAgICAgIHgwIC09IHgxOworICAgICAgICB4MSA9IFc2ICogKHgzICsgeDIpICsgNDsKKyAgICAgICAgeDIgPSAoeDEgLSAoVzIgKyBXNikgKiB4MikgPj4gMzsKKyAgICAgICAgeDMgPSAoeDEgKyAoVzIgLSBXNikgKiB4MykgPj4gMzsKKyAgICAgICAgeDEgPSB4NCArIHg2OworICAgICAgICB4NCAtPSB4NjsKKyAgICAgICAgeDYgPSB4NSArIHg3OworICAgICAgICB4NSAtPSB4NzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4NyA9IHg4ICsgeDM7CisgICAgICAgIHg4IC09IHgzOworICAgICAgICB4MyA9IHgwICsgeDI7CisgICAgICAgIHgwIC09IHgyOworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKworICAgICAgICByZXMgPSAoeDcgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MyArIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDggKyB4NikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopcmVjKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocmVjICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisKKyAgICAgICAgcmVzID0gKHg4IC0geDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgLSB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MyAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHg3IC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cwSW50cmEoU2hvcnQgKnNyY2UsIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoc3JjZSk7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcocmVjKTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhseCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cxSW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHRtcDsKKyAgICBpbnQgaSA9IDg7CisKKyAgICByZWMgLT0gbHg7CisgICAgYmxrIC09IDg7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHRtcCA9ICgoKihibGsgKz0gOCkgKyAzMikgPj4gNik7CisgICAgICAgICpibGsgPSAwOworICAgICAgICBDTElQX1JFU1VMVCh0bXApCisKKyAgICAgICAgdG1wIHw9ICh0bXAgPDwgOCk7CisgICAgICAgIHRtcCB8PSAodG1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSB0bXA7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IHRtcDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGlkY3Rfcm93MkludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisgICAgaW50IGkgPSA4OworCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICAvKiBzaG9ydGN1dCAqLworICAgICAgICB4NCA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOyAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcmVzID0gKCh4MCArIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDAgKyB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHgwICsgeDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MCArIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7CisKKyAgICAgICAgcmVzID0gKCh4MCAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDAgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHgwIC0geDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MCAtIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOworICAgIH0KKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93M0ludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCByZXMsIHJlczI7CisgICAgdWludDMyIGRzdF93b3JkOworICAgIGludCBpID0gODsKKworICAgIHJlYyAtPSBseDsKKyAgICBibGsgLT0gODsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDIgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDEgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSB4NzsKKyAgICAgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OworICAgICAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcmVzID0gKCh4MCArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDQgKyB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHg2ICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MiArIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7CisKKyAgICAgICAgcmVzID0gKCh4MiAtIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDYgLSB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHg0IC0geDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MCAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOworCisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3c0SW50cmEoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgSW50IGx4KQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisgICAgaW50IGkgPSA4OworCisgICAgcmVjIC09IGx4OworICAgIGJsayAtPSA4OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1sxMF07CisgICAgICAgIGJsa1sxMF0gPSAwOworICAgICAgICB4MSA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDMgPSBibGtbMTFdOworICAgICAgICBibGtbMTFdID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOyAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICB4NCA9IHgwOworICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDAgLSB4MjsKKyAgICAgICAgeDAgKz0geDI7CisgICAgICAgIHgyID0geDg7CisgICAgICAgIHg4ID0geDQgLSB4NjsKKyAgICAgICAgeDQgKz0geDY7CisgICAgICAgIHg2ID0geDg7CisKKyAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOworICAgICAgICB4NSA9IChXMyAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSAoLSBXNSAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MSAtIHg1OworICAgICAgICB4MSArPSB4NTsKKyAgICAgICAgeDUgPSB4ODsKKyAgICAgICAgeDggPSB4NyAtIHgzOworICAgICAgICB4MyArPSB4NzsKKyAgICAgICAgeDcgPSAoMTgxICogKHg1ICsgeDgpICsgMTI4KSA+PiA4OworICAgICAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcmVzID0gKCh4MCArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDQgKyB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHg2ICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MiArIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7CisKKyAgICAgICAgcmVzID0gKCh4MiAtIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoeDYgLSB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHg0IC0geDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MCAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKyNpZm5kZWYgU01BTExfRENUCit2b2lkIGlkY3Rfcm93MHg0MEludHJhKFNob3J0ICpibGssIFVDaGFyICpyZWMsIEludCBseCkKK3sKKyAgICBpbnQzMiAgeDEsIHgyLCB4NCwgeDU7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisgICAgaW50IGkgPSA4OworCisgICAgcmVjIC09IGx4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzFdOworICAgICAgICBibGtbMV0gPSAwOworICAgICAgICBibGsgKz0gODsKKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4NSA9IChXNyAqIHg0ICsgNCkgPj4gMzsKKyAgICAgICAgeDQgPSAoVzEgKiB4NCArIDQpID4+IDM7CisKKyAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgICAgICB4MSA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgICAgIHJlcyA9ICgoODE5MiArIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgcmVzMiA9ICgoODE5MiArIHgyKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoODE5MiArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICgoODE5MiArIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7CisKKyAgICAgICAgcmVzID0gKCg4MTkyIC0geDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCg4MTkyIC0geDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMikKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKCg4MTkyIC0geDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCg4MTkyIC0geDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7CisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzB4MjBJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgyLCB4NCwgeDY7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisgICAgaW50IGkgPSA4OworCisgICAgcmVjIC09IGx4OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1syXTsKKyAgICAgICAgYmxrWzJdID0gMDsKKyAgICAgICAgYmxrICs9IDg7CisKKyAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDAgPSA4MTkyICsgeDI7CisgICAgICAgIHgyID0gODE5MiAtIHgyOworICAgICAgICB4NCA9IDgxOTIgKyB4NjsKKyAgICAgICAgeDYgPSA4MTkyIC0geDY7CisKKyAgICAgICAgcmVzID0gKCh4MCkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpCisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICgoeDYpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCh4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOworCisgICAgICAgIHJlcyA9ICgoeDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCh4NikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICgoeDApID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7CisKKyAgICB9CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzB4MTBJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDEsIHgzLCB4NSwgeDc7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisgICAgaW50IGkgPSA4OworCisgICAgcmVjIC09IGx4OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MyA9IGJsa1szXTsKKyAgICAgICAgYmxrWzNdID0gMCA7CisgICAgICAgIGJsayArPSA4OworCisgICAgICAgIHgxID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9IChXNSAqIHgzICsgNCkgPj4gMzsKKworICAgICAgICB4NyA9ICgxODEgKiAoeDMgLSB4MSkgKyAxMjgpID4+IDg7CisgICAgICAgIHg1ID0gKC0xODEgKiAoeDEgKyB4MykgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcmVzID0gKCg4MTkyICsgeDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICByZXMyID0gKCg4MTkyICsgeDcpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMikKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKCg4MTkyICsgeDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKCg4MTkyIC0geDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKQorICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsKKworICAgICAgICByZXMgPSAoKDgxOTIgKyB4MykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKDgxOTIgLSB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKQorICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoKDgxOTIgLSB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoKDgxOTIgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsKKworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKyNlbmRpZiAvKiBTTUFMTF9EQ1QgKi8KK3ZvaWQgaWRjdF9yb3dJbnRyYShTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgaW50IHJlcywgcmVzMjsKKyAgICB1aW50MzIgZHN0X3dvcmQ7CisKKyAgICBibGsgLT0gODsKKyAgICByZWMgLT0gbHg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDEgPSAoaW50MzIpYmxrWzEyXSA8PCA4OworICAgICAgICBibGtbMTJdID0gMDsKKyAgICAgICAgeDIgPSBibGtbMTRdOworICAgICAgICBibGtbMTRdID0gMDsKKyAgICAgICAgeDMgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDQgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHg1ID0gYmxrWzE1XTsKKyAgICAgICAgYmxrWzE1XSA9IDA7CisgICAgICAgIHg2ID0gYmxrWzEzXTsKKyAgICAgICAgYmxrWzEzXSA9IDA7CisgICAgICAgIHg3ID0gYmxrWzExXTsKKyAgICAgICAgYmxrWzExXSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg4ID0gVzcgKiAoeDQgKyB4NSkgKyA0OworICAgICAgICB4NCA9ICh4OCArIChXMSAtIFc3KSAqIHg0KSA+PiAzOworICAgICAgICB4NSA9ICh4OCAtIChXMSArIFc3KSAqIHg1KSA+PiAzOworICAgICAgICB4OCA9IFczICogKHg2ICsgeDcpICsgNDsKKyAgICAgICAgeDYgPSAoeDggLSAoVzMgLSBXNSkgKiB4NikgPj4gMzsKKyAgICAgICAgeDcgPSAoeDggLSAoVzMgKyBXNSkgKiB4NykgPj4gMzsKKworICAgICAgICAvKiBzZWNvbmQgc3RhZ2UgKi8KKyAgICAgICAgeDggPSB4MCArIHgxOworICAgICAgICB4MCAtPSB4MTsKKyAgICAgICAgeDEgPSBXNiAqICh4MyArIHgyKSArIDQ7CisgICAgICAgIHgyID0gKHgxIC0gKFcyICsgVzYpICogeDIpID4+IDM7CisgICAgICAgIHgzID0gKHgxICsgKFcyIC0gVzYpICogeDMpID4+IDM7CisgICAgICAgIHgxID0geDQgKyB4NjsKKyAgICAgICAgeDQgLT0geDY7CisgICAgICAgIHg2ID0geDUgKyB4NzsKKyAgICAgICAgeDUgLT0geDc7CisKKyAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICAgICAgeDcgPSB4OCArIHgzOworICAgICAgICB4OCAtPSB4MzsKKyAgICAgICAgeDMgPSB4MCArIHgyOworICAgICAgICB4MCAtPSB4MjsKKyAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgICAgICB4NCA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgICAgIHJlcyA9ICgoeDcgKyB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKHgzICsgeDIpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMikKKyAgICAgICAgZHN0X3dvcmQgPSByZXMgfCAocmVzMiA8PCA4KTsKKyAgICAgICAgcmVzID0gKCh4MCArIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICgoeDggKyB4NikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOworCisgICAgICAgIHJlcyA9ICgoeDggLSB4NikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIHJlczIgPSAoKHgwIC0geDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMikKKyAgICAgICAgZHN0X3dvcmQgPSByZXMgfCAocmVzMiA8PCA4KTsKKyAgICAgICAgcmVzID0gKCh4MyAtIHgyKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcykKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICgoeDcgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpCisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgYXQgYWxsICoqKiovCit2b2lkIGlkY3Rfcm93MHptdihTaG9ydCAqc3JjZSwgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoc3JjZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKHJlYyk7CisgICAgT1NDTF9VTlVTRURfQVJHKHByZWQpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhseCk7CisKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cxem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCit7CisgICAgaW50IHRtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICBwcmVkIC09IDE2OworICAgIHJlYyAtPSBseDsKKyAgICBibGsgLT0gODsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB0bXAgPSAoKihibGsgKz0gOCkgKyAzMikgPj4gNjsKKyAgICAgICAgKmJsayA9IDA7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxNikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9IHRtcCArIChwcmVkX3dvcmQgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgcmVzMiA9IHRtcCArICgocHJlZF93b3JkID4+IDgpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDI0KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdF9yb3cyem12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4NSA9IChXNyAqIHg0ICsgNCkgPj4gMzsKKyAgICAgICAgeDQgPSAoVzEgKiB4NCArIDQpID4+IDM7CisKKyAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgICAgICB4MSA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTYpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgKyB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MCArIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgwIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDAgLSB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MCAtIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzN6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHgxID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSB4NzsKKyAgICAgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OworICAgICAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxNikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg0ICsgeDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDYgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MiArIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgyIC0geDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDYgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NCAtIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgaWRjdF9yb3c0em12KFNob3J0ICpibGssIFVDaGFyICpyZWMsIFVDaGFyICpwcmVkLCBJbnQgbHgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisgICAgcHJlZCAtPSAxNjsKKyAgICBibGsgLT0gODsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1sxMF07CisgICAgICAgIGJsa1sxMF0gPSAwOworICAgICAgICB4MSA9IGJsa1s5XTsKKyAgICAgICAgYmxrWzldID0gMDsKKyAgICAgICAgeDMgPSBibGtbMTFdOworICAgICAgICBibGtbMTFdID0gMDsKKyAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7CisgICAgICAgICpibGsgPSAwOyAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHg1ID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9ICgtIFc1ICogeDMgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgxIC0geDU7CisgICAgICAgIHgxICs9IHg1OworICAgICAgICB4NSA9IHg4OworICAgICAgICB4OCA9IHg3IC0geDM7CisgICAgICAgIHgzICs9IHg3OworICAgICAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7CisgICAgICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDQgKyB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4NiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyICsgeDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArIDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorICAgIHJldHVybiA7Cit9CisKKyNpZm5kZWYgU01BTExfRENUCit2b2lkIGlkY3Rfcm93MHg0MHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQoreworICAgIGludDMyIHgxLCB4MiwgeDQsIHg1OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzFdOworICAgICAgICBibGtbMV0gPSAwOworICAgICAgICBibGsgKz0gODsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOworICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxNikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICg4MTkyICsgeDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoODE5MiArIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKDgxOTIgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICg4MTkyICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoODE5MiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKDgxOTIgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICg4MTkyIC0geDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoODE5MiAtIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDsKK30KKwordm9pZCBpZGN0X3JvdzB4MjB6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDIsIHg0LCB4NjsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICByZWMgLT0gbHg7CisgICAgcHJlZCAtPSAxNjsKKworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB4MiA9IGJsa1syXTsKKyAgICAgICAgYmxrWzJdID0gMDsKKyAgICAgICAgYmxrICs9IDg7IC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCisgICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MCA9IDgxOTIgKyB4MjsKKyAgICAgICAgeDIgPSA4MTkyIC0geDI7CisgICAgICAgIHg0ID0gODE5MiArIHg2OworICAgICAgICB4NiA9IDgxOTIgLSB4NjsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgwKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICs9IGx4KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHgwKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Rfcm93MHgxMHptdihTaG9ydCAqYmxrLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4KQoreworICAgIGludDMyIHgxLCB4MywgeDUsIHg3OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgzID0gYmxrWzNdOworICAgICAgICBibGtbM10gPSAwOworICAgICAgICBibGsgKz0gODsKKworICAgICAgICB4MSA9IChXMyAqIHgzICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSAoLVc1ICogeDMgKyA0KSA+PiAzOworCisgICAgICAgIHg3ID0gKC0xODEgKiAoeDMgKyB4MSkgKyAxMjgpID4+IDg7CisgICAgICAgIHg1ID0gKDE4MSAqICh4MyAtIHgxKSArIDEyOCkgPj4gODsKKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDE2KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KKyAgICAgICAgcmVzID0gKDgxOTIgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICg4MTkyICsgeDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoODE5MiArIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKDgxOTIgKyB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHJlYyArPSBseCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICsgNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICg4MTkyIC0geDMpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoODE5MiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKDgxOTIgLSB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICg4MTkyIC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKyA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCisjZW5kaWYgLyogU01BTExfRENUICovCisKK3ZvaWQgaWRjdF9yb3d6bXYoU2hvcnQgKmJsaywgVUNoYXIgKnJlYywgVUNoYXIgKnByZWQsIEludCBseCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHJlYyAtPSBseDsKKyAgICBwcmVkIC09IDE2OworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgxID0gKGludDMyKWJsa1sxMl0gPDwgODsKKyAgICAgICAgYmxrWzEyXSA9IDA7CisgICAgICAgIHgyID0gYmxrWzE0XTsKKyAgICAgICAgYmxrWzE0XSA9IDA7CisgICAgICAgIHgzID0gYmxrWzEwXTsKKyAgICAgICAgYmxrWzEwXSA9IDA7CisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4NSA9IGJsa1sxNV07CisgICAgICAgIGJsa1sxNV0gPSAwOworICAgICAgICB4NiA9IGJsa1sxM107CisgICAgICAgIGJsa1sxM10gPSAwOworICAgICAgICB4NyA9IGJsa1sxMV07CisgICAgICAgIGJsa1sxMV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDggPSBXNyAqICh4NCArIHg1KSArIDQ7CisgICAgICAgIHg0ID0gKHg4ICsgKFcxIC0gVzcpICogeDQpID4+IDM7CisgICAgICAgIHg1ID0gKHg4IC0gKFcxICsgVzcpICogeDUpID4+IDM7CisgICAgICAgIHg4ID0gVzMgKiAoeDYgKyB4NykgKyA0OworICAgICAgICB4NiA9ICh4OCAtIChXMyAtIFc1KSAqIHg2KSA+PiAzOworICAgICAgICB4NyA9ICh4OCAtIChXMyArIFc1KSAqIHg3KSA+PiAzOworCisgICAgICAgIC8qIHNlY29uZCBzdGFnZSAqLworICAgICAgICB4OCA9IHgwICsgeDE7CisgICAgICAgIHgwIC09IHgxOworICAgICAgICB4MSA9IFc2ICogKHgzICsgeDIpICsgNDsKKyAgICAgICAgeDIgPSAoeDEgLSAoVzIgKyBXNikgKiB4MikgPj4gMzsKKyAgICAgICAgeDMgPSAoeDEgKyAoVzIgLSBXNikgKiB4MykgPj4gMzsKKyAgICAgICAgeDEgPSB4NCArIHg2OworICAgICAgICB4NCAtPSB4NjsKKyAgICAgICAgeDYgPSB4NSArIHg3OworICAgICAgICB4NSAtPSB4NzsKKworICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgICAgICB4NyA9IHg4ICsgeDM7CisgICAgICAgIHg4IC09IHgzOworICAgICAgICB4MyA9IHgwICsgeDI7CisgICAgICAgIHgwIC09IHgyOworICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7CisgICAgICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxNikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisKKyAgICAgICAgcmVzID0gKHg3ICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDMgKyB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MCArIHg0KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHg4ICsgeDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShyZWMgKz0gbHgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArIDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworCisgICAgICAgIHJlcyA9ICh4OCAtIHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgwIC0geDQpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDMgLSB4MikgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4NyAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocmVjICsgNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIEVuZCBGdW5jdGlvbjogaWRjdGNvbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJsb2NrSURDVE1vdGlvbkNvbXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEwLzE2LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogZmFzdCBJRENUIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEludCogY29lZmZfaW4gICBEZXF1YW50aXplZCBjb2VmZmljaWVudAorICAgICAgICBJbnQgYmxvY2tfb3V0ICAgb3V0cHV0IElEQ1QgY29lZmZpY2llbnQKKyAgICAgICAgSW50IG1heHZhbCAgICAgIGNsaXAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICA3LzMxLzAxLCBhZGQgY2hlY2tpbmcgZm9yIGFsbC16ZXJvIGFuZCBEQy1vbmx5IGJsb2NrLiAgKi8KKy8qICAgICAgICAgICAgICBkbyA4IGNvbHVtbnMgYXQgYSB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICA4LzIvMDEsIGRvIGNvbHVtbiBmaXJzdCB0aGVuIHJvdy1JRENULiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgOC8yLzAxLCByZW1vdmUgY2xpcHBpbmcgKGluY2x1ZGVkIGluIG1vdGlvbiBjb21wKS4gICAgICovCisvKiAgICAgICAgICAgICAgIDgvNy8wMSwgY29tYmluZSB3aXRoIG1vdGlvbiBjb21wLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICA4LzgvMDEsIHVzZSBBQU4gSURDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgIDkvNC8wNSwgdXNlIENoZW4ncyBJRENUIGFuZCAxNiBiaXQgYmxvY2sgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordm9pZCBCbG9ja0lEQ1RNb3Rpb25Db21wKFNob3J0ICpibG9jaywgVUNoYXIgKmJpdG1hcGNvbCwgVUNoYXIgYml0bWFwcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBVQ2hhciAqcmVjLCBVQ2hhciAqcHJlZCwgSW50IGx4X2ludHJhKQoreworICAgIEludCBpOworICAgIEludCB0bXAsIHRtcDI7CisgICAgVUxvbmcgdG1wNDsKKyAgICBJbnQgYm1hcDsKKyAgICBTaG9ydCAqcHRyID0gYmxvY2s7CisgICAgVUNoYXIgKmVuZGNvbDsKKyAgICBVSW50IG1hc2sgPSAweEZGOworICAgIEludCBseCA9IGx4X2ludHJhID4+IDE7CisgICAgSW50IGludHJhID0gKGx4X2ludHJhICYgMSk7CisKKyAgICAvKiAgYWxsLXplcm8gYmxvY2sgKi8KKyAgICBpZiAoZGN0TW9kZSA9PSAwIHx8IGJpdG1hcHJvdyA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICB7CisgICAgICAgICAgICAqKChVTG9uZyopcmVjKSA9ICooKFVMb25nKikocmVjICsgNCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IDA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gMDsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAwOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAwOworICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGNvcHkgZnJvbSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICAqKChVTG9uZyopcmVjKSA9ICooKFVMb25nKilwcmVkKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gKigoVUxvbmcqKShwcmVkICsgNCkpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9ICooKFVMb25nKikocHJlZCArPSAxNikpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gKigoVUxvbmcqKShwcmVkICs9IDE2KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9ICooKFVMb25nKikocHJlZCArIDQpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAqKChVTG9uZyopKHByZWQgKz0gMTYpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gKigoVUxvbmcqKShwcmVkICsgNCkpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9ICooKFVMb25nKikocHJlZCArPSAxNikpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gKigoVUxvbmcqKShwcmVkICs9IDE2KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9ICooKFVMb25nKikocHJlZCArIDQpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IGx4KSkgPSAqKChVTG9uZyopKHByZWQgKz0gMTYpKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gKigoVUxvbmcqKShwcmVkICsgNCkpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gbHgpKSA9ICooKFVMb25nKikocHJlZCArPSAxNikpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSAqKChVTG9uZyopKHByZWQgKyA0KSk7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGVzdCBmb3IgREMgb25seSBibG9jayAqLworICAgIGlmIChkY3RNb2RlID09IDEgfHwgKGJpdG1hcHJvdyA9PSAweDgwICYmIGJpdG1hcGNvbFswXSA9PSAweDgwKSkKKyAgICB7CisgICAgICAgIGkgPSAoKGJsb2NrWzBdIDw8IDMpICsgMzIpID4+IDY7CisgICAgICAgIGJsb2NrWzBdID0gMDsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKFVJbnQpaSA+IG1hc2spIGkgPSBtYXNrICYgKH4oaSA+PiAzMSkpOworCisgICAgICAgICAgICB0bXAgPSBpIHwgKGkgPDwgOCk7CisgICAgICAgICAgICB0bXAgfD0gKHRtcCA8PCAxNik7CisKKyAgICAgICAgICAgICooKFVMb25nKilyZWMpID0gKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSBseCkpID0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXA7CisKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlbmRjb2wgPSByZWMgKyAobHggPDwgMyk7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcDQgPSAqKChVTG9uZyopcHJlZCk7CisgICAgICAgICAgICAgICAgdG1wMiA9IHRtcDQgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcDIgKz0gaTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wMiA+IG1hc2spIHRtcDIgPSBtYXNrICYgKH4odG1wMiA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRtcCA9ICh0bXA0ID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gaTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRtcDIgfD0gKHRtcCA8PCA4KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAodG1wNCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSBpOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdG1wMiB8PSAodG1wIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAodG1wNCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSBpOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdG1wMiB8PSAodG1wIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopcmVjKSA9IHRtcDI7CisKKyAgICAgICAgICAgICAgICB0bXA0ID0gKigoVUxvbmcqKShwcmVkICsgNCkpOworICAgICAgICAgICAgICAgIHRtcDIgPSB0bXA0ICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAyICs9IGk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcDIgPiBtYXNrKSB0bXAyID0gbWFzayAmICh+KHRtcDIgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0bXAgPSAodG1wNCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IGk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0bXAyIHw9ICh0bXAgPDwgOCk7CisgICAgICAgICAgICAgICAgdG1wID0gKHRtcDQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gaTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRtcDIgfD0gKHRtcCA8PCAxNik7CisgICAgICAgICAgICAgICAgdG1wID0gKHRtcDQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gaTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRtcDIgfD0gKHRtcCA8PCAyNCk7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKyA0KSkgPSB0bXAyOworCisgICAgICAgICAgICAgICAgcmVjICs9IGx4OworICAgICAgICAgICAgICAgIHByZWQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVjIDwgZW5kY29sKTsKKyAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGN0TW9kZTsgaSsrKQorICAgIHsKKyAgICAgICAgYm1hcCA9IChJbnQpYml0bWFwY29sW2ldOworICAgICAgICBpZiAoYm1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChibWFwJjB4ZikgPT0gMCkKKyAgICAgICAgICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXA+PjRdKSkocHRyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZGN0X2NvbChwdHIpOworICAgICAgICB9CisgICAgICAgIHB0cisrOworICAgIH0KKworICAgIGlmICgoYml0bWFwcm93JjB4ZikgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgICAgICgqKGlkY3Ryb3dWQ0FJbnRyYVsoSW50KShiaXRtYXByb3c+PjQpXSkpKGJsb2NrLCByZWMsIGx4KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKCooaWRjdHJvd1ZDQXptdlsoSW50KShiaXRtYXByb3c+PjQpXSkpKGJsb2NrLCByZWMsIHByZWQsIGx4KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgaWRjdF9yb3dJbnRyYShibG9jaywgcmVjLCBseCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlkY3Rfcm93em12KGJsb2NrLCByZWMsIHByZWQsIGx4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZjZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcApAQCAtMCwwICsxLDk2NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAiZmFzdHF1YW50X2lubGluZS5oIgorCisjZGVmaW5lIHNpeiA2MworI2RlZmluZSBMU0wgMTgKKworCitjb25zdCBzdGF0aWMgVUNoYXIgaW1hc2tbOF0gPSB7MTI4LCA2NCwgMzIsIDE2LCA4LCA0LCAyLCAxfTsKKyNkZWZpbmUgU0lHTjAoYSkgICAgICAgICggKChhKTwwKSA/IC0xIDogKCgoYSk+MCkgPyAxICA6IDApICkKKworLyogdmFyaWFibGUgYml0IHByZWNpc2lvbiBxdWFudGl6YXRpb24gc2NhbGUgKi8KKy8qIHVzZWQgdG8gYXZvaWQgdXNpbmcgMzItYml0IG11bHRpcGxpY2F0aW9uICovCitjb25zdCBzdGF0aWMgU2hvcnQgc2NhbGVBcnJheVZbMzJdID0gezAsIDE2Mzg0LCA4MTkyLCA1NDYyLCAgLyogMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgMzI3NywgMjczMSwgMjM0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgMzY0MSwgMzI3NywgMjk3OSwgIC8qIDE2ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MzEsIDI1MjEsIDIzNDEsIDIxODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsIDM4NTYsIDM2NDEsIDM0NTAsICAvKiAxNyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjc3LCAzMTIxLCAyOTc5LCAyODUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDYyLCA1MjQzLCA1MDQyLCA0ODU1LCAgLyogMTggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDY4MiwgNDUyMCwgNDM3MCwgNDIyOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qIHNjYWxlIGZvciBkY19zY2FsZXIgYW5kIHFtYXQsIG5vdGUsIG5vIHZhbHVlIHNtYWxsZXIgdGhhbiA4ICovCitjb25zdCBzdGF0aWMgU2hvcnQgc2NhbGVBcnJheVYyWzQ3XSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvKiAxNSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgMzY0MSwgMzI3NywgMjk3OSwgMjczMSwgMjUyMSwgMjM0MSwgMjE4NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsIDM4NTYsIDM2NDEsIDM0NTAsIDMyNzcsIDMxMjEsIDI5NzksIDI4NTAsICAvKiAxNiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjczMSwgMjYyMiwgMjUyMSwgMjQyOCwgMjM0MSwgMjI2MCwgMjE4NSwgMjExNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsIDM5NzIsIDM4NTYsIDM3NDUsIDM2NDEsIDM1NDMsIDM0NTAsIDMzNjEsICAvKiAxNyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI3NywgMzE5NywgMzEyMSwgMzA0OSwgMjk3OSwgMjkxMywgMjg1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKiBBQU4gc2NhbGUgYW5kIHppZ3phZyAqLworY29uc3Qgc3RhdGljIFNob3J0IEFBTlNjYWxlWzY0XSA9Cit7CisgICAgLyogMCAqLyAweDEwMDAsIDB4MEI4OSwgMHgwQzNFLCAweDBEOUIsIDB4MTAwMCwgMHgwQTJFLCAweDBFQzgsIDB4MEU3RiwKKyAgICAvKiAxICovIDB4MEI4OSwgMHgwODUxLCAweDA4RDQsIDB4MDlDRiwgMHgwQjg5LCAweDA3NTcsIDB4MEFBOCwgMHgwQTczLAorICAgIC8qIDIgKi8gMHgwQzNFLCAweDA4RDQsIDB4MDk1RiwgMHgwQTZBLCAweDBDM0UsIDB4MDdDQiwgMHgwQjUwLCAweDBCMTgsCisgICAgLyogMyAqLyAweDBEOUIsIDB4MDlDRiwgMHgwQTZBLCAweDBCOTIsIDB4MEQ5QiwgMHgwOEE4LCAweDBDOTIsIDB4MEM1NCwKKyAgICAvKiA0ICovIDB4MTAwMCwgMHgwQjg5LCAweDBDM0UsIDB4MEQ5QiwgMHgxMDAwLCAweDBBMkUsIDB4MEVDOCwgMHgwRTdGLAorICAgIC8qIDUgKi8gMHgwQTJFLCAweDA3NTcsIDB4MDdDQiwgMHgwOEE4LCAweDBBMkUsIDB4MDY3QSwgMHgwOTY4LCAweDA5MzksCisgICAgLyogNiAqLyAweDBFQzgsIDB4MEFBOCwgMHgwQjUwLCAweDBDOTIsIDB4MEVDOCwgMHgwOTY4LCAweDBEQTgsIDB4MEQ2NCwKKyAgICAvKiA3ICovIDB4MEU3RiwgMHgwQTczLCAweDBCMTgsIDB4MEM1NCwgMHgwRTdGLCAweDA5MzksIDB4MEQ2NCwgMHgwRDIzCit9OworCitjb25zdCBzdGF0aWMgVVNob3J0IFpaVGFiWzY0XSA9Cit7CisgICAgLyogMCAqLyAweDAsIDB4MiwgMHhBLCAweEMsIDB4MUMsIDB4MUUsIDB4MzYsIDB4MzgsCisgICAgLyogMSAqLyAweDQsIDB4OCwgMHhFLCAweDFBLCAweDIwLCAweDM0LCAweDNBLCAweDU0LAorICAgIC8qIDIgKi8gMHg2LCAweDEwLCAweDE4LCAweDIyLCAweDMyLCAweDNDLCAweDUyLCAweDU2LAorICAgIC8qIDMgKi8gMHgxMiwgMHgxNiwgMHgyNCwgMHgzMCwgMHgzRSwgMHg1MCwgMHg1OCwgMHg2QSwKKyAgICAvKiA0ICovIDB4MTQsIDB4MjYsIDB4MkUsIDB4NDAsIDB4NEUsIDB4NUEsIDB4NjgsIDB4NkMsCisgICAgLyogNSAqLyAweDI4LCAweDJDLCAweDQyLCAweDRDLCAweDVDLCAweDY2LCAweDZFLCAweDc4LAorICAgIC8qIDYgKi8gMHgyQSwgMHg0NCwgMHg0QSwgMHg1RSwgMHg2NCwgMHg3MCwgMHg3NiwgMHg3QSwKKyAgICAvKiA3ICovIDB4NDYsIDB4NDgsIDB4NjAsIDB4NjIsIDB4NzIsIDB4NzQsIDB4N0MsIDB4N0UKK307CisKKworLy9UYW8gbmVlZCB0byByZW1vdmUsIHdyaXRlIGFub3RoZXIgdmVyc2lvbiBvZiBhYnMKKy8vI2luY2x1ZGUgPG1hdGguaD4KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBjYWxfZGNfc2NhbGVyRU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDAxLzI1LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogY2FsY3VsYXRpb24gb2YgREMgcXVhbnRpemF0aW9uIHNjYWxlIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgICAgICAgIGluY29taW5nIFEgYW5kIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEludCBRcCAgICAgIFF1YW50aXplciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgREMgU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitJbnQgY2FsX2RjX3NjYWxlckVOQyhJbnQgUVAsIEludCB0eXBlKQoreworCisgICAgSW50IGRjX3NjYWxlcjsKKyAgICBpZiAodHlwZSA9PSAxKQorICAgIHsKKyAgICAgICAgaWYgKFFQID4gMCAmJiBRUCA8IDUpCisgICAgICAgICAgICBkY19zY2FsZXIgPSA4OworICAgICAgICBlbHNlIGlmIChRUCA+IDQgJiYgUVAgPCA5KQorICAgICAgICAgICAgZGNfc2NhbGVyID0gMiAqIFFQOworICAgICAgICBlbHNlIGlmIChRUCA+IDggJiYgUVAgPCAyNSkKKyAgICAgICAgICAgIGRjX3NjYWxlciA9IFFQICsgODsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGNfc2NhbGVyID0gMiAqIFFQIC0gMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChRUCA+IDAgJiYgUVAgPCA1KQorICAgICAgICAgICAgZGNfc2NhbGVyID0gODsKKyAgICAgICAgZWxzZSBpZiAoUVAgPiA0ICYmIFFQIDwgMjUpCisgICAgICAgICAgICBkY19zY2FsZXIgPSAoUVAgKyAxMykgLyAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkY19zY2FsZXIgPSBRUCAtIDY7CisgICAgfQorICAgIHJldHVybiBkY19zY2FsZXI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246IEJsY2tRdWFudERlcXVhbnRIMjYzCisgRGF0ZTogICAgIEp1bmUgMTUsIDE5OTkKKyBQdXJwb3NlOiAgQ29tYmluZSBCbG9ja1F1YW50SDI2MyBhbmQgQmxvY2tEZXF1YW50SDI2M0VOQworIElucHV0OiAgIGNvZWZmPT4gRENUIGNvZWZmaWNpZW50CisgT3V0cHV0OiAgcWNvZWZmPT4gcXVhbnRpemVkIGNvZWZmaWNpZW50CisgICAgICAgICAgcmNvZWZmPT4gcmVjb25zdHJ1Y3RlZCBjb2VmZmljaWVudAorICAgICAgICAgIHJldHVybiBDQlAgZm9yIHRoaXMgYmxvY2sKKyAgICAgICAgICA0LzIvMDEsICBjb3JyZWN0IGRjX3NjYWxlciBmb3Igc2hvcnRfaGVhZGVyIG1vZGUuCisgICAgICAgICAgNS8xNC8wMSwKKyAgICAgICAgICBjaGFuZ2VkIHRoZSBkaXZpc2lvbiBpbnRvIExVVCBtdWx0aXBsaWNhdGlvbi9zaGlmdCBhbmQgb3RoZXIKKyAgICAgICAgICBtb2RpZmljYXRpb25zIHRvIHNwZWVkIHVwIGZhc3RRdWFudC9EZVF1YW50IChjaGVjayBmb3IgemVybyAxc3QsIHJvd3EgTFVULAorICAgICAgICAgIGZhc3QgYml0bWFwcm93IG1hc2sgYW5kIGJvcnJvd2VkIEFkZGl0aW9uIG1ldGhvZCBpbnN0ZWFkIG9mIGlmcyBmcm9tICwgKS4KKyAgICAgICAgICA2LzI1LzAxLAorICAgICAgICAgIEZ1cnRoZXIgb3B0aW1pemF0aW9uICh+MTAwSy9RQ0lGKSwgbmVlZCBtb3JlIHRlc3RpbmcvY29tbWVudCBiZWZvcmUgaW50ZWdyYXRpb24uCisKKyAgICAgICAgICA3LzQvMDEsICBicmVhayB1cCBJbnRlciAvIEludHJhIGZ1bmN0aW9uIGFuZCBtZXJnZSBmb3IgZGlmZmVyZW50IGNhc2VzLgorICAgICAgICAgIDcvMjIvMDEsICBjb21iaW5lIEFBTiBzY2FsaW5nIGhlcmUgYW5kIHJlb3JkZXJpbmcuCisgICAgICAgICAgNy8yNC8wMSwgLCByZW9yZGVyIGFscmVhZHkgZG9uZSBpbiBGRENULCB0aGUgaW5wdXQgaGVyZSBpcyBpbiB0aGUgbmV4dCBibG9jayBhbmQKKyAgICAgICAgICAgIGl0J3MgdGhlCisgICAgICAgICAgICB0cmFuc3Bvc2Ugb2YgdGhlIHJhc3RlciBzY2FuLiBPdXRwdXQgdGhlIHNhbWUgb3JkZXIgKGZvciBwcm9vZiBvZiBjb25jZW5wdCkuCisgICAgICAgICAgOC8xLzAxLCAsIGNoYW5nZSBGRENUIHRvIGRvIHJvdy9jb2x1bW4gRkRDVCB3aXRob3V0IHJlb3JkZXJpbmcsIGlucHV0IGlzIHN0aWxsCisgICAgICAgICAgICBpbiB0aGUgbmV4dCBibG9jay4gVGhlIHJlY29uc3RydWN0ZWQgRENUIG91dHB1dCBpcyBjdXJyZW50IGJsb2NrIGluIG5vcm1hbAorICAgICAgICAgICAgb3JkZXIuIFRoZSBxdWFudGl6ZWQgb3V0cHV0IGlzIGluIHppZ3phZyBzY2FuIG9yZGVyIGZvciBJTlRFUiwgcm93L2NvbHVtbiBmb3IKKyAgICAgICAgICAgIElOVFJBLiBVc2UgYml0bWFwenogZm9yIHppZ3phZyBSdW5MZXZlbCBmb3IgSU5URVIuICBUaGUgcXVhbnRpemF0aW9uIGlzIGRvbmUKKyAgICAgICAgICAgIGluIGNvbHVtbi9yb3cgc2Nhbm5pbmcgb3JkZXIuCisgICAgICAgICAgOC8yLzAxLCAsIGNoYW5nZSBJRENUIHRvIGRvIGNvbHVtbi9yb3csIGNoYW5nZSBiaXRtYXByb3cvY29sIHRvIHRoZSBvcHBvc2l0ZS4KKyAgICAgICAgICA4LzMvMDEsICwgYWRkIGNsaXBwaW5nIHRvIHRoZSByZWNvbnN0cnVjdGVkIGNvZWZmaWNpZW50IFstMjA0NywyMDQ3XQorICAgICAgICAgIDkvNC8wNSwgLCByZW1vdmVkIHNjYWxpbmcgZm9yIEFBTiBJRENULCB1c2UgQ2hlbiBJRENUIGluc3RlYWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ludCBCbG9ja1F1YW50RGVxdWFudEgyNjNJbnRlcihTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgSW50IGNvbXAsIEludCBkdW1teSwgVUNoYXIgc2hvcnRIZWFkZXIpCit7CisgICAgSW50IGksIHp6OworICAgIEludCB0bXAsIGNvZWZmLCBxX3ZhbHVlOworICAgIEludCBRUGRpdjIgPSBRdWFudFBhcmFtLT5RUGRpdjI7CisgICAgSW50IFFQeDIgPSBRdWFudFBhcmFtLT5RUHgyOworICAgIEludCBBZGRpdGlvbiA9IFF1YW50UGFyYW0tPkFkZGl0aW9uOworICAgIEludCBRUHgycGx1cyA9IFF1YW50UGFyYW0tPlFQeDJwbHVzOworICAgIEludCByb3VuZCA9IDEgPDwgMTU7CisgICAgSW50IHFfc2NhbGUgPSBzY2FsZUFycmF5VltRdWFudFBhcmFtLT5RUF07CisgICAgSW50IHNoaWZ0ID0gMTUgKyAoUVB4MiA+PiA0KTsKKyAgICBJbnQgKnRlbXA7CisgICAgVUNoYXIgKmJjb2xwdHIgPSBiaXRtYXBjb2w7CisgICAgSW50IGFjX2NsaXA7ICAgIC8qIHF1YW50aXplZCBjb2VmZiBib3VuZCAqLworCisgICAgT1NDTF9VTlVTRURfQVJHKGNvbXApOworICAgIE9TQ0xfVU5VU0VEX0FSRyhkdW1teSk7CisKKworICAgIGlmIChzaG9ydEhlYWRlcikgYWNfY2xpcCA9IDEyNjsgLyogY2xpcCBiZXR3ZWVuIFstMTI3LDEyNl0gKHN0YW5kYXJkIGFsbG93cyAxMjchKSAqLworICAgIGVsc2UgYWNfY2xpcCA9IDIwNDc7ICAvKiBjbGlwIGJldHdlZW4gWy0yMDQ4LDIwNDddICovCisKKyAgICAvKiByZXNldCBhbGwgYml0bWFwIHRvIHplcm8gKi8KKyAgICB0ZW1wID0gKEludCopIGJpdG1hcGNvbDsKKyAgICB0ZW1wWzBdID0gdGVtcFsxXSA9IDA7CisgICAgYml0bWFwenpbMF0gPSBiaXRtYXB6elsxXSA9IDA7CisgICAgKmJpdG1hcHJvdyA9IDA7CisgICAgUVB4MnBsdXMgPDw9IDQ7CisgICAgUVB4MnBsdXMgLT0gODsKKworICAgIHJjb2VmZiArPSA2NDsgLyogYWN0dWFsIGRhdGEgaXMgNjQgaXRlbSBhaGVhZCAqLworICAgIC8vZW5kICA9IHJjb2VmZiArIGRjdE1vZGUgLSAxOworICAgIC8vcmNvZWZmLS07CisgICAgYmNvbHB0ci0tOworICAgIGkgPSAwOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGJjb2xwdHIrKzsKKyAgICAgICAgLy9yY29lZmYrKzsKKyAgICAgICAgLy9pPTA7CisgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICBpZiAoY29lZmYgPT0gMHg3ZmZmKSAvKiBhbGwgemVybyBjb2x1bW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29lZmYgPj0gLVFQeDJwbHVzICYmIGNvZWZmIDwgUVB4MnBsdXMpICAvKiBxdWFudGl6ZSB0byB6ZXJvICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgICAgICAgIGlmIChpIDwgKGRjdE1vZGUgPDwgMykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZWZmID4gLVFQeDJwbHVzICYmIGNvZWZmIDwgUVB4MnBsdXMpICAvKiBxdWFudGl6ZSB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBOT05aRVJPMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CitOT05aRVJPMToKKyAgICAgICAgICAgICAgICAvKiBzY2FsaW5nICovCisgICAgICAgICAgICAgICAgcV92YWx1ZSA9IEFBTlNjYWxlW2ldOyAgLyogbG9hZCBzY2FsZSBBQU4gKi8KKyAgICAgICAgICAgICAgICB6eiA9IFpaVGFiW2ldOyAgLyogemlnemFnIG9yZGVyICovCisKKyAgICAgICAgICAgICAgICBjb2VmZiA9IGFhbl9zY2FsZShxX3ZhbHVlLCBjb2VmZiwgcm91bmQsIFFQZGl2Mik7CisgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNvZWZmX3F1YW50KGNvZWZmLCBxX3NjYWxlLCBzaGlmdCk7CisKKyAgICAgICAgICAgICAgICAvKiBkZXF1YW50aXphdGlvbiAgKi8KKyAgICAgICAgICAgICAgICBpZiAocV92YWx1ZSkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgLy9jb2VmZiA9IFBWX01JTihhY19jbGlwLFBWX01BWCgtYWNfY2xpcC0xLCBxX3ZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9jbGlwKHFfdmFsdWUsIGFjX2NsaXApOworICAgICAgICAgICAgICAgICAgICBxY29lZmZbeno+PjFdID0gcV92YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZXF1YW50IGFuZCBjbGlwCisgICAgICAgICAgICAgICAgICAgIC8vY29lZmYgPSBQVl9NSU4oMjA0NyxQVl9NQVgoLTIwNDgsIHFfdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gMjA0NzsKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSBjb2VmZl9kZXF1YW50KHFfdmFsdWUsIFFQeDIsIEFkZGl0aW9uLCB0bXApOworICAgICAgICAgICAgICAgICAgICByY29lZmZbaS02NF0gPSBjb2VmZjsKKworICAgICAgICAgICAgICAgICAgICAoKmJjb2xwdHIpIHw9IGltYXNrW2k+PjNdOworICAgICAgICAgICAgICAgICAgICBpZiAoKHp6ID4+IDEpID4gMzEpIGJpdG1hcHp6WzFdIHw9ICgxIDw8ICg2MyAtICh6eiA+PiAxKSkpOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICBiaXRtYXB6elswXSB8PSAoMSA8PCAoMzEgLSAoenogPj4gMSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSA4OworICAgICAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChpIDwgKGRjdE1vZGUgPDwgMykpOworCisgICAgICAgIGkgKz0gKDEgLSAoZGN0TW9kZSA8PCAzKSk7CisgICAgfQorICAgIHdoaWxlIChpIDwgZGN0TW9kZSkgOworCisgICAgaSA9IGRjdE1vZGU7CisgICAgdG1wID0gMSA8PCAoOCAtIGkpOworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICBpZiAoYml0bWFwY29sW2ldKSgqYml0bWFwcm93KSB8PSB0bXA7CisgICAgICAgIHRtcCA8PD0gMTsKKyAgICB9CisKKyAgICBpZiAoKmJpdG1hcHJvdykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworSW50IEJsb2NrUXVhbnREZXF1YW50SDI2M0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlciwgVUNoYXIgc2hvcnRIZWFkZXIpCit7CisgICAgSW50IGk7CisgICAgSW50IHRtcCwgY29lZmYsIHFfdmFsdWU7CisgICAgSW50IFFQeDIgPSBRdWFudFBhcmFtLT5RUHgyOworICAgIEludCBBZGRpdGlvbiA9IFF1YW50UGFyYW0tPkFkZGl0aW9uOworICAgIEludCBRUHgycGx1cyA9IFF1YW50UGFyYW0tPlFQeDJwbHVzOworICAgIEludCByb3VuZCA9IDEgPDwgMTU7CisgICAgSW50IHFfc2NhbGUgPSBzY2FsZUFycmF5VltRdWFudFBhcmFtLT5RUF07CisgICAgSW50IHNoaWZ0ID0gMTUgKyAoUVB4MiA+PiA0KTsKKyAgICBVQ2hhciAqYm1jb2xwdHIgPSBiaXRtYXBjb2w7CisgICAgSW50IGFjX2NsaXA7ICAgIC8qIHF1YW50aXplZCBjb2VmZiBib3VuZCAqLworCisgICAgT1NDTF9VTlVTRURfQVJHKGJpdG1hcHp6KTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoY29tcCk7CisKKworICAgIGlmIChzaG9ydEhlYWRlcikgYWNfY2xpcCA9IDEyNjsgLyogY2xpcCBiZXR3ZWVuIFstMTI3LDEyNl0gKHN0YW5kYXJkIGFsbG93cyAxMjchKSAqLworICAgIGVsc2UgYWNfY2xpcCA9IDIwNDc7ICAvKiBjbGlwIGJldHdlZW4gWy0yMDQ4LDIwNDddICovCisKKyAgICAqKChJbnQqKWJpdG1hcGNvbCkgPSAqKChJbnQqKShiaXRtYXBjb2wgKyA0KSkgPSAwOworICAgICpiaXRtYXByb3cgPSAwOworCisgICAgUVB4MnBsdXMgPSBRUHgyIDw8IDQ7CisgICAgUVB4MnBsdXMgLT0gODsKKworICAgIHJjb2VmZiArPSA2NDsgLyogYWN0dWFsIGRhdGEgaXMgNjQgZWxlbWVudCBhaGVhZCAqLworICAgIGkgPSAwOworCisgICAgLyogREMgdmFsdWUgKi8KKyAgICBjb2VmZiA9ICpyY29lZmY7CisgICAgLyogc2NhbGluZyAqLworICAgIGlmIChjb2VmZiA9PSAweDdmZmYgJiYgIXNob3J0SGVhZGVyKSAvKiBhbGwgemVybyBjb2x1bW4gKi8KKyAgICB7CisgICAgICAgIGJtY29scHRyKys7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKGNvZWZmID09IDB4N2ZmZikgLyogc2hvcnRIZWFkZXIgb24gKi8KKyAgICAgICAgeworICAgICAgICAgICAgY29lZmYgPSAxOyAvKiBjYW4ndCBiZSB6ZXJvICovCisgICAgICAgICAgICBxY29lZmZbMF0gPSBjb2VmZjsKKyAgICAgICAgICAgIGNvZWZmID0gY29lZmYgKiBkY19zY2FsZXI7CisgICAgICAgICAgICBjb2VmZiA9IFBWX01BWCgtMjA0OCwgUFZfTUlOKDIwNDcsIGNvZWZmKSk7CisgICAgICAgICAgICByY29lZmZbLTY0XSA9IGNvZWZmOworICAgICAgICAgICAgYml0bWFwY29sWzBdIHw9IDEyODsKKyAgICAgICAgICAgIGJtY29scHRyKys7CisgICAgICAgICAgICAvL3Fjb2VmZisrOworICAgICAgICAgICAgLy9yY29lZmYrKzsKKyAgICAgICAgICAgIC8vaT0wOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcV92YWx1ZSA9IHJvdW5kICsgKGNvZWZmIDw8IDEyKTsKKyAgICAgICAgICAgIGNvZWZmID0gcV92YWx1ZSA+PiAxNjsKKyAgICAgICAgICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICBjb2VmZiAtPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICAgICAgICAgIHFfdmFsdWUgPSBzY2FsZUFycmF5VjJbZGNfc2NhbGVyXTsKKyAgICAgICAgICAgIGNvZWZmID0gY29lZmYgKiBxX3ZhbHVlOworICAgICAgICAgICAgY29lZmYgPj49ICgxNSArIChkY19zY2FsZXIgPj4gNCkpOworICAgICAgICAgICAgY29lZmYgKz0gKChVSW50KWNvZWZmID4+IDMxKTsKKworICAgICAgICAgICAgaWYgKHNob3J0SGVhZGVyKQorICAgICAgICAgICAgICAgIGNvZWZmID0gUFZfTUFYKDEsIFBWX01JTigyNTQsIGNvZWZmKSk7CisKKyAgICAgICAgICAgIGlmIChjb2VmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxY29lZmZbMF0gPSBjb2VmZjsKKyAgICAgICAgICAgICAgICBjb2VmZiA9IGNvZWZmICogZGNfc2NhbGVyOworICAgICAgICAgICAgICAgIGNvZWZmID0gUFZfTUFYKC0yMDQ4LCBQVl9NSU4oMjA0NywgY29lZmYpKTsKKyAgICAgICAgICAgICAgICByY29lZmZbLTY0XSA9IGNvZWZmOworICAgICAgICAgICAgICAgIGJpdG1hcGNvbFswXSB8PSAxMjg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQUMgdmFsdWVzICovCisgICAgZG8KKyAgICB7CisgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICBpZiAoY29lZmYgPT0gMHg3ZmZmKSAvKiBhbGwgemVybyByb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgYm1jb2xwdHIrKzsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb2VmZiA+PSAtUVB4MnBsdXMgJiYgY29lZmYgPCBRUHgycGx1cykgIC8qIHF1YW50aXplIHRvIHplcm8gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBkY3RNb2RlIDw8IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZWZmID4gLVFQeDJwbHVzICYmIGNvZWZmIDwgUVB4MnBsdXMpICAvKiBxdWFudGl6ZSB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gcmNvZWZmW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBOT05aRVJPMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CitOT05aRVJPMjogICAvKiBzY2FsaW5nICovCisgICAgICAgICAgICAgICAgcV92YWx1ZSA9IEFBTlNjYWxlW2ldOyAvKiAgMDkvMDIvMDUgKi8KKworICAgICAgICAgICAgICAgIC8qIHNjYWxlIGFhbiAqLworICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBzbWxhYmIocV92YWx1ZSwgY29lZmYsIHJvdW5kKTsKKyAgICAgICAgICAgICAgICBjb2VmZiA9IHFfdmFsdWUgPj4gMTY7CisgICAgICAgICAgICAgICAgLyogcXVhbnQgKi8KKyAgICAgICAgICAgICAgICBxX3ZhbHVlID0gc211bGJiKHFfc2NhbGUsIGNvZWZmKTsgLyptb3YgICAgIHFfdmFsdWUsIGNvZWZmLCBsc2wgIzE0ICovCisgICAgICAgICAgICAgICAgLypzbXVsbCB0bXAsIGNvZWZmLCBxX3ZhbHVlLCBxX3NjYWxlKi8KKyAgICAgICAgICAgICAgICBxX3ZhbHVlID4+PSBzaGlmdDsKKyAgICAgICAgICAgICAgICBxX3ZhbHVlICs9ICgoVUludClxX3ZhbHVlID4+IDMxKTsgLyogYWRkIDEgaWYgbmVnYXRpdmUgKi8KKworICAgICAgICAgICAgICAgIGlmIChxX3ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9jb2VmZiA9IFBWX01JTihhY19jbGlwLFBWX01BWCgtYWNfY2xpcC0xLCBxX3ZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9jbGlwKHFfdmFsdWUsIGFjX2NsaXApOworICAgICAgICAgICAgICAgICAgICBxY29lZmZbaV0gPSBxX3ZhbHVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlcXVhbnQgYW5kIGNsaXAKKyAgICAgICAgICAgICAgICAgICAgLy9jb2VmZiA9IFBWX01JTigyMDQ3LFBWX01BWCgtMjA0OCwgcV92YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSAyMDQ3OworICAgICAgICAgICAgICAgICAgICBjb2VmZiA9IGNvZWZmX2RlcXVhbnQocV92YWx1ZSwgUVB4MiwgQWRkaXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHJjb2VmZltpLTY0XSA9IGNvZWZmOworCisgICAgICAgICAgICAgICAgICAgICgqYm1jb2xwdHIpIHw9IGltYXNrW2k+PjNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGkgPCAoZGN0TW9kZSA8PCAzKSkgOworCisgICAgICAgIC8vcWNvZWZmKys7IC8qIG5leHQgY29sdW1uICovCisgICAgICAgIGJtY29scHRyKys7CisgICAgICAgIC8vcmNvZWZmKys7CisgICAgICAgIGkgKz0gKDEgLSAoZGN0TW9kZSA8PCAzKSk7IC8vaSA9IDA7CisgICAgfQorICAgIHdoaWxlIChpIDwgZGN0TW9kZSk7Ly93aGlsZShyY29lZmYgPCBlbmQpIDsKKworICAgIGkgPSBkY3RNb2RlOworICAgIHRtcCA9IDEgPDwgKDggLSBpKTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgaWYgKGJpdG1hcGNvbFtpXSkoKmJpdG1hcHJvdykgfD0gdG1wOworICAgICAgICB0bXAgPDw9IDE7CisgICAgfQorCisgICAgaWYgKCgoKmJpdG1hcHJvdykmMTI3KSB8fCAoYml0bWFwY29sWzBdJjEyNykpIC8qIGV4Y2x1ZGUgREMgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBGdW5jdGlvbjogQmxja1F1YW50RGVxdWFudEgyNjNEQworIERhdGU6ICAgICA1LzMvMjAwMQorIFB1cnBvc2U6ICAgSC4yNjMgcXVhbnRpemF0aW9uIG1vZGUsIG9ubHkgZm9yIERDIGNvbXBvbmVudAorIDYvMjUvMDEsCisgICAgICAgICAgRnVydGhlciBvcHRpbWl6YXRpb24gKH4xMDBLL1FDSUYpLCBuZWVkIG1vcmUgdGVzdGluZy9jb21tZW50IGJlZm9yZSBpbnRlZ3JhdGlvbi4KKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSW50IEJsb2NrUXVhbnREZXF1YW50SDI2M0RDSW50ZXIoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkdW1teSwgVUNoYXIgc2hvcnRIZWFkZXIpCit7CisgICAgSW50IGNvZWZmLCBzY2FsZV9xOworICAgIEludCBDQlAgPSAwOworICAgIEludCBRUCA9IFF1YW50UGFyYW0tPlFQOworICAgIEludCBRUHgycGx1cyA9IFF1YW50UGFyYW0tPlFQeDJwbHVzOworICAgIEludCBBZGRpdGlvbiA9IFF1YW50UGFyYW0tPkFkZGl0aW9uOworICAgIEludCBzaGlmdCA9IDE1ICsgKFFQID4+IDMpOworICAgIEludCBhY19jbGlwOyAgICAvKiBxdWFudGl6ZWQgY29lZmYgYm91bmQgKi8KKyAgICBJbnQgdG1wOworCisgICAgT1NDTF9VTlVTRURfQVJHKGR1bW15KTsKKworICAgIGlmIChzaG9ydEhlYWRlcikgYWNfY2xpcCA9IDEyNjsgLyogY2xpcCBiZXR3ZWVuIFstMTI3LDEyNl0gKHN0YW5kYXJkIGFsbG93cyAxMjchKSAqLworICAgIGVsc2UgYWNfY2xpcCA9IDIwNDc7ICAvKiBjbGlwIGJldHdlZW4gWy0yMDQ4LDIwNDddICovCisKKyAgICAqYml0bWFwcm93ID0gMDsKKyAgICBiaXRtYXB6elswXSA9IGJpdG1hcHp6WzFdID0gMDsKKyAgICBjb2VmZiA9IHJjb2VmZlswXTsKKworICAgIGlmIChjb2VmZiA+PSAtUVB4MnBsdXMgJiYgY29lZmYgPCBRUHgycGx1cykKKyAgICB7CisgICAgICAgIHJjb2VmZlswXSA9IDA7CisgICAgICAgIHJldHVybiBDQlA7Ly9yY29lZmZbMF0gPSAwOyBub3QgbmVlZGVkIHNpbmNlIENCUCB3aWxsIGJlIHplcm8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2NhbGVfcSA9IHNjYWxlQXJyYXlWW1FQXTsKKworICAgICAgICBjb2VmZiA9IGFhbl9kY19zY2FsZShjb2VmZiwgUVApOworCisgICAgICAgIHNjYWxlX3EgPSBjb2VmZl9xdWFudChjb2VmZiwgc2NhbGVfcSwgc2hpZnQpOworCisgICAgICAgIC8vY29lZmYgPSBQVl9NSU4oYWNfY2xpcCxQVl9NQVgoLWFjX2NsaXAtMSwgdG1wKSk7CisgICAgICAgIHNjYWxlX3EgPSBjb2VmZl9jbGlwKHNjYWxlX3EsIGFjX2NsaXApOworCisgICAgICAgIHFjb2VmZlswXSA9IHNjYWxlX3E7CisKKyAgICAgICAgUVAgPDw9IDE7CisgICAgICAgIC8vY29lZmYgPSBQVl9NSU4oMjA0NyxQVl9NQVgoLTIwNDgsIHRtcCkpOworICAgICAgICB0bXAgPSAyMDQ3OworICAgICAgICBjb2VmZiA9IGNvZWZmX2RlcXVhbnQoc2NhbGVfcSwgUVAsIEFkZGl0aW9uLCB0bXApOworCisgICAgICAgIHJjb2VmZlswXSA9IGNvZWZmOworCisgICAgICAgICgqYml0bWFwcm93KSA9IDEyODsKKyAgICAgICAgYml0bWFwenpbMF0gPSAoVUxvbmcpMSA8PCAzMTsKKyAgICAgICAgQ0JQID0gMTsKKyAgICB9CisgICAgcmV0dXJuIENCUDsKK30KKworCitJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRyYShTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGRjX3NjYWxlciwgVUNoYXIgc2hvcnRIZWFkZXIpCit7CisgICAgSW50IHRtcCwgY29lZmY7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoUXVhbnRQYXJhbSk7CisKKyAgICAqYml0bWFwcm93ID0gMDsKKyAgICBjb2VmZiA9IHJjb2VmZlswXTsKKworICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICBlbHNlICAgICAgICAgICAgY29lZmYgLT0gKGRjX3NjYWxlciA+PiAxKSA7CisgICAgdG1wID0gc2NhbGVBcnJheVYyW2RjX3NjYWxlcl07CisgICAgdG1wID0gY29lZmYgKiB0bXA7CisgICAgdG1wID4+PSAoMTUgKyAoZGNfc2NhbGVyID4+IDQpKTsKKyAgICB0bXAgKz0gKChVSW50KXRtcCA+PiAzMSk7CisKKyAgICBpZiAoc2hvcnRIZWFkZXIpCisgICAgICAgIHRtcCA9IFBWX01BWCgxLCBQVl9NSU4oMjU0LCB0bXApKTsKKworICAgIGlmICh0bXApCisgICAgeworICAgICAgICBxY29lZmZbMF0gPSB0bXA7CisgICAgICAgIGNvZWZmID0gdG1wICogZGNfc2NhbGVyOworICAgICAgICBjb2VmZiA9IFBWX01BWCgtMjA0OCwgUFZfTUlOKDIwNDcsIGNvZWZmKSk7CisgICAgICAgIHJjb2VmZlswXSA9IGNvZWZmOworICAgICAgICAqYml0bWFwcm93ID0gMTI4OworICAgICAgICBiaXRtYXB6elswXSA9IChVTG9uZykxIDw8IDMxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjaWZuZGVmIE5PX01QRUdfUVVBTlQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9uOiBCbGNrUXVhbnREZXF1YW50TVBFRworIERhdGU6ICAgICBKdW5lIDE1LCAxOTk5CisgUHVycG9zZTogIENvbWJpbmUgQmxvY2tRdWFudE1QRUcgYW5kIEJsb2NrRGVxdWFudE1QRUdFTkMKKyBJbnB1dDogICBjb2VmZj0+IERDVCBjb2VmZmljaWVudAorIE91dHB1dDogIHFjb2VmZj0+IHF1YW50aXplZCBjb2VmZmljaWVudAorICAgICAgICAgIHJjb2VmZj0+IHJlY29uc3RydWN0ZWQgY29lZmZpY2llbnQKKyBNb2RpZmllZDogIDcvNS8wMSwgYnJlYWsgdXAgZnVuY3Rpb24gZm9yIEludHJhL0ludGVyCisgICAgICAgICAgOC8zLzAxLCAgdXBkYXRlIHdpdGggY2hhbmdlcyBmcm9tIEgyNjMgcXVhbnQgbW9kZS4KKyAgICAgICAgICA4LzMvMDEsICBhZGQgY2xpcHBpbmcgdG8gdGhlIHJlY29uc3RydWN0ZWQgY29lZmZpY2llbnQgWy0yMDQ4LDIwNDddCisgICAgICAgICAgOC82LzAxLCAgb3B0aW1pemUgdXNpbmcgbXVsdGlwbGljYXRpdmUgbG9va3VwLXRhYmxlLgorICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgb3B0aW1pemVkIHVzaW5nIEFSTSBhc3NlbWJseSwgZS5nLiwKKyAgICAgICAgICAgICAgICAgICAgIGNsaXBwaW5nLCAxNi1iaXQgbXVsdC4sIGV0YyAhISEhISEhISEhISEhCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ludCBCbG9ja1F1YW50RGVxdWFudE1QRUdJbnRlcihTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBJbnQgUVAsIEludCAqcW1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBJbnQgY29tcCwgSW50IGRjX3NjYWxlcikKK3sKKyAgICBJbnQgaSwgeno7CisgICAgSW50IHRtcCwgY29lZmYsIHFfdmFsdWUgPSAwOworICAgIEludCBzdW0gPSAwOworICAgIEludCBzdGVwc2l6ZSwgUVB4MiA9IFFQIDw8IDE7CisgICAgSW50IENCUCA9IDA7CisgICAgSW50IHJvdW5kID0gMSA8PCAxNTsKKyAgICBJbnQgcV9zY2FsZSA9IHNjYWxlQXJyYXlWW1FQXTsKKyAgICBJbnQgc2hpZnQgPSAxNSArIChRUCA+PiAzKTsKKyAgICBVQ2hhciAqYmNvbHB0ciA9IGJpdG1hcGNvbDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhkY19zY2FsZXIpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhjb21wKTsKKworCisgICAgKigoSW50KiliaXRtYXBjb2wpID0gKigoSW50KikoYml0bWFwY29sICsgNCkpID0gMDsKKyAgICBiaXRtYXB6elswXSA9IGJpdG1hcHp6WzFdID0gMDsKKyAgICAqYml0bWFwcm93ID0gMDsKKworICAgIHJjb2VmZiArPSA2NDsKKyAgICBpID0gMDsKKyAgICBiY29scHRyLS07CisKKyAgICBkbworICAgIHsKKyAgICAgICAgYmNvbHB0cisrOworICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgaWYgKGNvZWZmID09IDB4N2ZmZikgLyogYWxsIHplcm8gY29sdW1uICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIHFfdmFsdWUgPSBBQU5TY2FsZVtpXTsgIC8qICAwOS8wMi8wNSBzY2FsaW5nIGZvciBBQU4qLworICAgICAgICAgICAgLyogYWFuIHNjYWxpbmcgKi8KKyAgICAgICAgICAgIHFfdmFsdWUgPSBzbWxhYmIocV92YWx1ZSwgY29lZmYsIHJvdW5kKTsKKworICAgICAgICAgICAgY29lZmYgPSBxX3ZhbHVlID4+IDE2OworCisgICAgICAgICAgICBzdGVwc2l6ZSA9IHFtYXRbaV07CisvLyAgICAgICAgICBpZihjb2VmZj4wKSAgICAgY29lZmYgPSAoMTYqY29lZmYgKyAoc3RlcHNpemUvMikpIC8gc3RlcHNpemU7CisvLyAgICAgICAgICBlbHNlICAgICAgICAgICAgY29lZmYgPSAoMTYqY29lZmYgLSAoc3RlcHNpemUvMikpIC8gc3RlcHNpemU7CisgICAgICAgICAgICBjb2VmZiA8PD0gNDsKKyAgICAgICAgICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoc3RlcHNpemUgPj4gMSkgOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChzdGVwc2l6ZSA+PiAxKSA7CisgICAgICAgICAgICBxX3ZhbHVlID0gc2NhbGVBcnJheVYyW3N0ZXBzaXplXTsKKyAgICAgICAgICAgIC8qIG1wZWcgcXVhbnQgdGFibGUgc2NhbGUgKi8KKyAgICAgICAgICAgIGNvZWZmID0gc211bGJiKGNvZWZmLCBxX3ZhbHVlKTsKKworICAgICAgICAgICAgY29lZmYgPj49ICgxNSArIChzdGVwc2l6ZSA+PiA0KSk7CisgICAgICAgICAgICBjb2VmZiArPSAoKFVJbnQpY29lZmYgPj4gMzEpOworCisgICAgICAgICAgICAvKiBRUCBzY2FsZSAqLworICAgICAgICAgICAgaWYgKGNvZWZmID49IC1RUHgyICYmIGNvZWZmIDwgUVB4MikgIC8qIHF1YW50aXplZCB0byB6ZXJvKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgcV92YWx1ZSA9IGNvZWZmLyhRUHgyKTsKKyAgICAgICAgICAgICAgICBxX3ZhbHVlID0gY29lZmZfcXVhbnQoY29lZmYsIHFfc2NhbGUsIHNoaWZ0KTsKKworICAgICAgICAgICAgICAgIGlmIChxX3ZhbHVlKSAgICAgICAgICAgICAgICAvKiBkZXF1YW50ICovCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHp6ID0gWlpUYWJbaV07ICAvKiB6aWd6YWcgb3JkZXIgKi8KKworICAgICAgICAgICAgICAgICAgICB0bXAgPSAyMDQ3OworCisgICAgICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBjbGlwXzIwNDcocV92YWx1ZSwgdG1wKTsKKworICAgICAgICAgICAgICAgICAgICBxY29lZmZbeno+PjFdID0gcV92YWx1ZTsKKworICAgICAgICAgICAgICAgICAgICAvL3FfdmFsdWU9KCgoY29lZmYqMikrU0lHTjAoY29lZmYpKSpzdGVwc2l6ZSpRUCkvMTY7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vIG5lZWQgZm9yIFNJR04wLCBubyB6ZXJvIGNvbWluZyBpbiB0aGlzIHt9ICovCisgICAgICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9kZXF1YW50X21wZWcocV92YWx1ZSwgc3RlcHNpemUsIFFQLCB0bXApOworCisgICAgICAgICAgICAgICAgICAgIHJjb2VmZltpLTY0XSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHFfdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICgqYmNvbHB0cikgfD0gaW1hc2tbaT4+M107CisgICAgICAgICAgICAgICAgICAgIGlmICgoenogPj4gMSkgPiAzMSkgYml0bWFwenpbMV0gfD0gKDEgPDwgKDYzIC0gKHp6ID4+IDEpKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIGJpdG1hcHp6WzBdIHw9ICgxIDw8ICgzMSAtICh6eiA+PiAxKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaSA8IChkY3RNb2RlIDw8IDMpKSA7CisKKyAgICAgICAgaSArPSAoMSAtIChkY3RNb2RlIDw8IDMpKTsKKyAgICB9CisgICAgd2hpbGUgKGkgPCBkY3RNb2RlKSA7CisKKyAgICBpID0gZGN0TW9kZTsKKyAgICB0bXAgPSAxIDw8ICg4IC0gaSk7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIGlmIChiaXRtYXBjb2xbaV0pKCpiaXRtYXByb3cpIHw9IHRtcDsKKyAgICAgICAgdG1wIDw8PSAxOworICAgIH0KKworICAgIGlmICgqYml0bWFwcm93KQorICAgICAgICBDQlAgPSAxOyAgIC8qIGNoZWNrIENCUCBiZWZvcmUgbWlzbWF0Y2ggY29udHJvbCwgIDcvNS8wMSAqLworCisgICAgLyogTWlzbWF0Y2ggY29udHJvbCwgIDUvMy8wMSAqLworICAgIGlmIChDQlApCisgICAgeworICAgICAgICBpZiAoKHN1bSYweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjb2VmZi0tOyAgLyogcmNvZWZmWzYzXSAqLworICAgICAgICAgICAgY29lZmYgPSAqcmNvZWZmOworICAgICAgICAgICAgY29lZmYgXj0gMHgxOworICAgICAgICAgICAgKnJjb2VmZiA9IGNvZWZmOworICAgICAgICAgICAgaWYgKGNvZWZmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJpdG1hcGNvbFs3XSB8PSAxOworICAgICAgICAgICAgICAgICgqYml0bWFwcm93KSB8PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENCUDsKK30KKworSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IGRjdE1vZGUsIEludCBjb21wLCBJbnQgZGNfc2NhbGVyKQoreworICAgIEludCBpOworICAgIEludCB0bXAsIGNvZWZmLCBxX3ZhbHVlID0gMDsKKyAgICBJbnQgc3VtID0gMDsKKyAgICBJbnQgc3RlcHNpemU7CisgICAgSW50IENCUCA9IDA7CisgICAgSW50IHJvdW5kID0gMSA8PCAxNTsKKyAgICBJbnQgcV9zY2FsZSA9IHNjYWxlQXJyYXlWW1FQXTsKKyAgICBJbnQgc2hpZnQgPSAxNSArIChRUCA+PiAzKTsKKyAgICBJbnQgcm91bmQyID0gKDMgKiBRUCArIDIpID4+IDI7CisgICAgSW50IFFQeDJwbHVzID0gKFFQIDw8IDEpIC0gcm91bmQyOworICAgIFVDaGFyICpibWNvbHB0ciA9IGJpdG1hcGNvbDsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhiaXRtYXB6eik7CisgICAgT1NDTF9VTlVTRURfQVJHKGNvbXApOworCisgICAgKigoSW50KiliaXRtYXBjb2wpID0gKigoSW50KikoYml0bWFwY29sICsgNCkpID0gMDsKKyAgICAqYml0bWFwcm93ID0gMDsKKworICAgIHJjb2VmZiArPSA2NDsKKyAgICBpID0gMDsKKworICAgIC8qIERDIHZhbHVlICovCisgICAgY29lZmYgPSAqcmNvZWZmOworCisgICAgaWYgKGNvZWZmID09IDB4N2ZmZikgLyogYWxsIHplcm8gY29sdW1uICovCisgICAgeworICAgICAgICBibWNvbHB0cisrOworICAgICAgICBpKys7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFfdmFsdWUgPSByb3VuZCArIChjb2VmZiA8PCAxMik7CisgICAgICAgIGNvZWZmID0gcV92YWx1ZSA+PiAxNjsKKyAgICAgICAgLyppZiAoY29lZmYgPj0gMCkgICBjb2VmZiA9IChjb2VmZiArIChkY19zY2FsZXIvMikpIC8gZGNfc2NhbGVyOworICAgICAgICBlbHNlICAgICAgICAgICAgY29lZmYgPSAoY29lZmYgLSAoZGNfc2NhbGVyLzIpKSAvIGRjX3NjYWxlcjsqLworICAgICAgICBpZiAoY29lZmYgPj0gMCkgY29lZmYgKz0gKGRjX3NjYWxlciA+PiAxKSA7CisgICAgICAgIGVsc2UgICAgICAgICAgICBjb2VmZiAtPSAoZGNfc2NhbGVyID4+IDEpIDsKKyAgICAgICAgcV92YWx1ZSA9IHNjYWxlQXJyYXlWMltkY19zY2FsZXJdOworCisgICAgICAgIC8qIG1wZWcgcXVhbnQgdGFibGUgc2NhbGUgKi8KKyAgICAgICAgY29lZmYgPSBzbXVsYmIoY29lZmYsIHFfdmFsdWUpOworCisgICAgICAgIGNvZWZmID4+PSAoMTUgKyAoZGNfc2NhbGVyID4+IDQpKTsKKyAgICAgICAgY29lZmYgKz0gKChVSW50KWNvZWZmID4+IDMxKTsKKworICAgICAgICBpZiAoY29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZWZmID0gUFZfTUFYKDEsIFBWX01JTigyNTQsIGNvZWZmKSk7CisgICAgICAgICAgICBxY29lZmZbMF0gPSBjb2VmZjsKKworICAgICAgICAgICAgY29lZmYgPSBzbXVsYmIoY29lZmYsIGRjX3NjYWxlcik7CisKKyAgICAgICAgICAgIHFfdmFsdWUgPSBjbGlwXzIwNDcoY29lZmYsIDIwNDcpOworCisgICAgICAgICAgICBzdW0gPSBxX3ZhbHVlOworCisgICAgICAgICAgICByY29lZmZbLTY0XSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgIGJpdG1hcGNvbFswXSB8PSAxMjg7CisgICAgICAgIH0KKyAgICAgICAgaSArPSA4OworICAgIH0KKyAgICAvKiBBQyB2YWx1ZXMgKi8KKyAgICBkbworICAgIHsKKyAgICAgICAgY29lZmYgPSByY29lZmZbaV07CisgICAgICAgIGlmIChjb2VmZiA9PSAweDdmZmYpIC8qIGFsbCB6ZXJvIHJvdyAqLworICAgICAgICB7CisgICAgICAgICAgICBibWNvbHB0cisrOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgLyogc2NhbGluZyAqLworICAgICAgICAgICAgcV92YWx1ZSA9IEFBTlNjYWxlW2ldOyAvKiAgMDkvMDIvMDUgKi8KKworICAgICAgICAgICAgLyogcV92YWx1ZSA9IGNvZWZmKnFfdmFsdWUgKyByb3VuZCAqLworICAgICAgICAgICAgcV92YWx1ZSA9IHNtbGFiYihjb2VmZiwgcV92YWx1ZSwgcm91bmQpOworICAgICAgICAgICAgY29lZmYgPSBxX3ZhbHVlID4+IDE2OworCisgICAgICAgICAgICBzdGVwc2l6ZSA9IHFtYXRbaV07CisgICAgICAgICAgICAvKmlmKGNvZWZmPjApICAgICAgIGNvZWZmID0gKDE2KmNvZWZmICsgKHN0ZXBzaXplLzIpKSAvIHN0ZXBzaXplOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIGNvZWZmID0gKDE2KmNvZWZmIC0gKHN0ZXBzaXplLzIpKSAvIHN0ZXBzaXplOyovCisgICAgICAgICAgICBjb2VmZiA8PD0gNDsKKyAgICAgICAgICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoc3RlcHNpemUgPj4gMSkgOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChzdGVwc2l6ZSA+PiAxKSA7CisgICAgICAgICAgICBxX3ZhbHVlID0gc2NhbGVBcnJheVYyW3N0ZXBzaXplXTsKKworICAgICAgICAgICAgLyogc2NhbGUgbXBlZyBxdWFudCAqLworICAgICAgICAgICAgY29lZmYgPSBzbXVsYmIoY29lZmYsIHFfdmFsdWUpOworCisgICAgICAgICAgICBjb2VmZiA+Pj0gKDE1ICsgKHN0ZXBzaXplID4+IDQpKTsKKyAgICAgICAgICAgIGNvZWZmICs9ICgoVUludCljb2VmZiA+PiAzMSk7CisKKyAgICAgICAgICAgIGlmIChjb2VmZiA+PSAtUVB4MnBsdXMgJiYgY29lZmYgPCBRUHgycGx1cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9xX3ZhbHVlID0gKCBjb2VmZiArIFNJR04wKGNvZWZmKSooKDMqUVArMikvNCkpLygyKlFQKTsKKyAgICAgICAgICAgICAgICBpZiAoY29lZmYgPiAwKSBjb2VmZiArPSByb3VuZDI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29lZmYgPCAwKSBjb2VmZiAtPSByb3VuZDI7CisKKyAgICAgICAgICAgICAgICBxX3ZhbHVlID0gc211bGJiKGNvZWZmLCBxX3NjYWxlKTsKKyAgICAgICAgICAgICAgICBxX3ZhbHVlID4+PSBzaGlmdDsKKyAgICAgICAgICAgICAgICBxX3ZhbHVlICs9ICgoVUludClxX3ZhbHVlID4+IDMxKTsKKworICAgICAgICAgICAgICAgIGlmIChxX3ZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gMjA0NzsKKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9IGNsaXBfMjA0NyhxX3ZhbHVlLCB0bXApOworCisgICAgICAgICAgICAgICAgICAgIHFjb2VmZltpXSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgc3RlcHNpemUgPSBzbXVsYmIoc3RlcHNpemUsIFFQKTsKKyAgICAgICAgICAgICAgICAgICAgcV92YWx1ZSA9ICBzbXVsYmIocV92YWx1ZSwgc3RlcHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIHFfdmFsdWUgPSBjb2VmZl9kZXF1YW50X21wZWdfaW50cmEocV92YWx1ZSwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgLy9xX3ZhbHVlID0gKGNvZWZmKnN0ZXBzaXplKlFQKjIpLzE2OworCisgICAgICAgICAgICAgICAgICAgIHJjb2VmZltpLTY0XSA9IHFfdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHFfdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICgqYm1jb2xwdHIpIHw9IGltYXNrW2k+PjNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IDg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2VmZiA9IHJjb2VmZltpXTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaSA8IChkY3RNb2RlIDw8IDMpKSA7CisKKyAgICAgICAgYm1jb2xwdHIrKzsKKyAgICAgICAgaSArPSAoMSAtIChkY3RNb2RlIDw8IDMpKTsKKyAgICB9CisgICAgd2hpbGUgKGkgPCBkY3RNb2RlKSA7CisKKyAgICBpID0gZGN0TW9kZTsKKyAgICB0bXAgPSAxIDw8ICg4IC0gaSk7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIGlmIChiaXRtYXBjb2xbaV0pKCpiaXRtYXByb3cpIHw9IHRtcDsKKyAgICAgICAgdG1wIDw8PSAxOworICAgIH0KKworICAgIGlmICgoKCpiaXRtYXByb3cpICYxMjcpIHx8IChiaXRtYXBjb2xbMF0mMTI3KSkKKyAgICAgICAgQ0JQID0gMTsgIC8qIGNoZWNrIENCUCBiZWZvcmUgbWlzbWF0Y2ggY29udHJvbCwgIDcvNS8wMSAqLworCisgICAgLyogTWlzbWF0Y2ggY29udHJvbCwgIDUvMy8wMSAqLworICAgIGlmIChDQlAgfHwgYml0bWFwY29sWzBdKQorICAgIHsKKyAgICAgICAgaWYgKChzdW0mMHgxKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByY29lZmYtLTsgIC8qIHJjb2VmZls2M10gKi8KKyAgICAgICAgICAgIGNvZWZmID0gKnJjb2VmZjsKKyAgICAgICAgICAgIGNvZWZmIF49IDB4MTsKKyAgICAgICAgICAgICpyY29lZmYgPSBjb2VmZjsKKyAgICAgICAgICAgIGlmIChjb2VmZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiaXRtYXBjb2xbN10gfD0gMTsKKyAgICAgICAgICAgICAgICAoKmJpdG1hcHJvdykgfD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDQlA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgRnVuY3Rpb246IEJsY2tRdWFudERlcXVhbnRNUEVHREMKKyBEYXRlOiAgICAgNS8zLzIwMDEKKyBQdXJwb3NlOiAgTVBFRyBRdWFudC9EZXF1YW50IGZvciBEQyBvbmx5IGJsb2NrLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0RDSW50ZXIoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LCBJbnQgZHVtbXkpCit7CisgICAgSW50IHFfdmFsdWUsIGNvZWZmLCBzdGVwc2l6ZTsKKyAgICBJbnQgQ0JQID0gMDsKKyAgICBJbnQgcV9zY2FsZSA9IHNjYWxlQXJyYXlWW1FQXTsKKyAgICBJbnQgc2hpZnQgPSAxNSArIChRUCA+PiAzKTsKKyAgICBJbnQgUVB4MiA9IFFQIDw8IDE7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoZHVtbXkpOworCisgICAgKigoSW50KiliaXRtYXBjb2wpID0gKigoSW50KikoYml0bWFwY29sICsgNCkpID0gMDsKKyAgICAqYml0bWFwcm93ID0gMDsKKyAgICBiaXRtYXB6elswXSA9IGJpdG1hcHp6WzFdID0gMDsKKyAgICBjb2VmZiA9IHJjb2VmZlswXTsKKyAgICBzdGVwc2l6ZSA9IHFtYXRbMF07CisKKyAgICAvKmlmKGNvZWZmPjApICAgICAgIGNvZWZmID0gKDE2KmNvZWZmICsgKHN0ZXBzaXplLzIpKSAvIHN0ZXBzaXplOworICAgIGVsc2UgICAgICAgICAgICBjb2VmZiA9ICgxNipjb2VmZiAtIChzdGVwc2l6ZS8yKSkgLyBzdGVwc2l6ZTsqLworICAgIGNvZWZmIDw8PSA0OworICAgIGlmIChjb2VmZiA+PSAwKSBjb2VmZiArPSAoc3RlcHNpemUgPj4gMSkgOworICAgIGVsc2UgICAgICAgICAgICBjb2VmZiAtPSAoc3RlcHNpemUgPj4gMSkgOworICAgIHFfdmFsdWUgPSBzY2FsZUFycmF5VjJbc3RlcHNpemVdOworCisgICAgY29lZmYgPSBzbXVsYmIoY29lZmYsIHFfdmFsdWUpOworCisgICAgY29lZmYgPj49ICgxNSArIChzdGVwc2l6ZSA+PiA0KSk7CisgICAgY29lZmYgKz0gKChVSW50KWNvZWZmID4+IDMxKTsKKworICAgIGlmIChjb2VmZiA+PSAtUVB4MiAmJiBjb2VmZiA8IFFQeDIpCisgICAgeworICAgICAgICByY29lZmZbMF0gPSAwOworICAgICAgICByZXR1cm4gQ0JQOworICAgIH0KKyAgICBlbHNlCisgICAgeworLy8gICAgICBxX3ZhbHVlID0gY29lZmYvKFFQeDIpOworICAgICAgICBxX3ZhbHVlID0gY29lZmZfcXVhbnQoY29lZmYsIHFfc2NhbGUsIHNoaWZ0KTsKKworICAgICAgICBpZiAocV92YWx1ZSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvL1BWX01JTigyMDQ3LFBWX01BWCgtMjA0OCwgcV92YWx1ZSkpOworICAgICAgICAgICAgcV92YWx1ZSA9IGNsaXBfMjA0NyhxX3ZhbHVlLCAyMDQ3KTsKKyAgICAgICAgICAgIHFjb2VmZlswXSA9IHFfdmFsdWU7CisgICAgICAgICAgICBxX3ZhbHVlID0gY29lZmZfZGVxdWFudF9tcGVnKHFfdmFsdWUsIHN0ZXBzaXplLCBRUCwgMjA0Nyk7CisgICAgICAgICAgICAvL3FfdmFsdWU9KCgoY29lZmYqMikrU0lHTjAoY29lZmYpKSpzdGVwc2l6ZSpRUCkvMTY7CisgICAgICAgICAgICByY29lZmZbMF0gPSBxX3ZhbHVlOworCisgICAgICAgICAgICBiaXRtYXBjb2xbMF0gPSAxMjg7CisgICAgICAgICAgICAoKmJpdG1hcHJvdykgPSAxMjg7CisgICAgICAgICAgICBiaXRtYXB6elswXSA9IChVSW50KTEgPDwgMzE7CisgICAgICAgICAgICBDQlAgPSAxOworCisgICAgICAgICAgICAvKiBNaXNtYXRjaCBjb250cm9sLCAgNS8zLzAxICovCisgICAgICAgICAgICBpZiAoKHFfdmFsdWUmMHgxKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjb2VmZls2M10gPSAxOyAvKiBhZnRlciBzY2FsaW5nIGl0IHJlbWFpbnMgdGhlIHNhbWUgKi8KKyAgICAgICAgICAgICAgICBiaXRtYXBjb2xbN10gfD0gMTsKKyAgICAgICAgICAgICAgICAoKmJpdG1hcHJvdykgfD0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ0JQOworfQorCisKK0ludCBCbG9ja1F1YW50RGVxdWFudE1QRUdEQ0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY19zY2FsZXIpCit7CisgICAgSW50IHRtcCwgY29lZmYsIHFfdmFsdWU7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoUVApOworICAgIE9TQ0xfVU5VU0VEX0FSRyhxbWF0KTsKKworCisgICAgKigoSW50KiliaXRtYXBjb2wpID0gKigoSW50KikoYml0bWFwY29sICsgNCkpID0gMDsKKyAgICAqYml0bWFwcm93ID0gMDsKKyAgICBjb2VmZiA9IHJjb2VmZlswXTsKKworICAgIC8qaWYgKGNvZWZmID49IDApICAgdG1wID0gKGNvZWZmICsgZGNfc2NhbGVyLzIpIC8gZGNfc2NhbGVyOworICAgIGVsc2UgICAgICAgICAgICB0bXAgPSAoY29lZmYgLSBkY19zY2FsZXIvMikgLyBkY19zY2FsZXI7Ki8KKyAgICBpZiAoY29lZmYgPj0gMCkgY29lZmYgKz0gKGRjX3NjYWxlciA+PiAxKSA7CisgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChkY19zY2FsZXIgPj4gMSkgOworICAgIHRtcCA9IHNjYWxlQXJyYXlWMltkY19zY2FsZXJdOworCisgICAgdG1wID0gc211bGJiKHRtcCwgY29lZmYpOworICAgIHRtcCA+Pj0gKDE1ICsgKGRjX3NjYWxlciA+PiA0KSk7CisgICAgdG1wICs9ICgoVUludCl0bXAgPj4gMzEpOworCisgICAgaWYgKHRtcCkKKyAgICB7CisgICAgICAgIGNvZWZmID0gUFZfTUFYKDEsIFBWX01JTigyNTQsIHRtcCkpOworICAgICAgICBxY29lZmZbMF0gPSBjb2VmZjsKKworICAgICAgICBxX3ZhbHVlID0gc211bGJiKGNvZWZmLCBkY19zY2FsZXIpOworICAgICAgICBxX3ZhbHVlID0gY2xpcF8yMDQ3KHFfdmFsdWUsIDIwNDcpOworICAgICAgICByY29lZmZbMF0gPSBxX3ZhbHVlOworICAgICAgICBiaXRtYXBjb2xbMF0gPSAxMjg7CisgICAgICAgICpiaXRtYXByb3cgPSAxMjg7CisgICAgICAgIGJpdG1hcHp6WzBdID0gKFVJbnQpMSA8PCAzMTsKKworICAgICAgICAvKiBNaXNtYXRjaCBjb250cm9sLCAgNS8zLzAxICovCisgICAgICAgIGlmICgocV92YWx1ZSYweDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjb2VmZls2M10gPSAxOyAvKiBhZnRlciBzY2FsaW5nIGl0IHJlbWFpbnMgdGhlIHNhbWUgKi8KKyAgICAgICAgICAgIGJpdG1hcGNvbFs3XSB8PSAxOworICAgICAgICAgICAgKCpiaXRtYXByb3cpIHw9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnRfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnRfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkMGViZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaApAQCAtMCwwICsxLDYyNSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRmlsZW5hbWU6IGZhc3RxdWFudF9pbmxpbmUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZXNjcmlwdGlvbjogSW1wbGVtZW50YXRpb24gZm9yIGluLWxpbmUgZnVuY3Rpb25zIHVzZWQgaW4gZGN0LmNwcCAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9GQVNUUVVBTlRfSU5MSU5FX0hfCisjZGVmaW5lIF9GQVNUUVVBTlRfSU5MSU5FX0hfCisKKyNpbmNsdWRlICJtcDRkZWYuaCIKKworI2lmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpICYmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKK19faW5saW5lIGludDMyIGFhbl9zY2FsZShpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwgaW50MzIgcm91bmQsIGludDMyIFFQZGl2MikKK3sKKyAgICBxX3ZhbHVlID0gY29lZmYgKiBxX3ZhbHVlICsgcm91bmQ7CisgICAgY29lZmYgPSBxX3ZhbHVlID4+IDE2OworICAgIGlmIChjb2VmZiA8IDApICBjb2VmZiArPSBRUGRpdjI7CisgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IFFQZGl2MjsKKworICAgIHJldHVybiBjb2VmZjsKK30KKworCitfX2lubGluZSBpbnQzMiBjb2VmZl9xdWFudChpbnQzMiBjb2VmZiwgaW50MzIgcV9zY2FsZSwgaW50MzIgc2hpZnQpCit7CisgICAgaW50MzIgcV92YWx1ZTsKKworICAgIHFfdmFsdWUgPSBjb2VmZiAqIHFfc2NhbGU7ICAgICAgLy9xX3ZhbHVlID0gLSgoLShjb2VmZiArIFFQZGl2MikqcV9zY2FsZSk+PkxTTCk7CisgICAgcV92YWx1ZSA+Pj0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgLy9xX3ZhbHVlID0gKCgoY29lZmYgLSBRUGRpdjIpKnFfc2NhbGUpPj5MU0wgKTsKKyAgICBxX3ZhbHVlICs9ICgoVUludClxX3ZhbHVlID4+IDMxKTsgLyogYWRkIG9uZSBpZiBuZWdhdGl2ZSAqLworCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyICBjb2VmZl9jbGlwKGludDMyIHFfdmFsdWUsIGludDMyIGFjX2NsaXApCit7CisgICAgaW50MzIgY29lZmYgPSBxX3ZhbHVlICsgYWNfY2xpcDsKKworICAgIGlmICgoVUludCljb2VmZiA+IChVSW50KShhY19jbGlwIDw8IDEpKQorICAgICAgICBxX3ZhbHVlID0gYWNfY2xpcCBeKHFfdmFsdWUgPj4gMzEpOworCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnQoaW50MzIgcV92YWx1ZSwgaW50MzIgUVB4MiwgaW50MzIgQWRkaXRpb24sIGludDMyIHRtcCkKK3sKKyAgICBpbnQzMiBjb2VmZjsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyh0bXApOworCisgICAgaWYgKHFfdmFsdWUgPCAwKQorICAgIHsKKyAgICAgICAgY29lZmYgPSBxX3ZhbHVlICogUVB4MiAtIEFkZGl0aW9uOworICAgICAgICBpZiAoY29lZmYgPCAtMjA0OCkKKyAgICAgICAgICAgIGNvZWZmID0gLTIwNDg7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvZWZmID0gcV92YWx1ZSAqIFFQeDIgKyBBZGRpdGlvbjsKKyAgICAgICAgaWYgKGNvZWZmID4gMjA0NykKKyAgICAgICAgICAgIGNvZWZmID0gMjA0NzsKKyAgICB9CisgICAgcmV0dXJuIGNvZWZmOworfQorCitfX2lubGluZSBpbnQzMiBzbWxhYmIoaW50MzIgcV92YWx1ZSwgaW50MzIgY29lZmYsIGludDMyIHJvdW5kKQoreworICAgIHFfdmFsdWUgPSBjb2VmZiAqIHFfdmFsdWUgKyByb3VuZDsKKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBzbXVsYmIoaW50MzIgcV9zY2FsZSwgaW50MzIgY29lZmYpCit7CisgICAgaW50MzIgcV92YWx1ZTsKKworICAgIHFfdmFsdWUgPSBjb2VmZiAqIHFfc2NhbGU7CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgYWFuX2RjX3NjYWxlKGludDMyIGNvZWZmLCBpbnQzMiBRUCkKK3sKKworICAgIGlmIChjb2VmZiA8IDApICBjb2VmZiArPSAoUVAgPj4gMSk7CisgICAgZWxzZSAgICAgICAgICAgIGNvZWZmIC09IChRUCA+PiAxKTsKKworICAgIHJldHVybiBjb2VmZjsKK30KKworX19pbmxpbmUgaW50MzIgY2xpcF8yMDQ3KGludDMyIHFfdmFsdWUsIGludDMyIHRtcCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcodG1wKTsKKworICAgIGlmIChxX3ZhbHVlIDwgLTIwNDgpCisgICAgeworICAgICAgICBxX3ZhbHVlID0gLTIwNDg7CisgICAgfQorICAgIGVsc2UgaWYgKHFfdmFsdWUgPiAyMDQ3KQorICAgIHsKKyAgICAgICAgcV92YWx1ZSA9IDIwNDc7CisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnRfbXBlZyhpbnQzMiBxX3ZhbHVlLCBpbnQzMiBzdGVwc2l6ZSwgaW50MzIgUVAsIGludDMyIHRtcCkKK3sKKyAgICBpbnQzMiBjb2VmZjsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyh0bXApOworCisgICAgY29lZmYgPSBxX3ZhbHVlIDw8IDE7CisgICAgc3RlcHNpemUgKj0gUVA7CisgICAgaWYgKGNvZWZmID4gMCkKKyAgICB7CisgICAgICAgIHFfdmFsdWUgPSAoY29lZmYgKyAxKSAqIHN0ZXBzaXplOworICAgICAgICBxX3ZhbHVlID4+PSA0OworICAgICAgICBpZiAocV92YWx1ZSA+IDIwNDcpIHFfdmFsdWUgPSAyMDQ3OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBxX3ZhbHVlID0gKGNvZWZmIC0gMSkgKiBzdGVwc2l6ZTsKKyAgICAgICAgcV92YWx1ZSArPSAxNTsKKyAgICAgICAgcV92YWx1ZSA+Pj0gNDsKKyAgICAgICAgaWYgKHFfdmFsdWUgPCAtMjA0OCkgICAgcV92YWx1ZSA9IC0yMDQ4OworICAgIH0KKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50X21wZWdfaW50cmEoaW50MzIgcV92YWx1ZSwgaW50MzIgdG1wKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyh0bXApOworCisgICAgcV92YWx1ZSA8PD0gMTsKKyAgICBpZiAocV92YWx1ZSA+IDApCisgICAgeworICAgICAgICBxX3ZhbHVlID4+PSA0OworICAgICAgICBpZiAocV92YWx1ZSA+IDIwNDcpIHFfdmFsdWUgPSAyMDQ3OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBxX3ZhbHVlICs9IDE1OworICAgICAgICBxX3ZhbHVlID4+PSA0OworICAgICAgICBpZiAocV92YWx1ZSA8IC0yMDQ4KSBxX3ZhbHVlID0gLTIwNDg7CisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworI2lmIGRlZmluZWQoX19UQVJHRVRfQVJDSF81VEUpCisKK19faW5saW5lIGludDMyIGFhbl9zY2FsZShpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiByb3VuZCwgaW50MzIgUVBkaXYyKQoreworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbWxhYmIgcV92YWx1ZSwgY29lZmYsIHFfdmFsdWUsIHJvdW5kCisgICAgICAgIG1vdnMgICAgICAgY29lZmYsIHFfdmFsdWUsIGFzciAjMTYKKyAgICAgICAgYWRkbGUgICBjb2VmZiwgY29lZmYsIFFQZGl2MgorICAgICAgICBzdWJndCAgIGNvZWZmLCBjb2VmZiwgUVBkaXYyCisgICAgfQorCisgICAgcmV0dXJuIGNvZWZmOworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9xdWFudChpbnQzMiBjb2VmZiwgaW50MzIgcV9zY2FsZSwgaW50MzIgc2hpZnQpCit7CisgICAgaW50MzIgcV92YWx1ZTsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbXVsYmIgIHFfdmFsdWUsIHFfc2NhbGUsIGNvZWZmICAgIC8qbW92ICAgIGNvZWZmLCBjb2VmZiwgbHNsICMxNCovCisgICAgICAgIG1vdiAgICAgY29lZmYsIHFfdmFsdWUsIGFzciBzaGlmdCAgIC8qc211bGwgdG1wLCBjb2VmZiwgcV9zY2FsZSwgY29lZmYqLworICAgICAgICBhZGQgcV92YWx1ZSwgY29lZmYsIGNvZWZmLCBsc3IgIzMxCisgICAgfQorCisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudChpbnQzMiBxX3ZhbHVlLCBpbnQzMiBRUHgyLCBpbnQzMiBBZGRpdGlvbiwgaW50MzIgdG1wKQoreworICAgIGludDMyIGNvZWZmOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIGNtcCAgICAgcV92YWx1ZSwgIzAKKyAgICAgICAgc211bGJiICBjb2VmZiwgcV92YWx1ZSwgUVB4MgorICAgICAgICBzdWJsdCAgIGNvZWZmLCBjb2VmZiwgQWRkaXRpb24KKyAgICAgICAgYWRkZ2UgICBjb2VmZiwgY29lZmYsIEFkZGl0aW9uCisgICAgICAgIGFkZCAgICAgcV92YWx1ZSwgY29lZmYsIHRtcAorICAgICAgICBzdWJzICAgIHFfdmFsdWUsIHFfdmFsdWUsICMzODQwCisgICAgICAgIHN1YmNzcyAgcV92YWx1ZSwgcV92YWx1ZSwgIzI1NAorICAgICAgICBlb3JoaSAgIGNvZWZmLCB0bXAsIGNvZWZmLCBhc3IgIzMxCisgICAgfQorCisgICAgcmV0dXJuIGNvZWZmOworfQorCitfX2lubGluZSBpbnQzMiBzbWxhYmIoaW50MzIgcV92YWx1ZSwgaW50MzIgY29lZmYsIGludDMyIHJvdW5kKQoreworICAgIF9fYXNtCisgICAgeworICAgICAgICBzbWxhYmIgcV92YWx1ZSwgY29lZmYsIHFfdmFsdWUsIHJvdW5kCisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIHNtdWxiYihpbnQzMiBxX3NjYWxlLCBpbnQzMiBjb2VmZikKK3sKKyAgICBpbnQzMiBxX3ZhbHVlOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIHNtdWxiYiAgcV92YWx1ZSwgcV9zY2FsZSwgY29lZmYKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudF9tcGVnKGludDMyIHFfdmFsdWUsIGludDMyIHN0ZXBzaXplLCBpbnQzMiBRUCwgaW50MzIgdG1wKQoreworICAgIC8qIHRtcCBtdXN0IGhhdmUgdmFsdWUgb2YgMjA0NyAqLworICAgIGludDMyIGNvZWZmOworICAgIF9fYXNtCisgICAgeworICAgICAgICBtb3ZzICAgIGNvZWZmLCBxX3ZhbHVlLCBsc2wgIzEKKyAgICAgICAgc211bGJiICBzdGVwc2l6ZSwgc3RlcHNpemUsIFFQCisgICAgICAgIGFkZGd0ICAgY29lZmYsIGNvZWZmLCAjMQorICAgICAgICBzdWJsdCAgIGNvZWZmLCBjb2VmZiwgIzEKKyAgICAgICAgc211bGJiICBxX3ZhbHVlLCBjb2VmZiwgc3RlcHNpemUKKyAgICAgICAgYWRkbHQgICBxX3ZhbHVlLCBxX3ZhbHVlLCAjMTUKKyAgICAgICAgbW92ICAgICBxX3ZhbHVlLCBxX3ZhbHVlLCBhc3IgIzQKKyAgICAgICAgYWRkICAgICBjb2VmZiwgcV92YWx1ZSwgdG1wCisgICAgICAgIHN1YnMgICAgY29lZmYsIGNvZWZmLCAjMHhmMDAKKyAgICAgICAgc3ViY3NzICBjb2VmZiwgY29lZmYsICMweGZlCisgICAgICAgIGVvcmhpICAgcV92YWx1ZSwgdG1wLCBxX3ZhbHVlLCBhc3IgIzMxCisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKKworI2Vsc2UgLy8gbm90IEFSTVY1VEUKKworX19pbmxpbmUgaW50MzIgYWFuX3NjYWxlKGludDMyIHFfdmFsdWUsIGludDMyIGNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHJvdW5kLCBpbnQzMiBRUGRpdjIpCit7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1sYSBxX3ZhbHVlLCBjb2VmZiwgcV92YWx1ZSwgcm91bmQKKyAgICAgICAgbW92cyAgICAgICBjb2VmZiwgcV92YWx1ZSwgYXNyICMxNgorICAgICAgICBhZGRsZSAgIGNvZWZmLCBjb2VmZiwgUVBkaXYyCisgICAgICAgIHN1Ymd0ICAgY29lZmYsIGNvZWZmLCBRUGRpdjIKKyAgICB9CisKKyAgICByZXR1cm4gY29lZmY7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX3F1YW50KGludDMyIGNvZWZmLCBpbnQzMiBxX3NjYWxlLCBpbnQzMiBzaGlmdCkKK3sKKyAgICBpbnQzMiBxX3ZhbHVlOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIG11bCBxX3ZhbHVlLCBxX3NjYWxlLCBjb2VmZiAgICAvKm1vdiAgICBjb2VmZiwgY29lZmYsIGxzbCAjMTQqLworICAgICAgICBtb3YgICAgIGNvZWZmLCBxX3ZhbHVlLCBhc3Igc2hpZnQgICAvKnNtdWxsIHRtcCwgY29lZmYsIHFfc2NhbGUsIGNvZWZmKi8KKyAgICAgICAgYWRkIHFfdmFsdWUsIGNvZWZmLCBjb2VmZiwgbHNyICMzMQorICAgIH0KKworCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudChpbnQzMiBxX3ZhbHVlLCBpbnQzMiBRUHgyLCBpbnQzMiBBZGRpdGlvbiwgaW50MzIgdG1wKQoreworICAgIGludDMyIGNvZWZmOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIGNtcCAgICAgcV92YWx1ZSwgIzAKKyAgICAgICAgbXVsIGNvZWZmLCBxX3ZhbHVlLCBRUHgyCisgICAgICAgIHN1Ymx0ICAgY29lZmYsIGNvZWZmLCBBZGRpdGlvbgorICAgICAgICBhZGRnZSAgIGNvZWZmLCBjb2VmZiwgQWRkaXRpb24KKyAgICAgICAgYWRkICAgICBxX3ZhbHVlLCBjb2VmZiwgdG1wCisgICAgICAgIHN1YnMgICAgcV92YWx1ZSwgcV92YWx1ZSwgIzM4NDAKKyAgICAgICAgc3ViY3NzICBxX3ZhbHVlLCBxX3ZhbHVlLCAjMjU0CisgICAgICAgIGVvcmhpICAgY29lZmYsIHRtcCwgY29lZmYsIGFzciAjMzEKKyAgICB9CisKKyAgICByZXR1cm4gY29lZmY7Cit9CisKK19faW5saW5lIGludDMyIHNtbGFiYihpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwgaW50MzIgcm91bmQpCit7CisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1sYSBxX3ZhbHVlLCBjb2VmZiwgcV92YWx1ZSwgcm91bmQKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworX19pbmxpbmUgaW50MzIgc211bGJiKGludDMyIHFfc2NhbGUsIGludDMyIGNvZWZmKQoreworICAgIGludDMyIHFfdmFsdWU7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgbXVsIHFfdmFsdWUsIHFfc2NhbGUsIGNvZWZmCisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKKworX19pbmxpbmUgaW50MzIgY29lZmZfZGVxdWFudF9tcGVnKGludDMyIHFfdmFsdWUsIGludDMyIHN0ZXBzaXplLCBpbnQzMiBRUCwgaW50MzIgdG1wKQoreworICAgIC8qIHRtcCBtdXN0IGhhdmUgdmFsdWUgb2YgMjA0NyAqLworICAgIGludDMyIGNvZWZmOworICAgIF9fYXNtCisgICAgeworICAgICAgICBtb3ZzICAgIGNvZWZmLCBxX3ZhbHVlLCBsc2wgIzEKKyAgICAgICAgbXVsICBzdGVwc2l6ZSwgc3RlcHNpemUsIFFQCisgICAgICAgIGFkZGd0ICAgY29lZmYsIGNvZWZmLCAjMQorICAgICAgICBzdWJsdCAgIGNvZWZmLCBjb2VmZiwgIzEKKyAgICAgICAgbXVsIHFfdmFsdWUsIGNvZWZmLCBzdGVwc2l6ZQorICAgICAgICBhZGRsdCAgIHFfdmFsdWUsIHFfdmFsdWUsICMxNQorICAgICAgICBtb3YgICAgIHFfdmFsdWUsIHFfdmFsdWUsIGFzciAjNAorICAgICAgICBhZGQgICAgIGNvZWZmLCBxX3ZhbHVlLCB0bXAKKyAgICAgICAgc3VicyAgICBjb2VmZiwgY29lZmYsICMweGYwMAorICAgICAgICBzdWJjc3MgIGNvZWZmLCBjb2VmZiwgIzB4ZmUKKyAgICAgICAgZW9yaGkgICBxX3ZhbHVlLCB0bXAsIHFfdmFsdWUsIGFzciAjMzEKKyAgICB9CisKKyAgICByZXR1cm4gcV92YWx1ZTsKK30KKworCisjZW5kaWYKKworX19pbmxpbmUgaW50MzIgIGNvZWZmX2NsaXAoaW50MzIgcV92YWx1ZSwgaW50MzIgYWNfY2xpcCkKK3sKKyAgICBpbnQzMiBjb2VmZjsKKworICAgIF9fYXNtCisgICAgeworICAgICAgICBhZGQgICAgIGNvZWZmLCBxX3ZhbHVlLCBhY19jbGlwCisgICAgICAgIHN1YnMgICAgY29lZmYsIGNvZWZmLCBhY19jbGlwLCBsc2wgIzEKKyAgICAgICAgZW9yaGkgICBxX3ZhbHVlLCBhY19jbGlwLCBxX3ZhbHVlLCBhc3IgIzMxCisgICAgfQorCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGFhbl9kY19zY2FsZShpbnQzMiBjb2VmZiwgaW50MzIgUVApCit7CisKKyAgICBfX2FzbQorICAgIHsKKyAgICAgICAgY21wICAgY29lZmYsICMwCisgICAgICAgIGFkZGxlICAgY29lZmYsIGNvZWZmLCBRUCwgYXNyICMxCisgICAgICAgIHN1Ymd0ICAgY29lZmYsIGNvZWZmLCBRUCwgYXNyICMxCisgICAgfQorCisgICAgcmV0dXJuIGNvZWZmOworfQorCitfX2lubGluZSBpbnQzMiBjbGlwXzIwNDcoaW50MzIgcV92YWx1ZSwgaW50MzIgdG1wKQoreworICAgIC8qIHRtcCBtdXN0IGhhdmUgdmFsdWUgb2YgMjA0NyAqLworICAgIGludDMyIGNvZWZmOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIGFkZCAgICAgY29lZmYsIHFfdmFsdWUsIHRtcAorICAgICAgICBzdWJzICAgIGNvZWZmLCBjb2VmZiwgIzB4ZjAwCisgICAgICAgIHN1YmNzcyAgY29lZmYsIGNvZWZmLCAjMHhmZQorICAgICAgICBlb3JoaSAgIHFfdmFsdWUsIHRtcCwgcV92YWx1ZSwgYXNyICMzMQorICAgIH0KKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50X21wZWdfaW50cmEoaW50MzIgcV92YWx1ZSwgaW50MzIgdG1wKQoreworICAgIGludDMyIGNvZWZmOworCisgICAgX19hc20KKyAgICB7CisgICAgICAgIG1vdnMgICAgcV92YWx1ZSwgcV92YWx1ZSwgbHNsICMxCisgICAgICAgIGFkZGx0ICAgcV92YWx1ZSwgcV92YWx1ZSwgIzE1CisgICAgICAgIG1vdiAgICAgcV92YWx1ZSwgcV92YWx1ZSwgYXNyICM0CisgICAgICAgIGFkZCAgICAgY29lZmYsIHFfdmFsdWUsIHRtcAorICAgICAgICBzdWJzICAgIGNvZWZmLCBjb2VmZiwgIzB4ZjAwCisgICAgICAgIHN1YmNzcyAgY29lZmYsIGNvZWZmLCAjMHhmZQorICAgICAgICBlb3JoaSAgIHFfdmFsdWUsIHRtcCwgcV92YWx1ZSwgYXNyICMzMQorICAgIH0KKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCisjZWxpZiAoIGRlZmluZWQoUFZfQVJNX0dDQ19WNCkgfHwgZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSApIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKK19faW5saW5lIGludDMyIGFhbl9zY2FsZShpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiByb3VuZCwgaW50MzIgUVBkaXYyKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiBxdiA9IHFfdmFsdWU7CisgICAgcmVnaXN0ZXIgaW50MzIgY2YgPSBjb2VmZjsKKyAgICByZWdpc3RlciBpbnQzMiByciA9IHJvdW5kOworICAgIHJlZ2lzdGVyIGludDMyIHFwID0gUVBkaXYyOworCisgICAgYXNtIHZvbGF0aWxlKCJzbWxhYmIgJTAsICUyLCAlMSwgJTNcblx0IgorICAgICAgICAgICAgICAgICAibW92cyAlMCwgJTAsIGFzciAjMTZcblx0IgorICAgICAgICAgICAgICAgICAiYWRkbGUgJTAsICUwLCAlNFxuXHQiCisgICAgICAgICAgICAgICAgICJzdWJndCAlMCwgJTAsICU0IgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHF2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoY2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihyciksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHFwKSk7CisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgY29lZmZfcXVhbnQoaW50MzIgY29lZmYsIGludDMyIHFfc2NhbGUsIGludDMyIHNoaWZ0KQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IGNvZWZmOworICAgIHJlZ2lzdGVyIGludDMyIHFzID0gcV9zY2FsZTsKKyAgICByZWdpc3RlciBpbnQzMiBzcyA9IHNoaWZ0OworCisgICAgYXNtIHZvbGF0aWxlKCJzbXVsYmIgJTAsICUzLCAlMlxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgJTEsICUwLCBhc3IgJTRcblx0IgorICAgICAgICAgICAgICAgICAiYWRkICUwLCAlMSwgJTEsIGxzciAjMzEiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihjYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHFzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoc3MpKTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2NsaXAoaW50MzIgcV92YWx1ZSwgaW50MzIgYWNfY2xpcCkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBjb2VmZjsKKworICAgIGFzbSB2b2xhdGlsZSgiYWRkICAgJTEsICUwLCAlMlxuXHQiCisgICAgICAgICAgICAgICAgICJzdWJzICAlMSwgJTEsICUyLCBsc2wgIzFcblx0IgorICAgICAgICAgICAgICAgICAiZW9yaGkgJTAsICUyLCAlMCwgYXNyICMzMSIKKyAgICAgICAgICAgICA6ICIrciIocV92YWx1ZSksCisgICAgICAgICAgICAgICAgICI9JnIiKGNvZWZmKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFjX2NsaXApKTsKKworICAgIHJldHVybiBxX3ZhbHVlOworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50KGludDMyIHFfdmFsdWUsIGludDMyIFFQeDIsIGludDMyIEFkZGl0aW9uLCBpbnQzMiB0bXApCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIHRlbXAxOworICAgIHJlZ2lzdGVyIGludDMyIHF2ID0gcV92YWx1ZTsKKyAgICByZWdpc3RlciBpbnQzMiBxcCA9IFFQeDI7CisgICAgcmVnaXN0ZXIgaW50MzIgYWEgPSBBZGRpdGlvbjsKKyAgICByZWdpc3RlciBpbnQzMiB0dCA9IHRtcDsKKworICAgIGFzbSB2b2xhdGlsZSgiY21wICAgICUyLCAjMFxuXHQiCisgICAgICAgICAgICAgICAgICJtdWwgICAgJTAsICUyLCAlM1xuXHQiCisgICAgICAgICAgICAgICAgICJzdWJsdCAgJTAsICUwLCAlNFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGRnZSAgJTAsICUwLCAlNFxuXHQiCisgICAgICAgICAgICAgICAgICJhZGQgICAgJTEsICUwLCAlNVxuXHQiCisgICAgICAgICAgICAgICAgICJzdWJzICAgJTEsICUxLCAjMzg0MFxuXHQiCisgICAgICAgICAgICAgICAgICJzdWJjc3MgJTEsICUxLCAjMjU0XG5cdCIKKyAgICAgICAgICAgICAgICAgImVvcmhpICAlMCwgJTUsICUwLCBhc3IgIzMxIgorICAgICAgICAgICAgIDogIj0mciIob3V0KSwKKyAgICAgICAgICAgICAgICAgIj0mciIodGVtcDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIocXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIihxcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIodHQpKTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKK19faW5saW5lIGludDMyIHNtbGFiYihpbnQzMiBxX3ZhbHVlLCBpbnQzMiBjb2VmZiwgaW50MzIgcm91bmQpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGFhID0gKGludDMyKXFfdmFsdWU7CisgICAgcmVnaXN0ZXIgaW50MzIgYmIgPSAoaW50MzIpY29lZmY7CisgICAgcmVnaXN0ZXIgaW50MzIgY2MgPSAoaW50MzIpcm91bmQ7CisKKyAgICBhc20gdm9sYXRpbGUoInNtbGFiYiAlMCwgJTEsICUyLCAlMyIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihhYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKGJiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoY2MpKTsKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBzbXVsYmIoaW50MzIgcV9zY2FsZSwgaW50MzIgY29lZmYpCit7CisgICAgcmVnaXN0ZXIgaW50MzIgb3V0OworICAgIHJlZ2lzdGVyIGludDMyIGFhID0gKGludDMyKXFfc2NhbGU7CisgICAgcmVnaXN0ZXIgaW50MzIgYmIgPSAoaW50MzIpY29lZmY7CisKKyAgICBhc20gdm9sYXRpbGUoInNtdWxiYiAlMCwgJTEsICUyIgorICAgICAgICAgICAgIDogIj0mciIob3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGFhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIoYmIpKTsKKyAgICByZXR1cm4gb3V0OworfQorCitfX2lubGluZSBpbnQzMiBhYW5fZGNfc2NhbGUoaW50MzIgY29lZmYsIGludDMyIFFQKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiBjYyA9IGNvZWZmOworICAgIHJlZ2lzdGVyIGludDMyIHFwID0gUVA7CisKKyAgICBhc20gdm9sYXRpbGUoImNtcCAlMSwgIzBcblx0IgorICAgICAgICAgICAgICAgICAiYWRkbGUgJTAsICUxLCAlMiwgYXNyICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1Ymd0ICUwLCAlMSwgJTIsIGFzciAjMSIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihjYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHFwKSk7CisgICAgcmV0dXJuIG91dDsKK30KKworX19pbmxpbmUgaW50MzIgY2xpcF8yMDQ3KGludDMyIHFfdmFsdWUsIGludDMyIHRtcCkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBjb2VmZjsKKyAgICBhc20gdm9sYXRpbGUoImFkZCAgICAlMSwgJTAsICUyXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YnMgICAlMSwgJTEsICMweEYwMFxuXHQiCisgICAgICAgICAgICAgICAgICJzdWJjc3MgJTEsICUxLCAjMHhGRVxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JoaSAgJTAsICUyLCAlMCwgYXNyICMzMSIKKyAgICAgICAgICAgICA6ICIrciIocV92YWx1ZSksCisgICAgICAgICAgICAgICAgICI9JnIiKGNvZWZmKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHRtcCkpOworCisgICAgcmV0dXJuIHFfdmFsdWU7Cit9CisKK19faW5saW5lIGludDMyIGNvZWZmX2RlcXVhbnRfbXBlZyhpbnQzMiBxX3ZhbHVlLCBpbnQzMiBzdGVwc2l6ZSwgaW50MzIgUVAsIGludDMyIHRtcCkKK3sKKyAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgcmVnaXN0ZXIgaW50MzIgcXYgPSBxX3ZhbHVlOworICAgIHJlZ2lzdGVyIGludDMyIHNzID0gc3RlcHNpemU7CisgICAgcmVnaXN0ZXIgaW50MzIgcXAgPSBRUDsKKyAgICByZWdpc3RlciBpbnQzMiB0dCA9IHRtcDsKKworICAgIGFzbSB2b2xhdGlsZSgibW92cyAgICAlMSwgJTIsIGxzbCAjMVxuXHQiCisgICAgICAgICAgICAgICAgICJtdWwgICAgICUwLCAlMywgJTRcblx0IgorICAgICAgICAgICAgICAgICAiYWRkZ3QgICAlMSwgJTEsICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1Ymx0ICAgJTEsICUxLCAjMVxuXHQiCisgICAgICAgICAgICAgICAgICJtdWwgICAgICUwLCAlMSwgJTBcblx0IgorICAgICAgICAgICAgICAgICAiYWRkbHQgICAlMCwgJTAsICMxNVxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgICAgICUwLCAlMCwgYXNyICM0XG5cdCIKKyAgICAgICAgICAgICAgICAgImFkZCAgICAgJTEsICUwLCAlNVxuXHQiCisgICAgICAgICAgICAgICAgICJzdWJzICAgICUxLCAlMSwgIzB4RjAwXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YmNzcyAgJTEsICUxLCAjMHhGRVxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JoaSAgICUwLCAlNSwgJTAsIGFzciAjMzEiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihxdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiciIocXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyIih0dCkpOworCisgICAgcmV0dXJuIG91dDsKKworfQorCitfX2lubGluZSBpbnQzMiBjb2VmZl9kZXF1YW50X21wZWdfaW50cmEoaW50MzIgcV92YWx1ZSwgaW50MzIgdG1wKQoreworICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICByZWdpc3RlciBpbnQzMiB0ZW1wMTsKKyAgICByZWdpc3RlciBpbnQzMiBxdiA9IHFfdmFsdWU7CisgICAgcmVnaXN0ZXIgaW50MzIgdHQgPSB0bXA7CisKKyAgICBhc20gdm9sYXRpbGUoIm1vdnMgICAgJTEsICUyLCBsc2wgIzFcblx0IgorICAgICAgICAgICAgICAgICAiYWRkbHQgICAlMSwgJTEsICMxNVxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgICAgICUwLCAlMSwgYXNyICM0XG5cdCIKKyAgICAgICAgICAgICAgICAgImFkZCAgICAgJTEsICUwLCAlM1xuXHQiCisgICAgICAgICAgICAgICAgICJzdWJzICAgICUxLCAlMSwgIzB4RjAwXG5cdCIKKyAgICAgICAgICAgICAgICAgInN1YmNzcyAgJTEsICUxLCAjMHhGRVxuXHQiCisgICAgICAgICAgICAgICAgICJlb3JoaSAgICUwLCAlMywgJTAsIGFzciAjMzEiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihxdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHR0KSk7CisgICAgcmV0dXJuIG91dDsKK30KKworCisjZW5kaWYgLy8gUGxhdGZvcm0KKworCisjZW5kaWYgLy9fRkFTVFFVQU5UX0lOTElORV9IXworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTljNzZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCkBAIC0wLDAgKzEsMjg3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAibTR2ZW5jX29zY2wuaCIKKworLyogMy8yOS8wMSBmYXN0IGhhbGYtcGVsIHNlYXJjaCBiYXNlZCBvbiBuZWlnaGJvcmluZyBndWVzcyAqLworLyogdmFsdWUgcmFuZ2luZyBmcm9tIDAgdG8gNCwgaGlnaCBjb21wbGV4aXR5IChtb3JlIGFjY3VyYXRlKSB0bworICAgbG93IGNvbXBsZXhpdHkgKGxlc3MgYWNjdXJhdGUpICovCisjZGVmaW5lIEhQX0RJU1RBTkNFX1RIICAgICAgMiAgLyogaGFsZi1wZWwgZGlzdGFuY2UgdGhyZXNob2xkICovCisKKyNkZWZpbmUgUFJFRl8xNl9WRUMgMTI5ICAgICAvKiAxTVYgYmlhcyB2ZXJzdXMgNE1WcyovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgdm9pZCBHZW5lcmF0ZVNlYXJjaFJlZ2lvbihVQ2hhciAqc2VhcmNoUGFkZGluZywgVUNoYXIgKnJlZiwgSW50IHdpZHRoLCBJbnQgaGVpZ2h0LAorICAgIEludCBpbG93LCBJbnQgaWhpZ2gsIEludCBqbG93LCBJbnQgamhpZ2gpOworCisgICAgdm9pZCBJbnRlcnBEaWFnKFVDaGFyICpwcmV2LCBJbnQgbHgsIFVDaGFyICpwcmVkX2Jsb2NrKTsKKyAgICB2b2lkIEludGVycEhvcnooVUNoYXIgKnByZXYsIEludCBseCwgVUNoYXIgKnByZWRfYmxvY2spOworICAgIHZvaWQgSW50ZXJwVmVydChVQ2hhciAqcHJldiwgSW50IGx4LCBVQ2hhciAqcHJlZF9ibG9jayk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKK2NvbnN0IHN0YXRpYyBJbnQgZGlzdGFuY2VfdGFiWzldWzldID0gICAvKiBbaHBfZ3Vlc3NdW2tdICovCit7CisgICAgezAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorICAgIHsxLCAwLCAxLCAyLCAzLCA0LCAzLCAyLCAxfSwKKyAgICB7MSwgMCwgMCwgMCwgMSwgMiwgMywgMiwgMX0sCisgICAgezEsIDIsIDEsIDAsIDEsIDIsIDMsIDQsIDN9LAorICAgIHsxLCAyLCAxLCAwLCAwLCAwLCAxLCAyLCAzfSwKKyAgICB7MSwgNCwgMywgMiwgMSwgMCwgMSwgMiwgM30sCisgICAgezEsIDIsIDMsIDIsIDEsIDAsIDAsIDAsIDF9LAorICAgIHsxLCAyLCAzLCA0LCAzLCAyLCAxLCAwLCAxfSwKKyAgICB7MSwgMCwgMSwgMiwgMywgMiwgMSwgMCwgMH0KK307CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBGaW5kSGFsZlBlbE1CCisgICAgRGF0ZTogICAgICAgMTAvNy8yMDAwCisgICAgUHVycG9zZTogICAgRmluZCBoYWxmIHBlbCByZXNvbHV0aW9uIE1WIHN1cnJvdW5kaW5nIHRoZSBmdWxsLXBlbCBNVgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBGaW5kSGFsZlBlbE1CKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyICpjdXIsIE1PVCAqbW90LCBVQ2hhciAqbmNhbmQsCisgICAgICAgICAgICAgICAgICAgSW50IHhwb3MsIEludCB5cG9zLCBJbnQgKnhobWluLCBJbnQgKnlobWluLCBJbnQgaHBfZ3Vlc3MpCit7CisvLyAgaHBfbWVtID0gVUxvbmcgKnZlcnRBcnJheTsgLyogMjB4MTcgKi8KKy8vICAgICAgICAgICBVTG9uZyAqaG9yekFycmF5OyAvKiAyMHgxNiAqLworLy8gICAgICAgICAgIFVMb25nICpkaWFnQXJyYXk7IC8qIDIweDE3ICovCisgICAgSW50IGRtaW4sIGQ7CisKKyAgICBJbnQgeGgsIHloOworICAgIEludCBrLCBrbWluID0gMDsKKyAgICBJbnQgaW1pbiwgam1pbiwgaWxvdywgamxvdzsKKyAgICBJbnQgaDI2M19tb2RlID0gdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkOyAvKiAgMy8yOS8wMSAqLworICAgIEludCBpbl9yYW5nZVs5XSA9IHswLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfTsgLyogIDMvMjkvMDEgKi8KKyAgICBJbnQgcmFuZ2UgPSB2aWRlby0+ZW5jUGFyYW1zLT5TZWFyY2hSYW5nZTsKKyAgICBJbnQgbHggPSB2aWRlby0+Y3VyclZvcC0+cGl0Y2g7CisgICAgSW50IHdpZHRoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvKiAgcGFkZGluZyAqLworICAgIEludCBoZWlnaHQgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5oZWlnaHQ7CisgICAgSW50KCoqU0FEX01CX0hhbGZQZWwpKFVDaGFyKiwgVUNoYXIqLCBJbnQsIHZvaWQqKSA9CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsOworICAgIHZvaWQgKmV4dHJhX2luZm8gPSB2aWRlby0+c2FkX2V4dHJhX2luZm87CisKKyAgICBJbnQgbmV4dF9ocF9wb3NbOV1bMl0gPSB7ezAsIDB9LCB7MiwgMH0sIHsxLCAxfSwgezAsIDJ9LCB7IC0xLCAxfSwgeyAtMiwgMH0sIHsgLTEsIC0xfSwgezAsIC0yfSwgezAsIC0xfX07CisgICAgSW50IG5leHRfbmNhbmRbOV0gPSB7MCwgMSAsIGx4LCBseCwgMCwgLTEsIC0xLCAtbHgsIC1seH07CisKKyAgICBjdXIgPSB2aWRlby0+Y3VycllNQjsKKworICAgIC8qKioqKioqKioqKioqKioqIGNoZWNrIHJhbmdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgMy8yOS8wMSAqLworICAgIGltaW4gPSB4cG9zICsgKG1vdFswXS54ID4+IDEpOworICAgIGptaW4gPSB5cG9zICsgKG1vdFswXS55ID4+IDEpOworICAgIGlsb3cgPSB4cG9zIC0gcmFuZ2U7CisgICAgamxvdyA9IHlwb3MgLSByYW5nZTsKKworICAgIGlmICghaDI2M19tb2RlKQorICAgIHsKKyAgICAgICAgaWYgKGltaW4gPD0gLTE1IHx8IGltaW4gPT0gaWxvdykKKyAgICAgICAgICAgIGluX3JhbmdlWzFdID0gaW5fcmFuZ2VbN10gPSBpbl9yYW5nZVs4XSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGltaW4gPj0gd2lkdGggLSAxKQorICAgICAgICAgICAgaW5fcmFuZ2VbM10gPSBpbl9yYW5nZVs0XSA9IGluX3JhbmdlWzVdID0gMDsKKyAgICAgICAgaWYgKGptaW4gPD0gLTE1IHx8IGptaW4gPT0gamxvdykKKyAgICAgICAgICAgIGluX3JhbmdlWzFdID0gaW5fcmFuZ2VbMl0gPSBpbl9yYW5nZVszXSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGptaW4gPj0gaGVpZ2h0IC0gMSkKKyAgICAgICAgICAgIGluX3JhbmdlWzVdID0gaW5fcmFuZ2VbNl0gPSBpbl9yYW5nZVs3XSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChpbWluIDw9IDAgfHwgaW1pbiA9PSBpbG93KQorICAgICAgICAgICAgaW5fcmFuZ2VbMV0gPSBpbl9yYW5nZVs3XSA9IGluX3JhbmdlWzhdID0gMDsKKyAgICAgICAgZWxzZSBpZiAoaW1pbiA+PSB3aWR0aCAtIDE2KQorICAgICAgICAgICAgaW5fcmFuZ2VbM10gPSBpbl9yYW5nZVs0XSA9IGluX3JhbmdlWzVdID0gMDsKKyAgICAgICAgaWYgKGptaW4gPD0gMCB8fCBqbWluID09IGpsb3cpCisgICAgICAgICAgICBpbl9yYW5nZVsxXSA9IGluX3JhbmdlWzJdID0gaW5fcmFuZ2VbM10gPSAwOworICAgICAgICBlbHNlIGlmIChqbWluID49IGhlaWdodCAtIDE2KQorICAgICAgICAgICAgaW5fcmFuZ2VbNV0gPSBpbl9yYW5nZVs2XSA9IGluX3JhbmdlWzddID0gMDsKKyAgICB9CisKKyAgICB4aG1pblswXSA9IDA7CisgICAgeWhtaW5bMF0gPSAwOworICAgIGRtaW4gPSBtb3RbMF0uc2FkOworCisgICAgeGggPSAwOworICAgIHloID0gLTE7CisgICAgbmNhbmQgLT0gbHg7IC8qIGluaXRpYWwgcG9zaXRpb24gKi8KKworICAgIGZvciAoayA9IDI7IGsgPD0gODsgayArPSAyKQorICAgIHsKKyAgICAgICAgaWYgKGRpc3RhbmNlX3RhYltocF9ndWVzc11ba10gPCBIUF9ESVNUQU5DRV9USCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluX3JhbmdlW2tdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSAoKihTQURfTUJfSGFsZlBlbFsoKHloJjEpPDwxKSsoeGgmMSldKSkobmNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworCisgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgIHhobWluWzBdID0geGg7CisgICAgICAgICAgICAgICAgICAgIHlobWluWzBdID0geWg7CisgICAgICAgICAgICAgICAgICAgIGttaW4gPSBrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChkID09IGRtaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBQVl9BQlMobW90WzBdLnggKyB4aCkgKyBQVl9BQlMobW90WzBdLnkgKyB5aCkgPCBQVl9BQlMobW90WzBdLnggKyB4aG1pblswXSkgKyBQVl9BQlMobW90WzBdLnkgKyB5aG1pblswXSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB4aG1pblswXSA9IHhoOworICAgICAgICAgICAgICAgICAgICB5aG1pblswXSA9IHloOworICAgICAgICAgICAgICAgICAgICBrbWluID0gazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB4aCArPSBuZXh0X2hwX3Bvc1trXVswXTsKKyAgICAgICAgeWggKz0gbmV4dF9ocF9wb3Nba11bMV07CisgICAgICAgIG5jYW5kICs9IG5leHRfbmNhbmRba107CisKKyAgICAgICAgaWYgKGsgPT0gOCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHhobWluWzBdICE9IDAgfHwgeWhtaW5bMF0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrID0gLTE7CisgICAgICAgICAgICAgICAgaHBfZ3Vlc3MgPSBrbWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbW90WzBdLnNhZCA9IGRtaW47CisgICAgbW90WzBdLnggKz0geGhtaW5bMF07CisgICAgbW90WzBdLnkgKz0geWhtaW5bMF07CisKKyAgICByZXR1cm4gOworfQorCisjaWZuZGVmIE5PX0lOVEVSNFYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgRmluZEhhbGZQZWxCbGsKKyAgICBEYXRlOiAgICAgICAxMC83LzIwMDAKKyAgICBQdXJwb3NlOiAgICBGaW5kIGhhbGYgcGVsIHJlc29sdXRpb24gTVYgc3Vycm91bmRpbmcgdGhlIGZ1bGwtcGVsIE1WCisgICAgICAgICAgICAgICAgQW5kIGRlY2lkZSBiZXR3ZWVuIDFNViBvciA0TVYgbW9kZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8vLy8vIFRISVMgRlVOQ1RJT04gSVMgTk9UIFdPUktJTkchISEgTkVFRCBUTyBCRSBSSVZJU0lURUQKKworSW50IEZpbmRIYWxmUGVsQmxrKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyICpjdXIsIE1PVCAqbW90LCBJbnQgc2FkMTYsIFVDaGFyICpuY2FuZDhbXSwKKyAgICAgICAgICAgICAgICAgICBVQ2hhciAqbW9kZSwgSW50IHhwb3MsIEludCB5cG9zLCBJbnQgKnhobWluLCBJbnQgKnlobWluLCBVQ2hhciAqaHBfbWVtKQoreworICAgIEludCBrLCBjb21wOworICAgIEludCB4aCwgeWg7Ly8sIHhobWluLCB5aG1pbjsKKyAgICBJbnQgaW1pbiwgam1pbiwgaWxvdywgamxvdzsKKyAgICBJbnQgaGVpZ2h0OworICAgIFVDaGFyICpjYW5kLCAqY3VyODsKKyAgICBVQ2hhciAqaG1lbTsvL1sxNyoxN107IC8qIGhhbGYtcGVsIG1lbW9yeSAqLworICAgIEludCBkLCBkbWluLCBzYWQ4OworICAgIEludCBseCA9IHZpZGVvLT5jdXJyVm9wLT5waXRjaDsKKyAgICBJbnQgd2lkdGggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGg7IC8qICwgcGFkZGluZyAqLworICAgIEludCgqU0FEX0Jsa19IYWxmUGVsKShVQ2hhciosIFVDaGFyKiwgSW50LCBJbnQsIEludCwgSW50LCBJbnQsIHZvaWQqKSA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbGtfSGFsZlBlbDsKKyAgICB2b2lkICpleHRyYV9pbmZvID0gdmlkZW8tPnNhZF9leHRyYV9pbmZvOworICAgIEludCBpbl9yYW5nZVs4XTsgLyogIDMvMjkvMDEgKi8KKyAgICBJbnQgcmFuZ2UgPSB2aWRlby0+ZW5jUGFyYW1zLT5TZWFyY2hSYW5nZTsKKyAgICBJbnQgc3dpZHRoOworICAgIEludCBuZXh0X2hwX3Bvc1s4XVsyXSA9IHt7MSwgMH0sIHsxLCAwfSwgezAsIDF9LCB7MCwgMX0sIHsgLTEsIDB9LCB7IC0xLCAwfSwgezAsIC0xfSwgezAsIC0xfX07CisKKyAgICBoZWlnaHQgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5oZWlnaHQ7CisKKyAgICBobWVtID0gaHBfbWVtOworICAgIHNhZDggPSAwOworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyBjb21wKyspCisgICAgeworI2lmZGVmIF9TQURfU1RBVAorICAgICAgICBudW1fSFBfQmxrKys7CisjZW5kaWYKKyAgICAgICAgLyoqKioqKioqKioqKioqKiogY2hlY2sgcmFuZ2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgMy8yOS8wMSAqLworICAgICAgICBNNFZFTkNfTUVNU0VUKGluX3JhbmdlLCAxLCBzaXplb2YoSW50KSA8PCAzKTsKKyAgICAgICAgaW1pbiA9IHhwb3MgKyAoKGNvbXAgJiAxKSA8PCAzKSArIChtb3RbY29tcCsxXS54ID4+IDEpOworICAgICAgICBqbWluID0geXBvcyArICgoY29tcCAmIDIpIDw8IDIpICsgKG1vdFtjb21wKzFdLnkgPj4gMSk7CisgICAgICAgIGlsb3cgPSB4cG9zICsgKChjb21wICYgMSkgPDwgMykgLSByYW5nZTsKKyAgICAgICAgamxvdyA9IHlwb3MgKyAoKGNvbXAgJiAyKSA8PCAyKSAtIHJhbmdlOworCisgICAgICAgIGlmIChpbWluIDw9IC0xNSB8fCBpbWluID09IGlsb3cpCisgICAgICAgICAgICBpbl9yYW5nZVswXSA9IGluX3JhbmdlWzZdID0gaW5fcmFuZ2VbN10gPSAwOworICAgICAgICBlbHNlIGlmIChpbWluID49IHdpZHRoIC0gMSkKKyAgICAgICAgICAgIGluX3JhbmdlWzJdID0gaW5fcmFuZ2VbM10gPSBpbl9yYW5nZVs0XSA9IDA7CisKKyAgICAgICAgaWYgKGptaW4gPD0gLTE1IHx8IGptaW4gPT0gamxvdykKKyAgICAgICAgICAgIGluX3JhbmdlWzBdID0gaW5fcmFuZ2VbMV0gPSBpbl9yYW5nZVsyXSA9IDA7CisgICAgICAgIGVsc2UgaWYgKGptaW4gPj0gaGVpZ2h0IC0gMSkKKyAgICAgICAgICAgIGluX3JhbmdlWzRdID0gaW5fcmFuZ2VbNV0gPSBpbl9yYW5nZVs2XSA9IDA7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiogaGFsZi1wZWwgc2VhcmNoICoqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjdXI4ID0gY3VyICsgKChjb21wICYgMSkgPDwgMykgKyAoKGNvbXAgJiAyKSA8PCAyKSAqIHdpZHRoIDsKKworICAgICAgICAvKiBnZW5lcmF0ZSBoYWxmLXBlbCBzZWFyY2ggcmVnaW9uICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbmQgPSBuY2FuZDhbY29tcCsxXTsKKyAgICAgICAgICAgIHN3aWR0aCA9IGx4OworICAgICAgICB9CisKKyAgICAgICAgeGhtaW5bY29tcCsxXSA9IDA7CisgICAgICAgIHlobWluW2NvbXArMV0gPSAwOworICAgICAgICBkbWluID0gbW90W2NvbXArMV0uc2FkOworCisgICAgICAgIHhoID0gLTE7CisgICAgICAgIHloID0gLTE7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbl9yYW5nZVtrXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gKCpTQURfQmxrX0hhbGZQZWwpKGNhbmQsIGN1cjgsIGRtaW4sIGx4LCBzd2lkdGgsIHhoLCB5aCwgZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgeGhtaW5bY29tcCsxXSA9IHhoOworICAgICAgICAgICAgICAgICAgICB5aG1pbltjb21wKzFdID0geWg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgeGggKz0gbmV4dF9ocF9wb3Nba11bMF07CisgICAgICAgICAgICB5aCArPSBuZXh0X2hwX3Bvc1trXVsxXTsKKyAgICAgICAgfQorICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIG1vdFtjb21wKzFdLnggKz0geGhtaW5bY29tcCsxXTsKKyAgICAgICAgbW90W2NvbXArMV0ueSArPSB5aG1pbltjb21wKzFdOworICAgICAgICBtb3RbY29tcCsxXS5zYWQgPSBkbWluOworICAgICAgICBzYWQ4ICs9IGRtaW47CisKKyAgICAgICAgaWYgKHNhZDggPj0gc2FkMTYgLSBQUkVGXzE2X1ZFQykKKyAgICAgICAgeworICAgICAgICAgICAgKm1vZGUgPSBNT0RFX0lOVEVSOworICAgICAgICAgICAgZm9yIChrID0gMTsgayA8PSA0OyBrKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW90W2tdLnNhZCA9IChtb3RbMF0uc2FkICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICBtb3Rba10ueCA9IG1vdFswXS54OworICAgICAgICAgICAgICAgIG1vdFtrXS55ID0gbW90WzBdLnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2FkODsKKyAgICAgICAgfQorCisgICAgICAgIGhtZW0gKz0gKDEwICogMTApOworICAgIH0KKworICAgICptb2RlID0gTU9ERV9JTlRFUjRWOworCisgICAgcmV0dXJuIHNhZDg7Cit9CisjZW5kaWYgLyogTk9fSU5URVI0ViAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tNHZlbmNfb3NjbC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbTR2ZW5jX29zY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWUxOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbTR2ZW5jX29zY2wuaApAQCAtMCwwICsxLDQzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFJldmlzaW9uIEhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERhdGU6IDExLzA0LzA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERlc2NyaXB0aW9uOiBDcmVhdGVkIGZvciBhYnN0cmFjdGluZyBvdXQgT1NDTCBzdWNoIHRoYXQgdGhlIGNvZGUgY2FuIGJlIHVzZWQgKi8KKy8qICAgICAgICAgIGJ5IGJvdGggVjMgYW5kIFY0IE9TQ0wgbGlicmFyeS4gVGhpcyBmaWxlIGlzIGZvciBWNC4gICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX000VkVOQ19PU0NMX0hfCisjZGVmaW5lIF9NNFZFTkNfT1NDTF9IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIE00VkVOQ19NQUxMT0Moc2l6ZSkgICAgICAgICAgICAgbWFsbG9jKHNpemUpCisjZGVmaW5lIE00VkVOQ19GUkVFKHB0cikgICAgICAgICAgICAgICAgZnJlZShwdHIpCisKKyNkZWZpbmUgTTRWRU5DX01FTVNFVChwdHIsdmFsLHNpemUpICAgICBtZW1zZXQocHRyLHZhbCxzaXplKQorI2RlZmluZSBNNFZFTkNfTUVNQ1BZKGRzdCxzcmMsc2l6ZSkgICAgIG1lbWNweShkc3Qsc3JjLHNpemUpCisKKyNkZWZpbmUgTTRWRU5DX0xPRyh4KSAgICAgICAgICAgICAgICAgICBsb2coeCkKKyNkZWZpbmUgTTRWRU5DX1NRUlQoeCkgICAgICAgICAgICAgICAgICBzcXJ0KHgpCisjZGVmaW5lIE00VkVOQ19QT1coeCx5KSAgICAgICAgICAgICAgICAgcG93KHgseSkKKworI2RlZmluZSBNNFZFTkNfSEFTX1NZTUJJQU5fU1VQUE9SVCAgT1NDTF9IQVNfU1lNQklBTl9TVVBQT1JUCisKKyNlbmRpZiAvL19NNFZFTkNfT1NDTF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbWVfdXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbWVfdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWIzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAKQEAgLTAsMCArMSwzODYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCisjZGVmaW5lIFZPUF9PRkZTRVQgICgobHg8PDQpKzE2KSAgLyogZm9yIG9mZnNldCB0byBpbWFnZSBhcmVhICovCisjZGVmaW5lIENWT1BfT0ZGU0VUICgobHg8PDIpKzgpCisKKyNkZWZpbmUgUFJFRl9JTlRSQSAgNTEyICAgICAvKiBiaWFzIGZvciBJTlRSQSBjb2RpbmcgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBDaG9vc2VNb2RlCisgICAgRGF0ZTogICAgICAgMDkvMjEvMjAwMAorICAgIFB1cnBvc2U6ICAgIENob29zaW5nIGJldHdlZW4gSU5UUkEgb3IgSU5URVIKKyAgICBJbnB1dC9PdXRwdXQ6IFBvaW50ZXIgdG8gdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSBtYWNyb2Jsb2NrLgorICAgIE5vdGU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDaG9vc2VNb2RlX0MoVUNoYXIgKk1vZGUsIFVDaGFyICpjdXIsIEludCBseCwgSW50IG1pbl9TQUQpCit7CisgICAgSW50IGksIGo7CisgICAgSW50IE1CX21lYW4sIEEsIHRtcCwgVGg7CisgICAgSW50IG9mZnNldCA9IChseCA+PiAyKSAtIDQ7CisgICAgVUNoYXIgKnAgPSBjdXI7CisgICAgSW50ICpwaW50ID0gKEludCAqKSBjdXIsIHRlbXAgPSAwOworICAgIE1CX21lYW4gPSAwOworICAgIEEgPSAwOworICAgIFRoID0gKG1pbl9TQUQgLSBQUkVGX0lOVFJBKSA+PiAxOworCisgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICB7CisKKyAgICAgICAgLyogT2RkIFJvd3MgKi8KKyAgICAgICAgdGVtcCArPSAoKnBpbnQrKykgJiAweDAwRkYwMEZGOworICAgICAgICB0ZW1wICs9ICgqcGludCsrKSAmIDB4MDBGRjAwRkY7CisgICAgICAgIHRlbXAgKz0gKCpwaW50KyspICYgMHgwMEZGMDBGRjsKKyAgICAgICAgdGVtcCArPSAoKnBpbnQrKykgJiAweDAwRkYwMEZGOworICAgICAgICBwaW50ICs9IG9mZnNldDsKKworICAgICAgICAvKiBFdmVuIFJvd3MgKi8KKyAgICAgICAgdGVtcCArPSAoKnBpbnQrKyA+PiA4KSAmIDB4MDBGRjAwRkY7CisgICAgICAgIHRlbXAgKz0gKCpwaW50KysgPj4gOCkgJiAweDAwRkYwMEZGOworICAgICAgICB0ZW1wICs9ICgqcGludCsrID4+IDgpICYgMHgwMEZGMDBGRjsKKyAgICAgICAgdGVtcCArPSAoKnBpbnQrKyA+PiA4KSAmIDB4MDBGRjAwRkY7CisgICAgICAgIHBpbnQgKz0gb2Zmc2V0OworCisgICAgfQorCisgICAgTUJfbWVhbiA9ICgoKHRlbXAgJiAweDAwMDBGRkZGKSkgKyAoKHRlbXAgJiAweEZGRkYwMDAwKSA+PiAxNikpID4+IDc7CisKKyAgICBwID0gY3VyOworICAgIG9mZnNldCA9IGx4IC0gMTY7CisgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgeworICAgICAgICB0ZW1wID0gKGogJiAxKTsKKyAgICAgICAgcCArPSB0ZW1wOworICAgICAgICBpID0gODsKKyAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKnAgLSBNQl9tZWFuOworICAgICAgICAgICAgcCArPSAyOworICAgICAgICAgICAgaWYgKHRtcCA+IDApIEEgKz0gdG1wOworICAgICAgICAgICAgZWxzZSAgICBBIC09IHRtcDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBID49IFRoKQorICAgICAgICB7CisgICAgICAgICAgICAqTW9kZSA9IE1PREVfSU5URVI7CisgICAgICAgICAgICByZXR1cm4gOworICAgICAgICB9CisgICAgICAgIHAgKz0gKG9mZnNldCAtIHRlbXApOworICAgIH0KKworICAgIGlmIChBIDwgVGgpCisgICAgICAgICpNb2RlID0gTU9ERV9JTlRSQTsKKyAgICBlbHNlCisgICAgICAgICpNb2RlID0gTU9ERV9JTlRFUjsKKworICAgIHJldHVybiA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBHZXRIYWxmUGVsTUJSZWdpb24KKyAgICBEYXRlOiAgICAgICAwOS8xNy8yMDAwCisgICAgUHVycG9zZTogICAgSW50ZXJwb2xhdGUgdGhlIHNlYXJjaCByZWdpb24gZm9yIGhhbGYtcGVsIHNlYXJjaAorICAgIElucHV0L091dHB1dDogICBDZW50ZXIgb2YgdGhlIHNlYXJjaCwgSGFsZi1wZWwgbWVtb3J5LCB3aWR0aAorICAgIE5vdGU6ICAgICAgIHJvdW5kaW5nIHR5cGUgc2hvdWxkIGJlIHBhcmFtZXRlcml6ZWQuCisgICAgICAgICAgICAgICAgTm93IGZpeGVkIGl0IHRvIHplcm8hISEhISEKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCit2b2lkIEdldEhhbGZQZWxNQlJlZ2lvbl9DKFVDaGFyICpjYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4KQoreworICAgIEludCBpLCBqOworICAgIFVDaGFyICpwMSwgKnAyLCAqcDMsICpwNDsKKyAgICBVQ2hhciAqaG1lbTEgPSBobWVtOworICAgIFVDaGFyICpobWVtMiA9IGhtZW0xICsgMzM7CisgICAgSW50IG9mZnNldCA9IGx4IC0gMTc7CisKKyAgICBwMSA9IGNhbmQgLSBseCAtIDE7CisgICAgcDIgPSBjYW5kIC0gbHg7CisgICAgcDMgPSBjYW5kIC0gMTsKKyAgICBwNCA9IGNhbmQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAqaG1lbTErKyA9ICgoKnAxKyspICsgKnAyICsgKnAzICsgKnA0ICsgMikgPj4gMjsKKyAgICAgICAgICAgICpobWVtMSsrID0gKCgqcDIrKykgKyAqcDQgKyAxKSA+PiAxOworICAgICAgICAgICAgKmhtZW0yKysgPSAoKCpwMysrKSArICpwNCArIDEpID4+IDE7CisgICAgICAgICAgICAqaG1lbTIrKyA9ICpwNCsrOworICAgICAgICB9CisgICAgICAgIC8qICBsYXN0IHBpeGVsICovCisgICAgICAgICpobWVtMSsrID0gKCgqcDErKykgKyAoKnAyKyspICsgKnAzICsgKnA0ICsgMikgPj4gMjsKKyAgICAgICAgKmhtZW0yKysgPSAoKCpwMysrKSArICgqcDQrKykgKyAxKSA+PiAxOworICAgICAgICBobWVtMSArPSAzMzsKKyAgICAgICAgaG1lbTIgKz0gMzM7CisgICAgICAgIHAxICs9IG9mZnNldDsKKyAgICAgICAgcDIgKz0gb2Zmc2V0OworICAgICAgICBwMyArPSBvZmZzZXQ7CisgICAgICAgIHA0ICs9IG9mZnNldDsKKyAgICB9CisgICAgLyogbGFzdCByb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgICpobWVtMSsrID0gKCgqcDErKykgKyAqcDIgKyAoKnAzKyspICsgKnA0ICsgMikgPj4gMjsKKyAgICAgICAgKmhtZW0xKysgPSAoKCpwMisrKSArICgqcDQrKykgKyAxKSA+PiAxOworCisgICAgfQorICAgICpobWVtMSA9ICgqcDEgKyAqcDIgKyAqcDMgKyAqcDQgKyAyKSA+PiAyOworCisgICAgcmV0dXJuIDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIEZ1bmN0aW9uOiAgICBHZXRIYWxmUGVsQmxrUmVnaW9uCisgICBEYXRlOiAgICAgICAgMDkvMjAvMjAwMAorICAgUHVycG9zZTogSW50ZXJwb2xhdGUgdGhlIHNlYXJjaCByZWdpb24gZm9yIGhhbGYtcGVsIHNlYXJjaAorICAgICAgICAgICAgaW4gNE1WIG1vZGUuCisgICBJbnB1dC9PdXRwdXQ6ICAgIENlbnRlciBvZiB0aGUgc2VhcmNoLCBIYWxmLXBlbCBtZW1vcnksIHdpZHRoCisgICBOb3RlOiAgICAgICAgcm91bmRpbmcgdHlwZSBzaG91bGQgYmUgcGFyYW1ldGVyaXplZC4KKyAgICAgICAgICAgIE5vdyBmaXhlZCBpdCB0byB6ZXJvISEhISEhCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwordm9pZCBHZXRIYWxmUGVsQmxrUmVnaW9uKFVDaGFyICpjYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4KQoreworICAgIEludCBpLCBqOworICAgIFVDaGFyICpwMSwgKnAyLCAqcDMsICpwNDsKKyAgICBVQ2hhciAqaG1lbTEgPSBobWVtOworICAgIFVDaGFyICpobWVtMiA9IGhtZW0xICsgMTc7CisgICAgSW50IG9mZnNldCA9IGx4IC0gOTsKKworICAgIHAxID0gY2FuZCAtIGx4IC0gMTsKKyAgICBwMiA9IGNhbmQgLSBseDsKKyAgICBwMyA9IGNhbmQgLSAxOworICAgIHA0ID0gY2FuZDsKKworICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAqaG1lbTErKyA9ICgoKnAxKyspICsgKnAyICsgKnAzICsgKnA0ICsgMikgPj4gMjsKKyAgICAgICAgICAgICpobWVtMSsrID0gKCgqcDIrKykgKyAqcDQgKyAxKSA+PiAxOworICAgICAgICAgICAgKmhtZW0yKysgPSAoKCpwMysrKSArICpwNCArIDEpID4+IDE7CisgICAgICAgICAgICAqaG1lbTIrKyA9ICpwNCsrOworICAgICAgICB9CisgICAgICAgIC8qICBsYXN0IHBpeGVsICovCisgICAgICAgICpobWVtMSsrID0gKCgqcDErKykgKyAoKnAyKyspICsgKnAzICsgKnA0ICsgMikgPj4gMjsKKyAgICAgICAgKmhtZW0yKysgPSAoKCpwMysrKSArICgqcDQrKykgKyAxKSA+PiAxOworICAgICAgICBobWVtMSArPSAxNzsKKyAgICAgICAgaG1lbTIgKz0gMTc7CisgICAgICAgIHAxICs9IG9mZnNldDsKKyAgICAgICAgcDIgKz0gb2Zmc2V0OworICAgICAgICBwMyArPSBvZmZzZXQ7CisgICAgICAgIHA0ICs9IG9mZnNldDsKKyAgICB9CisgICAgLyogbGFzdCByb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgIHsKKyAgICAgICAgKmhtZW0xKysgPSAoKCpwMSsrKSArICpwMiArICgqcDMrKykgKyAqcDQgKyAyKSA+PiAyOworICAgICAgICAqaG1lbTErKyA9ICgoKnAyKyspICsgKCpwNCsrKSArIDEpID4+IDE7CisKKyAgICB9CisgICAgKmhtZW0xID0gKCpwMSArICpwMiArICpwMyArICpwNCArIDIpID4+IDI7CisKKyAgICByZXR1cm4gOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgUGFkZGluZ0VkZ2UKKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgUGFkIGVkZ2Ugb2YgYSBWb3AKKyAgICBNb2RpZmljYXRpb246IDA5LzIwLzA1LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCAgUGFkZGluZ0VkZ2UoVm9wICpyZWZWb3ApCit7CisgICAgVUNoYXIgKnNyYywgKmRzdDsKKyAgICBJbnQgaTsKKyAgICBJbnQgcGl0Y2gsIHdpZHRoLCBoZWlnaHQ7CisgICAgVUxvbmcgdGVtcDEsIHRlbXAyOworCisgICAgd2lkdGggPSByZWZWb3AtPndpZHRoOworICAgIGhlaWdodCA9IHJlZlZvcC0+aGVpZ2h0OworICAgIHBpdGNoID0gcmVmVm9wLT5waXRjaDsKKworICAgIC8qIHBhZCB0b3AgKi8KKyAgICBzcmMgPSByZWZWb3AtPnlDaGFuOworCisgICAgdGVtcDEgPSAqc3JjOyAvKiB0b3AtbGVmdCBjb3JuZXIgKi8KKyAgICB0ZW1wMiA9IHNyY1t3aWR0aC0xXTsgLyogdG9wLXJpZ2h0IGNvcm5lciAqLworICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCA4KTsKKyAgICB0ZW1wMSB8PSAodGVtcDEgPDwgMTYpOworICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCA4KTsKKyAgICB0ZW1wMiB8PSAodGVtcDIgPDwgMTYpOworCisgICAgZHN0ID0gc3JjIC0gKHBpdGNoIDw8IDQpOworCisgICAgKigoVUxvbmcqKShkc3QgLSAxNikpID0gdGVtcDE7CisgICAgKigoVUxvbmcqKShkc3QgLSAxMikpID0gdGVtcDE7CisgICAgKigoVUxvbmcqKShkc3QgLSA4KSkgPSB0ZW1wMTsKKyAgICAqKChVTG9uZyopKGRzdCAtIDQpKSA9IHRlbXAxOworCisgICAgTTRWRU5DX01FTUNQWShkc3QsIHNyYywgd2lkdGgpOworCisgICAgKigoVUxvbmcqKShkc3QgKz0gd2lkdGgpKSA9IHRlbXAyOworICAgICooKFVMb25nKikoZHN0ICsgNCkpID0gdGVtcDI7CisgICAgKigoVUxvbmcqKShkc3QgKyA4KSkgPSB0ZW1wMjsKKyAgICAqKChVTG9uZyopKGRzdCArIDEyKSkgPSB0ZW1wMjsKKworICAgIGRzdCA9IGRzdCAtIHdpZHRoIC0gMTY7CisKKyAgICBpID0gMTU7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIE00VkVOQ19NRU1DUFkoZHN0ICsgcGl0Y2gsIGRzdCwgcGl0Y2gpOworICAgICAgICBkc3QgKz0gcGl0Y2g7CisgICAgfQorCisgICAgLyogcGFkIHNpZGVzICovCisgICAgZHN0ICs9IChwaXRjaCArIDE2KTsKKyAgICBzcmMgPSBkc3Q7CisgICAgaSA9IGhlaWdodDsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdGVtcDEgPSAqc3JjOworICAgICAgICB0ZW1wMiA9IHNyY1t3aWR0aC0xXTsKKyAgICAgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDgpOworICAgICAgICB0ZW1wMSB8PSAodGVtcDEgPDwgMTYpOworICAgICAgICB0ZW1wMiB8PSAodGVtcDIgPDwgOCk7CisgICAgICAgIHRlbXAyIHw9ICh0ZW1wMiA8PCAxNik7CisKKyAgICAgICAgKigoVUxvbmcqKShkc3QgLSAxNikpID0gdGVtcDE7CisgICAgICAgICooKFVMb25nKikoZHN0IC0gMTIpKSA9IHRlbXAxOworICAgICAgICAqKChVTG9uZyopKGRzdCAtIDgpKSA9IHRlbXAxOworICAgICAgICAqKChVTG9uZyopKGRzdCAtIDQpKSA9IHRlbXAxOworCisgICAgICAgICooKFVMb25nKikoZHN0ICs9IHdpZHRoKSkgPSB0ZW1wMjsKKyAgICAgICAgKigoVUxvbmcqKShkc3QgKyA0KSkgPSB0ZW1wMjsKKyAgICAgICAgKigoVUxvbmcqKShkc3QgKyA4KSkgPSB0ZW1wMjsKKyAgICAgICAgKigoVUxvbmcqKShkc3QgKyAxMikpID0gdGVtcDI7CisKKyAgICAgICAgc3JjICs9IHBpdGNoOworICAgICAgICBkc3QgPSBzcmM7CisgICAgfQorCisgICAgLyogcGFkIGJvdHRvbSAqLworICAgIGRzdCAtPSAxNjsKKyAgICBpID0gMTY7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIE00VkVOQ19NRU1DUFkoZHN0LCBkc3QgLSBwaXRjaCwgcGl0Y2gpOworICAgICAgICBkc3QgKz0gcGl0Y2g7CisgICAgfQorCisKKyAgICByZXR1cm4gOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBDb21wdXRlTUJTdW0KKyAgICBEYXRlOiAgICAgICAxMC8yOC8yMDAwCisgICAgUHVycG9zZTogICAgQ29tcHV0ZSBzdW0gb2YgYWJzb2x1dGUgdmFsdWUgKFNBVikgb2YgYmxvY2tzIGluIGEgbWFjcm9ibG9jaworICAgICAgICAgICAgICAgIGluIElOVFJBIG1vZGUgbmVlZGVkIGZvciByYXRlIGNvbnRyb2wuIFRodXMsIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICBjb21wdXRpbmcgdGhlIFNBViwgd2UgY2FuIGNvbXB1dGUgZmlyc3Qgb3JkZXIgbW9tZW50IG9yCisgICAgICAgICAgICAgICAgdmFyaWFuY2UgLgorCisgICAgMTEvMjgvMDA6ICAgIGFkZCBNTVgKKyAgICA5LzMvMDE6ICAgICAgZG8gcGFyYWxsZWwgY29tcCBmb3IgQyBmdW5jdGlvbi4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDb21wdXRlTUJTdW1fQyhVQ2hhciAqY3VyLCBJbnQgbHgsIE1PVCAqbW90X21iKQoreworICAgIEludCBqOworICAgIEludCAqY0ludCwgKmNJbnQyOworICAgIEludCBzYWQxID0gMCwgc2FkMiA9IDAsIHNhZDMgPSAwLCBzYWQ0ID0gMDsKKyAgICBJbnQgdG1wLCB0bXAyLCBtYXNrID0gMHgwMEZGMDBGRjsKKworICAgIGNJbnQgPSAoSW50KiljdXI7ICAgLyogbWFrZSBzdXJlIHRoaXMgaXMgd29yZC1hbGlnbiAqLworICAgIGNJbnQyID0gKEludCopKGN1ciArIChseCA8PCAzKSk7CisgICAgaiA9IDg7CisgICAgd2hpbGUgKGotLSkKKyAgICB7CisgICAgICAgIHRtcCA9IGNJbnRbM107ICAvKiBsb2FkIDQgcGl4ZWxzIGF0IGEgdGltZSAqLworICAgICAgICB0bXAyID0gdG1wICYgbWFzazsKKyAgICAgICAgdG1wID0gKHRtcCA+PiA4KSAmIG1hc2s7CisgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICBzYWQyICs9IHRtcDsKKyAgICAgICAgdG1wID0gY0ludFsyXTsKKyAgICAgICAgdG1wMiA9IHRtcCAmIG1hc2s7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gOCkgJiBtYXNrOworICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgc2FkMiArPSB0bXA7CisgICAgICAgIHRtcCA9IGNJbnRbMV07CisgICAgICAgIHRtcDIgPSB0bXAgJiBtYXNrOworICAgICAgICB0bXAgPSAodG1wID4+IDgpICYgbWFzazsKKyAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgIHNhZDEgKz0gdG1wOworICAgICAgICB0bXAgPSAqY0ludDsKKyAgICAgICAgY0ludCArPSAobHggPj4gMik7CisgICAgICAgIHRtcDIgPSB0bXAgJiBtYXNrOworICAgICAgICB0bXAgPSAodG1wID4+IDgpICYgbWFzazsKKyAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgIHNhZDEgKz0gdG1wOworCisgICAgICAgIHRtcCA9IGNJbnQyWzNdOworICAgICAgICB0bXAyID0gdG1wICYgbWFzazsKKyAgICAgICAgdG1wID0gKHRtcCA+PiA4KSAmIG1hc2s7CisgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICBzYWQ0ICs9IHRtcDsKKyAgICAgICAgdG1wID0gY0ludDJbMl07CisgICAgICAgIHRtcDIgPSB0bXAgJiBtYXNrOworICAgICAgICB0bXAgPSAodG1wID4+IDgpICYgbWFzazsKKyAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgIHNhZDQgKz0gdG1wOworICAgICAgICB0bXAgPSBjSW50MlsxXTsKKyAgICAgICAgdG1wMiA9IHRtcCAmIG1hc2s7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gOCkgJiBtYXNrOworICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgc2FkMyArPSB0bXA7CisgICAgICAgIHRtcCA9ICpjSW50MjsKKyAgICAgICAgY0ludDIgKz0gKGx4ID4+IDIpOworICAgICAgICB0bXAyID0gdG1wICYgbWFzazsKKyAgICAgICAgdG1wID0gKHRtcCA+PiA4KSAmIG1hc2s7CisgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICBzYWQzICs9IHRtcDsKKyAgICB9CisgICAgc2FkMSArPSAoc2FkMSA8PCAxNik7CisgICAgc2FkMiArPSAoc2FkMiA8PCAxNik7CisgICAgc2FkMyArPSAoc2FkMyA8PCAxNik7CisgICAgc2FkNCArPSAoc2FkNCA8PCAxNik7CisgICAgc2FkMSA+Pj0gMTY7CisgICAgc2FkMiA+Pj0gMTY7CisgICAgc2FkMyA+Pj0gMTY7CisgICAgc2FkNCA+Pj0gMTY7CisKKyAgICBtb3RfbWJbMV0uc2FkID0gc2FkMTsKKyAgICBtb3RfbWJbMl0uc2FkID0gc2FkMjsKKyAgICBtb3RfbWJbM10uc2FkID0gc2FkMzsKKyAgICBtb3RfbWJbNF0uc2FkID0gc2FkNDsKKyAgICBtb3RfbWJbMF0uc2FkID0gc2FkMSArIHNhZDIgKyBzYWQzICsgc2FkNDsKKworICAgIHJldHVybiA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODFkMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCkBAIC0wLDAgKzEsMTk2NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorCisvL2NvbnN0IHN0YXRpYyBJbnQgcm91bmR0YWI0W10gPSB7MCwxLDEsMX07CisvL2NvbnN0IHN0YXRpYyBJbnQgcm91bmR0YWI4W10gPSB7MCwwLDEsMSwxLDEsMSwyfTsKKy8vY29uc3Qgc3RhdGljIEludCByb3VuZHRhYjEyW10gPSB7MCwwLDAsMSwxLDEsMSwxLDEsMSwyLDJ9OworY29uc3Qgc3RhdGljIEludCByb3VuZHRhYjE2W10gPSB7MCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMn07CisKKyNkZWZpbmUgRk9SV0FSRF9NT0RFICAgIDEKKyNkZWZpbmUgQkFDS1dBUkRfTU9ERSAgIDIKKyNkZWZpbmUgQklESVJFQ1RJT05fTU9ERSAgICAzCisjZGVmaW5lIERJUkVDVF9NT0RFICAgICAgICAgNAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorICAgIC8qRnVuY3Rpb24gUHJvdG90eXBlICovCisgICAgLyogbm8tZWRnZSBwYWRkaW5nICovCisgICAgSW50IEVuY0dldFByZWRPdXRzaWRlKEludCB4cG9zLCBJbnQgeXBvcywgVUNoYXIgKmNfcHJldiwgVUNoYXIgKnJlYywKKyAgICBJbnQgd2lkdGgsIEludCBoZWlnaHQsIEludCBybmQxKTsKKworICAgIHZvaWQgQ29weV9NQl9mcm9tX1ZvcChVQ2hhciAqY29tcCwgSW50IHlDaGFuW11bTkNPRUZGX0JMT0NLXSwgSW50IHdpZHRoKTsKKyAgICB2b2lkIENvcHlfQl9mcm9tX1ZvcChVQ2hhciAqY29tcCwgSW50IGNDaGFuW10sIEludCB3aWR0aCk7CisgICAgdm9pZCBDb3B5X01CX2ludG9fVm9wKFVDaGFyICpjb21wLCBJbnQgeUNoYW5bXVtOQ09FRkZfQkxPQ0tdLCBJbnQgd2lkdGgpOworICAgIHZvaWQgQ29weV9CX2ludG9fVm9wKFVDaGFyICpjb21wLCBJbnQgY0NoYW5bXSwgSW50IHdpZHRoKTsKKyAgICB2b2lkIGdldF9NQihVQ2hhciAqY19wcmV2LCBVQ2hhciAqY19wcmV2X3UgICwgVUNoYXIgKmNfcHJldl92LAorICAgICAgICAgICAgICAgIFNob3J0IG1iWzZdWzY0XSwgSW50IGx4LCBJbnQgbHhfdXYpOworCisgICAgSW50IEdldFByZWRBZHZCeTB4MCgKKyAgICAgICAgVUNoYXIgKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIFVDaGFyICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KKyAgICAgICAgSW50IGx4LCAgICAgLyogaSAqLworICAgICAgICBJbnQgcm5kMSAvKiBpICovCisgICAgKTsKKworICAgIEludCBHZXRQcmVkQWR2QnkweDEoCisgICAgICAgIFVDaGFyICpjX3ByZXYsICAgICAgLyogaSAqLworICAgICAgICBVQ2hhciAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCisgICAgICAgIEludCBseCwgICAgIC8qIGkgKi8KKyAgICAgICAgSW50IHJuZDEgLyogaSAqLworICAgICk7CisKKyAgICBJbnQgR2V0UHJlZEFkdkJ5MXgwKAorICAgICAgICBVQ2hhciAqY19wcmV2LCAgICAgIC8qIGkgKi8KKyAgICAgICAgVUNoYXIgKnByZWRfYmxvY2ssICAgICAgLyogaSAqLworICAgICAgICBJbnQgbHgsICAgICAvKiBpICovCisgICAgICAgIEludCBybmQxIC8qIGkgKi8KKyAgICApOworCisgICAgSW50IEdldFByZWRBZHZCeTF4MSgKKyAgICAgICAgVUNoYXIgKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIFVDaGFyICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KKyAgICAgICAgSW50IGx4LCAgICAgLyogaSAqLworICAgICAgICBJbnQgcm5kMSAvKiBpICovCisgICAgKTsKKworICAgIHN0YXRpYyBJbnQoKmNvbnN0IEdldFByZWRBZHZCVGFibGVbMl1bMl0pKFVDaGFyKiwgVUNoYXIqLCBJbnQsIEludCkgPQorICAgIHsKKyAgICAgICAgeyZHZXRQcmVkQWR2QnkweDAsICZHZXRQcmVkQWR2QnkweDF9LAorICAgICAgICB7JkdldFByZWRBZHZCeTF4MCwgJkdldFByZWRBZHZCeTF4MX0KKyAgICB9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBnZXRNb3Rpb25Db21wZW5zYXRlZE1CKCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMTcvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IHRoZSBtb3Rpb24gY29tcGVuc2F0ZSBibG9jayBpbnRvIHZpZGVvLT5wcmVkaWN0aW9uTUIgICAgICovCisvKiAgICAgICAgICAgICAgYW5kIGdlbmVyYXRlIHZpZGVvLT5wcmVkaWN0aW9uRXJyb3JNQiAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBtb2RpZmllZCBmcm9tIE1CTW90aW9uQ29tcCgpIGZ1bmN0aW9uIGluIHRoZSBkZWNvZGVyICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgZ2V0TW90aW9uQ29tcGVuc2F0ZWRNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgaW5kX3gsIEludCBpbmRfeSwgSW50IG9mZnNldCkKK3sKKyAgICBWb3AgKnByZXZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLy9yZWZlcmVuY2UgZnJhbWUKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07ICAgICAgIC8vbWIgaW5kZXgKKyAgICBNT1QgKm1vdCA9IHZpZGVvLT5tb3RbbWJudW1dOworICAgIEludCB5cG9zLCB4cG9zOworICAgIFVDaGFyICpjX3ByZXYsICpjdV9wcmV2LCAqY3ZfcHJldjsKKyAgICBVQ2hhciAqY19yZWMsICpjdV9yZWMsICpjdl9yZWM7CisgICAgSW50IGhlaWdodCwgcGl0Y2gsIHBpdGNoX3V2LCBoZWlnaHRfdXY7CisgICAgSW50IG1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsgIC8qIGdldCBtb2RlICovCisgICAgSW50IGR4LCBkeTsKKyAgICBJbnQgeHByZWQsIHlwcmVkOworICAgIEludCB4c3VtLCB5c3VtOworICAgIEludCByb3VuZDE7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcob2Zmc2V0KTsKKworICAgIHJvdW5kMSA9IChJbnQpKDEgLSB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlKTsKKworICAgIHBpdGNoICA9IGN1cnJWb3AtPnBpdGNoOworICAgIGhlaWdodCA9IGN1cnJWb3AtPmhlaWdodDsKKyAgICBwaXRjaF91diAgPSBwaXRjaCA+PiAxOworICAgIGhlaWdodF91diA9IGhlaWdodCA+PiAxOworCisgICAgeXBvcyA9IGluZF95IDw8IDQgOworICAgIHhwb3MgPSBpbmRfeCA8PCA0IDsKKworICAgIGNfcmVjID0gdmlkZW8tPnByZWRpY3RlZE1COworICAgIGN1X3JlYyA9IHZpZGVvLT5wcmVkaWN0ZWRNQiArIDI1NjsKKyAgICBjdl9yZWMgPSB2aWRlby0+cHJlZGljdGVkTUIgKyAyNjQ7CisKKyAgICBpZiAobW9kZSA9PSBNT0RFX0lOVEVSIHx8IG1vZGUgPT0gTU9ERV9JTlRFUl9RKQorICAgIHsKKyAgICAgICAgLyogTW90aW9uIHZlY3RvciBpbiB4IGRpcmVjdGlvbiAgICAgICAqLworICAgICAgICBkeCA9IG1vdFswXS54OworICAgICAgICBkeSA9IG1vdFswXS55OworCisgICAgICAgIGNfcHJldiAgPSBwcmV2Vm9wLT55Q2hhbjsKKworICAgICAgICB4cHJlZCA9ICh4cG9zIDw8IDEpICsgZHggOworICAgICAgICB5cHJlZCA9ICh5cG9zIDw8IDEpICsgZHkgOworCisgICAgICAgIC8qIENhbGwgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBsdW1pbmFuY2UgcHJlZGljdGlvbiAqLworICAgICAgICBFbmNQcmVkaWN0aW9uX0lOVEVSKHhwcmVkLCB5cHJlZCwgY19wcmV2LCBjX3JlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaCwgcm91bmQxKTsKKworICAgICAgICBpZiAoKGR4ICYgMykgPT0gMCkgIGR4ID0gZHggPj4gMTsKKyAgICAgICAgZWxzZSAgICAgICAgZHggPSAoZHggPj4gMSkgfCAxOworCisgICAgICAgIGlmICgoZHkgJiAzKSA9PSAwKSAgICAgIGR5ID0gZHkgPj4gMTsKKyAgICAgICAgZWxzZSAgICAgICAgZHkgPSAoZHkgPj4gMSkgfCAxOworCisgICAgICAgIHhwcmVkID0geHBvcyArIGR4OworICAgICAgICB5cHJlZCA9IHlwb3MgKyBkeTsKKworICAgICAgICBjdV9wcmV2ID0gcHJldlZvcC0+dUNoYW47CisgICAgICAgIGN2X3ByZXYgPSBwcmV2Vm9wLT52Q2hhbjsKKworICAgICAgICBFbmNQcmVkaWN0aW9uX0Nocm9tKHhwcmVkLCB5cHJlZCwgY3VfcHJldiwgY3ZfcHJldiwgY3VfcmVjLCBjdl9yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfdXYsIChjdXJyVm9wLT53aWR0aCkgPj4gMSwgaGVpZ2h0X3V2LCByb3VuZDEpOworICAgIH0KKyNpZm5kZWYgTk9fSU5URVI0VgorICAgIGVsc2UgaWYgKG1vZGUgPT0gTU9ERV9JTlRFUjRWKQorICAgIHsKKyAgICAgICAgY19wcmV2ICA9IHByZXZWb3AtPnlDaGFuOworICAgICAgICBjdV9wcmV2ID0gcHJldlZvcC0+dUNoYW47CisgICAgICAgIGN2X3ByZXYgPSBwcmV2Vm9wLT52Q2hhbjsKKworICAgICAgICBFbmNQcmVkaWN0aW9uX0lOVEVSNFYoeHBvcywgeXBvcywgbW90LCBjX3ByZXYsIGNfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsIHJvdW5kMSk7CisKKyAgICAgICAgeHN1bSA9IG1vdFsxXS54ICsgbW90WzJdLnggKyBtb3RbM10ueCArIG1vdFs0XS54OworICAgICAgICB5c3VtID0gbW90WzFdLnkgKyBtb3RbMl0ueSArIG1vdFszXS55ICsgbW90WzRdLnk7CisKKyAgICAgICAgZHggPSBQVl9TSUdOKHhzdW0pICogKHJvdW5kdGFiMTZbKFBWX0FCUyh4c3VtKSkgJiAweEZdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBWX0FCUyh4c3VtKSkgPj4gNCkgPDwgMSkpOworICAgICAgICBkeSA9IFBWX1NJR04oeXN1bSkgKiAocm91bmR0YWIxNlsoUFZfQUJTKHlzdW0pKSAmIDB4Rl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUFZfQUJTKHlzdW0pKSA+PiA0KSA8PCAxKSk7CisKKyAgICAgICAgeXByZWQgPSB5cG9zICsgZHk7CisgICAgICAgIHhwcmVkID0geHBvcyArIGR4OworCisgICAgICAgIEVuY1ByZWRpY3Rpb25fQ2hyb20oeHByZWQsIHlwcmVkLCBjdV9wcmV2LCBjdl9wcmV2LCBjdV9yZWMsIGN2X3JlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaF91diwgKGN1cnJWb3AtPndpZHRoKSA+PiAxLCBoZWlnaHRfdXYsIHJvdW5kMSk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgOy8vcHJpbnRmKCJFcnJvciwgTU9ERV9TS0lQUEVEIGlzIG5vdCBkZWNpZGVkIHlldCFcbiIpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGdW5jdGlvbjogICBFbmNQcmVkaWN0aW9uX0lOVEVSCisgICAgRGF0ZTogICAgICAgMDQvMTcvMjAwMQorICAgIFB1cnBvc2U6ICAgIEdldCBwcmVkaWN0ZWQgYXJlYSBmb3IgbHVtaW5hbmNlIGFuZCBjb21wZW5zYXRlIHdpdGggdGhlIHJlc2lkdWUuCisgICAgICAgICAgICAgICAgTW9kaWZpZWQgZnJvbSBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyKCkgaW4gZGVjb2Rlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBFbmNQcmVkaWN0aW9uX0lOVEVSKAorICAgIEludCB4cHJlZCwgICAgICAgICAgLyogaSAqLworICAgIEludCB5cHJlZCwgICAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpjX3ByZXYsICAgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqY19yZWMsICAgICAgIC8qIGkgKi8KKyAgICBJbnQgbHgsICAgICAgICAgLyogaSAqLworICAgIEludCByb3VuZDEgICAgICAgICAgLyogaSAqLworKQoreworICAgIGNfcHJldiArPSAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpICogbHgpOworCisgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYsIGNfcmVjLCBseCwgcm91bmQxKTsKKworICAgIGNfcHJldiArPSBCX1NJWkU7CisgICAgY19yZWMgKz0gQl9TSVpFOworCisgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYsIGNfcmVjLCBseCwgcm91bmQxKTsKKworICAgIGNfcHJldiArPSAobHggPDwgMykgLSBCX1NJWkU7CisgICAgY19yZWMgKz0gKDE2IDw8IDMpIC0gQl9TSVpFOyAvKiBwYWRkaW5nICovCisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiwgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgY19wcmV2ICs9IEJfU0laRTsKKyAgICBjX3JlYyArPSBCX1NJWkU7CisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiwgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgcmV0dXJuOworfQorCisjaWZuZGVmIE5PX0lOVEVSNFYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGdW5jdGlvbjogICBFbmNQcmVkaWN0aW9uX0lOVEVSNFYKKyAgICBEYXRlOiAgICAgICAwNC8xNy8yMDAxCisgICAgUHVycG9zZTogICAgR2V0IHByZWRpY3RlZCBhcmVhIGZvciBsdW1pbmFuY2UgYW5kIGNvbXBlbnNhdGUgd2l0aCB0aGUgcmVzaWR1ZS4KKyAgICAgICAgICAgICAgICBNb2RpZmllZCBmcm9tIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXI0digpIGluIGRlY29kZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgRW5jUHJlZGljdGlvbl9JTlRFUjRWKAorICAgIEludCB4cG9zLCAgICAgICAgICAgLyogaSAqLworICAgIEludCB5cG9zLCAgICAgICAgICAgLyogaSAqLworICAgIE1PVCAqbW90LCAgICAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpjX3ByZXYsICAgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqY19yZWMsICAgICAgICAgICAvKiBpICovCisgICAgSW50IGx4LCAgICAgICAgIC8qIGkgKi8KKyAgICBJbnQgcm91bmQxICAgICAgICAgIC8qIGkgKi8KKykKK3sKKyAgICBJbnQgeXByZWQsIHhwcmVkOworCisgICAgeHByZWQgPSAoSW50KSgoeHBvcyA8PCAxKSArIG1vdFsxXS54KTsKKyAgICB5cHJlZCA9IChJbnQpKCh5cG9zIDw8IDEpICsgbW90WzFdLnkpOworCisgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcmVjLCBseCwgcm91bmQxKTsKKworICAgIGNfcmVjICs9IEJfU0laRTsKKworICAgIHhwcmVkID0gKEludCkoKCh4cG9zICsgQl9TSVpFKSA8PCAxKSArIG1vdFsyXS54KTsKKyAgICB5cHJlZCA9IChJbnQpKCh5cG9zIDw8IDEpICsgbW90WzJdLnkpOworCisgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcmVjLCBseCwgcm91bmQxKTsKKworICAgIGNfcmVjICs9ICgxNiA8PCAzKSAtIEJfU0laRTsgLyogcGFkZGluZyAqLworCisgICAgeHByZWQgPSAoSW50KSgoeHBvcyA8PCAxKSArIG1vdFszXS54KTsKKyAgICB5cHJlZCA9IChJbnQpKCgoeXBvcyArIEJfU0laRSkgPDwgMSkgKyBtb3RbM10ueSk7CisKKyAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19yZWMsIGx4LCByb3VuZDEpOworCisgICAgY19yZWMgKz0gQl9TSVpFOworCisgICAgeHByZWQgPSAoSW50KSgoKHhwb3MgKyBCX1NJWkUpIDw8IDEpICsgbW90WzRdLngpOworICAgIHlwcmVkID0gKEludCkoKCh5cG9zICsgQl9TSVpFKSA8PCAxKSArIG1vdFs0XS55KTsKKworICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3JlYywgbHgsIHJvdW5kMSk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogTk9fSU5URVI0ViAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRnVuY3Rpb246ICAgRW5jUHJlZGljdGlvbl9DaHJvbQorICAgIERhdGU6ICAgICAgIDA0LzE3LzIwMDEKKyAgICBQdXJwb3NlOiAgICBHZXQgcHJlZGljdGVkIGFyZWEgZm9yIGNocm9taW5hbmNlIGFuZCBjb21wZW5zYXRlIHdpdGggdGhlIHJlc2lkdWUuCisgICAgICAgICAgICAgICAgTW9kaWZpZWQgZnJvbSBjaHJvbWluYW5jZV9wcmVkKCkgaW4gZGVjb2Rlci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBFbmNQcmVkaWN0aW9uX0Nocm9tKAorICAgIEludCB4cHJlZCwgICAgICAgICAgLyogaSAqLworICAgIEludCB5cHJlZCwgICAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpjdV9wcmV2LCAgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqY3ZfcHJldiwgICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKmN1X3JlYywKKyAgICBVQ2hhciAqY3ZfcmVjLAorICAgIEludCBseCwKKyAgICBJbnQgd2lkdGhfdXYsICAgICAgICAgICAvKiBpICovCisgICAgSW50IGhlaWdodF91diwgICAgICAgICAgLyogaSAqLworICAgIEludCByb3VuZDEgICAgICAgICAgLyogaSAqLworKQoreworICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiBmb3IgQ2hyb21pbmFuY2UgYiBibG9jayAoYmxvY2tbNF0pICovCisgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aF91diA8PCAxKSAtICgyKkJfU0laRSkpICYmIHlwcmVkID49IDAgJiYKKyAgICAgICAgICAgIHlwcmVkIDw9ICgoaGVpZ2h0X3V2IDw8IDEpIC0gKDIqQl9TSVpFKSkpCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiBmb3IgQ2hyb21pbmFuY2UgYiAoYmxvY2tbNF0pICovCisgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY3VfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1X3JlYywgbHgsIHJvdW5kMSk7CisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSByIChibG9ja1s1XSkgKi8KKyAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjdl9wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZfcmVjLCAgbHgsIHJvdW5kMSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSBiIChibG9ja1s0XSkgKi8KKyAgICAgICAgRW5jR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdV9wcmV2LCBjdV9yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoX3V2LCBoZWlnaHRfdXYsIHJvdW5kMSk7CisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSByIChibG9ja1s1XSkgKi8KKyAgICAgICAgRW5jR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdl9wcmV2LCBjdl9yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoX3V2LCBoZWlnaHRfdXYsIHJvdW5kMSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZ1bmN0aW9uOiAgIEdldFByZWRBZHZhbmNlZEIKKyAgICBEYXRlOiAgICAgICAwNC8xNy8yMDAxCisgICAgUHVycG9zZTogICAgR2V0IHByZWRpY3RlZCBhcmVhIChibG9jaykgYW5kIGNvbXBlbnNhdGUgd2l0aCB0aGUgcmVzaWR1ZS4KKyAgICAgICAgICAgICAgICAtIG1vZGlmaWVkIGZyb20gR2V0UHJlZEFkdmFuY2VkQkFkZCBpbiBkZWNvZGVyLgorICAgIEludHB1dC9PdXRwdXQ6CisgICAgTW9kaWZpZWQ6CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0ludCBHZXRQcmVkQWR2QnkweDAoCisgICAgVUNoYXIgKnByZXYsICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKnJlYywgICAgIC8qIGkgKi8KKyAgICBJbnQgbHgsICAgICAvKiBpICovCisgICAgSW50IHJuZCAvKiBpICovCispCit7CisgICAgSW50IGk7ICAgICAgLyogbG9vcCB2YXJpYWJsZSAqLworICAgIFVMb25nICBwcmVkX3dvcmQsIHdvcmQxLCB3b3JkMjsKKyAgICBJbnQgdG1wOworCisgICAgT1NDTF9VTlVTRURfQVJHKHJuZCk7CisKKyAgICAvKiBpbml0aWFsaXplIG9mZnNldCB0byBhZGp1c3QgcGl4ZWwgY291bnRlciAqLworICAgIC8qICAgIHRoZSBuZXh0IHJvdzsgZnVsbC1wZWwgcmVzb2x1dGlvbiAgICAgICovCisKKyAgICB0bXAgPSAoVUxvbmcpcHJldiAmIDB4MzsKKworICAgIGlmICh0bXAgPT0gMCkgIC8qIHdvcmQtYWxpZ25lZCAqLworICAgIHsKKyAgICAgICAgcmVjIC09IDE2OyAvKiBwcmVzZXQgKi8KKyAgICAgICAgcHJldiAtPSBseDsKKworICAgICAgICBmb3IgKGkgPSA4OyBpID4gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxNikpID0gKigoVUxvbmcqKShwcmV2ICs9IGx4KSk7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9ICooKFVMb25nKikocHJldiArIDQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAodG1wID09IDEpIC8qIGZpcnN0IHBvc2l0aW9uICovCisgICAgeworICAgICAgICBwcmV2LS07IC8qIHdvcmQtYWxpZ25lZCAqLworICAgICAgICByZWMgLT0gMTY7IC8qIHByZXNldCAqLworICAgICAgICBwcmV2IC09IGx4OworCisgICAgICAgIGZvciAoaSA9IDg7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcywgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgNCkpOyAgLyogcmVhZCA0IGJ5dGVzLCBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgd29yZDEgPj49IDg7IC8qIDAgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgIHByZWRfd29yZCA9IHdvcmQxIHwgKHdvcmQyIDw8IDI0KTsgIC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxNikpID0gcHJlZF93b3JkOworCisgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArIDgpKTsgLyogYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgIHdvcmQyID4+PSA4OyAvKiAwIGI4IGI3IGI2ICovCisgICAgICAgICAgICBwcmVkX3dvcmQgPSB3b3JkMiB8ICh3b3JkMSA8PCAyNCk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArIDQpKSA9IHByZWRfd29yZDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICh0bXAgPT0gMikgLyogc2Vjb25kIHBvc2l0aW9uICovCisgICAgeworICAgICAgICBwcmV2IC09IDI7IC8qIHdvcmQxLWFsaWduZWQgKi8KKyAgICAgICAgcmVjIC09IDE2OyAvKiBwcmVzZXQgKi8KKyAgICAgICAgcHJldiAtPSBseDsKKworICAgICAgICBmb3IgKGkgPSA4OyBpID4gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSBseCkpOyAvKiByZWFkIDQgYnl0ZXMsIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIDQpKTsgIC8qIHJlYWQgNCBieXRlcywgYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgIHdvcmQxID4+PSAxNjsgLyogMCAwIGI0IGIzICovCisgICAgICAgICAgICBwcmVkX3dvcmQgPSB3b3JkMSB8ICh3b3JkMiA8PCAxNik7ICAvKiBiNiBiNSBiNCBiMyAqLworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTYpKSA9IHByZWRfd29yZDsKKworICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKyA4KSk7IC8qIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICB3b3JkMiA+Pj0gMTY7IC8qIDAgMCBiOCBiNyAqLworICAgICAgICAgICAgcHJlZF93b3JkID0gd29yZDIgfCAod29yZDEgPDwgMTYpOyAvKiBiMTAgYjkgYjggYjcgKi8KKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gcHJlZF93b3JkOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgLyogdGhpcmQgcG9zaXRpb24gKi8KKyAgICB7CisgICAgICAgIHByZXYgLT0gMzsgLyogd29yZDEtYWxpZ25lZCAqLworICAgICAgICByZWMgLT0gMTY7IC8qIHByZXNldCAqLworICAgICAgICBwcmV2IC09IGx4OworCisgICAgICAgIGZvciAoaSA9IDg7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IGx4KSk7IC8qIHJlYWQgNCBieXRlcywgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgNCkpOyAgLyogcmVhZCA0IGJ5dGVzLCBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgd29yZDEgPj49IDI0OyAvKiAwIDAgMCBiNCAqLworICAgICAgICAgICAgcHJlZF93b3JkID0gd29yZDEgfCAod29yZDIgPDwgOCk7ICAgLyogYjcgYjYgYjUgYjQgKi8KKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDE2KSkgPSBwcmVkX3dvcmQ7CisKKyAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICsgOCkpOyAvKiBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgd29yZDIgPj49IDI0OyAvKiAwIDAgMCBiOCAqLworICAgICAgICAgICAgcHJlZF93b3JkID0gd29yZDIgfCAod29yZDEgPDwgOCk7IC8qIGIxMSBiMTAgYjkgYjggKi8KKyAgICAgICAgICAgICooKFVMb25nKikocmVjICsgNCkpID0gcHJlZF93b3JkOworCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJbnQgR2V0UHJlZEFkdkJ5MHgxKAorICAgIFVDaGFyICpwcmV2LCAgICAgICAgLyogaSAqLworICAgIFVDaGFyICpyZWMsICAgICAvKiBpICovCisgICAgSW50IGx4LCAgICAgLyogaSAqLworICAgIEludCBybmQxIC8qIGkgKi8KKykKK3sKKyAgICBJbnQgaTsgICAgICAvKiBsb29wIHZhcmlhYmxlICovCisgICAgSW50IG9mZnNldDsKKyAgICBVTG9uZyB3b3JkMSwgd29yZDIsIHdvcmQzLCB3b3JkMTI7CisgICAgSW50IHRtcDsKKyAgICBVTG9uZyBtYXNrOworCisgICAgLyogaW5pdGlhbGl6ZSBvZmZzZXQgdG8gYWRqdXN0IHBpeGVsIGNvdW50ZXIgKi8KKyAgICAvKiAgICB0aGUgbmV4dCByb3c7IGZ1bGwtcGVsIHJlc29sdXRpb24gICAgICAqLworICAgIG9mZnNldCA9IGx4IC0gQl9TSVpFOyAvKiBvZmZzZXQgZm9yIHByZXYgKi8KKworICAgIC8qIEJyYW5jaCBiYXNlZCBvbiBwaXhlbCBsb2NhdGlvbiAoaGFsZi1wZWwgb3IgZnVsbC1wZWwpIGZvciB4IGFuZCB5ICovCisgICAgcmVjIC09IDEyOyAvKiBwcmVzZXQgKi8KKworICAgIHRtcCA9IChVTG9uZylwcmV2ICYgMzsKKyAgICBtYXNrID0gMjU0OworICAgIG1hc2sgfD0gKG1hc2sgPDwgOCk7CisgICAgbWFzayB8PSAobWFzayA8PCAxNik7IC8qIDB4RkVGRUZFRkUgKi8KKworICAgIGlmICh0bXAgPT0gMCkgLyogd29yZC1hbGlnbmVkICovCisgICAgeworICAgICAgICBpZiAocm5kMSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopcHJldik7IC8qIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiA4KTsgLyogMCBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDIgPDwgMjQpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgfCB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDgpOyAvKiAwIGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCAyNCk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMiB8IHdvcmQxMjsKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7ICAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDI7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogcm5kMSA9PSAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKilwcmV2KTsgLyogYjQgYjMgYjIgYjEgKi8KKworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDEgPj4gOCk7IC8qIDAgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQyIDw8IDI0KTsgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxICYgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMiA+PiA4KTsgLyogMCBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDEgPDwgMjQpOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDIgJiB3b3JkMTI7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDIgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQyOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSAvKiBybmQxICovCisgICAgfQorICAgIGVsc2UgaWYgKHRtcCA9PSAxKQorICAgIHsKKyAgICAgICAgcHJldi0tOyAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiMyBiMiBiMSBiMCAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjcgYjYgYjUgYjQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDEgPj4gOCk7IC8qIDAgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTY7IC8qIDAgMCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDIgPDwgMjQpOyAvKiBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMiA8PCAxNik7IC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSB8IHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMiA+PiA4KTsgLyogMCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxNjsgLyogMCAwIGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCAyNCk7IC8qIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgfD0gKHdvcmQxIDw8IDE2KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQyIHwgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDImd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDI7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogcm5kMSA9IDAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiMyBiMiBiMSBiMCAqLworCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiNyBiNiBiNSBiNCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiA4KTsgLyogMCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxNjsgLyogMCAwIGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMiA8PCAyNCk7IC8qIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQyIDw8IDE2KTsgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxICYgd29yZDEyOworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMiA+PiA4KTsgLyogMCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxNjsgLyogMCAwIGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCAyNCk7IC8qIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgfD0gKHdvcmQxIDw8IDE2KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQyICYgd29yZDEyOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDIgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQyOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSAvKiBybmQxICovCisgICAgfQorICAgIGVsc2UgaWYgKHRtcCA9PSAyKQorICAgIHsKKyAgICAgICAgcHJldiAtPSAyOyAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiMiBiMSBiMCBiTjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI2IGI1IGI0IGIzICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQxID4+IDE2KTsgLyogMCAwIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDI0OyAvKiAwIDAgMCBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDIgPDwgMTYpOyAvKiBiNCBiMyBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxIHw9ICh3b3JkMiA8PCA4KTsgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxIHwgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiMTAgYjkgYjggYjcgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDIgPj4gMTYpOyAvKiAwIDAgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMjQ7IC8qIDAgMCAwIGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCAxNik7IC8qIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgfD0gKHdvcmQxIDw8IDgpOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDIgfCB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMjsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogcm5kMSA9PSAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKilwcmV2KTsgLyogYjIgYjEgYjAgYk4xICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiNiBiNSBiNCBiMyAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiAxNik7IC8qIDAgMCBiMiBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAyNDsgLyogMCAwIDAgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQyIDw8IDE2KTsgLyogYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSB8PSAod29yZDIgPDwgOCk7IC8qIGI1IGI0IGIzIGIyICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSAmIHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjEwIGI5IGI4IGI3ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDE2KTsgLyogMCAwIGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPj49IDI0OyAvKiAwIDAgMCBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDEgPDwgMTYpOyAvKiBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyIHw9ICh3b3JkMSA8PCA4KTsgLyogYjkgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQyICYgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDI7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIHRtcCA9IDMgKi8KKyAgICB7CisgICAgICAgIHByZXYgLT0gMzsgLyogd29yZC1hbGlnbmVkICovCisgICAgICAgIGlmIChybmQxID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKilwcmV2KTsgLyogYjEgYjAgYk4xIGJOMiAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYjUgYjQgYjMgYjIgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAod29yZDEgPj4gMjQpOyAvKiAwIDAgMCBiMSAqLworICAgICAgICAgICAgICAgIHdvcmQxMiB8PSAod29yZDIgPDwgOCk7IC8qIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMjsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxIHwgd29yZDEyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDEyCisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMTIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOyAvKiB3cml0ZSA0IHBpeGVscyAqLworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMiA+PiAyNCk7IC8qIDAgMCAwIGI1ICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMSA8PCA4KTsgLyogYjggYjcgYjYgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQxOyAvKiBiOSBiOCBiNyBiNiAqLworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDIgfCB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMjsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKXByZXYpOyAvKiBiMSBiMCBiTjEgYk4yICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICh3b3JkMSA+PiAyNCk7IC8qIDAgMCAwIGIxICovCisgICAgICAgICAgICAgICAgd29yZDEyIHw9ICh3b3JkMiA8PCA4KTsgLyogYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgJiB3b3JkMTI7IC8vIHJuZDEgPSAxOyBvdGhlcndpc2Ugd29yZDMgPSB3b3JkMSZ3b3JkMTIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQxMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDE7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisKKyAgICAgICAgICAgICAgICB3b3JkMSA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDEyID0gKHdvcmQyID4+IDI0KTsgLyogMCAwIDAgYjUgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgfD0gKHdvcmQxIDw8IDgpOyAvKiBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDE7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMiAmIHdvcmQxMjsgLy8gcm5kMSA9IDE7IG90aGVyd2lzZSB3b3JkMyA9IHdvcmQxJndvcmQxMgorICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQyID0gd29yZDIgKyAod29yZDEyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQyOyAvKiB3cml0ZSA0IHBpeGVscyAqLworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ludCBHZXRQcmVkQWR2QnkxeDAoCisgICAgVUNoYXIgKnByZXYsICAgICAgICAvKiBpICovCisgICAgVUNoYXIgKnJlYywgICAgIC8qIGkgKi8KKyAgICBJbnQgbHgsICAgICAvKiBpICovCisgICAgSW50IHJuZDEgLyogaSAqLworKQoreworICAgIEludCBpOyAgICAgIC8qIGxvb3AgdmFyaWFibGUgKi8KKyAgICBJbnQgb2Zmc2V0OworICAgIFVMb25nICB3b3JkMSwgd29yZDIsIHdvcmQzLCB3b3JkMTIsIHdvcmQyMjsKKyAgICBJbnQgdG1wOworICAgIFVMb25nIG1hc2s7CisKKyAgICAvKiBpbml0aWFsaXplIG9mZnNldCB0byBhZGp1c3QgcGl4ZWwgY291bnRlciAqLworICAgIC8qICAgIHRoZSBuZXh0IHJvdzsgZnVsbC1wZWwgcmVzb2x1dGlvbiAgICAgICovCisgICAgb2Zmc2V0ID0gbHggLSBCX1NJWkU7IC8qIG9mZnNldCBmb3IgcHJldiAqLworCisgICAgLyogQnJhbmNoIGJhc2VkIG9uIHBpeGVsIGxvY2F0aW9uIChoYWxmLXBlbCBvciBmdWxsLXBlbCkgZm9yIHggYW5kIHkgKi8KKyAgICByZWMgLT0gMTI7IC8qIHByZXNldCAqLworCisgICAgdG1wID0gKFVMb25nKXByZXYgJiAzOworICAgIG1hc2sgPSAyNTQ7CisgICAgbWFzayB8PSAobWFzayA8PCA4KTsKKyAgICBtYXNrIHw9IChtYXNrIDw8IDE2KTsgLyogMHhGRUZFRkVGRSAqLworCisgICAgaWYgKHRtcCA9PSAwKSAvKiB3b3JkLWFsaWduZWQgKi8KKyAgICB7CisgICAgICAgIHByZXYgLT0gNDsKKyAgICAgICAgaWYgKHJuZDEgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSB8IHdvcmQyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSB8IHdvcmQyOyAvLyBybmQxID0gMTsgb3RoZXJ3aXNlIHdvcmQzID0gd29yZDEmd29yZDIKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvKiBybmQxID0gMCAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxICYgd29yZDI7ICAvKiBybmQxID0gMDsgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxOworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsKKyAgICAgICAgICAgICAgICB3b3JkMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSAmIHdvcmQyOyAgLyogcm5kMSA9IDA7ICovCisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQxOworCisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0bXAgPT0gMSkKKyAgICB7CisgICAgICAgIHByZXYtLTsgLyogd29yZC1hbGlnbmVkICovCisgICAgICAgIGlmIChybmQxID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopcHJldik7IC8qIHJlYWQgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gODsgLyogMCBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA+Pj0gODsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgfCAod29yZDEgPDwgMjQpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9IHdvcmQyMiB8ICh3b3JkMiA8PCAyNCk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMTIgfCB3b3JkMjI7CisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgKyAod29yZDIyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDEyOworCisgICAgICAgICAgICAgICAgd29yZDEyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogcmVhZCBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDg7IC8qIDAgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gODsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxIHwgKHdvcmQxMiA8PCAyNCk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiB8ICh3b3JkMjIgPDwgMjQpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgfCB3b3JkMjsKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHJuZDEgPSAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopcHJldik7IC8qIHJlYWQgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gODsgLyogMCBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA+Pj0gODsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgfCAod29yZDEgPDwgMjQpOyAvKiBiNSBiNCBiMyBiMiAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9IHdvcmQyMiB8ICh3b3JkMiA8PCAyNCk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMTIgJiB3b3JkMjI7CisgICAgICAgICAgICAgICAgd29yZDEyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgKyAod29yZDIyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxMiArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSAxMikpID0gd29yZDEyOworCisgICAgICAgICAgICAgICAgd29yZDEyID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogcmVhZCBiMTIgYjExIGIxMCBiOSAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9ICooKFVMb25nKikocHJldiArIGx4KSk7CisgICAgICAgICAgICAgICAgd29yZDEgPj49IDg7IC8qIDAgYjggYjcgYjYgKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gODsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxIHwgKHdvcmQxMiA8PCAyNCk7IC8qIGI5IGI4IGI3IGI2ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiB8ICh3b3JkMjIgPDwgMjQpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgJiB3b3JkMjsKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICh0bXAgPT0gMikKKyAgICB7CisgICAgICAgIHByZXYgLT0gMjsgLyogd29yZC1hbGlnbmVkICovCisgICAgICAgIGlmIChybmQxID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopcHJldik7IC8qIHJlYWQgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTY7IC8qIDAgMCBiNCBiMyAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA+Pj0gMTY7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyIHwgKHdvcmQxIDw8IDE2KTsgLyogYjYgYjUgYjQgYjMgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSB3b3JkMjIgfCAod29yZDIgPDwgMTYpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEyIHwgd29yZDIyOworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyICsgKHdvcmQyMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxMjsKKworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxNjsgLyogMCAwIGI4IGI3ICovCisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE2OworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgfCAod29yZDEyIDw8IDE2KTsgLyogYjEwIGI5IGI4IGI3ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiB8ICh3b3JkMjIgPDwgMTYpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgfCB3b3JkMjsKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHJuZDEgPSAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopcHJldik7IC8qIHJlYWQgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMTY7IC8qIDAgMCBiNCBiMyAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA+Pj0gMTY7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyIHwgKHdvcmQxIDw8IDE2KTsgLyogYjYgYjUgYjQgYjMgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSB3b3JkMjIgfCAod29yZDIgPDwgMTYpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEyICYgd29yZDIyOworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyICsgKHdvcmQyMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxMjsKKworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxNjsgLyogMCAwIGI4IGI3ICovCisgICAgICAgICAgICAgICAgd29yZDIgPj49IDE2OworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgfCAod29yZDEyIDw8IDE2KTsgLyogYjEwIGI5IGI4IGI3ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiB8ICh3b3JkMjIgPDwgMTYpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEgJiB3b3JkMjsKKyAgICAgICAgICAgICAgICB3b3JkMSAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDMgJj0gKH5tYXNrKTsgLyogMHgxMDEwMTAxLCBjaGVjayBsYXN0IGJpdCAqLworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgKyAod29yZDIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0gd29yZDE7CisgICAgICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogdG1wID09IDMgKi8KKyAgICB7CisgICAgICAgIHByZXYgLT0gMzsgLyogd29yZC1hbGlnbmVkICovCisgICAgICAgIGlmIChybmQxID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IEJfU0laRTsgaSA+IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopcHJldik7IC8qIHJlYWQgYjQgYjMgYjIgYjEgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworCisgICAgICAgICAgICAgICAgd29yZDEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGI4IGI3IGI2IGI1ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxMiA+Pj0gMjQ7IC8qIDAgMCAwIGI0ICovCisgICAgICAgICAgICAgICAgd29yZDIyID4+PSAyNDsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSB3b3JkMTIgfCAod29yZDEgPDwgOCk7IC8qIGI3IGI2IGI1IGI0ICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gd29yZDIyIHwgKHdvcmQyIDw8IDgpOworICAgICAgICAgICAgICAgIHdvcmQzID0gd29yZDEyIHwgd29yZDIyOworICAgICAgICAgICAgICAgIHdvcmQxMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQyMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMTIgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyICsgKHdvcmQyMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgKz0gd29yZDM7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gMTIpKSA9IHdvcmQxMjsKKworICAgICAgICAgICAgICAgIHdvcmQxMiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIHJlYWQgYjEyIGIxMSBiMTAgYjkgKi8KKyAgICAgICAgICAgICAgICB3b3JkMjIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOworICAgICAgICAgICAgICAgIHdvcmQxID4+PSAyNDsgLyogMCAwIDAgYjggKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA+Pj0gMjQ7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSB8ICh3b3JkMTIgPDwgOCk7IC8qIGIxMSBiMTAgYjkgYjggKi8KKyAgICAgICAgICAgICAgICB3b3JkMiA9IHdvcmQyIHwgKHdvcmQyMiA8PCA4KTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxIHwgd29yZDI7CisgICAgICAgICAgICAgICAgd29yZDEgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMiAmPSBtYXNrOworICAgICAgICAgICAgICAgIHdvcmQzICY9ICh+bWFzayk7IC8qIDB4MTAxMDEwMSwgY2hlY2sgbGFzdCBiaXQgKi8KKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB3b3JkMSA9IHdvcmQxICsgKHdvcmQyID4+IDEpOworICAgICAgICAgICAgICAgIHdvcmQxICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHdvcmQxOworICAgICAgICAgICAgICAgIHByZXYgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBybmQxID0gMCAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd29yZDEyID0gKigoVUxvbmcqKXByZXYpOyAvKiByZWFkIGI0IGIzIGIyIGIxICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKworICAgICAgICAgICAgICAgIHdvcmQxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogcmVhZCBiOCBiNyBiNiBiNSAqLworICAgICAgICAgICAgICAgIHdvcmQyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMTIgPj49IDI0OyAvKiAwIDAgMCBiNCAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA+Pj0gMjQ7CisgICAgICAgICAgICAgICAgd29yZDEyID0gd29yZDEyIHwgKHdvcmQxIDw8IDgpOyAvKiBiNyBiNiBiNSBiNCAqLworICAgICAgICAgICAgICAgIHdvcmQyMiA9IHdvcmQyMiB8ICh3b3JkMiA8PCA4KTsKKyAgICAgICAgICAgICAgICB3b3JkMyA9IHdvcmQxMiAmIHdvcmQyMjsKKyAgICAgICAgICAgICAgICB3b3JkMTIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMjIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEyID4+PSAxOworICAgICAgICAgICAgICAgIHdvcmQxMiA9IHdvcmQxMiArICh3b3JkMjIgPj4gMSk7CisgICAgICAgICAgICAgICAgd29yZDEyICs9IHdvcmQzOworICAgICAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDEyKSkgPSB3b3JkMTI7CisKKyAgICAgICAgICAgICAgICB3b3JkMTIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiByZWFkIGIxMiBiMTEgYjEwIGI5ICovCisgICAgICAgICAgICAgICAgd29yZDIyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsKKyAgICAgICAgICAgICAgICB3b3JkMSA+Pj0gMjQ7IC8qIDAgMCAwIGI4ICovCisgICAgICAgICAgICAgICAgd29yZDIgPj49IDI0OworICAgICAgICAgICAgICAgIHdvcmQxID0gd29yZDEgfCAod29yZDEyIDw8IDgpOyAvKiBiMTEgYjEwIGI5IGI4ICovCisgICAgICAgICAgICAgICAgd29yZDIgPSB3b3JkMiB8ICh3b3JkMjIgPDwgOCk7CisgICAgICAgICAgICAgICAgd29yZDMgPSB3b3JkMSAmIHdvcmQyOworICAgICAgICAgICAgICAgIHdvcmQxICY9IG1hc2s7CisgICAgICAgICAgICAgICAgd29yZDIgJj0gbWFzazsKKyAgICAgICAgICAgICAgICB3b3JkMyAmPSAofm1hc2spOyAvKiAweDEwMTAxMDEsIGNoZWNrIGxhc3QgYml0ICovCisgICAgICAgICAgICAgICAgd29yZDEgPj49IDE7CisgICAgICAgICAgICAgICAgd29yZDEgPSB3b3JkMSArICh3b3JkMiA+PiAxKTsKKyAgICAgICAgICAgICAgICB3b3JkMSArPSB3b3JkMzsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB3b3JkMTsKKyAgICAgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IC8qIHJuZCAqLworICAgIH0gLyogdG1wICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSW50IEdldFByZWRBZHZCeTF4MSgKKyAgICBVQ2hhciAqcHJldiwgICAgICAgIC8qIGkgKi8KKyAgICBVQ2hhciAqcmVjLCAgICAgLyogaSAqLworICAgIEludCBseCwgICAgIC8qIGkgKi8KKyAgICBJbnQgcm5kMSAvKiBpICovCispCit7CisgICAgSW50IGk7ICAgICAgLyogbG9vcCB2YXJpYWJsZSAqLworICAgIEludCBvZmZzZXQ7CisgICAgVUxvbmcgIHgxLCB4MiwgeDFtLCB4Mm0sIHkxLCB5MiwgeTFtLCB5Mm07IC8qIG5ldyB3YXkgKi8KKyAgICBJbnQgdG1wOworICAgIEludCBybmQyOworICAgIFVMb25nIG1hc2s7CisKKyAgICAvKiBpbml0aWFsaXplIG9mZnNldCB0byBhZGp1c3QgcGl4ZWwgY291bnRlciAqLworICAgIC8qICAgIHRoZSBuZXh0IHJvdzsgZnVsbC1wZWwgcmVzb2x1dGlvbiAgICAgICovCisgICAgb2Zmc2V0ID0gbHggLSBCX1NJWkU7IC8qIG9mZnNldCBmb3IgcHJldiAqLworCisgICAgcm5kMiA9IHJuZDEgKyAxOworICAgIHJuZDIgfD0gKHJuZDIgPDwgOCk7CisgICAgcm5kMiB8PSAocm5kMiA8PCAxNik7CisKKyAgICBtYXNrID0gMHgzRjsKKyAgICBtYXNrIHw9IChtYXNrIDw8IDgpOworICAgIG1hc2sgfD0gKG1hc2sgPDwgMTYpOyAvKiAweDNmM2YzZjNmICovCisKKyAgICB0bXAgPSAoVUxvbmcpcHJldiAmIDM7CisKKyAgICByZWMgLT0gNDsgLyogcHJlc2V0ICovCisKKyAgICBpZiAodG1wID09IDApIC8qIHdvcmQtYWxpZ25lZCAqLworICAgIHsKKyAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB4MSA9ICooKFVMb25nKilwcmV2KTsgLyogbG9hZCBhMyBhMiBhMSBhMCAqLworICAgICAgICAgICAgeDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBsb2FkIGIzIGIyIGIxIGIwLCBhbm90aGVyIGxpbmUgKi8KKyAgICAgICAgICAgIHkxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYTcgYTYgYTUgYTQgKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjcgYjYgYjUgYjQgKi8KKworICAgICAgICAgICAgeDFtID0gKHgxID4+IDIpICYgbWFzazsgLyogemVybyBvdXQgbGFzdCAyIGJpdHMgKi8KKyAgICAgICAgICAgIHgybSA9ICh4MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MSA9IHgxIF4oeDFtIDw8IDIpOworICAgICAgICAgICAgeDIgPSB4MiBeKHgybSA8PCAyKTsKKyAgICAgICAgICAgIHgxbSArPSB4Mm07CisgICAgICAgICAgICB4MSArPSB4MjsKKworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB5MW0gPSAoeTEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeTJtID0gKHkyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkxID0geTEgXih5MW0gPDwgMik7CisgICAgICAgICAgICB5MiA9IHkyIF4oeTJtIDw8IDIpOworICAgICAgICAgICAgeTFtICs9IHkybTsKKyAgICAgICAgICAgIHkxICs9IHkyOworCisgICAgICAgICAgICAvKiB5Mm0sIHkyIGZyZWUgKi8KKyAgICAgICAgICAgIC8qIHgybSwgeDIgZnJlZSAqLworICAgICAgICAgICAgeDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhMTEgYTEwIGE5IGE4ICovCisgICAgICAgICAgICB5MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGIxMSBiMTAgYjkgYjggKi8KKyAgICAgICAgICAgIHgybSA9ICh4MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeDIgPSB4MiBeKHgybSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB4Mm0gKz0geTJtOworICAgICAgICAgICAgeDIgKz0geTI7CisgICAgICAgICAgICAvKiB5Mm0sIHkyIGZyZWUgKi8KKworICAgICAgICAgICAgLyogbm93IG9wZXJhdGUgb24geDFtLCB4MSwgeTFtLCB5MSwgeDJtLCB4MiAqLworICAgICAgICAgICAgLyogeDFtID0gYTMrYjMsIGEyK2IyLCBhMStiMSwgYTArYjAgKi8KKyAgICAgICAgICAgIC8qIHkxbSA9IGE3K2I3LCBhNitiNiwgYTUrYjUsIGE0K2I0ICovCisgICAgICAgICAgICAvKiB4Mm0gPSBhMTErYjExLCBhMTArYjEwLCBhOStiOSwgYTgrYjggKi8KKyAgICAgICAgICAgIC8qIHgxLCB5MSwgeDIgKi8KKworICAgICAgICAgICAgeTJtID0geDFtID4+IDg7CisgICAgICAgICAgICB5MiA9IHgxID4+IDg7CisgICAgICAgICAgICB5Mm0gfD0gKHkxbSA8PCAyNCk7ICAvKiBhNCtiNCwgYTMrYjMsIGEyK2IyLCBhMStiMSAqLworICAgICAgICAgICAgeTIgfD0gKHkxIDw8IDI0KTsKKyAgICAgICAgICAgIHgxbSArPSB5Mm07ICAvKiBhMytiMythNCtiNCwgLi4uLi4sIGEwK2IwK2ExK2IxICovCisgICAgICAgICAgICB4MSArPSB5MjsKKyAgICAgICAgICAgIHgxICs9IHJuZDI7CisgICAgICAgICAgICB4MSAmPSAobWFzayA8PCAyKTsKKyAgICAgICAgICAgIHgxbSArPSAoeDEgPj4gMik7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB4MW07IC8qIHNhdmUgeDFtICovCisKKyAgICAgICAgICAgIHkybSA9IHkxbSA+PiA4OworICAgICAgICAgICAgeTIgPSB5MSA+PiA4OworICAgICAgICAgICAgeTJtIHw9ICh4Mm0gPDwgMjQpOyAvKiBhOCtiOCwgYTcrYjcsIGE2K2I2LCBhNStiNSAqLworICAgICAgICAgICAgeTIgfD0gKHgyIDw8IDI0KTsKKyAgICAgICAgICAgIHkxbSArPSB5Mm07ICAvKiBhNytiNythOCtiOCwgLi4uLi4sIGE0K2I0K2E1K2I1ICovCisgICAgICAgICAgICB5MSArPSB5MjsKKyAgICAgICAgICAgIHkxICs9IHJuZDI7CisgICAgICAgICAgICB5MSAmPSAobWFzayA8PCAyKTsKKyAgICAgICAgICAgIHkxbSArPSAoeTEgPj4gMik7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB5MW07IC8qIHNhdmUgeTFtICovCisKKyAgICAgICAgICAgIHJlYyArPSA4OworICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAodG1wID09IDEpCisgICAgeworICAgICAgICBwcmV2LS07IC8qIHRvIHdvcmQtYWxpZ25lZCAqLworICAgICAgICBmb3IgKGkgPSBCX1NJWkU7IGkgPiAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHgxID0gKigoVUxvbmcqKXByZXYpOyAvKiBsb2FkIGEzIGEyIGExIGEwICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGxvYWQgYjMgYjIgYjEgYjAsIGFub3RoZXIgbGluZSAqLworICAgICAgICAgICAgeTEgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhNyBhNiBhNSBhNCAqLworICAgICAgICAgICAgeTIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBiNyBiNiBiNSBiNCAqLworCisgICAgICAgICAgICB4MW0gPSAoeDEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHgxID0geDEgXih4MW0gPDwgMik7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeDFtICs9IHgybTsKKyAgICAgICAgICAgIHgxICs9IHgyOworCisgICAgICAgICAgICAvKiB4Mm0sIHgyIGZyZWUgKi8KKyAgICAgICAgICAgIHkxbSA9ICh5MSA+PiAyKSAmIG1hc2s7IC8qIHplcm8gb3V0IGxhc3QgMiBiaXRzICovCisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeTEgPSB5MSBeKHkxbSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB5MW0gKz0geTJtOworICAgICAgICAgICAgeTEgKz0geTI7CisKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB4MiA9ICooKFVMb25nKikocHJldiArPSA0KSk7IC8qIGExMSBhMTAgYTkgYTggKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjExIGIxMCBiOSBiOCAqLworICAgICAgICAgICAgeDJtID0gKHgyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkybSA9ICh5MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MiA9IHgyIF4oeDJtIDw8IDIpOworICAgICAgICAgICAgeTIgPSB5MiBeKHkybSA8PCAyKTsKKyAgICAgICAgICAgIHgybSArPSB5Mm07CisgICAgICAgICAgICB4MiArPSB5MjsKKyAgICAgICAgICAgIC8qIHkybSwgeTIgZnJlZSAqLworCisgICAgICAgICAgICAvKiBub3cgb3BlcmF0ZSBvbiB4MW0sIHgxLCB5MW0sIHkxLCB4Mm0sIHgyICovCisgICAgICAgICAgICAvKiB4MW0gPSBhMytiMywgYTIrYjIsIGExK2IxLCBhMCtiMCAqLworICAgICAgICAgICAgLyogeTFtID0gYTcrYjcsIGE2K2I2LCBhNStiNSwgYTQrYjQgKi8KKyAgICAgICAgICAgIC8qIHgybSA9IGExMStiMTEsIGExMCtiMTAsIGE5K2I5LCBhOCtiOCAqLworICAgICAgICAgICAgLyogeDEsIHkxLCB4MiAqLworCisgICAgICAgICAgICB4MW0gPj49IDggOworICAgICAgICAgICAgeDEgPj49IDg7CisgICAgICAgICAgICB4MW0gfD0gKHkxbSA8PCAyNCk7ICAvKiBhNCtiNCwgYTMrYjMsIGEyK2IyLCBhMStiMSAqLworICAgICAgICAgICAgeDEgfD0gKHkxIDw8IDI0KTsKKyAgICAgICAgICAgIHkybSA9ICh5MW0gPDwgMTYpOworICAgICAgICAgICAgeTIgPSAoeTEgPDwgMTYpOworICAgICAgICAgICAgeTJtIHw9ICh4MW0gPj4gOCk7IC8qIGE1K2I1LCBhNCtiNCwgYTMrYjMsIGEyK2IyICovCisgICAgICAgICAgICB5MiB8PSAoeDEgPj4gOCk7CisgICAgICAgICAgICB4MSArPSBybmQyOworICAgICAgICAgICAgeDFtICs9IHkybTsgIC8qIGE0K2I0K2E1K2I1LCAuLi4uLiwgYTErYjErYTIrYjIgKi8KKyAgICAgICAgICAgIHgxICs9IHkyOworICAgICAgICAgICAgeDEgJj0gKG1hc2sgPDwgMik7CisgICAgICAgICAgICB4MW0gKz0gKHgxID4+IDIpOworICAgICAgICAgICAgKigoVUxvbmcqKShyZWMgKz0gNCkpID0geDFtOyAvKiBzYXZlIHgxbSAqLworCisgICAgICAgICAgICB5MW0gPj49IDg7CisgICAgICAgICAgICB5MSA+Pj0gODsKKyAgICAgICAgICAgIHkxbSB8PSAoeDJtIDw8IDI0KTsgLyogYTgrYjgsIGE3K2I3LCBhNitiNiwgYTUrYjUgKi8KKyAgICAgICAgICAgIHkxIHw9ICh4MiA8PCAyNCk7CisgICAgICAgICAgICB5Mm0gPSAoeDJtIDw8IDE2KTsKKyAgICAgICAgICAgIHkyID0gKHgyIDw8IDE2KTsKKyAgICAgICAgICAgIHkybSB8PSAoeTFtID4+IDgpOyAvKiAgYTkrYjksIGE4K2I4LCBhNytiNywgYTYrYjYsKi8KKyAgICAgICAgICAgIHkyIHw9ICh5MSA+PiA4KTsKKyAgICAgICAgICAgIHkxICs9IHJuZDI7CisgICAgICAgICAgICB5MW0gKz0geTJtOyAgLyogYTgrYjgrYTkrYjksIC4uLi4uLCBhNStiNSthNitiNiAqLworICAgICAgICAgICAgeTEgKz0geTI7CisgICAgICAgICAgICB5MSAmPSAobWFzayA8PCAyKTsKKyAgICAgICAgICAgIHkxbSArPSAoeTEgPj4gMik7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB5MW07IC8qIHNhdmUgeTFtICovCisKKyAgICAgICAgICAgIHJlYyArPSA4OworICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKHRtcCA9PSAyKQorICAgIHsKKyAgICAgICAgcHJldiAtPSAyOyAvKiB0byB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB4MSA9ICooKFVMb25nKilwcmV2KTsgLyogbG9hZCBhMyBhMiBhMSBhMCAqLworICAgICAgICAgICAgeDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBsb2FkIGIzIGIyIGIxIGIwLCBhbm90aGVyIGxpbmUgKi8KKyAgICAgICAgICAgIHkxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYTcgYTYgYTUgYTQgKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjcgYjYgYjUgYjQgKi8KKworICAgICAgICAgICAgeDFtID0gKHgxID4+IDIpICYgbWFzazsgLyogemVybyBvdXQgbGFzdCAyIGJpdHMgKi8KKyAgICAgICAgICAgIHgybSA9ICh4MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MSA9IHgxIF4oeDFtIDw8IDIpOworICAgICAgICAgICAgeDIgPSB4MiBeKHgybSA8PCAyKTsKKyAgICAgICAgICAgIHgxbSArPSB4Mm07CisgICAgICAgICAgICB4MSArPSB4MjsKKworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB5MW0gPSAoeTEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeTJtID0gKHkyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkxID0geTEgXih5MW0gPDwgMik7CisgICAgICAgICAgICB5MiA9IHkyIF4oeTJtIDw8IDIpOworICAgICAgICAgICAgeTFtICs9IHkybTsKKyAgICAgICAgICAgIHkxICs9IHkyOworCisgICAgICAgICAgICAvKiB5Mm0sIHkyIGZyZWUgKi8KKyAgICAgICAgICAgIC8qIHgybSwgeDIgZnJlZSAqLworICAgICAgICAgICAgeDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhMTEgYTEwIGE5IGE4ICovCisgICAgICAgICAgICB5MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGIxMSBiMTAgYjkgYjggKi8KKyAgICAgICAgICAgIHgybSA9ICh4MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeDIgPSB4MiBeKHgybSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB4Mm0gKz0geTJtOworICAgICAgICAgICAgeDIgKz0geTI7CisgICAgICAgICAgICAvKiB5Mm0sIHkyIGZyZWUgKi8KKworICAgICAgICAgICAgLyogbm93IG9wZXJhdGUgb24geDFtLCB4MSwgeTFtLCB5MSwgeDJtLCB4MiAqLworICAgICAgICAgICAgLyogeDFtID0gYTMrYjMsIGEyK2IyLCBhMStiMSwgYTArYjAgKi8KKyAgICAgICAgICAgIC8qIHkxbSA9IGE3K2I3LCBhNitiNiwgYTUrYjUsIGE0K2I0ICovCisgICAgICAgICAgICAvKiB4Mm0gPSBhMTErYjExLCBhMTArYjEwLCBhOStiOSwgYTgrYjggKi8KKyAgICAgICAgICAgIC8qIHgxLCB5MSwgeDIgKi8KKworICAgICAgICAgICAgeDFtID4+PSAxNiA7CisgICAgICAgICAgICB4MSA+Pj0gMTY7CisgICAgICAgICAgICB4MW0gfD0gKHkxbSA8PCAxNik7ICAvKiBhNStiNSwgYTQrYjQsIGEzK2IzLCBhMitiMiAqLworICAgICAgICAgICAgeDEgfD0gKHkxIDw8IDE2KTsKKyAgICAgICAgICAgIHkybSA9ICh5MW0gPDwgOCk7CisgICAgICAgICAgICB5MiA9ICh5MSA8PCA4KTsKKyAgICAgICAgICAgIHkybSB8PSAoeDFtID4+IDgpOyAvKiBhNitiNiwgYTUrYjUsIGE0K2I0LCBhMytiMyAqLworICAgICAgICAgICAgeTIgfD0gKHgxID4+IDgpOworICAgICAgICAgICAgeDEgKz0gcm5kMjsKKyAgICAgICAgICAgIHgxbSArPSB5Mm07ICAvKiBhNStiNSthNitiNiwgLi4uLi4sIGEyK2IyK2EzK2IzICovCisgICAgICAgICAgICB4MSArPSB5MjsKKyAgICAgICAgICAgIHgxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeDFtICs9ICh4MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHgxbTsgLyogc2F2ZSB4MW0gKi8KKworICAgICAgICAgICAgeTFtID4+PSAxNjsKKyAgICAgICAgICAgIHkxID4+PSAxNjsKKyAgICAgICAgICAgIHkxbSB8PSAoeDJtIDw8IDE2KTsgLyogYTkrYjksIGE4K2I4LCBhNytiNywgYTYrYjYgKi8KKyAgICAgICAgICAgIHkxIHw9ICh4MiA8PCAxNik7CisgICAgICAgICAgICB5Mm0gPSAoeDJtIDw8IDgpOworICAgICAgICAgICAgeTIgPSAoeDIgPDwgOCk7CisgICAgICAgICAgICB5Mm0gfD0gKHkxbSA+PiA4KTsgLyogIGExMCtiMTAsIGE5K2I5LCBhOCtiOCwgYTcrYjcsKi8KKyAgICAgICAgICAgIHkyIHw9ICh5MSA+PiA4KTsKKyAgICAgICAgICAgIHkxICs9IHJuZDI7CisgICAgICAgICAgICB5MW0gKz0geTJtOyAgLyogYTkrYjkrYTEwK2IxMCwgLi4uLi4sIGE2K2I2K2E3K2I3ICovCisgICAgICAgICAgICB5MSArPSB5MjsKKyAgICAgICAgICAgIHkxICY9IChtYXNrIDw8IDIpOworICAgICAgICAgICAgeTFtICs9ICh5MSA+PiAyKTsKKyAgICAgICAgICAgICooKFVMb25nKikocmVjICs9IDQpKSA9IHkxbTsgLyogc2F2ZSB5MW0gKi8KKworICAgICAgICAgICAgcmVjICs9IDg7CisgICAgICAgICAgICBwcmV2ICs9IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSAvKiB0bXAgPT0gMyAqLworICAgIHsKKyAgICAgICAgcHJldiAtPSAzOyAvKiB0byB3b3JkLWFsaWduZWQgKi8KKyAgICAgICAgZm9yIChpID0gQl9TSVpFOyBpID4gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICB4MSA9ICooKFVMb25nKilwcmV2KTsgLyogbG9hZCBhMyBhMiBhMSBhMCAqLworICAgICAgICAgICAgeDIgPSAqKChVTG9uZyopKHByZXYgKyBseCkpOyAvKiBsb2FkIGIzIGIyIGIxIGIwLCBhbm90aGVyIGxpbmUgKi8KKyAgICAgICAgICAgIHkxID0gKigoVUxvbmcqKShwcmV2ICs9IDQpKTsgLyogYTcgYTYgYTUgYTQgKi8KKyAgICAgICAgICAgIHkyID0gKigoVUxvbmcqKShwcmV2ICsgbHgpKTsgLyogYjcgYjYgYjUgYjQgKi8KKworICAgICAgICAgICAgeDFtID0gKHgxID4+IDIpICYgbWFzazsgLyogemVybyBvdXQgbGFzdCAyIGJpdHMgKi8KKyAgICAgICAgICAgIHgybSA9ICh4MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB4MSA9IHgxIF4oeDFtIDw8IDIpOworICAgICAgICAgICAgeDIgPSB4MiBeKHgybSA8PCAyKTsKKyAgICAgICAgICAgIHgxbSArPSB4Mm07CisgICAgICAgICAgICB4MSArPSB4MjsKKworICAgICAgICAgICAgLyogeDJtLCB4MiBmcmVlICovCisgICAgICAgICAgICB5MW0gPSAoeTEgPj4gMikgJiBtYXNrOyAvKiB6ZXJvIG91dCBsYXN0IDIgYml0cyAqLworICAgICAgICAgICAgeTJtID0gKHkyID4+IDIpICYgbWFzazsKKyAgICAgICAgICAgIHkxID0geTEgXih5MW0gPDwgMik7CisgICAgICAgICAgICB5MiA9IHkyIF4oeTJtIDw8IDIpOworICAgICAgICAgICAgeTFtICs9IHkybTsKKyAgICAgICAgICAgIHkxICs9IHkyOworCisgICAgICAgICAgICAvKiB5Mm0sIHkyIGZyZWUgKi8KKyAgICAgICAgICAgIC8qIHgybSwgeDIgZnJlZSAqLworICAgICAgICAgICAgeDIgPSAqKChVTG9uZyopKHByZXYgKz0gNCkpOyAvKiBhMTEgYTEwIGE5IGE4ICovCisgICAgICAgICAgICB5MiA9ICooKFVMb25nKikocHJldiArIGx4KSk7IC8qIGIxMSBiMTAgYjkgYjggKi8KKyAgICAgICAgICAgIHgybSA9ICh4MiA+PiAyKSAmIG1hc2s7CisgICAgICAgICAgICB5Mm0gPSAoeTIgPj4gMikgJiBtYXNrOworICAgICAgICAgICAgeDIgPSB4MiBeKHgybSA8PCAyKTsKKyAgICAgICAgICAgIHkyID0geTIgXih5Mm0gPDwgMik7CisgICAgICAgICAgICB4Mm0gKz0geTJtOworICAgICAgICAgICAgeDIgKz0geTI7CisgICAgICAgICAgICAvKiB5Mm0sIHkyIGZyZWUgKi8KKworICAgICAgICAgICAgLyogbm93IG9wZXJhdGUgb24geDFtLCB4MSwgeTFtLCB5MSwgeDJtLCB4MiAqLworICAgICAgICAgICAgLyogeDFtID0gYTMrYjMsIGEyK2IyLCBhMStiMSwgYTArYjAgKi8KKyAgICAgICAgICAgIC8qIHkxbSA9IGE3K2I3LCBhNitiNiwgYTUrYjUsIGE0K2I0ICovCisgICAgICAgICAgICAvKiB4Mm0gPSBhMTErYjExLCBhMTArYjEwLCBhOStiOSwgYTgrYjggKi8KKyAgICAgICAgICAgIC8qIHgxLCB5MSwgeDIgKi8KKworICAgICAgICAgICAgeDFtID4+PSAyNCA7CisgICAgICAgICAgICB4MSA+Pj0gMjQ7CisgICAgICAgICAgICB4MW0gfD0gKHkxbSA8PCA4KTsgIC8qIGE2K2I2LCBhNStiNSwgYTQrYjQsIGEzK2IzICovCisgICAgICAgICAgICB4MSB8PSAoeTEgPDwgOCk7CisKKyAgICAgICAgICAgIHgxbSArPSB5MW07ICAvKiBhNitiNithNytiNywgLi4uLi4sIGEzK2IzK2E0K2I0ICovCisgICAgICAgICAgICB4MSArPSB5MTsKKyAgICAgICAgICAgIHgxICs9IHJuZDI7CisgICAgICAgICAgICB4MSAmPSAobWFzayA8PCAyKTsKKyAgICAgICAgICAgIHgxbSArPSAoeDEgPj4gMik7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB4MW07IC8qIHNhdmUgeDFtICovCisKKyAgICAgICAgICAgIHkxbSA+Pj0gMjQ7CisgICAgICAgICAgICB5MSA+Pj0gMjQ7CisgICAgICAgICAgICB5MW0gfD0gKHgybSA8PCA4KTsgLyogYTEwK2IxMCwgYTkrYjksIGE4K2I4LCBhNytiNyAqLworICAgICAgICAgICAgeTEgfD0gKHgyIDw8IDgpOworICAgICAgICAgICAgeTFtICs9IHgybTsgIC8qIGExMCtiMTArYTExK2IxMSwgLi4uLi4sIGE3K2I3K2E4K2I4ICovCisgICAgICAgICAgICB5MSArPSB4MjsKKyAgICAgICAgICAgIHkxICs9IHJuZDI7CisgICAgICAgICAgICB5MSAmPSAobWFzayA8PCAyKTsKKyAgICAgICAgICAgIHkxbSArPSAoeTEgPj4gMik7CisgICAgICAgICAgICAqKChVTG9uZyopKHJlYyArPSA0KSkgPSB5MW07IC8qIHNhdmUgeTFtICovCisKKyAgICAgICAgICAgIHJlYyArPSA4OworICAgICAgICAgICAgcHJldiArPSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBFbmNHZXRQcmVkT3V0c2lkZQorICAgIERhdGU6ICAgICAgIDA0LzE3LzIwMDEKKyAgICBQdXJwb3NlOiAgICAtIG1vZGlmaWVkIGZyb20gR2V0UHJlZE91dHNpZGUgaW4gdGhlIGRlY29kZXIuCisgICAgTW9kaWZpZWQ6ICAgIDA5LzI0LzA1CisgICAgICAgICAgICAgICAgdXNlIHRoZSBleGlzdGluZyBub24taW5pdGlhbGl6ZWQgcGFkZGVkIHJlZ2lvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8gbm90IHJlYWxseSBuZWVkZWQgc2luY2UgcGFkZGluZyBpcyBpbmNsdWRlZAorI2RlZmluZSBQQURfQ09STkVSICB7IHRlbXAgPSAqc3JjOyBcCisgICAgICAgICAgICAgICAgICAgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgXAorICAgICAgICAgICAgICAgICAgICAgdGVtcCB8PSAodGVtcDw8MTYpOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopZHN0KSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgfQorCisjZGVmaW5lIFBBRF9ST1cgICAgIHsgdGVtcCA9ICooKFVMb25nKilzcmMpOyBcCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSAqKChVTG9uZyopKHNyYys0KSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopZHN0KSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wMjsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wMjsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXAyOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wMjsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXAyOyB9CisKKyNkZWZpbmUgUEFEX0NPTCAgICAgeyB0ZW1wID0gKnNyYzsgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgIHRlbXAgfD0gKHRlbXA8PDE2KTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKilkc3QpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAqKHNyYys9bHgpOyAgICAgdGVtcCB8PSAodGVtcDw8OCk7ICB0ZW1wIHw9ICh0ZW1wPDwxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKihzcmMrPWx4KTsgICAgIHRlbXAgfD0gKHRlbXA8PDgpOyAgdGVtcCB8PSAodGVtcDw8MTYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICooc3JjKz1seCk7ICAgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgIHRlbXAgfD0gKHRlbXA8PDE2KTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAqKHNyYys9bHgpOyAgICAgdGVtcCB8PSAodGVtcDw8OCk7ICB0ZW1wIHw9ICh0ZW1wPDwxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0KzQpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKihzcmMrPWx4KTsgICAgIHRlbXAgfD0gKHRlbXA8PDgpOyAgdGVtcCB8PSAodGVtcDw8MTYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrPWx4KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyBcCisgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9ICooc3JjKz1seCk7ICAgICB0ZW1wIHw9ICh0ZW1wPDw4KTsgIHRlbXAgfD0gKHRlbXA8PDE2KTsgXAorICAgICAgICAgICAgICAgICAgICAgICooKFVMb25nKikoZHN0Kz1seCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QrNCkpID0gdGVtcDsgXAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAqKHNyYys9bHgpOyAgICAgdGVtcCB8PSAodGVtcDw8OCk7ICB0ZW1wIHw9ICh0ZW1wPDwxNik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs9bHgpKSA9IHRlbXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCs0KSkgPSB0ZW1wOyB9CisKKworSW50IEVuY0dldFByZWRPdXRzaWRlKEludCB4cG9zLCBJbnQgeXBvcywgVUNoYXIgKmNfcHJldiwgVUNoYXIgKnJlYywKKyAgICAgICAgICAgICAgICAgICAgICBJbnQgd2lkdGgsIEludCBoZWlnaHQsIEludCBybmQxKQoreworICAgIEludCBseDsKKyAgICBVQ2hhciAqc3JjLCAqZHN0OworICAgIFVMb25nIHRlbXAsIHRlbXAyOworICAgIEludCB4b2Zmc2V0OworCisgICAgbHggPSB3aWR0aCArIDE2OyAvKiBvbmx5IHdvcmtzIGZvciBjaHJvbWEgKi8KKworICAgIGlmICh4cG9zIDwgMCkKKyAgICB7CisgICAgICAgIGlmICh5cG9zIDwgMCkgLyogcGFkIHRvcC1sZWZ0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHBhZCBjb3JuZXIgKi8KKyAgICAgICAgICAgIHNyYyA9IGNfcHJldjsKKyAgICAgICAgICAgIGRzdCA9IGNfcHJldiAtIChseCA8PCAzKSAtIDg7CisgICAgICAgICAgICBQQURfQ09STkVSCisKKyAgICAgICAgICAgIC8qIHBhZCB0b3AgKi8KKyAgICAgICAgICAgIGRzdCA9IGNfcHJldiAtIChseCA8PCAzKTsKKyAgICAgICAgICAgIFBBRF9ST1cKKworICAgICAgICAgICAgLyogcGFkIGxlZnQgKi8KKyAgICAgICAgICAgIGRzdCA9IGNfcHJldiAtIDg7CisgICAgICAgICAgICBQQURfQ09MCisKKyAgICAgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXBvcyYxXVt4cG9zJjFdKGNfcHJldiArICh4cG9zID4+IDEpICsgKCh5cG9zID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYywgbHgsIHJuZDEpOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoeXBvcyA+PiAxKSA8IChoZWlnaHQgLSA4KSkgLyogcGFkIGxlZnQgb2YgZnJhbWUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogcGFkIGxlZnQgKi8KKyAgICAgICAgICAgIHNyYyA9IGNfcHJldiArICh5cG9zID4+IDEpICogbHg7CisgICAgICAgICAgICBkc3QgPSBzcmMgLSA4OworICAgICAgICAgICAgUEFEX0NPTAorICAgICAgICAgICAgLyogcGFkIGV4dHJhIHJvdyAqLworICAgICAgICAgICAgdGVtcCA9ICooc3JjICs9IGx4KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgOCk7CisgICAgICAgICAgICB0ZW1wIHw9ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKyA0KSkgPSB0ZW1wOworCisgICAgICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwb3MmMV1beHBvcyYxXShjX3ByZXYgKyAoeHBvcyA+PiAxKSArICgoeXBvcyA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWMsIGx4LCBybmQxKTsKKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBwYWQgYm90dG9tLWxlZnQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogcGFkIGNvcm5lciAqLworICAgICAgICAgICAgc3JjID0gY19wcmV2ICsgKGhlaWdodCAtIDEpICogbHg7CisgICAgICAgICAgICBkc3QgPSBzcmMgKyBseCAtIDg7CisgICAgICAgICAgICBQQURfQ09STkVSCisKKyAgICAgICAgICAgIC8qIHBhZCBib3R0b20gKi8KKyAgICAgICAgICAgIGRzdCA9IHNyYyArIGx4OworICAgICAgICAgICAgUEFEX1JPVworCisgICAgICAgICAgICAvKiBwYWQgbGVmdCAqLworICAgICAgICAgICAgc3JjIC09IChseCA8PCAzKTsKKyAgICAgICAgICAgIHNyYyArPSBseDsKKyAgICAgICAgICAgIGRzdCA9IHNyYyAtIDg7CisgICAgICAgICAgICBQQURfQ09MCisKKyAgICAgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXBvcyYxXVt4cG9zJjFdKGNfcHJldiArICh4cG9zID4+IDEpICsgKCh5cG9zID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYywgbHgsIHJuZDEpOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoeHBvcyA+PiAxKSA8ICh3aWR0aCAtIDgpKQorICAgIHsKKyAgICAgICAgaWYgKHlwb3MgPCAwKSAvKiBwYWQgdG9wIG9mIGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHhvZmZzZXQgPSAoeHBvcyA+PiAxKSAmIDB4MzsKKyAgICAgICAgICAgIHNyYyA9IGNfcHJldiArICh4cG9zID4+IDEpIC0geG9mZnNldDsKKyAgICAgICAgICAgIGRzdCA9IHNyYyAtIChseCA8PCAzKTsKKyAgICAgICAgICAgIFBBRF9ST1cKKyAgICAgICAgICAgIGlmICh4b2Zmc2V0IHx8ICh4cG9zJjEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAqKChVTG9uZyopKHNyYyArIDgpKTsKKyAgICAgICAgICAgICAgICBkc3QgPSBzcmMgLSAobHggPDwgMykgKyA4OworICAgICAgICAgICAgICAgICooKFVMb25nKilkc3QpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopKGRzdCArPSBseCkpID0gdGVtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cG9zJjFdW3hwb3MmMV0oY19wcmV2ICsgKHhwb3MgPj4gMSkgKyAoKHlwb3MgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLCBseCwgcm5kMSk7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogcGFkIGJvdHRvbSBvZiBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICB4b2Zmc2V0ID0gKHhwb3MgPj4gMSkgJiAweDM7CisgICAgICAgICAgICBzcmMgPSBjX3ByZXYgKyAoeHBvcyA+PiAxKSAtIHhvZmZzZXQgKyAoaGVpZ2h0IC0gMSkgKiBseDsKKyAgICAgICAgICAgIGRzdCA9IHNyYyArIGx4OworICAgICAgICAgICAgUEFEX1JPVworICAgICAgICAgICAgaWYgKHhvZmZzZXQgfHwgKHhwb3MmMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICooKFVMb25nKikoc3JjICsgOCkpOworICAgICAgICAgICAgICAgIGRzdCA9IHNyYyArIGx4ICsgODsKKyAgICAgICAgICAgICAgICAqKChVTG9uZyopZHN0KSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKz0gbHgpKSA9IHRlbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXBvcyYxXVt4cG9zJjFdKGNfcHJldiArICh4cG9zID4+IDEpICsgKCh5cG9zID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYywgbHgsIHJuZDEpOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoeXBvcyA8IDApIC8qIHBhZCB0b3AtcmlnaHQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogcGFkIGNvcm5lciAqLworICAgICAgICAgICAgc3JjID0gY19wcmV2ICsgd2lkdGggLSAxOworICAgICAgICAgICAgZHN0ID0gc3JjIC0gKGx4IDw8IDMpICsgMTsKKyAgICAgICAgICAgIFBBRF9DT1JORVIKKworICAgICAgICAgICAgLyogcGFkIHRvcCAqLworICAgICAgICAgICAgc3JjIC09IDc7CisgICAgICAgICAgICBkc3QgPSBzcmMgLSAobHggPDwgMyk7CisgICAgICAgICAgICBQQURfUk9XCisKKyAgICAgICAgICAgIC8qIHBhZCBsZWZ0ICovCisgICAgICAgICAgICBzcmMgKz0gNzsKKyAgICAgICAgICAgIGRzdCA9IHNyYyArIDE7CisgICAgICAgICAgICBQQURfQ09MCisKKyAgICAgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXBvcyYxXVt4cG9zJjFdKGNfcHJldiArICh4cG9zID4+IDEpICsgKCh5cG9zID4+IDEpKmx4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYywgbHgsIHJuZDEpOworCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoeXBvcyA+PiAxKSA8IChoZWlnaHQgLSBCX1NJWkUpKSAvKiBwYWQgcmlnaHQgb2YgZnJhbWUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogcGFkIGxlZnQgKi8KKyAgICAgICAgICAgIHNyYyA9IGNfcHJldiArICh5cG9zID4+IDEpICogbHggKyB3aWR0aCAtIDE7CisgICAgICAgICAgICBkc3QgPSBzcmMgKyAxOworICAgICAgICAgICAgUEFEX0NPTAorICAgICAgICAgICAgLyogcGFkIGV4dHJhIHJvdyAqLworICAgICAgICAgICAgdGVtcCA9ICooc3JjICs9IGx4KTsKKyAgICAgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgOCk7CisgICAgICAgICAgICB0ZW1wIHw9ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgICAgICooKFVMb25nKikoZHN0ICs9IGx4KSkgPSB0ZW1wOworICAgICAgICAgICAgKigoVUxvbmcqKShkc3QgKyA0KSkgPSB0ZW1wOworCisgICAgICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwb3MmMV1beHBvcyYxXShjX3ByZXYgKyAoeHBvcyA+PiAxKSArICgoeXBvcyA+PiAxKSpseCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWMsIGx4LCBybmQxKTsKKworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBwYWQgYm90dG9tLXJpZ2h0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHBhZCBsZWZ0ICovCisgICAgICAgICAgICBzcmMgPSBjX3ByZXYgKyAoaGVpZ2h0IC0gOCkgKiBseCArIHdpZHRoIC0gMTsKKyAgICAgICAgICAgIGRzdCA9IHNyYyArIDE7CisgICAgICAgICAgICBQQURfQ09MCisKKyAgICAgICAgICAgIC8qIHBhZCBjb3JuZXIgKi8KKyAgICAgICAgICAgIGRzdCA9IHNyYyArIGx4ICsgMTsKKyAgICAgICAgICAgIFBBRF9DT1JORVIKKworICAgICAgICAgICAgLyogcGFkIGJvdHRvbSAqLworICAgICAgICAgICAgc3JjIC09IDc7CisgICAgICAgICAgICBkc3QgPSBzcmMgKyBseDsKKyAgICAgICAgICAgIFBBRF9ST1cKKworICAgICAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cG9zJjFdW3hwb3MmMV0oY19wcmV2ICsgKHhwb3MgPj4gMSkgKyAoKHlwb3MgPj4gMSkqbHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjLCBseCwgcm5kMSk7CisKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8KKyAgICBGdW5jdGlvbiA6IENvcHlfTUJfZnJvbV9Wb3AoKQorICAgIERhdGUgICAgIDogMDQvMTcvMjAwMQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBDb3B5X01CX2Zyb21fVm9wKFVDaGFyICpjb21wLCBJbnQgeUNoYW5bXVtOQ09FRkZfQkxPQ0tdLCBJbnQgcGl0Y2gpCit7CisgICAgSW50IHJvdywgY29sLCBpOworICAgIEludCAqc3JjMSwgKnNyYzI7CisgICAgSW50IG9mZnNldCA9IHBpdGNoIC0gTUJfU0laRTsKKyAgICBVTG9uZyB0ZW1wOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkgKz0gMikKKyAgICB7CisgICAgICAgIHNyYzEgPSB5Q2hhbltpXTsKKyAgICAgICAgc3JjMiA9IHlDaGFuW2krMV07CisKKyAgICAgICAgcm93ID0gQl9TSVpFOworICAgICAgICB3aGlsZSAocm93LS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbCA9IEJfU0laRTsKKyAgICAgICAgICAgIHdoaWxlIChjb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICooKFVMb25nKiljb21wKTsKKyAgICAgICAgICAgICAgICAqc3JjMSsrID0gKEludCkodGVtcCAmIDB4RkYpOworICAgICAgICAgICAgICAgICpzcmMxKysgPSAoSW50KSgodGVtcCA+PiA4KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICpzcmMxKysgPSAoSW50KSgodGVtcCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAqc3JjMSsrID0gKEludCkoKHRlbXAgPj4gMjQpICYgMHhGRik7CisgICAgICAgICAgICAgICAgY29tcCArPSA0OworICAgICAgICAgICAgICAgIGNvbCAtPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sID0gQl9TSVpFOworICAgICAgICAgICAgd2hpbGUgKGNvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKigoVUxvbmcqKWNvbXApOworICAgICAgICAgICAgICAgICpzcmMyKysgPSAoSW50KSh0ZW1wICYgMHhGRik7CisgICAgICAgICAgICAgICAgKnNyYzIrKyA9IChJbnQpKCh0ZW1wID4+IDgpICYgMHhGRik7CisgICAgICAgICAgICAgICAgKnNyYzIrKyA9IChJbnQpKCh0ZW1wID4+IDE2KSAmIDB4RkYpOworICAgICAgICAgICAgICAgICpzcmMyKysgPSAoSW50KSgodGVtcCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICBjb21wICs9IDQ7CisgICAgICAgICAgICAgICAgY29sIC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21wICs9IG9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC8KKyAgICBGdW5jdGlvbiA6IENvcHlfQl9mcm9tX1ZvcCgpCisgICAgRGF0ZSAgICAgOiAwNC8xNy8yMDAxCisvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBDb3B5X0JfZnJvbV9Wb3AoVUNoYXIgKmNvbXAsIEludCBjQ2hhbltdLCBJbnQgcGl0Y2gpCit7CisgICAgSW50IHJvdywgY29sOworICAgIEludCBvZmZzZXQgPSBwaXRjaCAtIEJfU0laRTsKKyAgICBVTG9uZyB0ZW1wOworCisgICAgcm93ID0gQl9TSVpFOworICAgIHdoaWxlIChyb3ctLSkKKyAgICB7CisgICAgICAgIGNvbCA9IEJfU0laRTsKKyAgICAgICAgd2hpbGUgKGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGVtcCA9ICooKFVMb25nKiljb21wKTsKKyAgICAgICAgICAgICpjQ2hhbisrID0gKEludCkodGVtcCAmIDB4RkYpOworICAgICAgICAgICAgKmNDaGFuKysgPSAoSW50KSgodGVtcCA+PiA4KSAmIDB4RkYpOworICAgICAgICAgICAgKmNDaGFuKysgPSAoSW50KSgodGVtcCA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgICAgICpjQ2hhbisrID0gKEludCkoKHRlbXAgPj4gMjQpICYgMHhGRik7CisgICAgICAgICAgICBjb21wICs9IDQ7CisgICAgICAgICAgICBjb2wgLT0gNDsKKyAgICAgICAgfQorICAgICAgICBjb21wICs9IG9mZnNldDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLworICAgIEZ1bmN0aW9uIDogQ29weV9NQl9pbnRvX1ZvcCgpCisgICAgRGF0ZSAgICAgOiAwNC8xNy8yMDAxCisgICAgSGlzdG9yeSAgOiBGcm9tIGRlY29kZXIKKy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIENvcHlfTUJfaW50b19Wb3AoVUNoYXIgKmNvbXAsIEludCB5Q2hhbltdW05DT0VGRl9CTE9DS10sIEludCBwaXRjaCkKK3sKKyAgICBJbnQgcm93LCBjb2wsIGk7CisgICAgSW50ICpzcmMxLCAqc3JjMjsKKyAgICBJbnQgb2Zmc2V0ID0gcGl0Y2ggLSBNQl9TSVpFOworICAgIFVDaGFyIG1hc2sgPSAweEZGOworICAgIEludCB0bXA7CisgICAgVUxvbmcgdGVtcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpICs9IDIpCisgICAgeworICAgICAgICBzcmMxID0geUNoYW5baV07CisgICAgICAgIHNyYzIgPSB5Q2hhbltpKzFdOworCisgICAgICAgIHJvdyA9IEJfU0laRTsKKyAgICAgICAgd2hpbGUgKHJvdy0tKQorICAgICAgICB7CisgICAgICAgICAgICBjb2wgPSBCX1NJWkU7CisgICAgICAgICAgICB3aGlsZSAoY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9ICgqc3JjMSsrKTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRlbXAgPSB0bXAgPDwgMjQ7CisgICAgICAgICAgICAgICAgdG1wID0gKCpzcmMxKyspOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAodG1wIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoKnNyYzErKyk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9ICh0bXAgPDwgOCk7CisgICAgICAgICAgICAgICAgdG1wID0gKCpzcmMxKyspOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdGVtcCB8PSB0bXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKWNvbXApID0gdGVtcDsKKyAgICAgICAgICAgICAgICBjb21wICs9IDQ7CisgICAgICAgICAgICAgICAgY29sIC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2wgPSBCX1NJWkU7CisgICAgICAgICAgICB3aGlsZSAoY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9ICgqc3JjMisrKTsKKyAgICAgICAgICAgICAgICBpZiAoKFVJbnQpdG1wID4gbWFzaykgdG1wID0gbWFzayAmICh+KHRtcCA+PiAzMSkpOworICAgICAgICAgICAgICAgIHRlbXAgPSB0bXAgPDwgMjQ7CisgICAgICAgICAgICAgICAgdG1wID0gKCpzcmMyKyspOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAodG1wIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB0bXAgPSAoKnNyYzIrKyk7CisgICAgICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9ICh0bXAgPDwgOCk7CisgICAgICAgICAgICAgICAgdG1wID0gKCpzcmMyKyspOworICAgICAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICAgICAgdGVtcCB8PSB0bXA7CisgICAgICAgICAgICAgICAgKigoVUxvbmcqKWNvbXApID0gdGVtcDsKKyAgICAgICAgICAgICAgICBjb21wICs9IDQ7CisgICAgICAgICAgICAgICAgY29sIC09IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb21wICs9IG9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLworICAgIEZ1bmN0aW9uIDogQ29weV9CX2ludG9fVm9wKCkKKyAgICBEYXRlICAgICA6IDA0LzE3LzIwMDEKKyAgICBIaXN0b3J5ICA6IEZyb20gZGVjb2RlcgorLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgQ29weV9CX2ludG9fVm9wKFVDaGFyICpjb21wLCBJbnQgY0NoYW5bXSwgSW50IHBpdGNoKQoreworICAgIEludCByb3csIGNvbDsKKyAgICBJbnQgb2Zmc2V0ID0gcGl0Y2ggLSBCX1NJWkU7CisgICAgSW50IHRtcDsKKyAgICBVQ2hhciBtYXNrID0gMHhGRjsKKyAgICBVTG9uZyB0ZW1wOworCisgICAgcm93ID0gQl9TSVpFOworICAgIHdoaWxlIChyb3ctLSkKKyAgICB7CisgICAgICAgIGNvbCA9IEJfU0laRTsKKyAgICAgICAgd2hpbGUgKGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKCpjQ2hhbisrKTsKKyAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICB0ZW1wID0gdG1wIDw8IDI0OworICAgICAgICAgICAgdG1wID0gKCpjQ2hhbisrKTsKKyAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICB0ZW1wIHw9ICh0bXAgPDwgMTYpOworICAgICAgICAgICAgdG1wID0gKCpjQ2hhbisrKTsKKyAgICAgICAgICAgIGlmICgoVUludCl0bXAgPiBtYXNrKSB0bXAgPSBtYXNrICYgKH4odG1wID4+IDMxKSk7CisgICAgICAgICAgICB0ZW1wIHw9ICh0bXAgPDwgOCk7CisgICAgICAgICAgICB0bXAgPSAoKmNDaGFuKyspOworICAgICAgICAgICAgaWYgKChVSW50KXRtcCA+IG1hc2spIHRtcCA9IG1hc2sgJiAofih0bXAgPj4gMzEpKTsKKyAgICAgICAgICAgIHRlbXAgfD0gdG1wOworICAgICAgICAgICAgKigoVUxvbmcqKWNvbXApID0gdGVtcDsKKyAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgIGNvbCAtPSA0OworICAgICAgICB9CisgICAgICAgIGNvbXAgKz0gb2Zmc2V0OworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBnZXRfTUIoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEwLzAzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogQ29weSA0IFkgdG8gcmVmZXJlbmNlIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3ZvaWQgZ2V0X01CKFVDaGFyICpjX3ByZXYsIFVDaGFyICpjX3ByZXZfdSAgLCBVQ2hhciAqY19wcmV2X3YsCisgICAgICAgICAgICBTaG9ydCBtYls2XVs2NF0sIEludCBseCwgSW50IGx4X3V2KQorCit7CisgICAgSW50IGksIGosIGNvdW50ID0gMCwgY291bnQxID0gMDsKKyAgICBJbnQgazEgPSBseCAtIE1CX1NJWkUsIGsyID0gbHhfdXYgLSBCX1NJWkU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQl9TSVpFOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgQl9TSVpFOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1iWzBdW2NvdW50XSA9IChJbnQpKCpjX3ByZXYrKyk7CisgICAgICAgICAgICBtYls0XVtjb3VudF0gPSAoSW50KSgqY19wcmV2X3UrKyk7CisgICAgICAgICAgICBtYls1XVtjb3VudCsrXSA9IChJbnQpKCpjX3ByZXZfdisrKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBCX1NJWkU7IGorKykKKyAgICAgICAgICAgIG1iWzFdW2NvdW50MSsrXSA9IChJbnQpKCpjX3ByZXYrKyk7CisKKyAgICAgICAgY19wcmV2ICs9IGsxOworICAgICAgICBjX3ByZXZfdSArPSBrMjsKKyAgICAgICAgY19wcmV2X3YgKz0gazI7CisKKworICAgIH0KKworICAgIGNvdW50ID0gY291bnQxID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQl9TSVpFOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgQl9TSVpFOyBqKyspCisgICAgICAgICAgICBtYlsyXVtjb3VudCsrXSA9IChJbnQpKCpjX3ByZXYrKyk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEJfU0laRTsgaisrKQorICAgICAgICAgICAgbWJbM11bY291bnQxKytdID0gKEludCkoKmNfcHJldisrKTsKKworICAgICAgICBjX3ByZXYgKz0gazE7CisgICAgfQorfQorCit2b2lkIFB1dFNraXBwZWRCbG9jayhVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KQoreworICAgIFVDaGFyICplbmQ7CisgICAgSW50IG9mZnNldCA9IChseCAtIDgpID4+IDI7CisgICAgSW50ICpzcmMsICpkc3Q7CisKKyAgICBkc3QgPSAoSW50KilyZWM7CisgICAgc3JjID0gKEludCopcHJldjsKKworICAgIGVuZCA9IHByZXYgKyAobHggPDwgMyk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgIGRzdCArPSBvZmZzZXQ7CisgICAgICAgIHNyYyArPSBvZmZzZXQ7CisgICAgfQorICAgIHdoaWxlICgoVUludClzcmMgPCAoVUludCllbmQpOworCisgICAgcmV0dXJuIDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3Yjc4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCkBAIC0wLDAgKzEsMTc0MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisKKy8vI2RlZmluZSBQUklOVF9NVgorI2RlZmluZSBNSU5fR09QIDEgICAvKiBtaW5pbXVtIHNpemUgb2YgR09QLCAgMS8yMy8wMSwgbmVlZCB0byBiZSB0ZXN0ZWQgKi8KKworI2RlZmluZSBDQU5ESURBVEVfRElTVEFOQ0UgIDAgLyogZGlzdGFuY2UgY2FuZGlkYXRlIGZyb20gb25lIGFub3RoZXIgdG8gY29uc2lkZXIgYXMgYSBkaXN0aW5jdCBvbmUgKi8KKy8qIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gMyAqLworCisjZGVmaW5lIFpFUk9fTVZfUFJFRiAgICAwIC8qIDA6IGJpYXMgKDAsMClNViBiZWZvcmUgZnVsbC1wZWwgc2VhcmNoLCBsb3dlc3QgY29tcGxleGl0eSovCisvKiAxOiBiaWFzICgwLDApTVYgYWZ0ZXIgZnVsbC1wZWwgc2VhcmNoLCBiZWZvcmUgaGFsZi1wZWwsIGhpZ2hlc3QgY29tcCAqLworLyogMjogYmlhcyAoMCwwKU1WIGFmdGVyIGhhbGYtcGVsLCBoaWdoIGNvbXAsIGJldHRlciBQU05SICovCisKKyNkZWZpbmUgUkFTVEVSX1JFRlJFU0ggIC8qIGluc3RlYWQgb2YgcmFuZG9tIElOVFJBIHJlZnJlc2gsIGRvIHJhc3RlciBzY2FuLCAgMi8yNi8wMSAqLworCisjaWZkZWYgUkFTVEVSX1JFRlJFU0gKKyNkZWZpbmUgVEFSR0VUX1JFRlJFU0hfUEVSX1JFR0lPTiA0IC8qICwgbm8uIE1CIHBlciBmcmFtZSB0byBiZSBJTlRSQSByZWZyZXNoZWQgKi8KKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9SRUZSRVNIX1BFUl9SRUdJT04gMSAvKiAsIG5vLiBNQiBwZXIgcmVnaW9uIHRvIGJlIElOVFJBIHJlZnJlc2hlZCAqLworI2VuZGlmCisKKyNkZWZpbmUgQUxMX0NBTkRfRVFVQUwgIDEwICAvKiAgYW55IG51bWJlciBncmVhdGVyIHRoYW4gNSB3aWxsIHdvcmsgKi8KKworI2RlZmluZSBOdW1QaXhlbE1CICAyNTYgICAgIC8qICBudW1iZXIgb2YgcGl4ZWxzIHVzZWQgaW4gU0FEIGNhbGN1bGF0aW9uICovCisKKyNkZWZpbmUgREVGXzhYOF9XSU4gMyAgIC8qIHNlYXJjaCByZWdpb24gZm9yIDh4OCBNVnMgYXJvdW5kIHRoZSAxNngxNiBNViAqLworI2RlZmluZSBNQl9OYiAgMjU2CisKKyNkZWZpbmUgUFJFRl9OVUxMX1ZFQyAxMjkgICAvKiBmb3IgemVybyB2ZWN0b3IgYmlhcyAqLworI2RlZmluZSBQUkVGXzE2X1ZFQyAxMjkgICAgIC8qIDFNViBiaWFzIHZlcnN1cyA0TVZzKi8KKyNkZWZpbmUgUFJFRl9JTlRSQSAgNTEyICAgICAvKiBiaWFzIGZvciBJTlRSQSBjb2RpbmcgKi8KKworY29uc3Qgc3RhdGljIEludCB0YWJfZXhjbHVkZVs5XVs5XSA9ICAvLyBbbGFzdF9sb2NdW2N1cnJfbG9jXQoreworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDF9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyAgICB7MCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwgMX0sCisgICAgezAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDF9LAorICAgIHswLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxfSwKKyAgICB7MCwgMCwgMSwgMSwgMSwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDB9Cit9OyAvL3RvIGRlY2lkZSB3aGV0aGVyIHRvIGNvbnRpbnVlIG9yIGNvbXB1dGUKKworY29uc3Qgc3RhdGljIEludCByZWZpbmVfbmV4dFs4XVsyXSA9ICAgIC8qIFtjdXJyX2tdW2luY3JlbWVudF0gKi8KK3sKKyAgICB7MCwgMH0sIHsyLCAwfSwgezEsIDF9LCB7MCwgMn0sIHsgLTEsIDF9LCB7IC0yLCAwfSwgeyAtMSwgLTF9LCB7MCwgLTJ9Cit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgdm9pZCBNQk1vdGlvblNlYXJjaChWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqY3VyLCBVQ2hhciAqYmVzdF9jYW5kW10sCisgICAgSW50IGkwLCBJbnQgajAsIEludCB0eXBlX3ByZWQsIEludCBmdWxsc2VhcmNoLCBJbnQgKmhwX2d1ZXNzKTsKKworICAgIEludCAgZnVsbHNlYXJjaChWaWRlb0VuY0RhdGEgKnZpZGVvLCBWb2wgKmN1cnJWb2wsIFVDaGFyICpyZWYsIFVDaGFyICpjdXIsCisgICAgICAgICAgICAgICAgICAgIEludCAqaW1pbiwgSW50ICpqbWluLCBJbnQgaWxvdywgSW50IGloaWdoLCBJbnQgamxvdywgSW50IGpoaWdoKTsKKyAgICBJbnQgZnVsbHNlYXJjaEJsayhWaWRlb0VuY0RhdGEgKnZpZGVvLCBWb2wgKmN1cnJWb2wsIFVDaGFyICpjZW50LCBVQ2hhciAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgIEludCAqaW1pbiwgSW50ICpqbWluLCBJbnQgaWxvdywgSW50IGloaWdoLCBJbnQgamxvdywgSW50IGpoaWdoLCBJbnQgcmFuZ2UpOworICAgIHZvaWQgQ2FuZGlkYXRlU2VsZWN0aW9uKEludCAqbXZ4LCBJbnQgKm12eSwgSW50ICpudW1fY2FuLCBJbnQgaW1iLCBJbnQgam1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCB0eXBlX3ByZWQpOworICAgIHZvaWQgUmFzdGVySW50cmFVcGRhdGUoVUNoYXIgKmludHJhQXJyYXksIFVDaGFyICpNb2RlLCBJbnQgdG90YWxNQiwgSW50IG51bVJlZnJlc2gpOworICAgIHZvaWQgUmVzZXRJbnRyYVVwZGF0ZShVQ2hhciAqaW50cmFBcnJheSwgSW50IHRvdGFsTUIpOworICAgIHZvaWQgUmVzZXRJbnRyYVVwZGF0ZVJlZ2lvbihVQ2hhciAqaW50cmFBcnJheSwgSW50IHN0YXJ0X2ksIEludCByd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBzdGFydF9qLCBJbnQgcmhlaWdodCwgSW50IG1id2lkdGgsIEludCBtYmhlaWdodCk7CisKKyAgICB2b2lkIE1vdmVOZWlnaGJvclNBRChJbnQgZG5bXSwgSW50IG5ld19sb2MpOworICAgIEludCBGaW5kTWluKEludCBkbltdKTsKKyAgICB2b2lkIFByZXBhcmVDdXJNQihWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciAqY3VyKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAyLzI4LzAxLCBmb3IgSFlQT1RIRVNJUyBURVNUSU5HICovCisjaWZkZWYgSFRGTSAgICAgLyogZGVmaW5lZCBpbiBtcDRkZWYuaCAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICB2b2lkIENhbGNUaHJlc2hvbGQoZG91YmxlIHBmLCBkb3VibGUgZXhwX2xhbWRhW10sIEludCBucm1sel90aFtdKTsKKyAgICB2b2lkICAgIEhURk1QcmVwYXJlQ3VyTUIoVmlkZW9FbmNEYXRhICp2aWRlbywgSFRGTV9TdGF0ICpodGZtX3N0YXQsIFVDaGFyICpjdXIpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZGVmaW5lIEhURk1fUGYgIDAuMjUgICAvKiAzLzIvMSwgcHJvYmFiaWxpdHkgb2YgZmFsc2UgYWxhcm0sIGNhbiBiZSB2YXJpZWQgZnJvbSAwIHRvIDAuNSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorCisjaWZkZWYgX1NBRF9TVEFUCitVTG9uZyBudW1fTUIgPSAwOworVUxvbmcgbnVtX0hQX01CID0gMDsKK1VMb25nIG51bV9CbGsgPSAwOworVUxvbmcgbnVtX0hQX0JsayA9IDA7CitVTG9uZyBudW1fY2FuZCA9IDA7CitVTG9uZyBudW1fYmV0dGVyX2hwID0gMDsKK1VMb25nIGlfZGlzdF9mcm9tX2d1ZXNzID0gMDsKK1VMb25nIGpfZGlzdF9mcm9tX2d1ZXNzID0gMDsKK1VMb25nIG51bV9ocF9ub3RfemVybyA9IDA7CisjZW5kaWYKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgTW90aW9uRXN0aW1hdGlvbgorICAgIERhdGU6ICAgICAgIDEwLzMvMjAwMAorICAgIFB1cnBvc2U6ICAgIEdvIHRocm91Z2ggYWxsIG1hY3JvYmxvY2sgZm9yIG1vdGlvbiBzZWFyY2ggYW5kCisgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgTW90aW9uRXN0aW1hdGlvbihWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIFVDaGFyIHVzZV80bXYgPSB2aWRlby0+ZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVmlkZW9FbmNGcmFtZUlPICpjdXJyRnJhbWUgPSB2aWRlby0+aW5wdXQ7CisgICAgSW50IGksIGosIGNvbXA7CisgICAgSW50IG1id2lkdGggPSBjdXJyVm9sLT5uTUJQZXJSb3c7CisgICAgSW50IG1iaGVpZ2h0ID0gY3VyclZvbC0+bk1CUGVyQ29sOworICAgIEludCB0b3RhbE1CID0gY3VyclZvbC0+blRvdGFsTUI7CisgICAgSW50IHdpZHRoID0gY3VyckZyYW1lLT5waXRjaDsKKyAgICBVQ2hhciAqbW9kZV9tYiwgKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIE1PVCAqbW90X21iLCAqKm1vdCA9IHZpZGVvLT5tb3Q7CisgICAgVUNoYXIgKmludHJhQXJyYXkgPSB2aWRlby0+aW50cmFBcnJheTsKKyAgICBJbnQgRlNfZW4gPSB2aWRlby0+ZW5jUGFyYW1zLT5GdWxsU2VhcmNoX0VuYWJsZWQ7CisgICAgdm9pZCAoKkNvbXB1dGVNQlN1bSkoVUNoYXIgKiwgSW50LCBNT1QgKikgPSB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5Db21wdXRlTUJTdW07CisgICAgdm9pZCAoKkNob29zZU1vZGUpKFVDaGFyKiwgVUNoYXIqLCBJbnQsIEludCkgPSB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5DaG9vc2VNb2RlOworCisgICAgSW50IG51bUludHJhLCBzdGFydF9pLCBudW1Mb29wLCBpbmNyX2k7CisgICAgSW50IG1ibnVtLCBvZmZzZXQ7CisgICAgVUNoYXIgKmN1ciwgKmJlc3RfY2FuZFs1XTsKKyAgICBJbnQgc2FkOCA9IDAsIHNhZDE2ID0gMDsKKyAgICBJbnQgdG90YWxTQUQgPSAwOyAgIC8qIGF2ZXJhZ2UgU0FEIGZvciByYXRlIGNvbnRyb2wgKi8KKyAgICBJbnQgc2tpcF9oYWxmcGVsXzRtdjsKKyAgICBJbnQgZl9jb2RlX3AsIGZfY29kZV9uLCBtYXhfbWFnID0gMCwgbWluX21hZyA9IDA7CisgICAgSW50IHR5cGVfcHJlZDsKKyAgICBJbnQgeGhbNV0gPSB7MCwgMCwgMCwgMCwgMH07CisgICAgSW50IHloWzVdID0gezAsIDAsIDAsIDAsIDB9OyAvKiBoYWxmLXBlbCAqLworICAgIFVDaGFyIGhwX21lbTRNVlsxNyoxNyo0XTsKKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLyAgLyogMi8yOC8wMSAqLworICAgIEludCBjb2xsZWN0ID0gMDsKKyAgICBIVEZNX1N0YXQgaHRmbV9zdGF0OworICAgIGRvdWJsZSBuZXd2YXJbMTZdOworICAgIGRvdWJsZSBleHBfbGFtZGFbMTVdOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKyAgICBJbnQgaHBfZ3Vlc3MgPSAwOworI2lmZGVmIFBSSU5UX01WCisgICAgRklMRSAqZnBfZGVidWc7CisjZW5kaWYKKworLy8gIEZJTEUgKmZzdGF0OworLy8gIHN0YXRpYyBpbnQgZnJhbWVfbnVtID0gMDsKKworICAgIG9mZnNldCA9IDA7CisKKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgIHsgICAvKiBjb21wdXRlIHRoZSBTQVYgKi8KKyAgICAgICAgbWJudW0gPSAwOworICAgICAgICBjdXIgPSBjdXJyRnJhbWUtPnlDaGFuOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYmhlaWdodDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWJ3aWR0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgIG1vdF9tYiA9IG1vdFttYm51bV07CisKKyAgICAgICAgICAgICAgICAoKkNvbXB1dGVNQlN1bSkoY3VyICsgKGkgPDwgNCksIHdpZHRoLCBtb3RfbWIpOworCisgICAgICAgICAgICAgICAgdG90YWxTQUQgKz0gbW90X21iWzBdLnNhZDsKKworICAgICAgICAgICAgICAgIG1ibnVtKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXIgKz0gKHdpZHRoIDw8IDQpOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPnN1bU1BRCA9IChmbG9hdCl0b3RhbFNBRCAvIChmbG9hdClOdW1QaXhlbE1COworCisgICAgICAgIFJlc2V0SW50cmFVcGRhdGUoaW50cmFBcnJheSwgdG90YWxNQik7CisKKyAgICAgICAgcmV0dXJuICA7CisgICAgfQorCisgICAgLyogMDkvMjAvMDUgKi8KKyAgICBpZiAodmlkZW8tPnByZXZCYXNlVm9wLT5wYWRkZWQgPT0gMCAmJiAhdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFkZGluZ0VkZ2UodmlkZW8tPnByZXZCYXNlVm9wKTsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT5wYWRkZWQgPSAxOworICAgIH0KKworICAgIC8qIFJhbmRvbSBJTlRSQSB1cGRhdGUgKi8KKyAgICAvKiAgc3VnZ2VzdCB0byBkbyBpdCBpbiBDb2RlTUIgKi8KKyAgICAvKiAgMi8yMS8yMDAxICovCisgICAgLy9pZih2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl8xIHx8IHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSXzIpCisgICAgaWYgKHZpZGVvLT5jdXJyTGF5ZXIgPT0gMCAmJiB2aWRlby0+ZW5jUGFyYW1zLT5SZWZyZXNoKQorICAgIHsKKyAgICAgICAgUmFzdGVySW50cmFVcGRhdGUoaW50cmFBcnJheSwgTW9kZSwgdG90YWxNQiwgdmlkZW8tPmVuY1BhcmFtcy0+UmVmcmVzaCk7CisgICAgfQorCisgICAgdmlkZW8tPnNhZF9leHRyYV9pbmZvID0gTlVMTDsKKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLyAgLyogMi8yOC8wMSAqLworICAgIEluaXRIVEZNKHZpZGVvLCAmaHRmbV9zdGF0LCBuZXd2YXIsICZjb2xsZWN0KTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmCisKKyAgICBpZiAoKHZpZGVvLT5lbmNQYXJhbXMtPlNjZW5lQ2hhbmdlX0RldCA9PSAxKSAvKiYmIHZpZGVvLT5jdXJyTGF5ZXI9PTAgKi8KKyAgICAgICAgICAgICYmICgodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbMF0gPCA1LjApIHx8ICh2aWRlby0+bnVtVm9wc0luR09QID4gTUlOX0dPUCkpKQorICAgICAgICAvKiBkbyBub3QgdHJ5IHRvIGRldGVjdCBhIG5ldyBzY2VuZSBpZiBsb3cgZnJhbWUgcmF0ZSBhbmQgdG9vIGNsb3NlIHRvIHByZXZpb3VzIEktZnJhbWUgKi8KKyAgICB7CisgICAgICAgIGluY3JfaSA9IDI7CisgICAgICAgIG51bUxvb3AgPSAyOworICAgICAgICBzdGFydF9pID0gMTsKKyAgICAgICAgdHlwZV9wcmVkID0gMDsgLyogZm9yIGluaXRpYWwgY2FuZGlkYXRlIHNlbGVjdGlvbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmNyX2kgPSAxOworICAgICAgICBudW1Mb29wID0gMTsKKyAgICAgICAgc3RhcnRfaSA9IDA7CisgICAgICAgIHR5cGVfcHJlZCA9IDI7CisgICAgfQorCisgICAgLyogRmlyc3QgcGFzcywgbG9vcCB0aHJ1IGhhbGYgdGhlIG1hY3JvYmxvY2sgKi8KKyAgICAvKiBkZXRlcm1pbmUgc2NlbmUgY2hhbmdlICovCisgICAgLyogU2Vjb25kIHBhc3MsIGZvciB0aGUgcmVzdCBvZiBtYWNyb2Jsb2NrcyAqLworICAgIG51bUludHJhID0gMDsKKyAgICB3aGlsZSAobnVtTG9vcC0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iaGVpZ2h0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmNyX2kgPiAxKQorICAgICAgICAgICAgICAgIHN0YXJ0X2kgPSAoc3RhcnRfaSA9PSAwID8gMSA6IDApIDsgLyogdG9nZ2xlIDAgYW5kIDEgKi8KKworICAgICAgICAgICAgb2Zmc2V0ID0gd2lkdGggKiAoaiA8PCA0KSArIChzdGFydF9pIDw8IDQpOworCisgICAgICAgICAgICBtYm51bSA9IGogKiBtYndpZHRoICsgc3RhcnRfaTsKKworICAgICAgICAgICAgZm9yIChpID0gc3RhcnRfaTsgaSA8IG1id2lkdGg7IGkgKz0gaW5jcl9pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgIG1vdF9tYiA9IG1vdFttYm51bV07CisgICAgICAgICAgICAgICAgbW9kZV9tYiA9IE1vZGUgKyBtYm51bTsKKworICAgICAgICAgICAgICAgIGN1ciA9IGN1cnJGcmFtZS0+eUNoYW4gKyBvZmZzZXQ7CisKKworICAgICAgICAgICAgICAgIGlmICgqbW9kZV9tYiAhPSBNT0RFX0lOVFJBKQorICAgICAgICAgICAgICAgIHsKKyNpZiBkZWZpbmVkKEhURk0pCisgICAgICAgICAgICAgICAgICAgIEhURk1QcmVwYXJlQ3VyTUIodmlkZW8sICZodGZtX3N0YXQsIGN1cik7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBQcmVwYXJlQ3VyTUIodmlkZW8sIGN1cik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqIGZ1bGwtcGVsIDFNViBhbmQgNE1WcyBzZWFyY2ggKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9TQURfU1RBVAorICAgICAgICAgICAgICAgICAgICBudW1fTUIrKzsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBNQk1vdGlvblNlYXJjaCh2aWRlbywgY3VyLCBiZXN0X2NhbmQsIGkgPDwgNCwgaiA8PCA0LCB0eXBlX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX2VuLCAmaHBfZ3Vlc3MpOworCisjaWZkZWYgUFJJTlRfTVYKKyAgICAgICAgICAgICAgICAgICAgZnBfZGVidWcgPSBmb3BlbigiYzpcXGJpdHN0cmVhbVxcbXYxX2RlYnVnLnR4dCIsICJhIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfZGVidWcsICIjJWQgKCVkLCVkLCVkKSA6ICIsIG1ibnVtLCBtb3RfbWJbMF0ueCwgbW90X21iWzBdLnksIG1vdF9tYlswXS5zYWQpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2RlYnVnLCAiKCVkLCVkLCVkKSA6ICglZCwlZCwlZCkgOiAoJWQsJWQsJWQpIDogKCVkLCVkLCVkKSA6ID09PlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbMV0ueCwgbW90X21iWzFdLnksIG1vdF9tYlsxXS5zYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzJdLngsIG1vdF9tYlsyXS55LCBtb3RfbWJbMl0uc2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlszXS54LCBtb3RfbWJbM10ueSwgbW90X21iWzNdLnNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbNF0ueCwgbW90X21iWzRdLnksIG1vdF9tYls0XS5zYWQpOworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnBfZGVidWcpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHNhZDE2ID0gbW90X21iWzBdLnNhZDsKKyNpZmRlZiBOT19JTlRFUjRWCisgICAgICAgICAgICAgICAgICAgIHNhZDggPSBzYWQxNjsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIHNhZDggPSBtb3RfbWJbMV0uc2FkICsgbW90X21iWzJdLnNhZCArIG1vdF9tYlszXS5zYWQgKyBtb3RfbWJbNF0uc2FkOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hvb3NlIGJldHdlZW4gSU5UUkEgb3IgSU5URVIgKi8KKyAgICAgICAgICAgICAgICAgICAgKCpDaG9vc2VNb2RlKShtb2RlX21iLCBjdXIsIHdpZHRoLCAoKHNhZDggPCBzYWQxNikgPyBzYWQ4IDogc2FkMTYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvKiBJTlRSQSB1cGRhdGUsIHVzZSBmb3IgcHJlZGljdGlvbiAzLzIzLzAxICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtb3RfbWJbMF0ueCA9IG1vdF9tYlswXS55ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKm1vZGVfbWIgPT0gTU9ERV9JTlRSQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG51bUludHJhKysgOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgU0FWIGZvciByYXRlIGNvbnRyb2wgYW5kIGZhc3QgRENULCAxMS8yOC8wMCAqLworICAgICAgICAgICAgICAgICAgICAoKkNvbXB1dGVNQlN1bSkoY3VyLCB3aWR0aCwgbW90X21iKTsKKworICAgICAgICAgICAgICAgICAgICAvKiBsZWF2ZSBtb3RfbWJbMF0gYXMgaXQgaXMgZm9yIGZhc3QgbW90aW9uIHNlYXJjaCAqLworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdGhlIDQgTVZzIHRvIHplcm9zICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29tcCA9IDE7IGNvbXAgPD0gNDsgY29tcCsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbY29tcF0ueCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbY29tcF0ueSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyNpZmRlZiBQUklOVF9NVgorICAgICAgICAgICAgICAgICAgICBmcF9kZWJ1ZyA9IGZvcGVuKCJjOlxcYml0c3RyZWFtXFxtdjFfZGVidWcudHh0IiwgImEiKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9kZWJ1ZywgIlxuIik7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcF9kZWJ1Zyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAvKiAqbW9kZV9tYiA9IE1PREVfSU5URVI7Ki8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IYWxmUGVsX0VuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBfU0FEX1NUQVQKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9IUF9NQisrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIGhhbGYtcGVsIHJlc29sdXRpb24gbW90aW9uIHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgRmluZEhhbGZQZWxNQih2aWRlbywgY3VyLCBtb3RfbWIsIGJlc3RfY2FuZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA8PCA0LCBqIDw8IDQsIHhoLCB5aCwgaHBfZ3Vlc3MpOworI2lmZGVmIFBSSU5UX01WCisgICAgICAgICAgICAgICAgICAgICAgICBmcF9kZWJ1ZyA9IGZvcGVuKCJjOlxcYml0c3RyZWFtXFxtdjFfZGVidWcudHh0IiwgImEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfZGVidWcsICIoJWQsJWQpLCAlZFxuIiwgbW90X21iWzBdLngsIG1vdF9tYlswXS55LCBtb3RfbWJbMF0uc2FkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcF9kZWJ1Zyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfaGFsZnBlbF80bXYgPSAoKHNhZDE2IC0gbW90X21iWzBdLnNhZCkgPD0gKE1CX05iID4+IDEpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYWQxNiA9IG1vdF9tYlswXS5zYWQ7CisKKyNpZm5kZWYgTk9fSU5URVI0VgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZV80bXYgJiYgIXNraXBfaGFsZnBlbF80bXYpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxzbyBkZWNpZGUgMU1WIG9yIDRNViAhISEhISEhISovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FkOCA9IEZpbmRIYWxmUGVsQmxrKHZpZGVvLCBjdXIsIG1vdF9tYiwgc2FkMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfY2FuZCwgbW9kZV9tYiwgaSA8PCA0LCBqIDw8IDQsIHhoLCB5aCwgaHBfbWVtNE1WKTsKKworI2lmZGVmIFBSSU5UX01WCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBfZGVidWcgPSBmb3BlbigiYzpcXGJpdHN0cmVhbVxcbXYxX2RlYnVnLnR4dCIsICJhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcF9kZWJ1ZywgIiAoJWQsJWQsJWQpIDogKCVkLCVkLCVkKSA6ICglZCwlZCwlZCkgOiAoJWQsJWQsJWQpIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlsxXS54LCBtb3RfbWJbMV0ueSwgbW90X21iWzFdLnNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlsyXS54LCBtb3RfbWJbMl0ueSwgbW90X21iWzJdLnNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlszXS54LCBtb3RfbWJbM10ueSwgbW90X21iWzNdLnNhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYls0XS54LCBtb3RfbWJbNF0ueSwgbW90X21iWzRdLnNhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwX2RlYnVnKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE5PX0lOVEVSNFYgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8qIEhhbGZQZWxfRW5hYmxlZCA9PTAgICovCisgICAgICAgICAgICAgICAgICAgIHsKKyNpZm5kZWYgTk9fSU5URVI0VgorICAgICAgICAgICAgICAgICAgICAgICAgLy9pZihzYWQxNiA8IHNhZDgtUFJFRl8xNl9WRUMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2FkMTYgLSBQUkVGXzE2X1ZFQyA+IHNhZDgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZGVfbWIgPSBNT0RFX0lOVEVSNFY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmIChaRVJPX01WX1BSRUY9PTIpICAgLyogdXNlIG1vdF9tYls3XS5zYWQgYXMgZDAgY29tcHV0ZWQgaW4gTUJNb3Rpb25TZWFyY2gqLworICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICAgICBpZiAobW90X21iWzddLnNhZCAtIFBSRUZfTlVMTF9WRUMgPCBzYWQxNiAmJiBtb3RfbWJbN10uc2FkIC0gUFJFRl9OVUxMX1ZFQyA8IHNhZDgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlswXS5zYWQgPSBtb3RfbWJbN10uc2FkIC0gUFJFRl9OVUxMX1ZFQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlswXS54ID0gbW90X21iWzBdLnkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKm1vZGVfbWIgPSBNT0RFX0lOVEVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKCptb2RlX21iID09IE1PREVfSU5URVIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbMF0ueCA9PSAwICYmIG1vdF9tYlswXS55ID09IDApICAgLyogdXNlIHplcm8gdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzBdLnNhZCArPSBQUkVGX05VTExfVkVDOyAvKiBhZGQgYmFjayB0aGUgYmlhcyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWJbMV0uc2FkID0gbW90X21iWzJdLnNhZCA9IG1vdF9tYlszXS5zYWQgPSBtb3RfbWJbNF0uc2FkID0gKG1vdF9tYlswXS5zYWQgKyAyKSA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbW90X21iWzFdLnggPSBtb3RfbWJbMl0ueCA9IG1vdF9tYlszXS54ID0gbW90X21iWzRdLnggPSBtb3RfbWJbMF0ueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdF9tYlsxXS55ID0gbW90X21iWzJdLnkgPSBtb3RfbWJbM10ueSA9IG1vdF9tYls0XS55ID0gbW90X21iWzBdLnk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGZpbmQgbWF4aW11bSBtYWduaXR1ZGUgKi8KKyAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGF2ZXJhZ2UgU0FEIGZvciByYXRlIGNvbnRyb2wsIDExLzI4LzAwICovCisgICAgICAgICAgICAgICAgaWYgKCptb2RlX21iID09IE1PREVfSU5URVIpCisgICAgICAgICAgICAgICAgeworI2lmZGVmIFBSSU5UX01WCisgICAgICAgICAgICAgICAgICAgIGZwX2RlYnVnID0gZm9wZW4oImM6XFxiaXRzdHJlYW1cXG12MV9kZWJ1Zy50eHQiLCAiYSIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2RlYnVnLCAiJWQgTU9ERV9JTlRFUlxuIiwgbWJudW0pOworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnBfZGVidWcpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IG1vdF9tYlswXS5zYWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbMF0ueCA+IG1heF9tYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbWFnID0gbW90X21iWzBdLng7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbMF0ueSA+IG1heF9tYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbWFnID0gbW90X21iWzBdLnk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbMF0ueCA8IG1pbl9tYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbWFnID0gbW90X21iWzBdLng7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbMF0ueSA8IG1pbl9tYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbWFnID0gbW90X21iWzBdLnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCptb2RlX21iID09IE1PREVfSU5URVI0VikKKyAgICAgICAgICAgICAgICB7CisjaWZkZWYgUFJJTlRfTVYKKyAgICAgICAgICAgICAgICAgICAgZnBfZGVidWcgPSBmb3BlbigiYzpcXGJpdHN0cmVhbVxcbXYxX2RlYnVnLnR4dCIsICJhIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnBfZGVidWcsICIlZCBNT0RFX0lOVEVSNFZcbiIsIG1ibnVtKTsKKyAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwX2RlYnVnKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB0b3RhbFNBRCArPSBzYWQ4OworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbXAgPSAxOyBjb21wIDw9IDQ7IGNvbXArKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYltjb21wXS54ID4gbWF4X21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbWFnID0gbW90X21iW2NvbXBdLng7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW90X21iW2NvbXBdLnkgPiBtYXhfbWFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9tYWcgPSBtb3RfbWJbY29tcF0ueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3RfbWJbY29tcF0ueCA8IG1pbl9tYWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX21hZyA9IG1vdF9tYltjb21wXS54OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vdF9tYltjb21wXS55IDwgbWluX21hZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbWFnID0gbW90X21iW2NvbXBdLnk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvKiBNT0RFX0lOVFJBICovCisgICAgICAgICAgICAgICAgeworI2lmZGVmIFBSSU5UX01WCisgICAgICAgICAgICAgICAgICAgIGZwX2RlYnVnID0gZm9wZW4oImM6XFxiaXRzdHJlYW1cXG12MV9kZWJ1Zy50eHQiLCAiYSIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwX2RlYnVnLCAiJWQgTU9ERV9JTlRSQVxuIiwgbWJudW0pOworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnBfZGVidWcpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IG1vdF9tYlswXS5zYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1ibnVtICs9IGluY3JfaTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKGluY3JfaSA8PCA0KTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluY3JfaSA+IDEgJiYgbnVtTG9vcCkgLyogc2NlbmUgY2hhbmdlIG9uIGFuZCBmaXJzdCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYobnVtSW50cmEgPiAoKHRvdGFsTUI+PjMpPDwxKSArICh0b3RhbE1CPj4zKSkgLyogNzUlIG9mIDUwJU1CcyAqLworICAgICAgICAgICAgaWYgKG51bUludHJhID4gKDAuMzAqKHRvdGFsTUIgLyAyLjApKSkgLyogMTUlIG9mIDUwJU1CcyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKioqKioqKiBzY2VuZSBjaGFuZ2UgZGV0ZWN0ZWQgKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgICAgICAgICAgICAgIE00VkVOQ19NRU1TRVQoTW9kZSwgTU9ERV9JTlRSQSwgc2l6ZW9mKFVDaGFyKSp0b3RhbE1CKTsgLyogc2V0IHRoaXMgZm9yIE1CIGxldmVsIGNvZGluZyovCisgICAgICAgICAgICAgICAgY3VyclZvcC0+cXVhbnRpemVyID0gdmlkZW8tPmVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFt2aWRlby0+Y3VyckxheWVyXTsKKworICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgdGhlIFNBViBmb3IgcmF0ZSBjb250cm9sICYgZmFzdCBEQ1QgKi8KKyAgICAgICAgICAgICAgICB0b3RhbFNBRCA9IDA7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBtYm51bSA9IDA7CisgICAgICAgICAgICAgICAgY3VyID0gY3VyckZyYW1lLT55Q2hhbjsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYmhlaWdodDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1id2lkdGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgICAgICAgICAgICAgICAgICBtb3RfbWIgPSBtb3RbbWJudW1dOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgqQ29tcHV0ZU1CU3VtKShjdXIgKyAoaSA8PCA0KSwgd2lkdGgsIG1vdF9tYik7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNBRCArPSBtb3RfbWJbMF0uc2FkOworCisgICAgICAgICAgICAgICAgICAgICAgICBtYm51bSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1ciArPSAod2lkdGggPDwgNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlkZW8tPnN1bU1BRCA9IChmbG9hdCl0b3RhbFNBRCAvIChmbG9hdClOdW1QaXhlbE1COworICAgICAgICAgICAgICAgIFJlc2V0SW50cmFVcGRhdGUoaW50cmFBcnJheSwgdG90YWxNQik7CisgICAgICAgICAgICAgICAgLyogdmlkZW8tPm51bVZvcHNJbkdPUD0wOyAzLzEzLzAxIG1vdmUgaXQgdG8gdm9wLmMqLworCisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioqKioqKiogbm8gc2NlbmUgY2hhbmdlLCBjb250aW51ZSBtb3Rpb24gc2VhcmNoICoqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHN0YXJ0X2kgPSAwOworICAgICAgICB0eXBlX3ByZWQrKzsgLyogc2Vjb25kIHBhc3MgKi8KKyAgICB9CisKKyAgICB2aWRlby0+c3VtTUFEID0gKGZsb2F0KXRvdGFsU0FEIC8gKGZsb2F0KU51bVBpeGVsTUI7ICAgIC8qIGF2ZyBTQUQgKi8KKworICAgIC8qIGZpbmQgZl9jb2RlICwgMTAvMjcvMjAwMCAqLworICAgIGZfY29kZV9wID0gMTsKKyAgICB3aGlsZSAoKG1heF9tYWcgPj4gKDQgKyBmX2NvZGVfcCkpID4gMCkKKyAgICAgICAgZl9jb2RlX3ArKzsKKworICAgIGZfY29kZV9uID0gMTsKKyAgICBtaW5fbWFnICo9IC0xOworICAgIHdoaWxlICgobWluX21hZyAtIDEpID4+ICg0ICsgZl9jb2RlX24pID4gMCkKKyAgICAgICAgZl9jb2RlX24rKzsKKworICAgIGN1cnJWb3AtPmZjb2RlRm9yd2FyZCA9IChmX2NvZGVfcCA+IGZfY29kZV9uID8gZl9jb2RlX3AgOiBmX2NvZGVfbik7CisKKyNpZmRlZiBIVEZNCisgICAgLyoqKioqIEhZUE9USEVTSVMgVEVTVElORyAqKioqKioqKi8gIC8qIDIvMjgvMDEgKi8KKyAgICBpZiAoY29sbGVjdCkKKyAgICB7CisgICAgICAgIGNvbGxlY3QgPSAwOworICAgICAgICBVcGRhdGVIVEZNKHZpZGVvLCBuZXd2YXIsIGV4cF9sYW1kYSwgJmh0Zm1fc3RhdCk7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworICAgIHJldHVybiA7Cit9CisKKworI2lmZGVmIEhURk0KK3ZvaWQgSW5pdEhURk0oVmlkZW9FbmNEYXRhICp2aWRlbywgSFRGTV9TdGF0ICpodGZtX3N0YXQsIGRvdWJsZSAqbmV3dmFyLCBJbnQgKmNvbGxlY3QpCit7CisgICAgSW50IGk7CisgICAgSW50IGx4ID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvLyAgcGFkZGluZworICAgIEludCBseDIgPSBseCA8PCAxOworICAgIEludCBseDMgPSBseDIgKyBseDsKKyAgICBJbnQgcnggPSB2aWRlby0+Y3VyclZvcC0+cGl0Y2g7CisgICAgSW50IHJ4MiA9IHJ4IDw8IDE7CisgICAgSW50IHJ4MyA9IHJ4MiArIHJ4OworCisgICAgSW50ICpvZmZzZXQsICpvZmZzZXQyOworCisgICAgLyogNC8xMS8wMSwgY29sbGVjdCBkYXRhIGV2ZXJ5IDMwIGZyYW1lcywgZG9lc24ndCBoYXZlIHRvIGJlIGJhc2UgbGF5ZXIgKi8KKyAgICBpZiAoKChJbnQpdmlkZW8tPm51bVZvcHNJbkdPUCkgJSAzMCA9PSAxKQorICAgIHsKKworICAgICAgICAqY29sbGVjdCA9IDE7CisKKyAgICAgICAgaHRmbV9zdGF0LT5jb3VudGJyZWFrID0gMDsKKyAgICAgICAgaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBuZXd2YXJbaV0gPSAwLjA7CisgICAgICAgIH0KKy8vICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX1BBRERJTkcgPSAmU0FEX01CX1BBRERJTkdfSFRGTV9Db2xsZWN0OworICAgICAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZTQURfTUJfSFRGTV9Db2xsZWN0OworICAgICAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJlNBRF9NQl9IUF9IVEZNX0NvbGxlY3R4aDsKKyAgICAgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmU0FEX01CX0hQX0hURk1fQ29sbGVjdHloOworICAgICAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aDsKKyAgICAgICAgdmlkZW8tPnNhZF9leHRyYV9pbmZvID0gKHZvaWQqKShodGZtX3N0YXQpOworICAgICAgICBvZmZzZXQgPSBodGZtX3N0YXQtPm9mZnNldEFycmF5OworICAgICAgICBvZmZzZXQyID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisvLyAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9QQURESU5HID0gJlNBRF9NQl9QQURESU5HX0hURk07CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NQl9IVEZNOworICAgICAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJlNBRF9NQl9IUF9IVEZNeGg7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzJdID0gJlNBRF9NQl9IUF9IVEZNeWg7CisgICAgICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzNdID0gJlNBRF9NQl9IUF9IVEZNeGh5aDsKKyAgICAgICAgdmlkZW8tPnNhZF9leHRyYV9pbmZvID0gKHZvaWQqKSh2aWRlby0+bnJtbHpfdGgpOworICAgICAgICBvZmZzZXQgPSB2aWRlby0+bnJtbHpfdGggKyAxNjsKKyAgICAgICAgb2Zmc2V0MiA9IHZpZGVvLT5ucm1sel90aCArIDMyOworICAgIH0KKworICAgIG9mZnNldFswXSA9IDA7CisgICAgb2Zmc2V0WzFdID0gbHgyICsgMjsKKyAgICBvZmZzZXRbMl0gPSAyOworICAgIG9mZnNldFszXSA9IGx4MjsKKyAgICBvZmZzZXRbNF0gPSBseCArIDE7CisgICAgb2Zmc2V0WzVdID0gbHgzICsgMzsKKyAgICBvZmZzZXRbNl0gPSBseCArIDM7CisgICAgb2Zmc2V0WzddID0gbHgzICsgMTsKKyAgICBvZmZzZXRbOF0gPSBseDsKKyAgICBvZmZzZXRbOV0gPSBseDMgKyAyOworICAgIG9mZnNldFsxMF0gPSBseDMgOworICAgIG9mZnNldFsxMV0gPSBseCArIDIgOworICAgIG9mZnNldFsxMl0gPSAxOworICAgIG9mZnNldFsxM10gPSBseDIgKyAzOworICAgIG9mZnNldFsxNF0gPSBseDIgKyAxOworICAgIG9mZnNldFsxNV0gPSAzOworCisgICAgb2Zmc2V0MlswXSA9IDA7CisgICAgb2Zmc2V0MlsxXSA9IHJ4MiArIDI7CisgICAgb2Zmc2V0MlsyXSA9IDI7CisgICAgb2Zmc2V0MlszXSA9IHJ4MjsKKyAgICBvZmZzZXQyWzRdID0gcnggKyAxOworICAgIG9mZnNldDJbNV0gPSByeDMgKyAzOworICAgIG9mZnNldDJbNl0gPSByeCArIDM7CisgICAgb2Zmc2V0Mls3XSA9IHJ4MyArIDE7CisgICAgb2Zmc2V0Mls4XSA9IHJ4OworICAgIG9mZnNldDJbOV0gPSByeDMgKyAyOworICAgIG9mZnNldDJbMTBdID0gcngzIDsKKyAgICBvZmZzZXQyWzExXSA9IHJ4ICsgMiA7CisgICAgb2Zmc2V0MlsxMl0gPSAxOworICAgIG9mZnNldDJbMTNdID0gcngyICsgMzsKKyAgICBvZmZzZXQyWzE0XSA9IHJ4MiArIDE7CisgICAgb2Zmc2V0MlsxNV0gPSAzOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBVcGRhdGVIVEZNKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGRvdWJsZSAqbmV3dmFyLCBkb3VibGUgKmV4cF9sYW1kYSwgSFRGTV9TdGF0ICpodGZtX3N0YXQpCit7CisgICAgaWYgKGh0Zm1fc3RhdC0+Y291bnRicmVhayA9PSAwKQorICAgICAgICBodGZtX3N0YXQtPmNvdW50YnJlYWsgPSAxOworCisgICAgbmV3dmFyWzBdID0gKGRvdWJsZSkoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpIC8gKGh0Zm1fc3RhdC0+Y291bnRicmVhayAqIDE2Lik7CisKKyAgICBpZiAobmV3dmFyWzBdIDwgMC4wMDEpCisgICAgeworICAgICAgICBuZXd2YXJbMF0gPSAwLjAwMTsgLyogdG8gcHJldmVudCBmbG9hdGluZyBvdmVyZmxvdyAqLworICAgIH0KKyAgICBleHBfbGFtZGFbMF0gPSAgMSAvIChuZXd2YXJbMF0gKiAxLjQxNDIxMzYpOworICAgIGV4cF9sYW1kYVsxXSA9IGV4cF9sYW1kYVswXSAqIDEuNTgyNTsKKyAgICBleHBfbGFtZGFbMl0gPSBleHBfbGFtZGFbMF0gKiAyLjE3NTA7CisgICAgZXhwX2xhbWRhWzNdID0gZXhwX2xhbWRhWzBdICogMy41MDY1OworICAgIGV4cF9sYW1kYVs0XSA9IGV4cF9sYW1kYVswXSAqIDMuMTQzNjsKKyAgICBleHBfbGFtZGFbNV0gPSBleHBfbGFtZGFbMF0gKiAzLjUzMTU7CisgICAgZXhwX2xhbWRhWzZdID0gZXhwX2xhbWRhWzBdICogMy43NDQ5OworICAgIGV4cF9sYW1kYVs3XSA9IGV4cF9sYW1kYVswXSAqIDQuNTg1NDsKKyAgICBleHBfbGFtZGFbOF0gPSBleHBfbGFtZGFbMF0gKiA0LjYxOTE7CisgICAgZXhwX2xhbWRhWzldID0gZXhwX2xhbWRhWzBdICogNS40MDQxOworICAgIGV4cF9sYW1kYVsxMF0gPSBleHBfbGFtZGFbMF0gKiA2LjU5NzQ7CisgICAgZXhwX2xhbWRhWzExXSA9IGV4cF9sYW1kYVswXSAqIDEwLjUzNDE7CisgICAgZXhwX2xhbWRhWzEyXSA9IGV4cF9sYW1kYVswXSAqIDEwLjA3MTk7CisgICAgZXhwX2xhbWRhWzEzXSA9IGV4cF9sYW1kYVswXSAqIDEyLjA1MTY7CisgICAgZXhwX2xhbWRhWzE0XSA9IGV4cF9sYW1kYVswXSAqIDE1LjQ1NTI7CisKKyAgICBDYWxjVGhyZXNob2xkKEhURk1fUGYsIGV4cF9sYW1kYSwgdmlkZW8tPm5ybWx6X3RoKTsKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgQ2FsY1RocmVzaG9sZChkb3VibGUgcGYsIGRvdWJsZSBleHBfbGFtZGFbXSwgSW50IG5ybWx6X3RoW10pCit7CisgICAgSW50IGk7CisgICAgZG91YmxlIHRlbXBbMTVdOworICAgIC8vICBwcmludGYoIlxuTGFtZGE6ICIpOworCisgICAgLyogcGFyYW1ldHJpYyBQUkVNT0RFTGxpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKKyAgICB7CisgICAgICAgIC8vICAgIHByaW50ZigiJWcgIixleHBfbGFtZGFbaV0pOworICAgICAgICBpZiAocGYgPCAwLjUpCisgICAgICAgICAgICB0ZW1wW2ldID0gMSAvIGV4cF9sYW1kYVtpXSAqIE00VkVOQ19MT0coMiAqIHBmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVtcFtpXSA9IC0xIC8gZXhwX2xhbWRhW2ldICogTTRWRU5DX0xPRygyICogKDEgLSBwZikpOworICAgIH0KKworICAgIG5ybWx6X3RoWzE1XSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspICAgICAgICAvKiBzY2FsZSB1cHRvIG5vLnBpeGVscyAqLworICAgICAgICBucm1sel90aFtpXSA9IChJbnQpKHRlbXBbaV0gKiAoKGkgKyAxKSA8PCA0KSArIDAuNSk7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkICAgIEhURk1QcmVwYXJlQ3VyTUIoVmlkZW9FbmNEYXRhICp2aWRlbywgSFRGTV9TdGF0ICpodGZtX3N0YXQsIFVDaGFyICpjdXIpCit7CisgICAgdm9pZCogdG1wID0gKHZvaWQqKSh2aWRlby0+Y3VycllNQik7CisgICAgVUxvbmcgKmh0Zm1NQiA9IChVTG9uZyopdG1wOworICAgIFVDaGFyICpwdHIsIGJ5dGU7CisgICAgSW50ICpvZmZzZXQ7CisgICAgSW50IGk7CisgICAgVUxvbmcgd29yZDsKKyAgICBJbnQgd2lkdGggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGg7CisKKyAgICBpZiAoKChJbnQpdmlkZW8tPm51bVZvcHNJbkdPUCkgJSAzMCA9PSAxKQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gaHRmbV9zdGF0LT5vZmZzZXRBcnJheTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb2Zmc2V0ID0gdmlkZW8tPm5ybWx6X3RoICsgMTY7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBwdHIgPSBjdXIgKyBvZmZzZXRbaV07CisgICAgICAgIHdvcmQgPSBwdHJbMF07CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9ICh3aWR0aCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9ICh3aWR0aCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9ICh3aWR0aCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisjZW5kaWYKKwordm9pZCAgICBQcmVwYXJlQ3VyTUIoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmN1cikKK3sKKyAgICB2b2lkKiB0bXAgPSAodm9pZCopKHZpZGVvLT5jdXJyWU1CKTsKKyAgICBVTG9uZyAqY3VycllNQiA9IChVTG9uZyopdG1wOworICAgIEludCBpOworICAgIEludCB3aWR0aCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aDsKKworICAgIGN1ciAtPSB3aWR0aDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKFVMb25nKikoY3VyICs9IHdpZHRoKSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKChVTG9uZyopKGN1ciArIDQpKTsKKyAgICAgICAgKmN1cnJZTUIrKyA9ICooKFVMb25nKikoY3VyICsgOCkpOworICAgICAgICAqY3VycllNQisrID0gKigoVUxvbmcqKShjdXIgKyAxMikpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBNQk1vdGlvblNlYXJjaAorICAgIERhdGU6ICAgICAgIDA5LzA2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBQZXJmb3JtIG1vdGlvbiBlc3RpbWF0aW9uIGZvciBhIG1hY3JvYmxvY2suCisgICAgICAgICAgICAgICAgRmluZCAxTVYgYW5kIDRNVnMgaW4gaGFsZi1wZWxzIHJlc29sdXRpb25zLgorICAgICAgICAgICAgICAgIFVzaW5nIFNUMSBhbGdvcml0aG0gcHJvdmlkZWQgYnkgQ2hhbGlkYWJob25nc2UgYW5kIEt1bworICAgICAgICAgICAgICAgIENTVlQgTWFyY2gnOTguCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgTUJNb3Rpb25TZWFyY2goVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmN1ciwgVUNoYXIgKmJlc3RfY2FuZFtdLAorICAgICAgICAgICAgICAgICAgICBJbnQgaTAsIEludCBqMCwgSW50IHR5cGVfcHJlZCwgSW50IEZTX2VuLCBJbnQgKmhwX2d1ZXNzKQoreworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgVUNoYXIgKnJlZiwgKmNhbmQsICpuY2FuZCA9IE5VTEwsICpjdXI4OworICAgIHZvaWQgKmV4dHJhX2luZm8gPSB2aWRlby0+c2FkX2V4dHJhX2luZm87CisgICAgSW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIEludCB3aWR0aCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aDsgLyogNi8xMi8wMSwgbXVzdCBiZSBtdWx0aXBsZSBvZiAxNiAqLworICAgIEludCBoZWlnaHQgPSB2aWRlby0+Y3VyclZvcC0+aGVpZ2h0OworICAgIE1PVCAqKm1vdCA9IHZpZGVvLT5tb3Q7CisgICAgVUNoYXIgdXNlXzRtdiA9IHZpZGVvLT5lbmNQYXJhbXMtPk1WOHg4X0VuYWJsZWQ7CisgICAgVUNoYXIgaDI2M19tb2RlID0gdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkOworICAgIEludCgqU0FEX01hY3JvYmxvY2spKFVDaGFyKiwgVUNoYXIqLCBJbnQsIHZvaWQqKSA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrOworICAgIEludCgqU0FEX0Jsb2NrKShVQ2hhciosIFVDaGFyKiwgSW50LCBJbnQsIHZvaWQqKSA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbG9jazsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgcmFuZ2UgPSBlbmNQYXJhbXMtPlNlYXJjaFJhbmdlOworCisgICAgSW50IGx4ID0gdmlkZW8tPmN1cnJWb3AtPnBpdGNoOyAvKiBwYWRkaW5nICovCisgICAgSW50IGNvbXA7CisgICAgSW50IGksIGosIGltaW4sIGptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaCwgaW9yZywgam9yZzsKKyAgICBJbnQgZCwgZG1pbiwgZG5bOV07CisjaWYgKFpFUk9fTVZfUFJFRj09MSkgICAvKiBjb21wdXRlICgwLDApIE1WIGF0IHRoZSBlbmQgKi8KKyAgICBJbnQgZDA7CisjZW5kaWYKKyAgICBJbnQgazsKKyAgICBJbnQgbXZ4WzVdLCBtdnlbNV0sIGltaW4wLCBqbWluMDsKKyAgICBJbnQgbnVtX2NhbiwgY2VudGVyX2FnYWluOworICAgIEludCBsYXN0X2xvYywgbmV3X2xvYyA9IDA7CisgICAgSW50IHN0ZXAsIG1heF9zdGVwID0gcmFuZ2UgPj4gMTsKKyAgICBJbnQgbmV4dDsKKworICAgIHJlZiA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wLT55Q2hhbjsgLyogb3JpZ2luIG9mIGFjdHVhbCBmcmFtZSAqLworCisgICAgY3VyID0gdmlkZW8tPmN1cnJZTUI7IC8qIHVzZSBzbWFsbGVyIG1lbW9yeSBzcGFjZSBmb3IgY3VycmVudCBNQiAqLworCisgICAgLyogIGZpbmQgbGltaXQgb2YgdGhlIHNlYXJjaCAoYWRqdXN0aW5nIHNlYXJjaCByYW5nZSkqLworCisgICAgaWYgKCFoMjYzX21vZGUpCisgICAgeworICAgICAgICBpbG93ID0gaTAgLSByYW5nZTsKKyAgICAgICAgaWYgKGlsb3cgPCAtMTUpCisgICAgICAgICAgICBpbG93ID0gLTE1OworICAgICAgICBpaGlnaCA9IGkwICsgcmFuZ2UgLSAxOworICAgICAgICBpZiAoaWhpZ2ggPiB3aWR0aCAtIDEpCisgICAgICAgICAgICBpaGlnaCA9IHdpZHRoIC0gMTsKKyAgICAgICAgamxvdyA9IGowIC0gcmFuZ2U7CisgICAgICAgIGlmIChqbG93IDwgLTE1KQorICAgICAgICAgICAgamxvdyA9IC0xNTsKKyAgICAgICAgamhpZ2ggPSBqMCArIHJhbmdlIC0gMTsKKyAgICAgICAgaWYgKGpoaWdoID4gaGVpZ2h0IC0gMSkKKyAgICAgICAgICAgIGpoaWdoID0gaGVpZ2h0IC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWxvdyA9IGkwIC0gcmFuZ2U7CisgICAgICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgICAgIGlsb3cgPSAwOworICAgICAgICBpaGlnaCA9IGkwICsgcmFuZ2UgLSAxOworICAgICAgICBpZiAoaWhpZ2ggPiB3aWR0aCAtIDE2KQorICAgICAgICAgICAgaWhpZ2ggPSB3aWR0aCAtIDE2OworICAgICAgICBqbG93ID0gajAgLSByYW5nZTsKKyAgICAgICAgaWYgKGpsb3cgPCAwKQorICAgICAgICAgICAgamxvdyA9IDA7CisgICAgICAgIGpoaWdoID0gajAgKyByYW5nZSAtIDE7CisgICAgICAgIGlmIChqaGlnaCA+IGhlaWdodCAtIDE2KQorICAgICAgICAgICAgamhpZ2ggPSBoZWlnaHQgLSAxNjsKKyAgICB9CisKKyAgICBpbWluID0gaTA7CisgICAgam1pbiA9IGowOyAvKiBuZWVkZWQgZm9yIGZ1bGxzZWFyY2ggKi8KKyAgICBuY2FuZCA9IHJlZiArIGltaW4gKyBqbWluICogbHg7CisKKyAgICAvKiBmb3IgZmlyc3Qgcm93IG9mIE1CLCBmdWxsc2VhcmNoIGNhbiBiZSB1c2VkICovCisgICAgaWYgKEZTX2VuKQorICAgIHsKKyAgICAgICAgKmhwX2d1ZXNzID0gMDsgLyogbm8gZ3Vlc3MgZm9yIGZhc3QgaGFsZi1wZWwgKi8KKworICAgICAgICBkbWluID0gIGZ1bGxzZWFyY2godmlkZW8sIGN1cnJWb2wsIHJlZiwgY3VyLCAmaW1pbiwgJmptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaCk7CisKKyAgICAgICAgbmNhbmQgPSByZWYgKyBpbWluICsgam1pbiAqIGx4OworCisgICAgICAgIG1vdFttYm51bV1bMF0uc2FkID0gZG1pbjsKKyAgICAgICAgbW90W21ibnVtXVswXS54ID0gKGltaW4gLSBpMCkgPDwgMTsKKyAgICAgICAgbW90W21ibnVtXVswXS55ID0gKGptaW4gLSBqMCkgPDwgMTsKKyAgICAgICAgaW1pbjAgPSBpbWluIDw8IDE7ICAvKiAxNngxNiBNViBpbiBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgICAgIGptaW4wID0gam1pbiA8PCAxOworICAgICAgICBiZXN0X2NhbmRbMF0gPSBuY2FuZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiA0LzcvMDEsIG1vZGlmaWVkIHRoaXMgdGVzdGluZyBmb3IgZnVsbHNlYXJjaCB0aGUgdG9wIHJvdyB0byBvbmx5IHVwdG8gKDAsMykgTUIgKi8KKyAgICAgICAgLyogICAgICAgICAgICB1cHRvIDMwJSBjb21wbGV4aXR5IHNhdmluZyB3aXRoIHRoZSBzYW1lIGNvbXBsZXhpdHkgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCAmJiBqMCA9PSAwICYmIGkwIDw9IDY0ICYmIHR5cGVfcHJlZCAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICAqaHBfZ3Vlc3MgPSAwOyAvKiBubyBndWVzcyBmb3IgZmFzdCBoYWxmLXBlbCAqLworICAgICAgICAgICAgZG1pbiA9ICBmdWxsc2VhcmNoKHZpZGVvLCBjdXJyVm9sLCByZWYsIGN1ciwgJmltaW4sICZqbWluLCBpbG93LCBpaGlnaCwgamxvdywgamhpZ2gpOworICAgICAgICAgICAgbmNhbmQgPSByZWYgKyBpbWluICsgam1pbiAqIGx4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqIGluaXRpYWxpemUgY2FuZGlkYXRlICoqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogZmluZCBpbml0aWFsIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgICAgIENhbmRpZGF0ZVNlbGVjdGlvbihtdngsIG12eSwgJm51bV9jYW4sIGkwID4+IDQsIGowID4+IDQsIHZpZGVvLCB0eXBlX3ByZWQpOworCisgICAgICAgICAgICBkbWluID0gNjU1MzU7CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIGFsbCBhcmUgZXF1YWwgKi8KKyAgICAgICAgICAgIGlmIChudW1fY2FuID09IEFMTF9DQU5EX0VRVUFMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkgPSBpMCArIG12eFswXTsKKyAgICAgICAgICAgICAgICBqID0gajAgKyBtdnlbMF07CisKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKworICAgICAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqIGV2YWx1YXRlIHVuaXF1ZSBjYW5kaWRhdGVzICoqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9jYW47IGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkgPSBpMCArIG12eFtrXTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGowICsgbXZ5W2tdOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoZCA9PSBkbWluKSAmJiBQVl9BQlMobXZ4W2tdKSArIFBWX0FCUyhtdnlba10pIDwgUFZfQUJTKGkwIC0gaW1pbikgKyBQVl9BQlMoajAgLSBqbWluKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtX2NhbiA9PSAwIHx8IGRtaW4gPT0gNjU1MzUpIC8qIG5vIGNhbmRpZGF0ZSBzZWxlY3RlZCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jYW5kID0gcmVmICsgaTAgKyBqMCAqIGx4OyAvKiB1c2UgKDAsMCkgTVYgYXMgaW5pdGlhbCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIG1vdFttYm51bV1bN10uc2FkID0gZG1pbiA9ICgqU0FEX01hY3JvYmxvY2spKG5jYW5kLCBjdXIsICg2NTUzNSA8PCAxNikgfCBseCwgZXh0cmFfaW5mbyk7CisjaWYgKFpFUk9fTVZfUFJFRj09MSkgICAvKiBjb21wdXRlICgwLDApIE1WIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgICAgICAgICBkMCA9IGRtaW47CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpbWluID0gaTA7CisgICAgICAgICAgICAgICAgam1pbiA9IGowOworICAgICAgICAgICAgfQorCisjaWYgKFpFUk9fTVZfUFJFRj09MCkgIC8qICBDT01QVVRFIFpFUk8gVkVDVE9SIEZJUlNUICEhISEhKi8KKyAgICAgICAgICAgIGRtaW4gLT0gUFJFRl9OVUxMX1ZFQzsKKyNlbmRpZgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKiBsb2NhbCByZWZpbmVtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDA7CisgICAgICAgICAgICBsYXN0X2xvYyA9IG5ld19sb2MgPSAwOworICAgICAgICAgICAgLy8gICAgICAgICAgbmNhbmQgPSByZWYgKyBqbWluKmx4ICsgaW1pbjsgIC8qIGNlbnRlciBvZiB0aGUgc2VhcmNoICovCisgICAgICAgICAgICBzdGVwID0gMDsKKyAgICAgICAgICAgIGRuWzBdID0gZG1pbjsKKyAgICAgICAgICAgIHdoaWxlICghY2VudGVyX2FnYWluICYmIHN0ZXAgPD0gbWF4X3N0ZXApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBNb3ZlTmVpZ2hib3JTQUQoZG4sIGxhc3RfbG9jKTsKKworICAgICAgICAgICAgICAgIGNlbnRlcl9hZ2FpbiA9IDE7CisgICAgICAgICAgICAgICAgaSA9IGltaW47CisgICAgICAgICAgICAgICAgaiA9IGptaW4gLSAxOworICAgICAgICAgICAgICAgIGNhbmQgPSByZWYgKyBpICsgaiAqIGx4OworCisgICAgICAgICAgICAgICAgLyogIHN0YXJ0aW5nIGZyb20gWzAsLTFdICovCisgICAgICAgICAgICAgICAgLyogc3BpcmFsIGNoZWNrIG9uZSBzdGVwIGF0IGEgdGltZSovCisgICAgICAgICAgICAgICAgZm9yIChrID0gMjsgayA8PSA4OyBrICs9IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYl9leGNsdWRlW2xhc3RfbG9jXVtrXSkgLyogZXhjbHVkZSBsYXN0IHN0ZXAgY29tcHV0YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAvKiBub3QgYWxyZWFkeSBjb21wdXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbltrXSA9IGQ7IC8qIGtlZXAgaXQgZm9yIGhhbGYgcGVsIHVzZSAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbG9jID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGQgPT0gZG1pbikgJiYgUFZfQUJTKGkwIC0gaSkgKyBQVl9BQlMoajAgLSBqKSA8IFBWX0FCUyhpMCAtIGltaW4pICsgUFZfQUJTKGowIC0gam1pbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xvYyA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChrID09IDgpICAvKiBlbmQgc2lkZSBzZWFyY2gqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gLTE7IC8qIHN0YXJ0IGRpYWdvbmFsIHNlYXJjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmQgLT0gbHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlZmluZV9uZXh0W2tdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlZmluZV9uZXh0W2tdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBseCAqIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF9sb2MgPSBuZXdfbG9jOworICAgICAgICAgICAgICAgIHN0ZXAgKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICBNb3ZlTmVpZ2hib3JTQUQoZG4sIGxhc3RfbG9jKTsKKworICAgICAgICAgICAgKmhwX2d1ZXNzID0gRmluZE1pbihkbik7CisKKyAgICAgICAgfQorCisjaWYgKFpFUk9fTVZfUFJFRj09MSkgICAvKiBjb21wdXRlICgwLDApIE1WIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgaWYgKGQwIC0gUFJFRl9OVUxMX1ZFQyA8IGRtaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jYW5kID0gcmVmICsgaTAgKyBqMCAqIGx4OworICAgICAgICAgICAgZG1pbiA9IGQwOworICAgICAgICAgICAgaW1pbiA9IGkwOworICAgICAgICAgICAgam1pbiA9IGowOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgbW90W21ibnVtXVswXS5zYWQgPSBkbWluOworICAgICAgICBtb3RbbWJudW1dWzBdLnggPSAoaW1pbiAtIGkwKSA8PCAxOworICAgICAgICBtb3RbbWJudW1dWzBdLnkgPSAoam1pbiAtIGowKSA8PCAxOworICAgICAgICBpbWluMCA9IGltaW4gPDwgMTsgIC8qIDE2eDE2IE1WIGluIGhhbGYtcGVsIHJlc29sdXRpb24gKi8KKyAgICAgICAgam1pbjAgPSBqbWluIDw8IDE7CisgICAgICAgIGJlc3RfY2FuZFswXSA9IG5jYW5kOworICAgIH0KKyAgICAvKiBpbWluIGFuZCBqbWluIGlzIHRoZSBiZXN0IDEgTVYgKi8KKyNpZm5kZWYgTk9fSU5URVI0VgorICAgIC8qKioqKioqKioqKioqKioqKioqICBGaW5kIDQgbW90aW9uIHZlY3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAodXNlXzRtdiAmJiAhaDI2M19tb2RlKQorICAgIHsKKyNpZmRlZiBfU0FEX1NUQVQKKyAgICAgICAgbnVtX0JsayArPSA0OworI2VuZGlmCisgICAgICAgIC8qIHN0YXJ0aW5nIGZyb20gdGhlIGJlc3QgMU1WICovCisgICAgICAgIC8vb2Zmc2V0ID0gaW1pbiArIGptaW4qbHg7CisgICAgICAgIGlvcmcgPSBpMDsKKyAgICAgICAgam9yZyA9IGowOworCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGkwID0gaW9yZyArICgoY29tcCAmIDEpIDw8IDMpOworICAgICAgICAgICAgajAgPSBqb3JnICsgKChjb21wICYgMikgPDwgMik7CisKKyAgICAgICAgICAgIGltaW4gPSAoaW1pbjAgPj4gMSkgKyAoKGNvbXAgJiAxKSA8PCAzKTsgICAgLyogc3RhcnRpbmcgcG9pbnQgZnJvbSAxNngxNiBNViAqLworICAgICAgICAgICAgam1pbiA9IChqbWluMCA+PiAxKSArICgoY29tcCAmIDIpIDw8IDIpOworICAgICAgICAgICAgbmNhbmQgPSByZWYgKyBpbWluICsgam1pbiAqIGx4OworCisgICAgICAgICAgICBjdXI4ID0gY3VyICsgKChjb21wICYgMSkgPDwgMykgKyAoKChjb21wICYgMikgPDwgMikgPDwgNCkgOyAvKiAxMS8zMC8wNSwgc21hbGxlciBjYWNoZSAqLworCisgICAgICAgICAgICAvKiAgZmluZCBsaW1pdCBvZiB0aGUgc2VhcmNoIChhZGp1c3Rpbmcgc2VhcmNoIHJhbmdlKSovCisgICAgICAgICAgICBpbG93ID0gaTAgLSByYW5nZTsKKyAgICAgICAgICAgIGloaWdoID0gaTAgKyByYW5nZSAtIDEgOy8qIDQvOS8wMSAqLworICAgICAgICAgICAgaWYgKGlsb3cgPCAtMTUpCisgICAgICAgICAgICAgICAgaWxvdyA9IC0xNTsKKyAgICAgICAgICAgIGlmIChpaGlnaCA+IHdpZHRoIC0gMSkKKyAgICAgICAgICAgICAgICBpaGlnaCA9IHdpZHRoIC0gMTsKKyAgICAgICAgICAgIGpsb3cgPSBqMCAtIHJhbmdlOworICAgICAgICAgICAgamhpZ2ggPSBqMCArIHJhbmdlIC0gMSA7LyogNC85LzAxICovCisgICAgICAgICAgICBpZiAoamxvdyA8IC0xNSkKKyAgICAgICAgICAgICAgICBqbG93ID0gLTE1OworICAgICAgICAgICAgaWYgKGpoaWdoID4gaGVpZ2h0IC0gMSkKKyAgICAgICAgICAgICAgICBqaGlnaCA9IGhlaWdodCAtIDE7CisKKyAgICAgICAgICAgIFNBRF9CbG9jayA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbG9jazsKKworICAgICAgICAgICAgaWYgKEZTX2VuKSAgLyogZnVsbHNlYXJjaCBlbmFibGUsIGNlbnRlciBhcm91bmQgMTZ4MTYgTVYgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbWluID0gIGZ1bGxzZWFyY2hCbGsodmlkZW8sIGN1cnJWb2wsIG5jYW5kLCBjdXI4LCAmaW1pbiwgJmptaW4sIGlsb3csIGloaWdoLCBqbG93LCBqaGlnaCwgcmFuZ2UpOworICAgICAgICAgICAgICAgIG5jYW5kID0gcmVmICsgaW1pbiArIGptaW4gKiBseDsKKworICAgICAgICAgICAgICAgIG1vdFttYm51bV1bY29tcCsxXS5zYWQgPSBkbWluOworICAgICAgICAgICAgICAgIG1vdFttYm51bV1bY29tcCsxXS54ID0gKGltaW4gLSBpMCkgPDwgMTsKKyAgICAgICAgICAgICAgICBtb3RbbWJudW1dW2NvbXArMV0ueSA9IChqbWluIC0gajApIDw8IDE7CisgICAgICAgICAgICAgICAgYmVzdF9jYW5kW2NvbXArMV0gPSBuY2FuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgLyogbm8gZnVsbHNlYXJjaCwgZG8gbG9jYWwgc2VhcmNoICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgcG9pbnQgZnJvbSAxNngxNiAqLworICAgICAgICAgICAgICAgIGRtaW4gPSAoKlNBRF9CbG9jaykobmNhbmQsIGN1cjgsIDY1NTM2LCBseCwgZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKiBsb2NhbCByZWZpbmVtZW50ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgICAgIGxhc3RfbG9jID0gMDsKKworICAgICAgICAgICAgICAgIHdoaWxlICghY2VudGVyX2FnYWluKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGltaW47CisgICAgICAgICAgICAgICAgICAgIGogPSBqbWluIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisKKyAgICAgICAgICAgICAgICAgICAgLyogIHN0YXJ0aW5nIGZyb20gWzAsLTFdICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNwaXJhbCBjaGVjayBvbmUgc3RlcCBhdCBhIHRpbWUqLworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAyOyBrIDw9IDg7IGsgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJfZXhjbHVkZVtsYXN0X2xvY11ba10pIC8qIGV4Y2x1ZGUgbGFzdCBzdGVwIGNvbXB1dGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgIC8qIG5vdCBhbHJlYWR5IGNvbXB1dGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX0Jsb2NrKShjYW5kLCBjdXI4LCBkbWluLCBseCwgZXh0cmFfaW5mbyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FuZCA9IGNhbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xvYyA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGQgPT0gZG1pbikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFZfQUJTKGkwIC0gaSkgKyBQVl9BQlMoajAgLSBqKSA8IFBWX0FCUyhpMCAtIGltaW4pICsgUFZfQUJTKGowIC0gam1pbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWdhaW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xvYyA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9PSA4KSAgLyogZW5kIHNpZGUgc2VhcmNoKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAtMTsgLyogc3RhcnQgZGlhZ29uYWwgc2VhcmNoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDw9IGhlaWdodCAtIDEgJiYgaiA+IDApICAgY2FuZCAtPSBseDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcmVmaW5lX25leHRba11bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gcmVmaW5lX25leHRba11bMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBseCAqIG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxhc3RfbG9jID0gbmV3X2xvYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbW90W21ibnVtXVtjb21wKzFdLnNhZCA9IGRtaW47CisgICAgICAgICAgICAgICAgbW90W21ibnVtXVtjb21wKzFdLnggPSAoaW1pbiAtIGkwKSA8PCAxOworICAgICAgICAgICAgICAgIG1vdFttYm51bV1bY29tcCsxXS55ID0gKGptaW4gLSBqMCkgPDwgMTsKKyAgICAgICAgICAgICAgICBiZXN0X2NhbmRbY29tcCsxXSA9IG5jYW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAgLyogTk9fSU5URVI0ViAqLworICAgIHsKKyAgICAgICAgbW90W21ibnVtXVsxXS5zYWQgPSBtb3RbbWJudW1dWzJdLnNhZCA9IG1vdFttYm51bV1bM10uc2FkID0gbW90W21ibnVtXVs0XS5zYWQgPSAoZG1pbiArIDIpID4+IDI7CisgICAgICAgIG1vdFttYm51bV1bMV0ueCA9IG1vdFttYm51bV1bMl0ueCA9IG1vdFttYm51bV1bM10ueCA9IG1vdFttYm51bV1bNF0ueCA9IG1vdFttYm51bV1bMF0ueDsKKyAgICAgICAgbW90W21ibnVtXVsxXS55ID0gbW90W21ibnVtXVsyXS55ID0gbW90W21ibnVtXVszXS55ID0gbW90W21ibnVtXVs0XS55ID0gbW90W21ibnVtXVswXS55OworICAgICAgICBiZXN0X2NhbmRbMV0gPSBiZXN0X2NhbmRbMl0gPSBiZXN0X2NhbmRbM10gPSBiZXN0X2NhbmRbNF0gPSBuY2FuZDsKKworICAgIH0KKyAgICByZXR1cm4gOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIGZ1bGxzZWFyY2gKKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgUGVyZm9ybSBmdWxsLXNlYXJjaCBtb3Rpb24gZXN0aW1hdGlvbiBvdmVyIHRoZSByYW5nZSBvZiBzZWFyY2gKKyAgICAgICAgICAgICAgICByZWdpb24gaW4gYSBzcGlyYWwtb3V0d2FyZCBtYW5uZXIuCisgICAgSW5wdXQvT3V0cHV0OiAgIFZpZGVvRW5jRGF0YSwgY3VycmVudCBWb2wsIHByZXZpb3UgVm9wLCBwb2ludGVyIHRvIHRoZSBsZWZ0IGNvcm5lciBvZgorICAgICAgICAgICAgICAgIGN1cnJlbnQgVk9QLCBjdXJyZW50IGNvb3JkIChhbHNvIG91dHB1dCksIGJvdW5kYXJpZXMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworSW50IGZ1bGxzZWFyY2goVmlkZW9FbmNEYXRhICp2aWRlbywgVm9sICpjdXJyVm9sLCBVQ2hhciAqcHJldiwgVUNoYXIgKmN1ciwKKyAgICAgICAgICAgICAgIEludCAqaW1pbiwgSW50ICpqbWluLCBJbnQgaWxvdywgSW50IGloaWdoLCBJbnQgamxvdywgSW50IGpoaWdoKQoreworICAgIEludCByYW5nZSA9IHZpZGVvLT5lbmNQYXJhbXMtPlNlYXJjaFJhbmdlOworICAgIFVDaGFyICpjYW5kOworICAgIEludCBpLCBqLCBrLCBsOworICAgIEludCBkLCBkbWluOworICAgIEludCBpMCA9ICppbWluOyAvKiBjdXJyZW50IHBvc2l0aW9uICovCisgICAgSW50IGowID0gKmptaW47CisgICAgSW50KCpTQURfTWFjcm9ibG9jaykoVUNoYXIqLCBVQ2hhciosIEludCwgdm9pZCopID0gdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2s7CisgICAgdm9pZCAqZXh0cmFfaW5mbyA9IHZpZGVvLT5zYWRfZXh0cmFfaW5mbzsKKy8vICBVQ2hhciBoMjYzX21vZGUgPSB2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQ7CisgICAgSW50IGx4ID0gdmlkZW8tPmN1cnJWb3AtPnBpdGNoOyAvKiB3aXRoIHBhZGRpbmcgKi8KKworICAgIEludCBvZmZzZXQgPSBpMCArIGowICogbHg7CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoY3VyclZvbCk7CisKKyAgICBjYW5kID0gcHJldiArIG9mZnNldDsKKworICAgIGRtaW4gID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoNjU1MzUgPDwgMTYpIHwgbHgsICh2b2lkKilleHRyYV9pbmZvKSAtIFBSRUZfTlVMTF9WRUM7CisKKyAgICAvKiBwZXJmb3JtIHNwaXJhbCBzZWFyY2ggKi8KKyAgICBmb3IgKGsgPSAxOyBrIDw9IHJhbmdlOyBrKyspCisgICAgeworCisgICAgICAgIGkgPSBpMCAtIGs7CisgICAgICAgIGogPSBqMCAtIGs7CisKKyAgICAgICAgY2FuZCA9IHByZXYgKyBpICsgaiAqIGx4OworCisgICAgICAgIGZvciAobCA9IDA7IGwgPCA4Kms7IGwrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gbmVlZCBmb3IgYm91bmRhcnkgY2hlY2tpbmcgYWdhaW4gKi8KKyAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgKHZvaWQqKWV4dHJhX2luZm8pOworCisgICAgICAgICAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICppbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgKmptaW4gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoZCA9PSBkbWluKSAmJiBQVl9BQlMoaTAgLSBpKSArIFBWX0FCUyhqMCAtIGopIDwgUFZfQUJTKGkwIC0gKmltaW4pICsgUFZfQUJTKGowIC0gKmptaW4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICppbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgKmptaW4gPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGwgPCAoayA8PCAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgY2FuZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobCA8IChrIDw8IDIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBjYW5kICs9IGx4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobCA8ICgoayA8PCAyKSArIChrIDw8IDEpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgY2FuZC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgICAgICBjYW5kIC09IGx4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRtaW47Cit9CisKKyNpZm5kZWYgTk9fSU5URVI0VgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgZnVsbHNlYXJjaEJsaworICAgIERhdGU6ICAgICAgIDAxLzkvMjAwMQorICAgIFB1cnBvc2U6ICAgIFBlcmZvcm0gZnVsbC1zZWFyY2ggbW90aW9uIGVzdGltYXRpb24gb2YgYW4gOHg4IGJsb2NrIG92ZXIgdGhlIHJhbmdlCisgICAgICAgICAgICAgICAgb2Ygc2VhcmNoIHJlZ2lvbiBpbiBhIHNwaXJhbC1vdXR3YXJkIG1hbm5lciBjZW50ZXJlZCBhdCB0aGUgMTZ4MTYgTVYuCisgICAgSW5wdXQvT3V0cHV0OiAgIFZpZGVvRW5jRGF0YSwgTUIgY29vcmRpbmF0ZSwgcG9pbnRlciB0byB0aGUgaW5pdGlhbCBNViBvbiB0aGUKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UsIHBvaW50ZXIgdG8gY29vciBvZiBjdXJyZW50IGJsb2NrLCBzZWFyY2ggcmFuZ2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0ludCBmdWxsc2VhcmNoQmxrKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFZvbCAqY3VyclZvbCwgVUNoYXIgKmNlbnQsIFVDaGFyICpjdXIsCisgICAgICAgICAgICAgICAgICBJbnQgKmltaW4sIEludCAqam1pbiwgSW50IGlsb3csIEludCBpaGlnaCwgSW50IGpsb3csIEludCBqaGlnaCwgSW50IHJhbmdlKQoreworICAgIFVDaGFyICpjYW5kLCAqcmVmOworICAgIEludCBpLCBqLCBrLCBsLCBpc3RhcnQsIGpzdGFydDsKKyAgICBJbnQgZCwgZG1pbjsKKyAgICBJbnQgbHggPSB2aWRlby0+Y3VyclZvcC0+cGl0Y2g7IC8qIHdpdGggcGFkZGluZyAqLworICAgIEludCgqU0FEX0Jsb2NrKShVQ2hhciosIFVDaGFyKiwgSW50LCBJbnQsIHZvaWQqKSA9IHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbG9jazsKKyAgICB2b2lkICpleHRyYV9pbmZvID0gdmlkZW8tPnNhZF9leHRyYV9pbmZvOworCisgICAgT1NDTF9VTlVTRURfQVJHKGN1cnJWb2wpOworCisgICAgLyogc3RhcnRpbmcgcG9pbnQgY2VudGVyZWQgYXQgMTZ4MTYgTVYgKi8KKyAgICByZWYgPSBjZW50OworICAgIGlzdGFydCA9ICppbWluOworICAgIGpzdGFydCA9ICpqbWluOworCisgICAgZG1pbiA9ICgqU0FEX0Jsb2NrKShyZWYsIGN1ciwgNjU1MzYsIGx4LCAodm9pZCopZXh0cmFfaW5mbyk7CisKKyAgICBjYW5kID0gcmVmOworICAgIC8qIHBlcmZvcm0gc3BpcmFsIHNlYXJjaCAqLworICAgIGZvciAoayA9IDE7IGsgPD0gcmFuZ2U7IGsrKykKKyAgICB7CisKKyAgICAgICAgaSA9IGlzdGFydCAtIGs7CisgICAgICAgIGogPSBqc3RhcnQgLSBrOworICAgICAgICBjYW5kIC09IChseCArIDEpOyAgLyogY2FuZGlkYXRlIHJlZ2lvbiAqLworCisgICAgICAgIGZvciAobCA9IDA7IGwgPCA4Kms7IGwrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gbmVlZCBmb3IgYm91bmRhcnkgY2hlY2tpbmcgYWdhaW4gKi8KKyAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gKCpTQURfQmxvY2spKGNhbmQsIGN1ciwgZG1pbiwgbHgsICh2b2lkKilleHRyYV9pbmZvKTsKKworICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAqaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICpqbWluID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGQgPT0gZG1pbikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBQVl9BQlMoaXN0YXJ0IC0gaSkgKyBQVl9BQlMoanN0YXJ0IC0gaikgPCBQVl9BQlMoaXN0YXJ0IC0gKmltaW4pICsgUFZfQUJTKGpzdGFydCAtICpqbWluKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAqaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICpqbWluID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsIDwgKGsgPDwgMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNhbmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGwgPCAoayA8PCAyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgY2FuZCArPSBseDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGwgPCAoKGsgPDwgMikgKyAoayA8PCAxKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgICAgIGNhbmQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqLS07CisgICAgICAgICAgICAgICAgY2FuZCAtPSBseDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkbWluOworfQorI2VuZGlmIC8qIE5PX0lOVEVSNFYgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQ2FuZGlkYXRlU2VsZWN0aW9uCisgICAgRGF0ZTogICAgICAgMDkvMTYvMjAwMAorICAgIFB1cnBvc2U6ICAgIEZpbGwgdXAgdGhlIGxpc3Qgb2YgY2FuZGlkYXRlIHVzaW5nIHNwYXRpby10ZW1wb3JhbCBjb3JyZWxhdGlvbgorICAgICAgICAgICAgICAgIGFtb25nIG5laWdoYm9yaW5nIGJsb2Nrcy4KKyAgICBJbnB1dC9PdXRwdXQ6ICAgdHlwZV9wcmVkID0gMDogZmlyc3QgcGFzcywgMTogc2Vjb25kIHBhc3MsIG9yIG5vIFNDRAorICAgIE1vZGlmaWVkOiAgICAwOS8yMy8wMSwgZ2V0IHJpZCBvZiByZWR1bmRhbnQgY2FuZGlkYXRlcyBiZWZvcmUgcGFzc2luZyBiYWNrLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgQ2FuZGlkYXRlU2VsZWN0aW9uKEludCAqbXZ4LCBJbnQgKm12eSwgSW50ICpudW1fY2FuLCBJbnQgaW1iLCBJbnQgam1iLAorICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IHR5cGVfcHJlZCkKK3sKKyAgICBNT1QgKiptb3QgPSB2aWRlby0+bW90OworICAgIE1PVCAqcG1vdDsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBJbnQgbWJ3aWR0aCA9IGN1cnJWb2wtPm5NQlBlclJvdzsKKyAgICBJbnQgbWJoZWlnaHQgPSBjdXJyVm9sLT5uTUJQZXJDb2w7CisgICAgSW50IGksIGosIHNhbWUsIG51bTE7CisKKyAgICAqbnVtX2NhbiA9IDA7CisKKyAgICBpZiAodmlkZW8tPmZvcndhcmRSZWZWb3AtPnByZWRpY3Rpb25UeXBlID09IFBfVk9QKQorICAgIHsKKyAgICAgICAgLyogU3BhdGlvLVRlbXBvcmFsIENhbmRpZGF0ZSAoZml2ZSBjYW5kaWRhdGVzKSAqLworICAgICAgICBpZiAodHlwZV9wcmVkID09IDApIC8qIGZpcnN0IHBhc3MgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW1dWzBdOyAvKiBzYW1lIGNvb3JkaW5hdGUgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIGlmIChpbWIgPj0gKG1id2lkdGggPj4gMSkgJiYgaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLTFdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpbWIgKyAxIDwgbWJ3aWR0aCkgICAvKnJpZ2h0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0rMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0rbWJ3aWR0aF1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGptYiA+IDApICAgLyp1cHBlciBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGhdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbWIgPiAwICYmIGptYiA+IDApICAvKiB1cHBlci1sZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGgtMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qIHVwcGVyIHJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGgrMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAgIC8qIHNlY29uZCBwYXNzICovCisgICAgICAgICAgICAvKiBvcmlnaW5hbCBTVDEgYWxnb3JpdGhtICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtXVswXTsgLyogc2FtZSBjb29yZGluYXRlIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisKKyAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bS0xXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bS1tYndpZHRoXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAgLypyaWdodCBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtKzFdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iIDwgbWJoZWlnaHQgLSAxKSAgLypib3R0b20gbmVpZ2hib3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bSttYndpZHRoXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8qIG9ubHkgU3BhdGlhbCBDYW5kaWRhdGUgKGZvdXIgY2FuZGlkYXRlcykqLworICAgIHsKKyAgICAgICAgaWYgKHR5cGVfcHJlZCA9PSAwKSAvKmZpcnN0IHBhc3MqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW1iID4gMSkgIC8qIG5laWdoYm9yIHR3byBibG9ja3MgYXdheSB0byB0aGUgbGVmdCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLTJdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1iID4gMCAmJiBqbWIgPiAwKSAgLyogdXBwZXItbGVmdCBuZWlnaGJvciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGgtMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qIHVwcGVyIHJpZ2h0IG5laWdoYm9yICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aCsxXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyNpZmRlZiBTQ0VORV9DSEFOR0VfREVURUNUSU9OCisgICAgICAgIC8qIHNlY29uZCBwYXNzIChTVDIgYWxnb3JpdGhtKSovCisgICAgICAgIGVsc2UgaWYgKHR5cGVfcHJlZCA9PSAxKSAvKiA0LzcvMDEgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLTFdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoam1iID4gMCkgIC8qdXBwZXIgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGhdWzBdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpICAvKnJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bSsxXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bSttYndpZHRoXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyNlbHNlCisgICAgICAgIGVsc2UgLyogb3JpZ2luYWwgU1QxIGFsZ29yaXRobSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tMV1bMF07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMTsKKworICAgICAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlci1sZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90W21ibnVtLW1id2lkdGgtMV1bMF07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAxOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdFttYm51bS1tYndpZHRoXVswXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMTsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAxOworCisgICAgICAgICAgICAgICAgaWYgKGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qdXBwZXItcmlnaHQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3RbbWJudW0tbWJ3aWR0aCsxXVswXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDE7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisvLyNlbmRpZgorICAgIH0KKworICAgIC8qIDMvMjMvMDEsIHJlbW92ZSByZWR1bmRhbnQgY2FuZGlkYXRlIChwb3NzaWJsZSBrLW1lYW4pICovCisgICAgbnVtMSA9ICpudW1fY2FuOworICAgICpudW1fY2FuID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtMTsgaSsrKQorICAgIHsKKyAgICAgICAgc2FtZSA9IDA7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoIXNhbWUgJiYgaiA8ICpudW1fY2FuKQorICAgICAgICB7CisjaWYgKENBTkRJREFURV9ESVNUQU5DRT09MCkKKyAgICAgICAgICAgIGlmIChtdnhbaV0gPT0gbXZ4W2pdICYmIG12eVtpXSA9PSBtdnlbal0pCisjZWxzZQorICAgICAgICAgICAgLy8gbW9kaWZpZWQgay1tZWFuLCAzLzI0LzAxLCBzaG91bGRuJ3QgYmUgZ3JlYXRlciB0aGFuIDMKKyAgICAgICAgICAgIGlmIChQVl9BQlMobXZ4W2ldIC0gbXZ4W2pdKSArIFBWX0FCUyhtdnlbaV0gLSBtdnlbal0pIDwgQ0FORElEQVRFX0RJU1RBTkNFKQorI2VuZGlmCisgICAgICAgICAgICAgICAgc2FtZSA9IDE7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBtdnhbKm51bV9jYW5dID0gbXZ4W2ldOworICAgICAgICAgICAgbXZ5WypudW1fY2FuXSA9IG12eVtpXTsKKyAgICAgICAgICAgICgqbnVtX2NhbikrKzsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIF9TQURfU1RBVAorICAgIG51bV9jYW5kICs9ICgqbnVtX2Nhbik7CisjZW5kaWYKKworICAgIGlmIChudW0xID09IDUgJiYgKm51bV9jYW4gPT0gMSkKKyAgICAgICAgKm51bV9jYW4gPSBBTExfQ0FORF9FUVVBTDsgLyogYWxsIGFyZSBlcXVhbCAqLworCisgICAgcmV0dXJuIDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBSYXN0ZXJJbnRyYVVwZGF0ZQorICAgIERhdGU6ICAgICAgIDIvMjYvMDEKKyAgICBQdXJwb3NlOiAgICBUbyByYXN0ZXItc2NhbiBhc3NpZ24gSU5UUkEtdXBkYXRlIC4KKyAgICAgICAgICAgICAgICBOIG1hY3JvYmxvY2tzIGFyZSB1cGRhdGVkIChhbHNvIHdhcyBwcm9ncmFtbWFibGUpLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUmFzdGVySW50cmFVcGRhdGUoVUNoYXIgKmludHJhQXJyYXksIFVDaGFyICpNb2RlLCBJbnQgdG90YWxNQiwgSW50IG51bVJlZnJlc2gpCit7CisgICAgSW50IGluZHgsIGk7CisKKyAgICAvKiBmaW5kIHRoZSBsYXN0IHJlZnJlc2ggTUIgKi8KKyAgICBpbmR4ID0gMDsKKyAgICB3aGlsZSAoaW50cmFBcnJheVtpbmR4XSA9PSAxICYmIGluZHggPCB0b3RhbE1CKQorICAgICAgICBpbmR4Kys7CisKKyAgICAvKiBhZGQgbW9yZSAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtUmVmcmVzaCAmJiBpbmR4IDwgdG90YWxNQjsgaSsrKQorICAgIHsKKyAgICAgICAgTW9kZVtpbmR4XSA9IE1PREVfSU5UUkE7CisgICAgICAgIGludHJhQXJyYXlbaW5keCsrXSA9IDE7CisgICAgfQorCisgICAgLyogaWYgcmVhZCB0aGUgZW5kIG9mIGZyYW1lLCByZXNldCBhbmQgbG9vcCBhcm91bmQgKi8KKyAgICBpZiAoaW5keCA+PSB0b3RhbE1CIC0gMSkKKyAgICB7CisgICAgICAgIFJlc2V0SW50cmFVcGRhdGUoaW50cmFBcnJheSwgdG90YWxNQik7CisgICAgICAgIGluZHggPSAwOworICAgICAgICB3aGlsZSAoaSA8IG51bVJlZnJlc2ggJiYgaW5keCA8IHRvdGFsTUIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludHJhQXJyYXlbaW5keF0gPSAxOworICAgICAgICAgICAgTW9kZVtpbmR4KytdID0gTU9ERV9JTlRSQTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgUmVzZXRJbnRyYVVwZGF0ZQorICAgIERhdGU6ICAgICAgIDExLzI4LzAwCisgICAgUHVycG9zZTogICAgUmVzZXQgYWxyZWFkeSBpbnRyYSB1cGRhdGVkIGZsYWdzIHRvIGFsbCB6ZXJvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIFJlc2V0SW50cmFVcGRhdGUoVUNoYXIgKmludHJhQXJyYXksIEludCB0b3RhbE1CKQoreworICAgIE00VkVOQ19NRU1TRVQoaW50cmFBcnJheSwgMCwgc2l6ZW9mKFVDaGFyKSp0b3RhbE1CKTsKKyAgICByZXR1cm4gOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIFJlc2V0SW50cmFVcGRhdGVSZWdpb24KKyAgICBEYXRlOiAgICAgICAxMi8xLzAwCisgICAgUHVycG9zZTogICAgUmVzZXQgYWxyZWFkeSBpbnRyYSB1cGRhdGVkIGZsYWdzIGluIG9uZSByZWdpb24gdG8gYWxsIHplcm8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFJlc2V0SW50cmFVcGRhdGVSZWdpb24oVUNoYXIgKmludHJhQXJyYXksIEludCBzdGFydF9pLCBJbnQgcndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBzdGFydF9qLCBJbnQgcmhlaWdodCwgSW50IG1id2lkdGgsIEludCBtYmhlaWdodCkKK3sKKyAgICBJbnQgaW5keCwgajsKKworICAgIGlmIChzdGFydF9pICsgcndpZHRoID49IG1id2lkdGgpCisgICAgICAgIHJ3aWR0aCA9IG1id2lkdGggLSBzdGFydF9pOworICAgIGlmIChzdGFydF9qICsgcmhlaWdodCA+PSBtYmhlaWdodCkKKyAgICAgICAgcmhlaWdodCA9IG1iaGVpZ2h0IC0gc3RhcnRfajsKKworICAgIGZvciAoaiA9IHN0YXJ0X2o7IGogPCBzdGFydF9qICsgcmhlaWdodDsgaisrKQorICAgIHsKKyAgICAgICAgaW5keCA9IGogKiBtYndpZHRoOworICAgICAgICBNNFZFTkNfTUVNU0VUKGludHJhQXJyYXkgKyBpbmR4ICsgc3RhcnRfaSwgMCwgc2l6ZW9mKFVDaGFyKSpyd2lkdGgpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRnVuY3Rpb246ICAgTW92ZU5laWdoYm9yU0FECisgICAgRGF0ZTogICAgICAgMy8yNy8wMQorICAgIFB1cnBvc2U6ICAgIE1vdmUgbmVpZ2hib3JpbmcgU0FEIGFyb3VuZCB3aGVuIGNlbnRlciBoYXMgc2hpZnRlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNb3ZlTmVpZ2hib3JTQUQoSW50IGRuW10sIEludCBuZXdfbG9jKQoreworICAgIEludCB0bXBbOV07CisgICAgdG1wWzBdID0gZG5bMF07CisgICAgdG1wWzFdID0gZG5bMV07CisgICAgdG1wWzJdID0gZG5bMl07CisgICAgdG1wWzNdID0gZG5bM107CisgICAgdG1wWzRdID0gZG5bNF07CisgICAgdG1wWzVdID0gZG5bNV07CisgICAgdG1wWzZdID0gZG5bNl07CisgICAgdG1wWzddID0gZG5bN107CisgICAgdG1wWzhdID0gZG5bOF07CisgICAgZG5bMF0gPSBkblsxXSA9IGRuWzJdID0gZG5bM10gPSBkbls0XSA9IGRuWzVdID0gZG5bNl0gPSBkbls3XSA9IGRuWzhdID0gNjU1MzY7CisKKyAgICBzd2l0Y2ggKG5ld19sb2MpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZG5bNF0gPSB0bXBbMl07CisgICAgICAgICAgICBkbls1XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzNdOworICAgICAgICAgICAgZG5bNV0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls2XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzhdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZG5bNl0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls3XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzJdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbM107CisgICAgICAgICAgICBkbls2XSA9IHRtcFs1XTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzZdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbMF07CisgICAgICAgICAgICBkblsyXSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzZdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzhdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbMF07CisgICAgICAgICAgICBkblszXSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzVdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbN107CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZG5bMl0gPSB0bXBbOF07CisgICAgICAgICAgICBkblszXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzZdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzFdOworICAgICAgICAgICAgZG5bM10gPSB0bXBbMl07CisgICAgICAgICAgICBkbls0XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzVdID0gdG1wWzZdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbN107CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZG5bMF0gPSB0bXBbbmV3X2xvY107CisKKyAgICByZXR1cm4gOworfQorCisvKiAzLzI4LzAxLCBmaW5kIG1pbmltYWwgb2YgZG5bOV0gKi8KKworSW50IEZpbmRNaW4oSW50IGRuW10pCit7CisgICAgSW50IG1pbiwgaTsKKyAgICBJbnQgZG1pbjsKKworICAgIGRtaW4gPSBkblsxXTsKKyAgICBtaW4gPSAxOworICAgIGZvciAoaSA9IDI7IGkgPCA5OyBpKyspCisgICAgeworICAgICAgICBpZiAoZG5baV0gPCBkbWluKQorICAgICAgICB7CisgICAgICAgICAgICBkbWluID0gZG5baV07CisgICAgICAgICAgICBtaW4gPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1pbjsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1YTNlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCkBAIC0wLDAgKzEsMjI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfUFZERUNERUZfSF8KKyNkZWZpbmUgX1BWREVDREVGX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gLy8gZm9yIHVpbnQ4X3QsIGV0YworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBSZWRlZmluZSB0aGUgaW50IHR5cGVzCit0eXBlZGVmIHVpbnQ4X3QgdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IHVpbnQxNjsKK3R5cGVkZWYgaW50MTZfdCBpbnQxNjsKK3R5cGVkZWYgdWludDMyX3QgdWludDMyOwordHlwZWRlZiBpbnQzMl90IGludDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKKworLyoqKioqKioqKiogcGxhdGZvcm0gZGVwZW5kZW50IGluLWxpbmUgYXNzZW1ibHkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKiogSW50ZWwgKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKiogQVJNICoqKioqKioqKioqKioqKioqLworLyogZm9yIGdlbmVyYWwgQVJNIGluc3RydWN0aW9uLiAjZGVmaW5lIF9fQVJNIGhhcyB0byBiZSBkZWZpbmVkIGluIGNvbXBpbGVyIHNldCB1cC4qLworLyogZm9yIERTUCBNVUwgKi8KKyNpZmRlZiBfX1RBUkdFVF9GRUFUVVJFX0RTUE1VTAorI2RlZmluZSBfQVJNX0RTUF9NVUwKKyNlbmRpZgorCisvKiBmb3IgQ291bnQgTGVhZGluZyBaZXJvIGluc3RydWN0aW9uICovCisjaWZkZWYgX19UQVJHRVRfQVJDSF81VAorI2RlZmluZSBfQVJNX0NMWgorI2VuZGlmCisjaWZkZWYgX19UQVJHRVRfQVJDSF81VEUKKyNkZWZpbmUgX0FSTV9DTFoKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX1BWX1RZUEVTXworI2RlZmluZSBfUFZfVFlQRVNfCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNoYXI7Cit0eXBlZGVmIGNoYXIgQ2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVJbnQ7Cit0eXBlZGVmIGludCBJbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVTaG9ydDsKK3R5cGVkZWYgc2hvcnQgU2hvcnQ7Cit0eXBlZGVmIHNob3J0IGludCBTSW50OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgQm9vbDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFVMb25nOwordHlwZWRlZiB2b2lkIFZvaWQ7CisKKyNkZWZpbmUgUFZfQ09ERUNfSU5JVCAgICAgICAwCisjZGVmaW5lIFBWX0NPREVDX1NUT1AgICAgICAgMQorI2RlZmluZSBQVl9DT0RFQ19SVU5OSU5HICAgIDIKKyNkZWZpbmUgUFZfQ09ERUNfUkVTRVQgICAgICAzCisjZW5kaWYKKwordHlwZWRlZiBlbnVtCit7CisgICAgUFZfU1VDQ0VTUywKKyAgICBQVl9GQUlMLAorICAgIFBWX0VPUywgICAgICAgICAgICAgLyogaGl0IEVuZF9PZl9TZXF1ZW5jZSAgICAgKi8KKyAgICBQVl9NQl9TVFVGRklORywgICAgIC8qIGhpdCBNYWNyb2Jsb2NrX1N0dWZmaW5nICovCisgICAgUFZfRU5EX09GX1ZPUCwgICAgICAvKiBoaXQgRW5kX29mX1ZpZGVvX09iamVjdF9QbGFuZSAqLworICAgIFBWX0VORF9PRl9NQiwgICAgICAgLyogaGl0IEVuZF9vZl9NYWNyb2Jsb2NrICovCisgICAgUFZfRU5EX09GX0JVRiAgICAgICAvKiBoaXQgRW5kX29mX0JpdHN0cmVhbV9CdWZmZXIgKi8KK30gUFZfU1RBVFVTOworCit0eXBlZGVmIFVDaGFyIFBJWEVMOworLy90eXBlZGVmIEludCBNT1Q7ICAgLyogOiAiaW50IiB0eXBlIHJ1bnMgZmFzdGVyIG9uIFJJU0MgbWFjaGluZSAqLworCisjZGVmaW5lIEhURk0gICAgICAgICAgICAvKiAgMy8yLzAxLCBIeXBvdGhlc2lzIFRlc3QgRmFzdCBNYXRjaGluZyBmb3IgZWFybHkgZHJvcC1vdXQqLworLy8jZGVmaW5lIF9NT1ZFX0lOVEVSRkFDRQorCisvLyNkZWZpbmUgUkFORE9NX1JFRlNFTENPREUKKworLyogaGFuZGxlIHRoZSBjYXNlIG9mIGRldmlzaW9uIGJ5IHplcm8gaW4gUkMgKi8KKyNkZWZpbmUgTUFEX01JTiAxCisKKy8qIDQvMTEvMDEsIGlmIFNTRSBvciBNTVgsIG5vIEhURk0sIG5vIFNBRF9IUF9GTFkgKi8KKworLyogQ29kZSBzaXplIHJlZHVjdGlvbiByZWxhdGVkIE1hY3JvcyAqLworI2lmZGVmIEgyNjNfT05MWQorI2lmbmRlZiBOT19SVkxDCisjZGVmaW5lIE5PX1JWTEMKKyNlbmRpZgorI2lmbmRlZiBOT19NUEVHX1FVQU5UCisjZGVmaW5lIE5PX01QRUdfUVVBTlQKKyNlbmRpZgorI2lmbmRlZiBOT19JTlRFUjRWCisjZGVmaW5lIE5PX0lOVEVSNFYKKyNlbmRpZgorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAxCisjZGVmaW5lIEZBTFNFICAgMAorCisjZGVmaW5lIFBWX0FCUyh4KSAgICAgICAoKCh4KTwwKT8gLSh4KSA6ICh4KSkKKyNkZWZpbmUgUFZfU0lHTih4KSAgICAgICgoKHgpPDApPyAtMSA6IDEpCisjZGVmaW5lIFBWX1NJR04wKGEpICAgICAoKChhKTwwKT8gLTEgOiAoKChhKT4wKSA/IDEgOiAwKSkKKyNkZWZpbmUgUFZfTUFYKGEsYikgICAgICgoYSk+KGIpPyAoYSk6KGIpKQorI2RlZmluZSBQVl9NSU4oYSxiKSAgICAgKChhKTwoYik/IChhKTooYikpCisKKyNkZWZpbmUgTU9ERV9JTlRSQSAgICAgIDAKKyNkZWZpbmUgTU9ERV9JTlRFUiAgICAgIDEKKyNkZWZpbmUgTU9ERV9JTlRSQV9RICAgIDIKKyNkZWZpbmUgTU9ERV9JTlRFUl9RICAgIDMKKyNkZWZpbmUgTU9ERV9JTlRFUjRWICAgIDQKKyNkZWZpbmUgTU9ERV9TS0lQUEVEICAgIDYKKworI2RlZmluZSBJX1ZPUCAgICAgICAwCisjZGVmaW5lIFBfVk9QICAgICAgIDEKKyNkZWZpbmUgQl9WT1AgICAgICAgMgorCisvKjA5LzA0LzAwIEFkZCBNQiBoZWlnaHQgYW5kIHdpZHRoICovCisjZGVmaW5lIE1CX1dJRFRIIDE2CisjZGVmaW5lIE1CX0hFSUdIVCAxNgorCisjZGVmaW5lIFZPUF9CUklHSFRfV0hJVEVFTkMgMjU1CisKKworI2RlZmluZSBMVU1JTkFOQ0VfRENfVFlQRSAgIDEKKyNkZWZpbmUgQ0hST01JTkFOQ0VfRENfVFlQRSAyCisKKyNkZWZpbmUgRU9CX0NPREUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEVPQl9DT0RFX0xFTkdUSCAgICAgICAgICAgICAgICAzMgorCisvKiAxMS8zMC85OCAqLworI2RlZmluZSBGb3VuZFJNICAgICAxICAgLyogUmVzeW5jIE1hcmtlciAqLworI2RlZmluZSBGb3VuZFZTQyAgICAyICAgLyogVk9QX1NUQVJUX0NPREUuICovCisjZGVmaW5lIEZvdW5kR1NDICAgIDMgICAvKiBHUk9VUF9TVEFSVF9DT0RFICovCisjZGVmaW5lIEZvdW5kRU9CICAgIDQgICAvKiBFT0JfQ09ERSAqLworCisKKy8qIDA1LzA4LzIwMDAsIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGZyb20gQml0c3RyZWFtU2hvd0JpdHMoKSAqLworI2RlZmluZSBCSVRTVFJFQU1fRVJST1JfQ09ERSAweEZGRkZGRkZGCisKKy8qIFBhY2tldFZpZGVvICJhYnNvbHV0aW9uIHRpbWVzdGFtcCIgb2JqZWN0LiAgMDYvMTMvMjAwMCAqLworI2RlZmluZSBQVlRTX1NUQVJUX0NPREUgICAgICAgICAweDAxQzQKKyNkZWZpbmUgUFZUU19TVEFSVF9DT0RFX0xFTkdUSCAgMzIKKworLyogc2Vzc2lvbiBsYXllciBhbmQgdm9wIGxheWVyIHN0YXJ0IGNvZGVzICovCisKKyNkZWZpbmUgU0VTU0lPTl9TVEFSVF9DT0RFICAweDAxQjAKKyNkZWZpbmUgU0VTU0lPTl9FTkRfQ09ERSAgICAweDAxQjEKKyNkZWZpbmUgVklTVUFMX09CSkVDVF9TVEFSVF9DT0RFIDB4MDFCNQorCisjZGVmaW5lIFZPX1NUQVJUX0NPREUgICAgICAgICAgIDB4OAorI2RlZmluZSBWT19IRUFERVJfTEVOR1RIICAgICAgICAzMiAgICAgIC8qIGxlbmd0aG8gb2YgVk8gaGVhZGVyOiBWT19TVEFSVF9DT0RFICsgIFZPX0lEICovCisKKyNkZWZpbmUgU09MX1NUQVJUX0NPREUgICAgICAgICAgMHgwMUJFCisjZGVmaW5lIFNPTF9TVEFSVF9DT0RFX0xFTkdUSCAgIDMyCisKKyNkZWZpbmUgVk9MX1NUQVJUX0NPREUgMHgxMgorI2RlZmluZSBWT0xfU1RBUlRfQ09ERV9MRU5HVEggMjgKKworI2RlZmluZSBWT1BfU1RBUlRfQ09ERSAweDFCNgorI2RlZmluZSBWT1BfU1RBUlRfQ09ERV9MRU5HVEggICAzMgorCisjZGVmaW5lIEdST1VQX1NUQVJUX0NPREUgICAgMHgwMUIzCisjZGVmaW5lIEdST1VQX1NUQVJUX0NPREVfTEVOR1RIICAzMgorCisjZGVmaW5lIFZPUF9JRF9DT0RFX0xFTkdUSCAgICAgIDUKKyNkZWZpbmUgVk9QX1RFTVBfUkVGX0NPREVfTEVOR1RIICAgIDE2CisKKyNkZWZpbmUgVVNFUl9EQVRBX1NUQVJUX0NPREUgICAgICAgIDB4MDFCMgorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRfQ09ERV9MRU5HVEggMzIKKworI2RlZmluZSBTVEFSVF9DT0RFX1BSRUZJWCAgICAgICAweDAxCisjZGVmaW5lIFNUQVJUX0NPREVfUFJFRklYX0xFTkdUSCAgICAyNAorCisjZGVmaW5lIFNIT1JUX1ZJREVPX1NUQVJUX01BUktFUiAgICAgICAgIDB4MjAKKyNkZWZpbmUgU0hPUlRfVklERU9fU1RBUlRfTUFSS0VSX0xFTkdUSCAgMjIKKyNkZWZpbmUgU0hPUlRfVklERU9fRU5EX01BUktFUiAgICAgICAgICAgIDB4M0YKKyNkZWZpbmUgR09CX1JFU1lOQ19NQVJLRVIgICAgICAgICAweDAxCisjZGVmaW5lIEdPQl9SRVNZTkNfTUFSS0VSX0xFTkdUSCAgMTcKKworLyogbW90aW9uIGFuZCByZXN5bmMgbWFya2VycyB1c2VkIGluIGVycm9yIHJlc2lsaWVudCBtb2RlICAqLworCisjZGVmaW5lIERDX01BUktFUiAgICAgICAgICAgICAgICAgICAgICA0MzgyNzMKKyNkZWZpbmUgRENfTUFSS0VSX0xFTkdUSCAgICAgICAgICAgICAgICAxOQorCisjZGVmaW5lIE1PVElPTl9NQVJLRVJfQ09NQiAgICAgICAgICAgICAxMjY5NzcKKyNkZWZpbmUgTU9USU9OX01BUktFUl9DT01CX0xFTkdUSCAgICAgICAxNworCisjZGVmaW5lIE1PVElPTl9NQVJLRVJfU0VQICAgICAgICAgICAgICA4MTkyMQorI2RlZmluZSBNT1RJT05fTUFSS0VSX1NFUF9MRU5HVEggICAgICAgIDE3CisKKyNkZWZpbmUgUkVTWU5DX01BUktFUiAgICAgICAgICAgMQorI2RlZmluZSBSRVNZTkNfTUFSS0VSX0xFTkdUSCAgICAxNworCisjZGVmaW5lIFNQUklURV9OT1RfVVNFRCAgICAgMAorI2RlZmluZSBTVEFUSUNfU1BSSVRFICAgICAgIDEKKyNkZWZpbmUgT05MSU5FX1NQUklURSAgICAgICAyCisjZGVmaW5lIEdNQ19TUFJJVEUgICAgICAzCisKKy8qIG1hY3JvYmxvY2sgYW5kIGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgTUJfU0laRSAxNgorI2RlZmluZSBOQ09FRkZfTUIgKE1CX1NJWkUqTUJfU0laRSkKKyNkZWZpbmUgQl9TSVpFIDgKKyNkZWZpbmUgTkNPRUZGX0JMT0NLIChCX1NJWkUqQl9TSVpFKQorI2RlZmluZSBOQ09FRkZfWSBOQ09FRkZfTUIKKyNkZWZpbmUgTkNPRUZGX1UgTkNPRUZGX0JMT0NLCisjZGVmaW5lIE5DT0VGRl9WIE5DT0VGRl9CTE9DSworCisvKiBvdmVycnVuIGJ1ZmZlciBzaXplICAqLworI2RlZmluZSBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkUgMTAwMAorCisKKy8qIFZMQyBkZWNvZGluZyByZWxhdGVkIGRlZmluaXRpb25zICovCisjZGVmaW5lIFZMQ19FUlJPUiAgICgtMSkKKyNkZWZpbmUgVkxDX0VTQ0FQRSAgNzE2NworCisjZW5kaWYgLyogX1BWREVDREVGX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NmUzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApAQCAtMCwwICsxLDMyNzggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtX2lvLmgiCisjaW5jbHVkZSAicmF0ZV9jb250cm9sLmgiCisjaW5jbHVkZSAibTR2ZW5jX29zY2wuaCIKKworCisvKiBJbnZlcnNlIG5vcm1hbCB6aWd6YWcgKi8KK2NvbnN0IHN0YXRpYyBJbnQgemlnemFnX2lbTkNPRUZGX0JMT0NLXSA9Cit7CisgICAgMCwgMSwgOCwgMTYsIDksIDIsIDMsIDEwLAorICAgIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsIDQsIDUsCisgICAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAgIDI3LCAyMCwgMTMsIDYsIDcsIDE0LCAyMSwgMjgsCisgICAgMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAorICAgIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKKyAgICA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCisgICAgNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzCit9OworCisvKiBJTlRSQSAqLworY29uc3Qgc3RhdGljIEludCBtcGVnX2lxbWF0X2RlZltOQ09FRkZfQkxPQ0tdID0KKyAgICB7ICA4LCAxNywgMTgsIDE5LCAyMSwgMjMsIDI1LCAyNywKKyAgICAgICAxNywgMTgsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjgsCisgICAgICAgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwLAorICAgICAgIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwLCAzMiwKKyAgICAgICAyMiwgMjMsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzUsCisgICAgICAgMjMsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzUsIDM4LAorICAgICAgIDI1LCAyNiwgMjgsIDMwLCAzMiwgMzUsIDM4LCA0MSwKKyAgICAgICAyNywgMjgsIDMwLCAzMiwgMzUsIDM4LCA0MSwgNDUKKyAgICB9OworCisvKiBJTlRFUiAqLworY29uc3Qgc3RhdGljIEludCBtcGVnX25xbWF0X2RlZls2NF0gID0KKyAgICB7IDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAgICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKKyAgICAgIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKyAgICAgIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI2LCAyNywKKyAgICAgIDIwLCAyMSwgMjIsIDIzLCAyNSwgMjYsIDI3LCAyOCwKKyAgICAgIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjcsIDI4LCAzMCwKKyAgICAgIDIyLCAyMywgMjQsIDI2LCAyNywgMjgsIDMwLCAzMSwKKyAgICAgIDIzLCAyNCwgMjUsIDI3LCAyOCwgMzAsIDMxLCAzMworICAgIH07CisKKy8qIFByb2ZpbGVzIGFuZCBsZXZlbHMgKi8KKy8qIFNpbXBsZSBwcm9maWxlKGxldmVsIDAtMykgYW5kIENvcmUgcHJvZmlsZSAobGV2ZWwgMS0yKSAqLworLyoge1NQTDAsIFNQTDEsIFNQTDIsIFNQTDMsIENQTDEsIENQTDIsIENQTDIsIENQTDJ9ICwgU1BMMDogU2ltcGxlIFByb2ZpbGVATGV2ZWwwLCBDUEwxOiBDb3JlIFByb2ZpbGVATGV2ZWwxLCB0aGUgbGFzdCB0d28gYXJlIHJlZHVuZGFudCBmb3IgZWFzeSB0YWJsZSBtYW5pcHVsYXRpb24gKi8KK2NvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9jb2RlWzhdID0KK3sKKyAgICAweDA4LCAweDAxLCAweDAyLCAweDAzLCAweDIxLCAweDIyLCAweDIyLCAweDIyCit9OworCitjb25zdCBzdGF0aWMgSW50IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbOF0gPQoreworICAgIDY0MDAwLCA2NDAwMCwgMTI4MDAwLCAzODQwMDAsIDM4NDAwMCwgMjAwMDAwMCwgMjAwMDAwMCwgMjAwMDAwMAorfTsKKworY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVs4XSA9Cit7CisgICAgMjA0OCwgMjA0OCwgNDA5NiwgODE5MiwgNDA5NiwgODE5MiwgODE5MiwgODE5MgorfTsKKworY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbOF0gPQoreworICAgIDE0ODUsIDE0ODUsIDU5NDAsIDExODgwLCA1OTQwLCAyMzc2MCwgMjM3NjAsIDIzNzYwCit9OworCitjb25zdCBzdGF0aWMgSW50IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzhdID0KK3sKKyAgICAxNjM4NDAsIDE2Mzg0MCwgNjU1MzYwLCA2NTUzNjAsIDI2MjE0NCwgMTMxMDcyMCwgMTMxMDcyMCwgMTMxMDcyMAorfTsKKworCisvKiBTaW1wbGUgc2NhbGFibGUgcHJvZmlsZSAobGV2ZWwgMC0yKSBhbmQgQ29yZSBzY2FsYWJsZSBwcm9maWxlIChsZXZlbCAxLTMpICovCisvKiB7U1NQTDAsIFNTUEwxLCBTU1BMMiwgU1NQTDIsIENTUEwxLCBDU1BMMiwgQ1NQTDMsIENTUEwzfSAsIFNTUEwwOiBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZUBMZXZlbDAsIENTUEwxOiBDb3JlIFNjYWxhYmxlIFByb2ZpbGVATGV2ZWwxLCB0aGUgZm91cnRoIGlzIHJlZHVuZGFudCBmb3IgZWFzeSB0YWJsZSBtYW5pcHVsYXRpb24gKi8KKworY29uc3Qgc3RhdGljIEludCBzY2FsYWJsZV9wcm9maWxlX2xldmVsX2NvZGVbOF0gPQoreworICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTIsIDB4QTEsIDB4QTIsIDB4QTMsIDB4QTMKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVs4XSA9Cit7CisgICAgMTI4MDAwLCAxMjgwMDAsIDI1NjAwMCwgMjU2MDAwLCA3NjgwMDAsIDE1MDAwMDAsIDQwMDAwMDAsIDQwMDAwMDAKK307CisKKy8qIGluIGJpdHMgKi8KK2NvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbOF0gPQoreworICAgIDIwNDgsIDIwNDgsIDQwOTYsIDQwOTYsIDQwOTYsIDQwOTYsIDE2Mzg0LCAxNjM4NAorfTsKKworY29uc3Qgc3RhdGljIEludCBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbOF0gPQoreworICAgIDE0ODUsIDc0MjUsIDIzNzYwLCAyMzc2MCwgMTQ4NTAsIDI5NzAwLCAxMjA5NjAsIDEyMDk2MAorfTsKKworY29uc3Qgc3RhdGljIEludCBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs4XSA9Cit7CisgICAgMTYzODQwLCA2NTUzNjAsIDY1NTM2MCwgNjU1MzYwLCAxMDQ4NTc2LCAxMzEwNzIwLCAxMzEwNzIwLCAxMzEwNzIwCit9OworCisKKy8qIEgyNjMgcHJvZmlsZSAwIEAgbGV2ZWwgMTAtNzAgKi8KK2NvbnN0IHN0YXRpYyBJbnQgICBoMjYzTGV2ZWxbOF0gPSB7MCwgMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzB9OworY29uc3Qgc3RhdGljIGZsb2F0IHJCUl9ib3VuZFs4XSA9IHswLCAxLCAyLCA2LCAzMiwgNjQsIDEyOCwgMjU2fTsKK2NvbnN0IHN0YXRpYyBmbG9hdCBtYXhfaDI2M19mcmFtZXJhdGVbMl0gPSB7KGZsb2F0KTMwMDAwIC8gKGZsb2F0KTIwMDIsCisgICAgICAgIChmbG9hdCkzMDAwMCAvIChmbG9hdCkxMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IHN0YXRpYyBJbnQgICBtYXhfaDI2M193aWR0aFsyXSAgPSB7MTc2LCAzNTJ9OworY29uc3Qgc3RhdGljIEludCAgIG1heF9oMjYzX2hlaWdodFsyXSA9IHsxNDQsIDI4OH07CisKKy8qIDYvMi8yMDAxLCBuZXdseSBhZGRlZCBmdW5jdGlvbnMgdG8gbWFrZSBQVkVuY29kZVZvcCBtb3JlIHJlYWRhYmxlLiAqLworSW50IERldGVybWluZUNvZGluZ0xheWVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCAqbkxheWVyLCBVTG9uZyBtb2RUaW1lKTsKK3ZvaWQgRGV0ZXJtaW5lVm9wVHlwZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKTsKK0ludCBVcGRhdGVTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVMb25nICptb2RUaW1lLCBJbnQgKnNpemUsIFBWX1NUQVRVUyBzdGF0dXMpOworQm9vbCBTZXRQcm9maWxlX0J1ZmZlclNpemUoVmlkZW9FbmNEYXRhICp2aWRlbywgZmxvYXQgZGVsYXksIEludCBiSW5pdGlhbGl6ZWQpOworCisjaWZkZWYgUFJJTlRfUkNfSU5GTworZXh0ZXJuIEZJTEUgKmZhY2N0OworZXh0ZXJuIGludCB0aVRvdGFsTnVtQml0c0dlbmVyYXRlZDsKK2V4dGVybiBpbnQgaVN0dWZmQml0czsKKyNlbmRpZgorCisjaWZkZWYgUFJJTlRfRUMKK2V4dGVybiBGSUxFICpmZWM7CisjZW5kaWYKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0RGVmYXVsdEVuY09wdGlvbigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTIvMTIvMjAwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0RGVmYXVsdEVuY09wdGlvbihWaWRlb0VuY09wdGlvbnMgKmVuY09wdGlvbiwgSW50IGVuY1VzZUNhc2UpCit7CisgICAgVmlkZW9FbmNPcHRpb25zIGRlZmF1bHRVc2VDYXNlID0ge0gyNjNfTU9ERSwgcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbU0lNUExFX1BST0ZJTEVfTEVWRUwwXSA+PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1QTEVfUFJPRklMRV9MRVZFTDAsIFBWX09GRiwgMCwgMSwgMTAwMCwgMzMsIHsxNDQsIDE0NH0sIHsxNzYsIDE3Nn0sIHsxNSwgMzB9LCB7NjQwMDAsIDEyODAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwgMTB9LCB7MTIsIDEyfSwgezAsIDB9LCBDQlJfMSwgMC4wLCBQVl9PRkYsIC0xLCAwLCBQVl9PRkYsIDE2LCBQVl9PRkYsIDAsIFBWX09OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIE9TQ0xfVU5VU0VEX0FSRyhlbmNVc2VDYXNlKTsgLy8gdW51c2VkIGZvciBub3cuIExhdGVyIHdlIGNhbiBhZGQgbW9yZSBkZWZhdWx0cyBzZXR0aW5nIGFuZCB1c2UgdGhpcworICAgIC8vIGFyZ3VtZW50IHRvIHNlbGVjdCB0aGUgcmlnaHQgb25lLgorICAgIC8qIGluIHRoZSBmdXR1cmUgd2UgY2FuIGNyZWF0ZSBtb3JlIG1lYW5pbmdmdWwgdXNlLWNhc2VzICovCisgICAgaWYgKGVuY09wdGlvbiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIH0KKworICAgIE00VkVOQ19NRU1DUFkoZW5jT3B0aW9uLCAmZGVmYXVsdFVzZUNhc2UsIHNpemVvZihWaWRlb0VuY09wdGlvbnMpKTsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWSW5pdFZpZGVvRW5jb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBJbml0aWFsaXphdGlvbiBvZiBNUDQgRW5jb2RlciBhbmQgVk8gYml0c3RyZWFtICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgNS8yMS8wMSwgYWxsb2NhdGUgb25seSB5Q2hhbiBhbmQgYXNzaWduIHVDaGFuICYgdkNoYW4gICAqLworLyogICAgICAgICAgICAgIDEyLzEyLzA1LCBhZGQgZW5jb2Rpbmcgb3B0aW9uIGFzIGlucHV0IGFyZ3VtZW50ICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEJvb2wgICAgUFZJbml0VmlkZW9FbmNvZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sLCBWaWRlb0VuY09wdGlvbnMgKmVuY09wdGlvbikKK3sKKworICAgIEJvb2wgICAgICAgIHN0YXR1cyA9IFBWX1RSVUU7CisgICAgSW50ICAgICAgICAgbkxheWVycywgaWR4LCBpLCBqOworICAgIEludCAgICAgICAgIG1heCA9IDAsIG1heF93aWR0aCA9IDAsIG1heF9oZWlnaHQgPSAwLCBwaXRjaCwgb2Zmc2V0OworICAgIEludCAgICAgICAgIHNpemUgPSAwLCBuVG90YWxNQiA9IDA7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbzsKKyAgICBWb2wgICAgICAgICAqcFZvbDsKKyAgICBWaWRlb0VuY1BhcmFtcyAgKnBFbmNQYXJhbXM7CisgICAgSW50ICAgICAgICAgdGVtcF93LCB0ZW1wX2gsIG1ic1BlclNlYzsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgICB0aGlzIHBhcnQgdXNlIHRvIGJlIFBWU2V0RW5jb2RlKCkgKi8KKyAgICBJbnQgcHJvZmlsZV90YWJsZV9pbmRleCwgKnByb2ZpbGVfbGV2ZWxfdGFibGU7CisgICAgSW50IHByb2ZpbGVfbGV2ZWwgPSBlbmNPcHRpb24tPnByb2ZpbGVfbGV2ZWw7CisgICAgSW50IFBhY2tldFNpemUgPSBlbmNPcHRpb24tPnBhY2tldFNpemUgPDwgMzsKKyAgICBJbnQgdGltZUluYywgdGltZUluY1JlczsKKyAgICBmbG9hdCBwcm9maWxlX21heF9mcmFtZXJhdGU7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtczsKKworICAgIGlmIChlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YSkgLyogdGhpcyBoYXMgYmVlbiBjYWxsZWQgKi8KKyAgICB7CisgICAgICAgIGlmIChlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCkgLyogY2hlY2sgaWYgUFZJbml0VmlkZW9FbmNvZGVyKCkgaGFzIGJlZW4gY2FsbGVkICAqLworICAgICAgICB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0VuY29kZXIoZW5jb2RlckNvbnRyb2wpOworICAgICAgICAgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckluaXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgTTRWRU5DX0ZSRUUoZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEpOworICAgICAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YSA9IE5VTEw7CisgICAgfQorICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJJbml0ID0gMDsgICAvKiByZXNldCB0aGlzIHZhbHVlICovCisKKyAgICB2aWRlbyA9IChWaWRlb0VuY0RhdGEgKilNNFZFTkNfTUFMTE9DKHNpemVvZihWaWRlb0VuY0RhdGEpKTsgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBlbmNEYXRhICovCisKKyAgICBpZiAodmlkZW8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgTTRWRU5DX01FTVNFVCh2aWRlbywgMCwgc2l6ZW9mKFZpZGVvRW5jRGF0YSkpOworCisgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEgPSAodm9pZCAqKSB2aWRlbzsgICAgICAgICAvKiBzZXQgdXAgcG9pbnRlciBpbiBWaWRlb0VuY0RhdGEgc3RydWN0dXJlICovCisKKyAgICB2aWRlby0+ZW5jUGFyYW1zID0gKFZpZGVvRW5jUGFyYW1zICopTTRWRU5DX01BTExPQyhzaXplb2YoVmlkZW9FbmNQYXJhbXMpKTsKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICBnb3RvIENMRUFOX1VQOworCisgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+ZW5jUGFyYW1zLCAwLCBzaXplb2YoVmlkZW9FbmNQYXJhbXMpKTsKKworICAgIGVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgZW5jUGFyYW1zLT5uTGF5ZXJzID0gZW5jT3B0aW9uLT5udW1MYXllcnM7CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBwYWNrZXRzaXplIGlzIHZhbGlkIChOb3RlOiBwdXQgY29kZSBoZXJlIChiZWZvcmUgYW55IG1lbW9yeSBhbGxvY2F0aW9uKSBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgbGVhayAqLworICAgIGlmICgoSW50KXByb2ZpbGVfbGV2ZWwgPCAoSW50KShTSU1QTEVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDApKSAgLyogbm9uLXNjYWxhYmxlIHByb2ZpbGUgKi8KKyAgICB7CisgICAgICAgIHByb2ZpbGVfbGV2ZWxfdGFibGUgPSAoSW50ICopcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemU7CisgICAgICAgIHByb2ZpbGVfdGFibGVfaW5kZXggPSAoSW50KXByb2ZpbGVfbGV2ZWw7CisgICAgICAgIGlmIChlbmNQYXJhbXMtPm5MYXllcnMgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorCisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbMF0gPSBwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbcHJvZmlsZV90YWJsZV9pbmRleF07CisKKyAgICB9CisgICAgZWxzZSAgIC8qIHNjYWxhYmxlIHByb2ZpbGUgKi8KKyAgICB7CisgICAgICAgIHByb2ZpbGVfbGV2ZWxfdGFibGUgPSAoSW50ICopc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemU7CisgICAgICAgIHByb2ZpbGVfdGFibGVfaW5kZXggPSAoSW50KXByb2ZpbGVfbGV2ZWwgLSAoSW50KShTSU1QTEVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDApOworICAgICAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzIDwgMikKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbaV0gPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbcHJvZmlsZV90YWJsZV9pbmRleF07CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qIGNhbm5vdCBoYXZlIHplcm8gc2l6ZSBwYWNrZXQgd2l0aCB0aGVzZSBtb2RlcyAqLworICAgIGlmIChQYWNrZXRTaXplID09IDApCisgICAgeworICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNNb2RlID09IERBVEFfUEFSVElUSU9OSU5HX01PREUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jTW9kZSA9PSBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNPcHRpb24tPmVuY01vZGUgPSBDT01CSU5FX01PREVfTk9fRVJSX1JFUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlbmNPcHRpb24tPmdvYkhlYWRlckludGVydmFsID09IDApCisgICAgeworICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNNb2RlID09IEgyNjNfTU9ERV9XSVRIX0VSUl9SRVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jTW9kZSA9IEgyNjNfTU9ERTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY01vZGUgPT0gU0hPUlRfSEVBREVSX1dJVEhfRVJSX1JFUykKKyAgICAgICAgeworICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNNb2RlID0gU0hPUlRfSEVBREVSOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFBhY2tldFNpemUgPiBwcm9maWxlX2xldmVsX3RhYmxlW3Byb2ZpbGVfdGFibGVfaW5kZXhdKQorICAgICAgICBnb3RvIENMRUFOX1VQOworCisgICAgLyogSW5pdGlhbCBEZWZhdWx0cyBmb3IgYWxsIE1vZGVzICovCisKKyAgICBlbmNQYXJhbXMtPlNlcXVlbmNlU3RhcnRDb2RlID0gMTsKKyAgICBlbmNQYXJhbXMtPkdPVl9FbmFibGVkID0gMDsKKyAgICBlbmNQYXJhbXMtPlJvdW5kaW5nVHlwZSA9IDA7CisgICAgZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyID0gUFZfTUFYKFBWX01JTihlbmNPcHRpb24tPmludHJhRENWbGNUaCwgNyksIDApOworICAgIGVuY1BhcmFtcy0+QUNEQ1ByZWRpY3Rpb24gPSAoKGVuY09wdGlvbi0+dXNlQUNQcmVkID09IFBWX09OKSA/IFRSVUUgOiBGQUxTRSk7CisgICAgZW5jUGFyYW1zLT5SQ19UeXBlID0gZW5jT3B0aW9uLT5yY1R5cGU7CisgICAgZW5jUGFyYW1zLT5SZWZyZXNoID0gZW5jT3B0aW9uLT5udW1JbnRyYU1COworICAgIGVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDA7IC8qIEVuYWJsZSBSZXN5bmMgTWFya2VyICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jT3B0aW9uLT5udW1MYXllcnM7IGkrKykKKyAgICB7CisjaWZkZWYgTk9fTVBFR19RVUFOVAorICAgICAgICBlbmNQYXJhbXMtPlF1YW50VHlwZVtpXSA9IDA7CisjZWxzZQorICAgICAgICBlbmNQYXJhbXMtPlF1YW50VHlwZVtpXSA9IGVuY09wdGlvbi0+cXVhbnRUeXBlW2ldOyAgICAgIC8qIEgyNjMgKi8KKyNlbmRpZgorICAgICAgICBpZiAoZW5jT3B0aW9uLT5wUXVhbnRbaV0gPj0gMSAmJiBlbmNPcHRpb24tPnBRdWFudFtpXSA8PSAzMSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jUGFyYW1zLT5Jbml0UXVhbnRQdm9wW2ldID0gZW5jT3B0aW9uLT5wUXVhbnRbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisgICAgICAgIGlmIChlbmNPcHRpb24tPmlRdWFudFtpXSA+PSAxICYmIGVuY09wdGlvbi0+aVF1YW50W2ldIDw9IDMxKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkluaXRRdWFudEl2b3BbaV0gPSBlbmNPcHRpb24tPmlRdWFudFtpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmNQYXJhbXMtPkhhbGZQZWxfRW5hYmxlZCA9IDE7CisgICAgZW5jUGFyYW1zLT5TZWFyY2hSYW5nZSA9IGVuY09wdGlvbi0+c2VhcmNoUmFuZ2U7IC8qIDQvMTYvMjAwMSAqLworICAgIGVuY1BhcmFtcy0+RnVsbFNlYXJjaF9FbmFibGVkID0gMDsKKyNpZmRlZiBOT19JTlRFUjRWCisgICAgZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkID0gMDsKKyNlbHNlCisgICAgZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkID0gMDsvLyBjb21tZW50IG91dCBmb3Igbm93ISEgZW5jT3B0aW9uLT5tdjh4OEVuYWJsZTsKKyNlbmRpZgorICAgIGVuY1BhcmFtcy0+SDI2M19FbmFibGVkID0gMDsKKyAgICBlbmNQYXJhbXMtPkdPQl9IZWFkZXJfSW50ZXJ2YWwgPSAwOyAvLyBuZWVkIHRvIGJlIHJlc2V0IHRvIDAKKyAgICBlbmNQYXJhbXMtPkludHJhUGVyaW9kID0gZW5jT3B0aW9uLT5pbnRyYVBlcmlvZDsgICAgLyogSW50cmEgdXBkYXRlIHBlcmlvZCB1cGRhdGUgZGVmYXVsdCovCisgICAgZW5jUGFyYW1zLT5TY2VuZUNoYW5nZV9EZXQgPSBlbmNPcHRpb24tPnNjZW5lRGV0ZWN0OworICAgIGVuY1BhcmFtcy0+RmluZUZyYW1lU2tpcF9FbmFibGVkID0gMDsKKyAgICBlbmNQYXJhbXMtPk5vRnJhbWVTa2lwX0VuYWJsZWQgPSBlbmNPcHRpb24tPm5vRnJhbWVTa2lwcGVkOworICAgIGVuY1BhcmFtcy0+Tm9QcmVTa2lwX0VuYWJsZWQgPSBlbmNPcHRpb24tPm5vRnJhbWVTa2lwcGVkOworICAgIGVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyWzBdID0gMDsKKyAgICBlbmNQYXJhbXMtPkdldFZvbEhlYWRlclsxXSA9IDA7CisgICAgZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplID0gZW5jT3B0aW9uLT5wYWNrZXRTaXplIDw8IDM7CisgICAgZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPSAwOworICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID0gMDsKKyAgICBlbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzBdID0gKGZsb2F0KTAuMDsKKyAgICBlbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdID0gKGZsb2F0KTAuMDsKKyAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IGVuY09wdGlvbi0+dmJ2RGVsYXk7ICAvKiAyc2VjIFZCViBidWZmZXIgc2l6ZSAqLworCisgICAgc3dpdGNoIChlbmNPcHRpb24tPmVuY01vZGUpCisgICAgeworCisgICAgICAgIGNhc2UgU0hPUlRfSEVBREVSOgorICAgICAgICBjYXNlIFNIT1JUX0hFQURFUl9XSVRIX0VSUl9SRVM6CisKKyAgICAgICAgICAgIC8qIEZyb20gVGFibGUgNi0yNiAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5uTGF5ZXJzID0gMTsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UXVhbnRUeXBlWzBdID0gMDsgICAgLypIMjYzICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAxOyAvKiBEaXNhYmxlIFJlc3luYyBNYXJrZXIgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDA7IC8qIENvbWJpbmVkIE1vZGUgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IDA7ICAgLyogRGlzYWJsZSBSVkxDICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJvdW5kaW5nVHlwZSA9IDA7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkludHJhRENWbGNUaHIgPSA3OyAgIC8qIHVzZV9pbnRyYV9kY192bGMgPSAwICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPk1WOHg4X0VuYWJsZWQgPSAwOworCisgICAgICAgICAgICBlbmNQYXJhbXMtPkdPQl9IZWFkZXJfSW50ZXJ2YWwgPSBlbmNPcHRpb24tPmdvYkhlYWRlckludGVydmFsOworICAgICAgICAgICAgZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgPSAyOworICAgICAgICAgICAgZW5jUGFyYW1zLT5HT1ZfRW5hYmxlZCA9IDA7CisgICAgICAgICAgICBlbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXMgPSAzMDAwMDsgICAgICAgIC8qIHRpbWVJbmNyZW1lbnRSZXMgZm9yIEgyNjMgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSDI2M19NT0RFOgorICAgICAgICBjYXNlIEgyNjNfTU9ERV9XSVRIX0VSUl9SRVM6CisKKyAgICAgICAgICAgIC8qIEZyb20gVGFibGUgNi0yNiAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5uTGF5ZXJzID0gMTsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UXVhbnRUeXBlWzBdID0gMDsgICAgLypIMjYzICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAxOyAvKiBEaXNhYmxlIFJlc3luYyBNYXJrZXIgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDA7IC8qIENvbWJpbmVkIE1vZGUgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IDA7ICAgLyogRGlzYWJsZSBSVkxDICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJvdW5kaW5nVHlwZSA9IDA7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkludHJhRENWbGNUaHIgPSA3OyAgIC8qIHVzZV9pbnRyYV9kY192bGMgPSAwICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPk1WOHg4X0VuYWJsZWQgPSAwOworCisgICAgICAgICAgICBlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCA9IDE7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkdPVl9FbmFibGVkID0gMDsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+VGltZUluY3JlbWVudFJlcyA9IDMwMDAwOyAgICAgICAgLyogdGltZUluY3JlbWVudFJlcyBmb3IgSDI2MyAqLworCisgICAgICAgICAgICBicmVhazsKKyNpZm5kZWYgSDI2M19PTkxZCisgICAgICAgIGNhc2UgREFUQV9QQVJUSVRJT05JTkdfTU9ERToKKworICAgICAgICAgICAgZW5jUGFyYW1zLT5EYXRhUGFydGl0aW9uaW5nID0gMTsgICAgICAgIC8qIEJhc2UgTGF5ZXIgRGF0YSBQYXJ0aXRpb25pbmcgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDA7IC8qIFJlc3luYyBNYXJrZXIgKi8KKyNpZmRlZiBOT19SVkxDCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOworI2Vsc2UKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IChlbmNPcHRpb24tPnJ2bGNFbmFibGUgPT0gUFZfT04pOyAvKiBSVkxDIHdoZW4gRGF0YSBQYXJ0aXRpb25pbmcgKi8KKyNlbmRpZgorICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplID0gUGFja2V0U2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzoKKworICAgICAgICAgICAgZW5jUGFyYW1zLT5EYXRhUGFydGl0aW9uaW5nID0gMDsgICAgICAgIC8qIENvbWJpbmVkIE1vZGUgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDA7IC8qIFJlc3luYyBNYXJrZXIgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IDA7ICAgICAgICAgICAvKiBObyBSVkxDICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemUgPSBQYWNrZXRTaXplOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDT01CSU5FX01PREVfTk9fRVJSX1JFUzoKKworICAgICAgICAgICAgZW5jUGFyYW1zLT5EYXRhUGFydGl0aW9uaW5nID0gMDsgICAgICAgIC8qIENvbWJpbmVkIE1vZGUgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDE7IC8qIERpc2FibGUgUmVzeW5jIE1hcmtlciAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gMDsgICAgICAgICAgIC8qIE5vIFJWTEMgKi8KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgIH0KKyAgICAvKiBTZXQgdGhlIGNvbnN0cmFpbnRzIChtYXhpbXVtIHZhbHVlcykgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBwcm9maWxlIGFuZCBsZXZlbCAqLworICAgIC8qIE5vdGUgdGhhdCBwcm9maWxlX3RhYmxlX2luZGV4IGlzIGFscmVhZHkgZmlndXJlZCBvdXQgYWJvdmUgKi8KKworICAgIC8qIGJhc2UgbGF5ZXIgKi8KKyAgICBlbmNQYXJhbXMtPnByb2ZpbGVfdGFibGVfaW5kZXggICAgPSBwcm9maWxlX3RhYmxlX2luZGV4OyAvKiBVc2VkIHRvIGxpbWl0IHRoZSBwcm9maWxlIGFuZCBsZXZlbCBpbiBTZXRQcm9maWxlX0J1ZmZlclNpemUoKSAqLworCisgICAgLyogY2hlY2sgdGltZUluY1JlcyAqLworICAgIHRpbWVJbmNSZXMgPSBlbmNPcHRpb24tPnRpbWVJbmNSZXM7CisgICAgdGltZUluYyA9IGVuY09wdGlvbi0+dGlja1BlclNyYzsKKworICAgIGlmICgodGltZUluY1JlcyA+PSAxKSAmJiAodGltZUluY1JlcyA8PSA2NTUzNikgJiYgKHRpbWVJbmMgPCB0aW1lSW5jUmVzKSAmJiAodGltZUluYyAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmICghZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+VGltZUluY3JlbWVudFJlcyA9IHRpbWVJbmNSZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXMgPSAzMDAwMDsKKy8vICAgICAgICAgIHZpZGVvLT5GcmFtZVJhdGUgPSAzMDAwMC8oZmxvYXQpMTAwMTsgLyogZml4IGl0IHRvIDI5Ljk3IGZwcyAqLworICAgICAgICB9CisgICAgICAgIHZpZGVvLT5GcmFtZVJhdGUgPSB0aW1lSW5jUmVzIC8gKChmbG9hdCl0aW1lSW5jKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmcmFtZSBkaW1lbnNpb24gKi8KKyAgICBpZiAoZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgeworICAgICAgICBzd2l0Y2ggKGVuY09wdGlvbi0+ZW5jV2lkdGhbMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMTI4OgorICAgICAgICAgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFswXSAhPSA5NikgLyogc291cmNlX2Zvcm1hdCA9IDEgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTc2OgorICAgICAgICAgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFswXSAhPSAxNDQpIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM1MjoKKyAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gMjg4KSAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDcwNDoKKyAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gNTc2KSAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDA4OgorICAgICAgICAgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFswXSAhPSAxMTUyKSAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQorICAgIHsKKyAgICAgICAgZW5jUGFyYW1zLT5MYXllckhlaWdodFtpXSA9IGVuY09wdGlvbi0+ZW5jSGVpZ2h0W2ldOworICAgICAgICBlbmNQYXJhbXMtPkxheWVyV2lkdGhbaV0gPSBlbmNPcHRpb24tPmVuY1dpZHRoW2ldOworICAgIH0KKworICAgIC8qIGNoZWNrIGZyYW1lIHJhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldID0gZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbaV07CisgICAgfQorCisgICAgaWYgKGVuY1BhcmFtcy0+bkxheWVycyA+IDEpCisgICAgeworICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMF0gPT0gZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMV0gfHwKKyAgICAgICAgICAgICAgICBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVswXSA9PSAwLiB8fCBlbmNPcHRpb24tPmVuY0ZyYW1lUmF0ZVsxXSA9PSAwLikgLyogNy8zMS8wMyAqLworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICB9CisgICAgLyogc2V0IG1heCBmcmFtZSByYXRlICovCisgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQorICAgIHsKKworICAgICAgICAvKiBNYWtlIHN1cmUgdGhlIG1heGltdW0gZnJhbWVyYXRlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgZ2l2ZW4gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKyAgICAgICAgblRvdGFsTUIgPSAoKGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpXSArIDE1KSAvIDE2KSAqICgoZW5jUGFyYW1zLT5MYXllckhlaWdodFtpXSArIDE1KSAvIDE2KTsKKworICAgICAgICBpZiAoblRvdGFsTUIgPiAwKQorICAgICAgICAgICAgcHJvZmlsZV9tYXhfZnJhbWVyYXRlID0gKGZsb2F0KWVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbaV0gLyAoZmxvYXQpblRvdGFsTUI7CisKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJvZmlsZV9tYXhfZnJhbWVyYXRlID0gKGZsb2F0KTMwLjA7CisKKyAgICAgICAgZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVtpXSA9IFBWX01JTihwcm9maWxlX21heF9mcmFtZXJhdGUsIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pOworICAgIH0KKworICAgIC8qIGNoZWNrIGJpdCByYXRlICovCisgICAgLyogc2V0IG1heCBiaXQgcmF0ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlW2ldID0gZW5jT3B0aW9uLT5iaXRSYXRlW2ldOworICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVtpXSA9IGVuY09wdGlvbi0+Yml0UmF0ZVtpXTsKKyAgICB9CisgICAgaWYgKGVuY1BhcmFtcy0+bkxheWVycyA+IDEpCisgICAgeworICAgICAgICBpZiAoZW5jT3B0aW9uLT5iaXRSYXRlWzBdID09IGVuY09wdGlvbi0+Yml0UmF0ZVsxXSB8fAorICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+Yml0UmF0ZVswXSA9PSAwIHx8IGVuY09wdGlvbi0+Yml0UmF0ZVsxXSA9PSAwKSAvKiA3LzMxLzAzICovCisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgIH0KKyAgICAvKiBjaGVjayByYXRlIGNvbnRyb2wgYW5kIHZidiBkZWxheSovCisgICAgZW5jUGFyYW1zLT5SQ19UeXBlID0gZW5jT3B0aW9uLT5yY1R5cGU7CisKKyAgICBpZiAoZW5jT3B0aW9uLT52YnZEZWxheSA9PSAwLjApIC8qIHNldCB0byBkZWZhdWx0ICovCisgICAgeworICAgICAgICBzd2l0Y2ggKGVuY09wdGlvbi0+cmNUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENCUl8xOgorICAgICAgICAgICAgY2FzZSBDQlJfMjoKKyAgICAgICAgICAgICAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IChmbG9hdCkyLjA7IC8qIGRlZmF1bHQgMnNlYyBWQlYgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDQlJfTE9XREVMQVk6CisgICAgICAgICAgICAgICAgZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSAoZmxvYXQpMC41OyAvKiBkZWZhdWx0IDAuNXNlYyBWQlYgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBWQlJfMToKKyAgICAgICAgICAgIGNhc2UgVkJSXzI6CisgICAgICAgICAgICAgICAgZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSAoZmxvYXQpMTAuMDsgLyogZGVmYXVsdCAxMHNlYyBWQlYgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBmb3JjZSB0aGlzIHZhbHVlICovCisgICAgeworICAgICAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IGVuY09wdGlvbi0+dmJ2RGVsYXk7CisgICAgfQorCisgICAgLyogY2hlY2sgc2VhcmNoIHJhbmdlICovCisgICAgaWYgKGVuY1BhcmFtcy0+SDI2M19FbmFibGVkICYmIGVuY09wdGlvbi0+c2VhcmNoUmFuZ2UgPiAxNikKKyAgICB7CisgICAgICAgIGVuY1BhcmFtcy0+U2VhcmNoUmFuZ2UgPSAxNjsgLyogNC8xNi8yMDAxICovCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGNoZWNraW5nIGZvciBjb25mbGljdCBiZXR3ZWVuIG9wdGlvbnMgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfMSB8fCB2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl8yIHx8IHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZKSAgLyogaWYgQ0JSICovCisgICAgeworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkID09IFBWX09OIHx8CisgICAgICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+Tm9QcmVTa2lwX0VuYWJsZWQgPT0gUFZfT04pIC8qIGRvbid0IGFsbG93IGZyYW1lIHNraXAqLworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HISEhISBDQlIgd2l0aCBOb0ZyYW1lU2tpcFxuIik7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDT05TVEFOVF9RKSAgIC8qIGNvbnN0YW50X1EgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPk5vRnJhbWVTa2lwX0VuYWJsZWQgPSBQVl9PTjsgIC8qIG5vIGZyYW1lIHNraXAgKi8KKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+Tm9QcmVTa2lwX0VuYWJsZWQgPSBQVl9PTjsgICAgLyogbm8gZnJhbWUgc2tpcCAqLworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgIHByaW50ZigiVHVybiBvbiBOb0ZyYW1lU2tpcFxuIik7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+Tm9GcmFtZVNraXBfRW5hYmxlZCA9PSBQVl9PTikgLyogaWYgbm8gZnJhbWUgc2tpcCAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+RmluZUZyYW1lU2tpcF9FbmFibGVkID0gUFZfT0ZGOworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgIHByaW50ZigiTm9GcmFtZVNraXAgISEhIG1heSB2aW9sYXRlIFZCVl9CVUZGRVIgY29uc3RyYWludC5cbiIpOworICAgICAgICBwcmludGYoIlR1cm4gb2ZmIEZpbmVGcmFtZVNraXBcbiIpOworI2VuZGlmCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgbkxheWVycyA9IHZpZGVvLT5lbmNQYXJhbXMtPm5MYXllcnM7IC8qIE51bWJlciBvZiBMYXllcnMgdG8gYmUgZW5jb2RlZCAqLworCisgICAgLyogRmluZCB0aGUgbWF4aW11bSB3aWR0aCpoZWlnaHQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIG9mIHRoZSBWT1BzICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKKyAgICB7CisgICAgICAgIHRlbXBfdyA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbaWR4XTsKKyAgICAgICAgdGVtcF9oID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaWR4XTsKKworICAgICAgICBpZiAoKHRlbXBfdyp0ZW1wX2gpID4gbWF4KQorICAgICAgICB7CisgICAgICAgICAgICBtYXggPSB0ZW1wX3cgKiB0ZW1wX2g7CisgICAgICAgICAgICBtYXhfd2lkdGggPSAoKHRlbXBfdyArIDE1KSA+PiA0KSA8PCA0OworICAgICAgICAgICAgbWF4X2hlaWdodCA9ICgodGVtcF9oICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgICAgICBuVG90YWxNQiA9ICgobWF4X3dpZHRoICogbWF4X2hlaWdodCkgPj4gOCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmlkZW8gc2l6ZSBhbmQgZnJhbWVyYXRlKE1Cc1BlclNlYykgYXJlIHZhbGQgKi8KKyAgICAgICAgbWJzUGVyU2VjID0gKEludCkoblRvdGFsTUIgKiB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpZHhdKTsKKyAgICAgICAgaWYgKG1ic1BlclNlYyA+IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjW2lkeF0pIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFNldCBQcm9maWxlIGFuZCBWaWRlbyBCdWZmZXIgU2l6ZSBmb3IgZWFjaCBsYXllciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl9MT1dERUxBWSkgdmlkZW8tPmVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gMC41OyAvKiBGb3IgQ0JSX0xPV0RFTEFZLCB3ZSBzZXQgMC41c2VjIGJ1ZmZlciAqLworICAgIHN0YXR1cyA9IFNldFByb2ZpbGVfQnVmZmVyU2l6ZSh2aWRlbywgdmlkZW8tPmVuY1BhcmFtcy0+VkJWX2RlbGF5LCAxKTsKKyAgICBpZiAoc3RhdHVzICE9IFBWX1RSVUUpCisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICh2aWRlbyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgLyogY3ljbGljIHJlZmVyZW5jZSBmb3IgcGFzc2luZyB0aHJvdWdoIGJvdGggc3RydWN0dXJlcyAqLworICAgIHZpZGVvLT52aWRlb0VuY0NvbnRyb2xzID0gZW5jb2RlckNvbnRyb2w7CisKKyAgICAvL3ZpZGVvLT5jdXJyTGF5ZXIgPSAwOyAvKiBTZXQgY3VycmVudCBMYXllciB0byAwICovCisgICAgLy92aWRlby0+Y3VyckZyYW1lTm8gPSAwOyAvKiBTZXQgY3VycmVudCBmcmFtZSBOdW1iZXIgdG8gMCAqLworICAgIHZpZGVvLT5uZXh0TW9kVGltZSA9IDA7CisgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gMDsgLyogU2V0cyB1cCB2ZXJ5IGZpcnN0IGZyYW1lIHRvIGJlIEktVk9QISAqLworICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOyAvKiBjb3VudGVyIGZvciBWb3BzIGluIEdvcCwgMi84LzAxICovCisKKyAgICAvL3ZpZGVvLT5mcmFtZVJhdGUgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXTsgLyogU2V0IGN1cnJlbnQgbGF5ZXIgZnJhbWUgcmF0ZSAqLworCisgICAgdmlkZW8tPlFQTUIgPSAoVUNoYXIgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQiAqIHNpemVvZihVQ2hhcikpOyAvKiBNZW1vcnkgZm9yIE1CIHF1YW50aXplcnMgKi8KKyAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworCisgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiBuVG90YWxNQik7IC8qIE1lbW9yeSBmb3IgTUIgTW9kZXMgKi8KKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiBuVG90YWxNQik7ICAgLyogTWVtb3J5IGZvciBDQlAgKFkgYW5kIEMpIG9mIGVhY2ggTUIgKi8KKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBBbGxvY2F0aW5nIG1vdGlvbiB2ZWN0b3Igc3BhY2UgYW5kIGludGVycG9sYXRpb24gbWVtb3J5Ki8KKworICAgIHZpZGVvLT5tb3QgPSAoTU9UICoqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKE1PVCAqKSAqIG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPm1vdCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuVG90YWxNQjsgaWR4KyspCisgICAgeworICAgICAgICB2aWRlby0+bW90W2lkeF0gPSAoTU9UICopTTRWRU5DX01BTExPQyhzaXplb2YoTU9UKSAqIDgpOworICAgICAgICBpZiAodmlkZW8tPm1vdFtpZHhdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+aW50cmFBcnJheSA9IChVQ2hhciAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPmludHJhQXJyYXkgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIHZpZGVvLT5zbGljZU5vID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0MoblRvdGFsTUIpOyAvKiBNZW1vcnkgZm9yIFNsaWNlIE51bWJlcnMgKi8KKyAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICAvKiBBbGxvY2F0aW5nIHNwYWNlIGZvciBwcmVkRENBQ1tdWzhdWzE2XSwgTm90IHRoYXQgSSBpbnRlbnRpb25hbGx5ICAqLworICAgIC8qICAgIGluY3JlYXNlIHRoZSBkaW1lbnNpb24gb2YgcHJlZERDQUMgZnJvbSBbXVs2XVsxNV0gdG8gW11bOF1bMTZdICovCisgICAgLyogICAgc28gdGhhdCBjb21waWxlcnMgY2FuIGdlbmVyYXRlIGZhc3RlciBjb2RlIHRvIGluZGV4aW5nIHRoZSAgICAgKi8KKyAgICAvKiAgICBkYXRhIGluc2lkZSAoYnkgdXNpbmcgPDwgaW5zdGVhZCBvZiAqKS4gICAgICAgICAwNC8xNC8yMDAwLiAqLworICAgIC8qIDUvMjkvMDEsIHVzZSAgZGVjb2RlciBsaWIgQUNEQyBwcmVkaWN0aW9uIG1lbW9yeSBzY2hlbWUuICAqLworICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOworICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICBpZiAoIXZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICB7CisgICAgICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKSBNNFZFTkNfTUFMTE9DKCgobWF4X3dpZHRoID4+IDQpICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOworICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgICAgIC8qIGVsZW1lbnQgemVybyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgdmVydGljYWwgKGNvbCkgQUMgY29lZmZpY2llbnRzICovCisgICAgICAgIC8qICB0aGUgcmVzdCB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgaG9yaXpvbnRhbCAocm93KSBBQyBjb2VmZmljaWVudHMgICovCisgICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfY29sICsgMTsgICAgICAgIC8qICBBQ0RDICovCisKKyAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAoSW50ICopIE00VkVOQ19NQUxMT0MoblRvdGFsTUIgKiBzaXplb2YoSW50KSk7IC8qIE1lbW9yeSBmb3IgYWNQcmVkRmxhZyAqLworICAgICAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICB9CisKKyAgICB2aWRlby0+b3V0cHV0TUIgPSAoTWFjcm9CbG9jayAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihNYWNyb0Jsb2NrKSk7IC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLworICAgIGlmICh2aWRlby0+b3V0cHV0TUIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5vdXRwdXRNQi0+YmxvY2tbMF0sIDAsIChzaXplb2YoU2hvcnQpIDw8IDYpKjYpOworCisgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+ZGF0YUJsb2NrLCAwLCBzaXplb2YoU2hvcnQpIDw8IDcpOworICAgIC8qIEFsbG9jYXRlICgyKnBhY2tldHNpemUpIHdvcmtpbmcgYml0c3RyZWFtcyAqLworCisgICAgdmlkZW8tPmJpdHN0cmVhbTEgPSBCaXRTdHJlYW1DcmVhdGVFbmMoMiAqIDQwOTYpOyAvKmFsbG9jYXRlIHdvcmtpbmcgc3RyZWFtIDEqLworICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIHZpZGVvLT5iaXRzdHJlYW0yID0gQml0U3RyZWFtQ3JlYXRlRW5jKDIgKiA0MDk2KTsgLyphbGxvY2F0ZSB3b3JraW5nIHN0cmVhbSAyKi8KKyAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICB2aWRlby0+Yml0c3RyZWFtMyA9IEJpdFN0cmVhbUNyZWF0ZUVuYygyICogNDA5Nik7IC8qYWxsb2NhdGUgd29ya2luZyBzdHJlYW0gMyovCisgICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0zID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBhbGxvY2F0ZSBvdmVycnVuIGJ1ZmZlciAqLworICAgIC8vIHRoaXMgYnVmZmVyIGlzIHVzZWQgd2hlbiB1c2VyJ3MgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byBob2xkIG9uZSBmcmFtZS4KKyAgICAvLyBJdCBpcyBub3QgbmVlZGVkIGZvciBzbGljZS1iYXNlZCBlbmNvZGluZy4KKyAgICBpZiAobkxheWVycyA9PSAxKQorICAgIHsKKyAgICAgICAgdmlkZW8tPm9CU2l6ZSA9IGVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSA+PiAzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+b0JTaXplID0gUFZfTUFYKChlbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gPj4gMyksIChlbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV0gPj4gMykpOworICAgIH0KKworICAgIGlmICh2aWRlby0+b0JTaXplID4gREVGQVVMVF9PVkVSUlVOX0JVRkZFUl9TSVpFIHx8IGVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDT05TVEFOVF9RKSAvLyBzZXQgbGltaXQKKyAgICB7CisgICAgICAgIHZpZGVvLT5vQlNpemUgPSBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkU7CisgICAgfQorICAgIHZpZGVvLT5vdmVycnVuQnVmZmVyID0gKFVDaGFyKikgTTRWRU5DX01BTExPQyhzaXplb2YoVUNoYXIpICogdmlkZW8tPm9CU2l6ZSk7CisgICAgaWYgKHZpZGVvLT5vdmVycnVuQnVmZmVyID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKworICAgIHZpZGVvLT5jdXJyVm9wID0gKFZvcCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihWb3ApKTsgLyogTWVtb3J5IGZvciBDdXJyZW50IFZPUCAqLworICAgIGlmICh2aWRlby0+Y3VyclZvcCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgLyogYWRkIHBhZGRpbmcsIDA5LzE5LzA1ICovCisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkgLyogbWFrZSBpdCBjb25kaXRpb25hbCAgMTEvMjgvMDUgKi8KKyAgICB7CisgICAgICAgIHBpdGNoID0gbWF4X3dpZHRoOworICAgICAgICBvZmZzZXQgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwaXRjaCA9IG1heF93aWR0aCArIDMyOworICAgICAgICBvZmZzZXQgPSAocGl0Y2ggPDwgNCkgKyAxNjsKKyAgICAgICAgbWF4X2hlaWdodCArPSAzMjsKKyAgICB9CisgICAgc2l6ZSA9IHBpdGNoICogbWF4X2hlaWdodDsKKworICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IChQSVhFTCAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBjdXJyVm9wIFkgKi8KKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsvKiBNZW1vcnkgZm9yIGN1cnJWb3AgVSAqLworICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOy8qIE1lbW9yeSBmb3IgY3VyclZvcCBWICovCisKKyAgICAvKiBzaGlmdCBmb3IgdGhlIG9mZnNldCAqLworICAgIGlmIChvZmZzZXQpCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKz0gKG9mZnNldCA+PiAyKSArIDQ7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICB9CisKKyAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5jdXJyVm9wOyAgICAgIC8qICBJbml0aWFsaXplIGZvcndhcmRSZWZWb3AgKi8KKyAgICB2aWRlby0+YmFja3dhcmRSZWZWb3AgPSB2aWRlby0+Y3VyclZvcDsgICAgIC8qICBJbml0aWFsaXplIGJhY2t3YXJkUmVmVm9wICovCisKKyAgICB2aWRlby0+cHJldkJhc2VWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAgICAgICAgIC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgQmFzZSBWb3AgKi8KKyAgICBpZiAodmlkZW8tPnByZXZCYXNlVm9wID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPnByZXZCYXNlVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihQSVhFTCkgKiAoc2l6ZSArIChzaXplID4+IDEpKSk7IC8qIE1lbW9yeSBmb3IgcHJldkJhc2VWb3AgWSAqLworICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPnByZXZCYXNlVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gKyBzaXplOyAvKiBNZW1vcnkgZm9yIHByZXZCYXNlVm9wIFUgKi8KKyAgICB2aWRlby0+cHJldkJhc2VWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZCYXNlVm9wLT51Q2hhbiArIChzaXplID4+IDIpOyAvKiBNZW1vcnkgZm9yIHByZXZCYXNlVm9wIFYgKi8KKworICAgIGlmIChvZmZzZXQpCisgICAgeworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuICs9IG9mZnNldDsgLyogb2Zmc2V0IHRvIHRoZSBvcmlnaW4uKi8KKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICB9CisKKworICAgIGlmICgwKSAvKiBJZiBCIEZyYW1lcyAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wID0gKFZvcCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihWb3ApKTsgICAgICAgICAvKiBNZW1vcnkgZm9yIE5leHQgQmFzZSBWb3AgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5uZXh0QmFzZVZvcCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgICAgICB2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuID0gKFBJWEVMICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBuZXh0QmFzZVZvcCBZICovCisgICAgICAgIGlmICh2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+dUNoYW4gPSB2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuICsgc2l6ZTsgLyogTWVtb3J5IGZvciBuZXh0QmFzZVZvcCBVICovCisgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+dkNoYW4gPSB2aWRlby0+bmV4dEJhc2VWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7IC8qIE1lbW9yeSBmb3IgbmV4dEJhc2VWb3AgViAqLworCisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+dkNoYW4gKz0gKG9mZnNldCA+PiAyKSArIDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobkxheWVycyA+IDEpICAgLyogSWYgZW5oYW5jZW1lbnQgbGF5ZXJzICovCisgICAgeworICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAgICAgIC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgRW5oYW5jZW1lbnQgVm9wICovCisgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3AgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihQSVhFTCkgKiAoc2l6ZSArIChzaXplID4+IDEpKSk7IC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgRWhhbmNlbWVudCBZICovCisgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuICsgc2l6ZTsgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFbmhhbmNlbWVudCBVICovCisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7IC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgRW5oYW5jZW1lbnQgViAqLworCisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dkNoYW4gKz0gKG9mZnNldCA+PiAyKSArIDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+bnVtYmVyT2ZMYXllcnMgPSBuTGF5ZXJzOyAvKiBOdW1iZXIgb2YgTGF5ZXJzICovCisgICAgdmlkZW8tPnN1bU1BRCA9IDA7CisKKworICAgIC8qIDA0LzA5LzAxLCBmb3IgVm9wcyBpbiB0aGUgdXNlIG11bHRpcGFzcyBwcm9jZXNzaW5nICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKKyAgICB7CisgICAgICAgIHZpZGVvLT5wTVBbaWR4XSA9IChNdWx0aVBhc3MgKilNNFZFTkNfTUFMTE9DKHNpemVvZihNdWx0aVBhc3MpKTsKKyAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XSA9PSBOVUxMKSAgICBnb3RvIENMRUFOX1VQOworICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5wTVBbaWR4XSwgMCwgc2l6ZW9mKE11bHRpUGFzcykpOworCisgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+ZW5jb2RlZF9mcmFtZXMgPSAtMTsgLyogZm9yZ2V0IGFib3V0IHRoZSB2ZXJ5IGZpcnN0IEkgZnJhbWUgKi8KKworCisgICAgICAgIC8qIFJESW5mbyAqKnBSRFNhbXBsZXMgKi8KKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzID0gKFJESW5mbyAqKilNNFZFTkNfTUFMTE9DKDMwICogc2l6ZW9mKFJESW5mbyAqKSk7CisgICAgICAgIGlmICh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMgPT0gTlVMTCkgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSA9IChSREluZm8gKilNNFZFTkNfTUFMTE9DKDMyICogc2l6ZW9mKFJESW5mbykpOworICAgICAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspICAgIE00VkVOQ19NRU1TRVQoJih2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXNbaV1bal0pLCAwLCBzaXplb2YoUkRJbmZvKSk7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5mcmFtZVJhbmdlID0gKEludCkodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaWR4XSAqIDEuMCk7IC8qIDEuMHMgdGltZSBmcmFtZSovCisgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+ZnJhbWVSYW5nZSA9IFBWX01BWCh2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UsIDUpOworICAgICAgICB2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UgPSBQVl9NSU4odmlkZW8tPnBNUFtpZHhdLT5mcmFtZVJhbmdlLCAzMCk7CisKKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5mcmFtZVBvcyA9IC0xOworCisgICAgfQorICAgIC8qIC8vLyBFbmQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKworICAgIHZpZGVvLT52b2wgPSAoVm9sICoqKU00VkVOQ19NQUxMT0MobkxheWVycyAqIHNpemVvZihWb2wgKikpOyAvKiBNZW1vcnkgZm9yIFZPTCBwb2ludGVycyAqLworCisgICAgLyogTWVtb3J5IGFsbG9jYXRpb24gYW5kIEluaXRpYWxpemF0aW9uIG9mIFZvbHMgYW5kIHdyaXRpbmcgb2YgaGVhZGVycyAqLworICAgIGlmICh2aWRlby0+dm9sID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnZvbEluaXRpYWxpemVbaWR4XSA9IDE7CisgICAgICAgIHZpZGVvLT5yZWZUaWNrW2lkeF0gPSAwOworICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpZHhdID0gMTAwMDsKKyAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvbCkpOworICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpICBnb3RvIENMRUFOX1VQOworCisgICAgICAgIHBWb2wgPSB2aWRlby0+dm9sW2lkeF07CisgICAgICAgIHBFbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworCisgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CisgICAgICAgIC8qIEluaXRpYWxpemUgc29tZSBWT0wgcGFyYW1ldGVycyAqLworICAgICAgICBwVm9sLT52b2xJRCA9IGlkeDsgIC8qIFNldCBWT0wgSUQgKi8KKyAgICAgICAgcFZvbC0+c2hvcnRWaWRlb0hlYWRlciA9IHBFbmNQYXJhbXMtPkgyNjNfRW5hYmxlZDsgLypTaG9ydCBIZWFkZXIgKi8KKyAgICAgICAgcFZvbC0+R09WU3RhcnQgPSBwRW5jUGFyYW1zLT5HT1ZfRW5hYmxlZDsgLyogR09WIEhlYWRlciAqLworICAgICAgICBwVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiA9IHZpZGVvLT5lbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXM7CisgICAgICAgIHBWb2wtPm5iaXRzVGltZUluY1JlcyA9IDE7CisgICAgICAgIHdoaWxlIChwVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiA+ICgxIDw8IHBWb2wtPm5iaXRzVGltZUluY1JlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBWb2wtPm5iaXRzVGltZUluY1JlcysrOworICAgICAgICB9CisKKyAgICAgICAgLyogdGltaW5nIHN0dWZmICovCisgICAgICAgIHBWb2wtPnRpbWVJbmNyZW1lbnQgPSAwOworICAgICAgICBwVm9sLT5tb2R1bG9UaW1lQmFzZSA9IDA7CisgICAgICAgIHBWb2wtPmZpeGVkVm9wUmF0ZSA9IDA7IC8qIE5vIGZpeGVkIFZPUCByYXRlICovCisgICAgICAgIHBWb2wtPnN0cmVhbSA9IChCaXRzdHJlYW1FbmNWaWRlbyAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKEJpdHN0cmVhbUVuY1ZpZGVvKSk7IC8qIGFsbG9jYXRlIEJpdHN0cmVhbUVuY1ZpZGVvIEluc3RhbmNlICovCisgICAgICAgIGlmIChwVm9sLT5zdHJlYW0gPT0gTlVMTCkgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAgICAgcFZvbC0+d2lkdGggPSBwRW5jUGFyYW1zLT5MYXllcldpZHRoW2lkeF07ICAgICAgLyogTGF5ZXIgV2lkdGggKi8KKyAgICAgICAgcFZvbC0+aGVpZ2h0ID0gcEVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaWR4XTsgICAgLyogTGF5ZXIgSGVpZ2h0ICovCisgICAgICAgIC8vICBwVm9sLT5pbnRyYV9hY2RjUHJlZERpc2FibGUgPSBwRW5jUGFyYW1zLT5BQ0RDUHJlZGljdGlvbjsgLyogQUNEQyBQcmVkaWN0aW9uICovCisgICAgICAgIHBWb2wtPlJlc3luY01hcmtlckRpc2FibGUgPSBwRW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlOyAvKiBSZXN5bmMgTWFya2VyIE1vZGUgKi8KKyAgICAgICAgcFZvbC0+ZGF0YVBhcnRpdGlvbmluZyA9IHBFbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmc7IC8qIERhdGEgUGFydGl0aW9uaW5nICovCisgICAgICAgIHBWb2wtPnVzZVJldmVyc2VWTEMgPSBwRW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDOyAvKiBSVkxDICovCisgICAgICAgIGlmIChpZHggPiAwKSAvKiBTY2FsYWJpbGl0eSBsYXllcnMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcFZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IDE7CisgICAgICAgICAgICBwVm9sLT5kYXRhUGFydGl0aW9uaW5nID0gMDsKKyAgICAgICAgICAgIHBWb2wtPnVzZVJldmVyc2VWTEMgPSAwOyAvKiAgTm8gUlZMQyAqLworICAgICAgICB9CisgICAgICAgIHBWb2wtPnF1YW50VHlwZSA9IHBFbmNQYXJhbXMtPlF1YW50VHlwZVtpZHhdOyAgICAgICAgICAgLyogUXVhbnRpemVyIFR5cGUgKi8KKworICAgICAgICAvKiBubyBuZWVkIHRvIGluaXQgUXVhbnQgTWF0cmljZXMgKi8KKworICAgICAgICBwVm9sLT5zY2FsYWJpbGl0eSA9IDA7ICAvKiBWb2wgU2NhbGFiaWxpdHkgKi8KKyAgICAgICAgaWYgKGlkeCA+IDApCisgICAgICAgICAgICBwVm9sLT5zY2FsYWJpbGl0eSA9IDE7IC8qIE11bHRpcGxlIGxheWVycyA9PiBTY2FsYWJpbGl0eSAqLworCisgICAgICAgIC8qIEluaXRpYWxpemUgVm9sIHRvIFRlbXBvcmFsIHNjYWxhYmlsaXR5LiAgSXQgY2FuIGNoYW5nZSBkdXJpbmcgZW5jb2RpbmcgKi8KKyAgICAgICAgcFZvbC0+c2NhbFR5cGUgPSAxOworICAgICAgICAvKiBJbml0aWFsaXplIHJlZmVyZW5jZSBWb2wgSUQgdG8gdGhlIGJhc2UgbGF5ZXIgPSAwICovCisgICAgICAgIHBWb2wtPnJlZlZvbElEID0gMDsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBsYXllciByZXNvbHV0aW9uIHRvIHNhbWUgYXMgdGhlIHJlZmVyZW5jZSAqLworICAgICAgICBwVm9sLT5yZWZTYW1wRGlyID0gMDsKKyAgICAgICAgcFZvbC0+aG9yU2FtcF9tID0gMTsKKyAgICAgICAgcFZvbC0+aG9yU2FtcF9uID0gMTsKKyAgICAgICAgcFZvbC0+dmVyU2FtcF9tID0gMTsKKyAgICAgICAgcFZvbC0+dmVyU2FtcF9uID0gMTsKKyAgICAgICAgcFZvbC0+ZW5oYW5jZW1lbnRUeXBlID0gMDsgLyogV2UgYWx3YXlzIGVuaGFuY2UgdGhlIGVudGlyZSByZWdpb24gKi8KKworICAgICAgICBwVm9sLT5uTUJQZXJSb3cgPSAocFZvbC0+d2lkdGggKyAxNSkgLyAxNjsKKyAgICAgICAgcFZvbC0+bk1CUGVyQ29sID0gKHBWb2wtPmhlaWdodCArIDE1KSAvIDE2OworICAgICAgICBwVm9sLT5uVG90YWxNQiA9IHBWb2wtPm5NQlBlclJvdyAqIHBWb2wtPm5NQlBlckNvbDsKKworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMjsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDUpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAzOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gOSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDQ7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxNykKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDU7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAzMykKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDY7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA2NSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDc7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxMjkpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA4OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMjU3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gOTsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDUxMykKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDEwOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMTAyNSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDExOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMjA0OSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDEyOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNDA5NykKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDEzOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gODE5MykKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE0OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMTYzODUpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxNTsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDMyNzY5KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTY7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA2NTUzNykKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE3OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMTMxMDczKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTg7CisKKyAgICAgICAgaWYgKHBWb2wtPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAocFZvbC0+d2lkdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICAgICAgICAgIGlmIChwVm9sLT5oZWlnaHQgPT0gOTYpICAvKiBzb3VyY2VfZm9ybWF0ID0gMSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uR09CaW5Wb3AgPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bk1CaW5HT0IgPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTc2OgorICAgICAgICAgICAgICAgICAgICBpZiAocFZvbC0+aGVpZ2h0ID09IDE0NCkgIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDk7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDExOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM1MjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSAyODgpICAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uR09CaW5Wb3AgPSAxODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gMjI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSA3MDQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwVm9sLT5oZWlnaHQgPT0gNTc2KSAgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gMTg7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDg4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE0MDg6CisgICAgICAgICAgICAgICAgICAgIGlmIChwVm9sLT5oZWlnaHQgPT0gMTE1MikgIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bk1CaW5HT0IgPSAzNTI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSByYXRlIGNvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBCRUdJTiBJTklUSUFMSVpBVElPTiBPRiBBTk5FWCBMIFJBVEUgQ09OVFJPTCAqLworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCisgICAgeworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKSAvKiAxMi8yNS8wMCAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+cmNbaWR4XSA9CisgICAgICAgICAgICAgICAgKHJhdGVDb250cm9sICopTTRWRU5DX01BTExPQyhzaXplb2YocmF0ZUNvbnRyb2wpKTsKKworICAgICAgICAgICAgaWYgKHZpZGVvLT5yY1tpZHhdID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPnJjW2lkeF0sIDAsIHNpemVvZihyYXRlQ29udHJvbCkpOworICAgICAgICB9CisgICAgICAgIGlmIChQVl9TVUNDRVNTICE9IFJDX0luaXRpYWxpemUodmlkZW8pKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisgICAgICAgIC8qIGluaXRpYWxpemF0aW9uIGZvciAyLXBhc3MgcmF0ZSBjb250cm9sICovCisgICAgfQorICAgIC8qIEVORCBJTklUSUFMSVpBVElPTiBPRiBBTk5FWCBMIFJBVEUgQ09OVFJPTCAqLworCisgICAgLyoqKioqKioqKiogYXNzaWduIHBsYXRmb3JtIGRlcGVuZGVudCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogMS8yMy8wMSAqLworICAgIC8qIFRoaXMgbXVzdCBiZSBkb25lIGF0IHJ1bi10aW1lIG5vdCBhIGNvbXBpbGUgdGltZSAqLworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXIgPSAoRnVuY1B0ciopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKEZ1bmNQdHIpKTsKKyAgICBpZiAodmlkZW8tPmZ1bmN0aW9uUG9pbnRlciA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+Q29tcHV0ZU1CU3VtID0gJkNvbXB1dGVNQlN1bV9DOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzBdID0gTlVMTDsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsxXSA9ICZTQURfTUJfSGFsZlBlbF9DeGg7CisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmU0FEX01CX0hhbGZQZWxfQ3loOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzNdID0gJlNBRF9NQl9IYWxmUGVsX0N4aHloOworCisjaWZuZGVmIE5PX0lOVEVSNFYKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfQmxrX0hhbGZQZWwgPSAmU0FEX0Jsa19IYWxmUGVsX0M7CisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX0Jsb2NrID0gJlNBRF9CbG9ja19DOworI2VuZGlmCisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2sgPSAmU0FEX01hY3JvYmxvY2tfQzsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5DaG9vc2VNb2RlID0gJkNob29zZU1vZGVfQzsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5HZXRIYWxmUGVsTUJSZWdpb24gPSAmR2V0SGFsZlBlbE1CUmVnaW9uX0M7CisvLyAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX1BBRERJTkcgPSAmU0FEX01CX1BBRERJTkc7IC8qIDQvMjEvMDEgKi8KKworCisgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckluaXQgPSAxOyAgLyogaW5pdCBkb25lISAqLworCisgICAgcmV0dXJuIFBWX1RSVUU7CisKK0NMRUFOX1VQOgorICAgIFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihlbmNvZGVyQ29udHJvbCk7CisKKyAgICByZXR1cm4gUFZfRkFMU0U7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkNsZWFuVXBWaWRlb0VuY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRGVhbGxvY2F0ZXMgYWxsb2NhdGVkIG1lbW9yeSBmcm9tIEluaXRWaWRlb0VuY29kZXIoKSAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogNS8yMS8wMSwgZnJlZSBvbmx5IHlDaGFuIGluIFZvcCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sICAgIFBWQ2xlYW5VcFZpZGVvRW5jb2RlcihWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCkKK3sKKyAgICBJbnQgaWR4LCBpOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgaW50IG5Ub3RhbE1COworICAgIGludCBtYXhfd2lkdGgsIG9mZnNldDsKKworI2lmZGVmIFBSSU5UX1JDX0lORk8KKyAgICBpZiAoZmFjY3QgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTSBCSVRTIEdFTkVSQVRFRCAlZFxuIiwgdGlUb3RhbE51bUJpdHNHZW5lcmF0ZWQpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJUT1RBTCBOVU1CRVIgT0YgRlJBTUVTIENPREVEICVkXG4iLAorICAgICAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPnJjWzBdLT50b3RhbEZyYW1lTnVtYmVyKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQXZlcmFnZSBCaXRSYXRlICVkXG4iLAorICAgICAgICAgICAgICAgICh0aVRvdGFsTnVtQml0c0dlbmVyYXRlZCAvICg5MCAvIDMwKSkpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJUT1RBTCBOVU1CRVIgT0YgU1RVRkYgQklUUyAlZFxuIiwgKGlTdHVmZkJpdHMgKyAxMDc0MCkpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJUT1RBTCBOVU1CRVIgT0YgQklUUyBUTyBORVRXT1JLICVkXG4iLCAoMzU4MDAqOTAgLyAzMCkpOzsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiU1VNIE9GIFNUVUZGIEJJVFMgQU5EIEdFTkVSQVRFRCBCSVRTICVkXG4iLAorICAgICAgICAgICAgICAgICh0aVRvdGFsTnVtQml0c0dlbmVyYXRlZCArIGlTdHVmZkJpdHMgKyAxMDc0MCkpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJVTkFDQ09VTlRFRCBESUZGRVJFTkNFICVkXG4iLAorICAgICAgICAgICAgICAgICgoMzU4MDAqOTAgLyAzMCkgLSAodGlUb3RhbE51bUJpdHNHZW5lcmF0ZWQgKyBpU3R1ZmZCaXRzICsgMTA3NDApKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZmNsb3NlKGZhY2N0KTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIFBSSU5UX0VDCisgICAgZmNsb3NlKGZlYyk7CisjZW5kaWYKKworICAgIGlmICh2aWRlbyAhPSBOVUxMKQorICAgIHsKKworICAgICAgICBpZiAodmlkZW8tPlFQTUIpIE00VkVOQ19GUkVFKHZpZGVvLT5RUE1CKTsKKyAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUpTTRWRU5DX0ZSRUUodmlkZW8tPmhlYWRlckluZm8uTW9kZSk7CisgICAgICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlApTTRWRU5DX0ZSRUUodmlkZW8tPmhlYWRlckluZm8uQ0JQKTsKKworCisgICAgICAgIGlmICh2aWRlby0+bW90KQorICAgICAgICB7CisgICAgICAgICAgICBuVG90YWxNQiA9IHZpZGVvLT52b2xbMF0tPm5Ub3RhbE1COworICAgICAgICAgICAgZm9yIChpZHggPSAxOyBpZHggPCB2aWRlby0+Y3VyckxheWVyOyBpZHgrKykKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdLT5uVG90YWxNQiA+IG5Ub3RhbE1CKQorICAgICAgICAgICAgICAgICAgICBuVG90YWxNQiA9IHZpZGVvLT52b2xbaWR4XS0+blRvdGFsTUI7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5Ub3RhbE1COyBpZHgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPm1vdFtpZHhdKQorICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+bW90W2lkeF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPm1vdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPmludHJhQXJyYXkpIE00VkVOQ19GUkVFKHZpZGVvLT5pbnRyYUFycmF5KTsKKworICAgICAgICBpZiAodmlkZW8tPnNsaWNlTm8pTTRWRU5DX0ZSRUUodmlkZW8tPnNsaWNlTm8pOworICAgICAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcpTTRWRU5DX0ZSRUUodmlkZW8tPmFjUHJlZEZsYWcpOworLy8gICAgICBpZih2aWRlby0+cHJlZERDQUMpTTRWRU5DX0ZSRUUodmlkZW8tPnByZWREQ0FDKTsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmVkREMpIE00VkVOQ19GUkVFKHZpZGVvLT5wcmVkREMpOworICAgICAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gTlVMTDsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wpIE00VkVOQ19GUkVFKHZpZGVvLT5wcmVkRENBQ19jb2wpOworICAgICAgICBpZiAodmlkZW8tPm91dHB1dE1CKU00VkVOQ19GUkVFKHZpZGVvLT5vdXRwdXRNQik7CisKKyAgICAgICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0xKUJpdHN0cmVhbUNsb3NlRW5jKHZpZGVvLT5iaXRzdHJlYW0xKTsKKyAgICAgICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0yKUJpdHN0cmVhbUNsb3NlRW5jKHZpZGVvLT5iaXRzdHJlYW0yKTsKKyAgICAgICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0zKUJpdHN0cmVhbUNsb3NlRW5jKHZpZGVvLT5iaXRzdHJlYW0zKTsKKworICAgICAgICBpZiAodmlkZW8tPm92ZXJydW5CdWZmZXIpIE00VkVOQ19GUkVFKHZpZGVvLT5vdmVycnVuQnVmZmVyKTsKKworICAgICAgICBtYXhfd2lkdGggPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllcldpZHRoWzBdOworICAgICAgICBtYXhfd2lkdGggPSAoKChtYXhfd2lkdGggKyAxNSkgPj4gNCkgPDwgNCk7IC8qIDA5LzE5LzA1ICovCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvZmZzZXQgPSAoKG1heF93aWR0aCArIDMyKSA8PCA0KSArIDE2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiAtPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPmN1cnJWb3AtPnlDaGFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5jdXJyVm9wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+bmV4dEJhc2VWb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPm5leHRCYXNlVm9wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnByZXZCYXNlVm9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhhbmNlVm9wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhhbmNlVm9wLT55Q2hhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuIC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wcmV2RW5oYW5jZVZvcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiAwNC8wOS8wMSwgZm9yIFZvcHMgaW4gdGhlIHVzZSBtdWx0aXBhc3MgcHJvY2Vzc2luZyAqLworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5lbmNQYXJhbXMtPm5MYXllcnM7IGlkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+cE1QW2lkeF0sIDAsIHNpemVvZihNdWx0aVBhc3MpKTsKKyAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cE1QW2lkeF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIC8vICBFbmQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKyAgICAgICAgaWYgKHZpZGVvLT52b2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgaWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0tPnN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT52b2xbaWR4XS0+c3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnZvbFtpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+dm9sKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHN0b3AgcmF0ZSBjb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKiBBTk5FWCBMIFJBVEUgQ09OVFJPTCAqLworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSAhPSBDT05TVEFOVF9RKQorICAgICAgICB7CisgICAgICAgICAgICBSQ19DbGVhbnVwKHZpZGVvLT5yYywgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVycyk7CisKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgaWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5yY1tpZHhdKQorICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cmNbaWR4XSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPmZ1bmN0aW9uUG9pbnRlcikgTTRWRU5DX0ZSRUUodmlkZW8tPmZ1bmN0aW9uUG9pbnRlcik7CisKKyAgICAgICAgLyogSWYgYXBwbGljYXRpb24gaGFzIGNhbGxlZCBQVkNsZWFuVXBWaWRlb0VuY29kZXIgdGhlbiB3ZSBkZWFsbG9jYXRlICovCisgICAgICAgIC8qIElmIFBWSW5pdFZpZGVvRW5jb2RlciBjbGFzcyBpdCwgdGhlbiB3ZSBETyBOT1QgZGVhbGxvY2F0ZSAqLworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcykKKyAgICAgICAgeworICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPmVuY1BhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICBNNFZFTkNfRlJFRSh2aWRlbyk7CisgICAgICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhID0gTlVMTDsgLyogdmlkZW8gKi8KKyAgICB9CisKKyAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDA7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldFZvbEhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDcvMTcvMjAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldFZvbEhlYWRlcihWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBVQ2hhciAqdm9sSGVhZGVyLCBJbnQgKnNpemUsIEludCBsYXllcikKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisgICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisKKyAgICBlbmNEYXRhLT5jdXJyTGF5ZXIgPSBsYXllcjsgLyogU2V0IExheWVyICovCisgICAgLypwdl9zdGF0dXMgPSAqLworICAgIEVuY29kZVZPU19TdGFydChlbmNDdHJsKTsgLyogRW5jb2RlIFZPTCBIZWFkZXIgKi8KKworICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyW2xheWVyXSA9IDE7IC8qIFNldCB1c2FnZSBmbGFnOiBOZWVkZWQgdG8gc3VwcG9ydCBvbGQgbWV0aG9kKi8KKworICAgIC8qIENvcHkgYml0c3RyZWFtIHRvIGJ1ZmZlciBhbmQgc2V0IHRoZSBzaXplICovCisKKyAgICBpZiAoKnNpemUgPiBlbmNEYXRhLT5iaXRzdHJlYW0xLT5ieXRlQ291bnQpCisgICAgeworICAgICAgICAqc2l6ZSA9IGVuY0RhdGEtPmJpdHN0cmVhbTEtPmJ5dGVDb3VudDsKKyAgICAgICAgTTRWRU5DX01FTUNQWSh2b2xIZWFkZXIsIGVuY0RhdGEtPmJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciwgKnNpemUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIC8qIFJlc2V0IGJpdHN0cmVhbTEgYnVmZmVyIHBhcmFtZXRlcnMgKi8KKyAgICBCaXRzdHJlYW1FbmNSZXNldChlbmNEYXRhLT5iaXRzdHJlYW0xKTsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0T3ZlcnJ1bkJ1ZmZlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IHRoZSBvdmVycnVuIGJ1ZmZlciBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBvaW50ZXIgdG8gb3ZlcnJ1biBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIFVDaGFyKiBQVkdldE92ZXJydW5CdWZmZXIoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworCisgICAgaWYgKGN1cnJWb2wtPnN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICE9IHZpZGVvLT5vdmVycnVuQnVmZmVyKSAvLyBub3QgdXNlZAorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHZpZGVvLT5vdmVycnVuQnVmZmVyOworfQorCisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZVZpZGVvRnJhbWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgdmlkZW8gZnJhbWUgYW5kIHJldHVybiBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAwMi4xNC4yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEZpbmlzaGluZyBuZXcgdGltZXN0YW1wIDMyLWJpdCBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgQXBwbGljYXRpb25zIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHdyYXAtYXJvdW5kICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZFbmNvZGVWaWRlb0ZyYW1lKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFZpZGVvRW5jRnJhbWVJTyAqdmlkX2luLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxvbmcgKm5leHRNb2RUaW1lLCBVQ2hhciAqYnN0cmVhbSwgSW50ICpzaXplLCBJbnQgKm5MYXllcikKK3sKKyAgICBCb29sIHN0YXR1cyA9IFBWX1RSVUU7CisgICAgUFZfU1RBVFVTIHB2X3N0YXR1czsKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgVm9sICpjdXJyVm9sOworICAgIFZvcCAqdGVtcEZvcndSZWZWb3AgPSBOVUxMOworICAgIEludCB0ZW1wUmVmU2VsQ29kZSA9IDA7CisgICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworICAgIEludCB3aWR0aF8xNiwgaGVpZ2h0XzE2OworICAgIEludCB3aWR0aCwgaGVpZ2h0OworICAgIFZvcCAqdGVtcDsKKyAgICBJbnQgZW5jb2RlVm9wID0gMDsKKyAgICB2b2lkICBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7CisgICAgSW50IGN1cnJMYXllciA9IC0xOworICAgIC8vSW50IG5MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7CisKKyAgICBVTG9uZyBtb2RUaW1lID0gdmlkX2luLT50aW1lc3RhbXA7CisKKyNpZmRlZiBSQU5ET01fUkVGU0VMQ09ERSAgIC8qIGFkZCByYW5kb20gc2VsZWN0aW9uIG9mIHJlZmVyZW5jZSBWb3AgKi8KKyAgICBJbnQgcmFuZG9tX3ZhbFszMF0gPSB7MCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMH07CisgICAgc3RhdGljIEludCByYW5kX2lkeCA9IDA7CisjZW5kaWYKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIERldGVybWluZSBOZXh0IFZvcCB0byBlbmNvZGUsIGlmIGFueSwgYW5kIG5MYXllciAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8vaSA9IG5MYXllcnMtMTsKKworICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVswXSkgLyogZmlyc3Qgdm9sIHRvIGNvZGUgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5uZXh0TW9kVGltZSA9IHZpZGVvLT5tb2RUaW1lUmVmID0gKChtb2RUaW1lKSAtICgobW9kVGltZSkgJSAxMDAwKSk7CisgICAgfQorCisgICAgZW5jb2RlVm9wID0gRGV0ZXJtaW5lQ29kaW5nTGF5ZXIodmlkZW8sIG5MYXllciwgbW9kVGltZSk7CisgICAgY3VyckxheWVyID0gKm5MYXllcjsKKyAgICBpZiAoKGN1cnJMYXllciA8IDApIHx8IChjdXJyTGF5ZXIgPiBlbmNQYXJhbXMtPm5MYXllcnMgLSAxKSkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJZiBwb3N0LXNraXBwaW5nIHN0aWxsIGVmZmVjdGl2ZSAtLS0gcmV0dXJuICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICghZW5jb2RlVm9wKSAvKiBza2lwIGVuaCBsYXllciwgbm8gYmFzZSBsYXllciBjb2RlZCAtLS0gcmV0dXJuICovCisgICAgeworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgIHByaW50ZigiTm8gZnJhbWUgY29kZWQuIENvbnRpbnVlIHRvIG5leHQgZnJhbWUuIik7CisjZW5kaWYKKyAgICAgICAgLyogZXhwZWN0ZWQgbmV4dCBjb2RlIHRpbWUsIGNvbnZlcnQgYmFjayB0byBtaWxsaXNlYyAqLworICAgICAgICAqbmV4dE1vZFRpbWUgPSB2aWRlby0+bmV4dE1vZFRpbWU7CisKKyNpZmRlZiBBTExPV19WT1BfTk9UX0NPREVECisgICAgICAgIGlmICh2aWRlby0+dm9sWzBdLT5zaG9ydFZpZGVvSGVhZGVyKSAvKiBTaG9ydCBWaWRlbyBIZWFkZXIgPSAxICovCisgICAgICAgIHsKKyAgICAgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgICAgICpuTGF5ZXIgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpuTGF5ZXIgPSAwOworICAgICAgICAgICAgRW5jb2RlVm9wTm90Q29kZWQodmlkZW8sIGJzdHJlYW0sIHNpemUsIG1vZFRpbWUpOworICAgICAgICAgICAgKnNpemUgPSB2aWRlby0+dm9sWzBdLT5zdHJlYW0tPmJ5dGVDb3VudDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgKnNpemUgPSAwOworICAgICAgICAqbkxheWVyID0gLTE7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworLy9FTkNPREVfVk9QX0FHQUlOOiAgLyogMTIvMzAvMDAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIFZvbCBzdHJlYW0gc3RydWN0dXJlIHdpdGggYXBwbGljYXRpb24gYml0c3RyZWFtICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKyAgICBjdXJyVm9sLT5zdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IGJzdHJlYW07CisgICAgY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplID0gKnNpemU7CisgICAgQml0c3RyZWFtRW5jUmVzZXQoY3VyclZvbC0+c3RyZWFtKTsKKyAgICBCaXRzdHJlYW1TZXRPdmVycnVuQnVmZmVyKGN1cnJWb2wtPnN0cmVhbSwgdmlkZW8tPm92ZXJydW5CdWZmZXIsIHZpZGVvLT5vQlNpemUsIHZpZGVvKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBFbmNvZGUgVk9TIGFuZCBWT0wgSGVhZGVycyBvbiBmaXJzdCBjYWxsIGZvciBlYWNoIGxheWVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IDA7CisgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+dGltZUluYyA9IDA7CisgICAgICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyW2N1cnJMYXllcl0pCisgICAgICAgICAgICBwdl9zdGF0dXMgPSBFbmNvZGVWT1NfU3RhcnQoZW5jQ3RybCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDb3B5IElucHV0IFZpZGVvIEZyYW1lIHRvIEludGVybmFsIFZpZGVvIEJ1ZmZlciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIFdpZHRoIGFuZCBIZWlnaHQgb2YgVm9wIExheWVyICovCisKKyAgICB3aWR0aCA9IGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtjdXJyTGF5ZXJdOyAgIC8qIEdldCBpbnB1dCB3aWR0aCAqLworICAgIGhlaWdodCA9IGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbY3VyckxheWVyXTsgLyogR2V0IGlucHV0IGhlaWdodCAqLworICAgIC8qIFJvdW5kIFVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgOiBNUEVHLTQgU3RhbmRhcmQgKi8KKworICAgIHdpZHRoXzE2ID0gKCh3aWR0aCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KKyAgICBoZWlnaHRfMTYgPSAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAvKiBSb3VuZCB1cCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDE2ICovCisKKyAgICB2aWRlby0+aW5wdXQgPSB2aWRfaW47ICAvKiBwb2ludCB0byB0aGUgZnJhbWUgaW5wdXQgKi8KKworICAgIC8qLy8gIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIERldGVybWluZSBWT1AgVHlwZSAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiA2LzIvMjAwMSwgc2VwYXJhdGUgZnVuY3Rpb24gICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBEZXRlcm1pbmVWb3BUeXBlKHZpZGVvLCBjdXJyTGF5ZXIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgSW5pdGlhbGl6ZSBWT1AgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdmlkZW8tPmN1cnJWb3AtPnZvbElEID0gY3VyclZvbC0+dm9sSUQ7CisgICAgdmlkZW8tPmN1cnJWb3AtPndpZHRoID0gd2lkdGhfMTY7CisgICAgdmlkZW8tPmN1cnJWb3AtPmhlaWdodCA9IGhlaWdodF8xNjsKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKSAvKiAgMTEvMjgvMDUgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+cGl0Y2ggPSB3aWR0aF8xNiArIDMyOworICAgIH0KKyAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IGN1cnJWb2wtPnRpbWVJbmNyZW1lbnQ7CisgICAgdmlkZW8tPmN1cnJWb3AtPnZvcENvZGVkID0gMTsKKyAgICB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlID0gMDsKKyAgICB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RocjsKKworICAgIGlmIChjdXJyTGF5ZXIgPT0gMAorI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLworICAgICAgICAgICAgfHwgcmFuZG9tX3ZhbFtyYW5kX2lkeF0gfHwgdmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKyAgICAgICAgdGVtcEZvcndSZWZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLyoga2VlcCBpbml0aWFsIHN0YXRlICovCisgICAgICAgIGlmICh0ZW1wRm9yd1JlZlZvcCAhPSBOVUxMKSB0ZW1wUmVmU2VsQ29kZSA9IHRlbXBGb3J3UmVmVm9wLT5yZWZTZWxlY3RDb2RlOworCisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7CisgICAgfQorI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGVtcEZvcndSZWZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLyoga2VlcCBpbml0aWFsIHN0YXRlICovCisgICAgICAgIGlmICh0ZW1wRm9yd1JlZlZvcCAhPSBOVUxMKSB0ZW1wUmVmU2VsQ29kZSA9IHRlbXBGb3J3UmVmVm9wLT5yZWZTZWxlY3RDb2RlOworCisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDA7CisgICAgfQorICAgIHJhbmRfaWR4Kys7CisgICAgcmFuZF9pZHggJT0gMzA7CisjZW5kaWYKKworICAgIHZpZGVvLT5jdXJyVm9wLT5yZWZTZWxlY3RDb2RlID0gdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGU7CisgICAgdmlkZW8tPmN1cnJWb3AtPmdvYk51bWJlciA9IDA7CisgICAgdmlkZW8tPmN1cnJWb3AtPmdvYkZyYW1lSUQgPSB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgdmlkZW8tPmN1cnJWb3AtPnRlbXBvcmFsUmVmID0gKG1vZFRpbWUgKiAzMCAvIDEwMDEpICUgMjU2OworCisgICAgdmlkZW8tPmN1cnJWb3AtPnRlbXBvcmFsSW50ZXJ2YWwgPSAwOworCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFtjdXJyTGF5ZXJdOworICAgIGVsc2UKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50UHZvcFtjdXJyTGF5ZXJdOworCisKKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAvKiBFbmNvZGUgVm9wICovCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgdmlkZW8tPnNsaWNlX2NvZGluZyA9IDA7CisKKyAgICBwdl9zdGF0dXMgPSBFbmNvZGVWb3AodmlkZW8pOworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgcHJpbnRmKCIgSS1WT1AgIik7CisgICAgZWxzZQorICAgICAgICBwcmludGYoIiBQLVZPUCAocmVmLiVkKSIsIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlKTsKKyNlbmRpZgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBVcGRhdGUgU2tpcCBOZXh0IEZyYW1lICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgKm5MYXllciA9IFVwZGF0ZVNraXBOZXh0RnJhbWUodmlkZW8sIG5leHRNb2RUaW1lLCBzaXplLCBwdl9zdGF0dXMpOworICAgIGlmICgqbkxheWVyID09IC0xKSAvKiBza2lwIGN1cnJlbnQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHBvaW50ZXJzIGFyZSByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgc3RhdGUgKi8KKyAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHRlbXBGb3J3UmVmVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCisgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IHRlbXBSZWZTZWxDb2RlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBJZiBJLVZPUCB3YXMgZW5jb2RlZCwgcmVzZXQgSW50cmFQZXJpb2QgKi8KKyAgICBpZiAoKGN1cnJMYXllciA9PSAwKSAmJiAoZW5jUGFyYW1zLT5JbnRyYVBlcmlvZCA+IDApICYmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApKQorICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSBlbmNQYXJhbXMtPkludHJhUGVyaW9kOworCisgICAgLyogU2V0IEhpbnRUcmFjayBJbmZvcm1hdGlvbiAqLworICAgIGlmIChjdXJyTGF5ZXIgIT0gLTEpCisgICAgeworICAgICAgICBpZiAoY3VyclZvbC0+cHJldk1vZHVsb1RpbWVCYXNlKQorICAgICAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTVRCID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTVRCID0gMDsKKyAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTGF5ZXJJRCA9IChVQ2hhciljdXJyVm9sLT52b2xJRDsKKyAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uQ29kZVR5cGUgPSAoVUNoYXIpdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5SZWZTZWxDb2RlID0gKFVDaGFyKXZpZGVvLT5jdXJyVm9wLT5yZWZTZWxlY3RDb2RlOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIG5MYXllciBhbmQgdGltZUluYyBmb3IgbmV4dCBlbmNvZGUgKi8KKyAgICAvKiAxMi8yNy8wMCBhbHdheXMgZ28gYnkgdGhlIGhpZ2hlc3QgbGF5ZXIqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDb3B5IFJlY29uc3RydWN0ZWQgQnVmZmVyIHRvIE91dHB1dCBWaWRlbyBGcmFtZSBCdWZmZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2aWRfb3V0LT55Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbjsKKyAgICB2aWRfb3V0LT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbjsKKyAgICB2aWRfb3V0LT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT52Q2hhbjsKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgIHsKKyAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodDsgLyogcGFkZGVkIGhlaWdodCAqLworICAgICAgICB2aWRfb3V0LT5waXRjaCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aDsgLyogcGFkZGVkIHdpZHRoICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZF9vdXQtPmhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQgKyAzMjsgLyogcGFkZGVkIGhlaWdodCAqLworICAgICAgICB2aWRfb3V0LT5waXRjaCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aCArIDMyOyAvKiBwYWRkZWQgd2lkdGggKi8KKyAgICB9CisgICAgLy92aWRlb19vdXQtPnRpbWVzdGFtcCA9IHZpZGVvLT5tb2RUaW1lOworICAgIHZpZF9vdXQtPnRpbWVzdGFtcCA9IChVTG9uZykoKCh2aWRlby0+cHJldkZyYW1lTnVtW2N1cnJMYXllcl0gKiAxMDAwKSAvIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbY3VyckxheWVyXSkgKyB2aWRlby0+bW9kVGltZVJlZiArIDAuNSk7CisKKyAgICAvKi8vIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFVwZGF0ZSBPdXB1dCBic3RyZWFtIGJ5dGUgY291bnQgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAqc2l6ZSA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50OworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogU3dhcCBWb3AgUG9pbnRlcnMgZm9yIEJhc2UgTGF5ZXIgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgIHsKKyAgICAgICAgdGVtcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICB2aWRlby0+Y3VyclZvcCAgPSB0ZW1wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsgLyogRm9yIFAtVm9wIGJhc2Ugb25seSAqLworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRlbXAgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnBhZGRlZCA9IDA7IC8qIG5vdCBwYWRkZWQgKi8KKyAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIE1vZGlmeSB0aGUgaW50aWFsaXplIGZsYWcgYXQgdGhlIGVuZC4qLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQorICAgICAgICB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdID0gMDsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKyNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRW5jb2RlRnJhbWVTZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTgvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbnRlciBhIHZpZGVvIGZyYW1lIGFuZCBwZXJmb3JtIGZyb250LWVuZCB0aW1lIGNoZWNrIHBsdXMgTUUgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkVuY29kZUZyYW1lU2V0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFZpZGVvRW5jRnJhbWVJTyAqdmlkX2luLCBVTG9uZyAqbmV4dE1vZFRpbWUsIEludCAqbkxheWVyKQoreworICAgIEJvb2wgc3RhdHVzID0gUFZfVFJVRTsKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgVm9sICpjdXJyVm9sOworICAgIFBWX1NUQVRVUyAgIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKKyAgICBJbnQgd2lkdGhfMTYsIGhlaWdodF8xNjsKKyAgICBJbnQgd2lkdGgsIGhlaWdodDsKKyAgICBJbnQgZW5jb2RlVm9wID0gMDsKKyAgICB2b2lkICBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7CisgICAgSW50IGN1cnJMYXllciA9IC0xOworICAgIC8vSW50IG5MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7CisKKyAgICBVTG9uZyAgIG1vZFRpbWUgPSB2aWRfaW4tPnRpbWVzdGFtcDsKKworI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLworICAgIEludCByYW5kb21fdmFsWzMwXSA9IHswLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAwfTsKKyAgICBzdGF0aWMgSW50IHJhbmRfaWR4ID0gMDsKKyNlbmRpZgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIERldGVybWluZSBOZXh0IFZvcCB0byBlbmNvZGUsIGlmIGFueSwgYW5kIG5MYXllciAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgdmlkZW8tPm1vZFRpbWUgPSBtb2RUaW1lOworCisgICAgLy9pID0gbkxheWVycy0xOworCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplWzBdKSAvKiBmaXJzdCB2b2wgdG8gY29kZSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPm5leHRNb2RUaW1lID0gdmlkZW8tPm1vZFRpbWVSZWYgPSAoKG1vZFRpbWUpIC0gKChtb2RUaW1lKSAlIDEwMDApKTsKKyAgICB9CisKKworICAgIGVuY29kZVZvcCA9IERldGVybWluZUNvZGluZ0xheWVyKHZpZGVvLCBuTGF5ZXIsIG1vZFRpbWUpOworCisgICAgY3VyckxheWVyID0gKm5MYXllcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSWYgcG9zdC1za2lwcGluZyBzdGlsbCBlZmZlY3RpdmUgLS0tIHJldHVybiAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoIWVuY29kZVZvcCkgLyogc2tpcCBlbmggbGF5ZXIsIG5vIGJhc2UgbGF5ZXIgY29kZWQgLS0tIHJldHVybiAqLworICAgIHsKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgICAgICBwcmludGYoIk5vIGZyYW1lIGNvZGVkLiBDb250aW51ZSB0byBuZXh0IGZyYW1lLiIpOworI2VuZGlmCisgICAgICAgICpuTGF5ZXIgPSAtMTsKKworICAgICAgICAvKiBleHBlY3RlZCBuZXh0IGNvZGUgdGltZSwgY29udmVydCBiYWNrIHRvIG1pbGxpc2VjICovCisgICAgICAgICpuZXh0TW9kVGltZSA9IHZpZGVvLT5uZXh0TW9kVGltZTs7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgVm9sIHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBhcHBsaWNhdGlvbiBiaXRzdHJlYW0gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7CisgICAgQml0c3RyZWFtRW5jUmVzZXQoY3VyclZvbC0+c3RyZWFtKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBFbmNvZGUgVk9TIGFuZCBWT0wgSGVhZGVycyBvbiBmaXJzdCBjYWxsIGZvciBlYWNoIGxheWVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IDA7CisgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+dGltZUluYyA9IDA7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDb3B5IElucHV0IFZpZGVvIEZyYW1lIHRvIEludGVybmFsIFZpZGVvIEJ1ZmZlciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIFdpZHRoIGFuZCBIZWlnaHQgb2YgVm9wIExheWVyICovCisKKyAgICB3aWR0aCA9IGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtjdXJyTGF5ZXJdOyAgIC8qIEdldCBpbnB1dCB3aWR0aCAqLworICAgIGhlaWdodCA9IGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbY3VyckxheWVyXTsgLyogR2V0IGlucHV0IGhlaWdodCAqLworICAgIC8qIFJvdW5kIFVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgOiBNUEVHLTQgU3RhbmRhcmQgKi8KKworICAgIHdpZHRoXzE2ID0gKCh3aWR0aCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KKyAgICBoZWlnaHRfMTYgPSAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAvKiBSb3VuZCB1cCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDE2ICovCisKKyAgICB2aWRlby0+aW5wdXQgPSB2aWRfaW47ICAvKiBwb2ludCB0byB0aGUgZnJhbWUgaW5wdXQgKi8KKworICAgIC8qLy8gIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIERldGVybWluZSBWT1AgVHlwZSAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiA2LzIvMjAwMSwgc2VwYXJhdGUgZnVuY3Rpb24gICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBEZXRlcm1pbmVWb3BUeXBlKHZpZGVvLCBjdXJyTGF5ZXIpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICAgSW5pdGlhbGl6ZSBWT1AgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgdmlkZW8tPmN1cnJWb3AtPnZvbElEID0gY3VyclZvbC0+dm9sSUQ7CisgICAgdmlkZW8tPmN1cnJWb3AtPndpZHRoID0gd2lkdGhfMTY7CisgICAgdmlkZW8tPmN1cnJWb3AtPmhlaWdodCA9IGhlaWdodF8xNjsKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKSAvKiAgMTEvMjgvMDUgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+cGl0Y2ggPSB3aWR0aF8xNiArIDMyOworICAgIH0KKyAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IGN1cnJWb2wtPnRpbWVJbmNyZW1lbnQ7CisgICAgdmlkZW8tPmN1cnJWb3AtPnZvcENvZGVkID0gMTsKKyAgICB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlID0gMDsKKyAgICB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RocjsKKworICAgIGlmIChjdXJyTGF5ZXIgPT0gMAorI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLworICAgICAgICAgICAgfHwgcmFuZG9tX3ZhbFtyYW5kX2lkeF0gfHwgdmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnRlbXBGb3J3UmVmVm9wID0gdmlkZW8tPmZvcndhcmRSZWZWb3A7IC8qIGtlZXAgaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICBpZiAodmlkZW8tPnRlbXBGb3J3UmVmVm9wICE9IE5VTEwpIHZpZGVvLT50ZW1wUmVmU2VsQ29kZSA9IHZpZGVvLT50ZW1wRm9yd1JlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAxOworICAgIH0KKyNpZmRlZiBSQU5ET01fUkVGU0VMQ09ERQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT50ZW1wRm9yd1JlZlZvcCA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wOyAvKiBrZWVwIGluaXRpYWwgc3RhdGUgKi8KKyAgICAgICAgaWYgKHZpZGVvLT50ZW1wRm9yd1JlZlZvcCAhPSBOVUxMKSB2aWRlby0+dGVtcFJlZlNlbENvZGUgPSB2aWRlby0+dGVtcEZvcndSZWZWb3AtPnJlZlNlbGVjdENvZGU7CisKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMDsKKyAgICB9CisgICAgcmFuZF9pZHgrKzsKKyAgICByYW5kX2lkeCAlPSAzMDsKKyNlbmRpZgorCisgICAgdmlkZW8tPmN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKyAgICB2aWRlby0+Y3VyclZvcC0+Z29iTnVtYmVyID0gMDsKKyAgICB2aWRlby0+Y3VyclZvcC0+Z29iRnJhbWVJRCA9IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKyAgICB2aWRlby0+Y3VyclZvcC0+dGVtcG9yYWxSZWYgPSAoKG1vZFRpbWUpICogMzAgLyAxMDAxKSAlIDI1NjsKKworICAgIHZpZGVvLT5jdXJyVm9wLT50ZW1wb3JhbEludGVydmFsID0gMDsKKworICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXIgPSBlbmNQYXJhbXMtPkluaXRRdWFudEl2b3BbY3VyckxheWVyXTsKKyAgICBlbHNlCisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXIgPSBlbmNQYXJhbXMtPkluaXRRdWFudFB2b3BbY3VyckxheWVyXTsKKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWb3AgICAqLworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHZpZGVvLT5zbGljZV9jb2RpbmcgPSAxOworCisgICAgLypwdl9zdGF0dXMgPSovCisgICAgRW5jb2RlVm9wKHZpZGVvKTsKKworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgcHJpbnRmKCIgSS1WT1AgIik7CisgICAgZWxzZQorICAgICAgICBwcmludGYoIiBQLVZPUCAocmVmLiVkKSIsIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlKTsKKyNlbmRpZgorCisgICAgLyogU2V0IEhpbnRUcmFjayBJbmZvcm1hdGlvbiAqLworICAgIGlmIChjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2UpCisgICAgICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLk1UQiA9IDE7CisgICAgZWxzZQorICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5NVEIgPSAwOworCisgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTGF5ZXJJRCA9IChVQ2hhciljdXJyVm9sLT52b2xJRDsKKyAgICB2aWRlby0+aGludFRyYWNrSW5mby5Db2RlVHlwZSA9IChVQ2hhcil2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uUmVmU2VsQ29kZSA9IChVQ2hhcil2aWRlby0+Y3VyclZvcC0+cmVmU2VsZWN0Q29kZTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogTk9fU0xJQ0VfRU5DT0RFICovCisKKyNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRW5jb2RlUGFja2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgb25lIHBhY2tldCBhbmQgcmV0dXJuIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkVuY29kZVNsaWNlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFVDaGFyICpic3RyZWFtLCBJbnQgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCAqZW5kb2ZGcmFtZSwgVmlkZW9FbmNGcmFtZUlPICp2aWRfb3V0LCBVTG9uZyAqbmV4dE1vZFRpbWUpCit7CisgICAgUFZfU1RBVFVTIHB2X3N0YXR1czsKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgVm9sICpjdXJyVm9sOworICAgIFBWX1NUQVRVUyAgIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKKyAgICBWb3AgKnRlbXA7CisgICAgdm9pZCAgUGFkZGluZ0VkZ2UoVm9wICpwYWRWb3ApOworICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIEludCBwcmVfc2tpcDsKKyAgICBJbnQgcHJlX3NpemU7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgVm9sIHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBhcHBsaWNhdGlvbiBiaXRzdHJlYW0gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIGN1cnJWb2wtPnN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gYnN0cmVhbTsKKyAgICBwcmVfc2l6ZSA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50OworICAgIGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSA9IHByZV9zaXplICsgKCpzaXplKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBFbmNvZGUgVk9TIGFuZCBWT0wgSGVhZGVycyBvbiBmaXJzdCBjYWxsIGZvciBlYWNoIGxheWVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgeworICAgICAgICBpZiAoIXZpZGVvLT5lbmNQYXJhbXMtPkdldFZvbEhlYWRlcltjdXJyTGF5ZXJdKQorICAgICAgICAgICAgcHZfc3RhdHVzID0gRW5jb2RlVk9TX1N0YXJ0KGVuY0N0cmwpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBTbGljZSAqLworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHB2X3N0YXR1cyA9IEVuY29kZVNsaWNlKHZpZGVvKTsKKworICAgICplbmRvZkZyYW1lID0gMDsKKworICAgIGlmICh2aWRlby0+bWJudW0gPj0gY3VyclZvbC0+blRvdGFsTUIgJiYgIXZpZGVvLT5lbmRfb2ZfYnVmKQorICAgIHsKKyAgICAgICAgKmVuZG9mRnJhbWUgPSAxOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIFVwZGF0ZSBTa2lwIE5leHQgRnJhbWUgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHByZV9za2lwID0gVXBkYXRlU2tpcE5leHRGcmFtZSh2aWRlbywgbmV4dE1vZFRpbWUsIHNpemUsIHB2X3N0YXR1cyk7IC8qIG1vZGlmaWVkIHN1Y2ggdGhhdCBubyBwcmUtc2tpcHBlZCAqLworCisgICAgICAgIGlmIChwcmVfc2tpcCA9PSAtMSkgLyogZXJyb3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKmVuZG9mRnJhbWUgPSAtMTsKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHBvaW50ZXJzIGFyZSByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgc3RhdGUgKi8KKyAgICAgICAgICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT50ZW1wRm9yd1JlZlZvcDsgLyogRm9yIFAtVm9wIGJhc2Ugb25seSAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gdmlkZW8tPnRlbXBSZWZTZWxDb2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcHZfc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgSS1WT1Agd2FzIGVuY29kZWQsIHJlc2V0IEludHJhUGVyaW9kICovCisgICAgICAgIGlmICgoY3VyckxheWVyID09IDApICYmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID4gMCkgJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkpCisgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSBlbmNQYXJhbXMtPkludHJhUGVyaW9kOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBDb3B5IFJlY29uc3RydWN0ZWQgQnVmZmVyIHRvIE91dHB1dCBWaWRlbyBGcmFtZSBCdWZmZXIgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHZpZF9vdXQtPnlDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOworICAgICAgICB2aWRfb3V0LT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbjsKKyAgICAgICAgdmlkX291dC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dkNoYW47CisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZF9vdXQtPmhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQ7IC8qIHBhZGRlZCBoZWlnaHQgKi8KKyAgICAgICAgICAgIHZpZF9vdXQtPnBpdGNoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvKiBwYWRkZWQgd2lkdGggKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZF9vdXQtPmhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQgKyAzMjsgLyogcGFkZGVkIGhlaWdodCAqLworICAgICAgICAgICAgdmlkX291dC0+cGl0Y2ggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGggKyAzMjsgLyogcGFkZGVkIHdpZHRoICovCisgICAgICAgIH0KKyAgICAgICAgLy92aWRfb3V0LT50aW1lc3RhbXAgPSB2aWRlby0+bW9kVGltZTsKKyAgICAgICAgdmlkX291dC0+dGltZXN0YW1wID0gKFVMb25nKSgoKHZpZGVvLT5wcmV2RnJhbWVOdW1bY3VyckxheWVyXSAqIDEwMDApIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtjdXJyTGF5ZXJdKSArIHZpZGVvLT5tb2RUaW1lUmVmICsgMC41KTsKKworICAgICAgICAvKi8vIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBTd2FwIFZvcCBQb2ludGVycyBmb3IgQmFzZSBMYXllciAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gdmlkZW8tPnByZXZCYXNlVm9wOworICAgICAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnBhZGRlZCA9IDA7IC8qIG5vdCBwYWRkZWQgKi8KKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcDsKKyAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCisgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnBhZGRlZCA9IDA7IC8qIG5vdCBwYWRkZWQgKi8KKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcDsKKyAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOworICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFVwZGF0ZSBPdXB1dCBic3RyZWFtIGJ5dGUgY291bnQgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAqc2l6ZSA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50IC0gcHJlX3NpemU7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBNb2RpZnkgdGhlIGludGlhbGl6ZSBmbGFnIGF0IHRoZSBlbmQuKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKKyAgICAgICAgdmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSA9IDA7CisKKyAgICByZXR1cm4gcHZfc3RhdHVzOworfQorI2VuZGlmIC8qIE5PX1NMSUNFX0VOQ09ERSAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRIMjYzUHJvZmlsZUxldmVsSUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwMi8wNS8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCBILjI2MyBQcm9maWxlIElEIGFuZCBsZXZlbCBJRCBmb3IgcHJvZmlsZSAwICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogUHJvZmlsZSBJRD0wLCBsZXZlbElEIGlzIHdoYXQgd2Ugd2FudCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogaDI2M0xldmVsWzhdLCByQlJfYm91bmRbOF0sIG1heF9oMjYzX2ZyYW1lcmF0ZVsyXSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICBtYXhfaDI2M193aWR0aFsyXSwgbWF4X2gyNjNfaGVpZ2h0WzJdIGFyZSBnbG9iYWwgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldEgyNjNQcm9maWxlTGV2ZWxJRChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKnByb2ZpbGVJRCwgSW50ICpsZXZlbElEKQoreworICAgIFZpZGVvRW5jRGF0YSAqZW5jRGF0YTsKKyAgICBJbnQgd2lkdGgsIGhlaWdodDsKKyAgICBmbG9hdCBiaXRyYXRlX3IsIGZyYW1lcmF0ZTsKKworCisgICAgLyogRm9yIHRoaXMgdmVyc2lvbiwgd2Ugb25seSBzdXBwb3J0IEguMjYzIHByb2ZpbGUgMCAqLworICAgICpwcm9maWxlSUQgPSAwOworCisgICAgKmxldmVsSUQgPSAwOworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGlmICghZW5jRGF0YS0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpIHJldHVybiBQVl9GQUxTRTsKKworCisgICAgLyogZ2V0IGltYWdlIHdpZHRoLCBoZWlnaHQsIGJpdHJhdGUgYW5kIGZyYW1lcmF0ZSAqLworICAgIHdpZHRoICAgICA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFswXTsKKyAgICBoZWlnaHQgICAgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0WzBdOworICAgIGJpdHJhdGVfciA9IChmbG9hdCkoZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMF0pIC8gKGZsb2F0KTY0MDAwLjA7CisgICAgZnJhbWVyYXRlID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXTsKKyAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQgfHwgIShiaXRyYXRlX3IgPiAwICYmIGZyYW1lcmF0ZSA+IDApKSByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBUaGlzIGlzIHRoZSBtb3N0IGZyZXF1ZW50IGNhc2UgOiBsZXZlbCAxMCAqLworICAgIGlmIChiaXRyYXRlX3IgPD0gckJSX2JvdW5kWzFdICYmIGZyYW1lcmF0ZSA8PSBtYXhfaDI2M19mcmFtZXJhdGVbMF0gJiYKKyAgICAgICAgICAgICh3aWR0aCA8PSBtYXhfaDI2M193aWR0aFswXSAmJiBoZWlnaHQgPD0gbWF4X2gyNjNfaGVpZ2h0WzBdKSkKKyAgICB7CisgICAgICAgICpsZXZlbElEID0gaDI2M0xldmVsWzFdOworICAgICAgICByZXR1cm4gUFZfVFJVRTsKKyAgICB9CisgICAgZWxzZSBpZiAoYml0cmF0ZV9yID4gckJSX2JvdW5kWzRdIHx8CisgICAgICAgICAgICAgKHdpZHRoID4gbWF4X2gyNjNfd2lkdGhbMV0gfHwgaGVpZ2h0ID4gbWF4X2gyNjNfaGVpZ2h0WzFdKSB8fAorICAgICAgICAgICAgIGZyYW1lcmF0ZSA+IG1heF9oMjYzX2ZyYW1lcmF0ZVsxXSkgICAgLyogY2hlY2sgdGhlIGhpZ2hlc3QgbGV2ZWwgNzAgKi8KKyAgICB7CisgICAgICAgICpsZXZlbElEID0gaDI2M0xldmVsWzddOworICAgICAgICByZXR1cm4gUFZfVFJVRTsKKyAgICB9CisgICAgZWxzZSAgIC8qIHNlYXJjaCBsZXZlbCAyMCwgMzAsIDQwICovCisgICAgeworCisgICAgICAgIC8qIHBpY2sgb3V0IGxldmVsIDIwICovCisgICAgICAgIGlmIChiaXRyYXRlX3IgPD0gckJSX2JvdW5kWzJdICYmCisgICAgICAgICAgICAgICAgKCh3aWR0aCA8PSBtYXhfaDI2M193aWR0aFswXSAmJiBoZWlnaHQgPD0gbWF4X2gyNjNfaGVpZ2h0WzBdICYmIGZyYW1lcmF0ZSA8PSBtYXhfaDI2M19mcmFtZXJhdGVbMV0pIHx8CisgICAgICAgICAgICAgICAgICh3aWR0aCA8PSBtYXhfaDI2M193aWR0aFsxXSAmJiBoZWlnaHQgPD0gbWF4X2gyNjNfaGVpZ2h0WzFdICYmIGZyYW1lcmF0ZSA8PSBtYXhfaDI2M19mcmFtZXJhdGVbMF0pKSkKKyAgICAgICAgeworICAgICAgICAgICAgKmxldmVsSUQgPSBoMjYzTGV2ZWxbMl07CisgICAgICAgICAgICByZXR1cm4gUFZfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLyogd2lkdGgsIGhlaWdodCBhbmQgZnJhbWVyYXRlIGFyZSBvaywgbm93IGNob29zZSBsZXZlbCAzMCBvciA0MCAqLworICAgICAgICB7CisgICAgICAgICAgICAqbGV2ZWxJRCA9IChiaXRyYXRlX3IgPD0gckJSX2JvdW5kWzNdID8gaDI2M0xldmVsWzNdIDogaDI2M0xldmVsWzRdKTsKKyAgICAgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0TVBFRzRQcm9maWxlTGV2ZWxJRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMjYvMDYvMjAwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBHZXQgTVBFRzQgTGV2ZWwgYWZ0ZXIgaW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IHByb2ZpbGVfbGV2ZWwgYWNjb3JkaW5nIHRvIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldE1QRUc0UHJvZmlsZUxldmVsSUQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpwcm9maWxlX2xldmVsLCBJbnQgbkxheWVyKQoreworICAgIFZpZGVvRW5jRGF0YSogdmlkZW87CisgICAgSW50IGk7CisKKyAgICB2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKG5MYXllciA9PSAwKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9PSBwcm9maWxlX2xldmVsX2NvZGVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKnByb2ZpbGVfbGV2ZWwgPSBpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID09IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfY29kZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcHJvZmlsZV9sZXZlbCA9IGkgKyBTSU1QTEVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDA7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZm5kZWYgTElNSVRFRF9BUEkKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZVcGRhdGVFbmNGcmFtZVJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8wOC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFVwZGF0ZSB0YXJnZXQgZnJhbWUgcmF0ZXMgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSAgICAqLworLyogICAgICAgICAgICAgbGF5ZXIoaWYgYW55KSB3aGlsZSBlbmNvZGluZyBvcGVyYXRpb24gaXMgb25nb2luZyAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVlVwZGF0ZUVuY0ZyYW1lUmF0ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBmbG9hdCAqZnJhbWVSYXRlKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKyAgICBJbnQgaTsvLyBuVG90YWxNQiwgbWJQZXJTZWM7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBVcGRhdGUgdGhlIGZyYW1lcmF0ZXMgZm9yIGFsbCB0aGUgbGF5ZXJzICovCisgICAgZm9yIChpID0gMDsgaSA8IGVuY0RhdGEtPmVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQorICAgIHsKKworICAgICAgICAvKiBOZXcgY2hlY2s6IGVuY29kaW5nIGZyYW1lcmF0ZSBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBnaXZlbiBwcm9maWxlIGFuZCBsZXZlbCAqLworICAgICAgICAvL25Ub3RhbE1CID0gKCgoZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllcldpZHRoW2ldKzE1KS8xNikqMTYpKigoKGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaV0rMTUpLzE2KSoxNikvKDE2KjE2KTsKKyAgICAgICAgLy9tYlBlclNlYyA9IChJbnQpKG5Ub3RhbE1CICogZnJhbWVSYXRlW2ldKTsKKyAgICAgICAgLy9pZihtYlBlclNlYyA+IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbaV0pIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgaWYgKGZyYW1lUmF0ZVtpXSA+IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbaV0pIHJldHVybiBQVl9GQUxTRTsgLyogc2V0IGJ5IHVzZXJzIG9yIHByb2ZpbGUgKi8KKworICAgICAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldID0gZnJhbWVSYXRlW2ldOworICAgIH0KKworICAgIHJldHVybiBSQ19VcGRhdGVCWFJDUGFyYW1zKCh2b2lkKikgZW5jRGF0YSk7CisKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZUJpdFJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIHRhcmdldCBiaXQgcmF0ZXMgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSAgICAgICovCisvKiAgICAgICAgICAgICBsYXllcihpZiBhbnkpIHdoaWxlIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWVXBkYXRlQml0UmF0ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKmJpdFJhdGUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworICAgIEludCBpOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgLyogVXBkYXRlIHRoZSBiaXRyYXRlcyBmb3IgYWxsIHRoZSBsYXllcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICBpZiAoYml0UmF0ZVtpXSA+IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlW2ldKSAvKiBzZXQgYnkgdXNlcnMgb3IgcHJvZmlsZSAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbaV0gPSBiaXRSYXRlW2ldOworICAgIH0KKworICAgIHJldHVybiBSQ19VcGRhdGVCWFJDUGFyYW1zKCh2b2lkKikgZW5jRGF0YSk7CisKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZVcGRhdGVWQlZEZWxheSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMjMvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFVwZGF0ZSBWQlYgYnVmZmVyIHNpemUoaW4gZGVsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworQm9vbCBQVlVwZGF0ZVZCVkRlbGF5KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIGZsb2F0IGRlbGF5KQoreworCisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworICAgIEludCB0b3RhbF9iaXRyYXRlLCBtYXhfYnVmZmVyX3NpemU7CisgICAgaW50IGluZGV4OworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgaW5wdXQgZGVsYXkgaXMgdmFsaWQgYmFzZWQgb24gdGhlIGdpdmVuIHByb2ZpbGUgKi8KKyAgICB0b3RhbF9iaXRyYXRlICAgPSAoZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzID09IDEgPyBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyQml0UmF0ZVswXSA6CisgICAgICAgICAgICAgICAgICAgICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzFdKTsKKyAgICBpbmRleCA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+cHJvZmlsZV90YWJsZV9pbmRleDsKKyAgICBtYXhfYnVmZmVyX3NpemUgPSAoZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzID09IDEgPyBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0gOgorICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pOworCisgICAgaWYgKHRvdGFsX2JpdHJhdGUqZGVsYXkgPiAoZmxvYXQpbWF4X2J1ZmZlcl9zaXplKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPlZCVl9kZWxheSA9IGRlbGF5OworICAgIHJldHVybiBQVl9UUlVFOworCit9CisjZW5kaWYKKyNpZm5kZWYgTElNSVRFRF9BUEkKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZVcGRhdGVJRnJhbWVJbnRlcnZhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTAvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiB1cGRhdGVzIHRoZSBJTlRSQSBmcmFtZSByZWZyZXNoIGludGVydmFsIHdoaWxlIGVuY29kaW5nICAgICAgKi8KKy8qICAgICAgICAgICAgIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZVcGRhdGVJRnJhbWVJbnRlcnZhbChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgYUlGcmFtZVBlcmlvZCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkludHJhUGVyaW9kID0gYUlGcmFtZVBlcmlvZDsKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlNldE51bUludHJhTUJSZWZyZXNoKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzA1LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEJvb2wgICAgUFZVcGRhdGVOdW1JbnRyYU1CUmVmcmVzaChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgbnVtTUIpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5SZWZyZXNoID0gbnVtTUI7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVklGcmFtZVJlcXVlc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzEwLzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogZW5jb2RlcyB0aGUgbmV4dCBiYXNlIGZyYW1lIGFzIGFuIEktVm9wICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVklGcmFtZVJlcXVlc3QoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBlbmNEYXRhLT5uZXh0RW5jSVZvcCA9IDE7CisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisjZW5kaWYKKyNpZm5kZWYgTElNSVRFRF9BUEkKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRFbmNNZW1vcnlVc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxMC8xNy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEludCBQVkdldEVuY01lbW9yeVVzYWdlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIHJldHVybiBlbmNEYXRhLT5lbmNQYXJhbXMtPk1lbW9yeVVzYWdlOworfQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRIaW50VHJhY2soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAxLzE3LzIwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZHZXRIaW50VHJhY2soVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgTVA0SGludFRyYWNrICppbmZvKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpbmZvLT5NVEIgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLk1UQjsKKyAgICBpbmZvLT5MYXllcklEID0gZW5jRGF0YS0+aGludFRyYWNrSW5mby5MYXllcklEOworICAgIGluZm8tPkNvZGVUeXBlID0gZW5jRGF0YS0+aGludFRyYWNrSW5mby5Db2RlVHlwZTsKKyAgICBpbmZvLT5SZWZTZWxDb2RlID0gZW5jRGF0YS0+aGludFRyYWNrSW5mby5SZWZTZWxDb2RlOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRNYXhWaWRlb0ZyYW1lU2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA3LzE3LzIwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEZ1bmN0aW9uIG1lcmVseSByZXR1cm5zIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZHZXRNYXhWaWRlb0ZyYW1lU2l6ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKm1heFZpZGVvRnJhbWVTaXplKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworCisKKyAgICAqbWF4VmlkZW9GcmFtZVNpemUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF07CisKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzID09IDIpCisgICAgICAgIGlmICgqbWF4VmlkZW9GcmFtZVNpemUgPCBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV0pCisgICAgICAgICAgICAqbWF4VmlkZW9GcmFtZVNpemUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV07CisgICAgKm1heFZpZGVvRnJhbWVTaXplID4+PSAzOyAgIC8qIENvbnZlcnQgdG8gQnl0ZXMgKi8KKworICAgIGlmICgqbWF4VmlkZW9GcmFtZVNpemUgPD0gNDAwMCkKKyAgICAgICAgKm1heFZpZGVvRnJhbWVTaXplID0gNDAwMDsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldFZCVlNpemUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMTUvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRnVuY3Rpb24gbWVyZWx5IHJldHVybnMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldFZCVlNpemUoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpWQlZTaXplKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgICpWQlZTaXplID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMikKKyAgICAgICAgKlZCVlNpemUgKz0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdOworCisgICAgcmV0dXJuIFBWX1RSVUU7CisKK30KKyNlbmRpZgorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVWT1NfU3RhcnQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlcyB0aGUgVk9TLFZPLCBhbmQgVk9MIG9yIFNob3J0IEhlYWRlcnMgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCkKK3sKKworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgVm9sICAgICAgICAgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIC8vaW50IHByb2ZpbGVfbGV2ZWw9MHgwMTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgaW50IGksIGo7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2hlY2sgZm9yIHNob3J0X3ZpZGVvX2hlYWRlciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlciA9PSAxKQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNob3J0IFZpZGVvIEhlYWRlciBvciBNNFYgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIFZpc3VhbE9iamVjdFNlcXVlbmNlICgpKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDMyLCBTRVNTSU9OX1NUQVJUX0NPREUpOworICAgICAgICAvKiAgRGV0ZXJtaW5lIHByb2ZpbGVfbGV2ZWwgKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFt2aWRlby0+Y3VyckxheWVyXSk7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVmlzdWFsT2JqZWN0KCkgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDMyLCBWSVNVQUxfT0JKRUNUX1NUQVJUX0NPREUpOworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOyAvKiB2aXN1YWwgb2JqZWN0IGlkZW50aWZpZXIgKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDQsIDB4MDEpOyAvKiB2aXN1YWwgb2JqZWN0IFR5cGUgPT0gInZpZGVvIElEIiAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOyAvKiBubyB2aWRlbyBzaWduYWwgdHlwZSAqLworCisgICAgICAgIC8qdGVtcCAgID0gKi8KKyAgICAgICAgQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhzdHJlYW0pOworCisKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAyNywgVk9fU1RBUlRfQ09ERSk7LyogYnl0ZSBhbGlnbjogc2hvdWxkIGJlIDIgYml0cyAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgMHgwMCk7LyogIFZpZGVvIElEID0gMCAgKi8KKworCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIFZpZGVvT2JqZWN0TGF5ZXIoKSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIgPT0gMCkKKyAgICAgICAgeyAvKiBNNFYgIGVsc2UgU2hvcnQgVmlkZW8gSGVhZGVyICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgVk9MX1NUQVJUX0NPREUpOworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDQsIGN1cnJWb2wtPnZvbElEKTsvKiAgdmlkZW9fb2JqZWN0X2xheWVyX2lkICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qICBSYW5kb20gQWNjZXNzID0gMCAgKi8KKworICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyTGF5ZXIgPT0gMCkKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgMHgwMSk7LyogVmlkZW8gT2JqZWN0IFR5cGUgSW5kaWNhdGlvbiA9IDEgIC4uLiBTaW1wbGUgT2JqZWN0IFR5cGUgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgMHgwMik7LyogVmlkZW8gT2JqZWN0IFR5cGUgSW5kaWNhdGlvbiA9IDIgIC4uLiBTaW1wbGUgU2NhbGFibGUgT2JqZWN0IFR5cGUgKi8KKworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiAgaXNfb2JqZWN0X2xheWVyX2lkZW50aWZlciA9IDAgKi8KKworCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgMHgwMSk7IC8qIGFzcGVjdF9yYXRpb19pbmZvID0gMSAuLi4gMToxKFNxdWFyZSkgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7Lyogdm9sX2NvbnRyb2xfcGFyYW1ldGVycyA9IDAgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAyLCAweDAwKTsvKiB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwMCAuLi4gcmVjdGFuZ3VsYXIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1Q4Qml0cyhzdHJlYW0sIDE2LCBjdXJyVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbik7Lyogdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5maXhlZFZvcFJhdGUpOy8qIGZpeGVkX3ZvcF9yYXRlID0gMCAqLworCisgICAgICAgICAgICAvKiBGb3IgUmVjdGFuZ3VsYXIgVk8gbGF5ZXIgc2hhcGUgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1Q4Qml0cyhzdHJlYW0sIDEzLCBjdXJyVm9sLT53aWR0aCk7LyogdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDEpOy8qIG1hcmtlciBiaXQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUOEJpdHMoc3RyZWFtLCAxMywgY3VyclZvbC0+aGVpZ2h0KTsvKiB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDEpOy8qbWFya2VyIGJpdCAqLworCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qaW50ZXJsYWNlZCA9IDAgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7Lyogb2JtY19kaXNhYmxlID0gMSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiBzcHJpdGVfZW5hYmxlID0gMCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiBub3RfOF9iaXQgPSAwICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnF1YW50VHlwZSk7LyogICBxdWFudF90eXBlICovCisKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT5xdWFudFR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5sb2FkSW50cmFRdWFudE1hdCk7IC8qIEludHJhIHF1YW50IG1hdHJpeCAqLworICAgICAgICAgICAgICAgIGlmIChjdXJyVm9sLT5sb2FkSW50cmFRdWFudE1hdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDYzOyBqID49IDE7IGotLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyVm9sLT5pcW1hdFsqKHppZ3phZ19pK2opXSAhPSBjdXJyVm9sLT5pcW1hdFsqKHppZ3phZ19pK2otMSldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoKGogPT0gMSkgJiYgKGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2kraildID09IGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2krai0xKV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqICsgMTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2kraSldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPCA2MykKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5pcW1hdFtqXSA9IG1wZWdfaXFtYXRfZGVmW2pdOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+bG9hZE5vbkludHJhUXVhbnRNYXQpOyAvKiBOb24tSW50cmEgcXVhbnQgbWF0cml4ICovCisgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmxvYWROb25JbnRyYVF1YW50TWF0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gNjM7IGogPj0gMTsgai0tKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2opXSAhPSBjdXJyVm9sLT5uaXFtYXRbKih6aWd6YWdfaStqLTEpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChqID09IDEpICYmIChjdXJyVm9sLT5uaXFtYXRbKih6aWd6YWdfaStqKV0gPT0gY3VyclZvbC0+bmlxbWF0WyooemlnemFnX2krai0xKV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqICsgMTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2kpXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgNjMpCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyclZvbC0+bmlxbWF0W2pdID0gbXBlZ19ucW1hdF9kZWZbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDEpOyAgIC8qIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gMSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlKTsvKiBSZXN5bmNfbWFya2VyX2Rpc2FibGUgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZyk7LyogRGF0YSBwYXJ0aXRpb25lZCAqLworCisgICAgICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnVzZVJldmVyc2VWTEMpOyAvKiBSZXZlcnNpYmxlX3ZsYyAqLworCisKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT5zY2FsYWJpbGl0eSkgLyogU2NhbGFiaWxpdHkqLworICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5zY2FsYWJpbGl0eSk7LyogU2NhbGFiaWxpdHkgPSAxICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5zY2FsVHlwZSk7LyogaGllcmFyY2h5IF90eXBlIC4uLiBTcGF0aWFsPSAwIGFuZCBUZW1wb3JhbCA9IDEgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgY3VyclZvbC0+cmVmVm9sSUQpOy8qIHJlZl9sYXllcl9pZCAgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnJlZlNhbXBEaXIpOy8qIHJlZl9sYXllcl9zYW1wbGluZ19kaXJlYyovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb2wtPmhvclNhbXBfbik7Lypob3Jfc2FtcGxpbmdfZmFjdG9yX24qLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9sLT5ob3JTYW1wX20pOy8qaG9yX3NhbXBsaW5nX2ZhY3Rvcl9tKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgY3VyclZvbC0+dmVyU2FtcF9uKTsvKnZlcnRfc2FtcGxpbmdfZmFjdG9yX24qLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9sLT52ZXJTYW1wX20pOy8qdmVydF9zYW1wbGluZ19mYWN0b3JfbSovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5lbmhhbmNlbWVudFR5cGUpOy8qIGVuaGFuY2VtZW50X3R5cGUqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBObyBTY2FsYWJpbGl0eSAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+c2NhbGFiaWxpdHkpOy8qIFNjYWxhYmlsaXR5ID0gMCAqLworCisgICAgICAgICAgICAvKnRlbXAgPSAqLworICAgICAgICAgICAgQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhzdHJlYW0pOyAvKiBCeXRlIGFsaWduIEhlYWRlcnMgZm9yIFZPUCAqLworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBWT1NfRW5kKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVmlzdWFsIE9iamVjdCBTZXF1ZW5jZSBFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgVk9TX0VuZChWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhOworICAgIFZvbCAgICAgICAgICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtID0gY3VyclZvbC0+c3RyZWFtOworCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgU0VTU0lPTl9FTkRfQ09ERSwgMzIpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBEZXRlcm1pbmVDb2RpbmdMYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA2LzAyLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRmluZCBsYXllciB0byBjb2RlIGJhc2VkIG9uIGN1cnJlbnQgbW9kIHRpbWUsIGFzc3VtaW5nIHRoYXQKKyAgICAgICAgICAgICAgIGl0J3MgdGltZSB0byBlbmNvZGUgZW5oYW5jZWQgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBOdW1iZXIgb2YgbGF5ZXIgdG8gY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworSW50IERldGVybWluZUNvZGluZ0xheWVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCAqbkxheWVyLCBVTG9uZyBtb2RUaW1lKQoreworICAgIFZvbCAqKnZvbCA9IHZpZGVvLT52b2w7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgSW50IG51bUxheWVycyA9IGVuY1BhcmFtcy0+bkxheWVyczsKKyAgICBVSW50IG1vZFRpbWVSZWYgPSB2aWRlby0+bW9kVGltZVJlZjsKKyAgICBmbG9hdCAqTGF5ZXJGcmFtZVJhdGUgPSBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlOworICAgIFVJbnQgZnJhbWVOdW1bNF0sIGZyYW1lVGljazsKKyAgICBVTG9uZyBmcmFtZU1vZFRpbWUsIG5leHRGcm1Nb2RUaW1lOworI2lmZGVmIFJFRFVDRV9GUkFNRV9WQVJJQU5DRSAgICAvKiBUbyBsaW1pdCBob3cgY2xvc2UgMiBmcmFtZXMgY2FuIGJlICovCisgICAgZmxvYXQgZnJhbWVJbnRlcnZhbDsKKyNlbmRpZgorICAgIGZsb2F0IHNyY0ZyYW1lSW50ZXJ2YWw7CisgICAgSW50IGZyYW1lSW5jOworICAgIEludCBpLCBleHRyYV9za2lwOworICAgIEludCBlbmNvZGVWb3AgPSAwOworCisgICAgaSA9IG51bUxheWVycyAtIDE7CisKKyAgICBpZiAobW9kVGltZSAtIHZpZGVvLT5uZXh0TW9kVGltZSA+ICgoVUxvbmcpKC0xKSkgPj4gMSkgLyogbmV4dCB0aW1lIHdyYXBwZWQgYXJvdW5kICovCisgICAgICAgIHJldHVybiAwOyAvKiBub3QgdGltZSB0byBjb2RlIGl0IHlldCAqLworCisgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gLT0gMTAwMDsKKyAgICB2aWRlby0+bmV4dEVuY0lWb3AtLTsgIC8qIG51bWJlciBvZiBWb3BzIGluIGhpZ2hlc3QgbGF5ZXIgcmVzb2x1dGlvbi4gKi8KKyAgICB2aWRlby0+bnVtVm9wc0luR09QKys7CisKKyAgICAvKiBmcm9tIHRoaXMgcG9pbnQgZnJhbWVNb2RUaW1lIGFuZCBuZXh0RnJtTW9kVGltZSBhcmUgaW50ZXJuYWwgKi8KKworICAgIGZyYW1lTnVtW2ldID0gKFVJbnQpKChtb2RUaW1lIC0gbW9kVGltZVJlZikgKiBMYXllckZyYW1lUmF0ZVtpXSArIDUwMCkgLyAxMDAwOworICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtpXSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXSAtIDE7CisgICAgfQorICAgIGVsc2UgaWYgKGZyYW1lTnVtW2ldIDw9IHZpZGVvLT5wcmV2RnJhbWVOdW1baV0pCisgICAgeworICAgICAgICByZXR1cm4gMDsgLyogZG8gbm90IGVuY29kZSB0aGlzIGZyYW1lICovCisgICAgfQorCisgICAgLyoqKiogdGhpcyBwYXJ0IGNvbXB1dGVzIGV4cGVjdGVkIG5leHQgZnJhbWUgKioqKioqKi8KKyAgICBmcmFtZU1vZFRpbWUgPSAoVUxvbmcpKCgoZnJhbWVOdW1baV0gKiAxMDAwKSAvIExheWVyRnJhbWVSYXRlW2ldKSArIG1vZFRpbWVSZWYgKyAwLjUpOyAvKiByZWMuIHRpbWUgKi8KKyAgICBuZXh0RnJtTW9kVGltZSA9IChVTG9uZykoKCgoZnJhbWVOdW1baV0gKyAxKSAqIDEwMDApIC8gTGF5ZXJGcmFtZVJhdGVbaV0pICsgbW9kVGltZVJlZiArIDAuNSk7IC8qIHJlYy4gdGltZSAqLworCisgICAgc3JjRnJhbWVJbnRlcnZhbCA9IDEwMDAgLyB2aWRlby0+RnJhbWVSYXRlOworCisgICAgdmlkZW8tPm5leHRNb2RUaW1lID0gbmV4dEZybU1vZFRpbWUgLSAoVUxvbmcpKHNyY0ZyYW1lSW50ZXJ2YWwgLyAyLikgLSAxOyAvKiBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5leHQgZnJhbWUgKi8KKworI2lmZGVmIFJFRFVDRV9GUkFNRV9WQVJJQU5DRSAgICAvKiBUbyBsaW1pdCBob3cgY2xvc2UgMiBmcmFtZXMgY2FuIGJlICovCisgICAgZnJhbWVJbnRlcnZhbCA9IDEwMDAgLyBMYXllckZyYW1lUmF0ZVtpXTsgLyogbmV4dCByZWMuIHRpbWUgKi8KKyAgICBkZWx0YSA9IChJbnQpKGZyYW1lSW50ZXJ2YWwgLyA0KTsgLyogZW1waXJpY2FsIG51bWJlciAqLworICAgIGlmICh2aWRlby0+bmV4dE1vZFRpbWUgLSBtb2RUaW1lICA8IChVTG9uZylkZWx0YSkgLyogbmVlZCB0byBtb3ZlIG5leHRNb2RUaW1lIGZ1cnRoZXIuICovCisgICAgeworICAgICAgICB2aWRlby0+bmV4dE1vZFRpbWUgKz0gKChkZWx0YSAtIHZpZGVvLT5uZXh0TW9kVGltZSArIG1vZFRpbWUpKTsgLyogZW1waXJpY2FsIGZvcm11bGEgICovCisgICAgfQorI2VuZGlmCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBtYXAgZnJhbWUgbm8udG8gdGljayBmcm9tIG1vZFRpbWVSZWYgKi8KKyAgICAvKmZyYW1lVGljayA9IChmcmFtZU51bVtpXSp2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKSA7CisgICAgZnJhbWVUaWNrID0gKFVJbnQpKChmcmFtZVRpY2sgKyAoZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXS8yKSkvZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7Ki8KKyAgICAvKiAgMTEvMTYvMDEsIGNoYW5nZSBmcmFtZVRpY2sgdG8gYmUgdGhlIGNsb3Nlc3QgdGljayBmcm9tIHRoZSBhY3R1YWwgbW9kVGltZSAqLworICAgIC8qICAxMi8xMi8wMiwgYWRkIChkb3VibGUpIHRvIHByZXZlbnQgbGFyZ2UgbnVtYmVyIHdyYXAtYXJvdW5kICovCisgICAgZnJhbWVUaWNrID0gKEludCkoKChkb3VibGUpKG1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb24gKyA1MDApIC8gMTAwMCk7CisKKyAgICAvKiBmaW5kIHRpbWVJbmNyZW1lbnQgdG8gYmUgcHV0IGluIHRoZSBiaXRzdHJlYW0gKi8KKyAgICAvKiByZWZUaWNrIGlzIHNlY29uZCBib3VuZGFyeSByZWZlcmVuY2UuICovCisgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50ID0gZnJhbWVUaWNrIC0gdmlkZW8tPnJlZlRpY2tbaV07CisKKworICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UgPSAwOworICAgIHdoaWxlICh2b2xbaV0tPnRpbWVJbmNyZW1lbnQgPj0gdm9sW2ldLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbikKKyAgICB7CisgICAgICAgIHZvbFtpXS0+dGltZUluY3JlbWVudCAtPSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOworICAgICAgICB2b2xbaV0tPm1vZHVsb1RpbWVCYXNlKys7CisgICAgICAgIC8qIGRvIG5vdCB1cGRhdGUgcmVmVGljayBhbmQgbW9kVGltZVJlZiB5ZXQsIGRvIGl0IGFmdGVyIGVuY29kaW5nISEgKi8KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gPD0gMCkgICAgLyogbm8gc2tpcHBpbmcgKi8KKyAgICB7CisgICAgICAgIGVuY29kZVZvcCA9IDE7CisgICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSAqbkxheWVyID0gaTsKKyAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gKz0gMTAwMDsKKworICAgICAgICAvKiB0YWtlcyBjYXJlIG9mIG1vcmUgZHJvcHBlZCBmcmFtZSB0aGFuIGV4cGVjdGVkICovCisgICAgICAgIGV4dHJhX3NraXAgPSAtMTsKKyAgICAgICAgZnJhbWVJbmMgPSAoZnJhbWVOdW1baV0gLSB2aWRlby0+cHJldkZyYW1lTnVtW2ldKTsKKyAgICAgICAgZXh0cmFfc2tpcCArPSBmcmFtZUluYzsKKworICAgICAgICBpZiAoZXh0cmFfc2tpcCA+IDApCisgICAgICAgIHsgICAvKiB1cGRhdGUgcmMtPk5yLCByYy0+QiwgKHJjLT5ScikqLworICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wIC09IGV4dHJhX3NraXA7CisgICAgICAgICAgICB2aWRlby0+bnVtVm9wc0luR09QICs9IGV4dHJhX3NraXA7CisgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUkNfVXBkYXRlQnVmZmVyKHZpZGVvLCBpLCBleHRyYV9za2lwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIC8qIHVwZGF0ZSBmcmFtZSBuby4gKi8KKyAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldID0gZnJhbWVOdW1baV07CisKKyAgICAvKiBnbyB0aHJvdWdoIGFsbCBsb3dlciBsYXllciAqLworICAgIGZvciAoaSA9IChudW1MYXllcnMgLSAyKTsgaSA+PSAwOyBpLS0pCisgICAgeworCisgICAgICAgIHZpZGVvLT5yZWxMYXllckNvZGVUaW1lW2ldIC09IDEwMDA7CisKKyAgICAgICAgLyogZmluZCB0aW1lSW5jcmVtZW50IHRvIGJlIHB1dCBpbiB0aGUgYml0c3RyZWFtICovCisgICAgICAgIHZvbFtpXS0+dGltZUluY3JlbWVudCA9IGZyYW1lVGljayAtIHZpZGVvLT5yZWZUaWNrW2ldOworCisgICAgICAgIGlmICh2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSA8PSAwKSAvKiB0aW1lIHRvIGVuY29kZSBiYXNlICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEyLzI3LzAwICovCisgICAgICAgICAgICBlbmNvZGVWb3AgPSAxOworICAgICAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9ICpuTGF5ZXIgPSBpOworICAgICAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gKz0KKyAgICAgICAgICAgICAgICAoSW50KSgoMTAwMC4wICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtudW1MYXllcnMtMV0pIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7CisKKyAgICAgICAgICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UgPSAwOworICAgICAgICAgICAgd2hpbGUgKHZvbFtpXS0+dGltZUluY3JlbWVudCA+PSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZvbFtpXS0+dGltZUluY3JlbWVudCAtPSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOworICAgICAgICAgICAgICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UrKzsKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgdXBkYXRlIHJlZlRpY2sgYW5kIG1vZFRpbWVSZWYgeWV0LCBkbyBpdCBhZnRlciBlbmNvZGluZyEhICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHRha2VzIGNhcmUgb2YgbW9yZSBkcm9wcGVkIGZyYW1lIHRoYW4gZXhwZWN0ZWQgKi8KKyAgICAgICAgICAgIGZyYW1lTnVtW2ldID0gKFVJbnQpKChmcmFtZU1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gKyA1MDApIC8gMTAwMDsKKyAgICAgICAgICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtpXSkKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldID0gZnJhbWVOdW1baV0gLSAxOworCisgICAgICAgICAgICBleHRyYV9za2lwID0gLTE7CisgICAgICAgICAgICBmcmFtZUluYyA9IChmcmFtZU51bVtpXSAtIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0pOworICAgICAgICAgICAgZXh0cmFfc2tpcCArPSBmcmFtZUluYzsKKworICAgICAgICAgICAgaWYgKGV4dHJhX3NraXAgPiAwKQorICAgICAgICAgICAgeyAgIC8qIHVwZGF0ZSByYy0+TnIsIHJjLT5CLCAocmMtPlJyKSovCisgICAgICAgICAgICAgICAgaWYgKGVuY1BhcmFtcy0+UkNfVHlwZSAhPSBDT05TVEFOVF9RKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUkNfVXBkYXRlQnVmZmVyKHZpZGVvLCBpLCBleHRyYV9za2lwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB1cGRhdGUgZnJhbWUgbm8uICovCisgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldID0gZnJhbWVOdW1baV07CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgIGlmIChlbmNvZGVWb3ApCisgICAgICAgIHByaW50ZigiIFRJOiAlZCAiLCB2b2xbKm5MYXllcl0tPnRpbWVJbmNyZW1lbnQpOworI2VuZGlmCisKKyAgICByZXR1cm4gZW5jb2RlVm9wOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERldGVybWluZVZvcFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDYvMDIvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUaGUgbmFtZSBzYXlzIGl0IGFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogdm9pZCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgRGV0ZXJtaW5lVm9wVHlwZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKQoreworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworLy8gIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKworICAgIGlmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID09IDApIC8qIEktVk9QcyBvbmx5ICovCisgICAgeworICAgICAgICBpZiAodmlkZW8tPmN1cnJMYXllciA+IDApCisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBQX1ZPUDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bnVtVm9wc0luR09QID49IDEzMikKKyAgICAgICAgICAgICAgICB2aWRlby0+bnVtVm9wc0luR09QID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID09IC0xKSAgLyogSVBQUFBQLi4uICovCisgICAgeworCisgICAgICAgIC8qIG1haW50YWluIGZyYW1lIHR5cGUgaWYgcHJldmlvdXMgZnJhbWUgaXMgcHJlLXNraXBwZWQsIDA2LzAyLzIwMDEgKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDT05TVEFOVF9RIHx8IHZpZGVvLT5yY1tjdXJyTGF5ZXJdLT5za2lwX25leHRfZnJhbWUgIT0gLTEpCisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBQX1ZPUDsKKworICAgICAgICBpZiAodmlkZW8tPmN1cnJMYXllciA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLyp2aWRlby0+bnVtVm9wc0luR09QPj0xMzIgfHwgKi92aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOyAvKiBmb3JjZSBJTlRSQSB1cGRhdGUgZXZlcnkgMTMyIGJhc2UgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5leHRFbmNJVm9wID09IDAgfHwgdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8qIEludHJhUGVyaW9kPjAgOiBJUFBQUFBJUFBQUFBJLi4uICovCisgICAgeworCisgICAgICAgIC8qIG1haW50YWluIGZyYW1lIHR5cGUgaWYgcHJldmlvdXMgZnJhbWUgaXMgcHJlLXNraXBwZWQsIDA2LzAyLzIwMDEgKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDT05TVEFOVF9RIHx8IHZpZGVvLT5yY1tjdXJyTGF5ZXJdLT5za2lwX25leHRfZnJhbWUgIT0gLTEpCisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBQX1ZPUDsKKworICAgICAgICBpZiAoY3VyckxheWVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bmV4dEVuY0lWb3AgPD0gMCB8fCB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gZW5jUGFyYW1zLT5JbnRyYVBlcmlvZDsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKKyAgICAgICAgICAgICAgICB2aWRlby0+bnVtVm9wc0luR09QID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogVXBkYXRlU2tpcE5leHRGcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNi8wMi8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEZyb20gcmF0ZSBjb250cm9sIGZyYW1lIHNraXBwaW5nIGRlY2lzaW9uLCB1cGRhdGUgdGltaW5nCisgICAgICAgICAgICAgICAgcmVsYXRlZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQ3VycmVudCBjb2RlZCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK0ludCBVcGRhdGVTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVMb25nICptb2RUaW1lLCBJbnQgKnNpemUsIFBWX1NUQVRVUyBzdGF0dXMpCit7CisgICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7CisgICAgSW50IG5MYXllciA9IGN1cnJMYXllcjsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgbnVtTGF5ZXJzID0gZW5jUGFyYW1zLT5uTGF5ZXJzOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKyAgICBWb2wgKip2b2wgPSB2aWRlby0+dm9sOworICAgIEludCBudW1fc2tpcCwgZXh0cmFfc2tpcDsKKyAgICBJbnQgaTsKKyAgICBVSW50IG5ld1JlZlRpY2ssIGRlbHRhTW9kVGltZTsKKyAgICBVSW50IHRlbXA7CisKKyAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCisgICAgeworICAgICAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbMF0gJiYgY3VyckxheWVyID09IDApICAvKiBhbHdheXMgZW5jb2RlIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICB7CisgICAgICAgICAgICBSQ19SZXNldFNraXBOZXh0RnJhbWUodmlkZW8sIGN1cnJMYXllcik7CisgICAgICAgICAgICAvL3JldHVybiBjdXJyTGF5ZXI7ICAwOS8xNS8wNQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFJDX0dldFNraXBOZXh0RnJhbWUodmlkZW8sIGN1cnJMYXllcikgPCAwIHx8IHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGKSAgIC8qIFNraXAgQ3VycmVudCBGcmFtZSAqLworICAgICAgICAgICAgeworCisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgICAgICAgICBwcmludGYoIlNraXAgY3VycmVudCBmcmFtZSIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgY3VyclZvbC0+bW9kdWxvVGltZUJhc2UgPSBjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2U7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIHByZXBhcmUgdG8gcmV0dXJuICovCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqc2l6ZSA9IDA7ICAvKiBTZXQgQml0c3RyZWFtIGJ1ZmZlciB0byB6ZXJvICovCisKKyAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgbkxheWVyIGFuZCBtb2RUaW1lIGZvciBuZXh0IGVuY29kZSAqLworCisgICAgICAgICAgICAgICAgKm1vZFRpbWUgPSB2aWRlby0+bmV4dE1vZFRpbWU7CisgICAgICAgICAgICAgICAgbkxheWVyID0gLTE7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbkxheWVyOyAvKiByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aG91dCB1cGRhdGluZyBSZWZUaWNrICYgbW9kVGltZVJlZiAqLworICAgICAgICAgICAgICAgIC8qIElmIEktVk9QIHdhcyBhdHRlbXB0ZWQsIHRoZW4gZW5zdXJlIG5leHQgYmFzZSBpcyBJLVZPUCAqLworICAgICAgICAgICAgICAgIC8qaWYoKGVuY1BhcmFtcy0+SW50cmFQZXJpb2Q+MCkgJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkpCisgICAgICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gMDsgY29tbWVudGVkIG91dCBieSAwNi8wNS8wMSAqLworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgobnVtX3NraXAgPSBSQ19HZXRTa2lwTmV4dEZyYW1lKHZpZGVvLCBjdXJyTGF5ZXIpKSA+IDApCisgICAgICAgICAgICB7CisKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgICAgICAgICAgICAgIHByaW50ZigiU2tpcCBuZXh0ICVkIGZyYW1lcyIsIG51bV9za2lwKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIHRvIGtlZXAgdGhlIE5yIG9mIGVuaCBsYXllciB0aGUgc2FtZSAqLworICAgICAgICAgICAgICAgIC8qIGFkanVzdCByZWxMYXllckNvZGVUaW1lIG9ubHksIGRvIG5vdCBhZGp1c3QgbGF5ZXJDb2RlVGltZVtudW1MYXllcnMtMV0gKi8KKyAgICAgICAgICAgICAgICBleHRyYV9za2lwID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VyckxheWVyOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gPD0gMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfc2tpcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJMYXllcjsgaSA8IG51bUxheWVyczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gKz0gKG51bV9za2lwICsgZXh0cmFfc2tpcCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEludCkoKDEwMDAuMCAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbbnVtTGF5ZXJzLTFdKSAvIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0vKiBmaXJzdCBmcmFtZSAqLworICAgIH0KKyAgICAvKioqKiogIGN1cnJlbnQgZnJhbWUgaXMgZW5jb2RlZCwgbm93IHVwZGF0ZSByZWZUaWNrICoqKioqKi8KKworICAgIHZpZGVvLT5yZWZUaWNrW2N1cnJMYXllcl0gKz0gdm9sW2N1cnJMYXllcl0tPnByZXZNb2R1bG9UaW1lQmFzZSAqIHZvbFtjdXJyTGF5ZXJdLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbjsKKworICAgIC8qIFJlc2V0IGxheWVyQ29kZVRpbWUgZXZlcnkgSS1WT1AgdG8gcHJldmVudCBvdmVyZmxvdyAqLworICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKKyAgICB7CisgICAgICAgIC8qICAxMi8xMi8wMiwgZml4IGZvciB3ZWlyZCB0YXJnZXIgZnJhbWUgcmF0ZSBvZiA5Ljk5IGZwcyBvciAzLjMzIGZwcyAqLworICAgICAgICBpZiAoKChlbmNQYXJhbXMtPkludHJhUGVyaW9kICE9IDApIC8qJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZT09SV9WT1ApKi8pIHx8CisgICAgICAgICAgICAgICAgKChlbmNQYXJhbXMtPkludHJhUGVyaW9kID09IDApICYmICh2aWRlby0+bnVtVm9wc0luR09QID09IDApKSkKKyAgICAgICAgeworICAgICAgICAgICAgbmV3UmVmVGljayA9IHZpZGVvLT5yZWZUaWNrWzBdOworCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtTGF5ZXJzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5yZWZUaWNrW2ldIDwgbmV3UmVmVGljaykKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVmVGljayA9IHZpZGVvLT5yZWZUaWNrW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdXBkYXRlIGlzIGludGVnZXIgbXVsdGlwbGUgb2YgZnJhbWUgbnVtYmVyICovCisgICAgICAgICAgICAvKiBob3cgbWFueSBtc2VjIGVsYXBzZWQgZnJvbSBsYXN0IG1vZFRpbWVSZWYgKi8KKyAgICAgICAgICAgIGRlbHRhTW9kVGltZSA9IChuZXdSZWZUaWNrIC8gdm9sWzBdLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbikgKiAxMDAwOworCisgICAgICAgICAgICBmb3IgKGkgPSBudW1MYXllcnMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKFVJbnQpKGRlbHRhTW9kVGltZSAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pOyAvKiAxMi8xMi8wMiAqLworICAgICAgICAgICAgICAgIGlmICh0ZW1wICUgMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgbmV3UmVmVGljayA9IDA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdSZWZUaWNrID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+bW9kVGltZVJlZiArPSBkZWx0YU1vZFRpbWU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gbnVtTGF5ZXJzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldIC09IChVSW50KShkZWx0YU1vZFRpbWUgKiBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5yZWZUaWNrW2ldIC09IG5ld1JlZlRpY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKm1vZFRpbWUgPSAgdmlkZW8tPm5leHRNb2RUaW1lOworCisgICAgcmV0dXJuIG5MYXllcjsKK30KKworCisjaWZuZGVmIE9SSUdJTkFMX1ZFUlNJT04KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBTZXRQcm9maWxlX0J1ZmZlclNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogU2V0IHByb2ZpbGUgYW5kIHZpZGVvIGJ1ZmZlciBzaXplLCBjb3BpZWQgZnJvbSBKaW0ncyBjb2RlICAgICovCisvKiAgICAgICAgICAgICBpbiBQVkluaXRWaWRlb0VuY29kZXIoLiksIHNpbmNlIHdlIGhhdmUgZGlmZmVyZW50IHBsYWNlcyAgICAgKi8KKy8qICAgICAgICAgICAgIHRvIHJlc2V0IHByb2ZpbGUgYW5kIHZpZGVvIGJ1ZmZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworQm9vbCBTZXRQcm9maWxlX0J1ZmZlclNpemUoVmlkZW9FbmNEYXRhICp2aWRlbywgZmxvYXQgZGVsYXksIEludCBiSW5pdGlhbGl6ZWQpCit7CisgICAgSW50IGksIGosIHN0YXJ0LCBlbmQ7CisvLyAgSW50IEJhc2VNQnNQZXJTZWMgPSAwLCBFbmhNQnNQZXJTZWMgPSAwOworICAgIEludCBuVG90YWxNQiA9IDA7CisgICAgSW50IGlkeCwgdGVtcF93LCB0ZW1wX2gsIG1heCA9IDAsIG1heF93aWR0aCwgbWF4X2hlaWdodDsKKworICAgIEludCBuTGF5ZXJzID0gdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgLyogTnVtYmVyIG9mIExheWVycyB0byBiZSBlbmNvZGVkICovCisKKyAgICBJbnQgdG90YWxfYml0cmF0ZSA9IDAsIGJhc2VfYml0cmF0ZTsKKyAgICBJbnQgdG90YWxfcGFja2V0X3NpemUgPSAwLCBiYXNlX3BhY2tldF9zaXplOworICAgIEludCB0b3RhbF9NQnNQZXJTZWMgPSAwLCBiYXNlX01Cc1BlclNlYzsKKyAgICBJbnQgdG90YWxfVkJWX3NpemUgPSAwLCBiYXNlX1ZCVl9zaXplLCBlbmhhbmNlX1ZCVl9zaXplID0gMDsKKyAgICBmbG9hdCB0b3RhbF9mcmFtZXJhdGUsIGJhc2VfZnJhbWVyYXRlOworICAgIGZsb2F0IHVwcGVyX2JvdW5kX3JhdGlvOworICAgIEludCBiRm91bmQgPSAwOworICAgIEludCBrID0gMCwgd2lkdGgxNiwgaGVpZ2h0MTYsIGluZGV4OworICAgIEludCBsb3dlc3RfbGV2ZWw7CisKKyNkZWZpbmUgTUlOX0JVRkYgICAgMTYwMDAgLyogMTZrIG1pbmltdW0gYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgQlVGRl9DT05TVCAgMi4wICAgIC8qIDIwMDBtcyAqLworI2RlZmluZSBVUFBFUl9CT1VORF9SQVRJTyA4LjU0IC8qIHVwcGVyX2JvdW5kID0gMS40KigxLjErYm91bmQvMTApKmJpdHJhdGUvZnJhbWVyYXRlICovCisKKyNkZWZpbmUgUUNJRl9XSURUSCAgMTc2CisjZGVmaW5lIFFDSUZfSEVJR0hUIDE0NAorCisgICAgaW5kZXggPSB2aWRlby0+ZW5jUGFyYW1zLT5wcm9maWxlX3RhYmxlX2luZGV4OworCisgICAgLyogQ2FsY3VsYXRlICJuVG90YWxNQiIgKi8KKyAgICAvKiBGaW5kIHRoZSBtYXhpbXVtIHdpZHRoKmhlaWdodCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhlIFZPUHMgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQorICAgIHsKKyAgICAgICAgdGVtcF93ID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpZHhdOworICAgICAgICB0ZW1wX2ggPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckhlaWdodFtpZHhdOworCisgICAgICAgIGlmICgodGVtcF93KnRlbXBfaCkgPiBtYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heCA9IHRlbXBfdyAqIHRlbXBfaDsKKyAgICAgICAgICAgIG1heF93aWR0aCA9IHRlbXBfdzsKKyAgICAgICAgICAgIG1heF9oZWlnaHQgPSB0ZW1wX2g7CisgICAgICAgICAgICBuVG90YWxNQiA9ICgobWF4X3dpZHRoICsgMTUpID4+IDQpICogKChtYXhfaGVpZ2h0ICsgMTUpID4+IDQpOworICAgICAgICB9CisgICAgfQorICAgIHVwcGVyX2JvdW5kX3JhdGlvID0gKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZID8gKGZsb2F0KTUuMCA6IChmbG9hdClVUFBFUl9CT1VORF9SQVRJTyk7CisKKworICAgIC8qIEdldCB0aGUgYmFzaWMgaW5mb3JtYXRpb246IGJpdHJhdGUsIHBhY2tldF9zaXplLCBNQnMvcyBhbmQgVkJWX3NpemUgKi8KKyAgICBiYXNlX2JpdHJhdGUgICAgICAgID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzBdOworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gIT0gMCkgLyogdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID09IDAgbWVhbnMgaXQgaGFzIG5vdCBiZWVuIHNldCAqLworICAgIHsKKyAgICAgICAgYmFzZV9iaXRyYXRlICAgID0gUFZfTUFYKGJhc2VfYml0cmF0ZSwgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdKTsKKyAgICB9CisgICAgZWxzZSAvKiBpZiB0aGUgbWF4IGlzIG5vdCBzZXQsIHNldCBpdCB0byB0aGUgc3BlY2lmaWVkIHByb2ZpbGUvbGV2ZWwgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaW5kZXhdOworICAgIH0KKworICAgIGJhc2VfZnJhbWVyYXRlICAgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXTsKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gIT0gMCkKKyAgICB7CisgICAgICAgIGJhc2VfZnJhbWVyYXRlICA9IFBWX01BWChiYXNlX2ZyYW1lcmF0ZSwgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0pOworICAgIH0KKyAgICBlbHNlIC8qIGlmIHRoZSBtYXggaXMgbm90IHNldCwgc2V0IGl0IHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2luZGV4XSAvIG5Ub3RhbE1COworICAgIH0KKworICAgIGJhc2VfcGFja2V0X3NpemUgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplOworICAgIGJhc2VfTUJzUGVyU2VjICAgICAgPSAoSW50KShiYXNlX2ZyYW1lcmF0ZSAqIG5Ub3RhbE1CKTsKKyAgICBiYXNlX1ZCVl9zaXplICAgICAgID0gUFZfTUFYKChJbnQpKGJhc2VfYml0cmF0ZSAqIGRlbGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnQpKHVwcGVyX2JvdW5kX3JhdGlvICogYmFzZV9iaXRyYXRlIC8gYmFzZV9mcmFtZXJhdGUpKTsKKyAgICBiYXNlX1ZCVl9zaXplICAgICAgID0gUFZfTUFYKGJhc2VfVkJWX3NpemUsIE1JTl9CVUZGKTsKKworICAgIC8qIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBidWZmZXIgc2l6ZSwgd2UnbGwgY2xpcCBpdCAqLworICAgIGlmIChiYXNlX1ZCVl9zaXplID4gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbNV0pCisgICAgICAgIGJhc2VfVkJWX3NpemUgPSBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs1XTsKKworCisgICAgLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBleGNlZWRzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGdpdmVuIHRoZSBtYXhpbXVtIHByb2ZpbGUgYW5kIGxldmVsICovCisgICAgaWYgKG5MYXllcnMgPT0gMSAmJiBiYXNlX1ZCVl9zaXplID4gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKworICAgIGlmIChuTGF5ZXJzID09IDIpCisgICAgeworICAgICAgICB0b3RhbF9iaXRyYXRlICAgICAgID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzFdOworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvdGFsX2JpdHJhdGUgICA9IFBWX01JTih0b3RhbF9iaXRyYXRlLCB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogaWYgdGhlIG1heCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSA9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxfZnJhbWVyYXRlICAgICA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzFdOworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxfZnJhbWVyYXRlICAgICA9IFBWX01JTih0b3RhbF9mcmFtZXJhdGUsIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIGlmIHRoZSBtYXggaXMgbm90IHNldCwgc2V0IGl0IHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9IChmbG9hdClzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdIC8gblRvdGFsTUI7CisgICAgICAgIH0KKworICAgICAgICB0b3RhbF9wYWNrZXRfc2l6ZSAgID0gdmlkZW8tPmVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZTsKKyAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA9IChJbnQpKHRvdGFsX2ZyYW1lcmF0ZSAqIG5Ub3RhbE1CKTsKKworICAgICAgICBlbmhhbmNlX1ZCVl9zaXplICAgID0gUFZfTUFYKChJbnQpKCh0b3RhbF9iaXRyYXRlIC0gYmFzZV9iaXRyYXRlKSAqIGRlbGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50KSh1cHBlcl9ib3VuZF9yYXRpbyAqICh0b3RhbF9iaXRyYXRlIC0gYmFzZV9iaXRyYXRlKSAvICh0b3RhbF9mcmFtZXJhdGUgLSBiYXNlX2ZyYW1lcmF0ZSkpKTsKKyAgICAgICAgZW5oYW5jZV9WQlZfc2l6ZSAgICA9IFBWX01BWChlbmhhbmNlX1ZCVl9zaXplLCBNSU5fQlVGRik7CisKKyAgICAgICAgdG90YWxfVkJWX3NpemUgICAgICA9IGJhc2VfVkJWX3NpemUgKyBlbmhhbmNlX1ZCVl9zaXplOworCisgICAgICAgIC8qIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBidWZmZXIgc2l6ZSwgd2UnbGwgY2xpcCBpdCAqLworICAgICAgICBpZiAodG90YWxfVkJWX3NpemUgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs2XSkKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxfVkJWX3NpemUgPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs2XTsKKyAgICAgICAgICAgIGVuaGFuY2VfVkJWX3NpemUgPSB0b3RhbF9WQlZfc2l6ZSAtIGJhc2VfVkJWX3NpemU7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgZ2l2ZW4gdGhlIG1heGltdW0gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKyAgICAgICAgaWYgKHRvdGFsX1ZCVl9zaXplID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisgICAgaWYgKCFiSW5pdGlhbGl6ZWQpIC8qIEhhcyBiZWVuIGluaXRpYWxpemVkIC0tPiBwcm9maWxlIEAgbGV2ZWwgaGFzIGJlZW4gZmlndXJlZCBvdXQhICovCisgICAgeworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdID0gYmFzZV9WQlZfc2l6ZTsKKyAgICAgICAgaWYgKG5MYXllcnMgPiAxKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXSA9IGVuaGFuY2VfVkJWX3NpemU7CisKKyAgICAgICAgcmV0dXJuIFBWX1RSVUU7CisgICAgfQorCisKKyAgICAvKiBQcm9maWxlIEAgbGV2ZWwgZGV0ZXJtaW5hdGlvbiAqLworICAgIGlmIChuTGF5ZXJzID09IDEpCisgICAgeworICAgICAgICAvKiBCQVNFIE9OTFkgOiBTaW1wbGUgUHJvZmlsZShTUCkgT3IgQ29yZSBQcm9maWxlKENQKSAqLworICAgICAgICBpZiAoYmFzZV9iaXRyYXRlICAgICA+IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaW5kZXhdICAgICB8fAorICAgICAgICAgICAgICAgIGJhc2VfcGFja2V0X3NpemUgPiBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtpbmRleF0gfHwKKyAgICAgICAgICAgICAgICBiYXNlX01Cc1BlclNlYyAgID4gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2luZGV4XSAgIHx8CisgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSAgICA+IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2luZGV4XSkKKworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOyAvKiBCZXlvbmQgdGhlIGJvdW5kIG9mIENvcmUgUHJvZmlsZSBAIExldmVsMiAqLworCisgICAgICAgIC8qIEZvciBIMjYzL1Nob3J0IGhlYWRlciwgZGV0ZXJtaW5lIGsqMTYzODQgKi8KKyAgICAgICAgd2lkdGgxNiAgPSAoKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbMF0gKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgaGVpZ2h0MTYgPSAoKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0WzBdICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGsgPSA0OworICAgICAgICAgICAgaWYgKHdpZHRoMTYgID09IDIqUUNJRl9XSURUSCAmJiBoZWlnaHQxNiA9PSAyKlFDSUZfSEVJR0hUKSAgLyogQ0lGICovCisgICAgICAgICAgICAgICAgayA9IDE2OworCisgICAgICAgICAgICBlbHNlIGlmICh3aWR0aDE2ICA9PSA0KlFDSUZfV0lEVEggJiYgaGVpZ2h0MTYgPT0gNCpRQ0lGX0hFSUdIVCkgIC8qIDRDSUYgKi8KKyAgICAgICAgICAgICAgICBrID0gMzI7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoMTYgID09IDgqUUNJRl9XSURUSCAmJiBoZWlnaHQxNiA9PSA4KlFDSUZfSEVJR0hUKSAgLyogMTZDSUYgKi8KKyAgICAgICAgICAgICAgICBrID0gNjQ7CisKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPm1heEZyYW1lU2l6ZSAgPSBrICogMTYzODQ7CisKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIHNpemUgaXMgbGltaXRlZCB0byB0aGUgdG9wIHByb2ZpbGUgYW5kIGxldmVsOiB0aGUgQ29yZSBwcm9maWxlIGFuZCBsZXZlbCAyICovCisgICAgICAgICAgICBpZiAoYmFzZV9WQlZfc2l6ZSA+IChJbnQpKGsqMTYzODQgKyA0KihmbG9hdClwcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzVdKjEwMDEuMCAvIDMwMDAwLjApKQorICAgICAgICAgICAgICAgIGJhc2VfVkJWX3NpemUgPSAoSW50KShrICogMTYzODQgKyA0ICogKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbNV0gKiAxMDAxLjAgLyAzMDAwMC4wKTsKKworICAgICAgICAgICAgaWYgKGJhc2VfVkJWX3NpemUgPiAoSW50KShrKjE2Mzg0ICsgNCooZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF0qMTAwMS4wIC8gMzAwMDAuMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogU2VhcmNoIHRoZSBhcHByb3ByaWF0ZSBwcm9maWxlQGxldmVsIGluZGV4ICovCisgICAgICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkICYmCisgICAgICAgICAgICAgICAgKHZpZGVvLT5lbmNQYXJhbXMtPkludHJhRENWbGNUaHIgIT0gMCB8fCB2aWRlby0+ZW5jUGFyYW1zLT5TZWFyY2hSYW5nZSA+IDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgbG93ZXN0X2xldmVsID0gMTsgLyogY2Fubm90IGFsbG93IFNQTDAgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvd2VzdF9sZXZlbCA9IDA7IC8qIFNQTDAgKi8KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IGxvd2VzdF9sZXZlbDsgaSA8PSBpbmRleDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSAhPSA0ICYmIC8qIHNraXAgQ29yZSBQcm9maWxlQExldmVsMSBiZWNhdXNlIHRoZSBwYXJhbWV0ZXJzIGluIGl0IGFyZSBzbWFsbGVyIHRoYW4gdGhvc2UgaW4gU2ltcGxlIFByb2ZpbGVATGV2ZWwzICovCisgICAgICAgICAgICAgICAgICAgIGJhc2VfYml0cmF0ZSAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXSAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9wYWNrZXRfc2l6ZSA8PSBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtpXSAmJgorICAgICAgICAgICAgICAgICAgICBiYXNlX01Cc1BlclNlYyAgIDw9IHByb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAgICYmCisgICAgICAgICAgICAgICAgICAgIGJhc2VfVkJWX3NpemUgICAgPD0gKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCA/IChJbnQpKGsqMTYzODQgKyA0KihmbG9hdClwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldKjEwMDEuMCAvIDMwMDAwLjApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaV0pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID4gaW5kZXgpIHJldHVybiBQVl9GQUxTRTsgLyogTm90aGluZyBmb3VuZCEhICovCisKKyAgICAgICAgLyogRm91bmQgb3V0IHRoZSBhY3R1YWwgcHJvZmlsZSBAIGxldmVsIDogaW5kZXggImkiICovCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEZvciBTaW1wbGUgUHJvZmlsZSBAIExldmVsIDAsIHdlIG5lZWQgdG8gZG8gb25lIG1vcmUgY2hlY2s6IGltYWdlIHNpemUgPD0gUUNJRiAqLworICAgICAgICAgICAgaWYgKHdpZHRoMTYgPiBRQ0lGX1dJRFRIIHx8IGhlaWdodDE2ID4gUUNJRl9IRUlHSFQpCisgICAgICAgICAgICAgICAgaSA9IDE7IC8qIGltYWdlIHNpemUgPiBRQ0lGLCB0aGVuIHNldCBTUCBsZXZlbDEgKi8KKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9IHByb2ZpbGVfbGV2ZWxfY29kZVtpXTsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSAgID0gYmFzZV9WQlZfc2l6ZTsKKworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPSBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSBQVl9NSU4oMzAsIChmbG9hdClwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaV0gLyBuVG90YWxNQik7CisKKyAgICAgICAgLyogRm9yIEgyNjMvU2hvcnQgaGVhZGVyLCBvbmUgc3BlY2lhbCBjb25zdHJhaW50IGZvciBWQlYgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gPSAoSW50KShrICogMTYzODQgKyA0ICogKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV0gKiAxMDAxLjAgLyAzMDAwMC4wKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTQ0FMQUJBTEUgTU9ERTogU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUoU1NQKSBPciBDb3JlIFNjYWxhYmxlIFByb2ZpbGUoQ1NQKSAqLworCisgICAgICAgIGlmICh0b3RhbF9iaXRyYXRlICAgICAgID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF0gICAgIHx8CisgICAgICAgICAgICAgICAgdG90YWxfcGFja2V0X3NpemUgICA+IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW2luZGV4XSB8fAorICAgICAgICAgICAgICAgIHRvdGFsX01Cc1BlclNlYyAgICAgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdICAgfHwKKyAgICAgICAgICAgICAgICB0b3RhbF9WQlZfc2l6ZSAgICAgID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQorCisgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7IC8qIEJleW9uZCBnaXZlbiBwcm9maWxlIGFuZCBsZXZlbCAqLworCisgICAgICAgIC8qIE9uZS10aW1lIGNoZWNrOiBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZSBvciBDb3JlIFNjYWxhYmxlIFByb2ZpbGUgKi8KKyAgICAgICAgaWYgKHRvdGFsX2JpdHJhdGUgICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVsyXSAgICAgICAgJiYKKyAgICAgICAgICAgICAgICB0b3RhbF9wYWNrZXRfc2l6ZSAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplWzJdICAgICYmCisgICAgICAgICAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbMl0gICAgICAmJgorICAgICAgICAgICAgICAgIHRvdGFsX1ZCVl9zaXplICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbMl0pCisKKyAgICAgICAgeworICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgZW5kID0gaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gNDsKKyAgICAgICAgICAgIGVuZCA9IGluZGV4OworICAgICAgICB9CisKKworICAgICAgICAvKiBTZWFyY2ggdGhlIHNjYWxhYmxlIHByb2ZpbGUgKi8KKyAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0b3RhbF9iaXRyYXRlICAgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV0gICAgICYmCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX3BhY2tldF9zaXplICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaV0gICAmJgorICAgICAgICAgICAgICAgICAgICB0b3RhbF9WQlZfc2l6ZSAgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2ldKQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPiBlbmQpIHJldHVybiBQVl9GQUxTRTsKKworICAgICAgICAvKiBTZWFyY2ggdGhlIGJhc2UgcHJvZmlsZSAqLworICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIGJGb3VuZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAgICAgYkZvdW5kID0gMDsKKworICAgICAgICBmb3IgKGogPSBzdGFydDsgIWJGb3VuZCAmJiBqIDw9IGk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhc2VfYml0cmF0ZSAgICAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtqXSAgICAgICYmCisgICAgICAgICAgICAgICAgICAgIGJhc2VfcGFja2V0X3NpemUgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbal0gICYmCisgICAgICAgICAgICAgICAgICAgIGJhc2VfTUJzUGVyU2VjICAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2pdICAgICYmCisgICAgICAgICAgICAgICAgICAgIGJhc2VfVkJWX3NpemUgICAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbal0pCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiRm91bmQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiRm91bmQpIC8vICYmIHN0YXJ0ID09IDQpCisgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7IC8qIG1pcy1tYXRjaCBpbiB0aGUgcHJvZmlsZXMgYmV0d2VlbiBiYXNlIGxheWVyIGFuZCBlbmhhbmNlbWVudCBsYXllciAqLworCisgICAgICAgIC8qIGogZm9yIGJhc2UgbGF5ZXIsIGkgZm9yIGVuaGFuY2VtZW50IGxheWVyICovCisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9IHByb2ZpbGVfbGV2ZWxfY29kZVtqXTsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzFdID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9jb2RlW2ldOworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdICAgPSBiYXNlX1ZCVl9zaXplOworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdICAgPSBlbmhhbmNlX1ZCVl9zaXplOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbal07CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXTsKKworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzBdID0gUFZfTUlOKDMwLCAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2pdIC8gblRvdGFsTUIpOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0gPSBQVl9NSU4oMzAsIChmbG9hdClzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaV0gLyBuVG90YWxNQik7CisKKworICAgIH0gLyogZW5kIG9mOiBpZihuTGF5ZXJzID09IDEpICovCisKKworICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkICYmICh2aWRlby0+ZW5jUGFyYW1zLT5Qcm9maWxlTGV2ZWxbMF0gPT0gMHgwOCkpIC8qIFNQTDAgcmVzdHJpY3Rpb24qLworICAgIHsKKyAgICAgICAgLyogUFYgb25seSBhbGxvdyBmcmFtZS1iYXNlZCByYXRlIGNvbnRyb2wsIG5vIFFQIGNoYW5nZSBmcm9tIG9uZSBNQiB0byBhbm90aGVyCisgICAgICAgIGlmKHZpZGVvLT5lbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uID09IFRSVUUgJiYgTUItYmFzZWQgcmF0ZSBjb250cm9sKQorICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFICovCisgICAgfQorCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKyNlbmRpZiAvKiAjaWZuZGVmIE9SSUdJTkFMX1ZFUlNJT04gKi8KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19saWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19saWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkzNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oCkBAIC0wLDAgKzEsMjA3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfTVA0RU5DX0xJQl9IXworI2RlZmluZSBfTVA0RU5DX0xJQl9IXworCisjaW5jbHVkZSAibXA0ZGVmLmgiICAgICAvLyB0eXBlZGVmCisjaW5jbHVkZSAibXA0bGliX2ludC5oIiAvLyBtYWluIHZpZGVvIHN0cnVjdHVyZQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgLyogZGVmaW5lZCBpbiB2b3AuYyAqLworICAgIFBWX1NUQVRVUyBFbmNvZGVWb3AoVmlkZW9FbmNEYXRhICp2aWRlbyk7CisgICAgUFZfU1RBVFVTIEVuY29kZVNsaWNlKFZpZGVvRW5jRGF0YSAqdmlkZW8pOworICAgIFBWX1NUQVRVUyBFbmNvZGVWaWRlb1BhY2tldEhlYWRlcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBpbnQgTUJfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbnRfc2NhbGUsIEludCBpbnNlcnQpOworI2lmZGVmIEFMTE9XX1ZPUF9OT1RfQ09ERUQKKyAgICBQVl9TVEFUVVMgRW5jb2RlVm9wTm90Q29kZWQoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmJzdHJlYW0sIEludCAqc2l6ZSwgVUxvbmcgbW9kVGltZSk7CisjZW5kaWYKKworICAgIC8qIGRlZmluZWQgaW4gY29tYmluZWRfZGVjb2RlLmMgKi8KKyAgICBQVl9TVEFUVVMgRW5jb2RlRnJhbWVDb21iaW5lZE1vZGUoVmlkZW9FbmNEYXRhICp2aWRlbyk7CisgICAgUFZfU1RBVFVTIEVuY29kZVNsaWNlQ29tYmluZWRNb2RlKFZpZGVvRW5jRGF0YSAqdmlkZW8pOworCisgICAgLyogZGVmaW5lZCBpbiBkYXRhcGFydF9kZWNvZGUuYyAqLworICAgIFBWX1NUQVRVUyBFbmNvZGVGcmFtZURhdGFQYXJ0TW9kZShWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKyAgICBQVl9TVEFUVVMgRW5jb2RlU2xpY2VEYXRhUGFydE1vZGUoVmlkZW9FbmNEYXRhICp2aWRlbyk7CisKKyAgICAvKiBkZWZpbmVkIGluIGZhc3Rjb2RlTUIuYyAqLworCisvL3ZvaWQgbTR2X21lbXNldCh2b2lkICphZHJfZHN0LCB1aW50OCB2YWx1ZSwgdWludDMyIHNpemUpOworCisgICAgUFZfU1RBVFVTIENvZGVNQl9IMjYzKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGFwcHJveERDVCAqZnVuY3Rpb24sIEludCBvZmZzZXRRUCwgSW50IG5jb2VmYmxja1tdKTsKKyNpZm5kZWYgTk9fTVBFR19RVUFOVAorICAgIFBWX1NUQVRVUyBDb2RlTUJfTVBFRyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBhcHByb3hEQ1QgKmZ1bmN0aW9uLCBJbnQgb2Zmc2V0UVAsIEludCBuY29lZmJsY2tbXSk7CisjZW5kaWYKKyAgICBJbnQgZ2V0QmxvY2tTQVYoU2hvcnQgYmxvY2tbXSk7CisgICAgSW50IFNhZDh4OChVQ2hhciAqcmVjLCBVQ2hhciAqcHJldiwgSW50IGx4KTsKKyAgICBJbnQgZ2V0QmxvY2tTdW0oVUNoYXIgKnJlYywgSW50IGx4KTsKKworICAgIC8qIGRlZmluZWQgaW4gZGN0LmMgKi8KKyAgICB2b2lkICBibG9ja0lkY3QoU2hvcnQgKmJsb2NrKTsKKyAgICB2b2lkIGJsb2NrSWRjdF9TU0UoU2hvcnQgKmlucHV0KTsKKyAgICB2b2lkIEJsb2NrRENURW5jKFNob3J0ICpibG9ja0RhdGEsIFNob3J0ICpibG9ja0NvZWZmKTsKKworICAgIC8qLS0tLSBGYXN0UXVhbnQuYyAtLS0tLSovCisgICAgSW50IGNhbF9kY19zY2FsZXJFTkMoSW50IFFQLCBJbnQgdHlwZSkgOworICAgIEludCBCbG9ja1F1YW50RGVxdWFudEgyNjNJbnRlcihTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCBkY3RNb2RlLCBJbnQgY29tcCwgSW50IGR1bW15LCBVQ2hhciBzaG9ydEhlYWRlcik7CisKKyAgICBJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzSW50cmEoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgc3RydWN0IFFQc3RydWN0ICpRdWFudFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgSW50IGNvbXAsIEludCBkY19zY2FsZXIsIFVDaGFyIHNob3J0SGVhZGVyKTsKKworICAgIEludCBCbG9ja1F1YW50RGVxdWFudEgyNjNEQ0ludGVyKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIHN0cnVjdCBRUHN0cnVjdCAqUXVhbnRQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGR1bW15LCBVQ2hhciBzaG9ydEhlYWRlcik7CisKKyAgICBJbnQgQmxvY2tRdWFudERlcXVhbnRIMjYzRENJbnRyYShTaG9ydCAqcmNvZWZmLCBTaG9ydCAqcWNvZWZmLCBzdHJ1Y3QgUVBzdHJ1Y3QgKlF1YW50UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkY19zY2FsZXIsIFVDaGFyIHNob3J0SGVhZGVyKTsKKworI2lmbmRlZiBOT19NUEVHX1FVQU5UCisgICAgSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0ludGVyKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgRGN0TW9kZSwgSW50IGNvbXAsIEludCBkY19zY2FsZXIpOworCisgICAgSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBiaXRtYXBjb2xbIF0sIFVDaGFyICpiaXRtYXByb3csIFVJbnQgKmJpdG1hcHp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgRGN0TW9kZSwgSW50IGNvbXAsIEludCBkY19zY2FsZXIpOworCisgICAgSW50IEJsb2NrUXVhbnREZXF1YW50TVBFR0RDSW50ZXIoU2hvcnQgKnJjb2VmZiwgU2hvcnQgKnFjb2VmZiwgSW50IFFQLCBJbnQgKnFtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgYml0bWFwY29sWyBdLCBVQ2hhciAqYml0bWFwcm93LCBVSW50ICpiaXRtYXB6eiwgSW50IGR1bW15KTsKKworICAgIEludCBCbG9ja1F1YW50RGVxdWFudE1QRUdEQ0ludHJhKFNob3J0ICpyY29lZmYsIFNob3J0ICpxY29lZmYsIEludCBRUCwgSW50ICpxbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyIGJpdG1hcGNvbFsgXSwgVUNoYXIgKmJpdG1hcHJvdywgVUludCAqYml0bWFwenosIEludCBkY19zY2FsZXIpOworI2VuZGlmCisKKyAgICAvKi0tLS0gRmFzdElEQ1QuYyAtLS0tLSovCisgICAgdm9pZCBCbG9ja0lEQ1RNb3Rpb25Db21wKFNob3J0ICpibG9jaywgVUNoYXIgKmJpdG1hcGNvbCwgVUNoYXIgYml0bWFwcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgZGN0TW9kZSwgVUNoYXIgKnJlYywgVUNoYXIgKnByZXYsIEludCBseF9pbnRyYV96ZXJvTVYpOworCisKKyAgICAvKiBkZWZpbmVkIGluIG1vdGlvbl9jb21wLmMgKi8KKyAgICB2b2lkIGdldE1vdGlvbkNvbXBlbnNhdGVkTUIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGluZF94LCBJbnQgaW5kX3ksIEludCBvZmZzZXQpOworICAgIHZvaWQgRW5jUHJlZGljdGlvbl9JTlRFUihJbnQgeHByZWQsIEludCB5cHJlZCwgVUNoYXIgKmNfcHJldiwgVUNoYXIgKmNfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQgd2lkdGgsIEludCByb3VuZDEpOworCisgICAgdm9pZCBFbmNQcmVkaWN0aW9uX0lOVEVSNFYoSW50IHhwcmVkLCBJbnQgeXByZWQsIE1PVCAqbW90LCBVQ2hhciAqY19wcmV2LCBVQ2hhciAqY19yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50IHdpZHRoLCBJbnQgcm91bmQxKTsKKworICAgIHZvaWQgRW5jUHJlZGljdGlvbl9DaHJvbShJbnQgeHByZWQsIEludCB5cHJlZCwgVUNoYXIgKmN1X3ByZXYsIFVDaGFyICpjdl9wcmV2LCBVQ2hhciAqY3VfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAqY3ZfcmVjLCBJbnQgcGl0Y2hfdXYsIEludCB3aWR0aF91diwgSW50IGhlaWdodF91diwgSW50IHJvdW5kMSk7CisKKyAgICB2b2lkIGdldF9NQihVQ2hhciAqY19wcmV2LCBVQ2hhciAqY19wcmV2X3UgICwgVUNoYXIgKmNfcHJldl92LAorICAgICAgICAgICAgICAgIFNob3J0IG1iWzZdWzY0XSwgSW50IHdpZHRoLCBJbnQgd2lkdGhfdXYpOworCisgICAgdm9pZCBQdXRTa2lwcGVkQmxvY2soVUNoYXIgKnJlYywgVUNoYXIgKnByZXYsIEludCBseCk7CisKKyAgICAvKiBkZWZpbmVkIGluIG1vdGlvbl9lc3QuYyAqLworICAgIHZvaWQgTW90aW9uRXN0aW1hdGlvbihWaWRlb0VuY0RhdGEgKnZpZGVvKTsKKyNpZmRlZiBIVEZNCisgICAgdm9pZCBJbml0SFRGTShWaWRlb0VuY0RhdGEgKnZpZGVvLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgZG91YmxlICpuZXd2YXIsIEludCAqY29sbGVjdCk7CisgICAgdm9pZCBVcGRhdGVIVEZNKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGRvdWJsZSAqbmV3dmFyLCBkb3VibGUgKmV4cF9sYW1kYSwgSFRGTV9TdGF0ICpodGZtX3N0YXQpOworI2VuZGlmCisKKyAgICAvKiBkZWZpbmVkIGluIE1FX3V0aWxzLmMgKi8KKyAgICB2b2lkIENob29zZU1vZGVfQyhVQ2hhciAqTW9kZSwgVUNoYXIgKmN1ciwgSW50IGx4LCBJbnQgbWluX1NBRCk7CisgICAgdm9pZCBDaG9vc2VNb2RlX01NWChVQ2hhciAqTW9kZSwgVUNoYXIgKmN1ciwgSW50IGx4LCBJbnQgbWluX1NBRCk7CisgICAgdm9pZCBHZXRIYWxmUGVsTUJSZWdpb25fQyhVQ2hhciAqY2FuZCwgVUNoYXIgKmhtZW0sIEludCBseCk7CisgICAgdm9pZCBHZXRIYWxmUGVsTUJSZWdpb25fU1NFKFVDaGFyICpjYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4KTsKKyAgICB2b2lkIEdldEhhbGZQZWxCbGtSZWdpb24oVUNoYXIgKmNhbmQsIFVDaGFyICpobWVtLCBJbnQgbHgpOworICAgIHZvaWQgUGFkZGluZ0VkZ2UoVm9wICpwYWRWb3ApOworICAgIHZvaWQgQ29tcHV0ZU1CU3VtX0MoVUNoYXIgKmN1ciwgSW50IGx4LCBNT1QgKm1vdF9tYik7CisgICAgdm9pZCBDb21wdXRlTUJTdW1fTU1YKFVDaGFyICpjdXIsIEludCBseCwgTU9UICptb3RfbWIpOworICAgIHZvaWQgQ29tcHV0ZU1CU3VtX1NTRShVQ2hhciAqY3VyLCBJbnQgbHgsIE1PVCAqbW90X21iKTsKKyAgICB2b2lkIEdldEhhbGZQZWxNQlJlZ2lvblBhZGRpbmcoVUNoYXIgKm5jYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4LCBJbnQgKnJlcHRsKTsKKyAgICB2b2lkIEdldEhhbGZQZWxCbGtSZWdpb25QYWRkaW5nKFVDaGFyICpuY2FuZCwgVUNoYXIgKmhtZW0sIEludCBseCwgSW50ICpyZXB0bCk7CisKKyAgICAvKiBkZWZpbmVkIGluIGZpbmRoYWxmcGVsLmMgKi8KKyAgICB2b2lkIEZpbmRIYWxmUGVsTUIoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmN1ciwgTU9UICptb3QsIFVDaGFyICpuY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50IHhwb3MsIEludCB5cG9zLCBJbnQgKnhobWluLCBJbnQgKnlobWluLCBJbnQgaHBfZ3Vlc3MpOworICAgIEludCAgRmluZEhhbGZQZWxCbGsoVmlkZW9FbmNEYXRhICp2aWRlbywgVUNoYXIgKmN1ciwgTU9UICptb3QsIEludCBzYWQxNiwgVUNoYXIgKm5jYW5kOFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgVUNoYXIgKm1vZGUsIEludCB4cG9zLCBJbnQgeXBvcywgSW50ICp4aG1pbiwgSW50ICp5aG1pbiwgVUNoYXIgKmhwX21lbSk7CisKKworICAgIC8qIGRlZmluZWQgaW4gc2FkLmMgKi8KKyAgICBJbnQgU0FEX01CX0hhbGZQZWxfQ3hoeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSGFsZlBlbF9DeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSGFsZlBlbF9DeGgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSGFsZlBlbF9NTVgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSGFsZlBlbF9TU0UoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfQmxrX0hhbGZQZWxfQyhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCBJbnQgcngsIEludCB4aCwgSW50IHloLCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX0Jsa19IYWxmUGVsX01NWChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX0Jsa19IYWxmUGVsX1NTRShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01hY3JvYmxvY2tfQyhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NYWNyb2Jsb2NrX01NWChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NYWNyb2Jsb2NrX1NTRShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9CbG9ja19DKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfQmxvY2tfTU1YKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfQmxvY2tfU1NFKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworCisjaWZkZWYgSFRGTSAvKiBIeXBvdGhlc2lzIFRlc3RpbmcgRmFzdCBNYXRjaGluZyAqLworICAgIEludCBTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl94LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01CX0hQX0hURk1fQ29sbGVjdHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3gsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5feCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IUF9IVEZNeGh5aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IUF9IVEZNeWgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfSFBfSFRGTXhoKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQgU0FEX01CX0hURk1fQ29sbGVjdChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9IVEZNKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyNlbmRpZgorICAgIC8qIG9uLXRoZS1mbHkgcGFkZGluZyAqLworICAgIEludCBTQURfQmxrX1BBRERJTkcoVUNoYXIgKnJlZiwgVUNoYXIgKmN1ciwgSW50IGRtaW4sIEludCBseCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50IFNBRF9NQl9QQURESU5HKFVDaGFyICpyZWYsIFVDaGFyICpjdXIsIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworI2lmZGVmIEhURk0KKyAgICBJbnQgU0FEX01CX1BBRERJTkdfSFRGTV9Db2xsZWN0KFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCBTQURfTUJfUEFERElOR19IVEZNKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgsIHZvaWQgKmV4dHJhX2luZm8pOworI2VuZGlmCisKKyAgICAvKiBkZWZpbmVkIGluIHJhdGVfY29udHJvbC5jICovCisgICAgLyogVGhlc2UgYXJlIEFQSXMgdG8gcmF0ZSBjb250cm9sIGV4cG9zZWQgdG8gY29yZSBlbmNvZGVyIG1vZHVsZS4gKi8KKyAgICBQVl9TVEFUVVMgUkNfSW5pdGlhbGl6ZSh2b2lkICp2aWRlbyk7CisgICAgUFZfU1RBVFVTIFJDX1ZvcFFQU2V0dGluZyhWaWRlb0VuY0RhdGEgKnZpZGVvLCByYXRlQ29udHJvbCAqcmNbXSk7CisgICAgUFZfU1RBVFVTIFJDX1ZvcFVwZGF0ZVN0YXQoVmlkZW9FbmNEYXRhICp2aWRlbywgcmF0ZUNvbnRyb2wgKnJjKTsKKyAgICBQVl9TVEFUVVMgUkNfTUJRUFNldHRpbmcoVmlkZW9FbmNEYXRhICp2aWRlbywgcmF0ZUNvbnRyb2wgKnJjLCBJbnQgc3RhcnRfcGFja2V0X2hlYWRlcik7CisgICAgUFZfU1RBVFVTIFJDX01CVXBkYXRlU3RhdChWaWRlb0VuY0RhdGEgKnZpZGVvLCByYXRlQ29udHJvbCAqcmMsIEludCBCaSwgSW50IEhpKTsKKyAgICBQVl9TVEFUVVMgUkNfQ2xlYW51cChyYXRlQ29udHJvbCAqcmNbXSwgSW50IG51bUxheWVycyk7CisKKyAgICBJbnQgICAgICAgUkNfR2V0U2tpcE5leHRGcmFtZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKTsKKyAgICBJbnQgICAgICAgUkNfR2V0UmVtYWluaW5nVm9wcyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKTsKKyAgICB2b2lkICAgICAgUkNfUmVzZXRTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpOworICAgIFBWX1NUQVRVUyBSQ19VcGRhdGVCdWZmZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllciwgSW50IG51bV9za2lwKTsKKyAgICBQVl9TVEFUVVMgUkNfVXBkYXRlQlhSQ1BhcmFtcyh2b2lkICppbnB1dCk7CisKKworICAgIC8qIGRlZmluZWQgaW4gdmxjX2VuY29kZS5jICovCisgICAgdm9pZCBNQlZsY0VuY29kZURhdGFQYXJfSV9WT1AoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IG5jb2VmYmxja1tdLCB2b2lkICpibGtDb2RlUHRyKTsKKyAgICB2b2lkIE1CVmxjRW5jb2RlRGF0YVBhcl9QX1ZPUChWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgbmNvZWZibGNrW10sIHZvaWQgKmJsa0NvZGVQdHIpOworICAgIHZvaWQgTUJWbGNFbmNvZGVDb21iaW5lZF9JX1ZPUChWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgbmNvZWZibGNrW10sIHZvaWQgKmJsa0NvZGVQdHIpOworICAgIHZvaWQgTUJWbGNFbmNvZGVDb21iaW5lZF9QX1ZPUChWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgbmNvZWZibGNrW10sIHZvaWQgKmJsa0NvZGVQdHIpOworICAgIHZvaWQgQmxvY2tDb2RlQ29lZmZfU2hvcnRIZWFkZXIoUnVuTGV2ZWxCbG9jayAqUkxCLCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMsIEludCBqX3N0YXJ0LCBJbnQgal9zdG9wLCBVQ2hhciBNb2RlKTsKKyAgICB2b2lkIEJsb2NrQ29kZUNvZWZmX1JWTEMoUnVuTGV2ZWxCbG9jayAqUkxCLCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMsIEludCBqX3N0YXJ0LCBJbnQgal9zdG9wLCBVQ2hhciBNb2RlKTsKKyAgICB2b2lkIEJsb2NrQ29kZUNvZWZmX05vcm1hbChSdW5MZXZlbEJsb2NrICpSTEIsIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgSW50IGpfc3RhcnQsIEludCBqX3N0b3AsIFVDaGFyIE1vZGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01QNEVOQ19MSUJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzk0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRsaWJfaW50LmgKQEAgLTAsMCArMSw0NzIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNpZm5kZWYgX01QNExJQl9JTlRfSF8KKyNkZWZpbmUgX01QNExJQl9JTlRfSF8KKworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKyNpbmNsdWRlICJyYXRlX2NvbnRyb2wuaCIKKworLyogQml0c3RyZWFtRW5jVmlkZW8gd2lsbCBiZSBtb2RpZmllZCAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQml0c3RyZWFtCit7CisgICAgSW50KCp3cml0ZVZpZGVvUGFja2V0KShVQ2hhciAqYnVmLCBJbnQgbmJ5dGVzX3JlcXVpcmVkKTsgICAvKndyaXRlIHZpZGVvIHBhY2tldCBvdXQgKi8KKyAgICBVQ2hhciAqYml0c3RyZWFtQnVmZmVyOyAvKmJ1ZmZlciB0byBob2xkIG9uZSB2aWRlbyBwYWNrZXQqLworICAgIEludCBidWZmZXJTaXplOyAvKnRvdGFsIGJpdHN0cmVhbSBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLworICAgIEludCBieXRlQ291bnQ7ICAvKmhvdyBtYW55IGJ5dGVzIGFscmVhZHkgZW5jb2RlZCovCisgICAgVUludCB3b3JkOyAgICAgIC8qaG9sZCBvbmUgd29yZCB0ZW1wb3JhcmlseSAqLworICAgIEludCBiaXRMZWZ0OyAgICAvKm51bWJlciBvZiBiaXRzIGxlZnQgaW4gIndvcmQiICovCisgICAgVUNoYXIqIG92ZXJydW5CdWZmZXI7ICAvKiBwb2ludGVyIHRvIG92ZXJydW4gYnVmZmVyICovCisgICAgSW50IG9CU2l6ZTsgICAgIC8qIGxlbmd0aCBvZiBvdmVycnVuIGJ1ZmZlciAqLworICAgIHN0cnVjdCB0YWdWaWRlb0VuY0RhdGEgKnZpZGVvOworfSBCaXRzdHJlYW1FbmNWaWRlbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVk9QCit7CisgICAgUElYRUwgICAqeUNoYW47ICAgICAgICAgICAgIC8qIFRoZSBZIGNvbXBvbmVudCAqLworICAgIFBJWEVMICAgKnVDaGFuOyAgICAgICAgICAgICAvKiBUaGUgVSBjb21wb25lbnQgKi8KKyAgICBQSVhFTCAgICp2Q2hhbjsgICAgICAgICAgICAgLyogVGhlIFYgY29tcG9uZW50ICovCisgICAgSW50ICAgICBmcmFtZTsgICAgICAgICAgICAgIC8qIGZyYW1lIG51bWJlciAqLworICAgIEludCAgICAgdm9sSUQ7ICAgICAgICAgICAgICAvKiBMYXllciBudW1iZXIgKi8KKyAgICAvL0ludCAgICAgICB0aW1lU3RhbXA7ICAgICAgICAgIC8qIFZvcCBUaW1lU3RhbXAgaW4gbXNlYyAqLworCisgICAgLyogU3ludGF4IGVsZW1lbnRzIGNvcGllZCBmcm9tIFZPTCAoc3RhbmRhcmQpICovCisgICAgSW50ICAgICB3aWR0aDsgICAgICAgICAgICAgIC8qIFdpZHRoIChtdWx0aXBsZSBvZiAxNikgKi8KKyAgICBJbnQgICAgIGhlaWdodDsgICAgICAgICAgICAgLyogSGVpZ2h0IChtdWx0aXBsZSBvZiAxNikgKi8KKyAgICBJbnQgICAgIHBpdGNoOyAgICAgICAgICAgICAgLyogUGl0Y2ggKGRpZmZlcnMgZnJvbSB3aWR0aCBmb3IgVU1WIGNhc2UpICovCisgICAgSW50ICAgICBwYWRkZWQ7ICAgICAvKiBmbGFnIHdoZXRoZXIgdGhpcyBmcmFtZSBoYXMgYmVlbiBwYWRkZWQgKi8KKworICAgIC8qIEFjdHVhbCBzeW50YXggZWxlbWVudHMgZm9yIFZPUCAoc3RhbmRhcmQpICovCisgICAgSW50ICAgICBwcmVkaWN0aW9uVHlwZTsgICAgIC8qIFZPUCBwcmVkaWN0aW9uIHR5cGUgKi8KKyAgICBJbnQgICAgIHRpbWVJbmM7ICAgICAgICAgICAgLyogVk9QIHRpbWUgaW5jcmVtZW50IChyZWxhdGl2ZSB0byBsYXN0IG10YikgKi8KKyAgICBJbnQgICAgIHZvcENvZGVkOworICAgIEludCAgICAgcm91bmRpbmdUeXBlOworICAgIEludCAgICAgaW50cmFEQ1ZsY1RocjsKKyAgICBJbnQgICAgIHF1YW50aXplcjsgICAgICAgICAgLyogVk9QIHF1YW50aXplciAqLworICAgIEludCAgICAgZmNvZGVGb3J3YXJkOyAgICAgICAvKiBWT1AgZHluYW1pYyByYW5nZSBvZiBtb3Rpb24gdmVjdG9ycyAqLworICAgIEludCAgICAgZmNvZGVCYWNrd2FyZDsgICAgICAvKiBWT1AgZHluYW1pYyByYW5nZSBvZiBtb3Rpb24gdmVjdG9ycyAqLworICAgIEludCAgICAgcmVmU2VsZWN0Q29kZTsgICAgICAvKiBlbmhhbmNlbWVudCBsYXllciByZWZlcmVuY2Ugc2VsZWN0IGNvZGUgKi8KKworICAgIC8qIEguMjYzIHBhcmFtZXRlcnMgKi8KKyAgICBJbnQgICAgIGdvYk51bWJlcjsKKyAgICBJbnQgICAgIGdvYkZyYW1lSUQ7CisgICAgSW50ICAgICB0ZW1wb3JhbFJlZjsgICAgICAgIC8qIHRlbXBvcmFsIHJlZmVyZW5jZSwgcm9sbCBvdmVyIGF0IDI1NiAqLworICAgIEludCAgICAgdGVtcG9yYWxJbnRlcnZhbDsgICAvKiBpbmNyZWFzZSBldmVyeSAyNTYgdGVtcG9yYWxSZWYgKi8KKworfSBWb3A7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1ZvbAoreworICAgIEludCAgICAgdm9sSUQ7ICAgICAgICAgICAgICAvKiBWT0wgaWRlbnRpZmllciAoZm9yIHRyYWNraW5nKSAqLworICAgIEludCAgICAgc2hvcnRWaWRlb0hlYWRlcjsgICAvKiBzaG9ydFZpZGVvSGVhZGVyIG1vZGUgKi8KKyAgICBJbnQgICAgIEdPVlN0YXJ0OyAgICAgICAgICAgLyogSW5zZXJ0IEdPViBIZWFkZXIgKi8KKyAgICBJbnQgICAgIHRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOyAgICAvKiBWT0wgdGltZSBpbmNyZW1lbnQgKi8KKyAgICBJbnQgICAgIG5iaXRzVGltZUluY1JlczsgICAgLyogbnVtYmVyIG9mIGJpdHMgZm9yIHRpbWUgaW5jcmVtZW50ICovCisgICAgSW50ICAgICB0aW1lSW5jcmVtZW50OyAgICAgIC8qIHRpbWUgaW5jcmVtZW50ICovCisgICAgSW50ICAgICBtb2R1bG9UaW1lQmFzZTsgICAgIC8qIGludGVybmFsIGRlY29kZXIgY2xvY2sgKi8KKyAgICBJbnQgICAgIHByZXZNb2R1bG9UaW1lQmFzZTsgLyogaW4gY2FzZSBvZiBwcmUtZnJhbWVza2lwICovCisKKyAgICBJbnQgICAgIGZpeGVkVm9wUmF0ZTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAgKnN0cmVhbTsgLyogbGlicmFyeSBiaXRzdHJlYW0gYnVmZmVyIChpbnB1dCBidWZmZXIpICovCisKKyAgICAvKiBWT0wgRGltZW5zaW9ucyAqLworICAgIEludCAgICAgd2lkdGg7ICAgICAgICAgICAgICAvKiBXaWR0aCAqLworICAgIEludCAgICAgaGVpZ2h0OyAgICAgICAgICAgICAvKiBIZWlnaHQgKi8KKworICAgIC8qIEVycm9yIFJlc2lsaWVuY2UgRmxhZ3MgKi8KKyAgICBJbnQgICAgIFJlc3luY01hcmtlckRpc2FibGU7IC8qIFZPTCBEaXNhYmxlIFJlc3luY2ggTWFya2VycyAqLworICAgIEludCAgICAgdXNlUmV2ZXJzZVZMQzsgICAgICAvKiBWT0wgcmV2ZXJzaWJsZSBWTENzICovCisgICAgSW50ICAgICBkYXRhUGFydGl0aW9uaW5nOyAgIC8qIFZPTCBkYXRhIHBhcnRpdGlvbmluZyAqLworCisgICAgLyogUXVhbnRpemF0aW9uIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgIEludCAgICAgcXVhbnRQcmVjaXNpb247ICAgICAvKiBRdWFudGl6ZXIgcHJlY2lzaW9uICovCisgICAgSW50ICAgICBxdWFudFR5cGU7ICAgICAgICAgIC8qIE1QRUctNCBvciBILjI2MyBRdWFudGl6YXRpb24gVHlwZSAqLworCisgICAgLyogQWRkZWQgbG9hZGVkIHF1YW50IG1hdCwgMDUvMjIvMjAwMCAqLworICAgIEludCAgICAgbG9hZEludHJhUXVhbnRNYXQ7ICAgICAgLyogTG9hZCBpbnRyYSBxdWFudGl6YXRpb24gbWF0cml4ICovCisgICAgSW50ICAgICBsb2FkTm9uSW50cmFRdWFudE1hdDsgICAvKiBMb2FkIG5vbmludHJhIHF1YW50aXphdGlvbiBtYXRyaXggKi8KKyAgICBJbnQgICAgIGlxbWF0WzY0XTsgICAgICAgICAgLyogSW50cmEgcXVhbnQubWF0cml4ICovCisgICAgSW50ICAgICBuaXFtYXRbNjRdOyAgICAgICAgIC8qIE5vbi1pbnRyYSBxdWFudC5tYXRyaXggKi8KKworCisgICAgLyogUGFyYW1ldGVycyB1c2VkIGZvciBzY2FsYWJpbGl0eSAqLworICAgIEludCAgICAgc2NhbGFiaWxpdHk7ICAgICAgICAvKiBWT0wgc2NhbGFiaWxpdHkgKGZsYWcpICovCisgICAgSW50ICAgICBzY2FsVHlwZTsgICAgICAgICAgIC8qIHRlbXBvcmFsID0gMCwgc3BhdGlhbCA9IDEsIGJvdGggPSAyICovCisKKyAgICBJbnQgICAgIHJlZlZvbElEOyAgICAgICAgICAgLyogVk9MIGlkIG9mIHJlZmVyZW5jZSBWT0wgKi8KKyAgICBJbnQgICAgIHJlZlNhbXBEaXI7ICAgICAgICAgLyogVk9MIHJlc29sLiBvZiByZWYuIFZPTCAqLworICAgIEludCAgICAgaG9yU2FtcF9uOyAgICAgICAgICAvKiBWT0wgaG9yLiByZXNhbXBsaW5nIG9mIHJlZi4gVk9MIGdpdmVuIGJ5ICovCisgICAgSW50ICAgICBob3JTYW1wX207ICAgICAgICAgIC8qIHNhbXBmYWMgPSBob3Jfc2FtcF9uL2hvcl9zYW1wX20gICAgICAqLworICAgIEludCAgICAgdmVyU2FtcF9uOyAgICAgICAgICAvKiBWT0wgdmVyLiByZXNhbXBsaW5nIG9mIHJlZi4gVk9MIGdpdmVuIGJ5ICovCisgICAgSW50ICAgICB2ZXJTYW1wX207ICAgICAgICAgIC8qIHNhbXBmYWMgPSB2ZXJfc2FtcF9uL3Zlcl9zYW1wX20gICAgICAqLworICAgIEludCAgICAgZW5oYW5jZW1lbnRUeXBlOyAgICAvKiBWT0wgdHlwZSBvZiBlbmhhbmNlbWVudCBsYXllciAqLworCisgICAgLyogVGhlc2UgdmFyaWFibGVzIHdlcmUgYWRkZWQgc2luY2UgdGhleSBhcmUgdXNlZCBhIGxvdC4gKi8KKyAgICBJbnQgICAgIG5NQlBlclJvdywgbk1CUGVyQ29sOyAgIC8qIG51bWJlciBvZiBNQnMgaW4gZWFjaCByb3cgJiBjb2x1bW4gICAgKi8KKyAgICBJbnQgICAgIG5Ub3RhbE1COworICAgIEludCAgICAgbkJpdHNGb3JNQklEOyAgICAgICAgICAgLyogaG93IG1hbnkgYml0cyByZXF1aXJlZCBmb3IgTUIgbnVtYmVyPyAqLworCisgICAgLyogZm9yIHNob3J0IHZpZGVvIGhlYWRlciAqLworICAgIEludCAgICAgbk1CaW5HT0I7ICAgICAgICAgICAvKiBudW1iZXIgb2YgTUJzIGluIEdPQiwgMDUvMjIvMDAgKi8KKyAgICBJbnQgICAgIG5HT0JpblZvcDsgICAgICAgICAgLyogbnVtYmVyIG9mIEdPQiBpbiBWb3AgIDA1LzIyLzAwICovCit9IFZvbDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTWFjcm9CbG9jaworeworICAgIEludCAgICAgbWJfeDsgICAgICAgICAgICAgICAvKiBYIGNvb3JkaW5hdGUgKi8KKyAgICBJbnQgICAgIG1iX3k7ICAgICAgICAgICAgICAgLyogWSBjb29yZGluYXRlICovCisgICAgU2hvcnQgICBibG9ja1s5XVs2NF07ICAgICAgIC8qIDQtWSwgVSBhbmQgViBibG9ja3MgLCBhbmQgQUFOIFNjYWxlKi8KK30gTWFjcm9CbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUnVuTGV2ZWxCbG9jaworeworICAgIEludCBydW5bNjRdOyAgICAgICAgLyogUnVubGVuZ3RoICovCisgICAgSW50IGxldmVsWzY0XTsgICAgICAvKiBBYnMobGV2ZWwpICovCisgICAgSW50IHNbNjRdOyAgICAgICAgICAvKiBzaWduIGxldmVsICovCit9IFJ1bkxldmVsQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0hlYWRlckluZm9EZWNWaWRlbworeworICAgIFVDaGFyICAgICAgICpNb2RlOyAgICAgICAgICAgICAgLyogTW9kZXMgSU5UUkEvSU5URVIvZXRjLiAqLworICAgIFVDaGFyICAgICAgICpDQlA7ICAgICAgICAgICAgICAgLyogTUNCUEMvQ0JQWSBzdHVmZiAqLworfSBIZWFkZXJJbmZvRW5jVmlkZW87CisKK3R5cGVkZWYgU2hvcnQgdHlwZURDU3RvcmVbNl07ICAgLyogQUNEQyAqLwordHlwZWRlZiBTaG9ydCB0eXBlRENBQ1N0b3JlWzRdWzhdOworCit0eXBlZGVmIHN0cnVjdCB0YWdNT1QKK3sKKyAgICBJbnQgeDsgIC8qIGhhbGYtcGVsIHJlc29sdXRpb24geCBjb21wb25lbnQgKi8KKyAgICBJbnQgeTsgICAgICAvKiBoYWxmLXBlbCByZXNvbHV0aW9uIHkgY29tcG9uZW50ICovCisgICAgSW50IHNhZDsgIC8qIFNBRCAqLworfSBNT1Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0hpbnRUcmFja0luZm8KK3sKKyAgICBVQ2hhciBNVEI7CisgICAgVUNoYXIgTGF5ZXJJRDsKKyAgICBVQ2hhciBDb2RlVHlwZTsKKyAgICBVQ2hhciBSZWZTZWxDb2RlOworCit9IEhpbnRUcmFja0luZm87CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVmlkZW9FbmNQYXJhbXMKK3sKKyAgICAvL0ludCAgICAgICBXaWR0aDsgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBXaWR0aCAqLworICAgIC8vSW50ICAgICAgIEhlaWdodDsgICAgICAgICAgICAgICAgIC8qIElucHV0IEhlaWdodCAqLworICAgIC8vZmxvYXQgRnJhbWVSYXRlOyAgICAgICAgICAgICAgLyogSW5wdXQgRnJhbWUgUmF0ZSAqLworICAgIFVJbnQgICAgVGltZUluY3JlbWVudFJlczsgICAgICAgLyogdGltZUluY3JlbWVudFJlcyAqLworCisgICAgLypWT0wgUGFyYW1ldGVycyAqLworICAgIEludCAgICAgbkxheWVyczsKKyAgICBJbnQgICAgIExheWVyV2lkdGhbNF07ICAgICAgICAgIC8qIEVuY29kZWQgV2lkdGggKi8KKyAgICBJbnQgICAgIExheWVySGVpZ2h0WzRdOyAgICAgICAgIC8qIEVuY29kZWQgSGVpZ2h0ICovCisgICAgZmxvYXQgICBMYXllckZyYW1lUmF0ZVs0XTsgICAgICAvKiBFbmNvZGVkIEZyYW1lIFJhdGUgKi8KKyAgICBJbnQgICAgIExheWVyQml0UmF0ZVs0XTsgICAgICAgIC8qIEVuY29kZWQgQml0UmF0ZSAqLworICAgIEludCAgICAgTGF5ZXJNYXhCaXRSYXRlWzRdOyAgICAgLyogTWF4aW11bSBFbmNvZGVkIEJpdFJhdGUgKi8KKyAgICBmbG9hdCAgIExheWVyTWF4RnJhbWVSYXRlWzRdOyAgIC8qIE1heGltdW0gRW5jb2RlZCBGcmFtZSBSYXRlICovCisgICAgSW50ICAgICBMYXllck1heE1ic1BlclNlY1s0XTsgICAvKiBNYXhpbXVtIG1icyBwZXIgc2Vjb25kLCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlIGFuZCBsZXZlbCAqLworICAgIEludCAgICAgTGF5ZXJNYXhCdWZmZXJTaXplWzRdOyAgLyogTWF4aW11bSBidWZmZXIgc2l6ZSwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKworICAgIEJvb2wgICAgUmVzeW5jTWFya2VyRGlzYWJsZTsgICAgLyogRGlzYWJsZSBSZXN5bmMgTWFya2VyICovCisgICAgQm9vbCAgICBEYXRhUGFydGl0aW9uaW5nOyAgICAgICAvKiBCYXNlIExheWVyIERhdGEgUGFydGl0aW9uaW5nICovCisgICAgQm9vbCAgICBSZXZlcnNpYmxlVkxDOyAgICAgICAgICAvKiBSVkxDIHdoZW4gRGF0YSBQYXJ0aXRpb25pbmcgKi8KKyAgICBCb29sICAgIEFDRENQcmVkaWN0aW9uOyAgICAgICAgIC8qIEFDL0RDIFByZWRpY3Rpb24gICAgKi8KKyAgICBJbnQgICAgIFF1YW50VHlwZVs0XTsgICAgICAgICAgIC8qIEgyNjMsIE1QRUcyICovCisgICAgSW50ICAgICBJbml0UXVhbnRCdm9wWzRdOworICAgIEludCAgICAgSW5pdFF1YW50UHZvcFs0XTsKKyAgICBJbnQgICAgIEluaXRRdWFudEl2b3BbNF07CisgICAgSW50ICAgICBSZXN5bmNQYWNrZXRzaXplOworCisgICAgSW50ICAgICBSb3VuZGluZ1R5cGU7CisgICAgSW50ICAgICBJbnRyYURDVmxjVGhyOworCisgICAgLyogUmF0ZSBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBNUDRSYXRlQ29udHJvbFR5cGUgIFJDX1R5cGU7ICAgICAgICAvKkNvbnN0YW50IFEsIE00IGNvbnN0YW50UmF0ZSwgVk01KywgTTRSQyxNUEVHMlRNNSAqLworCisgICAgLyogSW50cmEgUmVmcmVzaCBQYXJhbWV0ZXJzICovCisgICAgSW50ICAgICBJbnRyYVBlcmlvZDsgICAgICAgICAgICAvKiBJbnRyYSB1cGRhdGUgcGVyaW9kICovCisgICAgSW50ICAgICBSZWZyZXNoOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgTUJzIHJlZnJlc2ggaW4gZWFjaCBmcmFtZSAqLworICAgIC8qIE90aGVyIFBhcmFtZXRlcnMgKi8KKyAgICBCb29sICAgIFNjZW5lQ2hhbmdlX0RldDsgICAgICAgIC8qIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gKi8KKyAgICBCb29sICAgIEZpbmVGcmFtZVNraXBfRW5hYmxlZDsgIC8qIHNyYyByYXRlIHJlc29sdXRpb24gZnJhbWUgc2tpcHBpbmcgKi8KKyAgICBCb29sICAgIFZCUl9FbmFibGVkOyAgICAgICAgICAgIC8qIFZCUiByYXRlIGNvbnRyb2wgKi8KKyAgICBCb29sICAgIE5vRnJhbWVTa2lwX0VuYWJsZWQ7ICAgIC8qIGRvIG5vdCBhbGxvdyBmcmFtZSBza2lwICovCisgICAgQm9vbCAgICBOb1ByZVNraXBfRW5hYmxlZDsgICAgICAvKiBkbyBub3QgYWxsb3cgcHJlLXNraXAgKi8KKworICAgIEJvb2wgICAgSDI2M19FbmFibGVkOyAgICAgICAgICAgLyogSDI2MyBTaG9ydCBIZWFkZXIgKi8KKyAgICBCb29sICAgIEdPVl9FbmFibGVkOyAgICAgICAgICAgIC8qIEdPViBIZWFkZXIgRW5hYmxlZCAqLworICAgIEJvb2wgICAgU2VxdWVuY2VTdGFydENvZGU7ICAgICAgLyogVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgcmVtb3ZlZCAqLworICAgIEJvb2wgICAgRnVsbFNlYXJjaF9FbmFibGVkOyAgICAgLyogZnVsbC1wZWwgZXhoYXVzdGl2ZSBzZWFyY2ggbW90aW9uIGVzdGltYXRpb24gKi8KKyAgICBCb29sICAgIEhhbGZQZWxfRW5hYmxlZDsgICAgICAgIC8qIFR1cm4gSGFsZnBlbCBNRSBvbiBvciBvZmYgKi8KKyAgICBCb29sICAgIE1WOHg4X0VuYWJsZWQ7ICAgICAgICAgIC8qIEVuYWJsZSA4eDggbW90aW9uIHZlY3RvcnMgKi8KKyAgICBCb29sICAgIFJEX29wdF9FbmFibGVkOyAgICAgICAgIC8qIEVuYWJsZSBvcGVyYXRpb25hbCBSLUQgb3B0aW1pemF0aW9uICovCisgICAgSW50ICAgICBHT0JfSGVhZGVyX0ludGVydmFsOyAgICAgICAgLyogRW5hYmxlIGVuY29kaW5nIEdPQiBoZWFkZXIgaW4gSDI2M19XSVRIX0VSUl9SRVMgYW5kIFNIT1JUX0hFUkRFUl9XSVRIX0VSUl9SRVMgKi8KKyAgICBJbnQgICAgIFNlYXJjaFJhbmdlOyAgICAgICAgICAgIC8qIFNlYXJjaCByYW5nZSBmb3IgMTZ4MTYgbW90aW9uIHZlY3RvciAqLworICAgIEludCAgICAgTWVtb3J5VXNhZ2U7ICAgICAgICAgICAgLyogQW1vdW50IG9mIG1lbW9yeSBhbGxvY2F0ZWQgKi8KKyAgICBJbnQgICAgIEdldFZvbEhlYWRlclsyXTsgICAgICAgIC8qIEZsYWcgdG8gY2hlY2sgaWYgVm9sIEhlYWRlciBoYXMgYmVlbiByZXRyaWV2ZWQgKi8KKyAgICBJbnQgICAgIEJ1ZmZlclNpemVbMl07ICAgICAgICAgIC8qIEJ1ZmZlciBTaXplIGZvciBCYXNlIGFuZCBFbmhhbmNlIExheWVycyAqLworICAgIEludCAgICAgUHJvZmlsZUxldmVsWzJdOyAgICAgICAgLyogUHJvZmlsZSBhbmQgTGV2ZWwgZm9yIGVuY29kaW5nIHB1cnBvc2VzICovCisgICAgZmxvYXQgICBWQlZfZGVsYXk7ICAgICAgICAgICAgICAvKiBWQlYgYnVmZmVyIHNpemUgaW4gdGhlIGZvcm0gb2YgZGVsYXkgKi8KKyAgICBJbnQgICAgIG1heEZyYW1lU2l6ZTsgICAgICAgICAgIC8qIG1heGltdW0gZnJhbWUgc2l6ZShiaXRzKSBmb3IgSDI2My9TaG9ydCBoZWFkZXIgbW9kZSwgayoxNjM4NCAqLworICAgIEludCAgICAgcHJvZmlsZV90YWJsZV9pbmRleDsgICAgLyogaW5kZXggZm9yIHByb2ZpbGUgYW5kIGxldmVsIHRhYmxlcyBnaXZlbiB0aGUgc3BlY2lmaWVkIHByb2ZpbGUgYW5kIGxldmVsICovCisKK30gVmlkZW9FbmNQYXJhbXM7CisKKy8qIHBsYXRmb3JtIGRlcGVuZGVudCBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0Z1bmNQdHIKK3sKKy8vICBJbnQgKCpTQURfTUJfSGFsZlBlbCkoVUNoYXIgKnJlZixVQ2hhciAqYmxrLEludCBkbWluX2x4LEludCB4aCxJbnQgeWgsdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50KCpTQURfTUJfSGFsZlBlbFs0XSkoVUNoYXIqLCBVQ2hhciosIEludCwgdm9pZCAqKTsKKyAgICBJbnQoKlNBRF9CbGtfSGFsZlBlbCkoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCwgSW50IHJ4LCBJbnQgeGgsIEludCB5aCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgSW50KCpTQURfTWFjcm9ibG9jaykoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIEludCgqU0FEX0Jsb2NrKShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBJbnQoKlNBRF9NQl9QQURESU5HKShVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCB2b2lkICpleHRyYV9pbmZvKTsgLyosIDQvMjEvMDEgKi8KKyAgICB2b2lkICgqQ29tcHV0ZU1CU3VtKShVQ2hhciAqY3VyLCBJbnQgbHgsIE1PVCAqbW90X21iKTsKKyAgICB2b2lkICgqQ2hvb3NlTW9kZSkoVUNoYXIgKk1vZGUsIFVDaGFyICpjdXIsIEludCBseCwgSW50IG1pbl9TQUQpOworICAgIHZvaWQgKCpHZXRIYWxmUGVsTUJSZWdpb24pKFVDaGFyICpjYW5kLCBVQ2hhciAqaG1lbSwgSW50IGx4KTsKKyAgICB2b2lkICgqYmxvY2tJZGN0KShJbnQgKmJsb2NrKTsKKworCit9IEZ1bmNQdHI7CisKKy8qIDA0LzA5LzAxLCBmb3IgbXVsdGlwYXNzIHJhdGUgY29udHJvbCAqLworCit0eXBlZGVmIHN0cnVjdCB0YWdSREluZm8KK3sKKyAgICBJbnQgUVA7CisgICAgSW50IGFjdHVhbF9iaXRzOworICAgIGZsb2F0IG1hZDsKKyAgICBmbG9hdCBSX0Q7Cit9IFJESW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTXVsdGlQYXNzCit7CisgICAgLyogbXVsdGlwYXNzIHJhdGUgY29udHJvbCBkYXRhICovCisgICAgSW50IHRhcmdldF9iaXRzOyAgICAvKiB0YXJnZXQgYml0cyBmb3IgY3VycmVudCBmcmFtZSwgPSByYy0+VCAqLworICAgIEludCBhY3R1YWxfYml0czsgICAgLyogYWN0dWFsIGJpdHMgZm9yIGN1cnJlbnQgZnJhbWUgb2J0YWluZWQgYWZ0ZXIgZW5jb2RpbmcsID0gcmMtPlJjKi8KKyAgICBJbnQgUVA7ICAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBsZXZlbCBmb3IgY3VycmVudCBmcmFtZSwgPSByYy0+UWMqLworICAgIEludCBwcmV2X1FQOyAgICAgICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBwcmV2aW91cyBmcmFtZSAqLworICAgIEludCBwcmV2X3ByZXZfUVA7ICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBwcmV2aW91cyBmcmFtZSBiZWZvcmUgbGFzdCovCisgICAgZmxvYXQgbWFkOyAgICAgICAgICAvKiBtYWQgZm9yIGN1cnJlbnQgZnJhbWUsID0gdmlkZW8tPmF2Z01BRCovCisgICAgSW50IGJpdHJhdGU7ICAgICAgICAvKiBiaXRyYXRlIGZvciBjdXJyZW50IGZyYW1lICovCisgICAgZmxvYXQgZnJhbWVyYXRlOyAgICAvKiBmcmFtZXJhdGUgZm9yIGN1cnJlbnQgZnJhbWUqLworCisgICAgSW50IG5SZV9RdWFudGl6ZWQ7ICAvKiBjb250cm9sIHZhcmlhYmxlIGZvciBtdWx0aXBhc3MgZW5jb2RpbmcsICovCisgICAgLyogMCA6IGZpcnN0IHBhc3MgKi8KKyAgICAvKiAxIDogaW50ZXJtZWRpYXRlIHBhc3MocXVhbnRpemF0aW9uIGFuZCBWTEMgbG9vcCBvbmx5KSAqLworICAgIC8qIDIgOiBmaW5hbCBwYXNzKGRlLXF1YW50aXphdGlvbiwgaWRjdCwgZXRjKSAqLworICAgIC8qIDMgOiBtYWNyb2Jsb2NrIGxldmVsIHJhdGUgY29udHJvbCAqLworCisgICAgSW50IGVuY29kZWRfZnJhbWVzOyAgICAgLyogY291bnRlciBmb3IgYWxsIGVuY29kZWQgZnJhbWVzICovCisgICAgSW50IHJlX2VuY29kZWRfZnJhbWVzOyAgLyogY291bnRlciBmb3IgYWxsIG11bHRpcGFzcyBlbmNvZGVkIGZyYW1lcyovCisgICAgSW50IHJlX2VuY29kZWRfdGltZXM7ICAgLyogY291bnRlciBmb3IgYWxsIHRpbWVzIG9mIG11bHRpcGFzcyBmcmFtZSBlbmNvZGluZyAqLworCisgICAgLyogTXVsdGlwbGUgZnJhbWUgcHJlZGljdGlvbiovCisgICAgUkRJbmZvICoqcFJEU2FtcGxlczsgICAgICAgIC8qIHBSRFNhbXBsZXNbMzBdWzMyXSwgMzAtPjMwZnBzLCAzMiAtPiA1IGJpdCBxdWFudGl6ZXIsIDMyIGNhbmRpZGF0ZXMqLworICAgIEludCBmcmFtZVBvczsgICAgICAgICAgICAgICAvKiBzcGVjaWZpYyBwb3NpdGlvbiBpbiBwcmV2aW91cyBtdWx0aXBsZSBmcmFtZXMqLworICAgIEludCBmcmFtZVJhbmdlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygb3ZlcmFsbCBwcmV2aW91cyBtdWx0aXBsZSBmcmFtZXMgKi8KKyAgICBJbnQgc2FtcGxlc1BlckZyYW1lWzMwXTsgICAgLyogbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lLCAzMC0+MzBmcHMgKi8KKworICAgIC8qIEJpdCBhbGxvY2F0aW9uIGZvciBzY2VuZSBjaGFuZ2UgZnJhbWVzIGFuZCBoaWdoIG1vdGlvbiBmcmFtZXMgKi8KKyAgICBmbG9hdCBzdW1fbWFkOworICAgIEludCBjb3VudGVyX0JUc3JjOyAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGJpdCB0cmFuc2ZlciBmcm9tIGxvdyBtb3Rpb24gZnJhbWVzIG9yIGxlc3MgY29tcGxpY2F0ZWRseSBjb21wcmVzc2VkIGZyYW1lcyAqLworICAgIEludCBjb3VudGVyX0JUZHN0OyAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGJpdCB0cmFuc2ZlciB0byBzY2VuZSBjaGFuZ2UgZnJhbWVzIG9yIGhpZ2ggbW90aW9uIGZyYW1lcyBvciBtb3JlIGNvbXBsaWNhdGVkbHkgY29tcHJlc3NlZCBmcmFtZXMgKi8KKyAgICBmbG9hdCBzdW1fUVA7CisgICAgSW50IGRpZmZfY291bnRlcjsgICAvKiBkaWZmX2NvdW50ZXIgPSAtZGlmZl9jb3VudGVyX0JUZHN0LCBvciBkaWZmX2NvdW50ZXJfQlRzcmMgKi8KKworICAgIC8qIEZvciB0YXJnZXQgYml0cmF0ZSBvciBmcmFtZXJhdGUgdXBkYXRlICovCisgICAgZmxvYXQgdGFyZ2V0X2JpdHNfcGVyX2ZyYW1lOyAgICAgICAgLyogPSBDID0gYml0cmF0ZS9mcmFtZXJhdGUgKi8KKyAgICBmbG9hdCB0YXJnZXRfYml0c19wZXJfZnJhbWVfcHJldjsgICAvKiBwcmV2aW91cyBDICovCisgICAgZmxvYXQgYXZlcl9tYWQ7ICAgICAgICAgICAgICAgICAgICAgLyogc28tZmFyIGF2ZXJhZ2UgbWFkIGNvdWxkIHJlcGxhY2Ugc3VtX21hZCAqLworICAgIGZsb2F0IGF2ZXJfbWFkX3ByZXY7ICAgICAgICAgICAgICAgIC8qIHByZXZpb3VzIGF2ZXJhZ2UgbWFkICovCisgICAgSW50ICAgb3ZlcmxhcHBlZF93aW5fc2l6ZTsgICAgICAgICAgLyogdHJhbnNpdGlvbiBwZXJpb2Qgb2YgdGltZSAqLworICAgIEludCAgIGVuY29kZWRfZnJhbWVzX3ByZXY7ICAgICAgICAgIC8qIHByZXZpb3VzIGVuY29kZWRfZnJhbWVzICovCit9IE11bHRpUGFzczsKKworLyogRW5kICovCisKKyNpZmRlZiBIVEZNCit0eXBlZGVmIHN0cnVjdCB0YWdIVEZNX1N0YXQKK3sKKyAgICBJbnQgYWJzX2RpZl9tYWRfYXZnOworICAgIFVJbnQgY291bnRicmVhazsKKyAgICBJbnQgb2Zmc2V0QXJyYXlbMTZdOworICAgIEludCBvZmZzZXRSZWZbMTZdOworfSBIVEZNX1N0YXQ7CisjZW5kaWYKKworLyogR2xvYmFsIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBwYXNzZWQgYXJvdW5kICovCit0eXBlZGVmIHN0cnVjdCB0YWdWaWRlb0VuY0RhdGEKK3sKKyAgICAvKiBWT0wgSGVhZGVyIEluaXRpYWxpemF0aW9uICovCisgICAgVUNoYXIgICB2b2xJbml0aWFsaXplWzRdOyAgICAgICAvKiBVc2VkIHRvIFdyaXRlIFZPTCBIZWFkZXJzICovCisgICAgLyogRGF0YSBGb3IgTGF5ZXJzIChTY2FsYWJpbGl0eSkgKi8KKyAgICBJbnQgICAgIG51bWJlck9mTGF5ZXJzOyAgICAgLyogTnVtYmVyIG9mIExheWVycyAqLworICAgIFZvbCAgICAgKip2b2w7ICAgICAgICAgICAgICAvKiBEYXRhIHN0b3JlZCBmb3IgZWFjaCBWT0wgKi8KKworICAgIC8qIERhdGEgdXNlZCBmb3IgZW5jb2RpbmcgZnJhbWVzICovCisgICAgVmlkZW9FbmNGcmFtZUlPICppbnB1dDsgICAgIC8qIG9yaWdpbmFsIGlucHV0IGZyYW1lICovCisgICAgVm9wICAgICAqY3VyclZvcDsgICAgICAgICAgIC8qIEN1cnJlbnQgcmVjb25zdHJ1Y3RlZCBWT1AgKi8KKyAgICBWb3AgICAgICpwcmV2QmFzZVZvcDsgICAgICAgLyogUHJldmlvdXMgcmVmZXJlbmNlIEJhc2UgVm9wICovCisgICAgVm9wICAgICAqbmV4dEJhc2VWb3A7ICAgICAgIC8qIE5leHQgcmVmZXJlbmNlIEJhc2UgVm9wICovCisgICAgVm9wICAgICAqcHJldkVuaGFuY2VWb3A7LyogUHJldmlvdXMgRW5oYW5jZW1lbnQgTGF5ZXIgVm9wICovCisgICAgVm9wICAgICAqZm9yd2FyZFJlZlZvcDsgICAgIC8qIEZvcndhcmQgUmVmZXJlbmNlIFZPUCAqLworICAgIFZvcCAgICAgKmJhY2t3YXJkUmVmVm9wOyAgICAvKiBCYWNrd2FyZCBSZWZlcmVuY2UgVk9QICovCisKKyAgICAvKiBzY3JhdGNoIG1lbW9yeSAqLworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICAqYml0c3RyZWFtMTsgLyogVXNlZCBmb3IgZGF0YSBwYXJ0aXRpb25pbmcgKi8KKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAgKmJpdHN0cmVhbTI7IC8qIGFuZCBjb21iaW5lZCBtb2RlcyBhcyAgICAgICovCisgICAgQml0c3RyZWFtRW5jVmlkZW8gICpiaXRzdHJlYW0zOyAvKiBpbnRlcm1lZGlhdGUgc3RvcmFnZXMgICAgICAqLworCisgICAgVUNoYXIgICAqb3ZlcnJ1bkJ1ZmZlcjsgIC8qIGV4dHJhIG91dHB1dCBidWZmZXIgdG8gcHJldmVudCBjdXJyZW50IHNraXAgZHVlIHRvIG91dHB1dCBidWZmZXIgb3ZlcnJ1biovCisgICAgSW50ICAgICBvQlNpemU7ICAgICAvKiBzaXplIG9mIGFsbG9jYXRlZCBvdmVycnVuIGJ1ZmZlciAqLworCisgICAgSW50IGRjX3NjYWxhcl8xOyAgICAgICAgICAgIC8qZGMgc2NhbGFyIGZvciBZIGJsb2NrICovCisgICAgSW50IGRjX3NjYWxhcl8yOyAgICAgICAgICAgIC8qZGMgc2NhbGFyIGZvciBVLCBWIGJsb2NrKi8KKworICAgIC8qIEFubmV4IEwgUmF0ZSBDb250cm9sICovCisgICAgcmF0ZUNvbnRyb2wgICAgICpyY1s0XTsgICAgICAgICAvKiBQb2ludGVyIHRvIFJhdGUgQ29udHJvbCBzdHJ1Y3R1cmUqLworICAgIC8qIDEyLzI1LzAwLCBlYWNoIFIuQy4gZm9yIGVhY2ggbGF5ZXIgKi8KKworICAgIC8qKioqKioqKiogbW90aW9uIGNvbXBlbnNhdGlvbiByZWxhdGVkIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqLworICAgIE1PVCAgICAgKiptb3Q7ICAgICAgICAgICAgICAvKiBNb3Rpb24gdmVjdG9ycyAqLworICAgIC8qICB3aGVyZSBbbWJudW1dWzBdID0gMU1WLgorICAgICAgICBbbWJudW1dWzEuLi40XSA9IDRNVnMKKyAgICAgICAgW21ibnVtXVs1XSA9IGJhY2t3YXJkIE1WLgorICAgICAgICBbbWJudW1dWzZdID0gZGVsdGEgTVYgZm9yIGRpcmVjdCBtb2RlLgorICAgICAgICBbbWJudW1dWzddID0gbm90aGluZyB5ZXQuICovCisgICAgVUNoYXIgICAqaW50cmFBcnJheTsgICAgICAgICAgICAvKiBJbnRyYSBVcGRhdGUgQXJyYXJ5ICovCisgICAgZmxvYXQgICBzdW1NQUQ7ICAgICAgICAgICAgIC8qIFNBRC9NQUQgZm9yIGZyYW1lICovCisKKyAgICAvKiB0byBzcGVlZHVwIHRoZSBTQUQgY2FsY3VsYXRpb24gKi8KKyAgICB2b2lkICpzYWRfZXh0cmFfaW5mbzsKKyNpZmRlZiBIVEZNCisgICAgSW50IG5ybWx6X3RoWzQ4XTsgICAgICAgLyogVGhyZXNob2xkIGZvciBmYXN0IFNBRCBjYWxjdWxhdGlvbiB1c2luZyBIVEZNICovCisgICAgSFRGTV9TdGF0IGh0Zm1fc3RhdDsgICAgLyogRm9yIHN0YXRpc3RpY3MgY29sbGVjdGlvbiAqLworI2VuZGlmCisKKyAgICAvKlRhbyAwNC8wOS8wMCAgRm9yIERDVCByb3V0aW5lICovCisgICAgVUNoYXIgY3VycllNQlsyNTZdOyAgICAgLyogaW50ZXJsZWF2ZWQgY3VycmVudCBtYWNyb2Jsb2NrIGluIEhURk0gb3JkZXIgKi8KKyAgICBNYWNyb0Jsb2NrICAqb3V0cHV0TUI7ICAgICAgICAgIC8qIE91dHB1dCBNQiB0byBWTEMgZW5jb2RlICovCisgICAgVUNoYXIgICBwcmVkaWN0ZWRNQlszODRdOyAgIC8qIHNjcmF0aCBtZW1vcnkgZm9yIHByZWRpY3RlZCB2YWx1ZSAqLworICAgIFJ1bkxldmVsQmxvY2sgUkxCWzZdOyAgICAgICAvKiBSdW4gYW5kIExldmVsIG9mIGNvZWZmaWNpZW50cyEgKi8KKyAgICBTaG9ydCAgIGRhdGFCbG9ja1sxMjhdOyAgICAgLyogRENUIGJsb2NrIGRhdGEgYmVmb3JlIGFuZCBhZnRlciBxdWFudC9kZXF1YW50Ki8KKworICAgIFVDaGFyICAgYml0bWFwcm93WzhdOyAgICAgICAvKiBOZWVkIHRvIGtlZXAgaXQgZm9yIEFDRENQcmVkaWN0aW9uLCA4IGJ5dGVzIGZvciBhbGlnbm1lbnQsIG5lZWQgb25seSA2ICovCisgICAgVUNoYXIgICBiaXRtYXBjb2xbNl1bOF07CisgICAgVUludCAgICBiaXRtYXB6els2XVsyXTsgLyogZm9yIHppZ3phZyBiaXRtYXAgKi8KKyAgICBJbnQgICAgIHplcm9NVjsgICAgICAgICAvKiBmbGFnIGZvciB6ZXJvIE1WICovCisKKyAgICBJbnQgICAgIHVzZVByZXZRUDsgICAgICAvKiBmbGFnIGZvciBpbnRyYURDVmxjVGhyZXNob2xkIHN3aXRjaCBkZWNpc2lvbiAqLworICAgIEludCAgICAgUVBfcHJldjsgICAgICAgICAgICAvKiB1c2UgZm9yIERRVUFOVCBjYWxjdWxhdGlvbiAqLworICAgIEludCAgICAgKmFjUHJlZEZsYWc7ICAgICAgICAvKiAqLworICAgIHR5cGVEQ1N0b3JlICAgICAqcHJlZERDOyAgICAgICAgLyogVGhlIERDIGNvZWZmcyBmb3IgZWFjaCBNQiAqLworICAgIHR5cGVEQ0FDU3RvcmUgICAqcHJlZERDQUNfcm93OworICAgIHR5cGVEQ0FDU3RvcmUgICAqcHJlZERDQUNfY29sOworCisKKyAgICBVQ2hhciAgICpzbGljZU5vOyAgICAgICAgICAgLyogU2xpY2UgTnVtYmVyIGZvciBlYWNoIE1CICovCisKKyAgICBJbnQgICAgIGhlYWRlcl9iaXRzOyAgICAgICAgLyogaGVhZGVyIGJpdHMgaW4gZnJtYWUgKi8KKyAgICBIZWFkZXJJbmZvRW5jVmlkZW8gIGhlYWRlckluZm87IC8qIE1CIEhlYWRlciBpbmZvcm1hdGlvbiAqLworICAgIFVDaGFyICAgenpfZGlyZWN0aW9uOyAgICAgICAvKiBkaXJlY3Rpb24gb2YgemlnemFnIHNjYW4gKi8KKyAgICBVQ2hhciAgICpRUE1COyAgICAgICAgICAgICAgLyogUXVhbnRpemVyIHZhbHVlIGZvciBlYWNoIE1CICovCisKKyAgICAvKiBNaXNjZWxsYW5lb3VzIGRhdGEgcG9pbnRzIHRvIGJlIHBhc3NlZCAqLworICAgIGZsb2F0ICAgRnJhbWVSYXRlOyAgICAgICAgICAvKiBTcmMgZnJhbWUgUmF0ZSAqLworCisgICAgVUxvbmcgICBuZXh0TW9kVGltZTsgICAgICAgIC8qIGV4cGVjdGVkIG5leHQgZnJhbWUgdGltZSAqLworICAgIFVJbnQgICAgcHJldkZyYW1lTnVtWzRdOyAgICAvKiBwcmV2aW91cyBmcmFtZSBudW1iZXIgc3RhcnRpbmcgZnJvbSBtb2RUaW1lUmVmICovCisgICAgVUludCAgICBtb2RUaW1lUmVmOyAgICAgLyogUmVmZXJlbmNlIG1vZFRpbWUgdXBkYXRlIGV2ZXJ5IEktVm9wKi8KKyAgICBVSW50ICAgIHJlZlRpY2tbNF07ICAgICAgICAgLyogc2Vjb25kIGFsaWduZWQgcmVmZXJlbmMgdGljayAqLworICAgIEludCAgICAgcmVsTGF5ZXJDb2RlVGltZVs0XTsvKiBOZXh0IGNvZGluZyB0aW1lIGZvciBlYWNoIExheWVyIHJlbGF0aXZlIHRvIGhpZ2hlc3QgbGF5ZXIgKi8KKworICAgIFVMb25nICAgbW9kVGltZTsgICAgICAgICAgICAvKiBJbnB1dCBmcmFtZSBtb2RUaW1lICovCisgICAgSW50ICAgICBjdXJyTGF5ZXI7ICAgICAgICAgIC8qIEN1cnJlbnQgZnJhbWUgbGF5ZXIgICovCisgICAgSW50ICAgICBtYm51bTsgICAgICAgICAgICAgIC8qICBNYWNyb2Jsb2NrIG51bWJlciAqLworCisgICAgLyogc2xpY2UgY29kaW5nLCBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgICBWb3AgICAgICp0ZW1wRm9yd1JlZlZvcDsKKyAgICBJbnQgICAgIHRlbXBSZWZTZWxDb2RlOworICAgIEludCAgICAgZW5kX29mX2J1ZjsgICAgICAgICAvKiBlbmQgb2YgYml0c3RyZWFtIGJ1ZmZlciBmbGFnICovCisgICAgSW50ICAgICBzbGljZV9jb2Rpbmc7ICAgICAgIC8qIGZsYWcgZm9yIHNsaWNlIGJhc2VkIGNvZGluZyAqLworICAgIEludCAgICAgdG90YWxTQUQ7ICAgICAgICAgICAvKiBTbyBmYXIgdG90YWwgU0FEIGZvciBhIGZyYW1lICovCisgICAgSW50ICAgICBudW1JbnRyYTsgICAgICAgICAgIC8qIFNvIGZhciBudW1iZXIgb2YgSW50cmEgTUIgKi8KKyAgICBJbnQgICAgIG9mZnNldDsgICAgICAgICAgICAgLyogU28gZmFyIE1CIG9mZnNldCAqLworICAgIEludCAgICAgaW5kX3gsIGluZF95OyAgICAgICAvKiBTbyBmYXIgTUIgY29vcmRpbmF0ZSAqLworICAgIEludCAgICAgY29sbGVjdDsKKyAgICBJbnQgICAgIGhwX2d1ZXNzOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBIaW50VHJhY2tJbmZvIGhpbnRUcmFja0luZm87ICAgIC8qIGhpbnRUcmFja0luZm8gKi8KKyAgICAvKiBJbnRyYVBlcmlvZCwgVGltZXN0YW1wLCBldGMuICovCisgICAgZmxvYXQgICAgICAgbmV4dEVuY0lWb3A7ICAgIC8qIGNvdW50ZXIgdGlsIHRoZSBuZXh0IEktVm9wICovCisgICAgZmxvYXQgICAgICAgbnVtVm9wc0luR09QOyAgIC8qIHZhbHVlIGF0IHRoZSBiZWdpbm5pbmcgb2YgbmV4dEVuY0lWb3AgKi8KKworICAgIC8qIHBsYXRmb3JtIGRlcGVuZGVudCBmdW5jdGlvbnMgKi8KKyAgICBGdW5jUHRyICAgICAqZnVuY3Rpb25Qb2ludGVyOyAgIC8qIHN0cnVjdHVyZSBjb250YWluaW5nIHBsYXRmb3JtIGRlcGVuZGVudCBmdW5jdGlvbnMgKi8KKworICAgIC8qIEFwcGxpY2F0aW9uIGNvbnRyb2xzICovCisgICAgVmlkZW9FbmNDb250cm9scyAgICAqdmlkZW9FbmNDb250cm9sczsKKyAgICBWaWRlb0VuY1BhcmFtcyAgICAgICplbmNQYXJhbXM7CisKKyAgICBNdWx0aVBhc3MgKnBNUFs0XTsgLyogZm9yIG11bHRpcGFzcyBlbmNvZGluZywgNCByZXByZXNlbnRzIDQgbGF5ZXIgZW5jb2RpbmcgKi8KKworfSBWaWRlb0VuY0RhdGE7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICBWTEMgc3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgdGFnVkxDdGFibGUKK3sKKyAgICB1bnNpZ25lZCBpbnQgY29kZTsgLyogcmlnaHQganVzdGlmaWVkICovCisgICAgaW50IGxlbjsKK30gVkxDdGFibGUsICpMUFZMQ3RhYmxlOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICBBcHByb3ggRENUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHN0cnVjdF9hcHByb3hEQ1QgIGFwcHJveERDVDsKK3N0cnVjdCBzdHJ1Y3RfYXBwcm94RENUCit7CisgICAgVm9pZCgqQmxvY2tEQ1Q4eDgpKEludCAqLCBJbnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50LCBJbnQpOworICAgIFZvaWQoKkJsb2NrRENUOHg4SW50cmEpKEludCAqLCBJbnQgKiwgVUNoYXIgKiwgVUNoYXIgKiwgSW50LCBJbnQpOworICAgIFZvaWQoKkJsb2NrRENUOHg4d1N1YikoSW50ICosIEludCAqLCBVQ2hhciAqLCBVQ2hhciAqLCBJbnQsIEludCk7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgUVAgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBRUHN0cnVjdAoreworICAgIEludCBRUHgyIDsKKyAgICBJbnQgUVA7CisgICAgSW50IFFQZGl2MjsKKyAgICBJbnQgUVB4MnBsdXM7CisgICAgSW50IEFkZGl0aW9uOworfTsKKworCisjZW5kaWYgLyogX01QNExJQl9JTlRfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxNDljMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKQEAgLTAsMCArMSw4ODUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVmLmgiCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgInJhdGVfY29udHJvbC5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW1faW8uaCIKKyNpbmNsdWRlICJtNHZlbmNfb3NjbC5oIgorCit2b2lkIHRhcmdldEJpdENhbGN1bGF0aW9uKHZvaWQgKmlucHV0KTsKK3ZvaWQgY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcyh2b2lkICp2aWRlbyk7Cit2b2lkIHVwZGF0ZVJhdGVDb250cm9sKHJhdGVDb250cm9sICpyYywgVmlkZW9FbmNEYXRhICp2aWRlbyk7Cit2b2lkIHVwZGF0ZVJDX1Bvc3RQcm9jKHJhdGVDb250cm9sICpyYywgVmlkZW9FbmNEYXRhICp2aWRlbyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKioqKioqKioqKioqICBSQyBBUElzIHRvIGNvcmUgZW5jb2RpbmcgbW9kdWxlcyAgKioqKioqKioqKioqKioqKioqKgorCitQVl9TVEFUVVMgUkNfSW5pdGlhbGl6ZSh2b2lkICp2aWRlbyk7CitQVl9TVEFUVVMgUkNfQ2xlYW51cChyYXRlQ29udHJvbCAqcmNbXSxJbnQgbnVtTGF5ZXJzKTsKK1BWX1NUQVRVUyBSQ19Wb3BRUFNldHRpbmcoVmlkZW9FbmNEYXRhICp2aWRlbyxyYXRlQ29udHJvbCAqcmNbXSk7CitQVl9TVEFUVVMgUkNfVm9wVXBkYXRlU3RhdChWaWRlb0VuY0RhdGEgKnZpZGVvLHJhdGVDb250cm9sICpyY1tdKTsKK1BWX1NUQVRVUyBSQ19VcGRhdGVCdWZmZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllciwgSW50IG51bV9za2lwKTsKK0ludCAgICAgICBSQ19HZXRTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sSW50IGN1cnJMYXllcik7Cit2b2lkICAgICAgUkNfUmVzZXRTa2lwTmV4dEZyYW1lKHZvaWQgKnZpZGVvLEludCBjdXJyTGF5ZXIpOworCitQVl9TVEFUVVMgUkNfVXBkYXRlQlhSQ1BhcmFtcyh2b2lkICppbnB1dCk7ICBQYXJhbWV0ZXJzIHVwZGF0ZSBmb3IgdGFyZ2V0IGJpdHJhdGUgb3IgZnJhbWVyYXRlIGNoYW5nZQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqIEFQSSBwYXJ0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGVhY2ggc2VxdWVuY2UqLworCitQVl9TVEFUVVMgUkNfSW5pdGlhbGl6ZSh2b2lkICppbnB1dCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKSBpbnB1dDsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICByYXRlQ29udHJvbCAqKnJjID0gdmlkZW8tPnJjOworICAgIEludCBudW1MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7CisgICAgSW50ICpMYXllckJpdFJhdGUgPSBlbmNQYXJhbXMtPkxheWVyQml0UmF0ZTsKKyAgICBmbG9hdCAqTGF5ZXJGcmFtZVJhdGUgPSBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlOworICAgIE11bHRpUGFzcyAqKnBNUCA9IHZpZGVvLT5wTVA7CisKKyAgICBJbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCBudW1MYXllcnM7IG4rKykKKyAgICB7CisgICAgICAgIC8qIHJhdGUgY29udHJvbCAqLworICAgICAgICByY1tuXS0+ZmluZV9mcmFtZV9za2lwID0gZW5jUGFyYW1zLT5GaW5lRnJhbWVTa2lwX0VuYWJsZWQ7CisgICAgICAgIHJjW25dLT5ub19mcmFtZV9za2lwID0gZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkOworICAgICAgICByY1tuXS0+bm9fcHJlX3NraXAgPSBlbmNQYXJhbXMtPk5vUHJlU2tpcF9FbmFibGVkOworICAgICAgICByY1tuXS0+c2tpcF9uZXh0X2ZyYW1lID0gMDsgLyogbXVzdCBiZSBpbml0aWFsaXplZCAqLworCisgICAgICAgIC8vcmNbbl0tPlRNTl9USCA9IChJbnQpKChmbG9hdClMYXllckJpdFJhdGVbbl0vTGF5ZXJGcmFtZVJhdGVbbl0pOworICAgICAgICByY1tuXS0+QnMgPSB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplW25dOworICAgICAgICByY1tuXS0+VE1OX1cgPSAwOworICAgICAgICByY1tuXS0+VkJWX2Z1bGxuZXNzID0gKEludCkocmNbbl0tPkJzICogMC41KTsgLyogcmNbbl0tPkJzICovCisgICAgICAgIHJjW25dLT5lbmNvZGVkX2ZyYW1lcyA9IDA7CisgICAgICAgIHJjW25dLT5mcmFtZXJhdGUgPSBMYXllckZyYW1lUmF0ZVtuXTsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmNbbl0tPlRNTl9USCA9IChJbnQpKChmbG9hdClMYXllckJpdFJhdGVbbl0gLyBMYXllckZyYW1lUmF0ZVtuXSk7CisgICAgICAgICAgICByY1tuXS0+Yml0cmF0ZSA9IExheWVyQml0UmF0ZVtuXTsKKyAgICAgICAgICAgIHJjW25dLT5mcmFtZXJhdGUgPSBMYXllckZyYW1lUmF0ZVtuXTsKKworICAgICAgICAgICAgLy8gRm9yIGgyNjMgb3Igc2hvcnQgaGVhZGVyIG1vZGUsIHRoZSBiaXQgdmFyaWF0aW9uIGlzIHdpdGhpbiAoLTIqUm1heCoxMDAxLzMwMDAsIDIqUm1heCoxMDAxLzMwMDApCisgICAgICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtID0gKEludCkoKHJjW25dLT5CcyAtIHZpZGVvLT5lbmNQYXJhbXMtPm1heEZyYW1lU2l6ZSkgLyAyIC8gKHJjW25dLT5iaXRyYXRlIC8gcmNbbl0tPmZyYW1lcmF0ZSAvIDEwLjApKSAtIDU7CisgICAgICAgICAgICAgICAgaWYgKHJjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtIDwgMCkgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAvLyBNUEVHLTQgbm9ybWFsIG1vZGVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoSW50KSgoZmxvYXQpKHJjW25dLT5CcyAtIHJjW25dLT5WQlZfZnVsbG5lc3MpIC8gKChmbG9hdClMYXllckJpdFJhdGVbbl0gLyBMYXllckZyYW1lUmF0ZVtuXSAvIDEwLjApKSAtIDU7CisgICAgICAgICAgICAgICAgaWYgKHJjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtIDwgMCkgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gKz0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChMYXllckZyYW1lUmF0ZVtuXSAtIExheWVyRnJhbWVSYXRlW24tMV0gPiAwKSAvKiAgNy8zMS8wMyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjW25dLT5UTU5fVEggPSAoSW50KSgoZmxvYXQpKExheWVyQml0UmF0ZVtuXSAtIExheWVyQml0UmF0ZVtuLTFdKSAvIChMYXllckZyYW1lUmF0ZVtuXSAtIExheWVyRnJhbWVSYXRlW24tMV0pKTsKKyAgICAgICAgICAgICAgICByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSA9IChJbnQpKChmbG9hdCkocmNbbl0tPkJzIC0gcmNbbl0tPlZCVl9mdWxsbmVzcykgKiAxMCAvICgoZmxvYXQpcmNbbl0tPlRNTl9USCkpIC0gNTsKKyAgICAgICAgICAgICAgICBpZiAocmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPCAwKSByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgIC8qICA3LzMxLzAzICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPlRNTl9USCA9IDEgPDwgMzA7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNbbl0tPmJpdHJhdGUgPSBMYXllckJpdFJhdGVbbl0gLSBMYXllckJpdFJhdGVbbi0xXTsKKyAgICAgICAgICAgIHJjW25dLT5mcmFtZXJhdGUgPSBMYXllckZyYW1lUmF0ZVtuXSAtIExheWVyRnJhbWVSYXRlW24tMV07CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgYnVmZmVyIGZ1bGxuZXNzCisgICAgICAgIGlmICgxKSAvLyF2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpICB7IC8vIE1QRUctNAorICAgICAgICB7CisgICAgICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoZSBpbml0aWFsIGJ1ZmZlciBmdWxsbmVzcyBuZWVkcyB0byBiZSBzZXQgdG8gMS8zICovCisgICAgICAgICAgICByY1tuXS0+VkJWX2Z1bGxuZXNzID0gKEludCkocmNbbl0tPkJzIC8gMy4wIC0gcmNbbl0tPkJzIC8gMi4wKTsgLyogdGhlIGJ1ZmZlciByYW5nZSBpcyBbLUJzLzIsIEJzLzJdICovCisgICAgICAgICAgICBwTVBbbl0tPmNvdW50ZXJfQlRzcmMgPSAoSW50KSgocmNbbl0tPkJzIC8gMi4wIC0gcmNbbl0tPkJzIC8gMy4wKSAvIChyY1tuXS0+Yml0cmF0ZSAvIHJjW25dLT5mcmFtZXJhdGUgLyAxMC4wKSk7CisgICAgICAgICAgICByY1tuXS0+VE1OX1cgPSAoSW50KShyY1tuXS0+VkJWX2Z1bGxuZXNzICsgcE1QW25dLT5jb3VudGVyX0JUc3JjICogKHJjW25dLT5iaXRyYXRlIC8gcmNbbl0tPmZyYW1lcmF0ZSAvIDEwLjApKTsKKworICAgICAgICAgICAgcmNbbl0tPmxvd19ib3VuZCA9IC1yY1tuXS0+QnMgLyAyOworICAgICAgICAgICAgcmNbbl0tPiBWQlZfZnVsbG5lc3Nfb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgLyogdGhpcyBwYXJ0IGRvZXNuJ3Qgd29yayBpbiBzb21lIGNhc2VzLCB0aGUgbG93X2JvdW5kIGlzIHRvbyBoaWdoLCBKYW4gNCwyMDA2ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjW25dLT5WQlZfZnVsbG5lc3MgPSAgcmNbbl0tPkJzIC0gKEludCkodmlkZW8tPmVuY1BhcmFtcy0+VkJWX2RlbGF5ICogcmNbbl0tPmJpdHJhdGUpOworICAgICAgICAgICAgaWYgKHJjW25dLT5WQlZfZnVsbG5lc3MgPCAwKSByY1tuXS0+VkJWX2Z1bGxuZXNzID0gMDsKKyAgICAgICAgICAgIC8vcmNbbl0tPlZCVl9mdWxsbmVzcyA9IChyY1tuXS0+QnMtdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplKS8yICsgdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplOworCisgICAgICAgICAgICByY1tuXS0+VkJWX2Z1bGxuZXNzIC09IHJjW25dLT5CcyAvIDI7IC8qIHRoZSBidWZmZXIgcmFuZ2UgaXMgWy1Ccy8yLCBCcy8yXSAqLworICAgICAgICAgICAgcmNbbl0tPmxvd19ib3VuZCA9IC1yY1tuXS0+QnMgLyAyICsgdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplOyAgLyogIHRvbyBoaWdoICovCisgICAgICAgICAgICByY1tuXS0+VkJWX2Z1bGxuZXNzX29mZnNldCA9IHZpZGVvLT5lbmNQYXJhbXMtPm1heEZyYW1lU2l6ZSAvIDI7IC8qICBkb24ndCB1bmRlcnN0YW5kIHRoZSBtZWFuaW5nIG9mIHRoaXMgKi8KKyAgICAgICAgICAgIHBNUFtuXS0+Y291bnRlcl9CVGRzdCA9IHBNUFtuXS0+Y291bnRlcl9CVHNyYyA9IDA7CisKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldHRpbmcgdGhlIGJpdHJhdGUgYW5kIGZyYW1lcmF0ZSAqLworICAgICAgICBwTVBbbl0tPmJpdHJhdGUgPSByY1tuXS0+Yml0cmF0ZTsKKyAgICAgICAgcE1QW25dLT5mcmFtZXJhdGUgPSByY1tuXS0+ZnJhbWVyYXRlOworICAgICAgICBwTVBbbl0tPnRhcmdldF9iaXRzX3Blcl9mcmFtZSA9IHBNUFtuXS0+Yml0cmF0ZSAvIHBNUFtuXS0+ZnJhbWVyYXRlOworCisgICAgfQorCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBSQ19DbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEyLzIwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogZnJlZSBSYXRlIENvbnRyb2wgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitQVl9TVEFUVVMgUkNfQ2xlYW51cChyYXRlQ29udHJvbCAqcmNbXSwgSW50IG51bUxheWVycykKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcocmMpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhudW1MYXllcnMpOworCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFJDX1ZvcFFQU2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xMS8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBSZXNldCByYXRlIGNvbnRyb2wgYmVmb3JlIGNvZGluZyBWT1AsIG1vdmVkIGZyb20gdm9wLmMgICAgICAgKi8KKy8qICAgICAgICAgICAgICBDb21wdXRlIFFQIGZvciB0aGUgd2hvbGUgVk9QIGFuZCBpbml0aWFsaXplIE1CLWJhc2VkIFJDCisgICAgICAgICAgICAgICAgcmVzZXQgUVBNQltdLCBjdXJyVm9wLT5xdWFudGl6ZXIsIHJjLT5FYywgdmlkZW8tPmhlYWRlcl9iaXRzICovCisvKiB0byAgICAgICAgICBJbiBvcmRlciB0byAgd29yayBSQ19Wb3BRUFNldHRpbmcgaGFzIHRvIGRvIHRoZSBmb2xsb3dpbmdzCisgICAgICAgICAgICAgICAgMS4gU2V0IHZpZGVvLT5RUE1CIG9mIGFsbCBtYWNyb2Jsb2Nrcy4KKyAgICAgICAgICAgICAgICAyLiBTZXQgY3VyclZvcC0+cXVhbnRpemVyCisgICAgICAgICAgICAgICAgMy4gUmVzZXQgdmlkZW8tPmhlYWRlcl9iaXRzIHRvIHplcm8uCisgICAgICAgICAgICAgICAgNC4gSW5pdGlhbGl6ZSBpbnRlcm5hbCBSQyBwYXJhbWV0ZXJzIGZvciBWb3AgY29vZGluZyAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogVG8gYmUgbW92ZWQgdG8gcmF0ZV9jb250cm9sLmMgYW5kIHNlcGFyYXRlIGJldHdlZW4gQlhfUkMgYW5kIEFOTkVYX0wgICAgICovCisKK1BWX1NUQVRVUyBSQ19Wb3BRUFNldHRpbmcoVmlkZW9FbmNEYXRhICp2aWRlbywgcmF0ZUNvbnRyb2wgKnByY1tdKQoreworICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyNpZmRlZiBURVNUX01CQkFTRURfUVAKKyAgICBpbnQgaTsKKyNlbmRpZgorCisgICAgcmF0ZUNvbnRyb2wgKnJjID0gdmlkZW8tPnJjW2N1cnJMYXllcl07CisgICAgTXVsdGlQYXNzICpwTVAgPSB2aWRlby0+cE1QW2N1cnJMYXllcl07CisKKyAgICBPU0NMX1VOVVNFRF9BUkcocHJjKTsKKworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EpCisgICAgeworICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5RUE1CLCBjdXJyVm9wLT5xdWFudGl6ZXIsIHNpemVvZihVQ2hhcikqY3VyclZvbC0+blRvdGFsTUIpOworICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBpZiAodmlkZW8tPnJjW2N1cnJMYXllcl0tPmVuY29kZWRfZnJhbWVzID09IDApIC8qIHJjW2N1cnJMYXllcl0tPnRvdGFsRnJhbWVOdW1iZXIqLworICAgICAgICB7CisgICAgICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5RUE1CLCBjdXJyVm9wLT5xdWFudGl6ZXIsIHNpemVvZihVQ2hhcikqY3VyclZvbC0+blRvdGFsTUIpOworICAgICAgICAgICAgdmlkZW8tPnJjW2N1cnJMYXllcl0tPlFjID0gdmlkZW8tPmVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFtjdXJyTGF5ZXJdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcygodm9pZCopIHZpZGVvKTsKKyAgICAgICAgICAgIGN1cnJWb3AtPnF1YW50aXplciA9IHZpZGVvLT5yY1tjdXJyTGF5ZXJdLT5RYzsKKyNpZmRlZiBURVNUX01CQkFTRURfUVAKKyAgICAgICAgICAgIGkgPSBjdXJyVm9sLT5uVG90YWxNQjsgIC8qIHRlc3RpbmcgY2hhbmdpbmcgUVAgYXQgTUIgbGV2ZWwgKi8KKyAgICAgICAgICAgIHdoaWxlIChpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICB2aWRlby0+UVBNQltpXSA9IChpICYgMSkgPyBjdXJyVm9wLT5xdWFudGl6ZXIgLSAxIDogY3VyclZvcC0+cXVhbnRpemVyICsgMTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5RUE1CLCBjdXJyVm9wLT5xdWFudGl6ZXIsIHNpemVvZihVQ2hhcikqY3VyclZvbC0+blRvdGFsTUIpOworI2VuZGlmCisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgPSAwOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBwTVAtPmZyYW1lUG9zICovCisgICAgaWYgKCsrcE1QLT5mcmFtZVBvcyA9PSBwTVAtPmZyYW1lUmFuZ2UpIHBNUC0+ZnJhbWVQb3MgPSAwOworCisgICAgaWYgKHJjLT5UID09IDApCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSAoSW50KSh2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVt2aWRlby0+Y3VyckxheWVyXSAqIDcuNSArIDAuNSk7IC8qIDAuNzVzIHRpbWUgZnJhbWUgKi8KKyAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gUFZfTUlOKHBNUC0+Y291bnRlcl9CVGRzdCwgKEludCkocmMtPm1heF9CaXRWYXJpYW5jZV9udW0gLyAyICogMC40MCkpOyAvKiAwLjc1cyB0aW1lIGZyYW1lIG1heSBnbyBiZXlvbmQgVkJWIGJ1ZmZlciBpZiB3ZSBzZXQgdGhlIGJ1ZmZlciBzaXplIHNtYWxsZXIgdGhhbiAwLjc1cyAqLworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSBQVl9NQVgocE1QLT5jb3VudGVyX0JUZHN0LCAoSW50KSgocmMtPkJzIC8gMiAtIHJjLT5WQlZfZnVsbG5lc3MpICogMC4zMCAvIChyYy0+VE1OX1RIIC8gMTAuMCkgKyAwLjUpKTsgLyogQXQgbGVhc3QgMzAlIG9mIFZCViBidWZmZXIgc2l6ZS8yICovCisgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IFBWX01JTihwTVAtPmNvdW50ZXJfQlRkc3QsIDIwKTsgLyogTGltaXQgdGhlIHRhcmdldCB0byBiZSBzbWFsbGVyIHRoYW4gM0MgKi8KKworICAgICAgICBwTVAtPnRhcmdldF9iaXRzID0gcmMtPlQgPSByYy0+VE1OX1RIID0gKEludCkocmMtPlRNTl9USCAqICgxLjAgKyBwTVAtPmNvdW50ZXJfQlRkc3QgKiAwLjEpKTsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSBwTVAtPmNvdW50ZXJfQlRkc3Q7CisgICAgfQorCisgICAgLyogY29sbGVjdCB0aGUgbmVjZXNzYXJ5IGRhdGE6IHRhcmdldCBiaXRzLCBhY3R1YWwgYml0cywgbWFkIGFuZCBRUCAqLworICAgIHBNUC0+dGFyZ2V0X2JpdHMgPSByYy0+VDsKKyAgICBwTVAtPlFQICA9IGN1cnJWb3AtPnF1YW50aXplcjsKKworICAgIHBNUC0+bWFkID0gdmlkZW8tPnN1bU1BRCAvIChmbG9hdCljdXJyVm9sLT5uVG90YWxNQjsKKyAgICBpZiAocE1QLT5tYWQgPCBNQURfTUlOKSBwTVAtPm1hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisKKyAgICBwTVAtPmJpdHJhdGUgPSByYy0+Yml0cmF0ZTsgLyogY2FsY3VsYXRlZCBpbiBSQ1ZvcFFQU2V0dGluZyAqLworICAgIHBNUC0+ZnJhbWVyYXRlID0gcmMtPmZyYW1lcmF0ZTsKKworICAgIC8qIGZpcnN0IHBhc3MgZW5jb2RpbmcgKi8KKyAgICBwTVAtPm5SZV9RdWFudGl6ZWQgPSAwOworCisgICAgcmV0dXJuICBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogU2F2ZVJEU2FtcGxlcygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogU2F2ZSBRUCwgYWN0dWFsX2JpdHMsIG1hZCBhbmQgUl9EIG9mIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWb2lkIFNhdmVSRFNhbXBsZXMoTXVsdGlQYXNzICpwTVAsIEludCBjb3VudGVyX3NhbXBsZXMpCit7CisgICAgLyogZm9yIHBNUC0+cFJEU2FtcGxlcyAqLworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLlFQICAgID0gcE1QLT5RUDsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5hY3R1YWxfYml0cyA9IHBNUC0+YWN0dWFsX2JpdHM7CisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10ubWFkICAgPSBwTVAtPm1hZDsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5SX0QgPSAoZmxvYXQpKHBNUC0+YWN0dWFsX2JpdHMgLyAocE1QLT5tYWQgKyAwLjAwMDEpKTsKKworICAgIHJldHVybiA7Cit9CisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFJDX1ZvcFVwZGF0ZVN0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTIvMjAvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBVcGRhdGUgc3RhdGlzdGljcyBmb3IgcmF0ZSBjb250cm9sIGFmdGVyIGVuY29kaW5nIGVhY2ggVk9QLiAgKi8KKy8qICAgICAgICAgICAgIE5vIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGluIFZpZGVvRW5jRGF0YSBzdHJ1Y3R1cmUuICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBSQ19Wb3BVcGRhdGVTdGF0KFZpZGVvRW5jRGF0YSAqdmlkZW8sIHJhdGVDb250cm9sICpyYykKK3sKKyAgICBJbnQgY3VyckxheWVyID0gdmlkZW8tPmN1cnJMYXllcjsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgTXVsdGlQYXNzICpwTVAgPSB2aWRlby0+cE1QW2N1cnJMYXllcl07CisgICAgSW50IGRpZmZfQlRDb3VudGVyOworCisgICAgc3dpdGNoICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlKQorICAgIHsKKyAgICAgICAgY2FzZSBDT05TVEFOVF9ROgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDQlJfMToKKyAgICAgICAgY2FzZSBDQlJfMjoKKyAgICAgICAgY2FzZSBWQlJfMToKKyAgICAgICAgY2FzZSBWQlJfMjoKKyAgICAgICAgY2FzZSBDQlJfTE9XREVMQVk6CisKKyAgICAgICAgICAgIHBNUC0+YWN0dWFsX2JpdHMgPSBjdXJyVm9sLT5zdHJlYW0tPmJ5dGVDb3VudCA8PCAzOworCisgICAgICAgICAgICBTYXZlUkRTYW1wbGVzKHBNUCwgMCk7CisKKyAgICAgICAgICAgIHBNUC0+ZW5jb2RlZF9mcmFtZXMrKzsKKworICAgICAgICAgICAgLyogZm9yIHBNUC0+c2FtcGxlc1BlckZyYW1lICovCisgICAgICAgICAgICBwTVAtPnNhbXBsZXNQZXJGcmFtZVtwTVAtPmZyYW1lUG9zXSA9IDA7CisKKyAgICAgICAgICAgIHBNUC0+c3VtX1FQICs9IHBNUC0+UVA7CisKKworICAgICAgICAgICAgLyogdXBkYXRlIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisgICAgICAgICAgICAvKiByZS1hbGxvY2F0ZSB0aGUgdGFyZ2V0IGJpdCBhZ2FpbiBhbmQgdGhlbiBzdG9wIGVuY29kaW5nICovCisgICAgICAgICAgICBkaWZmX0JUQ291bnRlciA9IChJbnQpKChmbG9hdCkocmMtPlRNTl9USCAtIHJjLT5UTU5fVyAtIHBNUC0+YWN0dWFsX2JpdHMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBNUC0+Yml0cmF0ZSAvIChwTVAtPmZyYW1lcmF0ZSArIDAuMDAwMSkgKyAwLjAwMDEpIC8gMC4xKTsKKyAgICAgICAgICAgIGlmIChkaWZmX0JUQ291bnRlciA+PSAwKQorICAgICAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSBkaWZmX0JUQ291bnRlcjsgLyogcE1QLT5hY3R1YWxfYml0cyBpcyBzbWFsbGVyICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0IC09IGRpZmZfQlRDb3VudGVyOyAvKiBwTVAtPmFjdHVhbF9iaXRzIGlzIGJpZ2dlciAqLworCisgICAgICAgICAgICByYy0+VE1OX1RIIC09IChJbnQpKChmbG9hdClwTVAtPmJpdHJhdGUgLyAocE1QLT5mcmFtZXJhdGUgKyAwLjAwMDEpICogKGRpZmZfQlRDb3VudGVyICogMC4xKSk7CisgICAgICAgICAgICByYy0+VCA9IHBNUC0+dGFyZ2V0X2JpdHMgPSByYy0+VE1OX1RIIC0gcmMtPlRNTl9XOworICAgICAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgLT0gZGlmZl9CVENvdW50ZXI7CisKKyAgICAgICAgICAgIHJjLT5SYyA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50IDw8IDM7ICAgLyogVG90YWwgQml0cyBmb3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgcmMtPkhjID0gdmlkZW8tPmhlYWRlcl9iaXRzOyAgICAvKiBUb3RhbCBCaXRzIGluIEhlYWRlciBhbmQgTW90aW9uIFZlY3RvciAqLworCisgICAgICAgICAgICAvKiBCWF9SQyAqLworICAgICAgICAgICAgdXBkYXRlUmF0ZUNvbnRyb2wocmMsIHZpZGVvKTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogLyogZm9yIGNhc2UgQ0JSXzEvMiwgVkJSXzEvMiAqLworCisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICB9CisKKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFJDX0dldFNraXBOZXh0RnJhbWUsIFJDX0dldFJlbWFpbmluZ1ZvcHMgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMi8yMC8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyBhY2Nlc3MgUkMgcGFyYW1ldGVycyBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlLiAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitJbnQgUkNfR2V0U2tpcE5leHRGcmFtZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKQoreworICAgIHJldHVybiB2aWRlby0+cmNbY3VyckxheWVyXS0+c2tpcF9uZXh0X2ZyYW1lOworfQorCit2b2lkIFJDX1Jlc2V0U2tpcE5leHRGcmFtZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKQoreworCisgICAgdmlkZW8tPnJjW2N1cnJMYXllcl0tPnNraXBfbmV4dF9mcmFtZSA9IDA7CisgICAgcmV0dXJuIDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBSQ19VcGRhdGVCdWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAyLzIwLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFVwZGF0ZSBSQyBpbiBjYXNlIG9mIHRoZXJlIGFyZSBmcmFtZXMgc2tpcHBlZCAoY2FtZXJhIGZyZWV6ZSkqLworLyogICAgICAgICAgICAgIGZyb20gdGhlIGFwcGxpY2F0aW9uIGxldmVsIGluIGFkZGl0aW9uIHRvIHdoYXQgUkMgcmVxdWVzdGVkICovCisvKiAgSW4vb3V0ICAgOiBOciwgQiwgUnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitQVl9TVEFUVVMgUkNfVXBkYXRlQnVmZmVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIsIEludCBudW1fc2tpcCkKK3sKKyAgICByYXRlQ29udHJvbCAqcmMgID0gdmlkZW8tPnJjW2N1cnJMYXllcl07CisgICAgTXVsdGlQYXNzICAgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKKworICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUlMOworCisgICAgcmMtPlZCVl9mdWxsbmVzcyAgIC09IChJbnQpKHJjLT5iaXRyYXRlIC8gcmMtPmZyYW1lcmF0ZSAqIG51bV9za2lwKTsgLy9yY1tjdXJyTGF5ZXJdLT5ScDsKKyAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gMTAgKiBudW1fc2tpcDsKKworICAgIC8qIENoZWNrIGJ1ZmZlciB1bmRlcmZsb3cgKi8KKyAgICBpZiAocmMtPlZCVl9mdWxsbmVzcyA8IHJjLT5sb3dfYm91bmQpCisgICAgeworICAgICAgICByYy0+VkJWX2Z1bGxuZXNzID0gcmMtPmxvd19ib3VuZDsgLy8gLXJjLT5Ccy8yOworICAgICAgICByYy0+VE1OX1cgPSByYy0+VkJWX2Z1bGxuZXNzIC0gcmMtPmxvd19ib3VuZDsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjID0gcE1QLT5jb3VudGVyX0JUZHN0ICsgKEludCkoKGZsb2F0KShyYy0+QnMgLyAyIC0gcmMtPmxvd19ib3VuZCkgLyAyLjAgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOworICAgIH0KKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUkNfVXBkYXRlQlhSQ1BhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFVwZGF0ZSBSQyBwYXJhbWV0ZXJzIHNwZWNpZmljYWxseSBmb3IgdGFyZ2V0IGJpdHJhdGUgb3IgICAgICAqLworLyogICAgICAgICAgICAgZnJhbWVyYXRlIHVwZGF0ZSBkdXJpbmcgYW4gZW5jb2Rpbmcgc2Vzc2lvbiAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIFJDX1VwZGF0ZUJYUkNQYXJhbXModm9pZCAqaW5wdXQpCit7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKikgaW5wdXQ7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisgICAgcmF0ZUNvbnRyb2wgKipyYyA9IHZpZGVvLT5yYzsKKyAgICBJbnQgbnVtTGF5ZXJzID0gZW5jUGFyYW1zLT5uTGF5ZXJzOworICAgIEludCAqTGF5ZXJCaXRSYXRlID0gZW5jUGFyYW1zLT5MYXllckJpdFJhdGU7CisgICAgZmxvYXQgKkxheWVyRnJhbWVSYXRlID0gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZTsKKyAgICBNdWx0aVBhc3MgKipwTVAgPSB2aWRlby0+cE1QOworCisgICAgSW50IG4sIFZCVl9mdWxsbmVzczsKKyAgICBJbnQgZGlmZl9jb3VudGVyOworCisgICAgZXh0ZXJuIEJvb2wgU2V0UHJvZmlsZV9CdWZmZXJTaXplKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGZsb2F0IGRlbGF5LCBJbnQgYkluaXRpYWxpemVkKTsKKworCisgICAgLyogUmVzZXQgdmlkZW8gYnVmZmVyIHNpemUgZHVlIHRvIHRhcmdldCBiaXRyYXRlIGNoYW5nZSAqLworICAgIFNldFByb2ZpbGVfQnVmZmVyU2l6ZSh2aWRlbywgdmlkZW8tPmVuY1BhcmFtcy0+VkJWX2RlbGF5LCAwKTsgLyogb3V0cHV0OiB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplW10gKi8KKworICAgIGZvciAobiA9IDA7IG4gPCBudW1MYXllcnM7IG4rKykKKyAgICB7CisgICAgICAgIC8qIFJlbWFpbmluZyBzdHVmZiBhYm91dCBmcmFtZSBkcm9wcGluZyBhbmQgdW5kZXJmbG93IGNoZWNrIGluIHVwZGF0ZSBSQyAqLworICAgICAgICB1cGRhdGVSQ19Qb3N0UHJvYyhyY1tuXSwgdmlkZW8pOworICAgICAgICByY1tuXS0+c2tpcF9uZXh0X2ZyYW1lID0gMDsgLyogbXVzdCBiZSBpbml0aWFsaXplZCAqLworCisgICAgICAgIC8qIE5ldyBjaGFuZ2VzOiBiaXRyYXRlIGFuZCBmcmFtZXJhdGUsIEJzLCBtYXhfQml0VmFyaWFuY2VfbnVtLCBUTU5fVEgob3B0aW9uYWwpLCBlbmNvZGVkX2ZyYW1lcyhvcHRpb25hbCkgKi8KKyAgICAgICAgcmNbbl0tPkJzID0gdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVtuXTsKKyAgICAgICAgVkJWX2Z1bGxuZXNzID0gKEludCkocmNbbl0tPkJzICogMC41KTsKKworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByY1tuXS0+VE1OX1RIID0gKEludCkoKGZsb2F0KUxheWVyQml0UmF0ZVtuXSAvIExheWVyRnJhbWVSYXRlW25dKTsKKyAgICAgICAgICAgIHJjW25dLT5iaXRyYXRlICAgPSBwTVBbbl0tPmJpdHJhdGUgICA9IExheWVyQml0UmF0ZVtuXTsKKyAgICAgICAgICAgIHJjW25dLT5mcmFtZXJhdGUgPSBwTVBbbl0tPmZyYW1lcmF0ZSA9IExheWVyRnJhbWVSYXRlW25dOworCisgICAgICAgICAgICAvLyBGb3IgaDI2MyBvciBzaG9ydCBoZWFkZXIgbW9kZSwgdGhlIGJpdCB2YXJpYXRpb24gaXMgd2l0aGluICgtMipSbWF4KjEwMDEvMzAwMCwgMipSbWF4KjEwMDEvMzAwMCkKKyAgICAgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoSW50KSgocmNbbl0tPkJzIC0gdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplKSAvIDIgLyAocmNbbl0tPmJpdHJhdGUgLyByY1tuXS0+ZnJhbWVyYXRlIC8gMTAuMCkpIC0gNTsKKyAgICAgICAgICAgICAgICAvL3JjW25dLT5tYXhfQml0VmFyaWFuY2VfbnVtID0gKEludCkoKGZsb2F0KShyY1tuXS0+QnMgLSByY1tuXS0+VkJWX2Z1bGxuZXNzKS8oKGZsb2F0KUxheWVyQml0UmF0ZVtuXS9MYXllckZyYW1lUmF0ZVtuXS8xMC4wKSktNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAvLyBNUEVHLTQgbm9ybWFsIG1vZGVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoSW50KSgoZmxvYXQpKHJjW25dLT5CcyAtIFZCVl9mdWxsbmVzcykgKiAxMCAvICgoZmxvYXQpTGF5ZXJCaXRSYXRlW25dIC8gTGF5ZXJGcmFtZVJhdGVbbl0pKSAtIDU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTGF5ZXJGcmFtZVJhdGVbbl0gLSBMYXllckZyYW1lUmF0ZVtuLTFdID4gMCkgLyogIDcvMzEvMDMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByY1tuXS0+VE1OX1RIID0gKEludCkoKGZsb2F0KShMYXllckJpdFJhdGVbbl0gLSBMYXllckJpdFJhdGVbbi0xXSkgLyAoTGF5ZXJGcmFtZVJhdGVbbl0gLSBMYXllckZyYW1lUmF0ZVtuLTFdKSk7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAoSW50KSgoZmxvYXQpKHJjW25dLT5CcyAtIFZCVl9mdWxsbmVzcykgKiAxMCAvICgoZmxvYXQpcmNbbl0tPlRNTl9USCkpIC0gNTsKKyAgICAgICAgICAgICAgICBpZiAocmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPCAwKSByY1tuXS0+bWF4X0JpdFZhcmlhbmNlX251bSArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgIC8qICA3LzMxLzAzICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmNbbl0tPlRNTl9USCA9IDEgPDwgMzA7CisgICAgICAgICAgICAgICAgcmNbbl0tPm1heF9CaXRWYXJpYW5jZV9udW0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNbbl0tPmJpdHJhdGUgICA9IHBNUFtuXS0+Yml0cmF0ZSAgID0gTGF5ZXJCaXRSYXRlW25dIC0gTGF5ZXJCaXRSYXRlW24tMV07CisgICAgICAgICAgICByY1tuXS0+ZnJhbWVyYXRlID0gcE1QW25dLT5mcmFtZXJhdGUgPSBMYXllckZyYW1lUmF0ZVtuXSAtIExheWVyRnJhbWVSYXRlW24tMV07CisgICAgICAgIH0KKworICAgICAgICBwTVBbbl0tPnRhcmdldF9iaXRzX3Blcl9mcmFtZV9wcmV2ID0gcE1QW25dLT50YXJnZXRfYml0c19wZXJfZnJhbWU7CisgICAgICAgIHBNUFtuXS0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lID0gcE1QW25dLT5iaXRyYXRlIC8gKGZsb2F0KShwTVBbbl0tPmZyYW1lcmF0ZSArIDAuMDAwMSk7ICAvKiAgNy8zMS8wMyAqLworCisgICAgICAgIC8qIHJjW25dLT5WQlZfZnVsbG5lc3MgYW5kIHJjW25dLT5UTU5fVyBzaG91bGQgYmUga2VwdCBzYW1lICovCisgICAgICAgIC8qIHVwZGF0ZSBwTVBbbl0tPmNvdW50ZXJfQlRkc3QgYW5kIHBNUFtuXS0+Y291bnRlcl9CVHNyYyAgICovCisgICAgICAgIGRpZmZfY291bnRlciA9IChJbnQpKChmbG9hdCkocmNbbl0tPlZCVl9mdWxsbmVzcyAtIHJjW25dLT5UTU5fVykgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1QW25dLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCArIDAuMDAwMSkpOyAvKiAgNy8zMS8wMyAqLworCisgICAgICAgIHBNUFtuXS0+Y291bnRlcl9CVGRzdCA9IHBNUFtuXS0+Y291bnRlcl9CVHNyYyA9IDA7CisgICAgICAgIGlmIChkaWZmX2NvdW50ZXIgPiAwKQorICAgICAgICAgICAgcE1QW25dLT5jb3VudGVyX0JUZHN0ID0gZGlmZl9jb3VudGVyOworCisgICAgICAgIGVsc2UgaWYgKGRpZmZfY291bnRlciA8IDApCisgICAgICAgICAgICBwTVBbbl0tPmNvdW50ZXJfQlRzcmMgPSAtZGlmZl9jb3VudGVyOworCisgICAgICAgIHJjW25dLT5UTU5fVyA9IChJbnQpKHJjW25dLT5WQlZfZnVsbG5lc3MgLSAgICAgIC8qIHJlLWNhbGN1bGF0ZSByY1tuXS0+VE1OX1cgaW4gb3JkZXIgZm9yIGhpZ2hlciBhY2N1cmFjeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1QW25dLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkgKiAocE1QW25dLT5jb3VudGVyX0JUZHN0IC0gcE1QW25dLT5jb3VudGVyX0JUc3JjKSk7CisKKyAgICAgICAgLyogS2VlcCB0aGUgY3VycmVudCBhdmVyYWdlIG1hZCAqLworICAgICAgICBpZiAocE1QW25dLT5hdmVyX21hZCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwTVBbbl0tPmF2ZXJfbWFkX3ByZXYgPSBwTVBbbl0tPmF2ZXJfbWFkOworICAgICAgICAgICAgcE1QW25dLT5lbmNvZGVkX2ZyYW1lc19wcmV2ID0gcE1QW25dLT5lbmNvZGVkX2ZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIHBNUFtuXS0+YXZlcl9tYWQgPSAwOworICAgICAgICBwTVBbbl0tPm92ZXJsYXBwZWRfd2luX3NpemUgPSA0OworCisgICAgICAgIC8qIE1pc2MgKi8KKyAgICAgICAgcE1QW25dLT5zdW1fbWFkID0gcE1QW25dLT5zdW1fUVAgPSAwOworICAgICAgICAvL3BNUFtuXS0+ZW5jb2RlZF9mcmFtZXNfcHJldiA9IHBNUFtuXS0+ZW5jb2RlZF9mcmFtZXM7CisgICAgICAgIHBNUFtuXS0+ZW5jb2RlZF9mcmFtZXMgPSBwTVBbbl0tPnJlX2VuY29kZWRfZnJhbWVzID0gcE1QW25dLT5yZV9lbmNvZGVkX3RpbWVzID0gMDsKKworICAgIH0gLyogZW5kIG9mOiBmb3Iobj0wOyBuPG51bUxheWVyczsgbisrKSAqLworCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7CisKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogdGFyZ2V0Qml0Q2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEwLzAxLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBxdWFkcmF0aWMgYml0IGFsbG9jYXRpb24gbW9kZWw6IFQobikgPSBDKnNxcnQobWFkKG4pL2F2ZXJfbWFkKG4tMSkpICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IHJjLT5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24odm9pZCAqaW5wdXQpCit7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKikgaW5wdXQ7CisgICAgTXVsdGlQYXNzICpwTVAgPSB2aWRlby0+cE1QW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgcmF0ZUNvbnRyb2wgKnJjID0gdmlkZW8tPnJjW3ZpZGVvLT5jdXJyTGF5ZXJdOworCisgICAgZmxvYXQgY3Vycl9tYWQ7Ly8sIGF2ZXJhZ2VfbWFkOworICAgIEludCBkaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCwgcHJldl9jb3VudGVyX2RpZmYsIGN1cnJfY291bnRlcl9kaWZmLCBib3VuZDsKKyAgICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgZm9yIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisKKyAgICBpZiAodmlkZW8gPT0gTlVMTCB8fCBjdXJyVm9sID09IE5VTEwgfHwgcE1QID09IE5VTEwgfHwgcmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogc29tZSBzdHVmZiBhYm91dCBmcmFtZSBkcm9wcGluZyByZW1haW5lZCBoZXJlIHRvIGJlIGRvbmUgYmVjYXVzZSBwTVAgY2Fubm90IGJlIGluc2VydGVkIGludG8gdXBkYXRlUmF0ZUNvbnRyb2woKSovCisgICAgdXBkYXRlUkNfUG9zdFByb2MocmMsIHZpZGVvKTsKKworICAgIC8qIHVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMgYW5kIHBNUC0+Y291bnRlcl9CVGRzdCB0byBhdm9pZCBpbnRlcmdlciBvdmVyZmxvdyAqLworICAgIGlmIChwTVAtPmNvdW50ZXJfQlRzcmMgPiAxMDAwICYmIHBNUC0+Y291bnRlcl9CVGRzdCA+IDEwMDApCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgLT0gMTAwMDsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0IC09IDEwMDA7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiB0YXJnZXQgY2FsY3VsYXRpb24gKi8KKyAgICBjdXJyX21hZCA9IHZpZGVvLT5zdW1NQUQgLyAoZmxvYXQpY3VyclZvbC0+blRvdGFsTUI7CisgICAgaWYgKGN1cnJfbWFkIDwgTUFEX01JTikgY3Vycl9tYWQgPSBNQURfTUlOOyAvKiBNQURfTUlOIGlzIGRlZmluZWQgYXMgMSBpbiBtcDRkZWYuaCAqLworICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IGRpZmZfY291bnRlcl9CVGRzdCA9IDA7CisgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSAwOworCisKKyAgICAvKjEuY2FsY3VsYXRlIGF2ZXJhZ2UgbWFkICovCisgICAgcE1QLT5zdW1fbWFkICs9IGN1cnJfbWFkOworICAgIC8vYXZlcmFnZV9tYWQgPSAocE1QLT5lbmNvZGVkX2ZyYW1lcyA8IDEgPyBjdXJyX21hZCA6IHBNUC0+c3VtX21hZC8oZmxvYXQpKHBNUC0+ZW5jb2RlZF9mcmFtZXMrMSkpOyAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzY29uZCBlbmNvZGVkIGZyYW1lKi8KKyAgICAvL3BNUC0+YXZlcl9tYWQgPSBhdmVyYWdlX21hZDsKKyAgICBpZiAocE1QLT5lbmNvZGVkX2ZyYW1lcyA+PSAwKSAvKiBwTVAtPmVuY29kZWRfZnJhbWVzIGlzIHNldCB0byAtMSBpbml0aWFsbHksIHNvIGZvcmdldCBhYm91dCB0aGUgdmVyeSBmaXJzdCBJIGZyYW1lICovCisgICAgICAgIHBNUC0+YXZlcl9tYWQgPSAocE1QLT5hdmVyX21hZCAqIHBNUC0+ZW5jb2RlZF9mcmFtZXMgKyBjdXJyX21hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lcyArIDEpOworCisgICAgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA+IDAgJiYgcE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ID49IDApICAvKiAgNy8zMS8wMyAqLworICAgICAgICBwTVAtPmF2ZXJfbWFkX3ByZXYgPSAocE1QLT5hdmVyX21hZF9wcmV2ICogcE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ICsgY3Vycl9tYWQpIC8gKHBNUC0+ZW5jb2RlZF9mcmFtZXNfcHJldiArIDEpOworCisgICAgLyoyLmF2ZXJhZ2VfbWFkLCBtYWQgPT0+IGRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0ICovCisgICAgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA9PSAwKQorICAgIHsKKyAgICAgICAgLyogb3JpZ2luYWwgdmVyaXNvbiAqLworICAgICAgICBpZiAoY3Vycl9tYWQgPiBwTVAtPmF2ZXJfbWFkKjEuMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpID4gMikKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoSW50KShNNFZFTkNfU1FSVChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUZHN0ID0gKEludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZCkqMitjdXJyX21hZC9wTVAtPmF2ZXJfbWFkKS8oMyowLjEpICsgMC40KSAtIDEwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChJbnQpKGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWQgKyAwLjAwMDEpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBjdXJyX21hZCA8PSBhdmVyYWdlX21hZCoxLjEgKi8KKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoSW50KSgoc3FydChjdXJyX21hZC9wTVAtPmF2ZXJfbWFkKSArIHBvdyhjdXJyX21hZC9wTVAtPmF2ZXJfbWFkLCAxLjAvMy4wKSkvKDIuMCowLjEpICsgMC40KTsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKEludCkoTTRWRU5DX1NRUlQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkpICogMTAgKyAwLjUpOworICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKEludCkoY3Vycl9tYWQvcE1QLT5hdmVyX21hZC8wLjEgKyAwLjUpCisKKyAgICAgICAgLyogYWN0aXZlbHkgZmlsbCBpbiB0aGUgcG9zc2libGUgZ2FwICovCisgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMgPT0gMCAmJiBkaWZmX2NvdW50ZXJfQlRkc3QgPT0gMCAmJgorICAgICAgICAgICAgICAgIGN1cnJfbWFkIDw9IHBNUC0+YXZlcl9tYWQqMS4xICYmIHBNUC0+Y291bnRlcl9CVHNyYyA8IHBNUC0+Y291bnRlcl9CVGRzdCkKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDE7CisKKyAgICB9CisgICAgZWxzZSBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID4gMCkKKyAgICB7CisgICAgICAgIC8qIHRyYW5zaXRpb24gdGltZTogdXNlIHByZXZpb3VzIGF2ZXJhZ2UgbWFkICJwTVAtPmF2ZXJfbWFkX3ByZXYiIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgYXZlcmFnZSBtYWQgInBNUC0+YXZlcl9tYWQiICovCisgICAgICAgIGlmIChjdXJyX21hZCA+IHBNUC0+YXZlcl9tYWRfcHJldioxLjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyX21hZCAvIHBNUC0+YXZlcl9tYWRfcHJldiA+IDIpCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKEludCkoTTRWRU5DX1NRUlQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUZHN0ID0gKEludCkoKE00VkVOQ19TUVJUKGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldikqMitjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYpLygzKjAuMSkgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKEludCkoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xICovCisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKEludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2KSArIHBvdyhjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYsIDEuMC8zLjApKS8oMi4wKjAuMSkgKyAwLjQpOworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoSW50KShNNFZFTkNfU1FSVChjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkX3ByZXYgKyAwLjAwMDEpKSAqIDEwICsgMC41KTsKKyAgICAgICAgLy9kaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChJbnQpKGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldi8wLjEgKyAwLjUpCisKKyAgICAgICAgLyogYWN0aXZlbHkgZmlsbCBpbiB0aGUgcG9zc2libGUgZ2FwICovCisgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMgPT0gMCAmJiBkaWZmX2NvdW50ZXJfQlRkc3QgPT0gMCAmJgorICAgICAgICAgICAgICAgIGN1cnJfbWFkIDw9IHBNUC0+YXZlcl9tYWRfcHJldioxLjEgJiYgcE1QLT5jb3VudGVyX0JUc3JjIDwgcE1QLT5jb3VudGVyX0JUZHN0KQorICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTsKKworICAgICAgICBpZiAoLS1wTVAtPm92ZXJsYXBwZWRfd2luX3NpemUgPD0gMCkgICAgcE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID0gMDsKKyAgICB9CisKKworICAgIC8qIGlmIGRpZmZlcmVuY2UgaXMgdG9vIG11Y2gsIGRvIGNsaXBwaW5nICovCisgICAgLyogRmlyc3QsIHNldCB0aGUgdXBwZXIgYm91bmQgZm9yIGN1cnJlbnQgYml0IGFsbG9jYXRpb24gdmFyaWFuY2U6IDgwJSBvZiBhdmFpbGFibGUgYnVmZmVyICovCisgICAgYm91bmQgPSAoSW50KSgocmMtPkJzIC8gMiAtIHJjLT5WQlZfZnVsbG5lc3MpICogMC42IC8gKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lIC8gMTApKTsgLyogcmMtPkJzICovCisgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gIFBWX01JTihkaWZmX2NvdW50ZXJfQlRzcmMsIGJvdW5kKTsKKyAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAgUFZfTUlOKGRpZmZfY291bnRlcl9CVGRzdCwgYm91bmQpOworCisgICAgLyogU2Vjb25kLCBzZXQgYW5vdGhlciB1cHBlciBib3VuZCBmb3IgY3VycmVudCBiaXQgYWxsb2NhdGlvbjogNC01KmJpdHJhdGUvZnJhbWVyYXRlICovCisgICAgYm91bmQgPSA1MDsKKy8vICBpZih2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl9MT1dERUxBWSkKKy8vICBub3QgbmVjZXNzYXJ5ICAgICAgIGJvdW5kID0gMTA7ICAgICAvKiAgMS8xNy8wMiAtLSBGb3IgTG93IGRlbGF5ICovCisKKyAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAgUFZfTUlOKGRpZmZfY291bnRlcl9CVHNyYywgYm91bmQpOworICAgIGRpZmZfY291bnRlcl9CVGRzdCA9ICBQVl9NSU4oZGlmZl9jb3VudGVyX0JUZHN0LCBib3VuZCk7CisKKworICAgIC8qIFRoaXJkLCBjaGVjayB0aGUgYnVmZmVyICovCisgICAgcHJldl9jb3VudGVyX2RpZmYgPSBwTVAtPmNvdW50ZXJfQlRkc3QgLSBwTVAtPmNvdW50ZXJfQlRzcmM7CisgICAgY3Vycl9jb3VudGVyX2RpZmYgPSBwcmV2X2NvdW50ZXJfZGlmZiArIChkaWZmX2NvdW50ZXJfQlRkc3QgLSBkaWZmX2NvdW50ZXJfQlRzcmMpOworCisgICAgaWYgKFBWX0FCUyhwcmV2X2NvdW50ZXJfZGlmZikgPj0gcmMtPm1heF9CaXRWYXJpYW5jZV9udW0gfHwgUFZfQUJTKGN1cnJfY291bnRlcl9kaWZmKSA+PSByYy0+bWF4X0JpdFZhcmlhbmNlX251bSkgLy8gUFZfQUJTKGN1cnJfY291bnRlcl9kaWZmKSA+PSBQVl9BQlMocHJldl9jb3VudGVyX2RpZmYpICkKKyAgICB7ICAgLy9kaWZmX2NvdW50ZXJfQlRzcmMgPSBkaWZmX2NvdW50ZXJfQlRkc3QgPSAwOworCisgICAgICAgIGlmIChjdXJyX2NvdW50ZXJfZGlmZiA+IHJjLT5tYXhfQml0VmFyaWFuY2VfbnVtICYmIGRpZmZfY291bnRlcl9CVGRzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKHJjLT5tYXhfQml0VmFyaWFuY2VfbnVtIC0gcHJldl9jb3VudGVyX2RpZmYpICsgZGlmZl9jb3VudGVyX0JUc3JjOworICAgICAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVGRzdCA8IDApIGRpZmZfY291bnRlcl9CVGRzdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBlbHNlIGlmIChjdXJyX2NvdW50ZXJfZGlmZiA8IC1yYy0+bWF4X0JpdFZhcmlhbmNlX251bSAmJiBkaWZmX2NvdW50ZXJfQlRzcmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IGRpZmZfY291bnRlcl9CVGRzdCAtICgtcmMtPm1heF9CaXRWYXJpYW5jZV9udW0gLSBwcmV2X2NvdW50ZXJfZGlmZik7CisgICAgICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjIDwgMCkgZGlmZl9jb3VudGVyX0JUc3JjID0gMDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyozLmRpZmZfY291bnRlcl9CVHNyYywgZGlmZl9jb3VudGVyX0JUZHN0ID09PiBUTU5fVEggKi8KKyAgICAvL3JjLT5UTU5fVEggPSAoSW50KSgoZmxvYXQpcE1QLT5iaXRyYXRlL3BNUC0+ZnJhbWVyYXRlKTsKKyAgICByYy0+VE1OX1RIID0gKEludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUpOworICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gMDsKKworICAgIGlmIChkaWZmX2NvdW50ZXJfQlRzcmMpCisgICAgeworICAgICAgICByYy0+VE1OX1RIIC09IChJbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lICogZGlmZl9jb3VudGVyX0JUc3JjICogMC4xKTsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSAtZGlmZl9jb3VudGVyX0JUc3JjOworICAgIH0KKyAgICBlbHNlIGlmIChkaWZmX2NvdW50ZXJfQlRkc3QpCisgICAgeworICAgICAgICByYy0+VE1OX1RIICs9IChJbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lICogZGlmZl9jb3VudGVyX0JUZHN0ICogMC4xKTsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXIgPSBkaWZmX2NvdW50ZXJfQlRkc3Q7CisgICAgfQorCisKKyAgICAvKjQudXBkYXRlIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IGRpZmZfY291bnRlcl9CVHNyYzsKKyAgICBwTVAtPmNvdW50ZXJfQlRkc3QgKz0gZGlmZl9jb3VudGVyX0JUZHN0OworCisKKyAgICAvKjUudGFyZ2V0IGJpdCBjYWxjdWxhdGlvbiAqLworICAgIHJjLT5UID0gcmMtPlRNTl9USCAtIHJjLT5UTU5fVzsKKyAgICAvL3JjLT5UID0gcmMtPlRNTl9USCAtIChJbnQpKChmbG9hdClyYy0+VE1OX1cvcmMtPmZyYW1lUmF0ZSk7CisKKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkICYmIHJjLT5UID4gdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplKQorICAgIHsKKyAgICAgICAgcmMtPlQgPSB2aWRlby0+ZW5jUGFyYW1zLT5tYXhGcmFtZVNpemU7ICAvLyAgYWRkZWQgdGhpcyAxMS8wNy8wNQorICAgIH0KKworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEwLzAxLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiB2YXJpYWJsZSByYXRlIGJpdCBhbGxvY2F0aW9uICsgbmV3IFFQIGRldGVybWluYXRpb24gc2NoZW1lICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6IHJjLT5UIGFuZCByYy0+UWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwordm9pZCBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKHZvaWQgKmlucHV0KQoreworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopIGlucHV0OworICAgIE11bHRpUGFzcyAqcE1QID0gdmlkZW8tPnBNUFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIHJhdGVDb250cm9sICpyYyA9IHZpZGVvLT5yY1t2aWRlby0+Y3VyckxheWVyXTsKKworICAgIEludCBwcmV2X1FQLCBwcmV2X2FjdHVhbF9iaXRzLCBjdXJyX3RhcmdldCwgaSwgajsKKworICAgIGZsb2F0IGN1cnJfbWFkLCBwcmV2X21hZCwgY3Vycl9SRCwgcHJldl9SRCwgYXZlcmFnZV9tYWQsIGF2ZXJfUVA7CisKKworICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKi8KKyAgICB0YXJnZXRCaXRDYWxjdWxhdGlvbigodm9pZCopIHZpZGVvKTsKKworICAgIGlmIChyYy0+VCA8PSAwIHx8IHZpZGVvLT5zdW1NQUQgPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChyYy0+VCA8IDApICByYy0+UWMgPSAzMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogY3VycmVudCBmcmFtZSBRUCBlc3RpbWF0aW9uICovCisgICAgY3Vycl90YXJnZXQgPSByYy0+VDsKKyAgICBjdXJyX21hZCA9IHZpZGVvLT5zdW1NQUQgLyAoZmxvYXQpY3VyclZvbC0+blRvdGFsTUI7CisgICAgaWYgKGN1cnJfbWFkIDwgTUFEX01JTikgY3Vycl9tYWQgPSBNQURfTUlOOyAvKiBNQURfTUlOIGlzIGRlZmluZWQgYXMgMSBpbiBtcDRkZWYuaCAqLworICAgIGN1cnJfUkQgID0gKGZsb2F0KWN1cnJfdGFyZ2V0IC8gY3Vycl9tYWQ7CisKKyAgICAvKiBBbm90aGVyIHZlcnNpb24gb2Ygc2VhcmNoIHRoZSBvcHRpbWFsIHBvaW50ICovCisgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1swXVswXS5hY3R1YWxfYml0czsKKyAgICBwcmV2X21hZCA9IHBNUC0+cFJEU2FtcGxlc1swXVswXS5tYWQ7CisKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHBNUC0+ZnJhbWVSYW5nZTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQgIT0gMCAmJiBwcmV2X21hZCAhPSAwICYmCisgICAgICAgICAgICAgICAgUFZfQUJTKHByZXZfbWFkIC0gY3Vycl9tYWQpID4gUFZfQUJTKHBNUC0+cFJEU2FtcGxlc1tpXVswXS5tYWQgLSBjdXJyX21hZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZfbWFkID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZDsKKyAgICAgICAgICAgIHByZXZfYWN0dWFsX2JpdHMgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0uYWN0dWFsX2JpdHM7CisgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcmV2X1FQID0gcE1QLT5wUkRTYW1wbGVzW2pdWzBdLlFQOworICAgIGZvciAoaSA9IDE7IGkgPCBwTVAtPnNhbXBsZXNQZXJGcmFtZVtqXTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKFBWX0FCUyhwcmV2X2FjdHVhbF9iaXRzIC0gY3Vycl90YXJnZXQpID4gUFZfQUJTKHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5hY3R1YWxfYml0cyAtIGN1cnJfdGFyZ2V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5hY3R1YWxfYml0czsKKyAgICAgICAgICAgIHByZXZfUVAgPSBwTVAtPnBSRFNhbXBsZXNbal1baV0uUVA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBxdWFkcmF0aWMgYXBwcm94aW1hdGlvbgorICAgIHByZXZfUkQgPSAoZmxvYXQpcHJldl9hY3R1YWxfYml0cyAvIHByZXZfbWFkOworICAgIC8vcmMtPlFjID0gKEludCkocHJldl9RUCAqIHNxcnQocHJldl9hY3R1YWxfYml0cy9jdXJyX3RhcmdldCkgKyAwLjQpOworICAgIGlmIChwcmV2X1FQID09IDEpIC8vIDExLzE0LzA1LCBhZGRlZCB0aGlzIHRvIGFsbG93IGdldHRpbmcgb3V0IG9mIFFQID0gMSBlYXNpbHkKKyAgICB7CisgICAgICAgIHJjLT5RYyA9IChJbnQpKHByZXZfUkQgLyBjdXJyX1JEICsgMC41KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmMtPlFjID0gKEludCkocHJldl9RUCAqIE00VkVOQ19TUVJUKHByZXZfUkQgLyBjdXJyX1JEKSArIDAuOSk7CisKKyAgICAgICAgaWYgKHByZXZfUkQgLyBjdXJyX1JEID4gMC41ICYmIHByZXZfUkQgLyBjdXJyX1JEIDwgMi4wKQorICAgICAgICAgICAgcmMtPlFjID0gKEludCkocHJldl9RUCAqIChNNFZFTkNfU1FSVChwcmV2X1JEIC8gY3Vycl9SRCkgKyBwcmV2X1JEIC8gY3Vycl9SRCkgLyAyLjAgKyAwLjkpOyAvKiBRdWFkcmF0aWMgYW5kIGxpbmVhciBhcHByb3hpbWF0aW9uICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJjLT5RYyA9IChJbnQpKHByZXZfUVAgKiAoTTRWRU5DX1NRUlQocHJldl9SRCAvIGN1cnJfUkQpICsgTTRWRU5DX1BPVyhwcmV2X1JEIC8gY3Vycl9SRCwgMS4wIC8gMy4wKSkgLyAyLjAgKyAwLjkpOworICAgIH0KKyAgICAvL3JjLT5RYyA9KEludCkocHJldl9RUCAqIHNxcnQocHJldl9SRC9jdXJyX1JEKSArIDAuNCk7CisgICAgLy8gMTEvMDgvMDUKKyAgICAvLyBsb3dlciBib3VuZCBvbiBRYyBzaG91bGQgYmUgYSBmdW5jdGlvbiBvZiBjdXJyX21hZAorICAgIC8vIFdoZW4gbWFkIGlzIGFscmVhZHkgbG93LCBsb3dlciBib3VuZCBvbiBRYyBkb2Vzbid0IGhhdmUgdG8gYmUgc21hbGwuCisgICAgLy8gTm90ZSwgdGhpcyBkb2Vzbid0IHdvcmsgd2VsbCBmb3IgbG93IGNvbXBsZXhpdHkgY2xpcCBlbmNvZGVkIGF0IGhpZ2ggYml0IHJhdGUKKyAgICAvLyBpdCBkb2Vzbid0IGhpdCB0aGUgdGFyZ2V0IGJpdCByYXRlIGR1ZSB0byB0aGlzIFFQIGxvd2VyIGJvdW5kLgorLy8vIGlmKChjdXJyX21hZCA8IDgpICYmIChyYy0+UWMgPCAxMikpIHJjLT5RYyA9IDEyOworLy8gIGVsc2UgICAgaWYoKGN1cnJfbWFkIDwgMTI4KSAmJiAocmMtPlFjIDwgMykpIHJjLT5RYyA9IDM7CisKKyAgICBpZiAocmMtPlFjIDwgMSkgcmMtPlFjID0gMTsKKyAgICBpZiAocmMtPlFjID4gMzEpICAgIHJjLT5RYyA9IDMxOworCisKKyAgICAvKiBhY3RpdmUgYml0IHJlc291cmNlIHByb3RlY3Rpb24gKi8KKyAgICBhdmVyX1FQID0gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPT0gMCA/IDAgOiBwTVAtPnN1bV9RUCAvIChmbG9hdClwTVAtPmVuY29kZWRfZnJhbWVzKTsKKyAgICBhdmVyYWdlX21hZCA9IChwTVAtPmVuY29kZWRfZnJhbWVzID09IDAgPyAwIDogcE1QLT5zdW1fbWFkIC8gKGZsb2F0KXBNUC0+ZW5jb2RlZF9mcmFtZXMpOyAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzY29uZCBlbmNvZGVkIGZyYW1lKi8KKyAgICBpZiAocE1QLT5kaWZmX2NvdW50ZXIgPT0gMCAmJgorICAgICAgICAgICAgKChmbG9hdClyYy0+UWMgPD0gYXZlcl9RUCoxLjEgfHwgY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xKSAmJgorICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIDw9IChwTVAtPmNvdW50ZXJfQlRkc3QgKyAoSW50KShwTVAtPmZyYW1lcmF0ZSoxLjAgKyAwLjUpKSkKKyAgICB7CisgICAgICAgIHJjLT5UTU5fVEggLT0gKEludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMC4wKTsKKyAgICAgICAgcmMtPlQgPSByYy0+VE1OX1RIIC0gcmMtPlRNTl9XOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMrKzsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXItLTsKKyAgICB9CisKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IHVwZGF0ZVJhdGVDb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTEvMTcvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOlVwZGF0ZSB0aGUgUkQgTW9kYWwgKEFmdGVyIEVuY29kaW5nIHRoZSBDdXJyZW50IEZyYW1lKSAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIHVwZGF0ZVJhdGVDb250cm9sKHJhdGVDb250cm9sICpyYywgVmlkZW9FbmNEYXRhICp2aWRlbykKK3sKKyAgICBJbnQgIGZyYW1lX2JpdHM7CisKKworICAgIC8qIHJhdGUgY29udHJvXGwgKi8KKyAgICBmcmFtZV9iaXRzID0gKEludCkocmMtPmJpdHJhdGUgLyByYy0+ZnJhbWVyYXRlKTsKKyAgICByYy0+VE1OX1cgKz0gKHJjLT5SYyAtIHJjLT5UTU5fVEgpOworICAgIHJjLT5WQlZfZnVsbG5lc3MgKz0gKHJjLT5SYyAtIGZyYW1lX2JpdHMpOyAvL3JjLT5ScCk7CisgICAgLy9pZihyYy0+VkJWX2Z1bGxuZXNzIDwgMCkgcmMtPlZCVl9mdWxsbmVzcyA9IC0xOworCisgICAgcmMtPmVuY29kZWRfZnJhbWVzKys7CisKKyAgICAvKiBmcmFtZSBkcm9wcGluZyAqLworICAgIHJjLT5za2lwX25leHRfZnJhbWUgPSAwOworCisgICAgaWYgKCh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYgcmMtPlJjID4gdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplKSB8fCAvKiAgRm9yIEgyNjMvc2hvcnQgaGVhZGVyIG1vZGUsIGRyb3AgdGhlIGZyYW1lIGlmIHRoZSBhY3R1YWwgZnJhbWUgc2l6ZSBleGNlZWRzIHRoZSBib3VuZCAqLworICAgICAgICAgICAgKHJjLT5WQlZfZnVsbG5lc3MgPiByYy0+QnMgLyAyICYmICFyYy0+bm9fcHJlX3NraXApKSAvKiBza2lwIHRoZSBjdXJyZW50IGZyYW1lICovIC8qIHJjLT5CcyAqLworICAgIHsKKyAgICAgICAgcmMtPlRNTl9XIC09IChyYy0+UmMgLSByYy0+VE1OX1RIKTsKKyAgICAgICAgcmMtPlZCVl9mdWxsbmVzcyAtPSByYy0+UmM7CisgICAgICAgIHJjLT5za2lwX25leHRfZnJhbWUgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGZsb2F0KShyYy0+VkJWX2Z1bGxuZXNzIC0gcmMtPlZCVl9mdWxsbmVzc19vZmZzZXQpID4gKHJjLT5CcyAvIDIgLSByYy0+VkJWX2Z1bGxuZXNzX29mZnNldCkqMC45NSAmJgorICAgICAgICAgICAgICFyYy0+bm9fZnJhbWVfc2tpcCkgLyogc2tpcCBuZXh0IGZyYW1lICovCisgICAgeworICAgICAgICByYy0+VkJWX2Z1bGxuZXNzIC09IGZyYW1lX2JpdHM7IC8vcmMtPlJwOworICAgICAgICByYy0+c2tpcF9uZXh0X2ZyYW1lID0gMTsKKyAgICAgICAgLyogIHNraXAgbW9yZSB0aGFuIDEgZnJhbWVzICAqLworICAgICAgICAvL3doaWxlKHJjLT5WQlZfZnVsbG5lc3MgPiByYy0+QnMqMC40NzUpCisgICAgICAgIHdoaWxlICgocmMtPlZCVl9mdWxsbmVzcyAtIHJjLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSA+IChyYy0+QnMgLyAyIC0gcmMtPlZCVl9mdWxsbmVzc19vZmZzZXQpKjAuOTUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjLT5WQlZfZnVsbG5lc3MgLT0gZnJhbWVfYml0czsgLy9yYy0+UnA7CisgICAgICAgICAgICByYy0+c2tpcF9uZXh0X2ZyYW1lKys7CisgICAgICAgIH0KKyAgICAgICAgLyogRU5EICAqLworICAgIH0KKworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IHVwZGF0ZVJDX1Bvc3RQcm9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMDgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBSZW1haW5nIFJDIHVwZGF0ZSBzdHVmZiBmb3IgZnJhbWUgc2tpcCBhbmQgYnVmZmVyIHVuZGVyZmxvdyAgKi8KKy8qICAgICAgICAgICAgIGNoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCit2b2lkIHVwZGF0ZVJDX1Bvc3RQcm9jKHJhdGVDb250cm9sICpyYywgVmlkZW9FbmNEYXRhICp2aWRlbykKK3sKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHZpZGVvLT5wTVBbdmlkZW8tPmN1cnJMYXllcl07CisKKyAgICBpZiAocmMtPnNraXBfbmV4dF9mcmFtZSA9PSAxICYmICFyYy0+bm9fZnJhbWVfc2tpcCkgLyogc2tpcCBuZXh0IGZyYW1lICovCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgKz0gMTAgKiByYy0+c2tpcF9uZXh0X2ZyYW1lOworCisgICAgfQorICAgIGVsc2UgaWYgKHJjLT5za2lwX25leHRfZnJhbWUgPT0gLTEgJiYgIXJjLT5ub19wcmVfc2tpcCkgLyogc2tpcCBjdXJyZW50IGZyYW1lICovCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gcE1QLT5kaWZmX2NvdW50ZXI7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMDsKKworICAgICAgICBwTVAtPnN1bV9tYWQgLT0gcE1QLT5tYWQ7CisgICAgICAgIHBNUC0+YXZlcl9tYWQgPSAocE1QLT5hdmVyX21hZCAqIHBNUC0+ZW5jb2RlZF9mcmFtZXMgLSBwTVAtPm1hZCkgLyAoZmxvYXQpKHBNUC0+ZW5jb2RlZF9mcmFtZXMgLSAxICsgMC4wMDAxKTsKKyAgICAgICAgcE1QLT5zdW1fUVAgIC09IHBNUC0+UVA7CisgICAgICAgIHBNUC0+ZW5jb2RlZF9mcmFtZXMgLS07CisgICAgfQorICAgIC8qIHNvbWUgc3R1ZmYgaW4gdXBkYXRlIFZCVl9mdWxsbmVzcyByZW1haW5zIGhlcmUgKi8KKyAgICAvL2lmKHJjLT5WQlZfZnVsbG5lc3MgPCAtcmMtPkJzLzIpIC8qIHJjLT5CcyAqLworICAgIGlmIChyYy0+VkJWX2Z1bGxuZXNzIDwgcmMtPmxvd19ib3VuZCkKKyAgICB7CisgICAgICAgIHJjLT5WQlZfZnVsbG5lc3MgPSByYy0+bG93X2JvdW5kOyAvLyAtcmMtPkJzLzI7CisgICAgICAgIHJjLT5UTU5fVyA9IHJjLT5WQlZfZnVsbG5lc3MgLSByYy0+bG93X2JvdW5kOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgPSBwTVAtPmNvdW50ZXJfQlRkc3QgKyAoSW50KSgoZmxvYXQpKHJjLT5CcyAvIDIgLSByYy0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjk1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuaApAQCAtMCwwICsxLDk2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBfUkFURV9DT05UUk9MX0hfCisjZGVmaW5lIF9SQVRFX0NPTlRST0xfSF8KKworI2luY2x1ZGUgIm1wNGRlZi5oIgorCit0eXBlZGVmIHN0cnVjdCB0YWdkYXRhUG9pbnRBcnJheQoreworICAgIEludCBRcDsKKyAgICBJbnQgUnA7CisgICAgZmxvYXQgTXA7ICAgLyogZm9yIE1CLWJhc2VkIFJDLCAzLzE0LzAxICovCisgICAgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5ICpuZXh0OworICAgIHN0cnVjdCB0YWdkYXRhUG9pbnRBcnJheSAqcHJldjsKK30gZGF0YVBvaW50QXJyYXk7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJbnQgYWxwaGE7ICAvKiB3ZWlnaHQgZm9yIEkgZnJhbWUgKi8KKyAgICBJbnQgUnM7ICAgICAvKmJpdCByYXRlIGZvciB0aGUgc2VxdWVuY2UgKG9yIHNlZ21lbnQpIGUuZy4sIDI0MDAwIGJpdHMvc2VjICovCisgICAgSW50IFJjOyAgICAgLypiaXRzIHVzZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiBJdCBpcyB0aGUgYml0IGNvdW50IG9idGFpbmVkIGFmdGVyIGVuY29kaW5nLiAqLworICAgIEludCBScDsgICAgIC8qYml0cyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlciBwZXIgcGljdHVyZS4gKi8KKyAgICAvKj8gaXMgdGhpcyB0aGUgYXZlcmFnZSBvbmUsIG9yIGp1c3QgdGhlIGJpdHMgY29kZWQgZm9yIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIEludCBScHM7ICAgIC8qYml0IHRvIGJlIHJlbW92ZWQgZnJvbSBidWZmZXIgcGVyIHNyYyBmcmFtZSAqLworICAgIGZsb2F0IFRzOyAgIC8qbnVtYmVyIG9mIHNlY29uZHMgZm9yIHRoZSBzZXF1ZW5jZSAgKG9yIHNlZ21lbnQpLiBlLmcuLCAxMCBzZWMgKi8KKyAgICBmbG9hdCBFcDsKKyAgICBmbG9hdCBFYzsgICAvKm1lYW4gYWJzb2x1dGUgZGlmZmVyZW5jZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgYWZ0ZXIgbW90aW9uIGNvbXBlbnNhdGlvbi4qLworICAgIC8qSWYgdGhlIG1hY3JvYmxvY2sgaXMgaW50cmEgY29kZWQsIHRoZSBvcmlnaW5hbCBzcGF0aWFsIHBpeGVsIHZhbHVlcyBhcmUgc3VtbWVkLiovCisgICAgSW50IFFjOyAgICAgLypxdWFudGl6YXRpb24gbGV2ZWwgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuICovCisgICAgSW50IE5yOyAgICAgLypudW1iZXIgb2YgUCBmcmFtZXMgcmVtYWluaW5nIGZvciBlbmNvZGluZy4qLworICAgIEludCBScjsgLypudW1iZXIgb2YgYml0cyByZW1haW5pbmcgZm9yIGVuY29kaW5nIHRoaXMgc2VxdWVuY2UgKG9yIHNlZ21lbnQpLiovCisgICAgSW50IFJyX09sZDsvKiAxMi8yNC8wMCAqLworICAgIEludCBUOyAgICAgIC8qdGFyZ2V0IGJpdCB0byBiZSB1c2VkIGZvciB0aGUgY3VycmVudCBmcmFtZS4qLworICAgIEludCBTOyAgICAgIC8qbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgZW5jb2RpbmcgdGhlIHByZXZpb3VzIGZyYW1lLiovCisgICAgSW50IEhjOyAvKmhlYWRlciBhbmQgbW90aW9uIHZlY3RvciBiaXRzIHVzZWQgaW4gdGhlIGN1cnJlbnQgZnJhbWUuIEl0IGluY2x1ZGVzIGFsbCB0aGUgIGluZm9ybWF0aW9uIGV4Y2VwdCB0byB0aGUgcmVzaWR1YWwgaW5mb3JtYXRpb24uKi8KKyAgICBJbnQgSHA7IC8qaGVhZGVyIGFuZCBtb3Rpb24gdmVjdG9yIGJpdHMgdXNlZCBpbiB0aGUgcHJldmlvdXMgZnJhbWUuIEl0IGluY2x1ZGVzIGFsbCB0aGUgICAgIGluZm9ybWF0aW9uIGV4Y2VwdCB0byB0aGUgcmVzaWR1YWwgaW5mb3JtYXRpb24uKi8KKyAgICBJbnQgUWw7IC8qcXVhbnRpemF0aW9uIGxldmVsIHVzZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lICovCisgICAgSW50IEJzOyAvKmJ1ZmZlciBzaXplIGUuZy4sIFIvMiAqLworICAgIEludCBCOyAgICAgIC8qY3VycmVudCBidWZmZXIgbGV2ZWwgZS5nLiwgUi80IC0gc3RhcnQgZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBidWZmZXIgKi8KKyAgICBmbG9hdCBYMTsKKyAgICBmbG9hdCBYMjsKKyAgICBmbG9hdCBYMTE7CisgICAgZmxvYXQgTTsgICAgICAgICAgICAvKnNhZmUgbWFyZ2luIGZvciB0aGUgYnVmZmVyICovCisgICAgZmxvYXQgc21UaWNrOyAgICAvKnJhdGlvIG9mIHNyYyB2ZXJzdXMgZW5jIGZyYW1lIHJhdGUgKi8KKyAgICBkb3VibGUgcmVtbmFudDsgIC8qcmVtYWluZGVyIGZyYW1lIG9mIHNyYy9lbmMgZnJhbWUgZm9yIGZpbmUgZnJhbWUgc2tpcHBpbmcgKi8KKyAgICBJbnQgdGltZUluY1JlczsgLyogdm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiAqLworCisgICAgZGF0YVBvaW50QXJyYXkgICAqZW5kOyAvKnF1YW50aXphdGlvbiBsZXZlbHMgZm9yIHRoZSBwYXN0ICgyMCkgZnJhbWVzICovCisKKyAgICBJbnQgICAgIGZyYW1lTnVtYmVyOyAvKiByYW5naW5nIGZyb20gMCB0byAyMCBub2RlcyovCisgICAgSW50ICAgICB3OworICAgIEludCAgICAgTnJfT3JpZ2luYWw7CisgICAgSW50ICAgICBOcl9PbGQsIE5yX09sZDI7CisgICAgSW50ICAgICBza2lwX25leHRfZnJhbWU7CisgICAgSW50ICAgICBRZGVwOyAgICAgICAvKiBzbW9vdGggUSBhZGp1c3RtZW50ICovCisgICAgSW50ICAgICBmaW5lX2ZyYW1lX3NraXA7CisgICAgSW50ICAgICBWQlJfRW5hYmxlZDsKKyAgICBJbnQgICAgIG5vX2ZyYW1lX3NraXA7CisgICAgSW50ICAgICBub19wcmVfc2tpcDsKKworICAgIEludCB0b3RhbEZyYW1lTnVtYmVyOyAvKiB0b3RhbCBjb2RlZCBmcmFtZXMsIGZvciBkZWJ1Z2dpbmchISovCisKKyAgICBjaGFyICAgIG9GaXJzdFRpbWU7CisKKyAgICAvKiBCWCByYXRlIGNvbnRyb2wgKi8KKyAgICBJbnQgICAgIFRNTl9XOworICAgIEludCAgICAgVE1OX1RIOworICAgIEludCAgICAgVkJWX2Z1bGxuZXNzOworICAgIEludCAgICAgbWF4X0JpdFZhcmlhbmNlX251bTsgLyogdGhlIG51bWJlciBvZiB0aGUgbWF4aW11bSBiaXQgdmFyaWFuY2Ugd2l0aGluIHRoZSBnaXZlbiBidWZmZXIgd2l0aCB0aGUgdW5pdCBvZiAxMCUgb2YgYml0cmF0ZS9mcmFtZXJhdGUqLworICAgIEludCAgICAgZW5jb2RlZF9mcmFtZXM7IC8qIGNvdW50ZXIgZm9yIGFsbCBlbmNvZGVkIGZyYW1lcyAqLworICAgIGZsb2F0ICAgZnJhbWVyYXRlOworICAgIEludCAgICAgYml0cmF0ZTsKKyAgICBJbnQgICAgIGxvd19ib3VuZDsgICAgICAgICAgICAgIC8qIGJvdW5kIGZvciB1bmRlcmZsb3cgZGV0ZWN0aW9uLCB1c3VhbGx5IGxvd19ib3VuZD0tQnMvMiwgYnV0IGNvdWxkIGJlIGNoYW5nZWQgaW4gSC4yNjMgbW9kZSAqLworICAgIEludCAgICAgVkJWX2Z1bGxuZXNzX29mZnNldDsgICAgLyogb2Zmc2V0IG9mIFZCVl9mdWxsbmVzcywgdXN1YWxseSBpcyB6ZXJvLCBidXQgY2FuIGJlIGNoYW5nZWQgaW4gSC4yNjMgbW9kZSovCisgICAgLyogRW5kIEJYICovCisKK30gcmF0ZUNvbnRyb2w7CisKKworI2VuZGlmIC8qIF9SQVRFX0NPTlRST0xfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMThmNDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWQuY3BwCkBAIC0wLDAgKzEsMzc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKworI2luY2x1ZGUgInNhZF9pbmxpbmUuaCIKKworI2RlZmluZSBDYWNoZWRfbHggMTc2CisKKyNpZmRlZiBfU0FEX1NUQVQKK1VMb25nIG51bV9zYWRfTUIgPSAwOworVUxvbmcgbnVtX3NhZF9CbGsgPSAwOworVUxvbmcgbnVtX3NhZF9NQl9jYWxsID0gMDsKK1VMb25nIG51bV9zYWRfQmxrX2NhbGwgPSAwOworCisjZGVmaW5lIE5VTV9TQURfTUJfQ0FMTCgpICAgICAgIG51bV9zYWRfTUJfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfTUIoKSAgICAgICAgICAgIG51bV9zYWRfTUIrKworI2RlZmluZSBOVU1fU0FEX0JMS19DQUxMKCkgICAgICBudW1fc2FkX0Jsa19jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9CTEsoKSAgICAgICAgICAgbnVtX3NhZF9CbGsrKworCisjZWxzZQorCisjZGVmaW5lIE5VTV9TQURfTUJfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfTUIoKQorI2RlZmluZSBOVU1fU0FEX0JMS19DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9CTEsoKQorCisjZW5kaWYKKworCisvKiBjb25zaXN0IG9mCitJbnQgU0FEX01hY3JvYmxvY2tfQyhVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX01CX0hURk1fQ29sbGVjdChVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX01CX0hURk0oVUNoYXIgKnJlZixVQ2hhciAqYmxrLEludCBkbWluLEludCBseCx2b2lkICpleHRyYV9pbmZvKQorSW50IFNBRF9CbG9ja19DKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKK0ludCBTQURfQmxrX1BBRERJTkcoVUNoYXIgKnJlZixVQ2hhciAqY3VyLEludCBkbWluLEludCBseCx2b2lkICpleHRyYV9pbmZvKQorSW50IFNBRF9NQl9QQURESU5HKFVDaGFyICpyZWYsVUNoYXIgKmN1cixJbnQgZG1pbixJbnQgbHgsdm9pZCAqZXh0cmFfaW5mbykKK0ludCBTQURfTUJfUEFEMShVQ2hhciAqcmVmLFVDaGFyICpjdXIsSW50IGRtaW4sSW50IGx4LEludCAqcmVwKTsKK0ludCBTQURfTUJfUEFERElOR19IVEZNX0NvbGxlY3QoVUNoYXIgKnJlZixVQ2hhciAqY3VyLEludCBkbWluLEludCBseCx2b2lkICpleHRyYV9pbmZvKQorSW50IFNBRF9NQl9QQURESU5HX0hURk0oVUNoYXIgKnJlZixVQ2hhciAqY3VyLEludCBkbWluLEludCBseCx2b2lkICp2cHRyKQorKi8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisgICAgSW50IFNBRF9NQl9QQUQxKFVDaGFyICpyZWYsIFVDaGFyICpjdXIsIEludCBkbWluLCBJbnQgbHgsIEludCAqcmVwKTsKKworCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgU0FEX01hY3JvYmxvY2sKKyAgICAgICAgRGF0ZTogICAgICAgMDkvMDcvMjAwMAorICAgICAgICBQdXJwb3NlOiAgICBDb21wdXRlIFNBRCAxNngxNiBiZXR3ZWVuIGJsayBhbmQgcmVmLgorICAgICAgICBUbyBkbzogICAgICBVbmlmb3JtIHN1YnNhbXBsaW5nIHdpbGwgYmUgaW5zZXJ0ZWQgbGF0ZXIhCisgICAgICAgICAgICAgICAgICAgIEh5cG90aGVzaXMgVGVzdGluZyBGYXN0IE1hdGNoaW5nIHRvIGJlIHVzZWQgbGF0ZXIhCisgICAgICAgIENoYW5nZXM6CisgICAgMTEvNy8wMDogICAgIGltcGxlbWVudGVkIE1NWAorICAgIDEvMjQvMDE6ICAgICBpbXBsZW1lbnRlZCBTU0UKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgIC8qKioqKioqKioqIEMgKioqKioqKioqKioqLworICAgIEludCBTQURfTWFjcm9ibG9ja19DKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgaW50MzIgeDEwOworICAgICAgICBJbnQgZG1pbiA9IChVTG9uZylkbWluX2x4ID4+IDE2OworICAgICAgICBJbnQgbHggPSBkbWluX2x4ICYgMHhGRkZGOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhleHRyYV9pbmZvKTsKKworICAgICAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgICAgICB4MTAgPSBzaW1kX3NhZF9tYihyZWYsIGJsaywgZG1pbiwgbHgpOworCisgICAgICAgIHJldHVybiB4MTA7CisgICAgfQorCisjaWZkZWYgSFRGTSAgIC8qIEhURk0gd2l0aCB1bmlmb3JtIHN1YnNhbXBsaW5nIGltcGxlbWVudGF0aW9uLCAyLzI4LzAxICovCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgU0FEX01CX0hURk1fQ29sbGVjdCBhbmQgU0FEX01CX0hURk0KKyAgICAgICAgRGF0ZTogICAgICAgMy8yLzEKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSB0aGUgU0FEIG9uIGEgMTZ4MTYgYmxvY2sgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgdW5pZm9ybSBzdWJzYW1wbGluZyBhbmQgaHlwb3RoZXNpcyB0ZXN0aW5nIGZhc3QgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVhcmx5IGRyb3BvdXQuIFNBRF9NQl9IUF9IVEZNX0NvbGxlY3QgaXMgdG8gY29sbGVjdAorICAgICAgICAgICAgICAgICAgICB0aGUgc3RhdGlzdGljcyB0byBjb21wdXRlIHRoZSB0aHJlc2hvbGRzIHRvIGJlIHVzZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgU0FEX01CX0hQX0hURk0uCisgICAgICAgIElucHV0L091dHB1dDoKKyAgICAgICAgQ2hhbmdlczoKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyAgICBJbnQgU0FEX01CX0hURk1fQ29sbGVjdChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbykKKyAgICB7CisgICAgICAgIEludCBpOworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKnAxOworICAgICAgICBJbnQgbHg0ID0gKGRtaW5fbHggPDwgMikgJiAweDNGRkZDOworICAgICAgICBVTG9uZyBjdXJfd29yZDsKKyAgICAgICAgSW50IHNhZGRhdGFbMTZdLCB0bXAsIHRtcDI7ICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICAgICAgSW50IGRpZm1hZDsKKyAgICAgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICAgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKworICAgICAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgICAgICBibGsgLT0gNDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gbHg0OworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSBseDQ7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBOVU1fU0FEX01CKCk7CisKKyAgICAgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKFVMb25nKXNhZCA+ICgoVUxvbmcpZG1pbl9seCA+PiAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hURk0oVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKnAxOworCisgICAgICAgIEludCBpOworICAgICAgICBJbnQgdG1wLCB0bXAyOworICAgICAgICBJbnQgbHg0ID0gKGRtaW5fbHggPDwgMikgJiAweDNGRkZDOworICAgICAgICBJbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgICAgIEludCAqbnJtbHpfdGggPSAoSW50KikgZXh0cmFfaW5mbzsKKyAgICAgICAgSW50ICpvZmZzZXRSZWYgPSAoSW50KikgZXh0cmFfaW5mbyArIDMyOworICAgICAgICBVTG9uZyBjdXJfd29yZDsKKworICAgICAgICBtYWRzdGFyID0gKFVMb25nKWRtaW5fbHggPj4gMjA7CisKKyAgICAgICAgTlVNX1NBRF9NQl9DQUxMKCk7CisKKyAgICAgICAgYmxrIC09IDQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSBseDQ7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgICAgICBjdXJfd29yZCA9ICooKFVMb25nKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgcDEgKz0gbHg0OworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSBseDQ7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICAgICAgTlVNX1NBRF9NQigpOworCisgICAgICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgICAgICBpZiAoKChVTG9uZylzYWQgPD0gKChVTG9uZylkbWluX2x4ID4+IDE2KSkgJiYgKHNhZCA8PSAoc2Fkc3RhciAtICpucm1sel90aCsrKSkpCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorI2VuZGlmIC8qIEhURk0gKi8KKworI2lmbmRlZiBOT19JTlRFUjRWCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgU0FEX0Jsb2NrCisgICAgICAgIERhdGU6ICAgICAgIDA5LzA3LzIwMDAKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSBTQUQgMTZ4MTYgYmV0d2VlbiBibGsgYW5kIHJlZi4KKyAgICAgICAgVG8gZG86ICAgICAgVW5pZm9ybSBzdWJzYW1wbGluZyB3aWxsIGJlIGluc2VydGVkIGxhdGVyIQorICAgICAgICAgICAgICAgICAgICBIeXBvdGhlc2lzIFRlc3RpbmcgRmFzdCBNYXRjaGluZyB0byBiZSB1c2VkIGxhdGVyIQorICAgICAgICBDaGFuZ2VzOgorICAgIDExLzcvMDA6ICAgICBpbXBsZW1lbnRlZCBNTVgKKyAgICAxLzI0LzAxOiAgICAgaW1wbGVtZW50ZWQgU1NFCisgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgIC8qKioqKioqKioqIEMgKioqKioqKioqKioqLworICAgIEludCBTQURfQmxvY2tfQyhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IGx4LCB2b2lkICopCisgICAgeworICAgICAgICBJbnQgc2FkID0gMDsKKworICAgICAgICBJbnQgaTsKKyAgICAgICAgVUNoYXIgKmlpOworICAgICAgICBJbnQgKmtrOworICAgICAgICBJbnQgdG1wLCB0bXAyLCB0bXAzLCBtYXNrID0gMHhGRjsKKyAgICAgICAgSW50IHdpZHRoID0gKGx4IC0gMzIpOworCisgICAgICAgIE5VTV9TQURfQkxLX0NBTEwoKTsKKworICAgICAgICBpaSA9IHJlZjsKKyAgICAgICAga2sgID0gKEludCopYmxrOyAvKiBhc3N1bWluZyB3b3JkLWFsaWduIGZvciBibGsgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdG1wMyA9IGtrWzFdOworICAgICAgICAgICAgdG1wID0gaWlbN107CisgICAgICAgICAgICB0bXAyID0gKFVJbnQpdG1wMyA+PiAyNDsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gaWlbNl07CisgICAgICAgICAgICB0bXAyID0gKHRtcDMgPj4gMTYpICYgbWFzazsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gaWlbNV07CisgICAgICAgICAgICB0bXAyID0gKHRtcDMgPj4gOCkgJiBtYXNrOworICAgICAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0bXAgPSBpaVs0XTsKKyAgICAgICAgICAgIHRtcDIgPSB0bXAzICYgbWFzazsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wMyA9ICprazsKKyAgICAgICAgICAgIGtrICs9ICh3aWR0aCA+PiAyKTsKKyAgICAgICAgICAgIHRtcCA9IGlpWzNdOworICAgICAgICAgICAgdG1wMiA9IChVSW50KXRtcDMgPj4gMjQ7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IGlpWzJdOworICAgICAgICAgICAgdG1wMiA9ICh0bXAzID4+IDE2KSAmIG1hc2s7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRtcCA9IGlpWzFdOworICAgICAgICAgICAgdG1wMiA9ICh0bXAzID4+IDgpICYgbWFzazsKKyAgICAgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgdG1wID0gKmlpOworICAgICAgICAgICAgaWkgKz0gbHg7CisgICAgICAgICAgICB0bXAyID0gdG1wMyAmIG1hc2s7CisgICAgICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICAgICAgTlVNX1NBRF9CTEsoKTsKKworICAgICAgICAgICAgaWYgKHNhZCA+IGRtaW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZW5kaWYgLyogTk9fSU5URVI0ViAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTY5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKQEAgLTAsMCArMSw4NTUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBjb250YWlucworSW50IEhhbGZQZWwxX1NBRF9NQihVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IHdpZHRoLEludCBpaCxJbnQgamgpCitJbnQgSGFsZlBlbDJfU0FEX01CKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgpCitJbnQgSGFsZlBlbDFfU0FEX0JsayhVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IHdpZHRoLEludCBpaCxJbnQgamgpCitJbnQgSGFsZlBlbDJfU0FEX0JsayhVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IHdpZHRoKQorCitJbnQgU0FEX01CX0hhbGZQZWxfQyhVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IHdpZHRoLEludCByeCxJbnQgeGgsSW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX01CX0hQX0hURk1fQ29sbGVjdChVQ2hhciAqcmVmLFVDaGFyICpibGssSW50IGRtaW4sSW50IHdpZHRoLEludCByeCxJbnQgeGgsSW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitJbnQgU0FEX01CX0hQX0hURk0oVUNoYXIgKnJlZixVQ2hhciAqYmxrLEludCBkbWluLEludCB3aWR0aCxJbnQgcngsSW50IHhoLEludCB5aCx2b2lkICpleHRyYV9pbmZvKQorSW50IFNBRF9CbGtfSGFsZlBlbF9DKFVDaGFyICpyZWYsVUNoYXIgKmJsayxJbnQgZG1pbixJbnQgd2lkdGgsSW50IHJ4LEludCB4aCxJbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKKyovCisKKy8vI2luY2x1ZGUgPHN0ZGxpYi5oPiAvKiBmb3IgUkFORF9NQVggKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiCisjaW5jbHVkZSAic2FkX2hhbGZwZWxfaW5saW5lLmgiCisKKyNpZmRlZiBfU0FEX1NUQVQKK1VMb25nIG51bV9zYWRfSFBfTUIgPSAwOworVUxvbmcgbnVtX3NhZF9IUF9CbGsgPSAwOworVUxvbmcgbnVtX3NhZF9IUF9NQl9jYWxsID0gMDsKK1VMb25nIG51bV9zYWRfSFBfQmxrX2NhbGwgPSAwOworI2RlZmluZSBOVU1fU0FEX0hQX01CX0NBTEwoKSAgICBudW1fc2FkX0hQX01CX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX0hQX01CKCkgICAgICAgICBudW1fc2FkX0hQX01CKysKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEtfQ0FMTCgpICAgbnVtX3NhZF9IUF9CbGtfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLKCkgICAgICAgIG51bV9zYWRfSFBfQmxrKysKKyNlbHNlCisjZGVmaW5lIE5VTV9TQURfSFBfTUJfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfSFBfTUIoKQorI2RlZmluZSBOVU1fU0FEX0hQX0JMS19DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEsoKQorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBGdW5jdGlvbjogICBIYWxmUGVsMV9TQURfTUIKKyAgICAgICAgRGF0ZTogICAgICAgMDMvMjcvMjAwMQorICAgICAgICBQdXJwb3NlOiAgICBDb21wdXRlIFNBRCAxNngxNiBiZXR3ZWVuIGJsayBhbmQgcmVmIGluIGhhbGZwZWwKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiwKKyAgICAgICAgQ2hhbmdlczoKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgLyogT25lIGNvbXBvbmVudCBpcyBoYWxmLXBlbCAqLworICAgIEludCBIYWxmUGVsMV9TQURfTUIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCB3aWR0aCwgSW50IGloLCBJbnQgamgpCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxLCAqcDI7CisgICAgICAgIEludCB0ZW1wOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhqaCk7CisKKyAgICAgICAgcDEgPSByZWY7CisgICAgICAgIGlmIChpaCkgcDIgPSByZWYgKyAxOworICAgICAgICBlbHNlIHAyID0gcmVmICsgd2lkdGg7CisgICAgICAgIGtrICA9IGJsazsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAyW2pdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2FkID4gZG1pbikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICAgICAgcDEgKz0gd2lkdGg7CisgICAgICAgICAgICBwMiArPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIC8qIFR3byBjb21wb25lbnRzIG5lZWQgaGFsZi1wZWwgKi8KKyAgICBJbnQgSGFsZlBlbDJfU0FEX01CKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgd2lkdGgpCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDA7CisgICAgICAgIFVDaGFyICpraywgKnAxLCAqcDIsICpwMywgKnA0OworICAgICAgICBJbnQgdGVtcDsKKworICAgICAgICBwMSA9IHJlZjsKKyAgICAgICAgcDIgPSByZWYgKyAxOworICAgICAgICBwMyA9IHJlZiArIHdpZHRoOworICAgICAgICBwNCA9IHJlZiArIHdpZHRoICsgMTsKKyAgICAgICAga2sgID0gYmxrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyBwM1tqXSArIHA0W2pdICsgMikgPj4gMikgLSAqa2srKzsKKyAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2FkID4gZG1pbikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworCisgICAgICAgICAgICBwMSArPSB3aWR0aDsKKyAgICAgICAgICAgIHAzICs9IHdpZHRoOworICAgICAgICAgICAgcDIgKz0gd2lkdGg7CisgICAgICAgICAgICBwNCArPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2lmbmRlZiBOT19JTlRFUjRWCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgSGFsZlBlbDFfU0FEX0JsaworICAgICAgICBEYXRlOiAgICAgICAwMy8yNy8yMDAxCisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDh4OCBiZXR3ZWVuIGJsayBhbmQgcmVmIGluIGhhbGZwZWwKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi4KKyAgICAgICAgQ2hhbmdlczoKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgLyogT25lIGNvbXBvbmVudCBuZWVkcyBoYWxmLXBlbCAqLworICAgIEludCBIYWxmUGVsMV9TQURfQmxrKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgd2lkdGgsIEludCBpaCwgSW50IGpoKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqa2ssICpwMSwgKnAyOworICAgICAgICBJbnQgdGVtcDsKKworICAgICAgICBPU0NMX1VOVVNFRF9BUkcoamgpOworCisgICAgICAgIHAxID0gcmVmOworICAgICAgICBpZiAoaWgpIHAyID0gcmVmICsgMTsKKyAgICAgICAgZWxzZSBwMiA9IHJlZiArIHdpZHRoOworICAgICAgICBrayAgPSBibGs7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyAxKSA+PiAxKSAtICpraysrOworICAgICAgICAgICAgICAgIHNhZCArPSBQVl9BQlModGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYWQgPiBkbWluKQorICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICBwMSArPSB3aWR0aDsKKyAgICAgICAgICAgIHAyICs9IHdpZHRoOworICAgICAgICAgICAga2sgKz0gODsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKyAgICAvKiBUd28gY29tcG9uZW50cyBuZWVkIGhhbGYtcGVsICovCisgICAgSW50IEhhbGZQZWwyX1NBRF9CbGsoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCB3aWR0aCkKKyAgICB7CisgICAgICAgIEludCBpLCBqOworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKmtrLCAqcDEsICpwMiwgKnAzLCAqcDQ7CisgICAgICAgIEludCB0ZW1wOworCisgICAgICAgIHAxID0gcmVmOworICAgICAgICBwMiA9IHJlZiArIDE7CisgICAgICAgIHAzID0gcmVmICsgd2lkdGg7CisgICAgICAgIHA0ID0gcmVmICsgd2lkdGggKyAxOworICAgICAgICBrayAgPSBibGs7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyBwM1tqXSArIHA0W2pdICsgMikgPj4gMikgLSAqa2srKzsKKyAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2FkID4gZG1pbikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2FkOworCisgICAgICAgICAgICBwMSArPSB3aWR0aDsKKyAgICAgICAgICAgIHAzICs9IHdpZHRoOworICAgICAgICAgICAgcDIgKz0gd2lkdGg7CisgICAgICAgICAgICBwNCArPSB3aWR0aDsKKyAgICAgICAgICAgIGtrICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisjZW5kaWYgLy8gTk9fSU5URVI0VgorICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIEZ1bmN0aW9uOiAgIFNBRF9NQl9IYWxmUGVsCisgICAgICAgIERhdGU6ICAgICAgIDA5LzE3LzIwMDAKKyAgICAgICAgUHVycG9zZTogICAgQ29tcHV0ZSB0aGUgU0FEIG9uIHRoZSBoYWxmLXBlbCByZXNvbHV0aW9uCisgICAgICAgIElucHV0L091dHB1dDogICBobWVtIGlzIGFzc3VtZWQgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBzdGFydGluZworICAgICAgICAgICAgICAgICAgICBwb2ludCBvZiB0aGUgc2VhcmNoIGluIHRoZSAzM3gzMyBtYXRyaXggc2VhcmNoIHJlZ2lvbgorICAgICAgICBDaGFuZ2VzOgorICAgIDExLzcvMDA6ICAgICBpbXBsZW1lbnRlZCBNTVgKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgU0FEX01CX0hhbGZQZWxfQworICAgICAgICBEYXRlOiAgICAgICAwNC8zMC8yMDAxCisgICAgICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYgaW4gaGFsZnBlbAorICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLAorICAgICAgICBDaGFuZ2VzOgorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAvKiBPbmUgY29tcG9uZW50IGlzIGhhbGYtcGVsICovCisgICAgSW50IFNBRF9NQl9IYWxmUGVsX0N4aHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqa2ssICpwMSwgKnAyLCAqcDMsICpwNDsKKy8vICBJbnQgc3VtcmVmPTA7CisgICAgICAgIEludCB0ZW1wOworICAgICAgICBJbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhleHRyYV9pbmZvKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgICAgICBwMSA9IHJlZjsKKyAgICAgICAgcDIgPSByZWYgKyAxOworICAgICAgICBwMyA9IHJlZiArIHJ4OworICAgICAgICBwNCA9IHJlZiArIHJ4ICsgMTsKKyAgICAgICAga2sgID0gYmxrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyBwM1tqXSArIHA0W2pdICsgMikgPj4gMikgLSAqa2srKzsKKyAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgICAgIGlmIChzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKworICAgICAgICAgICAgcDEgKz0gcng7CisgICAgICAgICAgICBwMyArPSByeDsKKyAgICAgICAgICAgIHAyICs9IHJ4OworICAgICAgICAgICAgcDQgKz0gcng7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hhbGZQZWxfQ3loKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqa2ssICpwMSwgKnAyOworLy8gIEludCBzdW1yZWY9MDsKKyAgICAgICAgSW50IHRlbXA7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGV4dHJhX2luZm8pOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIHAxID0gcmVmOworICAgICAgICBwMiA9IHJlZiArIHJ4OyAvKiBlaXRoZXIgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tIHBpeGVsICovCisgICAgICAgIGtrICA9IGJsazsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAyW2pdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgICAgICBzYWQgKz0gUFZfQUJTKHRlbXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgICAgIGlmIChzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIHAxICs9IHJ4OworICAgICAgICAgICAgcDIgKz0gcng7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hhbGZQZWxfQ3hoKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqa2ssICpwMTsKKy8vICBJbnQgc3VtcmVmPTA7CisgICAgICAgIEludCB0ZW1wOworICAgICAgICBJbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgICAgIE9TQ0xfVU5VU0VEX0FSRyhleHRyYV9pbmZvKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgICAgICBwMSA9IHJlZjsKKyAgICAgICAga2sgID0gYmxrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDFbaisxXSArIDEpID4+IDEpIC0gKmtrKys7CisgICAgICAgICAgICAgICAgc2FkICs9IFBWX0FCUyh0ZW1wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgICAgICBpZiAoc2FkID4gKEludCkoKFVMb25nKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICBwMSArPSByeDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2lmZGVmIEhURk0gIC8qIEhURk0gd2l0aCB1bmlmb3JtIHN1YnNhbXBsaW5nIGltcGxlbWVudGF0aW9uLCAyLzI4LzAxICovCisKKy8vQ2hlY2hlY2sgaGVyZQorICAgIEludCBTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKKyAgICB7CisgICAgICAgIEludCBpLCBqOworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKnAxLCAqcDI7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgICAgIEludCByZWZ3eDQgPSByeCA8PCAyOworICAgICAgICBJbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgICAgICBJbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgICAgIEludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgICAgIEludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgICAgIFVMb25nIGN1cl93b3JkOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgICAgICBwMiA9IHAxICsgcng7CisKKyAgICAgICAgICAgIGogPSA0Oy8qIDQgbGluZXMgKi8KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMTJdICsgcDJbMTJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxM10gKyBwMlsxM107CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzhdICsgcDJbOF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzldICsgcDJbOV07CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzRdICsgcDJbNF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzVdICsgcDJbNV07CisgICAgICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzFdICsgcDJbMV07CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMF0gKyBwMlswXTsKKyAgICAgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2FkID4gKEludCkoKFVMb25nKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAgICAgICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgKCpjb3VudGJyZWFrKSsrOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgSW50IFNBRF9NQl9IUF9IVEZNX0NvbGxlY3R5aChVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKKyAgICB7CisgICAgICAgIEludCBpLCBqOworICAgICAgICBJbnQgc2FkID0gMDsKKyAgICAgICAgVUNoYXIgKnAxLCAqcDI7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgICAgIEludCByZWZ3eDQgPSByeCA8PCAyOworICAgICAgICBJbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgICAgICBJbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgICAgIEludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgICAgIEludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgICAgIFVMb25nIGN1cl93b3JkOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgICAgICBwMiA9IHAxICsgcng7CisgICAgICAgICAgICBqID0gNDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMlsxMl07CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAyWzhdOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMls0XTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDJbMF07CisgICAgICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqcDE7CisgICAgICAgIEludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgICAgIEludCByZWZ3eDQgPSByeCA8PCAyOworICAgICAgICBJbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgICAgICBJbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgICAgIEludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgICAgIEludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgICAgIFVMb25nIGN1cl93b3JkOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisKKyAgICAgICAgICAgIGogPSA0OyAvKiA0IGxpbmVzICovCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbMTNdOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVs5XTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbNV07CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbMV07CisgICAgICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzYWQgPiAoSW50KSgoVUxvbmcpZG1pbl9yeCA+PiAxNikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICgqYWJzX2RpZl9tYWRfYXZnKSArPSAoKGRpZm1hZCA+IDApID8gZGlmbWFkIDogLWRpZm1hZCk7CisgICAgICAgICAgICAgICAgICAgICgqY291bnRicmVhaykrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGlmbWFkID0gc2FkZGF0YVswXSAtICgoc2FkZGF0YVsxXSArIDEpID4+IDEpOworICAgICAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBJbnQgU0FEX01CX0hQX0hURk14aHloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgICAgIFVDaGFyICpwMSwgKnAyOworICAgICAgICBJbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgICAgICBJbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICAgICAgSW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgICAgICBJbnQgKm5ybWx6X3RoID0gKEludCopIGV4dHJhX2luZm87CisgICAgICAgIEludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICAgICAgVUxvbmcgY3VyX3dvcmQ7CisKKyAgICAgICAgbWFkc3RhciA9IChVTG9uZylkbWluX3J4ID4+IDIwOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgICAgICBwMiA9IHAxICsgcng7CisKKyAgICAgICAgICAgIGogPSA0OyAvKiA0IGxpbmVzICovCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cl93b3JkID0gKigoVUxvbmcqKShibGsgKz0gNCkpOworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzEyXSArIHAyWzEyXTsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDFbMTNdICsgcDJbMTNdOworICAgICAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVs4XSArIHAyWzhdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVs5XSArIHAyWzldOworICAgICAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgICAgICB0bXAgPSBwMVs0XSArIHAyWzRdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVs1XSArIHAyWzVdOworICAgICAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxXSArIHAyWzFdOworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzBdICsgcDJbMF07CisgICAgICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHAyICs9IHJlZnd4NDsKKyAgICAgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgICAgICBpZiAoc2FkID4gc2Fkc3RhciAtIG5ybWx6X3RoW2ldIHx8IHNhZCA+IChJbnQpKChVTG9uZylkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIEludCBTQURfTUJfSFBfSFRGTXloKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgICAgIFVDaGFyICpwMSwgKnAyOworICAgICAgICBJbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgICAgICBJbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICAgICAgSW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgICAgICBJbnQgKm5ybWx6X3RoID0gKEludCopIGV4dHJhX2luZm87CisgICAgICAgIEludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICAgICAgVUxvbmcgY3VyX3dvcmQ7CisKKyAgICAgICAgbWFkc3RhciA9IChVTG9uZylkbWluX3J4ID4+IDIwOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgICAgICBwMiA9IHAxICsgcng7CisgICAgICAgICAgICBqID0gNDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMlsxMl07CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAyWzhdOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMls0XTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgICAgICB0bXAyID0gcDJbMF07CisgICAgICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKyAgICAgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKEludCkoKFVMb25nKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgSW50IFNBRF9NQl9IUF9IVEZNeGgoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCisgICAgeworICAgICAgICBJbnQgaSwgajsKKyAgICAgICAgSW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICAgICAgVUNoYXIgKnAxOworICAgICAgICBJbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgICAgICBJbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICAgICAgSW50IHNhZHN0YXIgPSAwLCBtYWRzdGFyOworICAgICAgICBJbnQgKm5ybWx6X3RoID0gKEludCopIGV4dHJhX2luZm87CisgICAgICAgIEludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICAgICAgVUxvbmcgY3VyX3dvcmQ7CisKKyAgICAgICAgbWFkc3RhciA9IChVTG9uZylkbWluX3J4ID4+IDIwOworCisgICAgICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgICAgIGJsayAtPSA0OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisKKyAgICAgICAgICAgIGogPSA0Oy8qIDQgbGluZXMgKi8KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyX3dvcmQgPSAqKChVTG9uZyopKGJsayArPSA0KSk7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxM107CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICAgICAgdG1wMiA9IHAxWzldOworICAgICAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVs1XTsKKyAgICAgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgICAgIHRtcDIgPSBwMVsxXTsKKyAgICAgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgICAgICBpZiAoc2FkID4gc2Fkc3RhciAtIG5ybWx6X3RoW2ldIHx8IHNhZCA+IChJbnQpKChVTG9uZylkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gNjU1MzY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VuZGlmIC8qIEhURk0gKi8KKworI2lmbmRlZiBOT19JTlRFUjRWCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgRnVuY3Rpb246ICAgU0FEX0Jsa19IYWxmUGVsX0MKKyAgICAgICAgRGF0ZTogICAgICAgMDQvMzAvMjAwMQorICAgICAgICBQdXJwb3NlOiAgICBDb21wdXRlIFNBRCAxNngxNiBiZXR3ZWVuIGJsayBhbmQgcmVmIGluIGhhbGZwZWwKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiwKKyAgICAgICAgQ2hhbmdlczoKKyAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgLyogT25lIGNvbXBvbmVudCBpcyBoYWxmLXBlbCAqLworICAgIEludCBTQURfQmxrX0hhbGZQZWxfQyhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgZG1pbiwgSW50IHdpZHRoLCBJbnQgcngsIEludCB4aCwgSW50IHloLCB2b2lkICpleHRyYV9pbmZvKQorICAgIHsKKyAgICAgICAgSW50IGksIGo7CisgICAgICAgIEludCBzYWQgPSAwOworICAgICAgICBVQ2hhciAqa2ssICpwMSwgKnAyLCAqcDMsICpwNDsKKyAgICAgICAgSW50IHRlbXA7CisKKyAgICAgICAgT1NDTF9VTlVTRURfQVJHKGV4dHJhX2luZm8pOworCisgICAgICAgIE5VTV9TQURfSFBfQkxLX0NBTEwoKTsKKworICAgICAgICBpZiAoeGggJiYgeWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHAxID0gcmVmOworICAgICAgICAgICAgcDIgPSByZWYgKyB4aDsKKyAgICAgICAgICAgIHAzID0gcmVmICsgeWggKiByeDsKKyAgICAgICAgICAgIHA0ID0gcmVmICsgeWggKiByeCArIHhoOworICAgICAgICAgICAga2sgID0gYmxrOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyBwM1tqXSArIHA0W2pdICsgMikgPj4gMikgLSBra1tqXTsKKyAgICAgICAgICAgICAgICAgICAgc2FkICs9IFBWX0FCUyh0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBOVU1fU0FEX0hQX0JMSygpOworCisgICAgICAgICAgICAgICAgaWYgKHNhZCA+IGRtaW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisKKyAgICAgICAgICAgICAgICBwMSArPSByeDsKKyAgICAgICAgICAgICAgICBwMyArPSByeDsKKyAgICAgICAgICAgICAgICBwMiArPSByeDsKKyAgICAgICAgICAgICAgICBwNCArPSByeDsKKyAgICAgICAgICAgICAgICBrayArPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwMSA9IHJlZjsKKyAgICAgICAgICAgIHAyID0gcmVmICsgeGggKyB5aCAqIHJ4OyAvKiBlaXRoZXIgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tIHBpeGVsICovCisKKyAgICAgICAgICAgIGtrICA9IGJsazsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAyW2pdICsgMSkgPj4gMSkgLSBra1tqXTsKKyAgICAgICAgICAgICAgICAgICAgc2FkICs9IFBWX0FCUyh0ZW1wKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBOVU1fU0FEX0hQX0JMSygpOworCisgICAgICAgICAgICAgICAgaWYgKHNhZCA+IGRtaW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYWQ7CisgICAgICAgICAgICAgICAgcDEgKz0gcng7CisgICAgICAgICAgICAgICAgcDIgKz0gcng7CisgICAgICAgICAgICAgICAga2sgKz0gd2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2FkOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIE5PX0lOVEVSNFYgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1Nzc4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaWxlbmFtZTogc2FkX2hhbGZwZWxfaW5saW5lLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRhdGlvbiBmb3IgaW4tbGluZSBmdW5jdGlvbnMgdXNlZCBpbiBkY3QuY3BwICAgICAgICAgICAqLworLyogIE1vZGlmaWVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfU0FEX0hBTEZQRUxfSU5MSU5FX0hfCisjZGVmaW5lIF9TQURfSEFMRlBFTF9JTkxJTkVfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpICYmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAxX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICB0bXAgPSAodG1wMiA+PiAxKSAtIHRtcDsKKyAgICAgICAgaWYgKHRtcCA+IDApIHNhZCArPSB0bXA7CisgICAgICAgIGVsc2Ugc2FkIC09IHRtcDsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDJfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHRtcCA9ICh0bXAgPj4gMikgLSB0bXAyOworICAgICAgICBpZiAodG1wID4gMCkgc2FkICs9IHRtcDsKKyAgICAgICAgZWxzZSBzYWQgLT0gdG1wOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAxX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICByc2JzICAgIHRtcCwgdG1wLCB0bXAyLCBhc3IgIzEgOworICAgICAgICAgICAgcnNibWkgICB0bXAsIHRtcCwgIzAgOworICAgICAgICAgICAgYWRkICAgICBzYWQsIHNhZCwgdG1wIDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMl9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgcnNicyAgICB0bXAsIHRtcDIsIHRtcCwgYXNyICMyIDsKKyAgICAgICAgICAgIHJzYm1pICAgdG1wLCB0bXAsICMwIDsKKyAgICAgICAgICAgIGFkZCAgICAgc2FkLCBzYWQsIHRtcCA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VsaWYgKCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpIHx8IGRlZmluZWQoUFZfQVJNX0dDQ19WNCkgKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAxX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICByZWdpc3RlciBpbnQzMiBvdXQ7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHRlbXAxOworICAgICAgICByZWdpc3RlciBpbnQzMiBzcyA9IHNhZDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdHQgPSB0bXA7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHV1ID0gdG1wMjsKKworICAgICAgICBhc20gdm9sYXRpbGUoInJzYnMJJTEsICUzLCAlNCwgYXNyICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJyc2JtaSAlMSwgJTEsICMwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICUwLCAlMiwgJTEiCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAgICAgIj0mciIodGVtcDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHR0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHV1KSk7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorCisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAyX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCit7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHNzID0gc2FkOworICAgICAgICByZWdpc3RlciBpbnQzMiB0dCA9IHRtcDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdXUgPSB0bXAyOworCisgICAgICAgIGFzbSB2b2xhdGlsZSgicnNicyAgICAgICUxLCAlNCwgJTMsIGFzciAjMlxuXHQiCisgICAgICAgICAgICAgICAgICAgICAicnNibWkgJTEsICUxLCAjMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkICAlMCwgJTIsICUxIgorICAgICAgICAgICAgIDogIj0mciIob3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICI9JnIiKHRlbXAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyIih0dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyIih1dSkpOworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKworCisjZW5kaWYgLy8gRGlmZiBPUworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8vX1NBRF9IQUxGUEVMX0lOTElORV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3N2RmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApAQCAtMCwwICsxLDUzOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRmlsZW5hbWU6IHNhZF9pbmxpbmUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVzY3JpcHRpb246IEltcGxlbWVudGF0aW9uIGZvciBpbi1saW5lIGZ1bmN0aW9ucyB1c2VkIGluIGRjdC5jcHAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfU0FEX0lOTElORV9IXworI2RlZmluZSBfU0FEX0lOTElORV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNSkgJiYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNCkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIFNVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICB0bXAgPSB0bXAgLSB0bXAyOworICAgICAgICBpZiAodG1wID4gMCkgc2FkICs9IHRtcDsKKyAgICAgICAgZWxzZSBzYWQgLT0gdG1wOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbChpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKKyAgICAgICAgeDcgPSBzcmMyIF4gc3JjMTsgICAgICAgLyogY2hlY2sgb2RkL2V2ZW4gY29tYmluYXRpb24gKi8KKyAgICAgICAgaWYgKCh1aW50MzIpc3JjMiA+PSAodWludDMyKXNyYzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYzEgPSBzcmMyIC0gc3JjMTsgICAgIC8qIHN1YnMgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYzEgPSBzcmMxIC0gc3JjMjsKKyAgICAgICAgfQorICAgICAgICB4NyA9IHg3IF4gc3JjMTsgICAgIC8qIG9ubHkgb2RkIGJ5dGVzIG5lZWQgdG8gYWRkIGNhcnJ5ICovCisgICAgICAgIHg3ID0gbWFzayAmICgodWludDMyKXg3ID4+IDEpOworICAgICAgICB4NyA9ICh4NyA8PCA4KSAtIHg3OworICAgICAgICBzcmMxID0gc3JjMSArICh4NyA+PiA3KTsgLyogYWRkIDB4RkYgdG8gdGhlIG5lZ2F0aXZlIGJ5dGUsIGFkZCBiYWNrIGNhcnJ5ICovCisgICAgICAgIHNyYzEgPSBzcmMxIF4oeDcgPj4gNyk7ICAgLyogdGFrZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuZWdhdGl2ZSBieXRlICovCisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisjZGVmaW5lIE5VTUJFUiAzCisjZGVmaW5lIFNISUZUIDI0CisKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDIKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCAxNgorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMQorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDgKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKworICAgIF9faW5saW5lIGludDMyIHNpbWRfc2FkX21iKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBkbWluLCBJbnQgbHgpCisgICAgeworICAgICAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworCisgICAgICAgIHg4ID0gKHVpbnQzMilyZWYgJiAweDM7CisgICAgICAgIGlmICh4OCA9PSAzKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDM7CisgICAgICAgIGlmICh4OCA9PSAyKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDI7CisgICAgICAgIGlmICh4OCA9PSAxKQorICAgICAgICAgICAgZ290byBTYWRNQk9mZnNldDE7CisKKy8vICB4NSA9ICh4NDw8OCkteDQ7IC8qIHg1ID0geDQqMjU1OyAqLworICAgICAgICB4NCA9IHg1ID0gMDsKKworICAgICAgICB4NiA9IDB4RkZGRjAwRkY7CisKKyAgICAgICAgcmVmIC09IGx4OworICAgICAgICBibGsgLT0gMTY7CisKKyAgICAgICAgeDggPSAxNjsKKworTE9PUF9TQUQwOgorICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKz0gbHgpKTsKKyAgICAgICAgeDExID0gKigodWludDMyKikocmVmICsgNCkpOworICAgICAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKz0gMTYpKTsKKyAgICAgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgNCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDEwID0gKigodWludDMyKikocmVmICsgOCkpOworICAgICAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKyA4KSk7CisgICAgICAgIHgxNCA9ICooKHVpbnQzMiopKGJsayArIDEyKSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICAgICAgaWYgKCgodWludDMyKXgxMCA+PiAxNikgPD0gKHVpbnQzMilkbWluKSAvKiBjb21wYXJlIHdpdGggZG1pbiAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIExPT1BfU0FEMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7CisKK1NhZE1CT2Zmc2V0MzoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDMocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQyOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MihyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDE6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQxKHJlZiwgYmxrLCBseCwgZG1pbik7CisKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworICAgIF9faW5saW5lIGludDMyIFNVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICByc2JzICAgIHRtcCwgdG1wLCB0bXAyIDsKKyAgICAgICAgICAgIHJzYm1pICAgdG1wLCB0bXAsICMwIDsKKyAgICAgICAgICAgIGFkZCAgICAgc2FkLCBzYWQsIHRtcCA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPUiAgICAgeDcsIHNyYzIsIHNyYzE7ICAgICAvKiBjaGVjayBvZGQvZXZlbiBjb21iaW5hdGlvbiAqLworICAgICAgICAgICAgU1VCUyAgICBzcmMxLCBzcmMyLCBzcmMxOworICAgICAgICAgICAgRU9SICAgICB4NywgeDcsIHNyYzE7CisgICAgICAgICAgICBBTkQgICAgIHg3LCBtYXNrLCB4NywgbHNyICMxOworICAgICAgICAgICAgT1JSQ0MgICB4NywgeDcsICMweDgwMDAwMDAwOworICAgICAgICAgICAgUlNCICAgICB4NywgeDcsIHg3LCBsc2wgIzg7CisgICAgICAgICAgICBBREQgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7ICAgLyogYWRkIDB4RkYgdG8gdGhlIG5lZ2F0aXZlIGJ5dGUsIGFkZCBiYWNrIGNhcnJ5ICovCisgICAgICAgICAgICBFT1IgICAgIHNyYzEsIHNyYzEsIHg3LCBhc3IgIzc7ICAgLyogdGFrZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuZWdhdGl2ZSBieXRlICovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsTihpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgRU9SICAgICAgeDcsIHNyYzIsIHNyYzE7ICAgICAgICAvKiBjaGVjayBvZGQvZXZlbiBjb21iaW5hdGlvbiAqLworICAgICAgICAgICAgQUREUyAgICAgc3JjMSwgc3JjMiwgc3JjMTsKKyAgICAgICAgICAgIEVPUiAgICAgIHg3LCB4Nywgc3JjMTsgICAgICAvKiBvbmx5IG9kZCBieXRlcyBuZWVkIHRvIGFkZCBjYXJyeSAqLworICAgICAgICAgICAgQU5EUyAgICAgeDcsIG1hc2ssIHg3LCBycng7CisgICAgICAgICAgICBSU0IgICAgICB4NywgeDcsIHg3LCBsc2wgIzg7CisgICAgICAgICAgICBTVUIgICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAgLyogYWRkIDB4RkYgdG8gdGhlIG5lZ2F0aXZlIGJ5dGUsIGFkZCBiYWNrIGNhcnJ5ICovCisgICAgICAgICAgICBFT1IgICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAvKiB0YWtlIGFic29sdXRlIHZhbHVlIG9mIG5lZ2F0aXZlIGJ5dGUgKi8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworI2RlZmluZSBzdW1fYWNjdW11bGF0ZSAgX19hc217ICAgICAgU0JDICAgICAgeDUsIHg1LCB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLyBcCisgICAgICAgIEJJQyAgICAgIHgxMCwgeDYsIHgxMDsgICAvKiB4MTAgJiAweEZGMDBGRjAwICovIFwKKyAgICAgICAgQUREICAgICAgeDQsIHg0LCB4MTAsbHNyICM4OyAgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLyBcCisgICAgICAgIFNCQyAgICAgIHg1LCB4NSwgeDExOyAgICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLyBcCisgICAgICAgIEJJQyAgICAgIHgxMSwgeDYsIHgxMTsgICAvKiB4MTEgJiAweEZGMDBGRjAwICovIFwKKyAgICAgICAgQUREICAgICAgeDQsIHg0LCB4MTEsbHNyICM4OyB9IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisKKyNkZWZpbmUgTlVNQkVSIDMKKyNkZWZpbmUgU0hJRlQgMjQKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKworI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMgorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDE2CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDEwMDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAxCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgOAorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworCisgICAgX19pbmxpbmUgaW50MzIgc2ltZF9zYWRfbWIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCkKKyAgICB7CisgICAgICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgICAgIHg0ID0geDUgPSAwOworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIE1PVlMgICAgeDgsIHJlZiwgbHNsICMzMSA7CisgICAgICAgICAgICBCSEkgICAgIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgICAgIEJDUyAgICAgU2FkTUJPZmZzZXQyOworICAgICAgICAgICAgQk1JICAgICBTYWRNQk9mZnNldDE7CisKKyAgICAgICAgICAgIE1WTiAgICAgeDYsICMweEZGMDA7CisgICAgICAgIH0KK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworICAgICAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgICAgICBMRFIgICAgIHgxMSwgW3JlZiwgIzRdOworICAgICAgICAgICAgTERSICAgICB4MTAsIFtyZWZdLCBseCA7CisgICAgICAgICAgICBMRFIgICAgIHgxNCwgW2JsaywgIzRdOworICAgICAgICAgICAgTERSICAgICB4MTIsIFtibGtdLCAjMTYgOworICAgICAgICB9CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICAvKioqKioqKioqKioqKioqKi8KKyAgICAgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBSU0JTICAgIHgxMSwgZG1pbiwgeDEwLCBsc3IgIzE2OworICAgICAgICAgICAgQURETFNTICB4OCwgeDgsICMweDEwMDAwMDAxOworICAgICAgICAgICAgQkxTICAgICBMT09QX1NBRDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKKworU2FkTUJPZmZzZXQzOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MyhyZWYsIGJsaywgbHgsIGRtaW4sIHg4KTsKKworU2FkTUJPZmZzZXQyOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MihyZWYsIGJsaywgbHgsIGRtaW4sIHg4KTsKKworU2FkTUJPZmZzZXQxOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MShyZWYsIGJsaywgbHgsIGRtaW4sIHg4KTsKKyAgICB9CisKKworI2VsaWYgKCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpIHx8IGRlZmluZWQoUFZfQVJNX0dDQ19WNCkgKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHNzID0gc2FkOworICAgICAgICByZWdpc3RlciBpbnQzMiB0dCA9IHRtcDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdXUgPSB0bXAyOworCisgICAgICAgIGFzbSB2b2xhdGlsZSgicnNicyAgJTEsICU0LCAlM1xuXHQiCisgICAgICAgICAgICAgICAgICAgICAicnNibWkgJTEsICUxLCAjMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkICAgJTAsICUyLCAlMSIKKyAgICAgICAgICAgICA6ICI9JnIiKG91dCksCisgICAgICAgICAgICAgICAgICAgICAiPSZyIih0ZW1wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiciIoc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIodHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiciIodXUpKTsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCit7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHMxID0gc3JjMTsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgczIgPSBzcmMyOworICAgICAgICByZWdpc3RlciBpbnQzMiBtbSA9IG1hc2s7CisKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJlb3IgICAlMCwgJTMsICUyXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJzdWJzICAlMSwgJTMsICUyXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJlb3IgICAlMCwgJTAsICUxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhbmQgICAlMCwgJTQsICUwLCBsc3IgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgIm9ycmNjICUwLCAlMCwgIzB4ODAwMDAwMDBcblx0IgorICAgICAgICAgICAgICAgICAgICAgInJzYiAgICUwLCAlMCwgJTAsIGxzbCAjOFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkICAgJTEsICUxLCAlMCwgYXNyICM3XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJlb3IgICAlMSwgJTEsICUwLCBhc3IgIzciCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAgICAgIj0mciIodGVtcDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKG1tKSk7CisKKyAgICAgICAgcmV0dXJuIHRlbXAxOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWxOKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCit7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIG91dDsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgdGVtcDE7CisgICAgICAgIHJlZ2lzdGVyIGludDMyIHMxID0gc3JjMTsKKyAgICAgICAgcmVnaXN0ZXIgaW50MzIgczIgPSBzcmMyOworICAgICAgICByZWdpc3RlciBpbnQzMiBtbSA9IG1hc2s7CisKKyAgICAgICAgYXNtIHZvbGF0aWxlKCJlb3IgICAgJTEsICUzLCAlMlxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkcyAgICUwLCAlMywgJTJcblx0IgorICAgICAgICAgICAgICAgICAgICAgImVvciAgICAlMSwgJTEsICUwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhbmRzICAgJTEsICU0LCAlMSxycnhcblx0IgorICAgICAgICAgICAgICAgICAgICAgInJzYiAgICAlMSwgJTEsICUxLCBsc2wgIzhcblx0IgorICAgICAgICAgICAgICAgICAgICAgInN1YiAgICAlMCwgJTAsICUxLCBhc3IgIzdcblx0IgorICAgICAgICAgICAgICAgICAgICAgImVvciAgICAlMCwgJTAsICUxLCBhc3IgIzciCisgICAgICAgICAgICAgOiAiPSZyIihvdXQpLAorICAgICAgICAgICAgICAgICAgICAgIj0mciIodGVtcDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHMxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKHMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInIiKG1tKSk7CisKKyAgICAgICAgcmV0dXJuIChvdXQpOworICAgIH0KKworI2RlZmluZSBzdW1fYWNjdW11bGF0ZSBhc20gdm9sYXRpbGUoInNiYyAgJTAsICUwLCAlMVxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJpYyAgJTEsICU0LCAlMVxuXHQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZCAgJTIsICUyLCAlMSwgbHNyICM4XG5cdCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2JjICAlMCwgJTAsICUzXG5cdCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmljICAlMywgJTQsICUzXG5cdCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAlMiwgJTIsICUzLCBsc3IgIzgiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiIrciIoeDUpLCAiK3IiKHgxMCksICIrciIoeDQpLCAiK3IiKHgxMSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6InIiKHg2KSk7CisKKyNkZWZpbmUgTlVNQkVSIDMKKyNkZWZpbmUgU0hJRlQgMjQKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKworI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMgorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDE2CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDEwMDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAxCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgOAorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworCisgICAgX19pbmxpbmUgaW50MzIgc2ltZF9zYWRfbWIoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGRtaW4sIEludCBseCkKK3sKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgaWYgKHg4ID09IDMpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgaWYgKHg4ID09IDIpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgaWYgKHg4ID09IDEpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MTsKKworYXNtIHZvbGF0aWxlKCJtdm4gJTAsICMweEZGMDAiOiAiPXIiKHg2KSk7CisKK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworICAgICAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIGFzbSB2b2xhdGlsZSgibGRyICAlMCwgWyU0LCAjNF1cblx0IgorICAgICAgICAgICAgICAgICAgICAgImxkciAgJTEsIFslNF0sICU2XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJsZHIgICUyLCBbJTUsICM0XVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAibGRyICAlMywgWyU1XSwgIzE2IgorICAgICAgICAgICAgIDogIj1yIih4MTEpLCAiPXIiKHgxMCksICI9ciIoeDE0KSwgIj1yIih4MTIpLCAiK3IiKHJlZiksICIrciIoYmxrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIihseCkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9ICh1aW50MzIpZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC0teDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBMT09QX1NBRDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworCitTYWRNQk9mZnNldDM6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQzKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MjoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDIocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQxOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MShyZWYsIGJsaywgbHgsIGRtaW4pOworICAgIH0KKworI2VuZGlmIC8vIE9TCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfU0FEX0lOTElORV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3YjkyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApAQCAtMCwwICsxLDMxNyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRmlsZW5hbWU6IHNhZF9tYl9vZmZzZXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlc2NyaXB0aW9uOiBJbXBsZW1lbnRhdGlvbiBmb3IgaW4tbGluZSBmdW5jdGlvbnMgdXNlZCBpbiBkY3QuY3BwICAgICAgICAgICAqLworLyogIE1vZGlmaWVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpICYmICFkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyNpZiAoTlVNQkVSPT0zKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDMoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbikKKyNlbGlmIChOVU1CRVI9PTIpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MihVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgbHgsIEludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MSkKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQxKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4pCisjZW5kaWYKK3sKKyAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgIC8vICB4NSA9ICh4NDw8OCkgLSB4NDsKKyAgICB4NCA9IHg1ID0gMDsKKyAgICB4NiA9IDB4RkZGRjAwRkY7CisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICByZWYgLT0gTlVNQkVSOyAvKiBiaWMgcmVmLCByZWYsICMzICovCisgICAgcmVmIC09IGx4OworICAgIGJsayAtPSAxNjsKKyAgICB4OCA9IDE2OworCisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKz0gbHgpKTsgLyogRCBDIEIgQSAqLworICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDQpKTsgICAgLyogSCBHIEYgRSAqLworICAgIHgxMiA9ICooKHVpbnQzMiopKHJlZiArIDgpKTsgICAgLyogTCBLIEogSSAqLworCisgICAgeDEwID0gKCh1aW50MzIpeDEwID4+IFNISUZUKTsgLyogMCAwIDAgRCAqLworICAgIHgxMCA9IHgxMCB8ICh4MTEgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIEcgRiBFIEQgKi8KKyAgICB4MTEgPSAoKHVpbnQzMil4MTEgPj4gU0hJRlQpOyAvKiAwIDAgMCBIICovCisgICAgeDExID0geDExIHwgKHgxMiA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogSyBKIEkgSCAqLworCisgICAgeDEyID0gKigodWludDMyKikoYmxrICs9IDE2KSk7CisgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgNCkpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDEwID0gKigodWludDMyKikocmVmICsgOCkpOyAvKiBEIEMgQiBBICovCisgICAgeDExID0gKigodWludDMyKikocmVmICsgMTIpKTsgICAvKiBIIEcgRiBFICovCisgICAgeDEyID0gKigodWludDMyKikocmVmICsgMTYpKTsgICAvKiBMIEsgSiBJICovCisKKyAgICB4MTAgPSAoKHVpbnQzMil4MTAgPj4gU0hJRlQpOyAvKiBtdm4geDEwLCB4MTAsIGxzciAjMjQgID0gMHhGRiAweEZGIDB4RkYgfkQgKi8KKyAgICB4MTAgPSB4MTAgfCAoeDExIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiBiaWMgeDEwLCB4MTAsIHgxMSwgbHNsICM4ID0gfkcgfkYgfkUgfkQgKi8KKyAgICB4MTEgPSAoKHVpbnQzMil4MTEgPj4gU0hJRlQpOyAvKiAweEZGIDB4RkYgMHhGRiB+SCAqLworICAgIHgxMSA9IHgxMSB8ICh4MTIgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIH5LIH5KIH5JIH5IICovCisKKyAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKyA4KSk7CisgICAgeDE0ID0gKigodWludDMyKikoYmxrICsgMTIpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICB4NSA9IHg1ICsgeDEwOyAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAvKioqKioqKioqKioqKioqKi8KKyAgICB4MTAgPSB4NSAtICh4NCA8PCA4KTsgLyogZXh0cmFjdCBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgKyAoeDEwIDw8IDE2KTsgLyogYWRkIHdpdGggbG93ZXIgaGFsZiB3b3JkICovCisKKyAgICBpZiAoKCh1aW50MzIpeDEwID4+IDE2KSA8PSAodWludDMyKWRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgeworICAgICAgICBpZiAoLS14OCkKKyAgICAgICAgeworI2lmIChOVU1CRVI9PTMpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQzOworI2VsaWYgKE5VTUJFUj09MikKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDI7CisjZWxpZiAoTlVNQkVSPT0xKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICB9CisKKyAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKK30KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisjaWYgKE5VTUJFUj09MykKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQzKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4sIGludDMyIHg4KQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4sIGludDMyIHg4KQorI2VsaWYgKE5VTUJFUj09MSkKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQxKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4sIGludDMyIHg4KQorI2VuZGlmCit7CisgICAgaW50MzIgeDQsIHg1LCB4NiwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgIHg5ID0gMHg4MDgwODA4MDsgLyogY29uc3QuICovCisgICAgeDQgPSB4NSA9IDA7CisKKyAgICBfX2FzbXsKKyAgICAgICAgTVZOICAgICAgeDYsICMweGZmMDAwMDsKKyAgICAgICAgQklDICAgICAgcmVmLCByZWYsICMzOworCisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCisgICAgfQorICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgIHgxMiA9ICooKGludDMyKikocmVmICsgMTYpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisKKyAgICBfX2FzbXsKKyAgICAgICAgTVZOICAgICAgeDEwLCB4MTAsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMCwgeDEwLCB4MTEsIGxzbCAjKDMyLVNISUZUKTsKKyAgICAgICAgTVZOICAgICAgeDExLCB4MTEsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMSwgeDExLCB4MTIsIGxzbCAjKDMyLVNISUZUKTsKKworICAgICAgICBMRFIgICAgICB4MTIsIFtibGssICM4XTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIF9fYXNteworICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICBMRFIgICAgICB4MTEsIFtyZWYsICM0XTsKKyAgICAgICAgTERSICAgICAgeDEyLCBbcmVmLCAjOF07CisgICAgICAgIExEUiAgeDEwLCBbcmVmXSwgbHggOworICAgICAgICBMRFIgIHgxNCwgW2JsaywgIzRdOworCisgICAgICAgIE1WTiAgICAgIHgxMCwgeDEwLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTAsIHgxMCwgeDExLCBsc2wgIygzMi1TSElGVCk7CisgICAgICAgIE1WTiAgICAgIHgxMSwgeDExLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTEsIHgxMSwgeDEyLCBsc2wgIygzMi1TSElGVCk7CisKKyAgICAgICAgTERSICAgICAgeDEyLCBbYmxrXSwgIzE2OworICAgIH0KKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgX19hc217CisgICAgICAgIFJTQlMgICAgIHgxMSwgZG1pbiwgeDEwLCBsc3IgIzE2CisgICAgICAgIEFERExTUyAgIHg4LCB4OCwgI0lOQ19YOAorI2lmIChOVU1CRVI9PTMpCisgICAgICAgIEJMUyAgICAgIExPT1BfU0FEMzsKKyNlbGlmIChOVU1CRVI9PTIpCitCTFMgICAgICBMT09QX1NBRDI7CisjZWxpZiAoTlVNQkVSPT0xKQorQkxTICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7Cit9CisKKyNlbGlmICggZGVmaW5lZChQVl9BUk1fR0NDX1Y1KSB8fCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjQpICkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0MyhVQ2hhciAqcmVmLCBVQ2hhciAqYmxrLCBJbnQgbHgsIEludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKFVDaGFyICpyZWYsIFVDaGFyICpibGssIEludCBseCwgSW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEoVUNoYXIgKnJlZiwgVUNoYXIgKmJsaywgSW50IGx4LCBJbnQgZG1pbikKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgLy8gIHg1ID0gKHg0PDw4KSAtIHg0OworICAgIHg0ID0geDUgPSAwOworICAgIHg2ID0gMHhGRkZGMDBGRjsKKyAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgIHJlZiAtPSBOVU1CRVI7IC8qIGJpYyByZWYsIHJlZiwgIzMgKi8KKyAgICByZWYgLT0gbHg7CisgICAgeDggPSAxNjsKKworI2lmIChOVU1CRVI9PTMpCitMT09QX1NBRDM6CisjZWxpZiAoTlVNQkVSPT0yKQorTE9PUF9TQUQyOgorI2VsaWYgKE5VTUJFUj09MSkKK0xPT1BfU0FEMToKKyNlbmRpZgorICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDEwID0gKigodWludDMyKikocmVmICs9IGx4KSk7IC8qIEQgQyBCIEEgKi8KKyAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyA0KSk7ICAgIC8qIEggRyBGIEUgKi8KKyAgICB4MTIgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7ICAgIC8qIEwgSyBKIEkgKi8KKworICAgIGludDMyIHNoaWZ0ID0gU0hJRlQ7CisgICAgaW50MzIgc2hpZnQyID0gMzIgLSBTSElGVDsKKyAgICBhc20gdm9sYXRpbGUoImxkciAgJTMsIFslNCwgIzRdXG5cdCIKKyAgICAgICAgICAgICAgICAgIm12biAgJTAsICUwLCBsc3IgJTVcblx0IgorICAgICAgICAgICAgICAgICAiYmljICAlMCwgJTAsICUxLCBsc2wgJTZcblx0IgorICAgICAgICAgICAgICAgICAibXZuICAlMSwgJTEsIGxzciAlNVxuXHQiCisgICAgICAgICAgICAgICAgICJiaWMgICUxLCAlMSwgJTIsIGxzbCAlNlxuXHQiCisgICAgICAgICAgICAgICAgICJsZHIgICUyLCBbJTQsICM4XSIKKyAgICAgICAgICAgICA6ICIrciIoeDEwKSwgIityIih4MTEpLCAiK3IiKHgxMiksICI9ciIoeDE0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGJsayksICJyIihzaGlmdCksICJyIihzaGlmdDIpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDEwID0gKigodWludDMyKikocmVmICsgOCkpOyAvKiBEIEMgQiBBICovCisgICAgeDExID0gKigodWludDMyKikocmVmICsgMTIpKTsgICAvKiBIIEcgRiBFICovCisgICAgeDEyID0gKigodWludDMyKikocmVmICsgMTYpKTsgICAvKiBMIEsgSiBJICovCisKKyAgICBhc20gdm9sYXRpbGUoImxkciAgJTMsIFslNCwgIzRdXG5cdCIKKyAgICAgICAgICAgICAgICAgIm12biAgJTAsICUwLCBsc3IgJTVcblx0IgorICAgICAgICAgICAgICAgICAiYmljICAlMCwgJTAsICUxLCBsc2wgJTZcblx0IgorICAgICAgICAgICAgICAgICAibXZuICAlMSwgJTEsIGxzciAlNVxuXHQiCisgICAgICAgICAgICAgICAgICJiaWMgICUxLCAlMSwgJTIsIGxzbCAlNlxuXHQiCisgICAgICAgICAgICAgICAgICJsZHIgICUyLCBbJTQsICM4XSIKKyAgICAgICAgICAgICA6ICIrciIoeDEwKSwgIityIih4MTEpLCAiK3IiKHgxMiksICI9ciIoeDE0KQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKGJsayksICJyIihzaGlmdCksICJyIihzaGlmdDIpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9ICh1aW50MzIpZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICB7CisgICAgICAgIGlmICgtLXg4KQorICAgICAgICB7CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorZ290byAgICAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCitnb3RvICAgICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY190YWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkNjJlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKQEAgLTAsMCArMSwxMTQ2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgc29mdHdhcmUgbW9kdWxlIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieQorICoKKyAqIFJvYmVydCBEYW5pZWxzZW4gKFRlbGVub3IgLyBBQ1RTLU1vTXVTeXMpLgorICoKKyAqIGFuZCBlZGl0ZWQgYnkKKyAqCisgKiBNaW5odWEgWmhvdSAoSEhJIC8gQUNUUy1Nb011U3lzKS4KKyAqIEx1aXMgRHVjbGEtU29hcmVzIChJU1QgLyBBQ1RTLU1vTXVTeXMpLgorICoKKyAqIGluIHRoZSBjb3Vyc2Ugb2YgZGV2ZWxvcG1lbnQgb2YgdGhlIE1QRUctNCBWaWRlbyAoSVNPL0lFQyAxNDQ5Ni0yKSBzdGFuZGFyZC4KKyAqIFRoaXMgc29mdHdhcmUgbW9kdWxlIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgcGFydCBvZiBvbmUgb3IgbW9yZSBNUEVHLTQKKyAqIFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHRvb2xzIGFzIHNwZWNpZmllZCBieSB0aGUgTVBFRy00IFZpZGVvIChJU08vSUVDCisgKiAxNDQ5Ni0yKSBzdGFuZGFyZC4KKyAqCisgKiBJU08vSUVDIGdpdmVzIHVzZXJzIG9mIHRoZSBNUEVHLTQgVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgc3RhbmRhcmQgZnJlZQorICogbGljZW5zZSB0byB0aGlzIHNvZnR3YXJlIG1vZHVsZSBvciBtb2RpZmljYXRpb25zIHRoZXJlb2YgZm9yIHVzZSBpbiBoYXJkd2FyZQorICogb3Igc29mdHdhcmUgcHJvZHVjdHMgY2xhaW1pbmcgY29uZm9ybWFuY2UgdG8gdGhlIE1QRUctNCBWaWRlbyAoSVNPL0lFQworICogMTQ0OTYtMikgc3RhbmRhcmQuCisgKgorICogVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvZnR3YXJlIG1vZHVsZSBpbiBoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cworICogYXJlIGFkdmlzZWQgdGhhdCBpdHMgdXNlIG1heSBpbmZyaW5nZSBleGlzdGluZyBwYXRlbnRzLiBUaGUgb3JpZ2luYWwKKyAqIGRldmVsb3BlciBvZiB0aGlzIHNvZnR3YXJlIG1vZHVsZSBhbmQgaGlzL2hlciBjb21wYW55LCB0aGUgc3Vic2VxdWVudAorICogZWRpdG9ycyBhbmQgdGhlaXIgY29tcGFuaWVzLCBhbmQgSVNPL0lFQyBoYXZlIG5vIGxpYWJpbGl0eSBmb3IgdXNlIG9mIHRoaXMKKyAqIHNvZnR3YXJlIG1vZHVsZSBvciBtb2RpZmljYXRpb25zIHRoZXJlb2YgaW4gYW4gaW1wbGVtZW50YXRpb24uIENvcHlyaWdodCBpcworICogbm90IHJlbGVhc2VkIGZvciBub24gTVBFRy00IFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHN0YW5kYXJkIGNvbmZvcm1pbmcKKyAqIHByb2R1Y3RzLgorICoKKyAqIEFDVFMtTW9NdVN5cyBwYXJ0bmVycyByZXRhaW4gZnVsbCByaWdodCB0byB1c2UgdGhlIGNvZGUgZm9yIGhpcy9oZXIgb3duCisgKiBwdXJwb3NlLCBhc3NpZ24gb3IgZG9uYXRlIHRoZSBjb2RlIHRvIGEgdGhpcmQgcGFydHkgYW5kIHRvIGluaGliaXQgdGhpcmQKKyAqIHBhcnRpZXMgZnJvbSB1c2luZyB0aGUgY29kZSBmb3Igbm9uIE1QRUctNCBWaWRlbyAoSVNPL0lFQyAxNDQ5Ni0yKSBzdGFuZGFyZAorICogY29uZm9ybWluZyBwcm9kdWN0cy4gVGhpcyBjb3B5cmlnaHQgbm90aWNlIG11c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvcgorICogZGVyaXZhdGl2ZSB3b3Jrcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqSGVhZGVyQmVnaW4qKioqKioqCisgKgorICogRmlsZTogICAgdmxjLmgKKyAqCisgKiBBdXRob3I6ICBSb2JlcnQgRGFuaWVsc2VuCisgKiBDcmVhdGVkOiAwNy4wNi45NgorICoKKyAqIERlc2NyaXB0aW9uOiB2bGMgdGFibGVzIGZvciBlbmNvZGVyCisgKgorICogTm90ZXM6ICAgSWRlYSB0YWtlbiBmcm9tIE1QRUctMiBzb2Z0d2FyZSBzaW11bGF0aW9uIGdyb3VwCisgKgorICogTW9kaWZpZWQ6CisgKiAgMjguMTAuOTYgUm9iZXJ0IERhbmllbHNlbjogQWRkZWQgdGFibGVzIGZvciBJbnRyYSBsdW1pbmFuY2UKKyAqICAgICAgICAgIGNvZWZmaWNpZW50cworICogICAgICAwMS4wNS45NyBMdWlzIER1Y2xhLVNvYXJlczogYWRkZWQgVk03LjAgUmV2ZXJzaWJsZSBWTEMgdGFibGVzIChSVkxDKS4KKyAqICAgICAgMTMuMDUuOTcgTWluaHVhIFpob3U6IGFkZGVkIGNicHlfdGFiMyxjYnB5X3RhYjIKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipIZWFkZXJFbmQqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogICAgSU5DTFVERSBGSUxFUyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfVkxDX0VOQ19UQUJfSF8KKyNkZWZpbmUgX1ZMQ19FTkNfVEFCX0hfCisKKworI2luY2x1ZGUgIm1wNGRlZi5oIgorLyogdHlwZSBkZWZpbml0aW9ucyBmb3IgdmFyaWFibGUgbGVuZ3RoIGNvZGUgdGFibGUgZW50cmllcyAqLworCisKKworc3RhdGljIGNvbnN0IEludCBpbnRyYV9tYXhfbGV2ZWxbMl1bNjRdID0KK3sKKyAgICB7MjcsIDEwLCAgNSwgIDQsICAzLCAgMywgIDMsICAzLAorICAgICAgICAyLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICB9LAorCisgICAgezgsICAzLCAgMiwgIDIsICAyLCAgMiwgIDIsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMAorICAgIH0KK307CisKKworc3RhdGljIGNvbnN0IEludCBpbnRlcl9tYXhfbGV2ZWxbMl1bNjRdID0KK3sKKyAgICB7MTIsICA2LCAgNCwgIDMsICAzLCAgMywgIDMsICAyLAorICAgICAgICAyLCAgMiwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMH0sCisKKyAgICB7MywgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwfQorfTsKKworCitzdGF0aWMgY29uc3QgSW50IGludHJhX21heF9ydW4wWzI4XSA9IHsgOTk5LCAxNCwgIDksICA3LCAgMywgIDIsICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKworc3RhdGljIGNvbnN0IEludCBpbnRyYV9tYXhfcnVuMVs5XSA9IHsgOTk5LCAyMCwgIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgMCwgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCitzdGF0aWMgY29uc3QgSW50IGludGVyX21heF9ydW4wWzEzXSA9IHsgOTk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LCAxMCwgIDYsICAyLCAgMSwgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKworc3RhdGljIGNvbnN0IEludCBpbnRlcl9tYXhfcnVuMVs0XSA9IHsgOTk5LCA0MCwgIDEsICAwIH07CisKKworCisvKiBEQyBwcmVkaWN0aW9uIHNpemVzICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBEQ3RhYl9sdW1bMTNdID0KK3sKKyAgICB7MywgM30sIHszLCAyfSwgezIsIDJ9LCB7MiwgM30sIHsxLCAzfSwgezEsIDR9LCB7MSwgNX0sIHsxLCA2fSwgezEsIDd9LAorICAgIHsxLCA4fSwgezEsIDl9LCB7MSwgMTB9LCB7MSwgMTF9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgREN0YWJfY2hyb21bMTNdID0KK3sKKyAgICB7MywgMn0sIHsyLCAyfSwgezEsIDJ9LCB7MSwgM30sIHsxLCA0fSwgezEsIDV9LCB7MSwgNn0sIHsxLCA3fSwgezEsIDh9LAorICAgIHsxLCA5fSwgezEsIDEwfSwgezEsIDExfSwgezEsIDEyfQorfTsKKworLyogTW90aW9uIHZlY3RvcnMgKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIG12dGFiWzMzXSA9Cit7CisgICAgezEsIDF9LCB7MSwgMn0sIHsxLCAzfSwgezEsIDR9LCB7MywgNn0sIHs1LCA3fSwgezQsIDd9LCB7MywgN30sCisgICAgezExLCA5fSwgezEwLCA5fSwgezksIDl9LCB7MTcsIDEwfSwgezE2LCAxMH0sIHsxNSwgMTB9LCB7MTQsIDEwfSwgezEzLCAxMH0sCisgICAgezEyLCAxMH0sIHsxMSwgMTB9LCB7MTAsIDEwfSwgezksIDEwfSwgezgsIDEwfSwgezcsIDEwfSwgezYsIDEwfSwgezUsIDEwfSwKKyAgICB7NCwgMTB9LCB7NywgMTF9LCB7NiwgMTF9LCB7NSwgMTF9LCB7NCwgMTF9LCB7MywgMTF9LCB7MiwgMTF9LCB7MywgMTJ9LAorICAgIHsyLCAxMn0KK307CisKKworLyogTUNCUEMgSW5kZXhpbmcgYnkgY2JwYyBpbiBmaXJzdCB0d28gYml0cywgbW9kZSBpbiBsYXN0IHR3by4KKyBDQlBDIGFzIGluIHRhYmxlIDQvSC4yNjMsIE1CIHR5cGUgKG1vZGUpOiAzID0gMDEsIDQgPSAxMC4KKyBFeGFtcGxlOiBjYnBjID0gMDEgYW5kIG1vZGUgPSA0IGdpdmVzIGluZGV4ID0gMDExMCA9IDYuICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBtY2JwY19pbnRyYV90YWJbMTVdID0KK3sKKyAgICB7MHgwMSwgOX0sIHsweDAxLCAxfSwgezB4MDEsIDR9LCB7MHgwMCwgMH0sCisgICAgezB4MDAsIDB9LCB7MHgwMSwgM30sIHsweDAxLCA2fSwgezB4MDAsIDB9LAorICAgIHsweDAwLCAwfSwgezB4MDIsIDN9LCB7MHgwMiwgNn0sIHsweDAwLCAwfSwKKyAgICB7MHgwMCwgMH0sIHsweDAzLCAzfSwgezB4MDMsIDZ9Cit9OworCisKKy8qIE1DQlBDIGludGVyLgorICAgQWRkcmVzc2luZzogNSBiaXQgY2NtbW0gKGNjID0gQ0JQQywgbW1tID0gbW9kZSAoMS00IGJpbmFyeSkpICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBtY2JwY19pbnRlcl90YWJbMjldID0KK3sKKyAgICB7MSwgMX0sIHszLCAzfSwgezIsIDN9LCB7MywgNX0sIHs0LCA2fSwgezEsIDl9LCB7MCwgMH0sIHswLCAwfSwKKyAgICB7MywgNH0sIHs3LCA3fSwgezUsIDd9LCB7NCwgOH0sIHs0LCA5fSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwKKyAgICB7MiwgNH0sIHs2LCA3fSwgezQsIDd9LCB7MywgOH0sIHszLCA5fSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwKKyAgICB7NSwgNn0sIHs1LCA5fSwgezUsIDh9LCB7MywgN30sIHsyLCA5fQorfTsKKworCisKKy8qIENCUFkuIFN0cmFpZ2h0Zm9yd2FyZCBpbmRleGluZyAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY2JweV90YWJbMTZdID0KK3sKKyAgICB7MywgNH0sIHs1LCA1fSwgezQsIDV9LCB7OSwgNH0sIHszLCA1fSwgezcsIDR9LCB7MiwgNn0sIHsxMSwgNH0sCisgICAgezIsIDV9LCB7MywgNn0sIHs1LCA0fSwgezEwLCA0fSwgezQsIDR9LCB7OCwgNH0sIHs2LCA0fSwgezMsIDJ9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY2JweV90YWIzWzhdID0KK3sKKyAgICB7MywgM30sIHsxLCA2fSwgezEsIDV9LCB7MiwgM30sIHsyLCA1fSwgezMsIDV9LCB7MSwgM30sIHsxLCAxfQorfTsKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjYnB5X3RhYjJbNF0gPQoreworICAgIHsxLCA0fSwgezEsIDN9LCB7MSwgMn0sIHsxLCAxfQorfTsKKworLyogRENUIGNvZWZmaWNpZW50cy4gRm91ciB0YWJsZXMsIHR3byBmb3IgbGFzdCA9IDAsIHR3byBmb3IgbGFzdCA9IDEuCisgICB0aGUgc2lnbiBiaXQgbXVzdCBiZSBhZGRlZCBhZnRlcndhcmRzLiAqLworCisvKiBmaXJzdCBwYXJ0IG9mIGNvZWZmcyBmb3IgbGFzdCA9IDAuIEluZGV4ZWQgYnkgW3J1bl1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjBbMl1bMTJdID0KK3sKKyAgICAvKiBydW4gPSAwICovCisgICAgeworICAgICAgICB7MHgwMiwgMn0sIHsweDBmLCA0fSwgezB4MTUsIDZ9LCB7MHgxNywgN30sCisgICAgICAgIHsweDFmLCA4fSwgezB4MjUsIDl9LCB7MHgyNCwgOX0sIHsweDIxLCAxMH0sCisgICAgICAgIHsweDIwLCAxMH0sIHsweDA3LCAxMX0sIHsweDA2LCAxMX0sIHsweDIwLCAxMX0KKyAgICB9LAorICAgIC8qIHJ1biA9IDEgKi8KKyAgICB7CisgICAgICAgIHsweDA2LCAzfSwgezB4MTQsIDZ9LCB7MHgxZSwgOH0sIHsweDBmLCAxMH0sCisgICAgICAgIHsweDIxLCAxMX0sIHsweDUwLCAxMn0sIHsweDAwLCAwfSwgezB4MDAsIDB9LAorICAgICAgICB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9Cit9OworCisvKiByZXN0IG9mIGNvZWZmcyBmb3IgbGFzdCA9IDAuIGluZGV4aW5nIGJ5IFtydW4tMl1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjFbMjVdWzRdID0KK3sKKyAgICAvKiBydW4gPSAyICovCisgICAgeworICAgICAgICB7MHgwZSwgNH0sIHsweDFkLCA4fSwgezB4MGUsIDEwfSwgezB4NTEsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gMyAqLworICAgIHsKKyAgICAgICAgezB4MGQsIDV9LCB7MHgyMywgOX0sIHsweDBkLCAxMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gNC0yNiAqLworICAgIHsKKyAgICAgICAgezB4MGMsIDV9LCB7MHgyMiwgOX0sIHsweDUyLCAxMn0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgwYiwgNX0sIHsweDBjLCAxMH0sIHsweDUzLCAxMn0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxMywgNn0sIHsweDBiLCAxMH0sIHsweDU0LCAxMn0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxMiwgNn0sIHsweDBhLCAxMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDExLCA2fSwgezB4MDksIDEwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MTAsIDZ9LCB7MHgwOCwgMTB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxNiwgN30sIHsweDU1LCAxMn0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDE1LCA3fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxNCwgN30sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MWMsIDh9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDFiLCA4fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgyMSwgOX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MjAsIDl9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDFmLCA5fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxZSwgOX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MWQsIDl9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDFjLCA5fSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHgxYiwgOX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MWEsIDl9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDIyLCAxMX0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MjMsIDExfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sIHsweDAwLCAwfQorICAgIH0sCisgICAgeworICAgICAgICB7MHg1NiwgMTJ9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDU3LCAxMn0sIHsweDAwLCAwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0KKyAgICB9Cit9OworCisvKiBmaXJzdCBjb2VmZnMgb2YgbGFzdCA9IDEuIGluZGV4aW5nIGJ5IFtydW5dW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl90YWIyWzJdWzNdID0KK3sKKyAgICAvKiBydW4gPSAwICovCisgICAgeworICAgICAgICB7MHgwNywgNH0sIHsweDE5LCA5fSwgezB4MDUsIDExfQorICAgIH0sCisgICAgLyogcnVuID0gMSAqLworICAgIHsKKyAgICAgICAgezB4MGYsIDZ9LCB7MHgwNCwgMTF9LCB7MHgwMCwgMH0KKyAgICB9Cit9OworCisvKiByZXN0IG9mIGNvZWZmcyBmb3IgbGFzdCA9IDEuIGluZGV4aW5nIGJ5IFtydW4tMl0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjNbNDBdID0KK3sKKyAgICB7MHgwZSwgNn0sIHsweDBkLCA2fSwgezB4MGMsIDZ9LAorICAgIHsweDEzLCA3fSwgezB4MTIsIDd9LCB7MHgxMSwgN30sIHsweDEwLCA3fSwKKyAgICB7MHgxYSwgOH0sIHsweDE5LCA4fSwgezB4MTgsIDh9LCB7MHgxNywgOH0sCisgICAgezB4MTYsIDh9LCB7MHgxNSwgOH0sIHsweDE0LCA4fSwgezB4MTMsIDh9LAorICAgIHsweDE4LCA5fSwgezB4MTcsIDl9LCB7MHgxNiwgOX0sIHsweDE1LCA5fSwKKyAgICB7MHgxNCwgOX0sIHsweDEzLCA5fSwgezB4MTIsIDl9LCB7MHgxMSwgOX0sCisgICAgezB4MDcsIDEwfSwgezB4MDYsIDEwfSwgezB4MDUsIDEwfSwgezB4MDQsIDEwfSwKKyAgICB7MHgyNCwgMTF9LCB7MHgyNSwgMTF9LCB7MHgyNiwgMTF9LCB7MHgyNywgMTF9LAorICAgIHsweDU4LCAxMn0sIHsweDU5LCAxMn0sIHsweDVhLCAxMn0sIHsweDViLCAxMn0sCisgICAgezB4NWMsIDEyfSwgezB4NWQsIDEyfSwgezB4NWUsIDEyfSwgezB4NWYsIDEyfSwKKyAgICB7MHgwMCwgMH0KK307CisKKy8qIE5ldyB0YWJsZXMgZm9yIEludHJhIGx1bWluYW5jZSBjb2VmZmljaWVudHMuIFNhbWUgY29kZXdvcmRzLAorICAgZGlmZmVyZW50IG1lYW5pbmcgKi8KKworLyogQ29lZmZzIGZvciBsYXN0ID0gMCwgcnVuID0gMC4gSW5kZXhlZCBieSBbbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjRbMjddID0KK3sKKyAgICAvKiBydW4gPSAwICovCisgICAgezB4MDIsIDJ9LCB7MHgwNiwgM30sIHsweDBmLCA0fSwgezB4MGQsIDV9LAorICAgIHsweDBjLCA1fSwgezB4MTUsIDZ9LCB7MHgxMywgNn0sIHsweDEyLCA2fSwKKyAgICB7MHgxNywgN30sIHsweDFmLCA4fSwgezB4MWUsIDh9LCB7MHgxZCwgOH0sCisgICAgezB4MjUsIDl9LCB7MHgyNCwgOX0sIHsweDIzLCA5fSwgezB4MjEsIDl9LAorICAgIHsweDIxLCAxMH0sIHsweDIwLCAxMH0sIHsweDBmLCAxMH0sIHsweDBlLCAxMH0sCisgICAgezB4MDcsIDExfSwgezB4MDYsIDExfSwgezB4MjAsIDExfSwgezB4MjEsIDExfSwKKyAgICB7MHg1MCwgMTJ9LCB7MHg1MSwgMTJ9LCB7MHg1MiwgMTJ9Cit9OworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAwLCBydW4gPSAxLiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiNVsxMF0gPQoreworICAgIHsweDBlLCA0fSwgezB4MTQsIDZ9LCB7MHgxNiwgN30sIHsweDFjLCA4fSwKKyAgICB7MHgyMCwgOX0sIHsweDFmLCA5fSwgezB4MGQsIDEwfSwgezB4MjIsIDExfSwKKyAgICB7MHg1MywgMTJ9LCB7MHg1NSwgMTJ9Cit9OworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAwLCBydW4gPSAyIC0+IDkuIEluZGV4ZWQgYnkgW3J1bi0yXVtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiNls4XVs1XSA9Cit7CisgICAgLyogcnVuID0gMiAqLworICAgIHsKKyAgICAgICAgezB4MGIsIDV9LCB7MHgxNSwgN30sIHsweDFlLCA5fSwgezB4MGMsIDEwfSwKKyAgICAgICAgezB4NTYsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gMyAqLworICAgIHsKKyAgICAgICAgezB4MTEsIDZ9LCB7MHgxYiwgOH0sIHsweDFkLCA5fSwgezB4MGIsIDEwfSwKKyAgICAgICAgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA0ICovCisgICAgeworICAgICAgICB7MHgxMCwgNn0sIHsweDIyLCA5fSwgezB4MGEsIDEwfSwgezB4MDAsIDB9LAorICAgICAgICB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDUgKi8KKyAgICB7CisgICAgICAgIHsweDBkLCA2fSwgezB4MWMsIDl9LCB7MHgwOCwgMTB9LCB7MHgwMCwgMH0sCisgICAgICAgIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gNiAqLworICAgIHsKKyAgICAgICAgezB4MTIsIDd9LCB7MHgxYiwgOX0sIHsweDU0LCAxMn0sIHsweDAwLCAwfSwKKyAgICAgICAgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA3ICovCisgICAgeworICAgICAgICB7MHgxNCwgN30sIHsweDFhLCA5fSwgezB4NTcsIDEyfSwgezB4MDAsIDB9LAorICAgICAgICB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDggKi8KKyAgICB7CisgICAgICAgIHsweDE5LCA4fSwgezB4MDksIDEwfSwgezB4MDAsIDB9LCB7MHgwMCwgMH0sCisgICAgICAgIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gOSAqLworICAgIHsKKyAgICAgICAgezB4MTgsIDh9LCB7MHgyMywgMTF9LCB7MHgwMCwgMH0sIHsweDAwLCAwfSwKKyAgICAgICAgezB4MDAsIDB9CisgICAgfQorfTsKKworLyogQ29lZmZzIGZvciBsYXN0ID0gMCwgcnVuID0gMTAgLT4gMTQuIEluZGV4ZWQgYnkgW3J1bi0xMF0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjdbNV0gPQoreworICAgIHsweDE3LCA4fSwgezB4MTksIDl9LCB7MHgxOCwgOX0sIHsweDA3LCAxMH0sCisgICAgezB4NTgsIDEyfQorfTsKKworLyogQ29lZmZzIGZvciBsYXN0ID0gMSwgcnVuID0gMC4gSW5kZXhlZCBieSBbbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX3RhYjhbOF0gPQoreworICAgIHsweDA3LCA0fSwgezB4MGMsIDZ9LCB7MHgxNiwgOH0sIHsweDE3LCA5fSwKKyAgICB7MHgwNiwgMTB9LCB7MHgwNSwgMTF9LCB7MHgwNCwgMTF9LCB7MHg1OSwgMTJ9Cit9OworCisvKiBDb2VmZnMgZm9yIGxhc3QgPSAxLCBydW4gPSAxIC0+IDYuIEluZGV4ZWQgYnkgW3J1bi0xXVtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiOVs2XVszXSA9Cit7CisgICAgLyogcnVuID0gMSAqLworICAgIHsKKyAgICAgICAgezB4MGYsIDZ9LCB7MHgxNiwgOX0sIHsweDA1LCAxMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDIgKi8KKyAgICB7CisgICAgICAgIHsweDBlLCA2fSwgezB4MDQsIDEwfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSAzICovCisgICAgeworICAgICAgICB7MHgxMSwgN30sIHsweDI0LCAxMX0sIHsweDAwLCAwfQorICAgIH0sCisgICAgLyogcnVuID0gNCAqLworICAgIHsKKyAgICAgICAgezB4MTAsIDd9LCB7MHgyNSwgMTF9LCB7MHgwMCwgMH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDUgKi8KKyAgICB7CisgICAgICAgIHsweDEzLCA3fSwgezB4NWEsIDEyfSwgezB4MDAsIDB9CisgICAgfSwKKyAgICAvKiBydW4gPSA2ICovCisgICAgeworICAgICAgICB7MHgxNSwgOH0sIHsweDViLCAxMn0sIHsweDAwLCAwfQorICAgIH0KK307CisKKy8qIENvZWZmcyBmb3IgbGFzdCA9IDEsIHJ1biA9IDcgLT4gMjAuIEluZGV4ZWQgYnkgW3J1bi03XSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfdGFiMTBbMTRdID0KK3sKKyAgICB7MHgxNCwgOH0sIHsweDEzLCA4fSwgezB4MWEsIDh9LCB7MHgxNSwgOX0sCisgICAgezB4MTQsIDl9LCB7MHgxMywgOX0sIHsweDEyLCA5fSwgezB4MTEsIDl9LAorICAgIHsweDI2LCAxMX0sIHsweDI3LCAxMX0sIHsweDVjLCAxMn0sIHsweDVkLCAxMn0sCisgICAgezB4NWUsIDEyfSwgezB4NWYsIDEyfQorfTsKKworCisjaWZuZGVmIE5PX1JWTEMKKy8qIFJWTEMgdGFibGVzICovCisvKiBEQ1QgY29lZmZpY2llbnRzLiBGb3VyIHRhYmxlcywgdHdvIGZvciBsYXN0ID0gMCwgdHdvIGZvciBsYXN0ID0gMS4KKyAgIHRoZSBzaWduIGJpdCBtdXN0IGJlIGFkZGVkIGFmdGVyd2FyZHMuICovCisKKy8qIERDVCAgY29lZmZzIChpbnRyYSkgZm9yIGxhc3QgPSAwLiAgKi8KKworLyogSW5kZXhlZCBieSBbbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxWzI3XSA9Cit7CisgICAgLyogcnVuID0gMCAqLworICAgIHsgICAgIDB4NiwgIDN9LAorICAgIHsgICAgIDB4NywgIDN9LAorICAgIHsgICAgIDB4YSwgIDR9LAorICAgIHsgICAgIDB4OSwgIDV9LAorICAgIHsgICAgMHgxNCwgIDZ9LAorICAgIHsgICAgMHgxNSwgIDZ9LAorICAgIHsgICAgMHgzNCwgIDd9LAorICAgIHsgICAgMHg3NCwgIDh9LAorICAgIHsgICAgMHg3NSwgIDh9LAorICAgIHsgICAgMHhkZCwgIDl9LAorICAgIHsgICAgMHhlYywgIDl9LAorICAgIHsgICAweDFlYywgMTB9LAorICAgIHsgICAweDFlZCwgMTB9LAorICAgIHsgICAweDFmNCwgMTB9LAorICAgIHsgICAweDNlYywgMTF9LAorICAgIHsgICAweDNlZCwgMTF9LAorICAgIHsgICAweDNmNCwgMTF9LAorICAgIHsgICAweDc3ZCwgMTJ9LAorICAgIHsgICAweDdiYywgMTJ9LAorICAgIHsgICAweGZiZCwgMTN9LAorICAgIHsgICAweGZkYywgMTN9LAorICAgIHsgICAweDdiZCwgMTJ9LAorICAgIHsgICAweGZkZCwgMTN9LAorICAgIHsgIDB4MWZiZCwgMTR9LAorICAgIHsgIDB4MWZkYywgMTR9LAorICAgIHsgIDB4MWZkZCwgMTR9LAorICAgIHsgIDB4MWZmYywgMTV9Cit9OworCisKKy8qIEluZGV4ZWQgYnkgW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMlsxM10gPQoreworICAgIC8qIHJ1biA9IDEgKi8KKyAgICB7ICAgICAweDEsICA0fSwKKyAgICB7ICAgICAweDgsICA1fSwKKyAgICB7ICAgIDB4MmQsICA3fSwKKyAgICB7ICAgIDB4NmMsICA4fSwKKyAgICB7ICAgIDB4NmQsICA4fSwKKyAgICB7ICAgIDB4ZGMsICA5fSwKKyAgICB7ICAgMHgxZGQsIDEwfSwKKyAgICB7ICAgMHgzZGMsIDExfSwKKyAgICB7ICAgMHgzZGQsIDExfSwKKyAgICB7ICAgMHg3N2MsIDEyfSwKKyAgICB7ICAgMHhmYmMsIDEzfSwKKyAgICB7ICAweDFmN2QsIDE0fSwKKyAgICB7ICAweDFmYmMsIDE0fQorfTsKKworCisvKiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjNbMTFdID0KK3sKKyAgICAvKiBydW4gPSAyICovCisKKyAgICB7ICAgICAweDQsICA1fSwKKyAgICB7ICAgIDB4MmMsICA3fSwKKyAgICB7ICAgIDB4YmMsICA5fSwKKyAgICB7ICAgMHgxZGMsIDEwfSwKKyAgICB7ICAgMHgzYmMsIDExfSwKKyAgICB7ICAgMHgzYmQsIDExfSwKKyAgICB7ICAgMHhlZmQsIDEzfSwKKyAgICB7ICAgMHhmN2MsIDEzfSwKKyAgICB7ICAgMHhmN2QsIDEzfSwKKyAgICB7ICAweDFlZmQsIDE0fSwKKyAgICB7ICAweDFmN2MsIDE0fQorfTsKKworCisvKiBJbmRleGVkIGJ5IFtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjRbOV0gPQoreworICAgIC8qIHJ1biA9IDMgKi8KKyAgICB7ICAgICAweDUsICA1fSwKKyAgICB7ICAgIDB4NWMsICA4fSwKKyAgICB7ICAgIDB4YmQsICA5fSwKKyAgICB7ICAgMHgzN2QsIDExfSwKKyAgICB7ICAgMHg2ZmMsIDEyfSwKKyAgICB7ICAgMHhlZmMsIDEzfSwKKyAgICB7ICAweDFkZmQsIDE0fSwKKyAgICB7ICAweDFlZmMsIDE0fSwKKyAgICB7ICAweDFmZmQsIDE1fQorfTsKKworCisvKiBJbmRleGVkIGJ5IFtydW4tNF1bbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWI1WzJdWzZdID0KK3sKKyAgICAvKiBydW4gPSA0ICovCisgICAgeworICAgICAgICB7ICAgICAweGMsICA2fSwKKyAgICAgICAgeyAgICAweDVkLCAgOH0sCisgICAgICAgIHsgICAweDFiZCwgMTB9LAorICAgICAgICB7ICAgMHgzZmQsIDEyfSwKKyAgICAgICAgeyAgIDB4NmZkLCAxMn0sCisgICAgICAgIHsgIDB4MWJmZCwgMTR9CisgICAgfSwKKyAgICAvKiBydW4gPSA1ICovCisgICAgeworICAgICAgICB7ICAgICAweGQsICA2fSwKKyAgICAgICAgeyAgICAweDdkLCAgOX0sCisgICAgICAgIHsgICAweDJmYywgMTF9LAorICAgICAgICB7ICAgMHg1ZmMsIDEyfSwKKyAgICAgICAgeyAgMHgxYmZjLCAxNH0sCisgICAgICAgIHsgIDB4MWRmYywgMTR9CisgICAgfQorfTsKKworCisvKiBJbmRleGVkIGJ5IFtydW4tNl1bbGV2ZWwtMV0gICAgICAgKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWI2WzJdWzVdID0KK3sKKworICAgIC8qIHJ1biA9IDYgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgxYywgIDd9LAorICAgICAgICB7ICAgMHgxN2MsIDEwfSwKKyAgICAgICAgeyAgIDB4MmZkLCAxMX0sCisgICAgICAgIHsgICAweDVmZCwgMTJ9LAorICAgICAgICB7ICAweDJmZmMsIDE1fQorICAgIH0sCisgICAgLyogcnVuID0gNyAqLworICAgIHsKKyAgICAgICAgeyAgICAweDFkLCAgN30sCisgICAgICAgIHsgICAweDE3ZCwgMTB9LAorICAgICAgICB7ICAgMHgzN2MsIDExfSwKKyAgICAgICAgeyAgIDB4ZGZkLCAxM30sCisgICAgICAgIHsgIDB4MmZmZCwgMTV9CisgICAgfQorCit9OworLyogSW5kZXhlZCBieSBbcnVuLThdW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiN1syXVs0XSA9Cit7CisgICAgLyogcnVuID0gOCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDNjLCAgOH0sCisgICAgICAgIHsgICAweDFiYywgMTB9LAorICAgICAgICB7ICAgMHhiZmQsIDEzfSwKKyAgICAgICAgeyAgMHgxN2ZkLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDkgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgzZCwgIDh9LAorICAgICAgICB7ICAgMHgxZmQsIDExfSwKKyAgICAgICAgeyAgIDB4ZGZjLCAxM30sCisgICAgICAgIHsgIDB4MzdmYywgMTV9LAorICAgIH0KK307CisKKworCisvKiBJbmRleGVkIGJ5IFtydW4tMTBdW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiOFszXVsyXSA9Cit7CisgICAgLyogcnVuID0gMTAgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg3YywgIDl9LAorICAgICAgICB7ICAgMHgzZmMsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gMTEgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHhmYywgMTB9LAorICAgICAgICB7ICAgMHhiZmMsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gMTIgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHhmZCwgMTB9LAorICAgICAgICB7ICAweDM3ZmQsIDE1fQorICAgIH0KK307CisKKworLyogSW5kZXhlZCBieSBbbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWI5WzddID0KK3sKKyAgICAvKiBydW4gPSAxMyAtPiAxOSAqLworICAgIHsgICAweDFmYywgMTF9LAorICAgIHsgICAweDdmYywgMTN9LAorICAgIHsgICAweDdmZCwgMTN9LAorICAgIHsgICAweGZmYywgMTR9LAorICAgIHsgICAweGZmZCwgMTR9LAorICAgIHsgIDB4MTdmYywgMTR9LAorICAgIHsgIDB4M2JmYywgMTV9Cit9OworCisKKworLyogZmlyc3QgY29lZmZzIG9mIGxhc3QgPSAxLiBpbmRleGluZyBieSBbcnVuXVtsZXZlbC0xXSAqLworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjEwWzJdWzVdID0KK3sKKyAgICAvKiBydW4gPSAwICovCisgICAgeworICAgICAgICB7ICAgICAweGIsICA0fSwKKyAgICAgICAgeyAgICAweDc4LCAgOH0sCisgICAgICAgIHsgICAweDNmNSwgMTF9LAorICAgICAgICB7ICAgMHhmZWMsIDEzfSwKKyAgICAgICAgeyAgMHgxZmVjLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDEgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgxMiwgIDV9LAorICAgICAgICB7ICAgIDB4ZWQsICA5fSwKKyAgICAgICAgeyAgIDB4N2RjLCAxMn0sCisgICAgICAgIHsgIDB4MWZlZCwgMTR9LAorICAgICAgICB7ICAweDNiZmQsIDE1fQorICAgIH0KKworfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxMVszXSA9Cit7CisgICAgLyogcnVuID0gMiAqLworICAgIHsgICAgMHgxMywgIDV9LAorICAgIHsgICAweDNmOCwgMTF9LAorICAgIHsgIDB4M2RmYywgMTV9CisKK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMTJbMTFdWzJdID0KK3sKKyAgICAvKiBydW4gPSAzICovCisgICAgeworICAgICAgICB7ICAgIDB4MTgsICA2fSwKKyAgICAgICAgeyAgIDB4N2RkLCAxMn0KKyAgICB9LAorICAgIC8qIHJ1biA9IDQgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgxOSwgIDZ9LAorICAgICAgICB7ICAgMHg3ZWMsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gNSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDIyLCAgNn0sCisgICAgICAgIHsgICAweGZlZCwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA2ICovCisgICAgeworICAgICAgICB7ICAgIDB4MjMsICA2fSwKKyAgICAgICAgeyAgIDB4ZmY0LCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDcgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgzNSwgIDd9LAorICAgICAgICB7ICAgMHhmZjUsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gOCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDM4LCAgN30sCisgICAgICAgIHsgICAweGZmOCwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA5ICovCisgICAgeworICAgICAgICB7ICAgIDB4MzksICA3fSwKKyAgICAgICAgeyAgIDB4ZmY5LCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDEwICovCisgICAgeworICAgICAgICB7ICAgIDB4NDIsICA3fSwKKyAgICAgICAgeyAgMHgxZmY0LCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDExICovCisgICAgeworICAgICAgICB7ICAgIDB4NDMsICA3fSwKKyAgICAgICAgeyAgMHgxZmY1LCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDEyICovCisgICAgeworICAgICAgICB7ICAgIDB4NzksICA4fSwKKyAgICAgICAgeyAgMHgxZmY4LCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDEzICovCisgICAgeworICAgICAgICB7ICAgIDB4ODIsICA4fSwKKyAgICAgICAgeyAgMHgzZGZkLCAxNX0KKyAgICB9CisKK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMTNbMzJdID0KK3sKKyAgICAvKiBydW4gPSAxNCAtPiA0NCAqLworICAgIHsgICAgMHg4MywgIDh9LAorICAgIHsgICAgMHhmNCwgIDl9LAorICAgIHsgICAgMHhmNSwgIDl9LAorICAgIHsgICAgMHhmOCwgIDl9LAorICAgIHsgICAgMHhmOSwgIDl9LAorICAgIHsgICAweDEwMiwgIDl9LAorICAgIHsgICAweDEwMywgIDl9LAorICAgIHsgICAweDFmNSwgMTB9LAorICAgIHsgICAweDFmOCwgMTB9LAorICAgIHsgICAweDFmOSwgMTB9LAorICAgIHsgICAweDIwMiwgMTB9LAorICAgIHsgICAweDIwMywgMTB9LAorICAgIHsgICAweDNmOSwgMTF9LAorICAgIHsgICAweDQwMiwgMTF9LAorICAgIHsgICAweDQwMywgMTF9LAorICAgIHsgICAweDdlZCwgMTJ9LAorICAgIHsgICAweDdmNCwgMTJ9LAorICAgIHsgICAweDdmNSwgMTJ9LAorICAgIHsgICAweDdmOCwgMTJ9LAorICAgIHsgICAweDdmOSwgMTJ9LAorICAgIHsgICAweDgwMiwgMTJ9LAorICAgIHsgICAweDgwMywgMTJ9LAorICAgIHsgIDB4MTAwMiwgMTN9LAorICAgIHsgIDB4MTAwMywgMTN9LAorICAgIHsgIDB4MWZmOSwgMTR9LAorICAgIHsgIDB4MjAwMiwgMTR9LAorICAgIHsgIDB4MjAwMywgMTR9LAorICAgIHsgIDB4M2VmYywgMTV9LAorICAgIHsgIDB4M2VmZCwgMTV9LAorICAgIHsgIDB4M2Y3YywgMTV9LAorICAgIHsgIDB4M2Y3ZCwgMTV9Cit9OworCisKKworLyogQ29lZmZzIGZvciBsYXN0ID0gMCwgcnVuID0gMC4gSW5kZXhlZCBieSBbbGV2ZWwtMV0gKi8KKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxNFsxOV0gPQoreworICAgIC8qIHJ1biA9IDAgKi8KKyAgICB7ICAgICAweDYsICAzfSwKKyAgICB7ICAgICAweDEsICA0fSwKKyAgICB7ICAgICAweDQsICA1fSwKKyAgICB7ICAgIDB4MWMsICA3fSwKKyAgICB7ICAgIDB4M2MsICA4fSwKKyAgICB7ICAgIDB4M2QsICA4fSwKKyAgICB7ICAgIDB4N2MsICA5fSwKKyAgICB7ICAgIDB4ZmMsIDEwfSwKKyAgICB7ICAgIDB4ZmQsIDEwfSwKKyAgICB7ICAgMHgxZmMsIDExfSwKKyAgICB7ICAgMHgxZmQsIDExfSwKKyAgICB7ICAgMHgzZmMsIDEyfSwKKyAgICB7ICAgMHg3ZmMsIDEzfSwKKyAgICB7ICAgMHg3ZmQsIDEzfSwKKyAgICB7ICAgMHhiZmMsIDEzfSwKKyAgICB7ICAgMHhiZmQsIDEzfSwKKyAgICB7ICAgMHhmZmMsIDE0fSwKKyAgICB7ICAgMHhmZmQsIDE0fSwKKyAgICB7ICAweDFmZmMsIDE1fQorfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxNVsxMF0gPQoreworICAgIC8qIHJ1biA9IDEgKi8KKyAgICB7ICAgICAweDcsICAzfSwKKyAgICB7ICAgICAweGMsICA2fSwKKyAgICB7ICAgIDB4NWMsICA4fSwKKyAgICB7ICAgIDB4N2QsICA5fSwKKyAgICB7ICAgMHgxN2MsIDEwfSwKKyAgICB7ICAgMHgyZmMsIDExfSwKKyAgICB7ICAgMHgzZmQsIDEyfSwKKyAgICB7ICAgMHhkZmMsIDEzfSwKKyAgICB7ICAweDE3ZmMsIDE0fSwKKyAgICB7ICAweDE3ZmQsIDE0fQorfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxNlsyXVs3XSA9Cit7CisgICAgLyogcnVuID0gMiAqLworICAgIHsKKyAgICAgICAgeyAgICAgMHhhLCAgNH0sCisgICAgICAgIHsgICAgMHgxZCwgIDd9LAorICAgICAgICB7ICAgIDB4YmMsICA5fSwKKyAgICAgICAgeyAgIDB4MmZkLCAxMX0sCisgICAgICAgIHsgICAweDVmYywgMTJ9LAorICAgICAgICB7ICAweDFiZmMsIDE0fSwKKyAgICAgICAgeyAgMHgxYmZkLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDMgKi8KKyAgICB7CisgICAgICAgIHsgICAgIDB4NSwgIDV9LAorICAgICAgICB7ICAgIDB4NWQsICA4fSwKKyAgICAgICAgeyAgIDB4MTdkLCAxMH0sCisgICAgICAgIHsgICAweDVmZCwgMTJ9LAorICAgICAgICB7ICAgMHhkZmQsIDEzfSwKKyAgICAgICAgeyAgMHgxZGZjLCAxNH0sCisgICAgICAgIHsgIDB4MWZmZCwgMTV9CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxN1s1XSA9Cit7CisgICAgLyogcnVuID0gNCAqLworICAgIHsgICAgIDB4OCwgIDV9LAorICAgIHsgICAgMHg2YywgIDh9LAorICAgIHsgICAweDM3YywgMTF9LAorICAgIHsgICAweGVmYywgMTN9LAorICAgIHsgIDB4MmZmYywgMTV9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjE4WzNdWzRdID0KK3sKKyAgICAvKiBydW4gPSA1ICovCisgICAgeworICAgICAgICB7ICAgICAweDksICA1fSwKKyAgICAgICAgeyAgICAweGJkLCAgOX0sCisgICAgICAgIHsgICAweDM3ZCwgMTF9LAorICAgICAgICB7ICAgMHhlZmQsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gNiAqLworICAgIHsKKyAgICAgICAgeyAgICAgMHhkLCAgNn0sCisgICAgICAgIHsgICAweDFiYywgMTB9LAorICAgICAgICB7ICAgMHg2ZmMsIDEyfSwKKyAgICAgICAgeyAgMHgxZGZkLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDcgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgxNCwgIDZ9LAorICAgICAgICB7ICAgMHgxYmQsIDEwfSwKKyAgICAgICAgeyAgIDB4NmZkLCAxMn0sCisgICAgICAgIHsgIDB4MmZmZCwgMTV9CisgICAgfQorfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIxOVsyXVszXSA9Cit7CisgICAgLyogcnVuID0gOCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDE1LCAgNn0sCisgICAgICAgIHsgICAweDFkYywgMTB9LAorICAgICAgICB7ICAgMHhmN2MsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gOSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDJjLCAgN30sCisgICAgICAgIHsgICAweDFkZCwgMTB9LAorICAgICAgICB7ICAweDFlZmMsIDE0fQorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMjBbOF1bMl0gPQoreworICAgIC8qIHJ1biA9IDEwICovCisgICAgeworICAgICAgICB7ICAgIDB4MmQsICA3fSwKKyAgICAgICAgeyAgIDB4M2JjLCAxMX0KKyAgICB9LAorICAgIC8qIHJ1biA9IDExICovCisgICAgeworICAgICAgICB7ICAgIDB4MzQsICA3fSwKKyAgICAgICAgeyAgIDB4NzdjLCAxMn0KKyAgICB9LAorICAgIC8qIHJ1biA9IDEyICovCisgICAgeworICAgICAgICB7ICAgIDB4NmQsICA4fSwKKyAgICAgICAgeyAgIDB4ZjdkLCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDEzICovCisgICAgeworICAgICAgICB7ICAgIDB4NzQsICA4fSwKKyAgICAgICAgeyAgMHgxZWZkLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDE0ICovCisgICAgeworICAgICAgICB7ICAgIDB4NzUsICA4fSwKKyAgICAgICAgeyAgMHgxZjdjLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDE1ICovCisgICAgeworICAgICAgICB7ICAgIDB4ZGMsICA5fSwKKyAgICAgICAgeyAgMHgxZjdkLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDE2ICovCisgICAgeworICAgICAgICB7ICAgIDB4ZGQsICA5fSwKKyAgICAgICAgeyAgMHgxZmJjLCAxNH0KKyAgICB9LAorICAgIC8qIHJ1biA9IDE3ICovCisgICAgeworICAgICAgICB7ICAgIDB4ZWMsICA5fSwKKyAgICAgICAgeyAgMHgzN2ZjLCAxNX0KKyAgICB9Cit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjIxWzIxXSA9Cit7CisgICAgLyogcnVuID0gMTggLT4gMzggKi8KKyAgICB7ICAgMHgxZWMsIDEwfSwKKyAgICB7ICAgMHgxZWQsIDEwfSwKKyAgICB7ICAgMHgxZjQsIDEwfSwKKyAgICB7ICAgMHgzYmQsIDExfSwKKyAgICB7ICAgMHgzZGMsIDExfSwKKyAgICB7ICAgMHgzZGQsIDExfSwKKyAgICB7ICAgMHgzZWMsIDExfSwKKyAgICB7ICAgMHgzZWQsIDExfSwKKyAgICB7ICAgMHgzZjQsIDExfSwKKyAgICB7ICAgMHg3N2QsIDEyfSwKKyAgICB7ICAgMHg3YmMsIDEyfSwKKyAgICB7ICAgMHg3YmQsIDEyfSwKKyAgICB7ICAgMHhmYmMsIDEzfSwKKyAgICB7ICAgMHhmYmQsIDEzfSwKKyAgICB7ICAgMHhmZGMsIDEzfSwKKyAgICB7ICAgMHhmZGQsIDEzfSwKKyAgICB7ICAweDFmYmQsIDE0fSwKKyAgICB7ICAweDFmZGMsIDE0fSwKKyAgICB7ICAweDFmZGQsIDE0fSwKKyAgICB7ICAweDM3ZmQsIDE1fSwKKyAgICB7ICAweDNiZmMsIDE1fQorfTsKKworCisvKiBmaXJzdCBjb2VmZnMgb2YgbGFzdCA9IDEuIGluZGV4aW5nIGJ5IFtydW5dW2xldmVsLTFdICovCisKK3N0YXRpYyBjb25zdCBWTEN0YWJsZSBjb2VmZl9SVkxDdGFiMjJbMl1bNV0gPQoreworICAgIC8qIHJ1biA9IDAgKi8KKyAgICB7CisgICAgICAgIHsgICAgIDB4YiwgIDR9LAorICAgICAgICB7ICAgIDB4NzgsICA4fSwKKyAgICAgICAgeyAgIDB4M2Y1LCAxMX0sCisgICAgICAgIHsgICAweGZlYywgMTN9LAorICAgICAgICB7ICAweDFmZWMsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMSAqLworICAgIHsKKyAgICAgICAgeyAgICAweDEyLCAgNX0sCisgICAgICAgIHsgICAgMHhlZCwgIDl9LAorICAgICAgICB7ICAgMHg3ZGMsIDEyfSwKKyAgICAgICAgeyAgMHgxZmVkLCAxNH0sCisgICAgICAgIHsgIDB4M2JmZCwgMTV9CisgICAgfQorCit9OworCitzdGF0aWMgY29uc3QgVkxDdGFibGUgY29lZmZfUlZMQ3RhYjIzWzNdID0KK3sKKyAgICAvKiBydW4gPSAyICovCisgICAgeyAgICAweDEzLCAgNX0sCisgICAgeyAgIDB4M2Y4LCAxMX0sCisgICAgeyAgMHgzZGZjLCAxNX0KKworfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIyNFsxMV1bMl0gPQoreworICAgIC8qIHJ1biA9IDMgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgxOCwgIDZ9LAorICAgICAgICB7ICAgMHg3ZGQsIDEyfQorICAgIH0sCisgICAgLyogcnVuID0gNCAqLworICAgIHsKKyAgICAgICAgeyAgICAweDE5LCAgNn0sCisgICAgICAgIHsgICAweDdlYywgMTJ9CisgICAgfSwKKyAgICAvKiBydW4gPSA1ICovCisgICAgeworICAgICAgICB7ICAgIDB4MjIsICA2fSwKKyAgICAgICAgeyAgIDB4ZmVkLCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDYgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgyMywgIDZ9LAorICAgICAgICB7ICAgMHhmZjQsIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gNyAqLworICAgIHsKKyAgICAgICAgeyAgICAweDM1LCAgN30sCisgICAgICAgIHsgICAweGZmNSwgMTN9CisgICAgfSwKKyAgICAvKiBydW4gPSA4ICovCisgICAgeworICAgICAgICB7ICAgIDB4MzgsICA3fSwKKyAgICAgICAgeyAgIDB4ZmY4LCAxM30KKyAgICB9LAorICAgIC8qIHJ1biA9IDkgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHgzOSwgIDd9LAorICAgICAgICB7ICAgMHhmZjksIDEzfQorICAgIH0sCisgICAgLyogcnVuID0gMTAgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg0MiwgIDd9LAorICAgICAgICB7ICAweDFmZjQsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTEgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg0MywgIDd9LAorICAgICAgICB7ICAweDFmZjUsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTIgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg3OSwgIDh9LAorICAgICAgICB7ICAweDFmZjgsIDE0fQorICAgIH0sCisgICAgLyogcnVuID0gMTMgKi8KKyAgICB7CisgICAgICAgIHsgICAgMHg4MiwgIDh9LAorICAgICAgICB7ICAweDNkZmQsIDE1fQorICAgIH0KKworfTsKKworc3RhdGljIGNvbnN0IFZMQ3RhYmxlIGNvZWZmX1JWTEN0YWIyNVszMl0gPQoreworICAgIC8qIHJ1biA9IDE0IC0+IDQ0ICovCisgICAgeyAgICAweDgzLCAgOH0sCisgICAgeyAgICAweGY0LCAgOX0sCisgICAgeyAgICAweGY1LCAgOX0sCisgICAgeyAgICAweGY4LCAgOX0sCisgICAgeyAgICAweGY5LCAgOX0sCisgICAgeyAgIDB4MTAyLCAgOX0sCisgICAgeyAgIDB4MTAzLCAgOX0sCisgICAgeyAgIDB4MWY1LCAxMH0sCisgICAgeyAgIDB4MWY4LCAxMH0sCisgICAgeyAgIDB4MWY5LCAxMH0sCisgICAgeyAgIDB4MjAyLCAxMH0sCisgICAgeyAgIDB4MjAzLCAxMH0sCisgICAgeyAgIDB4M2Y5LCAxMX0sCisgICAgeyAgIDB4NDAyLCAxMX0sCisgICAgeyAgIDB4NDAzLCAxMX0sCisgICAgeyAgIDB4N2VkLCAxMn0sCisgICAgeyAgIDB4N2Y0LCAxMn0sCisgICAgeyAgIDB4N2Y1LCAxMn0sCisgICAgeyAgIDB4N2Y4LCAxMn0sCisgICAgeyAgIDB4N2Y5LCAxMn0sCisgICAgeyAgIDB4ODAyLCAxMn0sCisgICAgeyAgIDB4ODAzLCAxMn0sCisgICAgeyAgMHgxMDAyLCAxM30sCisgICAgeyAgMHgxMDAzLCAxM30sCisgICAgeyAgMHgxZmY5LCAxNH0sCisgICAgeyAgMHgyMDAyLCAxNH0sCisgICAgeyAgMHgyMDAzLCAxNH0sCisgICAgeyAgMHgzZWZjLCAxNX0sCisgICAgeyAgMHgzZWZkLCAxNX0sCisgICAgeyAgMHgzZjdjLCAxNX0sCisgICAgeyAgMHgzZjdkLCAxNX0KK307CisKKyNlbmRpZiAvKiBOT19SVkxDICovCisKKyNlbmRpZiAvKiBfVkxDX0VOQ19UQUJfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE1ZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKQEAgLTAsMCArMSwyNzk5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBUaGlzIHNvZnR3YXJlIG1vZHVsZSB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkKKyoKKyogUm9iZXJ0IERhbmllbHNlbiAoVGVsZW5vciAvIEFDVFMtTW9NdVN5cykuCisqCisqIGFuZCBlZGl0ZWQgYnkKKyoKKyogTHVpcyBEdWNsYS1Tb2FyZXMgKElTVCAvIEFDVFMtTW9NdVN5cykuCisqIENvciBRdWlzdCAoS1BOIC8gQUNUUy1Nb011U3lzKS4KKyoKKyogaW4gdGhlIGNvdXJzZSBvZiBkZXZlbG9wbWVudCBvZiB0aGUgTVBFRy00IFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHN0YW5kYXJkLgorKiBUaGlzIHNvZnR3YXJlIG1vZHVsZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIHBhcnQgb2Ygb25lIG9yIG1vcmUgTVBFRy00CisqIFZpZGVvIChJU08vSUVDIDE0NDk2LTIpIHRvb2xzIGFzIHNwZWNpZmllZCBieSB0aGUgTVBFRy00IFZpZGVvIChJU08vSUVDCisqIDE0NDk2LTIpIHN0YW5kYXJkLgorKgorKiBJU08vSUVDIGdpdmVzIHVzZXJzIG9mIHRoZSBNUEVHLTQgVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgc3RhbmRhcmQgZnJlZQorKiBsaWNlbnNlIHRvIHRoaXMgc29mdHdhcmUgbW9kdWxlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmVvZiBmb3IgdXNlIGluIGhhcmR3YXJlCisqIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGNsYWltaW5nIGNvbmZvcm1hbmNlIHRvIHRoZSBNUEVHLTQgVmlkZW8gKElTTy9JRUMKKyogMTQ0OTYtMikgc3RhbmRhcmQuCisqCisqIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb2Z0d2FyZSBtb2R1bGUgaW4gaGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMKKyogYXJlIGFkdmlzZWQgdGhhdCBpdHMgdXNlIG1heSBpbmZyaW5nZSBleGlzdGluZyBwYXRlbnRzLiBUaGUgb3JpZ2luYWwKKyogZGV2ZWxvcGVyIG9mIHRoaXMgc29mdHdhcmUgbW9kdWxlIGFuZCBoaXMvaGVyIGNvbXBhbnksIHRoZSBzdWJzZXF1ZW50CisqIGVkaXRvcnMgYW5kIHRoZWlyIGNvbXBhbmllcywgYW5kIElTTy9JRUMgaGF2ZSBubyBsaWFiaWxpdHkgZm9yIHVzZSBvZiB0aGlzCisqIHNvZnR3YXJlIG1vZHVsZSBvciBtb2RpZmljYXRpb25zIHRoZXJlb2YgaW4gYW4gaW1wbGVtZW50YXRpb24uIENvcHlyaWdodCBpcworKiBub3QgcmVsZWFzZWQgZm9yIG5vbiBNUEVHLTQgVmlkZW8gKElTTy9JRUMgMTQ0OTYtMikgc3RhbmRhcmQgY29uZm9ybWluZworKiBwcm9kdWN0cy4KKyoKKyogQUNUUy1Nb011U3lzIHBhcnRuZXJzIHJldGFpbiBmdWxsIHJpZ2h0IHRvIHVzZSB0aGUgY29kZSBmb3IgaGlzL2hlciBvd24KKyogcHVycG9zZSwgYXNzaWduIG9yIGRvbmF0ZSB0aGUgY29kZSB0byBhIHRoaXJkIHBhcnR5IGFuZCB0byBpbmhpYml0IHRoaXJkCisqIHBhcnRpZXMgZnJvbSB1c2luZyB0aGUgY29kZSBmb3Igbm9uIE1QRUctNCBWaWRlbyAoSVNPL0lFQyAxNDQ5Ni0yKSBzdGFuZGFyZAorKiBjb25mb3JtaW5nIHByb2R1Y3RzLiBUaGlzIGNvcHlyaWdodCBub3RpY2UgbXVzdCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yCisqIGRlcml2YXRpdmUgd29ya3MuCisqCisqIENvcHlyaWdodCAoYykgMTk5NworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkhlYWRlckJlZ2luKioqKioqKgorKgorKiBGaWxlOiBwdXR2bGMuYworKgorKiBBdXRob3I6ICAgUm9iZXJ0IERhbmllbHNlbiwgVGVsZW5vciBSJkQKKyogQ3JlYXRlZDogIDA3LjA3Ljk2CisqCisqIERlc2NyaXB0aW9uOiBGdW5jdGlvbnMgZm9yIHdyaXRpbmcgdG8gYml0c3RyZWFtCisqCisqIE5vdGVzOiAgICBTYW1lIGtpbmQgb2YgdGFibGVzIGFzIGluIHRoZSBNUEVHLTIgc29mdHdhcmUgc2ltdWxhdGlvbgorKiAgICAgICBncm91cCBzb2Z0d2FyZS4KKyoKKyogTW9kaWZpZWQ6CisqICAgMjguMTAuOTYgUm9iZXJ0IERhbmllbHNlbjogQWRkZWQgUHV0Q29lZmZfSW50cmEoKSwgcmVuYW1lZAorKiAgICAgICAgICAgUHV0Q29lZmYoKSB0byBQdXRDb2VmZl9JbnRlcigpLgorKiAgIDA2LjExLjk2IFJvYmVydCBEYW5pZWxzZW46IEFkZGVkIFB1dE1DQlBDX3NlcCgpCisqICAgICAgMDEuMDUuOTcgTHVpcyBEdWNsYS1Tb2FyZXM6IGFkZGVkIFB1dENvZWZmX0ludHJhX1JWTEMoKSBhbmQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Q29lZmZfSW50ZXJfUlZMQygpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipIZWFkZXJFbmQqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiogICAgSU5DTFVERSBGSUxFUyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisjaW5jbHVkZSAibXA0bGliX2ludC5oIgorI2luY2x1ZGUgIm1wNGVuY19saWIuaCIKKyNpbmNsdWRlICJ2bGNfZW5jX3RhYi5oIgorI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisjaW5jbHVkZSAidmxjX2VuY29kZV9pbmxpbmUuaCIKKwordHlwZWRlZiB2b2lkICgqQmxvY2tDb2RlQ29lZmZQdHIpKFJ1bkxldmVsQmxvY2sqLCBCaXRzdHJlYW1FbmNWaWRlbyosIEludCwgSW50LCBVQ2hhcikgOworCitjb25zdCBzdGF0aWMgSW50IG1vZGVfTUJ0eXBlW10gPQoreworICAgIDMsCisgICAgMCwKKyAgICA0LAorICAgIDEsCisgICAgMiwKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgemlnemFnX2ludltOQ09FRkZfQkxPQ0tdID0KK3sKKyAgICAwLCAgMSwgIDgsIDE2LCAgOSwgIDIsICAzLCAxMCwKKyAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCAgNCwgIDUsCisgICAgMTIsIDE5LCAyNiwgMzMsIDQwLCA0OCwgNDEsIDM0LAorICAgIDI3LCAyMCwgMTMsICA2LCAgNywgMTQsIDIxLCAyOCwKKyAgICAzNSwgNDIsIDQ5LCA1NiwgNTcsIDUwLCA0MywgMzYsCisgICAgMjksIDIyLCAxNSwgMjMsIDMwLCAzNywgNDQsIDUxLAorICAgIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKKyAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKK307CisKKy8qIEhvcml6b250YWwgemlnemFnIGludmVyc2UgKi8KK2NvbnN0IHN0YXRpYyBJbnQgemlnemFnX2hfaW52W05DT0VGRl9CTE9DS10gPQoreworICAgIDAsIDEsIDIsIDMsIDgsIDksIDE2LCAxNywKKyAgICAxMCwgMTEsIDQsIDUsIDYsIDcsIDE1LCAxNCwKKyAgICAxMywgMTIsIDE5LCAxOCwgMjQsIDI1LCAzMiwgMzMsCisgICAgMjYsIDI3LCAyMCwgMjEsIDIyLCAyMywgMjgsIDI5LAorICAgIDMwLCAzMSwgMzQsIDM1LCA0MCwgNDEsIDQ4LCA0OSwKKyAgICA0MiwgNDMsIDM2LCAzNywgMzgsIDM5LCA0NCwgNDUsCisgICAgNDYsIDQ3LCA1MCwgNTEsIDU2LCA1NywgNTgsIDU5LAorICAgIDUyLCA1MywgNTQsIDU1LCA2MCwgNjEsIDYyLCA2MworfTsKKworLyogVmVydGljYWwgemlnemFnIGludmVyc2UgKi8KK2NvbnN0IHN0YXRpYyBJbnQgemlnemFnX3ZfaW52W05DT0VGRl9CTE9DS10gPQoreworICAgIDAsIDgsIDE2LCAyNCwgMSwgOSwgMiwgMTAsCisgICAgMTcsIDI1LCAzMiwgNDAsIDQ4LCA1NiwgNTcsIDQ5LAorICAgIDQxLCAzMywgMjYsIDE4LCAzLCAxMSwgNCwgMTIsCisgICAgMTksIDI3LCAzNCwgNDIsIDUwLCA1OCwgMzUsIDQzLAorICAgIDUxLCA1OSwgMjAsIDI4LCA1LCAxMywgNiwgMTQsCisgICAgMjEsIDI5LCAzNiwgNDQsIDUyLCA2MCwgMzcsIDQ1LAorICAgIDUzLCA2MSwgMjIsIDMwLCA3LCAxNSwgMjMsIDMxLAorICAgIDM4LCA0NiwgNTQsIDYyLCAzOSwgNDcsIDU1LCA2MworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworICAgIEludCBQdXRDb2VmZl9JbnRlcihJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRDb2VmZl9JbnRlcl9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dENvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dENvZWZmX0ludHJhX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0Q0JQWShJbnQgY2JweSwgQ2hhciBpbnRyYSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dE1DQlBDX0ludGVyKEludCBjYnBjLCBJbnQgbW9kZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dE1DQlBDX0ludHJhKEludCBjYnBjLCBJbnQgbW9kZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dE1WKEludCBtdmludCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dERDc2l6ZV9jaHJvbShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dERDc2l6ZV9sdW0oSW50IHNpemUsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXREQ3NpemVfbHVtKEludCBzaXplLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyNpZm5kZWYgTk9fUlZMQworICAgIEludCBQdXRDb2VmZl9JbnRlcl9SVkxDKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dENvZWZmX0ludGVyX1JWTENfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRDb2VmZl9JbnRyYV9SVkxDKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dENvZWZmX0ludHJhX1JWTENfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworI2VuZGlmCisgICAgSW50IFB1dFJ1bkNvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dFJ1bkNvZWZmX0ludGVyX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0UnVuQ29lZmZfSW50cmEoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKyAgICBJbnQgUHV0UnVuQ29lZmZfSW50cmFfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRMZXZlbENvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dExldmVsQ29lZmZfSW50ZXJfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworICAgIEludCBQdXRMZXZlbENvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgSW50IFB1dExldmVsQ29lZmZfSW50cmFfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworCisgICAgdm9pZCBSdW5MZXZlbChWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgaW50cmEsIEludCBpbnRyYURDX2RlY2lzaW9uLCBJbnQgbmNvZWZibGNrW10pOworICAgIEludCBJbnRyYURDX2RwY20oSW50IHZhbCwgSW50IGx1bSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CisgICAgVm9pZCBEQ0FDUHJlZChWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciBNb2RlLCBJbnQgKmludHJhRENfZGVjaXNpb24sIEludCBpbnRyYURDVmxjUVApOworICAgIFZvaWQgZmluZF9wbXZzKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBibG9jaywgSW50ICptdngsIEludCAqbXZ5KTsKKyAgICBWb2lkICBXcml0ZU1WY29tcG9uZW50KEludCBmX2NvZGUsIEludCBkbXYsIEJpdHN0cmVhbUVuY1ZpZGVvICpicyk7CisgICAgc3RhdGljIEJvb2wgSW50cmFEQ1N3aXRjaF9EZWNpc2lvbihJbnQgTW9kZSwgSW50IGludHJhX2RjX3ZsY190aHJlc2hvbGQsIEludCBpbnRyYURDVmxjUVApOworCisgICAgVm9pZCBTY2FsZU1WRChJbnQgIGZfY29kZSwgSW50ICBkaWZmX3ZlY3RvciwgSW50ICAqcmVzaWR1YWwsIEludCAgKnZsY19jb2RlX21hZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK0ludAorUHV0RENzaXplX2x1bShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoOworCisgICAgaWYgKCEoc2l6ZSA+PSAwICYmIHNpemUgPCAxMykpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGxlbmd0aCA9IERDdGFiX2x1bVtzaXplXS5sZW47CisgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgREN0YWJfbHVtW3NpemVdLmNvZGUpOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50CitQdXREQ3NpemVfY2hyb20oSW50IHNpemUsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aDsKKworICAgIGlmICghKHNpemUgPj0gMCAmJiBzaXplIDwgMTMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbGVuZ3RoID0gREN0YWJfY2hyb21bc2l6ZV0ubGVuOworICAgIGlmIChsZW5ndGgpCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIERDdGFiX2Nocm9tW3NpemVdLmNvZGUpOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50CitQdXRNVihJbnQgbXZpbnQsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IHNpZ24gPSAwOworICAgIEludCBhYnNtdjsKKyAgICBJbnQgbGVuZ3RoOworCisgICAgaWYgKG12aW50ID4gMzIpCisgICAgeworICAgICAgICBhYnNtdiA9IC1tdmludCArIDY1OworICAgICAgICBzaWduID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhYnNtdiA9IG12aW50OworCisgICAgbGVuZ3RoID0gbXZ0YWJbYWJzbXZdLmxlbjsKKyAgICBpZiAobGVuZ3RoKQorICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCBtdnRhYlthYnNtdl0uY29kZSk7CisKKyAgICBpZiAobXZpbnQgIT0gMCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJpdHN0cmVhbSwgc2lnbik7CisgICAgICAgIHJldHVybiAobGVuZ3RoICsgMSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50CitQdXRNQ0JQQ19JbnRyYShJbnQgY2JwLCBJbnQgbW9kZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgaW5kOworICAgIEludCBsZW5ndGg7CisKKyAgICBpbmQgPSAoKG1vZGVfTUJ0eXBlW21vZGVdID4+IDEpICYgMykgfCAoKGNicCAmIDMpIDw8IDIpOworCisgICAgbGVuZ3RoID0gbWNicGNfaW50cmFfdGFiW2luZF0ubGVuOworICAgIGlmIChsZW5ndGgpCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIG1jYnBjX2ludHJhX3RhYltpbmRdLmNvZGUpOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50CitQdXRNQ0JQQ19JbnRlcihJbnQgY2JwLCBJbnQgbW9kZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgaW5kOworICAgIEludCBsZW5ndGg7CisKKyAgICBpbmQgPSAobW9kZV9NQnR5cGVbbW9kZV0gJiA3KSB8ICgoY2JwICYgMykgPDwgMyk7CisKKyAgICBsZW5ndGggPSBtY2JwY19pbnRlcl90YWJbaW5kXS5sZW47CisgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgbWNicGNfaW50ZXJfdGFiW2luZF0uY29kZSk7CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQKK1B1dENCUFkoSW50IGNicHksIENoYXIgaW50cmEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGluZDsKKyAgICBJbnQgbGVuZ3RoOworCisgICAgaWYgKChpbnRyYSA9PSAwKSkKKyAgICAgICAgY2JweSA9IDE1IC0gY2JweTsKKworICAgIGluZCA9IGNicHk7CisKKyAgICBsZW5ndGggPSBjYnB5X3RhYltpbmRdLmxlbjsKKyAgICBpZiAobGVuZ3RoKQorICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljYnB5X3RhYltpbmRdLmNvZGUpOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogNS8xNi8wMSwgYnJlYWsgdXAgZnVuY3Rpb24gZm9yIGxhc3QgYW5kIG5vdC1sYXN0IGNvZWZmaWNpZW50ICovCisvKiBOb3RlOjo6OiBJIGNoZWNrZWQgdGhlIEFSTSBhc3NlbWJseSBmb3IgaWYoIHJ1biA+IHggJiYgcnVuIDwgeSkgdHlwZQorICAgIG9mIGNvZGUsIHRoZXkgZG8gYSByZWFsbHkgZ29vZCBqb2IgY29tcGlsaW5nIGl0IHRvIGlmKCAoVUludCkocnVuLXgpIDwgeS14KS4KKyAgICBObyBuZWVkIHRvIGhhbmQtY29kZSBpdCEhISEhLCA2LzEvMjAwMSAqLworCitJbnQgUHV0Q29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA8IDIgJiYgbGV2ZWwgPCAxMykKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjBbcnVuXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIwW3J1bl1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDEgJiYgcnVuIDwgMjcgJiYgbGV2ZWwgPCA1KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMVtydW4tMl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMVtydW4tMl1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50IFB1dENvZWZmX0ludGVyX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA8IDIgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMltydW5dW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjJbcnVuXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCA0MiAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiM1tydW4tMl0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiM1tydW4tMl0uY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogNS8xNi8wMSwgYnJlYWsgdXAgZnVuY3Rpb24gZm9yIGxhc3QgYW5kIG5vdC1sYXN0IGNvZWZmaWNpZW50ICovCisKK0ludCBQdXRDb2VmZl9JbnRyYShJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuID09IDAgJiYgbGV2ZWwgPCAyOCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjRbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiNFtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDEgJiYgbGV2ZWwgPCAxMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjVbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiNVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCAxMCAmJiBsZXZlbCA8IDYpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI2W3J1bi0yXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI2W3J1bi0yXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gOSAmJiBydW4gPCAxNSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiN1tydW4tMTBdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjdbcnVuLTEwXS5jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQgUHV0Q29lZmZfSW50cmFfTGFzdChJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuID09IDAgJiYgbGV2ZWwgPCA5KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiOFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI4W2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAwICYmIHJ1biA8IDcgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiOVtydW4tMV1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiOVtydW4tMV1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDYgJiYgcnVuIDwgMjEgJiYgbGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjEwW3J1bi03XS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIxMFtydW4tN10uY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogNS8xNi8wMSwgYnJlYWsgdXAgZnVuY3Rpb24gZm9yIGxhc3QgYW5kIG5vdC1sYXN0IGNvZWZmaWNpZW50ICovCisjaWZuZGVmIE5PX1JWTEMKK0ludCBQdXRDb2VmZl9JbnRlcl9SVkxDKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDIwKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gIGNvZWZmX1JWTEN0YWIxNFtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTRbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA9PSAxICYmIGxldmVsIDwgMTEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMTVbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjE1W2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDQgJiYgbGV2ZWwgPCA4KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjE2W3J1bi0yXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMTZbcnVuLTJdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gNCAmJiBsZXZlbCA8IDYpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMTdbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjE3W2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA0ICYmIHJ1biA8IDggJiYgbGV2ZWwgPCA1KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjE4W3J1bi01XVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMThbcnVuLTVdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA3ICYmIHJ1biA8IDEwICYmIGxldmVsIDwgNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxOVtydW4tOF1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjE5W3J1bi04XVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gOSAmJiBydW4gPCAxOCAmJiBsZXZlbCA8IDMpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMjBbcnVuLTEwXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMjBbcnVuLTEwXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMTcgJiYgcnVuIDwgMzkgJiYgbGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIyMVtydW4tMThdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIyMVtydW4tMThdLmNvZGUpOworICAgIH0KKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludCBQdXRDb2VmZl9JbnRlcl9SVkxDX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA+PSAwICYmIHJ1biA8IDIgJiYgbGV2ZWwgPCA2KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjIyW3J1bl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjIyW3J1bl1bbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA9PSAyICYmIGxldmVsIDwgNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIyM1tsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMjNbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDIgJiYgcnVuIDwgMTQgJiYgbGV2ZWwgPCAzKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjI0W3J1bi0zXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMjRbcnVuLTNdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxMyAmJiBydW4gPCA0NSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjI1W3J1bi0xNF0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjI1W3J1bi0xNF0uY29kZSk7CisgICAgfQorCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogNS8xNi8wMSwgYnJlYWsgdXAgZnVuY3Rpb24gZm9yIGxhc3QgYW5kIG5vdC1sYXN0IGNvZWZmaWNpZW50ICovCisKK0ludCBQdXRDb2VmZl9JbnRyYV9SVkxDKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDI4KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjFbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjFbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA9PSAxICYmIGxldmVsIDwgMTQpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMltsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiMltsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDIgJiYgbGV2ZWwgPCAxMikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIzW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIzW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gMyAmJiBsZXZlbCA8IDEwKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjRbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjRbbGV2ZWwtMV0uY29kZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDMgJiYgcnVuIDwgNiAmJiBsZXZlbCA8IDcpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiNVtydW4tNF1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjVbcnVuLTRdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA1ICYmIHJ1biA8IDggJiYgbGV2ZWwgPCA2KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjZbcnVuLTZdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWI2W3J1bi02XVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gNyAmJiBydW4gPCAxMCAmJiBsZXZlbCA8IDUpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiN1tydW4tOF1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjdbcnVuLThdW2xldmVsLTFdLmNvZGUpOworCisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDkgJiYgcnVuIDwgMTMgJiYgbGV2ZWwgPCAzKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjhbcnVuLTEwXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiOFtydW4tMTBdW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxMiAmJiBydW4gPCAyMCAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfUlZMQ3RhYjlbcnVuLTEzXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl9SVkxDdGFiOVtydW4tMTNdLmNvZGUpOworICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQgUHV0Q29lZmZfSW50cmFfUlZMQ19MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPj0gMCAmJiBydW4gPCAyICYmIGxldmVsIDwgNikKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxMFtydW5dW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIxMFtydW5dW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPT0gMiAmJiBsZXZlbCA8IDQpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl9SVkxDdGFiMTFbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjExW2xldmVsLTFdLmNvZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAyICYmIHJ1biA8IDE0ICYmIGxldmVsIDwgMykKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxMltydW4tM11bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfUlZMQ3RhYjEyW3J1bi0zXVtsZXZlbC0xXS5jb2RlKTsKKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMTMgJiYgcnVuIDwgNDUgJiYgbGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX1JWTEN0YWIxM1tydW4tMTRdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX1JWTEN0YWIxM1tydW4tMTRdLmNvZGUpOworICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIDMtbW9kZSBWTEMgKi8KKworSW50CitQdXRSdW5Db2VmZl9JbnRlcihJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuIDwgMiAmJiBsZXZlbCA8IDEzKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMFtydW5dW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMFtydW5dW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCAyNyAmJiBsZXZlbCA8IDUpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIxW3J1bi0yXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYml0c3RyZWFtLCA3ICsgMiwgMTQvKjMqLyk7CisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCAyLCAyKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjFbcnVuLTJdW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50IFB1dFJ1bkNvZWZmX0ludGVyX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA8IDIgJiYgbGV2ZWwgPCA0KQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMltydW5dW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMltydW5dW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCA0MiAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiM1tydW4tMl0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIzW3J1bi0yXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA5OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK0ludCBQdXRSdW5Db2VmZl9JbnRyYShJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuID09IDAgJiYgbGV2ZWwgPCAyOCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjRbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI0W2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDEgJiYgbGV2ZWwgPCAxMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjVbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJpdHN0cmVhbSwgNyArIDIsIDE0LyozKi8pOworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgMiwgMik7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI1W2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCAxMCAmJiBsZXZlbCA8IDYpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI2W3J1bi0yXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYml0c3RyZWFtLCA3ICsgMiwgMTQvKjMqLyk7CisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCAyLCAyKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjZbcnVuLTJdW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gOSAmJiBydW4gPCAxNSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiN1tydW4tMTBdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiN1tydW4tMTBdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KK0ludCBQdXRSdW5Db2VmZl9JbnRyYV9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPT0gMCAmJiBsZXZlbCA8IDkpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI4W2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiOFtsZXZlbC0xXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDAgJiYgcnVuIDwgNyAmJiBsZXZlbCA8IDQpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI5W3J1bi0xXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEdUOEJpdHMoYml0c3RyZWFtLCA3ICsgMiwgMTQvKjMqLyk7CisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCAyLCAyKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjlbcnVuLTFdW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gNiAmJiBydW4gPCAyMSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiMTBbcnVuLTddLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhiaXRzdHJlYW0sIDcgKyAyLCAxNC8qMyovKTsKKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDIsIDIpOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMTBbcnVuLTddLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworSW50CitQdXRMZXZlbENvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPCAyICYmIGxldmVsIDwgMTMpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIwW3J1bl1bbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIwW3J1bl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiAxICYmIHJ1biA8IDI3ICYmIGxldmVsIDwgNSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjFbcnVuLTJdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDcgKyAxLCA2LyozKi8pOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiMVtydW4tMl1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQgUHV0TGV2ZWxDb2VmZl9JbnRlcl9MYXN0KEludCBydW4sIEludCBsZXZlbCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSkKK3sKKyAgICBJbnQgbGVuZ3RoID0gMDsKKworICAgIGlmIChydW4gPCAyICYmIGxldmVsIDwgNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjJbcnVuXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjJbcnVuXVtsZXZlbC0xXS5jb2RlKTsKKyAgICAgICAgICAgIGxlbmd0aCArPSA4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHJ1biA+IDEgJiYgcnVuIDwgNDIgJiYgbGV2ZWwgPT0gMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjNbcnVuLTJdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDcgKyAxLCA2LyozKi8pOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiM1tydW4tMl0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitJbnQgUHV0TGV2ZWxDb2VmZl9JbnRyYShJbnQgcnVuLCBJbnQgbGV2ZWwsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IGxlbmd0aCA9IDA7CisKKyAgICBpZiAocnVuID09IDAgJiYgbGV2ZWwgPCAyOCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjRbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI0W2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID09IDEgJiYgbGV2ZWwgPCAxMSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjVbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI1W2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMSAmJiBydW4gPCAxMCAmJiBsZXZlbCA8IDYpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWI2W3J1bi0yXVtsZXZlbC0xXS5sZW47CisgICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCA3ICsgMSwgNi8qMyovKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYml0c3RyZWFtLCBsZW5ndGgsIChVSW50KWNvZWZmX3RhYjZbcnVuLTJdW2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gOSAmJiBydW4gPCAxNSAmJiBsZXZlbCA9PSAxKQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gY29lZmZfdGFiN1tydW4tMTBdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDcgKyAxLCA2LyozKi8pOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiN1tydW4tMTBdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKK30KK0ludCBQdXRMZXZlbENvZWZmX0ludHJhX0xhc3QoSW50IHJ1biwgSW50IGxldmVsLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKQoreworICAgIEludCBsZW5ndGggPSAwOworCisgICAgaWYgKHJ1biA9PSAwICYmIGxldmVsIDwgOSkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjhbbGV2ZWwtMV0ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWI4W2xldmVsLTFdLmNvZGUpOworICAgICAgICAgICAgbGVuZ3RoICs9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAocnVuID4gMCAmJiBydW4gPCA3ICYmIGxldmVsIDwgNCkKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IGNvZWZmX3RhYjlbcnVuLTFdW2xldmVsLTFdLmxlbjsKKyAgICAgICAgaWYgKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIDcgKyAxLCA2LyozKi8pOworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIGxlbmd0aCwgKFVJbnQpY29lZmZfdGFiOVtydW4tMV1bbGV2ZWwtMV0uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChydW4gPiA2ICYmIHJ1biA8IDIxICYmIGxldmVsID09IDEpCisgICAgeworICAgICAgICBsZW5ndGggPSBjb2VmZl90YWIxMFtydW4tN10ubGVuOworICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgNyArIDEsIDYvKjMqLyk7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJpdHN0cmVhbSwgbGVuZ3RoLCAoVUludCljb2VmZl90YWIxMFtydW4tN10uY29kZSk7CisgICAgICAgICAgICBsZW5ndGggKz0gODsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBNQlZsY0VuY29kZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA5LzEwLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIEdPViBIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogNS8yMS8wMSwgYnJlYWsgdXAgaW50byBzbWFsbGVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgSDI2M19PTkxZCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEYXRhIFBhcnRpdGlvbmluZyBJLVZPUCBFbmNvZGluZyAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTUJWbGNFbmNvZGVEYXRhUGFyX0lfVk9QKAorICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8sCisgICAgSW50IG5jb2VmYmxja1tdLAorICAgIHZvaWQgKmJsa0NvZGVQdHIpCit7CisKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMxID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMiA9IHZpZGVvLT5iaXRzdHJlYW0yOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczMgPSB2aWRlby0+Yml0c3RyZWFtMzsKKyAgICBpbnQgaTsKKyAgICBVQ2hhciBNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVt2aWRlby0+bWJudW1dOworICAgIFVDaGFyIENCUDsKKy8vICBNYWNyb0Jsb2NrICpNQj12aWRlby0+b3V0cHV0TUI7CisgICAgSW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIEludCBpbnRyYURDX2RlY2lzaW9uLCBEQzsKKy8vICBpbnQgdGVtcDsKKyAgICBJbnQgZHF1YW50OyAvKiAzLzE1LzAxICovCisgICAgUnVuTGV2ZWxCbG9jayAqUkxCID0gdmlkZW8tPlJMQjsKKyAgICBCbG9ja0NvZGVDb2VmZlB0ciBCbG9ja0NvZGVDb2VmZiA9IChCbG9ja0NvZGVDb2VmZlB0cikgYmxrQ29kZVB0cjsKKworICAgIC8qIERDIGFuZCBBQyBQcmVkaWN0aW9uLCA1LzI4LzAxLCBjb21wdXRlIENCUCwgaW50cmFEQ19kZWNpc2lvbiovCisgICAgRENBQ1ByZWQodmlkZW8sIE1vZGUsICZpbnRyYURDX2RlY2lzaW9uLCB2aWRlby0+UVBfcHJldik7CisKKyAgICAvKiBDQlAsIFJ1biwgTGV2ZWwsIGFuZCBTaWduICovCisgICAgUnVuTGV2ZWwodmlkZW8sIDEsIGludHJhRENfZGVjaXNpb24sIG5jb2VmYmxjayk7CisgICAgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKworICAgIC8qIENvbXB1dGUgRFF1YW50ICovCisgICAgZHF1YW50ID0gdmlkZW8tPlFQTUJbbWJudW1dIC0gdmlkZW8tPlFQX3ByZXY7IC8qIDMvMTUvMDEsIFFQX3ByZXYgbWF5IG5vdCBlcXVhbCBRUE1CW21ibnVtLTFdIGlmIG1ibnVtLTEgaXMgc2tpcHBlZCovCisKKyAgICB2aWRlby0+UVBfcHJldiA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKworICAgIGlmIChkcXVhbnQgJiYgTW9kZSA9PSBNT0RFX0lOVFJBKQorICAgIHsKKyAgICAgICAgTW9kZSA9IE1PREVfSU5UUkFfUTsKKyAgICB9CisKKyAgICBpZiAoZHF1YW50ID49IDApCisgICAgICAgIGRxdWFudCA9IChQVl9BQlMoZHF1YW50KSArIDEpOworICAgIGVsc2UKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpIC0gMSk7CisKKyAgICAvKiBGSVJTVCBQQVJUOiBBTEwgVE8gQlMxICovCisKKyAgICBQdXRNQ0JQQ19JbnRyYShDQlAsIE1vZGUsIGJzMSk7IC8qIE1DQlBDICovCisKKyAgICBpZiAoTW9kZSA9PSBNT0RFX0lOVFJBX1EpCisgICAgICAgIC8qICBNQVkgTkVFRCBUTyBDSEFOR0UgRFFVQU5UIEhFUkUgICovCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMxLCAyLCBkcXVhbnQpOyAgLyogZHF1YW50Ki8KKworCisgICAgaWYgKGludHJhRENfZGVjaXNpb24gPT0gMCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gdmlkZW8tPlJMQltpXS5sZXZlbFswXTsKKyAgICAgICAgICAgIGlmICh2aWRlby0+UkxCW2ldLnNbMF0pCisgICAgICAgICAgICAgICAgREMgPSAtREM7CisgICAgICAgICAgICBpZiAoaSA8IDQpCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBJbnRyYURDX2RwY20oREMsIDEsIGJzMSk7ICAgICAgICAvKiBkY3RfZGNfc2l6ZV9sdW1pbmFuY2UsICovCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGN0X2RjX2RpZmZlcmVudGlhbCwgYW5kICovCisgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBJbnRyYURDX2RwY20oREMsIDAsIGJzMSk7ICAgICAgICAvKiBtYXJrZXIgYml0ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTRUNPTkQgUEFSVDogQUxMIFRPIEJTMiovCisKKyAgICBCaXRzdHJlYW1QdXQxQml0cyhiczIsIHZpZGVvLT5hY1ByZWRGbGFnW3ZpZGVvLT5tYm51bV0pOyAgICAvKiBhY19wcmVkX2ZsYWcgKi8KKworICAgIC8qdGVtcD0qLworICAgIFB1dENCUFkoQ0JQID4+IDIsIChDaGFyKSgxKSwgYnMyKTsgLyogY2JweSAqLworCisKKyAgICAvKiBUSElSRCBQQVJUOiAgQUxMIFRPIEJTMyovCisgICAgLyogTUJfQ29kZUNvZWZmKHZpZGVvLGJzMyk7ICovIC8qIDUvMjIvMDEsIHJlcGxhY2VkIHdpdGggYmVsb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKENCUCYoMSA8PCAoNSAtIGkpKSkKKyAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMzLCAxIC0gaW50cmFEQ19kZWNpc2lvbiwgbmNvZWZibGNrW2ldLCBNb2RlKTsvKiBDb2RlIEludHJhIEFDKi8KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRGF0YSBQYXJ0aXRpb25pbmcgUC1WT1AgRW5jb2RpbmcgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTUJWbGNFbmNvZGVEYXRhUGFyX1BfVk9QKAorICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8sCisgICAgSW50IG5jb2VmYmxja1tdLAorICAgIHZvaWQgKmJsa0NvZGVQdHIpCit7CisKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMxID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMiA9IHZpZGVvLT5iaXRzdHJlYW0yOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczMgPSB2aWRlby0+Yml0c3RyZWFtMzsKKyAgICBpbnQgaTsKKyAgICBJbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgVUNoYXIgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworICAgIEludCBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bV07CisgICAgVUNoYXIgQ0JQOworLy8gIE1hY3JvQmxvY2sgKk1CPXZpZGVvLT5vdXRwdXRNQjsKKyAgICBJbnQgaW50cmEsIGludHJhRENfZGVjaXNpb24sIERDOworICAgIEludCBwbXZ4LCBwbXZ5OworLy8gIGludCB0ZW1wOworICAgIEludCBkcXVhbnQ7IC8qIDMvMTUvMDEgKi8KKyAgICBSdW5MZXZlbEJsb2NrICpSTEIgPSB2aWRlby0+UkxCOworICAgIEJsb2NrQ29kZUNvZWZmUHRyIEJsb2NrQ29kZUNvZWZmID0gKEJsb2NrQ29kZUNvZWZmUHRyKSBibGtDb2RlUHRyOworCisgICAgaW50cmEgPSAoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKTsKKworICAgIC8qIERDIGFuZCBBQyBQcmVkaWN0aW9uLCA1LzI4LzAxLCBjb21wdXRlIENCUCwgaW50cmFEQ19kZWNpc2lvbiovCisKKyAgICBpZiAoaW50cmEpCisgICAgeworICAgICAgICBpZiAodmlkZW8tPnVzZVByZXZRUCkKKyAgICAgICAgeworICAgICAgICAgICAgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW0tMV07CisgICAgICAgIH0KKworICAgICAgICBEQ0FDUHJlZCh2aWRlbywgTW9kZSwgJmludHJhRENfZGVjaXNpb24sIFFQX3RtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaW50cmFEQ19kZWNpc2lvbiA9IDA7IC8qIHVzZWQgaW4gUnVuTGV2ZWwgKi8KKworICAgIC8qIENCUCwgUnVuLCBMZXZlbCwgYW5kIFNpZ24gKi8KKyAgICBSdW5MZXZlbCh2aWRlbywgaW50cmEsIGludHJhRENfZGVjaXNpb24sIG5jb2VmYmxjayk7CisgICAgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKworICAgIC8qIENvbXB1dGUgRFF1YW50ICovCisgICAgZHF1YW50ID0gdmlkZW8tPlFQTUJbbWJudW1dIC0gdmlkZW8tPlFQX3ByZXY7IC8qIDMvMTUvMDEsIFFQX3ByZXYgbWF5IG5vdCBlcXVhbCBRUE1CW21ibnVtLTFdIGlmIG1ibnVtLTEgaXMgc2tpcHBlZCovCisKKyAgICBpZiAoZHF1YW50ICYmIChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVEVSKSkKKyAgICB7CisgICAgICAgIE1vZGUgKz0gMjsgIC8qIG1ha2UgaXQgTU9ERV9JTlRSQV9RIGFuZCBNT0RFX0lOVEVSX1EgKi8KKyAgICB9CisKKyAgICBpZiAoZHF1YW50ID49IDApCisgICAgICAgIGRxdWFudCA9IChQVl9BQlMoZHF1YW50KSArIDEpOworICAgIGVsc2UKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpIC0gMSk7CisKKyAgICAvKiBGSVJTVCBQQVJUOiBBTEwgVE8gQlMxICovCisKKyAgICBpZiAoQ0JQID09IDAgJiYgaW50cmEgPT0gMCkgIC8qIERldGVybWluZSBpZiBTa2lwcGVkIE1CICovCisgICAgeworICAgICAgICBpZiAoKE1vZGUgPT0gTU9ERV9JTlRFUikgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzBdLnggPT0gMCkgJiYgKHZpZGVvLT5tb3RbbWJudW1dWzBdLnkgPT0gMCkpCisgICAgICAgICAgICBNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVt2aWRlby0+bWJudW1dID0gTU9ERV9TS0lQUEVEOworICAgICAgICBlbHNlIGlmICgoTW9kZSA9PSBNT0RFX0lOVEVSNFYpICYmICh2aWRlby0+bW90W21ibnVtXVsxXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVsxXS55ID09IDApCisgICAgICAgICAgICAgICAgICYmICh2aWRlby0+bW90W21ibnVtXVsyXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVsyXS55ID09IDApCisgICAgICAgICAgICAgICAgICYmICh2aWRlby0+bW90W21ibnVtXVszXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVszXS55ID09IDApCisgICAgICAgICAgICAgICAgICYmICh2aWRlby0+bW90W21ibnVtXVs0XS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVs0XS55ID09IDApKQorICAgICAgICAgICAgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbdmlkZW8tPm1ibnVtXSA9IE1PREVfU0tJUFBFRDsKKyAgICB9CisKKworICAgIGlmIChNb2RlID09IE1PREVfU0tJUFBFRCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzMSwgMSk7IC8qIG5vdF9jb2RlZCA9IDEgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzMSwgMCk7IC8qIG5vdF9jb2RlZCA9MCAqLworCisgICAgdmlkZW8tPlFQX3ByZXYgPSB2aWRlby0+UVBNQlttYm51bV07CisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7CisKKyAgICBQdXRNQ0JQQ19JbnRlcihDQlAsIE1vZGUsIGJzMSk7IC8qIE1DQlBDICovCisKKyAgICB2aWRlby0+aGVhZGVyX2JpdHMgLT0gQml0c3RyZWFtR2V0UG9zKGJzMSk7IC8qIEhlYWRlciBCaXRzICovCisKKyAgICBpZiAoTW9kZSA9PSBNT0RFX0lOVEVSIHx8IE1vZGUgPT0gTU9ERV9JTlRFUl9RKQorICAgIHsKKyAgICAgICAgZmluZF9wbXZzKHZpZGVvLCAwLCAmcG12eCwgJnBtdnkpOyAvKiBHZXQgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzICovCisgICAgICAgIFdyaXRlTVZjb21wb25lbnQodmlkZW8tPmN1cnJWb3AtPmZjb2RlRm9yd2FyZCwgdmlkZW8tPm1vdFttYm51bV1bMF0ueCAtIHBtdngsIGJzMSk7IC8qIFdyaXRlIHggdG8gYml0c3RyZWFtICovCisgICAgICAgIFdyaXRlTVZjb21wb25lbnQodmlkZW8tPmN1cnJWb3AtPmZjb2RlRm9yd2FyZCwgdmlkZW8tPm1vdFttYm51bV1bMF0ueSAtIHBtdnksIGJzMSk7ICAgICAvKiBXcml0ZSB5IHRvIGJpdHN0cmVhbSAqLworICAgIH0KKyAgICBlbHNlIGlmIChNb2RlID09IE1PREVfSU5URVI0VikKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmRfcG12cyh2aWRlbywgaSwgJnBtdngsICZwbXZ5KTsKKyAgICAgICAgICAgIFdyaXRlTVZjb21wb25lbnQodmlkZW8tPmN1cnJWb3AtPmZjb2RlRm9yd2FyZCwgdmlkZW8tPm1vdFttYm51bV1baV0ueCAtIHBtdngsIGJzMSk7CisgICAgICAgICAgICBXcml0ZU1WY29tcG9uZW50KHZpZGVvLT5jdXJyVm9wLT5mY29kZUZvcndhcmQsIHZpZGVvLT5tb3RbbWJudW1dW2ldLnkgLSBwbXZ5LCBiczEpOworICAgICAgICB9CisgICAgfQorICAgIHZpZGVvLT5oZWFkZXJfYml0cyArPSBCaXRzdHJlYW1HZXRQb3MoYnMxKTsgLyogSGVhZGVyIEJpdHMgKi8KKworICAgIC8qIFNFQ09ORCBQQVJUOiBBTEwgVE8gQlMyICovCisKKworICAgIGlmIChpbnRyYSkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzMiwgdmlkZW8tPmFjUHJlZEZsYWdbdmlkZW8tPm1ibnVtXSk7ICAgIC8qIGFjX3ByZWRfZmxhZyAqLworICAgICAgICAvKnRlbXA9Ki8KKyAgICAgICAgUHV0Q0JQWShDQlAgPj4gMiwgKENoYXIpKE1vZGUgPT0gTU9ERV9JTlRSQSB8fCBNb2RlID09IE1PREVfSU5UUkFfUSksIGJzMik7IC8qIGNicHkgKi8KKworICAgICAgICBpZiAoTW9kZSA9PSBNT0RFX0lOVFJBX1EpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMiwgMiwgZHF1YW50KTsgIC8qIGRxdWFudCwgMy8xNS8wMSovCisKKyAgICAgICAgaWYgKGludHJhRENfZGVjaXNpb24gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQyA9IHZpZGVvLT5STEJbaV0ubGV2ZWxbMF07CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5STEJbaV0uc1swXSkKKyAgICAgICAgICAgICAgICAgICAgREMgPSAtREM7CisgICAgICAgICAgICAgICAgaWYgKGkgPCA0KQorICAgICAgICAgICAgICAgICAgICAvKnRlbXAgPSovIEludHJhRENfZHBjbShEQywgMSwgYnMyKTsgICAgICAgIC8qIGRjdF9kY19zaXplX2x1bWluYW5jZSwgKi8KKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGN0X2RjX2RpZmZlcmVudGlhbCwgYW5kICovCisgICAgICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8gSW50cmFEQ19kcGNtKERDLCAwLCBiczIpOyAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAvKiBUSElSRCBQQVJUOiBBTEwgVE8gQlMzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChDQlAmKDEgPDwgKDUgLSBpKSkpCisgICAgICAgICAgICAgICAgKCpCbG9ja0NvZGVDb2VmZikoJihSTEJbaV0pLCBiczMsIDEgLSBpbnRyYURDX2RlY2lzaW9uLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50cmEgQUMqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qdGVtcD0qLworICAgICAgICBQdXRDQlBZKENCUCA+PiAyLCAoQ2hhcikoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKSwgYnMyKTsgLyogY2JweSAqLworICAgICAgICBpZiAoTW9kZSA9PSBNT0RFX0lOVEVSX1EpCisgICAgICAgICAgICAvKiAgTUFZIE5FRUQgVE8gQ0hBTkdFIERRVUFOVCBIRVJFICAqLworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiczIsIDIsIGRxdWFudCk7ICAvKiBkcXVhbnQsIDMvMTUvMDEqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgLyogVEhJUkQgUEFSVDogQUxMIFRPIEJTMyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMzLCAwLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50cmEgQUMqLworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2hvcnQgSGVhZGVyL0NvbWJpbmVkIE1vZGUgd2l0aCBvciB3aXRob3V0IEVycm9yIFJlc2lsaWVuY2UgSS1WT1AgYW5kIFAtVk9QIEVuY29kaW5nICovCisvKiA1LzIxLzAxLCBCLVZPUCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0ISEhISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1CVmxjRW5jb2RlQ29tYmluZWRfSV9WT1AoCisgICAgVmlkZW9FbmNEYXRhICp2aWRlbywKKyAgICBJbnQgbmNvZWZibGNrW10sCisgICAgdm9pZCAqYmxrQ29kZVB0cikKK3sKKworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpiczEgPSB2aWRlby0+Yml0c3RyZWFtMTsKKy8vICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMyID0gdmlkZW8tPmJpdHN0cmVhbTI7CisvLyAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMyA9IHZpZGVvLT5iaXRzdHJlYW0zOworICAgIGludCBpOworICAgIFVDaGFyIE1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW3ZpZGVvLT5tYm51bV07CisgICAgVUNoYXIgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW3ZpZGVvLT5tYm51bV07CisvLyAgTWFjcm9CbG9jayAqTUI9dmlkZW8tPm91dHB1dE1COworICAgIEludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICBJbnQgaW50cmFEQ19kZWNpc2lvbjsKKy8vICBpbnQgdGVtcDsKKyAgICBJbnQgZHF1YW50OyAvKiAzLzE1LzAxICovCisgICAgUnVuTGV2ZWxCbG9jayAqUkxCID0gdmlkZW8tPlJMQjsKKyAgICBJbnQgREM7CisgICAgSW50IHNob3J0VmlkZW9IZWFkZXIgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5zaG9ydFZpZGVvSGVhZGVyOworICAgIEJsb2NrQ29kZUNvZWZmUHRyIEJsb2NrQ29kZUNvZWZmID0gKEJsb2NrQ29kZUNvZWZmUHRyKSBibGtDb2RlUHRyOworCisgICAgLyogREMgYW5kIEFDIFByZWRpY3Rpb24sIDUvMjgvMDEsIGNvbXB1dGUgQ0JQLCBpbnRyYURDX2RlY2lzaW9uKi8KKworI2lmbmRlZiBIMjYzX09OTFkKKyAgICBpZiAoIXNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIERDQUNQcmVkKHZpZGVvLCBNb2RlLCAmaW50cmFEQ19kZWNpc2lvbiwgdmlkZW8tPlFQX3ByZXYpOworICAgIGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgaW50cmFEQ19kZWNpc2lvbiA9IDA7CisgICAgfQorCisgICAgLyogQ0JQLCBSdW4sIExldmVsLCBhbmQgU2lnbiAqLworCisgICAgUnVuTGV2ZWwodmlkZW8sIDEsIGludHJhRENfZGVjaXNpb24sIG5jb2VmYmxjayk7CisgICAgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKworICAgIC8qIENvbXB1dGUgRFF1YW50ICovCisgICAgZHF1YW50ID0gdmlkZW8tPlFQTUJbbWJudW1dIC0gdmlkZW8tPlFQX3ByZXY7IC8qIDMvMTUvMDEsIFFQX3ByZXYgbWF5IG5vdCBlcXVhbCBRUE1CW21ibnVtLTFdIGlmIG1ibnVtLTEgaXMgc2tpcHBlZCovCisKKyAgICB2aWRlby0+UVBfcHJldiA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKworICAgIGlmIChkcXVhbnQgJiYgTW9kZSA9PSBNT0RFX0lOVFJBKQorICAgIHsKKyAgICAgICAgTW9kZSA9IE1PREVfSU5UUkFfUTsKKyAgICB9CisKKyAgICBpZiAoZHF1YW50ID49IDApCisgICAgICAgIGRxdWFudCA9IChQVl9BQlMoZHF1YW50KSArIDEpOworICAgIGVsc2UKKyAgICAgICAgZHF1YW50ID0gKFBWX0FCUyhkcXVhbnQpIC0gMSk7CisKKyAgICBQdXRNQ0JQQ19JbnRyYShDQlAsIE1vZGUsIGJzMSk7IC8qIG1jYnBjIElfVk9QICovCisKKyAgICBpZiAoIXZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnNob3J0VmlkZW9IZWFkZXIpCisgICAgeworICAgICAgICBCaXRzdHJlYW1QdXQxQml0cyhiczEsIHZpZGVvLT5hY1ByZWRGbGFnW3ZpZGVvLT5tYm51bV0pOyAgICAvKiBhY19wcmVkX2ZsYWcgKi8KKyAgICB9CisKKyAgICAvKnRlbXA9Ki8KKyAgICBQdXRDQlBZKENCUCA+PiAyLCAoQ2hhcikoMSksIGJzMSk7IC8qIGNicHkgKi8KKworICAgIGlmIChNb2RlID09IE1PREVfSU5UUkFfUSkKKyAgICAgICAgLyogIE1BWSBORUVEIFRPIENIQU5HRSBEUVVBTlQgSEVSRSAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMSwgMiwgZHF1YW50KTsgIC8qIGRxdWFudCwgMy8xNS8wMSovCisKKyAgICAvKk1CX0NvZGVDb2VmZih2aWRlbyxiczEpOyA1LzIxLzAxLCByZXBsYWNlZCBieSBiZWxvdyAqLworICAgIC8qKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBIMjYzX09OTFkKKyAgICBpZiAoc2hvcnRWaWRlb0hlYWRlcikgLyogU2hvcnQgSGVhZGVyIERDIGNvZWZmaWNpZW50cyAqLworICAgIHsKKyNlbmRpZgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEQyA9IFJMQltpXS5sZXZlbFswXTsKKyAgICAgICAgICAgIGlmIChSTEJbaV0uc1swXSkKKyAgICAgICAgICAgICAgICBEQyA9IC1EQzsKKyAgICAgICAgICAgIGlmIChEQyAhPSAxMjgpCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiczEsIDgsIERDKTsgICAvKiBpbnRyYV9kY19zaXplX2x1bWluYW5jZSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMxLCA4LCAyNTUpOyAgICAgICAgICAvKiBpbnRyYV9kY19zaXplX2x1bWluYW5jZSAqLworICAgICAgICAgICAgaWYgKENCUCYoMSA8PCAoNSAtIGkpKSkKKyAgICAgICAgICAgICAgICAoKkJsb2NrQ29kZUNvZWZmKSgmKFJMQltpXSksIGJzMSwgMSwgbmNvZWZibGNrW2ldLCBNb2RlKTsgLyogQ29kZSBzaG9ydCBoZWFkZXIgSW50cmEgQUMqLworICAgICAgICB9CisjaWZuZGVmIEgyNjNfT05MWQorICAgIH0KKyAgICBlbHNlIGlmIChpbnRyYURDX2RlY2lzaW9uID09IDApICAgLyogQ29tYmluZWQgSW50cmEgTW9kZSBEQyBhbmQgQUMgY29lZmZpY2llbnRzICovCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEQyA9IFJMQltpXS5sZXZlbFswXTsKKyAgICAgICAgICAgIGlmIChSTEJbaV0uc1swXSkKKyAgICAgICAgICAgICAgICBEQyA9IC1EQzsKKworICAgICAgICAgICAgaWYgKGkgPCA0KQorICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8gSW50cmFEQ19kcGNtKERDLCAxLCBiczEpOyAgICAgICAgLyogZGN0X2RjX3NpemVfbHVtaW5hbmNlLCAqLworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRjdF9kY19kaWZmZXJlbnRpYWwsIGFuZCAqLworICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8gSW50cmFEQ19kcGNtKERDLCAwLCBiczEpOyAgICAgICAgLyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgaWYgKENCUCYoMSA8PCAoNSAtIGkpKSkKKyAgICAgICAgICAgICAgICAoKkJsb2NrQ29kZUNvZWZmKSgmKFJMQltpXSksIGJzMSwgMSwgbmNvZWZibGNrW2ldLCBNb2RlKTsvKiBDb2RlIEludHJhIEFDICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgIC8qIENvbWJpbmVkIE1vZGUgSW50cmEgREMvQUMgY29lZmZpY2llbnRzICovCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMxLCAwLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50cmEgQUMgKi8KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qKioqKioqKioqKioqKioqKioqLworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgTUJWbGNFbmNvZGVDb21iaW5lZF9QX1ZPUCgKKyAgICBWaWRlb0VuY0RhdGEgKnZpZGVvLAorICAgIEludCBuY29lZmJsY2tbXSwKKyAgICB2b2lkICpibGtDb2RlUHRyKQoreworCisgICAgQml0c3RyZWFtRW5jVmlkZW8gKmJzMSA9IHZpZGVvLT5iaXRzdHJlYW0xOworLy8gIEJpdHN0cmVhbUVuY1ZpZGVvICpiczIgPSB2aWRlby0+Yml0c3RyZWFtMjsKKy8vICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMzID0gdmlkZW8tPmJpdHN0cmVhbTM7CisgICAgaW50IGk7CisgICAgSW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIFVDaGFyIE1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKKyAgICBJbnQgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW1dOworICAgIFVDaGFyIENCUCA7CisvLyAgTWFjcm9CbG9jayAqTUI9dmlkZW8tPm91dHB1dE1COworICAgIEludCBpbnRyYSwgaW50cmFEQ19kZWNpc2lvbjsKKyAgICBJbnQgcG12eCwgcG12eTsKKy8vICBpbnQgdGVtcDsKKyAgICBJbnQgZHF1YW50OyAvKiAzLzE1LzAxICovCisgICAgUnVuTGV2ZWxCbG9jayAqUkxCID0gdmlkZW8tPlJMQjsKKyAgICBJbnQgREM7CisgICAgSW50IHNob3J0VmlkZW9IZWFkZXIgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5zaG9ydFZpZGVvSGVhZGVyOworICAgIEJsb2NrQ29kZUNvZWZmUHRyIEJsb2NrQ29kZUNvZWZmID0gKEJsb2NrQ29kZUNvZWZmUHRyKSBibGtDb2RlUHRyOworCisgICAgaW50cmEgPSAoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKTsKKworICAgIC8qIERDIGFuZCBBQyBQcmVkaWN0aW9uLCA1LzI4LzAxLCBjb21wdXRlIGludHJhRENfZGVjaXNpb24qLworI2lmbmRlZiBIMjYzX09OTFkKKyAgICBpZiAoIXNob3J0VmlkZW9IZWFkZXIgJiYgaW50cmEpCisgICAgeworICAgICAgICBpZiAodmlkZW8tPnVzZVByZXZRUCkKKyAgICAgICAgeworICAgICAgICAgICAgUVBfdG1wID0gdmlkZW8tPlFQTUJbbWJudW0tMV07CisgICAgICAgIH0KKyAgICAgICAgRENBQ1ByZWQodmlkZW8sIE1vZGUsICZpbnRyYURDX2RlY2lzaW9uLCBRUF90bXApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgaW50cmFEQ19kZWNpc2lvbiA9IDA7CisKKyAgICAvKiBDQlAsIFJ1biwgTGV2ZWwsIGFuZCBTaWduICovCisKKyAgICBSdW5MZXZlbCh2aWRlbywgaW50cmEsIGludHJhRENfZGVjaXNpb24sIG5jb2VmYmxjayk7CisgICAgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKworICAgIC8qIENvbXB1dGUgRFF1YW50ICovCisgICAgZHF1YW50ID0gdmlkZW8tPlFQTUJbbWJudW1dIC0gdmlkZW8tPlFQX3ByZXY7IC8qIDMvMTUvMDEsIFFQX3ByZXYgbWF5IG5vdCBlcXVhbCBRUE1CW21ibnVtLTFdIGlmIG1ibnVtLTEgaXMgc2tpcHBlZCovCisgICAgaWYgKGRxdWFudCAmJiAoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRFUikpCisgICAgeworICAgICAgICBNb2RlICs9IDI7ICAvKiBtYWtlIGl0IE1PREVfSU5UUkFfUSBhbmQgTU9ERV9JTlRFUl9RICovCisgICAgfQorCisgICAgaWYgKGRxdWFudCA+PSAwKQorICAgICAgICBkcXVhbnQgPSAoUFZfQUJTKGRxdWFudCkgKyAxKTsKKyAgICBlbHNlCisgICAgICAgIGRxdWFudCA9IChQVl9BQlMoZHF1YW50KSAtIDEpOworCisgICAgaWYgKENCUCA9PSAwICYmIGludHJhID09IDApICAvKiBEZXRlcm1pbmUgaWYgU2tpcHBlZCBNQiAqLworICAgIHsKKyAgICAgICAgaWYgKChNb2RlID09IE1PREVfSU5URVIpICYmICh2aWRlby0+bW90W21ibnVtXVswXS54ID09IDApICYmICh2aWRlby0+bW90W21ibnVtXVswXS55ID09IDApKQorICAgICAgICAgICAgTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbdmlkZW8tPm1ibnVtXSA9IE1PREVfU0tJUFBFRDsKKyAgICAgICAgZWxzZSBpZiAoKE1vZGUgPT0gTU9ERV9JTlRFUjRWKSAmJiAodmlkZW8tPm1vdFttYm51bV1bMV0ueCA9PSAwKSAmJiAodmlkZW8tPm1vdFttYm51bV1bMV0ueSA9PSAwKQorICAgICAgICAgICAgICAgICAmJiAodmlkZW8tPm1vdFttYm51bV1bMl0ueCA9PSAwKSAmJiAodmlkZW8tPm1vdFttYm51bV1bMl0ueSA9PSAwKQorICAgICAgICAgICAgICAgICAmJiAodmlkZW8tPm1vdFttYm51bV1bM10ueCA9PSAwKSAmJiAodmlkZW8tPm1vdFttYm51bV1bM10ueSA9PSAwKQorICAgICAgICAgICAgICAgICAmJiAodmlkZW8tPm1vdFttYm51bV1bNF0ueCA9PSAwKSAmJiAodmlkZW8tPm1vdFttYm51bV1bNF0ueSA9PSAwKSkKKyAgICAgICAgICAgIE1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW3ZpZGVvLT5tYm51bV0gPSBNT0RFX1NLSVBQRUQ7CisgICAgfQorCisgICAgaWYgKE1vZGUgPT0gTU9ERV9TS0lQUEVEKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMxLCAxKTsgLyogbm90X2NvZGVkID0gMSAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMxLCAwKTsgLyogbm90X2NvZGVkID0wICovCisKKyAgICB2aWRlby0+UVBfcHJldiA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKyAgICB2aWRlby0+dXNlUHJldlFQID0gMTsKKworICAgIFB1dE1DQlBDX0ludGVyKENCUCwgTW9kZSwgYnMxKTsgLyogbWNicGMgUF9WT1AgKi8KKworICAgIGlmICghdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXS0+c2hvcnRWaWRlb0hlYWRlciAmJiBpbnRyYSkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzMSwgdmlkZW8tPmFjUHJlZEZsYWdbdmlkZW8tPm1ibnVtXSk7ICAgIC8qIGFjX3ByZWRfZmxhZyAqLworICAgIH0KKworICAgIC8qdGVtcD0qLworICAgIFB1dENCUFkoQ0JQID4+IDIsIChDaGFyKShpbnRyYSksIGJzMSk7IC8qIGNicHkgKi8KKworICAgIGlmIChNb2RlID09IE1PREVfSU5UUkFfUSB8fCBNb2RlID09IE1PREVfSU5URVJfUSkKKyAgICAgICAgLyogIE1BWSBORUVEIFRPIENIQU5HRSBEUVVBTlQgSEVSRSAgKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiczEsIDIsIGRxdWFudCk7ICAvKiBkcXVhbnQsIDMvMTUvMDEqLworCisgICAgdmlkZW8tPmhlYWRlcl9iaXRzIC09IEJpdHN0cmVhbUdldFBvcyhiczEpOyAvKiBIZWFkZXIgQml0cyAqLworCisgICAgaWYgKCEoKHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl0tPnNjYWxhYmlsaXR5KSAmJiAodmlkZW8tPmN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPT0gMykpKQorICAgIHsKKyAgICAgICAgaWYgKE1vZGUgPT0gTU9ERV9JTlRFUiB8fCBNb2RlID09IE1PREVfSU5URVJfUSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluZF9wbXZzKHZpZGVvLCAwLCAmcG12eCwgJnBtdnkpOyAvKiBHZXQgcHJlZGljdGVkIG1vdGlvbiB2ZWN0b3JzICovCisgICAgICAgICAgICBXcml0ZU1WY29tcG9uZW50KHZpZGVvLT5jdXJyVm9wLT5mY29kZUZvcndhcmQsIHZpZGVvLT5tb3RbbWJudW1dWzBdLnggLSBwbXZ4LCBiczEpOyAvKiBXcml0ZSB4IHRvIGJpdHN0cmVhbSAqLworICAgICAgICAgICAgV3JpdGVNVmNvbXBvbmVudCh2aWRlby0+Y3VyclZvcC0+ZmNvZGVGb3J3YXJkLCB2aWRlby0+bW90W21ibnVtXVswXS55IC0gcG12eSwgYnMxKTsgICAgIC8qIFdyaXRlIHkgdG8gYml0c3RyZWFtICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoTW9kZSA9PSBNT0RFX0lOVEVSNFYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluZF9wbXZzKHZpZGVvLCBpLCAmcG12eCwgJnBtdnkpOworICAgICAgICAgICAgICAgIFdyaXRlTVZjb21wb25lbnQodmlkZW8tPmN1cnJWb3AtPmZjb2RlRm9yd2FyZCwgdmlkZW8tPm1vdFttYm51bV1baV0ueCAtIHBtdngsIGJzMSk7CisgICAgICAgICAgICAgICAgV3JpdGVNVmNvbXBvbmVudCh2aWRlby0+Y3VyclZvcC0+ZmNvZGVGb3J3YXJkLCB2aWRlby0+bW90W21ibnVtXVtpXS55IC0gcG12eSwgYnMxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB2aWRlby0+aGVhZGVyX2JpdHMgKz0gQml0c3RyZWFtR2V0UG9zKGJzMSk7IC8qIEhlYWRlciBCaXRzICovCisKKyAgICAvKiBNQl9Db2RlQ29lZmYodmlkZW8sYnMxKTsgKi8gLyogNS8yMi8wMSwgcmVwbGFjZWQgd2l0aCBiZWxvdyAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChpbnRyYSkKKyAgICB7CisjaWZuZGVmIEgyNjNfT05MWQorICAgICAgICBpZiAoc2hvcnRWaWRlb0hlYWRlcikgLyogU2hvcnQgSGVhZGVyIERDIGNvZWZmaWNpZW50cyAqLworICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREMgPSBSTEJbaV0ubGV2ZWxbMF07CisgICAgICAgICAgICAgICAgaWYgKFJMQltpXS5zWzBdKQorICAgICAgICAgICAgICAgICAgICBEQyA9IC1EQzsKKyAgICAgICAgICAgICAgICBpZiAoREMgIT0gMTI4KQorICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMSwgOCwgREMpOyAgIC8qIGludHJhX2RjX3NpemVfbHVtaW5hbmNlICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzMSwgOCwgMjU1KTsgICAgICAgICAgLyogaW50cmFfZGNfc2l6ZV9sdW1pbmFuY2UgKi8KKyAgICAgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICAgICAoKkJsb2NrQ29kZUNvZWZmKSgmKFJMQltpXSksIGJzMSwgMSwgbmNvZWZibGNrW2ldLCBNb2RlKTsgLyogQ29kZSBzaG9ydCBoZWFkZXIgSW50cmEgQUMqLworICAgICAgICAgICAgfQorI2lmbmRlZiBIMjYzX09OTFkKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbnRyYURDX2RlY2lzaW9uID09IDApICAgLyogQ29tYmluZWQgSW50cmEgTW9kZSBEQyBhbmQgQUMgY29lZmZpY2llbnRzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgREMgPSBSTEJbaV0ubGV2ZWxbMF07CisgICAgICAgICAgICAgICAgaWYgKFJMQltpXS5zWzBdKQorICAgICAgICAgICAgICAgICAgICBEQyA9IC1EQzsKKworICAgICAgICAgICAgICAgIGlmIChpIDwgNCkKKyAgICAgICAgICAgICAgICAgICAgLyp0ZW1wID0qLyBJbnRyYURDX2RwY20oREMsIDEsIGJzMSk7ICAgICAgICAvKiBkY3RfZGNfc2l6ZV9sdW1pbmFuY2UsICovCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRjdF9kY19kaWZmZXJlbnRpYWwsIGFuZCAqLworICAgICAgICAgICAgICAgICAgICAvKnRlbXAgPSovIEludHJhRENfZHBjbShEQywgMCwgYnMxKTsgICAgICAgIC8qIG1hcmtlciBiaXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICAgICAoKkJsb2NrQ29kZUNvZWZmKSgmKFJMQltpXSksIGJzMSwgMSwgbmNvZWZibGNrW2ldLCBNb2RlKTsvKiBDb2RlIEludHJhIEFDICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgIC8qIENvbWJpbmVkIE1vZGUgSW50cmEgREMvQUMgY29lZmZpY2llbnRzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKENCUCYoMSA8PCAoNSAtIGkpKSkKKyAgICAgICAgICAgICAgICAgICAgKCpCbG9ja0NvZGVDb2VmZikoJihSTEJbaV0pLCBiczEsIDAsIG5jb2VmYmxja1tpXSwgTW9kZSk7LyogQ29kZSBJbnRyYSBBQyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSAgIC8qIFNob3J0aGVhZGVyIG9yIENvbWJpbmVkIElOVEVSIE1vZGUgQUMgY29lZmZpY2llbnRzICovCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoQ0JQJigxIDw8ICg1IC0gaSkpKQorICAgICAgICAgICAgICAgICgqQmxvY2tDb2RlQ29lZmYpKCYoUkxCW2ldKSwgYnMxLCAwLCBuY29lZmJsY2tbaV0sIE1vZGUpOy8qIENvZGUgSW50ZXIgQUMqLworICAgICAgICB9CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgcmV0dXJuIDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCbG9ja0NvZGVDb2VmZigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDkvMTgvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBWTEMgRW5jb2RlICBBQy9EQyBjb2VmZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgNS8xNi8wMSAgZ3JvdXBpbmcgQml0c3RyZWFtUHV0Qml0cyBjYWxscyAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICA1LzIyLzAxICBicmVhayB1cCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgTk9fUlZMQworLyoqKioqKioqKioqKioqKioqLworLyogUlZMQyBFTkNPRElORyAqLworLyoqKioqKioqKioqKioqKioqLworVm9pZCBCbG9ja0NvZGVDb2VmZl9SVkxDKFJ1bkxldmVsQmxvY2sgKlJMQiwgQml0c3RyZWFtRW5jVmlkZW8gKmJzLCBJbnQgal9zdGFydCwgSW50IGpfc3RvcCwgVUNoYXIgTW9kZSkKK3sKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpbnQgaTsKKyAgICBJbnQgbGV2ZWw7CisgICAgSW50IHJ1bjsKKyAgICBJbnQgaW50cmEgPSAoTW9kZSA9PSBNT0RFX0lOVFJBIHx8IE1vZGUgPT0gTU9ERV9JTlRSQV9RKTsKKworICAgIC8qIE5vdCBMYXN0IENvZWZmaWNpZW50ICovCisgICAgZm9yIChpID0gal9zdGFydDsgaSA8IGpfc3RvcCAtIDE7IGkrKykKKyAgICB7CisgICAgICAgIHJ1biA9IFJMQi0+cnVuW2ldOworICAgICAgICBsZXZlbCA9IFJMQi0+bGV2ZWxbaV07CisgICAgICAgIC8vaWYoaT09NjN8fFJMQi0+cnVuW2krMV0gPT0gLTEpICAgIC8qIERvbid0IENvZGUgTGFzdCBDb2VmZmljaWVudCBIZXJlICovCisgICAgICAgIC8vICBicmVhazsKKyAgICAgICAgLypFTkNPREUgUlVOIExFTkdUSCAqLworICAgICAgICBpZiAobGV2ZWwgPCAyOCAmJiBydW4gPCAzOSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IFB1dENvZWZmX0ludHJhX1JWTEMocnVuLCBsZXZlbCwgYnMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IFB1dENvZWZmX0ludGVyX1JWTEMocnVuLCBsZXZlbCwgYnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgIC8qIEVTQ0FQRSBDT0RJTkcgKi8KKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA1ICsgMSwgMik7IC8qIEVTQ0FQRSArIE5vdCBMYXN0IENvZWZmaWNpZW50ICovCisgICAgICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYnMsMSwwKTsgLyogTm90IExhc3QgQ29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDYgKyAxLCAocnVuIDw8IDEpIHwgMSk7IC8qIFJVTiArIE1BUktFUiBCSVQqLworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJzLDEsMSk7ICAvKiBNQVJLRVIgQklUICovCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJzLCAxMSwgbGV2ZWwpOyAvKiBMRVZFTCAqLworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgMSArIDQsIDE2KTsgLyogTUFSS0VSIEJJVCAqLworICAgICAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJzLDQsMCk7ICAvKiBSVkxDIFRSQUlMSU5HIEVTQ0FQRSAqLworICAgICAgICB9CisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDEsIFJMQi0+c1tpXSk7IC8qIFNJR04gQklUICovCisgICAgfQorICAgIC8qIExhc3QgQ29lZmZpY2llbnQhISEgKi8KKyAgICBydW4gPSBSTEItPnJ1bltpXTsKKyAgICBsZXZlbCA9IFJMQi0+bGV2ZWxbaV07CisKKyAgICAvKkVOQ09ERSBSVU4gTEVOR1RIICovCisgICAgaWYgKGxldmVsIDwgNiAmJiBydW4gPCA0NSkKKyAgICB7CisgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgICAgIGxlbmd0aCA9IFB1dENvZWZmX0ludHJhX1JWTENfTGFzdChydW4sIGxldmVsLCBicyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlbmd0aCA9IFB1dENvZWZmX0ludGVyX1JWTENfTGFzdChydW4sIGxldmVsLCBicyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAvKiBFU0NBUEUgQ09ESU5HICovCisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNSArIDEsIDMpOyAvKiBFU0NBUEUgQ09ERSArIExhc3QgQ29lZmZpY2llbnQqLworICAgICAgICAvL0JpdHN0cmVhbVB1dEJpdHMoYnMsMSwxKTsgLyogTGFzdCBDb2VmZmljaWVudCAhKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNiArIDEsIChydW4gPDwgMSkgfCAxKTsgLyogUlVOICsgTUFSS0VSIEJJVCovCisgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhicywxLDEpOyAgLyogTUFSS0VSIEJJVCAqLworICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJzLCAxMSwgbGV2ZWwpOyAvKiBMRVZFTCAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCAxICsgNCwgMTYpOyAvKiBNQVJLRVIgQklUICsgUlZMQyBUUkFJTElORyBFU0NBUEUgKi8KKyAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJzLDQsMCk7ICAvKiAqLworICAgIH0KKyAgICBCaXRzdHJlYW1QdXQxQml0cyhicywgUkxCLT5zW2ldKTsgLyogU0lHTiBCSVQgKi8KKworICAgIHJldHVybiA7Cit9CisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU0hPUlQgVklERU8gSEVBREVSIEVOQ09ESU5HICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworVm9pZCBCbG9ja0NvZGVDb2VmZl9TaG9ydEhlYWRlcihSdW5MZXZlbEJsb2NrICpSTEIsIEJpdHN0cmVhbUVuY1ZpZGVvICpicywgSW50IGpfc3RhcnQsIEludCBqX3N0b3AsIFVDaGFyIE1vZGUpCit7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgaW50IGk7CisvLyAgaW50IHRlbXA7CisgICAgSW50IGxldmVsOworICAgIEludCBydW47CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoTW9kZSk7CisKKyAgICAvKiBOb3QgTGFzdCBDb2VmZmljaWVudCAqLworICAgIGZvciAoaSA9IGpfc3RhcnQ7IGkgPCBqX3N0b3AgLSAxOyBpKyspCisgICAgeworICAgICAgICBydW4gPSBSTEItPnJ1bltpXTsKKyAgICAgICAgbGV2ZWwgPSBSTEItPmxldmVsW2ldOworLy8gICAgICBpZihpPT02MyB8fFJMQi0+cnVuW2krMV0gPT0gLTEpIC8qIERvbid0IENvZGUgTGFzdCBDb2VmZmljaWVudCBIZXJlICovCisvLyAgICAgICAgICBicmVhazsKKyAgICAgICAgLypFTkNPREUgUlVOIExFTkdUSCAqLworICAgICAgICBpZiAobGV2ZWwgPCAxMykKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50ZXIocnVuLCBsZXZlbCwgYnMpOworICAgICAgICAgICAgaWYgKGxlbmd0aCAhPSAwKQorICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8gQml0c3RyZWFtUHV0MUJpdHMoYnMsIFJMQi0+c1tpXSk7IC8qIFNpZ24gQml0ICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgLyogRVNDQVBFIENPRElORyAqLworICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSTEItPnNbaV0pCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA3ICsgMSwgNik7IC8qIEVTQ0FQRSBDT0RFICsgTm90IExhc3QgQ29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgIC8vQml0c3RyZWFtUHV0Qml0cyhicywxLDApOyAvKiBOb3QgTGFzdCBDb2VmZmljaWVudCAqLworICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNiwgcnVuKTsgLyogUlVOICovCisgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA4LCBsZXZlbCYweEZGKTsgLyogTEVWRUwsIG1hc2sgdG8gbWFrZSBzdXJlIGxlbmd0aCA4ICovCisgICAgICAgIH0KKyAgICB9CisgICAgLyogTGFzdCBDb2VmZmljaWVudCEhISAqLworICAgIHJ1biA9IFJMQi0+cnVuW2ldOworICAgIGxldmVsID0gUkxCLT5sZXZlbFtpXTsKKworICAgIC8qRU5DT0RFIFJVTiBMRU5HVEggKi8KKyAgICBpZiAobGV2ZWwgPCAxMykKKyAgICB7CisgICAgICAgIGxlbmd0aCA9IFB1dENvZWZmX0ludGVyX0xhc3QocnVuLCBsZXZlbCwgYnMpOworICAgICAgICBpZiAobGVuZ3RoICE9IDApCisgICAgICAgICAgICAvKnRlbXAgPSovIEJpdHN0cmVhbVB1dDFCaXRzKGJzLCBSTEItPnNbaV0pOyAvKiBTaWduIEJpdCAqLworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGxlbmd0aCA9IDA7CisgICAgLyogRVNDQVBFIENPRElORyAqLworICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICB7CisgICAgICAgIGlmIChSTEItPnNbaV0pCisgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNyArIDEsIDcpOyAvKiBFU0NBUEUgQ09ERSArIExhc3QgQ29lZmZpY2llbnQgKi8KKyAgICAgICAgLy9CaXRzdHJlYW1QdXRCaXRzKGJzLDEsMSk7IC8qIExhc3QgQ29lZmZpY2llbnQgISEhKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNiwgcnVuKTsgLyogUlVOICovCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDgsIGxldmVsJjB4RkYpOyAvKiBMRVZFTCwgbWFzayB0byBtYWtlIHN1cmUgbGVuZ3RoIDggICovCisgICAgfQorCisgICAgcmV0dXJuIDsKKworfQorCisjaWZuZGVmIEgyNjNfT05MWQorLyoqKioqKioqKioqKioqKiovCisvKiBWTEMgRU5DT0RJTkcgKi8KKy8qKioqKioqKioqKioqKioqLworVm9pZCBCbG9ja0NvZGVDb2VmZl9Ob3JtYWwoUnVuTGV2ZWxCbG9jayAqUkxCLCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMsIEludCBqX3N0YXJ0LCBJbnQgal9zdG9wLCBVQ2hhciBNb2RlKQoreworICAgIGludCBsZW5ndGggPSAwOworICAgIGludCBpOworICAgIC8vaW50IHRlbXA7CisgICAgSW50IGxldmVsOworICAgIEludCBydW47CisgICAgSW50IGludHJhID0gKE1vZGUgPT0gTU9ERV9JTlRSQSB8fCBNb2RlID09IE1PREVfSU5UUkFfUSk7CisgICAgSW50IGxldmVsX21pbnVzX21heDsKKyAgICBJbnQgcnVuX21pbnVzX21heDsKKyAgICBJbnQoKlB1dENvZWZmKShJbnQsIEludCwgQml0c3RyZWFtRW5jVmlkZW8gKik7IC8qIHBvaW50ZXIgdG8gZnVuY3Rpb25zLCA1LzI4LzAxICovCisKKyAgICAvKiBOb3QgTGFzdCBDb2VmZmljaWVudCEhISAqLworCisgICAgaWYgKGludHJhKQorICAgICAgICBQdXRDb2VmZiA9ICZQdXRDb2VmZl9JbnRyYTsKKyAgICBlbHNlCisgICAgICAgIFB1dENvZWZmID0gJlB1dENvZWZmX0ludGVyOworCisgICAgZm9yIChpID0gal9zdGFydDsgaSA8IGpfc3RvcCAtIDE7IGkrKykKKyAgICB7CisgICAgICAgIHJ1biA9IFJMQi0+cnVuW2ldOworICAgICAgICBsZXZlbCA9IFJMQi0+bGV2ZWxbaV07CisKKyAgICAgICAgLyogRW5jb2RlIFJ1biBMZW5ndGggKi8KKyAgICAgICAgaWYgKGxldmVsIDwgMjgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9ICgqUHV0Q29lZmYpKHJ1biwgbGV2ZWwsIGJzKTsgLyogNS8yOC8wMSByZXBsYWNlcyBhYm92ZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpcnN0IGVzY2FwZSBtb2RlOiBMRVZFTCBPRkZTRVQgKi8KKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW50cmEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxfbWludXNfbWF4ID0gbGV2ZWwgLSBpbnRyYV9tYXhfbGV2ZWxbMF1bcnVuXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxfbWludXNfbWF4IDwgMjgpCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IFB1dExldmVsQ29lZmZfSW50cmEocnVuLCBsZXZlbF9taW51c19tYXgsIGJzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxfbWludXNfbWF4ID0gbGV2ZWwgLSBpbnRlcl9tYXhfbGV2ZWxbMF1bcnVuXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWxfbWludXNfbWF4IDwgMTMpCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IFB1dExldmVsQ29lZmZfSW50ZXIocnVuLCBsZXZlbF9taW51c19tYXgsIGJzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFNlY29uZCBlc2NhcGUgbW9kZTogUlVOIE9GRlNFVCAqLworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDI4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fbWludXNfbWF4ID0gcnVuIC0gKGludHJhX21heF9ydW4wW2xldmVsXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0UnVuQ29lZmZfSW50cmEocnVuX21pbnVzX21heCwgbGV2ZWwsIGJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IDEzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fbWludXNfbWF4ID0gcnVuIC0gKGludGVyX21heF9ydW4wW2xldmVsXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0UnVuQ29lZmZfSW50ZXIocnVuX21pbnVzX21heCwgbGV2ZWwsIGJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBUaGlyZCBlc2NhcGUgbW9kZTogRklYRUQgTEVOR1RIIENPREUgKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoUkxCLT5zW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8KKyAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgNyArIDIgKyAxLCAzMCk7IC8qIEVTQ0FQRSBDT0RFICsgRm9sbG93ZWQgYnkgMTEgKyBOb3QgTGFzdCBDb2VmZmljaWVudCovCisgICAgICAgICAgICAgICAgICAgIC8vdGVtcCA9IEJpdHN0cmVhbVB1dEJpdHMoYnMsMiwzKTsgLyogRm9sbG93ZWQgYnkgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgLy90ZW1wID0gQml0c3RyZWFtUHV0Qml0cyhicywgMSwgMCk7IC8qIE5vdCBMYXN0IENvZWZmaWNpZW50Ki8KKyAgICAgICAgICAgICAgICAgICAgLyp0ZW1wID0qLworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA2ICsgMSwgKHJ1biA8PCAxKSB8IDEpOyAvKiBFbmNvZGUgUnVuICsgTWFya2VyIEJpdCAqLworICAgICAgICAgICAgICAgICAgICAvL3RlbXAgPSBCaXRzdHJlYW1QdXRCaXRzKGJzLDEsMSk7IC8qIE1hcmtlciBCaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyp0ZW1wID0qLworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJzLCAxMiArIDEsICgobGV2ZWwgPDwgMSkgfCAxKSYweDFGRkYpOyAvKiBFbmNvZGUgTGV2ZWwsIG1hc2sgdG8gbWFrZSBzdXJlIGxlbmd0aCAxMiAgKi8KKyAgICAgICAgICAgICAgICAgICAgLy90ZW1wID0gQml0c3RyZWFtUHV0Qml0cyhicywxLDEpOyAvKiBNYXJrZXIgQml0ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogRW5jb2RlIFNpZ24gQml0ICovCisgICAgICAgIGlmIChsZW5ndGggIT0gMCkKKyAgICAgICAgICAgIC8qdGVtcCA9Ki8gQml0c3RyZWFtUHV0MUJpdHMoYnMsIFJMQi0+c1tpXSk7IC8qIFNpZ24gQml0ICovCisKKyAgICB9CisgICAgLyogTGFzdCBDb2VmZmljaWVudCAqLworICAgIHJ1biA9IFJMQi0+cnVuW2ldOworICAgIGxldmVsID0gUkxCLT5sZXZlbFtpXTsKKworICAgIC8qIEVuY29kZSBSdW4gTGVuZ3RoICovCisgICAgaWYgKGxldmVsIDwgOSkKKyAgICB7CisgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuZ3RoID0gUHV0Q29lZmZfSW50cmFfTGFzdChydW4sIGxldmVsLCBicyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobGV2ZWwgPCA0KQorICAgICAgICB7CisgICAgICAgICAgICBsZW5ndGggPSBQdXRDb2VmZl9JbnRlcl9MYXN0KHJ1biwgbGV2ZWwsIGJzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBlc2NhcGUgbW9kZTogTEVWRUwgT0ZGU0VUICovCisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGludHJhKQorICAgICAgICB7CisgICAgICAgICAgICBsZXZlbF9taW51c19tYXggPSBsZXZlbCAtIGludHJhX21heF9sZXZlbFsxXVtydW5dOworICAgICAgICAgICAgaWYgKGxldmVsX21pbnVzX21heCA8IDkpCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0TGV2ZWxDb2VmZl9JbnRyYV9MYXN0KHJ1biwgbGV2ZWxfbWludXNfbWF4LCBicyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldmVsX21pbnVzX21heCA9IGxldmVsIC0gaW50ZXJfbWF4X2xldmVsWzFdW3J1bl07CisgICAgICAgICAgICBpZiAobGV2ZWxfbWludXNfbWF4IDwgNCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBQdXRMZXZlbENvZWZmX0ludGVyX0xhc3QocnVuLCBsZXZlbF9taW51c19tYXgsIGJzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICB9CisgICAgICAgIC8qIFNlY29uZCBlc2NhcGUgbW9kZTogUlVOIE9GRlNFVCAqLworICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGludHJhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuX21pbnVzX21heCA9IHJ1biAtIChpbnRyYV9tYXhfcnVuMVtsZXZlbF0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gUHV0UnVuQ29lZmZfSW50cmFfTGFzdChydW5fbWludXNfbWF4LCBsZXZlbCwgYnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBydW5fbWludXNfbWF4ID0gcnVuIC0gKGludGVyX21heF9ydW4xW2xldmVsXSArIDEpOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBQdXRSdW5Db2VmZl9JbnRlcl9MYXN0KHJ1bl9taW51c19tYXgsIGxldmVsLCBicyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbmd0aCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBUaGlyZCBlc2NhcGUgbW9kZTogRklYRUQgTEVOR1RIIENPREUgKi8KKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoUkxCLT5zW2ldKQorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICAvKnRlbXAgPSovCisgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0R1Q4Qml0cyhicywgNyArIDIgKyAxLCAzMSk7IC8qIEVTQ0FQRSBDT0RFICsgRm9sbG93ZWQgYnkgMTEgKyBMYXN0IENvZWZmaWNpZW50Ki8KKyAgICAgICAgICAgICAgICAvL3RlbXAgPSBCaXRzdHJlYW1QdXRCaXRzKGJzLDIsMyk7IC8qIEZvbGxvd2VkIGJ5IDExICovCisgICAgICAgICAgICAgICAgLy90ZW1wID0gQml0c3RyZWFtUHV0Qml0cyhicywgMSwgMSk7IC8qIExhc3QgQ29lZmZpY2llbnQhISEqLworICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCA2ICsgMSwgKHJ1biA8PCAxKSB8IDEpOyAvKiBFbmNvZGUgUnVuICsgTWFya2VyIEJpdCAqLworICAgICAgICAgICAgICAgIC8vdGVtcCA9IEJpdHN0cmVhbVB1dEJpdHMoYnMsMSwxKTsgLyogTWFya2VyIEJpdCAqLworICAgICAgICAgICAgICAgIC8qdGVtcCA9Ki8KKyAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRHVDhCaXRzKGJzLCAxMiArIDEsICgobGV2ZWwgPDwgMSkgfCAxKSYweDFGRkYpOyAvKiBFbmNvZGUgTGV2ZWwsIG1hc2sgdG8gbWFrZSBzdXJlIGxlbmd0aCA4ICovCisgICAgICAgICAgICAgICAgLy90ZW1wID0gQml0c3RyZWFtUHV0Qml0cyhicywxLDEpOyAvKiBNYXJrZXIgQml0ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFbmNvZGUgU2lnbiBCaXQgKi8KKyAgICBpZiAobGVuZ3RoICE9IDApCisgICAgICAgIC8qdGVtcCA9Ki8gQml0c3RyZWFtUHV0MUJpdHMoYnMsIFJMQi0+c1tpXSk7CisKKworICAgIHJldHVybiA7Cit9CisKKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUlVOTGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS8yMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCB0aGUgQ29kZWQgQmxvY2sgUGF0dGVybiBmb3IgZWFjaCBibG9jayAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEludCogcWNvZWZmICAgICBRdWFudGl6ZWQgRENUIGNvZWZmaWNpZW50cworICAgICAgICBJbnQgTW9kZSAgICAgICAgQ29kaW5nIE1vZGUKKyAgICAgICAgSW50IG5jb2VmZnMgICAgIE51bWJlciBvZiBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEludCBDQlAgICAgICAgICBDb2RlZCBCbG9jayBQYXR0ZXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3ZvaWQgUnVuTGV2ZWwoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGludHJhLCBJbnQgaW50cmFEQ19kZWNpc2lvbiwgSW50IG5jb2VmYmxja1tdKQoreworICAgIEludCBpLCBqOworICAgIEludCBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbdmlkZW8tPm1ibnVtXTsKKyAgICBJbnQgU2hvcnROYWNOaW50cmEgPSAoISh2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdLT5zaG9ydFZpZGVvSGVhZGVyKSAmJiB2aWRlby0+YWNQcmVkRmxhZ1t2aWRlby0+bWJudW1dICYmIGludHJhKTsKKyAgICBNYWNyb0Jsb2NrICpNQiA9IHZpZGVvLT5vdXRwdXRNQjsKKyAgICBTaG9ydCAqZGF0YUJsb2NrOworICAgIEludCBsZXZlbDsKKyAgICBSdW5MZXZlbEJsb2NrICpSTEI7CisgICAgSW50IHJ1biwgaWR4OworICAgIEludCAqenosIG5jLCB6em9yZGVyOworICAgIFVDaGFyIGltYXNrWzZdID0gezB4MUYsIDB4MkYsIDB4MzcsIDB4M0IsIDB4M0QsIDB4M0V9OworICAgIFVJbnQgKmJpdG1hcHp6OworCisgICAgLyogU2V0IFJ1biwgTGV2ZWwgYW5kIENCUCBmb3IgdGhpcyBNYWNyb2Jsb2NrICovCisgICAgLyogWlogc2NhbiBpcyBkb25lIGhlcmUuICAqLworCisgICAgaWYgKGludHJhKQorICAgIHsKKworICAgICAgICBpZiAoaW50cmFEQ19kZWNpc2lvbiAhPSAwKQorICAgICAgICAgICAgaW50cmEgPSAwOyAgICAgICAgICAgICAgLyogREMvQUMgaW4gUnVuL0xldmVsICovCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDYgOyBpKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgenogPSAoSW50ICopIHppZ3phZ19pbnY7CisKKyAgICAgICAgICAgIFJMQiA9IHZpZGVvLT5STEIgKyBpOworCisgICAgICAgICAgICBkYXRhQmxvY2sgPSBNQi0+YmxvY2tbaV07CisKKyAgICAgICAgICAgIGlmIChpbnRyYSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSTEItPnJ1blswXSA9IDA7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBkYXRhQmxvY2tbMF07CisgICAgICAgICAgICAgICAgZGF0YUJsb2NrWzBdID0gMDsgLyogcmVzZXQgdG8gemVybyAqLworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSTEItPmxldmVsWzBdID0gLWxldmVsOworICAgICAgICAgICAgICAgICAgICBSTEItPnNbMF0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSTEItPmxldmVsWzBdID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+c1swXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZHggPSBpbnRyYTsKKworICAgICAgICAgICAgaWYgKChDQlAgPj4gKDUgLSBpKSkgJiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTaG9ydE5hY05pbnRyYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKHZpZGVvLT56el9kaXJlY3Rpb24gPj4gKDUgLSBpKSkmMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6ID0gKEludCAqKXppZ3phZ192X2ludjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6eiA9IChJbnQgKil6aWd6YWdfaF9pbnY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgICAgICBuYyA9IG5jb2VmYmxja1tpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSBpbnRyYSwgenogKz0gaW50cmE7IGogPCBuYzsgaisrLCB6eisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgenpvcmRlciA9ICp6ejsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBkYXRhQmxvY2tbenpvcmRlcl07CisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcnVuKys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUJsb2NrW3p6b3JkZXJdID0gMDsgLyogcmVzZXQgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IC1sZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5jb2VmYmxja1tpXSA9IGlkeDsgLyogNS8yMi8wMSwgcmV1c2UgbmNvZWZibGNrICovCisKKyAgICAgICAgICAgIGlmIChpZHggPT0gaW50cmEpIC8qIHJlc2V0IENCUCwgbm90aGluZyB0byBiZSBjb2RlZCAqLworICAgICAgICAgICAgICAgIENCUCAmPSBpbWFza1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFt2aWRlby0+bWJudW1dID0gQ0JQOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisvLyAgICAgIHp6ID0gKEludCAqKSB6aWd6YWdfaW52OyAgbm8gbmVlZCB0byB1c2UgaXQsIGRlZmF1bHQKKworICAgICAgICBpZiAoQ0JQKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNiA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSTEIgPSB2aWRlby0+UkxCICsgaTsKKyAgICAgICAgICAgICAgICBpZHggPSAwOworCisgICAgICAgICAgICAgICAgaWYgKChDQlAgPj4gKDUgLSBpKSkgJiAxKQorICAgICAgICAgICAgICAgIHsgICAvKiA3LzMwLzAxICovCisgICAgICAgICAgICAgICAgICAgIC8qIFVzZSBiaXRtYXB6eiB0byBmaW5kIHRoZSBSdW4sTGV2ZWwsU2lnbiBzeW1ib2xzICovCisgICAgICAgICAgICAgICAgICAgIGJpdG1hcHp6ID0gdmlkZW8tPmJpdG1hcHp6W2ldOworICAgICAgICAgICAgICAgICAgICBkYXRhQmxvY2sgPSBNQi0+YmxvY2tbaV07CisgICAgICAgICAgICAgICAgICAgIG5jICA9IG5jb2VmYmxja1tpXTsKKworICAgICAgICAgICAgICAgICAgICBpZHggPSB6ZXJvX3J1bl9zZWFyY2goYml0bWFwenosIGRhdGFCbG9jaywgUkxCLCBuYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5jb2VmYmxja1tpXSA9IGlkeDsgLyogNS8yMi8wMSwgcmV1c2UgbmNvZWZibGNrICovCisgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAwKSAvKiByZXNldCBDQlAsIG5vdGhpbmcgdG8gYmUgY29kZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgQ0JQICY9IGltYXNrW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW3ZpZGVvLT5tYm51bV0gPSBDQlA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9Cit9CisKKyNpZm5kZWYgSDI2M19PTkxZCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorICAgIHN0YXRpYyBCb29sIEludHJhRENTd2l0Y2hfRGVjaXNpb24oSW50IE1vZGUsIEludCBpbnRyYV9kY192bGNfdGhyLCBJbnQgaW50cmFEQ1ZsY1FQKQorICAgIHsKKyAgICAgICAgQm9vbCBzd2l0Y2hlZCA9IEZBTFNFOworCisgICAgICAgIGlmIChNb2RlID09IE1PREVfSU5UUkEgfHwgTW9kZSA9PSBNT0RFX0lOVFJBX1EpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbnRyYV9kY192bGNfdGhyICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoZWQgPSAoaW50cmFfZGNfdmxjX3RociA9PSA3IHx8IGludHJhRENWbGNRUCA+PSBpbnRyYV9kY192bGNfdGhyICogMiArIDExKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzd2l0Y2hlZDsKKyAgICB9CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitJbnQgSW50cmFEQ19kcGNtKEludCB2YWwsIEludCBsdW0sIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pCit7CisgICAgSW50IG5fYml0czsKKyAgICBJbnQgYWJzdmFsLCBzaXplID0gMDsKKworICAgIGFic3ZhbCA9ICh2YWwgPCAwKSA/IC12YWwgOiB2YWw7ICAgIC8qIGFicyh2YWwpICovCisKKworICAgIC8qIGNvbXB1dGUgZGN0X2RjX3NpemUgKi8KKworICAgIHNpemUgPSAwOworICAgIHdoaWxlIChhYnN2YWwpCisgICAgeworICAgICAgICBhYnN2YWwgPj49IDE7CisgICAgICAgIHNpemUrKzsKKyAgICB9CisKKyAgICBpZiAobHVtKQorICAgIHsgICAvKiBsdW1pbmFuY2UgKi8KKyAgICAgICAgbl9iaXRzID0gUHV0RENzaXplX2x1bShzaXplLCBiaXRzdHJlYW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8qIGNocm9taW5hbmNlICovCisgICAgICAgIG5fYml0cyA9IFB1dERDc2l6ZV9jaHJvbShzaXplLCBiaXRzdHJlYW0pOworICAgIH0KKworICAgIGlmIChzaXplICE9IDApCisgICAgeworICAgICAgICBpZiAodmFsID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFic3ZhbCA9IC12YWw7IC8qIHNldCB0byAiLXZhbCIgTVcgMTQtTk9WLTE5OTYgKi8KKyAgICAgICAgICAgIHZhbCA9IGFic3ZhbCBeKCgxIDw8IHNpemUpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhiaXRzdHJlYW0sIChzaXplKSwgKFVJbnQpKHZhbCkpOworICAgICAgICBuX2JpdHMgKz0gc2l6ZTsKKworICAgICAgICBpZiAoc2l6ZSA+IDgpCisgICAgICAgICAgICBCaXRzdHJlYW1QdXQxQml0cyhiaXRzdHJlYW0sIDEpOworICAgIH0KKworICAgIHJldHVybiBuX2JpdHM7ICAvKiAjIGJpdHMgZm9yIGludHJhX2RjIGRwY20gKi8KKworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERDX0FDX1BSRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDkvMjQvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEQyBhbmQgQUMgZW5jb2Rpbmcgb2YgSW50cmEgQmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBWaWRlb0VuY0RhdGEgICAgKnZpZGVvCisgICAgICAgIFVDaGFyICAgICAgICAgICBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0ludCBjYWxfZGNfc2NhbGVyRU5DKEludCBRUCwgSW50IHR5cGUpIDsKKworCisjZGVmaW5lIFBSRURJQ1RfQUMgIGZvciAobSA9IDA7IG0gPCA3OyBtKyspeyBcCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBEQ0FDWzBdKlFQdG1wO1wKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRtcDwwKSAgIHRtcCA9ICh0bXAtKFFQLzIpKS9RUDtcCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICB0bXAgPSAodG1wKyhRUC8yKSkvUVA7XAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFttXSA9IHRtcDtcCisgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDKys7XAorICAgICAgICAgICAgICAgICAgICB9CisKKworVm9pZCBEQ0FDUHJlZChWaWRlb0VuY0RhdGEgKnZpZGVvLCBVQ2hhciBNb2RlLCBJbnQgKmludHJhRENfZGVjaXNpb24sIEludCBpbnRyYURDVmxjUVApCit7CisgICAgTWFjcm9CbG9jayAqTUIgPSB2aWRlby0+b3V0cHV0TUI7CisgICAgSW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIHR5cGVEQ1N0b3JlICpEQ19zdG9yZSA9IHZpZGVvLT5wcmVkREMgKyBtYm51bTsKKyAgICB0eXBlRENBQ1N0b3JlICpEQ0FDX3JvdyA9IHZpZGVvLT5wcmVkRENBQ19yb3c7CisgICAgdHlwZURDQUNTdG9yZSAqRENBQ19jb2wgPSB2aWRlby0+cHJlZERDQUNfY29sOworICAgIFNob3J0ICAgKkRDQUM7CisgICAgVUNoYXIgTW9kZV90b3AsIE1vZGVfbGVmdDsKKworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgSW50IG5NQlBlclJvdyA9IGN1cnJWb2wtPm5NQlBlclJvdzsKKyAgICBJbnQgeF9wb3MgPSB2aWRlby0+b3V0cHV0TUItPm1iX3g7IC8qIDUvMjgvMDEgKi8KKyAgICBJbnQgeV9wb3MgPSB2aWRlby0+b3V0cHV0TUItPm1iX3k7CisgICAgVUNoYXIgUVAgPSB2aWRlby0+UVBNQlttYm51bV07CisgICAgVUNoYXIgKlFQTUIgPSB2aWRlby0+UVBNQjsKKyAgICBVQ2hhciAqc2xpY2VfbmIgPSB2aWRlby0+c2xpY2VObzsKKyAgICBCb29sIGJBQ1ByZWRFbmFibGUgPSB2aWRlby0+ZW5jUGFyYW1zLT5BQ0RDUHJlZGljdGlvbjsKKyAgICBJbnQgKkFDcHJlZF9mbGFnID0gdmlkZW8tPmFjUHJlZEZsYWc7CisgICAgSW50IG1pZF9ncmV5ID0gMTI4IDw8IDM7CisgICAgSW50IG07CisgICAgSW50IGNvbXA7CisgICAgSW50IGRjX3NjYWxlID0gOCwgdG1wOworCisgICAgc3RhdGljIGNvbnN0IEludCBYcG9zWzZdID0geyAtMSwgMCwgLTEsIDAsIC0xLCAtMX07CisgICAgc3RhdGljIGNvbnN0IEludCBZcG9zWzZdID0geyAtMSwgLTEsIDAsIDAsIC0xLCAtMX07CisgICAgc3RhdGljIGNvbnN0IEludCBYdGFiWzZdID0gezEsIDAsIDMsIDIsIDQsIDV9OworICAgIHN0YXRpYyBjb25zdCBJbnQgWXRhYls2XSA9IHsyLCAzLCAwLCAxLCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgSW50IFp0YWJbNl0gPSB7MywgMiwgMSwgMCwgNCwgNX07CisKKyAgICAvKiBJIGFkZGVkIHRoZXNlIHRvIHNwZWVkIHVwIGNvbXBhcmlzb25zICovCisgICAgc3RhdGljIGNvbnN0IEludCBQb3MwWzZdID0geyAxLCAxLCAwLCAwLCAxLCAxfTsKKyAgICBzdGF0aWMgY29uc3QgSW50IFBvczFbNl0gPSB7IDEsIDAsIDEsIDAsIDEsIDF9OworICAgIHN0YXRpYyBjb25zdCBJbnQgQl9YdGFiWzZdID0gezAsIDEsIDAsIDEsIDIsIDN9OworICAgIHN0YXRpYyBjb25zdCBJbnQgQl9ZdGFiWzZdID0gezAsIDAsIDEsIDEsIDIsIDN9OworCisgICAgSW50IGRpcmVjdGlvbls2XTsgICAgICAgLyogMDogSE9SSVpPTlRBTCwgMTogVkVSVElDQUwgKi8KKyAgICBJbnQgYmxvY2tfQSwgYmxvY2tfQiwgYmxvY2tfQzsKKyAgICBJbnQgZ3JhZF9ob3IsIGdyYWRfdmVyLCBEQ19wcmVkOworICAgIFNob3J0IHByZWRbN10sICpwcmVkcHRyOworICAgIFNob3J0IHBjb2VmZls0Ml07CisgICAgU2hvcnQgKnFjb2VmZjsKKyAgICBJbnQgUyA9IDAsIFMxLCBTMjsKKyAgICBJbnQgZGlmZiwgUVB0bXA7CisgICAgSW50IG5ld0NCUFs2XTsKKyAgICBVQ2hhciBtYXNrMVs2XSA9IHsweDIwLCAweDEwLCAweDgsIDB4NCwgMHgyLCAweDF9OworLy8gIFVDaGFyIG1hc2syWzZdID0gezB4MWYsMHgyZiwweDM3LDB4M2IsMHgzZCwweDNlfTsKKworICAgIEludCB5X29mZnNldCwgeF9vZmZzZXQsIHhfdGFiLCB5X3RhYiwgel90YWI7ICAgIC8qIHNwZWVkdXAgY29lZmZpY2llbnRzICovCisgICAgSW50IGJfeHRhYiwgYl95dGFiOworCisgICAgdmlkZW8tPnp6X2RpcmVjdGlvbiA9IDA7CisKKyAgICAvKiBTdGFuZGFyZCBNUEVHLTQgSGVhZGVycyBkbyBEQy9BQyBwcmVkaWN0aW9uKi8KKyAgICAvKiBjaGVjayB3aGV0aGVyIG5laWdoYm9ycyBhcmUgSU5URVIgKi8KKyAgICBpZiAoeV9wb3MgPiAwKQorICAgIHsKKyAgICAgICAgTW9kZV90b3AgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtLW5NQlBlclJvd107CisgICAgICAgIGlmICghKE1vZGVfdG9wID09IE1PREVfSU5UUkEgfHwgTW9kZV90b3AgPT0gTU9ERV9JTlRSQV9RKSkKKyAgICAgICAgeworICAgICAgICAgICAgRENBQyA9IERDX3N0b3JlWy1uTUJQZXJSb3ddOworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgKkRDQUMrKyA9IG1pZF9ncmV5OworICAgICAgICAgICAgLyogc2V0IHRvIDAgRENBQ19yb3dbeF9wb3NdWzAuLjNdICovCisgICAgICAgICAgICBpZiAoYkFDUHJlZEVuYWJsZSA9PSBUUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00VkVOQ19NRU1TRVQoRENBQ19yb3dbeF9wb3NdWzBdLCAwLCBzaXplb2YoU2hvcnQpIDw8IDUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICh4X3BvcyA+IDApCisgICAgeworICAgICAgICBNb2RlX2xlZnQgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtLTFdOworICAgICAgICBpZiAoIShNb2RlX2xlZnQgPT0gTU9ERV9JTlRSQSB8fCBNb2RlX2xlZnQgPT0gTU9ERV9JTlRSQV9RKSkKKyAgICAgICAgeworICAgICAgICAgICAgRENBQyA9IERDX3N0b3JlWy0xXTsKKyAgICAgICAgICAgICpEQ0FDKysgPSBtaWRfZ3JleTsKKyAgICAgICAgICAgICpEQ0FDKysgPSBtaWRfZ3JleTsKKyAgICAgICAgICAgICpEQ0FDKysgPSBtaWRfZ3JleTsKKyAgICAgICAgICAgICpEQ0FDKysgPSBtaWRfZ3JleTsKKyAgICAgICAgICAgICpEQ0FDKysgPSBtaWRfZ3JleTsKKyAgICAgICAgICAgICpEQ0FDKysgPSBtaWRfZ3JleTsKKyAgICAgICAgICAgIC8qIHNldCB0byAwIERDQUNfY29sW3hfcG9zXVswLi4zXSAqLworICAgICAgICAgICAgaWYgKGJBQ1ByZWRFbmFibGUgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNFZFTkNfTUVNU0VUKERDQUNfY29sWzBdWzBdLCAwLCBzaXplb2YoU2hvcnQpIDw8IDUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUzEgPSAwOworICAgIFMyID0gMDsKKworICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCisgICAgeworCisgICAgICAgIGlmIChZcG9zW2NvbXBdICE9IDApICAgICAgICB5X29mZnNldCA9IC1uTUJQZXJSb3c7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIHlfb2Zmc2V0ID0gMDsKKyAgICAgICAgeF9vZmZzZXQgPSBYcG9zW2NvbXBdOworICAgICAgICB4X3RhYiA9IFh0YWJbY29tcF07CisgICAgICAgIHlfdGFiID0gWXRhYltjb21wXTsKKyAgICAgICAgel90YWIgPSBadGFiW2NvbXBdOworCisgICAgICAgIGJfeHRhYiA9IEJfWHRhYltjb21wXTsKKyAgICAgICAgYl95dGFiID0gQl9ZdGFiW2NvbXBdOworCisgICAgICAgIHFjb2VmZiA9IE1CLT5ibG9ja1tjb21wXTsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogIFN0b3JlIERDIGNvZWZmaWNpZW50cyAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogU3RvcmUgY29lZmYgdmFsdWVzIGZvciBJbnRyYSBNQiAqLworICAgICAgICBpZiAoY29tcCA9PSAwKSBkY19zY2FsZSA9IGNhbF9kY19zY2FsZXJFTkMoUVAsIDEpIDsKKyAgICAgICAgaWYgKGNvbXAgPT0gNCkgZGNfc2NhbGUgPSBjYWxfZGNfc2NhbGVyRU5DKFFQLCAyKSA7CisKKyAgICAgICAgUVB0bXAgPSBxY29lZmZbMF0gKiBkY19zY2FsZTsgLyogREMgdmFsdWUgKi8KKworICAgICAgICBpZiAoUVB0bXAgPiAyMDQ3KSAgIC8qIDEwLzEwLzAxLCBhZGQgY2xpcHBpbmcgKGJ1ZyBmaXhlZCkgKi8KKyAgICAgICAgICAgIERDX3N0b3JlWzBdW2NvbXBdID0gMjA0NzsKKyAgICAgICAgZWxzZSBpZiAoUVB0bXAgPCAtMjA0OCkKKyAgICAgICAgICAgIERDX3N0b3JlWzBdW2NvbXBdID0gLTIwNDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIERDX3N0b3JlWzBdW2NvbXBdID0gUVB0bXA7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBGaW5kIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHByZWRpY3Rpb24gYW5kIHRoZSBEQyBwcmVkaWN0aW9uICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBpZiAoKHhfcG9zID09IDApICYmIHlfcG9zID09IDApCisgICAgICAgIHsgICAvKiB0b3AgbGVmdCBjb3JuZXIgKi8KKyAgICAgICAgICAgIGJsb2NrX0EgPSAoY29tcCA9PSAxIHx8IGNvbXAgPT0gMykgPyBEQ19zdG9yZVswXVt4X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgICAgIGJsb2NrX0IgPSAoY29tcCA9PSAzKSA/IERDX3N0b3JlW3hfb2Zmc2V0XVt6X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgICAgIGJsb2NrX0MgPSAoY29tcCA9PSAyIHx8IGNvbXAgPT0gMykgPyBEQ19zdG9yZVswXVt5X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh4X3BvcyA9PSAwKQorICAgICAgICB7ICAgLyogbGVmdCBlZGdlICovCisgICAgICAgICAgICBibG9ja19BID0gKGNvbXAgPT0gMSB8fCBjb21wID09IDMpID8gRENfc3RvcmVbMF1beF90YWJdIDogbWlkX2dyZXk7CisgICAgICAgICAgICBibG9ja19CID0gKChjb21wID09IDEgJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS1uTUJQZXJSb3ddKSkgfHwgY29tcCA9PSAzKSA/CisgICAgICAgICAgICAgICAgICAgICAgRENfc3RvcmVbeV9vZmZzZXQreF9vZmZzZXRdW3pfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICAgICAgYmxvY2tfQyA9IChjb21wID09IDIgfHwgY29tcCA9PSAzIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChQb3MwW2NvbXBdICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkpKSA/CisgICAgICAgICAgICAgICAgICAgICAgRENfc3RvcmVbeV9vZmZzZXRdW3lfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHlfcG9zID09IDApCisgICAgICAgIHsgLyogdG9wIHJvdyAqLworICAgICAgICAgICAgYmxvY2tfQSA9IChjb21wID09IDEgfHwgY29tcCA9PSAzIHx8IChQb3MxW2NvbXBdICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tMV0pKSkgPworICAgICAgICAgICAgICAgICAgICAgIERDX3N0b3JlW3hfb2Zmc2V0XVt4X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgICAgIGJsb2NrX0IgPSAoKGNvbXAgPT0gMiAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLTFdKSkgfHwgY29tcCA9PSAzKSA/CisgICAgICAgICAgICAgICAgICAgICAgRENfc3RvcmVbeV9vZmZzZXQgKyB4X29mZnNldF1bel90YWJdIDogbWlkX2dyZXk7CisgICAgICAgICAgICBibG9ja19DID0gKGNvbXAgPT0gMiB8fCBjb21wID09IDMpID8KKyAgICAgICAgICAgICAgICAgICAgICBEQ19zdG9yZVt5X29mZnNldF1beV90YWJdIDogbWlkX2dyZXk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBibG9ja19BID0gKGNvbXAgPT0gMSB8fCBjb21wID09IDMgfHwgKFBvczFbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xXSkpKSA/CisgICAgICAgICAgICAgICAgICAgICAgRENfc3RvcmVbeF9vZmZzZXRdW3hfdGFiXSA6IG1pZF9ncmV5OworICAgICAgICAgICAgYmxvY2tfQiA9ICgoKGNvbXAgPT0gMCB8fCBjb21wID09IDQgfHwgY29tcCA9PSA1KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xLW5NQlBlclJvd10pKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAoY29tcCA9PSAxICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChjb21wID09IDIgJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xXSkpIHx8IChjb21wID09IDMpKSA/CisgICAgICAgICAgICAgICAgICAgICAgKERDX3N0b3JlW3lfb2Zmc2V0ICsgeF9vZmZzZXRdW3pfdGFiXSkgOiBtaWRfZ3JleTsKKyAgICAgICAgICAgIGJsb2NrX0MgPSAoY29tcCA9PSAyIHx8IGNvbXAgPT0gMyB8fCAoUG9zMFtjb21wXSAmJiAoc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLW5NQlBlclJvd10pKSkgPworICAgICAgICAgICAgICAgICAgICAgIERDX3N0b3JlW3lfb2Zmc2V0XVt5X3RhYl0gOiBtaWRfZ3JleTsKKyAgICAgICAgfQorICAgICAgICBncmFkX2hvciA9IGJsb2NrX0IgLSBibG9ja19DOworICAgICAgICBncmFkX3ZlciA9IGJsb2NrX0EgLSBibG9ja19COworCisgICAgICAgIGlmICgoUFZfQUJTKGdyYWRfdmVyKSkgPCAoUFZfQUJTKGdyYWRfaG9yKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERDX3ByZWQgPSBibG9ja19DOworICAgICAgICAgICAgZGlyZWN0aW9uW2NvbXBdID0gMTsKKyAgICAgICAgICAgIHZpZGVvLT56el9kaXJlY3Rpb24gPSAodmlkZW8tPnp6X2RpcmVjdGlvbikgfCBtYXNrMVtjb21wXTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRENfcHJlZCA9IGJsb2NrX0E7CisgICAgICAgICAgICBkaXJlY3Rpb25bY29tcF0gPSAwOworICAgICAgICAgICAgLy92aWRlby0+enpfZGlyZWN0aW9uPXZpZGVvLT56el9kaXJlY3Rpb248PDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBEQyBwcmVkaWN0aW9uICovCisgICAgICAgIFFQdG1wID0gZGNfc2NhbGU7IC8qIDUvMjgvMDEgKi8KKyAgICAgICAgcWNvZWZmWzBdIC09IChEQ19wcmVkICsgUVB0bXAgLyAyKSAvIFFQdG1wOworCisKKyAgICAgICAgaWYgKGJBQ1ByZWRFbmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIEZpbmQgQUMgcHJlZGljdGlvbiAgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgaWYgKCh4X3BvcyA9PSAwKSAmJiB5X3BvcyA9PSAwKSAgICAgLyogdG9wIGxlZnQgY29ybmVyICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbltjb21wXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gMSB8fCBjb21wID09IDMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gUVBNQlttYm51bSt4X29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDID0gRENBQ19jb2xbMF1bYl95dGFiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCAhPSBRUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUX0FDCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IERDQUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRbMF0gPSBwcmVkWzFdID0gcHJlZFsyXSA9IHByZWRbM10gPSBwcmVkWzRdID0gcHJlZFs1XSA9IHByZWRbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wID09IDIgfHwgY29tcCA9PSAzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRUHRtcCA9IFFQTUJbbWJudW0rIHlfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX3Jvd1t4X3Bvc11bYl94dGFiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCAhPSBRUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUX0FDCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IERDQUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRbMF0gPSBwcmVkWzFdID0gcHJlZFsyXSA9IHByZWRbM10gPSBwcmVkWzRdID0gcHJlZFs1XSA9IHByZWRbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoeF9wb3MgPT0gMCkgICAgLyogbGVmdCBlZGdlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbltjb21wXSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gMSB8fCBjb21wID09IDMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gUVBNQlttYm51bSt4X29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDID0gRENBQ19jb2xbMF1bYl95dGFiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCAhPSBRUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUX0FDCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IERDQUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRbMF0gPSBwcmVkWzFdID0gcHJlZFsyXSA9IHByZWRbM10gPSBwcmVkWzRdID0gcHJlZFs1XSA9IHByZWRbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChQb3MwW2NvbXBdICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcCA9PSAyIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3lfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX3Jvd1t4X3Bvc11bYl94dGFiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCAhPSBRUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUNUX0FDCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IERDQUM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gcHJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRbMF0gPSBwcmVkWzFdID0gcHJlZFsyXSA9IHByZWRbM10gPSBwcmVkWzRdID0gcHJlZFs1XSA9IHByZWRbNl0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoeV9wb3MgPT0gMCkgIC8qIHRvcCByb3cgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uW2NvbXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKFBvczFbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcCA9PSAxIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3hfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX2NvbFswXVtiX3l0YWJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wICE9IFFQKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RfQUMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gRENBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFswXSA9IHByZWRbMV0gPSBwcmVkWzJdID0gcHJlZFszXSA9IHByZWRbNF0gPSBwcmVkWzVdID0gcHJlZFs2XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPT0gMiB8fCBjb21wID09IDMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gUVBNQlttYm51bSt5X29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDID0gRENBQ19yb3dbeF9wb3NdW2JfeHRhYl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXAgIT0gUVApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRElDVF9BQworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBEQ0FDOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkWzBdID0gcHJlZFsxXSA9IHByZWRbMl0gPSBwcmVkWzNdID0gcHJlZFs0XSA9IHByZWRbNV0gPSBwcmVkWzZdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aW9uW2NvbXBdID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKFBvczFbY29tcF0gJiYgKHNsaWNlX25iW21ibnVtXSA9PSBzbGljZV9uYlttYm51bS0xXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcCA9PSAxIHx8IGNvbXAgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUVB0bXAgPSBRUE1CW21ibnVtK3hfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDQUMgPSBEQ0FDX2NvbFswXVtiX3l0YWJdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wICE9IFFQKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1RfQUMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkcHRyID0gRENBQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBwcmVkOworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZFswXSA9IHByZWRbMV0gPSBwcmVkWzJdID0gcHJlZFszXSA9IHByZWRbNF0gPSBwcmVkWzVdID0gcHJlZFs2XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChQb3MwW2NvbXBdICYmIChzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY29tcCAgPT0gMiB8fCBjb21wID09IDMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gUVBNQlttYm51bSt5X29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDID0gRENBQ19yb3dbeF9wb3NdW2JfeHRhYl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXAgIT0gUVApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRElDVF9BQworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRwdHIgPSBEQ0FDOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHB0ciA9IHByZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkWzBdID0gcHJlZFsxXSA9IHByZWRbMl0gPSBwcmVkWzNdID0gcHJlZFs0XSA9IHByZWRbNV0gPSBwcmVkWzZdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIERlY2lkZSBhbmQgUGVyZm9ybSBBQyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgbmV3Q0JQW2NvbXBdID0gMDsKKworICAgICAgICAgICAgaWYgKGRpcmVjdGlvbltjb21wXSA9PSAwKSAgIC8qIEhvcml6b250YWwsIGxlZnQgQ09MVU1OIG9mIGJsb2NrIEEgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEQ0FDID0gcGNvZWZmICsgY29tcCAqIDc7IC8qIHJlLXVzZSBEQ0FDIGFzIGxvY2FsIHZhciAqLworICAgICAgICAgICAgICAgIHFjb2VmZiArPSA4OworICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA3OyBtKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBRUHRtcCA9IHFjb2VmZlttPDwzXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFFQdG1wID4gMCkgIFMxICs9IFFQdG1wOworICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICBTMSAtPSBRUHRtcDsKKyAgICAgICAgICAgICAgICAgICAgUVB0bXAgLT0gcHJlZHB0clttXTsKKyAgICAgICAgICAgICAgICAgICAgRENBQ1ttXSA9IFFQdG1wOyAvKiBzYXZlIHByZWRpY3Rpb24gcmVzaWR1ZSB0byBwY29lZmYqLworICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXApICBuZXdDQlBbY29tcF0gPSAxOworICAgICAgICAgICAgICAgICAgICBkaWZmID0gUFZfQUJTKFFQdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgUzIgKz0gZGlmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgLyogVmVydGljYWwsIHRvcCBST1cgb2YgYmxvY2sgQyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHFjb2VmZisrOworICAgICAgICAgICAgICAgIERDQUMgPSBwY29lZmYgKyBjb21wICogNzsgLyogcmUtdXNlIERDQUMgYXMgbG9jYWwgdmFyICovCisgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDc7IG0rKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFFQdG1wID0gcWNvZWZmW21dOworICAgICAgICAgICAgICAgICAgICBpZiAoUVB0bXAgPiAwKSAgUzEgKz0gUVB0bXA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgIFMxIC09IFFQdG1wOworICAgICAgICAgICAgICAgICAgICBRUHRtcCAtPSBwcmVkcHRyW21dOworICAgICAgICAgICAgICAgICAgICBEQ0FDW21dID0gUVB0bXA7IC8qIHNhdmUgcHJlZGljdGlvbiByZXNpZHVlIHRvIHBjb2VmZiovCisgICAgICAgICAgICAgICAgICAgIGlmIChRUHRtcCkgIG5ld0NCUFtjb21wXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBQVl9BQlMoUVB0bXApOworICAgICAgICAgICAgICAgICAgICBTMiArPSBkaWZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiAgU3RvcmUgRENBQyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogU3RvcmUgY29lZmYgdmFsdWVzIGZvciBJbnRyYSBNQiAqLworICAgICAgICAgICAgcWNvZWZmID0gTUItPmJsb2NrW2NvbXBdOworICAgICAgICAgICAgRENBQyA9IERDQUNfcm93W3hfcG9zXVtiX3h0YWJdOworICAgICAgICAgICAgRENBQ1swXSA9IHFjb2VmZlsxXTsKKyAgICAgICAgICAgIERDQUNbMV0gPSBxY29lZmZbMl07CisgICAgICAgICAgICBEQ0FDWzJdID0gcWNvZWZmWzNdOworICAgICAgICAgICAgRENBQ1szXSA9IHFjb2VmZls0XTsKKyAgICAgICAgICAgIERDQUNbNF0gPSBxY29lZmZbNV07CisgICAgICAgICAgICBEQ0FDWzVdID0gcWNvZWZmWzZdOworICAgICAgICAgICAgRENBQ1s2XSA9IHFjb2VmZls3XTsKKworICAgICAgICAgICAgRENBQyA9IERDQUNfY29sWzBdW2JfeXRhYl07CisgICAgICAgICAgICBEQ0FDWzBdID0gcWNvZWZmWzhdOworICAgICAgICAgICAgRENBQ1sxXSA9IHFjb2VmZlsxNl07CisgICAgICAgICAgICBEQ0FDWzJdID0gcWNvZWZmWzI0XTsKKyAgICAgICAgICAgIERDQUNbM10gPSBxY29lZmZbMzJdOworICAgICAgICAgICAgRENBQ1s0XSA9IHFjb2VmZls0MF07CisgICAgICAgICAgICBEQ0FDWzVdID0gcWNvZWZmWzQ4XTsKKyAgICAgICAgICAgIERDQUNbNl0gPSBxY29lZmZbNTZdOworCisKKyAgICAgICAgfSAvKiBiQUNQcmVkRW5hYmxlICovCisKKyAgICB9IC8qIEVORCBDT01QIEZPUiBMT09QICovCisKKyAgICAvL2lmIChkaWZmID4gMjA0NykKKyAgICAvLyAgICBicmVhazsKKyAgICBTICs9IChTMSAtIFMyKTsKKworCisgICAgaWYgKFMgPj0gMCAmJiBiQUNQcmVkRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICBBQ3ByZWRfZmxhZ1ttYm51bV0gPSAxOworICAgICAgICBEQ0FDID0gcGNvZWZmOyAvKiBwcmVkaWN0aW9uIHJlc2lkdWUgKi8KKyAgICAgICAgcWNvZWZmID0gTUItPmJsb2NrWzBdOworCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaXJlY3Rpb25bY29tcF0gPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxY29lZmZbOF0gPSBEQ0FDWzBdOworICAgICAgICAgICAgICAgIHFjb2VmZlsxNl0gPSBEQ0FDWzFdOworICAgICAgICAgICAgICAgIHFjb2VmZlsyNF0gPSBEQ0FDWzJdOworICAgICAgICAgICAgICAgIHFjb2VmZlszMl0gPSBEQ0FDWzNdOworICAgICAgICAgICAgICAgIHFjb2VmZls0MF0gPSBEQ0FDWzRdOworICAgICAgICAgICAgICAgIHFjb2VmZls0OF0gPSBEQ0FDWzVdOworICAgICAgICAgICAgICAgIHFjb2VmZls1Nl0gPSBEQ0FDWzZdOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcWNvZWZmWzFdID0gRENBQ1swXTsKKyAgICAgICAgICAgICAgICBxY29lZmZbMl0gPSBEQ0FDWzFdOworICAgICAgICAgICAgICAgIHFjb2VmZlszXSA9IERDQUNbMl07CisgICAgICAgICAgICAgICAgcWNvZWZmWzRdID0gRENBQ1szXTsKKyAgICAgICAgICAgICAgICBxY29lZmZbNV0gPSBEQ0FDWzRdOworICAgICAgICAgICAgICAgIHFjb2VmZls2XSA9IERDQUNbNV07CisgICAgICAgICAgICAgICAgcWNvZWZmWzddID0gRENBQ1s2XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdDQlBbY29tcF0pIC8qIDUvMjgvMDEsIHVwZGF0ZSBDQlAgKi8KKyAgICAgICAgICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dIHw9IG1hc2sxW2NvbXBdOworICAgICAgICAgICAgRENBQyArPSA3OworICAgICAgICAgICAgcWNvZWZmICs9IDY0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8qIE9ubHkgREMgUHJlZGljdGlvbiAqLworICAgIHsKKyAgICAgICAgQUNwcmVkX2ZsYWdbbWJudW1dID0gMDsKKyAgICB9CisKKyAgICAqaW50cmFEQ19kZWNpc2lvbiA9IEludHJhRENTd2l0Y2hfRGVjaXNpb24oTW9kZSwgdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHIsIGludHJhRENWbGNRUCk7CisgICAgaWYgKCppbnRyYURDX2RlY2lzaW9uKSAvKiBjb2RlIERDIHdpdGggQUMgLCA1LzI4LzAxKi8KKyAgICB7CisgICAgICAgIHFjb2VmZiA9IE1CLT5ibG9ja1swXTsKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCpxY29lZmYpCisgICAgICAgICAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSB8PSBtYXNrMVtjb21wXTsKKyAgICAgICAgICAgIHFjb2VmZiArPSA2NDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogSDI2M19PTkxZICovCisKKworCitWb2lkIGZpbmRfcG12cyhWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgYmxvY2ssIEludCAqbXZ4LCBJbnQgKm12eSkKK3sKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworLy8gIFVDaGFyICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsgLyogbW9kZXMgZm9yIE1CcyAqLworICAgIFVDaGFyICpzbGljZV9uYiA9IHZpZGVvLT5zbGljZU5vOworICAgIEludCBuTUJQZXJSb3cgPSBjdXJyVm9sLT5uTUJQZXJSb3c7CisgICAgSW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworCisgICAgSW50ICAgcDF4LCBwMngsIHAzeDsKKyAgICBJbnQgICBwMXksIHAyeSwgcDN5OworICAgIEludCAgIHhpbjEsIHhpbjIsIHhpbjM7CisgICAgSW50ICAgeWluMSwgeWluMiwgeWluMzsKKyAgICBJbnQgICB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIEludCAgIHJ1bGUxLCBydWxlMiwgcnVsZTM7CisgICAgTU9UICAgKiptb3RkYXRhID0gdmlkZW8tPm1vdDsKKyAgICBJbnQgICB4ID0gbWJudW0gJSBuTUJQZXJSb3c7CisgICAgSW50ICAgeSA9IG1ibnVtIC8gbk1CUGVyUm93OworCisgICAgLyoKKyAgICAgICAgSW4gYSBwcmV2aW91cyB2ZXJzaW9uLCBhIE1CIHZlY3RvciAoYmxvY2sgPSAwKSB3YXMgcHJlZGljdGVkIHRoZSBzYW1lIHdheQorICAgICAgICBhcyBibG9jayAxLCB3aGljaCBpcyB0aGUgbW9zdCBsaWtlbHkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFZNLgorCisgICAgICAgIFRoZXJlZm9yZSwgaWYgd2UgaGF2ZSBhZHZhbmNlZCBwcmVkLiBtb2RlLCBhbmQgaWYgYWxsIE1CcyBhcm91bmQgaGF2ZQorICAgICAgICBvbmx5IG9uZSAxNngxNiB2ZWN0b3IgZWFjaCwgd2UgY2hvc2UgdGhlIGFwcHJvcGlhdGUgYmxvY2sgYXMgaWYgdGhlc2UKKyAgICAgICAgTUJzIGhhdmUgNCB2ZWN0b3JzLgorCisgICAgICAgIFRoaXMgZGlmZmVyZW50IHByZWRpY3Rpb24gYWZmZWN0cyBvbmx5IDE2eDE2IHZlY3RvcnMgb2YgTUJzIHdpdGgKKyAgICAgICAgdHJhbnNwYXJlbnQgYmxvY2tzLgorCisgICAgICAgIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHdlIGNob29zZSBmb3IgdGhlIDE2eDE2IG1vZGUgdGhlIGZpcnN0CisgICAgICAgIG5vbi10cmFuc3BhcmVudCBibG9jayBpbiB0aGUgc3Vycm91bmRpbmcgTUJzCisgICAgKi8KKworICAgIHN3aXRjaCAoYmxvY2spCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB2ZWMxID0gMiA7CisgICAgICAgICAgICB5aW4xID0geSAgOworICAgICAgICAgICAgeGluMSA9IHggLSAxOworICAgICAgICAgICAgdmVjMiA9IDMgOworICAgICAgICAgICAgeWluMiA9IHkgLSAxOworICAgICAgICAgICAgeGluMiA9IHg7CisgICAgICAgICAgICB2ZWMzID0gMyA7CisgICAgICAgICAgICB5aW4zID0geSAtIDE7CisgICAgICAgICAgICB4aW4zID0geCArIDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB2ZWMxID0gMiA7CisgICAgICAgICAgICB5aW4xID0geSAgOworICAgICAgICAgICAgeGluMSA9IHggLSAxOworICAgICAgICAgICAgdmVjMiA9IDMgOworICAgICAgICAgICAgeWluMiA9IHkgLSAxOworICAgICAgICAgICAgeGluMiA9IHg7CisgICAgICAgICAgICB2ZWMzID0gMyA7CisgICAgICAgICAgICB5aW4zID0geSAtIDE7CisgICAgICAgICAgICB4aW4zID0geCArIDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2ZWMxID0gMSA7CisgICAgICAgICAgICB5aW4xID0geSAgOworICAgICAgICAgICAgeGluMSA9IHg7CisgICAgICAgICAgICB2ZWMyID0gNCA7CisgICAgICAgICAgICB5aW4yID0geSAtIDE7CisgICAgICAgICAgICB4aW4yID0geDsKKyAgICAgICAgICAgIHZlYzMgPSAzIDsKKyAgICAgICAgICAgIHlpbjMgPSB5IC0gMTsKKyAgICAgICAgICAgIHhpbjMgPSB4ICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHZlYzEgPSA0IDsKKyAgICAgICAgICAgIHlpbjEgPSB5ICA7CisgICAgICAgICAgICB4aW4xID0geCAtIDE7CisgICAgICAgICAgICB2ZWMyID0gMSA7CisgICAgICAgICAgICB5aW4yID0geSAgOworICAgICAgICAgICAgeGluMiA9IHg7CisgICAgICAgICAgICB2ZWMzID0gMiA7CisgICAgICAgICAgICB5aW4zID0geSAgOworICAgICAgICAgICAgeGluMyA9IHg7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OiAvKiBjYXNlIDQgKi8KKyAgICAgICAgICAgIHZlYzEgPSAzIDsKKyAgICAgICAgICAgIHlpbjEgPSB5ICA7CisgICAgICAgICAgICB4aW4xID0geDsKKyAgICAgICAgICAgIHZlYzIgPSAxIDsKKyAgICAgICAgICAgIHlpbjIgPSB5ICA7CisgICAgICAgICAgICB4aW4yID0geDsKKyAgICAgICAgICAgIHZlYzMgPSAyIDsKKyAgICAgICAgICAgIHlpbjMgPSB5ICA7CisgICAgICAgICAgICB4aW4zID0geDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChibG9jayA9PSAwKQorICAgIHsKKyAgICAgICAgLyogYWNjb3JkaW5nIHRvIHRoZSBtb3Rpb24gZW5jb2RpbmcsIHdlIG11c3QgY2hvb3NlIGEgZmlyc3Qgbm9uLXRyYW5zcGFyZW50CisgICAgICAgIGJsb2NrIGluIHRoZSBzdXJyb3VuZGluZyBNQnMgKDE2LW1vZGUpCisgICAgICAgICAgICAqLworCisgICAgICAgIGlmICh4ID4gMCAmJiBzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0tMV0pCisgICAgICAgICAgICBydWxlMSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJ1bGUxID0gMTsKKworICAgICAgICBpZiAoeSA+IDAgJiYgc2xpY2VfbmJbbWJudW1dID09IHNsaWNlX25iW21ibnVtLW5NQlBlclJvd10pCisgICAgICAgICAgICBydWxlMiA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJ1bGUyID0gMTsKKworICAgICAgICBpZiAoKHggIT0gbk1CUGVyUm93IC0gMSkgJiYgKHkgPiAwKSAmJiBzbGljZV9uYlttYm51bV0gPT0gc2xpY2VfbmJbbWJudW0rMS1uTUJQZXJSb3ddKQorICAgICAgICAgICAgcnVsZTMgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBydWxlMyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGNoZWNrIGJvcmRlcnMgZm9yIHNpbmdsZSBibG9ja3MgKGFkdmFuY2VkIG1vZGUpICovCisgICAgICAgIC8qIHJ1bGUgMSAqLworICAgICAgICBpZiAoKChibG9jayA9PSAxIHx8IGJsb2NrID09IDMpICYmCisgICAgICAgICAgICAgICAgKHggPT0gMCB8fCBzbGljZV9uYlttYm51bV0gIT0gc2xpY2VfbmJbbWJudW0tMV0pKSkKKyAgICAgICAgICAgIHJ1bGUxID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnVsZTEgPSAwOworCisgICAgICAgIC8qIHJ1bGUgMiAqLworICAgICAgICBpZiAoKChibG9jayA9PSAxIHx8IGJsb2NrID09IDIpICYmCisgICAgICAgICAgICAgICAgKHkgPT0gMCB8fCBzbGljZV9uYlttYm51bV0gIT0gc2xpY2VfbmJbbWJudW0tbk1CUGVyUm93XSkpKQorICAgICAgICAgICAgcnVsZTIgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBydWxlMiA9IDA7CisKKyAgICAgICAgLyogcnVsZSAzICovCisgICAgICAgIGlmICgoKGJsb2NrID09IDEgfHwgYmxvY2sgPT0gMikgJiYKKyAgICAgICAgICAgICAgICAoeCA9PSBuTUJQZXJSb3cgLSAxIHx8IHkgPT0gMCB8fCBzbGljZV9uYlttYm51bV0gIT0gc2xpY2VfbmJbbWJudW0rMS1uTUJQZXJSb3ddKSkpCisgICAgICAgICAgICBydWxlMyA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJ1bGUzID0gMDsKKyAgICB9CisKKyAgICBpZiAocnVsZTEpCisgICAgeworICAgICAgICBwMXggPSBwMXkgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIHAxeCA9IG1vdGRhdGFbeWluMSpuTUJQZXJSb3creGluMV1bdmVjMV0ueDsKKyAgICAgICAgcDF5ID0gbW90ZGF0YVt5aW4xKm5NQlBlclJvdyt4aW4xXVt2ZWMxXS55OworICAgICAgICAvL3AxeCA9IG1vdHhkYXRhW3hpbjEqMisodmVjMSYweDEpICsgKHlpbjEqMisodmVjMT4+MSkpKnhCXTsKKyAgICAgICAgLy9wMXkgPSBtb3R5ZGF0YVt4aW4xKjIrKHZlYzEmMHgxKSArICh5aW4xKjIrKHZlYzE+PjEpKSp4Ql07CisgICAgfQorCisgICAgaWYgKHJ1bGUyKQorICAgIHsKKyAgICAgICAgcDJ4ID0gcDJ5ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcDJ4ID0gbW90ZGF0YVt5aW4yKm5NQlBlclJvdyt4aW4yXVt2ZWMyXS54OworICAgICAgICBwMnkgPSBtb3RkYXRhW3lpbjIqbk1CUGVyUm93K3hpbjJdW3ZlYzJdLnk7CisgICAgICAgIC8vcDJ4ID0gbW90eGRhdGFbeGluMioyKyh2ZWMyJjB4MSkgKyAoeWluMioyKyh2ZWMyPj4xKSkqeEJdOworICAgICAgICAvL3AyeSA9IG1vdHlkYXRhW3hpbjIqMisodmVjMiYweDEpICsgKHlpbjIqMisodmVjMj4+MSkpKnhCXTsKKyAgICB9CisKKyAgICBpZiAocnVsZTMpCisgICAgeworICAgICAgICBwM3ggPSBwM3kgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwM3ggPSBtb3RkYXRhW3lpbjMqbk1CUGVyUm93K3hpbjNdW3ZlYzNdLng7CisgICAgICAgIHAzeSA9IG1vdGRhdGFbeWluMypuTUJQZXJSb3creGluM11bdmVjM10ueTsKKyAgICAgICAgLy9wM3ggPSBtb3R4ZGF0YVt4aW4zKjIrICh2ZWMzJjB4MSkgKyAoeWluMyoyKyh2ZWMzPj4xKSkqeEJdOworICAgICAgICAvL3AzeSA9IG1vdHlkYXRhW3hpbjMqMisgKHZlYzMmMHgxKSArICh5aW4zKjIrKHZlYzM+PjEpKSp4Ql07CisgICAgfQorCisgICAgaWYgKHJ1bGUxICYmIHJ1bGUyICYmIHJ1bGUzKQorICAgIHsKKyAgICAgICAgLyogYWxsIE1CcyBhcmUgb3V0c2lkZSB0aGUgVk9QICovCisgICAgICAgICptdnggPSAqbXZ5ID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAocnVsZTEgKyBydWxlMiArIHJ1bGUzID09IDIpCisgICAgeworICAgICAgICAvKiB0d28gb2YgdGhyZWUgYXJlIHplcm8gKi8KKyAgICAgICAgKm12eCA9IChwMXggKyBwMnggKyBwM3gpOworICAgICAgICAqbXZ5ID0gKHAxeSArIHAyeSArIHAzeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICptdnggPSAoKHAxeCArIHAyeCArIHAzeCAtIFBWX01BWChwMXgsIFBWX01BWChwMngsIHAzeCkpIC0gUFZfTUlOKHAxeCwgUFZfTUlOKHAyeCwgcDN4KSkpKTsKKyAgICAgICAgKm12eSA9ICgocDF5ICsgcDJ5ICsgcDN5IC0gUFZfTUFYKHAxeSwgUFZfTUFYKHAyeSwgcDN5KSkgLSBQVl9NSU4ocDF5LCBQVl9NSU4ocDJ5LCBwM3kpKSkpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworCitWb2lkIFdyaXRlTVZjb21wb25lbnQoSW50IGZfY29kZSwgSW50IGRtdiwgQml0c3RyZWFtRW5jVmlkZW8gKmJzKQoreworICAgIEludCByZXNpZHVhbCwgdmxjX2NvZGVfbWFnLCBiaXRzLCBlbnRyeTsKKworICAgIFNjYWxlTVZEKGZfY29kZSwgZG12LCAmcmVzaWR1YWwsICZ2bGNfY29kZV9tYWcpOworCisgICAgaWYgKHZsY19jb2RlX21hZyA8IDApCisgICAgICAgIGVudHJ5ID0gdmxjX2NvZGVfbWFnICsgNjU7CisgICAgZWxzZQorICAgICAgICBlbnRyeSA9IHZsY19jb2RlX21hZzsKKworICAgIGJpdHMgPSBQdXRNVihlbnRyeSwgYnMpOworCisgICAgaWYgKChmX2NvZGUgIT0gMSkgJiYgKHZsY19jb2RlX21hZyAhPSAwKSkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIGZfY29kZSAtIDEsIHJlc2lkdWFsKTsKKyAgICAgICAgYml0cyArPSBmX2NvZGUgLSAxOworICAgIH0KKyAgICByZXR1cm47Cit9CisKKworVm9pZAorU2NhbGVNVkQoCisgICAgSW50ICBmX2NvZGUsICAgICAgIC8qIDwtLSBNViByYW5nZSBpbiAxLzIgdW5pdHM6IDE9MzIsMj02NCwuLi4sNz0yMDQ4ICAgICAqLworICAgIEludCAgZGlmZl92ZWN0b3IsICAvKiA8LS0gTVYgRGlmZmVyZW5jZSBjb21tcG9uZW50IGluIDEvMiB1bml0cyAgICAgICAgICAgKi8KKyAgICBJbnQgICpyZXNpZHVhbCwgICAgLyogLS0+IHZhbHVlIHRvIGJlIEZMQyBjb2RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgSW50ICAqdmxjX2NvZGVfbWFnIC8qIC0tPiB2YWx1ZSB0byBiZSBWTEMgY29kZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworKQoreworICAgIEludCAgIHJhbmdlOworICAgIEludCAgIHNjYWxlX2ZhY3RvcjsKKyAgICBJbnQgICByX3NpemU7CisgICAgSW50ICAgbG93OworICAgIEludCAgIGhpZ2g7CisgICAgSW50ICAgYXV4OworCisgICAgcl9zaXplID0gZl9jb2RlIC0gMTsKKyAgICBzY2FsZV9mYWN0b3IgPSAxIDw8IHJfc2l6ZTsKKyAgICByYW5nZSA9IDMyICogc2NhbGVfZmFjdG9yOworICAgIGxvdyAgID0gLXJhbmdlOworICAgIGhpZ2ggID0gIHJhbmdlIC0gMTsKKworICAgIGlmIChkaWZmX3ZlY3RvciA8IGxvdykKKyAgICAgICAgZGlmZl92ZWN0b3IgKz0gMiAqIHJhbmdlOworICAgIGVsc2UgaWYgKGRpZmZfdmVjdG9yID4gaGlnaCkKKyAgICAgICAgZGlmZl92ZWN0b3IgLT0gMiAqIHJhbmdlOworCisgICAgaWYgKGRpZmZfdmVjdG9yID09IDApCisgICAgeworICAgICAgICAqdmxjX2NvZGVfbWFnID0gMDsKKyAgICAgICAgKnJlc2lkdWFsID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoc2NhbGVfZmFjdG9yID09IDEpCisgICAgeworICAgICAgICAqdmxjX2NvZGVfbWFnID0gZGlmZl92ZWN0b3I7CisgICAgICAgICpyZXNpZHVhbCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGF1eCA9IFBWX0FCUyhkaWZmX3ZlY3RvcikgKyBzY2FsZV9mYWN0b3IgLSAxOworICAgICAgICAqdmxjX2NvZGVfbWFnID0gYXV4ID4+IHJfc2l6ZTsKKworICAgICAgICBpZiAoZGlmZl92ZWN0b3IgPCAwKQorICAgICAgICAgICAgKnZsY19jb2RlX21hZyA9IC0qdmxjX2NvZGVfbWFnOworICAgICAgICAqcmVzaWR1YWwgPSBhdXggJiAoc2NhbGVfZmFjdG9yIC0gMSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjFiNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmgKQEAgLTAsMCArMSw0MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX1ZMQ19FTkNPREVfSF8KKyNkZWZpbmUgX1ZMQ19FTkNPREVfSF8KKworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworSW50IFB1dENvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dENvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dENCUFkoSW50IGNicHksIENoYXIgaW50cmEsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dE1DQlBDX0ludGVyKEludCBjYnBjLCBJbnQgbW9kZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0TUNCUENfSW50cmEoSW50IGNicGMsIEludCBtb2RlLCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXRNVihJbnQgbXZpbnQsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dERDc2l6ZV9jaHJvbShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0RENzaXplX2x1bShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0RENzaXplX2x1bShJbnQgc2l6ZSwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0Q29lZmZfSW50ZXJfUlZMQyhJbnQgcnVuLCBJbnQgbGV2ZWwsIEludCBsYXN0LCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKK0ludCBQdXRDb2VmZl9JbnRyYV9SVkxDKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dFJ1bkNvZWZmX0ludGVyKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dFJ1bkNvZWZmX0ludHJhKEludCBydW4sIEludCBsZXZlbCwgSW50IGxhc3QsIEJpdHN0cmVhbUVuY1ZpZGVvICpiaXRzdHJlYW0pOworSW50IFB1dExldmVsQ29lZmZfSW50ZXIoSW50IHJ1biwgSW50IGxldmVsLCBJbnQgbGFzdCwgQml0c3RyZWFtRW5jVmlkZW8gKmJpdHN0cmVhbSk7CitJbnQgUHV0TGV2ZWxDb2VmZl9JbnRyYShJbnQgcnVuLCBJbnQgbGV2ZWwsIEludCBsYXN0LCBCaXRzdHJlYW1FbmNWaWRlbyAqYml0c3RyZWFtKTsKKworVm9pZCBNQl9Db2RlQ29lZmYoVmlkZW9FbmNEYXRhICp2aWRlbywgQml0c3RyZWFtRW5jVmlkZW8gKmJzKTsKK1ZvaWQgQmxvY2tDb2RlQ29lZmYoUnVuTGV2ZWxCbG9jayAqUkxCLCBCaXRzdHJlYW1FbmNWaWRlbyAqYnMsIEludCBqX3N0YXJ0LCBVQ2hhciBNb2RlLCBJbnQgcnZsYywgSW50IHNob3J0VmlkZW9IZWFkZXIpOworI2VuZGlmIC8qIF9WTENfRU5DT0RFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlX2lubGluZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZV9pbmxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmY0OTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZV9pbmxpbmUuaApAQCAtMCwwICsxLDMxNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX1ZMQ19FTkNPREVfSU5MSU5FX0hfCisjZGVmaW5lIF9WTENfRU5DT0RFX0lOTElORV9IXworCisjaWYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNSkgJiYgIWRlZmluZWQoUFZfQVJNX0dDQ19WNCkKKworX19pbmxpbmUgIEludCB6ZXJvX3J1bl9zZWFyY2goVUludCAqYml0bWFwenosIFNob3J0ICpkYXRhQmxvY2ssIFJ1bkxldmVsQmxvY2sgKlJMQiwgSW50IG5jKQoreworICAgIEludCBpZHgsIHJ1biwgbGV2ZWwsIGo7CisgICAgVUludCBlbmQsIG1hdGNoOworCisgICAgaWR4ID0gMDsKKyAgICBqICAgPSAwOworICAgIHJ1biA9IDA7CisgICAgbWF0Y2ggPSAxIDw8IDMxOworICAgIGlmIChuYyA+IDMyKQorICAgICAgICBlbmQgPSAxOworICAgIGVsc2UKKyAgICAgICAgZW5kID0gMSA8PCAoMzIgLSBuYyk7CisKKyAgICB3aGlsZSAobWF0Y2ggPj0gZW5kKQorICAgIHsKKyAgICAgICAgaWYgKChtYXRjaCZiaXRtYXB6elswXSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcnVuKys7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBtYXRjaCA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoID4+PSAxOworICAgICAgICAgICAgbGV2ZWwgPSBkYXRhQmxvY2tbal07CisgICAgICAgICAgICBkYXRhQmxvY2tbal0gPSAwOyAvKiByZXNldCBvdXRwdXQgKi8KKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gLWxldmVsOworICAgICAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgUkxCLT5zW2lkeF0gPSAwOworICAgICAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBuYyAtPSAzMjsKKyAgICBpZiAobmMgPiAwKQorICAgIHsKKyAgICAgICAgbWF0Y2ggPSAxIDw8IDMxOworICAgICAgICBlbmQgPSAxIDw8ICgzMiAtIG5jKTsKKyAgICAgICAgd2hpbGUgKG1hdGNoID49IGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChtYXRjaCZiaXRtYXB6elsxXSkgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydW4rKzsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgbWF0Y2ggPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF0Y2ggPj49IDE7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBkYXRhQmxvY2tbal07CisgICAgICAgICAgICAgICAgZGF0YUJsb2NrW2pdID0gMDsgLyogcmVzZXQgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSAtbGV2ZWw7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgUkxCLT5ydW5baWR4XSA9IHJ1bjsKKyAgICAgICAgICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IGxldmVsOworICAgICAgICAgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlkeCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpZHg7Cit9CisKKyNlbGlmIGRlZmluZWQoX19DQ19BUk0pICAvKiBvbmx5IHdvcmsgd2l0aCBhcm0gdjUgKi8KKworX19pbmxpbmUgIEludCB6ZXJvX3J1bl9zZWFyY2goVUludCAqYml0bWFwenosIFNob3J0ICpkYXRhQmxvY2ssIFJ1bkxldmVsQmxvY2sgKlJMQiwgSW50IG5jKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhuYyk7CisgICAgSW50IGlkeCwgcnVuLCBsZXZlbCwgajsKKyAgICBVSW50IGVuZCwgbWF0Y2g7CisgICAgSW50ICB6em9yZGVyOworCisgICAgaWR4ID0gMDsKKyAgICBydW4gPSAwOworICAgIGogICA9IC0xOworICAgIF9fYXNtCisgICAgeworICAgICAgICBsZHIgbWF0Y2gsIFtiaXRtYXB6el0KKyAgICAgICAgY2x6IHJ1biwgbWF0Y2gKKyAgICB9CisKKyAgICB6em9yZGVyID0gMDsKKworICAgIHdoaWxlIChydW4gPCAzMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIG1vdiBlbmQsICMweDgwMDAwMDAwCisgICAgICAgICAgICBtb3YgZW5kLCBlbmQsIGxzciBydW4gICAvKiBtYXNrKi8KKyAgICAgICAgICAgIGJpYyBtYXRjaCwgbWF0Y2gsIGVuZCAgICAgICAvKiByZW1vdmUgaXQgZnJvbSBiaXRtYXAgKi8KKyAgICAgICAgICAgIG1vdiBydW4sIHJ1biwgbHNsICMxICAvKiAwNS8wOS8wMiAqLworICAgICAgICAgICAgbGRyc2ggbGV2ZWwsIFtkYXRhQmxvY2ssIHJ1bl0gLyogIGxvYWQgZGF0YSAqLworICAgICAgICAgICAgc3RyaCB6em9yZGVyLCBbZGF0YUJsb2NrLCBydW5dIC8qIHJlc2V0IG91dHB1dCAqLworICAgICAgICAgICAgYWRkIGosIGosICMxCisgICAgICAgICAgICByc2IgcnVuLCBqLCBydW4sIGxzciAjMSAvKiBkZWx0YSBydW4gKi8KKyAgICAgICAgICAgIGFkZCBqLCBqLCBydW4gICAgICAgICAgIC8qIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSAtbGV2ZWw7CisgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDE7CisgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gbGV2ZWw7CisgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDA7CisgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIGNseiBydW4sIG1hdGNoCisgICAgICAgIH0KKyAgICB9CisgICAgX19hc20KKyAgICB7CisgICAgICAgIGxkciBtYXRjaCwgW2JpdG1hcHp6LCAjNF0KKyAgICAgICAgY2x6IHJ1biwgbWF0Y2gKKyAgICB9CisKKyAgICB3aGlsZSAocnVuIDwgMzIpCisgICAgeworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBtb3YgZW5kLCAjMHg4MDAwMDAwMAorICAgICAgICAgICAgbW92IGVuZCwgZW5kLCBsc3IgcnVuICAgLyogbWFzayovCisgICAgICAgICAgICBiaWMgbWF0Y2gsIG1hdGNoLCBlbmQgICAgICAgLyogcmVtb3ZlIGl0IGZyb20gYml0bWFwICovCisgICAgICAgICAgICBhZGQgcnVuLCBydW4sICMzMiAgICAgICAvKiBjdXJyZW50IHBvc2l0aW9uICovCisgICAgICAgICAgICBtb3YgcnVuLCBydW4sIGxzbCAjMSAgICAvKiAwOS8wMi8wNSAqLworICAgICAgICAgICAgbGRyc2ggbGV2ZWwsIFtkYXRhQmxvY2ssIHJ1bl0gLyogIGxvYWQgZGF0YSAqLworICAgICAgICAgICAgc3RyaCAgenpvcmRlciwgW2RhdGFCbG9jaywgcnVuXSAvKiByZXNldCBvdXRwdXQgKi8KKyAgICAgICAgICAgIGFkZCBqLCBqLCAjMQorICAgICAgICAgICAgcnNiIHJ1biwgaiwgcnVuLCBsc3IgIzEgICAgIC8qIGRlbHRhIHJ1biAqLworICAgICAgICAgICAgYWRkIGosIGosIHJ1biAgICAgICAgICAgLyogY3VycmVudCBwb3NpdGlvbiAqLworICAgICAgICB9CisgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IC1sZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSBsZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMDsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgY2x6IHJ1biwgbWF0Y2gKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpZHg7Cit9CisKKyNlbGlmICggZGVmaW5lZChQVl9BUk1fR0NDX1Y0KSB8fCBkZWZpbmVkKFBWX0FSTV9HQ0NfVjUpICkgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworX19pbmxpbmUgSW50IG00dl9lbmNfY2x6KFVJbnQgdGVtcCkKK3sKKyAgICByZWdpc3RlciBJbnQgcmI7CisgICAgcmVnaXN0ZXIgVUludCByYSA9IChVSW50KXRlbXA7CisKKyAgICBhc20gdm9sYXRpbGUoImNseiAgICUwLCAlMSIKKyAgICAgICAgICAgICA6ICI9JnIiKHJiKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHJhKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIHJldHVybiAocmIpOworfQorCitfX2lubGluZSAgSW50IHplcm9fcnVuX3NlYXJjaChVSW50ICpiaXRtYXB6eiwgU2hvcnQgKmRhdGFCbG9jaywgUnVuTGV2ZWxCbG9jayAqUkxCLCBJbnQgbmMpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKG5jKTsKKyAgICBJbnQgaWR4LCBydW4sIGxldmVsID0gMCwgajsKKyAgICBVSW50IGVuZCA9IDAsIG1hdGNoOworICAgIEludCAgenpvcmRlcjsKKworICAgIGlkeCA9IDA7CisgICAgcnVuID0gMDsKKyAgICBqICAgPSAtMTsKKyAgICBtYXRjaCA9ICpiaXRtYXB6ejsKKyAgICBydW4gPSBtNHZfZW5jX2NseihtYXRjaCk7CisKKyAgICB6em9yZGVyID0gMDsKKworICAgIHdoaWxlIChydW4gPCAzMikKKyAgICB7CisgICAgICAgIGFzbSB2b2xhdGlsZSgibW92ICAgJTAsICMweDgwMDAwMDAwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJtb3YgICAlMCwgJTAsIGxzciAlMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYmljICAgJTIsICUyLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAibW92ICAgJTEsICUxLCBsc2wgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgImxkcnNoICUzLCBbJTYsICUxXVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAic3RyaCAgJTUsIFslNiwgJTFdXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICAlNCwgJTQsICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJyc2IgICAlMSwgJTQsICUxLCBsc3IgIzFcblx0IgorICAgICAgICAgICAgICAgICAgICAgImFkZCAgICU0LCAlNCwgJTEiCisgICAgICAgICAgICAgOiAiK3IiKGVuZCksICIrciIocnVuKSwgIityIihtYXRjaCksICI9ciIobGV2ZWwpLCAiK3IiKGopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogInIiKHp6b3JkZXIpLCAiciIoZGF0YUJsb2NrKSk7CisgICAgICAgIGlmIChsZXZlbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMQi0+bGV2ZWxbaWR4XSA9IC1sZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMTsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSBsZXZlbDsKKyAgICAgICAgICAgIFJMQi0+c1tpZHhdID0gMDsKKyAgICAgICAgICAgIFJMQi0+cnVuW2lkeF0gPSBydW47CisgICAgICAgICAgICBydW4gPSAwOworICAgICAgICAgICAgaWR4Kys7CisgICAgICAgIH0KKyAgICAgICAgcnVuID0gbTR2X2VuY19jbHoobWF0Y2gpOworICAgIH0KKyAgICBtYXRjaCA9IGJpdG1hcHp6WzFdOworICAgIHJ1biA9IG00dl9lbmNfY2x6KG1hdGNoKTsKKworICAgIHdoaWxlIChydW4gPCAzMikKKyAgICB7CisgICAgICAgIGFzbSB2b2xhdGlsZSgibW92ICAgJTAsICMweDgwMDAwMDAwXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJtb3YgICAlMCwgJTAsIGxzciAlMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYmljICAgJTIsICUyLCAlMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkICAgJTEsICUxLCAjMzJcblx0IgorICAgICAgICAgICAgICAgICAgICAgIm1vdiAgICUxLCAlMSwgbHNsICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJsZHJzaCAlMywgWyU2LCAlMV1cblx0IgorICAgICAgICAgICAgICAgICAgICAgInN0cmggICU1LCBbJTYsICUxXVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAiYWRkICAgJTQsICU0LCAjMVxuXHQiCisgICAgICAgICAgICAgICAgICAgICAicnNiICAgJTEsICU0LCAlMSwgbHNyICMxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICJhZGQgICAlNCwgJTQsICUxIgorICAgICAgICAgICAgIDogIityIihlbmQpLCAiK3IiKHJ1biksICIrciIobWF0Y2gpLCAiK3IiKGxldmVsKSwgIityIihqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJyIih6em9yZGVyKSwgInIiKGRhdGFCbG9jaykpOworICAgICAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBSTEItPmxldmVsW2lkeF0gPSAtbGV2ZWw7CisgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDE7CisgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUkxCLT5sZXZlbFtpZHhdID0gbGV2ZWw7CisgICAgICAgICAgICBSTEItPnNbaWR4XSA9IDA7CisgICAgICAgICAgICBSTEItPnJ1bltpZHhdID0gcnVuOworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisgICAgICAgIHJ1biA9IG00dl9lbmNfY2x6KG1hdGNoKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWR4OworfQorCisjZW5kaWYKKworI2VuZGlmIC8vIF9WTENfRU5DT0RFX0lOTElORV9IXworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDc2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCkBAIC0wLDAgKzEsNTgxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgIm1wNGRlZi5oIgorI2luY2x1ZGUgIm1wNGxpYl9pbnQuaCIKKyNpbmNsdWRlICJtcDRlbmNfbGliLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtX2lvLmgiCisjaW5jbHVkZSAibTR2ZW5jX29zY2wuaCIKKworUFZfU1RBVFVTIEVuY29kZVNob3J0SGVhZGVyKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIFZvcCAqY3VyclZvcCk7CitQVl9TVEFUVVMgRW5jb2RlVk9QSGVhZGVyKEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0sIFZvbCAqY3VyclZvbCwgVm9wICpjdXJyVm9wKTsKK1BWX1NUQVRVUyBFbmNvZGVHT1ZIZWFkZXIoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgVUludCBzZWNvbmRzKTsKKworUFZfU1RBVFVTIEVuY29kZVZvcF9CWFJDKFZpZGVvRW5jRGF0YSAqdmlkZW8pOworUFZfU1RBVFVTIEVuY29kZVZvcF9Ob01FKFZpZGVvRW5jRGF0YSAqdmlkZW8pOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERlY29kZVZvcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgVk9QIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEVuY29kZVZvcChWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworCisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICBJbnQgY3VyckxheWVyID0gdmlkZW8tPmN1cnJMYXllcjsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisvLyAgQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbT12aWRlby0+Yml0c3RyZWFtMTsKKyAgICBVQ2hhciAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7CisgICAgcmF0ZUNvbnRyb2wgKipyYyA9IHZpZGVvLT5yYzsKKy8vICBVSW50IHRpbWU9MDsKKworICAgIC8qKioqKioqKioqKioqKioqKioqLworICAgIC8qIEluaXRpYWxpemUgbW9kZSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqLworCisgICAgc3dpdGNoIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgSV9WT1A6CisgICAgICAgICAgICBNNFZFTkNfTUVNU0VUKE1vZGUsIE1PREVfSU5UUkEsIHNpemVvZihVQ2hhcikqY3VyclZvbC0+blRvdGFsTUIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUF9WT1A6CisgICAgICAgICAgICBNNFZFTkNfTUVNU0VUKE1vZGUsIE1PREVfSU5URVIsIHNpemVvZihVQ2hhcikqY3VyclZvbC0+blRvdGFsTUIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQl9WT1A6CisgICAgICAgICAgICAvKk00VkVOQ19NRU1TRVQoTW9kZSwgTU9ERV9JTlRFUl9CLHNpemVvZihVQ2hhcikqblRvdGFsTUIpOyovCisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogTW90aW9uIEVzdGltYXRpb24gKi8KKyAgICAvKiBjb21wdXRlIE1Wcywgc2NlbmUgY2hhbmdlIGRldGVjdGlvbiwgZWRnZSBwYWRkaW5nLCAqLworICAgIC8qIGludHJhIHJlZnJlc2gsIGNvbXB1dGUgYmxvY2sgYWN0aXZpdHkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqLworICAgIE1vdGlvbkVzdGltYXRpb24odmlkZW8pOyAgICAvKiBkbyBNRSBmb3IgdGhlIHdob2xlIGZyYW1lICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIHJhdGUgQ29udHJvbCAoYXNzaWduIFFQKSAqLworICAgIC8qIDQvMTEvMDEsIGNsZWFuLXVwLCBhbmQgcHV0IGludG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgc3RhdHVzID0gUkNfVm9wUVBTZXR0aW5nKHZpZGVvLCByYyk7CisgICAgaWYgKHN0YXR1cyA9PSBQVl9GQUlMKQorICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICBFbmNvZGUgVk9QICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+c2xpY2VfY29kaW5nKSAvKiBlbmQgaGVyZSAqLworICAgIHsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZSBmb3Igc2xpY2UtYmFzZWQgQVBJcyAqLworICAgICAgICB2aWRlby0+dG90YWxTQUQgPSAwOworICAgICAgICB2aWRlby0+bWJudW0gPSAwOworICAgICAgICB2aWRlby0+c2xpY2VOb1swXSA9IDA7CisgICAgICAgIHZpZGVvLT5udW1JbnRyYSA9IDA7CisgICAgICAgIHZpZGVvLT5vZmZzZXQgPSAwOworICAgICAgICB2aWRlby0+ZW5kX29mX2J1ZiA9IDA7CisgICAgICAgIHZpZGVvLT5ocF9ndWVzcyA9IC0xOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IEVuY29kZVZvcF9Ob01FKHZpZGVvKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogcmF0ZSBjb250cm9sICh1cGRhdGUgc3RhdCkgKi8KKyAgICAvKiA2LzIvMDEgc2VwYXJhdGUgZnVuY3Rpb24gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgUkNfVm9wVXBkYXRlU3RhdCh2aWRlbywgcmNbY3VyckxheWVyXSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZVZvcF9Ob01FKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjgvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSGlzdG9yeSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZVZvcCB3aXRob3V0IG1vdGlvbiBlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworUFZfU1RBVFVTIEVuY29kZVZvcF9Ob01FKFZpZGVvRW5jRGF0YSAqdmlkZW8pCit7CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTE7CisgICAgSW50IHRpbWUgPSAwOyAgIC8qIGZvbGxvd3MgRW5jb2RlVm9wIHZhbHVlICovCisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisKKyAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlcikgLyogU2hvcnQgVmlkZW8gSGVhZGVyID0gMSAqLworICAgIHsKKworICAgICAgICBzdGF0dXMgPSBFbmNvZGVTaG9ydEhlYWRlcihzdHJlYW0sIGN1cnJWb3ApOyAvKiBFbmNvZGUgU2hvcnQgSGVhZGVyICovCisKKyAgICAgICAgdmlkZW8tPmhlYWRlcl9iaXRzID0gQml0c3RyZWFtR2V0UG9zKHN0cmVhbSk7IC8qIEhlYWRlciBCaXRzICovCisKKyAgICAgICAgc3RhdHVzID0gRW5jb2RlRnJhbWVDb21iaW5lZE1vZGUodmlkZW8pOworCisgICAgfQorI2lmbmRlZiBIMjYzX09OTFkKKyAgICBlbHNlICAgIC8qIFNob3J0IFZpZGVvIEhlYWRlciA9IDAgKi8KKyAgICB7CisKKyAgICAgICAgaWYgKGN1cnJWb2wtPkdPVlN0YXJ0ICYmIGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlR09WSGVhZGVyKHN0cmVhbSwgdGltZSk7IC8qIEVuY29kZSBHT1YgSGVhZGVyICovCisKKyAgICAgICAgc3RhdHVzID0gRW5jb2RlVk9QSGVhZGVyKHN0cmVhbSwgY3VyclZvbCwgY3VyclZvcCk7ICAvKiBFbmNvZGUgVk9QIEhlYWRlciAqLworCisgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyA9IEJpdHN0cmVhbUdldFBvcyhzdHJlYW0pOyAvKiBIZWFkZXIgQml0cyAqLworCisgICAgICAgIGlmIChjdXJyVm9wLT52b3BDb2RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjdXJyVm9sLT5zY2FsYWJpbGl0eSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZUZyYW1lRGF0YVBhcnRNb2RlKHZpZGVvKTsgLyogRW5jb2RlIERhdGEgUGFydGl0aW9uaW5nIE1vZGUgVk9QICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZUZyYW1lQ29tYmluZWRNb2RlKHZpZGVvKTsgLyogRW5jb2RlIENvbWJpbmVkIE1vZGUgVk9QICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZUZyYW1lQ29tYmluZWRNb2RlKHZpZGVvKTsgLyogRW5jb2RlIENvbWJpbmVkIE1vZGUgVk9QICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgLyogVm9wIE5vdCBjb2RlZCAqLworICAgICAgICB7CisKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogSDI2M19PTkxZICovCisgICAgcmV0dXJuIHN0YXR1czsKKworfQorCisjaWZuZGVmIE5PX1NMSUNFX0VOQ09ERQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVTbGljZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzE5LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEhpc3RvcnkgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgb25lIHNsaWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBFbmNvZGVTbGljZShWaWRlb0VuY0RhdGEgKnZpZGVvKQoreworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTE7IC8qIGRpZmZlcmVudCBmcm9tIGZyYW1lLWJhc2VkICovCisgICAgSW50IHRpbWUgPSAwOyAgIC8qIGZvbGxvd3MgRW5jb2RlVm9wIHZhbHVlICovCisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgcmF0ZUNvbnRyb2wgKipyYyA9IHZpZGVvLT5yYzsKKworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyKSAvKiBTaG9ydCBWaWRlbyBIZWFkZXIgPSAxICovCisgICAgeworCisgICAgICAgIGlmICh2aWRlby0+bWJudW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU2hvcnRIZWFkZXIoc3RyZWFtLCBjdXJyVm9wKTsgLyogRW5jb2RlIFNob3J0IEhlYWRlciAqLworCisgICAgICAgICAgICB2aWRlby0+aGVhZGVyX2JpdHMgPSBCaXRzdHJlYW1HZXRQb3Moc3RyZWFtKTsgLyogSGVhZGVyIEJpdHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IEVuY29kZVNsaWNlQ29tYmluZWRNb2RlKHZpZGVvKTsKKworICAgIH0KKyNpZm5kZWYgSDI2M19PTkxZCisgICAgZWxzZSAgICAvKiBTaG9ydCBWaWRlbyBIZWFkZXIgPSAwICovCisgICAgeworCisgICAgICAgIGlmICh2aWRlby0+bWJudW0gPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPkdPVlN0YXJ0KQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZUdPVkhlYWRlcihzdHJlYW0sIHRpbWUpOyAvKiBFbmNvZGUgR09WIEhlYWRlciAqLworCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVWT1BIZWFkZXIoc3RyZWFtLCBjdXJyVm9sLCBjdXJyVm9wKTsgIC8qIEVuY29kZSBWT1AgSGVhZGVyICovCisKKyAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJfYml0cyA9IEJpdHN0cmVhbUdldFBvcyhzdHJlYW0pOyAvKiBIZWFkZXIgQml0cyAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKGN1cnJWb3AtPnZvcENvZGVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWN1cnJWb2wtPnNjYWxhYmlsaXR5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU2xpY2VEYXRhUGFydE1vZGUodmlkZW8pOyAvKiBFbmNvZGUgRGF0YSBQYXJ0aXRpb25pbmcgTW9kZSBWT1AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU2xpY2VDb21iaW5lZE1vZGUodmlkZW8pOyAvKiBFbmNvZGUgQ29tYmluZWQgTW9kZSBWT1AgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU2xpY2VDb21iaW5lZE1vZGUodmlkZW8pOyAvKiBFbmNvZGUgQ29tYmluZWQgTW9kZSBWT1AgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlICAvKiBWb3AgTm90IGNvZGVkICovCisgICAgICAgIHsKKworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBIMjYzX09OTFkgKi8KKyAgICBpZiAodmlkZW8tPm1ibnVtID49IGN1cnJWb2wtPm5Ub3RhbE1CICYmIHN0YXR1cyAhPSBQVl9FTkRfT0ZfQlVGKSAvKiBlbmQgb2YgVm9wICovCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiByYXRlIGNvbnRyb2wgKHVwZGF0ZSBzdGF0KSAqLworICAgICAgICAvKiA2LzIvMDEgc2VwYXJhdGUgZnVuY3Rpb24gKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBzdGF0dXMgPSBSQ19Wb3BVcGRhdGVTdGF0KHZpZGVvLCByY1tjdXJyTGF5ZXJdKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworCit9CisjZW5kaWYgLyogTk9fU0xJQ0VfRU5DT0RFICovCisKKyNpZm5kZWYgSDI2M19PTkxZCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZUdPVkhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgR09WIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEVuY29kZUdPVkhlYWRlcihCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtLCBVSW50IHNlY29uZHMpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKy8vICBpbnQgdGVtcDsKKyAgICBVSW50IHRtcHZhcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBHcm91cF9vZl9WaWRlb09iamVjdFBsYW5lKCkgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAzMiwgR1JPVVBfU1RBUlRfQ09ERSk7CisgICAgLyogdGltZV9jb2RlICovCisgICAgdG1wdmFyID0gc2Vjb25kcyAvIDM2MDA7CisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIHRtcHZhcik7IC8qIEhvdXJzKi8KKworICAgIHRtcHZhciA9IChzZWNvbmRzIC0gdG1wdmFyICogMzYwMCkgLyA2MDsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNiwgdG1wdmFyKTsgLyogTWludXRlcyovCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDEpOyAvKiBNYXJrZXIqLworCisgICAgdG1wdmFyID0gc2Vjb25kcyAlIDYwOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA2LCB0bXB2YXIpOyAvKiBTZWNvbmRzKi8KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMSk7IC8qIGNsb3NlZF9nb3YgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDApOyAvKiBicm9rZW5fbGluayAqLworICAgIC8qdGVtcCA9Ki8KKyAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7IC8qIEJ5dGUgYWxpZ24gR09WIEhlYWRlciAqLworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIEFMTE9XX1ZPUF9OT1RfQ09ERUQKKworUFZfU1RBVFVTIEVuY29kZVZvcE5vdENvZGVkKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVDaGFyICpic3RyZWFtLCBJbnQgKnNpemUsIFVMb25nIG1vZFRpbWUpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICBWb2wgKmN1cnJWb2wgPSB2aWRlby0+dm9sWzBdOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5zdHJlYW07CisgICAgVUludCBmcmFtZVRpY2s7CisgICAgSW50IHRpbWVJbmM7CisKKyAgICBzdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IGJzdHJlYW07CisgICAgc3RyZWFtLT5idWZmZXJTaXplID0gKnNpemU7CisgICAgQml0c3RyZWFtRW5jUmVzZXQoc3RyZWFtKTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgMzIsIFZPUF9TVEFSVF9DT0RFKTsgLypTdGFydCBDb2RlIGZvciBWT1AqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAyLCBQX1ZPUCk7LyogVk9QIENvZGluZyBUeXBlKi8KKworICAgIGZyYW1lVGljayA9IChJbnQpKCgoZG91YmxlKShtb2RUaW1lIC0gdmlkZW8tPm1vZFRpbWVSZWYpICogY3VyclZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24gKyA1MDApIC8gMTAwMCk7CisgICAgdGltZUluYyA9IGZyYW1lVGljayAtIHZpZGVvLT5yZWZUaWNrWzBdOworICAgIHdoaWxlICh0aW1lSW5jID49IGN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKQorICAgIHsKKyAgICAgICAgdGltZUluYyAtPSBjdXJyVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbjsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsKKyAgICAgICAgLyogZG8gbm90IHVwZGF0ZSByZWZUaWNrIGFuZCBtb2RUaW1lUmVmIHlldCwgZG8gaXQgYWZ0ZXIgZW5jb2RpbmchISAqLworICAgIH0KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDApOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMSk7IC8qIG1hcmtlciBiaXQgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgY3VyclZvbC0+bmJpdHNUaW1lSW5jUmVzLCB0aW1lSW5jKTsgLyogdm9wX3RpbWVfaW5jcmVtZW50ICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsgLyogbWFya2VyIGJpdCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIHZvcF9jb2RlZCBiaXQgKi8KKyAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlVk9QSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBWT1AgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBFbmNvZGVWT1BIZWFkZXIoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgVm9sICpjdXJyVm9sLCBWb3AgKmN1cnJWb3ApCit7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKyAgICAvL2ludCB0ZW1wOworCisgICAgaW50IE1UQiA9IGN1cnJWb2wtPm1vZHVsb1RpbWVCYXNlOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVmlkZW9PYmplY3RQbGFuZSgpICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAzMiwgVk9QX1NUQVJUX0NPREUpOyAvKlN0YXJ0IENvZGUgZm9yIFZPUCovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDIsIGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlKTsvKiBWT1AgQ29kaW5nIFR5cGUqLworCisgICAgY3VyclZvbC0+cHJldk1vZHVsb1RpbWVCYXNlID0gY3VyclZvbC0+bW9kdWxvVGltZUJhc2U7CisKKyAgICB3aGlsZSAoTVRCKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAxKTsKKyAgICAgICAgTVRCLS07CisgICAgfQorICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDEpOyAvKiBtYXJrZXIgYml0ICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIGN1cnJWb2wtPm5iaXRzVGltZUluY1JlcywgY3VyclZvcC0+dGltZUluYyk7IC8qIHZvcF90aW1lX2luY3JlbWVudCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMSk7IC8qIG1hcmtlciBiaXQgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb3AtPnZvcENvZGVkKTsgLyogdm9wX2NvZGVkIGJpdCAqLworICAgIGlmIChjdXJyVm9wLT52b3BDb2RlZCA9PSAwKQorICAgIHsKKyAgICAgICAgLyp0ZW1wID0qLworICAgICAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7IC8qIEJ5dGUgYWxpZ24gVk9QIEhlYWRlciAqLworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvcC0+cm91bmRpbmdUeXBlKTsgLyogdm9wX3JvdW5kaW5nX3R5cGUgKi8KKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCBjdXJyVm9wLT5pbnRyYURDVmxjVGhyKTsgLyogaW50cmFfZGNfdmxjX3RociAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9wLT5xdWFudGl6ZXIpOyAgIC8qIHZvcF9xdWFudCAqLworCisgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlICE9IElfVk9QKQorICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgMywgY3VyclZvcC0+ZmNvZGVGb3J3YXJkKTsgLyogdm9wX2Zjb2RlX2ZvcndhcmQgKi8KKyAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gQl9WT1ApCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCBjdXJyVm9wLT5mY29kZUJhY2t3YXJkKTsvKiB2b3BfZmNvZGVfYmFja3dhcmQgKi8KKworICAgIGlmIChjdXJyVm9sLT5zY2FsYWJpbGl0eSkKKyAgICAgICAgLyogZW5oYW5jZW1lbnRfdHlwZSA9IDAgKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDIsIGN1cnJWb3AtPnJlZlNlbGVjdENvZGUpOyAvKiByZWZfc2VsZWN0X2NvZGUgKi8KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYgLyogSDI2M19PTkxZICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZVNob3J0SGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGUgVk9QIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitQVl9TVEFUVVMgRW5jb2RlU2hvcnRIZWFkZXIoQml0c3RyZWFtRW5jVmlkZW8gKnN0cmVhbSwgVm9wICpjdXJyVm9wKQoreworCisgICAgUFZfU1RBVFVTIHN0YXR1czsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgMjIsIFNIT1JUX1ZJREVPX1NUQVJUX01BUktFUik7IC8qIFNob3J0X3ZpZGVvX3N0YXJ0X21hcmtlciAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCBjdXJyVm9wLT50ZW1wb3JhbFJlZik7IC8qIHRlbXBvcmFsX3JlZmVyZW5jZSAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMSk7IC8qIG1hcmtlciBiaXQgKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDApOyAvKiB6ZXJvIGJpdCAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIHNwbGl0X3NjcmVlbl9pbmRpY2F0b3I9MCovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAwKTsgLyogZG9jdW1lbnRfY2FtZXJhX2luZGljYXRvcj0wKi8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDApOyAvKiBmdWxsX3BpY3R1cmVfZnJlZXplX3JlbGVhc2U9MCovCisKKyAgICBzd2l0Y2ggKGN1cnJWb3AtPndpZHRoKQorICAgIHsKKyAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICBpZiAoY3VyclZvcC0+aGVpZ2h0ID09IDk2KQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCAxKTsgLyogc291cmNlX2Zvcm1hdCA9IDEgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE3NjoKKyAgICAgICAgICAgIGlmIChjdXJyVm9wLT5oZWlnaHQgPT0gMTQ0KQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCAyKTsgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDM1MjoKKyAgICAgICAgICAgIGlmIChjdXJyVm9wLT5oZWlnaHQgPT0gMjg4KQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCAzKTsgLyogc291cmNlX2Zvcm1hdCA9IDMgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDcwNDoKKyAgICAgICAgICAgIGlmIChjdXJyVm9wLT5oZWlnaHQgPT0gNTc2KQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAzLCA0KTsgLyogc291cmNlX2Zvcm1hdCA9IDQgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE0MDg6CisgICAgICAgICAgICBpZiAoY3VyclZvcC0+aGVpZ2h0ID09IDExNTIpCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDMsIDUpOyAvKiBzb3VyY2VfZm9ybWF0ID0gNSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUlMOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvcC0+cHJlZGljdGlvblR5cGUpOyAvKiBwaWN0dXJlX2NvZGluZyB0eXBlICovCisgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDQsIDApOyAvKiBmb3VyX3Jlc2VydmVkX3plcm9fYml0cyAqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9wLT5xdWFudGl6ZXIpOyAvKiB2b3BfcXVhbnQqLworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMCk7IC8qIHplcm9fYml0Ki8KKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDApOyAvKiBwZWk9MCAqLworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmbmRlZiBIMjYzX09OTFkKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRW5jb2RlVmlkZW9QYWNrZXRIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOS8wNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIaXN0b3J5ICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIENvbWJpbmVkIG1vZGUuICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogMDQvMjUvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgQWRkIGJpdHN0cmVhbSBzdHJ1Y3R1cmUgYXMgaW5wdXQgYXJndW1lbnQgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEVuY29kZVZpZGVvUGFja2V0SGVhZGVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGludCBNQl9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YW50X3NjYWxlLCBJbnQgaW5zZXJ0KQoreworLy8gIFBWX1NUQVRVUyBzdGF0dXM9UFZfU1VDQ0VTUzsKKyAgICBpbnQgZmNvZGU7CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKKyAgICBCaXRzdHJlYW1FbmNWaWRlbyAqYnMsIHRtcDsKKyAgICBVQ2hhciBidWZmZXJbMzBdOworCisgICAgaWYgKGluc2VydCkgLyogaW5zZXJ0IHBhY2tldCBoZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBiczEgKi8KKyAgICB7CisgICAgICAgIHRtcC5iaXRzdHJlYW1CdWZmZXIgPSBidWZmZXI7IC8qIHVzZSB0ZW1wb3JhcnkgYnVmZmVyICovCisgICAgICAgIHRtcC5idWZmZXJTaXplID0gMzA7CisgICAgICAgIEJpdHN0cmVhbUVuY1Jlc2V0KCZ0bXApOworICAgICAgICBicyA9ICZ0bXA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYnMgPSB2aWRlby0+Yml0c3RyZWFtMTsKKworCisgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBCaXRzdHJlYW1QdXRHVDE2Qml0cyhicywgMTcsIDEpOyAgICAvKiByZXN5bmNfbWFya2VyIElfVk9QICovCisgICAgZWxzZSBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gUF9WT1ApCisgICAgeworICAgICAgICBmY29kZSA9IGN1cnJWb3AtPmZjb2RlRm9yd2FyZDsKKyAgICAgICAgQml0c3RyZWFtUHV0R1QxNkJpdHMoYnMsIDE2ICsgZmNvZGUsIDEpOyAgICAvKiByZXN5bmNfbWFya2VyIFBfVk9QICovCisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZmNvZGUgPSBjdXJyVm9wLT5mY29kZUZvcndhcmQ7CisgICAgICAgIGlmIChjdXJyVm9wLT5mY29kZUJhY2t3YXJkID4gZmNvZGUpCisgICAgICAgICAgICBmY29kZSA9IGN1cnJWb3AtPmZjb2RlQmFja3dhcmQ7CisgICAgICAgIEJpdHN0cmVhbVB1dEdUMTZCaXRzKGJzLCAxNiArIGZjb2RlLCAxKTsgICAgLyogcmVzeW5jX21hcmtlciBCX1ZPUCAqLworICAgIH0KKworICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIGN1cnJWb2wtPm5CaXRzRm9yTUJJRCwgTUJfbnVtYmVyKTsgLyogcmVzeW5jX21hcmtlciAqLworICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIDUsIHF1YW50X3NjYWxlKTsgLyogcXVhbnRfc2NhbGUgKi8KKyAgICBCaXRzdHJlYW1QdXQxQml0cyhicywgMCk7IC8qIGhlYWRlcl9leHRlbnNpb25fY29kZSA9IDAgKi8KKworICAgIGlmICgwKSAvKiBoZWFkZXJfZXh0ZW5zaW9uX2NvZGUgPSAxICovCisgICAgeworICAgICAgICAvKiBORUVEIG1vZHVsb190aW1lX2Jhc2UgY29kZSBoZXJlIC4uLiBkZWZhdWx0IDB4MDEgIGJlbG8qLworICAgICAgICAvKnN0YXR1cyA9Ki8KKyAgICAgICAgQml0c3RyZWFtUHV0MUJpdHMoYnMsIDEpOworICAgICAgICAvKnN0YXR1cyA9ICovCisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzLCAwKTsKKworICAgICAgICAvKnN0YXR1cyA9ICovCisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzLCAxKTsgLyogbWFya2VyIGJpdCAqLworICAgICAgICAvKnN0YXR1cyA9ICovCisgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoYnMsIGN1cnJWb2wtPm5iaXRzVGltZUluY1JlcywgY3VyclZvcC0+dGltZUluYyk7IC8qIHZvcF90aW1lX2luY3JlbWVudCAqLworICAgICAgICAvKnN0YXR1cyA9ICovCisgICAgICAgIEJpdHN0cmVhbVB1dDFCaXRzKGJzLCAxKTsgLyogbWFya2VyIGJpdCAqLworCisgICAgICAgIC8qc3RhdHVzID0gKi8KKyAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhicywgMiwgY3VyclZvcC0+cHJlZGljdGlvblR5cGUpOy8qIFZPUCBDb2RpbmcgVHlwZSovCisKKyAgICAgICAgLypzdGF0dXMgPSAqLworICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKGJzLCAzLCBjdXJyVm9wLT5pbnRyYURDVmxjVGhyKTsgLyogaW50cmFfZGNfdmxjX3RociAqLworCisgICAgICAgIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSAhPSBJX1ZPUCkKKyAgICAgICAgICAgIC8qc3RhdHVzID0gKi8gQml0c3RyZWFtUHV0Qml0cyhicywgMywgY3VyclZvcC0+ZmNvZGVGb3J3YXJkKTsKKyAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IEJfVk9QKQorICAgICAgICAgICAgLypzdGF0dXMgPSAqLyBCaXRzdHJlYW1QdXRCaXRzKGJzLCAzLCBjdXJyVm9wLT5mY29kZUJhY2t3YXJkKTsKKyAgICB9CisjaWZuZGVmIE5PX1NMSUNFX0VOQ09ERQorICAgIGlmIChpbnNlcnQpCisgICAgICAgIEJpdHN0cmVhbVByZXBlbmRQYWNrZXQodmlkZW8tPmJpdHN0cmVhbTEsIGJzKTsKKyNlbmRpZgorICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisjZW5kaWYgLyogSDI2M19PTkxZICovCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01QM0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9NUDNEZWNvZGVyLmNwcAppbmRleCBlZmNiNDc2Li5jNGE4MjgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01QM0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTVAzRGVjb2Rlci5jcHAKQEAgLTI3LDEzICsyNywzNSBAQAogCiBNUDNEZWNvZGVyOjpNUDNEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQogICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbU51bUNoYW5uZWxzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAogICAgICAgbUNvbmZpZyhuZXcgdFBWTVAzRGVjb2RlckV4dGVybmFsKSwKICAgICAgIG1EZWNvZGVyQnVmKE5VTEwpLAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKLSAgICAgIG1OdW1TYW1wbGVzT3V0cHV0KDApLAorICAgICAgbU51bUZyYW1lc091dHB1dCgwKSwKICAgICAgIG1JbnB1dEJ1ZmZlcihOVUxMKSB7CisgICAgaW5pdCgpOworfQorCit2b2lkIE1QM0RlY29kZXI6OmluaXQoKSB7CisgICAgc3A8TWV0YURhdGE+IHNyY0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgIENIRUNLKHNyY0Zvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtTnVtQ2hhbm5lbHMpKTsKKyAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKKworICAgIG1NZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbU51bUNoYW5uZWxzKTsKKyAgICBtTWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChzcmNGb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICBtTWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICB9CisKKyAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIk1QM0RlY29kZXIiKTsKIH0KIAogTVAzRGVjb2Rlcjo6fk1QM0RlY29kZXIoKSB7CkBAIC02Miw3ICs4NCw3IEBACiAgICAgbVNvdXJjZS0+c3RhcnQoKTsKIAogICAgIG1BbmNob3JUaW1lVXMgPSAwOwotICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKICAgICByZXR1cm4gT0s7CkBAIC05MCwyNiArMTEyLDcgQEAKIH0KIAogc3A8TWV0YURhdGE+IE1QM0RlY29kZXI6OmdldEZvcm1hdCgpIHsKLSAgICBzcDxNZXRhRGF0YT4gc3JjRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IG51bUNoYW5uZWxzOwotICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKTsKLSAgICBDSEVDSyhzcmNGb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKTsKLQotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwotICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgIG1ldGEtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKHNyY0Zvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgfQotCi0gICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5RGVjb2RlckNvbXBvbmVudCwgIk1QM0RlY29kZXIiKTsKLQotICAgIHJldHVybiBtZXRhOworICAgIHJldHVybiBtTWV0YTsKIH0KIAogc3RhdHVzX3QgTVAzRGVjb2Rlcjo6cmVhZCgKQEAgLTExOSwxMCArMTIyLDExIEBACiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzKSkgeworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOworICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPj0gMCk7CiAKLSAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKIAogICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CiAgICAgICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKQEAgLTE0Miw3ICsxNDYsNyBAQAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIG11c3QgaGF2ZSBhIG5ldyB0aW1lc3RhbXAgYWZ0ZXIgc2Vla2luZy4KICAgICAgICAgICAgIENIRUNLKHNlZWtUaW1lVXMgPCAwKTsKQEAgLTE3OSw3ICsxODMsNyBAQAogCiAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAogICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KLSAgICAgICAgbWVtc2V0KGJ1ZmZlci0+ZGF0YSgpLCAwLCBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUpOworICAgICAgICBtZW1zZXQoYnVmZmVyLT5kYXRhKCksIDAsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAgICAgfQogCkBAIC0xOTgsOSArMjAyLDkgQEAKICAgICBidWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NCgKICAgICAgICAgICAgIGtLZXlUaW1lLAogICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1TYW1wbGVzT3V0cHV0ICogMTAwMDAwMCkgLyBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwKSAvIG1Db25maWctPnNhbXBsaW5nUmF0ZSk7CiAKLSAgICBtTnVtU2FtcGxlc091dHB1dCArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBzaXplb2YoaW50MTZfdCk7CisgICAgbU51bUZyYW1lc091dHB1dCArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgLyBtTnVtQ2hhbm5lbHM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0MzEyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZGZiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBWUFhEZWNvZGVyLmNwcAorCitMT0NBTF9NT0RVTEUgOj0gbGlic3RhZ2VmcmlnaHRfdnB4ZGVjCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4IFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL2xpYnZweC92cHhfY29kZWMgXAorICAgICAgICAkKFRPUCkvZXh0ZXJuYWwvbGlidnB4L3ZweF9wb3J0cworCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9WUFhEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1ZQWERlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzk3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9WUFhEZWNvZGVyLmNwcApAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVlBYRGVjb2RlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlZQWERlY29kZXIuaCIKKworI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlICJ2cHhfY29kZWMvdnB4X2RlY29kZXIuaCIKKyNpbmNsdWRlICJ2cDgvdnA4ZHguaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitWUFhEZWNvZGVyOjpWUFhEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUJ1ZmZlclNpemUoMCksCisgICAgICBtQ3R4KE5VTEwpLAorICAgICAgbUJ1ZmZlckdyb3VwKE5VTEwpLAorICAgICAgbVRhcmdldFRpbWVVcygtMSkgeworICAgIHNwPE1ldGFEYXRhPiBpbnB1dEZvcm1hdCA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIENIRUNLKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQWCkpOworCisgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtV2lkdGgpKTsKKyAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZtSGVpZ2h0KSk7CisKKyAgICBtQnVmZmVyU2l6ZSA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworCisgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKTsKKyAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIG1XaWR0aCk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgbUhlaWdodCk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNvbG9yRm9ybWF0LCBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlEZWNvZGVyQ29tcG9uZW50LCAiVlBYRGVjb2RlciIpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmIChpbnB1dEZvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgfQorfQorCitWUFhEZWNvZGVyOjp+VlBYRGVjb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KK30KKworc3RhdHVzX3QgVlBYRGVjb2Rlcjo6c3RhcnQoTWV0YURhdGEgKikgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5zdGFydCgpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OworICAgIGlmICh2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZ2cHhfY29kZWNfdnA4X2R4X2FsZ28sIE5VTEwsIDApKSB7CisgICAgICAgIExPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiIpOworCisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1CdWZmZXJTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtQnVmZmVyU2l6ZSkpOworCisgICAgbVRhcmdldFRpbWVVcyA9IC0xOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBWUFhEZWNvZGVyOjpzdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgZGVsZXRlIG1CdWZmZXJHcm91cDsKKyAgICBtQnVmZmVyR3JvdXAgPSBOVUxMOworCisgICAgdnB4X2NvZGVjX2Rlc3Ryb3koKHZweF9jb2RlY19jdHhfdCAqKW1DdHgpOworICAgIGRlbGV0ZSAodnB4X2NvZGVjX2N0eF90ICopbUN0eDsKKyAgICBtQ3R4ID0gTlVMTDsKKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKworICAgIG1TdGFydGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBWUFhEZWNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgcmV0dXJuIG1Gb3JtYXQ7Cit9CisKK3N0YXR1c190IFZQWERlY29kZXI6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworICAgICpvdXQgPSBOVUxMOworCisgICAgYm9vbCBzZWVraW5nID0gZmFsc2U7CisgICAgaW50NjRfdCBzZWVrVGltZVVzOworICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgc2Vla2luZyA9IHRydWU7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXIgKmlucHV0OworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJmlucHV0LCBvcHRpb25zKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBMT0dWKCJyZWFkICVkIGJ5dGVzIGZyb20gc291cmNlXG4iLCBpbnB1dC0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgaWYgKHNlZWtpbmcpIHsKKyAgICAgICAgaW50NjRfdCB0YXJnZXRUaW1lVXM7CisgICAgICAgIGlmIChpbnB1dC0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGFyZ2V0VGltZSwgJnRhcmdldFRpbWVVcykKKyAgICAgICAgICAgICAgICAmJiB0YXJnZXRUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IHRhcmdldFRpbWVVczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1UYXJnZXRUaW1lVXMgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgICh2cHhfY29kZWNfY3R4X3QgKiltQ3R4LAorICAgICAgICAgICAgICAgICh1aW50OF90ICopaW5wdXQtPmRhdGEoKSArIGlucHV0LT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICBpbnB1dC0+cmFuZ2VfbGVuZ3RoKCksCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAwKSkgeworICAgICAgICBMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOworICAgICAgICBpbnB1dC0+cmVsZWFzZSgpOworICAgICAgICBpbnB1dCA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgTE9HVigic3VjY2Vzc2Z1bGx5IGRlY29kZWQgMSBvciBtb3JlIGZyYW1lcy4iKTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGlucHV0LT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICBpbnB1dC0+cmVsZWFzZSgpOworICAgIGlucHV0ID0gTlVMTDsKKworICAgIGJvb2wgc2tpcEZyYW1lID0gZmFsc2U7CisKKyAgICBpZiAobVRhcmdldFRpbWVVcyA+PSAwKSB7CisgICAgICAgIENIRUNLKHRpbWVVcyA8PSBtVGFyZ2V0VGltZVVzKTsKKworICAgICAgICBpZiAodGltZVVzIDwgbVRhcmdldFRpbWVVcykgeworICAgICAgICAgICAgLy8gV2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIGZyYW1lIHdpdGggdGhlIG1hdGNoaW5nCisgICAgICAgICAgICAvLyB0aW1lc3RhbXAgYW5kIHdlIHdvbid0IHJldHVybiB0aGUgY3VycmVudCBvbmUuCisgICAgICAgICAgICBza2lwRnJhbWUgPSB0cnVlOworCisgICAgICAgICAgICBMT0dWKCJza2lwcGluZyBmcmFtZSBhdCAlbGxkIHVzIiwgdGltZVVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR1YoImZvdW5kIHRhcmdldCBmcmFtZSBhdCAlbGxkIHVzIiwgdGltZVVzKTsKKworICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNraXBGcmFtZSkgeworICAgICAgICAqb3V0ID0gbmV3IE1lZGlhQnVmZmVyKDApOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgdnB4X2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKKyAgICB2cHhfaW1hZ2VfdCAqaW1nID0gdnB4X2NvZGVjX2dldF9mcmFtZSgodnB4X2NvZGVjX2N0eF90ICopbUN0eCwgJml0ZXIpOworCisgICAgaWYgKGltZyA9PSBOVUxMKSB7CisgICAgICAgIExPR0koIm9uMiBkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgZnJhbWUuIik7CisKKyAgICAgICAgKm91dCA9IG5ldyBNZWRpYUJ1ZmZlcigwKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIENIRUNLX0VRKGltZy0+Zm10LCBJTUdfRk1UX0k0MjApOworCisgICAgaW50MzJfdCB3aWR0aCA9IGltZy0+ZF93OworICAgIGludDMyX3QgaGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICBpZiAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIExPR0koIkltYWdlIGRpbWVuc2lvbnMgY2hhbmdlZCwgd2lkdGggPSAlZCwgaGVpZ2h0ID0gJWQiLAorICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICBtSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICBtQnVmZmVyU2l6ZSA9IChtV2lkdGggKiBtSGVpZ2h0ICogMykgLyAyOworICAgICAgICBkZWxldGUgbUJ1ZmZlckdyb3VwOworICAgICAgICBtQnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtQnVmZmVyU2l6ZSkpOworICAgICAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIobmV3IE1lZGlhQnVmZmVyKG1CdWZmZXJTaXplKSk7CisKKyAgICAgICAgcmV0dXJuIElORk9fRk9STUFUX0NIQU5HRUQ7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXIgKm91dHB1dDsKKyAgICBDSEVDS19FUShtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRwdXQpLCBPSyk7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNMaW5lID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tQTEFORV9ZXTsKKyAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKW91dHB1dC0+ZGF0YSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2g7ICsraSkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmNMaW5lLCBpbWctPmRfdyk7CisKKyAgICAgICAgc3JjTGluZSArPSBpbWctPnN0cmlkZVtQTEFORV9ZXTsKKyAgICAgICAgZHN0ICs9IGltZy0+ZF93OworICAgIH0KKworICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1VdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKKworICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1VdOworICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOworICAgIH0KKworICAgIHNyY0xpbmUgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1BMQU5FX1ZdOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW1nLT5kX2ggLyAyOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjTGluZSwgaW1nLT5kX3cgLyAyKTsKKworICAgICAgICBzcmNMaW5lICs9IGltZy0+c3RyaWRlW1BMQU5FX1ZdOworICAgICAgICBkc3QgKz0gaW1nLT5kX3cgLyAyOworICAgIH0KKworICAgIG91dHB1dC0+c2V0X3JhbmdlKDAsICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMik7CisKKyAgICBvdXRwdXQtPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICpvdXQgPSBvdXRwdXQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1ZvcmJpc0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKaW5kZXggZGYzZjE2YS4uNTNmMDYzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvVm9yYmlzRGVjb2Rlci5jcHAKQEAgLTIwMCw3ICsyMDAsOCBAQAogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwotICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcykpIHsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBDSEVDSyhzZWVrVGltZVVzID49IDApOwogCiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKaW5kZXggZTc0NzgyZi4uNWIxNjk5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC00Miw2ICs0Miw3IEBACiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI6CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtNzEsNiArNzIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3JjQml0cywgc3JjU2tpcCwgZHN0Qml0cywgZHN0U2tpcCk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgY29udmVydFlVVjQyMFNlbWlQbGFuYXIoCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHNyY0JpdHMsIHNyY1NraXAsIGRzdEJpdHMsIGRzdFNraXApOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0soISJTaG91bGQgbm90IGJlIGhlcmUuIFVua25vd24gY29sb3IgY29udmVyc2lvbi4iKTsKQEAgLTI3OSw2ICsyODUsNjggQEAKICAgICB9CiB9CiAKK3ZvaWQgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyKAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsIHNpemVfdCBzcmNTa2lwLAorICAgICAgICB2b2lkICpkc3RCaXRzLCBzaXplX3QgZHN0U2tpcCkgeworICAgIENIRUNLX0VRKHNyY1NraXAsIDApOyAgLy8gRG9lc24ndCByZWFsbHkgbWFrZSBzZW5zZSBmb3IgWVVWIGZvcm1hdHMuCisgICAgQ0hFQ0soZHN0U2tpcCA+PSB3aWR0aCAqIDIpOworICAgIENIRUNLKChkc3RTa2lwICYgMykgPT0gMCk7CisKKyAgICB1aW50OF90ICprQWRqdXN0ZWRDbGlwID0gaW5pdENsaXAoKTsKKworICAgIHVpbnQzMl90ICpkc3RfcHRyID0gKHVpbnQzMl90ICopZHN0Qml0czsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopc3JjQml0czsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmNfeSArIHdpZHRoICogaGVpZ2h0OworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIHNpZ25lZCB5MSA9IChzaWduZWQpc3JjX3lbeF0gLSAxNjsKKyAgICAgICAgICAgIHNpZ25lZCB5MiA9IChzaWduZWQpc3JjX3lbeCArIDFdIC0gMTY7CisKKyAgICAgICAgICAgIHNpZ25lZCB2ID0gKHNpZ25lZClzcmNfdVt4ICYgfjFdIC0gMTI4OworICAgICAgICAgICAgc2lnbmVkIHUgPSAoc2lnbmVkKXNyY191Wyh4ICYgfjEpICsgMV0gLSAxMjg7CisKKyAgICAgICAgICAgIHNpZ25lZCB1X2IgPSB1ICogNTE3OworICAgICAgICAgICAgc2lnbmVkIHVfZyA9IC11ICogMTAwOworICAgICAgICAgICAgc2lnbmVkIHZfZyA9IC12ICogMjA4OworICAgICAgICAgICAgc2lnbmVkIHZfciA9IHYgKiA0MDk7CisKKyAgICAgICAgICAgIHNpZ25lZCB0bXAxID0geTEgKiAyOTg7CisgICAgICAgICAgICBzaWduZWQgYjEgPSAodG1wMSArIHVfYikgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgZzEgPSAodG1wMSArIHZfZyArIHVfZykgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgcjEgPSAodG1wMSArIHZfcikgLyAyNTY7CisKKyAgICAgICAgICAgIHNpZ25lZCB0bXAyID0geTIgKiAyOTg7CisgICAgICAgICAgICBzaWduZWQgYjIgPSAodG1wMiArIHVfYikgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgZzIgPSAodG1wMiArIHZfZyArIHVfZykgLyAyNTY7CisgICAgICAgICAgICBzaWduZWQgcjIgPSAodG1wMiArIHZfcikgLyAyNTY7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJnYjEgPQorICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtiMV0gPj4gMykgPDwgMTEpCisgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzFdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMV0gPj4gMyk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJnYjIgPQorICAgICAgICAgICAgICAgICgoa0FkanVzdGVkQ2xpcFtiMl0gPj4gMykgPDwgMTEpCisgICAgICAgICAgICAgICAgfCAoKGtBZGp1c3RlZENsaXBbZzJdID4+IDIpIDw8IDUpCisgICAgICAgICAgICAgICAgfCAoa0FkanVzdGVkQ2xpcFtyMl0gPj4gMyk7CisKKyAgICAgICAgICAgIGRzdF9wdHJbeCAvIDJdID0gKHJnYjIgPDwgMTYpIHwgcmdiMTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY195ICs9IHdpZHRoOworCisgICAgICAgIGlmICh5ICYgMSkgeworICAgICAgICAgICAgc3JjX3UgKz0gd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBkc3RfcHRyICs9IGRzdFNraXAgLyA0OworICAgIH0KK30KKwogdWludDhfdCAqQ29sb3JDb252ZXJ0ZXI6OmluaXRDbGlwKCkgewogICAgIHN0YXRpYyBjb25zdCBzaWduZWQga0NsaXBNaW4gPSAtMjc4OwogICAgIHN0YXRpYyBjb25zdCBzaWduZWQga0NsaXBNYXggPSA1MzU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FBdG9taXplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiOWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUF0b21pemVyLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQUF0b21pemVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitBQXRvbWl6ZXIgQUF0b21pemVyOjpnQXRvbWl6ZXI7CisKKy8vIHN0YXRpYworY29uc3QgY2hhciAqQUF0b21pemVyOjpBdG9taXplKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICByZXR1cm4gZ0F0b21pemVyLmF0b21pemUobmFtZSk7Cit9CisKK0FBdG9taXplcjo6QUF0b21pemVyKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTI4OyArK2kpIHsKKyAgICAgICAgbUF0b21zLnB1c2goTGlzdDxBU3RyaW5nPigpKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKkFBdG9taXplcjo6YXRvbWl6ZShjb25zdCBjaGFyICpuYW1lKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGNvbnN0IHNpemVfdCBuID0gbUF0b21zLnNpemUoKTsKKyAgICBzaXplX3QgaW5kZXggPSBBQXRvbWl6ZXI6Okhhc2gobmFtZSkgJSBuOworICAgIExpc3Q8QVN0cmluZz4gJmVudHJ5ID0gbUF0b21zLmVkaXRJdGVtQXQoaW5kZXgpOworICAgIExpc3Q8QVN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZW50cnkuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gZW50cnkuZW5kKCkpIHsKKyAgICAgICAgaWYgKCgqaXQpID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKml0KS5jX3N0cigpOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgZW50cnkucHVzaF9iYWNrKEFTdHJpbmcobmFtZSkpOworCisgICAgcmV0dXJuICgqLS1lbnRyeS5lbmQoKSkuY19zdHIoKTsKK30KKworLy8gc3RhdGljCit1aW50MzJfdCBBQXRvbWl6ZXI6Okhhc2goY29uc3QgY2hhciAqcykgeworICAgIHVpbnQzMl90IHN1bSA9IDA7CisgICAgd2hpbGUgKCpzICE9ICdcMCcpIHsKKyAgICAgICAgc3VtID0gKHN1bSAqIDMxKSArICpzOworICAgICAgICArK3M7CisgICAgfQorCisgICAgcmV0dXJuIHN1bTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YzhkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQUJpdFJlYWRlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBQml0UmVhZGVyOjpBQml0UmVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbURhdGEoZGF0YSksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SZXNlcnZvaXIoMCksCisgICAgICBtTnVtQml0c0xlZnQoMCkgeworfQorCit2b2lkIEFCaXRSZWFkZXI6OmZpbGxSZXNlcnZvaXIoKSB7CisgICAgQ0hFQ0tfR1QobVNpemUsIDB1KTsKKworICAgIG1SZXNlcnZvaXIgPSAwOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IG1TaXplID4gMCAmJiBpIDwgNDsgKytpKSB7CisgICAgICAgIG1SZXNlcnZvaXIgPSAobVJlc2Vydm9pciA8PCA4KSB8ICptRGF0YTsKKworICAgICAgICArK21EYXRhOworICAgICAgICAtLW1TaXplOworICAgIH0KKworICAgIG1OdW1CaXRzTGVmdCA9IDggKiBpOworICAgIG1SZXNlcnZvaXIgPDw9IDMyIC0gbU51bUJpdHNMZWZ0OworfQorCit1aW50MzJfdCBBQml0UmVhZGVyOjpnZXRCaXRzKHNpemVfdCBuKSB7CisgICAgQ0hFQ0tfTEUobiwgMzJ1KTsKKworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgIGlmIChtTnVtQml0c0xlZnQgPT0gMCkgeworICAgICAgICAgICAgZmlsbFJlc2Vydm9pcigpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG0gPSBuOworICAgICAgICBpZiAobSA+IG1OdW1CaXRzTGVmdCkgeworICAgICAgICAgICAgbSA9IG1OdW1CaXRzTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgbSkgfCAobVJlc2Vydm9pciA+PiAoMzIgLSBtKSk7CisgICAgICAgIG1SZXNlcnZvaXIgPDw9IG07CisgICAgICAgIG1OdW1CaXRzTGVmdCAtPSBtOworCisgICAgICAgIG4gLT0gbTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEFCaXRSZWFkZXI6OnNraXBCaXRzKHNpemVfdCBuKSB7CisgICAgd2hpbGUgKG4gPiAzMikgeworICAgICAgICBnZXRCaXRzKDMyKTsKKyAgICAgICAgbiAtPSAzMjsKKyAgICB9CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgZ2V0Qml0cyhuKTsKKyAgICB9Cit9CisKK3ZvaWQgQUJpdFJlYWRlcjo6cHV0Qml0cyh1aW50MzJfdCB4LCBzaXplX3QgbikgeworICAgIENIRUNLX0xFKG1OdW1CaXRzTGVmdCArIG4sIDMydSk7CisKKyAgICBtUmVzZXJ2b2lyID0gKG1SZXNlcnZvaXIgPj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7CisgICAgbU51bUJpdHNMZWZ0ICs9IG47Cit9CisKK3NpemVfdCBBQml0UmVhZGVyOjpudW1CaXRzTGVmdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNpemUgKiA4ICsgbU51bUJpdHNMZWZ0OworfQorCitjb25zdCB1aW50OF90ICpBQml0UmVhZGVyOjpkYXRhKCkgY29uc3QgeworICAgIENIRUNLX0VRKG1OdW1CaXRzTGVmdCAlIDgsIDB1KTsKKworICAgIHJldHVybiBtRGF0YSAtIG1OdW1CaXRzTGVmdCAvIDg7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTczZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFCdWZmZXIuaCIKKworI2luY2x1ZGUgIkFEZWJ1Zy5oIgorI2luY2x1ZGUgIkFMb29wZXIuaCIKKyNpbmNsdWRlICJBTWVzc2FnZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FCdWZmZXI6OkFCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KQorICAgIDogbURhdGEobWFsbG9jKGNhcGFjaXR5KSksCisgICAgICBtQ2FwYWNpdHkoY2FwYWNpdHkpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKGNhcGFjaXR5KSwKKyAgICAgIG1JbnQzMkRhdGEoMCksCisgICAgICBtT3duc0RhdGEodHJ1ZSkgeworfQorCitBQnVmZmVyOjpBQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKKyAgICA6IG1EYXRhKGRhdGEpLAorICAgICAgbUNhcGFjaXR5KGNhcGFjaXR5KSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChjYXBhY2l0eSksCisgICAgICBtSW50MzJEYXRhKDApLAorICAgICAgbU93bnNEYXRhKGZhbHNlKSB7Cit9CisKK0FCdWZmZXI6On5BQnVmZmVyKCkgeworICAgIGlmIChtT3duc0RhdGEpIHsKKyAgICAgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICAgICAgbURhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1GYXJld2VsbCAhPSBOVUxMKSB7CisgICAgICAgIG1GYXJld2VsbC0+cG9zdCgpOworICAgIH0KK30KKwordm9pZCBBQnVmZmVyOjpzZXRSYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLX0xFKG9mZnNldCwgbUNhcGFjaXR5KTsKKyAgICBDSEVDS19MRShvZmZzZXQgKyBzaXplLCBtQ2FwYWNpdHkpOworCisgICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OworICAgIG1SYW5nZUxlbmd0aCA9IHNpemU7Cit9CisKK3ZvaWQgQUJ1ZmZlcjo6c2V0RmFyZXdlbGxNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBtRmFyZXdlbGwgPSBtc2c7Cit9CisKK3NwPEFNZXNzYWdlPiBBQnVmZmVyOjptZXRhKCkgeworICAgIGlmIChtTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIG1NZXRhID0gbmV3IEFNZXNzYWdlOworICAgIH0KKyAgICByZXR1cm4gbU1ldGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY4YjIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQURlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgQU5EUk9JRAorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0xvZ2dlcjo6TG9nZ2VyKExvZ1R5cGUgdHlwZSkKKyAgICA6IG1Mb2dUeXBlKHR5cGUpIHsKKyAgICBzd2l0Y2ggKG1Mb2dUeXBlKSB7CisgICAgICAgIGNhc2UgVkVSQk9TRToKKyAgICAgICAgICAgIG1NZXNzYWdlID0gIlYgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElORk86CisgICAgICAgICAgICBtTWVzc2FnZSA9ICJJICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBXQVJOSU5HOgorICAgICAgICAgICAgbU1lc3NhZ2UgPSAiVyAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1I6CisgICAgICAgICAgICBtTWVzc2FnZSA9ICJFICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQVRBTDoKKyAgICAgICAgICAgIG1NZXNzYWdlID0gIkYgIjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK0xvZ2dlcjo6fkxvZ2dlcigpIHsKKyAgICBpZiAobUxvZ1R5cGUgPT0gVkVSQk9TRSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU1lc3NhZ2UuYXBwZW5kKCJcbiIpOworCisjaWYgZGVmaW5lZChBTkRST0lEKSAmJiAxCisgICAgTE9HX1BSSShBTkRST0lEX0xPR19JTkZPLCAiQURlYnVnIiwgIiVzIiwgbU1lc3NhZ2UuY19zdHIoKSk7CisjZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCBtTWVzc2FnZS5jX3N0cigpKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyNlbmRpZgorCisgICAgaWYgKG1Mb2dUeXBlID09IEZBVEFMKSB7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitjb25zdCBjaGFyICpMZWFmTmFtZShjb25zdCBjaGFyICpzKSB7CisgICAgY29uc3QgY2hhciAqbGFzdFNsYXNoID0gc3RycmNocihzLCAnLycpOworICAgIHJldHVybiBsYXN0U2xhc2ggIT0gTlVMTCA/IGxhc3RTbGFzaCArIDEgOiBzOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDVmN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUhhbmRsZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzcDxBTG9vcGVyPiBBSGFuZGxlcjo6bG9vcGVyKCkgeworICAgIGV4dGVybiBBTG9vcGVyUm9zdGVyIGdMb29wZXJSb3N0ZXI7CisKKyAgICByZXR1cm4gZ0xvb3BlclJvc3Rlci5maW5kTG9vcGVyKGlkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwODdmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFMb29wZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSAiQUxvb3Blci5oIgorCisjaW5jbHVkZSAiQUhhbmRsZXIuaCIKKyNpbmNsdWRlICJBTG9vcGVyUm9zdGVyLmgiCisjaW5jbHVkZSAiQU1lc3NhZ2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTG9vcGVyUm9zdGVyIGdMb29wZXJSb3N0ZXI7CisKK3N0cnVjdCBBTG9vcGVyOjpMb29wZXJUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBMb29wZXJUaHJlYWQoQUxvb3BlciAqbG9vcGVyLCBib29sIGNhbkNhbGxKYXZhKQorICAgICAgICA6IFRocmVhZChjYW5DYWxsSmF2YSksCisgICAgICAgICAgbUxvb3Blcihsb29wZXIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKKyAgICAgICAgcmV0dXJuIG1Mb29wZXItPmxvb3AoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Mb29wZXJUaHJlYWQoKSB7fQorCitwcml2YXRlOgorICAgIEFMb29wZXIgKm1Mb29wZXI7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMb29wZXJUaHJlYWQpOworfTsKKworLy8gc3RhdGljCitpbnQ2NF90IEFMb29wZXI6OkdldE5vd1VzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X3VzZWM7Cit9CisKK0FMb29wZXI6OkFMb29wZXIoKQorICAgIDogbVJ1bm5pbmdMb2NhbGx5KGZhbHNlKSB7Cit9CisKK0FMb29wZXI6On5BTG9vcGVyKCkgeworICAgIHN0b3AoKTsKK30KKwordm9pZCBBTG9vcGVyOjpzZXROYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBtTmFtZSA9IG5hbWU7Cit9CisKK0FMb29wZXI6OmhhbmRsZXJfaWQgQUxvb3Blcjo6cmVnaXN0ZXJIYW5kbGVyKGNvbnN0IHNwPEFIYW5kbGVyPiAmaGFuZGxlcikgeworICAgIHJldHVybiBnTG9vcGVyUm9zdGVyLnJlZ2lzdGVySGFuZGxlcih0aGlzLCBoYW5kbGVyKTsKK30KKwordm9pZCBBTG9vcGVyOjp1bnJlZ2lzdGVySGFuZGxlcihoYW5kbGVyX2lkIGhhbmRsZXJJRCkgeworICAgIGdMb29wZXJSb3N0ZXIudW5yZWdpc3RlckhhbmRsZXIoaGFuZGxlcklEKTsKK30KKworc3RhdHVzX3QgQUxvb3Blcjo6c3RhcnQoCisgICAgICAgIGJvb2wgcnVuT25DYWxsaW5nVGhyZWFkLCBib29sIGNhbkNhbGxKYXZhLCBpbnQzMl90IHByaW9yaXR5KSB7CisgICAgaWYgKHJ1bk9uQ2FsbGluZ1RocmVhZCkgeworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgICAgICAgICBpZiAobVRocmVhZCAhPSBOVUxMIHx8IG1SdW5uaW5nTG9jYWxseSkgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVJ1bm5pbmdMb2NhbGx5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAobG9vcCgpKTsKKworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtVGhyZWFkICE9IE5VTEwgfHwgbVJ1bm5pbmdMb2NhbGx5KSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtVGhyZWFkID0gbmV3IExvb3BlclRocmVhZCh0aGlzLCBjYW5DYWxsSmF2YSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtVGhyZWFkLT5ydW4oCisgICAgICAgICAgICBtTmFtZS5lbXB0eSgpID8gIkFMb29wZXIiIDogbU5hbWUuY19zdHIoKSwgcHJpb3JpdHkpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbVRocmVhZC5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IEFMb29wZXI6OnN0b3AoKSB7CisgICAgc3A8TG9vcGVyVGhyZWFkPiB0aHJlYWQ7CisgICAgYm9vbCBydW5uaW5nTG9jYWxseTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICB0aHJlYWQgPSBtVGhyZWFkOworICAgICAgICBydW5uaW5nTG9jYWxseSA9IG1SdW5uaW5nTG9jYWxseTsKKyAgICAgICAgbVRocmVhZC5jbGVhcigpOworICAgICAgICBtUnVubmluZ0xvY2FsbHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAodGhyZWFkID09IE5VTEwgJiYgIXJ1bm5pbmdMb2NhbGx5KSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAodGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgdGhyZWFkLT5yZXF1ZXN0RXhpdCgpOworICAgIH0KKworICAgIG1RdWV1ZUNoYW5nZWRDb25kaXRpb24uc2lnbmFsKCk7CisKKyAgICBpZiAoIXJ1bm5pbmdMb2NhbGx5KSB7CisgICAgICAgIHRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFMb29wZXI6OnBvc3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpbnQ2NF90IHdoZW5VczsKKyAgICBpZiAoZGVsYXlVcyA+IDApIHsKKyAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKSArIGRlbGF5VXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKTsKKyAgICB9CisKKyAgICBMaXN0PEV2ZW50Pjo6aXRlcmF0b3IgaXQgPSBtRXZlbnRRdWV1ZS5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtRXZlbnRRdWV1ZS5lbmQoKSAmJiAoKml0KS5tV2hlblVzIDw9IHdoZW5VcykgeworICAgICAgICArK2l0OworICAgIH0KKworICAgIEV2ZW50IGV2ZW50OworICAgIGV2ZW50Lm1XaGVuVXMgPSB3aGVuVXM7CisgICAgZXZlbnQubU1lc3NhZ2UgPSBtc2c7CisKKyAgICBpZiAoaXQgPT0gbUV2ZW50UXVldWUuYmVnaW4oKSkgeworICAgICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KKworICAgIG1FdmVudFF1ZXVlLmluc2VydChpdCwgZXZlbnQpOworfQorCitib29sIEFMb29wZXI6Omxvb3AoKSB7CisgICAgRXZlbnQgZXZlbnQ7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIGlmIChtVGhyZWFkID09IE5VTEwgJiYgIW1SdW5uaW5nTG9jYWxseSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChtRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB3aGVuVXMgPSAoKm1FdmVudFF1ZXVlLmJlZ2luKCkpLm1XaGVuVXM7CisgICAgICAgIGludDY0X3Qgbm93VXMgPSBHZXROb3dVcygpOworCisgICAgICAgIGlmICh3aGVuVXMgPiBub3dVcykgeworICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0gd2hlblVzIC0gbm93VXM7CisgICAgICAgICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywgZGVsYXlVcyAqIDEwMDBsbCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZXZlbnQgPSAqbUV2ZW50UXVldWUuYmVnaW4oKTsKKyAgICAgICAgbUV2ZW50UXVldWUuZXJhc2UobUV2ZW50UXVldWUuYmVnaW4oKSk7CisgICAgfQorCisgICAgZ0xvb3BlclJvc3Rlci5kZWxpdmVyTWVzc2FnZShldmVudC5tTWVzc2FnZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Zjc1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBTG9vcGVyUm9zdGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUxvb3BlclJvc3Rlci5oIgorCisjaW5jbHVkZSAiQURlYnVnLmgiCisjaW5jbHVkZSAiQUhhbmRsZXIuaCIKKyNpbmNsdWRlICJBTWVzc2FnZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FMb29wZXJSb3N0ZXI6OkFMb29wZXJSb3N0ZXIoKQorICAgIDogbU5leHRIYW5kbGVySUQoMSkgeworfQorCitBTG9vcGVyOjpoYW5kbGVyX2lkIEFMb29wZXJSb3N0ZXI6OnJlZ2lzdGVySGFuZGxlcigKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gbG9vcGVyLCBjb25zdCBzcDxBSGFuZGxlcj4gJmhhbmRsZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKGhhbmRsZXItPmlkKCkgIT0gMCkgeworICAgICAgICBDSEVDSyghIkEgaGFuZGxlciBtdXN0IG9ubHkgYmUgcmVnaXN0ZXJlZCBvbmNlLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgSGFuZGxlckluZm8gaW5mbzsKKyAgICBpbmZvLm1Mb29wZXIgPSBsb29wZXI7CisgICAgaW5mby5tSGFuZGxlciA9IGhhbmRsZXI7CisgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQgPSBtTmV4dEhhbmRsZXJJRCsrOworICAgIG1IYW5kbGVycy5hZGQoaGFuZGxlcklELCBpbmZvKTsKKworICAgIGhhbmRsZXItPnNldElEKGhhbmRsZXJJRCk7CisKKyAgICByZXR1cm4gaGFuZGxlcklEOworfQorCit2b2lkIEFMb29wZXJSb3N0ZXI6OnVucmVnaXN0ZXJIYW5kbGVyKEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShoYW5kbGVySUQpOworICAgIENIRUNLX0dFKGluZGV4LCAwKTsKKworICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOworCisgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKKworICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgaGFuZGxlci0+c2V0SUQoMCk7CisgICAgfQorCisgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworfQorCit2b2lkIEFMb29wZXJSb3N0ZXI6OnBvc3RNZXNzYWdlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtSGFuZGxlcnMuaW5kZXhPZktleShtc2ctPnRhcmdldCgpKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCk7CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBpbmZvLm1Mb29wZXIucHJvbW90ZSgpOworCisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIHBvc3QgbWVzc2FnZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyIHN0aWxsIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iOworCisgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvb3Blci0+cG9zdChtc2csIGRlbGF5VXMpOworfQorCit2b2lkIEFMb29wZXJSb3N0ZXI6OmRlbGl2ZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXI7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KG1zZy0+dGFyZ2V0KCkpOworCisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIGRlbGl2ZXIgbWVzc2FnZS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKKworICAgICAgICBpZiAoaGFuZGxlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgImZhaWxlZCB0byBkZWxpdmVyIG1lc3NhZ2UuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiI7CisKKyAgICAgICAgICAgIG1IYW5kbGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGhhbmRsZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7Cit9CisKK3NwPEFMb29wZXI+IEFMb29wZXJSb3N0ZXI6OmZpbmRMb29wZXIoQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KGhhbmRsZXJJRCk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KS5tTG9vcGVyLnByb21vdGUoKTsKKworICAgIGlmIChsb29wZXIgPT0gTlVMTCkgeworICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBsb29wZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzZkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcApAQCAtMCwwICsxLDM0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBTWVzc2FnZS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgIkFBdG9taXplci5oIgorI2luY2x1ZGUgIkFEZWJ1Zy5oIgorI2luY2x1ZGUgIkFMb29wZXJSb3N0ZXIuaCIKKyNpbmNsdWRlICJBU3RyaW5nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQU1lc3NhZ2U6OkFNZXNzYWdlKHVpbnQzMl90IHdoYXQsIEFMb29wZXI6OmhhbmRsZXJfaWQgdGFyZ2V0KQorICAgIDogbVdoYXQod2hhdCksCisgICAgICBtVGFyZ2V0KHRhcmdldCksCisgICAgICBtTnVtSXRlbXMoMCkgeworfQorCitBTWVzc2FnZTo6fkFNZXNzYWdlKCkgeworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgQU1lc3NhZ2U6OnNldFdoYXQodWludDMyX3Qgd2hhdCkgeworICAgIG1XaGF0ID0gd2hhdDsKK30KKwordWludDMyX3QgQU1lc3NhZ2U6OndoYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1XaGF0OworfQorCit2b2lkIEFNZXNzYWdlOjpzZXRUYXJnZXQoQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQpIHsKKyAgICBtVGFyZ2V0ID0gaGFuZGxlcklEOworfQorCitBTG9vcGVyOjpoYW5kbGVyX2lkIEFNZXNzYWdlOjp0YXJnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYXJnZXQ7Cit9CisKK3ZvaWQgQU1lc3NhZ2U6OmNsZWFyKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKKyAgICAgICAgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07CisgICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgIH0KKyAgICBtTnVtSXRlbXMgPSAwOworfQorCit2b2lkIEFNZXNzYWdlOjpmcmVlSXRlbShJdGVtICppdGVtKSB7CisgICAgc3dpdGNoIChpdGVtLT5tVHlwZSkgeworICAgICAgICBjYXNlIGtUeXBlU3RyaW5nOgorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgaXRlbS0+dS5zdHJpbmdWYWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrVHlwZU9iamVjdDoKKyAgICAgICAgY2FzZSBrVHlwZU1lc3NhZ2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpdGVtLT51LnJlZlZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpdGVtLT51LnJlZlZhbHVlLT5kZWNTdHJvbmcodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK0FNZXNzYWdlOjpJdGVtICpBTWVzc2FnZTo6YWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBuYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOworCisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChpIDwgbU51bUl0ZW1zICYmIG1JdGVtc1tpXS5tTmFtZSAhPSBuYW1lKSB7CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBJdGVtICppdGVtOworCisgICAgaWYgKGkgPCBtTnVtSXRlbXMpIHsKKyAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07CisgICAgICAgIGZyZWVJdGVtKGl0ZW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKG1OdW1JdGVtcyA8IGtNYXhOdW1JdGVtcyk7CisgICAgICAgIGkgPSBtTnVtSXRlbXMrKzsKKyAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07CisKKyAgICAgICAgaXRlbS0+bU5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHJldHVybiBpdGVtOworfQorCitjb25zdCBBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmZpbmRJdGVtKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBUeXBlIHR5cGUpIGNvbnN0IHsKKyAgICBuYW1lID0gQUF0b21pemVyOjpBdG9taXplKG5hbWUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgICAgICBjb25zdCBJdGVtICppdGVtID0gJm1JdGVtc1tpXTsKKworICAgICAgICBpZiAoaXRlbS0+bU5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW0tPm1UeXBlID09IHR5cGUgPyBpdGVtIDogTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIEJBU0lDX1RZUEUoTkFNRSxGSUVMRE5BTUUsVFlQRU5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIEFNZXNzYWdlOjpzZXQjI05BTUUoY29uc3QgY2hhciAqbmFtZSwgVFlQRU5BTUUgdmFsdWUpIHsgICAgICAgICAgICBcCisgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaXRlbS0+bVR5cGUgPSBrVHlwZSMjTkFNRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaXRlbS0+dS5GSUVMRE5BTUUgPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitib29sIEFNZXNzYWdlOjpmaW5kIyNOQU1FKGNvbnN0IGNoYXIgKm5hbWUsIFRZUEVOQU1FICp2YWx1ZSkgY29uc3QgeyAgICBcCisgICAgY29uc3QgSXRlbSAqaXRlbSA9IGZpbmRJdGVtKG5hbWUsIGtUeXBlIyNOQU1FKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGl0ZW0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICp2YWx1ZSA9IGl0ZW0tPnUuRklFTEROQU1FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0JBU0lDX1RZUEUoSW50MzIsaW50MzJWYWx1ZSxpbnQzMl90KQorQkFTSUNfVFlQRShJbnQ2NCxpbnQ2NFZhbHVlLGludDY0X3QpCitCQVNJQ19UWVBFKFNpemUsc2l6ZVZhbHVlLHNpemVfdCkKK0JBU0lDX1RZUEUoRmxvYXQsZmxvYXRWYWx1ZSxmbG9hdCkKK0JBU0lDX1RZUEUoRG91YmxlLGRvdWJsZVZhbHVlLGRvdWJsZSkKK0JBU0lDX1RZUEUoUG9pbnRlcixwdHJWYWx1ZSx2b2lkICopCisKKyN1bmRlZiBCQVNJQ19UWVBFCisKK3ZvaWQgQU1lc3NhZ2U6OnNldFN0cmluZygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcywgc3NpemVfdCBsZW4pIHsKKyAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOworICAgIGl0ZW0tPm1UeXBlID0ga1R5cGVTdHJpbmc7CisgICAgaXRlbS0+dS5zdHJpbmdWYWx1ZSA9IG5ldyBBU3RyaW5nKHMsIGxlbiA8IDAgPyBzdHJsZW4ocykgOiBsZW4pOworfQorCit2b2lkIEFNZXNzYWdlOjpzZXRPYmplY3QoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8UmVmQmFzZT4gJm9iaikgeworICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7CisgICAgaXRlbS0+bVR5cGUgPSBrVHlwZU9iamVjdDsKKworICAgIGlmIChvYmogIT0gTlVMTCkgeyBvYmotPmluY1N0cm9uZyh0aGlzKTsgfQorICAgIGl0ZW0tPnUucmVmVmFsdWUgPSBvYmouZ2V0KCk7Cit9CisKK3ZvaWQgQU1lc3NhZ2U6OnNldE1lc3NhZ2UoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvYmopIHsKKyAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOworICAgIGl0ZW0tPm1UeXBlID0ga1R5cGVNZXNzYWdlOworCisgICAgaWYgKG9iaiAhPSBOVUxMKSB7IG9iai0+aW5jU3Ryb25nKHRoaXMpOyB9CisgICAgaXRlbS0+dS5yZWZWYWx1ZSA9IG9iai5nZXQoKTsKK30KKworYm9vbCBBTWVzc2FnZTo6ZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgeworICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSBmaW5kSXRlbShuYW1lLCBrVHlwZVN0cmluZyk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgKnZhbHVlID0gKml0ZW0tPnUuc3RyaW5nVmFsdWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQU1lc3NhZ2U6OmZpbmRPYmplY3QoY29uc3QgY2hhciAqbmFtZSwgc3A8UmVmQmFzZT4gKm9iaikgY29uc3QgeworICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSBmaW5kSXRlbShuYW1lLCBrVHlwZU9iamVjdCk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgKm9iaiA9IGl0ZW0tPnUucmVmVmFsdWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQU1lc3NhZ2U6OmZpbmRNZXNzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPEFNZXNzYWdlPiAqb2JqKSBjb25zdCB7CisgICAgY29uc3QgSXRlbSAqaXRlbSA9IGZpbmRJdGVtKG5hbWUsIGtUeXBlTWVzc2FnZSk7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgKm9iaiA9IHN0YXRpY19jYXN0PEFNZXNzYWdlICo+KGl0ZW0tPnUucmVmVmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFNZXNzYWdlOjpwb3N0KGludDY0X3QgZGVsYXlVcykgeworICAgIGV4dGVybiBBTG9vcGVyUm9zdGVyIGdMb29wZXJSb3N0ZXI7CisKKyAgICBnTG9vcGVyUm9zdGVyLnBvc3RNZXNzYWdlKHRoaXMsIGRlbGF5VXMpOworfQorCitzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OmR1cCgpIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKG1XaGF0LCBtVGFyZ2V0KTsKKyAgICBtc2ctPm1OdW1JdGVtcyA9IG1OdW1JdGVtczsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKKyAgICAgICAgY29uc3QgSXRlbSAqZnJvbSA9ICZtSXRlbXNbaV07CisgICAgICAgIEl0ZW0gKnRvID0gJm1zZy0+bUl0ZW1zW2ldOworCisgICAgICAgIHRvLT5tTmFtZSA9IGZyb20tPm1OYW1lOworICAgICAgICB0by0+bVR5cGUgPSBmcm9tLT5tVHlwZTsKKworICAgICAgICBzd2l0Y2ggKGZyb20tPm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIGtUeXBlU3RyaW5nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvLT51LnN0cmluZ1ZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFTdHJpbmcoKmZyb20tPnUuc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIGtUeXBlT2JqZWN0OgorICAgICAgICAgICAgY2FzZSBrVHlwZU1lc3NhZ2U6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG8tPnUucmVmVmFsdWUgPSBmcm9tLT51LnJlZlZhbHVlOworICAgICAgICAgICAgICAgIHRvLT51LnJlZlZhbHVlLT5pbmNTdHJvbmcobXNnLmdldCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0by0+dSA9IGZyb20tPnU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRJbmRlbnQoQVN0cmluZyAqcywgaW50MzJfdCBpbmRlbnQpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0KKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKworICAgIENIRUNLX0xUKChzaXplX3QpaW5kZW50LCBzaXplb2Yoa1doaXRlc3BhY2UpKTsKKworICAgIHMtPmFwcGVuZChrV2hpdGVzcGFjZSwgaW5kZW50KTsKK30KKworc3RhdGljIGJvb2wgaXNGb3VyY2ModWludDMyX3Qgd2hhdCkgeworICAgIHJldHVybiBpc3ByaW50KHdoYXQgJiAweGZmKQorICAgICAgICAmJiBpc3ByaW50KCh3aGF0ID4+IDgpICYgMHhmZikKKyAgICAgICAgJiYgaXNwcmludCgod2hhdCA+PiAxNikgJiAweGZmKQorICAgICAgICAmJiBpc3ByaW50KCh3aGF0ID4+IDI0KSAmIDB4ZmYpOworfQorCitBU3RyaW5nIEFNZXNzYWdlOjpkZWJ1Z1N0cmluZyhpbnQzMl90IGluZGVudCkgY29uc3QgeworICAgIEFTdHJpbmcgcyA9ICJBTWVzc2FnZSh3aGF0ID0gIjsKKworICAgIEFTdHJpbmcgdG1wOworICAgIGlmIChpc0ZvdXJjYyhtV2hhdCkpIHsKKyAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICInJWMlYyVjJWMnIiwKKyAgICAgICAgICAgICAgICAoY2hhcikobVdoYXQgPj4gMjQpLAorICAgICAgICAgICAgICAgIChjaGFyKSgobVdoYXQgPj4gMTYpICYgMHhmZiksCisgICAgICAgICAgICAgICAgKGNoYXIpKChtV2hhdCA+PiA4KSAmIDB4ZmYpLAorICAgICAgICAgICAgICAgIChjaGFyKShtV2hhdCAmIDB4ZmYpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoIjB4JTA4eCIsIG1XaGF0KTsKKyAgICB9CisgICAgcy5hcHBlbmQodG1wKTsKKworICAgIGlmIChtVGFyZ2V0ICE9IDApIHsKKyAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKCIsIHRhcmdldCA9ICVkIiwgbVRhcmdldCk7CisgICAgICAgIHMuYXBwZW5kKHRtcCk7CisgICAgfQorICAgIHMuYXBwZW5kKCIpID0ge1xuIik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1JdGVtczsgKytpKSB7CisgICAgICAgIGNvbnN0IEl0ZW0gJml0ZW0gPSBtSXRlbXNbaV07CisKKyAgICAgICAgc3dpdGNoIChpdGVtLm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIGtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgImludDMyX3QgJXMgPSAlZCIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5pbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50NjRfdCAlcyA9ICVsbGQiLCBpdGVtLm1OYW1lLCBpdGVtLnUuaW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGtUeXBlU2l6ZToKKyAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZV90ICVzID0gJWQiLCBpdGVtLm1OYW1lLCBpdGVtLnUuc2l6ZVZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVGbG9hdDoKKyAgICAgICAgICAgICAgICB0bXAgPSBTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQgJXMgPSAlZiIsIGl0ZW0ubU5hbWUsIGl0ZW0udS5mbG9hdFZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSAlcyA9ICVmIiwgaXRlbS5tTmFtZSwgaXRlbS51LmRvdWJsZVZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVQb2ludGVyOgorICAgICAgICAgICAgICAgIHRtcCA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2b2lkIColcyA9ICVwIiwgaXRlbS5tTmFtZSwgaXRlbS51LnB0clZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyAlcyA9IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS51LnN0cmluZ1ZhbHVlLT5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga1R5cGVPYmplY3Q6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlZkJhc2UgKiVzID0gJXAiLCBpdGVtLm1OYW1lLCBpdGVtLnUucmVmVmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrVHlwZU1lc3NhZ2U6CisgICAgICAgICAgICAgICAgdG1wID0gU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgIkFNZXNzYWdlICVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFNZXNzYWdlICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0udS5yZWZWYWx1ZSktPmRlYnVnU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyBzdHJsZW4oaXRlbS5tTmFtZSkgKyAxNCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIH0KKworICAgICAgICBhcHBlbmRJbmRlbnQoJnMsIGluZGVudCk7CisgICAgICAgIHMuYXBwZW5kKCIgICIpOworICAgICAgICBzLmFwcGVuZCh0bXApOworICAgICAgICBzLmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBhcHBlbmRJbmRlbnQoJnMsIGluZGVudCk7CisgICAgcy5hcHBlbmQoIn0iKTsKKworICAgIHJldHVybiBzOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiNzZjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiQURlYnVnLmgiCisjaW5jbHVkZSAiQVN0cmluZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworY29uc3QgY2hhciAqQVN0cmluZzo6a0VtcHR5U3RyaW5nID0gIiI7CisKK0FTdHJpbmc6OkFTdHJpbmcoKQorICAgIDogbURhdGEoKGNoYXIgKilrRW1wdHlTdHJpbmcpLAorICAgICAgbVNpemUoMCksCisgICAgICBtQWxsb2NTaXplKDEpIHsKK30KKworQVN0cmluZzo6QVN0cmluZyhjb25zdCBjaGFyICpzKQorICAgIDogbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1BbGxvY1NpemUoMSkgeworICAgIHNldFRvKHMpOworfQorCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBzaXplKQorICAgIDogbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1BbGxvY1NpemUoMSkgeworICAgIHNldFRvKHMsIHNpemUpOworfQorCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20pCisgICAgOiBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUFsbG9jU2l6ZSgxKSB7CisgICAgc2V0VG8oZnJvbSwgMCwgZnJvbS5zaXplKCkpOworfQorCitBU3RyaW5nOjpBU3RyaW5nKGNvbnN0IEFTdHJpbmcgJmZyb20sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBuKQorICAgIDogbURhdGEoTlVMTCksCisgICAgICBtU2l6ZSgwKSwKKyAgICAgIG1BbGxvY1NpemUoMSkgeworICAgIHNldFRvKGZyb20sIG9mZnNldCwgbik7Cit9CisKK0FTdHJpbmc6On5BU3RyaW5nKCkgeworICAgIGNsZWFyKCk7Cit9CisKK0FTdHJpbmcgJkFTdHJpbmc6Om9wZXJhdG9yPShjb25zdCBBU3RyaW5nICZmcm9tKSB7CisgICAgaWYgKCZmcm9tICE9IHRoaXMpIHsKKyAgICAgICAgc2V0VG8oZnJvbSwgMCwgZnJvbS5zaXplKCkpOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworc2l6ZV90IEFTdHJpbmc6OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TaXplOworfQorCitjb25zdCBjaGFyICpBU3RyaW5nOjpjX3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGE7Cit9CisKK2Jvb2wgQVN0cmluZzo6ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TaXplID09IDA7Cit9CisKK3ZvaWQgQVN0cmluZzo6c2V0VG8oY29uc3QgY2hhciAqcykgeworICAgIHNldFRvKHMsIHN0cmxlbihzKSk7Cit9CisKK3ZvaWQgQVN0cmluZzo6c2V0VG8oY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemUpIHsKKyAgICBjbGVhcigpOworICAgIGFwcGVuZChzLCBzaXplKTsKK30KKwordm9pZCBBU3RyaW5nOjpzZXRUbyhjb25zdCBBU3RyaW5nICZmcm9tLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbikgeworICAgIENIRUNLKCZmcm9tICE9IHRoaXMpOworCisgICAgY2xlYXIoKTsKKyAgICBzZXRUbyhmcm9tLm1EYXRhICsgb2Zmc2V0LCBuKTsKK30KKwordm9pZCBBU3RyaW5nOjpjbGVhcigpIHsKKyAgICBpZiAobURhdGEgJiYgbURhdGEgIT0ga0VtcHR5U3RyaW5nKSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBtRGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgbURhdGEgPSAoY2hhciAqKWtFbXB0eVN0cmluZzsKKyAgICBtU2l6ZSA9IDA7CisgICAgbUFsbG9jU2l6ZSA9IDE7Cit9CisKK3NpemVfdCBBU3RyaW5nOjpoYXNoKCkgY29uc3QgeworICAgIHNpemVfdCB4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TaXplOyArK2kpIHsKKyAgICAgICAgeCA9ICh4ICogMzEpICsgbURhdGFbaV07CisgICAgfQorCisgICAgcmV0dXJuIHg7Cit9CisKK2Jvb2wgQVN0cmluZzo6b3BlcmF0b3I9PShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBtU2l6ZSA9PSBvdGhlci5tU2l6ZSAmJiAhbWVtY21wKG1EYXRhLCBvdGhlci5tRGF0YSwgbVNpemUpOworfQorCit2b2lkIEFTdHJpbmc6OnRyaW0oKSB7CisgICAgbWFrZU11dGFibGUoKTsKKworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IG1TaXplICYmIGlzc3BhY2UobURhdGFbaV0pKSB7CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBzaXplX3QgaiA9IG1TaXplOworICAgIHdoaWxlIChqID4gaSAmJiBpc3NwYWNlKG1EYXRhW2ogLSAxXSkpIHsKKyAgICAgICAgLS1qOworICAgIH0KKworICAgIG1lbW1vdmUobURhdGEsICZtRGF0YVtpXSwgaiAtIGkpOworICAgIG1TaXplID0gaiAtIGk7CisgICAgbURhdGFbbVNpemVdID0gJ1wwJzsKK30KKwordm9pZCBBU3RyaW5nOjplcmFzZShzaXplX3Qgc3RhcnQsIHNpemVfdCBuKSB7CisgICAgQ0hFQ0tfTFQoc3RhcnQsIG1TaXplKTsKKyAgICBDSEVDS19MRShzdGFydCArIG4sIG1TaXplKTsKKworICAgIG1ha2VNdXRhYmxlKCk7CisKKyAgICBtZW1tb3ZlKCZtRGF0YVtzdGFydF0sICZtRGF0YVtzdGFydCArIG5dLCBtU2l6ZSAtIHN0YXJ0IC0gbik7CisgICAgbVNpemUgLT0gbjsKKyAgICBtRGF0YVttU2l6ZV0gPSAnXDAnOworfQorCit2b2lkIEFTdHJpbmc6Om1ha2VNdXRhYmxlKCkgeworICAgIGlmIChtRGF0YSA9PSBrRW1wdHlTdHJpbmcpIHsKKyAgICAgICAgbURhdGEgPSBzdHJkdXAoa0VtcHR5U3RyaW5nKTsKKyAgICB9Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBhcHBlbmQocywgc3RybGVuKHMpKTsKK30KKwordm9pZCBBU3RyaW5nOjphcHBlbmQoY29uc3QgY2hhciAqcywgc2l6ZV90IHNpemUpIHsKKyAgICBtYWtlTXV0YWJsZSgpOworCisgICAgaWYgKG1TaXplICsgc2l6ZSArIDEgPiBtQWxsb2NTaXplKSB7CisgICAgICAgIG1BbGxvY1NpemUgPSAobUFsbG9jU2l6ZSArIHNpemUgKyAzMSkgJiAtMzI7CisgICAgICAgIG1EYXRhID0gKGNoYXIgKilyZWFsbG9jKG1EYXRhLCBtQWxsb2NTaXplKTsKKyAgICAgICAgQ0hFQ0sobURhdGEgIT0gTlVMTCk7CisgICAgfQorCisgICAgbWVtY3B5KCZtRGF0YVttU2l6ZV0sIHMsIHNpemUpOworICAgIG1TaXplICs9IHNpemU7CisgICAgbURhdGFbbVNpemVdID0gJ1wwJzsKK30KKwordm9pZCBBU3RyaW5nOjphcHBlbmQoY29uc3QgQVN0cmluZyAmZnJvbSkgeworICAgIGFwcGVuZChmcm9tLmNfc3RyKCksIGZyb20uc2l6ZSgpKTsKK30KKwordm9pZCBBU3RyaW5nOjphcHBlbmQoY29uc3QgQVN0cmluZyAmZnJvbSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pIHsKKyAgICBhcHBlbmQoZnJvbS5jX3N0cigpICsgb2Zmc2V0LCBuKTsKK30KKwordm9pZCBBU3RyaW5nOjphcHBlbmQoaW50IHgpIHsKKyAgICBjaGFyIHNbMTZdOworICAgIHNwcmludGYocywgIiVkIiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIHgpIHsKKyAgICBjaGFyIHNbMTZdOworICAgIHNwcmludGYocywgIiV1IiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGxvbmcgeCkgeworICAgIGNoYXIgc1sxNl07CisgICAgc3ByaW50ZihzLCAiJWxkIiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIGxvbmcgeCkgeworICAgIGNoYXIgc1sxNl07CisgICAgc3ByaW50ZihzLCAiJWx1IiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGxvbmcgbG9uZyB4KSB7CisgICAgY2hhciBzWzMyXTsKKyAgICBzcHJpbnRmKHMsICIlbGxkIiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKHVuc2lnbmVkIGxvbmcgbG9uZyB4KSB7CisgICAgY2hhciBzWzMyXTsKKyAgICBzcHJpbnRmKHMsICIlbGx1IiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGZsb2F0IHgpIHsKKyAgICBjaGFyIHNbMTZdOworICAgIHNwcmludGYocywgIiVmIiwgeCk7CisKKyAgICBhcHBlbmQocyk7Cit9CisKK3ZvaWQgQVN0cmluZzo6YXBwZW5kKGRvdWJsZSB4KSB7CisgICAgY2hhciBzWzE2XTsKKyAgICBzcHJpbnRmKHMsICIlZiIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCit2b2lkIEFTdHJpbmc6OmFwcGVuZCh2b2lkICp4KSB7CisgICAgY2hhciBzWzE2XTsKKyAgICBzcHJpbnRmKHMsICIlcCIsIHgpOworCisgICAgYXBwZW5kKHMpOworfQorCitzc2l6ZV90IEFTdHJpbmc6OmZpbmQoY29uc3QgY2hhciAqc3Vic3RyaW5nLCBzaXplX3Qgc3RhcnQpIGNvbnN0IHsKKyAgICBDSEVDS19MRShzdGFydCwgc2l6ZSgpKTsKKworICAgIGNvbnN0IGNoYXIgKm1hdGNoID0gc3Ryc3RyKG1EYXRhICsgc3RhcnQsIHN1YnN0cmluZyk7CisKKyAgICBpZiAobWF0Y2ggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIG1hdGNoIC0gbURhdGE7Cit9CisKK3ZvaWQgQVN0cmluZzo6aW5zZXJ0KGNvbnN0IEFTdHJpbmcgJmZyb20sIHNpemVfdCBpbnNlcnRpb25Qb3MpIHsKKyAgICBpbnNlcnQoZnJvbS5jX3N0cigpLCBmcm9tLnNpemUoKSwgaW5zZXJ0aW9uUG9zKTsKK30KKwordm9pZCBBU3RyaW5nOjppbnNlcnQoY29uc3QgY2hhciAqZnJvbSwgc2l6ZV90IHNpemUsIHNpemVfdCBpbnNlcnRpb25Qb3MpIHsKKyAgICBDSEVDS19HRShpbnNlcnRpb25Qb3MsIDB1KTsKKyAgICBDSEVDS19MRShpbnNlcnRpb25Qb3MsIG1TaXplKTsKKworICAgIG1ha2VNdXRhYmxlKCk7CisKKyAgICBpZiAobVNpemUgKyBzaXplICsgMSA+IG1BbGxvY1NpemUpIHsKKyAgICAgICAgbUFsbG9jU2l6ZSA9IChtQWxsb2NTaXplICsgc2l6ZSArIDMxKSAmIC0zMjsKKyAgICAgICAgbURhdGEgPSAoY2hhciAqKXJlYWxsb2MobURhdGEsIG1BbGxvY1NpemUpOworICAgICAgICBDSEVDSyhtRGF0YSAhPSBOVUxMKTsKKyAgICB9CisKKyAgICBtZW1tb3ZlKCZtRGF0YVtpbnNlcnRpb25Qb3MgKyBzaXplXSwKKyAgICAgICAgICAgICZtRGF0YVtpbnNlcnRpb25Qb3NdLCBtU2l6ZSAtIGluc2VydGlvblBvcyArIDEpOworCisgICAgbWVtY3B5KCZtRGF0YVtpbnNlcnRpb25Qb3NdLCBmcm9tLCBzaXplKTsKKworICAgIG1TaXplICs9IHNpemU7Cit9CisKK2Jvb2wgQVN0cmluZzo6b3BlcmF0b3I8KGNvbnN0IEFTdHJpbmcgJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmUob3RoZXIpIDwgMDsKK30KKworYm9vbCBBU3RyaW5nOjpvcGVyYXRvcj4oY29uc3QgQVN0cmluZyAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZShvdGhlcikgPiAwOworfQorCitpbnQgQVN0cmluZzo6Y29tcGFyZShjb25zdCBBU3RyaW5nICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBzdHJjbXAobURhdGEsIG90aGVyLm1EYXRhKTsKK30KKwordm9pZCBBU3RyaW5nOjp0b2xvd2VyKCkgeworICAgIG1ha2VNdXRhYmxlKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TaXplOyArK2kpIHsKKyAgICAgICAgbURhdGFbaV0gPSA6OnRvbG93ZXIobURhdGFbaV0pOworICAgIH0KK30KKworYm9vbCBBU3RyaW5nOjpzdGFydHNXaXRoKGNvbnN0IGNoYXIgKnByZWZpeCkgY29uc3QgeworICAgIHJldHVybiAhc3RybmNtcChtRGF0YSwgcHJlZml4LCBzdHJsZW4ocHJlZml4KSk7Cit9CisKK0FTdHJpbmcgU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CisKKyAgICB2YV9lbmQoYXApOworCisgICAgQVN0cmluZyByZXN1bHQoYnVmZmVyKTsKKworICAgIGZyZWUoYnVmZmVyKTsKKyAgICBidWZmZXIgPSBOVUxMOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YThhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNyBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCisgICAgQUF0b21pemVyLmNwcCAgICAgICAgICAgICAgIFwKKyAgICBBQml0UmVhZGVyLmNwcCAgICAgICAgICAgICAgXAorICAgIEFCdWZmZXIuY3BwICAgICAgICAgICAgICAgICBcCisgICAgQURlYnVnLmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICBBSGFuZGxlci5jcHAgICAgICAgICAgICAgICAgXAorICAgIEFMb29wZXIuY3BwICAgICAgICAgICAgICAgICBcCisgICAgQUxvb3BlclJvc3Rlci5jcHAgICAgICAgICAgIFwKKyAgICBBTWVzc2FnZS5jcHAgICAgICAgICAgICAgICAgXAorICAgIEFTdHJpbmcuY3BwICAgICAgICAgICAgICAgICBcCisgICAgYmFzZTY0LmNwcCAgICAgICAgICAgICAgICAgIFwKKyAgICBoZXhkdW1wLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24KKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYmJpbmRlciAgICAgICAgIFwKKyAgICAgICAgbGlibWVkaWEgICAgICAgICAgXAorICAgICAgICBsaWJ1dGlscyAgICAgICAgICBcCisgICAgICAgIGxpYmN1dGlscyAgICAgICAgIFwKKyAgICAgICAgbGlidWkgICAgICAgICAgICAgXAorICAgICAgICBsaWJzb25pdm94ICAgICAgICBcCisgICAgICAgIGxpYnZvcmJpc2lkZWMgICAgIFwKKyAgICAgICAgbGlic3VyZmFjZWZsaW5nZXJfY2xpZW50IFwKKyAgICAgICAgbGliY2FtZXJhX2NsaWVudAorCitMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgorCitMT0NBTF9QUkVMSU5LX01PRFVMRTo9IGZhbHNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWZiNGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImJhc2U2NC5oIgorCisjaW5jbHVkZSAiQUJ1ZmZlci5oIgorI2luY2x1ZGUgIkFEZWJ1Zy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKSB7CisgICAgaWYgKChzLnNpemUoKSAlIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IG4gPSBzLnNpemUoKTsKKyAgICBzaXplX3QgcGFkZGluZyA9IDA7CisgICAgaWYgKG4gPj0gMSAmJiBzLmNfc3RyKClbbiAtIDFdID09ICc9JykgeworICAgICAgICBwYWRkaW5nID0gMTsKKworICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgICAgICBwYWRkaW5nID0gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBvdXRMZW4gPSAzICogcy5zaXplKCkgLyA0IC0gcGFkZGluZzsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7CisKKyAgICB1aW50OF90ICpvdXQgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3QgaiA9IDA7CisgICAgdWludDMyX3QgYWNjdW0gPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGNoYXIgYyA9IHMuY19zdHIoKVtpXTsKKyAgICAgICAgdW5zaWduZWQgdmFsdWU7CisgICAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICAgICAgdmFsdWUgPSBjIC0gJ0EnOworICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgICAgICAgICB2YWx1ZSA9IDI2ICsgYyAtICdhJzsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgdmFsdWUgPSA1MiArIGMgLSAnMCc7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKycpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNjI7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLycpIHsKKyAgICAgICAgICAgIHZhbHVlID0gNjM7CisgICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnPScpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGkgPCBuIC0gcGFkZGluZykgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YWx1ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBhY2N1bSA9IChhY2N1bSA8PCA2KSB8IHZhbHVlOworCisgICAgICAgIGlmICgoKGkgKyAxKSAlIDQpID09IDApIHsKKyAgICAgICAgICAgIG91dFtqKytdID0gKGFjY3VtID4+IDE2KTsKKworICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSAoYWNjdW0gPj4gOCkgJiAweGZmOyB9IAorICAgICAgICAgICAgaWYgKGogPCBvdXRMZW4pIHsgb3V0W2orK10gPSBhY2N1bSAmIDB4ZmY7IH0KKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CisgICAgaWYgKHggPD0gMjUpIHsKKyAgICAgICAgcmV0dXJuICdBJyArIHg7CisgICAgfSBlbHNlIGlmICh4IDw9IDUxKSB7CisgICAgICAgIHJldHVybiAnYScgKyB4IC0gMjY7CisgICAgfSBlbHNlIGlmICh4IDw9IDYxKSB7CisgICAgICAgIHJldHVybiAnMCcgKyB4IC0gNTI7CisgICAgfSBlbHNlIGlmICh4ID09IDYyKSB7CisgICAgICAgIHJldHVybiAnKyc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICcvJzsKKyAgICB9Cit9CisKK3ZvaWQgZW5jb2RlQmFzZTY0KAorICAgICAgICBjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUsIEFTdHJpbmcgKm91dCkgeworICAgIG91dC0+Y2xlYXIoKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKV9kYXRhOworCisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IChzaXplIC8gMykgKiAzOyBpICs9IDMpIHsKKyAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgdWludDhfdCB4MyA9IGRhdGFbaSArIDJdOworCisgICAgICAgIG91dC0+YXBwZW5kKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICBvdXQtPmFwcGVuZChlbmNvZGU2Qml0KCh4MSA8PCA0IHwgeDIgPj4gNCkgJiAweDNmKSk7CisgICAgICAgIG91dC0+YXBwZW5kKGVuY29kZTZCaXQoKHgyIDw8IDIgfCB4MyA+PiA2KSAmIDB4M2YpKTsKKyAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCh4MyAmIDB4M2YpKTsKKyAgICB9CisgICAgc3dpdGNoIChzaXplICUgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50OF90IHgxID0gZGF0YVtpXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgeDIgPSBkYXRhW2kgKyAxXTsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKGVuY29kZTZCaXQoeDEgPj4gMikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCgoeDEgPDwgNCB8IHgyID4+IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoZW5jb2RlNkJpdCgoeDIgPDwgMikgJiAweDNmKSk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCgnPScpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCB4MSA9IGRhdGFbaV07CisgICAgICAgICAgICBvdXQtPmFwcGVuZChlbmNvZGU2Qml0KHgxID4+IDIpKTsKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKGVuY29kZTZCaXQoKHgxIDw8IDQpICYgMHgzZikpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQoIj09Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5M2I1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaGV4ZHVtcC5oIgorCisjaW5jbHVkZSAiQURlYnVnLmgiCisjaW5jbHVkZSAiQVN0cmluZy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3ZvaWQgaGV4ZHVtcChjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilfZGF0YTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIEFTdHJpbmcgbGluZTsKKworICAgICAgICBjaGFyIHRtcFszMl07CisgICAgICAgIHNwcmludGYodG1wLCAiJTA4bHg6ICAiLCAodW5zaWduZWQgbG9uZylvZmZzZXQpOworCisgICAgICAgIGxpbmUuYXBwZW5kKHRtcCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBpZiAoaSA9PSA4KSB7CisgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBpID49IHNpemUpIHsKKyAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCgiICAgIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJTAyeCAiLCBkYXRhW29mZnNldCArIGldKTsKKyAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCh0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGluZS5hcHBlbmQoJyAnKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBpID49IHNpemUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzcHJpbnQoZGF0YVtvZmZzZXQgKyBpXSkpIHsKKyAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZCgoY2hhcilkYXRhW29mZnNldCArIGldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExPRyhJTkZPKSA8PCBsaW5lOworCisgICAgICAgIG9mZnNldCArPSAxNjsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZTJjODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAorICAgICAgICBMaXZlU291cmNlLmNwcCAgXAorICAgICAgICBNM1VQYXJzZXIuY3BwICAgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorCSQoSk5JX0hfSU5DTFVERSkgXAorCSQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2Jhc2UvbWVkaWEvbGlic3RhZ2VmcmlnaHQKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUKKworaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQorICAgIExPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCitlbmRpZgorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWFmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU291cmNlLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTGl2ZVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgImluY2x1ZGUvTGl2ZVNvdXJjZS5oIgorI2luY2x1ZGUgImluY2x1ZGUvTTNVUGFyc2VyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9OdUhUVFBEYXRhU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTGl2ZVNvdXJjZTo6TGl2ZVNvdXJjZShjb25zdCBjaGFyICp1cmwpCisgICAgOiBtVVJMKHVybCksCisgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbVBsYXlsaXN0SW5kZXgoMCksCisgICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSwKKyAgICAgIG1Tb3VyY2UobmV3IE51SFRUUERhdGFTb3VyY2UpLAorICAgICAgbVNvdXJjZVNpemUoMCksCisgICAgICBtT2Zmc2V0QmlhcygwKSB7CisgICAgaWYgKHN3aXRjaFRvTmV4dCgpKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9Cit9CisKK0xpdmVTb3VyY2U6On5MaXZlU291cmNlKCkgeworfQorCitzdGF0dXNfdCBMaXZlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK2Jvb2wgTGl2ZVNvdXJjZTo6bG9hZFBsYXlsaXN0KCkgeworICAgIG1QbGF5bGlzdC5jbGVhcigpOworICAgIG1QbGF5bGlzdEluZGV4ID0gMDsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBmZXRjaE0zVShtVVJMLmNfc3RyKCksICZidWZmZXIpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbVBsYXlsaXN0ID0gbmV3IE0zVVBhcnNlcihtVVJMLmNfc3RyKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAobVBsYXlsaXN0LT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICJtZWRpYS1zZXF1ZW5jZSIsICZtRmlyc3RJdGVtU2VxdWVuY2VOdW1iZXIpKSB7CisgICAgICAgIG1GaXJzdEl0ZW1TZXF1ZW5jZU51bWJlciA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwbGw7Cit9CisKK2Jvb2wgTGl2ZVNvdXJjZTo6c3dpdGNoVG9OZXh0KCkgeworICAgIG1PZmZzZXRCaWFzICs9IG1Tb3VyY2VTaXplOworICAgIG1Tb3VyY2VTaXplID0gMDsKKworICAgIGlmIChtTGFzdEZldGNoVGltZVVzIDwgMCB8fCBnZXROb3dVcygpID49IG1MYXN0RmV0Y2hUaW1lVXMgKyAxNTAwMDAwMGxsCisgICAgICAgIHx8IG1QbGF5bGlzdEluZGV4ID09IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgIGludDMyX3QgbmV4dFNlcXVlbmNlTnVtYmVyID0KKyAgICAgICAgICAgIG1QbGF5bGlzdEluZGV4ICsgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyOworCisgICAgICAgIGlmICghbG9hZFBsYXlsaXN0KCkpIHsKKyAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byByZWxvYWQgcGxheWxpc3QiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtTGFzdEZldGNoVGltZVVzIDwgMCkgeworICAgICAgICAgICAgbVBsYXlsaXN0SW5kZXggPSBtUGxheWxpc3QtPnNpemUoKSAvIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobmV4dFNlcXVlbmNlTnVtYmVyIDwgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHx8IG5leHRTZXF1ZW5jZU51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgID49IG1GaXJzdEl0ZW1TZXF1ZW5jZU51bWJlciArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQ2Fubm90IGZpbmQgc2VxdWVuY2UgbnVtYmVyICVkIGluIG5ldyBwbGF5bGlzdCIsCisgICAgICAgICAgICAgICAgICAgICBuZXh0U2VxdWVuY2VOdW1iZXIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUGxheWxpc3RJbmRleCA9IG5leHRTZXF1ZW5jZU51bWJlciAtIG1GaXJzdEl0ZW1TZXF1ZW5jZU51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXN0RmV0Y2hUaW1lVXMgPSBnZXROb3dVcygpOworICAgIH0KKworICAgIEFTdHJpbmcgdXJpOworICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KG1QbGF5bGlzdEluZGV4LCAmdXJpKSk7CisgICAgTE9HSSgic3dpdGNoaW5nIHRvICVzIiwgdXJpLmNfc3RyKCkpOworCisgICAgaWYgKG1Tb3VyY2UtPmNvbm5lY3QodXJpLmNfc3RyKCkpICE9IE9LCisgICAgICAgICAgICB8fCBtU291cmNlLT5nZXRTaXplKCZtU291cmNlU2l6ZSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1QbGF5bGlzdEluZGV4Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NzaXplX3QgTGl2ZVNvdXJjZTo6cmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBDSEVDSyhvZmZzZXQgPj0gbU9mZnNldEJpYXMpOworICAgIG9mZnNldCAtPSBtT2Zmc2V0QmlhczsKKworICAgIGlmIChvZmZzZXQgPj0gbVNvdXJjZVNpemUpIHsKKyAgICAgICAgQ0hFQ0tfRVEob2Zmc2V0LCBtU291cmNlU2l6ZSk7CisKKyAgICAgICAgb2Zmc2V0IC09IG1Tb3VyY2VTaXplOworICAgICAgICBpZiAoIXN3aXRjaFRvTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBudW1SZWFkID0gMDsKKyAgICB3aGlsZSAobnVtUmVhZCA8IHNpemUpIHsKKyAgICAgICAgc3NpemVfdCBuID0gbVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCArIG51bVJlYWQsICh1aW50OF90ICopZGF0YSArIG51bVJlYWQsIHNpemUgLSBudW1SZWFkKTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG51bVJlYWQgKz0gbjsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtUmVhZDsKK30KKworc3RhdHVzX3QgTGl2ZVNvdXJjZTo6ZmV0Y2hNM1UoY29uc3QgY2hhciAqdXJsLCBzcDxBQnVmZmVyPiAqb3V0KSB7CisgICAgKm91dCA9IE5VTEw7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtU291cmNlLT5jb25uZWN0KHVybCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgb2ZmX3Qgc2l6ZTsKKyAgICBlcnIgPSBtU291cmNlLT5nZXRTaXplKCZzaXplKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgKHNpemVfdClzaXplKSB7CisgICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBvZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBzaXplIC0gb2Zmc2V0KTsKKworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gbjsKKyAgICB9CisKKyAgICAqb3V0ID0gYnVmZmVyOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkODY0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiaW5jbHVkZS9NM1VQYXJzZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNM1VQYXJzZXI6Ok0zVVBhcnNlcigKKyAgICAgICAgY29uc3QgY2hhciAqYmFzZVVSSSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCisgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAorICAgICAgbUJhc2VVUkkoYmFzZVVSSSksCisgICAgICBtSXNFeHRNM1UoZmFsc2UpLAorICAgICAgbUlzVmFyaWFudFBsYXlsaXN0KGZhbHNlKSB7CisgICAgbUluaXRDaGVjayA9IHBhcnNlKGRhdGEsIHNpemUpOworfQorCitNM1VQYXJzZXI6On5NM1VQYXJzZXIoKSB7Cit9CisKK3N0YXR1c190IE0zVVBhcnNlcjo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitib29sIE0zVVBhcnNlcjo6aXNFeHRNM1UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0V4dE0zVTsKK30KKworYm9vbCBNM1VQYXJzZXI6OmlzVmFyaWFudFBsYXlsaXN0KCkgY29uc3QgeworICAgIHJldHVybiBtSXNWYXJpYW50UGxheWxpc3Q7Cit9CisKK3NwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Om1ldGEoKSB7CisgICAgcmV0dXJuIG1NZXRhOworfQorCitzaXplX3QgTTNVUGFyc2VyOjpzaXplKCkgeworICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOworfQorCitib29sIE0zVVBhcnNlcjo6aXRlbUF0KHNpemVfdCBpbmRleCwgQVN0cmluZyAqdXJpLCBzcDxBTWVzc2FnZT4gKm1ldGEpIHsKKyAgICB1cmktPmNsZWFyKCk7CisgICAgaWYgKG1ldGEpIHsgKm1ldGEgPSBOVUxMOyB9CisKKyAgICBpZiAoaW5kZXggPj0gbUl0ZW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisKKyAgICBpZiAobWV0YSkgeworICAgICAgICAqbWV0YSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1NZXRhOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBNYWtlVVJMKGNvbnN0IGNoYXIgKmJhc2VVUkwsIGNvbnN0IGNoYXIgKnVybCwgQVN0cmluZyAqb3V0KSB7CisgICAgb3V0LT5jbGVhcigpOworCisgICAgaWYgKHN0cm5jYXNlY21wKCJodHRwOi8vIiwgYmFzZVVSTCwgNykpIHsKKyAgICAgICAgLy8gQmFzZSBVUkwgbXVzdCBiZSBhYnNvbHV0ZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVybCwgNykpIHsKKyAgICAgICAgLy8gInVybCIgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwsIGlnbm9yZSBiYXNlIFVSTC4KKyAgICAgICAgb3V0LT5zZXRUbyh1cmwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzaXplX3QgbiA9IHN0cmxlbihiYXNlVVJMKTsKKyAgICBpZiAoYmFzZVVSTFtuIC0gMV0gPT0gJy8nKSB7CisgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisKKyAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCwgc2xhc2hQb3MgLSBiYXNlVVJMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgIH0KKworICAgICAgICBvdXQtPmFwcGVuZCgiLyIpOworICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBNM1VQYXJzZXI6OnBhcnNlKGNvbnN0IHZvaWQgKl9kYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGludDMyX3QgbGluZU5vID0gMDsKKworICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKworICAgIGNvbnN0IGNoYXIgKmRhdGEgPSAoY29uc3QgY2hhciAqKV9kYXRhOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBvZmZzZXRMRiA9IG9mZnNldDsKKyAgICAgICAgd2hpbGUgKG9mZnNldExGIDwgc2l6ZSAmJiBkYXRhW29mZnNldExGXSAhPSAnXG4nKSB7CisgICAgICAgICAgICArK29mZnNldExGOworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXRMRiA+PSBzaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcgbGluZTsKKyAgICAgICAgaWYgKG9mZnNldExGID4gb2Zmc2V0ICYmIGRhdGFbb2Zmc2V0TEYgLSAxXSA9PSAnXHInKSB7CisgICAgICAgICAgICBsaW5lLnNldFRvKCZkYXRhW29mZnNldF0sIG9mZnNldExGIC0gb2Zmc2V0IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsaW5lLnNldFRvKCZkYXRhW29mZnNldF0sIG9mZnNldExGIC0gb2Zmc2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIExPR0koIiMlcyMiLCBsaW5lLmNfc3RyKCkpOworCisgICAgICAgIGlmIChsaW5lTm8gPT0gMCAmJiBsaW5lID09ICIjRVhUTTNVIikgeworICAgICAgICAgICAgbUlzRXh0TTNVID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSXNFeHRNM1UpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtVEFSR0VURFVSQVRJT04iKSkgeworICAgICAgICAgICAgICAgIGlmIChtSXNWYXJpYW50UGxheWxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VNZXRhRGF0YShsaW5lLCAmbU1ldGEsICJ0YXJnZXQtZHVyYXRpb24iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCIjRVhULVgtTUVESUEtU0VRVUVOQ0UiKSkgeworICAgICAgICAgICAgICAgIGlmIChtSXNWYXJpYW50UGxheWxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VNZXRhRGF0YShsaW5lLCAmbU1ldGEsICJtZWRpYS1zZXF1ZW5jZSIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFRJTkYiKSkgeworICAgICAgICAgICAgICAgIGlmIChtSXNWYXJpYW50UGxheWxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VNZXRhRGF0YShsaW5lLCAmaXRlbU1ldGEsICJkdXJhdGlvbiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1TVFJFQU0tSU5GIikpIHsKKyAgICAgICAgICAgICAgICBpZiAobU1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtSXNWYXJpYW50UGxheWxpc3QgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCIjIikpIHsKKyAgICAgICAgICAgIGlmICghbUlzVmFyaWFudFBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkdXJhdGlvblNlY3M7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1NZXRhID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpdGVtTWV0YS0+ZmluZEludDMyKCJkdXJhdGlvbiIsICZkdXJhdGlvblNlY3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtSXRlbXMucHVzaCgpOworICAgICAgICAgICAgSXRlbSAqaXRlbSA9ICZtSXRlbXMuZWRpdEl0ZW1BdChtSXRlbXMuc2l6ZSgpIC0gMSk7CisKKyAgICAgICAgICAgIENIRUNLKE1ha2VVUkwobUJhc2VVUkkuY19zdHIoKSwgbGluZS5jX3N0cigpLCAmaXRlbS0+bVVSSSkpOworCisgICAgICAgICAgICBpdGVtLT5tTWV0YSA9IGl0ZW1NZXRhOworCisgICAgICAgICAgICBpdGVtTWV0YS5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0TEYgKyAxOworICAgICAgICArK2xpbmVObzsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIHN0YXRpYworc3RhdHVzX3QgTTNVUGFyc2VyOjpwYXJzZU1ldGFEYXRhKAorICAgICAgICBjb25zdCBBU3RyaW5nICZsaW5lLCBzcDxBTWVzc2FnZT4gKm1ldGEsIGNvbnN0IGNoYXIgKmtleSkgeworICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKKworICAgIGlmIChjb2xvblBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpbnQzMl90IHg7CisgICAgc3RhdHVzX3QgZXJyID0gUGFyc2VJbnQzMihsaW5lLmNfc3RyKCkgKyBjb2xvblBvcyArIDEsICZ4KTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAobWV0YS0+Z2V0KCkgPT0gTlVMTCkgeworICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKKyAgICB9CisgICAgKCptZXRhKS0+c2V0SW50MzIoa2V5LCB4KTsKKworICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBNM1VQYXJzZXI6OlBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCkgeworICAgIGNoYXIgKmVuZDsKKyAgICBsb25nIGx2YWwgPSBzdHJ0b2wocywgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBzIHx8ICgqZW5kICE9ICdcMCcgJiYgKmVuZCAhPSAnLCcpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgKnggPSAoaW50MzJfdClsdmFsOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawppbmRleCA5M2ZhYzFjLi4yM2M4ZTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDMgQEAKLWlmZXEgKCQoQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUKSx0cnVlKQotCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC0yOCw1ICsyNiwzIEBACiBMT0NBTF9NT0RVTEUgOj0gdGVzdGlkMwogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggY2EwYzY4Yy4uZGEzNDBmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTE0MiwxMSArMTQyLDIyIEBACiAgICAgbVNpemUgPSBzaXplOwogCiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KHNpemVvZihoZWFkZXIpLCBtRGF0YSwgbVNpemUpICE9IChzc2l6ZV90KW1TaXplKSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBtRGF0YSA9IE5VTEw7CisKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChoZWFkZXIuZmxhZ3MgJiAweDgwKSB7CisgICAgaWYgKGhlYWRlci52ZXJzaW9uX21ham9yID09IDQpIHsKKyAgICAgICAgaWYgKCFyZW1vdmVVbnN5bmNocm9uaXphdGlvblYyXzQoKSkgeworICAgICAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgICAgICBtRGF0YSA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaGVhZGVyLmZsYWdzICYgMHg4MCkgewogICAgICAgICBMT0dWKCJyZW1vdmluZyB1bnN5bmNocm9uaXphdGlvbiIpOworCiAgICAgICAgIHJlbW92ZVVuc3luY2hyb25pemF0aW9uKCk7CiAgICAgfQogCkBAIC0yNDMsNiArMjU0LDc0IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBXcml0ZVN5bmNzYWZlSW50ZWdlcih1aW50OF90ICpkc3QsIHNpemVfdCB4KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgZHN0WzMgLSBpXSA9ICh4ICYgMHg3Zik7CisgICAgICAgIHggPj49IDc7CisgICAgfQorfQorCitib29sIElEMzo6cmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KCkgeworICAgIHNpemVfdCBvbGRTaXplID0gbVNpemU7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0ICsgMTAgPD0gbVNpemUpIHsKKyAgICAgICAgaWYgKCFtZW1jbXAoJm1EYXRhW29mZnNldF0sICJcMFwwXDBcMCIsIDQpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBkYXRhU2l6ZTsKKyAgICAgICAgaWYgKCFQYXJzZVN5bmNzYWZlSW50ZWdlcigmbURhdGFbb2Zmc2V0ICsgNF0sICZkYXRhU2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvZmZzZXQgKyBkYXRhU2l6ZSArIDEwID4gbVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQxNl90IGZsYWdzID0gVTE2X0FUKCZtRGF0YVtvZmZzZXQgKyA4XSk7CisgICAgICAgIHVpbnQxNl90IHByZXZGbGFncyA9IGZsYWdzOworCisgICAgICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgICAgIC8vIFN0cmlwIGRhdGEgbGVuZ3RoIGluZGljYXRvcgorCisgICAgICAgICAgICBtZW1tb3ZlKCZtRGF0YVtvZmZzZXQgKyAxMF0sICZtRGF0YVtvZmZzZXQgKyAxNF0sIG1TaXplIC0gb2Zmc2V0IC0gMTQpOworICAgICAgICAgICAgbVNpemUgLT0gNDsKKyAgICAgICAgICAgIGRhdGFTaXplIC09IDQ7CisKKyAgICAgICAgICAgIGZsYWdzICY9IH4xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgMikgeworICAgICAgICAgICAgLy8gVW5zeW5jaHJvbml6YXRpb24gYWRkZWQuCisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICsgMSA8IGRhdGFTaXplOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAobURhdGFbb2Zmc2V0ICsgMTAgKyBpXSA9PSAweGZmCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YVtvZmZzZXQgKyAxMSArIGldID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtbW92ZSgmbURhdGFbb2Zmc2V0ICsgMTEgKyBpXSwgJm1EYXRhW29mZnNldCArIDEyICsgaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpemUgLSBvZmZzZXQgLSAxMiAtIGkpOworICAgICAgICAgICAgICAgICAgICAtLW1TaXplOworICAgICAgICAgICAgICAgICAgICAtLWRhdGFTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmxhZ3MgJj0gfjI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgIT0gcHJldkZsYWdzKSB7CisgICAgICAgICAgICBXcml0ZVN5bmNzYWZlSW50ZWdlcigmbURhdGFbb2Zmc2V0ICsgNF0sIGRhdGFTaXplKTsKKyAgICAgICAgICAgIG1EYXRhW29mZnNldCArIDhdID0gZmxhZ3MgPj4gODsKKyAgICAgICAgICAgIG1EYXRhW29mZnNldCArIDldID0gZmxhZ3MgJiAweGZmOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IDEwICsgZGF0YVNpemU7CisgICAgfQorCisgICAgbWVtc2V0KCZtRGF0YVttU2l6ZV0sIDAsIG9sZFNpemUgLSBtU2l6ZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogSUQzOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgSUQzICZwYXJlbnQsIGNvbnN0IGNoYXIgKmlkKQogICAgIDogbVBhcmVudChwYXJlbnQpLAogICAgICAgbUlEKE5VTEwpLApAQCAtNTI5LDEwICs2MDgsMTEgQEAKIAogICAgICAgICAgICAgdWludDE2X3QgZmxhZ3MgPSBVMTZfQVQoJm1QYXJlbnQubURhdGFbbU9mZnNldCArIDhdKTsKIAotICAgICAgICAgICAgaWYgKChtUGFyZW50Lm1WZXJzaW9uID09IElEM19WMl80ICYmIChmbGFncyAmIDB4MDAwZSkpCisgICAgICAgICAgICBpZiAoKG1QYXJlbnQubVZlcnNpb24gPT0gSUQzX1YyXzQgJiYgKGZsYWdzICYgMHgwMDBjKSkKICAgICAgICAgICAgICAgICB8fCAobVBhcmVudC5tVmVyc2lvbiA9PSBJRDNfVjJfMyAmJiAoZmxhZ3MgJiAweDAwYzApKSkgewotICAgICAgICAgICAgICAgIC8vIENvbXByZXNzaW9uLCBFbmNyeXB0aW9uIG9yIHBlci1GcmFtZSB1bnN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgIC8vIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgICAgICAgICAvLyBDb21wcmVzc2lvbiBvciBlbmNyeXB0aW9uIGFyZSBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZS4KKyAgICAgICAgICAgICAgICAvLyBQZXItZnJhbWUgdW5zeW5jaHJvbml6YXRpb24gYW5kIGRhdGEtbGVuZ3RoIGluZGljYXRvcgorICAgICAgICAgICAgICAgIC8vIGhhdmUgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCiAKICAgICAgICAgICAgICAgICBMT0dWKCJTa2lwcGluZyB1bnN1cHBvcnRlZCBmcmFtZSAoY29tcHJlc3Npb24sIGVuY3J5cHRpb24gIgogICAgICAgICAgICAgICAgICAgICAgIm9yIHBlci1mcmFtZSB1bnN5bmNocm9uaXphdGlvbiBmbGFnZ2VkIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FBQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCmluZGV4IGYwOWFkZGQuLjIwMGY5M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRGVjb2Rlci5oCkBAIC0yNSw2ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworc3RydWN0IE1ldGFEYXRhOwogCiBzdHJ1Y3QgQUFDRGVjb2RlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CiAgICAgQUFDRGVjb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CkBAIC00MSw2ICs0Miw3IEBACiAgICAgdmlydHVhbCB+QUFDRGVjb2RlcigpOwogCiBwcml2YXRlOgorICAgIHNwPE1ldGFEYXRhPiAgICBtTWV0YTsKICAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC01MCw5ICs1MiwxMSBAQAogICAgIHZvaWQgKm1EZWNvZGVyQnVmOwogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOwogCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CiAgICAgQUFDRGVjb2Rlcihjb25zdCBBQUNEZWNvZGVyICYpOwogICAgIEFBQ0RlY29kZXIgJm9wZXJhdG9yPShjb25zdCBBQUNEZWNvZGVyICYpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQUNFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjNTMzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQUFDRW5jb2Rlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFBQ19FTkNPREVSX0gKKyNkZWZpbmUgQUFDX0VOQ09ERVJfSAorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCitzdHJ1Y3QgVk9fQVVESU9fQ09ERUNBUEk7CitzdHJ1Y3QgVk9fTUVNX09QRVJBVE9SOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworCitjbGFzcyBBQUNFbmNvZGVyOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgQUFDRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgfkFBQ0VuY29kZXIoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHNwPE1lZGlhU291cmNlPiAgIG1Tb3VyY2U7CisgICAgICAgIHNwPE1ldGFEYXRhPiAgICAgIG1NZXRhOworICAgICAgICBib29sICAgICAgICAgICAgICBtU3RhcnRlZDsKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqbUJ1ZmZlckdyb3VwOworICAgICAgICBNZWRpYUJ1ZmZlciAgICAgICptSW5wdXRCdWZmZXI7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgIG1Jbml0Q2hlY2s7CisgICAgICAgIGludDMyX3QgICAgICAgICAgIG1TYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90ICAgICAgICAgICBtQ2hhbm5lbHM7CisgICAgICAgIGludDMyX3QgICAgICAgICAgIG1CaXRSYXRlOworICAgICAgICBpbnQzMl90ICAgICAgICAgICBtRnJhbWVDb3VudDsKKworICAgICAgICBpbnQ2NF90ICAgICAgICAgICBtQW5jaG9yVGltZVVzOworICAgICAgICBpbnQ2NF90ICAgICAgICAgICBtTnVtSW5wdXRTYW1wbGVzOworCisgICAgICAgIGVudW0geworICAgICAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSA9IDEwMjQsCisgICAgICAgIH07CisKKyAgICAgICAgaW50MTZfdCAgICAgICAgICAgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CisKKyAgICAgICAgdWludDhfdCAgICAgICAgICAgbUF1ZGlvU3BlY2lmaWNDb25maWdEYXRhWzJdOyAvLyBhdWlkbyBzcGVjaWZpYyBkYXRhCisgICAgICAgIHZvaWQgICAgICAgICAgICAgKm1FbmNvZGVySGFuZGxlOworICAgICAgICBWT19BVURJT19DT0RFQ0FQSSAqbUFwaUhhbmRsZTsKKyAgICAgICAgVk9fTUVNX09QRVJBVE9SICAqbU1lbU9wZXJhdG9yOworCisgICAgICAgIHN0YXR1c190IHNldEF1ZGlvU3BlY2lmaWNDb25maWdEYXRhKCk7CisgICAgICAgIHN0YXR1c190IGluaXRDaGVjaygpOworCisgICAgICAgIEFBQ0VuY29kZXImIG9wZXJhdG9yPShjb25zdCBBQUNFbmNvZGVyICZyaHMpOworICAgICAgICBBQUNFbmNvZGVyKGNvbnN0IEFBQ0VuY29kZXImIGNvcHkpOworCit9OworCit9CisKKyNlbmRpZiAgLy8jaWZuZGVmIEFBQ19FTkNPREVSX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1SRXh0cmFjdG9yLmgKaW5kZXggZGI0OWZlNC4uMWNkZjM2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUkV4dHJhY3Rvci5oCkBAIC0yMiw2ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgU3RyaW5nODsKIAogY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKQEAgLTQ5LDcgKzUwLDggQEAKIH07CiAKIGJvb2wgU25pZmZBTVIoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUk5CRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJOQkVuY29kZXIuaAppbmRleCA3MTY3YzAwLi43MTE2MGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUk5CRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQU1STkJFbmNvZGVyLmgKQEAgLTE5LDEzICsxOSwxNCBAQAogI2RlZmluZSBBTVJfTkJfRU5DT0RFUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOwogCiBzdHJ1Y3QgQU1STkJFbmNvZGVyIDogcHVibGljIE1lZGlhU291cmNlIHsKLSAgICBBTVJOQkVuY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIEFNUk5CRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CkBAIC00MCw2ICs0MSw3IEBACiAKIHByaXZhdGU6CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWV0YURhdGE+ICAgIG1NZXRhOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAKICAgICBNZWRpYUJ1ZmZlckdyb3VwICptQnVmZmVyR3JvdXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FNUldCRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJXQkVuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQxNTVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BTVJXQkVuY29kZXIuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTVJfV0JfRU5DT0RFUl9ICisjZGVmaW5lIEFNUl9XQl9FTkNPREVSX0gKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworc3RydWN0IFZPX0FVRElPX0NPREVDQVBJOworc3RydWN0IFZPX01FTV9PUEVSQVRPUjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKKworY2xhc3MgQU1SV0JFbmNvZGVyOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgQU1SV0JFbmNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgICAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB+QU1SV0JFbmNvZGVyKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxNZWRpYVNvdXJjZT4gICBtU291cmNlOworICAgICAgICBzcDxNZXRhRGF0YT4gICAgICBtTWV0YTsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgbVN0YXJ0ZWQ7CisgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKKyAgICAgICAgTWVkaWFCdWZmZXIgICAgICAqbUlucHV0QnVmZmVyOworICAgICAgICBzdGF0dXNfdCAgICAgICAgICBtSW5pdENoZWNrOworICAgICAgICBpbnQzMl90ICAgICAgICAgICBtQml0UmF0ZTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAqbUVuY29kZXJIYW5kbGU7CisgICAgICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlOworICAgICAgICBWT19NRU1fT1BFUkFUT1IgICptTWVtT3BlcmF0b3I7CisKKyAgICAgICAgaW50NjRfdCBtQW5jaG9yVGltZVVzOworICAgICAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CisKKyAgICAgICAgaW50MTZfdCBtSW5wdXRGcmFtZVszMjBdOworICAgICAgICBpbnQzMl90IG1OdW1JbnB1dFNhbXBsZXM7CisKKyAgICAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAgICAgQU1SV0JFbmNvZGVyJiBvcGVyYXRvcj0oY29uc3QgQU1SV0JFbmNvZGVyICZyaHMpOworICAgICAgICBBTVJXQkVuY29kZXIoY29uc3QgQU1SV0JFbmNvZGVyJiBjb3B5KTsKKworfTsKKworfQorCisjZW5kaWYgIC8vI2lmbmRlZiBBTVJfV0JfRU5DT0RFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVJUU1BDb250cm9sbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FSVFNQQ29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMGQ4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FSVFNQQ29udHJvbGxlci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRTUF9DT05UUk9MTEVSX0hfCisKKyNkZWZpbmUgQV9SVFNQX0NPTlRST0xMRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBNeUhhbmRsZXI7CisKK3N0cnVjdCBBUlRTUENvbnRyb2xsZXIgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIEFSVFNQQ29udHJvbGxlcihjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyKTsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3QgY2hhciAqdXJsKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZvaWQgc2VlayhpbnQ2NF90IHRpbWVVcyk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBpbnQ2NF90IGdldE5vcm1hbFBsYXlUaW1lVXMoKTsKKyAgICBpbnQ2NF90IGdldFF1ZXVlRHVyYXRpb25Vcyhib29sICplb3MpOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BUlRTUENvbnRyb2xsZXIoKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDb25uZWN0RG9uZSAgICA9ICdjZG9uJywKKyAgICAgICAga1doYXREaXNjb25uZWN0RG9uZSA9ICdkZG9uJywKKyAgICB9OworCisgICAgZW51bSBTdGF0ZSB7CisgICAgICAgIERJU0NPTk5FQ1RFRCwKKyAgICAgICAgQ09OTkVDVEVELAorICAgICAgICBDT05ORUNUSU5HLAorICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKKworICAgIFN0YXRlIG1TdGF0ZTsKKyAgICBzdGF0dXNfdCBtQ29ubmVjdGlvblJlc3VsdDsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8TXlIYW5kbGVyPiBtSGFuZGxlcjsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRTUENvbnRyb2xsZXI+ID4gbVJlZmxlY3RvcjsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFSVFNQQ29udHJvbGxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfUlRTUF9DT05UUk9MTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWQ0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRGVjb2Rlci5oCmluZGV4IDYyMWFhOWEuLjg5OGM5MGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRGVjb2Rlci5oCkBAIC01OCw2ICs1OCwxMiBAQAogICAgIGludDY0X3QgbUFuY2hvclRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OwogICAgIGludDY0X3QgbVBlbmRpbmdTZWVrVGltZVVzOworICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbVBlbmRpbmdTZWVrTW9kZTsKKworICAgIGludDY0X3QgbVRhcmdldFRpbWVVczsKKworICAgIGJvb2wgbVNQU1NlZW47CisgICAgYm9vbCBtUFBTU2VlbjsKIAogICAgIHZvaWQgYWRkQ29kZWNTcGVjaWZpY0RhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWQ0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTFmOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FWQ0VuY29kZXIuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBVkNfRU5DT0RFUl9IXworCisjZGVmaW5lIEFWQ19FTkNPREVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK3N0cnVjdCB0YWdBVkNIYW5kbGU7CitzdHJ1Y3QgdGFnQVZDRW5jUGFyYW07CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQnVmZmVyOworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA7CisKK3N0cnVjdCBBVkNFbmNvZGVyIDogcHVibGljIE1lZGlhU291cmNlLAorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CisgICAgQVZDRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworCisgICAgLy8gQ2FsbGJhY2tzIHJlcXVpcmVkIGJ5IHRoZSBlbmNvZGVyCisgICAgaW50MzJfdCBhbGxvY091dHB1dEJ1ZmZlcnModW5zaWduZWQgaW50IHNpemVJbk1icywgdW5zaWduZWQgaW50IG51bUJ1ZmZlcnMpOworICAgIHZvaWQgICAgdW5iaW5kT3V0cHV0QnVmZmVyKGludDMyX3QgaW5kZXgpOworICAgIGludDMyX3QgYmluZE91dHB1dEJ1ZmZlcihpbnQzMl90IGluZGV4LCB1aW50OF90ICoqeXV2KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFWQ0VuY29kZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZXRhRGF0YT4gICAgbUZvcm1hdDsKKyAgICBzcDxNZXRhRGF0YT4gICAgbU1ldGE7CisKKyAgICBpbnQzMl90ICBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90ICBtVmlkZW9IZWlnaHQ7CisgICAgaW50MzJfdCAgbVZpZGVvRnJhbWVSYXRlOworICAgIGludDMyX3QgIG1WaWRlb0JpdFJhdGU7CisgICAgaW50MzJfdCAgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIGludDY0X3QgIG1QcmV2VGltZXN0YW1wVXM7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisgICAgYm9vbCAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lOworICAgIGludDMyX3QgIG1Jc0lEUkZyYW1lOyAgLy8gZm9yIHNldCBrS2V5SXNTeW5jRnJhbWUKKworICAgIHRhZ0FWQ0hhbmRsZSAgICAgICAgICAqbUhhbmRsZTsKKyAgICB0YWdBVkNFbmNQYXJhbSAgICAgICAgKm1FbmNQYXJhbXM7CisgICAgTWVkaWFCdWZmZXIgICAgICAgICAgICptSW5wdXRCdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICptSW5wdXRGcmFtZURhdGE7CisgICAgTWVkaWFCdWZmZXJHcm91cCAgICAgICptR3JvdXA7CisgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1PdXRwdXRCdWZmZXJzOworCisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICB2b2lkIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBBVkNFbmNvZGVyKGNvbnN0IEFWQ0VuY29kZXIgJik7CisgICAgQVZDRW5jb2RlciAmb3BlcmF0b3I9KGNvbnN0IEFWQ0VuY29kZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFWQ19FTkNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0F3ZXNvbWVQbGF5ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCmluZGV4IDk0NTU3NDMuLjFmMzk0NmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oCkBAIC0xOCwxMiArMTgsMTMgQEAKIAogI2RlZmluZSBBV0VTT01FX1BMQVlFUl9IXwogCisjaW5jbHVkZSAiTnVIVFRQRGF0YVNvdXJjZS5oIgogI2luY2x1ZGUgIlRpbWVkRXZlbnRRdWV1ZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSFRUUERhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9UaW1lU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zMyw4ICszNCwxMiBAQAogc3RydWN0IE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IFByZWZldGNoZXI7Ci1zdHJ1Y3QgVGltZVNvdXJjZTsKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTI7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKK3N0cnVjdCBBUlRQU2Vzc2lvbjsKK3N0cnVjdCBVRFBQdXNoZXI7CiAKIHN0cnVjdCBBd2Vzb21lUmVuZGVyZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQXdlc29tZVJlbmRlcmVyKCkge30KQEAgLTk4LDYgKzEwMywxMCBAQAogICAgICAgICBQUkVQQVJFRCAgICAgICAgICAgID0gMTYsCiAgICAgICAgIEFUX0VPUyAgICAgICAgICAgICAgPSAzMiwKICAgICAgICAgUFJFUEFSRV9DQU5DRUxMRUQgICA9IDY0LAorICAgICAgICBDQUNIRV9VTkRFUlJVTiAgICAgID0gMTI4LAorICAgICAgICBBVURJT19BVF9FT1MgICAgICAgID0gMjU2LAorICAgICAgICBWSURFT19BVF9FT1MgICAgICAgID0gNTEyLAorICAgICAgICBBVVRPX0xPT1BJTkcgICAgICAgID0gMTAyNCwKICAgICB9OwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTExMSw2ICsxMjAsNyBAQAogICAgIHNwPElTdXJmYWNlPiBtSVN1cmZhY2U7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAKKyAgICBTeXN0ZW1UaW1lU291cmNlIG1TeXN0ZW1UaW1lU291cmNlOwogICAgIFRpbWVTb3VyY2UgKm1UaW1lU291cmNlOwogCiAgICAgU3RyaW5nOCBtVXJpOwpAQCAtMTY2LDggKzE3NiwxMyBAQAogICAgIE1lZGlhQnVmZmVyICptTGFzdFZpZGVvQnVmZmVyOwogICAgIE1lZGlhQnVmZmVyICptVmlkZW9CdWZmZXI7CiAKLSAgICBzcDxQcmVmZXRjaGVyPiBtUHJlZmV0Y2hlcjsKLSAgICBzcDxIVFRQRGF0YVNvdXJjZT4gbUNvbm5lY3RpbmdEYXRhU291cmNlOworICAgIHNwPE51SFRUUERhdGFTb3VyY2U+IG1Db25uZWN0aW5nRGF0YVNvdXJjZTsKKyAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFSVFNQQ29udHJvbGxlcj4gbVJUU1BDb250cm9sbGVyOworICAgIHNwPEFSVFBTZXNzaW9uPiBtUlRQU2Vzc2lvbjsKKyAgICBzcDxVRFBQdXNoZXI+IG1SVFBQdXNoZXIsIG1SVENQUHVzaGVyOwogCiAgICAgc3RydWN0IFN1c3BlbnNpb25TdGF0ZSB7CiAgICAgICAgIFN0cmluZzggbVVyaTsKQEAgLTIyNCw2ICsyMzksOSBAQAogICAgIHZvaWQgb25DaGVja0F1ZGlvU3RhdHVzKCk7CiAgICAgdm9pZCBvblByZXBhcmVBc3luY0V2ZW50KCk7CiAgICAgdm9pZCBhYm9ydFByZXBhcmUoc3RhdHVzX3QgZXJyKTsKKyAgICB2b2lkIGZpbmlzaEFzeW5jUHJlcGFyZV9sKCk7CisKKyAgICBib29sIGdldENhY2hlZER1cmF0aW9uX2woaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKTsKIAogICAgIHN0YXR1c190IGZpbmlzaFNldERhdGFTb3VyY2VfbCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0c3MTFEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0c3MTFEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MTQzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRzcxMURlY29kZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHNzExX0RFQ09ERVJfSF8KKworI2RlZmluZSBHNzExX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA7CisKK3N0cnVjdCBHNzExRGVjb2RlciA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisgICAgRzcxMURlY29kZXIoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkc3MTFEZWNvZGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1Jc01MYXc7CisKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICptQnVmZmVyR3JvdXA7CisKKyAgICBzdGF0aWMgdm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworICAgIHN0YXRpYyB2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisKKyAgICBHNzExRGVjb2Rlcihjb25zdCBHNzExRGVjb2RlciAmKTsKKyAgICBHNzExRGVjb2RlciAmb3BlcmF0b3I9KGNvbnN0IEc3MTFEZWNvZGVyICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBHNzExX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCmluZGV4IGM2YjFhOGIuLjdkZGJiNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaApAQCAtODAsNiArODAsNyBAQAogICAgIGJvb2wgcGFyc2VWMShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKICAgICBib29sIHBhcnNlVjIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdm9pZCByZW1vdmVVbnN5bmNocm9uaXphdGlvbigpOworICAgIGJvb2wgcmVtb3ZlVW5zeW5jaHJvbml6YXRpb25WMl80KCk7CiAKICAgICBzdGF0aWMgYm9vbCBQYXJzZVN5bmNzYWZlSW50ZWdlcihjb25zdCB1aW50OF90IGVuY29kZWRbNF0sIHNpemVfdCAqeCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTGl2ZVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9MaXZlU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1NTA4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTGl2ZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIExJVkVfU09VUkNFX0hfCisKKyNkZWZpbmUgTElWRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgTnVIVFRQRGF0YVNvdXJjZTsKK3N0cnVjdCBNM1VQYXJzZXI7CisKK3N0cnVjdCBMaXZlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworICAgIExpdmVTb3VyY2UoY29uc3QgY2hhciAqdXJsKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkxpdmVTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBBU3RyaW5nIG1VUkw7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIHNwPE0zVVBhcnNlcj4gbVBsYXlsaXN0OworICAgIGludDMyX3QgbUZpcnN0SXRlbVNlcXVlbmNlTnVtYmVyOworICAgIHNpemVfdCBtUGxheWxpc3RJbmRleDsKKyAgICBpbnQ2NF90IG1MYXN0RmV0Y2hUaW1lVXM7CisKKyAgICBzcDxOdUhUVFBEYXRhU291cmNlPiBtU291cmNlOworICAgIG9mZl90IG1Tb3VyY2VTaXplOworICAgIG9mZl90IG1PZmZzZXRCaWFzOworCisgICAgc3RhdHVzX3QgZmV0Y2hNM1UoY29uc3QgY2hhciAqdXJsLCBzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKworICAgIGJvb2wgc3dpdGNoVG9OZXh0KCk7CisgICAgYm9vbCBsb2FkUGxheWxpc3QoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExpdmVTb3VyY2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBMSVZFX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NM1VQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTNVUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1NTNkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTNVUGFyc2VyLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTTNVX1BBUlNFUl9IXworCisjZGVmaW5lIE0zVV9QQVJTRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE0zVVBhcnNlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBNM1VQYXJzZXIoY29uc3QgY2hhciAqYmFzZVVSSSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICBib29sIGlzRXh0TTNVKCkgY29uc3Q7CisgICAgYm9vbCBpc1ZhcmlhbnRQbGF5bGlzdCgpIGNvbnN0OworCisgICAgc3A8QU1lc3NhZ2U+IG1ldGEoKTsKKworICAgIHNpemVfdCBzaXplKCk7CisgICAgYm9vbCBpdGVtQXQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICp1cmksIHNwPEFNZXNzYWdlPiAqbWV0YSA9IE5VTEwpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TTNVUGFyc2VyKCk7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEl0ZW0geworICAgICAgICBBU3RyaW5nIG1VUkk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKKyAgICB9OworCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIEFTdHJpbmcgbUJhc2VVUkk7CisgICAgYm9vbCBtSXNFeHRNM1U7CisgICAgYm9vbCBtSXNWYXJpYW50UGxheWxpc3Q7CisKKyAgICBzcDxBTWVzc2FnZT4gbU1ldGE7CisgICAgVmVjdG9yPEl0ZW0+IG1JdGVtczsKKworICAgIHN0YXR1c190IHBhcnNlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZU1ldGFEYXRhKAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmbGluZSwgc3A8QU1lc3NhZ2U+ICptZXRhLCBjb25zdCBjaGFyICprZXkpOworCisgICAgc3RhdGljIHN0YXR1c190IFBhcnNlSW50MzIoY29uc3QgY2hhciAqcywgaW50MzJfdCAqeCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNM1VQYXJzZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNM1VfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL000dkgyNjNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL000dkgyNjNEZWNvZGVyLmgKaW5kZXggZWM0OWU4MC4uN2Q3M2UzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NNHZIMjYzRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTTR2SDI2M0RlY29kZXIuaApAQCAtNTQsNiArNTQsNyBAQAogICAgIE1lZGlhQnVmZmVyICptSW5wdXRCdWZmZXI7CiAKICAgICBpbnQ2NF90IG1OdW1TYW1wbGVzT3V0cHV0OworICAgIGludDY0X3QgbVRhcmdldFRpbWVVczsKIAogICAgIHZvaWQgYWxsb2NhdGVGcmFtZXMoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOwogICAgIHZvaWQgcmVsZWFzZUZyYW1lcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NNHZIMjYzRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NNHZIMjYzRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTlmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL000dkgyNjNFbmNvZGVyLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTTRWX0gyNjNfRU5DT0RFUl9IXworCisjZGVmaW5lIE00Vl9IMjYzX0VOQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworc3RydWN0IHRhZ3ZpZGVvRW5jQ29udHJvbHM7CitzdHJ1Y3QgdGFndmlkZW9FbmNPcHRpb25zOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlcjsKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOworCitzdHJ1Y3QgTTR2SDI2M0VuY29kZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBNNHZIMjYzRW5jb2Rlcihjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TTR2SDI2M0VuY29kZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxNZXRhRGF0YT4gICAgbUZvcm1hdDsKKyAgICBzcDxNZXRhRGF0YT4gICAgbU1ldGE7CisKKyAgICBpbnQzMl90ICBtVmlkZW9XaWR0aDsKKyAgICBpbnQzMl90ICBtVmlkZW9IZWlnaHQ7CisgICAgaW50MzJfdCAgbVZpZGVvRnJhbWVSYXRlOworICAgIGludDMyX3QgIG1WaWRlb0JpdFJhdGU7CisgICAgaW50MzJfdCAgbVZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIGludDY0X3QgIG1OZXh0TW9kVGltZVVzOworICAgIGludDY0X3QgIG1QcmV2VGltZXN0YW1wVXM7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKworICAgIHRhZ3ZpZGVvRW5jQ29udHJvbHMgICAqbUhhbmRsZTsKKyAgICB0YWd2aWRlb0VuY09wdGlvbnMgICAgKm1FbmNQYXJhbXM7CisgICAgTWVkaWFCdWZmZXIgICAgICAgICAgICptSW5wdXRCdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICptSW5wdXRGcmFtZURhdGE7CisgICAgTWVkaWFCdWZmZXJHcm91cCAgICAgICptR3JvdXA7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICB2b2lkIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBNNHZIMjYzRW5jb2Rlcihjb25zdCBNNHZIMjYzRW5jb2RlciAmKTsKKyAgICBNNHZIMjYzRW5jb2RlciAmb3BlcmF0b3I9KGNvbnN0IE00dkgyNjNFbmNvZGVyICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNNFZfSDI2M19FTkNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRGVjb2Rlci5oCmluZGV4IDg4YWE0YzYuLjQwODZmYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRGVjb2Rlci5oCkBAIC00Miw2ICs0Miw5IEBACiAKIHByaXZhdGU6CiAgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8TWV0YURhdGE+IG1NZXRhOworICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworCiAgICAgYm9vbCBtU3RhcnRlZDsKIAogICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKQEAgLTQ5LDEwICs1MiwxMiBAQAogICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKICAgICB2b2lkICptRGVjb2RlckJ1ZjsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lVXM7Ci0gICAgaW50NjRfdCBtTnVtU2FtcGxlc091dHB1dDsKKyAgICBpbnQ2NF90IG1OdW1GcmFtZXNPdXRwdXQ7CiAKICAgICBNZWRpYUJ1ZmZlciAqbUlucHV0QnVmZmVyOwogCisgICAgdm9pZCBpbml0KCk7CisKICAgICBNUDNEZWNvZGVyKGNvbnN0IE1QM0RlY29kZXIgJik7CiAgICAgTVAzRGVjb2RlciAmb3BlcmF0b3I9KGNvbnN0IE1QM0RlY29kZXIgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVAzRXh0cmFjdG9yLmgKaW5kZXggM2NlNmRmMy4uMzAxMzZlNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QM0V4dHJhY3Rvci5oCkBAIC0yMiwxMyArMjIsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAogY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKIHB1YmxpYzoKICAgICAvLyBFeHRyYWN0b3IgYXNzdW1lcyBvd25lcnNoaXAgb2YgInNvdXJjZSIuCi0gICAgTVAzRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOworICAgIE1QM0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKICAgICB2aXJ0dWFsIHNwPE1lZGlhU291cmNlPiBnZXRUcmFjayhzaXplX3QgaW5kZXgpOwpAQCAtMzYsMTAgKzM3LDkgQEAKIAogICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CiAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NUDNFeHRyYWN0b3IoKTsKLQogcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgb2ZmX3QgbUZpcnN0RnJhbWVQb3M7CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhOwpAQCAtNTIsNyArNTIsOCBAQAogfTsKIAogYm9vbCBTbmlmZk1QMygKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKTsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKm1ldGEpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjRjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMCwwICsxLDU2IEBACisjaWZuZGVmIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOworc3RydWN0IEFUU1BhcnNlcjsKK3N0cnVjdCBEYXRhU291cmNlOworc3RydWN0IE1QRUcyVFNTb3VyY2U7CitzdHJ1Y3QgU3RyaW5nODsKKworc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworICAgIE1QRUcyVFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHZpcnR1YWwgc3A8TWVkaWFTb3VyY2U+IGdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0VHJhY2tNZXRhRGF0YShzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ0FOX1BBVVNFOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IE1QRUcyVFNTb3VyY2U7CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworICAgIHNwPEFUU1BhcnNlcj4gbVBhcnNlcjsKKworICAgIFZlY3RvcjxzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1Tb3VyY2VJbXBsczsKKworICAgIG9mZl90IG1PZmZzZXQ7CisKKyAgICB2b2lkIGluaXQoKTsKKyAgICBzdGF0dXNfdCBmZWVkTW9yZSgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU0V4dHJhY3Rvcik7Cit9OworCitib29sIFNuaWZmTVBFRzJUUygKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTVBFRzJfVFNfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKaW5kZXggYzg2NjNkNS4uMWM5Y2M3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaApAQCAtMjMsNiArMjMsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBTYW1wbGVUYWJsZTsKIGNsYXNzIFN0cmluZzg7CkBAIC03NSw3ICs3Niw4IEBACiB9OwogCiBib29sIFNuaWZmTVBFRzQoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSk7CisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICopOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTIwYzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOVV9DQUNIRURfU09VUkNFXzJfSF8KKworI2RlZmluZSBOVV9DQUNIRURfU09VUkNFXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IFBhZ2VDYWNoZTsKKworc3RydWN0IE51Q2FjaGVkU291cmNlMiA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBOdUNhY2hlZFNvdXJjZTIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmZfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgc2l6ZV90IGNhY2hlZFNpemUoKTsKKyAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZyhib29sICplb3MpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TnVDYWNoZWRTb3VyY2UyKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBSGFuZGxlclJlZmxlY3RvcjxOdUNhY2hlZFNvdXJjZTI+OworCisgICAgZW51bSB7CisgICAgICAgIGtQYWdlU2l6ZSAgICAgICAgICAgID0gNjU1MzYsCisgICAgICAgIGtIaWdoV2F0ZXJUaHJlc2hvbGQgID0gNSAqIDEwMjQgKiAxMDI0LAorICAgICAgICBrTG93V2F0ZXJUaHJlc2hvbGQgICA9IDUxMiAqIDEwMjQsCisKKyAgICAgICAgLy8gUmVhZCBkYXRhIGFmdGVyIGEgMTUgc2VjIHRpbWVvdXQgd2hldGhlciB3ZSdyZSBhY3RpdmVseQorICAgICAgICAvLyBmZXRjaGluZyBvciBub3QuCisgICAgICAgIGtLZWVwQWxpdmVJbnRlcnZhbFVzID0gMTUwMDAwMDAsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEZldGNoTW9yZSAgPSAnZmV0YycsCisgICAgICAgIGtXaGF0UmVhZCAgICAgICA9ICdyZWFkJywKKyAgICB9OworCisgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxOdUNhY2hlZFNvdXJjZTI+ID4gbVJlZmxlY3RvcjsKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgTXV0ZXggbVNlcmlhbGl6ZXI7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBQYWdlQ2FjaGUgKm1DYWNoZTsKKyAgICBvZmZfdCBtQ2FjaGVPZmZzZXQ7CisgICAgc3RhdHVzX3QgbUZpbmFsU3RhdHVzOworICAgIG9mZl90IG1MYXN0QWNjZXNzUG9zOworICAgIHNwPEFNZXNzYWdlPiBtQXN5bmNSZXN1bHQ7CisgICAgYm9vbCBtRmV0Y2hpbmc7CisgICAgaW50NjRfdCBtTGFzdEZldGNoVGltZVVzOworCisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkZldGNoKCk7CisgICAgdm9pZCBvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBmZXRjaEludGVybmFsKCk7CisgICAgc3NpemVfdCByZWFkSW50ZXJuYWwob2ZmX3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmX3Qgb2Zmc2V0KTsKKworICAgIHNpemVfdCBhcHByb3hEYXRhUmVtYWluaW5nX2woYm9vbCAqZW9zKTsKKyAgICB2b2lkIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVDYWNoZWRTb3VyY2UyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVfQ0FDSEVEX1NPVVJDRV8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVIVFRQRGF0YVNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OTNhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051SFRUUERhdGFTb3VyY2UuaApAQCAtMCwwICsxLDczIEBACisjaWZuZGVmIE5VX0hUVFBfREFUQV9TT1VSQ0VfSF8KKworI2RlZmluZSBOVV9IVFRQX0RBVEFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworI2luY2x1ZGUgIkhUVFBTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTnVIVFRQRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBOdUhUVFBEYXRhU291cmNlKCk7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gMCk7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmZfdCAqc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TnVIVFRQRGF0YVNvdXJjZSgpOworCitwcml2YXRlOgorICAgIGVudW0gU3RhdGUgeworICAgICAgICBESVNDT05ORUNURUQsCisgICAgICAgIENPTk5FQ1RJTkcsCisgICAgICAgIENPTk5FQ1RFRAorICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIFN0YXRlIG1TdGF0ZTsKKworICAgIFN0cmluZzggbUhvc3Q7CisgICAgdW5zaWduZWQgbVBvcnQ7CisgICAgU3RyaW5nOCBtUGF0aDsKKyAgICBTdHJpbmc4IG1IZWFkZXJzOworCisgICAgSFRUUFN0cmVhbSBtSFRUUDsKKyAgICBvZmZfdCBtT2Zmc2V0OworICAgIG9mZl90IG1Db250ZW50TGVuZ3RoOworICAgIGJvb2wgbUNvbnRlbnRMZW5ndGhWYWxpZDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IFN0cmluZzggJmhlYWRlcnMsIG9mZl90IG9mZnNldCk7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3QgY2hhciAqcGF0aCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmhlYWRlcnMsCisgICAgICAgICAgICBvZmZfdCBvZmZzZXQpOworCisgICAgdm9pZCBhcHBseVRpbWVvdXRSZXNwb25zZSgpOworCisgICAgc3RhdGljIHZvaWQgTWFrZUZ1bGxIZWFkZXJzKAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKm92ZXJyaWRlcywKKyAgICAgICAgICAgIFN0cmluZzggKmhlYWRlcnMpOworCisgICAgTnVIVFRQRGF0YVNvdXJjZShjb25zdCBOdUhUVFBEYXRhU291cmNlICYpOworICAgIE51SFRUUERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBOdUhUVFBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBOVV9IVFRQX0RBVEFfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAppbmRleCBlYTEzMWU4Li5jOTlkYTU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAogICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGEyLAogICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEV2ZW50RGF0YSk7Ci0gICAgICAgIAorCiAgICAgT01YX0VSUk9SVFlQRSBPbkVtcHR5QnVmZmVyRG9uZSgKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKIApAQCAtMTE1LDIwICsxMTUsMTkgQEAKICAgICB2aXJ0dWFsIH5PTVgoKTsKIAogcHJpdmF0ZToKLSAgICBNdXRleCBtTG9jazsKLQotICAgIE9NWE1hc3RlciAqbU1hc3RlcjsKLQogICAgIHN0cnVjdCBDYWxsYmFja0Rpc3BhdGNoZXI7Ci0gICAgc3A8Q2FsbGJhY2tEaXNwYXRjaGVyPiBtRGlzcGF0Y2hlcjsKIAorICAgIE11dGV4IG1Mb2NrOworICAgIE9NWE1hc3RlciAqbU1hc3RlcjsKICAgICBpbnQzMl90IG1Ob2RlQ291bnRlcjsKIAogICAgIEtleWVkVmVjdG9yPHdwPElCaW5kZXI+LCBPTVhOb2RlSW5zdGFuY2UgKj4gbUxpdmVOb2RlczsKICAgICBLZXllZFZlY3Rvcjxub2RlX2lkLCBPTVhOb2RlSW5zdGFuY2UgKj4gbU5vZGVJRFRvSW5zdGFuY2U7CisgICAgS2V5ZWRWZWN0b3I8bm9kZV9pZCwgc3A8Q2FsbGJhY2tEaXNwYXRjaGVyPiA+IG1EaXNwYXRjaGVyczsKIAogICAgIG5vZGVfaWQgbWFrZU5vZGVJRChPTVhOb2RlSW5zdGFuY2UgKmluc3RhbmNlKTsKICAgICBPTVhOb2RlSW5zdGFuY2UgKmZpbmRJbnN0YW5jZShub2RlX2lkIG5vZGUpOworICAgIHNwPENhbGxiYWNrRGlzcGF0Y2hlcj4gZmluZERpc3BhdGNoZXIobm9kZV9pZCBub2RlKTsKIAogICAgIHZvaWQgaW52YWxpZGF0ZU5vZGVJRF9sKG5vZGVfaWQgbm9kZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCmluZGV4IDcwNjY2NjkuLjFlZGEwMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaApAQCAtMjIsNiArMjIsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBBTWVzc2FnZTsKIGNsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCkBAIC01Myw3ICs1NCw4IEBACiB9OwogCiBib29sIFNuaWZmT2dnKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9QcmVmZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ByZWZldGNoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxMWQxYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1ByZWZldGNoZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFBSRUZFVENIRVJfSF8KLQotI2RlZmluZSBQUkVGRVRDSEVSX0hfCi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBQcmVmZXRjaGVkU291cmNlOwotCi1zdHJ1Y3QgUHJlZmV0Y2hlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBQcmVmZXRjaGVyKCk7Ci0KLSAgICAvLyBHaXZlbiBhbiBleGlzdGluZyBNZWRpYVNvdXJjZSByZXR1cm5zIGEgbmV3IE1lZGlhU291cmNlCi0gICAgLy8gdGhhdCB3aWxsIGJlbmVmaXQgZnJvbSBwcmVmZXRjaGluZy9jYWNoaW5nIHRoZSBvcmlnaW5hbCBvbmUuCi0gICAgc3A8TWVkaWFTb3VyY2U+IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7Ci0KLSAgICBpbnQ2NF90IGdldENhY2hlZER1cmF0aW9uVXMoYm9vbCAqbm9Nb3JlRGF0YSA9IE5VTEwpOwotCi0gICAgLy8gSWYgcHJvdmlkZWQgKG5vbi1OVUxMKSwgImNvbnRpbnVlRnVuYyIgd2lsbCBiZSBjYWxsZWQgcmVwZWF0ZWRseQotICAgIC8vIHdoaWxlIHByZXBhcmluZyBhbmQgcHJlcGFyYXRpb24gd2lsbCBmaW5pc2ggZWFybHkgaWYgaXQgcmV0dXJucwotICAgIC8vIGZhbHNlLiBJbiB0aGlzIGNhc2UgIi1FSU5UUiIgaXMgcmV0dXJuZWQgYXMgYSByZXN1bHQuCi0gICAgc3RhdHVzX3QgcHJlcGFyZSgKLSAgICAgICAgICAgIGJvb2wgKCpjb250aW51ZUZ1bmMpKHZvaWQgKmNvb2tpZSkgPSBOVUxMLAotICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QcmVmZXRjaGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBWZWN0b3I8d3A8UHJlZmV0Y2hlZFNvdXJjZT4gPiBtU291cmNlczsKLSAgICBhbmRyb2lkX3RocmVhZF9pZF90IG1UaHJlYWQ7Ci0gICAgYm9vbCBtRG9uZTsKLSAgICBib29sIG1UaHJlYWRFeGl0ZWQ7Ci0KLSAgICB2b2lkIHN0YXJ0VGhyZWFkKCk7Ci0gICAgdm9pZCBzdG9wVGhyZWFkKCk7Ci0KLSAgICBzdGF0aWMgaW50IFRocmVhZFdyYXBwZXIodm9pZCAqbWUpOwotICAgIHZvaWQgdGhyZWFkRnVuYygpOwotCi0gICAgUHJlZmV0Y2hlcihjb25zdCBQcmVmZXRjaGVyICYpOwotICAgIFByZWZldGNoZXIgJm9wZXJhdG9yPShjb25zdCBQcmVmZXRjaGVyICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBQUkVGRVRDSEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZVRhYmxlLmgKaW5kZXggNTMzY2U4NC4uZjgzMDY5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlVGFibGUuaApAQCAtNjAsMTQgKzYwLDIxIEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgICAgIG9mZl90ICpvZmZzZXQsCiAgICAgICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgICAgICB1aW50MzJfdCAqZGVjb2RpbmdUaW1lKTsKKyAgICAgICAgICAgIHVpbnQzMl90ICpkZWNvZGluZ1RpbWUsCisgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMKTsKIAogICAgIGVudW0gewotICAgICAgICBrU3luY1NhbXBsZV9GbGFnID0gMQorICAgICAgICBrRmxhZ0JlZm9yZSwKKyAgICAgICAga0ZsYWdBZnRlciwKKyAgICAgICAga0ZsYWdDbG9zZXN0CiAgICAgfTsKLSAgICBzdGF0dXNfdCBmaW5kQ2xvc2VzdFNhbXBsZSgKKyAgICBzdGF0dXNfdCBmaW5kU2FtcGxlQXRUaW1lKAogICAgICAgICAgICAgdWludDMyX3QgcmVxX3RpbWUsIHVpbnQzMl90ICpzYW1wbGVfaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAorICAgIHN0YXR1c190IGZpbmRTeW5jU2FtcGxlTmVhcigKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKwogICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWxTYW1wbGUodWludDMyX3QgKnNhbXBsZV9pbmRleCk7CiAKIHByb3RlY3RlZDoKQEAgLTk5LDYgKzEwNiw4IEBACiAKICAgICBvZmZfdCBtU3luY1NhbXBsZU9mZnNldDsKICAgICB1aW50MzJfdCBtTnVtU3luY1NhbXBsZXM7CisgICAgdWludDMyX3QgKm1TeW5jU2FtcGxlczsKKyAgICBzaXplX3QgbUxhc3RTeW5jU2FtcGxlSW5kZXg7CiAKICAgICBTYW1wbGVJdGVyYXRvciAqbVNhbXBsZUl0ZXJhdG9yOwogCkBAIC0xMTEsOSArMTIwLDYgQEAKIAogICAgIGZyaWVuZCBzdHJ1Y3QgU2FtcGxlSXRlcmF0b3I7CiAKLSAgICBzdGF0dXNfdCBmaW5kQ2xvc2VzdFN5bmNTYW1wbGVfbCgKLSAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X3NhbXBsZV9pbmRleCwgdWludDMyX3QgKnNhbXBsZV9pbmRleCk7Ci0KICAgICBzdGF0dXNfdCBnZXRTYW1wbGVTaXplX2wodWludDMyX3Qgc2FtcGxlX2luZGV4LCBzaXplX3QgKnNhbXBsZV9zaXplKTsKIAogICAgIFNhbXBsZVRhYmxlKGNvbnN0IFNhbXBsZVRhYmxlICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxNjRiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhST1RUTEVEX1NPVVJDRV9IXworCisjZGVmaW5lIFRIUk9UVExFRF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFRocm90dGxlZFNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBUaHJvdHRsZWRTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgaW50MzJfdCBiYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZl90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZl90ICpzaXplKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOworICAgIGludDMyX3QgbUJhbmR3aWR0aExpbWl0Qnl0ZXNQZXJTZWNvbmQ7CisgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVycmVkOworCisgICAgVGhyb3R0bGVkU291cmNlKGNvbnN0IFRocm90dGxlZFNvdXJjZSAmKTsKKyAgICBUaHJvdHRsZWRTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBUaHJvdHRsZWRTb3VyY2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFRIUk9UVExFRF9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVlBYRGVjb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WUFhEZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I4MzYyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVlBYRGVjb2Rlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZQWF9ERUNPREVSX0hfCisKKyNkZWZpbmUgVlBYX0RFQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQnVmZmVyR3JvdXA7CisKK3N0cnVjdCBWUFhEZWNvZGVyIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBWUFhEZWNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WUFhEZWNvZGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKKyAgICBzaXplX3QgbUJ1ZmZlclNpemU7CisKKyAgICB2b2lkICptQ3R4OworICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1CdWZmZXJHcm91cDsKKworICAgIGludDY0X3QgbVRhcmdldFRpbWVVczsKKworICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OworCisgICAgVlBYRGVjb2Rlcihjb25zdCBWUFhEZWNvZGVyICYpOworICAgIFZQWERlY29kZXIgJm9wZXJhdG9yPShjb25zdCBWUFhEZWNvZGVyICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBWUFhfREVDT0RFUl9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XQVZFeHRyYWN0b3IuaAppbmRleCA5Mzg0OTQyLi5kZjZkM2U3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dBVkV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV0FWRXh0cmFjdG9yLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIApAQCAtNDMsNiArNDQsNyBAQAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtVmFsaWRGb3JtYXQ7CisgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CiAgICAgdWludDE2X3QgbU51bUNoYW5uZWxzOwogICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOwogICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOwpAQCAtNTcsNyArNTksOCBAQAogfTsKIAogYm9vbCBTbmlmZldBVigKLSAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlKTsKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKik7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDA1YjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFWQ19VVElMU19IXworCisjZGVmaW5lIEFWQ19VVElMU19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBGaW5kQVZDRGltZW5zaW9ucygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNlcVBhcmFtU2V0LCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBVkNfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNzIxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1hdHJvc2thRXh0cmFjdG9yLmNwcCAgICAgXAorICAgICAgICBta3ZwYXJzZXIuY3BwICAgICAgICAgICAgIFwKKworTE9DQUxfQ19JTkNMVURFUzo9IFwKKwkkKEpOSV9IX0lOQ0xVREUpIFwKKyAgICAgICAgJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X21hdHJvc2thCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdkNjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsNTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNYXRyb3NrYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk1hdHJvc2thRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJta3ZwYXJzZXIuaHBwIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRGF0YVNvdXJjZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgeworICAgIERhdGFTb3VyY2VSZWFkZXIoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKKyAgICAgICAgOiBtU291cmNlKHNvdXJjZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgaW50IFJlYWQobG9uZyBsb25nIHBvc2l0aW9uLCBsb25nIGxlbmd0aCwgdW5zaWduZWQgY2hhciogYnVmZmVyKSB7CisgICAgICAgIENIRUNLKHBvc2l0aW9uID49IDApOworICAgICAgICBDSEVDSyhsZW5ndGggPj0gMCk7CisKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1Tb3VyY2UtPnJlYWRBdChwb3NpdGlvbiwgYnVmZmVyLCBsZW5ndGgpOworCisgICAgICAgIGlmIChuIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgeworICAgICAgICBvZmZfdCBzaXplOworICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0b3RhbCkgeworICAgICAgICAgICAgKnRvdGFsID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICphdmFpbGFibGUgPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisKKyAgICBEYXRhU291cmNlUmVhZGVyKGNvbnN0IERhdGFTb3VyY2VSZWFkZXIgJik7CisgICAgRGF0YVNvdXJjZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VSZWFkZXIgJik7Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KK3N0YXRpYyB2b2lkIGhleGR1bXAoY29uc3Qgdm9pZCAqX2RhdGEsIHNpemVfdCBzaXplKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopX2RhdGE7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgcHJpbnRmKCIweCUwNHggICIsIG9mZnNldCk7CisKKyAgICAgICAgc2l6ZV90IG4gPSBzaXplIC0gb2Zmc2V0OworICAgICAgICBpZiAobiA+IDE2KSB7CisgICAgICAgICAgICBuID0gMTY7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID09IDgpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG9mZnNldCArIGkgPCBzaXplKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRhdGFbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCIgIik7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpc3ByaW50KGRhdGFbb2Zmc2V0ICsgaV0pKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlYyIsIGRhdGFbb2Zmc2V0ICsgaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaW50ZigiXG4iKTsKKworICAgICAgICBvZmZzZXQgKz0gMTY7CisgICAgfQorfQorCitzdHJ1Y3QgQmxvY2tJdGVyYXRvciB7CisgICAgQmxvY2tJdGVyYXRvcihta3ZwYXJzZXI6OlNlZ21lbnQgKnNlZ21lbnQsIHVuc2lnbmVkIGxvbmcgdHJhY2tOdW0pOworCisgICAgYm9vbCBlb3MoKSBjb25zdDsKKworICAgIHZvaWQgYWR2YW5jZSgpOworICAgIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNlZWsoaW50NjRfdCBzZWVrVGltZVVzKTsKKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrKCkgY29uc3Q7CisgICAgaW50NjRfdCBibG9ja1RpbWVVcygpIGNvbnN0OworCitwcml2YXRlOgorICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CisgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CisKKyAgICBta3ZwYXJzZXI6OkNsdXN0ZXIgKm1DbHVzdGVyOworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2tFbnRyeSAqbUJsb2NrRW50cnk7CisKKyAgICBCbG9ja0l0ZXJhdG9yKGNvbnN0IEJsb2NrSXRlcmF0b3IgJik7CisgICAgQmxvY2tJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IEJsb2NrSXRlcmF0b3IgJik7Cit9OworCitzdHJ1Y3QgTWF0cm9za2FTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIE1hdHJvc2thU291cmNlKAorICAgICAgICAgICAgY29uc3Qgc3A8TWF0cm9za2FFeHRyYWN0b3I+ICZleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworCitwcml2YXRlOgorICAgIGVudW0gVHlwZSB7CisgICAgICAgIEFWQywKKyAgICAgICAgQUFDLAorICAgICAgICBPVEhFUgorICAgIH07CisKKyAgICBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKKyAgICBzaXplX3QgbVRyYWNrSW5kZXg7CisgICAgVHlwZSBtVHlwZTsKKyAgICBCbG9ja0l0ZXJhdG9yIG1CbG9ja0l0ZXI7CisKKyAgICBzdGF0dXNfdCBhZHZhbmNlKCk7CisKKyAgICBNYXRyb3NrYVNvdXJjZShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKKyAgICBNYXRyb3NrYVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE1hdHJvc2thU291cmNlICYpOworfTsKKworTWF0cm9za2FTb3VyY2U6Ok1hdHJvc2thU291cmNlKAorICAgICAgICBjb25zdCBzcDxNYXRyb3NrYUV4dHJhY3Rvcj4gJmV4dHJhY3Rvciwgc2l6ZV90IGluZGV4KQorICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAorICAgICAgbVRyYWNrSW5kZXgoaW5kZXgpLAorICAgICAgbVR5cGUoT1RIRVIpLAorICAgICAgbUJsb2NrSXRlcihtRXh0cmFjdG9yLT5tU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSkgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sobUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhLT4KKyAgICAgICAgICAgIGZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIG1UeXBlID0gQVZDOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgeworICAgICAgICBtVHlwZSA9IEFBQzsKKyAgICB9Cit9CisKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgbUJsb2NrSXRlci5yZXNldCgpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPE1ldGFEYXRhPiBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0Jsb2NrSXRlcmF0b3I6OkJsb2NrSXRlcmF0b3IoCisgICAgICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqc2VnbWVudCwgdW5zaWduZWQgbG9uZyB0cmFja051bSkKKyAgICA6IG1TZWdtZW50KHNlZ21lbnQpLAorICAgICAgbVRyYWNrTnVtKHRyYWNrTnVtKSwKKyAgICAgIG1DbHVzdGVyKE5VTEwpLAorICAgICAgbUJsb2NrRW50cnkoTlVMTCkgeworICAgIHJlc2V0KCk7Cit9CisKK2Jvb2wgQmxvY2tJdGVyYXRvcjo6ZW9zKCkgY29uc3QgeworICAgIHJldHVybiBtQ2x1c3RlciA9PSBOVUxMIHx8IG1DbHVzdGVyLT5FT1MoKTsKK30KKwordm9pZCBCbG9ja0l0ZXJhdG9yOjphZHZhbmNlKCkgeworICAgIHdoaWxlICghZW9zKCkpIHsKKyAgICAgICAgaWYgKG1CbG9ja0VudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1CbG9ja0VudHJ5ID0gbUNsdXN0ZXItPkdldE5leHQobUJsb2NrRW50cnkpOworICAgICAgICB9IGVsc2UgaWYgKG1DbHVzdGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1DbHVzdGVyID0gbVNlZ21lbnQtPkdldE5leHQobUNsdXN0ZXIpOworCisgICAgICAgICAgICBpZiAoZW9zKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUJsb2NrRW50cnkgPSBtQ2x1c3Rlci0+R2V0Rmlyc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtQmxvY2tFbnRyeSAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgbUJsb2NrRW50cnktPkdldEJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgPT0gbVRyYWNrTnVtKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCbG9ja0l0ZXJhdG9yOjpyZXNldCgpIHsKKyAgICBtQ2x1c3RlciA9IG1TZWdtZW50LT5HZXRGaXJzdCgpOworICAgIG1CbG9ja0VudHJ5ID0gbUNsdXN0ZXItPkdldEZpcnN0KCk7CisKKyAgICB3aGlsZSAoIWVvcygpICYmIGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQmxvY2tJdGVyYXRvcjo6c2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKKyAgICBtQ2x1c3RlciA9IG1TZWdtZW50LT5HZXRDbHVzdGVyKHNlZWtUaW1lVXMgKiAxMDAwbGwpOworICAgIG1CbG9ja0VudHJ5ID0gbUNsdXN0ZXIgIT0gTlVMTCA/IG1DbHVzdGVyLT5HZXRGaXJzdCgpIDogTlVMTDsKKworICAgIHdoaWxlICghZW9zKCkgJiYgYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pIHsKKyAgICAgICAgYWR2YW5jZSgpOworICAgIH0KKworICAgIHdoaWxlICghZW9zKCkgJiYgIW1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5Jc0tleSgpKSB7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9Cit9CisKK2NvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKkJsb2NrSXRlcmF0b3I6OmJsb2NrKCkgY29uc3QgeworICAgIENIRUNLKCFlb3MoKSk7CisKKyAgICByZXR1cm4gbUJsb2NrRW50cnktPkdldEJsb2NrKCk7Cit9CisKK2ludDY0X3QgQmxvY2tJdGVyYXRvcjo6YmxvY2tUaW1lVXMoKSBjb25zdCB7CisgICAgcmV0dXJuIChtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+R2V0VGltZShtQ2x1c3RlcikgKyA1MDBsbCkgLyAxMDAwbGw7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBtQmxvY2tJdGVyLnNlZWsoc2Vla1RpbWVVcyk7CisgICAgfQorCisgICAgaWYgKG1CbG9ja0l0ZXIuZW9zKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CisgICAgc2l6ZV90IHNpemUgPSBibG9jay0+R2V0U2l6ZSgpOworICAgIGludDY0X3QgdGltZVVzID0gbUJsb2NrSXRlci5ibG9ja1RpbWVVcygpOworCisgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihzaXplICsgMik7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBibG9jay0+SXNLZXkoKSk7CisKKyAgICBsb25nIHJlcyA9IGJsb2NrLT5SZWFkKAorICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVJlYWRlciwgKHVuc2lnbmVkIGNoYXIgKilidWZmZXItPmRhdGEoKSArIDIpOworCisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDIsIHNpemUpOworCisgICAgaWYgKG1UeXBlID09IEFWQykgeworICAgICAgICBDSEVDSyhzaXplID49IDIpOworCisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpOworCisgICAgICAgIHVuc2lnbmVkIE5BTHNpemUgPSBkYXRhWzJdIDw8IDggfCBkYXRhWzNdOworICAgICAgICBDSEVDS19FUShzaXplLCBOQUxzaXplICsgMik7CisKKyAgICAgICAgbWVtY3B5KGRhdGEsICJceDAwXHgwMFx4MDBceDAxIiwgNCk7CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUgKyAyKTsKKyAgICB9IGVsc2UgaWYgKG1UeXBlID09IEFBQykgeworICAgICAgICAvLyBUaGVyZSdzIHN0cmFuZ2UganVuayBhdCB0aGUgYmVnaW5uaW5nLi4uCisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyAyOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IHNpemUgJiYgZGF0YVtvZmZzZXRdICE9IDB4MjEpIHsKKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDIgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOworICAgIH0KKworICAgICpvdXQgPSBidWZmZXI7CisKKyNpZiAwCisgICAgaGV4ZHVtcCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworI2VuZGlmCisKKyAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKKworICAgIHJldHVybiBPSzsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpCisgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZVJlYWRlcihtRGF0YVNvdXJjZSkpLAorICAgICAgbVNlZ21lbnQoTlVMTCksCisgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyhmYWxzZSkgeworICAgIG1rdnBhcnNlcjo6RUJNTEhlYWRlciBlYm1sSGVhZGVyOworICAgIGxvbmcgbG9uZyBwb3M7CisgICAgaWYgKGVibWxIZWFkZXIuUGFyc2UobVJlYWRlciwgcG9zKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvbmcgbG9uZyByZXQgPQorICAgICAgICBta3ZwYXJzZXI6OlNlZ21lbnQ6OkNyZWF0ZUluc3RhbmNlKG1SZWFkZXIsIHBvcywgbVNlZ21lbnQpOworCisgICAgaWYgKHJldCkgeworICAgICAgICBDSEVDSyhtU2VnbWVudCA9PSBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkKCk7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBkZWxldGUgbVNlZ21lbnQ7CisgICAgICAgIG1TZWdtZW50ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFkZFRyYWNrcygpOworfQorCitNYXRyb3NrYUV4dHJhY3Rvcjo6fk1hdHJvc2thRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtU2VnbWVudDsKKyAgICBtU2VnbWVudCA9IE5VTEw7CisKKyAgICBkZWxldGUgbVJlYWRlcjsKKyAgICBtUmVhZGVyID0gTlVMTDsKK30KKworc2l6ZV90IE1hdHJvc2thRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKK3NwPE1lZGlhU291cmNlPiBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgTWF0cm9za2FTb3VyY2UodGhpcywgaW5kZXgpOworfQorCitzcDxNZXRhRGF0YT4gTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKChmbGFncyAmIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpICYmICFtRXh0cmFjdGVkVGh1bWJuYWlscykgeworICAgICAgICBmaW5kVGh1bWJuYWlscygpOworICAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKK30KKworc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21BdWRpb1NwZWNpZmljSW5mbygKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBjb25zdCB2b2lkICphc2ksIHNpemVfdCBhc2lTaXplKSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKKyAgICAgICAgMHgwMywgMjIsCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAvLyBFU19JRAorICAgICAgICAweDAwLCAgICAgICAgICAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAgICAgMHgwNCwgMTcsCisgICAgICAgIDB4NDAsICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworICAgICAgICAweDA1LAorICAgICAgICAvLyBBdWRpb1NwZWNpZmljSW5mbyAod2l0aCBzaXplIHByZWZpeCkgZm9sbG93cworICAgIH07CisKKyAgICBDSEVDSyhhc2lTaXplIDwgMTI4KTsKKyAgICBzaXplX3QgZXNkc1NpemUgPSBzaXplb2Yoa1N0YXRpY0VTRFMpICsgYXNpU2l6ZSArIDE7CisgICAgdWludDhfdCAqZXNkcyA9IG5ldyB1aW50OF90W2VzZHNTaXplXTsKKyAgICBtZW1jcHkoZXNkcywga1N0YXRpY0VTRFMsIHNpemVvZihrU3RhdGljRVNEUykpOworICAgIHVpbnQ4X3QgKnB0ciA9IGVzZHMgKyBzaXplb2Yoa1N0YXRpY0VTRFMpOworICAgICpwdHIrKyA9IGFzaVNpemU7CisgICAgbWVtY3B5KHB0ciwgYXNpLCBhc2lTaXplKTsKKworICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKworICAgIGRlbGV0ZVtdIGVzZHM7CisgICAgZXNkcyA9IE5VTEw7Cit9CisKK3ZvaWQgYWRkVm9yYmlzQ29kZWNJbmZvKAorICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsCisgICAgICAgIGNvbnN0IHZvaWQgKl9jb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CisgICAgLy8gcHJpbnRmKCJ2b3JiaXMgcHJpdmF0ZSBkYXRhIGZvbGxvd3M6XG4iKTsKKyAgICAvLyBoZXhkdW1wKF9jb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworCisgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAzKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZSA9IChjb25zdCB1aW50OF90ICopX2NvZGVjUHJpdmF0ZTsKKyAgICBDSEVDSyhjb2RlY1ByaXZhdGVbMF0gPT0gMHgwMik7CisKKyAgICBzaXplX3QgbGVuMSA9IGNvZGVjUHJpdmF0ZVsxXTsKKyAgICBzaXplX3QgbGVuMiA9IGNvZGVjUHJpdmF0ZVsyXTsKKworICAgIENIRUNLKGNvZGVjUHJpdmF0ZVNpemUgPiAzICsgbGVuMSArIGxlbjIpOworCisgICAgQ0hFQ0soY29kZWNQcml2YXRlWzNdID09IDB4MDEpOworICAgIG1ldGEtPnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsICZjb2RlY1ByaXZhdGVbM10sIGxlbjEpOworCisgICAgQ0hFQ0soY29kZWNQcml2YXRlW2xlbjEgKyAzXSA9PSAweDAzKTsKKworICAgIENIRUNLKGNvZGVjUHJpdmF0ZVtsZW4xICsgbGVuMiArIDNdID09IDB4MDUpOworICAgIG1ldGEtPnNldERhdGEoCisgICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbbGVuMSArIGxlbjIgKyAzXSwKKyAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBsZW4xIC0gbGVuMiAtIDMpOworfQorCit2b2lkIE1hdHJvc2thRXh0cmFjdG9yOjphZGRUcmFja3MoKSB7CisgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFja3MgKnRyYWNrcyA9IG1TZWdtZW50LT5HZXRUcmFja3MoKTsKKworICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja3MtPkdldFRyYWNrc0NvdW50KCk7ICsraW5kZXgpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2sgPSB0cmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7CisKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3QgY29kZWNJRCA9IHRyYWNrLT5HZXRDb2RlY0lkKCk7CisgICAgICAgIExPR1YoImNvZGVjIGlkID0gJXMiLCBjb2RlY0lEKTsKKyAgICAgICAgTE9HVigiY29kZWMgbmFtZSA9ICVzIiwgdHJhY2stPkdldENvZGVjTmFtZUFzVVRGOCgpKTsKKworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29kZWNQcml2YXRlID0KKyAgICAgICAgICAgIHRyYWNrLT5HZXRDb2RlY1ByaXZhdGUoJmNvZGVjUHJpdmF0ZVNpemUpOworCisgICAgICAgIGVudW0geyBWSURFT19UUkFDSyA9IDEsIEFVRElPX1RSQUNLID0gMiB9OworCisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworCisgICAgICAgIHN3aXRjaCAodHJhY2stPkdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBWSURFT19UUkFDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjayA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqPih0cmFjayk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUFgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgdnRyYWNrLT5HZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCB2dHJhY2stPkdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBVURJT19UUkFDSzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKmF0cmFjayA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqPih0cmFjayk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiQV9BQUMiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAyKTsKKworICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUF1ZGlvU3BlY2lmaWNJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX1ZPUkJJUyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworCisgICAgICAgICAgICAgICAgICAgIGFkZFZvcmJpc0NvZGVjSW5mbyhtZXRhLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBsb25nIGR1cmF0aW9uTnMgPSBtU2VnbWVudC0+R2V0RHVyYXRpb24oKTsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKKworICAgICAgICBtVHJhY2tzLnB1c2goKTsKKyAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CisgICAgICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOworICAgICAgICB0cmFja0luZm8tPm1NZXRhID0gbWV0YTsKKyAgICB9Cit9CisKK3ZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmZpbmRUaHVtYm5haWxzKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIENIRUNLKGluZm8tPm1NZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIobVNlZ21lbnQsIGluZm8tPm1UcmFja051bSk7CisgICAgICAgIGludDMyX3QgaSA9IDA7CisgICAgICAgIGludDY0X3QgdGh1bWJuYWlsVGltZVVzID0gMDsKKyAgICAgICAgc2l6ZV90IG1heEJsb2NrU2l6ZSA9IDA7CisgICAgICAgIHdoaWxlICghaXRlci5lb3MoKSAmJiBpIDwgMjApIHsKKyAgICAgICAgICAgIGlmIChpdGVyLmJsb2NrKCktPklzS2V5KCkpIHsKKyAgICAgICAgICAgICAgICArK2k7CisKKyAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tTaXplID0gaXRlci5ibG9jaygpLT5HZXRTaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrU2l6ZSA+IG1heEJsb2NrU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhCbG9ja1NpemUgPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbFRpbWVVcyA9IGl0ZXIuYmxvY2tUaW1lVXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICBpbmZvLT5tTWV0YS0+c2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisgICAgfQorfQorCitzcDxNZXRhRGF0YT4gTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworCisgICAgcmV0dXJuIG1ldGE7Cit9CisKK2Jvb2wgU25pZmZNYXRyb3NrYSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKikgeworICAgIERhdGFTb3VyY2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CisgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CisgICAgbG9uZyBsb25nIHBvczsKKyAgICBpZiAoZWJtbEhlYWRlci5QYXJzZSgmcmVhZGVyLCBwb3MpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWltZVR5cGUtPnNldFRvKE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CisgICAgKmNvbmZpZGVuY2UgPSAwLjY7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjBiODQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXworCisjZGVmaW5lIE1BVFJPU0tBX0VYVFJBQ1RPUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIG1rdnBhcnNlciB7CitzdHJ1Y3QgU2VnbWVudDsKK307CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworY2xhc3MgU3RyaW5nODsKKworc3RydWN0IERhdGFTb3VyY2VSZWFkZXI7CitzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7CisKK3N0cnVjdCBNYXRyb3NrYUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CisgICAgTWF0cm9za2FFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOworCisgICAgdmlydHVhbCBzcDxNZWRpYVNvdXJjZT4gZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldE1ldGFEYXRhKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NYXRyb3NrYUV4dHJhY3RvcigpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CisgICAgICAgIHNwPE1ldGFEYXRhPiBtTWV0YTsKKyAgICB9OworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlUmVhZGVyICptUmVhZGVyOworICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CisgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKKworICAgIHZvaWQgYWRkVHJhY2tzKCk7CisgICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOworCisgICAgTWF0cm9za2FFeHRyYWN0b3IoY29uc3QgTWF0cm9za2FFeHRyYWN0b3IgJik7CisgICAgTWF0cm9za2FFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKK307CisKK2Jvb2wgU25pZmZNYXRyb3NrYSgKKyAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICBzcDxBTWVzc2FnZT4gKik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUFUUk9TS0FfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9ta3ZwYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvbWt2cGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUxMDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvbWt2cGFyc2VyLmNwcApAQCAtMCwwICsxLDMxMDMgQEAKKyNpbmNsdWRlICJta3ZwYXJzZXIuaHBwIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbWt2cGFyc2VyOjpJTWt2UmVhZGVyOjp+SU1rdlJlYWRlcigpCit7Cit9CisKK2xvbmcgbG9uZyBta3ZwYXJzZXI6OlJlYWRVSW50KElNa3ZSZWFkZXIqIHBSZWFkZXIsIGxvbmcgbG9uZyBwb3MsIGxvbmcmIGxlbikKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KHBvcyA8IGF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KChhdmFpbGFibGUgLSBwb3MpID49IDEpOyAgLy9hc3N1bWUgaGVyZSBtYXggdS1pbnQgbGVuIGlzIDgKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmYik7CisgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgcmV0dXJuIGhyOworICAgICAgICAKKyAgICBhc3NlcnQoaHIgPT0gMEwpOworICAgIAorICAgIGlmIChiICYgMHg4MCkgICAgICAgLy8xMDAwIDAwMDAKKyAgICB7CisgICAgICAgIGxlbiA9IDE7CisgICAgICAgIGIgJj0gMHg3RjsgICAgICAvLzAxMTEgMTExMQorICAgIH0gICAgICAgIAorICAgIGVsc2UgaWYgKGIgJiAweDQwKSAgLy8wMTAwIDAwMDAKKyAgICB7CisgICAgICAgIGxlbiA9IDI7CisgICAgICAgIGIgJj0gMHgzRjsgICAgICAvLzAwMTEgMTExMQorICAgIH0KKyAgICBlbHNlIGlmIChiICYgMHgyMCkgIC8vMDAxMCAwMDAwCisgICAgeworICAgICAgICBsZW4gPSAzOworICAgICAgICBiICY9IDB4MUY7ICAgICAgLy8wMDAxIDExMTEKKyAgICB9CisgICAgZWxzZSBpZiAoYiAmIDB4MTApICAvLzAwMDEgMDAwMAorICAgIHsKKyAgICAgICAgbGVuID0gNDsKKyAgICAgICAgYiAmPSAweDBGOyAgICAgIC8vMDAwMCAxMTExCisgICAgfQorICAgIGVsc2UgaWYgKGIgJiAweDA4KSAgLy8wMDAwIDEwMDAKKyAgICB7CisgICAgICAgIGxlbiA9IDU7CisgICAgICAgIGIgJj0gMHgwNzsgICAgICAvLzAwMDAgMDExMQorICAgIH0KKyAgICBlbHNlIGlmIChiICYgMHgwNCkgIC8vMDAwMCAwMTAwCisgICAgeworICAgICAgICBsZW4gPSA2OworICAgICAgICBiICY9IDB4MDM7ICAgICAgLy8wMDAwIDAwMTEKKyAgICB9CisgICAgZWxzZSBpZiAoYiAmIDB4MDIpICAvLzAwMDAgMDAxMAorICAgIHsKKyAgICAgICAgbGVuID0gNzsKKyAgICAgICAgYiAmPSAweDAxOyAgICAgIC8vMDAwMCAwMDAxCisgICAgfQorICAgIGVsc2UgCisgICAgeworICAgICAgICBhc3NlcnQoYiAmIDB4MDEpOyAgLy8wMDAwIDAwMDEKKyAgICAgICAgbGVuID0gODsKKyAgICAgICAgYiA9IDA7ICAgICAgICAgICAgIC8vMDAwMCAwMDAwCisgICAgfQorICAgIAorICAgIGFzc2VydCgoYXZhaWxhYmxlIC0gcG9zKSA+PSBsZW4pOworICAgIAorICAgIGxvbmcgbG9uZyByZXN1bHQgPSBiOworICAgICsrcG9zOworICAgIGZvciAobG9uZyBpID0gMTsgaSA8IGxlbjsgKytpKQorICAgIHsKKyAgICAgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgJmIpOworICAgICAgICAKKyAgICAgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBocjsKKyAgICAgICAgICAgIAorICAgICAgICBhc3NlcnQoaHIgPT0gMEwpOworICAgICAgICAKKyAgICAgICAgcmVzdWx0IDw8PSA4OworICAgICAgICByZXN1bHQgfD0gYjsKKyAgICAgICAgCisgICAgICAgICsrcG9zOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorICAgIAorICAgIAorbG9uZyBsb25nIG1rdnBhcnNlcjo6R2V0VUludExlbmd0aCgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLAorICAgIGxvbmcgbG9uZyBwb3MsIAorICAgIGxvbmcmIGxlbikKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgCisgICAgaWYgKHBvcyA+PSBhdmFpbGFibGUpCisgICAgICAgIHJldHVybiBwb3M7ICAvL3RvbyBmZXcgYnl0ZXMgYXZhaWxhYmxlCisgICAgCisgICAgdW5zaWduZWQgY2hhciBiOworICAgIAorICAgIGhyID0gcFJlYWRlci0+UmVhZChwb3MsIDEsICZiKTsKKyAgICAKKyAgICBpZiAoaHIgPCAwKQorICAgICAgICByZXR1cm4gaHI7CisKKyAgICBhc3NlcnQoaHIgPT0gMEwpOworICAgIAorICAgIGlmIChiID09IDApICAvL3dlIGNhbid0IGhhbmRsZSB1LWludCB2YWx1ZXMgbGFyZ2VyIHRoYW4gOCBieXRlcworICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgIAorICAgIHVuc2lnbmVkIGNoYXIgbSA9IDB4ODA7CisgICAgbGVuID0gMTsKKyAgICAKKyAgICB3aGlsZSAoIShiICYgbSkpCisgICAgeworICAgICAgICBtID4+PSAxOworICAgICAgICArK2xlbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIDA7ICAvL3N1Y2Nlc3MKK30KKworCitsb25nIGxvbmcgbWt2cGFyc2VyOjpTeW5jUmVhZFVJbnQoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcgcG9zLCAKKyAgICBsb25nIGxvbmcgc3RvcCwKKyAgICBsb25nJiBsZW4pCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworCisgICAgaWYgKHBvcyA+PSBzdG9wKQorICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgIAorICAgIHVuc2lnbmVkIGNoYXIgYjsKKyAgICAKKyAgICBsb25nIGhyID0gcFJlYWRlci0+UmVhZChwb3MsIDEsICZiKTsKKyAgICAKKyAgICBpZiAoaHIgPCAwKQorICAgICAgICByZXR1cm4gaHI7CisgICAgICAgIAorICAgIGlmIChociAhPSAwTCkKKyAgICAgICAgcmV0dXJuIEVfQlVGRkVSX05PVF9GVUxMOworCisgICAgaWYgKGIgPT0gMCkgIC8vd2UgY2FuJ3QgaGFuZGxlIHUtaW50IHZhbHVlcyBsYXJnZXIgdGhhbiA4IGJ5dGVzCisgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgCisgICAgdW5zaWduZWQgY2hhciBtID0gMHg4MDsKKyAgICBsZW4gPSAxOworICAgICAgICAKKyAgICB3aGlsZSAoIShiICYgbSkpCisgICAgeworICAgICAgICBtID4+PSAxOworICAgICAgICArK2xlbjsKKyAgICB9CisgICAgCisgICAgaWYgKChwb3MgKyBsZW4pID4gc3RvcCkKKyAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgCisgICAgbG9uZyBsb25nIHJlc3VsdCA9IGIgJiAofm0pOworICAgICsrcG9zOworICAgIAorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyArK2kpCisgICAgeworICAgICAgICBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmYik7CisgICAgICAgIAorICAgICAgICBpZiAoaHIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGhyOworICAgICAgICAgICAKKyAgICAgICAgaWYgKGhyICE9IDBMKQorICAgICAgICAgICAgcmV0dXJuIEVfQlVGRkVSX05PVF9GVUxMOworICAgICAgICAgICAgCisgICAgICAgIHJlc3VsdCA8PD0gODsKKyAgICAgICAgcmVzdWx0IHw9IGI7CisgICAgICAgIAorICAgICAgICArK3BvczsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitsb25nIGxvbmcgbWt2cGFyc2VyOjpVbnNlcmlhbGl6ZVVJbnQoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwgCisgICAgbG9uZyBsb25nIHBvcywKKyAgICBsb25nIGxvbmcgc2l6ZSkKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICBhc3NlcnQoc2l6ZSA+IDApOworICAgIGFzc2VydChzaXplIDw9IDgpOworICAgIAorICAgIGxvbmcgbG9uZyByZXN1bHQgPSAwOworICAgIAorICAgIGZvciAobG9uZyBsb25nIGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBiOworICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmYik7CisgICAgICAgIAorICAgICAgICBpZiAoaHIgPCAwKSAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGhyOworICAgICAgICByZXN1bHQgPDw9IDg7CisgICAgICAgIHJlc3VsdCB8PSBiOworICAgICAgICAKKyAgICAgICAgKytwb3M7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworZmxvYXQgbWt2cGFyc2VyOjpVbnNlcmlhbGl6ZTRGbG9hdCgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLCAKKyAgICBsb25nIGxvbmcgcG9zKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworICAgIAorICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgYXNzZXJ0KChwb3MgKyA0KSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIGZsb2F0IHJlc3VsdDsKKyAgICAKKyAgICB1bnNpZ25lZCBjaGFyKiBjb25zdCBwID0gKHVuc2lnbmVkIGNoYXIqKSZyZXN1bHQ7CisgICAgdW5zaWduZWQgY2hhciogcSA9IHAgKyA0OworICAgIAorICAgIGZvciAoOzspCisgICAgeworICAgICAgICBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAtLXEpOworICAgICAgICBhc3NlcnQoaHIgPT0gMEwpOworICAgICAgICAKKyAgICAgICAgaWYgKHEgPT0gcCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICsrcG9zOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2RvdWJsZSBta3ZwYXJzZXI6OlVuc2VyaWFsaXplOERvdWJsZSgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLCAKKyAgICBsb25nIGxvbmcgcG9zKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGRvdWJsZSByZXN1bHQ7CisgICAgCisgICAgdW5zaWduZWQgY2hhciogY29uc3QgcCA9ICh1bnNpZ25lZCBjaGFyKikmcmVzdWx0OworICAgIHVuc2lnbmVkIGNoYXIqIHEgPSBwICsgODsKKyAgICAKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgICAgY29uc3QgbG9uZyBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAtLXEpOworICAgICAgICBhc3NlcnQoaHIgPT0gMEwpOworICAgICAgICAKKyAgICAgICAgaWYgKHEgPT0gcCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgICsrcG9zOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzaWduZWQgY2hhciBta3ZwYXJzZXI6OlVuc2VyaWFsaXplMVNJbnQoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcgcG9zKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworIAorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworCisgICAgbG9uZyBociA9IHBSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIGFzc2VydChociA9PSAwKTsgICAKKyAgICBhc3NlcnQoYXZhaWxhYmxlIDw9IHRvdGFsKTsKKyAgICBhc3NlcnQocG9zIDwgYXZhaWxhYmxlKTsKKworICAgIHNpZ25lZCBjaGFyIHJlc3VsdDsKKworICAgIGhyID0gcFJlYWRlci0+UmVhZChwb3MsIDEsICh1bnNpZ25lZCBjaGFyKikmcmVzdWx0KTsKKyAgICBhc3NlcnQoaHIgPT0gMCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzaG9ydCBta3ZwYXJzZXI6OlVuc2VyaWFsaXplMlNJbnQoCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwgCisgICAgbG9uZyBsb25nIHBvcykKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKyAgICAKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIGFzc2VydCgocG9zICsgMikgPD0gYXZhaWxhYmxlKTsKKyAgICAKKyAgICBzaG9ydCByZXN1bHQ7CisgICAgCisgICAgdW5zaWduZWQgY2hhciogY29uc3QgcCA9ICh1bnNpZ25lZCBjaGFyKikmcmVzdWx0OworICAgIHVuc2lnbmVkIGNoYXIqIHEgPSBwICsgMjsKKyAgICAKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcywgMSwgLS1xKTsKKyAgICAgICAgYXNzZXJ0KGhyID09IDBMKTsKKyAgICAgICAgCisgICAgICAgIGlmIChxID09IHApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICArK3BvczsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sIG1rdnBhcnNlcjo6TWF0Y2goCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcmIHBvcywKKyAgICB1bnNpZ25lZCBsb25nIGlkXywKKyAgICBsb25nIGxvbmcmIHZhbCkKKworeworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworCisgICAgbG9uZyBociA9IHBSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIGFzc2VydChociA+PSAwKTsKKyAgICBhc3NlcnQoYXZhaWxhYmxlIDw9IHRvdGFsKTsKKyAgICAKKyAgICBsb25nIGxlbjsKKworICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoaWQgPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGFzc2VydChsZW4gPD0gOCk7CisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IGF2YWlsYWJsZSk7CisgICAgCisgICAgaWYgKCh1bnNpZ25lZCBsb25nKWlkICE9IGlkXykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisgICAgYXNzZXJ0KHNpemUgPD0gOCk7CisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGFzc2VydChsZW4gPD0gOCk7CisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IGF2YWlsYWJsZSk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBwYXlsb2FkCisgICAgCisgICAgdmFsID0gVW5zZXJpYWxpemVVSW50KHBSZWFkZXIsIHBvcywgc2l6ZSk7CisgICAgYXNzZXJ0KHZhbCA+PSAwKTsKKyAgICAKKyAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBzaXplIG9mIHBheWxvYWQKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBta3ZwYXJzZXI6Ok1hdGNoKAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nJiBwb3MsCisgICAgdW5zaWduZWQgbG9uZyBpZF8sCisgICAgY2hhciomIHZhbCkKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgCisgICAgbG9uZyBsZW47CisKKyAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KGlkID49IDApOworICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICBhc3NlcnQobGVuIDw9IDgpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIGlmICgodW5zaWduZWQgbG9uZylpZCAhPSBpZF8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNpemVfID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChzaXplXyA+PSAwKTsKKyAgICBhc3NlcnQobGVuID4gMCk7CisgICAgYXNzZXJ0KGxlbiA8PSA4KTsKKyAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gYXZhaWxhYmxlKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplIG9mIHBheWxvYWQKKyAgICBhc3NlcnQoKHBvcyArIHNpemVfKSA8PSBhdmFpbGFibGUpOworCisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemVfKTsgICAgCisgICAgdmFsID0gbmV3IGNoYXJbc2l6ZSsxXTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgIHsKKyAgICAgICAgY2hhciBjOworCisgICAgICAgIGhyID0gcFJlYWRlci0+UmVhZChwb3MgKyBpLCAxLCAodW5zaWduZWQgY2hhciopJmMpOworICAgICAgICBhc3NlcnQoaHIgPT0gMEwpOworICAgICAgICAgICAgCisgICAgICAgIHZhbFtpXSA9IGM7CisgICAKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOyAgICAgCisgICAKKyAgICB9CisKKyAgICB2YWxbc2l6ZV0gPSAnXDAnOworICAgIHBvcyArPSBzaXplXzsgIC8vY29uc3VtZSBzaXplIG9mIHBheWxvYWQKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmIDAKK2Jvb2wgbWt2cGFyc2VyOjpNYXRjaCgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLAorICAgIGxvbmcgbG9uZyYgcG9zLAorICAgIHVuc2lnbmVkIGxvbmcgaWQsCisgICAgd2NoYXJfdComIHZhbCkKK3sKKyAgICBjaGFyKiBzdHI7CisgICAgCisgICAgaWYgKCFNYXRjaChwUmVhZGVyLCBwb3MsIGlkLCBzdHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1ic3Rvd2NzKE5VTEwsIHN0ciwgMCk7CisgICAgICAgCisgICAgaWYgKHNpemUgPT0gMCkgCisgICAgICAgIHZhbCA9IE5VTEw7CisgICAgZWxzZSAKKyAgICB7IAorICAgICAgICB2YWwgPSBuZXcgd2NoYXJfdFtzaXplKzFdOworICAgICAgICBtYnN0b3djcyh2YWwsIHN0ciwgc2l6ZSk7CisgICAgICAgIHZhbFtzaXplXSA9IEwnXDAnOworICAgIH0KKworICAgIGRlbGV0ZVtdIHN0cjsKKyAgICByZXR1cm4gdHJ1ZTsgICAgCit9CisjZW5kaWYKKworCitib29sIG1rdnBhcnNlcjo6TWF0Y2goCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcmIHBvcywKKyAgICB1bnNpZ25lZCBsb25nIGlkXywKKyAgICB1bnNpZ25lZCBjaGFyKiYgdmFsLAorICAgIHNpemVfdCAqb3B0aW9uYWxTaXplKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworCisgICAgbG9uZyBociA9IHBSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIGFzc2VydChociA+PSAwKTsKKyAgICBhc3NlcnQoYXZhaWxhYmxlIDw9IHRvdGFsKTsKKyAgICAKKyAgICBsb25nIGxlbjsKKyAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KGlkID49IDApOworICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICBhc3NlcnQobGVuIDw9IDgpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIGlmICgodW5zaWduZWQgbG9uZylpZCAhPSBpZF8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplXyA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2l6ZV8gPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGFzc2VydChsZW4gPD0gOCk7CisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IGF2YWlsYWJsZSk7CisgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBwYXlsb2FkCisgICAgYXNzZXJ0KChwb3MgKyBzaXplXykgPD0gYXZhaWxhYmxlKTsKKworICAgIGNvbnN0IHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzaXplXyk7ICAgIAorICAgIHZhbCA9IG5ldyB1bnNpZ25lZCBjaGFyW3NpemVdOworIAorICAgIGlmIChvcHRpb25hbFNpemUpIHsKKyAgICAgICAgKm9wdGlvbmFsU2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICAgICAgaHIgPSBwUmVhZGVyLT5SZWFkKHBvcyArIGksIDEsICZiKTsKKyAgICAgICAgYXNzZXJ0KGhyID09IDBMKTsKKworICAgICAgICB2YWxbaV0gPSBiOyAKKyAgICB9CisgICAgCisgICAgcG9zICs9IHNpemVfOyAgLy9jb25zdW1lIHNpemUgb2YgcGF5bG9hZCAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIG1rdnBhcnNlcjo6TWF0Y2goCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcmIHBvcywKKyAgICB1bnNpZ25lZCBsb25nIGlkXywKKyAgICBkb3VibGUmIHZhbCkKK3sKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KHBvcyA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKworICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgbG9uZyBpZGxlbjsKKyAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGlkbGVuKTsKKyAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE8KKyAgICAKKyAgICBpZiAoKHVuc2lnbmVkIGxvbmcpaWQgIT0gaWRfKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBsb25nIHNpemVsZW47CisgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MgKyBpZGxlbiwgc2l6ZWxlbik7CisKKyAgICBzd2l0Y2ggKHNpemUpCisgICAgewkKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwb3MgKz0gaWRsZW4gKyBzaXplbGVuOyAgLy9jb25zdW1lIGlkIGFuZCBzaXplIGZpZWxkcworICAgIGFzc2VydCgocG9zICsgc2l6ZSkgPD0gYXZhaWxhYmxlKTsKKworICAgIGlmIChzaXplID09IDQpCisgICAgICAgIHZhbCA9IFVuc2VyaWFsaXplNEZsb2F0KHBSZWFkZXIsIHBvcyk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KHNpemUgPT0gOCk7CisgICAgICAgIHZhbCA9IFVuc2VyaWFsaXplOERvdWJsZShwUmVhZGVyLCBwb3MpOworICAgIH0KKyAgICAKKyAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBzaXplIG9mIHBheWxvYWQKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIG1rdnBhcnNlcjo6TWF0Y2goCisgICAgSU1rdlJlYWRlciogcFJlYWRlciwKKyAgICBsb25nIGxvbmcmIHBvcywKKyAgICB1bnNpZ25lZCBsb25nIGlkXywKKyAgICBzaG9ydCYgdmFsKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworCisgICAgbG9uZyBociA9IHBSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgIGFzc2VydChociA+PSAwKTsKKyAgICBhc3NlcnQoYXZhaWxhYmxlIDw9IHRvdGFsKTsKKyAgICAKKyAgICBsb25nIGxlbjsKKyAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgYXNzZXJ0KGlkID49IDApOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgIAorICAgIGlmICgodW5zaWduZWQgbG9uZylpZCAhPSBpZF8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChzaXplIDw9IDIpOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBhdmFpbGFibGUpOworICAgCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZSBvZiBwYXlsb2FkCisgICAgYXNzZXJ0KChwb3MgKyBzaXplKSA8PSBhdmFpbGFibGUpOworCisgICAgLy9UT0RPOgorICAgIC8vIEdlbmVyYWxpemUgdGhpcyB0byB3b3JrIGZvciBhbnkgc2l6ZSBzaWduZWQgaW50CisgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgdmFsID0gVW5zZXJpYWxpemUxU0ludChwUmVhZGVyLCBwb3MpOworICAgIGVsc2UgCisgICAgICAgIHZhbCA9IFVuc2VyaWFsaXplMlNJbnQocFJlYWRlciwgcG9zKTsKKyAgICAgICAgCisgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgc2l6ZSBvZiBwYXlsb2FkCisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworbmFtZXNwYWNlIG1rdnBhcnNlcgoreworCitFQk1MSGVhZGVyOjpFQk1MSGVhZGVyKCk6CisgICAgbV9kb2NUeXBlKE5VTEwpCit7Cit9CisKK0VCTUxIZWFkZXI6On5FQk1MSGVhZGVyKCkKK3sKKyAgICBkZWxldGVbXSBtX2RvY1R5cGU7Cit9CisKK2xvbmcgbG9uZyBFQk1MSGVhZGVyOjpQYXJzZSgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLAorICAgIGxvbmcgbG9uZyYgcG9zKQoreworICAgIGFzc2VydChwUmVhZGVyKTsKKyAgICAKKyAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKyAgICAKKyAgICBsb25nIGhyID0gcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgCisgICAgaWYgKGhyIDwgMCkgCisgICAgICAgIHJldHVybiBocjsKKyAgICAKKyAgICBwb3MgPSAwOyAgICAKKyAgICBsb25nIGxvbmcgZW5kID0gKDEwMjQgPCBhdmFpbGFibGUpPyAxMDI0OiBhdmFpbGFibGU7ICAgIAorCisgICAgZm9yICg7OykKKyAgICB7ICAgIAorICAgICAgICB1bnNpZ25lZCBjaGFyIGIgPSAwOworICAgIAorICAgICAgICB3aGlsZSAocG9zIDwgZW5kKQorICAgICAgICB7CisgICAgICAgICAgICBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmYik7CisgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGhyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaHI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChiID09IDB4MUEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICArK3BvczsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAoYiAhPSAweDFBKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHBvcyA+PSAxMDI0KSB8fAorICAgICAgICAgICAgICAgIChhdmFpbGFibGUgPj0gdG90YWwpIHx8IAorICAgICAgICAgICAgICAgICgodG90YWwgLSBhdmFpbGFibGUpIDwgNSkpCisgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlICsgNTsgIC8vNSA9IDQtYnl0ZSBJRCArIDFzdCBieXRlIG9mIHNpemUKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiAoKHRvdGFsIC0gcG9zKSA8IDUpCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGlmICgoYXZhaWxhYmxlIC0gcG9zKSA8IDUpCisgICAgICAgICAgICByZXR1cm4gcG9zICsgNTsgIC8vdHJ5IGFnYWluIGxhdGVyCisKKyAgICAgICAgbG9uZyBsZW47ICAgICAgICAgICAgCisKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHJlc3VsdCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0ID09IDB4MEE0NURGQTMpICAvL1JlYWRJZCBtYXNrcy1vZmYgbGVuZ3RoIGluZGljYXRvciBiaXRzCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChsZW4gPT0gNCk7CisgICAgICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICArK3BvczsgIC8vdGhyb3cgYXdheSBqdXN0IHRoZSAweDFBIGJ5dGUsIGFuZCB0cnkgYWdhaW4KKyAgICB9CisgICAgICAgIAorICAgIGxvbmcgbGVuOworICAgIGxvbmcgbG9uZyByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAKKyAgICBpZiAocmVzdWx0IDwgMCkgIC8vZXJyb3IKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgCisgICAgaWYgKHJlc3VsdCA+IDApICAvL25lZWQgbW9yZSBkYXRhCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIAorICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICBhc3NlcnQobGVuIDw9IDgpOworICAgIAorICAgIGlmICgodG90YWwgLSAgcG9zKSA8IGxlbikKKyAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICBpZiAoKGF2YWlsYWJsZSAtIHBvcykgPCBsZW4pCisgICAgICAgIHJldHVybiBwb3MgKyBsZW47ICAvL3RyeSBhZ2FpbiBsYXRlcgorICAgICAgICAKKyAgICByZXN1bHQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgCisgICAgaWYgKHJlc3VsdCA8IDApICAvL2Vycm9yCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgdS1pbnQKKyAgICAKKyAgICBpZiAoKHRvdGFsIC0gcG9zKSA8IHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKworICAgIGlmICgoYXZhaWxhYmxlIC0gcG9zKSA8IHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHBvcyArIHJlc3VsdDsKKyAgICAgICAgCisgICAgZW5kID0gcG9zICsgcmVzdWx0OworICAgIAorICAgIG1fdmVyc2lvbiA9IDE7CisgICAgbV9yZWFkVmVyc2lvbiA9IDE7CisgICAgbV9tYXhJZExlbmd0aCA9IDQ7CisgICAgbV9tYXhTaXplTGVuZ3RoID0gODsKKyAgICBtX2RvY1R5cGVWZXJzaW9uID0gMTsKKyAgICBtX2RvY1R5cGVSZWFkVmVyc2lvbiA9IDE7CisKKyAgICB3aGlsZSAocG9zIDwgZW5kKQorICAgIHsKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwMjg2LCBtX3ZlcnNpb24pKSAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDJGNywgbV9yZWFkVmVyc2lvbikpICAgICAgICAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDAyRjIsIG1fbWF4SWRMZW5ndGgpKSAgICAgICAgCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwMkYzLCBtX21heFNpemVMZW5ndGgpKSAgICAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDI4MiwgbV9kb2NUeXBlKSkgICAgICAgICAgICAKKyAgICAgICAgICAgIDsgCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwMjg3LCBtX2RvY1R5cGVWZXJzaW9uKSkgICAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDI4NSwgbV9kb2NUeXBlUmVhZFZlcnNpb24pKSAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQocmVzdWx0ID4gMCk7CisgICAgICAgICAgICBhc3NlcnQobGVuID4gMCk7CisgICAgICAgICAgICBhc3NlcnQobGVuIDw9IDgpOworICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47CisgICAgICAgICAgICBhc3NlcnQocG9zIDwgZW5kKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVzdWx0ID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCA+PSAwKTsKKyAgICAgICAgICAgIGFzc2VydChsZW4gPiAwKTsKKyAgICAgICAgICAgIGFzc2VydChsZW4gPD0gOCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW4gKyByZXN1bHQ7CisgICAgICAgICAgICBhc3NlcnQocG9zIDw9IGVuZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYXNzZXJ0KHBvcyA9PSBlbmQpOworICAgICAgICAKKyAgICByZXR1cm4gMDsgICAgCit9CisKKworU2VnbWVudDo6U2VnbWVudCgKKyAgICBJTWt2UmVhZGVyKiBwUmVhZGVyLAorICAgIGxvbmcgbG9uZyBzdGFydCwKKyAgICBsb25nIGxvbmcgc2l6ZSkgOgorICAgIG1fcFJlYWRlcihwUmVhZGVyKSwKKyAgICBtX3N0YXJ0KHN0YXJ0KSwKKyAgICBtX3NpemUoc2l6ZSksCisgICAgbV9wb3Moc3RhcnQpLAorICAgIG1fcEluZm8oTlVMTCksCisgICAgbV9wVHJhY2tzKE5VTEwpLAorICAgIG1fY2x1c3RlckNvdW50KDApCisgICAgLy9tX2NsdXN0ZXJOdW1iZXIoMCkKK3sKK30KKworCitTZWdtZW50Ojp+U2VnbWVudCgpCit7CisgICAgQ2x1c3RlcioqIGkgPSBtX2NsdXN0ZXJzOworICAgIENsdXN0ZXIqKiBqID0gbV9jbHVzdGVycyArIG1fY2x1c3RlckNvdW50OworCisgICAgd2hpbGUgKGkgIT0gaikKKyAgICB7CisgICAgICAgIENsdXN0ZXIqIHAgPSAqaSsrOworICAgICAgICBhc3NlcnQocCk7CQkKKyAgICAgICAgZGVsZXRlIHA7CisgICAgfSAKKyAgICAKKyAgICBkZWxldGVbXSBtX2NsdXN0ZXJzOworICAgICAgIAorICAgIGRlbGV0ZSBtX3BUcmFja3M7CisgICAgZGVsZXRlIG1fcEluZm87Cit9CisKKworbG9uZyBsb25nIFNlZ21lbnQ6OkNyZWF0ZUluc3RhbmNlKAorICAgIElNa3ZSZWFkZXIqIHBSZWFkZXIsCisgICAgbG9uZyBsb25nIHBvcywKKyAgICBTZWdtZW50KiYgcFNlZ21lbnQpCit7CisgICAgYXNzZXJ0KHBSZWFkZXIpOworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgcFNlZ21lbnQgPSBOVUxMOworICAgIAorICAgIGxvbmcgbG9uZyB0b3RhbCwgYXZhaWxhYmxlOworICAgIAorICAgIGxvbmcgaHIgPSBwUmVhZGVyLT5MZW5ndGgoJnRvdGFsLCAmYXZhaWxhYmxlKTsKKyAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgYXNzZXJ0KGF2YWlsYWJsZSA8PSB0b3RhbCk7CisgICAgCisgICAgLy9JIHdvdWxkIGFzc3VtZSB0aGF0IGluIHByYWN0aWNlIHRoaXMgbG9vcCB3b3VsZCBleGVjdXRlCisgICAgLy9leGFjdGx5IG9uY2UsIGJ1dCB3ZSBhbGxvdyBmb3Igb3RoZXIgZWxlbWVudHMgKGUuZy4gVm9pZCkKKyAgICAvL3RvIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgRUJNTCBoZWFkZXIuICBUaGlzIGlzIGZpbmUgZm9yCisgICAgLy90aGUgc291cmNlIGZpbHRlciBjYXNlIChzaW5jZSB0aGUgZW50aXJlIGZpbGUgaXMgYXZhaWxhYmxlKSwKKyAgICAvL2J1dCBpbiB0aGUgc3BsaXR0ZXIgY2FzZSBvdmVyIGEgbmV0d29yayB3ZSBzaG91bGQgcHJvYmFibHkKKyAgICAvL2p1c3QgZ2l2ZSB1cCBlYXJseS4gIFdlIGNvdWxkIGZvciBleGFtcGxlIGRlY2lkZSBvbmx5IHRvCisgICAgLy9leGVjdXRlIHRoaXMgbG9vcCBhIG1heGltdW0gb2YsIHNheSwgMTAgdGltZXMuCisgICAgCisgICAgd2hpbGUgKHBvcyA8IHRvdGFsKQorICAgIHsgICAgCisgICAgICAgIC8vUmVhZCBJRAorICAgICAgICAKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGxvbmcgbG9uZyByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQpICAvL2Vycm9yLCBvciB0b28gZmV3IGF2YWlsYWJsZSBieXRlcworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiB0b3RhbCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKChwb3MgKyBsZW4pID4gYXZhaWxhYmxlKQorICAgICAgICAgICAgcmV0dXJuIHBvcyArIGxlbjsKKworICAgICAgICAvL1RPRE86IGlmIHdlIGxpYmVyYWxpemUgdGhlIGJlaGF2aW9yIG9mIFJlYWRVSW50LCB3ZSBjYW4KKyAgICAgICAgLy9wcm9iYWJseSBlbGltaW5hdGUgaGF2aW5nIHRvIHVzZSBHZXRVSW50TGVuZ3RoIGhlcmUuCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBJRAorICAgICAgICAKKyAgICAgICAgLy9SZWFkIFNpemUKKyAgICAgICAgCisgICAgICAgIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCkgIC8vZXJyb3IsIG9yIHRvbyBmZXcgYXZhaWxhYmxlIGJ5dGVzCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IHRvdGFsKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIGxlbikgPiBhdmFpbGFibGUpCisgICAgICAgICAgICByZXR1cm4gcG9zICsgbGVuOworCisgICAgICAgIC8vVE9ETzogaWYgd2UgbGliZXJhbGl6ZSB0aGUgYmVoYXZpb3Igb2YgUmVhZFVJbnQsIHdlIGNhbgorICAgICAgICAvL3Byb2JhYmx5IGVsaW1pbmF0ZSBoYXZpbmcgdG8gdXNlIEdldFVJbnRMZW5ndGggaGVyZS4KKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplIG9mIGVsZW1lbnQKKyAgICAgICAgCisgICAgICAgIC8vUG9zIG5vdyBwb2ludHMgdG8gc3RhcnQgb2YgcGF5bG9hZAorICAgICAgICAKKyAgICAgICAgaWYgKChwb3MgKyBzaXplKSA+IHRvdGFsKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAweDA4NTM4MDY3KSAgLy9TZWdtZW50IElECisgICAgICAgIHsKKyAgICAgICAgICAgIHBTZWdtZW50ID0gbmV3ICBTZWdtZW50KHBSZWFkZXIsIHBvcywgc2l6ZSk7IAorICAgICAgICAgICAgYXNzZXJ0KHBTZWdtZW50KTsgIC8vVE9ETyAgIAorCisgICAgICAgICAgICByZXR1cm4gMDsgICAgLy9zdWNjZXNzCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHBvcyArPSBzaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KHBvcyA9PSB0b3RhbCk7CisgICAgCisgICAgcFNlZ21lbnQgPSBuZXcgU2VnbWVudChwUmVhZGVyLCBwb3MsIDApOyAKKyAgICBhc3NlcnQocFNlZ21lbnQpOyAgLy9UT0RPICAgCisKKyAgICByZXR1cm4gMDsgIC8vc3VjY2VzcyAoc29ydCBvZikKK30KKworCitsb25nIGxvbmcgU2VnbWVudDo6UGFyc2VIZWFkZXJzKCkKK3sKKyAgICAvL091dGVybW9zdCAobGV2ZWwgMCkgc2VnbWVudCBvYmplY3QgaGFzIGJlZW4gY29uc3RydWN0ZWQsIAorICAgIC8vYW5kIHBvcyBkZXNpZ25hdGVzIHN0YXJ0IG9mIHBheWxvYWQuICBXZSBuZWVkIHRvIGZpbmQgdGhlCisgICAgLy9pbm5lciAobGV2ZWwgMSkgZWxlbWVudHMuCisgICAgbG9uZyBsb25nIHRvdGFsLCBhdmFpbGFibGU7CisgICAgCisgICAgbG9uZyBociA9IG1fcFJlYWRlci0+TGVuZ3RoKCZ0b3RhbCwgJmF2YWlsYWJsZSk7CisgICAgYXNzZXJ0KGhyID49IDApOworICAgIGFzc2VydChhdmFpbGFibGUgPD0gdG90YWwpOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gbV9zdGFydCArIG1fc2l6ZTsKKyAgICBhc3NlcnQoc3RvcCA8PSB0b3RhbCk7CisgICAgYXNzZXJ0KG1fcG9zIDw9IHN0b3ApOworICAgIAorICAgIGJvb2wgYlF1aXQgPSBmYWxzZTsKKyAgICB3aGlsZSAoKG1fcG9zIDwgc3RvcCkgJiYgIWJRdWl0KQorICAgIHsKKyAgICAgICAgbG9uZyBsb25nIHBvcyA9IG1fcG9zOworICAgICAgICAKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGxvbmcgbG9uZyByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCkgIC8vZXJyb3IsIG9yIHRvbyBmZXcgYXZhaWxhYmxlIGJ5dGVzCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IHN0b3ApCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IGF2YWlsYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBwb3MgKyBsZW47CisgICAgICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkcG9zID0gcG9zOworICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChtX3BSZWFkZXIsIGlkcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKGlkIDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIElECisgICAgICAgIAorICAgICAgICAvL1JlYWQgU2l6ZQorICAgICAgICByZXN1bHQgPSBHZXRVSW50TGVuZ3RoKG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCkgIC8vZXJyb3IsIG9yIHRvbyBmZXcgYXZhaWxhYmxlIGJ5dGVzCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IHN0b3ApCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IGF2YWlsYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBwb3MgKyBsZW47CisKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgCisgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUgb2YgZWxlbWVudAorICAgICAgICAKKyAgICAgICAgLy9Qb3Mgbm93IHBvaW50cyB0byBzdGFydCBvZiBwYXlsb2FkCisgICAgICAgIAorICAgICAgICBpZiAoKHBvcyArIHNpemUpID4gc3RvcCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAKKyAgICAgICAgLy9XZSByZWFkIEVCTUwgZWxlbWVudHMgZWl0aGVyIGluIHRvdGFsIG9yIG5vdGhpbmcgYXQgYWxsLgorICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgc2l6ZSkgPiBhdmFpbGFibGUpCisgICAgICAgICAgICByZXR1cm4gcG9zICsgc2l6ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAweDA1NDlBOTY2KSAgLy9TZWdtZW50IEluZm8gSUQKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KG1fcEluZm8gPT0gTlVMTCk7CisgICAgICAgICAgICBtX3BJbmZvID0gbmV3ICBTZWdtZW50SW5mbyh0aGlzLCBwb3MsIHNpemUpOworICAgICAgICAgICAgYXNzZXJ0KG1fcEluZm8pOyAgLy9UT0RPCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChtX3BUcmFja3MpCisgICAgICAgICAgICAgICAgYlF1aXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlkID09IDB4MDY1NEFFNkIpICAvL1RyYWNrcyBJRAorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV9wVHJhY2tzID09IE5VTEwpOworICAgICAgICAgICAgbV9wVHJhY2tzID0gbmV3ICBUcmFja3ModGhpcywgcG9zLCBzaXplKTsKKyAgICAgICAgICAgIGFzc2VydChtX3BUcmFja3MpOyAgLy9UT0RPCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChtX3BJbmZvKQorICAgICAgICAgICAgICAgIGJRdWl0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpZCA9PSAweDBGNDNCNjc1KSAgLy9DbHVzdGVyIElECisgICAgICAgIHsKKyNpZiAwCisgICAgICAgICAgICBpZiAobV9wSW5mbyA9PSBOVUxMKSAgLy9UT0RPOiBsaWJlcmFsaXplCisgICAgICAgICAgICAgICAgOyAgCisgICAgICAgICAgICBlbHNlIGlmIChtX3BUcmFja3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLy9QYXJzZUNsdXN0ZXIoaWRwb3MsIHBvcywgc2l6ZSk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ2x1c3Rlcjo6UGFyc2UodGhpcywgbV9jbHVzdGVycywgcG9zLCBzaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgYlF1aXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBtX3BvcyA9IHBvcyArIHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgIH0KKyAgICAKKyAgICBhc3NlcnQobV9wb3MgPD0gc3RvcCk7CisgICAgCisgICAgcmV0dXJuIDA7ICAvL3N1Y2Nlc3MKK30KKworCitsb25nIFNlZ21lbnQ6OlBhcnNlQ2x1c3RlcihDbHVzdGVyKiYgcENsdXN0ZXIsIGxvbmcgbG9uZyYgcG9zXykgY29uc3QKK3sKKyAgICBwQ2x1c3RlciA9IE5VTEw7CisgICAgcG9zXyA9IC0xOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gbV9zdGFydCArIG1fc2l6ZTsKKyAgICBhc3NlcnQobV9wb3MgPD0gc3RvcCk7CisgICAgCisgICAgbG9uZyBsb25nIHBvcyA9IG1fcG9zOworICAgIGxvbmcgbG9uZyBvZmYgPSAtMTsKKyAgIAorIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZHBvcyA9IHBvczsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFN5bmNSZWFkVUludChtX3BSZWFkZXIsIHBvcywgc3RvcCwgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oaWQpOworICAgICAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkICAgICAgICAKKyAgICAgICAgYXNzZXJ0KHBvcyA8IHN0b3ApOworCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gU3luY1JlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBzdG9wLCBsZW4pOworICAgICAgICAKKyAgICAgICAgaWYgKHNpemUgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KHNpemUpOworICAgICAgICAgICAgCisgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgc2l6ZQorICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgIGlmIChzaXplID09IDApICAvL3dlaXJkCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIAorICAgICAgICAvL3BvcyBub3cgcG9pbnRzIHRvIHN0YXJ0IG9mIHBheWxvYWQKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisKKyAgICAgICAgaWYgKG9mZiA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwb3NfID0gaWRwb3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpZCA9PSAweDBGNDNCNjc1KSAgLy9DbHVzdGVyIElECisgICAgICAgICAgICBvZmYgPSBpZHBvcyAtIG1fc3RhcnQ7CisgICAgfQorICAgIAorICAgIFNlZ21lbnQqIGNvbnN0IHRoaXNfID0gY29uc3RfY2FzdDxTZWdtZW50Kj4odGhpcyk7CisgICAgY29uc3Qgc2l6ZV90IGlkeCA9IG1fY2x1c3RlckNvdW50OworICAgIAorICAgIGlmIChwb3MgPj0gc3RvcCkKKyAgICB7CisgICAgICAgIHBvc18gPSBzdG9wOworICAgICAgICAKKyNpZiAwICAgICAgICAKKyAgICAgICAgaWYgKG9mZiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDbHVzdGVyID0gQ2x1c3Rlcjo6Q3JlYXRlRW5kT2ZTdHJlYW0odGhpc18sIGlkeCk7CisgICAgICAgICAgICByZXR1cm4gMUw7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChvZmYgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDFMOworI2VuZGlmCisgICAgICAgICAgICAgICAgCisgICAgICAgIC8vUmVhZGluZyAwIGJ5dGVzIGF0IHBvcyBtaWdodCB3b3JrIHRvbyAtLSBpdCB3b3VsZCBkZXBlbmQgCisgICAgICAgIC8vb24gaG93IHRoZSByZWFkZXIgaXMgaW1wbGVtZW50ZWQuCisgICAgICAgIAorICAgICAgICB1bnNpZ25lZCBjaGFyIGI7CisKKyAgICAgICAgY29uc3QgbG9uZyBociA9IG1fcFJlYWRlci0+UmVhZChwb3MgLSAxLCAxLCAmYik7CisgICAgICAgIAorICAgICAgICBpZiAoaHIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGhyOworICAgICAgICAgICAgCisgICAgICAgIGlmIChociAhPSAwTCkKKyAgICAgICAgICAgIHJldHVybiBFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KG9mZiA+PSAwKTsKKyAgICBhc3NlcnQocG9zXyA+PSBtX3N0YXJ0KTsKKyAgICBhc3NlcnQocG9zXyA8PSBzdG9wKTsKKworICAgIHBDbHVzdGVyID0gQ2x1c3Rlcjo6UGFyc2UodGhpc18sIGlkeCwgb2ZmKTsKKyAgICByZXR1cm4gMEw7Cit9CisKKworYm9vbCBTZWdtZW50OjpBZGRDbHVzdGVyKENsdXN0ZXIqIHBDbHVzdGVyLCBsb25nIGxvbmcgcG9zKQoreworICAgIGFzc2VydChwb3MgPj0gbV9zdGFydCk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBtX3N0YXJ0ICsgbV9zaXplOworICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisKKyAgICBpZiAocENsdXN0ZXIpICAgIAorICAgICAgICBtX2NsdXN0ZXJzW3Bvc10gPSBwQ2x1c3RlcjsKKyAgICAgICAgCisgICAgbV9wb3MgPSBwb3M7ICAvL21fcG9zID49IHN0b3AgaXMgbm93IHdlIGtub3cgd2UgaGF2ZSBhbGwgY2x1c3RlcnMKKyAgICAKKyAgICByZXR1cm4gKHBvcyA+PSBzdG9wKTsKK30KKworCitsb25nIFNlZ21lbnQ6OkxvYWQoKQoreworICAgIC8vT3V0ZXJtb3N0IChsZXZlbCAwKSBzZWdtZW50IG9iamVjdCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCwgCisgICAgLy9hbmQgcG9zIGRlc2lnbmF0ZXMgc3RhcnQgb2YgcGF5bG9hZC4gIFdlIG5lZWQgdG8gZmluZCB0aGUKKyAgICAvL2lubmVyIChsZXZlbCAxKSBlbGVtZW50cy4KKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBtX3NpemU7CisjaWZkZWYgX0RFQlVHCisgICAgeworICAgICAgICBsb25nIGxvbmcgdG90YWwsIGF2YWlsYWJsZTsKKyAgICAgICAgCisgICAgICAgIGxvbmcgaHIgPSBtX3BSZWFkZXItPkxlbmd0aCgmdG90YWwsICZhdmFpbGFibGUpOworICAgICAgICBhc3NlcnQoaHIgPj0gMCk7CisgICAgICAgIGFzc2VydChhdmFpbGFibGUgPj0gdG90YWwpOworICAgICAgICBhc3NlcnQoc3RvcCA8PSB0b3RhbCk7CisgICAgfQorI2VuZGlmCisgICAgbG9uZyBsb25nIGluZGV4ID0gbV9wb3M7CisgICAgCisgICAgbV9jbHVzdGVyQ291bnQgPSAwOworCisgICAgd2hpbGUgKGluZGV4IDwgc3RvcCkKKyAgICB7CisgICAgICAgIGxvbmcgbGVuID0gMDsKKworICAgICAgICBsb25nIGxvbmcgcmVzdWx0ID0gR2V0VUludExlbmd0aChtX3BSZWFkZXIsIGluZGV4LCBsZW4pOworICAgICAgIAorICAgICAgICBpZiAocmVzdWx0IDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihyZXN1bHQpOworICAgICAgICAgICAgCisgICAgICAgIGlmICgoaW5kZXggKyBsZW4pID4gc3RvcCkKKyAgICAgICAgICAgIHJldHVybiBFX0ZJTEVfRk9STUFUX0lOVkFMSUQ7CisgICAgICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkcG9zID0gaW5kZXg7CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KG1fcFJlYWRlciwgaWRwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoaWQgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KGlkKTsKKyAgICAgICAgICAgIAorICAgICAgICBpbmRleCArPSBsZW47ICAvL2NvbnN1bWUgSUQKKyAgICAgICAgCisgICAgICAgIC8vUmVhZCBTaXplCisgICAgICAgIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgobV9wUmVhZGVyLCBpbmRleCwgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChyZXN1bHQgPCAwKSAgLy9lcnJvcgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGxvbmc+KHJlc3VsdCk7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKChpbmRleCArIGxlbikgPiBzdG9wKQorICAgICAgICAgICAgcmV0dXJuIEVfRklMRV9GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KG1fcFJlYWRlciwgaW5kZXgsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAoc2l6ZSA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oc2l6ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgaW5kZXggKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplIG9mIGVsZW1lbnQKKyAKKyAgICAgICAgaWYgKGlkID09IDB4MEY0M0I2NzUpIC8vIENsdXN0ZXIgSUQgCisgICAgICAgICAgICBicmVhazsKKwkKKyAgICAgICAgaWYgKGlkID09IDB4MDE0RDlCNzQpIC8vIFNlZWtIZWFkIElEIAorICAgICAgICB7CisgICAgICAgICAgICBQYXJzZVNlZWtIZWFkKGluZGV4LCBzaXplLCBOVUxMKTsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbmRleCArPSBzaXplOworICAgIH0KKyAgICAgICAgCisgICAgaWYgKG1fY2x1c3RlckNvdW50ID09IDApCisgICAgICAgIHJldHVybiAtMUw7CisKKyAgICB3aGlsZSAobV9wb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgbG9uZyBsb25nIHBvcyA9IG1fcG9zOworICAgICAgICAKKyAgICAgICAgbG9uZyBsZW47CisKKyAgICAgICAgbG9uZyBsb25nIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0IDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihyZXN1bHQpOworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IHN0b3ApCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZHBvcyA9IHBvczsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQobV9wUmVhZGVyLCBpZHBvcywgbGVuKTsKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA8IDApICAvL2Vycm9yCisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8bG9uZz4oaWQpOworICAgICAgICAgICAgCisgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgSUQKKyAgICAgICAgCisgICAgICAgIC8vUmVhZCBTaXplCisgICAgICAgIHJlc3VsdCA9IEdldFVJbnRMZW5ndGgobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0IDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihyZXN1bHQpOworICAgICAgICAgICAgCisgICAgICAgIGlmICgocG9zICsgbGVuKSA+IHN0b3ApCisJICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgCisgICAgICAgIGlmIChzaXplIDwgMCkgIC8vZXJyb3IKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxsb25nPihzaXplKTsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplIG9mIGVsZW1lbnQKKyAgICAgICAgCisgICAgICAgIC8vUG9zIG5vdyBwb2ludHMgdG8gc3RhcnQgb2YgcGF5bG9hZAorICAgICAgICAKKyAgICAgICAgaWYgKChwb3MgKyBzaXplKSA+IHN0b3ApCisgICAgICAgICAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAweDBGNDNCNjc1KSAgLy9DbHVzdGVyIElECisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoaWQgPT0gMHgwMTREOUI3NCkgIC8vU2Vla0hlYWQgSUQKKyAgICAgICAgeworICAgICAgICAgICAgbV9jbHVzdGVycyA9IG5ldyBDbHVzdGVyKlttX2NsdXN0ZXJDb3VudF07ICAgCisgICAgICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBQYXJzZVNlZWtIZWFkKHBvcywgc2l6ZSwgJmluZGV4KTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGFzc2VydChpbmRleCA9PSBtX2NsdXN0ZXJDb3VudCk7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgZWxzZSBpZiAoaWQgPT0gMHgwNTQ5QTk2NikgIC8vU2VnbWVudCBJbmZvIElECisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChtX3BJbmZvID09IE5VTEwpOworICAgICAgICAgICAgbV9wSW5mbyA9IG5ldyAgU2VnbWVudEluZm8odGhpcywgcG9zLCBzaXplKTsKKyAgICAgICAgICAgIGFzc2VydChtX3BJbmZvKTsgIC8vVE9ETworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlkID09IDB4MDY1NEFFNkIpICAvL1RyYWNrcyBJRAorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQobV9wVHJhY2tzID09IE5VTEwpOworICAgICAgICAgICAgbV9wVHJhY2tzID0gbmV3IFRyYWNrcyh0aGlzLCBwb3MsIHNpemUpOworICAgICAgICAgICAgYXNzZXJ0KG1fcFRyYWNrcyk7ICAvL1RPRE8KKyAgICAgICAgfQorCisgICAgICAgIG1fcG9zID0gcG9zICsgc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgfQorICAgIAorICAgIGFzc2VydChtX2NsdXN0ZXJzKTsKKyAgICAKKyAgICAvL1RPRE86IHNlZSBub3RlcyBhYm92ZS4gIFRoaXMgY2hlY2sgaXMgaGVyZSAodGVtcG9yYXJpbHkpIHRvIGVuc3VyZQorICAgIC8vdGhhdCB0aGUgZmlyc3Qgc2Vla2hlYWQgaGFzIGVudHJpZXMgZm9yIHRoZSBjbHVzdGVycyAoYmVjYXVzZSB0aGF0J3MKKyAgICAvL3doZW4gdGhleSdyZSBsb2FkZWQpLiAgSW4gY2FzZSB3ZSBhcmUgZ2l2ZW4gYSBmaWxlIHRoYXQgbGlzdHMgdGhlCisgICAgLy9jbHVzdGVycyBpbiBhIHNlY29uZCBzZWVraGVhZCwgdGhlIHdvcnN0IHRoaW5nIHRoYXQgaGFwcGVucyBpcyB0aGF0CisgICAgLy93ZSB0cmVhdCB0aGlzIGFzIGFuIGludmFsaWQgZmlsZSAod2hpY2ggaXMgYmV0dGVyIHRoZW4gc2ltcGx5CisgICAgLy9hc3NlcnRpbmcgc29tZXdoZXJlKS4gIEJ1dCB0aGF0J3Mgb25seSBhIHdvcmstYXJvdW5kLiAgV2hhdCB3ZSBuZWVkCisgICAgLy90byBkbyBpcyBiZSBhYmxlIHRvIGhhbmRsZSBoYXZpbmcgbXVsdGlwbGUgc2Vla2hlYWRzLCBhbmQgaGF2aW5nCisgICAgLy9jbHVzdGVycyBsaXN0ZWQgc29tZXdoZXJlIGJlc2lkZXMgdGhlIGZpcnN0IHNlZWtoZWFkLgorICAgIC8vICAgIAorICAgIC8vaWYgKG1fY2x1c3RlcnMgPT0gTlVMTCkKKyAgICAvLyAgICByZXR1cm4gRV9GSUxFX0ZPUk1BVF9JTlZBTElEOworICAgICAgICAKKyAgICAvL05PVEU6IHdlIHN0b3AgcGFyc2luZyB3aGVuIHdlIHJlYWNoIHRoZSBmaXJzdCBjbHVzdGVyLCB1bmRlciB0aGUKKyAgICAvL2Fzc3VtcHRpb24gYWxsIGNsdXN0ZXJzIGFyZSBuYW1lZCBpbiBzb21lIFNlZWtIZWFkLiAgQ2x1c3RlcnMKKyAgICAvL3dpbGwgaGF2ZSBiZWVuIChwcmUpbG9hZGVkLCBzbyB3ZSBpbmRpY2F0ZSB0aGF0IHdlIGhhdmUgYWxsIGNsdXN0ZXJzCisgICAgLy9ieSBhZGp1c3RpbmcgdGhlIHBhcnNlIHBvc2l0aW9uOgorICAgIG1fcG9zID0gc3RvcDsgIC8vbWVhbnMgIndlIGhhdmUgYWxsIGNsdXN0ZXJzIgorCisgICAgcmV0dXJuIDBMOworfQorCisKK3ZvaWQgU2VnbWVudDo6UGFyc2VTZWVrSGVhZChsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplXywgc2l6ZV90KiBwSW5kZXgpCit7CisgICAgbG9uZyBsb25nIHBvcyA9IHN0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gc3RhcnQgKyBzaXplXzsKKyAgICB3aGlsZSAocG9zIDwgc3RvcCkKKyAgICB7CisgICAgICAgIGxvbmcgbGVuOworICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETworICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIElECisgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAKKyAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBTaXplIGZpZWxkCisgICAgICAgIGFzc2VydCgocG9zICsgc2l6ZSkgPD0gc3RvcCk7CisKKyAgICAgICAgaWYgKGlkID09IDB4MERCQikgIC8vU2Vla0VudHJ5IElECisgICAgICAgICAgICBQYXJzZVNlZWtFbnRyeShwb3MsIHNpemUsIHBJbmRleCk7CisgICAgICAgIAorICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gc3RvcCk7Cit9CisKKwordm9pZCBTZWdtZW50OjpQYXJzZVNlY29uZGFyeVNlZWtIZWFkKGxvbmcgbG9uZyBvZmYsIHNpemVfdCogcEluZGV4KQoreworICAgIGFzc2VydChvZmYgPj0gMCk7CisgICAgYXNzZXJ0KG9mZiA8IG1fc2l6ZSk7CisKKyAgICBsb25nIGxvbmcgcG9zID0gbV9zdGFydCArIG9mZjsKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBtX3NpemU7CisgICAgCisgICAgbG9uZyBsZW47CisKKyAgICBsb25nIGxvbmcgcmVzdWx0ID0gR2V0VUludExlbmd0aChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQocmVzdWx0ID09IDApOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgaWRwb3MgPSBwb3M7CisKKyAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChtX3BSZWFkZXIsIGlkcG9zLCBsZW4pOworICAgIGFzc2VydChpZCA9PSAweDAxNEQ5Qjc0KTsgIC8vU2Vla0hlYWQgSUQKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIElECisgICAgYXNzZXJ0KHBvcyA8IHN0b3ApOworICAgIAorICAgIC8vUmVhZCBTaXplCisgICAgCisgICAgcmVzdWx0ID0gR2V0VUludExlbmd0aChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQocmVzdWx0ID09IDApOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChzaXplID49IDApOworICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUgb2YgZWxlbWVudAorICAgIGFzc2VydCgocG9zICsgc2l6ZSkgPD0gc3RvcCk7CisgICAgCisgICAgLy9Qb3Mgbm93IHBvaW50cyB0byBzdGFydCBvZiBwYXlsb2FkCisgICAgCisgICAgUGFyc2VTZWVrSGVhZChwb3MsIHNpemUsIHBJbmRleCk7Cit9CisKKwordm9pZCBTZWdtZW50OjpQYXJzZVNlZWtFbnRyeShsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplXywgc2l6ZV90KiBwSW5kZXgpCit7CisgICAgbG9uZyBsb25nIHBvcyA9IHN0YXJ0OworCisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBzdGFydCArIHNpemVfOworICAgIAorICAgIGxvbmcgbGVuOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzZWVrSWRJZCA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgIC8vc2Vla0lkSWQ7CisgICAgYXNzZXJ0KHNlZWtJZElkID09IDB4MTNBQik7ICAvL1NlZWtJRCBJRAorICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla0lkU2l6ZSA9IFJlYWRVSW50KG1fcFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChzZWVrSWRTaXplID49IDApOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla0lkID0gUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIGxlbik7ICAvL3BheWxvYWQKKyAgICBhc3NlcnQoc2Vla0lkID49IDApOworICAgIGFzc2VydChsZW4gPT0gc2Vla0lkU2l6ZSk7CisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgIAorICAgIHBvcyArPSBzZWVrSWRTaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla1Bvc0lkID0gUmVhZFVJbnQobV9wUmVhZGVyLCBwb3MsIGxlbik7CisgICAgLy9zZWVrUG9zSWQ7CisgICAgYXNzZXJ0KHNlZWtQb3NJZCA9PSAweDEzQUMpOyAgLy9TZWVrUG9zIElECisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgIAorICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla1Bvc1NpemUgPSBSZWFkVUludChtX3BSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoc2Vla1Bvc1NpemUgPj0gMCk7CisgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworCisgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBzaXplCisgICAgYXNzZXJ0KChwb3MgKyBzZWVrUG9zU2l6ZSkgPD0gc3RvcCk7CisgICAgICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzZWVrT2ZmID0gVW5zZXJpYWxpemVVSW50KG1fcFJlYWRlciwgcG9zLCBzZWVrUG9zU2l6ZSk7CisgICAgYXNzZXJ0KHNlZWtPZmYgPj0gMCk7CisgICAgYXNzZXJ0KHNlZWtPZmYgPCBtX3NpemUpOworICAgIAorICAgIHBvcyArPSBzZWVrUG9zU2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgYXNzZXJ0KHBvcyA9PSBzdG9wKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2Vla1BvcyA9IG1fc3RhcnQgKyBzZWVrT2ZmOworICAgIGFzc2VydChzZWVrUG9zIDwgKG1fc3RhcnQgKyBtX3NpemUpKTsKKyAgIAorICAgIGlmIChzZWVrSWQgPT0gMHgwRjQzQjY3NSkgIC8vY2x1c3RlciBpZAorICAgIHsgICAgICAgCisgICAgICAgIGlmIChwSW5kZXggPT0gTlVMTCkKKyAgICAgICAgICAgICsrbV9jbHVzdGVyQ291bnQ7IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChtX2NsdXN0ZXJzKTsKKyAgICAgICAgICAgIGFzc2VydChtX2NsdXN0ZXJDb3VudCA+IDApOworICAgICAgICAgICAgCisgICAgICAgICAgICBzaXplX3QmIGluZGV4ID0gKnBJbmRleDsKKyAgICAgICAgICAgIGFzc2VydChpbmRleCA8IG1fY2x1c3RlckNvdW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ2x1c3RlciomIHBDbHVzdGVyID0gbV9jbHVzdGVyc1tpbmRleF07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBDbHVzdGVyID0gQ2x1c3Rlcjo6UGFyc2UodGhpcywgaW5kZXgsIHNlZWtPZmYpOworICAgICAgICAgICAgYXNzZXJ0KHBDbHVzdGVyKTsgIC8vVE9ETworICAgICAgICAgICAgCisgICAgICAgICAgICArK2luZGV4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHNlZWtJZCA9PSAweDAxNEQ5Qjc0KSAgLy9TZWVrSGVhZCBJRAorICAgIHsKKyAgICAgICAgUGFyc2VTZWNvbmRhcnlTZWVrSGVhZChzZWVrT2ZmLCBwSW5kZXgpOworICAgIH0KK30KKworCitsb25nIGxvbmcgU2VnbWVudDo6VW5wYXJzZWQoKSBjb25zdAoreworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gbV9zdGFydCArIG1fc2l6ZTsKKworICAgIGNvbnN0IGxvbmcgbG9uZyByZXN1bHQgPSBzdG9wIC0gbV9wb3M7CisgICAgYXNzZXJ0KHJlc3VsdCA+PSAwKTsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKyNpZiAwICAvL05PVEU6IHRvbyBpbmVmZmljaWVudAorbG9uZyBsb25nIFNlZ21lbnQ6OkxvYWQobG9uZyBsb25nIHRpbWVfbnMpCit7CisgICAgaWYgKFVucGFyc2VkKCkgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgd2hpbGUgKG1fY2x1c3RlcnMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyByZXN1bHQgPSBQYXJzZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHJlc3VsdCkgIC8vZXJyb3IsIG9yIG5vdCBlbm91Z2ggYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgCisgICAgICAgIGlmIChVbnBhcnNlZCgpIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgd2hpbGUgKG1fY2x1c3RlcnMuYmFjaygpLT5HZXRUaW1lKCkgPCB0aW1lX25zKQorICAgIHsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHJlc3VsdCA9IFBhcnNlKCk7CisgICAgICAgIAorICAgICAgICBpZiAocmVzdWx0KSAgLy9lcnJvciwgb3Igbm90IGVub3VnaCBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAKKyAgICAgICAgaWYgKFVucGFyc2VkKCkgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0gICAgICAgIAorCisgICAgcmV0dXJuIDA7ICAgICAgICAKK30KKyNlbmRpZgorCisKK0NsdXN0ZXIqIFNlZ21lbnQ6OkdldEZpcnN0KCkKK3sKKyAgICBpZiAoKG1fY2x1c3RlcnMgPT0gTlVMTCkgfHwgKG1fY2x1c3RlckNvdW50IDw9IDApKQorICAgICAgIHJldHVybiAmbV9lb3M7CisKKyAgICBDbHVzdGVyKiBjb25zdCBwQ2x1c3RlciA9IG1fY2x1c3RlcnNbMF07CisgICAgYXNzZXJ0KHBDbHVzdGVyKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHBDbHVzdGVyOworfQorCisKK0NsdXN0ZXIqIFNlZ21lbnQ6OkdldExhc3QoKQoreworICAgIGlmICgobV9jbHVzdGVycyA9PSBOVUxMKSB8fCAobV9jbHVzdGVyQ291bnQgPD0gMCkpCisgICAgICAgIHJldHVybiAmbV9lb3M7CisKKyAgICBjb25zdCBzaXplX3QgaWR4ID0gbV9jbHVzdGVyQ291bnQgLSAxOyAgICAKKyAgICBDbHVzdGVyKiBjb25zdCBwQ2x1c3RlciA9IG1fY2x1c3RlcnNbaWR4XTsKKyAgICBhc3NlcnQocENsdXN0ZXIpOworICAgICAgICAKKyAgICByZXR1cm4gcENsdXN0ZXI7Cit9CisKKwordW5zaWduZWQgbG9uZyBTZWdtZW50OjpHZXRDb3VudCgpIGNvbnN0Cit7CisgICAgLy9UT0RPOiBtX2NsdXN0ZXJDb3VudCBzaG91bGQgbm90IGJlIGxvbmcgbG9uZy4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9jbHVzdGVyQ291bnQpOworfQorCisKK0NsdXN0ZXIqIFNlZ21lbnQ6OkdldE5leHQoY29uc3QgQ2x1c3RlciogcEN1cnIpCit7CisgICAgYXNzZXJ0KHBDdXJyKTsKKyAgICBhc3NlcnQocEN1cnIgIT0gJm1fZW9zKTsKKyAgICBhc3NlcnQobV9jbHVzdGVycyk7CisgICAgYXNzZXJ0KG1fY2x1c3RlckNvdW50ID4gMCk7CisKKyAgICBzaXplX3QgaWR4ID0gIHBDdXJyLT5tX2luZGV4OworICAgIGFzc2VydChpZHggPCBtX2NsdXN0ZXJDb3VudCk7CisgICAgYXNzZXJ0KHBDdXJyID09IG1fY2x1c3RlcnNbaWR4XSk7CisgICAgCisgICAgaWR4Kys7CisgICAgCisgICAgaWYgKGlkeCA+PSBtX2NsdXN0ZXJDb3VudCkgCisgICAgICAgIHJldHVybiAmbV9lb3M7CisgICAgICAgIAorICAgIENsdXN0ZXIqIGNvbnN0IHBOZXh0ID0gbV9jbHVzdGVyc1tpZHhdOworICAgIGFzc2VydChwTmV4dCk7CisgICAgCisgICAgcmV0dXJuIHBOZXh0OworfQorCisKK0NsdXN0ZXIqIFNlZ21lbnQ6OkdldENsdXN0ZXIobG9uZyBsb25nIHRpbWVfbnMpCit7CisgICAgaWYgKChtX2NsdXN0ZXJzID09IE5VTEwpIHx8IChtX2NsdXN0ZXJDb3VudCA8PSAwKSkKKyAgICAgICAgcmV0dXJuICZtX2VvczsKKyAgICAgICAgCisgICAgeworICAgICAgICBDbHVzdGVyKiBjb25zdCBwQ2x1c3RlciA9IG1fY2x1c3RlcnNbMF07CisgICAgICAgIGFzc2VydChwQ2x1c3Rlcik7CisgICAgICAgIGFzc2VydChwQ2x1c3Rlci0+bV9pbmRleCA9PSAwKTsKKyAgICAgICAgCisgICAgICAgIGlmICh0aW1lX25zIDw9IHBDbHVzdGVyLT5HZXRUaW1lKCkpCisgICAgICAgICAgICByZXR1cm4gcENsdXN0ZXI7CisgICAgfQorICAgIAorICAgIC8vQmluYXJ5IHNlYXJjaCBvZiBjbHVzdGVyIGFycmF5CisgICAgICAgCisgICAgc2l6ZV90IGkgPSAwOworICAgIHNpemVfdCBqID0gbV9jbHVzdGVyQ291bnQ7CisgICAgCisgICAgd2hpbGUgKGkgPCBqKQorICAgIHsKKyAgICAgICAgLy9JTlZBUklBTlQ6CisgICAgICAgIC8vWzAsIGkpIDw9IHRpbWVfbnMKKyAgICAgICAgLy9baSwgaikgPworICAgICAgICAvL1tqLCBtX2NsdXN0ZXJDb3VudCkgID4gdGltZV9ucworICAgICAgICAKKyAgICAgICAgY29uc3Qgc2l6ZV90IGsgPSBpICsgKGogLSBpKSAvIDI7CisgICAgICAgIGFzc2VydChrIDwgbV9jbHVzdGVyQ291bnQpOworCisgICAgICAgIENsdXN0ZXIqIGNvbnN0IHBDbHVzdGVyID0gbV9jbHVzdGVyc1trXTsKKyAgICAgICAgYXNzZXJ0KHBDbHVzdGVyKTsKKyAgICAgICAgYXNzZXJ0KHBDbHVzdGVyLT5tX2luZGV4ID09IGspOworICAgICAgICAKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIHQgPSBwQ2x1c3Rlci0+R2V0VGltZSgpOworICAgICAgICAKKyAgICAgICAgaWYgKHQgPD0gdGltZV9ucykKKyAgICAgICAgICAgIGkgPSBrICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaiA9IGs7CisgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0KGkgPD0gaik7CisgICAgfQorICAgIAorICAgIGFzc2VydChpID09IGopOworICAgIGFzc2VydChpID4gMCk7CisgICAgYXNzZXJ0KGkgPD0gbV9jbHVzdGVyQ291bnQpOworICAgIAorICAgIGNvbnN0IHNpemVfdCBrID0gaSAtIDE7CisgICAgCisgICAgQ2x1c3RlciogY29uc3QgcENsdXN0ZXIgPSBtX2NsdXN0ZXJzW2tdOworICAgIGFzc2VydChwQ2x1c3Rlcik7CisgICAgYXNzZXJ0KHBDbHVzdGVyLT5tX2luZGV4ID09IGspOworICAgIGFzc2VydChwQ2x1c3Rlci0+R2V0VGltZSgpIDw9IHRpbWVfbnMpOworICAgIAorICAgIHJldHVybiBwQ2x1c3RlcjsKK30KKworCitUcmFja3MqIFNlZ21lbnQ6OkdldFRyYWNrcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcFRyYWNrczsKK30KKworCitjb25zdCBTZWdtZW50SW5mbyogY29uc3QgU2VnbWVudDo6R2V0SW5mbygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcEluZm87Cit9CisKKworbG9uZyBsb25nIFNlZ21lbnQ6OkdldER1cmF0aW9uKCkgY29uc3QKK3sKKyAgICBhc3NlcnQobV9wSW5mbyk7CisgICAgcmV0dXJuIG1fcEluZm8tPkdldER1cmF0aW9uKCk7Cit9CisKKworU2VnbWVudEluZm86OlNlZ21lbnRJbmZvKFNlZ21lbnQqIHBTZWdtZW50LCBsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplXykgOgorICAgIG1fcFNlZ21lbnQocFNlZ21lbnQpLAorICAgIG1fc3RhcnQoc3RhcnQpLAorICAgIG1fc2l6ZShzaXplXyksCisgICAgbV9wTXV4aW5nQXBwQXNVVEY4KE5VTEwpLAorICAgIG1fcFdyaXRpbmdBcHBBc1VURjgoTlVMTCksCisgICAgbV9wVGl0bGVBc1VURjgoTlVMTCkKK3sKKyAgICBJTWt2UmVhZGVyKiBjb25zdCBwUmVhZGVyID0gbV9wU2VnbWVudC0+bV9wUmVhZGVyOworICAgCisgICAgbG9uZyBsb25nIHBvcyA9IHN0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gc3RhcnQgKyBzaXplXzsKKyAgICAKKyAgICBtX3RpbWVjb2RlU2NhbGUgPSAxMDAwMDAwOworICAgIG1fZHVyYXRpb24gPSAwOworICAgIAorICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwQUQ3QjEsIG1fdGltZWNvZGVTY2FsZSkpCisgICAgICAgICAgICBhc3NlcnQobV90aW1lY29kZVNjYWxlID4gMCk7CisKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDA0ODksIG1fZHVyYXRpb24pKQorICAgICAgICAgICAgYXNzZXJ0KG1fZHVyYXRpb24gPj0gMCk7CisKKyAgICAgICAgZWxzZSBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDBEODAsIG1fcE11eGluZ0FwcEFzVVRGOCkpICAgLy9bNERdWzgwXSAKKyAgICAgICAgICAgIGFzc2VydChtX3BNdXhpbmdBcHBBc1VURjgpOworCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgxNzQxLCBtX3BXcml0aW5nQXBwQXNVVEY4KSkgIC8vWzU3XVs0MV0KKyAgICAgICAgICAgIGFzc2VydChtX3BXcml0aW5nQXBwQXNVVEY4KTsKKyAgICAgICAgICAgIAorICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4M0JBOSwgbV9wVGl0bGVBc1VURjgpKSAgICAgICAgLy9bN0JdW0E5XQorICAgICAgICAgICAgYXNzZXJ0KG1fcFRpdGxlQXNVVEY4KTsKKworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICAvL2lkOworICAgICAgICAgICAgYXNzZXJ0KGlkID49IDApOworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgICAgICBhc3NlcnQoKHN0b3AgLSBwb3MpID4gMCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW4gKyBzaXplOyAgLy9jb25zdW1lIHNpemUgYW5kIHBheWxvYWQKKyAgICAgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYXNzZXJ0KHBvcyA9PSBzdG9wKTsKK30KKworU2VnbWVudEluZm86On5TZWdtZW50SW5mbygpCit7CisgICAgaWYgKG1fcE11eGluZ0FwcEFzVVRGOCkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1fcE11eGluZ0FwcEFzVVRGODsKKyAgICAgICAgbV9wTXV4aW5nQXBwQXNVVEY4ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobV9wV3JpdGluZ0FwcEFzVVRGOCkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1fcFdyaXRpbmdBcHBBc1VURjg7CisgICAgICAgIG1fcFdyaXRpbmdBcHBBc1VURjggPSBOVUxMOworICAgIH0KKyAgIAorICAgIGlmIChtX3BUaXRsZUFzVVRGOCkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1fcFRpdGxlQXNVVEY4OworICAgICAgICBtX3BUaXRsZUFzVVRGOCA9IE5VTEw7CisgICAgfQorfQorCitsb25nIGxvbmcgU2VnbWVudEluZm86OkdldFRpbWVDb2RlU2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3RpbWVjb2RlU2NhbGU7Cit9CisKKworbG9uZyBsb25nIFNlZ21lbnRJbmZvOjpHZXREdXJhdGlvbigpIGNvbnN0Cit7CisgICAgYXNzZXJ0KG1fZHVyYXRpb24gPj0gMCk7ICAgIAorICAgIGFzc2VydChtX3RpbWVjb2RlU2NhbGUgPj0gMSk7CisgICAgCisgICAgY29uc3QgZG91YmxlIGRkID0gZG91YmxlKG1fZHVyYXRpb24pICogZG91YmxlKG1fdGltZWNvZGVTY2FsZSk7CisgICAgY29uc3QgbG9uZyBsb25nIGQgPSBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGRkKTsKKyAgICAKKyAgICByZXR1cm4gZDsKK30KKworY29uc3QgY2hhciogU2VnbWVudEluZm86OkdldE11eGluZ0FwcEFzVVRGOCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcE11eGluZ0FwcEFzVVRGODsKK30KKworY29uc3QgY2hhciogU2VnbWVudEluZm86OkdldFdyaXRpbmdBcHBBc1VURjgoKSBjb25zdAoreworICAgIHJldHVybiBtX3BXcml0aW5nQXBwQXNVVEY4OworfQorCitjb25zdCBjaGFyKiBTZWdtZW50SW5mbzo6R2V0VGl0bGVBc1VURjgoKSBjb25zdAoreworICAgIHJldHVybiBtX3BUaXRsZUFzVVRGODsKK30KKworVHJhY2s6OlRyYWNrKFNlZ21lbnQqIHBTZWdtZW50LCBjb25zdCBJbmZvJiBpKSA6CisgICAgbV9wU2VnbWVudChwU2VnbWVudCksCisgICAgbV9pbmZvKGkpCit7Cit9CisKK1RyYWNrOjp+VHJhY2soKQoreworICAgIEluZm8mIGluZm8gPSBjb25zdF9jYXN0PEluZm8mPihtX2luZm8pOworICAgIGluZm8uQ2xlYXIoKTsKK30KKworVHJhY2s6OkluZm86OkluZm8oKToKKyAgICB0eXBlKC0xKSwKKyAgICBudW1iZXIoLTEpLAorICAgIHVpZCgtMSksCisgICAgbmFtZUFzVVRGOChOVUxMKSwKKyAgICBjb2RlY0lkKE5VTEwpLAorICAgIGNvZGVjUHJpdmF0ZShOVUxMKSwKKyAgICBjb2RlY1ByaXZhdGVTaXplKDApLAorICAgIGNvZGVjTmFtZUFzVVRGOChOVUxMKQoreworfQorCit2b2lkIFRyYWNrOjpJbmZvOjpDbGVhcigpIAoreworICAgIGRlbGV0ZVtdIG5hbWVBc1VURjg7CisgICAgbmFtZUFzVVRGOCA9IE5VTEw7CisKKyAgICBkZWxldGVbXSBjb2RlY0lkOworICAgIGNvZGVjSWQgPSBOVUxMOworCisgICAgZGVsZXRlW10gY29kZWNQcml2YXRlOworICAgIGNvZGVjUHJpdmF0ZSA9IE5VTEw7CisKKyAgICBkZWxldGVbXSBjb2RlY05hbWVBc1VURjg7CisgICAgY29kZWNOYW1lQXNVVEY4ID0gTlVMTDsKK30KKworY29uc3QgQmxvY2tFbnRyeSogVHJhY2s6OkdldEVPUygpIGNvbnN0Cit7CisgICAgcmV0dXJuICZtX2VvczsKK30KKworbG9uZyBsb25nIFRyYWNrOjpHZXRUeXBlKCkgY29uc3QKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG1faW5mby50eXBlKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1bnNpZ25lZCBsb25nIFRyYWNrOjpHZXROdW1iZXIoKSBjb25zdAoreworICAgIGFzc2VydChtX2luZm8ubnVtYmVyID49IDApOworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obV9pbmZvLm51bWJlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgY2hhciogVHJhY2s6OkdldE5hbWVBc1VURjgoKSBjb25zdAoreworICAgIHJldHVybiBtX2luZm8ubmFtZUFzVVRGODsKK30KKworY29uc3QgY2hhciogVHJhY2s6OkdldENvZGVjTmFtZUFzVVRGOCgpIGNvbnN0Cit7ICAKKyAgICByZXR1cm4gbV9pbmZvLmNvZGVjTmFtZUFzVVRGODsKK30KKworCitjb25zdCBjaGFyKiBUcmFjazo6R2V0Q29kZWNJZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW5mby5jb2RlY0lkOworfQorCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIqIFRyYWNrOjpHZXRDb2RlY1ByaXZhdGUoc2l6ZV90ICpvcHRpb25hbFNpemUpIGNvbnN0Cit7CisgICAgaWYgKG9wdGlvbmFsU2l6ZSkgeworICAgICAgICAqb3B0aW9uYWxTaXplID0gbV9pbmZvLmNvZGVjUHJpdmF0ZVNpemU7CisgICAgfQorICAgIHJldHVybiBtX2luZm8uY29kZWNQcml2YXRlOworfQorCisKK2xvbmcgVHJhY2s6OkdldEZpcnN0KGNvbnN0IEJsb2NrRW50cnkqJiBwQmxvY2tFbnRyeSkgY29uc3QKK3sKKyAgICBDbHVzdGVyKiBjb25zdCBwQ2x1c3RlciA9IG1fcFNlZ21lbnQtPkdldEZpcnN0KCk7CisgICAgCisgICAgLy9JZiBTZWdtZW50OjpHZXRGaXJzdCByZXR1cm5zIE5VTEwsIHRoZW4gdGhpcyBtdXN0IGJlIGEgbmV0d29yayAKKyAgICAvL2Rvd25sb2FkLCBhbmQgd2UgaGF2ZW4ndCBsb2FkZWQgYW55IGNsdXN0ZXJzIHlldC4gIEluIHRoaXMgY2FzZSwKKyAgICAvL3JldHVybmluZyBOVUxMIGZyb20gVHJhY2s6OkdldEZpcnN0IG1lYW5zIHRoZSBzYW1lIHRoaW5nLgorCisgICAgaWYgKChwQ2x1c3RlciA9PSBOVUxMKSB8fCBwQ2x1c3Rlci0+RU9TKCkpCisgICAgeworICAgICAgICBwQmxvY2tFbnRyeSA9IE5VTEw7CisgICAgICAgIHJldHVybiBFX0JVRkZFUl9OT1RfRlVMTDsgIC8vcmV0dXJuIDFMIGluc3RlYWQ/CisgICAgfQorICAgICAgICAKKyAgICBwQmxvY2tFbnRyeSA9IHBDbHVzdGVyLT5HZXRGaXJzdCgpOworICAgIAorICAgIHdoaWxlIChwQmxvY2tFbnRyeSkKKyAgICB7CisgICAgICAgIGNvbnN0IEJsb2NrKiBjb25zdCBwQmxvY2sgPSBwQmxvY2tFbnRyeS0+R2V0QmxvY2soKTsKKyAgICAgICAgYXNzZXJ0KHBCbG9jayk7CisgICAgICAgIAorICAgICAgICBpZiAocEJsb2NrLT5HZXRUcmFja051bWJlcigpID09ICh1bnNpZ25lZCBsb25nKW1faW5mby5udW1iZXIpCisgICAgICAgICAgICByZXR1cm4gMEw7CisgICAgICAgICAgICAKKyAgICAgICAgcEJsb2NrRW50cnkgPSBwQ2x1c3Rlci0+R2V0TmV4dChwQmxvY2tFbnRyeSk7CisgICAgfQorICAgIAorICAgIC8vTk9URTogaWYgd2UgZ2V0IGhlcmUsIGl0IG1lYW5zIHRoYXQgd2UgZGlkbid0IGZpbmQgYSBibG9jayB3aXRoCisgICAgLy9hIG1hdGNoaW5nIHRyYWNrIG51bWJlci4gIFdlIGludGVycHJldCB0aGF0IGFzIGFuIGVycm9yICh3aGljaAorICAgIC8vbWlnaHQgYmUgdG9vIGNvbnNlcnZhdGl2ZSkuCisKKyAgICBwQmxvY2tFbnRyeSA9IEdldEVPUygpOyAgLy9zbyB3ZSBjYW4gcmV0dXJuIGEgbm9uLU5VTEwgdmFsdWUKKyAgICByZXR1cm4gMUw7Cit9CisKKworbG9uZyBUcmFjazo6R2V0TmV4dChjb25zdCBCbG9ja0VudHJ5KiBwQ3VyckVudHJ5LCBjb25zdCBCbG9ja0VudHJ5KiYgcE5leHRFbnRyeSkgY29uc3QKK3sKKyAgICBhc3NlcnQocEN1cnJFbnRyeSk7CisgICAgYXNzZXJ0KCFwQ3VyckVudHJ5LT5FT1MoKSk7ICAvLz8KKyAgICBhc3NlcnQocEN1cnJFbnRyeS0+R2V0QmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSA9PSAodW5zaWduZWQgbG9uZyltX2luZm8ubnVtYmVyKTsgICAgCisgICAgCisgICAgY29uc3QgQ2x1c3RlciogY29uc3QgcEN1cnJDbHVzdGVyID0gcEN1cnJFbnRyeS0+R2V0Q2x1c3RlcigpOworICAgIGFzc2VydChwQ3VyckNsdXN0ZXIpOworICAgIGFzc2VydCghcEN1cnJDbHVzdGVyLT5FT1MoKSk7CisgICAgCisgICAgcE5leHRFbnRyeSA9IHBDdXJyQ2x1c3Rlci0+R2V0TmV4dChwQ3VyckVudHJ5KTsKKyAgICAgICAgICAgIAorICAgIHdoaWxlIChwTmV4dEVudHJ5KQorICAgIHsgICAgCisgICAgICAgIGNvbnN0IEJsb2NrKiBjb25zdCBwTmV4dEJsb2NrID0gcE5leHRFbnRyeS0+R2V0QmxvY2soKTsKKyAgICAgICAgYXNzZXJ0KHBOZXh0QmxvY2spOworICAgIAorICAgICAgICBpZiAocE5leHRCbG9jay0+R2V0VHJhY2tOdW1iZXIoKSA9PSAodW5zaWduZWQgbG9uZyltX2luZm8ubnVtYmVyKQorICAgICAgICAgICAgcmV0dXJuIDBMOworICAgICAgICAgICAgCisgICAgICAgIHBOZXh0RW50cnkgPSBwQ3VyckNsdXN0ZXItPkdldE5leHQocE5leHRFbnRyeSk7CisgICAgfQorCisgICAgU2VnbWVudCogcFNlZ21lbnQgPSBwQ3VyckNsdXN0ZXItPm1fcFNlZ21lbnQ7ICAgIAorICAgIENsdXN0ZXIqIGNvbnN0IHBOZXh0Q2x1c3RlciA9IHBTZWdtZW50LT5HZXROZXh0KHBDdXJyQ2x1c3Rlcik7CisgICAgCisgICAgaWYgKChwTmV4dENsdXN0ZXIgPT0gTlVMTCkgfHwgcE5leHRDbHVzdGVyLT5FT1MoKSkKKyAgICB7CisgICAgICAgIGlmIChwU2VnbWVudC0+VW5wYXJzZWQoKSA8PSAwKSAgIC8vYWxsIGNsdXN0ZXJzIGhhdmUgYmVlbiBsb2FkZWQKKyAgICAgICAgeworICAgICAgICAgICAgcE5leHRFbnRyeSA9IEdldEVPUygpOworICAgICAgICAgICAgcmV0dXJuIDFMOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwTmV4dEVudHJ5ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEVfQlVGRkVSX05PVF9GVUxMOworICAgIH0KKyAgICAgICAgCisgICAgcE5leHRFbnRyeSA9IHBOZXh0Q2x1c3Rlci0+R2V0Rmlyc3QoKTsKKyAgICAKKyAgICB3aGlsZSAocE5leHRFbnRyeSkKKyAgICB7CisgICAgICAgIGNvbnN0IEJsb2NrKiBjb25zdCBwTmV4dEJsb2NrID0gcE5leHRFbnRyeS0+R2V0QmxvY2soKTsKKyAgICAgICAgYXNzZXJ0KHBOZXh0QmxvY2spOworICAgICAgICAKKyAgICAgICAgaWYgKHBOZXh0QmxvY2stPkdldFRyYWNrTnVtYmVyKCkgPT0gKHVuc2lnbmVkIGxvbmcpbV9pbmZvLm51bWJlcikKKyAgICAgICAgICAgIHJldHVybiAwTDsKKyAgICAgICAgICAgIAorICAgICAgICBwTmV4dEVudHJ5ID0gcE5leHRDbHVzdGVyLT5HZXROZXh0KHBOZXh0RW50cnkpOworICAgIH0KKyAgICAKKyAgICAvL1RPRE86IHdoYXQgaGFzIGhhcHBlbmVkIGhlcmUgaXMgdGhhdCB3ZSBkaWQgbm90IGZpbmQgYSBibG9jaworICAgIC8vd2l0aCBhIG1hdGNoaW5nIHRyYWNrIG51bWJlciBvbiB0aGUgbmV4dCBjbHVzdGVyLiAgSXQgbWlnaHQKKyAgICAvL2JlIHRoZSBjYXNlIHRoYXQgc29tZSBjbHVzdGVyIGJleW9uZCB0aGUgbmV4dCBjbHVzdGVyIAorICAgIC8vY29udGFpbnMgYSBibG9jayBoYXZpbmcgYSBtYXRjaGluZyB0cmFjayBudW1iZXIsIGJ1dCBmb3IKKyAgICAvL25vdyB3ZSB0ZXJtaW5hdGUgdGhlIHNlYXJjaCBpbW1lZGlhdGVseS4gIFdlIGRvIHRoaXMgc28gdGhhdAorICAgIC8vd2UgZG9uJ3QgZW5kIHVwIHNlYXJjaGluZyB0aGUgZW50aXJlIGZpbGUgbG9va2luZyBmb3IgdGhlCisgICAgLy9uZXh0IGJsb2NrLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byB0cnkgc2VhcmNoaW5nIGZvciB0aGUgbmV4dAorICAgIC8vYmxvY2sgaW4gYSBzbWFsbCwgZml4ZWQgbnVtYmVyIG9mIGNsdXN0ZXJzIChpbnRlYWQgc2VhcmNoaW5nCisgICAgLy9qdXN0IHRoZSBuZXh0IG9uZSksIG9yIHRvIHRlcm1pbmF0ZSB0aGUgc2VhcmNoIHdoZW4gd2hlbiB0aGUKKyAgICAvL3RoZXJlIGlzIGEgbGFyZ2UgZ2FwIGluIHRpbWUsIG9yIGxhcmdlIGdhcCBpbiBmaWxlIHBvc2l0aW9uLiAgSXQKKyAgICAvL21pZ2h0IHZlcnkgd2VsbCBiZSB0aGUgY2FzZSB0aGF0IHRoZSBhcHByb2FjaCB3ZSB1c2UgaGVyZSBpcworICAgIC8vdW5uZWNlc3NhcmlseSBjb25zZXJ2YXRpdmUuCisgICAgCisgICAgLy9UT0RPOiBhZ2FpbiwgaGVyZSdzIGEgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvIHJldHVybiB0aGUgc3BlY2lhbAorICAgIC8vRU9TIGJsb2NrLiAgT3Igc29tZXRoaW5nLiAgSXQncyBPSyBpZiBwTmV4dCBpcyBOVUxMLCBiZWNhdXNlCisgICAgLy93ZSBvbmx5IG5lZWQgaXQgdG8gc2V0IHRoZSBzdG9wIHRpbWUgb2YgdGhlIG1lZGlhIHNhbXBsZS4KKyAgICAvLyhUaGUgc3RhcnQgdGltZSBpcyBkZXRlcm1pbmVkIGZyb20gcEN1cnIsIHdoaWNoIGlzIG5vbi1OVUxMCisgICAgLy9hbmQgbm9uLUVPUy4pICBUaGUgcHJvYmxlbSBpcyB3aGVuIHdlIHNldCBwQ3Vycj1wTmV4dDsgd2hlbgorICAgIC8vcEN1cnIgaGFzIHRoZSB2YWx1ZSBOVUxMIHdlIGludGVycHJldCB0aGF0IHRvIG1lYW4gdGhhdCB3ZQorICAgIC8vaGF2ZW4ndCBmdWxseSBpbml0aWFsaXplZCBwQ3VyciBhbmQgd2UgYXR0ZW1wdCB0byBzZXQgaXQgdG8KKyAgICAvL3BvaW50IHRvIHRoZSBmaXJzdCBibG9jayBmb3IgdGhpcyB0cmFjay4gIEJ1dCB0aGF0J3Mgbm90IHdoYXQKKyAgICAvL3dlIHdhbnQgYXQgYWxsOyB3ZSB3YW50IHRoZSBuZXh0IGNhbGwgdG8gUG9wdWxhdGVTYW1wbGUgdG8KKyAgICAvL3JldHVybiBlbmQtb2Ytc3RyZWFtLCBub3QgKHJlKXN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZy4KKyAgICAvLworICAgIC8vT25lIHdvcmstYXJvdW5kIGlzIHRvIHNlbmQgRU9TIGltbWVkaWF0ZWx5LiAgV2Ugd291bGQgc2VuZCAKKyAgICAvL3RoZSBFT1MgdGhlIG5leHQgcGFzcyBhbnl3YXksIHNvIG1heWJlIGl0J3Mgbm8gZ3JlYXQgbG9zcy4gIFRoZSAKKyAgICAvL29ubHkgcHJvYmxlbSBpcyB0aGF0IGlmIHRoaXMgdGhlIHN0cmVhbSByZWFsbHkgZG9lcyBlbmQgb25lCisgICAgLy9jbHVzdGVyIGVhcmx5IChyZWxhdGl2ZSB0byBvdGhlciB0cmFja3MpLCBvciB0aGUgbGFzdCBmcmFtZQorICAgIC8vaGFwcGVucyB0byBiZSBhIGtleWZyYW1lICgiQ2FuU2Vla1RvRW5kIikuCisgICAgLy8KKyAgICAvL1RoZSBwcm9ibGVtIGlzIHRoYXQgd2UgbmVlZCBhIHdheSB0byBtYXJrIGFzIHN0cmVhbSBhcworICAgIC8vImF0IGVuZCBvZiBzdHJlYW0iIHdpdGhvdXQgYWN0dWFsbHkgYmVpbmcgYXQgZW5kIG9mIHN0cmVhbS4KKyAgICAvL1dlIG5lZWQgdG8gZ2l2ZSBwQ3VyciBzb21lIHZhbHVlIHRoYXQgbWVhbnMgInlvdSd2ZSByZWFjaGVkIEVPUyIuCisgICAgLy9XZSBjYW4ndCBzeW50aGVzaXplIHRoZSBzcGVjaWFsIEVPUyBDbHVzdGVyIGltbWVkaWF0ZWx5CisgICAgLy8od2hlbiB3ZSBmaXJzdCBvcGVuIHRoZSBmaWxlLCBzYXkpLCBiZWNhdXNlIHdlIHVzZSB0aGUgZXhpc3RhbmNlCisgICAgLy9vZiB0aGF0IHNwZWNpYWwgY2x1c3RlciB2YWx1ZSB0byBtZWFuIHRoYXQgd2UndmUgcmVhZCBhbGwgb2YgCisgICAgLy90aGUgY2x1c3RlcnMgKHRoaXMgaXMgYSBuZXR3b3JrIGRvd25sb2FkLCBzbyB3ZSBjYW4ndCBrbm93IGFwcmlvcmkKKyAgICAvL2hvdyBtYW55IHdlIGhhdmUpLgorICAgIC8vCisgICAgLy9Pciwgd2UgY291bGQgcmV0dXJuIEVfRkFJTCwgYW5kIHNldCBhbm90aGVyIGJpdCBpbiB0aGUgc3RyZWFtCisgICAgLy9vYmplY3QgaXRzZWxmLCB0byBpbmRpY2F0ZSB0aGF0IGl0IHNob3VsZCBzZW5kIEVPUyBlYXJsaWVyCisgICAgLy90aGFuIHdoZW4gKHBDdXJyPXBTdG9wKS4KKyAgICAvLworICAgIC8vT3IsIHByb2JhYmx5IHRoZSBiZXN0IHNvbHV0aW9uLCB3aGVuIHdlIGFjdHVhbGx5IGxvYWQgdGhlIAorICAgIC8vYmxvY2tzIGludG8gYSBjbHVzdGVyOiBpZiB3ZSBub3RpY2UgdGhhdCB0aGVyZSdzIG5vIGJsb2NrCisgICAgLy9mb3IgYSB0cmFjaywgd2Ugc3ludGhlc2l6ZSBhIG5vbmNlIEVPUyBibG9jayBmb3IgdGhhdCB0cmFjay4KKyAgICAvL1RoYXQgd2F5IHdlIGFsd2F5cyBoYXZlIHNvbWV0aGluZyB0byByZXR1cm4uICBCdXQgdGhhdCB3aWxsCisgICAgLy9vbmx5IHdvcmsgZm9yIHNlcXVlbnRpYWwgc2Nhbj8/PworCisgICAgLy9wTmV4dCA9IE5VTEw7ICAgIAorICAgIC8vcmV0dXJuIEVfRkFJTDsKKyAgICBwTmV4dEVudHJ5ID0gR2V0RU9TKCk7CisgICAgcmV0dXJuIDFMOworfQorCisKK1RyYWNrOjpFT1NCbG9jazo6RU9TQmxvY2soKQoreworfQorCisKK2Jvb2wgVHJhY2s6OkVPU0Jsb2NrOjpFT1MoKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCisKK0NsdXN0ZXIqIFRyYWNrOjpFT1NCbG9jazo6R2V0Q2x1c3RlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworc2l6ZV90IFRyYWNrOjpFT1NCbG9jazo6R2V0SW5kZXgoKSBjb25zdAoreworICAgIHJldHVybiAwOworfQorCisKK2NvbnN0IEJsb2NrKiBUcmFjazo6RU9TQmxvY2s6OkdldEJsb2NrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitib29sIFRyYWNrOjpFT1NCbG9jazo6SXNCRnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworCitWaWRlb1RyYWNrOjpWaWRlb1RyYWNrKFNlZ21lbnQqIHBTZWdtZW50LCBjb25zdCBJbmZvJiBpKSA6CisgICAgVHJhY2socFNlZ21lbnQsIGkpLAorICAgIG1fd2lkdGgoLTEpLAorICAgIG1faGVpZ2h0KC0xKSwKKyAgICBtX3JhdGUoLTEpCit7CisgICAgYXNzZXJ0KGkudHlwZSA9PSAxKTsKKyAgICBhc3NlcnQoaS5udW1iZXIgPiAwKTsKKyAgICAKKyAgICBJTWt2UmVhZGVyKiBjb25zdCBwUmVhZGVyID0gcFNlZ21lbnQtPm1fcFJlYWRlcjsKKyAgICAKKyAgICBjb25zdCBTZXR0aW5ncyYgcyA9IGkuc2V0dGluZ3M7CisgICAgYXNzZXJ0KHMuc3RhcnQgPj0gMCk7CisgICAgYXNzZXJ0KHMuc2l6ZSA+PSAwKTsKKyAgICAKKyAgICBsb25nIGxvbmcgcG9zID0gcy5zdGFydDsKKyAgICBhc3NlcnQocG9zID49IDApOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gcG9zICsgcy5zaXplOworICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyNpZmRlZiBfREVCVUcKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPOiBoYW5kbGUgZXJyb3IgY2FzZQorICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisjZW5kaWYKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgzMCwgbV93aWR0aCkpICAgICAgICAgCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgzQSwgbV9oZWlnaHQpKSAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDM4M0UzLCBtX3JhdGUpKSAKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETzogaGFuZGxlIGVycm9yIGNhc2UKKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUKKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgc2l6ZSkgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vcG9zIG5vdyBkZXNpZ25hdGVzIHN0YXJ0IG9mIHBheWxvYWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdG9wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKworYm9vbCBWaWRlb1RyYWNrOjpWZXRFbnRyeShjb25zdCBCbG9ja0VudHJ5KiBwQmxvY2tFbnRyeSkgY29uc3QKK3sKKyAgICBhc3NlcnQocEJsb2NrRW50cnkpOworICAgIAorICAgIGNvbnN0IEJsb2NrKiBjb25zdCBwQmxvY2sgPSBwQmxvY2tFbnRyeS0+R2V0QmxvY2soKTsKKyAgICBhc3NlcnQocEJsb2NrKTsgICAgCisgICAgYXNzZXJ0KHBCbG9jay0+R2V0VHJhY2tOdW1iZXIoKSA9PSAodW5zaWduZWQgbG9uZyltX2luZm8ubnVtYmVyKTsKKyAgICAKKyAgICByZXR1cm4gcEJsb2NrLT5Jc0tleSgpOworfQorCisKKworbG9uZyBsb25nIFZpZGVvVHJhY2s6OkdldFdpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV93aWR0aDsKK30KKworCitsb25nIGxvbmcgVmlkZW9UcmFjazo6R2V0SGVpZ2h0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9oZWlnaHQ7Cit9CisKKworZG91YmxlIFZpZGVvVHJhY2s6OkdldEZyYW1lUmF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcmF0ZTsKK30KKworCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrKFNlZ21lbnQqIHBTZWdtZW50LCBjb25zdCBJbmZvJiBpKSA6CisgICAgVHJhY2socFNlZ21lbnQsIGkpCit7CisgICAgYXNzZXJ0KGkudHlwZSA9PSAyKTsKKyAgICBhc3NlcnQoaS5udW1iZXIgPiAwKTsKKworICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBwU2VnbWVudC0+bV9wUmVhZGVyOworICAgIAorICAgIGNvbnN0IFNldHRpbmdzJiBzID0gaS5zZXR0aW5nczsKKyAgICBhc3NlcnQocy5zdGFydCA+PSAwKTsKKyAgICBhc3NlcnQocy5zaXplID49IDApOworICAgIAorICAgIGxvbmcgbG9uZyBwb3MgPSBzLnN0YXJ0OworICAgIGFzc2VydChwb3MgPj0gMCk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBwb3MgKyBzLnNpemU7CisgICAgCisgICAgd2hpbGUgKHBvcyA8IHN0b3ApCisgICAgeworI2lmZGVmIF9ERUJVRworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyNlbmRpZgorICAgICAgICBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDM1LCBtX3JhdGUpKSAgICAgICAgICAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MUYsIG1fY2hhbm5lbHMpKSAgIAorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MjI2NCwgbV9iaXREZXB0aCkpICAKKyAgICAgICAgICAgIDsgICAgICAgICAgICAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChpZCA+PSAwKTsgIC8vVE9ETzogaGFuZGxlIGVycm9yIGNhc2UKKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUKKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgc2l6ZSkgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vcG9zIG5vdyBkZXNpZ25hdGVzIHN0YXJ0IG9mIHBheWxvYWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICAgICAgYXNzZXJ0KHBvcyA8PSBzdG9wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KKworYm9vbCBBdWRpb1RyYWNrOjpWZXRFbnRyeShjb25zdCBCbG9ja0VudHJ5KiBwQmxvY2tFbnRyeSkgY29uc3QKK3sKKyAgICBhc3NlcnQocEJsb2NrRW50cnkpOworICAgIAorICAgIGNvbnN0IEJsb2NrKiBjb25zdCBwQmxvY2sgPSBwQmxvY2tFbnRyeS0+R2V0QmxvY2soKTsKKyAgICBhc3NlcnQocEJsb2NrKTsKKyAgICBhc3NlcnQocEJsb2NrLT5HZXRUcmFja051bWJlcigpID09ICh1bnNpZ25lZCBsb25nKW1faW5mby5udW1iZXIpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworZG91YmxlIEF1ZGlvVHJhY2s6OkdldFNhbXBsaW5nUmF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcmF0ZTsKK30KKworCitsb25nIGxvbmcgQXVkaW9UcmFjazo6R2V0Q2hhbm5lbHMoKSBjb25zdAoreworICAgIHJldHVybiBtX2NoYW5uZWxzOworfQorCitsb25nIGxvbmcgQXVkaW9UcmFjazo6R2V0Qml0RGVwdGgoKSBjb25zdAoreworICAgIHJldHVybiBtX2JpdERlcHRoOworfQorCitUcmFja3M6OlRyYWNrcyhTZWdtZW50KiBwU2VnbWVudCwgbG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZV8pIDoKKyAgICBtX3BTZWdtZW50KHBTZWdtZW50KSwKKyAgICBtX3N0YXJ0KHN0YXJ0KSwKKyAgICBtX3NpemUoc2l6ZV8pLAorICAgIG1fdHJhY2tFbnRyaWVzKE5VTEwpLAorICAgIG1fdHJhY2tFbnRyaWVzRW5kKE5VTEwpCit7CisgICAgbG9uZyBsb25nIHN0b3AgPSBtX3N0YXJ0ICsgbV9zaXplOworICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBtX3BTZWdtZW50LT5tX3BSZWFkZXI7CisgICAgCisgICAgbG9uZyBsb25nIHBvczEgPSBtX3N0YXJ0OworICAgIGludCBjb3VudCA9IDA7CisgICAgCisgICAgd2hpbGUgKHBvczEgPCBzdG9wKQorICAgIHsKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvczEsIGxlbik7CisgICAgICAgIGFzc2VydChpZCA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KChwb3MxICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgCisgICAgICAgIHBvczEgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgICAgIAorICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvczEsIGxlbik7CisgICAgICAgIGFzc2VydChzaXplID49IDApOworICAgICAgICBhc3NlcnQoKHBvczEgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAKKyAgICAgICAgcG9zMSArPSBsZW47ICAvL2NvbnN1bWUgbGVuZ3RoIG9mIHNpemUKKyAgICAgICAgCisgICAgICAgIC8vcG9zIG5vdyBkZXNpbmF0ZXMgc3RhcnQgb2YgZWxlbWVudAorICAgICAgICBpZiAoaWQgPT0gMHgyRSkgIC8vVHJhY2tFbnRyeSBJRAorICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgIAorICAgICAgICBwb3MxICs9IHNpemU7ICAvL2NvbnN1bWUgcGF5bG9hZAorICAgICAgICBhc3NlcnQocG9zMSA8PSBzdG9wKTsKKyAgICB9ICAgIAorCisgICAgaWYgKGNvdW50IDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIG1fdHJhY2tFbnRyaWVzID0gbmV3IFRyYWNrKltjb3VudF07CisgICAgbV90cmFja0VudHJpZXNFbmQgPSBtX3RyYWNrRW50cmllczsKKworICAgIGxvbmcgbG9uZyBwb3MgPSBtX3N0YXJ0OworCisgICAgd2hpbGUgKHBvcyA8IHN0b3ApCisgICAgeworICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICBhc3NlcnQoaWQgPj0gMCk7CisgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgCisgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBzaXplMSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgYXNzZXJ0KHNpemUxID49IDApOworICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgIAorICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGxlbmd0aCBvZiBzaXplCisgICAgICAgIAorICAgICAgICAvL3BvcyBub3cgZGVzaW5hdGVzIHN0YXJ0IG9mIGVsZW1lbnQKKyAgICAgICAgCisgICAgICAgIGlmIChpZCA9PSAweDJFKSAgLy9UcmFja0VudHJ5IElECisgICAgICAgICAgICBQYXJzZVRyYWNrRW50cnkocG9zLCBzaXplMSwgKm1fdHJhY2tFbnRyaWVzRW5kKyspOworICAgICAgICAgICAgCisgICAgICAgIHBvcyArPSBzaXplMTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgfSAgICAKK30KKwordW5zaWduZWQgbG9uZyBUcmFja3M6OkdldFRyYWNrc0NvdW50KCkgY29uc3QKK3sKKyAgICBjb25zdCBwdHJkaWZmX3QgcmVzdWx0ID0gbV90cmFja0VudHJpZXNFbmQgLSBtX3RyYWNrRW50cmllczsKKyAgICBhc3NlcnQocmVzdWx0ID49IDApOworICAgIAorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihyZXN1bHQpOworfQorCisKK3ZvaWQgVHJhY2tzOjpQYXJzZVRyYWNrRW50cnkoCisgICAgbG9uZyBsb25nIHN0YXJ0LAorICAgIGxvbmcgbG9uZyBzaXplLAorICAgIFRyYWNrKiYgcFRyYWNrKQoreworICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBtX3BTZWdtZW50LT5tX3BSZWFkZXI7CisgICAgCisgICAgbG9uZyBsb25nIHBvcyA9IHN0YXJ0OworICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gc3RhcnQgKyBzaXplOworCisgICAgVHJhY2s6OkluZm8gaTsKKyAgICAKKyAgICBUcmFjazo6U2V0dGluZ3MgdmlkZW9TZXR0aW5nczsKKyAgICB2aWRlb1NldHRpbmdzLnN0YXJ0ID0gLTE7CisgICAgCisgICAgVHJhY2s6OlNldHRpbmdzIGF1ZGlvU2V0dGluZ3M7CisgICAgYXVkaW9TZXR0aW5ncy5zdGFydCA9IC0xOworICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyNpZmRlZiBfREVCVUcKKyAgICAgICAgbG9uZyBsZW47CisgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBpZCA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgbGVuOworICAgICAgICBpZDsKKyNlbmRpZgorICAgICAgICBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDU3LCBpLm51bWJlcikpCisgICAgICAgICAgICBhc3NlcnQoaS5udW1iZXIgPiAwKTsKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MzNDNSwgaS51aWQpKSAgICAgICAgICAgCisgICAgICAgICAgICA7ICAKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MDMsIGkudHlwZSkpICAgICAgICAgICAgCisgICAgICAgICAgICA7ICAKKworICAgICAgICBlbHNlIGlmIChNYXRjaChwUmVhZGVyLCBwb3MsIDB4MTM2RSwgaS5uYW1lQXNVVEY4KSkgICAgICAgICAgCisgICAgICAgICAgICBhc3NlcnQoaS5uYW1lQXNVVEY4KTsgIAorCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwNiwgaS5jb2RlY0lkKSkgICAgICAgICAKKyAgICAgICAgICAgIDsgIAorCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgyM0EyLCBpLmNvZGVjUHJpdmF0ZSwgJmkuY29kZWNQcml2YXRlU2l6ZSkpICAKKyAgICAgICAgICAgIDsgIAorCisgICAgICAgIGVsc2UgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHgwNTg2ODgsIGkuY29kZWNOYW1lQXNVVEY4KSkgICAKKyAgICAgICAgICAgIGFzc2VydChpLmNvZGVjTmFtZUFzVVRGOCk7ICAKKworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE86IGhhbmRsZSBlcnJvciBjYXNlCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsgIC8vVE9ETzogaGFuZGxlIGVycm9yIGNhc2UKKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBsZW5ndGggb2Ygc2l6ZQorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaWQgPT0gMHg2MCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlb1NldHRpbmdzLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgdmlkZW9TZXR0aW5ncy5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGlkID09IDB4NjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXVkaW9TZXR0aW5ncy5zdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgICAgIGF1ZGlvU2V0dGluZ3Muc2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYXNzZXJ0KHBvcyA9PSBzdG9wKTsKKyAgICAvL1RPRE86IHByb3BlcnRseSB2ZXQgaW5mby5udW1iZXIsIHRvIGVuc3VyZSBib3RoIGl0cyBleGlzdGVuY2UsCisgICAgLy9hbmQgdGhhdCBpdCBpcyB1bmlxdWUgYW1vbmcgYWxsIHRyYWNrcy4KKyAgICBhc3NlcnQoaS5udW1iZXIgPiAwKTsKKworICAgIC8vVE9ETzogdmV0IHNldHRpbmdzLCB0byBlbnN1cmUgdGhhdCB2aWRlbyBzZXR0aW5ncyAoMHg2MCkKKyAgICAvL3dlcmUgc3BlY2lmaWVkIHdoZW4gdHlwZSA9IDEsIGFuZCB0aGF0IGF1ZGlvIHNldHRpbmdzICgweDYxKQorICAgIC8vd2VyZSBzcGVjaWZpZWQgd2hlbiB0eXBlID0gMi4gICAgCisgICAgaWYgKGkudHlwZSA9PSAxKSAgLy92aWRlbworICAgIHsKKyAgICAgICAgYXNzZXJ0KGF1ZGlvU2V0dGluZ3Muc3RhcnQgPCAwKTsKKyAgICAgICAgYXNzZXJ0KHZpZGVvU2V0dGluZ3Muc3RhcnQgPj0gMCk7CisgICAgICAgIAorICAgICAgICBpLnNldHRpbmdzID0gdmlkZW9TZXR0aW5nczsKKyAgICAgICAgCisgICAgICAgIFZpZGVvVHJhY2sqIGNvbnN0IHQgPSBuZXcgVmlkZW9UcmFjayhtX3BTZWdtZW50LCBpKTsKKyAgICAgICAgYXNzZXJ0KHQpOyAgLy9UT0RPCisgICAgICAgIHBUcmFjayA9IHQ7ICAgIAorICAgIH0KKyAgICBlbHNlIGlmIChpLnR5cGUgPT0gMikgIC8vYXVkaW8KKyAgICB7CisgICAgICAgIGFzc2VydCh2aWRlb1NldHRpbmdzLnN0YXJ0IDwgMCk7CisgICAgICAgIGFzc2VydChhdWRpb1NldHRpbmdzLnN0YXJ0ID49IDApOworICAgICAgICAKKyAgICAgICAgaS5zZXR0aW5ncyA9IGF1ZGlvU2V0dGluZ3M7CisgICAgICAgIAorICAgICAgICBBdWRpb1RyYWNrKiBjb25zdCB0ID0gbmV3ICBBdWRpb1RyYWNrKG1fcFNlZ21lbnQsIGkpOworICAgICAgICBhc3NlcnQodCk7ICAvL1RPRE8KKyAgICAgICAgcFRyYWNrID0gdDsgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBmb3Igbm93IHdlIGRvIG5vdCBzdXBwb3J0IG90aGVyIHRyYWNrIHR5cGVzIHlldC4KKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciB0cmFjayB0eXBlcworICAgICAgICBpLkNsZWFyKCk7CisgIAorICAgICAgICBwVHJhY2sgPSBOVUxMOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKworVHJhY2tzOjp+VHJhY2tzKCkKK3sKKyAgICBUcmFjayoqIGkgPSBtX3RyYWNrRW50cmllczsKKyAgICBUcmFjayoqIGNvbnN0IGogPSBtX3RyYWNrRW50cmllc0VuZDsKKyAgICAKKyAgICB3aGlsZSAoaSAhPSBqKQorICAgIHsKKyAgICAgICAgVHJhY2sqIHBUcmFjayA9ICppKys7CisgICAgICAgIGRlbGV0ZSBwVHJhY2s7CisgICAgICAgIHBUcmFjayA9IE5VTEw7ICAgIAorICAgIH0KKworICAgIGRlbGV0ZVtdIG1fdHJhY2tFbnRyaWVzOworfQorCisKK1RyYWNrKiBUcmFja3M6OkdldFRyYWNrQnlOdW1iZXIodW5zaWduZWQgbG9uZyB0bikgY29uc3QKK3sKKyAgICBUcmFjayoqIGkgPSBtX3RyYWNrRW50cmllczsKKyAgICBUcmFjayoqIGNvbnN0IGogPSBtX3RyYWNrRW50cmllc0VuZDsKKworICAgIHdoaWxlIChpICE9IGopCisgICAgeworICAgICAgICBUcmFjayogY29uc3QgcFRyYWNrID0gKmkrKzsKKyAgICAgICAKKyAgICAgICAgaWYgKHBUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHRuID09IHBUcmFjay0+R2V0TnVtYmVyKCkpCisgICAgICAgICAgICByZXR1cm4gcFRyYWNrOworICAgIH0KKworICAgIHJldHVybiBOVUxMOyAgLy9ub3QgZm91bmQKK30KKworCitUcmFjayogVHJhY2tzOjpHZXRUcmFja0J5SW5kZXgodW5zaWduZWQgbG9uZyBpZHgpIGNvbnN0Cit7CisgICAgY29uc3QgcHRyZGlmZl90IGNvdW50ID0gbV90cmFja0VudHJpZXNFbmQgLSBtX3RyYWNrRW50cmllczsKKyAgICAgICAKKyAgICBpZiAoaWR4ID49IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGNvdW50KSkKKyAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIG1fdHJhY2tFbnRyaWVzW2lkeF07Cit9CisKKwordm9pZCBDbHVzdGVyOjpMb2FkKCkKK3sKKyAgICBhc3NlcnQobV9wU2VnbWVudCk7CisgICAgCisgICAgaWYgKG1fc3RhcnQgPiAwKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KG1fc2l6ZSA+IDApOworICAgICAgICBhc3NlcnQobV90aW1lY29kZSA+PSAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBhc3NlcnQobV9zaXplID09IDApOworICAgIGFzc2VydChtX3RpbWVjb2RlIDwgMCk7CisgICAgCisgICAgSU1rdlJlYWRlciogY29uc3QgcFJlYWRlciA9IG1fcFNlZ21lbnQtPm1fcFJlYWRlcjsKKworICAgIGNvbnN0IGxvbmcgbG9uZyBvZmYgPSAtbV9zdGFydDsgIC8vcmVsYXRpdmUgdG8gc2VnbWVudAorICAgIGxvbmcgbG9uZyBwb3MgPSBtX3BTZWdtZW50LT5tX3N0YXJ0ICsgb2ZmOyAgLy9hYnNvbHV0ZQorICAgIAorICAgIGxvbmcgbGVuOworCisgICAgY29uc3QgbG9uZyBsb25nIGlkXyA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQoaWRfID49IDApOworICAgIGFzc2VydChpZF8gPT0gMHgwRjQzQjY3NSk7ICAvL0NsdXN0ZXIgSUQKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIGlkCisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHNpemVfID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgIGFzc2VydChzaXplXyA+PSAwKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAKKyAgICBtX3N0YXJ0ID0gcG9zOworICAgIG1fc2l6ZSA9IHNpemVfOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyBzdG9wID0gbV9zdGFydCArIHNpemVfOworICAgIAorICAgIGxvbmcgbG9uZyB0aW1lY29kZSA9IC0xOworICAgIAorICAgIHdoaWxlIChwb3MgPCBzdG9wKQorICAgIHsKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIHBvcywgMHg2NywgdGltZWNvZGUpKQorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlkID09IDB4MjApICAvL0Jsb2NrR3JvdXAgSUQKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChpZCA9PSAweDIzKSAgLy9TaW1wbGVCbG9jayBJRAorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgYXNzZXJ0KHRpbWVjb2RlID49IDApOworICAgIAorICAgIG1fdGltZWNvZGUgPSB0aW1lY29kZTsKK30KKworCitDbHVzdGVyKiBDbHVzdGVyOjpQYXJzZSgKKyAgICBTZWdtZW50KiBwU2VnbWVudCwKKyAgICBzaXplX3QgaWR4LAorICAgIGxvbmcgbG9uZyBvZmYpCit7CisgICAgYXNzZXJ0KHBTZWdtZW50KTsKKyAgICBhc3NlcnQob2ZmID49IDApOworICAgIGFzc2VydChvZmYgPCBwU2VnbWVudC0+bV9zaXplKTsKKyAgICBDbHVzdGVyKiBjb25zdCBwQ2x1c3RlciA9IG5ldyBDbHVzdGVyKHBTZWdtZW50LCBpZHgsIC1vZmYpOworICAgIGFzc2VydChwQ2x1c3Rlcik7CisgICAgCisgICAgcmV0dXJuIHBDbHVzdGVyOworfQorCisKK0NsdXN0ZXI6OkNsdXN0ZXIoKSA6CisgICAgbV9wU2VnbWVudChOVUxMKSwKKyAgICBtX2luZGV4KDApLAorICAgIG1fc3RhcnQoMCksCisgICAgbV9zaXplKDApLAorICAgIG1fdGltZWNvZGUoMCksCisgICAgbV9wRW50cmllcyhOVUxMKSwKKyAgICBtX2VudHJpZXNDb3VudCgwKQoreworfQorCitDbHVzdGVyOjpDbHVzdGVyKAorICAgIFNlZ21lbnQqIHBTZWdtZW50LAorICAgIHNpemVfdCBpZHgsCisgICAgbG9uZyBsb25nIG9mZikgOgorICAgIG1fcFNlZ21lbnQocFNlZ21lbnQpLAorICAgIG1faW5kZXgoaWR4KSwKKyAgICBtX3N0YXJ0KG9mZiksCisgICAgbV9zaXplKDApLAorICAgIG1fdGltZWNvZGUoLTEpLAorICAgIG1fcEVudHJpZXMoTlVMTCksCisgICAgbV9lbnRyaWVzQ291bnQoMCkKK3sKK30KKworCitDbHVzdGVyOjp+Q2x1c3RlcigpCit7CisjaWYgMAorICAgIHdoaWxlICghbV9wRW50cmllcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgQmxvY2tFbnRyeSogcEJsb2NrRW50cnkgPSBtX3BFbnRyaWVzLmZyb250KCk7CisgICAgICAgIGFzc2VydChwQmxvY2tFbnRyeSk7CisgICAgICAgIAorICAgICAgICBtX3BFbnRyaWVzLnBvcF9mcm9udCgpOworICAgICAgICBkZWxldGUgcEJsb2NrRW50cnk7CisgICAgfQorI2Vsc2UKKyAgICBCbG9ja0VudHJ5KiogaSA9IG1fcEVudHJpZXM7CisgICAgQmxvY2tFbnRyeSoqIGNvbnN0IGogPSBtX3BFbnRyaWVzICsgbV9lbnRyaWVzQ291bnQ7CisgICAgd2hpbGUgKGkgIT0gaikKKyAgICB7CisgICAgICAgICBCbG9ja0VudHJ5KiBwID0gKmkrKzsKKyAgIAorICAgICAgICAgYXNzZXJ0KHApOworICAgICAgICAgZGVsZXRlIHA7CisgICAgfQorIAorICAgIGRlbGV0ZVtdIG1fcEVudHJpZXM7CisjZW5kaWYKKworfQorCitib29sIENsdXN0ZXI6OkVPUygpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX3BTZWdtZW50ID09IDApOworfQorCisKK3ZvaWQgQ2x1c3Rlcjo6TG9hZEJsb2NrRW50cmllcygpCit7CisgICAgaWYgKG1fcEVudHJpZXMpCisgICAgICAgIHJldHVybjsKKworICAgIExvYWQoKTsgICAgCisgICAgYXNzZXJ0KG1fdGltZWNvZGUgPj0gMCk7CisgICAgYXNzZXJ0KG1fc3RhcnQgPiAwKTsKKyAgICBhc3NlcnQobV9zaXplID4gMCk7CisgICAgCisgICAgSU1rdlJlYWRlciogY29uc3QgcFJlYWRlciA9IG1fcFNlZ21lbnQtPm1fcFJlYWRlcjsKKyAgICAKKyAgICBsb25nIGxvbmcgcG9zID0gbV9zdGFydDsKKyAgICBjb25zdCBsb25nIGxvbmcgc3RvcCA9IG1fc3RhcnQgKyBtX3NpemU7CisgICAgbG9uZyBsb25nIHRpbWVjb2RlID0gLTE7CisgICAKKyAgICBsb25nIGxvbmcgaWR4ID0gcG9zOworCisgICAgbV9lbnRyaWVzQ291bnQgPSAwOworICAgIAorICAgIHdoaWxlIChpZHggPCBzdG9wKQorICAgIHsKKyAgICAgICAgaWYgKE1hdGNoKHBSZWFkZXIsIGlkeCwgMHg2NywgdGltZWNvZGUpKQorICAgICAgICAgICAgYXNzZXJ0KHRpbWVjb2RlID09IG1fdGltZWNvZGUpOworICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgaWR4LCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPCisgICAgICAgICAgICBhc3NlcnQoKGlkeCArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlkeCArPSBsZW47ICAvL2NvbnN1bWUgaWQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBpZHgsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChpZHggKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZHggKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlkID09IDB4MjApICAvL0Jsb2NrR3JvdXAgSUQKKyAgICAgICAgICAgICAgICArK21fZW50cmllc0NvdW50OworICAgICAgICAgICAgZWxzZSBpZiAoaWQgPT0gMHgyMykgIC8vU2ltcGxlQmxvY2sgSUQKKyAgICAgICAgICAgICAgICArK21fZW50cmllc0NvdW50OworCisgICAgICAgICAgICBpZHggKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisKKyAgICAgICAgICAgIGFzc2VydChpZHggPD0gc3RvcCk7CisgICAgICAgIH0gIAorICAgIH0KKworICAgIGlmIChtX2VudHJpZXNDb3VudCA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgIAorICAgIG1fcEVudHJpZXMgPSBuZXcgQmxvY2tFbnRyeSpbbV9lbnRyaWVzQ291bnRdOworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgCisgICAgd2hpbGUgKHBvcyA8IHN0b3ApCisgICAgeworICAgICAgICBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDY3LCB0aW1lY29kZSkpCisgICAgICAgICAgICBhc3NlcnQodGltZWNvZGUgPT0gbV90aW1lY29kZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsZW47CisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgaWQgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoaWQgPj0gMCk7ICAvL1RPRE8KKyAgICAgICAgICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zICs9IGxlbjsgIC8vY29uc3VtZSBpZAorICAgICAgICAgICAgCisgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgc2l6ZSA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICAgICAgICAgIGFzc2VydChzaXplID49IDApOyAgLy9UT0RPCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgc2l6ZQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaWQgPT0gMHgyMCkgIC8vQmxvY2tHcm91cCBJRAorICAgICAgICAgICAgICAgIFBhcnNlQmxvY2tHcm91cChwb3MsIHNpemUsIGluZGV4KyspOworICAgICAgICAgICAgZWxzZSBpZiAoaWQgPT0gMHgyMykgIC8vU2ltcGxlQmxvY2sgSUQKKyAgICAgICAgICAgICAgICBQYXJzZVNpbXBsZUJsb2NrKHBvcywgc2l6ZSwgaW5kZXgrKyk7CisKKyAgICAgICAgICAgIHBvcyArPSBzaXplOyAgLy9jb25zdW1lIHBheWxvYWQKKyAgICAgICAgICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgYXNzZXJ0KHBvcyA9PSBzdG9wKTsKKyAgICBhc3NlcnQodGltZWNvZGUgPj0gMCk7CisgICAgYXNzZXJ0KGluZGV4ID09IG1fZW50cmllc0NvdW50KTsKK30KKworCisKK2xvbmcgbG9uZyBDbHVzdGVyOjpHZXRUaW1lQ29kZSgpCit7CisgICAgTG9hZCgpOworICAgIHJldHVybiBtX3RpbWVjb2RlOworfQorCisKK2xvbmcgbG9uZyBDbHVzdGVyOjpHZXRUaW1lKCkKK3sKKyAgICBjb25zdCBsb25nIGxvbmcgdGMgPSBHZXRUaW1lQ29kZSgpOworICAgIGFzc2VydCh0YyA+PSAwKTsKKyAgICAKKyAgICBjb25zdCBTZWdtZW50SW5mbyogY29uc3QgcEluZm8gPSBtX3BTZWdtZW50LT5HZXRJbmZvKCk7CisgICAgYXNzZXJ0KHBJbmZvKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2NhbGUgPSBwSW5mby0+R2V0VGltZUNvZGVTY2FsZSgpOworICAgIGFzc2VydChzY2FsZSA+PSAxKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgdCA9IG1fdGltZWNvZGUgKiBzY2FsZTsKKworICAgIHJldHVybiB0OworfQorCisKK3ZvaWQgQ2x1c3Rlcjo6UGFyc2VCbG9ja0dyb3VwKGxvbmcgbG9uZyBzdGFydCwgbG9uZyBsb25nIHNpemUsIHNpemVfdCBpbmRleCkKK3sKKyAgICBhc3NlcnQobV9wRW50cmllcyk7CisgICAgYXNzZXJ0KG1fZW50cmllc0NvdW50KTsKKyAgICBhc3NlcnQoaW5kZXggPCBtX2VudHJpZXNDb3VudCk7CisgICAgCisgICAgQmxvY2tHcm91cCogY29uc3QgcEdyb3VwID0gbmV3IEJsb2NrR3JvdXAodGhpcywgaW5kZXgsIHN0YXJ0LCBzaXplKTsKKyAgICBhc3NlcnQocEdyb3VwKTsgIC8vVE9ETworICAgICAgICAKKyAgICBtX3BFbnRyaWVzW2luZGV4XSA9IHBHcm91cDsKK30KKworCisKK3ZvaWQgQ2x1c3Rlcjo6UGFyc2VTaW1wbGVCbG9jayhsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplLCBzaXplX3QgaW5kZXgpCit7CisgICAgYXNzZXJ0KG1fcEVudHJpZXMpOworICAgIGFzc2VydChtX2VudHJpZXNDb3VudCk7CisgICAgYXNzZXJ0KGluZGV4IDwgbV9lbnRyaWVzQ291bnQpOworCisgICAgU2ltcGxlQmxvY2sqIGNvbnN0IHBTaW1wbGVCbG9jayA9IG5ldyBTaW1wbGVCbG9jayh0aGlzLCBpbmRleCwgc3RhcnQsIHNpemUpOworICAgIGFzc2VydChwU2ltcGxlQmxvY2spOyAgLy9UT0RPCisgICAgICAgIAorICAgIG1fcEVudHJpZXNbaW5kZXhdID0gcFNpbXBsZUJsb2NrOworfQorCisKK2NvbnN0IEJsb2NrRW50cnkqIENsdXN0ZXI6OkdldEZpcnN0KCkKK3sKKyAgICBMb2FkQmxvY2tFbnRyaWVzKCk7CisgICAgCisgICAgcmV0dXJuIG1fcEVudHJpZXNbMF07Cit9CisKKyAgICAgICAgCitjb25zdCBCbG9ja0VudHJ5KiBDbHVzdGVyOjpHZXRMYXN0KCkKK3sgCisgICAgaWYgKG1fZW50cmllc0NvdW50ID09IDApCisgICAgICAgIHJldHVybiBtX3BFbnRyaWVzWzBdOworICAgIAorICAgIHJldHVybiBtX3BFbnRyaWVzW21fZW50cmllc0NvdW50LTFdOworfQorCisgICAgICAgIAorY29uc3QgQmxvY2tFbnRyeSogQ2x1c3Rlcjo6R2V0TmV4dChjb25zdCBCbG9ja0VudHJ5KiBwRW50cnkpIGNvbnN0Cit7CisgICAgYXNzZXJ0KHBFbnRyeSk7CisgICAgCisgICAgc2l6ZV90IGlkeCA9IHBFbnRyeS0+R2V0SW5kZXgoKTsKKyAgICAKKyAgICArK2lkeDsKKworICAgIGlmIChpZHggPT0gbV9lbnRyaWVzQ291bnQpIAorICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gbV9wRW50cmllc1tpZHhdOworCit9CisKKworY29uc3QgQmxvY2tFbnRyeSogQ2x1c3Rlcjo6R2V0RW50cnkoY29uc3QgVHJhY2sqIHBUcmFjaykKK3sKKworICAgIGFzc2VydChwVHJhY2spOworICAgIAorICAgIGlmIChtX3BTZWdtZW50ID09IE5VTEwpICAvL0VPUworICAgICAgICByZXR1cm4gcFRyYWNrLT5HZXRFT1MoKTsKKyAgICAKKyAgICBMb2FkQmxvY2tFbnRyaWVzKCk7CisgICAgCisgICAgQmxvY2tFbnRyeSogaSA9ICptX3BFbnRyaWVzOworICAgIEJsb2NrRW50cnkqIGogPSAqbV9wRW50cmllcyArIG1fZW50cmllc0NvdW50OworICAgIHdoaWxlIChpICE9IGopCisgICAgeworICAgICAgICBCbG9ja0VudHJ5KiBwRW50cnkgPSBpOworICAgICAgICBpKys7CisgICAgICAgIGFzc2VydChwRW50cnkpOworICAgICAgICBhc3NlcnQoIXBFbnRyeS0+RU9TKCkpOworICAgICAgICAKKyAgICAgICAgY29uc3QgQmxvY2sqIGNvbnN0IHBCbG9jayA9IHBFbnRyeS0+R2V0QmxvY2soKTsKKyAgICAgICAgYXNzZXJ0KHBCbG9jayk7CisgICAgICAgIAorICAgICAgICBpZiAocEJsb2NrLT5HZXRUcmFja051bWJlcigpICE9IHBUcmFjay0+R2V0TnVtYmVyKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAocFRyYWNrLT5WZXRFbnRyeShwRW50cnkpKQorICAgICAgICAgICAgcmV0dXJuIHBFbnRyeTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHBUcmFjay0+R2V0RU9TKCk7ICAvL25vIHNhdGlzZmFjdG9yeSBibG9jayBmb3VuZAorfQorCisKK0Jsb2NrRW50cnk6OkJsb2NrRW50cnkoKQoreworfQorCisKK0Jsb2NrRW50cnk6On5CbG9ja0VudHJ5KCkKK3sKK30KKworCisKK1NpbXBsZUJsb2NrOjpTaW1wbGVCbG9jaygKKyAgICBDbHVzdGVyKiBwQ2x1c3RlciwgCisgICAgc2l6ZV90IGlkeCwgCisgICAgbG9uZyBsb25nIHN0YXJ0LCAKKyAgICBsb25nIGxvbmcgc2l6ZSkgOgorICAgIG1fcENsdXN0ZXIocENsdXN0ZXIpLAorICAgIG1faW5kZXgoaWR4KSwKKyAgICBtX2Jsb2NrKHN0YXJ0LCBzaXplLCBwQ2x1c3Rlci0+bV9wU2VnbWVudC0+bV9wUmVhZGVyKQoreworfQorCisKK2Jvb2wgU2ltcGxlQmxvY2s6OkVPUygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK0NsdXN0ZXIqIFNpbXBsZUJsb2NrOjpHZXRDbHVzdGVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wQ2x1c3RlcjsKK30KKworCitzaXplX3QgU2ltcGxlQmxvY2s6OkdldEluZGV4KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbmRleDsKK30KKworCitjb25zdCBCbG9jayogU2ltcGxlQmxvY2s6OkdldEJsb2NrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gJm1fYmxvY2s7Cit9CisKKworYm9vbCBTaW1wbGVCbG9jazo6SXNCRnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworCitCbG9ja0dyb3VwOjpCbG9ja0dyb3VwKAorICAgIENsdXN0ZXIqIHBDbHVzdGVyLCAKKyAgICBzaXplX3QgaWR4LCAKKyAgICBsb25nIGxvbmcgc3RhcnQsIAorICAgIGxvbmcgbG9uZyBzaXplXykgOgorICAgIG1fcENsdXN0ZXIocENsdXN0ZXIpLAorICAgIG1faW5kZXgoaWR4KSwKKyAgICBtX3ByZXZUaW1lQ29kZSgwKSwKKyAgICBtX25leHRUaW1lQ29kZSgwKSwKKyAgICBtX3BCbG9jayhOVUxMKSAgLy9UT0RPOiBhY2NlcHQgbXVsdGlwbGUgYmxvY2tzIHdpdGhpbiBhIGJsb2NrIGdyb3VwCit7CisgICAgSU1rdlJlYWRlciogY29uc3QgcFJlYWRlciA9IG1fcENsdXN0ZXItPm1fcFNlZ21lbnQtPm1fcFJlYWRlcjsKKyAgICAKKyAgICBsb25nIGxvbmcgcG9zID0gc3RhcnQ7CisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBzdGFydCArIHNpemVfOworIAorICAgIGJvb2wgYlNpbXBsZUJsb2NrID0gZmFsc2U7CisgICAgCisgICAgd2hpbGUgKHBvcyA8IHN0b3ApCisgICAgeworICAgICAgICBzaG9ydCB0OworICAgIAorICAgICAgICBpZiAoTWF0Y2gocFJlYWRlciwgcG9zLCAweDdCLCB0KSkKKyAgICAgICAgeyAgICAKKyAgICAgICAgICAgIGlmICh0IDwgMCkKKyAgICAgICAgICAgICAgICBtX3ByZXZUaW1lQ29kZSA9IHQ7CisgICAgICAgICAgICBlbHNlIGlmICh0ID4gMCkKKyAgICAgICAgICAgICAgICBtX25leHRUaW1lQ29kZSA9IHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGlkID0gUmVhZFVJbnQocFJlYWRlciwgcG9zLCBsZW4pOworICAgICAgICAgICAgYXNzZXJ0KGlkID49IDApOyAgLy9UT0RPCisgICAgICAgICAgICBhc3NlcnQoKHBvcyArIGxlbikgPD0gc3RvcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcyArPSBsZW47ICAvL2NvbnN1bWUgSUQKKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIHNpemUgPSBSZWFkVUludChwUmVhZGVyLCBwb3MsIGxlbik7CisgICAgICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsgIC8vVE9ETworICAgICAgICAgICAgYXNzZXJ0KChwb3MgKyBsZW4pIDw9IHN0b3ApOworICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHNpemUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoIChpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjM6ICAvL1NpbXBsZUJsb2NrIElECisgICAgICAgICAgICAgICAgICAgIGJTaW1wbGVCbG9jayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIC8vWUVTLCBGQUxMIFRIUk9VR0ggVE8gTkVYVCBDQVNFCisKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjE6ICAvL0Jsb2NrIElECisgICAgICAgICAgICAgICAgICAgIFBhcnNlQmxvY2socG9zLCBzaXplKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwb3MgKz0gc2l6ZTsgIC8vY29uc3VtZSBwYXlsb2FkCisgICAgICAgICAgICBhc3NlcnQocG9zIDw9IHN0b3ApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFzc2VydChwb3MgPT0gc3RvcCk7CisgICAgYXNzZXJ0KG1fcEJsb2NrKTsKKyAgICAKKyAgICBpZiAoIWJTaW1wbGVCbG9jaykKKyAgICAgICAgbV9wQmxvY2stPlNldEtleShtX3ByZXZUaW1lQ29kZSA+PSAwKTsKK30KKworCitCbG9ja0dyb3VwOjp+QmxvY2tHcm91cCgpCit7CisgICAgZGVsZXRlIG1fcEJsb2NrOworfQorCisKK3ZvaWQgQmxvY2tHcm91cDo6UGFyc2VCbG9jayhsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplKQoreyAgIAorICAgIElNa3ZSZWFkZXIqIGNvbnN0IHBSZWFkZXIgPSBtX3BDbHVzdGVyLT5tX3BTZWdtZW50LT5tX3BSZWFkZXI7CisgICAgCisgICAgQmxvY2sqIGNvbnN0IHBCbG9jayA9IG5ldyBCbG9jayhzdGFydCwgc2l6ZSwgcFJlYWRlcik7CisgICAgYXNzZXJ0KHBCbG9jayk7ICAvL1RPRE8KKworICAgIC8vVE9ETzogdGhlIE1hdHJvc2thIHNwZWMgc2F5cyB5b3UgaGF2ZSBtdWx0aXBsZSBibG9ja3Mgd2l0aGluIHRoZSAKKyAgICAvL3NhbWUgYmxvY2sgZ3JvdXAsIHdpdGggYmxvY2tzIHJhbmtlZCBieSBwcmlvcml0eSAodGhlIGZsYWcgYml0cykuCisgICAgLy9JIGhhdmVuJ3QgZXZlciBzZWVuIHN1Y2ggYSBmaWxlIChta3ZtdXggY2VydGFpbmx5IGRvZXNuJ3QgbWFrZQorICAgIC8vb25lKSwgc28gdW50aWwgdGhlbiBJJ2xsIGp1c3QgYXNzdW1lIGJsb2NrIGdyb3VwcyBjb250YWluIGEgc2luZ2xlCisgICAgLy9ibG9jay4KKyNpZiAwICAgIAorICAgIG1fYmxvY2tzLnB1c2hfYmFjayhwQmxvY2spOworI2Vsc2UKKyAgICBhc3NlcnQobV9wQmxvY2sgPT0gTlVMTCk7CisgICAgbV9wQmxvY2sgPSBwQmxvY2s7CisjZW5kaWYKKworI2lmIDAKKyAgICBUcmFjayogY29uc3QgcFRyYWNrID0gcEJsb2NrLT5HZXRUcmFjaygpOworICAgIGFzc2VydChwVHJhY2spOworICAgIAorICAgIHBUcmFjay0+SW5zZXJ0KHBCbG9jayk7CisjZW5kaWYKK30KKworCitib29sIEJsb2NrR3JvdXA6OkVPUygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK0NsdXN0ZXIqIEJsb2NrR3JvdXA6OkdldENsdXN0ZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3BDbHVzdGVyOworfQorCisKK3NpemVfdCBCbG9ja0dyb3VwOjpHZXRJbmRleCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1faW5kZXg7Cit9CisKKworY29uc3QgQmxvY2sqIEJsb2NrR3JvdXA6OkdldEJsb2NrKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wQmxvY2s7Cit9CisKKworc2hvcnQgQmxvY2tHcm91cDo6R2V0UHJldlRpbWVDb2RlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcmV2VGltZUNvZGU7Cit9CisKKworc2hvcnQgQmxvY2tHcm91cDo6R2V0TmV4dFRpbWVDb2RlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9uZXh0VGltZUNvZGU7Cit9ICAgIAorCisKK2Jvb2wgQmxvY2tHcm91cDo6SXNCRnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiAobV9uZXh0VGltZUNvZGUgPiAwKTsKK30KKworCisKK0Jsb2NrOjpCbG9jayhsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplXywgSU1rdlJlYWRlciogcFJlYWRlcikgOgorICAgIG1fc3RhcnQoc3RhcnQpLAorICAgIG1fc2l6ZShzaXplXykKK3sKKyAgICBsb25nIGxvbmcgcG9zID0gc3RhcnQ7CisgICAgY29uc3QgbG9uZyBsb25nIHN0b3AgPSBzdGFydCArIHNpemVfOworCisgICAgbG9uZyBsZW47CisgICAgCisgICAgbV90cmFjayA9IFJlYWRVSW50KHBSZWFkZXIsIHBvcywgbGVuKTsKKyAgICBhc3NlcnQobV90cmFjayA+IDApOworICAgIGFzc2VydCgocG9zICsgbGVuKSA8PSBzdG9wKTsKKyAgICAKKyAgICBwb3MgKz0gbGVuOyAgLy9jb25zdW1lIHRyYWNrIG51bWJlcgorICAgIGFzc2VydCgoc3RvcCAtIHBvcykgPj0gMik7CisgICAgCisgICAgbV90aW1lY29kZSA9IFVuc2VyaWFsaXplMlNJbnQocFJlYWRlciwgcG9zKTsKKworICAgIHBvcyArPSAyOworICAgIGFzc2VydCgoc3RvcCAtIHBvcykgPj0gMSk7CisgICAgCisgICAgY29uc3QgbG9uZyBociA9IHBSZWFkZXItPlJlYWQocG9zLCAxLCAmbV9mbGFncyk7CisgICAgYXNzZXJ0KGhyID09IDBMKTsKKworICAgICsrcG9zOworICAgIGFzc2VydChwb3MgPD0gc3RvcCk7CisgICAgCisgICAgbV9mcmFtZU9mZiA9IHBvczsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgZnJhbWVfc2l6ZSA9IHN0b3AgLSBwb3M7CisKKyAgICBhc3NlcnQoZnJhbWVfc2l6ZSA8PSAyMTQ3NDgzNjQ3TCk7CisgICAgCisgICAgbV9mcmFtZVNpemUgPSBzdGF0aWNfY2FzdDxsb25nPihmcmFtZV9zaXplKTsKK30KKworCitsb25nIGxvbmcgQmxvY2s6OkdldFRpbWVDb2RlKENsdXN0ZXIqIHBDbHVzdGVyKSBjb25zdAoreworICAgIGFzc2VydChwQ2x1c3Rlcik7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHRjMCA9IHBDbHVzdGVyLT5HZXRUaW1lQ29kZSgpOworICAgIGFzc2VydCh0YzAgPj0gMCk7CisgICAgCisgICAgY29uc3QgbG9uZyBsb25nIHRjID0gdGMwICsgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihtX3RpbWVjb2RlKTsKKyAgICBhc3NlcnQodGMgPj0gMCk7CisgICAgCisgICAgcmV0dXJuIHRjOyAgLy91bnNjYWxlZCB0aW1lY29kZSB1bml0cworfQorCisKK2xvbmcgbG9uZyBCbG9jazo6R2V0VGltZShDbHVzdGVyKiBwQ2x1c3RlcikgY29uc3QKK3sKKyAgICBhc3NlcnQocENsdXN0ZXIpOworICAgIAorICAgIGNvbnN0IGxvbmcgbG9uZyB0YyA9IEdldFRpbWVDb2RlKHBDbHVzdGVyKTsKKyAgICAKKyAgICBjb25zdCBTZWdtZW50KiBjb25zdCBwU2VnbWVudCA9IHBDbHVzdGVyLT5tX3BTZWdtZW50OworICAgIGNvbnN0IFNlZ21lbnRJbmZvKiBjb25zdCBwSW5mbyA9IHBTZWdtZW50LT5HZXRJbmZvKCk7CisgICAgYXNzZXJ0KHBJbmZvKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgc2NhbGUgPSBwSW5mby0+R2V0VGltZUNvZGVTY2FsZSgpOworICAgIGFzc2VydChzY2FsZSA+PSAxKTsKKyAgICAKKyAgICBjb25zdCBsb25nIGxvbmcgbnMgPSB0YyAqIHNjYWxlOworCisgICAgcmV0dXJuIG5zOworfQorCisKK3Vuc2lnbmVkIGxvbmcgQmxvY2s6OkdldFRyYWNrTnVtYmVyKCkgY29uc3QKK3sKKyAgICBhc3NlcnQobV90cmFjayA+IDApOworICAgIAorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihtX3RyYWNrKTsKK30KKworCitib29sIEJsb2NrOjpJc0tleSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICgobV9mbGFncyAmIHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KDEgPDwgNykpICE9IDApOworfQorCisKK3ZvaWQgQmxvY2s6OlNldEtleShib29sIGJLZXkpCit7CisgICAgaWYgKGJLZXkpCisgICAgICAgIG1fZmxhZ3MgfD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oMSA8PCA3KTsKKyAgICBlbHNlCisgICAgICAgIG1fZmxhZ3MgJj0gMHg3RjsKK30KKworCitsb25nIEJsb2NrOjpHZXRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZVNpemU7Cit9CisKKworbG9uZyBCbG9jazo6UmVhZChJTWt2UmVhZGVyKiBwUmVhZGVyLCB1bnNpZ25lZCBjaGFyKiBidWYpIGNvbnN0Cit7CisKKyAgICBhc3NlcnQocFJlYWRlcik7CisgICAgYXNzZXJ0KGJ1Zik7CisgICAgCisgICAgY29uc3QgbG9uZyBociA9IHBSZWFkZXItPlJlYWQobV9mcmFtZU9mZiwgbV9mcmFtZVNpemUsIGJ1Zik7CisgICAgCisgICAgcmV0dXJuIGhyOworfQorCisKK30gIC8vZW5kIG5hbWVzcGFjZSBta3ZwYXJzZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL21rdnBhcnNlci5ocHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9ta3ZwYXJzZXIuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzExYjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9ta3ZwYXJzZXIuaHBwCkBAIC0wLDAgKzEsNDI4IEBACisjaWZuZGVmIE1LVlBBUlNFUl9IUFAKKyNkZWZpbmUgTUtWUEFSU0VSX0hQUAorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RkaW8+CisKK25hbWVzcGFjZSBta3ZwYXJzZXIKK3sKKworY29uc3QgaW50IEVfRklMRV9GT1JNQVRfSU5WQUxJRCA9IC0yOworY29uc3QgaW50IEVfQlVGRkVSX05PVF9GVUxMID0gLTM7CisKK2NsYXNzIElNa3ZSZWFkZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBSZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgbG9uZyBsZW5ndGgsIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgPSAwOyAJCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+SU1rdlJlYWRlcigpOworfTsKKworbG9uZyBsb25nIEdldFVJbnRMZW5ndGgoSU1rdlJlYWRlciosIGxvbmcgbG9uZywgbG9uZyYpOworbG9uZyBsb25nIFJlYWRVSW50KElNa3ZSZWFkZXIqLCBsb25nIGxvbmcsIGxvbmcmKTsKK2xvbmcgbG9uZyBTeW5jUmVhZFVJbnQoSU1rdlJlYWRlciosIGxvbmcgbG9uZyBwb3MsIGxvbmcgbG9uZyBzdG9wLCBsb25nJik7Citsb25nIGxvbmcgVW5zZXJpYWxpemVVSW50KElNa3ZSZWFkZXIqLCBsb25nIGxvbmcgcG9zLCBsb25nIGxvbmcgc2l6ZSk7CitmbG9hdCBVbnNlcmlhbGl6ZTRGbG9hdChJTWt2UmVhZGVyKiwgbG9uZyBsb25nKTsKK2RvdWJsZSBVbnNlcmlhbGl6ZThEb3VibGUoSU1rdlJlYWRlciosIGxvbmcgbG9uZyk7CitzaG9ydCBVbnNlcmlhbGl6ZTJTSW50KElNa3ZSZWFkZXIqLCBsb25nIGxvbmcpOworc2lnbmVkIGNoYXIgVW5zZXJpYWxpemUxU0ludChJTWt2UmVhZGVyKiwgbG9uZyBsb25nKTsKK2Jvb2wgTWF0Y2goSU1rdlJlYWRlciosIGxvbmcgbG9uZyYsIHVuc2lnbmVkIGxvbmcsIGxvbmcgbG9uZyYpOworYm9vbCBNYXRjaChJTWt2UmVhZGVyKiwgbG9uZyBsb25nJiwgdW5zaWduZWQgbG9uZywgY2hhciomKTsKK2Jvb2wgTWF0Y2goSU1rdlJlYWRlciosIGxvbmcgbG9uZyYsIHVuc2lnbmVkIGxvbmcsdW5zaWduZWQgY2hhciomLAorICAgICAgICAgICBzaXplX3QgKm9wdGlvbmFsU2l6ZSA9IE5VTEwpOworYm9vbCBNYXRjaChJTWt2UmVhZGVyKiwgbG9uZyBsb25nJiwgdW5zaWduZWQgbG9uZywgZG91YmxlJik7Citib29sIE1hdGNoKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcmLCB1bnNpZ25lZCBsb25nLCBzaG9ydCYpOworCisKK3N0cnVjdCBFQk1MSGVhZGVyCit7CisgICAgRUJNTEhlYWRlcigpOworICAgIH5FQk1MSGVhZGVyKCk7ICAKKyAgICBsb25nIGxvbmcgbV92ZXJzaW9uOworICAgIGxvbmcgbG9uZyBtX3JlYWRWZXJzaW9uOworICAgIGxvbmcgbG9uZyBtX21heElkTGVuZ3RoOworICAgIGxvbmcgbG9uZyBtX21heFNpemVMZW5ndGg7CisgICAgY2hhciogbV9kb2NUeXBlOworICAgIGxvbmcgbG9uZyBtX2RvY1R5cGVWZXJzaW9uOworICAgIGxvbmcgbG9uZyBtX2RvY1R5cGVSZWFkVmVyc2lvbjsKKyAgICAKKyAgICBsb25nIGxvbmcgUGFyc2UoSU1rdlJlYWRlciosIGxvbmcgbG9uZyYpOworfTsKKworCitjbGFzcyBTZWdtZW50OworY2xhc3MgVHJhY2s7CitjbGFzcyBDbHVzdGVyOworCitjbGFzcyBCbG9jaworeworICAgIEJsb2NrKGNvbnN0IEJsb2NrJik7CisgICAgQmxvY2smIG9wZXJhdG9yPShjb25zdCBCbG9jayYpOworCitwdWJsaWM6CisgICAgY29uc3QgbG9uZyBsb25nIG1fc3RhcnQ7CisgICAgY29uc3QgbG9uZyBsb25nIG1fc2l6ZTsKKyAgICAKKyAgICBCbG9jayhsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplLCBJTWt2UmVhZGVyKik7CisgICAgCisgICAgdW5zaWduZWQgbG9uZyBHZXRUcmFja051bWJlcigpIGNvbnN0OworICAgIAorICAgIGxvbmcgbG9uZyBHZXRUaW1lQ29kZShDbHVzdGVyKikgY29uc3Q7ICAvL2Fic29sdXRlLCBidXQgbm90IHNjYWxlZAorICAgIGxvbmcgbG9uZyBHZXRUaW1lKENsdXN0ZXIqKSBjb25zdDsgICAgICAvL2Fic29sdXRlLCBhbmQgc2NhbGVkIChuYW5vc2Vjb25kIHVuaXRzKQorICAgIGJvb2wgSXNLZXkoKSBjb25zdDsKKyAgICB2b2lkIFNldEtleShib29sKTsKKworICAgIGxvbmcgR2V0U2l6ZSgpIGNvbnN0OworICAgIGxvbmcgUmVhZChJTWt2UmVhZGVyKiwgdW5zaWduZWQgY2hhciopIGNvbnN0OworICAgIAorcHJpdmF0ZToKKyAgICBsb25nIGxvbmcgbV90cmFjazsgICAvL1RyYWNrOjpOdW1iZXIoKQorICAgIHNob3J0IG1fdGltZWNvZGU7ICAvL3JlbGF0aXZlIHRvIGNsdXN0ZXIKKyAgICB1bnNpZ25lZCBjaGFyIG1fZmxhZ3M7CisgICAgbG9uZyBsb25nIG1fZnJhbWVPZmY7CisgICAgbG9uZyBtX2ZyYW1lU2l6ZTsgICAgCisKK307CisKKworY2xhc3MgQmxvY2tFbnRyeQoreworICAgIEJsb2NrRW50cnkoY29uc3QgQmxvY2tFbnRyeSYpOworICAgIEJsb2NrRW50cnkmIG9wZXJhdG9yPShjb25zdCBCbG9ja0VudHJ5Jik7CisgICAgCitwdWJsaWM6CisgICAgdmlydHVhbCB+QmxvY2tFbnRyeSgpOworICAgIHZpcnR1YWwgYm9vbCBFT1MoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBDbHVzdGVyKiBHZXRDbHVzdGVyKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IEdldEluZGV4KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgQmxvY2sqIEdldEJsb2NrKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBJc0JGcmFtZSgpIGNvbnN0ID0gMDsKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBCbG9ja0VudHJ5KCk7CisKK307CisKKworY2xhc3MgU2ltcGxlQmxvY2sgOiBwdWJsaWMgQmxvY2tFbnRyeQoreworICAgIFNpbXBsZUJsb2NrKGNvbnN0IFNpbXBsZUJsb2NrJik7CisgICAgU2ltcGxlQmxvY2smIG9wZXJhdG9yPShjb25zdCBTaW1wbGVCbG9jayYpOworCitwdWJsaWM6CisgICAgU2ltcGxlQmxvY2soQ2x1c3RlciosIHNpemVfdCwgbG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZSk7CisKKyAgICBib29sIEVPUygpIGNvbnN0OworICAgIENsdXN0ZXIqIEdldENsdXN0ZXIoKSBjb25zdDsgCisgICAgc2l6ZV90IEdldEluZGV4KCkgY29uc3Q7CisgICAgY29uc3QgQmxvY2sqIEdldEJsb2NrKCkgY29uc3Q7CisgICAgYm9vbCBJc0JGcmFtZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgQ2x1c3RlciogY29uc3QgbV9wQ2x1c3RlcjsKKyAgICBjb25zdCBzaXplX3QgbV9pbmRleDsKKyAgICBCbG9jayBtX2Jsb2NrOworICAgIAorfTsKKworCitjbGFzcyBCbG9ja0dyb3VwIDogcHVibGljIEJsb2NrRW50cnkKK3sKKyAgICBCbG9ja0dyb3VwKGNvbnN0IEJsb2NrR3JvdXAmKTsKKyAgICBCbG9ja0dyb3VwJiBvcGVyYXRvcj0oY29uc3QgQmxvY2tHcm91cCYpOworCitwdWJsaWM6CisgICAgQmxvY2tHcm91cChDbHVzdGVyKiwgc2l6ZV90LCBsb25nIGxvbmcsIGxvbmcgbG9uZyk7CisgICAgfkJsb2NrR3JvdXAoKTsKKyAgICAKKyAgICBib29sIEVPUygpIGNvbnN0OworICAgIENsdXN0ZXIqIEdldENsdXN0ZXIoKSBjb25zdDsgCisgICAgc2l6ZV90IEdldEluZGV4KCkgY29uc3Q7CisgICAgY29uc3QgQmxvY2sqIEdldEJsb2NrKCkgY29uc3Q7CisgICAgYm9vbCBJc0JGcmFtZSgpIGNvbnN0OworICAgIAorICAgIHNob3J0IEdldFByZXZUaW1lQ29kZSgpIGNvbnN0OyAgLy9yZWxhdGl2ZSB0byBibG9jaydzIHRpbWUKKyAgICBzaG9ydCBHZXROZXh0VGltZUNvZGUoKSBjb25zdDsgIC8vYXMgYWJvdmUKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBDbHVzdGVyKiBjb25zdCBtX3BDbHVzdGVyOworICAgIGNvbnN0IHNpemVfdCBtX2luZGV4OworICAgIAorcHJpdmF0ZToKKyAgICBCbG9ja0dyb3VwKENsdXN0ZXIqLCBzaXplX3QsIHVuc2lnbmVkIGxvbmcpOworICAgIHZvaWQgUGFyc2VCbG9jayhsb25nIGxvbmcgc3RhcnQsIGxvbmcgbG9uZyBzaXplKTsKKworICAgIHNob3J0IG1fcHJldlRpbWVDb2RlOworICAgIHNob3J0IG1fbmV4dFRpbWVDb2RlOworICAgIAorICAgIC8vVE9ETzogdGhlIE1hdHJvc2thIHNwZWMgc2F5cyB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgYmxvY2tzIHdpdGhpbiB0aGUgCisgICAgLy9zYW1lIGJsb2NrIGdyb3VwLCB3aXRoIGJsb2NrcyByYW5rZWQgYnkgcHJpb3JpdHkgKHRoZSBmbGFnIGJpdHMpLgorICAgIC8vRm9yIG5vdyB3ZSBqdXN0IGNhY2hlIGEgc2luZ2xlIGJsb2NrLgorI2lmIDAKKyAgICB0eXBlZGVmIHN0ZDo6ZGVxdWU8QmxvY2sqPiBibG9ja3NfdDsKKyAgICBibG9ja3NfdCBtX2Jsb2NrczsgIC8vSW4gcHJhY3RpY2Ugc2hvdWxkIGNvbnRhaW4gb25seSBhIHNpbmdsZSBlbGVtZW50LgorI2Vsc2UKKyAgICBCbG9jayogbV9wQmxvY2s7CisjZW5kaWYKKyAgICAKK307CisKKworY2xhc3MgVHJhY2sKK3sKKyAgICBUcmFjayhjb25zdCBUcmFjayYpOworICAgIFRyYWNrJiBvcGVyYXRvcj0oY29uc3QgVHJhY2smKTsKKworcHVibGljOiAgICAKKyAgICBTZWdtZW50KiBjb25zdCBtX3BTZWdtZW50OworICAgIHZpcnR1YWwgflRyYWNrKCk7CisgICAgCisgICAgbG9uZyBsb25nIEdldFR5cGUoKSBjb25zdDsgCisgICAgdW5zaWduZWQgbG9uZyBHZXROdW1iZXIoKSBjb25zdDsKKyAgICBjb25zdCBjaGFyKiBHZXROYW1lQXNVVEY4KCkgY29uc3Q7CisgICAgY29uc3QgY2hhciogR2V0Q29kZWNOYW1lQXNVVEY4KCkgY29uc3Q7CisgICAgY29uc3QgY2hhciogR2V0Q29kZWNJZCgpIGNvbnN0OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIEdldENvZGVjUHJpdmF0ZSgKKyAgICAgICAgICAgIHNpemVfdCAqb3B0aW9uYWxTaXplID0gTlVMTCkgY29uc3Q7CisgICAgCisgICAgY29uc3QgQmxvY2tFbnRyeSogR2V0RU9TKCkgY29uc3Q7CisgICAgCisgICAgc3RydWN0IFNldHRpbmdzIAorICAgIHsKKyAgICAgICAgbG9uZyBsb25nIHN0YXJ0OworICAgICAgICBsb25nIGxvbmcgc2l6ZTsKKyAgICB9OworICAgIAorICAgIHN0cnVjdCBJbmZvCisgICAgeworICAgICAgICBsb25nIGxvbmcgdHlwZTsKKyAgICAgICAgbG9uZyBsb25nIG51bWJlcjsKKyAgICAgICAgbG9uZyBsb25nIHVpZDsKKyAgICAgICAgY2hhciogbmFtZUFzVVRGODsKKyAgICAgICAgY2hhciogY29kZWNJZDsKKyAgICAgICAgdW5zaWduZWQgY2hhciogY29kZWNQcml2YXRlOworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZTsKKyAgICAgICAgY2hhciogY29kZWNOYW1lQXNVVEY4OworICAgICAgICBTZXR0aW5ncyBzZXR0aW5nczsKKyAgICAgICAgSW5mbygpOworICAgICAgICB2b2lkIENsZWFyKCk7CisgICAgfTsKKyAgICAKKyAgICBsb25nIEdldEZpcnN0KGNvbnN0IEJsb2NrRW50cnkqJikgY29uc3Q7CisgICAgbG9uZyBHZXROZXh0KGNvbnN0IEJsb2NrRW50cnkqIHBDdXJyLCBjb25zdCBCbG9ja0VudHJ5KiYgcE5leHQpIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBWZXRFbnRyeShjb25zdCBCbG9ja0VudHJ5KikgY29uc3QgPSAwOworICAgICAgICAKK3Byb3RlY3RlZDoKKyAgICBUcmFjayhTZWdtZW50KiwgY29uc3QgSW5mbyYpOyAgICAgICAgCisgICAgY29uc3QgSW5mbyBtX2luZm87CisKKyAgICBjbGFzcyBFT1NCbG9jayA6IHB1YmxpYyBCbG9ja0VudHJ5CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgRU9TQmxvY2soKTsKKworICAgICAgICBib29sIEVPUygpIGNvbnN0OyAgICAKKyAgICAgICAgQ2x1c3RlciogR2V0Q2x1c3RlcigpIGNvbnN0OworICAgICAgICBzaXplX3QgR2V0SW5kZXgoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQmxvY2sqIEdldEJsb2NrKCkgY29uc3Q7CisgICAgICAgIGJvb2wgSXNCRnJhbWUoKSBjb25zdDsKKyAgICB9OworICAgIAorICAgIEVPU0Jsb2NrIG1fZW9zOworICAgIAorfTsKKworCitjbGFzcyBWaWRlb1RyYWNrIDogcHVibGljIFRyYWNrCit7CisgICAgVmlkZW9UcmFjayhjb25zdCBWaWRlb1RyYWNrJik7CisgICAgVmlkZW9UcmFjayYgb3BlcmF0b3I9KGNvbnN0IFZpZGVvVHJhY2smKTsKKyAgICAKK3B1YmxpYzoKKyAgICBWaWRlb1RyYWNrKFNlZ21lbnQqLCBjb25zdCBJbmZvJik7ICAgIAorICAgIGxvbmcgbG9uZyBHZXRXaWR0aCgpIGNvbnN0OworICAgIGxvbmcgbG9uZyBHZXRIZWlnaHQoKSBjb25zdDsKKyAgICBkb3VibGUgR2V0RnJhbWVSYXRlKCkgY29uc3Q7CisgICAgCisgICAgYm9vbCBWZXRFbnRyeShjb25zdCBCbG9ja0VudHJ5KikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgbG9uZyBsb25nIG1fd2lkdGg7CisgICAgbG9uZyBsb25nIG1faGVpZ2h0OworICAgIGRvdWJsZSBtX3JhdGU7CisgICAgCit9OworCisKK2NsYXNzIEF1ZGlvVHJhY2sgOiBwdWJsaWMgVHJhY2sKK3sKKyAgICBBdWRpb1RyYWNrKGNvbnN0IEF1ZGlvVHJhY2smKTsKKyAgICBBdWRpb1RyYWNrJiBvcGVyYXRvcj0oY29uc3QgQXVkaW9UcmFjayYpOworCitwdWJsaWM6CisgICAgQXVkaW9UcmFjayhTZWdtZW50KiwgY29uc3QgSW5mbyYpOyAgICAKKyAgICBkb3VibGUgR2V0U2FtcGxpbmdSYXRlKCkgY29uc3Q7CisgICAgbG9uZyBsb25nIEdldENoYW5uZWxzKCkgY29uc3Q7CisgICAgbG9uZyBsb25nIEdldEJpdERlcHRoKCkgY29uc3Q7ICAgIAorICAgIGJvb2wgVmV0RW50cnkoY29uc3QgQmxvY2tFbnRyeSopIGNvbnN0OworCitwcml2YXRlOgorICAgIGRvdWJsZSBtX3JhdGU7CisgICAgbG9uZyBsb25nIG1fY2hhbm5lbHM7CisgICAgbG9uZyBsb25nIG1fYml0RGVwdGg7Cit9OworCisKK2NsYXNzIFRyYWNrcworeworICAgIFRyYWNrcyhjb25zdCBUcmFja3MmKTsKKyAgICBUcmFja3MmIG9wZXJhdG9yPShjb25zdCBUcmFja3MmKTsKKworcHVibGljOgorICAgIFNlZ21lbnQqIGNvbnN0IG1fcFNlZ21lbnQ7CisgICAgY29uc3QgbG9uZyBsb25nIG1fc3RhcnQ7CisgICAgY29uc3QgbG9uZyBsb25nIG1fc2l6ZTsKKyAgICAKKyAgICBUcmFja3MoU2VnbWVudCosIGxvbmcgbG9uZyBzdGFydCwgbG9uZyBsb25nIHNpemUpOworICAgIHZpcnR1YWwgflRyYWNrcygpOworCisgICAgVHJhY2sqIEdldFRyYWNrQnlOdW1iZXIodW5zaWduZWQgbG9uZyB0bikgY29uc3Q7CisgICAgVHJhY2sqIEdldFRyYWNrQnlJbmRleCh1bnNpZ25lZCBsb25nIGlkeCkgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIFRyYWNrKiogbV90cmFja0VudHJpZXM7IAorICAgIFRyYWNrKiogbV90cmFja0VudHJpZXNFbmQ7CisKKyAgICB2b2lkIFBhcnNlVHJhY2tFbnRyeShsb25nIGxvbmcsIGxvbmcgbG9uZywgVHJhY2sqJik7CisgICAgCitwdWJsaWM6CisgICAgdW5zaWduZWQgbG9uZyBHZXRUcmFja3NDb3VudCgpIGNvbnN0OworfTsKKworCitjbGFzcyBTZWdtZW50SW5mbworeworICAgIFNlZ21lbnRJbmZvKGNvbnN0IFNlZ21lbnRJbmZvJik7CisgICAgU2VnbWVudEluZm8mIG9wZXJhdG9yPShjb25zdCBTZWdtZW50SW5mbyYpOworICAgIAorcHVibGljOgorICAgIFNlZ21lbnQqIGNvbnN0IG1fcFNlZ21lbnQ7CisgICAgY29uc3QgbG9uZyBsb25nIG1fc3RhcnQ7CisgICAgY29uc3QgbG9uZyBsb25nIG1fc2l6ZTsKKyAgICAKKyAgICBTZWdtZW50SW5mbyhTZWdtZW50KiwgbG9uZyBsb25nIHN0YXJ0LCBsb25nIGxvbmcgc2l6ZSk7CisgICAgflNlZ21lbnRJbmZvKCk7CisgICAgbG9uZyBsb25nIEdldFRpbWVDb2RlU2NhbGUoKSBjb25zdDsKKyAgICBsb25nIGxvbmcgR2V0RHVyYXRpb24oKSBjb25zdDsgIC8vc2NhbGVkCisgICAgY29uc3QgY2hhciogR2V0TXV4aW5nQXBwQXNVVEY4KCkgY29uc3Q7CisgICAgY29uc3QgY2hhciogR2V0V3JpdGluZ0FwcEFzVVRGOCgpIGNvbnN0OworICAgIGNvbnN0IGNoYXIqIEdldFRpdGxlQXNVVEY4KCkgY29uc3Q7CisgICAgCitwcml2YXRlOgorICAgIGxvbmcgbG9uZyBtX3RpbWVjb2RlU2NhbGU7CisgICAgZG91YmxlIG1fZHVyYXRpb247CisgICAgY2hhciogbV9wTXV4aW5nQXBwQXNVVEY4OworICAgIGNoYXIqIG1fcFdyaXRpbmdBcHBBc1VURjg7CisgICAgY2hhciogbV9wVGl0bGVBc1VURjg7Cit9OworCisKK2NsYXNzIENsdXN0ZXIKK3sKKyAgICBDbHVzdGVyKGNvbnN0IENsdXN0ZXImKTsKKyAgICBDbHVzdGVyJiBvcGVyYXRvcj0oY29uc3QgQ2x1c3RlciYpOworCitwdWJsaWM6CisgICAgU2VnbWVudCogY29uc3QgbV9wU2VnbWVudDsKKyAgICBjb25zdCBzaXplX3QgbV9pbmRleDsKKyAgICAKK3B1YmxpYzogICAgCisgICAgc3RhdGljIENsdXN0ZXIqIFBhcnNlKFNlZ21lbnQqLCBzaXplX3QsIGxvbmcgbG9uZyBvZmYpOworCisgICAgQ2x1c3RlcigpOyAgLy9FbmRPZlN0cmVhbQorICAgIH5DbHVzdGVyKCk7CisgICAgCisgICAgYm9vbCBFT1MoKSBjb25zdDsKKyAgICAKKyAgICBsb25nIGxvbmcgR2V0VGltZUNvZGUoKTsgIC8vYWJzb2x1dGUsIGJ1dCBub3Qgc2NhbGVkCisgICAgbG9uZyBsb25nIEdldFRpbWUoKTsgICAgICAvL2Fic29sdXRlLCBhbmQgc2NhbGVkIChuYW5vc2Vjb25kIHVuaXRzKQorCisgICAgY29uc3QgQmxvY2tFbnRyeSogR2V0Rmlyc3QoKTsKKyAgICBjb25zdCBCbG9ja0VudHJ5KiBHZXRMYXN0KCk7CisgICAgY29uc3QgQmxvY2tFbnRyeSogR2V0TmV4dChjb25zdCBCbG9ja0VudHJ5KikgY29uc3Q7ICAgIAorICAgIGNvbnN0IEJsb2NrRW50cnkqIEdldEVudHJ5KGNvbnN0IFRyYWNrKik7Citwcm90ZWN0ZWQ6ICAgIAorICAgIENsdXN0ZXIoU2VnbWVudCosIHNpemVfdCwgbG9uZyBsb25nIG9mZik7CisgICAgCitwcml2YXRlOgorICAgIGxvbmcgbG9uZyBtX3N0YXJ0OworICAgIGxvbmcgbG9uZyBtX3NpemU7ICAgIAorICAgIGxvbmcgbG9uZyBtX3RpbWVjb2RlOworICAgIEJsb2NrRW50cnkqKiBtX3BFbnRyaWVzOworICAgIHNpemVfdCBtX2VudHJpZXNDb3VudDsKKyAgIAorICAgIHZvaWQgTG9hZCgpOworICAgIHZvaWQgTG9hZEJsb2NrRW50cmllcygpOworICAgIHZvaWQgUGFyc2VCbG9ja0dyb3VwKGxvbmcgbG9uZywgbG9uZyBsb25nLCBzaXplX3QpOworICAgIHZvaWQgUGFyc2VTaW1wbGVCbG9jayhsb25nIGxvbmcsIGxvbmcgbG9uZywgc2l6ZV90KTsKKyAgICAKK307CisKKworY2xhc3MgU2VnbWVudAoreworICAgIFNlZ21lbnQoY29uc3QgU2VnbWVudCYpOworICAgIFNlZ21lbnQmIG9wZXJhdG9yPShjb25zdCBTZWdtZW50Jik7CisKK3ByaXZhdGU6CisgICAgU2VnbWVudChJTWt2UmVhZGVyKiwgbG9uZyBsb25nIHBvcywgbG9uZyBsb25nIHNpemUpOworCitwdWJsaWM6CisgICAgSU1rdlJlYWRlciogY29uc3QgbV9wUmVhZGVyOworICAgIGNvbnN0IGxvbmcgbG9uZyBtX3N0YXJ0OyAgLy9wb3NuIG9mIHNlZ21lbnQgcGF5bG9hZAorICAgIGNvbnN0IGxvbmcgbG9uZyBtX3NpemU7ICAgLy9zaXplIG9mIHNlZ21lbnQgcGF5bG9hZAorICAgIENsdXN0ZXIgbV9lb3M7ICAvL1RPRE86IG1ha2UgcHJpdmF0ZT8KKyAgICAKKyAgICBzdGF0aWMgbG9uZyBsb25nIENyZWF0ZUluc3RhbmNlKElNa3ZSZWFkZXIqLCBsb25nIGxvbmcsIFNlZ21lbnQqJik7CisgICAgflNlZ21lbnQoKTsKKworICAgIC8vZm9yIGJpZy1iYW5nIGxvYWRpbmcgKHNvdXJjZSBmaWx0ZXIpCisgICAgbG9uZyBMb2FkKCk7CisKKyAgICAvL2ZvciBpbmNyZW1lbnRhbCBsb2FkaW5nIChzcGxpdHRlcikgICAgCisgICAgbG9uZyBsb25nIFVucGFyc2VkKCkgY29uc3Q7CisgICAgbG9uZyBsb25nIFBhcnNlSGVhZGVycygpOworICAgIGxvbmcgUGFyc2VDbHVzdGVyKENsdXN0ZXIqJiwgbG9uZyBsb25nJiBuZXdwb3MpIGNvbnN0OworICAgIGJvb2wgQWRkQ2x1c3RlcihDbHVzdGVyKiwgbG9uZyBsb25nKTsKKworICAgIFRyYWNrcyogR2V0VHJhY2tzKCkgY29uc3Q7ICAgIAorICAgIGNvbnN0IFNlZ21lbnRJbmZvKiBjb25zdCBHZXRJbmZvKCkgY29uc3Q7CisgICAgbG9uZyBsb25nIEdldER1cmF0aW9uKCkgY29uc3Q7CisgICAgCisgICAgLy9OT1RFOiB0aGlzIHR1cm5lZCBvdXQgdG8gYmUgdG9vIGluZWZmaWNpZW50LgorICAgIC8vbG9uZyBsb25nIExvYWQobG9uZyBsb25nIHRpbWVfbmFub3NlY29uZHMpOworCisgICAgQ2x1c3RlciogR2V0Rmlyc3QoKTsKKyAgICBDbHVzdGVyKiBHZXRMYXN0KCk7CisgICAgdW5zaWduZWQgbG9uZyBHZXRDb3VudCgpIGNvbnN0OworICAgIAorICAgIENsdXN0ZXIqIEdldE5leHQoY29uc3QgQ2x1c3RlciopOworICAgIENsdXN0ZXIqIEdldENsdXN0ZXIobG9uZyBsb25nIHRpbWVfbmFub3NlY29uZHMpOworICAgIAorcHJpdmF0ZToKKyAgICBsb25nIGxvbmcgbV9wb3M7ICAvL2Fic29sdXRlIGZpbGUgcG9zbjsgd2hhdCBoYXMgYmVlbiBjb25zdW1lZCBzbyBmYXIgICAgCisgICAgU2VnbWVudEluZm8qIG1fcEluZm87CisgICAgVHJhY2tzKiBtX3BUcmFja3M7ICAgIAorICAgIENsdXN0ZXIqKiBtX2NsdXN0ZXJzOworICAgIHNpemVfdCBtX2NsdXN0ZXJDb3VudDsKKworICAgIHZvaWQgUGFyc2VTZWVrSGVhZChsb25nIGxvbmcgcG9zLCBsb25nIGxvbmcgc2l6ZSwgc2l6ZV90Kik7CisgICAgdm9pZCBQYXJzZVNlZWtFbnRyeShsb25nIGxvbmcgcG9zLCBsb25nIGxvbmcgc2l6ZSwgc2l6ZV90Kik7CisgICAgdm9pZCBQYXJzZVNlY29uZGFyeVNlZWtIZWFkKGxvbmcgbG9uZyBvZmYsIHNpemVfdCopOworfTsKKworCit9ICAvL2VuZCBuYW1lc3BhY2UgbWt2cGFyc2VyCisKKyNlbmRpZiAgLy9NS1ZQQVJTRVJfSFBQCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkZThkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMCwwICsxLDk1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBVFNQYXJzZXIuaCIKKworI2luY2x1ZGUgIkFub3RoZXJQYWNrZXRTb3VyY2UuaCIKKyNpbmNsdWRlICJpbmNsdWRlL2F2Y191dGlscy5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4OworCitzdHJ1Y3QgQVRTUGFyc2VyOjpQcm9ncmFtIDogcHVibGljIFJlZkJhc2UgeworICAgIFByb2dyYW0odW5zaWduZWQgcHJvZ3JhbU1hcFBJRCk7CisKKyAgICBib29sIHBhcnNlUElEKAorICAgICAgICAgICAgdW5zaWduZWQgcGlkLCB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAorICAgICAgICAgICAgQUJpdFJlYWRlciAqYnIpOworCisgICAgc3A8TWVkaWFTb3VyY2U+IGdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpOworCitwcml2YXRlOgorICAgIHVuc2lnbmVkIG1Qcm9ncmFtTWFwUElEOworICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkLCBzcDxTdHJlYW0+ID4gbVN0cmVhbXM7CisKKyAgICB2b2lkIHBhcnNlUHJvZ3JhbU1hcChBQml0UmVhZGVyICpicik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcm9ncmFtKTsKK307CisKK3N0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBTdHJlYW0odW5zaWduZWQgZWxlbWVudGFyeVBJRCwgdW5zaWduZWQgc3RyZWFtVHlwZSk7CisKKyAgICB2b2lkIHBhcnNlKAorICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKKyAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyKTsKKworICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflN0cmVhbSgpOworCitwcml2YXRlOgorICAgIHVuc2lnbmVkIG1FbGVtZW50YXJ5UElEOworICAgIHVuc2lnbmVkIG1TdHJlYW1UeXBlOworCisgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtU291cmNlOworICAgIGJvb2wgbVBheWxvYWRTdGFydGVkOworCisgICAgdm9pZCBmbHVzaCgpOworICAgIHZvaWQgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpOworCisgICAgdm9pZCBvblBheWxvYWREYXRhKAorICAgICAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2b2lkIGV4dHJhY3RBQUNGcmFtZXMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJlYW0pOworfTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVRTUGFyc2VyOjpQcm9ncmFtOjpQcm9ncmFtKHVuc2lnbmVkIHByb2dyYW1NYXBQSUQpCisgICAgOiBtUHJvZ3JhbU1hcFBJRChwcm9ncmFtTWFwUElEKSB7Cit9CisKK2Jvb2wgQVRTUGFyc2VyOjpQcm9ncmFtOjpwYXJzZVBJRCgKKyAgICAgICAgdW5zaWduZWQgcGlkLCB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAorICAgICAgICBBQml0UmVhZGVyICpicikgeworICAgIGlmIChwaWQgPT0gbVByb2dyYW1NYXBQSUQpIHsKKyAgICAgICAgaWYgKHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNraXAgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgIGJyLT5za2lwQml0cyhza2lwICogOCk7CisgICAgICAgIH0KKworICAgICAgICBwYXJzZVByb2dyYW1NYXAoYnIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbVN0cmVhbXMuaW5kZXhPZktleShwaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+cGFyc2UoCisgICAgICAgICAgICBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBicik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBVFNQYXJzZXI6OlByb2dyYW06OnBhcnNlUHJvZ3JhbU1hcChBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIHRhYmxlX2lkID0gYnItPmdldEJpdHMoOCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHRhYmxlX2lkID0gIiA8PCB0YWJsZV9pZDsKKyAgICBDSEVDS19FUSh0YWJsZV9pZCwgMHgwMnUpOworCisgICAgdW5zaWduZWQgc2VjdGlvbl9zeW50YXhfaW5kaWN0b3IgPSBici0+Z2V0Qml0cygxKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgc2VjdGlvbl9zeW50YXhfaW5kaWN0b3IgPSAiIDw8IHNlY3Rpb25fc3ludGF4X2luZGljdG9yOworICAgIENIRUNLX0VRKHNlY3Rpb25fc3ludGF4X2luZGljdG9yLCAxdSk7CisKKyAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMHUpOworICAgIExPRyhWRVJCT1NFKSA8PCAiICByZXNlcnZlZCA9ICIgPDwgYnItPmdldEJpdHMoMik7CisKKyAgICB1bnNpZ25lZCBzZWN0aW9uX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgc2VjdGlvbl9sZW5ndGggPSAiIDw8IHNlY3Rpb25fbGVuZ3RoOworICAgIENIRUNLKChzZWN0aW9uX2xlbmd0aCAmIDB4YzAwKSA9PSAwKTsKKyAgICBDSEVDS19MRShzZWN0aW9uX2xlbmd0aCwgMTAyMXUpOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHByb2dyYW1fbnVtYmVyID0gIiA8PCBici0+Z2V0Qml0cygxNik7CisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHJlc2VydmVkID0gIiA8PCBici0+Z2V0Qml0cygyKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgdmVyc2lvbl9udW1iZXIgPSAiIDw8IGJyLT5nZXRCaXRzKDUpOworICAgIExPRyhWRVJCT1NFKSA8PCAiICBjdXJyZW50X25leHRfaW5kaWNhdG9yID0gIiA8PCBici0+Z2V0Qml0cygxKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgc2VjdGlvbl9udW1iZXIgPSAiIDw8IGJyLT5nZXRCaXRzKDgpOworICAgIExPRyhWRVJCT1NFKSA8PCAiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gIiA8PCBici0+Z2V0Qml0cyg4KTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgcmVzZXJ2ZWQgPSAiIDw8IGJyLT5nZXRCaXRzKDMpOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIFBDUl9QSUQgPSAiCisgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiMHglMDR4IiwgYnItPmdldEJpdHMoMTMpKTsKKworICAgIExPRyhWRVJCT1NFKSA8PCAiICByZXNlcnZlZCA9ICIgPDwgYnItPmdldEJpdHMoNCk7CisKKyAgICB1bnNpZ25lZCBwcm9ncmFtX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOworICAgIExPRyhWRVJCT1NFKSA8PCAiICBwcm9ncmFtX2luZm9fbGVuZ3RoID0gIiA8PCBwcm9ncmFtX2luZm9fbGVuZ3RoOworICAgIENIRUNLKChwcm9ncmFtX2luZm9fbGVuZ3RoICYgMHhjMDApID09IDApOworCisgICAgYnItPnNraXBCaXRzKHByb2dyYW1faW5mb19sZW5ndGggKiA4KTsgIC8vIHNraXAgZGVzY3JpcHRvcnMKKworICAgIC8vIGluZm9CeXRlc1JlbWFpbmluZyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWFrZSB1cCB0aGUKKyAgICAvLyB2YXJpYWJsZSBsZW5ndGggc2VjdGlvbiBvZiBFU19pbmZvcy4gSXQgZG9lcyBub3QgaW5jbHVkZSB0aGUKKyAgICAvLyBmaW5hbCBDUkMuCisgICAgc2l6ZV90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OworCisgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgQ0hFQ0tfR0UoaW5mb0J5dGVzUmVtYWluaW5nLCA1dSk7CisKKyAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIiAgICBzdHJlYW1fdHlwZSA9ICIKKyAgICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4Iiwgc3RyZWFtVHlwZSk7CisKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgcmVzZXJ2ZWQgPSAiIDw8IGJyLT5nZXRCaXRzKDMpOworCisgICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgIGVsZW1lbnRhcnlfUElEID0gIgorICAgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIweCUwNHgiLCBlbGVtZW50YXJ5UElEKTsKKworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIiAgICByZXNlcnZlZCA9ICIgPDwgYnItPmdldEJpdHMoNCk7CisKKyAgICAgICAgdW5zaWduZWQgRVNfaW5mb19sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgIEVTX2luZm9fbGVuZ3RoID0gIiA8PCBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgQ0hFQ0soKEVTX2luZm9fbGVuZ3RoICYgMHhjMDApID09IDApOworCisgICAgICAgIENIRUNLX0dFKGluZm9CeXRlc1JlbWFpbmluZyAtIDUsIEVTX2luZm9fbGVuZ3RoKTsKKworI2lmIDAKKyAgICAgICAgYnItPnNraXBCaXRzKEVTX2luZm9fbGVuZ3RoICogOCk7ICAvLyBza2lwIGRlc2NyaXB0b3JzCisjZWxzZQorICAgICAgICB1bnNpZ25lZCBpbmZvX2J5dGVzX3JlbWFpbmluZyA9IEVTX2luZm9fbGVuZ3RoOworICAgICAgICB3aGlsZSAoaW5mb19ieXRlc19yZW1haW5pbmcgPj0gMikgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgICB0YWcgPSAiIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4IiwgYnItPmdldEJpdHMoOCkpOworCisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjTGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIiAgICAgIGxlbiA9ICIgPDwgZGVzY0xlbmd0aDsKKworICAgICAgICAgICAgQ0hFQ0tfR0UoaW5mb19ieXRlc19yZW1haW5pbmcsIDIgKyBkZXNjTGVuZ3RoKTsKKworICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NMZW5ndGggKiA4KTsKKworICAgICAgICAgICAgaW5mb19ieXRlc19yZW1haW5pbmcgLT0gZGVzY0xlbmd0aCArIDI7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfRVEoaW5mb19ieXRlc19yZW1haW5pbmcsIDB1KTsKKyNlbmRpZgorCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGVsZW1lbnRhcnlQSUQpOworI2lmIDAgIC8vIFhYWCByZXZpc2l0CisgICAgICAgIENIRUNLX0xUKGluZGV4LCAwKTsKKyAgICAgICAgbVN0cmVhbXMuYWRkKGVsZW1lbnRhcnlQSUQsIG5ldyBTdHJlYW0oZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSkpOworI2Vsc2UKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgbVN0cmVhbXMuYWRkKGVsZW1lbnRhcnlQSUQsIG5ldyBTdHJlYW0oZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSkpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpbmZvQnl0ZXNSZW1haW5pbmcgLT0gNSArIEVTX2luZm9fbGVuZ3RoOworICAgIH0KKworICAgIENIRUNLX0VRKGluZm9CeXRlc1JlbWFpbmluZywgMHUpOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIENSQyA9ICIgPDwgU3RyaW5nUHJpbnRmKCIweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworfQorCitzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpQcm9ncmFtOjpnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVN0cmVhbXMuZWRpdFZhbHVlQXQoaSktPmdldFNvdXJjZSh0eXBlKTsKKyAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FUU1BhcnNlcjo6U3RyZWFtOjpTdHJlYW0odW5zaWduZWQgZWxlbWVudGFyeVBJRCwgdW5zaWduZWQgc3RyZWFtVHlwZSkKKyAgICA6IG1FbGVtZW50YXJ5UElEKGVsZW1lbnRhcnlQSUQpLAorICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgICBtQnVmZmVyKG5ldyBBQnVmZmVyKDEyOCAqIDEwMjQpKSwKKyAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSkgeworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworfQorCitBVFNQYXJzZXI6OlN0cmVhbTo6flN0cmVhbSgpIHsKK30KKwordm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2UoCisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsIEFCaXRSZWFkZXIgKmJyKSB7CisgICAgaWYgKHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgaWYgKG1QYXlsb2FkU3RhcnRlZCkgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHJ1biB0aGUgZGFuZ2VyIG9mIHJlY2VpdmluZyB0aGUgdHJhaWxpbmcgYnl0ZXMKKyAgICAgICAgICAgIC8vIG9mIGEgUEVTIHBhY2tldCB0aGF0IHdlIG5ldmVyIHNhdyB0aGUgc3RhcnQgb2YgYW5kIGFzc3VtaW5nCisgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgYSBjb21wbGV0ZSBQRVMgcGFja2V0LgorCisgICAgICAgICAgICBmbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgbVBheWxvYWRTdGFydGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIW1QYXlsb2FkU3RhcnRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IHBheWxvYWRTaXplQml0cyA9IGJyLT5udW1CaXRzTGVmdCgpOworICAgIENIRUNLX0VRKHBheWxvYWRTaXplQml0cyAlIDgsIDB1KTsKKworICAgIENIRUNLX0xFKG1CdWZmZXItPnNpemUoKSArIHBheWxvYWRTaXplQml0cyAvIDgsIG1CdWZmZXItPmNhcGFjaXR5KCkpOworCisgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnNpemUoKSwgYnItPmRhdGEoKSwgcGF5bG9hZFNpemVCaXRzIC8gOCk7CisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpICsgcGF5bG9hZFNpemVCaXRzIC8gOCk7Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OnBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKSB7CisgICAgdW5zaWduZWQgcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXggPSBici0+Z2V0Qml0cygyNCk7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgInBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gIgorICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjB4JTA4eCIsIHBhY2tldF9zdGFydGNvZGVfcHJlZml4KTsKKworICAgIENIRUNLX0VRKHBhY2tldF9zdGFydGNvZGVfcHJlZml4LCAweDAwMDAwMXUpOworCisgICAgdW5zaWduZWQgc3RyZWFtX2lkID0gYnItPmdldEJpdHMoOCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJzdHJlYW1faWQgPSAiIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4Iiwgc3RyZWFtX2lkKTsKKworICAgIHVuc2lnbmVkIFBFU19wYWNrZXRfbGVuZ3RoID0gYnItPmdldEJpdHMoMTYpOworICAgIExPRyhWRVJCT1NFKSA8PCAiUEVTX3BhY2tldF9sZW5ndGggPSAiIDw8IFBFU19wYWNrZXRfbGVuZ3RoOworCisgICAgaWYgKHN0cmVhbV9pZCAhPSAweGJjICAvLyBwcm9ncmFtX3N0cmVhbV9tYXAKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGJlICAvLyBwYWRkaW5nX3N0cmVhbQorICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4YmYgIC8vIHByaXZhdGVfc3RyZWFtXzIKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYwICAvLyBFQ00KKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYxICAvLyBFTU0KKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGZmICAvLyBwcm9ncmFtX3N0cmVhbV9kaXJlY3RvcnkKKyAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYyICAvLyBEU01DQworICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjgpIHsgIC8vIEguMjIyLjEgdHlwZSBFCisgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDIpLCAydSk7CisKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJQRVNfc2NyYW1ibGluZ19jb250cm9sID0gIiA8PCBici0+Z2V0Qml0cygyKTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJQRVNfcHJpb3JpdHkgPSAiIDw8IGJyLT5nZXRCaXRzKDEpOworICAgICAgICBMT0coVkVSQk9TRSkgPDwgImRhdGFfYWxpZ25tZW50X2luZGljYXRvciA9ICIgPDwgYnItPmdldEJpdHMoMSk7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiY29weXJpZ2h0ID0gIiA8PCBici0+Z2V0Qml0cygxKTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvcmlnaW5hbF9vcl9jb3B5ID0gIiA8PCBici0+Z2V0Qml0cygxKTsKKworICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzID0gYnItPmdldEJpdHMoMik7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiUFRTX0RUU19mbGFncyA9ICIgPDwgUFRTX0RUU19mbGFnczsKKworICAgICAgICB1bnNpZ25lZCBFU0NSX2ZsYWcgPSBici0+Z2V0Qml0cygxKTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJFU0NSX2ZsYWcgPSAiIDw8IEVTQ1JfZmxhZzsKKworICAgICAgICB1bnNpZ25lZCBFU19yYXRlX2ZsYWcgPSBici0+Z2V0Qml0cygxKTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJFU19yYXRlX2ZsYWcgPSAiIDw8IEVTX3JhdGVfZmxhZzsKKworICAgICAgICB1bnNpZ25lZCBEU01fdHJpY2tfbW9kZV9mbGFnID0gYnItPmdldEJpdHMoMSk7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRFNNX3RyaWNrX21vZGVfZmxhZyA9ICIgPDwgRFNNX3RyaWNrX21vZGVfZmxhZzsKKworICAgICAgICB1bnNpZ25lZCBhZGRpdGlvbmFsX2NvcHlfaW5mb19mbGFnID0gYnItPmdldEJpdHMoMSk7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiYWRkaXRpb25hbF9jb3B5X2luZm9fZmxhZyA9ICIKKyAgICAgICAgICAgICAgICAgIDw8IGFkZGl0aW9uYWxfY29weV9pbmZvX2ZsYWc7CisKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJQRVNfQ1JDX2ZsYWcgPSAiIDw8IGJyLT5nZXRCaXRzKDEpOworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlBFU19leHRlbnNpb25fZmxhZyA9ICIgPDwgYnItPmdldEJpdHMoMSk7CisKKyAgICAgICAgdW5zaWduZWQgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlBFU19oZWFkZXJfZGF0YV9sZW5ndGggPSAiIDw8IFBFU19oZWFkZXJfZGF0YV9sZW5ndGg7CisKKyAgICAgICAgdW5zaWduZWQgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nID0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKKworICAgICAgICB1aW50NjRfdCBQVFMgPSAwLCBEVFMgPSAwOworCisgICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDIgfHwgUFRTX0RUU19mbGFncyA9PSAzKSB7CisgICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDV1KTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoNCksIFBUU19EVFNfZmxhZ3MpOworCisgICAgICAgICAgICBQVFMgPSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDMpKSA8PCAzMDsKKyAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBQVFMgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIFBUUyB8PSBici0+Z2V0Qml0cygxNSk7CisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworCisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlBUUyA9ICIgPDwgUFRTOworICAgICAgICAgICAgLy8gTE9HKElORk8pIDw8ICJQVFMgPSAiIDw8IFBUUyAvIDkwMDAwLjBmIDw8ICIgc2VjcyI7CisKKyAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OworCisgICAgICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAzKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA1dSk7CisKKyAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cyg0KSwgMXUpOworCisgICAgICAgICAgICAgICAgRFRTID0gKCh1aW50NjRfdClici0+Z2V0Qml0cygzKSkgPDwgMzA7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBEVFMgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OworICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgRFRTIHw9IGJyLT5nZXRCaXRzKDE1KTsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworCisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJEVFMgPSAiIDw8IERUUzsKKworICAgICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEVTQ1JfZmxhZykgeworICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA2dSk7CisKKyAgICAgICAgICAgIGJyLT5nZXRCaXRzKDIpOworCisgICAgICAgICAgICB1aW50NjRfdCBFU0NSID0gKCh1aW50NjRfdClici0+Z2V0Qml0cygzKSkgPDwgMzA7CisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgRVNDUiB8PSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDE1KSkgPDwgMTU7CisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgRVNDUiB8PSBici0+Z2V0Qml0cygxNSk7CisgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworCisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkVTQ1IgPSAiIDw8IEVTQ1I7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkVTQ1JfZXh0ZW5zaW9uID0gIiA8PCBici0+Z2V0Qml0cyg5KTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKworICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRVNfcmF0ZV9mbGFnKSB7CisgICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDN1KTsKKworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRVNfcmF0ZSA9ICIgPDwgYnItPmdldEJpdHMoMjIpOworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKworICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDM7CisgICAgICAgIH0KKworICAgICAgICBici0+c2tpcEJpdHMob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nICogOCk7CisKKyAgICAgICAgLy8gRVMgZGF0YSBmb2xsb3dzLgorCisgICAgICAgIG9uUGF5bG9hZERhdGEoCisgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsCisgICAgICAgICAgICAgICAgYnItPmRhdGEoKSwgYnItPm51bUJpdHNMZWZ0KCkgLyA4KTsKKworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggIT0gMCkgeworICAgICAgICAgICAgQ0hFQ0tfR0UoUEVTX3BhY2tldF9sZW5ndGgsIFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKTsKKworICAgICAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9CisgICAgICAgICAgICAgICAgUEVTX3BhY2tldF9sZW5ndGggLSAzIC0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKKworICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKKworICAgICAgICAgICAgYnItPnNraXBCaXRzKGRhdGFMZW5ndGggKiA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkU2l6ZUJpdHMgPSBici0+bnVtQml0c0xlZnQoKTsKKyAgICAgICAgICAgIENIRUNLKChwYXlsb2FkU2l6ZUJpdHMgJSA4KSA9PSAwKTsKKworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJUaGVyZSdzICIgPDwgKHBheWxvYWRTaXplQml0cyAvIDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBieXRlcyBvZiBwYXlsb2FkLiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0cmVhbV9pZCA9PSAweGJlKSB7ICAvLyBwYWRkaW5nX3N0cmVhbQorICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgICAgICBici0+c2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBDSEVDS19ORShQRVNfcGFja2V0X2xlbmd0aCwgMHUpOworICAgICAgICBici0+c2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKKyAgICB9Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmZsdXNoKCkgeworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HKFZFUkJPU0UpIDw8ICJmbHVzaGluZyBzdHJlYW0gIgorICAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjB4JTA0eCIsIG1FbGVtZW50YXJ5UElEKQorICAgICAgICAgICAgICAgICA8PCAiIHNpemUgPSAiIDw8IG1CdWZmZXItPnNpemUoKTsKKworICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIHBhcnNlUEVTKCZicik7CisKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKK30KKworc3RhdGljIHNwPEFCdWZmZXI+IEZpbmROQUwoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBuYWxUeXBlLAorICAgICAgICBzaXplX3QgKnN0b3BPZmZzZXQpIHsKKyAgICBib29sIGZvdW5kU3RhcnQgPSBmYWxzZTsKKyAgICBzaXplX3Qgc3RhcnRPZmZzZXQgPSAwOworCisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICB3aGlsZSAob2Zmc2V0ICsgMyA8IHNpemUKKyAgICAgICAgICAgICAgICAmJiBtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCAmZGF0YVtvZmZzZXRdLCA0KSkgeworICAgICAgICAgICAgKytvZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmRTdGFydCkgeworICAgICAgICAgICAgc2l6ZV90IG5hbFNpemU7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMyA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IHNpemUgLSBzdGFydE9mZnNldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IG9mZnNldCAtIHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBuYWwgPSBuZXcgQUJ1ZmZlcihuYWxTaXplKTsKKyAgICAgICAgICAgIG1lbWNweShuYWwtPmRhdGEoKSwgJmRhdGFbc3RhcnRPZmZzZXRdLCBuYWxTaXplKTsKKworICAgICAgICAgICAgaWYgKHN0b3BPZmZzZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpzdG9wT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBuYWxTaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCArIDQgPj0gc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGRhdGFbb2Zmc2V0ICsgNF0gJiAweDFmKSA9PSBuYWxUeXBlKSB7CisgICAgICAgICAgICBmb3VuZFN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0ICsgNDsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSA0OworICAgIH0KK30KKworc3RhdGljIHNwPEFCdWZmZXI+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgc3A8QUJ1ZmZlcj4gc2VxUGFyYW1TZXQgPSBGaW5kTkFMKGRhdGEsIHNpemUsIDcsIE5VTEwpOworICAgIGlmIChzZXFQYXJhbVNldCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEZpbmRBVkNEaW1lbnNpb25zKHNlcVBhcmFtU2V0LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIHNpemVfdCBzdG9wT2Zmc2V0OworICAgIHNwPEFCdWZmZXI+IHBpY1BhcmFtU2V0ID0gRmluZE5BTChkYXRhLCBzaXplLCA4LCAmc3RvcE9mZnNldCk7CisgICAgQ0hFQ0socGljUGFyYW1TZXQgIT0gTlVMTCk7CisKKyAgICBidWZmZXItPnNldFJhbmdlKHN0b3BPZmZzZXQsIHNpemUgLSBzdG9wT2Zmc2V0KTsKKyAgICBMT0coSU5GTykgPDwgImJ1ZmZlciBoYXMgIiA8PCBidWZmZXItPnNpemUoKSA8PCAiIGJ5dGVzIGxlZnQuIjsKKworICAgIHNpemVfdCBjc2RTaXplID0KKyAgICAgICAgMSArIDMgKyAxICsgMQorICAgICAgICArIDIgKiAxICsgc2VxUGFyYW1TZXQtPnNpemUoKQorICAgICAgICArIDEgKyAyICogMSArIHBpY1BhcmFtU2V0LT5zaXplKCk7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihjc2RTaXplKTsKKyAgICB1aW50OF90ICpvdXQgPSBjc2QtPmRhdGEoKTsKKworICAgICpvdXQrKyA9IDB4MDE7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbgorICAgIG1lbWNweShvdXQsIHNlcVBhcmFtU2V0LT5kYXRhKCkgKyAxLCAzKTsgIC8vIHByb2ZpbGUvbGV2ZWwuLi4KKyAgICBvdXQgKz0gMzsKKyAgICAqb3V0KysgPSAoMHgzZiA8PCAyKSB8IDE7ICAvLyBsZW5ndGhTaXplID09IDIgYnl0ZXMKKyAgICAqb3V0KysgPSAweGUwIHwgMTsKKworICAgICpvdXQrKyA9IHNlcVBhcmFtU2V0LT5zaXplKCkgPj4gODsKKyAgICAqb3V0KysgPSBzZXFQYXJhbVNldC0+c2l6ZSgpICYgMHhmZjsKKyAgICBtZW1jcHkob3V0LCBzZXFQYXJhbVNldC0+ZGF0YSgpLCBzZXFQYXJhbVNldC0+c2l6ZSgpKTsKKyAgICBvdXQgKz0gc2VxUGFyYW1TZXQtPnNpemUoKTsKKworICAgICpvdXQrKyA9IDE7CisKKyAgICAqb3V0KysgPSBwaWNQYXJhbVNldC0+c2l6ZSgpID4+IDg7CisgICAgKm91dCsrID0gcGljUGFyYW1TZXQtPnNpemUoKSAmIDB4ZmY7CisgICAgbWVtY3B5KG91dCwgcGljUGFyYW1TZXQtPmRhdGEoKSwgcGljUGFyYW1TZXQtPnNpemUoKSk7CisKKyAgICByZXR1cm4gY3NkOworfQorCitzdGF0aWMgYm9vbCBnZXROZXh0TkFMVW5pdCgKKyAgICAgICAgY29uc3QgdWludDhfdCAqKl9kYXRhLCBzaXplX3QgKl9zaXplLAorICAgICAgICBjb25zdCB1aW50OF90ICoqbmFsU3RhcnQsIHNpemVfdCAqbmFsU2l6ZSkgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAqX2RhdGE7CisgICAgc2l6ZV90IHNpemUgPSAqX3NpemU7CisKKyAgICAqbmFsU3RhcnQgPSBOVUxMOworICAgICpuYWxTaXplID0gMDsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQ0hFQ0tfTFQob2Zmc2V0ICsgMiwgc2l6ZSk7CisKKyAgICAgICAgaWYgKCFtZW1jbXAoIlx4MDBceDAwXHgwMSIsICZkYXRhW29mZnNldF0sIDMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZClkYXRhW29mZnNldF0sIDB4MDB1KTsKKyAgICAgICAgKytvZmZzZXQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDM7CisgICAgc2l6ZV90IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OworCisgICAgd2hpbGUgKG9mZnNldCArIDIgPCBzaXplCisgICAgICAgICAgICAmJiBtZW1jbXAoIlx4MDBceDAwXHgwMCIsICZkYXRhW29mZnNldF0sIDMpCisgICAgICAgICAgICAmJiBtZW1jbXAoIlx4MDBceDAwXHgwMSIsICZkYXRhW29mZnNldF0sIDMpKSB7CisgICAgICAgICsrb2Zmc2V0OworICAgIH0KKworICAgIGlmIChvZmZzZXQgKyAyID49IHNpemUpIHsKKyAgICAgICAgKm5hbFN0YXJ0ID0gJmRhdGFbc3RhcnRPZmZzZXRdOworICAgICAgICAqbmFsU2l6ZSA9IHNpemUgLSBzdGFydE9mZnNldDsKKworICAgICAgICAqX2RhdGEgPSBOVUxMOworICAgICAgICAqX3NpemUgPSAwOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBlbmRPZmZzZXQgPSBvZmZzZXQ7CisKKyAgICB3aGlsZSAob2Zmc2V0ICsgMiA8IHNpemUgJiYgbWVtY21wKCJceDAwXHgwMFx4MDEiLCAmZGF0YVtvZmZzZXRdLCAzKSkgeworICAgICAgICBDSEVDS19FUSgodW5zaWduZWQpZGF0YVtvZmZzZXRdLCAweDAwdSk7CisgICAgICAgICsrb2Zmc2V0OworICAgIH0KKworICAgIENIRUNLX0xUKG9mZnNldCArIDIsIHNpemUpOworCisgICAgKm5hbFN0YXJ0ID0gJmRhdGFbc3RhcnRPZmZzZXRdOworICAgICpuYWxTaXplID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7CisKKyAgICAqX2RhdGEgPSAmZGF0YVtvZmZzZXRdOworICAgICpfc2l6ZSA9IHNpemUgLSBvZmZzZXQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3A8QUJ1ZmZlcj4gTWFrZUNsZWFuQVZDRGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSBkYXRhOworICAgIHNpemVfdCB0bXBTaXplID0gc2l6ZTsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OworICAgIHNpemVfdCBuYWxTaXplOworICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgmdG1wRGF0YSwgJnRtcFNpemUsICZuYWxTdGFydCwgJm5hbFNpemUpKSB7CisgICAgICAgIHRvdGFsU2l6ZSArPSA0ICsgbmFsU2l6ZTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcih0b3RhbFNpemUpOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUpKSB7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIG9mZnNldCwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0ICsgNCwgbmFsU3RhcnQsIG5hbFNpemUpOworCisgICAgICAgIG9mZnNldCArPSA0ICsgbmFsU2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgc3A8QUJ1ZmZlcj4gRmluZE1QRUcyQURUU0NvbmZpZygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCAqc2FtcGxlUmF0ZSwgaW50MzJfdCAqY2hhbm5lbENvdW50KSB7CisgICAgQUJpdFJlYWRlciBicihidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxMiksIDB4ZmZmdSk7CisgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMHUpOworICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMiksIDB1KTsKKyAgICBici5nZXRCaXRzKDEpOyAgLy8gcHJvdGVjdGlvbl9hYnNlbnQKKyAgICB1bnNpZ25lZCBwcm9maWxlID0gYnIuZ2V0Qml0cygyKTsKKyAgICBMT0coSU5GTykgPDwgInByb2ZpbGUgPSAiIDw8IHByb2ZpbGU7CisgICAgQ0hFQ0tfTkUocHJvZmlsZSwgM3UpOworICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBici5nZXRCaXRzKDQpOworICAgIGJyLmdldEJpdHMoMSk7ICAvLyBwcml2YXRlX2JpdAorICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJyLmdldEJpdHMoMyk7CisgICAgQ0hFQ0tfTkUoY2hhbm5lbF9jb25maWd1cmF0aW9uLCAwdSk7CisKKyAgICBMT0coSU5GTykgPDwgInNhbXBsaW5nX2ZyZXFfaW5kZXggPSAiIDw8IHNhbXBsaW5nX2ZyZXFfaW5kZXg7CisgICAgTE9HKElORk8pIDw8ICJjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSAiIDw8IGNoYW5uZWxfY29uZmlndXJhdGlvbjsKKworICAgIENIRUNLX0xFKHNhbXBsaW5nX2ZyZXFfaW5kZXgsIDExdSk7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgICpzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKKworICAgICpjaGFubmVsQ291bnQgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb247CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0geworICAgICAgICAweDAzLCAyMiwKKyAgICAgICAgMHgwMCwgMHgwMCwgICAgIC8vIEVTX0lECisgICAgICAgIDB4MDAsICAgICAgICAgICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKworICAgICAgICAweDA0LCAxNywKKyAgICAgICAgMHg0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIElTTy9JRUMgMTQ0OTYtMworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCisgICAgICAgIDB4MDUsIDIsCisgICAgICAgIC8vIEF1ZGlvU3BlY2lmaWNJbmZvIGZvbGxvd3MKKworICAgICAgICAvLyBvb29vIG9mZmYgZmNjYyBjMDAwCisgICAgICAgIC8vIG8gLSBhdWRpb09iamVjdFR5cGUKKyAgICAgICAgLy8gZiAtIHNhbXBsaW5nRnJlcUluZGV4CisgICAgICAgIC8vIGMgLSBjaGFubmVsQ29uZmlnCisgICAgfTsKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihzaXplb2Yoa1N0YXRpY0VTRFMpICsgMik7CisgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBrU3RhdGljRVNEUywgc2l6ZW9mKGtTdGF0aWNFU0RTKSk7CisKKyAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9CisgICAgICAgICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7CisKKyAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPQorICAgICAgICAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CisKKyAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisgICAgcmV0dXJuIGNzZDsKK30KKwordm9pZCBBVFNQYXJzZXI6OlN0cmVhbTo6b25QYXlsb2FkRGF0YSgKKyAgICAgICAgdW5zaWduZWQgUFRTX0RUU19mbGFncywgdWludDY0X3QgUFRTLCB1aW50NjRfdCBEVFMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJvblBheWxvYWREYXRhIG1TdHJlYW1UeXBlPSIKKyAgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIweCUwMngiLCBtU3RyZWFtVHlwZSk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisKKyAgICBpZiAobVN0cmVhbVR5cGUgPT0gMHgxYikgeworICAgICAgICBidWZmZXIgPSBNYWtlQ2xlYW5BVkNEYXRhKGRhdGEsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGhleGR1bXAoZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKKworICAgICAgICBpZiAobVN0cmVhbVR5cGUgPT0gMHgxYikgeworICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShidWZmZXIsICZ3aWR0aCwgJmhlaWdodCk7CisKKyAgICAgICAgICAgIGlmIChjc2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywgMCwgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLX0VRKG1TdHJlYW1UeXBlLCAweDBmdSk7CisKKyAgICAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZCA9CisgICAgICAgICAgICAgICAgRmluZE1QRUcyQURUU0NvbmZpZyhidWZmZXIsICZzYW1wbGVSYXRlLCAmY2hhbm5lbENvdW50KTsKKworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJzYW1wbGVSYXRlID0gIiA8PCBzYW1wbGVSYXRlOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJjaGFubmVsQ291bnQgPSAiIDw8IGNoYW5uZWxDb3VudDsKKworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKKworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywgMCwgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIExPRyhJTkZPKSA8PCAiY3JlYXRlZCBzb3VyY2UhIjsKKyAgICAgICAgbVNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOworCisgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgIH0KKworICAgIENIRUNLKFBUU19EVFNfZmxhZ3MgPT0gMiB8fCBQVFNfRFRTX2ZsYWdzID09IDMpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZSIsIChQVFMgKiAxMDApIC8gOSk7CisKKyAgICBpZiAobVN0cmVhbVR5cGUgPT0gMHgwZikgeworICAgICAgICBleHRyYWN0QUFDRnJhbWVzKGJ1ZmZlcik7CisgICAgfQorCisgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGJ1ZmZlcik7Cit9CisKKy8vIERpc2Fzc2VtYmxlIG9uZSBvciBtb3JlIEFEVFMgZnJhbWVzIGludG8gdGhlaXIgY29uc3RpdHVlbnQgcGFydHMgYW5kCisvLyBsZWF2ZSBvbmx5IHRoZSBjb25jYXRlbmF0ZWQgcmF3X2RhdGFfYmxvY2tzIGluIHRoZSBidWZmZXIuCit2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpleHRyYWN0QUFDRnJhbWVzKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHdoaWxlIChvZmZzZXQgPCBidWZmZXItPnNpemUoKSkgeworICAgICAgICBDSEVDS19MRShvZmZzZXQgKyA3LCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgQUJpdFJlYWRlciBiaXRzKGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPnNpemUoKSAtIG9mZnNldCk7CisKKyAgICAgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKKworICAgICAgICBDSEVDS19FUShiaXRzLmdldEJpdHMoMTIpLCAweGZmZnUpOworICAgICAgICBiaXRzLnNraXBCaXRzKDMpOyAgLy8gSUQsIGxheWVyCisgICAgICAgIGJvb2wgcHJvdGVjdGlvbl9hYnNlbnQgPSBiaXRzLmdldEJpdHMoMSkgIT0gMDsKKworICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAorICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKKyAgICAgICAgYml0cy5za2lwQml0cygxMik7CisKKyAgICAgICAgLy8gYWR0c192YXJpYWJsZV9oZWFkZXIKKworICAgICAgICAvLyBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fYml0LCBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fc3RhcnQKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsKKworICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0gYml0cy5nZXRCaXRzKDEzKTsKKworICAgICAgICBiaXRzLnNraXBCaXRzKDExKTsgIC8vIGFkdHNfYnVmZmVyX2Z1bGxuZXNzCisKKyAgICAgICAgdW5zaWduZWQgbnVtYmVyX29mX3Jhd19kYXRhX2Jsb2Nrc19pbl9mcmFtZSA9IGJpdHMuZ2V0Qml0cygyKTsKKworICAgICAgICBpZiAobnVtYmVyX29mX3Jhd19kYXRhX2Jsb2Nrc19pbl9mcmFtZSA9PSAwKSB7CisgICAgICAgICAgICBzaXplX3Qgc2NhbiA9IG9mZnNldCArIGFhY19mcmFtZV9sZW5ndGg7CisKKyAgICAgICAgICAgIG9mZnNldCArPSA3OworICAgICAgICAgICAgaWYgKCFwcm90ZWN0aW9uX2Fic2VudCkgeworICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDS19MRShzY2FuLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKQorICAgICAgICAgICAgICAgIDw8ICJmb3VuZCBhYWMgcmF3IGRhdGEgYmxvY2sgYXQgWyIKKyAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjB4JTA4eCIsIG9mZnNldCkKKyAgICAgICAgICAgICAgICA8PCAiIDsgIgorICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiMHglMDh4Iiwgc2NhbikKKyAgICAgICAgICAgICAgICA8PCAiKSI7CisKKyAgICAgICAgICAgIG1lbW1vdmUoJmJ1ZmZlci0+ZGF0YSgpW2RzdE9mZnNldF0sICZidWZmZXItPmRhdGEoKVtvZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICBzY2FuIC0gb2Zmc2V0KTsKKworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IHNjYW4gLSBvZmZzZXQ7CisgICAgICAgICAgICBvZmZzZXQgPSBzY2FuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVG8gYmUgaW1wbGVtZW50ZWQuCisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisgICAgfQorICAgIENIRUNLX0VRKG9mZnNldCwgYnVmZmVyLT5zaXplKCkpOworCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBkc3RPZmZzZXQpOworfQorCitzcDxNZWRpYVNvdXJjZT4gQVRTUGFyc2VyOjpTdHJlYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKKyAgICBpZiAoKHR5cGUgPT0gQVZDX1ZJREVPICYmIG1TdHJlYW1UeXBlID09IDB4MWIpCisgICAgICAgIHx8ICh0eXBlID09IE1QRUcyQURUU19BVURJTyAmJiBtU3RyZWFtVHlwZSA9PSAweDBmKSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQVRTUGFyc2VyOjpBVFNQYXJzZXIoKSB7Cit9CisKK0FUU1BhcnNlcjo6fkFUU1BhcnNlcigpIHsKK30KKwordm9pZCBBVFNQYXJzZXI6OmZlZWRUU1BhY2tldChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIENIRUNLX0VRKHNpemUsIGtUU1BhY2tldFNpemUpOworCisgICAgQUJpdFJlYWRlciBicigoY29uc3QgdWludDhfdCAqKWRhdGEsIGtUU1BhY2tldFNpemUpOworICAgIHBhcnNlVFMoJmJyKTsKK30KKwordm9pZCBBVFNQYXJzZXI6OnBhcnNlUHJvZ3JhbUFzc29jaWF0aW9uVGFibGUoQUJpdFJlYWRlciAqYnIpIHsKKyAgICB1bnNpZ25lZCB0YWJsZV9pZCA9IGJyLT5nZXRCaXRzKDgpOworICAgIExPRyhWRVJCT1NFKSA8PCAiICB0YWJsZV9pZCA9ICIgPDwgdGFibGVfaWQ7CisgICAgQ0hFQ0tfRVEodGFibGVfaWQsIDB4MDB1KTsKKworICAgIHVuc2lnbmVkIHNlY3Rpb25fc3ludGF4X2luZGljdG9yID0gYnItPmdldEJpdHMoMSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHNlY3Rpb25fc3ludGF4X2luZGljdG9yID0gIiA8PCBzZWN0aW9uX3N5bnRheF9pbmRpY3RvcjsKKyAgICBDSEVDS19FUShzZWN0aW9uX3N5bnRheF9pbmRpY3RvciwgMXUpOworCisgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDB1KTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgcmVzZXJ2ZWQgPSAiIDw8IGJyLT5nZXRCaXRzKDIpOworCisgICAgdW5zaWduZWQgc2VjdGlvbl9sZW5ndGggPSBici0+Z2V0Qml0cygxMik7CisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHNlY3Rpb25fbGVuZ3RoID0gIiA8PCBzZWN0aW9uX2xlbmd0aDsKKyAgICBDSEVDSygoc2VjdGlvbl9sZW5ndGggJiAweGMwMCkgPT0gMCk7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgdHJhbnNwb3J0X3N0cmVhbV9pZCA9ICIgPDwgYnItPmdldEJpdHMoMTYpOworICAgIExPRyhWRVJCT1NFKSA8PCAiICByZXNlcnZlZCA9ICIgPDwgYnItPmdldEJpdHMoMik7CisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHZlcnNpb25fbnVtYmVyID0gIiA8PCBici0+Z2V0Qml0cyg1KTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgY3VycmVudF9uZXh0X2luZGljYXRvciA9ICIgPDwgYnItPmdldEJpdHMoMSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICIgIHNlY3Rpb25fbnVtYmVyID0gIiA8PCBici0+Z2V0Qml0cyg4KTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIiAgbGFzdF9zZWN0aW9uX251bWJlciA9ICIgPDwgYnItPmdldEJpdHMoOCk7CisKKyAgICBzaXplX3QgbnVtUHJvZ3JhbUJ5dGVzID0gKHNlY3Rpb25fbGVuZ3RoIC0gNSAvKiBoZWFkZXIgKi8gLSA0IC8qIGNyYyAqLyk7CisgICAgQ0hFQ0tfRVEoKG51bVByb2dyYW1CeXRlcyAlIDQpLCAwdSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVByb2dyYW1CeXRlcyAvIDQ7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBwcm9ncmFtX251bWJlciA9IGJyLT5nZXRCaXRzKDE2KTsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgcHJvZ3JhbV9udW1iZXIgPSAiIDw8IHByb2dyYW1fbnVtYmVyOworCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgIHJlc2VydmVkID0gIiA8PCBici0+Z2V0Qml0cygzKTsKKworICAgICAgICBpZiAocHJvZ3JhbV9udW1iZXIgPT0gMCkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgbmV0d29ya19QSUQgPSAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCIweCUwNHgiLCBici0+Z2V0Qml0cygxMykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKKworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgcHJvZ3JhbV9tYXBfUElEID0gIgorICAgICAgICAgICAgICAgICAgICAgIDw8IFN0cmluZ1ByaW50ZigiMHglMDR4IiwgcHJvZ3JhbU1hcFBJRCk7CisKKyAgICAgICAgICAgIG1Qcm9ncmFtcy5wdXNoKG5ldyBQcm9ncmFtKHByb2dyYW1NYXBQSUQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPRyhWRVJCT1NFKSA8PCAiICBDUkMgPSAiIDw8IFN0cmluZ1ByaW50ZigiMHglMDh4IiwgYnItPmdldEJpdHMoMzIpKTsKK30KKwordm9pZCBBVFNQYXJzZXI6OnBhcnNlUElEKAorICAgICAgICBBQml0UmVhZGVyICpiciwgdW5zaWduZWQgUElELAorICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgaWYgKFBJRCA9PSAwKSB7CisgICAgICAgIGlmIChwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBza2lwID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBici0+c2tpcEJpdHMoc2tpcCAqIDgpOworICAgICAgICB9CisgICAgICAgIHBhcnNlUHJvZ3JhbUFzc29jaWF0aW9uVGFibGUoYnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJvZ3JhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1Qcm9ncmFtcy5lZGl0SXRlbUF0KGkpLT5wYXJzZVBJRCgKKyAgICAgICAgICAgICAgICAgICAgUElELCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBicikpIHsKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWhhbmRsZWQpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJQSUQgIiA8PCBTdHJpbmdQcmludGYoIjB4JTA0eCIsIFBJRCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgbm90IGhhbmRsZWQuIjsKKyAgICB9Cit9CisKK3ZvaWQgQVRTUGFyc2VyOjpwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpicikgeworICAgIHVuc2lnbmVkIGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoID0gYnItPmdldEJpdHMoOCk7CisgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoID4gMCkgeworICAgICAgICBici0+c2tpcEJpdHMoYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggKiA4KTsgIC8vIFhYWAorICAgIH0KK30KKwordm9pZCBBVFNQYXJzZXI6OnBhcnNlVFMoQUJpdFJlYWRlciAqYnIpIHsKKyAgICBMT0coVkVSQk9TRSkgPDwgIi0tLSI7CisKKyAgICB1bnNpZ25lZCBzeW5jX2J5dGUgPSBici0+Z2V0Qml0cyg4KTsKKyAgICBDSEVDS19FUShzeW5jX2J5dGUsIDB4NDd1KTsKKworICAgIExPRyhWRVJCT1NFKSA8PCAidHJhbnNwb3J0X2Vycm9yX2luZGljYXRvciA9ICIgPDwgYnItPmdldEJpdHMoMSk7CisKKyAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yID0gYnItPmdldEJpdHMoMSk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yID0gIgorICAgICAgICAgICAgICAgICA8PCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICJ0cmFuc3BvcnRfcHJpb3JpdHkgPSAiIDw8IGJyLT5nZXRCaXRzKDEpOworCisgICAgdW5zaWduZWQgUElEID0gYnItPmdldEJpdHMoMTMpOworICAgIExPRyhWRVJCT1NFKSA8PCAiUElEID0gIiA8PCBTdHJpbmdQcmludGYoIjB4JTA0eCIsIFBJRCk7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgInRyYW5zcG9ydF9zY3JhbWJsaW5nX2NvbnRyb2wgPSAiIDw8IGJyLT5nZXRCaXRzKDIpOworCisgICAgdW5zaWduZWQgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID0gYnItPmdldEJpdHMoMik7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPSAiIDw8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbDsKKworICAgIExPRyhWRVJCT1NFKSA8PCAiY29udGludWl0eV9jb3VudGVyID0gIiA8PCBici0+Z2V0Qml0cyg0KTsKKworICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMiB8fCBhZGFwdGF0aW9uX2ZpZWxkX2NvbnRyb2wgPT0gMykgeworICAgICAgICBwYXJzZUFkYXB0YXRpb25GaWVsZChicik7CisgICAgfQorCisgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAxIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7CisgICAgICAgIHBhcnNlUElEKGJyLCBQSUQsIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpOworICAgIH0KK30KKworc3A8TWVkaWFTb3VyY2U+IEFUU1BhcnNlcjo6Z2V0U291cmNlKFNvdXJjZVR5cGUgdHlwZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByb2dyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBtUHJvZ3JhbXMuZWRpdEl0ZW1BdChpKS0+Z2V0U291cmNlKHR5cGUpOworCisgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyMmU3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9UU19QQVJTRVJfSF8KKworI2RlZmluZSBBX1RTX1BBUlNFUl9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQml0UmVhZGVyOworc3RydWN0IE1lZGlhU291cmNlOworCitzdHJ1Y3QgQVRTUGFyc2VyIDogcHVibGljIFJlZkJhc2UgeworICAgIEFUU1BhcnNlcigpOworCisgICAgdm9pZCBmZWVkVFNQYWNrZXQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgZW51bSBTb3VyY2VUeXBlIHsKKyAgICAgICAgQVZDX1ZJREVPLAorICAgICAgICBNUEVHMkFEVFNfQVVESU8KKyAgICB9OworICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBQcm9ncmFtOworICAgIHN0cnVjdCBTdHJlYW07CisKKyAgICBWZWN0b3I8c3A8UHJvZ3JhbT4gPiBtUHJvZ3JhbXM7CisKKyAgICB2b2lkIHBhcnNlUHJvZ3JhbUFzc29jaWF0aW9uVGFibGUoQUJpdFJlYWRlciAqYnIpOworICAgIHZvaWQgcGFyc2VQcm9ncmFtTWFwKEFCaXRSZWFkZXIgKmJyKTsKKyAgICB2b2lkIHBhcnNlUEVTKEFCaXRSZWFkZXIgKmJyKTsKKworICAgIHZvaWQgcGFyc2VQSUQoCisgICAgICAgIEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQsCisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpOworCisgICAgdm9pZCBwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpicik7CisgICAgdm9pZCBwYXJzZVRTKEFCaXRSZWFkZXIgKmJyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFUU1BhcnNlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfVFNfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NGI0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIxIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFub3RoZXJQYWNrZXRTb3VyY2UuY3BwICAgXAorICAgICAgICBBVFNQYXJzZXIuY3BwICAgICAgICAgICAgIFwKKyAgICAgICAgTVBFRzJUU0V4dHJhY3Rvci5jcHAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodAorCitMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCisKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLVduby1wc2FiaQorZW5kaWYKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MTE3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Fub3RoZXJQYWNrZXRTb3VyY2U6OkFub3RoZXJQYWNrZXRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQorICAgIDogbUZvcm1hdChtZXRhKSwKKyAgICAgIG1FT1NSZXN1bHQoT0spIHsKK30KKworQW5vdGhlclBhY2tldFNvdXJjZTo6fkFub3RoZXJQYWNrZXRTb3VyY2UoKSB7Cit9CisKK3N0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0b3AoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzcDxNZXRhRGF0YT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0Rm9ybWF0KCkgeworICAgIHJldHVybiBtRm9ybWF0OworfQorCitzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKikgeworICAgICpvdXQgPSBOVUxMOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICB3aGlsZSAobUVPU1Jlc3VsdCA9PSBPSyAmJiBtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaWYgKCFtQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICptQnVmZmVycy5iZWdpbigpOworCisgICAgICAgIHVpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgInRpbWUiLCAoaW50NjRfdCAqKSZ0aW1lVXMpKTsKKworICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyLT5zaXplKCkpOworICAgICAgICBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworCisgICAgICAgIC8vIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICBtZW1jcHkobWVkaWFCdWZmZXItPmRhdGEoKSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgKm91dCA9IG1lZGlhQnVmZmVyOworCisgICAgICAgIG1CdWZmZXJzLmVyYXNlKG1CdWZmZXJzLmJlZ2luKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgcmV0dXJuIG1FT1NSZXN1bHQ7Cit9CisKK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6cXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpbnQzMl90IGRhbWFnZWQ7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRhbWFnZWQiLCAmZGFtYWdlZCkgJiYgZGFtYWdlZCkgeworICAgICAgICAvLyBMT0coVkVSQk9TRSkgPDwgImRpc2NhcmRpbmcgZGFtYWdlZCBBVSI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6c2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCkgeworICAgIENIRUNLKHJlc3VsdCAhPSBPSyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1FT1NSZXN1bHQgPSByZXN1bHQ7CisgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworYm9vbCBBbm90aGVyUGFja2V0U291cmNlOjpoYXNCdWZmZXJBdmFpbGFibGUoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgKmZpbmFsUmVzdWx0ID0gbUVPU1Jlc3VsdDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODNkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTk9USEVSX1BBQ0tFVF9TT1VSQ0VfSF8KKworI2RlZmluZSBBTk9USEVSX1BBQ0tFVF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBBbm90aGVyUGFja2V0U291cmNlKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworCisgICAgYm9vbCBoYXNCdWZmZXJBdmFpbGFibGUoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKKworICAgIHZvaWQgcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgc2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Bbm90aGVyUGFja2V0U291cmNlKCk7CisKK3ByaXZhdGU6CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUJ1ZmZlcnM7CisgICAgc3RhdHVzX3QgbUVPU1Jlc3VsdDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFub3RoZXJQYWNrZXRTb3VyY2UpOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFOT1RIRVJfUEFDS0VUX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYTM3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1QRUcyVFNFeHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVRTUGFyc2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UgeworICAgIE1QRUcyVFNTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxNUEVHMlRTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworcHJpdmF0ZToKKyAgICBzcDxNUEVHMlRTRXh0cmFjdG9yPiBtRXh0cmFjdG9yOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IG1JbXBsOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU1NvdXJjZSk7Cit9OworCitNUEVHMlRTU291cmNlOjpNUEVHMlRTU291cmNlKAorICAgICAgICBjb25zdCBzcDxNUEVHMlRTRXh0cmFjdG9yPiAmZXh0cmFjdG9yLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkKKyAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1JbXBsKGltcGwpIHsKK30KKworc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgIHJldHVybiBtSW1wbC0+c3RhcnQocGFyYW1zKTsKK30KKworc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKKyAgICByZXR1cm4gbUltcGwtPnN0b3AoKTsKK30KKworc3A8TWV0YURhdGE+IE1QRUcyVFNTb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbUltcGwtPmdldEZvcm1hdCgpOworfQorCitzdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIHdoaWxlICghbUltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtSW1wbC0+c2lnbmFsRU9TKGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbUltcGwtPnJlYWQob3V0LCBvcHRpb25zKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKKyAgICAgIG1QYXJzZXIobmV3IEFUU1BhcnNlciksCisgICAgICBtT2Zmc2V0KDApIHsKKyAgICBpbml0KCk7Cit9CisKK3NpemVfdCBNUEVHMlRTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbVNvdXJjZUltcGxzLnNpemUoKTsKK30KKworc3A8TWVkaWFTb3VyY2U+IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA+PSBtU291cmNlSW1wbHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBuZXcgTVBFRzJUU1NvdXJjZSh0aGlzLCBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCkpOworfQorCitzcDxNZXRhRGF0YT4gTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgeworICAgIHJldHVybiBpbmRleCA8IG1Tb3VyY2VJbXBscy5zaXplKCkKKyAgICAgICAgPyBtU291cmNlSW1wbHMuZWRpdEl0ZW1BdChpbmRleCktPmdldEZvcm1hdCgpIDogTlVMTDsKK30KKworc3A8TWV0YURhdGE+IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKCkgeworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7CisKKyAgICByZXR1cm4gbWV0YTsKK30KKwordm9pZCBNUEVHMlRTRXh0cmFjdG9yOjppbml0KCkgeworICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CisgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKKworICAgIHdoaWxlIChmZWVkTW9yZSgpID09IE9LKSB7CisgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSB0eXBlOworICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhdmVWaWRlbykgeworICAgICAgICAgICAgdHlwZSA9IEFUU1BhcnNlcjo6TVBFRzJBRFRTX0FVRElPOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHlwZSA9IEFUU1BhcnNlcjo6QVZDX1ZJREVPOworICAgICAgICB9CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPQorICAgICAgICAgICAgKEFub3RoZXJQYWNrZXRTb3VyY2UgKiltUGFyc2VyLT5nZXRTb3VyY2UodHlwZSkuZ2V0KCk7CisKKyAgICAgICAgaWYgKGltcGwgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQVRTUGFyc2VyOjpNUEVHMkFEVFNfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBoYXZlQXVkaW8gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoYXZlVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dJKCJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCIsIGhhdmVBdWRpbywgaGF2ZVZpZGVvKTsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmVlZE1vcmUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKKworICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOworICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKTsKKworICAgIGlmIChuIDwgKHNzaXplX3Qpa1RTUGFja2V0U2l6ZSkgeworICAgICAgICByZXR1cm4gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBtT2Zmc2V0ICs9IGtUU1BhY2tldFNpemU7CisgICAgbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgU25pZmZNUEVHMlRTKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgIHNwPEFNZXNzYWdlPiAqKSB7CisjaWYgMAorICAgIGNoYXIgaGVhZGVyOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCAmaGVhZGVyLCAxKSAhPSAxIHx8IGhlYWRlciAhPSAweDQ3KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqY29uZmlkZW5jZSA9IDAuMDVmOworICAgIG1pbWVUeXBlLT5zZXRUbyhNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgICAgLy8gRm9yIG5vdyB3ZSdyZSBnb2luZyB0byBuZXZlciBpZGVudGlmeSB0aGlzIHR5cGUgb2Ygc3RyZWFtLCBzaW5jZSB3ZSdkCisgICAgLy8ganVzdCBiYXNlIG91ciBkZWNpc2lvbiBvbiBhIHNpbmdsZSBieXRlLi4uCisgICAgLy8gSW5zdGVhZCB5b3UgY2FuIGluc3RhbnRpYXRlIGFuIE1QRUcyVFNFeHRyYWN0b3IgYnkgZXhwbGljaXRseSBzdGF0aW5nCisgICAgLy8gaXRzIHByb3BlciBtaW1lIHR5cGUgaW4gdGhlIGNhbGwgdG8gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZSguLi4pLgorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAppbmRleCAxMzJlMzFiLi42ZGU3NjFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcApAQCAtNDMsNyArNDMsNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RydWN0IE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIENhbGxiYWNrRGlzcGF0Y2hlcihPTVggKm93bmVyKTsKKyAgICBDYWxsYmFja0Rpc3BhdGNoZXIoT01YTm9kZUluc3RhbmNlICpvd25lcik7CiAKICAgICB2b2lkIHBvc3QoY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CiAKQEAgLTUzLDcgKzUzLDcgQEAKIHByaXZhdGU6CiAgICAgTXV0ZXggbUxvY2s7CiAKLSAgICBPTVggKm1Pd25lcjsKKyAgICBPTVhOb2RlSW5zdGFuY2UgKm1Pd25lcjsKICAgICBib29sIG1Eb25lOwogICAgIENvbmRpdGlvbiBtUXVldWVDaGFuZ2VkOwogICAgIExpc3Q8b214X21lc3NhZ2U+IG1RdWV1ZTsKQEAgLTY5LDcgKzY5LDcgQEAKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIgJm9wZXJhdG9yPShjb25zdCBDYWxsYmFja0Rpc3BhdGNoZXIgJik7CiB9OwogCi1PTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6Q2FsbGJhY2tEaXNwYXRjaGVyKE9NWCAqb3duZXIpCitPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6Q2FsbGJhY2tEaXNwYXRjaGVyKE9NWE5vZGVJbnN0YW5jZSAqb3duZXIpCiAgICAgOiBtT3duZXIob3duZXIpLAogICAgICAgbURvbmUoZmFsc2UpIHsKICAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOwpAQCAtMTAxLDEyICsxMDEsMTEgQEAKIH0KIAogdm9pZCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6ZGlzcGF0Y2goY29uc3Qgb214X21lc3NhZ2UgJm1zZykgewotICAgIE9NWE5vZGVJbnN0YW5jZSAqaW5zdGFuY2UgPSBtT3duZXItPmZpbmRJbnN0YW5jZShtc2cubm9kZSk7Ci0gICAgaWYgKGluc3RhbmNlID09IE5VTEwpIHsKKyAgICBpZiAobU93bmVyID09IE5VTEwpIHsKICAgICAgICAgTE9HVigiV291bGQgaGF2ZSBkaXNwYXRjaGVkIGEgbWVzc2FnZSB0byBhIG5vZGUgdGhhdCdzIGFscmVhZHkgZ29uZS4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpbnN0YW5jZS0+b25NZXNzYWdlKG1zZyk7CisgICAgbU93bmVyLT5vbk1lc3NhZ2UobXNnKTsKIH0KIAogLy8gc3RhdGljCkBAIC0xNDUsNyArMTQ0LDYgQEAKIAogT01YOjpPTVgoKQogICAgIDogbU1hc3RlcihuZXcgT01YTWFzdGVyKSwKLSAgICAgIG1EaXNwYXRjaGVyKG5ldyBDYWxsYmFja0Rpc3BhdGNoZXIodGhpcykpLAogICAgICAgbU5vZGVDb3VudGVyKDApIHsKIH0KIApAQCAtMTY2LDYgKzE2NCwxMCBAQAogICAgICAgICBpbnN0YW5jZSA9IG1MaXZlTm9kZXMuZWRpdFZhbHVlQXQoaW5kZXgpOwogICAgICAgICBtTGl2ZU5vZGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogCisgICAgICAgIGluZGV4ID0gbURpc3BhdGNoZXJzLmluZGV4T2ZLZXkoaW5zdGFuY2UtPm5vZGVJRCgpKTsKKyAgICAgICAgQ0hFQ0soaW5kZXggPj0gMCk7CisgICAgICAgIG1EaXNwYXRjaGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKwogICAgICAgICBpbnZhbGlkYXRlTm9kZUlEX2woaW5zdGFuY2UtPm5vZGVJRCgpKTsKICAgICB9CiAKQEAgLTIyNiw2ICsyMjgsNyBAQAogICAgIH0KIAogICAgICpub2RlID0gbWFrZU5vZGVJRChpbnN0YW5jZSk7CisgICAgbURpc3BhdGNoZXJzLmFkZCgqbm9kZSwgbmV3IENhbGxiYWNrRGlzcGF0Y2hlcihpbnN0YW5jZSkpOwogCiAgICAgaW5zdGFuY2UtPnNldEhhbmRsZSgqbm9kZSwgaGFuZGxlKTsKIApAQCAtMjQxLDYgKzI0NCwxMSBAQAogICAgIHNzaXplX3QgaW5kZXggPSBtTGl2ZU5vZGVzLmluZGV4T2ZLZXkoaW5zdGFuY2UtPm9ic2VydmVyKCktPmFzQmluZGVyKCkpOwogICAgIENIRUNLKGluZGV4ID49IDApOwogICAgIG1MaXZlTm9kZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisKKyAgICBpbmRleCA9IG1EaXNwYXRjaGVycy5pbmRleE9mS2V5KG5vZGUpOworICAgIENIRUNLKGluZGV4ID49IDApOworICAgIG1EaXNwYXRjaGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKwogICAgIGluc3RhbmNlLT5vYnNlcnZlcigpLT5hc0JpbmRlcigpLT51bmxpbmtUb0RlYXRoKHRoaXMpOwogCiAgICAgcmV0dXJuIGluc3RhbmNlLT5mcmVlTm9kZShtTWFzdGVyKTsKQEAgLTM0MSw3ICszNDksNyBAQAogICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTEgPSBuRGF0YTE7CiAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMiA9IG5EYXRhMjsKIAotICAgIG1EaXNwYXRjaGVyLT5wb3N0KG1zZyk7CisgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQpAQCAtMzU1LDcgKzM2Myw3IEBACiAgICAgbXNnLm5vZGUgPSBub2RlOwogICAgIG1zZy51LmJ1ZmZlcl9kYXRhLmJ1ZmZlciA9IHBCdWZmZXI7CiAKLSAgICBtRGlzcGF0Y2hlci0+cG9zdChtc2cpOworICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CiAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KQEAgLTM3NSw3ICszODMsNyBAQAogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnBsYXRmb3JtX3ByaXZhdGUgPSBwQnVmZmVyLT5wUGxhdGZvcm1Qcml2YXRlOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmRhdGFfcHRyID0gcEJ1ZmZlci0+cEJ1ZmZlcjsKIAotICAgIG1EaXNwYXRjaGVyLT5wb3N0KG1zZyk7CisgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKIAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQpAQCAtMzk3LDYgKzQwNSwxNCBAQAogICAgIHJldHVybiBpbmRleCA8IDAgPyBOVUxMIDogbU5vZGVJRFRvSW5zdGFuY2UudmFsdWVBdChpbmRleCk7CiB9CiAKK3NwPE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyPiBPTVg6OmZpbmREaXNwYXRjaGVyKG5vZGVfaWQgbm9kZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbURpc3BhdGNoZXJzLmluZGV4T2ZLZXkobm9kZSk7CisKKyAgICByZXR1cm4gaW5kZXggPCAwID8gTlVMTCA6IG1EaXNwYXRjaGVycy52YWx1ZUF0KGluZGV4KTsKK30KKwogdm9pZCBPTVg6OmludmFsaWRhdGVOb2RlSUQobm9kZV9pZCBub2RlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpbnZhbGlkYXRlTm9kZUlEX2wobm9kZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCmluZGV4IDlhNDViZWEuLjU2YjE2OWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPTVhNYXN0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKICNpbmNsdWRlICJPTVhNYXN0ZXIuaCIKIAogI2luY2x1ZGUgPGRsZmNuLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGMxYTAxMGMuLjVkYjUxNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0yNjQsNiArMjY0LDggQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyX21ldGEpOworCiAgICAgKmJ1ZmZlciA9IGhlYWRlcjsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwpAQCAtMjk0LDYgKzI5Niw4IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAorICAgIENIRUNLX0VRKGhlYWRlci0+cEFwcFByaXZhdGUsIGJ1ZmZlcl9tZXRhKTsKKwogICAgICpidWZmZXIgPSBoZWFkZXI7CiAgICAgKmJ1ZmZlcl9kYXRhID0gaGVhZGVyLT5wQnVmZmVyOwogCkBAIC0zMjUsNiArMzI5LDggQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCisgICAgQ0hFQ0tfRVEoaGVhZGVyLT5wQXBwUHJpdmF0ZSwgYnVmZmVyX21ldGEpOworCiAgICAgKmJ1ZmZlciA9IGhlYWRlcjsKIAogICAgIGFkZEFjdGl2ZUJ1ZmZlcihwb3J0SW5kZXgsICpidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawppbmRleCBlZTExN2U1Li44YmY0MzM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5tawpAQCAtMSw1ICsxLDMgQEAKLWlmZXEgKCQoQlVJTERfV0lUSF9GVUxMX1NUQUdFRlJJR0hUKSx0cnVlKQotCiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCkBAIC0xNyw3ICsxNSwzIEBACiBMT0NBTF9NT0RVTEU6PSBvbXhfdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWVuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0YmEzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFNUkFzc2VtYmxlci5jcHAKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQUFNUkFzc2VtYmxlci5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGUoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp2YWx1ZSkgeworICAgIHZhbHVlLT5jbGVhcigpOworCisgICAgc2l6ZV90IGtleUxlbiA9IHN0cmxlbihrZXkpOworCisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihzLCAnOycpOworCisgICAgICAgIHNpemVfdCBsZW4gPQorICAgICAgICAgICAgKGNvbG9uUG9zID09IE5VTEwpID8gc3RybGVuKHMpIDogY29sb25Qb3MgLSBzOworCisgICAgICAgIGlmIChsZW4gPj0ga2V5TGVuICsgMSAmJiBzW2tleUxlbl0gPT0gJz0nICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgeworICAgICAgICAgICAgdmFsdWUtPnNldFRvKCZzW2tleUxlbiArIDFdLCBsZW4gLSBrZXlMZW4gLSAxKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPT0ga2V5TGVuICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgeworICAgICAgICAgICAgdmFsdWUtPnNldFRvKCIxIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzID0gY29sb25Qb3MgKyAxOworICAgIH0KK30KKworQUFNUkFzc2VtYmxlcjo6QUFNUkFzc2VtYmxlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGJvb2wgaXNXaWRlLCBjb25zdCBBU3RyaW5nICZwYXJhbXMpCisgICAgOiBtSXNXaWRlKGlzV2lkZSksCisgICAgICBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCkgeworICAgIEFTdHJpbmcgdmFsdWU7CisgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHBhcmFtcy5jX3N0cigpLCAib2N0ZXQtYWxpZ24iLCAmdmFsdWUpICYmIHZhbHVlID09ICIxIik7CisgICAgQ0hFQ0soIUdldEF0dHJpYnV0ZShwYXJhbXMuY19zdHIoKSwgImNyYyIsICZ2YWx1ZSkgfHwgdmFsdWUgPT0gIjAiKTsKKyAgICBDSEVDSyghR2V0QXR0cmlidXRlKHBhcmFtcy5jX3N0cigpLCAiaW50ZXJsZWF2aW5nIiwgJnZhbHVlKSk7Cit9CisKK0FBTVJBc3NlbWJsZXI6On5BQU1SQXNzZW1ibGVyKCkgeworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBQU1SQXNzZW1ibGVyOjphc3NlbWJsZU1vcmUoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICByZXR1cm4gYWRkUGFja2V0KHNvdXJjZSk7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0RnJhbWVTaXplKGJvb2wgaXNXaWRlLCB1bnNpZ25lZCBGVCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZU5CWzhdID0geworICAgICAgICA5NSwgMTAzLCAxMTgsIDEzNCwgMTQ4LCAxNTksIDIwNCwgMjQ0CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVXQls5XSA9IHsKKyAgICAgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NworICAgIH07CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZUXSA6IGtGcmFtZVNpemVOQltGVF07CisKKyAgICAvLyBSb3VuZCB1cCBiaXRzIHRvIGJ5dGVzIGFuZCBhZGQgMSBmb3IgdGhlIGhlYWRlciBieXRlLgorICAgIGZyYW1lU2l6ZSA9IChmcmFtZVNpemUgKyA3KSAvIDggKyAxOworCisgICAgcmV0dXJuIGZyYW1lU2l6ZTsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUFNUkFzc2VtYmxlcjo6YWRkUGFja2V0KAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKworICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdCA9IHF1ZXVlLT5lcmFzZShpdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKKyNpZiBWRVJCT1NFCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTm90IHRoZSBzZXF1ZW5jZSBudW1iZXIgSSBleHBlY3RlZCI7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSOworICAgIH0KKworICAgIC8vIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIGlmIChidWZmZXItPnNpemUoKSA8IDEpIHsKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJBTVIgcGFja2V0IHRvbyBzaG9ydC4iOworCisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRIZWFkZXIgPSBidWZmZXItPmRhdGEoKVswXTsKKyAgICB1bnNpZ25lZCBDTVIgPSBwYXlsb2FkSGVhZGVyID4+IDQ7CisgICAgQ0hFQ0tfRVEocGF5bG9hZEhlYWRlciAmIDB4MGYsIDB1KTsgIC8vIFJSCisKKyAgICBWZWN0b3I8dWludDhfdD4gdGFibGVPZkNvbnRlbnRzOworCisgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAob2Zmc2V0ID49IGJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiVW5hYmxlIHRvIHBhcnNlIFRPQy4iOworCisgICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgdG9jID0gYnVmZmVyLT5kYXRhKClbb2Zmc2V0KytdOworCisgICAgICAgIHVuc2lnbmVkIEZUID0gKHRvYyA+PiAzKSAmIDB4MGY7CisgICAgICAgIGlmICgodG9jICYgMykgIT0gMAorICAgICAgICAgICAgICAgIHx8IChtSXNXaWRlICYmIEZUID4gOCkKKyAgICAgICAgICAgICAgICB8fCAoIW1Jc1dpZGUgJiYgRlQgPiA3KSkgeworICAgICAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklsbGVnYWwgVE9DIGVudHJ5LiI7CisKKyAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxTaXplICs9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCAodG9jID4+IDMpICYgMHgwZik7CisKKyAgICAgICAgdGFibGVPZkNvbnRlbnRzLnB1c2godG9jKTsKKworICAgICAgICBpZiAoMCA9PSAodG9jICYgMHg4MCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgQ29weVRpbWVzKGFjY2Vzc1VuaXQsIGJ1ZmZlcik7CisKKyAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhYmxlT2ZDb250ZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50OF90IHRvYyA9IHRhYmxlT2ZDb250ZW50c1tpXTsKKworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKG1Jc1dpZGUsICh0b2MgPj4gMykgJiAweDBmKTsKKworICAgICAgICBpZiAob2Zmc2V0ICsgZnJhbWVTaXplIC0gMSA+IGJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQU1SIHBhY2tldCB0b28gc2hvcnQuIjsKKworICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgIH0KKworICAgICAgICBhY2Nlc3NVbml0LT5kYXRhKClbZHN0T2Zmc2V0KytdID0gdG9jOworICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGZyYW1lU2l6ZSAtIDEpOworCisgICAgICAgIG9mZnNldCArPSBmcmFtZVNpemUgLSAxOworICAgICAgICBkc3RPZmZzZXQgKz0gZnJhbWVTaXplIC0gMTsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7CisKKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFBTVJBc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworfQorCit2b2lkIEFBTVJBc3NlbWJsZXI6Om9uQnllUmVjZWl2ZWQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIG1zZy0+cG9zdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBTVJBc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTVlMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQU1SQXNzZW1ibGVyLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9BTVJfQVNTRU1CTEVSX0hfCisKKyNkZWZpbmUgQV9BTVJfQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQVN0cmluZzsKKworc3RydWN0IEFBTVJBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CisgICAgQUFNUkFzc2VtYmxlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBib29sIGlzV2lkZSwKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnBhcmFtcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQU1SQXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNXaWRlOworCisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICBBc3NlbWJseVN0YXR1cyBhZGRQYWNrZXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQU1SQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9BTVJfQVNTRU1CTEVSX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMWUyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFBVkNBc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgQkVfVkVSQk9TRSAgICAgIDAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK0FBVkNBc3NlbWJsZXI6OkFBVkNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpIHsKK30KKworQUFWQ0Fzc2VtYmxlcjo6fkFBVkNBc3NlbWJsZXIoKSB7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFzc2VtYmx5U3RhdHVzIEFBVkNBc3NlbWJsZXI6OmFkZE5BTFVuaXQoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworCisgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmICghbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQgPSB0cnVlOworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICB9IGVsc2UgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IG1OZXh0RXhwZWN0ZWRTZXFObykgeworI2lmIEJFX1ZFUkJPU0UKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIjsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiBXUk9OR19TRVFVRU5DRV9OVU1CRVI7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBpZiAoc2l6ZSA8IDEgfHwgKGRhdGFbMF0gJiAweDgwKSkgeworICAgICAgICAvLyBDb3JydXB0LgorCisgICAgICAgIExPRyhFUlJPUikgPDwgIklnbm9yaW5nIGNvcnJ1cHQgYnVmZmVyLiI7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAobmFsVHlwZSA+PSAxICYmIG5hbFR5cGUgPD0gMjMpIHsKKyAgICAgICAgYWRkU2luZ2xlTkFMVW5pdChidWZmZXIpOworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSAyOCkgeworICAgICAgICAvLyBGVS1BCisgICAgICAgIHJldHVybiBhZGRGcmFnbWVudGVkTkFMVW5pdChxdWV1ZSk7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDI0KSB7CisgICAgICAgIC8vIFNUQVAtQQorICAgICAgICBib29sIHN1Y2Nlc3MgPSBhZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoYnVmZmVyKTsKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3MgPyBPSyA6IE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSWdub3JpbmcgdW5zdXBwb3J0ZWQgYnVmZmVyIChuYWxUeXBlPSIgPDwgbmFsVHlwZSA8PCAiKSI7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorfQorCit2b2lkIEFBVkNBc3NlbWJsZXI6OmFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworI2lmIEJFX1ZFUkJPU0UKKyAgICBMT0coVkVSQk9TRSkgPDwgImFkZFNpbmdsZU5BTFVuaXQgb2Ygc2l6ZSAiIDw8IGJ1ZmZlci0+c2l6ZSgpOworICAgIGhleGR1bXAoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyNlbmRpZgorCisgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgIGlmICghbU5BTFVuaXRzLmVtcHR5KCkgJiYgcnRwVGltZSAhPSBtQWNjZXNzVW5pdFJUUFRpbWUpIHsKKyAgICAgICAgc3VibWl0QWNjZXNzVW5pdCgpOworICAgIH0KKyAgICBtQWNjZXNzVW5pdFJUUFRpbWUgPSBydHBUaW1lOworCisgICAgbU5BTFVuaXRzLnB1c2hfYmFjayhidWZmZXIpOworfQorCitib29sIEFBVkNBc3NlbWJsZXI6OmFkZFNpbmdsZVRpbWVBZ2dyZWdhdGlvblBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGlzY2FyZGluZyB0b28gc21hbGwgU1RBUC1BIHBhY2tldC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKytkYXRhOworICAgIC0tc2l6ZTsKKyAgICB3aGlsZSAoc2l6ZSA+PSAyKSB7CisgICAgICAgIHNpemVfdCBuYWxTaXplID0gKGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdOworCisgICAgICAgIGlmIChzaXplIDwgbmFsU2l6ZSArIDIpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkRpc2NhcmRpbmcgbWFsZm9ybWVkIFNUQVAtQSBwYWNrZXQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcihuYWxTaXplKTsKKyAgICAgICAgbWVtY3B5KHVuaXQtPmRhdGEoKSwgJmRhdGFbMl0sIG5hbFNpemUpOworCisgICAgICAgIENvcHlUaW1lcyh1bml0LCBidWZmZXIpOworCisgICAgICAgIGFkZFNpbmdsZU5BTFVuaXQodW5pdCk7CisKKyAgICAgICAgZGF0YSArPSAyICsgbmFsU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSAyICsgbmFsU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5leHBlY3RlZCBwYWRkaW5nIGF0IGVuZCBvZiBTVEFQLUEgcGFja2V0LiI7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFzc2VtYmx5U3RhdHVzIEFBVkNBc3NlbWJsZXI6OmFkZEZyYWdtZW50ZWROQUxVbml0KAorICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKSB7CisgICAgQ0hFQ0soIXF1ZXVlLT5lbXB0eSgpKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIENIRUNLKHNpemUgPiAwKTsKKyAgICB1bnNpZ25lZCBpbmRpY2F0b3IgPSBkYXRhWzBdOworCisgICAgQ0hFQ0soKGluZGljYXRvciAmIDB4MWYpID09IDI4KTsKKworICAgIGlmIChzaXplIDwgMikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJZ25vcmluZyBtYWxmb3JtZWQgRlUgYnVmZmVyIChzaXplID0gIiA8PCBzaXplIDw8ICIpIjsKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorCisgICAgaWYgKCEoZGF0YVsxXSAmIDB4ODApKSB7CisgICAgICAgIC8vIFN0YXJ0IGJpdCBub3Qgc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyNpZiBCRV9WRVJCT1NFCisgICAgICAgIExPRyhFUlJPUikgPDwgIlN0YXJ0IGJpdCBub3Qgc2V0IG9uIGZpcnN0IGJ1ZmZlciI7CisjZW5kaWYKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorCisgICAgdWludDMyX3QgbmFsVHlwZSA9IGRhdGFbMV0gJiAweDFmOworICAgIHVpbnQzMl90IG5yaSA9IChkYXRhWzBdID4+IDUpICYgMzsKKworICAgIHVpbnQzMl90IGV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSArIDE7CisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNpemUgLSAyOworICAgIHNpemVfdCB0b3RhbENvdW50ID0gMTsKKyAgICBib29sIGNvbXBsZXRlID0gZmFsc2U7CisKKyAgICBpZiAoZGF0YVsxXSAmIDB4NDApIHsKKyAgICAgICAgLy8gSHVoPyBFbmQgYml0IGFsc28gc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyNpZiBCRV9WRVJCT1NFCisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiR3Jyci4gVGhpcyBpc24ndCBmcmFnbWVudGVkIGF0IGFsbC4iOworI2VuZGlmCisKKyAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOworICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisjaWYgQkVfVkVSQk9TRQorICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJzZXF1ZW5jZSBsZW5ndGggIiA8PCB0b3RhbENvdW50OworI2VuZGlmCisKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICAgICAgICAgIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBleHBlY3RlZFNlcU5vKSB7CisjaWYgQkVfVkVSQk9TRQorICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAiCisgICAgICAgICAgICAgICAgICAgICA8PCBleHBlY3RlZFNlcU5vIDw8ICIsIGdvdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNpemUgPCAyCisgICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbMF0gIT0gaW5kaWNhdG9yCisgICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzFdICYgMHgxZikgIT0gbmFsVHlwZQorICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsxXSAmIDB4ODApKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlci5cbiI7CisKKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIHdob2xlIHN0YXJ0IG9mIHRoZSBGVS4KKworICAgICAgICAgICAgICAgIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gdG90YWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vICsgMTsKKworICAgICAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b3RhbFNpemUgKz0gc2l6ZSAtIDI7CisgICAgICAgICAgICArK3RvdGFsQ291bnQ7CisKKyAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vICsgMTsKKworICAgICAgICAgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudC4KKyAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWNvbXBsZXRlKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gZXhwZWN0ZWRTZXFObzsKKworICAgIC8vIFdlIGZvdW5kIGFsbCB0aGUgZnJhZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgY29tcGxldGUgTkFMIHVuaXQuCisKKyAgICAvLyBMZWF2ZSByb29tIGZvciB0aGUgaGVhZGVyLiBTbyBmYXIgdG90YWxTaXplIGRpZCBub3QgaW5jbHVkZSB0aGUKKyAgICAvLyBoZWFkZXIgYnl0ZS4KKyAgICArK3RvdGFsU2l6ZTsKKworICAgIHNwPEFCdWZmZXI+IHVuaXQgPSBuZXcgQUJ1ZmZlcih0b3RhbFNpemUpOworICAgIENvcHlUaW1lcyh1bml0LCAqcXVldWUtPmJlZ2luKCkpOworCisgICAgdW5pdC0+ZGF0YSgpWzBdID0gKG5yaSA8PCA1KSB8IG5hbFR5cGU7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0b3RhbENvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKKworI2lmIEJFX1ZFUkJPU0UKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJwaWVjZSAjIiA8PCAoaSArIDEpIDw8ICIvIiA8PCB0b3RhbENvdW50OworICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisgICAgICAgIG9mZnNldCArPSBidWZmZXItPnNpemUoKSAtIDI7CisKKyAgICAgICAgaXQgPSBxdWV1ZS0+ZXJhc2UoaXQpOworICAgIH0KKworICAgIHVuaXQtPnNldFJhbmdlKDAsIHRvdGFsU2l6ZSk7CisKKyAgICBhZGRTaW5nbGVOQUxVbml0KHVuaXQpOworCisjaWYgQkVfVkVSQk9TRQorICAgIExPRyhWRVJCT1NFKSA8PCAic3VjY2Vzc2Z1bGx5IGFzc2VtYmxlZCBhIE5BTCB1bml0IGZyb20gZnJhZ21lbnRzLiI7CisjZW5kaWYKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBQVZDQXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgeworICAgIENIRUNLKCFtTkFMVW5pdHMuZW1wdHkoKSk7CisKKyNpZiBCRV9WRVJCT1NFCisgICAgTE9HKFZFUkJPU0UpIDw8ICJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoIiA8PCBtTkFMVW5pdHMuc2l6ZSgpIDw8ICIgbmFsIHVuaXRzKSI7CisjZW5kaWYKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbU5BTFVuaXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHRvdGFsU2l6ZSArPSA0ICsgKCppdCktPnNpemUoKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIodG90YWxTaXplKTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1OQUxVbml0cy5lbmQoKTsgKytpdCkgeworICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOworICAgICAgICBvZmZzZXQgKz0gNDsKKworICAgICAgICBzcDxBQnVmZmVyPiBuYWwgPSAqaXQ7CisgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsIG5hbC0+ZGF0YSgpLCBuYWwtPnNpemUoKSk7CisgICAgICAgIG9mZnNldCArPSBuYWwtPnNpemUoKTsKKyAgICB9CisKKyAgICBDb3B5VGltZXMoYWNjZXNzVW5pdCwgKm1OQUxVbml0cy5iZWdpbigpKTsKKworI2lmIDAKKyAgICBwcmludGYobUFjY2Vzc1VuaXREYW1hZ2VkID8gIlgiIDogIi4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCisgICAgaWYgKG1BY2Nlc3NVbml0RGFtYWdlZCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJkYW1hZ2VkIiwgdHJ1ZSk7CisgICAgfQorCisgICAgbU5BTFVuaXRzLmNsZWFyKCk7CisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFzc2VtYmx5U3RhdHVzIEFBVkNBc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZE5BTFVuaXQoc291cmNlKTsKKyAgICBpZiAoc3RhdHVzID09IE1BTEZPUk1FRF9QQUNLRVQpIHsKKyAgICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBQVZDQXNzZW1ibGVyOjpwYWNrZXRMb3N0KCkgeworICAgIENIRUNLKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgInBhY2tldExvc3QgKGV4cGVjdGVkICIgPDwgbU5leHRFeHBlY3RlZFNlcU5vIDw8ICIpIjsKKworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBQVZDQXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5TXNnLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzODllYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfQVZDX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfQVZDX0FTU0VNQkxFUl9IXworCisjaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgorCisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKKworc3RydWN0IEFBVkNBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CisgICAgQUFWQ0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BQVZDQXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisKKyAgICB1aW50MzJfdCBtQWNjZXNzVW5pdFJUUFRpbWU7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1OQUxVbml0czsKKworICAgIEFzc2VtYmx5U3RhdHVzIGFkZE5BTFVuaXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBhZGRTaW5nbGVOQUxVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIEFzc2VtYmx5U3RhdHVzIGFkZEZyYWdtZW50ZWROQUxVbml0KExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpOworICAgIGJvb2wgYWRkU2luZ2xlVGltZUFnZ3JlZ2F0aW9uUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBQVZDQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9BVkNfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODI5NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIMjYzQXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBSDI2M0Fzc2VtYmxlci5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBSDI2M0Fzc2VtYmxlcjo6QUgyNjNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpIHsKK30KKworQUgyNjNBc3NlbWJsZXI6On5BSDI2M0Fzc2VtYmxlcigpIHsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUgyNjNBc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZFBhY2tldChzb3VyY2UpOworICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBSDI2M0Fzc2VtYmxlcjo6YWRkUGFja2V0KAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKworICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdCA9IHF1ZXVlLT5lcmFzZShpdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKKyNpZiBWRVJCT1NFCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTm90IHRoZSBzZXF1ZW5jZSBudW1iZXIgSSBleHBlY3RlZCI7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSOworICAgIH0KKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpZiAobVBhY2tldHMuc2l6ZSgpID4gMCAmJiBydHBUaW1lICE9IG1BY2Nlc3NVbml0UlRQVGltZSkgeworICAgICAgICBzdWJtaXRBY2Nlc3NVbml0KCk7CisgICAgfQorICAgIG1BY2Nlc3NVbml0UlRQVGltZSA9IHJ0cFRpbWU7CisKKyAgICAvLyBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPCAyKSB7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgIHJldHVybiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0KKworICAgIHVuc2lnbmVkIHBheWxvYWRIZWFkZXIgPSBVMTZfQVQoYnVmZmVyLT5kYXRhKCkpOworICAgIENIRUNLX0VRKHBheWxvYWRIZWFkZXIgPj4gMTEsIDB1KTsgIC8vIFJSPTAKKyAgICB1bnNpZ25lZCBQID0gKHBheWxvYWRIZWFkZXIgPj4gMTApICYgMTsKKyAgICBDSEVDS19FUSgocGF5bG9hZEhlYWRlciA+PiA5KSAmIDEsIDB1KTsgIC8vIFY9MAorICAgIENIRUNLX0VRKChwYXlsb2FkSGVhZGVyID4+IDMpICYgMHgzZiwgMHUpOyAgLy8gUExFTj0wCisgICAgQ0hFQ0tfRVEocGF5bG9hZEhlYWRlciAmIDcsIDB1KTsgIC8vIFBFQklUPTAKKworICAgIGlmIChQKSB7CisgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gMHgwMDsKKyAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSAweDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisgICAgfQorCisgICAgbVBhY2tldHMucHVzaF9iYWNrKGJ1ZmZlcik7CisKKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEFIMjYzQXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgeworICAgIENIRUNLKCFtUGFja2V0cy5lbXB0eSgpKTsKKworI2lmIFZFUkJPU0UKKyAgICBMT0coVkVSQk9TRSkgPDwgIkFjY2VzcyB1bml0IGNvbXBsZXRlICgiIDw8IG1QYWNrZXRzLnNpemUoKSA8PCAiIHBhY2tldHMpIjsKKyNlbmRpZgorCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1QYWNrZXRzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QYWNrZXRzLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZ1bml0ID0gKml0OworCisgICAgICAgIHRvdGFsU2l6ZSArPSB1bml0LT5zaXplKCk7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaXQgPSBtUGFja2V0cy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGFja2V0cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmdW5pdCA9ICppdDsKKworICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsCisgICAgICAgICAgICAgICB1bml0LT5kYXRhKCksIHVuaXQtPnNpemUoKSk7CisKKyAgICAgICAgb2Zmc2V0ICs9IHVuaXQtPnNpemUoKTsKKworICAgICAgICArK2l0OworICAgIH0KKworICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbVBhY2tldHMuYmVnaW4oKSk7CisKKyNpZiAwCisgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1QYWNrZXRzLmNsZWFyKCk7CisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQUgyNjNBc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBSDI2M0Fzc2VtYmxlcjo6b25CeWVSZWNlaXZlZCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUgyNjNBc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZjNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSDI2M0Fzc2VtYmxlci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfSDI2M19BU1NFTUJMRVJfSF8KKworI2RlZmluZSBBX0gyNjNfQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBSDI2M0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKKyAgICBBSDI2M0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BSDI2M0Fzc2VtYmxlcigpOworCisgICAgdmlydHVhbCBBc3NlbWJseVN0YXR1cyBhc3NlbWJsZU1vcmUoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQnllUmVjZWl2ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5TXNnOworICAgIHVpbnQzMl90IG1BY2Nlc3NVbml0UlRQVGltZTsKKyAgICBib29sIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkOworICAgIHVpbnQzMl90IG1OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICBib29sIG1BY2Nlc3NVbml0RGFtYWdlZDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVBhY2tldHM7CisKKyAgICBBc3NlbWJseVN0YXR1cyBhZGRQYWNrZXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBSDI2M0Fzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfSDI2M19BU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMmM2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlICJBUlRQU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTVBFRzRBdWRpb0Fzc2VtYmxlcjo6QU1QRUc0QXVkaW9Bc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtTm90aWZ5TXNnKG5vdGlmeSksCisgICAgICBtQWNjZXNzVW5pdFJUUFRpbWUoMCksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZChmYWxzZSksCisgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8oMCksCisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpIHsKK30KKworQU1QRUc0QXVkaW9Bc3NlbWJsZXI6On5BTVBFRzRBdWRpb0Fzc2VtYmxlcigpIHsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQU1QRUc0QXVkaW9Bc3NlbWJsZXI6OmFzc2VtYmxlTW9yZSgKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1cyA9IGFkZFBhY2tldChzb3VyY2UpOworICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICBtQWNjZXNzVW5pdERhbWFnZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBTVBFRzRBdWRpb0Fzc2VtYmxlcjo6YWRkUGFja2V0KAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKworICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgICAgIGlmICgodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID49IG1OZXh0RXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdCA9IHF1ZXVlLT5lcmFzZShpdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoIW1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSAhPSBtTmV4dEV4cGVjdGVkU2VxTm8pIHsKKyNpZiBWRVJCT1NFCisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTm90IHRoZSBzZXF1ZW5jZSBudW1iZXIgSSBleHBlY3RlZCI7CisjZW5kaWYKKworICAgICAgICByZXR1cm4gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSOworICAgIH0KKworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpZiAobVBhY2tldHMuc2l6ZSgpID4gMCAmJiBydHBUaW1lICE9IG1BY2Nlc3NVbml0UlRQVGltZSkgeworICAgICAgICBzdWJtaXRBY2Nlc3NVbml0KCk7CisgICAgfQorICAgIG1BY2Nlc3NVbml0UlRQVGltZSA9IHJ0cFRpbWU7CisKKyAgICBtUGFja2V0cy5wdXNoX2JhY2soYnVmZmVyKTsKKworICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQU1QRUc0QXVkaW9Bc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CisgICAgQ0hFQ0soIW1QYWNrZXRzLmVtcHR5KCkpOworCisjaWYgVkVSQk9TRQorICAgIExPRyhWRVJCT1NFKSA8PCAiQWNjZXNzIHVuaXQgY29tcGxldGUgKCIgPDwgbVBhY2tldHMuc2l6ZSgpIDw8ICIgcGFja2V0cykiOworI2VuZGlmCisKKyAgICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbVBhY2tldHMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVBhY2tldHMuZW5kKCkpIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnVuaXQgPSAqaXQ7CisKKyAgICAgICAgc2l6ZV90IG4gPSAwOworICAgICAgICB3aGlsZSAodW5pdC0+ZGF0YSgpW25dID09IDB4ZmYpIHsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgICAgICArK247CisKKyAgICAgICAgdG90YWxTaXplICs9IHVuaXQtPnNpemUoKSAtIG47CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaXQgPSBtUGFja2V0cy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGFja2V0cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmdW5pdCA9ICppdDsKKworICAgICAgICBzaXplX3QgbiA9IDA7CisgICAgICAgIHdoaWxlICh1bml0LT5kYXRhKClbbl0gPT0gMHhmZikgeworICAgICAgICAgICAgKytuOworICAgICAgICB9CisgICAgICAgICsrbjsKKworICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKilhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsCisgICAgICAgICAgICAgICB1bml0LT5kYXRhKCkgKyBuLCB1bml0LT5zaXplKCkgLSBuKTsKKworICAgICAgICBvZmZzZXQgKz0gdW5pdC0+c2l6ZSgpIC0gbjsKKworICAgICAgICArK2l0OworICAgIH0KKworICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbVBhY2tldHMuYmVnaW4oKSk7CisKKyNpZiAwCisgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1QYWNrZXRzLmNsZWFyKCk7CisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRPYmplY3QoImFjY2Vzcy11bml0IiwgYWNjZXNzVW5pdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQU1QRUc0QXVkaW9Bc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBTVBFRzRBdWRpb0Fzc2VtYmxlcjo6b25CeWVSZWNlaXZlZCgpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgbXNnLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5ZjIwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuaApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01QRUc0X0FVRElPX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfTVBFRzRfQVVESU9fQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBTVBFRzRBdWRpb0Fzc2VtYmxlciA6IHB1YmxpYyBBUlRQQXNzZW1ibGVyIHsKKyAgICBBTVBFRzRBdWRpb0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTVBFRzRBdWRpb0Fzc2VtYmxlcigpOworCisgICAgdmlydHVhbCBBc3NlbWJseVN0YXR1cyBhc3NlbWJsZU1vcmUoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQnllUmVjZWl2ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5TXNnOworICAgIHVpbnQzMl90IG1BY2Nlc3NVbml0UlRQVGltZTsKKyAgICBib29sIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkOworICAgIHVpbnQzMl90IG1OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICBib29sIG1BY2Nlc3NVbml0RGFtYWdlZDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVBhY2tldHM7CisKKyAgICBBc3NlbWJseVN0YXR1cyBhZGRQYWNrZXQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdm9pZCBzdWJtaXRBY2Nlc3NVbml0KCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTVBFRzRBdWRpb0Fzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTVBFRzRfQVVESU9fQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhhMzViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlICJBUlRQU291cmNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBCRV9WRVJCT1NFICAgICAgMAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgeworICAgICAgICAgICAgKytzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKKworICAgICAgICBzaXplX3QgbGVuID0KKyAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKKworICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JworICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChzLCBrZXksIGtleUxlbikpIHsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzID0gY29sb25Qb3MgKyAxOworICAgIH0KK30KKworc3RhdGljIGJvb2wgR2V0SW50ZWdlckF0dHJpYnV0ZSgKKyAgICAgICAgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqa2V5LCB1bnNpZ25lZCAqeCkgeworICAgICp4ID0gMDsKKworICAgIEFTdHJpbmcgdmFsOworICAgIGlmICghR2V0QXR0cmlidXRlKHMsIGtleSwgJnZhbCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHMgPSB2YWwuY19zdHIoKTsKKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgeSA9IHN0cnRvdWwocywgJmVuZCwgMTApOworCisgICAgaWYgKGVuZCA9PSBzIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKnggPSB5OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6QU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGNvbnN0IEFTdHJpbmcgJmRlc2MsIGNvbnN0IEFTdHJpbmcgJnBhcmFtcykKKyAgICA6IG1Ob3RpZnlNc2cobm90aWZ5KSwKKyAgICAgIG1Jc0dlbmVyaWMoZmFsc2UpLAorICAgICAgbVBhcmFtcyhwYXJhbXMpLAorICAgICAgbVNpemVMZW5ndGgoMCksCisgICAgICBtSW5kZXhMZW5ndGgoMCksCisgICAgICBtSW5kZXhEZWx0YUxlbmd0aCgwKSwKKyAgICAgIG1DVFNEZWx0YUxlbmd0aCgwKSwKKyAgICAgIG1EVFNEZWx0YUxlbmd0aCgwKSwKKyAgICAgIG1SYW5kb21BY2Nlc3NJbmRpY2F0aW9uKGZhbHNlKSwKKyAgICAgIG1TdHJlYW1TdGF0ZUluZGljYXRpb24oMCksCisgICAgICBtQXV4aWxpYXJ5RGF0YVNpemVMZW5ndGgoMCksCisgICAgICBtSGFzQVVIZWFkZXIoZmFsc2UpLAorICAgICAgbUFjY2Vzc1VuaXRSVFBUaW1lKDApLAorICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAorICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApLAorICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkKGZhbHNlKSB7CisgICAgbUlzR2VuZXJpYyA9IGRlc2Muc3RhcnRzV2l0aCgibXBlZzQtZ2VuZXJpYy8iKTsKKworICAgIGlmIChtSXNHZW5lcmljKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWU7CisgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZShwYXJhbXMuY19zdHIoKSwgIm1vZGUiLCAmdmFsdWUpKTsKKworICAgICAgICBpZiAoIUdldEludGVnZXJBdHRyaWJ1dGUocGFyYW1zLmNfc3RyKCksICJzaXplTGVuZ3RoIiwgJm1TaXplTGVuZ3RoKSkgeworICAgICAgICAgICAgbVNpemVMZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHZXRJbnRlZ2VyQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgImluZGV4TGVuZ3RoIiwgJm1JbmRleExlbmd0aCkpIHsKKyAgICAgICAgICAgIG1JbmRleExlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdldEludGVnZXJBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jX3N0cigpLCAiaW5kZXhEZWx0YUxlbmd0aCIsICZtSW5kZXhEZWx0YUxlbmd0aCkpIHsKKyAgICAgICAgICAgIG1JbmRleERlbHRhTGVuZ3RoID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0SW50ZWdlckF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNfc3RyKCksICJDVFNEZWx0YUxlbmd0aCIsICZtQ1RTRGVsdGFMZW5ndGgpKSB7CisgICAgICAgICAgICBtQ1RTRGVsdGFMZW5ndGggPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHZXRJbnRlZ2VyQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgIkRUU0RlbHRhTGVuZ3RoIiwgJm1EVFNEZWx0YUxlbmd0aCkpIHsKKyAgICAgICAgICAgIG1EVFNEZWx0YUxlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCB4OworICAgICAgICBpZiAoIUdldEludGVnZXJBdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jX3N0cigpLCAicmFuZG9tQWNjZXNzSW5kaWNhdGlvbiIsICZ4KSkgeworICAgICAgICAgICAgbVJhbmRvbUFjY2Vzc0luZGljYXRpb24gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKHggPT0gMCB8fCB4ID09IDEpOworICAgICAgICAgICAgbVJhbmRvbUFjY2Vzc0luZGljYXRpb24gPSAoeCAhPSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghR2V0SW50ZWdlckF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNfc3RyKCksICJzdHJlYW1TdGF0ZUluZGljYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAmbVN0cmVhbVN0YXRlSW5kaWNhdGlvbikpIHsKKyAgICAgICAgICAgIG1TdHJlYW1TdGF0ZUluZGljYXRpb24gPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFHZXRJbnRlZ2VyQXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY19zdHIoKSwgImF1eGlsaWFyeURhdGFTaXplTGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgJm1BdXhpbGlhcnlEYXRhU2l6ZUxlbmd0aCkpIHsKKyAgICAgICAgICAgIG1BdXhpbGlhcnlEYXRhU2l6ZUxlbmd0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtSGFzQVVIZWFkZXIgPQorICAgICAgICAgICAgbVNpemVMZW5ndGggPiAwCisgICAgICAgICAgICB8fCBtSW5kZXhMZW5ndGggPiAwCisgICAgICAgICAgICB8fCBtSW5kZXhEZWx0YUxlbmd0aCA+IDAKKyAgICAgICAgICAgIHx8IG1DVFNEZWx0YUxlbmd0aCA+IDAKKyAgICAgICAgICAgIHx8IG1EVFNEZWx0YUxlbmd0aCA+IDAKKyAgICAgICAgICAgIHx8IG1SYW5kb21BY2Nlc3NJbmRpY2F0aW9uCisgICAgICAgICAgICB8fCBtU3RyZWFtU3RhdGVJbmRpY2F0aW9uID4gMDsKKyAgICB9Cit9CisKK0FNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXI6On5BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyKCkgeworfQorCitzdHJ1Y3QgQVVIZWFkZXIgeworICAgIHVuc2lnbmVkIG1TaXplOworICAgIHVuc2lnbmVkIG1TZXJpYWw7Cit9OworCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjphZGRQYWNrZXQoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlID0gc291cmNlLT5xdWV1ZSgpOworCisgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKworICAgIGlmICghbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpIHsKKyAgICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQgPSB0cnVlOworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICB9IGVsc2UgaWYgKCh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICE9IG1OZXh0RXhwZWN0ZWRTZXFObykgeworI2lmIEJFX1ZFUkJPU0UKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIjsKKyNlbmRpZgorCisgICAgICAgIHJldHVybiBXUk9OR19TRVFVRU5DRV9OVU1CRVI7CisgICAgfQorCisgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgIGlmIChtUGFja2V0cy5zaXplKCkgPiAwICYmIHJ0cFRpbWUgIT0gbUFjY2Vzc1VuaXRSVFBUaW1lKSB7CisgICAgICAgIHN1Ym1pdEFjY2Vzc1VuaXQoKTsKKyAgICB9CisgICAgbUFjY2Vzc1VuaXRSVFBUaW1lID0gcnRwVGltZTsKKworICAgIGlmICghbUlzR2VuZXJpYykgeworICAgICAgICBtUGFja2V0cy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgQ0hFQ0tfR0UoYnVmZmVyLT5zaXplKCksIDJ1KTsKKyAgICAgICAgdW5zaWduZWQgQVVfaGVhZGVyc19sZW5ndGggPSBVMTZfQVQoYnVmZmVyLT5kYXRhKCkpOyAgLy8gaW4gYml0cworCisgICAgICAgIENIRUNLX0dFKGJ1ZmZlci0+c2l6ZSgpLCAyICsgKEFVX2hlYWRlcnNfbGVuZ3RoICsgNykgLyA4KTsKKworICAgICAgICBMaXN0PEFVSGVhZGVyPiBoZWFkZXJzOworCisgICAgICAgIEFCaXRSZWFkZXIgYml0cyhidWZmZXItPmRhdGEoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisgICAgICAgIHVuc2lnbmVkIG51bUJpdHNMZWZ0ID0gQVVfaGVhZGVyc19sZW5ndGg7CisKKyAgICAgICAgdW5zaWduZWQgQVVfc2VyaWFsID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKG51bUJpdHNMZWZ0IDwgbVNpemVMZW5ndGgpIHsgYnJlYWs7IH0KKworICAgICAgICAgICAgdW5zaWduZWQgQVVfc2l6ZSA9IGJpdHMuZ2V0Qml0cyhtU2l6ZUxlbmd0aCk7CisgICAgICAgICAgICBudW1CaXRzTGVmdCAtPSBtU2l6ZUxlbmd0aDsKKworICAgICAgICAgICAgc2l6ZV90IG4gPSBoZWFkZXJzLmVtcHR5KCkgPyBtSW5kZXhMZW5ndGggOiBtSW5kZXhEZWx0YUxlbmd0aDsKKyAgICAgICAgICAgIGlmIChudW1CaXRzTGVmdCA8IG4pIHsgYnJlYWs7IH0KKworICAgICAgICAgICAgdW5zaWduZWQgQVVfaW5kZXggPSBiaXRzLmdldEJpdHMobik7CisgICAgICAgICAgICBudW1CaXRzTGVmdCAtPSBuOworCisgICAgICAgICAgICBpZiAoaGVhZGVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQVVfc2VyaWFsID0gQVVfaW5kZXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFVX3NlcmlhbCArPSAxICsgQVVfaW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ1RTRGVsdGFMZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bUJpdHNMZWZ0IDwgMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLS1udW1CaXRzTGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoYml0cy5nZXRCaXRzKDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChudW1CaXRzTGVmdCA8IG1DVFNEZWx0YUxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYml0cy5za2lwQml0cyhtQ1RTRGVsdGFMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBudW1CaXRzTGVmdCAtPSBtQ1RTRGVsdGFMZW5ndGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURUU0RlbHRhTGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChudW1CaXRzTGVmdCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC0tbnVtQml0c0xlZnQ7CisgICAgICAgICAgICAgICAgaWYgKGJpdHMuZ2V0Qml0cygxKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobnVtQml0c0xlZnQgPCBtRFRTRGVsdGFMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMobURUU0RlbHRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgbnVtQml0c0xlZnQgLT0gbURUU0RlbHRhTGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1SYW5kb21BY2Nlc3NJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKG51bUJpdHNMZWZ0IDwgMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYml0cy5za2lwQml0cygxKTsKKyAgICAgICAgICAgICAgICAtLW51bUJpdHNMZWZ0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVN0cmVhbVN0YXRlSW5kaWNhdGlvbiA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobnVtQml0c0xlZnQgPCBtU3RyZWFtU3RhdGVJbmRpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaXRzLnNraXBCaXRzKG1TdHJlYW1TdGF0ZUluZGljYXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBVUhlYWRlciBoZWFkZXI7CisgICAgICAgICAgICBoZWFkZXIubVNpemUgPSBBVV9zaXplOworICAgICAgICAgICAgaGVhZGVyLm1TZXJpYWwgPSBBVV9zZXJpYWw7CisgICAgICAgICAgICBoZWFkZXJzLnB1c2hfYmFjayhoZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDIgKyAoQVVfaGVhZGVyc19sZW5ndGggKyA3KSAvIDg7CisKKyAgICAgICAgaWYgKG1BdXhpbGlhcnlEYXRhU2l6ZUxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIEFCaXRSZWFkZXIgYml0cyhidWZmZXItPmRhdGEoKSArIG9mZnNldCwgYnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOworCisgICAgICAgICAgICB1bnNpZ25lZCBhdXhTaXplID0gYml0cy5nZXRCaXRzKG1BdXhpbGlhcnlEYXRhU2l6ZUxlbmd0aCk7CisKKyAgICAgICAgICAgIG9mZnNldCArPSAobUF1eGlsaWFyeURhdGFTaXplTGVuZ3RoICsgYXV4U2l6ZSArIDcpIC8gODsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTGlzdDxBVUhlYWRlcj46Oml0ZXJhdG9yIGl0ID0gaGVhZGVycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IGhlYWRlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGNvbnN0IEFVSGVhZGVyICZoZWFkZXIgPSAqaXQ7CisKKyAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIGhlYWRlci5tU2l6ZSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoaGVhZGVyLm1TaXplKTsKKyAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0LCBoZWFkZXIubVNpemUpOworCisgICAgICAgICAgICBvZmZzZXQgKz0gaGVhZGVyLm1TaXplOworCisgICAgICAgICAgICBDb3B5VGltZXMoYWNjZXNzVW5pdCwgYnVmZmVyKTsKKyAgICAgICAgICAgIG1QYWNrZXRzLnB1c2hfYmFjayhhY2Nlc3NVbml0KTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX0VRKG9mZnNldCwgYnVmZmVyLT5zaXplKCkpOworICAgIH0KKworICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcjo6c3VibWl0QWNjZXNzVW5pdCgpIHsKKyAgICBDSEVDSyghbVBhY2tldHMuZW1wdHkoKSk7CisKKyNpZiBCRV9WRVJCT1NFCisgICAgTE9HKFZFUkJPU0UpIDw8ICJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoIiA8PCBtUGFja2V0cy5zaXplKCkgPDwgIiBuYWwgdW5pdHMpIjsKKyNlbmRpZgorCisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbVBhY2tldHMuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IG1QYWNrZXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHRvdGFsU2l6ZSArPSAoKml0KS0+c2l6ZSgpOworICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcih0b3RhbFNpemUpOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1QYWNrZXRzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtUGFja2V0cy5lbmQoKTsgKytpdCkgeworICAgICAgICBzcDxBQnVmZmVyPiBuYWwgPSAqaXQ7CisgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsIG5hbC0+ZGF0YSgpLCBuYWwtPnNpemUoKSk7CisgICAgICAgIG9mZnNldCArPSBuYWwtPnNpemUoKTsKKyAgICB9CisKKyAgICBDb3B5VGltZXMoYWNjZXNzVW5pdCwgKm1QYWNrZXRzLmJlZ2luKCkpOworCisjaWYgMAorICAgIHByaW50ZihtQWNjZXNzVW5pdERhbWFnZWQgPyAiWCIgOiAiLiIpOworICAgIGZmbHVzaChzdGRvdXQpOworI2VuZGlmCisKKyAgICBpZiAobUFjY2Vzc1VuaXREYW1hZ2VkKSB7CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRhbWFnZWQiLCB0cnVlKTsKKyAgICB9CisKKyAgICBtUGFja2V0cy5jbGVhcigpOworICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IGZhbHNlOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0T2JqZWN0KCJhY2Nlc3MtdW5pdCIsIGFjY2Vzc1VuaXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjphc3NlbWJsZU1vcmUoCisgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBc3NlbWJseVN0YXR1cyBzdGF0dXMgPSBhZGRQYWNrZXQoc291cmNlKTsKKyAgICBpZiAoc3RhdHVzID09IE1BTEZPUk1FRF9QQUNLRVQpIHsKKyAgICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjpwYWNrZXRMb3N0KCkgeworICAgIENIRUNLKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgInBhY2tldExvc3QgKGV4cGVjdGVkICIgPDwgbU5leHRFeHBlY3RlZFNlcU5vIDw8ICIpIjsKKworICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKK30KKwordm9pZCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5TXNnLT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJlb3MiLCB0cnVlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0YmJjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTVBFRzRfRUxFTV9BU1NFTUJMRVJfSF8KKworI2RlZmluZSBBX01QRUc0X0VMRU1fQVNTRU1CTEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CisKK3N0cnVjdCBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyIDogcHVibGljIEFSVFBBc3NlbWJsZXIgeworICAgIEFNUEVHNEVsZW1lbnRhcnlBc3NlbWJsZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgY29uc3QgQVN0cmluZyAmZGVzYywKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnBhcmFtcyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyKCk7CisKKyAgICB2aXJ0dWFsIEFzc2VtYmx5U3RhdHVzIGFzc2VtYmxlTW9yZShjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWNrZXRMb3N0KCk7CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisgICAgYm9vbCBtSXNHZW5lcmljOworICAgIEFTdHJpbmcgbVBhcmFtczsKKworICAgIHVuc2lnbmVkIG1TaXplTGVuZ3RoOworICAgIHVuc2lnbmVkIG1JbmRleExlbmd0aDsKKyAgICB1bnNpZ25lZCBtSW5kZXhEZWx0YUxlbmd0aDsKKyAgICB1bnNpZ25lZCBtQ1RTRGVsdGFMZW5ndGg7CisgICAgdW5zaWduZWQgbURUU0RlbHRhTGVuZ3RoOworICAgIGJvb2wgbVJhbmRvbUFjY2Vzc0luZGljYXRpb247CisgICAgdW5zaWduZWQgbVN0cmVhbVN0YXRlSW5kaWNhdGlvbjsKKyAgICB1bnNpZ25lZCBtQXV4aWxpYXJ5RGF0YVNpemVMZW5ndGg7CisgICAgYm9vbCBtSGFzQVVIZWFkZXI7CisKKyAgICB1aW50MzJfdCBtQWNjZXNzVW5pdFJUUFRpbWU7CisgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKKyAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CisgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1QYWNrZXRzOworCisgICAgQXNzZW1ibHlTdGF0dXMgYWRkUGFja2V0KGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpOworICAgIHZvaWQgc3VibWl0QWNjZXNzVW5pdCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTVBFRzRfRUxFTV9BU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Mzc5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC0wLDAgKzEsNzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFQYWNrZXRTb3VyY2UuaCIKKworI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgImF2Y191dGlscy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgeworICAgICAgICAgICAgKytzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKKworICAgICAgICBzaXplX3QgbGVuID0KKyAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKKworICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzID0gY29sb25Qb3MgKyAxOworICAgIH0KK30KKworc3RhdGljIHNwPEFCdWZmZXI+IGRlY29kZUhleChjb25zdCBBU3RyaW5nICZzKSB7CisgICAgaWYgKChzLnNpemUoKSAlIDIpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IG91dExlbiA9IHMuc2l6ZSgpIC8gMjsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW4pOworICAgIHVpbnQ4X3QgKm91dCA9IGJ1ZmZlci0+ZGF0YSgpOworCisgICAgdWludDhfdCBhY2N1bSA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNoYXIgYyA9IHMuY19zdHIoKVtpXTsKKyAgICAgICAgdW5zaWduZWQgdmFsdWU7CisgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgdmFsdWUgPSBjIC0gJzAnOworICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnYScgKyAxMDsKKyAgICAgICAgfSBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdGJykgeworICAgICAgICAgICAgdmFsdWUgPSBjIC0gJ0EnICsgMTA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGFjY3VtID0gKGFjY3VtIDw8IDQpIHwgdmFsdWU7CisKKyAgICAgICAgaWYgKGkgJiAxKSB7CisgICAgICAgICAgICAqb3V0KysgPSBhY2N1bTsKKworICAgICAgICAgICAgYWNjdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHNwPEFCdWZmZXI+IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3QgY2hhciAqcGFyYW1zLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgKndpZHRoID0gMDsKKyAgICAqaGVpZ2h0ID0gMDsKKworICAgIEFTdHJpbmcgdmFsOworICAgIGlmICghR2V0QXR0cmlidXRlKHBhcmFtcywgInByb2ZpbGUtbGV2ZWwtaWQiLCAmdmFsKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBwcm9maWxlTGV2ZWxJRCA9IGRlY29kZUhleCh2YWwpOworICAgIENIRUNLKHByb2ZpbGVMZXZlbElEICE9IE5VTEwpOworICAgIENIRUNLX0VRKHByb2ZpbGVMZXZlbElELT5zaXplKCksIDN1KTsKKworICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IHBhcmFtU2V0czsKKworICAgIHNpemVfdCBudW1TZXFQYXJhbWV0ZXJTZXRzID0gMDsKKyAgICBzaXplX3QgdG90YWxTZXFQYXJhbWV0ZXJTZXRTaXplID0gMDsKKyAgICBzaXplX3QgbnVtUGljUGFyYW1ldGVyU2V0cyA9IDA7CisgICAgc2l6ZV90IHRvdGFsUGljUGFyYW1ldGVyU2V0U2l6ZSA9IDA7CisKKyAgICBpZiAoIUdldEF0dHJpYnV0ZShwYXJhbXMsICJzcHJvcC1wYXJhbWV0ZXItc2V0cyIsICZ2YWwpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCBzdGFydCA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBzc2l6ZV90IGNvbW1hUG9zID0gdmFsLmZpbmQoIiwiLCBzdGFydCk7CisgICAgICAgIHNpemVfdCBlbmQgPSAoY29tbWFQb3MgPCAwKSA/IHZhbC5zaXplKCkgOiBjb21tYVBvczsKKworICAgICAgICBBU3RyaW5nIG5hbFN0cmluZyh2YWwsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9IGRlY29kZUJhc2U2NChuYWxTdHJpbmcpOworICAgICAgICBDSEVDSyhuYWwgIT0gTlVMTCk7CisgICAgICAgIENIRUNLX0dUKG5hbC0+c2l6ZSgpLCAwdSk7CisgICAgICAgIENIRUNLX0xFKG5hbC0+c2l6ZSgpLCA2NTUzNXUpOworCisgICAgICAgIHVpbnQ4X3QgbmFsVHlwZSA9IG5hbC0+ZGF0YSgpWzBdICYgMHgxZjsKKyAgICAgICAgaWYgKG51bVNlcVBhcmFtZXRlclNldHMgPT0gMCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW5hbFR5cGUsIDd1KTsKKyAgICAgICAgfSBlbHNlIGlmIChudW1QaWNQYXJhbWV0ZXJTZXRzID4gMCkgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW5hbFR5cGUsIDh1KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFsVHlwZSA9PSA3KSB7CisgICAgICAgICAgICArK251bVNlcVBhcmFtZXRlclNldHM7CisgICAgICAgICAgICB0b3RhbFNlcVBhcmFtZXRlclNldFNpemUgKz0gbmFsLT5zaXplKCk7CisgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW5hbFR5cGUsIDh1KTsKKyAgICAgICAgICAgICsrbnVtUGljUGFyYW1ldGVyU2V0czsKKyAgICAgICAgICAgIHRvdGFsUGljUGFyYW1ldGVyU2V0U2l6ZSArPSBuYWwtPnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtU2V0cy5wdXNoKG5hbCk7CisKKyAgICAgICAgaWYgKGNvbW1hUG9zIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzdGFydCA9IGNvbW1hUG9zICsgMTsKKyAgICB9CisKKyAgICBDSEVDS19MVChudW1TZXFQYXJhbWV0ZXJTZXRzLCAzMnUpOworICAgIENIRUNLX0xFKG51bVBpY1BhcmFtZXRlclNldHMsIDI1NXUpOworCisgICAgc2l6ZV90IGNzZFNpemUgPQorICAgICAgICAxICsgMyArIDEgKyAxCisgICAgICAgICsgMiAqIG51bVNlcVBhcmFtZXRlclNldHMgKyB0b3RhbFNlcVBhcmFtZXRlclNldFNpemUKKyAgICAgICAgKyAxICsgMiAqIG51bVBpY1BhcmFtZXRlclNldHMgKyB0b3RhbFBpY1BhcmFtZXRlclNldFNpemU7CisKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihjc2RTaXplKTsKKyAgICB1aW50OF90ICpvdXQgPSBjc2QtPmRhdGEoKTsKKworICAgICpvdXQrKyA9IDB4MDE7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbgorICAgIG1lbWNweShvdXQsIHByb2ZpbGVMZXZlbElELT5kYXRhKCksIDMpOworICAgIG91dCArPSAzOworICAgICpvdXQrKyA9ICgweDNmIDw8IDIpIHwgMTsgIC8vIGxlbmd0aFNpemUgPT0gMiBieXRlcworICAgICpvdXQrKyA9IDB4ZTAgfCBudW1TZXFQYXJhbWV0ZXJTZXRzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXFQYXJhbWV0ZXJTZXRzOyArK2kpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbmFsID0gcGFyYW1TZXRzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgKm91dCsrID0gbmFsLT5zaXplKCkgPj4gODsKKyAgICAgICAgKm91dCsrID0gbmFsLT5zaXplKCkgJiAweGZmOworCisgICAgICAgIG1lbWNweShvdXQsIG5hbC0+ZGF0YSgpLCBuYWwtPnNpemUoKSk7CisKKyAgICAgICAgb3V0ICs9IG5hbC0+c2l6ZSgpOworCisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIEZpbmRBVkNEaW1lbnNpb25zKG5hbCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgImRpbWVuc2lvbnMgIiA8PCAqd2lkdGggPDwgIngiIDw8ICpoZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqb3V0KysgPSBudW1QaWNQYXJhbWV0ZXJTZXRzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QaWNQYXJhbWV0ZXJTZXRzOyArK2kpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbmFsID0gcGFyYW1TZXRzLmVkaXRJdGVtQXQoaSArIG51bVNlcVBhcmFtZXRlclNldHMpOworCisgICAgICAgICpvdXQrKyA9IG5hbC0+c2l6ZSgpID4+IDg7CisgICAgICAgICpvdXQrKyA9IG5hbC0+c2l6ZSgpICYgMHhmZjsKKworICAgICAgICBtZW1jcHkob3V0LCBuYWwtPmRhdGEoKSwgbmFsLT5zaXplKCkpOworCisgICAgICAgIG91dCArPSBuYWwtPnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisKKyAgICByZXR1cm4gY3NkOworfQorCitzcDxBQnVmZmVyPiBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoY29uc3QgY2hhciAqcGFyYW1zKSB7CisgICAgQVN0cmluZyB2YWw7CisgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHBhcmFtcywgImNvbmZpZyIsICZ2YWwpKTsKKworICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGRlY29kZUhleCh2YWwpOworICAgIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKKyAgICBDSEVDS19HRShjb25maWctPnNpemUoKSwgNHUpOworCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGNvbmZpZy0+ZGF0YSgpOworICAgIHVpbnQzMl90IHggPSBkYXRhWzBdIDw8IDI0IHwgZGF0YVsxXSA8PCAxNiB8IGRhdGFbMl0gPDwgOCB8IGRhdGFbM107CisgICAgeCA9ICh4ID4+IDEpICYgMHhmZmZmOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKKyAgICAgICAgMHgwMywgMjIsCisgICAgICAgIDB4MDAsIDB4MDAsICAgICAvLyBFU19JRAorICAgICAgICAweDAwLCAgICAgICAgICAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisKKyAgICAgICAgMHgwNCwgMTcsCisgICAgICAgIDB4NDAsICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKworICAgICAgICAweDA1LCAyLAorICAgICAgICAvLyBBdWRpb1NwZWNpZmljSW5mbyBmb2xsb3dzCisgICAgfTsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKHNpemVvZihrU3RhdGljRVNEUykgKyAyKTsKKyAgICBtZW1jcHkoY3NkLT5kYXRhKCksIGtTdGF0aWNFU0RTLCBzaXplb2Yoa1N0YXRpY0VTRFMpKTsKKyAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9ICh4ID4+IDgpICYgMHhmZjsKKyAgICBjc2QtPmRhdGEoKVtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPSB4ICYgMHhmZjsKKworICAgIC8vIGhleGR1bXAoY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBjc2Q7Cit9CisKKy8vIEZyb20gbXBlZzQtZ2VuZXJpYyBjb25maWd1cmF0aW9uIGRhdGEuCitzcDxBQnVmZmVyPiBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEyKGNvbnN0IGNoYXIgKnBhcmFtcykgeworICAgIEFTdHJpbmcgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgb2JqZWN0VHlwZTsKKyAgICBpZiAoR2V0QXR0cmlidXRlKHBhcmFtcywgIm9iamVjdFR5cGUiLCAmdmFsKSkgeworICAgICAgICBjb25zdCBjaGFyICpzID0gdmFsLmNfc3RyKCk7CisgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgb2JqZWN0VHlwZSA9IHN0cnRvdWwocywgJmVuZCwgMTApOworICAgICAgICBDSEVDSyhlbmQgPiBzICYmICplbmQgPT0gJ1wwJyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2JqZWN0VHlwZSA9IDB4NDA7ICAvLyBBdWRpbyBJU08vSUVDIDE0NDk2LTMKKyAgICB9CisKKyAgICBDSEVDSyhHZXRBdHRyaWJ1dGUocGFyYW1zLCAiY29uZmlnIiwgJnZhbCkpOworCisgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gZGVjb2RlSGV4KHZhbCk7CisgICAgQ0hFQ0soY29uZmlnICE9IE5VTEwpOworCisgICAgLy8gTWFrZSBzdXJlIHNpemUgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUgYW5kIGRvZXNuJ3QgaGF2ZSB0bworICAgIC8vIGJlIGVuY29kZWQuCisgICAgQ0hFQ0tfTFQoMjAgKyBjb25maWctPnNpemUoKSwgMTI4dSk7CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gY29uZmlnLT5kYXRhKCk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0geworICAgICAgICAweDAzLCAyMiwKKyAgICAgICAgMHgwMCwgMHgwMCwgICAgIC8vIEVTX0lECisgICAgICAgIDB4MDAsICAgICAgICAgICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKworICAgICAgICAweDA0LCAxNywKKyAgICAgICAgMHg0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvIElTTy9JRUMgMTQ0OTYtMworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCisgICAgICAgIDB4MDUsIDIsCisgICAgICAgIC8vIEF1ZGlvU3BlY2lmaWNJbmZvIGZvbGxvd3MKKyAgICB9OworCisgICAgc3A8QUJ1ZmZlcj4gY3NkID0gbmV3IEFCdWZmZXIoc2l6ZW9mKGtTdGF0aWNFU0RTKSArIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICB1aW50OF90ICpkc3QgPSBjc2QtPmRhdGEoKTsKKyAgICAqZHN0KysgPSAweDAzOworICAgICpkc3QrKyA9IDIwICsgY29uZmlnLT5zaXplKCk7CisgICAgKmRzdCsrID0gMHgwMDsgIC8vIEVTX0lECisgICAgKmRzdCsrID0gMHgwMDsKKyAgICAqZHN0KysgPSAweDAwOyAgLy8gc3RyZWFtRGVwZW5kZW5jZUZsYWcsIFVSTF9GbGFnLCBPQ1JzdHJlYW1GbGFnCisgICAgKmRzdCsrID0gMHgwNDsKKyAgICAqZHN0KysgPSAxNSArIGNvbmZpZy0+c2l6ZSgpOworICAgICpkc3QrKyA9IG9iamVjdFR5cGU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjsgKytpKSB7ICpkc3QrKyA9IDB4MDA7IH0KKyAgICAqZHN0KysgPSAweDA1OworICAgICpkc3QrKyA9IGNvbmZpZy0+c2l6ZSgpOworICAgIG1lbWNweShkc3QsIGNvbmZpZy0+ZGF0YSgpLCBjb25maWctPnNpemUoKSk7CisKKyAgICAvLyBoZXhkdW1wKGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisKKyAgICByZXR1cm4gY3NkOworfQorCitzdGF0aWMgc2l6ZV90IEdldFNpemVXaWR0aChzaXplX3QgeCkgeworICAgIHNpemVfdCBuID0gMTsKKyAgICB3aGlsZSAoeCA+IDEyNykgeworICAgICAgICArK247CisgICAgICAgIHggPj49IDc7CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgdWludDhfdCAqRW5jb2RlU2l6ZSh1aW50OF90ICpkc3QsIHNpemVfdCB4KSB7CisgICAgd2hpbGUgKHggPiAxMjcpIHsKKyAgICAgICAgKmRzdCsrID0gKHggJiAweDdmKSB8IDB4ODA7CisgICAgICAgIHggPj49IDc7CisgICAgfQorICAgICpkc3QrKyA9IHg7CisgICAgcmV0dXJuIGRzdDsKK30KKworc3RhdGljIGJvb2wgRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmY29uZmlnLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgKndpZHRoID0gMDsKKyAgICAqaGVpZ2h0ID0gMDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IGNvbmZpZy0+ZGF0YSgpOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIGJvb2wgZm91bmRWT0wgPSBmYWxzZTsKKyAgICB3aGlsZSAob2Zmc2V0ICsgMyA8IGNvbmZpZy0+c2l6ZSgpKSB7CisgICAgICAgIGlmIChtZW1jbXAoIlx4MDBceDAwXHgwMSIsICZwdHJbb2Zmc2V0XSwgMykKKyAgICAgICAgICAgICAgICB8fCAocHRyW29mZnNldCArIDNdICYgMHhmMCkgIT0gMHgyMCkgeworICAgICAgICAgICAgKytvZmZzZXQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvdW5kVk9MID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFmb3VuZFZPTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicigmcHRyW29mZnNldCArIDRdLCBjb25maWctPnNpemUoKSAtIG9mZnNldCAtIDQpOworICAgIGJyLnNraXBCaXRzKDEpOyAgLy8gcmFuZG9tX2FjY2Vzc2libGVfdm9sCisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiA9IGJyLmdldEJpdHMoOCk7CisKKyAgICBDSEVDS19ORSh2aWRlb19vYmplY3RfdHlwZV9pbmRpY2F0aW9uLAorICAgICAgICAgICAgIDB4MjF1IC8qIEZpbmUgR3JhbnVsYXJpdHkgU2NhbGFibGUgKi8pOworCisgICAgdW5zaWduZWQgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkOworICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eTsKKyAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeworICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgPSBici5nZXRCaXRzKDMpOworICAgIH0KKyAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faW5mbyA9IGJyLmdldEJpdHMoNCk7CisgICAgaWYgKGFzcGVjdF9yYXRpb19pbmZvID09IDB4MGYgLyogZXh0ZW5kZWQgUEFSICovKSB7CisgICAgICAgIGJyLnNraXBCaXRzKDgpOyAgLy8gcGFyX3dpZHRoCisgICAgICAgIGJyLnNraXBCaXRzKDgpOyAgLy8gcGFyX2hlaWdodAorICAgIH0KKyAgICBpZiAoYnIuZ2V0Qml0cygxKSkgeyAgLy8gdm9sX2NvbnRyb2xfcGFyYW1ldGVycworICAgICAgICBici5za2lwQml0cygyKTsgIC8vIGNocm9tYV9mb3JtYXQKKyAgICAgICAgYnIuc2tpcEJpdHMoMSk7ICAvLyBsb3dfZGVsYXkKKyAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIHZidl9wYXJhbWV0ZXJzCisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisgICAgfQorICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IGJyLmdldEJpdHMoMik7CisgICAgQ0hFQ0tfRVEodmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlLCAweDAwdSAvKiByZWN0YW5ndWxhciAqLyk7CisKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICB1bnNpZ25lZCB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA9IGJyLmdldEJpdHMoMTYpOworICAgIENIRUNLKGJyLmdldEJpdHMoMSkpOyAgLy8gbWFya2VyX2JpdAorCisgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsgIC8vIGZpeGVkX3ZvcF9yYXRlCisgICAgICAgIC8vIHJhbmdlIFswLi52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbikKKworICAgICAgICAvLyB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbgorICAgICAgICAvLyAyID0+IDAuLjEsIDEgYml0CisgICAgICAgIC8vIDMgPT4gMC4uMiwgMiBiaXRzCisgICAgICAgIC8vIDQgPT4gMC4uMywgMiBiaXRzCisgICAgICAgIC8vIDUgPT4gMC4uNCwgMyBiaXRzCisgICAgICAgIC8vIC4uLgorCisgICAgICAgIENIRUNLX0dUKHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uLCAwdSk7CisgICAgICAgIC0tdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb247CisKKyAgICAgICAgdW5zaWduZWQgbnVtQml0cyA9IDA7CisgICAgICAgIHdoaWxlICh2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiA+IDApIHsKKyAgICAgICAgICAgICsrbnVtQml0czsKKyAgICAgICAgICAgIHZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uID4+PSAxOworICAgICAgICB9CisKKyAgICAgICAgYnIuc2tpcEJpdHMobnVtQml0cyk7ICAvLyBmaXhlZF92b3BfdGltZV9pbmNyZW1lbnQKKyAgICB9CisKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggPSBici5nZXRCaXRzKDEzKTsKKyAgICBDSEVDSyhici5nZXRCaXRzKDEpKTsgIC8vIG1hcmtlcl9iaXQKKyAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CisKKyAgICB1bnNpZ25lZCBpbnRlcmxhY2VkID0gYnIuZ2V0Qml0cygxKTsKKworICAgICp3aWR0aCA9IHZpZGVvX29iamVjdF9sYXllcl93aWR0aDsKKyAgICAqaGVpZ2h0ID0gdmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodDsKKworICAgIExPRyhJTkZPKSA8PCAiVk9MIGRpbWVuc2lvbnMgPSAiIDw8ICp3aWR0aCA8PCAieCIgPDwgKmhlaWdodDsKKworICAgIHJldHVybiB0cnVlOworfQorCitzcDxBQnVmZmVyPiBNYWtlTVBFRzRWaWRlb0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICAqd2lkdGggPSAwOworICAgICpoZWlnaHQgPSAwOworCisgICAgQVN0cmluZyB2YWw7CisgICAgQ0hFQ0soR2V0QXR0cmlidXRlKHBhcmFtcywgImNvbmZpZyIsICZ2YWwpKTsKKworICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGRlY29kZUhleCh2YWwpOworICAgIENIRUNLKGNvbmZpZyAhPSBOVUxMKTsKKworICAgIGlmICghRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKGNvbmZpZywgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc2l6ZV90IGxlbjEgPSBjb25maWctPnNpemUoKSArIEdldFNpemVXaWR0aChjb25maWctPnNpemUoKSkgKyAxOworICAgIHNpemVfdCBsZW4yID0gbGVuMSArIEdldFNpemVXaWR0aChsZW4xKSArIDEgKyAxMzsKKyAgICBzaXplX3QgbGVuMyA9IGxlbjIgKyBHZXRTaXplV2lkdGgobGVuMikgKyAxICsgMzsKKworICAgIHNwPEFCdWZmZXI+IGNzZCA9IG5ldyBBQnVmZmVyKGxlbjMpOworICAgIHVpbnQ4X3QgKmRzdCA9IGNzZC0+ZGF0YSgpOworICAgICpkc3QrKyA9IDB4MDM7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGxlbjIgKyAzKTsKKyAgICAqZHN0KysgPSAweDAwOyAgLy8gRVNfSUQKKyAgICAqZHN0KysgPSAweDAwOworICAgICpkc3QrKyA9IDB4MDA7ICAvLyBzdHJlYW1EZXBlbmRlbmNlRmxhZywgVVJMX0ZsYWcsIE9DUnN0cmVhbUZsYWcKKworICAgICpkc3QrKyA9IDB4MDQ7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGxlbjEgKyAxMyk7CisgICAgKmRzdCsrID0gMHgwMTsgIC8vIFZpZGVvIElTTy9JRUMgMTQ0OTYtMiBTaW1wbGUgUHJvZmlsZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMTI7ICsraSkgeworICAgICAgICAqZHN0KysgPSAweDAwOworICAgIH0KKworICAgICpkc3QrKyA9IDB4MDU7CisgICAgZHN0ID0gRW5jb2RlU2l6ZShkc3QsIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICBtZW1jcHkoZHN0LCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOworICAgIGRzdCArPSBjb25maWctPnNpemUoKTsKKworICAgIC8vIGhleGR1bXAoY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKworICAgIHJldHVybiBjc2Q7Cit9CisKK3N0YXRpYyBib29sIEdldENsb2NrUmF0ZShjb25zdCBBU3RyaW5nICZkZXNjLCB1aW50MzJfdCAqY2xvY2tSYXRlKSB7CisgICAgc3NpemVfdCBzbGFzaFBvcyA9IGRlc2MuZmluZCgiLyIpOworICAgIGlmIChzbGFzaFBvcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnMgPSBkZXNjLmNfc3RyKCkgKyBzbGFzaFBvcyArIDE7CisKKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgbG9uZyB4ID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisKKyAgICBpZiAoZW5kID09IHMgfHwgKCplbmQgIT0gJ1wwJyAmJiAqZW5kICE9ICcvJykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpjbG9ja1JhdGUgPSB4OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0FQYWNrZXRTb3VyY2U6OkFQYWNrZXRTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4KQorICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICAgIG1Gb3JtYXQobmV3IE1ldGFEYXRhKSwKKyAgICAgIG1FT1NSZXN1bHQoT0spLAorICAgICAgbVJUUFRpbWVCYXNlKDApLAorICAgICAgbU5vcm1hbFBsYXlUaW1lQmFzZVVzKDApLAorICAgICAgbUxhc3ROb3JtYWxQbGF5VGltZVVzKDApIHsKKyAgICB1bnNpZ25lZCBsb25nIFBUOworICAgIEFTdHJpbmcgZGVzYzsKKyAgICBBU3RyaW5nIHBhcmFtczsKKyAgICBzZXNzaW9uRGVzYy0+Z2V0Rm9ybWF0VHlwZShpbmRleCwgJlBULCAmZGVzYywgJnBhcmFtcyk7CisKKyAgICBDSEVDSyhHZXRDbG9ja1JhdGUoZGVzYywgJm1DbG9ja1JhdGUpKTsKKworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAoc2Vzc2lvbkRlc2MtPmdldER1cmF0aW9uVXMoJmR1cmF0aW9uVXMpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCA2MCAqIDYwICogMTAwMDAwMGxsKTsKKyAgICB9CisKKyAgICBtSW5pdENoZWNrID0gT0s7CisgICAgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjQvIiwgNSkpIHsKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoIXNlc3Npb25EZXNjLT5nZXREaW1lbnNpb25zKGluZGV4LCBQVCwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgd2lkdGggPSAtMTsKKyAgICAgICAgICAgIGhlaWdodCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNXaWR0aCwgZW5jSGVpZ2h0OworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1NwZWNpZmljRGF0YSA9CisgICAgICAgICAgICBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEocGFyYW1zLmNfc3RyKCksICZlbmNXaWR0aCwgJmVuY0hlaWdodCk7CisKKyAgICAgICAgaWYgKGNvZGVjU3BlY2lmaWNEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBJZiBubyBleHBsaWNpdCB3aWR0aC9oZWlnaHQgZ2l2ZW4gaW4gdGhlIHNkcCwgdXNlIHRoZSBkaW1lbnNpb25zCisgICAgICAgICAgICAgICAgLy8gZXh0cmFjdGVkIGZyb20gdGhlIGZpcnN0IHNlcXVlbmNlIHBhcmFtZXRlciBzZXQuCisgICAgICAgICAgICAgICAgd2lkdGggPSBlbmNXaWR0aDsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBlbmNIZWlnaHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlBVkNDLCAwLAorICAgICAgICAgICAgICAgICAgICBjb2RlY1NwZWNpZmljRGF0YS0+ZGF0YSgpLCBjb2RlY1NwZWNpZmljRGF0YS0+c2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh3aWR0aCA8IDApIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0yMDAwLyIsIDEwKQorICAgICAgICAgICAgfHwgIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0xOTk4LyIsIDEwKSkgeworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CisKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBpZiAoIXNlc3Npb25EZXNjLT5nZXREaW1lbnNpb25zKGluZGV4LCBQVCwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJNUDRBLUxBVE0vIiwgMTApKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHM7CisgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb246OlBhcnNlRm9ybWF0RGVzYygKKyAgICAgICAgICAgICAgICBkZXNjLmNfc3RyKCksICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworCisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjU3BlY2lmaWNEYXRhID0KKyAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShwYXJhbXMuY19zdHIoKSk7CisKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICBrS2V5RVNEUywgMCwKKyAgICAgICAgICAgICAgICBjb2RlY1NwZWNpZmljRGF0YS0+ZGF0YSgpLCBjb2RlY1NwZWNpZmljRGF0YS0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkFNUi8iLCA0KSkgeworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKKworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzOworICAgICAgICBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpQYXJzZUZvcm1hdERlc2MoCisgICAgICAgICAgICAgICAgZGVzYy5jX3N0cigpLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzKTsKKworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bUNoYW5uZWxzKTsKKworICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSA4MDAwIHx8IG51bUNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiQU1SLVdCLyIsIDcpKSB7CisgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpOworCisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHM7CisgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb246OlBhcnNlRm9ybWF0RGVzYygKKyAgICAgICAgICAgICAgICBkZXNjLmNfc3RyKCksICZzYW1wbGVSYXRlLCAmbnVtQ2hhbm5lbHMpOworCisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworCisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IDE2MDAwIHx8IG51bUNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiTVA0Vi1FUy8iLCA4KSkgeworICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOworCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKCFzZXNzaW9uRGVzYy0+Z2V0RGltZW5zaW9ucyhpbmRleCwgUFQsICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIHdpZHRoID0gLTE7CisgICAgICAgICAgICBoZWlnaHQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZW5jV2lkdGgsIGVuY0hlaWdodDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNTcGVjaWZpY0RhdGEgPQorICAgICAgICAgICAgTWFrZU1QRUc0VmlkZW9Db2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNfc3RyKCksICZlbmNXaWR0aCwgJmVuY0hlaWdodCk7CisKKyAgICAgICAgaWYgKGNvZGVjU3BlY2lmaWNEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCAwLAorICAgICAgICAgICAgICAgICAgICBjb2RlY1NwZWNpZmljRGF0YS0+ZGF0YSgpLCBjb2RlY1NwZWNpZmljRGF0YS0+c2l6ZSgpKTsKKworICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gZW5jV2lkdGg7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZW5jSGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHdpZHRoIDwgMCkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCB3aWR0aCk7CisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJtcGVnNC1nZW5lcmljLyIsIDE0KSkgeworICAgICAgICBBU3RyaW5nIHZhbDsKKyAgICAgICAgaWYgKCFHZXRBdHRyaWJ1dGUocGFyYW1zLmNfc3RyKCksICJtb2RlIiwgJnZhbCkKKyAgICAgICAgICAgICAgICB8fCAoc3RyY2FzZWNtcCh2YWwuY19zdHIoKSwgIkFBQy1sYnIiKQorICAgICAgICAgICAgICAgICAgICAmJiBzdHJjYXNlY21wKHZhbC5jX3N0cigpLCAiQUFDLWhiciIpKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBudW1DaGFubmVsczsKKyAgICAgICAgQVNlc3Npb25EZXNjcmlwdGlvbjo6UGFyc2VGb3JtYXREZXNjKAorICAgICAgICAgICAgICAgIGRlc2MuY19zdHIoKSwgJnNhbXBsZVJhdGUsICZudW1DaGFubmVscyk7CisKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNTcGVjaWZpY0RhdGEgPQorICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhMihwYXJhbXMuY19zdHIoKSk7CisKKyAgICAgICAgbUZvcm1hdC0+c2V0RGF0YSgKKyAgICAgICAgICAgICAgICBrS2V5RVNEUywgMCwKKyAgICAgICAgICAgICAgICBjb2RlY1NwZWNpZmljRGF0YS0+ZGF0YSgpLCBjb2RlY1NwZWNpZmljRGF0YS0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorfQorCitBUGFja2V0U291cmNlOjp+QVBhY2tldFNvdXJjZSgpIHsKK30KKworc3RhdHVzX3QgQVBhY2tldFNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBBUGFja2V0U291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBUGFja2V0U291cmNlOjpzdG9wKCkgeworICAgIHJldHVybiBPSzsKK30KKworc3A8TWV0YURhdGE+IEFQYWNrZXRTb3VyY2U6OmdldEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbUZvcm1hdDsKK30KKworc3RhdHVzX3QgQVBhY2tldFNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICopIHsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgd2hpbGUgKG1FT1NSZXN1bHQgPT0gT0sgJiYgbUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiBidWZmZXIgPSAqbUJ1ZmZlcnMuYmVnaW4oKTsKKworICAgICAgICB1cGRhdGVOb3JtYWxQbGF5VGltZV9sKGJ1ZmZlcik7CisKKyAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworCisgICAgICAgIG1lZGlhQnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICAgICAgbWVtY3B5KG1lZGlhQnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgICpvdXQgPSBtZWRpYUJ1ZmZlcjsKKworICAgICAgICBtQnVmZmVycy5lcmFzZShtQnVmZmVycy5iZWdpbigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHJldHVybiBtRU9TUmVzdWx0OworfQorCit2b2lkIEFQYWNrZXRTb3VyY2U6OnVwZGF0ZU5vcm1hbFBsYXlUaW1lX2woY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBtTGFzdE5vcm1hbFBsYXlUaW1lVXMgPQorICAgICAgICAoKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpbVJUUFRpbWVCYXNlKSAvIG1DbG9ja1JhdGUpCisgICAgICAgICAgICAqIDEwMDAwMDBsbAorICAgICAgICAgICAgKyBtTm9ybWFsUGxheVRpbWVCYXNlVXM7Cit9CisKK3ZvaWQgQVBhY2tldFNvdXJjZTo6cXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpbnQzMl90IGRhbWFnZWQ7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRhbWFnZWQiLCAmZGFtYWdlZCkgJiYgZGFtYWdlZCkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgImRpc2NhcmRpbmcgZGFtYWdlZCBBVSI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1CdWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgQVBhY2tldFNvdXJjZTo6c2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCkgeworICAgIENIRUNLKHJlc3VsdCAhPSBPSyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1FT1NSZXN1bHQgPSByZXN1bHQ7CisgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBBUGFja2V0U291cmNlOjpmbHVzaFF1ZXVlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKK30KKworaW50NjRfdCBBUGFja2V0U291cmNlOjpnZXROb3JtYWxQbGF5VGltZVVzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1MYXN0Tm9ybWFsUGxheVRpbWVVczsKK30KKwordm9pZCBBUGFja2V0U291cmNlOjpzZXROb3JtYWxQbGF5VGltZU1hcHBpbmcoCisgICAgICAgIHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3Qgbm9ybWFsUGxheVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBtUlRQVGltZUJhc2UgPSBydHBUaW1lOworICAgIG1Ob3JtYWxQbGF5VGltZUJhc2VVcyA9IG5vcm1hbFBsYXlUaW1lVXM7Cit9CisKK2ludDY0X3QgQVBhY2tldFNvdXJjZTo6Z2V0UXVldWVEdXJhdGlvblVzKGJvb2wgKmVvcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqZW9zID0gKG1FT1NSZXN1bHQgIT0gT0spOworCisgICAgaWYgKG1CdWZmZXJzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gZmlyc3QgPSAqbUJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBjb25zdCBzcDxBQnVmZmVyPiBsYXN0ID0gKi0tbUJ1ZmZlcnMuZW5kKCk7CisKKyAgICBpbnQ2NF90IGZpcnN0VGltZVVzOworICAgIENIRUNLKGZpcnN0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmZpcnN0VGltZVVzKSk7CisKKyAgICBpbnQ2NF90IGxhc3RUaW1lVXM7CisgICAgQ0hFQ0sobGFzdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXN0VGltZVVzKSk7CisKKyAgICBDSEVDS19HRShsYXN0VGltZVVzLCBmaXJzdFRpbWVVcyk7CisKKyAgICByZXR1cm4gbGFzdFRpbWVVcyAtIGZpcnN0VGltZVVzOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzZkZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9QQUNLRVRfU09VUkNFX0hfCisKKyNkZWZpbmUgQV9QQUNLRVRfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFTZXNzaW9uRGVzY3JpcHRpb247CisKK3N0cnVjdCBBUGFja2V0U291cmNlIDogcHVibGljIE1lZGlhU291cmNlIHsKKyAgICBBUGFja2V0U291cmNlKGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4KTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZvaWQgcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgc2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCk7CisKKyAgICB2b2lkIGZsdXNoUXVldWUoKTsKKworICAgIGludDY0X3QgZ2V0Tm9ybWFsUGxheVRpbWVVcygpOworCisgICAgdm9pZCBzZXROb3JtYWxQbGF5VGltZU1hcHBpbmcoCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lLCBpbnQ2NF90IG5vcm1hbFBsYXlUaW1lVXMpOworCisgICAgaW50NjRfdCBnZXRRdWV1ZUR1cmF0aW9uVXMoYm9vbCAqZW9zKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFQYWNrZXRTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBzcDxNZXRhRGF0YT4gbUZvcm1hdDsKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUJ1ZmZlcnM7CisgICAgc3RhdHVzX3QgbUVPU1Jlc3VsdDsKKworICAgIHVpbnQzMl90IG1DbG9ja1JhdGU7CisKKyAgICB1aW50MzJfdCBtUlRQVGltZUJhc2U7CisgICAgaW50NjRfdCBtTm9ybWFsUGxheVRpbWVCYXNlVXM7CisKKyAgICBpbnQ2NF90IG1MYXN0Tm9ybWFsUGxheVRpbWVVczsKKworICAgIHZvaWQgdXBkYXRlTm9ybWFsUGxheVRpbWVfbChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFQYWNrZXRTb3VyY2UpOworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfUEFDS0VUX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhMmIzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBUlRQQXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBpbnQ2NF90IGdldE5vd1VzKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgcmV0dXJuIChpbnQ2NF90KXR2LnR2X3VzZWMgKyB0di50dl9zZWMgKiAxMDAwMDAwbGw7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFSVFBBc3NlbWJsZXIoKQorICAgIDogbUZpcnN0RmFpbHVyZVRpbWVVcygtMSkgeworfQorCit2b2lkIEFSVFBBc3NlbWJsZXI6Om9uUGFja2V0UmVjZWl2ZWQoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIEFzc2VtYmx5U3RhdHVzIHN0YXR1czsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHN0YXR1cyA9IGFzc2VtYmxlTW9yZShzb3VyY2UpOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gV1JPTkdfU0VRVUVOQ0VfTlVNQkVSKSB7CisgICAgICAgICAgICBpZiAobUZpcnN0RmFpbHVyZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdldE5vd1VzKCkgLSBtRmlyc3RGYWlsdXJlVGltZVVzID4gMTAwMDBsbCkgeworICAgICAgICAgICAgICAgICAgICBtRmlyc3RGYWlsdXJlVGltZVVzID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTE9HKFZFUkJPU0UpIDw8ICJ3YWl0ZWQgdG9vIGxvbmcgZm9yIHBhY2tldC4iOworICAgICAgICAgICAgICAgICAgICBwYWNrZXRMb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUZpcnN0RmFpbHVyZVRpbWVVcyA9IGdldE5vd1VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GaXJzdEZhaWx1cmVUaW1lVXMgPSAtMTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIEFSVFBBc3NlbWJsZXI6OkNvcHlUaW1lcyhjb25zdCBzcDxBQnVmZmVyPiAmdG8sIGNvbnN0IHNwPEFCdWZmZXI+ICZmcm9tKSB7CisgICAgdWludDY0X3QgbnRwVGltZTsKKyAgICBDSEVDSyhmcm9tLT5tZXRhKCktPmZpbmRJbnQ2NCgibnRwLXRpbWUiLCAoaW50NjRfdCAqKSZudHBUaW1lKSk7CisKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGZyb20tPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgIHRvLT5tZXRhKCktPnNldEludDY0KCJudHAtdGltZSIsIG50cFRpbWUpOworICAgIHRvLT5tZXRhKCktPnNldEludDMyKCJydHAtdGltZSIsIHJ0cFRpbWUpOworCisgICAgLy8gQ29weSB0aGUgc2VxIG51bWJlci4KKyAgICB0by0+c2V0SW50MzJEYXRhKGZyb20tPmludDMyRGF0YSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYTE4NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRQX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfUlRQX0FTU0VNQkxFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBUlRQU291cmNlOworCitzdHJ1Y3QgQVJUUEFzc2VtYmxlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIEFzc2VtYmx5U3RhdHVzIHsKKyAgICAgICAgTUFMRk9STUVEX1BBQ0tFVCwKKyAgICAgICAgV1JPTkdfU0VRVUVOQ0VfTlVNQkVSLAorICAgICAgICBOT1RfRU5PVUdIX0RBVEEsCisgICAgICAgIE9LCisgICAgfTsKKworICAgIEFSVFBBc3NlbWJsZXIoKTsKKworICAgIHZvaWQgb25QYWNrZXRSZWNlaXZlZChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25CeWVSZWNlaXZlZCgpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgQXNzZW1ibHlTdGF0dXMgYXNzZW1ibGVNb3JlKGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpID0gMDsKKworICAgIHN0YXRpYyB2b2lkIENvcHlUaW1lcyhjb25zdCBzcDxBQnVmZmVyPiAmdG8sIGNvbnN0IHNwPEFCdWZmZXI+ICZmcm9tKTsKKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1GaXJzdEZhaWx1cmVUaW1lVXM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQQXNzZW1ibGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzllMDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDYzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFVEUFNpemUgPSAxNTAwOworCitzdGF0aWMgdWludDE2X3QgdTE2YXQoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOworfQorCitzdGF0aWMgdWludDMyX3QgdTMyYXQoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHJldHVybiB1MTZhdChkYXRhKSA8PCAxNiB8IHUxNmF0KCZkYXRhWzJdKTsKK30KKworc3RhdGljIHVpbnQ2NF90IHU2NGF0KGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICByZXR1cm4gKHVpbnQ2NF90KSh1MzJhdChkYXRhKSkgPDwgMzIgfCB1MzJhdCgmZGF0YVs0XSk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgaW50NjRfdCBBUlRQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBsbDsKKworc3RydWN0IEFSVFBDb25uZWN0aW9uOjpTdHJlYW1JbmZvIHsKKyAgICBpbnQgbVJUUFNvY2tldDsKKyAgICBpbnQgbVJUQ1BTb2NrZXQ7CisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gbVNlc3Npb25EZXNjOworICAgIHNpemVfdCBtSW5kZXg7CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlNc2c7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIHNwPEFSVFBTb3VyY2U+ID4gbVNvdXJjZXM7CisKKyAgICBpbnQzMl90IG1OdW1SVENQUGFja2V0c1JlY2VpdmVkOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUmVtb3RlUlRDUEFkZHI7CisKKyAgICBib29sIG1Jc0luamVjdGVkOworfTsKKworQVJUUENvbm5lY3Rpb246OkFSVFBDb25uZWN0aW9uKHVpbnQzMl90IGZsYWdzKQorICAgIDogbUZsYWdzKGZsYWdzKSwKKyAgICAgIG1Qb2xsRXZlbnRQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMoLTEpIHsKK30KKworQVJUUENvbm5lY3Rpb246On5BUlRQQ29ubmVjdGlvbigpIHsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6YWRkU3RyZWFtKAorICAgICAgICBpbnQgcnRwU29ja2V0LCBpbnQgcnRjcFNvY2tldCwKKyAgICAgICAgY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJnNlc3Npb25EZXNjLAorICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBib29sIGluamVjdGVkKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEFkZFN0cmVhbSwgaWQoKSk7CisgICAgbXNnLT5zZXRJbnQzMigicnRwLXNvY2tldCIsIHJ0cFNvY2tldCk7CisgICAgbXNnLT5zZXRJbnQzMigicnRjcC1zb2NrZXQiLCBydGNwU29ja2V0KTsKKyAgICBtc2ctPnNldE9iamVjdCgic2Vzc2lvbi1kZXNjIiwgc2Vzc2lvbkRlc2MpOworICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBpbmRleCk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnkiLCBub3RpZnkpOworICAgIG1zZy0+c2V0SW50MzIoImluamVjdGVkIiwgaW5qZWN0ZWQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpyZW1vdmVTdHJlYW0oaW50IHJ0cFNvY2tldCwgaW50IHJ0Y3BTb2NrZXQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVtb3ZlU3RyZWFtLCBpZCgpKTsKKyAgICBtc2ctPnNldEludDMyKCJydHAtc29ja2V0IiwgcnRwU29ja2V0KTsKKyAgICBtc2ctPnNldEludDMyKCJydGNwLXNvY2tldCIsIHJ0Y3BTb2NrZXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitzdGF0aWMgdm9pZCBidW1wU29ja2V0QnVmZmVyU2l6ZShpbnQgcykgeworICAgIGludCBzaXplID0gMjU2ICogMTAyNDsKKyAgICBDSEVDS19FUShzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnNpemUsIHNpemVvZihzaXplKSksIDApOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQVJUUENvbm5lY3Rpb246Ok1ha2VQb3J0UGFpcigKKyAgICAgICAgaW50ICpydHBTb2NrZXQsIGludCAqcnRjcFNvY2tldCwgdW5zaWduZWQgKnJ0cFBvcnQpIHsKKyAgICAqcnRwU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKCpydHBTb2NrZXQsIDApOworCisgICAgYnVtcFNvY2tldEJ1ZmZlclNpemUoKnJ0cFNvY2tldCk7CisKKyAgICAqcnRjcFNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRSgqcnRjcFNvY2tldCwgMCk7CisKKyAgICBidW1wU29ja2V0QnVmZmVyU2l6ZSgqcnRjcFNvY2tldCk7CisKKyAgICB1bnNpZ25lZCBzdGFydCA9IChyYW5kKCkgKiAxMDAwKS8gUkFORF9NQVggKyAxNTU1MDsKKyAgICBzdGFydCAmPSB+MTsKKworICAgIGZvciAodW5zaWduZWQgcG9ydCA9IHN0YXJ0OyBwb3J0IDwgNjU1MzY7IHBvcnQgKz0gMikgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICAgICAgbWVtc2V0KGFkZHIuc2luX3plcm8sIDAsIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7CisgICAgICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisgICAgICAgIGlmIChiaW5kKCpydHBTb2NrZXQsCisgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQgKyAxKTsKKworICAgICAgICBpZiAoYmluZCgqcnRjcFNvY2tldCwKKyAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IDApIHsKKyAgICAgICAgICAgICpydHBQb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRSRVNQQVNTKCk7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWRkU3RyZWFtOgorICAgICAgICB7CisgICAgICAgICAgICBvbkFkZFN0cmVhbShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVtb3ZlU3RyZWFtOgorICAgICAgICB7CisgICAgICAgICAgICBvblJlbW92ZVN0cmVhbShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UG9sbFN0cmVhbXM6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUG9sbFN0cmVhbXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdEluamVjdFBhY2tldDoKKyAgICAgICAgeworICAgICAgICAgICAgb25JbmplY3RQYWNrZXQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvbkFkZFN0cmVhbShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIG1TdHJlYW1zLnB1c2hfYmFjayhTdHJlYW1JbmZvKCkpOworICAgIFN0cmVhbUluZm8gKmluZm8gPSAmKi0tbVN0cmVhbXMuZW5kKCk7CisKKyAgICBpbnQzMl90IHM7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cC1zb2NrZXQiLCAmcykpOworICAgIGluZm8tPm1SVFBTb2NrZXQgPSBzOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXNvY2tldCIsICZzKSk7CisgICAgaW5mby0+bVJUQ1BTb2NrZXQgPSBzOworCisgICAgaW50MzJfdCBpbmplY3RlZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5qZWN0ZWQiLCAmaW5qZWN0ZWQpKTsKKworICAgIGluZm8tPm1Jc0luamVjdGVkID0gaW5qZWN0ZWQ7CisKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzZXNzaW9uLWRlc2MiLCAmb2JqKSk7CisgICAgaW5mby0+bVNlc3Npb25EZXNjID0gc3RhdGljX2Nhc3Q8QVNlc3Npb25EZXNjcmlwdGlvbiAqPihvYmouZ2V0KCkpOworCisgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiaW5kZXgiLCAmaW5mby0+bUluZGV4KSk7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgibm90aWZ5IiwgJmluZm8tPm1Ob3RpZnlNc2cpKTsKKworICAgIGluZm8tPm1OdW1SVENQUGFja2V0c1JlY2VpdmVkID0gMDsKKyAgICBtZW1zZXQoJmluZm8tPm1SZW1vdGVSVENQQWRkciwgMCwgc2l6ZW9mKGluZm8tPm1SZW1vdGVSVENQQWRkcikpOworCisgICAgaWYgKCFpbmplY3RlZCkgeworICAgICAgICBwb3N0UG9sbEV2ZW50KCk7CisgICAgfQorfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvblJlbW92ZVN0cmVhbShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgcnRwU29ja2V0LCBydGNwU29ja2V0OworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydHAtc29ja2V0IiwgJnJ0cFNvY2tldCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydGNwLXNvY2tldCIsICZydGNwU29ja2V0KSk7CisKKyAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpCisgICAgICAgICAgICYmIChpdC0+bVJUUFNvY2tldCAhPSBydHBTb2NrZXQgfHwgaXQtPm1SVENQU29ja2V0ICE9IHJ0Y3BTb2NrZXQpKSB7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgaWYgKGl0ID09IG1TdHJlYW1zLmVuZCgpKSB7CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgbVN0cmVhbXMuZXJhc2UoaXQpOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpwb3N0UG9sbEV2ZW50KCkgeworICAgIGlmIChtUG9sbEV2ZW50UGVuZGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxTdHJlYW1zLCBpZCgpKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIG1Qb2xsRXZlbnRQZW5kaW5nID0gdHJ1ZTsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6b25Qb2xsU3RyZWFtcygpIHsKKyAgICBtUG9sbEV2ZW50UGVuZGluZyA9IGZhbHNlOworCisgICAgaWYgKG1TdHJlYW1zLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IGtTZWxlY3RUaW1lb3V0VXM7CisKKyAgICBmZF9zZXQgcnM7CisgICAgRkRfWkVSTygmcnMpOworCisgICAgaW50IG1heFNvY2tldCA9IC0xOworICAgIGZvciAoTGlzdDxTdHJlYW1JbmZvPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbVN0cmVhbXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLm1Jc0luamVjdGVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEZEX1NFVChpdC0+bVJUUFNvY2tldCwgJnJzKTsKKyAgICAgICAgRkRfU0VUKGl0LT5tUlRDUFNvY2tldCwgJnJzKTsKKworICAgICAgICBpZiAoaXQtPm1SVFBTb2NrZXQgPiBtYXhTb2NrZXQpIHsKKyAgICAgICAgICAgIG1heFNvY2tldCA9IGl0LT5tUlRQU29ja2V0OworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+bVJUQ1BTb2NrZXQgPiBtYXhTb2NrZXQpIHsKKyAgICAgICAgICAgIG1heFNvY2tldCA9IGl0LT5tUlRDUFNvY2tldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXhTb2NrZXQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCByZXMgPSBzZWxlY3QobWF4U29ja2V0ICsgMSwgJnJzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgIENIRUNLX0dFKHJlcywgMCk7CisKKyAgICBpZiAocmVzID4gMCkgeworICAgICAgICBmb3IgKExpc3Q8U3RyZWFtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbXMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBtU3RyZWFtcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKCgqaXQpLm1Jc0luamVjdGVkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVChpdC0+bVJUUFNvY2tldCwgJnJzKSkgeworICAgICAgICAgICAgICAgIHJlY2VpdmUoJippdCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRkRfSVNTRVQoaXQtPm1SVENQU29ja2V0LCAmcnMpKSB7CisgICAgICAgICAgICAgICAgcmVjZWl2ZSgmKml0LCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwb3N0UG9sbEV2ZW50KCk7CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpZiAobUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyA8PSAwCisgICAgICAgICAgICB8fCBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzICsgNTAwMDAwMGxsIDw9IG5vd1VzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKKyAgICAgICAgZm9yIChMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gbVN0cmVhbXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIFN0cmVhbUluZm8gKnMgPSAmKml0OworCisgICAgICAgICAgICBpZiAocy0+bUlzSW5qZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPm1OdW1SVENQUGFja2V0c1JlY2VpdmVkID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5ldmVyIHJlY2VpdmVkIGFueSBSVENQIHBhY2tldHMgb24gdGhpcyBzdHJlYW0sCisgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZXZlbiBrbm93IHdoZXJlIHRvIHNlbmQgYSByZXBvcnQuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcy0+bVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBzLT5tU291cmNlcy52YWx1ZUF0KGkpOworCisgICAgICAgICAgICAgICAgc291cmNlLT5hZGRSZWNlaXZlclJlcG9ydChidWZmZXIpOworCisgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtSZWd1bGFybHlSZXF1ZXN0RklSKSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+YWRkRklSKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJTZW5kaW5nIFJSLi4uIjsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmR0bygKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1SVENQU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnMtPm1SZW1vdGVSVENQQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5tUmVtb3RlUlRDUEFkZHIpKTsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzID0gbm93VXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpyZWNlaXZlKFN0cmVhbUluZm8gKnMsIGJvb2wgcmVjZWl2ZVJUUCkgeworICAgIENIRUNLKCFzLT5tSXNJbmplY3RlZCk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7CisKKyAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9CisgICAgICAgICghcmVjZWl2ZVJUUCAmJiBzLT5tTnVtUlRDUFBhY2tldHNSZWNlaXZlZCA9PSAwKQorICAgICAgICAgICAgPyBzaXplb2Yocy0+bVJlbW90ZVJUQ1BBZGRyKSA6IDA7CisKKyAgICBzc2l6ZV90IG5ieXRlcyA9IHJlY3Zmcm9tKAorICAgICAgICAgICAgcmVjZWl2ZVJUUCA/IHMtPm1SVFBTb2NrZXQgOiBzLT5tUlRDUFNvY2tldCwKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLAorICAgICAgICAgICAgYnVmZmVyLT5jYXBhY2l0eSgpLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHJlbW90ZUFkZHJMZW4gPiAwID8gKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHIgOiBOVUxMLAorICAgICAgICAgICAgcmVtb3RlQWRkckxlbiA+IDAgPyAmcmVtb3RlQWRkckxlbiA6IE5VTEwpOworCisgICAgaWYgKG5ieXRlcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbmJ5dGVzKTsKKworICAgIC8vIExPRyhJTkZPKSA8PCAicmVjZWl2ZWQgIiA8PCBidWZmZXItPnNpemUoKSA8PCAiIGJ5dGVzLiI7CisKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKHJlY2VpdmVSVFApIHsKKyAgICAgICAgZXJyID0gcGFyc2VSVFAocywgYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBwYXJzZVJUQ1AocywgYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSVFAoU3RyZWFtSW5mbyAqcywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICBpZiAoc2l6ZSA8IDEyKSB7CisgICAgICAgIC8vIFRvbyBzaG9ydCB0byBiZSBhIHZhbGlkIFJUUCBoZWFkZXIuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisKKyAgICBpZiAoKGRhdGFbMF0gPj4gNikgIT0gMikgeworICAgICAgICAvLyBVbnN1cHBvcnRlZCB2ZXJzaW9uLgorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGRhdGFbMF0gJiAweDIwKSB7CisgICAgICAgIC8vIFBhZGRpbmcgcHJlc2VudC4KKworICAgICAgICBzaXplX3QgcGFkZGluZ0xlbmd0aCA9IGRhdGFbc2l6ZSAtIDFdOworCisgICAgICAgIGlmIChwYWRkaW5nTGVuZ3RoICsgMTIgPiBzaXplKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSByZW1vdmVkIHRoaXMgbXVjaCBwYWRkaW5nIHdlJ2QgZW5kIHVwIHdpdGggc29tZXRoaW5nCisgICAgICAgICAgICAvLyB0aGF0J3MgdG9vIHNob3J0IHRvIGJlIGEgdmFsaWQgUlRQIGhlYWRlci4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgLT0gcGFkZGluZ0xlbmd0aDsKKyAgICB9CisKKyAgICBpbnQgbnVtQ1NSQ3MgPSBkYXRhWzBdICYgMHgwZjsKKworICAgIHNpemVfdCBwYXlsb2FkT2Zmc2V0ID0gMTIgKyA0ICogbnVtQ1NSQ3M7CisKKyAgICBpZiAoc2l6ZSA8IHBheWxvYWRPZmZzZXQpIHsKKyAgICAgICAgLy8gTm90IGVub3VnaCBkYXRhIHRvIGZpdCB0aGUgYmFzaWMgaGVhZGVyIGFuZCBhbGwgdGhlIENTUkMgZW50cmllcy4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChkYXRhWzBdICYgMHgxMCkgeworICAgICAgICAvLyBIZWFkZXIgZVh0ZW5zaW9uIHByZXNlbnQuCisKKyAgICAgICAgaWYgKHNpemUgPCBwYXlsb2FkT2Zmc2V0ICsgNCkgeworICAgICAgICAgICAgLy8gTm90IGVub3VnaCBkYXRhIHRvIGZpdCB0aGUgYmFzaWMgaGVhZGVyLCBhbGwgQ1NSQyBlbnRyaWVzCisgICAgICAgICAgICAvLyBhbmQgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGV4dGVuc2lvbiBoZWFkZXIuCisKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmV4dGVuc2lvbkRhdGEgPSAmZGF0YVtwYXlsb2FkT2Zmc2V0XTsKKworICAgICAgICBzaXplX3QgZXh0ZW5zaW9uTGVuZ3RoID0KKyAgICAgICAgICAgIDQgKiAoZXh0ZW5zaW9uRGF0YVsyXSA8PCA4IHwgZXh0ZW5zaW9uRGF0YVszXSk7CisKKyAgICAgICAgaWYgKHNpemUgPCBwYXlsb2FkT2Zmc2V0ICsgNCArIGV4dGVuc2lvbkxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcGF5bG9hZE9mZnNldCArPSA0ICsgZXh0ZW5zaW9uTGVuZ3RoOworICAgIH0KKworICAgIHVpbnQzMl90IHNyY0lkID0gdTMyYXQoJmRhdGFbOF0pOworCisgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gZmluZFNvdXJjZShzLCBzcmNJZCk7CisKKyAgICB1aW50MzJfdCBydHBUaW1lID0gdTMyYXQoJmRhdGFbNF0pOworCisgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBidWZmZXItPm1ldGEoKTsKKyAgICBtZXRhLT5zZXRJbnQzMigic3NyYyIsIHNyY0lkKTsKKyAgICBtZXRhLT5zZXRJbnQzMigicnRwLXRpbWUiLCBydHBUaW1lKTsKKyAgICBtZXRhLT5zZXRJbnQzMigiUFQiLCBkYXRhWzFdICYgMHg3Zik7CisgICAgbWV0YS0+c2V0SW50MzIoIk0iLCBkYXRhWzFdID4+IDcpOworCisgICAgYnVmZmVyLT5zZXRJbnQzMkRhdGEodTE2YXQoJmRhdGFbMl0pKTsKKyAgICBidWZmZXItPnNldFJhbmdlKHBheWxvYWRPZmZzZXQsIHNpemUgLSBwYXlsb2FkT2Zmc2V0KTsKKworICAgIGlmICgobUZsYWdzICYga0Zha2VUaW1lc3RhbXBzKSAmJiAhc291cmNlLT50aW1lRXN0YWJsaXNoZWQoKSkgeworICAgICAgICBzb3VyY2UtPnRpbWVVcGRhdGUocnRwVGltZSwgMCk7CisgICAgICAgIHNvdXJjZS0+dGltZVVwZGF0ZShydHBUaW1lICsgOTAwMDAsIDB4MTAwMDAwMDAwbGwpOworICAgICAgICBDSEVDSyhzb3VyY2UtPnRpbWVFc3RhYmxpc2hlZCgpKTsKKyAgICB9CisKKyAgICBzb3VyY2UtPnByb2Nlc3NSVFBQYWNrZXQoYnVmZmVyKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUlRDUChTdHJlYW1JbmZvICpzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKHMtPm1OdW1SVENQUGFja2V0c1JlY2VpdmVkKysgPT0gMCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZpcnN0LXJ0Y3AiLCB0cnVlKTsKKyAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5zaXplKCk7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICAgICAgICAvLyBUb28gc2hvcnQgdG8gYmUgYSB2YWxpZCBSVENQIGhlYWRlcgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChkYXRhWzBdID4+IDYpICE9IDIpIHsKKyAgICAgICAgICAgIC8vIFVuc3VwcG9ydGVkIHZlcnNpb24uCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YVswXSAmIDB4MjApIHsKKyAgICAgICAgICAgIC8vIFBhZGRpbmcgcHJlc2VudC4KKworICAgICAgICAgICAgc2l6ZV90IHBhZGRpbmdMZW5ndGggPSBkYXRhW3NpemUgLSAxXTsKKworICAgICAgICAgICAgaWYgKHBhZGRpbmdMZW5ndGggKyAxMiA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZW1vdmVkIHRoaXMgbXVjaCBwYWRkaW5nIHdlJ2QgZW5kIHVwIHdpdGggc29tZXRoaW5nCisgICAgICAgICAgICAgICAgLy8gdGhhdCdzIHRvbyBzaG9ydCB0byBiZSBhIHZhbGlkIFJUUCBoZWFkZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplIC09IHBhZGRpbmdMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgaGVhZGVyTGVuZ3RoID0gNCAqIChkYXRhWzJdIDw8IDggfCBkYXRhWzNdKSArIDQ7CisKKyAgICAgICAgaWYgKHNpemUgPCBoZWFkZXJMZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgcmVjZWl2ZWQgYSBwYXJ0aWFsIHBhY2tldD8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoZGF0YVsxXSkgeworICAgICAgICAgICAgY2FzZSAyMDA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyc2VTUihzLCBkYXRhLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIDIwMTogIC8vIFJSCisgICAgICAgICAgICBjYXNlIDIwMjogIC8vIFNERVMKKyAgICAgICAgICAgIGNhc2UgMjA0OiAgLy8gQVBQCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjA1OiAgLy8gVFNGQiAodHJhbnNwb3J0IGxheWVyIHNwZWNpZmljIGZlZWRiYWNrKQorICAgICAgICAgICAgY2FzZSAyMDY6ICAvLyBQU0ZCIChwYXlsb2FkIHNwZWNpZmljIGZlZWRiYWNrKQorICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAyMDM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyc2VCWUUocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlVua25vd24gUlRDUCBwYWNrZXQgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICh1bnNpZ25lZClkYXRhWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgb2Ygc2l6ZSAiIDw8IGhlYWRlckxlbmd0aDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRhdGEgKz0gaGVhZGVyTGVuZ3RoOworICAgICAgICBzaXplIC09IGhlYWRlckxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZUJZRSgKKyAgICAgICAgU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgU0MgPSBkYXRhWzBdICYgMHgzZjsKKworICAgIGlmIChTQyA9PSAwIHx8IHNpemUgPCAoNCArIFNDICogNCkpIHsKKyAgICAgICAgLy8gUGFja2V0IHRvbyBzaG9ydCBmb3IgdGhlIG1pbmltYWwgQllFIGhlYWRlci4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQzMl90IGlkID0gdTMyYXQoJmRhdGFbNF0pOworCisgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gZmluZFNvdXJjZShzLCBpZCk7CisKKyAgICBzb3VyY2UtPmJ5ZVJlY2VpdmVkKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVNSKAorICAgICAgICBTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBSQyA9IGRhdGFbMF0gJiAweDFmOworCisgICAgaWYgKHNpemUgPCAoNyArIFJDICogNikgKiA0KSB7CisgICAgICAgIC8vIFBhY2tldCB0b28gc2hvcnQgZm9yIHRoZSBtaW5pbWFsIFNSIGhlYWRlci4KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQzMl90IGlkID0gdTMyYXQoJmRhdGFbNF0pOworICAgIHVpbnQ2NF90IG50cFRpbWUgPSB1NjRhdCgmZGF0YVs4XSk7CisgICAgdWludDMyX3QgcnRwVGltZSA9IHUzMmF0KCZkYXRhWzE2XSk7CisKKyNpZiAwCisgICAgTE9HKElORk8pIDw8IFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICJYWFggdGltZVVwZGF0ZTogc3NyYz0weCUwOHgsIHJ0cFRpbWUgJXUgPT0gbnRwVGltZSAlLjNmIiwKKyAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgcnRwVGltZSwgKG50cFRpbWUgPj4gMzIpICsgKGRvdWJsZSkobnRwVGltZSAmIDB4ZmZmZmZmZmYpIC8gKDFsbCA8PCAzMikpOworI2VuZGlmCisKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBmaW5kU291cmNlKHMsIGlkKTsKKworICAgIGlmICgobUZsYWdzICYga0Zha2VUaW1lc3RhbXBzKSA9PSAwKSB7CisgICAgICAgIHNvdXJjZS0+dGltZVVwZGF0ZShydHBUaW1lLCBudHBUaW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3A8QVJUUFNvdXJjZT4gQVJUUENvbm5lY3Rpb246OmZpbmRTb3VyY2UoU3RyZWFtSW5mbyAqaW5mbywgdWludDMyX3Qgc3JjSWQpIHsKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2U7CisgICAgc3NpemVfdCBpbmRleCA9IGluZm8tPm1Tb3VyY2VzLmluZGV4T2ZLZXkoc3JjSWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgaW5kZXggPSBpbmZvLT5tU291cmNlcy5zaXplKCk7CisKKyAgICAgICAgc291cmNlID0gbmV3IEFSVFBTb3VyY2UoCisgICAgICAgICAgICAgICAgc3JjSWQsIGluZm8tPm1TZXNzaW9uRGVzYywgaW5mby0+bUluZGV4LCBpbmZvLT5tTm90aWZ5TXNnKTsKKworICAgICAgICBpbmZvLT5tU291cmNlcy5hZGQoc3JjSWQsIHNvdXJjZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc291cmNlID0gaW5mby0+bVNvdXJjZXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIHNvdXJjZTsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6aW5qZWN0UGFja2V0KGludCBpbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbmplY3RQYWNrZXQsIGlkKCkpOworICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOworICAgIG1zZy0+c2V0T2JqZWN0KCJidWZmZXIiLCBidWZmZXIpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvbkluamVjdFBhY2tldChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgaW5kZXg7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJidWZmZXIiLCAmb2JqKSk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7CisKKyAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1TdHJlYW1zLmVuZCgpCisgICAgICAgICAgICYmIGl0LT5tUlRQU29ja2V0ICE9IGluZGV4ICYmIGl0LT5tUlRDUFNvY2tldCAhPSBpbmRleCkgeworICAgICAgICArK2l0OworICAgIH0KKworICAgIGlmIChpdCA9PSBtU3RyZWFtcy5lbmQoKSkgeworICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKworICAgIFN0cmVhbUluZm8gKnMgPSAmKml0OworCisgICAgc3RhdHVzX3QgZXJyOworICAgIGlmIChpdC0+bVJUUFNvY2tldCA9PSBpbmRleCkgeworICAgICAgICBlcnIgPSBwYXJzZVJUUChzLCBidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IHBhcnNlUlRDUChzLCBidWZmZXIpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjgxZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9SVFBfQ09OTkVDVElPTl9IXworCisjZGVmaW5lIEFfUlRQX0NPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQVJUUFNvdXJjZTsKK3N0cnVjdCBBU2Vzc2lvbkRlc2NyaXB0aW9uOworCitzdHJ1Y3QgQVJUUENvbm5lY3Rpb24gOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIGVudW0gRmxhZ3MgeworICAgICAgICBrRmFrZVRpbWVzdGFtcHMgICAgICA9IDEsCisgICAgICAgIGtSZWd1bGFybHlSZXF1ZXN0RklSID0gMiwKKyAgICB9OworCisgICAgQVJUUENvbm5lY3Rpb24odWludDMyX3QgZmxhZ3MgPSAwKTsKKworICAgIHZvaWQgYWRkU3RyZWFtKAorICAgICAgICAgICAgaW50IHJ0cFNvY2tldCwgaW50IHJ0Y3BTb2NrZXQsCisgICAgICAgICAgICBjb25zdCBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiAmc2Vzc2lvbkRlc2MsIHNpemVfdCBpbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgYm9vbCBpbmplY3RlZCk7CisKKyAgICB2b2lkIHJlbW92ZVN0cmVhbShpbnQgcnRwU29ja2V0LCBpbnQgcnRjcFNvY2tldCk7CisKKyAgICB2b2lkIGluamVjdFBhY2tldChpbnQgaW5kZXgsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworCisgICAgLy8gQ3JlYXRlcyBhIHBhaXIgb2YgVURQIGRhdGFncmFtIHNvY2tldHMgYm91bmQgdG8gYWRqYWNlbnQgcG9ydHMKKyAgICAvLyAodGhlIHJ0cFNvY2tldCBpcyBib3VuZCB0byBhbiBldmVuIHBvcnQsIHRoZSBydGNwU29ja2V0IHRvIHRoZQorICAgIC8vIG5leHQgaGlnaGVyIHBvcnQpLgorICAgIHN0YXRpYyB2b2lkIE1ha2VQb3J0UGFpcigKKyAgICAgICAgICAgIGludCAqcnRwU29ja2V0LCBpbnQgKnJ0Y3BTb2NrZXQsIHVuc2lnbmVkICpydHBQb3J0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFSVFBDb25uZWN0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBZGRTdHJlYW0sCisgICAgICAgIGtXaGF0UmVtb3ZlU3RyZWFtLAorICAgICAgICBrV2hhdFBvbGxTdHJlYW1zLAorICAgICAgICBrV2hhdEluamVjdFBhY2tldCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NlbGVjdFRpbWVvdXRVczsKKworICAgIHVpbnQzMl90IG1GbGFnczsKKworICAgIHN0cnVjdCBTdHJlYW1JbmZvOworICAgIExpc3Q8U3RyZWFtSW5mbz4gbVN0cmVhbXM7CisKKyAgICBib29sIG1Qb2xsRXZlbnRQZW5kaW5nOworICAgIGludDY0X3QgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVczsKKworICAgIHZvaWQgb25BZGRTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25SZW1vdmVTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25Qb2xsU3RyZWFtcygpOworICAgIHZvaWQgb25JbmplY3RQYWNrZXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TZW5kUmVjZWl2ZXJSZXBvcnRzKCk7CisKKyAgICBzdGF0dXNfdCByZWNlaXZlKFN0cmVhbUluZm8gKmluZm8sIGJvb2wgcmVjZWl2ZVJUUCk7CisKKyAgICBzdGF0dXNfdCBwYXJzZVJUUChTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBwYXJzZVJUQ1AoU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgc3RhdHVzX3QgcGFyc2VTUihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VCWUUoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgc3A8QVJUUFNvdXJjZT4gZmluZFNvdXJjZShTdHJlYW1JbmZvICppbmZvLCB1aW50MzJfdCBpZCk7CisKKyAgICB2b2lkIHBvc3RQb2xsRXZlbnQoKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFSVFBDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U5M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQVJUUFNlc3Npb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQVJUUFNlc3Npb246OkFSVFBTZXNzaW9uKCkKKyAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCkgeworfQorCitzdGF0dXNfdCBBUlRQU2Vzc2lvbjo6c2V0dXAoY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJmRlc2MpIHsKKyAgICBDSEVDS19FUShtSW5pdENoZWNrLCAoc3RhdHVzX3QpTk9fSU5JVCk7CisKKyAgICBtRGVzYyA9IGRlc2M7CisKKyAgICBtUlRQQ29ubiA9IG5ldyBBUlRQQ29ubmVjdGlvbigKKyAgICAgICAgICAgIEFSVFBDb25uZWN0aW9uOjprRmFrZVRpbWVzdGFtcHMKKyAgICAgICAgICAgICAgICB8IEFSVFBDb25uZWN0aW9uOjprUmVndWxhcmx5UmVxdWVzdEZJUik7CisKKyAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1SVFBDb25uKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbURlc2MtPmNvdW50VHJhY2tzKCk7ICsraSkgeworICAgICAgICBBU3RyaW5nIGNvbm5lY3Rpb247CisgICAgICAgIGlmICghbURlc2MtPmZpbmRBdHRyaWJ1dGUoaSwgImM9IiwgJmNvbm5lY3Rpb24pKSB7CisgICAgICAgICAgICAvLyBObyBwZXItc3RyZWFtIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24sIHRyeSBnbG9iYWwgZmFsbGJhY2suCisgICAgICAgICAgICBpZiAoIW1EZXNjLT5maW5kQXR0cmlidXRlKDAsICJjPSIsICZjb25uZWN0aW9uKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBmaW5kIGNvbm5lY3Rpb24gYXR0cmlidHVlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoY29ubmVjdGlvbiA9PSAiSU4gSVA0IDEyNy4wLjAuMSIpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJXZSBvbmx5IHN1cHBvcnQgbG9jYWxob3N0IGNvbm5lY3Rpb25zIGZvciBub3cuIjsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgcG9ydDsKKyAgICAgICAgaWYgKCF2YWxpZGF0ZU1lZGlhRm9ybWF0KGksICZwb3J0KSB8fCAocG9ydCAmIDEpICE9IDApIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgbWVkaWEgZm9ybWF0LiI7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IG5ldyBBUGFja2V0U291cmNlKG1EZXNjLCBpKTsKKyAgICAgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIGZvcm1hdC4iOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcnRwU29ja2V0ID0gTWFrZVVEUFNvY2tldChwb3J0KTsKKyAgICAgICAgaW50IHJ0Y3BTb2NrZXQgPSBNYWtlVURQU29ja2V0KHBvcnQgKyAxKTsKKworICAgICAgICBtVHJhY2tzLnB1c2goVHJhY2tJbmZvKCkpOworICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG1UcmFja3Muc2l6ZSgpIC0gMSk7CisgICAgICAgIGluZm8tPm1SVFBTb2NrZXQgPSBydHBTb2NrZXQ7CisgICAgICAgIGluZm8tPm1SVENQU29ja2V0ID0gcnRjcFNvY2tldDsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QWNjZXNzVW5pdENvbXBsZXRlLCBpZCgpKTsKKyAgICAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFjay1pbmRleCIsIG1UcmFja3Muc2l6ZSgpIC0gMSk7CisKKyAgICAgICAgbVJUUENvbm4tPmFkZFN0cmVhbSgKKyAgICAgICAgICAgICAgICBydHBTb2NrZXQsIHJ0Y3BTb2NrZXQsIG1EZXNjLCBpLCBub3RpZnksIGZhbHNlIC8qIGluamVjdGVkICovKTsKKworICAgICAgICBpbmZvLT5tUGFja2V0U291cmNlID0gc291cmNlOworICAgIH0KKworICAgIG1Jbml0Q2hlY2sgPSBPSzsKKworICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitpbnQgQVJUUFNlc3Npb246Ok1ha2VVRFBTb2NrZXQodW5zaWduZWQgcG9ydCkgeworICAgIGludCBzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKHMsIDApOworCisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgbWVtc2V0KGFkZHIuc2luX3plcm8sIDAsIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisgICAgQ0hFQ0tfRVEoMCwgYmluZChzLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkpOworCisgICAgcmV0dXJuIHM7Cit9CisKK0FSVFBTZXNzaW9uOjp+QVJUUFNlc3Npb24oKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+c2lnbmFsRU9TKFVOS05PV05fRVJST1IpOworCisgICAgICAgIGNsb3NlKGluZm8tPm1SVFBTb2NrZXQpOworICAgICAgICBjbG9zZShpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgfQorfQorCit2b2lkIEFSVFBTZXNzaW9uOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEFjY2Vzc1VuaXRDb21wbGV0ZToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmaXJzdFJUQ1A7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImZpcnN0LXJ0Y3AiLCAmZmlyc3RSVENQKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHdvbid0IGJlIGFuIGFjY2VzcyB1bml0IGhlcmUsIGl0J3MganVzdCBhIG5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGRhdGEgY29tbXVuaWNhdGlvbiB3b3JrZWQgc2luY2Ugd2UgZ290IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIC8vIHJ0Y3AgcGFja2V0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrLWluZGV4IiwgJnRyYWNrSW5kZXgpKTsKKworICAgICAgICAgICAgaW50MzJfdCBlb3M7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgeworICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImFjY2Vzcy11bml0IiwgJm9iaikpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihvYmouZ2V0KCkpOworCisgICAgICAgICAgICB1aW50NjRfdCBudHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICAibnRwLXRpbWUiLCAoaW50NjRfdCAqKSZudHBUaW1lKSk7CisKKyNpZiAwCisjaWYgMAorICAgICAgICAgICAgcHJpbnRmKCJhY2Nlc3MgdW5pdCBjb21wbGV0ZSBzaXplPSVkXHRudHAtdGltZT0weCUwMTZsbHhcbiIsCisgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+c2l6ZSgpLCBudHBUaW1lKTsKKyNlbHNlCisgICAgICAgICAgICBMT0coSU5GTykgPDwgImFjY2VzcyB1bml0IGNvbXBsZXRlLCAiCisgICAgICAgICAgICAgICAgICAgICAgPDwgInNpemU9IiA8PCBhY2Nlc3NVbml0LT5zaXplKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICJudHAtdGltZT0iIDw8IG50cFRpbWU7CisgICAgICAgICAgICBoZXhkdW1wKGFjY2Vzc1VuaXQtPmRhdGEoKSwgYWNjZXNzVW5pdC0+c2l6ZSgpKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAwCisgICAgICAgICAgICBDSEVDS19HRShhY2Nlc3NVbml0LT5zaXplKCksIDV1KTsKKyAgICAgICAgICAgIENIRUNLKCFtZW1jbXAoIlx4MDBceDAwXHgwMFx4MDEiLCBhY2Nlc3NVbml0LT5kYXRhKCksIDQpKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHggPSBhY2Nlc3NVbml0LT5kYXRhKClbNF07CisKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiYWNjZXNzIHVuaXQgY29tcGxldGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIm5hbFR5cGU9MHglMDJ4LCBuYWxSZWZJZGM9MHglMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAmIDB4MWYsICh4ICYgMHg2MCkgPj4gNSk7CisjZW5kaWYKKworICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgibnRwLXRpbWUiLCBudHBUaW1lKTsKKyAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworCisjaWYgMAorICAgICAgICAgICAgaW50MzJfdCBkYW1hZ2VkOworICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkYW1hZ2VkIiwgJmRhbWFnZWQpCisgICAgICAgICAgICAgICAgICAgICYmIGRhbWFnZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiaWdub3JpbmcgZGFtYWdlZCBBVSI7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworYm9vbCBBUlRQU2Vzc2lvbjo6dmFsaWRhdGVNZWRpYUZvcm1hdChzaXplX3QgaW5kZXgsIHVuc2lnbmVkICpwb3J0KSBjb25zdCB7CisgICAgQVN0cmluZyBmb3JtYXQ7CisgICAgbURlc2MtPmdldEZvcm1hdChpbmRleCwgJmZvcm1hdCk7CisKKyAgICBzc2l6ZV90IGkgPSBmb3JtYXQuZmluZCgiICIpOworICAgIGlmIChpIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKytpOworICAgIHNpemVfdCBqID0gaTsKKyAgICB3aGlsZSAoaXNkaWdpdChmb3JtYXQuY19zdHIoKVtqXSkpIHsKKyAgICAgICAgKytqOworICAgIH0KKyAgICBpZiAoZm9ybWF0LmNfc3RyKClbal0gIT0gJyAnKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBU3RyaW5nIHBvcnRTdHJpbmcoZm9ybWF0LCBpLCBqIC0gaSk7CisKKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgbG9uZyB4ID0gc3RydG91bChwb3J0U3RyaW5nLmNfc3RyKCksICZlbmQsIDEwKTsKKyAgICBpZiAoZW5kID09IHBvcnRTdHJpbmcuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh4ID09IDAgfHwgeCA+IDY1NTM1KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqcG9ydCA9IHg7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc2l6ZV90IEFSVFBTZXNzaW9uOjpjb3VudFRyYWNrcygpIHsKKyAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7Cit9CisKK3NwPE1lZGlhU291cmNlPiBBUlRQU2Vzc2lvbjo6dHJhY2tBdChzaXplX3QgaW5kZXgpIHsKKyAgICBDSEVDS19MVChpbmRleCwgbVRyYWNrcy5zaXplKCkpOworICAgIHJldHVybiBtVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1QYWNrZXRTb3VyY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmZjc0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNlc3Npb24uaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1JUUF9TRVNTSU9OX0hfCisKKyNkZWZpbmUgQV9SVFBfU0VTU0lPTl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBUGFja2V0U291cmNlOworc3RydWN0IEFSVFBDb25uZWN0aW9uOworc3RydWN0IEFTZXNzaW9uRGVzY3JpcHRpb247CitzdHJ1Y3QgTWVkaWFTb3VyY2U7CisKK3N0cnVjdCBBUlRQU2Vzc2lvbiA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgQVJUUFNlc3Npb24oKTsKKworICAgIHN0YXR1c190IHNldHVwKGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZkZXNjKTsKKworICAgIHNpemVfdCBjb3VudFRyYWNrcygpOworICAgIHNwPE1lZGlhU291cmNlPiB0cmFja0F0KHNpemVfdCBpbmRleCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdmlydHVhbCB+QVJUUFNlc3Npb24oKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBY2Nlc3NVbml0Q29tcGxldGUgPSAnYWNjdScKKyAgICB9OworCisgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIGludCBtUlRQU29ja2V0OworICAgICAgICBpbnQgbVJUQ1BTb2NrZXQ7CisKKyAgICAgICAgc3A8QVBhY2tldFNvdXJjZT4gbVBhY2tldFNvdXJjZTsKKyAgICB9OworCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBtRGVzYzsKKyAgICBzcDxBUlRQQ29ubmVjdGlvbj4gbVJUUENvbm47CisKKyAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOworCisgICAgYm9vbCB2YWxpZGF0ZU1lZGlhRm9ybWF0KHNpemVfdCBpbmRleCwgdW5zaWduZWQgKnBvcnQpIGNvbnN0OworICAgIHN0YXRpYyBpbnQgTWFrZVVEUFNvY2tldCh1bnNpZ25lZCBwb3J0KTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFSVFBTZXNzaW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfU0VTU0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1NmJhMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorCisjaW5jbHVkZSAiQUFNUkFzc2VtYmxlci5oIgorI2luY2x1ZGUgIkFBVkNBc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJBSDI2M0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAiQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlci5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjZGVmaW5lIEJFX1ZFUkJPU0UgICAgICAwCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtTb3VyY2VJRCA9IDB4ZGVhZGJlZWY7CisKK0FSVFBTb3VyY2U6OkFSVFBTb3VyY2UoCisgICAgICAgIHVpbnQzMl90IGlkLAorICAgICAgICBjb25zdCBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiAmc2Vzc2lvbkRlc2MsIHNpemVfdCBpbmRleCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCisgICAgOiBtSUQoaWQpLAorICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIoMCksCisgICAgICBtTnVtQnVmZmVyc1JlY2VpdmVkKDApLAorICAgICAgbU51bVRpbWVzKDApLAorICAgICAgbUxhc3ROVFBUaW1lKDApLAorICAgICAgbUxhc3ROVFBUaW1lVXBkYXRlVXMoMCksCisgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyhmYWxzZSksCisgICAgICBtTGFzdEZJUlJlcXVlc3RVcygtMSksCisgICAgICBtTmV4dEZJUlNlcU5vKChyYW5kKCkgKiAyNTYuMCkgLyBSQU5EX01BWCkgeworICAgIHVuc2lnbmVkIGxvbmcgUFQ7CisgICAgQVN0cmluZyBkZXNjOworICAgIEFTdHJpbmcgcGFyYW1zOworICAgIHNlc3Npb25EZXNjLT5nZXRGb3JtYXRUeXBlKGluZGV4LCAmUFQsICZkZXNjLCAmcGFyYW1zKTsKKworICAgIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjY0LyIsIDUpKSB7CisgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQUFWQ0Fzc2VtYmxlcihub3RpZnkpOworICAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJNUDRBLUxBVE0vIiwgMTApKSB7CisgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQU1QRUc0QXVkaW9Bc3NlbWJsZXIobm90aWZ5KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjMtMTk5OC8iLCAxMCkKKyAgICAgICAgICAgIHx8ICFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjMtMjAwMC8iLCAxMCkpIHsKKyAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBSDI2M0Fzc2VtYmxlcihub3RpZnkpOworICAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJBTVIvIiwgNCkpIHsKKyAgICAgICAgbUFzc2VtYmxlciA9IG5ldyBBQU1SQXNzZW1ibGVyKG5vdGlmeSwgZmFsc2UgLyogaXNXaWRlICovLCBwYXJhbXMpOworICAgIH0gZWxzZSAgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkFNUi1XQi8iLCA3KSkgeworICAgICAgICBtQXNzZW1ibGVyID0gbmV3IEFBTVJBc3NlbWJsZXIobm90aWZ5LCB0cnVlIC8qIGlzV2lkZSAqLywgcGFyYW1zKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIk1QNFYtRVMvIiwgOCkKKyAgICAgICAgICAgIHx8ICFzdHJuY21wKGRlc2MuY19zdHIoKSwgIm1wZWc0LWdlbmVyaWMvIiwgMTQpKSB7CisgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQU1QRUc0RWxlbWVudGFyeUFzc2VtYmxlcihub3RpZnksIGRlc2MsIHBhcmFtcyk7CisgICAgICAgIG1Jc3N1ZUZJUlJlcXVlc3RzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IEFic0RpZmYodWludDMyX3Qgc2VxMSwgdWludDMyX3Qgc2VxMikgeworICAgIHJldHVybiBzZXExID4gc2VxMiA/IHNlcTEgLSBzZXEyIDogc2VxMiAtIHNlcTE7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6cHJvY2Vzc1JUUFBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKHF1ZXVlUGFja2V0KGJ1ZmZlcikKKyAgICAgICAgICAgICYmIG1OdW1UaW1lcyA9PSAyCisgICAgICAgICAgICAmJiBtQXNzZW1ibGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUFzc2VtYmxlci0+b25QYWNrZXRSZWNlaXZlZCh0aGlzKTsKKyAgICB9CisKKyAgICBkdW1wKCk7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6dGltZVVwZGF0ZSh1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKSB7CisjaWYgQkVfVkVSQk9TRQorICAgIExPRyhWRVJCT1NFKSA8PCAidGltZVVwZGF0ZSI7CisjZW5kaWYKKworICAgIG1MYXN0TlRQVGltZSA9IG50cFRpbWU7CisgICAgbUxhc3ROVFBUaW1lVXBkYXRlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgaWYgKG1OdW1UaW1lcyA9PSAyKSB7CisgICAgICAgIG1OVFBUaW1lWzBdID0gbU5UUFRpbWVbMV07CisgICAgICAgIG1SVFBUaW1lWzBdID0gbVJUUFRpbWVbMV07CisgICAgICAgIG1OdW1UaW1lcyA9IDE7CisgICAgfQorICAgIG1OVFBUaW1lW21OdW1UaW1lc10gPSBudHBUaW1lOworICAgIG1SVFBUaW1lW21OdW1UaW1lcysrXSA9IHJ0cFRpbWU7CisKKyAgICBpZiAodGltZUVzdGFibGlzaGVkKCkpIHsKKyAgICAgICAgZm9yIChMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbVF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gbVF1ZXVlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9ICgqaXQpLT5tZXRhKCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NCgibnRwLXRpbWUiLCBSVFAyTlRQKHJ0cFRpbWUpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBBUlRQU291cmNlOjpxdWV1ZVBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgdWludDMyX3Qgc2VxTnVtID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisKKyAgICBpZiAobU51bVRpbWVzID09IDIpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBidWZmZXItPm1ldGEoKTsKKworICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgICAgIG1ldGEtPnNldEludDY0KCJudHAtdGltZSIsIFJUUDJOVFAocnRwVGltZSkpOworICAgIH0KKworICAgIGlmIChtTnVtQnVmZmVyc1JlY2VpdmVkKysgPT0gMCkgeworICAgICAgICBtSGlnaGVzdFNlcU51bWJlciA9IHNlcU51bTsKKyAgICAgICAgbVF1ZXVlLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBPbmx5IHRoZSBsb3dlciAxNi1iaXQgb2YgdGhlIHNlcXVlbmNlIG51bWJlcnMgYXJlIHRyYW5zbWl0dGVkLAorICAgIC8vIGRlcml2ZSB0aGUgaGlnaC1vcmRlciBiaXRzIGJ5IGNob29zaW5nIHRoZSBjYW5kaWRhdGUgY2xvc2VzdAorICAgIC8vIHRvIHRoZSBoaWdoZXN0IHNlcXVlbmNlIG51bWJlciAoZXh0ZW5kZWQgdG8gMzIgYml0cykgcmVjZWl2ZWQgc28gZmFyLgorCisgICAgdWludDMyX3Qgc2VxMSA9IHNlcU51bSB8IChtSGlnaGVzdFNlcU51bWJlciAmIDB4ZmZmZjAwMDApOworICAgIHVpbnQzMl90IHNlcTIgPSBzZXFOdW0gfCAoKG1IaWdoZXN0U2VxTnVtYmVyICYgMHhmZmZmMDAwMCkgKyAweDEwMDAwKTsKKyAgICB1aW50MzJfdCBzZXEzID0gc2VxTnVtIHwgKChtSGlnaGVzdFNlcU51bWJlciAmIDB4ZmZmZjAwMDApIC0gMHgxMDAwMCk7CisgICAgdWludDMyX3QgZGlmZjEgPSBBYnNEaWZmKHNlcTEsIG1IaWdoZXN0U2VxTnVtYmVyKTsKKyAgICB1aW50MzJfdCBkaWZmMiA9IEFic0RpZmYoc2VxMiwgbUhpZ2hlc3RTZXFOdW1iZXIpOworICAgIHVpbnQzMl90IGRpZmYzID0gQWJzRGlmZihzZXEzLCBtSGlnaGVzdFNlcU51bWJlcik7CisKKyAgICBpZiAoZGlmZjEgPCBkaWZmMikgeworICAgICAgICBpZiAoZGlmZjEgPCBkaWZmMykgeworICAgICAgICAgICAgLy8gZGlmZjEgPCBkaWZmMiBeIGRpZmYxIDwgZGlmZjMKKyAgICAgICAgICAgIHNlcU51bSA9IHNlcTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkaWZmMyA8PSBkaWZmMSA8IGRpZmYyCisgICAgICAgICAgICBzZXFOdW0gPSBzZXEzOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkaWZmMiA8IGRpZmYzKSB7CisgICAgICAgIC8vIGRpZmYyIDw9IGRpZmYxIF4gZGlmZjIgPCBkaWZmMworICAgICAgICBzZXFOdW0gPSBzZXEyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGRpZmYzIDw9IGRpZmYyIDw9IGRpZmYxCisgICAgICAgIHNlcU51bSA9IHNlcTM7CisgICAgfQorCisgICAgaWYgKHNlcU51bSA+IG1IaWdoZXN0U2VxTnVtYmVyKSB7CisgICAgICAgIG1IaWdoZXN0U2VxTnVtYmVyID0gc2VxTnVtOworICAgIH0KKworICAgIGJ1ZmZlci0+c2V0SW50MzJEYXRhKHNlcU51bSk7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbVF1ZXVlLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1RdWV1ZS5lbmQoKSAmJiAodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpIDwgc2VxTnVtKSB7CisgICAgICAgICsraXQ7CisgICAgfQorCisgICAgaWYgKGl0ICE9IG1RdWV1ZS5lbmQoKSAmJiAodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpID09IHNlcU51bSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgIkRpc2NhcmRpbmcgZHVwbGljYXRlIGJ1ZmZlciI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtUXVldWUuaW5zZXJ0KGl0LCBidWZmZXIpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6ZHVtcCgpIGNvbnN0IHsKKyAgICBpZiAoKG1OdW1CdWZmZXJzUmVjZWl2ZWQgJSAxMjgpICE9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIDAKKyAgICBpZiAobUFzc2VtYmxlciA9PSBOVUxMKSB7CisgICAgICAgIGNoYXIgdG1wWzIwXTsKKyAgICAgICAgc3ByaW50Zih0bXAsICIweCUwOHgiLCBtSUQpOworCisgICAgICAgIGludDMyX3QgbnVtTWlzc2luZyA9IDA7CisKKyAgICAgICAgaWYgKCFtUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgTGlzdDxzcDxBQnVmZmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1RdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgdWludDMyX3QgZXhwZWN0ZWRTZXFOdW0gPSAodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpOworICAgICAgICAgICAgKytleHBlY3RlZFNlcU51bTsKKyAgICAgICAgICAgICsraXQ7CisKKyAgICAgICAgICAgIGZvciAoOyBpdCAhPSBtUXVldWUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXFOdW0gPSAodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpOworICAgICAgICAgICAgICAgIENIRUNLX0dFKHNlcU51bSwgZXhwZWN0ZWRTZXFOdW0pOworCisgICAgICAgICAgICAgICAgaWYgKHNlcU51bSAhPSBleHBlY3RlZFNlcU51bSkgeworICAgICAgICAgICAgICAgICAgICBudW1NaXNzaW5nICs9IHNlcU51bSAtIGV4cGVjdGVkU2VxTnVtOworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFNlcU51bSA9IHNlcU51bTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2V4cGVjdGVkU2VxTnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJbIiA8PCB0bXAgPDwgIl0gTWlzc2luZyAiIDw8IG51bU1pc3NpbmcKKyAgICAgICAgICAgICA8PCAiIC8gIiA8PCAobU51bUJ1ZmZlcnNSZWNlaXZlZCArIG51bU1pc3NpbmcpIDw8ICIgcGFja2V0cy4gKCIKKyAgICAgICAgICAgICA8PCAoMTAwLjAgKiBudW1NaXNzaW5nIC8gKG1OdW1CdWZmZXJzUmVjZWl2ZWQgKyBudW1NaXNzaW5nKSkKKyAgICAgICAgICAgICA8PCAiICUlKSI7CisgICAgfQorI2VuZGlmCisKKyNpZiAwCisgICAgQVN0cmluZyBvdXQ7CisKKyAgICBvdXQuYXBwZW5kKHRtcCk7CisgICAgb3V0LmFwcGVuZCgiIFsiKTsKKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtUXVldWUuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVF1ZXVlLmVuZCgpKSB7CisgICAgICAgIHVpbnQzMl90IHN0YXJ0ID0gKHVpbnQzMl90KSgqaXQpLT5pbnQzMkRhdGEoKTsKKworICAgICAgICBvdXQuYXBwZW5kKHN0YXJ0KTsKKworICAgICAgICArK2l0OworICAgICAgICB1aW50MzJfdCBleHBlY3RlZCA9IHN0YXJ0ICsgMTsKKworICAgICAgICB3aGlsZSAoaXQgIT0gbVF1ZXVlLmVuZCgpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBzZXFOdW0gPSAodWludDMyX3QpKCppdCktPmludDMyRGF0YSgpOworCisgICAgICAgICAgICBpZiAoc2VxTnVtICE9IGV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkID4gc3RhcnQgKyAxKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChleHBlY3RlZCAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgKytleHBlY3RlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpdCA9PSBtUXVldWUuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZCA+IHN0YXJ0ICsgMSkgeworICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGV4cGVjdGVkIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQuYXBwZW5kKCJdIik7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgb3V0OworI2VuZGlmCit9CisKK3VpbnQ2NF90IEFSVFBTb3VyY2U6OlJUUDJOVFAodWludDMyX3QgcnRwVGltZSkgY29uc3QgeworICAgIENIRUNLX0VRKG1OdW1UaW1lcywgMnUpOworCisgICAgcmV0dXJuIG1OVFBUaW1lWzBdICsgKGRvdWJsZSkobU5UUFRpbWVbMV0gLSBtTlRQVGltZVswXSkKKyAgICAgICAgICAgICogKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpbVJUUFRpbWVbMF0pCisgICAgICAgICAgICAvIChkb3VibGUpKG1SVFBUaW1lWzFdIC0gbVJUUFRpbWVbMF0pOworfQorCit2b2lkIEFSVFBTb3VyY2U6OmJ5ZVJlY2VpdmVkKCkgeworICAgIG1Bc3NlbWJsZXItPm9uQnllUmVjZWl2ZWQoKTsKK30KKwordm9pZCBBUlRQU291cmNlOjphZGRGSVIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmICghbUlzc3VlRklSUmVxdWVzdHMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGlmIChtTGFzdEZJUlJlcXVlc3RVcyA+PSAwICYmIG1MYXN0RklSUmVxdWVzdFVzICsgNTAwMDAwMGxsID4gbm93VXMpIHsKKyAgICAgICAgLy8gU2VuZCBGSVIgcmVxdWVzdHMgYXQgbW9zdCBldmVyeSA1IHNlY3MuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtTGFzdEZJUlJlcXVlc3RVcyA9IG5vd1VzOworCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpICsgMjAgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBGSVIuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCA0OworICAgIGRhdGFbMV0gPSAyMDY7ICAvLyBQU0ZCCisgICAgZGF0YVsyXSA9IDA7CisgICAgZGF0YVszXSA9IDQ7CisgICAgZGF0YVs0XSA9IGtTb3VyY2VJRCA+PiAyNDsKKyAgICBkYXRhWzVdID0gKGtTb3VyY2VJRCA+PiAxNikgJiAweGZmOworICAgIGRhdGFbNl0gPSAoa1NvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzddID0ga1NvdXJjZUlEICYgMHhmZjsKKworICAgIGRhdGFbOF0gPSAweDAwOyAgLy8gU1NSQyBvZiBtZWRpYSBzb3VyY2UgKHVudXNlZCkKKyAgICBkYXRhWzldID0gMHgwMDsKKyAgICBkYXRhWzEwXSA9IDB4MDA7CisgICAgZGF0YVsxMV0gPSAweDAwOworCisgICAgZGF0YVsxMl0gPSBtSUQgPj4gMjQ7CisgICAgZGF0YVsxM10gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxNF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE1XSA9IG1JRCAmIDB4ZmY7CisKKyAgICBkYXRhWzE2XSA9IG1OZXh0RklSU2VxTm8rKzsgIC8vIFNlcSBOci4KKworICAgIGRhdGFbMTddID0gMHgwMDsgIC8vIFJlc2VydmVkCisgICAgZGF0YVsxOF0gPSAweDAwOworICAgIGRhdGFbMTldID0gMHgwMDsKKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAyMCk7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgIkFkZGVkIEZJUiByZXF1ZXN0LiI7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6YWRkUmVjZWl2ZXJSZXBvcnQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSArIDMyID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiUlRDUCBidWZmZXIgdG9vIHNtYWxsIHRvIGFjY29tb2RhdGUgUlIuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAxOworICAgIGRhdGFbMV0gPSAyMDE7ICAvLyBSUgorICAgIGRhdGFbMl0gPSAwOworICAgIGRhdGFbM10gPSA3OworICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IGtTb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBkYXRhWzhdID0gbUlEID4+IDI0OworICAgIGRhdGFbOV0gPSAobUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxMF0gPSAobUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzExXSA9IG1JRCAmIDB4ZmY7CisKKyAgICBkYXRhWzEyXSA9IDB4MDA7ICAvLyBmcmFjdGlvbiBsb3N0CisKKyAgICBkYXRhWzEzXSA9IDB4MDA7ICAvLyBjdW11bGF0aXZlIGxvc3QKKyAgICBkYXRhWzE0XSA9IDB4MDA7CisgICAgZGF0YVsxNV0gPSAweDAwOworCisgICAgZGF0YVsxNl0gPSBtSGlnaGVzdFNlcU51bWJlciA+PiAyNDsKKyAgICBkYXRhWzE3XSA9IChtSGlnaGVzdFNlcU51bWJlciA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMThdID0gKG1IaWdoZXN0U2VxTnVtYmVyID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE5XSA9IG1IaWdoZXN0U2VxTnVtYmVyICYgMHhmZjsKKworICAgIGRhdGFbMjBdID0gMHgwMDsgIC8vIEludGVyYXJyaXZhbCBqaXR0ZXIKKyAgICBkYXRhWzIxXSA9IDB4MDA7CisgICAgZGF0YVsyMl0gPSAweDAwOworICAgIGRhdGFbMjNdID0gMHgwMDsKKworICAgIHVpbnQzMl90IExTUiA9IDA7CisgICAgdWludDMyX3QgRExTUiA9IDA7CisgICAgaWYgKG1MYXN0TlRQVGltZSAhPSAwKSB7CisgICAgICAgIExTUiA9IChtTGFzdE5UUFRpbWUgPj4gMTYpICYgMHhmZmZmZmZmZjsKKworICAgICAgICBETFNSID0gKHVpbnQzMl90KQorICAgICAgICAgICAgKChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3ROVFBUaW1lVXBkYXRlVXMpICogNjU1MzYuMCAvIDFFNik7CisgICAgfQorCisgICAgZGF0YVsyNF0gPSBMU1IgPj4gMjQ7CisgICAgZGF0YVsyNV0gPSAoTFNSID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsyNl0gPSAoTFNSID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzI3XSA9IExTUiAmIDB4ZmY7CisKKyAgICBkYXRhWzI4XSA9IERMU1IgPj4gMjQ7CisgICAgZGF0YVsyOV0gPSAoRExTUiA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMzBdID0gKERMU1IgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMzFdID0gRExTUiAmIDB4ZmY7CisKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMzIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyZDZkNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfUlRQX1NPVVJDRV9IXworCisjZGVmaW5lIEFfUlRQX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBUlRQQXNzZW1ibGVyOworc3RydWN0IEFTZXNzaW9uRGVzY3JpcHRpb247CisKK3N0cnVjdCBBUlRQU291cmNlIDogcHVibGljIFJlZkJhc2UgeworICAgIEFSVFBTb3VyY2UoCisgICAgICAgICAgICB1aW50MzJfdCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdm9pZCBwcm9jZXNzUlRQUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgdGltZVVwZGF0ZSh1aW50MzJfdCBydHBUaW1lLCB1aW50NjRfdCBudHBUaW1lKTsKKyAgICB2b2lkIGJ5ZVJlY2VpdmVkKCk7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKCkgeyByZXR1cm4gJm1RdWV1ZTsgfQorCisgICAgdm9pZCBhZGRSZWNlaXZlclJlcG9ydChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGFkZEZJUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIGJvb2wgdGltZUVzdGFibGlzaGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU51bVRpbWVzID09IDI7CisgICAgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1JRDsKKyAgICB1aW50MzJfdCBtSGlnaGVzdFNlcU51bWJlcjsKKyAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVF1ZXVlOworICAgIHNwPEFSVFBBc3NlbWJsZXI+IG1Bc3NlbWJsZXI7CisKKyAgICBzaXplX3QgbU51bVRpbWVzOworICAgIHVpbnQ2NF90IG1OVFBUaW1lWzJdOworICAgIHVpbnQzMl90IG1SVFBUaW1lWzJdOworCisgICAgdWludDY0X3QgbUxhc3ROVFBUaW1lOworICAgIGludDY0X3QgbUxhc3ROVFBUaW1lVXBkYXRlVXM7CisKKyAgICBib29sIG1Jc3N1ZUZJUlJlcXVlc3RzOworICAgIGludDY0X3QgbUxhc3RGSVJSZXF1ZXN0VXM7CisgICAgdWludDhfdCBtTmV4dEZJUlNlcU5vOworCisgICAgdWludDY0X3QgUlRQMk5UUCh1aW50MzJfdCBydHBUaW1lKSBjb25zdDsKKworICAgIGJvb2wgcXVldWVQYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQU291cmNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTFlZTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtMCwwICsxLDgxNiBAQAorI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9CeXRlT3JkZXIuaD4KKworI2RlZmluZSBQVCAgICAgIDk3CisjZGVmaW5lIFBUX1NUUiAgIjk3IgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFBhY2tldFNpemUgPSA2NTUwNzsgIC8vIG1heGltdW0gcGF5bG9hZCBpbiBVRFAgb3ZlciBJUAorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFja2V0U2l6ZSA9IDE1MDA7CisKK3N0YXRpYyBpbnQgVW5pZm9ybVJhbmQoaW50IGxpbWl0KSB7CisgICAgcmV0dXJuICgoZG91YmxlKXJhbmQoKSAqIGxpbWl0KSAvIFJBTkRfTUFYOworfQorCitBUlRQV3JpdGVyOjpBUlRQV3JpdGVyKGludCBmZCkKKyAgICA6IG1GbGFncygwKSwKKyAgICAgIG1GZChmZCksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1SZWZsZWN0b3IobmV3IEFIYW5kbGVyUmVmbGVjdG9yPEFSVFBXcml0ZXI+KHRoaXMpKSB7CisgICAgQ0hFQ0tfR0UoZmQsIDApOworCisgICAgbUxvb3Blci0+c2V0TmFtZSgicnRwIHdyaXRlciIpOworICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKKyAgICBtTG9vcGVyLT5zdGFydCgpOworCisgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRShtU29ja2V0LCAwKTsKKworICAgIG1lbXNldChtUlRQQWRkci5zaW5femVybywgMCwgc2l6ZW9mKG1SVFBBZGRyLnNpbl96ZXJvKSk7CisgICAgbVJUUEFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKyNpZiAxCisgICAgbVJUUEFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyNlbHNlCisgICAgbVJUUEFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIxNzIuMTkuMTguMjQ2Iik7CisjZW5kaWYKKworICAgIG1SVFBBZGRyLnNpbl9wb3J0ID0gaHRvbnMoNTYzNCk7CisgICAgQ0hFQ0tfRVEoMCwgbnRvaHMobVJUUEFkZHIuc2luX3BvcnQpICYgMSk7CisKKyAgICBtUlRDUEFkZHIgPSBtUlRQQWRkcjsKKyAgICBtUlRDUEFkZHIuc2luX3BvcnQgPSBodG9ucyhudG9ocyhtUlRQQWRkci5zaW5fcG9ydCkgfCAxKTsKKworI2lmIExPR19UT19GSUxFUworICAgIG1SVFBGZCA9IG9wZW4oCisgICAgICAgICAgICAiL2RhdGEvbWlzYy9ydHBvdXQuYmluIiwKKyAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgICAgICAgICAwNjQ0KTsKKyAgICBDSEVDS19HRShtUlRQRmQsIDApOworCisgICAgbVJUQ1BGZCA9IG9wZW4oCisgICAgICAgICAgICAiL2RhdGEvbWlzYy9ydGNwb3V0LmJpbiIsCisgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLAorICAgICAgICAgICAgMDY0NCk7CisgICAgQ0hFQ0tfR0UobVJUQ1BGZCwgMCk7CisjZW5kaWYKK30KKworQVJUUFdyaXRlcjo6fkFSVFBXcml0ZXIoKSB7CisjaWYgTE9HX1RPX0ZJTEVTCisgICAgY2xvc2UobVJUQ1BGZCk7CisgICAgbVJUQ1BGZCA9IC0xOworCisgICAgY2xvc2UobVJUUEZkKTsKKyAgICBtUlRQRmQgPSAtMTsKKyNlbmRpZgorCisgICAgY2xvc2UobVNvY2tldCk7CisgICAgbVNvY2tldCA9IC0xOworCisgICAgY2xvc2UobUZkKTsKKyAgICBtRmQgPSAtMTsKK30KKworc3RhdHVzX3QgQVJUUFdyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7CisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQVJUUFdyaXRlcjo6cmVhY2hlZEVPUygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiAobUZsYWdzICYga0ZsYWdFT1MpICE9IDA7Cit9CisKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1GbGFncyAmPSB+a0ZsYWdFT1M7CisgICAgbVNvdXJjZUlEID0gcmFuZCgpOworICAgIG1TZXFObyA9IFVuaWZvcm1SYW5kKDY1NTM2KTsKKyAgICBtUlRQVGltZUJhc2UgPSByYW5kKCk7CisgICAgbU51bVJUUFNlbnQgPSAwOworICAgIG1OdW1SVFBPY3RldHNTZW50ID0gMDsKKyAgICBtTGFzdFJUUFRpbWUgPSAwOworICAgIG1MYXN0TlRQVGltZSA9IDA7CisgICAgbU51bVNSc1NlbnQgPSAwOworCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyhtU291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgbU1vZGUgPSBJTlZBTElEOworICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIG1Nb2RlID0gSDI2NDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7CisgICAgICAgIG1Nb2RlID0gSDI2MzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQikpIHsKKyAgICAgICAgbU1vZGUgPSBBTVJfTkI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7CisgICAgICAgIG1Nb2RlID0gQU1SX1dCOworICAgIH0gZWxzZSB7CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKworICAgIHdoaWxlICghKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7CisKKyAgICB3aGlsZSAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQVJUUFdyaXRlcjo6cGF1c2UoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBTdHJpcFN0YXJ0Y29kZShNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCA0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpwdHIgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIGlmICghbWVtY21wKHB0ciwgIlx4MDBceDAwXHgwMFx4MDEiLCA0KSkgeworICAgICAgICBidWZmZXItPnNldF9yYW5nZSgKKyAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX29mZnNldCgpICsgNCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19FUShtU291cmNlLT5zdGFydCgpLCAoc3RhdHVzX3QpT0spOworCisjaWYgMAorICAgICAgICAgICAgaWYgKG1Nb2RlID09IEgyNjQpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOworICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlciksIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShidWZmZXIpOworICAgICAgICAgICAgICAgIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkdW1wU2Vzc2lvbkRlc2MoKTsKKyNlbmRpZgorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTdGFydGVkOworICAgICAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU1IsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+c3RvcCgpLCAoc3RhdHVzX3QpT0spOworCisgICAgICAgICAgICBzZW5kQnllKCk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdTdGFydGVkOworICAgICAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRSZWFkOgorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb25SZWFkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRTZW5kU1I6CisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgICAgIGlmICghKG1GbGFncyAmIGtGbGFnU3RhcnRlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvblNlbmRTUihtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWY7CisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWVkaWFCdWYpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBMT0coSU5GTykgPDwgInJlYWNoZWQgRU9TLiI7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbUZsYWdzIHw9IGtGbGFnRU9TOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJyZWFkIGJ1ZmZlciBvZiBzaXplICIgPDwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpOworCisgICAgICAgIGlmIChtTW9kZSA9PSBIMjY0KSB7CisgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShtZWRpYUJ1Zik7CisgICAgICAgICAgICBzZW5kQVZDRGF0YShtZWRpYUJ1Zik7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gSDI2MykgeworICAgICAgICAgICAgc2VuZEgyNjNEYXRhKG1lZGlhQnVmKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBBTVJfTkIgfHwgbU1vZGUgPT0gQU1SX1dCKSB7CisgICAgICAgICAgICBzZW5kQU1SRGF0YShtZWRpYUJ1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZWRpYUJ1Zi0+cmVsZWFzZSgpOworICAgIG1lZGlhQnVmID0gTlVMTDsKKworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFBXcml0ZXI6Om9uU2VuZFNSKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICBhZGRTUihidWZmZXIpOworICAgIGFkZFNERVMoYnVmZmVyKTsKKworICAgIHNlbmQoYnVmZmVyLCB0cnVlIC8qIGlzUlRDUCAqLyk7CisKKyAgICArK21OdW1TUnNTZW50OworICAgIG1zZy0+cG9zdCgzMDAwMDAwKTsKK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGJvb2wgaXNSVENQKSB7CisgICAgc3NpemVfdCBuID0gc2VuZHRvKAorICAgICAgICAgICAgbVNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLAorICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKShpc1JUQ1AgPyAmbVJUQ1BBZGRyIDogJm1SVFBBZGRyKSwKKyAgICAgICAgICAgIHNpemVvZihtUlRDUEFkZHIpKTsKKworICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKKworI2lmIExPR19UT19GSUxFUworICAgIGludCBmZCA9IGlzUlRDUCA/IG1SVENQRmQgOiBtUlRQRmQ7CisKKyAgICB1aW50MzJfdCBtcyA9IHRvbGVsKEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwbGwpOworICAgIHVpbnQzMl90IGxlbmd0aCA9IHRvbGVsKGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICB3cml0ZShmZCwgJm1zLCBzaXplb2YobXMpKTsKKyAgICB3cml0ZShmZCwgJmxlbmd0aCwgc2l6ZW9mKGxlbmd0aCkpOworICAgIHdyaXRlKGZkLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworI2VuZGlmCit9CisKK3ZvaWQgQVJUUFdyaXRlcjo6YWRkU1IoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCAwOworICAgIGRhdGFbMV0gPSAyMDA7ICAvLyBTUgorICAgIGRhdGFbMl0gPSAwOworICAgIGRhdGFbM10gPSA2OworICAgIGRhdGFbNF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBkYXRhWzhdID0gbUxhc3ROVFBUaW1lID4+ICg2NCAtIDgpOworICAgIGRhdGFbOV0gPSAobUxhc3ROVFBUaW1lID4+ICg2NCAtIDE2KSkgJiAweGZmOworICAgIGRhdGFbMTBdID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAyNCkpICYgMHhmZjsKKyAgICBkYXRhWzExXSA9IChtTGFzdE5UUFRpbWUgPj4gMzIpICYgMHhmZjsKKyAgICBkYXRhWzEyXSA9IChtTGFzdE5UUFRpbWUgPj4gMjQpICYgMHhmZjsKKyAgICBkYXRhWzEzXSA9IChtTGFzdE5UUFRpbWUgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzE0XSA9IChtTGFzdE5UUFRpbWUgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMTVdID0gbUxhc3ROVFBUaW1lICYgMHhmZjsKKworICAgIGRhdGFbMTZdID0gKG1MYXN0UlRQVGltZSA+PiAyNCkgJiAweGZmOworICAgIGRhdGFbMTddID0gKG1MYXN0UlRQVGltZSA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMThdID0gKG1MYXN0UlRQVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxOV0gPSBtTGFzdFJUUFRpbWUgJiAweGZmOworCisgICAgZGF0YVsyMF0gPSBtTnVtUlRQU2VudCA+PiAyNDsKKyAgICBkYXRhWzIxXSA9IChtTnVtUlRQU2VudCA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMjJdID0gKG1OdW1SVFBTZW50ID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzIzXSA9IG1OdW1SVFBTZW50ICYgMHhmZjsKKworICAgIGRhdGFbMjRdID0gbU51bVJUUE9jdGV0c1NlbnQgPj4gMjQ7CisgICAgZGF0YVsyNV0gPSAobU51bVJUUE9jdGV0c1NlbnQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzI2XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsyN10gPSBtTnVtUlRQT2N0ZXRzU2VudCAmIDB4ZmY7CisKKyAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMjgpOworfQorCit2b2lkIEFSVFBXcml0ZXI6OmFkZFNERVMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKKyAgICBkYXRhWzFdID0gMjAyOyAgLy8gU0RFUworICAgIGRhdGFbNF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gODsKKworICAgIGRhdGFbb2Zmc2V0KytdID0gMTsgIC8vIENOQU1FCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqa0NOQU1FID0gInNvbWVvbmVAc29tZXdoZXJlIjsKKyAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrQ05BTUUpOworCisgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtDTkFNRSwgc3RybGVuKGtDTkFNRSkpOworICAgIG9mZnNldCArPSBzdHJsZW4oa0NOQU1FKTsKKworICAgIGRhdGFbb2Zmc2V0KytdID0gNzsgIC8vIE5PVEUKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICprTk9URSA9ICJIZWxsJ3MgZnJvemVuIG92ZXIuIjsKKyAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrTk9URSk7CisKKyAgICBtZW1jcHkoJmRhdGFbb2Zmc2V0XSwga05PVEUsIHN0cmxlbihrTk9URSkpOworICAgIG9mZnNldCArPSBzdHJsZW4oa05PVEUpOworCisgICAgZGF0YVtvZmZzZXQrK10gPSAwOworCisgICAgaWYgKChvZmZzZXQgJSA0KSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gNCAtIChvZmZzZXQgJSA0KTsKKyAgICAgICAgc3dpdGNoIChjb3VudCkgeworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG51bVdvcmRzID0gKG9mZnNldCAvIDQpIC0gMTsKKyAgICBkYXRhWzJdID0gbnVtV29yZHMgPj4gODsKKyAgICBkYXRhWzNdID0gbnVtV29yZHMgJiAweGZmOworCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIG9mZnNldCk7Cit9CisKKy8vIHN0YXRpYwordWludDY0X3QgQVJUUFdyaXRlcjo6R2V0Tm93TlRQKCkgeworICAgIHVpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIG5vd1VzICs9ICgoNzBsbCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwbGw7CisKKyAgICB1aW50NjRfdCBoaSA9IG5vd1VzIC8gMTAwMDAwMGxsOworICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7CisKKyAgICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOworfQorCit2b2lkIEFSVFBXcml0ZXI6OmR1bXBTZXNzaW9uRGVzYygpIHsKKyAgICBBU3RyaW5nIHNkcDsKKyAgICBzZHAgPSAidj0wXHJcbiI7CisKKyAgICBzZHAuYXBwZW5kKCJvPS0gIik7CisKKyAgICB1aW50NjRfdCBudHAgPSBHZXROb3dOVFAoKTsKKyAgICBzZHAuYXBwZW5kKG50cCk7CisgICAgc2RwLmFwcGVuZCgiICIpOworICAgIHNkcC5hcHBlbmQobnRwKTsKKyAgICBzZHAuYXBwZW5kKCIgSU4gSVA0IDEyNy4wLjAuMFxyXG4iKTsKKworICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgInM9U2FtcGxlXHJcbiIKKyAgICAgICAgICAiaT1QbGF5aW5nIGFyb3VuZFxyXG4iCisgICAgICAgICAgImM9SU4gSVA0ICIpOworCisgICAgc3RydWN0IGluX2FkZHIgYWRkcjsKKyAgICBhZGRyLnNfYWRkciA9IG50b2hsKElOQUREUl9MT09QQkFDSyk7CisKKyAgICBzZHAuYXBwZW5kKGluZXRfbnRvYShhZGRyKSk7CisKKyAgICBzZHAuYXBwZW5kKAorICAgICAgICAgICJcclxuIgorICAgICAgICAgICJ0PTAgMFxyXG4iCisgICAgICAgICAgImE9cmFuZ2U6bnB0PW5vdy1cclxuIik7CisKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOworCisgICAgaWYgKG1Nb2RlID09IEgyNjQgfHwgbU1vZGUgPT0gSDI2MykgeworICAgICAgICBzZHAuYXBwZW5kKCJtPXZpZGVvICIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNkcC5hcHBlbmQoIm09YXVkaW8gIik7CisgICAgfQorCisgICAgc2RwLmFwcGVuZChTdHJpbmdQcmludGYoIiVkIiwgbnRvaHMobVJUUEFkZHIuc2luX3BvcnQpKSk7CisgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAiIFJUUC9BVlAgIiBQVF9TVFIgIlxyXG4iCisgICAgICAgICAgImI9QVMgMzIwMDAwXHJcbiIKKyAgICAgICAgICAiYT1ydHBtYXA6IiBQVF9TVFIgIiAiKTsKKworICAgIGlmIChtTW9kZSA9PSBIMjY0KSB7CisgICAgICAgIHNkcC5hcHBlbmQoIkgyNjQvOTAwMDAiKTsKKyAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEgyNjMpIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiSDI2My0xOTk4LzkwMDAwIik7CisgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBBTVJfTkIgfHwgbU1vZGUgPT0gQU1SX1dCKSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHM7CisgICAgICAgIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7CisgICAgICAgIENIRUNLKG1Tb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisKKyAgICAgICAgQ0hFQ0tfRVEobnVtQ2hhbm5lbHMsIDEpOworICAgICAgICBDSEVDS19FUShzYW1wbGVSYXRlLCAobU1vZGUgPT0gQU1SX05CKSA/IDgwMDAgOiAxNjAwMCk7CisKKyAgICAgICAgc2RwLmFwcGVuZChtTW9kZSA9PSBBTVJfTkIgPyAiQU1SIiA6ICJBTVItV0IiKTsKKyAgICAgICAgc2RwLmFwcGVuZChTdHJpbmdQcmludGYoIi8lZC8lZCIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVFJFU1BBU1MoKTsKKyAgICB9CisKKyAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICBpZiAobU1vZGUgPT0gSDI2NCB8fCBtTW9kZSA9PSBIMjYzKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisKKyAgICAgICAgc2RwLmFwcGVuZCgiYT1jbGlwcmVjdCAwLDAsIik7CisgICAgICAgIHNkcC5hcHBlbmQoaGVpZ2h0KTsKKyAgICAgICAgc2RwLmFwcGVuZCgiLCIpOworICAgICAgICBzZHAuYXBwZW5kKHdpZHRoKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgICAgICJhPWZyYW1lc2l6ZToiIFBUX1NUUiAiICIpOworICAgICAgICBzZHAuYXBwZW5kKHdpZHRoKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiLSIpOworICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKyAgICB9CisKKyAgICBpZiAobU1vZGUgPT0gSDI2NCkgeworICAgICAgICBzZHAuYXBwZW5kKAorICAgICAgICAgICAgICAiYT1mbXRwOiIgUFRfU1RSICIgcHJvZmlsZS1sZXZlbC1pZD0iKTsKKyAgICAgICAgc2RwLmFwcGVuZChtUHJvZmlsZUxldmVsKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiO3Nwcm9wLXBhcmFtZXRlci1zZXRzPSIpOworCisgICAgICAgIHNkcC5hcHBlbmQobVNlcVBhcmFtU2V0KTsKKyAgICAgICAgc2RwLmFwcGVuZCgiLCIpOworICAgICAgICBzZHAuYXBwZW5kKG1QaWNQYXJhbVNldCk7CisgICAgICAgIHNkcC5hcHBlbmQoIjtwYWNrZXRpemF0aW9uLW1vZGU9MVxyXG4iKTsKKyAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEFNUl9OQiB8fCBtTW9kZSA9PSBBTVJfV0IpIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiYT1mbXRwOiIgUFRfU1RSICIgb2N0ZWQtYWxpZ25cclxuIik7CisgICAgfQorCisgICAgTE9HKElORk8pIDw8IHNkcDsKK30KKwordm9pZCBBUlRQV3JpdGVyOjptYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrU3RhcnRDb2RlW10gPSAiXHgwMFx4MDBceDAwXHgwMSI7CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworCisgICAgQ0hFQ0tfR0Uoc2l6ZSwgMHUpOworCisgICAgc2l6ZV90IHN0YXJ0Q29kZVBvcyA9IDA7CisgICAgd2hpbGUgKHN0YXJ0Q29kZVBvcyArIDMgPCBzaXplCisgICAgICAgICAgICAmJiBtZW1jbXAoa1N0YXJ0Q29kZSwgJmRhdGFbc3RhcnRDb2RlUG9zXSwgNCkpIHsKKyAgICAgICAgKytzdGFydENvZGVQb3M7CisgICAgfQorCisgICAgQ0hFQ0tfTFQoc3RhcnRDb2RlUG9zICsgMywgc2l6ZSk7CisKKyAgICBDSEVDS19FUSgodW5zaWduZWQpZGF0YVswXSwgMHg2N3UpOworCisgICAgbVByb2ZpbGVMZXZlbCA9CisgICAgICAgIFN0cmluZ1ByaW50ZigiJTAyWCUwMlglMDJYIiwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CisKKyAgICBlbmNvZGVCYXNlNjQoZGF0YSwgc3RhcnRDb2RlUG9zLCAmbVNlcVBhcmFtU2V0KTsKKworICAgIGVuY29kZUJhc2U2NCgmZGF0YVtzdGFydENvZGVQb3MgKyA0XSwgc2l6ZSAtIHN0YXJ0Q29kZVBvcyAtIDQsCisgICAgICAgICAgICAgICAgICZtUGljUGFyYW1TZXQpOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnNlbmRCeWUoKSB7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoOCk7CisgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICpkYXRhKysgPSAoMiA8PCA2KSB8IDE7CisgICAgKmRhdGErKyA9IDIwMzsKKyAgICAqZGF0YSsrID0gMDsKKyAgICAqZGF0YSsrID0gMTsKKyAgICAqZGF0YSsrID0gbVNvdXJjZUlEID4+IDI0OworICAgICpkYXRhKysgPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgKmRhdGErKyA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICpkYXRhKysgPSBtU291cmNlSUQgJiAweGZmOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgOCk7CisKKyAgICBzZW5kKGJ1ZmZlciwgdHJ1ZSAvKiBpc1JUQ1AgKi8pOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnNlbmRBVkNEYXRhKE1lZGlhQnVmZmVyICptZWRpYUJ1ZikgeworICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCisgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS0+ZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisKKyAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBsbCk7CisKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4UGFja2V0U2l6ZSk7CisgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSArIDEyIDw9IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAvLyBUaGUgZGF0YSBmaXRzIGludG8gYSBzaW5nbGUgcGFja2V0CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgZGF0YVswXSA9IDB4ODA7CisgICAgICAgIGRhdGFbMV0gPSAoMSA8PCA3KSB8IFBUOyAgLy8gTS1iaXQKKyAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKKyAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CisgICAgICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7CisgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTBdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBtZW1jcHkoJmRhdGFbMTJdLAorICAgICAgICAgICAgICAgbWVkaWFEYXRhLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgMTIpOworCisgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOworCisgICAgICAgICsrbVNlcU5vOworICAgICAgICArK21OdW1SVFBTZW50OworICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZVLUEKKworICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbWVkaWFEYXRhWzBdOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKworICAgICAgICBib29sIGZpcnN0UGFja2V0ID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBvZmZzZXQ7CisgICAgICAgICAgICBib29sIGxhc3RQYWNrZXQgPSB0cnVlOworICAgICAgICAgICAgaWYgKHNpemUgKyAxMiArIDIgPiBidWZmZXItPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgICAgICBsYXN0UGFja2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGJ1ZmZlci0+Y2FwYWNpdHkoKSAtIDEyIC0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgZGF0YVswXSA9IDB4ODA7CisgICAgICAgICAgICBkYXRhWzFdID0gKGxhc3RQYWNrZXQgPyAoMSA8PCA3KSA6IDB4MDApIHwgUFQ7ICAvLyBNLWJpdAorICAgICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKKyAgICAgICAgICAgIGRhdGFbNV0gPSAocnRwVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbN10gPSBydHBUaW1lICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgICAgICBkYXRhWzldID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICAgICAgZGF0YVsxMl0gPSAyOCB8IChuYWxUeXBlICYgMHhlMCk7CisKKyAgICAgICAgICAgIENIRUNLKCFmaXJzdFBhY2tldCB8fCAhbGFzdFBhY2tldCk7CisKKyAgICAgICAgICAgIGRhdGFbMTNdID0KKyAgICAgICAgICAgICAgICAoZmlyc3RQYWNrZXQgPyAweDgwIDogMHgwMCkKKyAgICAgICAgICAgICAgICB8IChsYXN0UGFja2V0ID8gMHg0MCA6IDB4MDApCisgICAgICAgICAgICAgICAgfCAobmFsVHlwZSAmIDB4MWYpOworCisgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTRdLCAmbWVkaWFEYXRhW29mZnNldF0sIHNpemUpOworCisgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDE0ICsgc2l6ZSk7CisKKyAgICAgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOworCisgICAgICAgICAgICArK21TZXFObzsKKyAgICAgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOworCisgICAgICAgICAgICBmaXJzdFBhY2tldCA9IGZhbHNlOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtTGFzdFJUUFRpbWUgPSBydHBUaW1lOworICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnNlbmRIMjYzRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpIHsKKyAgICBDSEVDS19HRShrTWF4UGFja2V0U2l6ZSwgMTJ1ICsgMnUpOworCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMGxsKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIC8vIGhleGR1bXAobWVkaWFEYXRhLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpOworCisgICAgQ0hFQ0tfRVEoKHVuc2lnbmVkKW1lZGlhRGF0YVswXSwgMHUpOworICAgIENIRUNLX0VRKCh1bnNpZ25lZCltZWRpYURhdGFbMV0sIDB1KTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAyOworICAgIHNpemVfdCBzaXplID0gbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpOworCisgICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFBhY2tldFNpemUpOworICAgICAgICAvLyBDSEVDS19MRShtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLTIgKyAxNCwgYnVmZmVyLT5jYXBhY2l0eSgpKTsKKworICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIG9mZnNldDsKKyAgICAgICAgYm9vbCBsYXN0UGFja2V0ID0gKHJlbWFpbmluZyArIDE0IDw9IGJ1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgICAgIGlmICghbGFzdFBhY2tldCkgeworICAgICAgICAgICAgcmVtYWluaW5nID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gMTQ7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgIGRhdGFbMF0gPSAweDgwOworICAgICAgICBkYXRhWzFdID0gKGxhc3RQYWNrZXQgPyAweDgwIDogMHgwMCkgfCBQVDsgIC8vIE0tYml0CisgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKKyAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CisgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OworICAgICAgICBkYXRhWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKKyAgICAgICAgZGF0YVs3XSA9IHJ0cFRpbWUgJiAweGZmOworICAgICAgICBkYXRhWzhdID0gbVNvdXJjZUlEID4+IDI0OworICAgICAgICBkYXRhWzldID0gKG1Tb3VyY2VJRCA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICAgICAgZGF0YVsxMl0gPSAob2Zmc2V0ID09IDIpID8gMHgwNCA6IDB4MDA7ICAvLyBQPT8sIFY9MAorICAgICAgICBkYXRhWzEzXSA9IDB4MDA7ICAvLyBQTEVOID0gUEVCSVQgPSAwCisKKyAgICAgICAgbWVtY3B5KCZkYXRhWzE0XSwgJm1lZGlhRGF0YVtvZmZzZXRdLCByZW1haW5pbmcpOworICAgICAgICBvZmZzZXQgKz0gcmVtYWluaW5nOworCisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgcmVtYWluaW5nICsgMTQpOworCisgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOworCisgICAgICAgICsrbVNlcU5vOworICAgICAgICArK21OdW1SVFBTZW50OworICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOworICAgIH0KKworICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CisgICAgbUxhc3ROVFBUaW1lID0gR2V0Tm93TlRQKCk7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0RnJhbWVTaXplKGJvb2wgaXNXaWRlLCB1bnNpZ25lZCBGVCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZU5CWzhdID0geworICAgICAgICA5NSwgMTAzLCAxMTgsIDEzNCwgMTQ4LCAxNTksIDIwNCwgMjQ0CisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGcmFtZVNpemVXQls5XSA9IHsKKyAgICAgICAgMTMyLCAxNzcsIDI1MywgMjg1LCAzMTcsIDM2NSwgMzk3LCA0NjEsIDQ3NworICAgIH07CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gaXNXaWRlID8ga0ZyYW1lU2l6ZVdCW0ZUXSA6IGtGcmFtZVNpemVOQltGVF07CisKKyAgICAvLyBSb3VuZCB1cCBiaXRzIHRvIGJ5dGVzIGFuZCBhZGQgMSBmb3IgdGhlIGhlYWRlciBieXRlLgorICAgIGZyYW1lU2l6ZSA9IChmcmFtZVNpemUgKyA3KSAvIDggKyAxOworCisgICAgcmV0dXJuIGZyYW1lU2l6ZTsKK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpIHsKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBzaXplX3QgbWVkaWFMZW5ndGggPSBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICBDSEVDS19HRShrTWF4UGFja2V0U2l6ZSwgMTJ1ICsgMXUgKyBtZWRpYUxlbmd0aCk7CisKKyAgICBjb25zdCBib29sIGlzV2lkZSA9IChtTW9kZSA9PSBBTVJfV0IpOworCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0sobWVkaWFCdWYtPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAvIChpc1dpZGUgPyAyNTAgOiAxMjUpKTsKKworICAgIC8vIGhleGR1bXAobWVkaWFEYXRhLCBtZWRpYUxlbmd0aCk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gdGFibGVPZkNvbnRlbnRzOworICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgIHdoaWxlIChzcmNPZmZzZXQgPCBtZWRpYUxlbmd0aCkgeworICAgICAgICB1aW50OF90IHRvYyA9IG1lZGlhRGF0YVtzcmNPZmZzZXRdOworCisgICAgICAgIHVuc2lnbmVkIEZUID0gKHRvYyA+PiAzKSAmIDB4MGY7CisgICAgICAgIENIRUNLKChpc1dpZGUgJiYgRlQgPD0gOCkgfHwgKCFpc1dpZGUgJiYgRlQgPD0gNykpOworCisgICAgICAgIHRhYmxlT2ZDb250ZW50cy5wdXNoKHRvYyk7CisgICAgICAgIHNyY09mZnNldCArPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7CisgICAgfQorICAgIENIRUNLX0VRKHNyY09mZnNldCwgbWVkaWFMZW5ndGgpOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFBhY2tldFNpemUpOworICAgIENIRUNLX0xFKG1lZGlhTGVuZ3RoICsgMTIgKyAxLCBidWZmZXItPmNhcGFjaXR5KCkpOworCisgICAgLy8gVGhlIGRhdGEgZml0cyBpbnRvIGEgc2luZ2xlIHBhY2tldAorICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBkYXRhWzBdID0gMHg4MDsKKyAgICBkYXRhWzFdID0gUFQ7CisgICAgaWYgKG1OdW1SVFBTZW50ID09IDApIHsKKyAgICAgICAgLy8gU2lnbmFsIHN0YXJ0IG9mIHRhbGstc3B1cnQuCisgICAgICAgIGRhdGFbMV0gfD0gMHg4MDsgIC8vIE0tYml0CisgICAgfQorICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKKyAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKKyAgICBkYXRhWzVdID0gKHJ0cFRpbWUgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBydHBUaW1lICYgMHhmZjsKKyAgICBkYXRhWzhdID0gbVNvdXJjZUlEID4+IDI0OworICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICBkYXRhWzEyXSA9IDB4ZjA7ICAvLyBDTVI9MTUsIFJSPTAKKworICAgIHNpemVfdCBkc3RPZmZzZXQgPSAxMzsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFibGVPZkNvbnRlbnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgdG9jID0gdGFibGVPZkNvbnRlbnRzW2ldOworCisgICAgICAgIGlmIChpICsgMSA8IHRhYmxlT2ZDb250ZW50cy5zaXplKCkpIHsKKyAgICAgICAgICAgIHRvYyB8PSAweDgwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9jICY9IH4weDgwOworICAgICAgICB9CisKKyAgICAgICAgZGF0YVtkc3RPZmZzZXQrK10gPSB0b2M7CisgICAgfQorCisgICAgc3JjT2Zmc2V0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhYmxlT2ZDb250ZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50OF90IHRvYyA9IHRhYmxlT2ZDb250ZW50c1tpXTsKKyAgICAgICAgdW5zaWduZWQgRlQgPSAodG9jID4+IDMpICYgMHgwZjsKKyAgICAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZUKTsKKworICAgICAgICArK3NyY09mZnNldDsgIC8vIHNraXAgdG9jCisgICAgICAgIG1lbWNweSgmZGF0YVtkc3RPZmZzZXRdLCAmbWVkaWFEYXRhW3NyY09mZnNldF0sIGZyYW1lU2l6ZSAtIDEpOworICAgICAgICBzcmNPZmZzZXQgKz0gZnJhbWVTaXplIC0gMTsKKyAgICAgICAgZHN0T2Zmc2V0ICs9IGZyYW1lU2l6ZSAtIDE7CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CisKKyAgICArK21TZXFObzsKKyAgICArK21OdW1SVFBTZW50OworICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gMTI7CisKKyAgICBtTGFzdFJUUFRpbWUgPSBydHBUaW1lOworICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzhkMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9SVFBfV1JJVEVSX0hfCisKKyNkZWZpbmUgQV9SVFBfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2RlZmluZSBMT0dfVE9fRklMRVMgICAgMAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IE1lZGlhQnVmZmVyOworCitzdHJ1Y3QgQVJUUFdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CisgICAgQVJUUFdyaXRlcihpbnQgZmQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpOworICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSAqcGFyYW1zKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVJUUFdyaXRlcigpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFN0YXJ0ICA9ICdzdHJ0JywKKyAgICAgICAga1doYXRTdG9wICAgPSAnc3RvcCcsCisgICAgICAgIGtXaGF0UmVhZCAgID0gJ3JlYWQnLAorICAgICAgICBrV2hhdFNlbmRTUiA9ICdzciAgJywKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIGtGbGFnU3RhcnRlZCAgPSAxLAorICAgICAgICBrRmxhZ0VPUyAgICAgID0gMiwKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisgICAgdWludDMyX3QgbUZsYWdzOworCisgICAgaW50IG1GZDsKKworI2lmIExPR19UT19GSUxFUworICAgIGludCBtUlRQRmQ7CisgICAgaW50IG1SVENQRmQ7CisjZW5kaWYKKworICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8QVJUUFdyaXRlcj4gPiBtUmVmbGVjdG9yOworCisgICAgaW50IG1Tb2NrZXQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luIG1SVFBBZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUlRDUEFkZHI7CisKKyAgICBBU3RyaW5nIG1Qcm9maWxlTGV2ZWw7CisgICAgQVN0cmluZyBtU2VxUGFyYW1TZXQ7CisgICAgQVN0cmluZyBtUGljUGFyYW1TZXQ7CisKKyAgICB1aW50MzJfdCBtU291cmNlSUQ7CisgICAgdWludDMyX3QgbVNlcU5vOworICAgIHVpbnQzMl90IG1SVFBUaW1lQmFzZTsKKyAgICB1aW50MzJfdCBtTnVtUlRQU2VudDsKKyAgICB1aW50MzJfdCBtTnVtUlRQT2N0ZXRzU2VudDsKKyAgICB1aW50MzJfdCBtTGFzdFJUUFRpbWU7CisgICAgdWludDY0X3QgbUxhc3ROVFBUaW1lOworCisgICAgaW50MzJfdCBtTnVtU1JzU2VudDsKKworICAgIGVudW0geworICAgICAgICBJTlZBTElELAorICAgICAgICBIMjY0LAorICAgICAgICBIMjYzLAorICAgICAgICBBTVJfTkIsCisgICAgICAgIEFNUl9XQiwKKyAgICB9IG1Nb2RlOworCisgICAgc3RhdGljIHVpbnQ2NF90IEdldE5vd05UUCgpOworCisgICAgdm9pZCBvblJlYWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TZW5kU1IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCisgICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGFkZFNERVMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdm9pZCBkdW1wU2Vzc2lvbkRlc2MoKTsKKworICAgIHZvaWQgc2VuZEJ5ZSgpOworICAgIHZvaWQgc2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXIgKm1lZGlhQnVmKTsKKyAgICB2b2lkIHNlbmRIMjYzRGF0YShNZWRpYUJ1ZmZlciAqbWVkaWFCdWYpOworICAgIHZvaWQgc2VuZEFNUkRhdGEoTWVkaWFCdWZmZXIgKm1lZGlhQnVmKTsKKworICAgIHZvaWQgc2VuZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBib29sIGlzUlRDUCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQV3JpdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFBfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkNDgzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworY29uc3QgaW50NjRfdCBBUlRTUENvbm5lY3Rpb246OmtTZWxlY3RUaW1lb3V0VXMgPSAxMDAwbGw7CisKK0FSVFNQQ29ubmVjdGlvbjo6QVJUU1BDb25uZWN0aW9uKCkKKyAgICA6IG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbVNvY2tldCgtMSksCisgICAgICBtQ29ubmVjdGlvbklEKDApLAorICAgICAgbU5leHRDU2VxKDApLAorICAgICAgbVJlY2VpdmVSZXNwb25zZUV2ZW50UGVuZGluZyhmYWxzZSkgeworfQorCitBUlRTUENvbm5lY3Rpb246On5BUlRTUENvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Tb2NrZXQgPj0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4sIGNsb3NpbmcgdGhlIHNvY2tldC4iOworICAgICAgICBjbG9zZShtU29ja2V0KTsKKyAgICAgICAgbVNvY2tldCA9IC0xOworICAgIH0KK30KKwordm9pZCBBUlRTUENvbm5lY3Rpb246OmNvbm5lY3QoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIGlkKCkpOworICAgIG1zZy0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOworICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpkaXNjb25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBBUlRTUENvbm5lY3Rpb246OnNlbmRSZXF1ZXN0KAorICAgICAgICBjb25zdCBjaGFyICpyZXF1ZXN0LCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRSZXF1ZXN0LCBpZCgpKTsKKyAgICBtc2ctPnNldFN0cmluZygicmVxdWVzdCIsIHJlcXVlc3QpOworICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpvYnNlcnZlQmluYXJ5RGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9ic2VydmVCaW5hcnlEYXRhLCBpZCgpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25uZWN0OgorICAgICAgICAgICAgb25Db25uZWN0KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtXaGF0RGlzY29ubmVjdDoKKyAgICAgICAgICAgIG9uRGlzY29ubmVjdChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrV2hhdENvbXBsZXRlQ29ubmVjdGlvbjoKKyAgICAgICAgICAgIG9uQ29tcGxldGVDb25uZWN0aW9uKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtXaGF0U2VuZFJlcXVlc3Q6CisgICAgICAgICAgICBvblNlbmRSZXF1ZXN0KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtXaGF0UmVjZWl2ZVJlc3BvbnNlOgorICAgICAgICAgICAgb25SZWNlaXZlUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga1doYXRPYnNlcnZlQmluYXJ5RGF0YToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmbU9ic2VydmVCaW5hcnlNZXNzYWdlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvLyBzdGF0aWMKK2Jvb2wgQVJUU1BDb25uZWN0aW9uOjpQYXJzZVVSTCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBBU3RyaW5nICpob3N0LCB1bnNpZ25lZCAqcG9ydCwgQVN0cmluZyAqcGF0aCkgeworICAgIGhvc3QtPmNsZWFyKCk7CisgICAgKnBvcnQgPSAwOworICAgIHBhdGgtPmNsZWFyKCk7CisKKyAgICBpZiAoc3RybmNhc2VjbXAoInJ0c3A6Ly8iLCB1cmwsIDcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cmNocigmdXJsWzddLCAnLycpOworCisgICAgaWYgKHNsYXNoUG9zID09IE5VTEwpIHsKKyAgICAgICAgaG9zdC0+c2V0VG8oJnVybFs3XSk7CisgICAgICAgIHBhdGgtPnNldFRvKCIvIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaG9zdC0+c2V0VG8oJnVybFs3XSwgc2xhc2hQb3MgLSAmdXJsWzddKTsKKyAgICAgICAgcGF0aC0+c2V0VG8oc2xhc2hQb3MpOworICAgIH0KKworICAgIGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKGhvc3QtPmNfc3RyKCksICc6Jyk7CisKKyAgICBpZiAoY29sb25Qb3MgIT0gTlVMTCkgeworICAgICAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgICAgIGlmICghUGFyc2VTaW5nbGVVbnNpZ25lZExvbmcoY29sb25Qb3MgKyAxLCAmeCkgfHwgeCA+PSA2NTUzNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnBvcnQgPSB4OworCisgICAgICAgIHNpemVfdCBjb2xvbk9mZnNldCA9IGNvbG9uUG9zIC0gaG9zdC0+Y19zdHIoKTsKKyAgICAgICAgc2l6ZV90IHRyYWlsaW5nID0gaG9zdC0+c2l6ZSgpIC0gY29sb25PZmZzZXQ7CisgICAgICAgIGhvc3QtPmVyYXNlKGNvbG9uT2Zmc2V0LCB0cmFpbGluZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBvcnQgPSA1NTQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIE1ha2VTb2NrZXRCbG9ja2luZyhpbnQgcywgYm9vbCBibG9ja2luZykgeworICAgIC8vIE1ha2Ugc29ja2V0IG5vbi1ibG9ja2luZy4KKyAgICBpbnQgZmxhZ3MgPSBmY250bChzLCBGX0dFVEZMLCAwKTsKKyAgICBDSEVDS19ORShmbGFncywgLTEpOworCisgICAgaWYgKGJsb2NraW5nKSB7CisgICAgICAgIGZsYWdzICY9IH5PX05PTkJMT0NLOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgfQorCisgICAgQ0hFQ0tfTkUoZmNudGwocywgRl9TRVRGTCwgZmxhZ3MpLCAtMSk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICArK21Db25uZWN0aW9uSUQ7CisKKyAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgeworICAgICAgICBjbG9zZShtU29ja2V0KTsKKyAgICAgICAgbVNvY2tldCA9IC0xOworCisgICAgICAgIGZsdXNoUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgfQorCisgICAgbVN0YXRlID0gQ09OTkVDVElORzsKKworICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCisgICAgTWFrZVNvY2tldEJsb2NraW5nKG1Tb2NrZXQsIGZhbHNlKTsKKworICAgIEFTdHJpbmcgdXJsOworICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJsIiwgJnVybCkpOworCisgICAgQVN0cmluZyBob3N0LCBwYXRoOworICAgIHVuc2lnbmVkIHBvcnQ7CisgICAgQ0hFQ0soUGFyc2VVUkwodXJsLmNfc3RyKCksICZob3N0LCAmcG9ydCwgJnBhdGgpKTsKKworICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKGhvc3QuY19zdHIoKSk7CisgICAgQ0hFQ0soZW50ICE9IE5VTEwpOworCisgICAgc3RydWN0IHNvY2thZGRyX2luIHJlbW90ZTsKKyAgICBtZW1zZXQocmVtb3RlLnNpbl96ZXJvLCAwLCBzaXplb2YocmVtb3RlLnNpbl96ZXJvKSk7CisgICAgcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIHJlbW90ZS5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOworICAgIHJlbW90ZS5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisgICAgaW50IGVyciA9IDo6Y29ubmVjdCgKKyAgICAgICAgICAgIG1Tb2NrZXQsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlLCBzaXplb2YocmVtb3RlKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKKworICAgIHJlcGx5LT5zZXRJbnQzMigic2VydmVyLWlwIiwgbnRvaGwocmVtb3RlLnNpbl9hZGRyLnNfYWRkcikpOworCisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlBST0dSRVNTKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29tcGxldGVDb25uZWN0aW9uLCBpZCgpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb25uZWN0aW9uLWlkIiwgbUNvbm5lY3Rpb25JRCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLWVycm5vKTsKKyAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworCisgICAgICAgIGNsb3NlKG1Tb2NrZXQpOworICAgICAgICBtU29ja2V0ID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBPSyk7CisgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKKyAgICAgICAgbU5leHRDU2VxID0gMTsKKworICAgICAgICBwb3N0UmVjZWl2ZVJlcG9uc2VFdmVudCgpOworICAgIH0KKworICAgIHJlcGx5LT5wb3N0KCk7Cit9CisKK3ZvaWQgQVJUU1BDb25uZWN0aW9uOjpvbkRpc2Nvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICBjbG9zZShtU29ja2V0KTsKKyAgICAgICAgbVNvY2tldCA9IC0xOworCisgICAgICAgIGZsdXNoUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7CisKKyAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIE9LKTsKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisKKyAgICByZXBseS0+cG9zdCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b25Db21wbGV0ZUNvbm5lY3Rpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicmVwbHkiLCAmcmVwbHkpKTsKKworICAgIGludDMyX3QgY29ubmVjdGlvbklEOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjb25uZWN0aW9uLWlkIiwgJmNvbm5lY3Rpb25JRCkpOworCisgICAgaWYgKChjb25uZWN0aW9uSUQgIT0gbUNvbm5lY3Rpb25JRCkgfHwgbVN0YXRlICE9IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgLy8gV2hpbGUgd2Ugd2VyZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QsIHRoZSBhdHRlbXB0IHdhcworICAgICAgICAvLyBjYW5jZWxsZWQuCisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLUVDT05OQUJPUlRFRCk7CisgICAgICAgIHJlcGx5LT5wb3N0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICB0di50dl9zZWMgPSAwOworICAgIHR2LnR2X3VzZWMgPSBrU2VsZWN0VGltZW91dFVzOworCisgICAgZmRfc2V0IHdzOworICAgIEZEX1pFUk8oJndzKTsKKyAgICBGRF9TRVQobVNvY2tldCwgJndzKTsKKworICAgIGludCByZXMgPSBzZWxlY3QobVNvY2tldCArIDEsIE5VTEwsICZ3cywgTlVMTCwgJnR2KTsKKyAgICBDSEVDS19HRShyZXMsIDApOworCisgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgIC8vIFRpbWVkIG91dC4gTm90IHlldCBjb25uZWN0ZWQuCisKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgZXJyOworICAgIHNvY2tsZW5fdCBvcHRpb25MZW4gPSBzaXplb2YoZXJyKTsKKyAgICBDSEVDS19FUShnZXRzb2Nrb3B0KG1Tb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmZXJyLCAmb3B0aW9uTGVuKSwgMCk7CisgICAgQ0hFQ0tfRVEob3B0aW9uTGVuLCAoc29ja2xlbl90KXNpemVvZihlcnIpKTsKKworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJlcnIgPSAiIDw8IGVyciA8PCAiICgiIDw8IHN0cmVycm9yKGVycikgPDwgIikiOworCisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgLWVycik7CisKKyAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworICAgICAgICBjbG9zZShtU29ja2V0KTsKKyAgICAgICAgbVNvY2tldCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgT0spOworICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7CisgICAgICAgIG1OZXh0Q1NlcSA9IDE7CisKKyAgICAgICAgcG9zdFJlY2VpdmVSZXBvbnNlRXZlbnQoKTsKKyAgICB9CisKKyAgICByZXBseS0+cG9zdCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b25TZW5kUmVxdWVzdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpOworCisgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCAtRU5PVENPTk4pOworICAgICAgICByZXBseS0+cG9zdCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVN0cmluZyByZXF1ZXN0OworICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygicmVxdWVzdCIsICZyZXF1ZXN0KSk7CisKKyAgICAvLyBGaW5kIHRoZSBib3VuZGFyeSBiZXR3ZWVuIGhlYWRlcnMgYW5kIHRoZSBib2R5LgorICAgIHNzaXplX3QgaSA9IHJlcXVlc3QuZmluZCgiXHJcblxyXG4iKTsKKyAgICBDSEVDS19HRShpLCAwKTsKKworICAgIGludDMyX3QgY3NlcSA9IG1OZXh0Q1NlcSsrOworCisgICAgQVN0cmluZyBjc2VxSGVhZGVyID0gIkNTZXE6ICI7CisgICAgY3NlcUhlYWRlci5hcHBlbmQoY3NlcSk7CisgICAgY3NlcUhlYWRlci5hcHBlbmQoIlxyXG4iKTsKKworICAgIHJlcXVlc3QuaW5zZXJ0KGNzZXFIZWFkZXIsIGkgKyAyKTsKKworICAgIExPRyhWRVJCT1NFKSA8PCByZXF1ZXN0OworCisgICAgc2l6ZV90IG51bUJ5dGVzU2VudCA9IDA7CisgICAgd2hpbGUgKG51bUJ5dGVzU2VudCA8IHJlcXVlc3Quc2l6ZSgpKSB7CisgICAgICAgIHNzaXplX3QgbiA9CisgICAgICAgICAgICBzZW5kKG1Tb2NrZXQsIHJlcXVlc3QuY19zdHIoKSArIG51bUJ5dGVzU2VudCwKKyAgICAgICAgICAgICAgICAgcmVxdWVzdC5zaXplKCkgLSBudW1CeXRlc1NlbnQsIDApOworCisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIC8vIFNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorCisgICAgICAgIG51bUJ5dGVzU2VudCArPSAoc2l6ZV90KW47CisgICAgfQorCisgICAgbVBlbmRpbmdSZXF1ZXN0cy5hZGQoY3NlcSwgcmVwbHkpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6b25SZWNlaXZlUmVzcG9uc2UoKSB7CisgICAgbVJlY2VpdmVSZXNwb25zZUV2ZW50UGVuZGluZyA9IGZhbHNlOworCisgICAgaWYgKG1TdGF0ZSAhPSBDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIHR2LnR2X3NlYyA9IDA7CisgICAgdHYudHZfdXNlYyA9IGtTZWxlY3RUaW1lb3V0VXM7CisKKyAgICBmZF9zZXQgcnM7CisgICAgRkRfWkVSTygmcnMpOworICAgIEZEX1NFVChtU29ja2V0LCAmcnMpOworCisgICAgaW50IHJlcyA9IHNlbGVjdChtU29ja2V0ICsgMSwgJnJzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgIENIRUNLX0dFKHJlcywgMCk7CisKKyAgICBpZiAocmVzID09IDEpIHsKKyAgICAgICAgTWFrZVNvY2tldEJsb2NraW5nKG1Tb2NrZXQsIHRydWUpOworCisgICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlY2VpdmVSVFNQUmVwb25zZSgpOworCisgICAgICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CisKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgaG9ycmlibGUsIGlycmVwYXJhYmxlIGhhcyBoYXBwZW5lZC4KKyAgICAgICAgICAgIGZsdXNoUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwb3N0UmVjZWl2ZVJlcG9uc2VFdmVudCgpOworfQorCit2b2lkIEFSVFNQQ29ubmVjdGlvbjo6Zmx1c2hQZW5kaW5nUmVxdWVzdHMoKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGVuZGluZ1JlcXVlc3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG1QZW5kaW5nUmVxdWVzdHMudmFsdWVBdChpKTsKKworICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1FQ09OTkFCT1JURUQpOworICAgICAgICByZXBseS0+cG9zdCgpOworICAgIH0KKworICAgIG1QZW5kaW5nUmVxdWVzdHMuY2xlYXIoKTsKK30KKwordm9pZCBBUlRTUENvbm5lY3Rpb246OnBvc3RSZWNlaXZlUmVwb25zZUV2ZW50KCkgeworICAgIGlmIChtUmVjZWl2ZVJlc3BvbnNlRXZlbnRQZW5kaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVjZWl2ZVJlc3BvbnNlLCBpZCgpKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIG1SZWNlaXZlUmVzcG9uc2VFdmVudFBlbmRpbmcgPSB0cnVlOworfQorCitzdGF0dXNfdCBBUlRTUENvbm5lY3Rpb246OnJlY2VpdmUodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICBzc2l6ZV90IG4gPSByZWN2KG1Tb2NrZXQsICh1aW50OF90ICopZGF0YSArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCwgMCk7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIC8vIFNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICs9IChzaXplX3QpbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQVJUU1BDb25uZWN0aW9uOjpyZWNlaXZlTGluZShBU3RyaW5nICpsaW5lKSB7CisgICAgbGluZS0+Y2xlYXIoKTsKKworICAgIGJvb2wgc2F3Q1IgPSBmYWxzZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgaWYgKHJlY2VpdmUoJmMsIDEpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2F3Q1IgJiYgYyA9PSAnXG4nKSB7CisgICAgICAgICAgICBsaW5lLT5lcmFzZShsaW5lLT5zaXplKCkgLSAxLCAxKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgbGluZS0+YXBwZW5kKCZjLCAxKTsKKworICAgICAgICBpZiAoYyA9PSAnJCcgJiYgbGluZS0+c2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIC8vIFNwZWNpYWwtY2FzZSBmb3IgaW50ZXJsZWF2ZWQgYmluYXJ5IGRhdGEuCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNhd0NSID0gKGMgPT0gJ1xyJyk7CisgICAgfQorfQorCitzcDxBQnVmZmVyPiBBUlRTUENvbm5lY3Rpb246OnJlY2VpdmVCaW5hcnlEYXRhKCkgeworICAgIHVpbnQ4X3QgeFszXTsKKyAgICBpZiAocmVjZWl2ZSh4LCAzKSAhPSBPSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcigoeFsxXSA8PCA4KSB8IHhbMl0pOworICAgIGlmIChyZWNlaXZlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJpbmRleCIsIChpbnQzMl90KXhbMF0pOworCisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKworYm9vbCBBUlRTUENvbm5lY3Rpb246OnJlY2VpdmVSVFNQUmVwb25zZSgpIHsKKyAgICBBU3RyaW5nIHN0YXR1c0xpbmU7CisKKyAgICBpZiAoIXJlY2VpdmVMaW5lKCZzdGF0dXNMaW5lKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YXR1c0xpbmUgPT0gIiQiKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IHJlY2VpdmVCaW5hcnlEYXRhKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9ic2VydmVCaW5hcnlNZXNzYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtT2JzZXJ2ZUJpbmFyeU1lc3NhZ2UtPmR1cCgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoImJ1ZmZlciIsIGJ1ZmZlcik7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicmVjZWl2ZWQgYmluYXJ5IGRhdGEsIGJ1dCBubyBvbmUgY2FyZXMuIjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0gbmV3IEFSVFNQUmVzcG9uc2U7CisgICAgcmVzcG9uc2UtPm1TdGF0dXNMaW5lID0gc3RhdHVzTGluZTsKKworICAgIExPRyhJTkZPKSA8PCAic3RhdHVzOiAiIDw8IHJlc3BvbnNlLT5tU3RhdHVzTGluZTsKKworICAgIHNzaXplX3Qgc3BhY2UxID0gcmVzcG9uc2UtPm1TdGF0dXNMaW5lLmZpbmQoIiAiKTsKKyAgICBpZiAoc3BhY2UxIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNzaXplX3Qgc3BhY2UyID0gcmVzcG9uc2UtPm1TdGF0dXNMaW5lLmZpbmQoIiAiLCBzcGFjZTEgKyAxKTsKKyAgICBpZiAoc3BhY2UyIDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVN0cmluZyBzdGF0dXNDb2RlU3RyKAorICAgICAgICAgICAgcmVzcG9uc2UtPm1TdGF0dXNMaW5lLCBzcGFjZTEgKyAxLCBzcGFjZTIgLSBzcGFjZTEgLSAxKTsKKworICAgIGlmICghUGFyc2VTaW5nbGVVbnNpZ25lZExvbmcoCisgICAgICAgICAgICAgICAgc3RhdHVzQ29kZVN0ci5jX3N0cigpLCAmcmVzcG9uc2UtPm1TdGF0dXNDb2RlKQorICAgICAgICAgICAgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlIDwgMTAwIHx8IHJlc3BvbnNlLT5tU3RhdHVzQ29kZSA+IDk5OSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVN0cmluZyBsaW5lOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCFyZWNlaXZlTGluZSgmbGluZSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpbmUuZW1wdHkoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBMT0coVkVSQk9TRSkgPDwgImxpbmU6ICIgPDwgbGluZTsKKworICAgICAgICBzc2l6ZV90IGNvbG9uUG9zID0gbGluZS5maW5kKCI6Iik7CisgICAgICAgIGlmIChjb2xvblBvcyA8IDApIHsKKyAgICAgICAgICAgIC8vIE1hbGZvcm1lZCBoZWFkZXIgbGluZS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcga2V5KGxpbmUsIDAsIGNvbG9uUG9zKTsKKyAgICAgICAga2V5LnRyaW0oKTsKKyAgICAgICAga2V5LnRvbG93ZXIoKTsKKworICAgICAgICBsaW5lLmVyYXNlKDAsIGNvbG9uUG9zICsgMSk7CisgICAgICAgIGxpbmUudHJpbSgpOworCisgICAgICAgIHJlc3BvbnNlLT5tSGVhZGVycy5hZGQoa2V5LCBsaW5lKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsb25nIGNvbnRlbnRMZW5ndGggPSAwOworCisgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImNvbnRlbnQtbGVuZ3RoIik7CisKKyAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWUgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCFQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZyh2YWx1ZS5jX3N0cigpLCAmY29udGVudExlbmd0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb250ZW50TGVuZ3RoID4gMCkgeworICAgICAgICByZXNwb25zZS0+bUNvbnRlbnQgPSBuZXcgQUJ1ZmZlcihjb250ZW50TGVuZ3RoKTsKKworICAgICAgICBzaXplX3QgbnVtQnl0ZXNSZWFkID0gMDsKKyAgICAgICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IGNvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgICAgIHNzaXplX3QgbiA9IHJlY3YoCisgICAgICAgICAgICAgICAgICAgIG1Tb2NrZXQsIHJlc3BvbnNlLT5tQ29udGVudC0+ZGF0YSgpICsgbnVtQnl0ZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoIC0gbnVtQnl0ZXNSZWFkLCAwKTsKKworICAgICAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtQnl0ZXNSZWFkICs9IChzaXplX3QpbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub3RpZnlSZXNwb25zZUxpc3RlbmVyKHJlc3BvbnNlKTsKK30KKworLy8gc3RhdGljCitib29sIEFSVFNQQ29ubmVjdGlvbjo6UGFyc2VTaW5nbGVVbnNpZ25lZExvbmcoCisgICAgICAgIGNvbnN0IGNoYXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgKngpIHsKKyAgICBjaGFyICplbmQ7CisgICAgKnggPSBzdHJ0b3VsKGZyb20sICZlbmQsIDEwKTsKKworICAgIGlmIChlbmQgPT0gZnJvbSB8fCAqZW5kICE9ICdcMCcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFSVFNQQ29ubmVjdGlvbjo6bm90aWZ5UmVzcG9uc2VMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3A8QVJUU1BSZXNwb25zZT4gJnJlc3BvbnNlKSB7CisgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImNzZXEiKTsKKworICAgIGlmIChpIDwgMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBBU3RyaW5nIHZhbHVlID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisKKyAgICB1bnNpZ25lZCBsb25nIGNzZXE7CisgICAgaWYgKCFQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZyh2YWx1ZS5jX3N0cigpLCAmY3NlcSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGkgPSBtUGVuZGluZ1JlcXVlc3RzLmluZGV4T2ZLZXkoY3NlcSk7CisKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgLy8gVW5zb2xpY2l0ZWQgcmVzcG9uc2U/CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbVBlbmRpbmdSZXF1ZXN0cy52YWx1ZUF0KGkpOworICAgIG1QZW5kaW5nUmVxdWVzdHMucmVtb3ZlSXRlbXNBdChpKTsKKworICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgT0spOworICAgIHJlcGx5LT5zZXRPYmplY3QoInJlc3BvbnNlIiwgcmVzcG9uc2UpOworICAgIHJlcGx5LT5wb3N0KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTBkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX1JUU1BfQ09OTkVDVElPTl9IXworCisjZGVmaW5lIEFfUlRTUF9DT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CisKK3N0cnVjdCBBUlRTUFJlc3BvbnNlIDogcHVibGljIFJlZkJhc2UgeworICAgIHVuc2lnbmVkIGxvbmcgbVN0YXR1c0NvZGU7CisgICAgQVN0cmluZyBtU3RhdHVzTGluZTsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLEFTdHJpbmc+IG1IZWFkZXJzOworICAgIHNwPEFCdWZmZXI+IG1Db250ZW50OworfTsKKworc3RydWN0IEFSVFNQQ29ubmVjdGlvbiA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgQVJUU1BDb25uZWN0aW9uKCk7CisKKyAgICB2b2lkIGNvbm5lY3QoY29uc3QgY2hhciAqdXJsLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKyAgICB2b2lkIGRpc2Nvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CisKKyAgICB2b2lkIHNlbmRSZXF1ZXN0KGNvbnN0IGNoYXIgKnJlcXVlc3QsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpOworCisgICAgdm9pZCBvYnNlcnZlQmluYXJ5RGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFSVFNQQ29ubmVjdGlvbigpOworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKK3ByaXZhdGU6CisgICAgZW51bSBTdGF0ZSB7CisgICAgICAgIERJU0NPTk5FQ1RFRCwKKyAgICAgICAgQ09OTkVDVElORywKKyAgICAgICAgQ09OTkVDVEVELAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRDb25uZWN0ICAgICAgICAgICAgPSAnY29ubicsCisgICAgICAgIGtXaGF0RGlzY29ubmVjdCAgICAgICAgID0gJ2Rpc2MnLAorICAgICAgICBrV2hhdENvbXBsZXRlQ29ubmVjdGlvbiA9ICdjb21jJywKKyAgICAgICAga1doYXRTZW5kUmVxdWVzdCAgICAgICAgPSAnc3JlcScsCisgICAgICAgIGtXaGF0UmVjZWl2ZVJlc3BvbnNlICAgID0gJ3JyZXMnLAorICAgICAgICBrV2hhdE9ic2VydmVCaW5hcnlEYXRhICA9ICdvYmluJywKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NlbGVjdFRpbWVvdXRVczsKKworICAgIFN0YXRlIG1TdGF0ZTsKKyAgICBpbnQgbVNvY2tldDsKKyAgICBpbnQzMl90IG1Db25uZWN0aW9uSUQ7CisgICAgaW50MzJfdCBtTmV4dENTZXE7CisgICAgYm9vbCBtUmVjZWl2ZVJlc3BvbnNlRXZlbnRQZW5kaW5nOworCisgICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc3A8QU1lc3NhZ2U+ID4gbVBlbmRpbmdSZXF1ZXN0czsKKworICAgIHNwPEFNZXNzYWdlPiBtT2JzZXJ2ZUJpbmFyeU1lc3NhZ2U7CisKKyAgICB2b2lkIG9uQ29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvbkRpc2Nvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25Db21wbGV0ZUNvbm5lY3Rpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25TZW5kUmVxdWVzdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblJlY2VpdmVSZXNwb25zZSgpOworCisgICAgdm9pZCBmbHVzaFBlbmRpbmdSZXF1ZXN0cygpOworICAgIHZvaWQgcG9zdFJlY2VpdmVSZXBvbnNlRXZlbnQoKTsKKworICAgIC8vIFJldHVybiBmYWxzZSBpZmYgc29tZXRoaW5nIHdlbnQgdW5yZWNvdmVyYWJseSB3cm9uZy4KKyAgICBib29sIHJlY2VpdmVSVFNQUmVwb25zZSgpOworICAgIHN0YXR1c190IHJlY2VpdmUodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgcmVjZWl2ZUxpbmUoQVN0cmluZyAqbGluZSk7CisgICAgc3A8QUJ1ZmZlcj4gcmVjZWl2ZUJpbmFyeURhdGEoKTsKKyAgICBib29sIG5vdGlmeVJlc3BvbnNlTGlzdGVuZXIoY29uc3Qgc3A8QVJUU1BSZXNwb25zZT4gJnJlc3BvbnNlKTsKKworICAgIHN0YXRpYyBib29sIFBhcnNlVVJMKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBBU3RyaW5nICpob3N0LCB1bnNpZ25lZCAqcG9ydCwgQVN0cmluZyAqcGF0aCk7CisKKyAgICBzdGF0aWMgYm9vbCBQYXJzZVNpbmdsZVVuc2lnbmVkTG9uZygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgKngpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUU1BDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9SVFNQX0NPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb250cm9sbGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUzNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFSVFNQQ29udHJvbGxlci5oIgorCisjaW5jbHVkZSAiTXlIYW5kbGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FSVFNQQ29udHJvbGxlcjo6QVJUU1BDb250cm9sbGVyKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIpCisgICAgOiBtU3RhdGUoRElTQ09OTkVDVEVEKSwKKyAgICAgIG1Mb29wZXIobG9vcGVyKSB7CisgICAgbVJlZmxlY3RvciA9IG5ldyBBSGFuZGxlclJlZmxlY3RvcjxBUlRTUENvbnRyb2xsZXI+KHRoaXMpOworICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworfQorCitBUlRTUENvbnRyb2xsZXI6On5BUlRTUENvbnRyb2xsZXIoKSB7CisgICAgQ0hFQ0tfRVEoKGludCltU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKK30KKworc3RhdHVzX3QgQVJUU1BDb250cm9sbGVyOjpjb25uZWN0KGNvbnN0IGNoYXIgKnVybCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgeworICAgICAgICByZXR1cm4gRVJST1JfQUxSRUFEWV9DT05ORUNURUQ7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3REb25lLCBtUmVmbGVjdG9yLT5pZCgpKTsKKworICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcih1cmwsIG1Mb29wZXIpOworCisgICAgbVN0YXRlID0gQ09OTkVDVElORzsKKworICAgIG1IYW5kbGVyLT5jb25uZWN0KG1zZyk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKKyAgICB9CisKKyAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgeworICAgICAgICBtSGFuZGxlci5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBtQ29ubmVjdGlvblJlc3VsdDsKK30KKwordm9pZCBBUlRTUENvbnRyb2xsZXI6OmRpc2Nvbm5lY3QoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdERvbmUsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgIG1IYW5kbGVyLT5kaXNjb25uZWN0KG1zZyk7CisKKyAgICB3aGlsZSAobVN0YXRlID09IENPTk5FQ1RFRCkgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgQVJUU1BDb250cm9sbGVyOjpzZWVrKGludDY0X3QgdGltZVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSGFuZGxlci0+c2Vlayh0aW1lVXMpOworfQorCitzaXplX3QgQVJUU1BDb250cm9sbGVyOjpjb3VudFRyYWNrcygpIHsKKyAgICBpZiAobUhhbmRsZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhbmRsZXItPmNvdW50VHJhY2tzKCk7Cit9CisKK3NwPE1lZGlhU291cmNlPiBBUlRTUENvbnRyb2xsZXI6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworICAgIENIRUNLKG1IYW5kbGVyICE9IE5VTEwpOworCisgICAgcmV0dXJuIG1IYW5kbGVyLT5nZXRQYWNrZXRTb3VyY2UoaW5kZXgpOworfQorCitzcDxNZXRhRGF0YT4gQVJUU1BDb250cm9sbGVyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgQ0hFQ0sobUhhbmRsZXIgIT0gTlVMTCk7CisKKyAgICByZXR1cm4gbUhhbmRsZXItPmdldFBhY2tldFNvdXJjZShpbmRleCktPmdldEZvcm1hdCgpOworfQorCit2b2lkIEFSVFNQQ29udHJvbGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDb25uZWN0RG9uZToKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZtQ29ubmVjdGlvblJlc3VsdCkpOworICAgICAgICAgICAgbVN0YXRlID0gKG1Db25uZWN0aW9uUmVzdWx0ID09IE9LKSA/IENPTk5FQ1RFRCA6IERJU0NPTk5FQ1RFRDsKKworICAgICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdERpc2Nvbm5lY3REb25lOgorICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOworICAgICAgICAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2ludDY0X3QgQVJUU1BDb250cm9sbGVyOjpnZXROb3JtYWxQbGF5VGltZVVzKCkgeworICAgIENIRUNLKG1IYW5kbGVyICE9IE5VTEwpOworICAgIHJldHVybiBtSGFuZGxlci0+Z2V0Tm9ybWFsUGxheVRpbWVVcygpOworfQorCitpbnQ2NF90IEFSVFNQQ29udHJvbGxlcjo6Z2V0UXVldWVEdXJhdGlvblVzKGJvb2wgKmVvcykgeworICAgICplb3MgPSB0cnVlOworCisgICAgaW50NjRfdCBtaW5RdWV1ZWREdXJhdGlvblVzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IYW5kbGVyLT5jb3VudFRyYWNrcygpOyArK2kpIHsKKyAgICAgICAgc3A8QVBhY2tldFNvdXJjZT4gc291cmNlID0gbUhhbmRsZXItPmdldFBhY2tldFNvdXJjZShpKTsKKworICAgICAgICBib29sIG5ld0VPUzsKKyAgICAgICAgaW50NjRfdCBxdWV1ZWREdXJhdGlvblVzID0gc291cmNlLT5nZXRRdWV1ZUR1cmF0aW9uVXMoJm5ld0VPUyk7CisKKyAgICAgICAgaWYgKCFuZXdFT1MpIHsKKyAgICAgICAgICAgICplb3MgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID09IDAgfHwgcXVldWVkRHVyYXRpb25VcyA8IG1pblF1ZXVlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1pblF1ZXVlZER1cmF0aW9uVXMgPSBxdWV1ZWREdXJhdGlvblVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1pblF1ZXVlZER1cmF0aW9uVXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE3ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQVNlc3Npb25EZXNjcmlwdGlvbjo6QVNlc3Npb25EZXNjcmlwdGlvbigpCisgICAgOiBtSXNWYWxpZChmYWxzZSkgeworfQorCitBU2Vzc2lvbkRlc2NyaXB0aW9uOjp+QVNlc3Npb25EZXNjcmlwdGlvbigpIHsKK30KKworYm9vbCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpzZXRUbyhjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1Jc1ZhbGlkID0gcGFyc2UoZGF0YSwgc2l6ZSk7CisKKyAgICBpZiAoIW1Jc1ZhbGlkKSB7CisgICAgICAgIG1UcmFja3MuY2xlYXIoKTsKKyAgICAgICAgbUZvcm1hdHMuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbUlzVmFsaWQ7Cit9CisKK2Jvb2wgQVNlc3Npb25EZXNjcmlwdGlvbjo6cGFyc2UoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBtVHJhY2tzLmNsZWFyKCk7CisgICAgbUZvcm1hdHMuY2xlYXIoKTsKKworICAgIG1UcmFja3MucHVzaChBdHRyaWJzKCkpOworICAgIG1Gb3JtYXRzLnB1c2goQVN0cmluZygiW3Jvb3RdIikpOworCisgICAgQVN0cmluZyBkZXNjKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CisgICAgTE9HKElORk8pIDw8IGRlc2M7CisKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBzc2l6ZV90IGVvbFBvcyA9IGRlc2MuZmluZCgiXHJcbiIsIGkpOworICAgICAgICBpZiAoZW9sUG9zIDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGxpbmUoZGVzYywgaSwgZW9sUG9zIC0gaSk7CisKKyAgICAgICAgaWYgKGxpbmUuc2l6ZSgpIDwgMiB8fCBsaW5lLmNfc3RyKClbMV0gIT0gJz0nKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGxpbmUuY19zdHIoKVswXSkgeworICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChsaW5lLmNfc3RyKCksICJ2PTAiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdhJzoKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5LCB2YWx1ZTsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiLCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb25Qb3MgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGxpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAga2V5LnNldFRvKGxpbmUsIDAsIGNvbG9uUG9zKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICJhPWZtdHAiIHx8IGtleSA9PSAiYT1ydHBtYXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwga2V5ID09ICJhPWZyYW1lc2l6ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3Qgc3BhY2VQb3MgPSBsaW5lLmZpbmQoIiAiLCBjb2xvblBvcyArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYWNlUG9zIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNldFRvKGxpbmUsIDAsIHNwYWNlUG9zKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29sb25Qb3MgPSBzcGFjZVBvczsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldFRvKGxpbmUsIGNvbG9uUG9zICsgMSwgbGluZS5zaXplKCkgLSBjb2xvblBvcyAtIDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGtleS50cmltKCk7CisgICAgICAgICAgICAgICAgdmFsdWUudHJpbSgpOworCisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJhZGRpbmcgJyIgPDwga2V5IDw8ICInID0+ICciIDw8IHZhbHVlIDw8ICInIjsKKworICAgICAgICAgICAgICAgIG1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJuZXcgc2VjdGlvbiAnIiA8PCBBU3RyaW5nKGxpbmUsIDIsIGxpbmUuc2l6ZSgpIC0gMikgPDwgIiciOworCisgICAgICAgICAgICAgICAgbVRyYWNrcy5wdXNoKEF0dHJpYnMoKSk7CisgICAgICAgICAgICAgICAgbUZvcm1hdHMucHVzaChBU3RyaW5nKGxpbmUsIDIsIGxpbmUuc2l6ZSgpIC0gMikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5LCB2YWx1ZTsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgZXF1YWxQb3MgPSBsaW5lLmZpbmQoIj0iKTsKKworICAgICAgICAgICAgICAgIGtleSA9IEFTdHJpbmcobGluZSwgMCwgZXF1YWxQb3MgKyAxKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEFTdHJpbmcobGluZSwgZXF1YWxQb3MgKyAxLCBsaW5lLnNpemUoKSAtIGVxdWFsUG9zIC0gMSk7CisKKyAgICAgICAgICAgICAgICBrZXkudHJpbSgpOworICAgICAgICAgICAgICAgIHZhbHVlLnRyaW0oKTsKKworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiYWRkaW5nICciIDw8IGtleSA8PCAiJyA9PiAnIiA8PCB2YWx1ZSA8PCAiJyI7CisKKyAgICAgICAgICAgICAgICBtVHJhY2tzLmVkaXRJdGVtQXQobVRyYWNrcy5zaXplKCkgLSAxKS5hZGQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpID0gZW9sUG9zICsgMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjppc1ZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiBtSXNWYWxpZDsKK30KKworc2l6ZV90IEFTZXNzaW9uRGVzY3JpcHRpb246OmNvdW50VHJhY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKK30KKwordm9pZCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpnZXRGb3JtYXQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgeworICAgIENIRUNLX0dFKGluZGV4LCAwdSk7CisgICAgQ0hFQ0tfTFQoaW5kZXgsIG1UcmFja3Muc2l6ZSgpKTsKKworICAgICp2YWx1ZSA9IG1Gb3JtYXRzLml0ZW1BdChpbmRleCk7Cit9CisKK2Jvb2wgQVNlc3Npb25EZXNjcmlwdGlvbjo6ZmluZEF0dHJpYnV0ZSgKKyAgICAgICAgc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSBjb25zdCB7CisgICAgQ0hFQ0tfR0UoaW5kZXgsIDB1KTsKKyAgICBDSEVDS19MVChpbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBjb25zdCBBdHRyaWJzICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KGluZGV4KTsKKyAgICBzc2l6ZV90IGkgPSB0cmFjay5pbmRleE9mS2V5KEFTdHJpbmcoa2V5KSk7CisKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICp2YWx1ZSA9IHRyYWNrLnZhbHVlQXQoaSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpnZXRGb3JtYXRUeXBlKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKlBULAorICAgICAgICBBU3RyaW5nICpkZXNjLCBBU3RyaW5nICpwYXJhbXMpIGNvbnN0IHsKKyAgICBBU3RyaW5nIGZvcm1hdDsKKyAgICBnZXRGb3JtYXQoaW5kZXgsICZmb3JtYXQpOworCisgICAgY2hhciAqbGFzdFNwYWNlUG9zID0gc3RycmNocihmb3JtYXQuY19zdHIoKSwgJyAnKTsKKyAgICBDSEVDSyhsYXN0U3BhY2VQb3MgIT0gTlVMTCk7CisKKyAgICBjaGFyICplbmQ7CisgICAgdW5zaWduZWQgbG9uZyB4ID0gc3RydG91bChsYXN0U3BhY2VQb3MgKyAxLCAmZW5kLCAxMCk7CisgICAgQ0hFQ0tfR1QoZW5kLCBsYXN0U3BhY2VQb3MgKyAxKTsKKyAgICBDSEVDS19FUSgqZW5kLCAnXDAnKTsKKworICAgICpQVCA9IHg7CisKKyAgICBjaGFyIGtleVsyMF07CisgICAgc3ByaW50ZihrZXksICJhPXJ0cG1hcDolbHUiLCB4KTsKKworICAgIENIRUNLKGZpbmRBdHRyaWJ1dGUoaW5kZXgsIGtleSwgZGVzYykpOworCisgICAgc3ByaW50ZihrZXksICJhPWZtdHA6JWx1IiwgeCk7CisgICAgaWYgKCFmaW5kQXR0cmlidXRlKGluZGV4LCBrZXksIHBhcmFtcykpIHsKKyAgICAgICAgcGFyYW1zLT5jbGVhcigpOworICAgIH0KK30KKworYm9vbCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpnZXREaW1lbnNpb25zKAorICAgICAgICBzaXplX3QgaW5kZXgsIHVuc2lnbmVkIGxvbmcgUFQsCisgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIGNvbnN0IHsKKyAgICAqd2lkdGggPSAwOworICAgICpoZWlnaHQgPSAwOworCisgICAgY2hhciBrZXlbMjBdOworICAgIHNwcmludGYoa2V5LCAiYT1mcmFtZXNpemU6JWx1IiwgUFQpOworICAgIEFTdHJpbmcgdmFsdWU7CisgICAgaWYgKCFmaW5kQXR0cmlidXRlKGluZGV4LCBrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnMgPSB2YWx1ZS5jX3N0cigpOworICAgIGNoYXIgKmVuZDsKKyAgICAqd2lkdGggPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKyAgICBDSEVDS19HVChlbmQsIHMpOworICAgIENIRUNLX0VRKCplbmQsICctJyk7CisKKyAgICBzID0gZW5kICsgMTsKKyAgICAqaGVpZ2h0ID0gc3RydG91bChzLCAmZW5kLCAxMCk7CisgICAgQ0hFQ0tfR1QoZW5kLCBzKTsKKyAgICBDSEVDS19FUSgqZW5kLCAnXDAnKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFTZXNzaW9uRGVzY3JpcHRpb246OmdldER1cmF0aW9uVXMoaW50NjRfdCAqZHVyYXRpb25VcykgY29uc3QgeworICAgICpkdXJhdGlvblVzID0gMDsKKworICAgIENIRUNLKG1Jc1ZhbGlkKTsKKworICAgIEFTdHJpbmcgdmFsdWU7CisgICAgaWYgKCFmaW5kQXR0cmlidXRlKDAsICJhPXJhbmdlIiwgJnZhbHVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHZhbHVlID09ICJucHQ9bm93LSIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ9IiwgNCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnMgPSB2YWx1ZS5jX3N0cigpICsgNDsKKyAgICBjaGFyICplbmQ7CisgICAgZG91YmxlIGZyb20gPSBzdHJ0b2QocywgJmVuZCk7CisgICAgQ0hFQ0tfR1QoZW5kLCBzKTsKKyAgICBDSEVDS19FUSgqZW5kLCAnLScpOworCisgICAgcyA9IGVuZCArIDE7CisgICAgZG91YmxlIHRvID0gc3RydG9kKHMsICZlbmQpOworICAgIENIRUNLX0dUKGVuZCwgcyk7CisgICAgQ0hFQ0tfRVEoKmVuZCwgJ1wwJyk7CisKKyAgICBDSEVDS19HRSh0bywgZnJvbSk7CisKKyAgICAqZHVyYXRpb25VcyA9IChpbnQ2NF90KSgodG8gLSBmcm9tKSAqIDFFNik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCit2b2lkIEFTZXNzaW9uRGVzY3JpcHRpb246OlBhcnNlRm9ybWF0RGVzYygKKyAgICAgICAgY29uc3QgY2hhciAqZGVzYywgaW50MzJfdCAqdGltZXNjYWxlLCBpbnQzMl90ICpudW1DaGFubmVscykgeworICAgIGNvbnN0IGNoYXIgKnNsYXNoMSA9IHN0cmNocihkZXNjLCAnLycpOworICAgIENIRUNLKHNsYXNoMSAhPSBOVUxMKTsKKworICAgIGNvbnN0IGNoYXIgKnMgPSBzbGFzaDEgKyAxOworICAgIGNoYXIgKmVuZDsKKyAgICB1bnNpZ25lZCBsb25nIHggPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKyAgICBDSEVDS19HVChlbmQsIHMpOworICAgIENIRUNLKCplbmQgPT0gJ1wwJyB8fCAqZW5kID09ICcvJyk7CisKKyAgICAqdGltZXNjYWxlID0geDsKKyAgICAqbnVtQ2hhbm5lbHMgPSAxOworCisgICAgaWYgKCplbmQgPT0gJy8nKSB7CisgICAgICAgIHMgPSBlbmQgKyAxOworICAgICAgICB1bnNpZ25lZCBsb25nIHggPSBzdHJ0b3VsKHMsICZlbmQsIDEwKTsKKyAgICAgICAgQ0hFQ0tfR1QoZW5kLCBzKTsKKyAgICAgICAgQ0hFQ0tfRVEoKmVuZCwgJ1wwJyk7CisKKyAgICAgICAgKm51bUNoYW5uZWxzID0geDsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYTc5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfU0VTU0lPTl9ERVNDUklQVElPTl9IXworCisjZGVmaW5lIEFfU0VTU0lPTl9ERVNDUklQVElPTl9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFTdHJpbmc7CisKK3N0cnVjdCBBU2Vzc2lvbkRlc2NyaXB0aW9uIDogcHVibGljIFJlZkJhc2UgeworICAgIEFTZXNzaW9uRGVzY3JpcHRpb24oKTsKKworICAgIGJvb2wgc2V0VG8oY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworCisgICAgLy8gQWN0dWFsbHksIDEgKyBudW1iZXIgb2YgdHJhY2tzLCBhcyBpbmRleCAwIGlzIHJlc2VydmVkIGZvciB0aGUKKyAgICAvLyBzZXNzaW9uIGRlc2NyaXB0aW9uIHJvb3QtbGV2ZWwgYXR0cmlidXRlcy4KKyAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdDsKKyAgICB2b2lkIGdldEZvcm1hdChzaXplX3QgaW5kZXgsIEFTdHJpbmcgKnZhbHVlKSBjb25zdDsKKworICAgIHZvaWQgZ2V0Rm9ybWF0VHlwZSgKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdW5zaWduZWQgbG9uZyAqUFQsCisgICAgICAgICAgICBBU3RyaW5nICpkZXNjLCBBU3RyaW5nICpwYXJhbXMpIGNvbnN0OworCisgICAgYm9vbCBnZXREaW1lbnNpb25zKAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1bnNpZ25lZCBsb25nIFBULAorICAgICAgICAgICAgaW50MzJfdCAqd2lkdGgsIGludDMyX3QgKmhlaWdodCkgY29uc3Q7CisKKyAgICBib29sIGdldER1cmF0aW9uVXMoaW50NjRfdCAqZHVyYXRpb25VcykgY29uc3Q7CisKKyAgICBzdGF0aWMgdm9pZCBQYXJzZUZvcm1hdERlc2MoCisgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjLCBpbnQzMl90ICp0aW1lc2NhbGUsIGludDMyX3QgKm51bUNoYW5uZWxzKTsKKworICAgIGJvb2wgZmluZEF0dHJpYnV0ZShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVNlc3Npb25EZXNjcmlwdGlvbigpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8QVN0cmluZyxBU3RyaW5nPiBBdHRyaWJzOworCisgICAgYm9vbCBtSXNWYWxpZDsKKyAgICBWZWN0b3I8QXR0cmlicz4gbVRyYWNrczsKKyAgICBWZWN0b3I8QVN0cmluZz4gbUZvcm1hdHM7CisKKyAgICBib29sIHBhcnNlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFTZXNzaW9uRGVzY3JpcHRpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX1NFU1NJT05fREVTQ1JJUFRJT05fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE2MDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgXAorICAgICAgICBBQU1SQXNzZW1ibGVyLmNwcCAgICAgICAgICAgXAorICAgICAgICBBQVZDQXNzZW1ibGVyLmNwcCAgICAgICAgICAgXAorICAgICAgICBBSDI2M0Fzc2VtYmxlci5jcHAgICAgICAgICAgXAorICAgICAgICBBTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAgICAgXAorICAgICAgICBBTVBFRzRFbGVtZW50YXJ5QXNzZW1ibGVyLmNwcCBcCisgICAgICAgIEFQYWNrZXRTb3VyY2UuY3BwICAgICAgICAgICBcCisgICAgICAgIEFSVFBBc3NlbWJsZXIuY3BwICAgICAgICAgICBcCisgICAgICAgIEFSVFBDb25uZWN0aW9uLmNwcCAgICAgICAgICBcCisgICAgICAgIEFSVFBTZXNzaW9uLmNwcCAgICAgICAgICAgICBcCisgICAgICAgIEFSVFBTb3VyY2UuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIEFSVFBXcml0ZXIuY3BwICAgICAgICAgICAgICBcCisgICAgICAgIEFSVFNQQ29ubmVjdGlvbi5jcHAgICAgICAgICBcCisgICAgICAgIEFSVFNQQ29udHJvbGxlci5jcHAgICAgICAgICBcCisgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb24uY3BwICAgICBcCisgICAgICAgIFVEUFB1c2hlci5jcHAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJJChUT1ApL2V4dGVybmFsL29wZW5jb3JlL2V4dGVybl9saWJzX3YyL2tocm9ub3Mvb3Blbm1heC9pbmNsdWRlIFwKKyAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIFwKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfcnRzcAorCitpZmVxICgkKFRBUkdFVF9BUkNIKSxhcm0pCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tcHNhYmkKK2VuZGlmCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAorICAgICAgICBydHBfdGVzdC5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9ydHNwCisKK0xPQ0FMX0NfSU5DTFVERVM6PSBcCisJJChKTklfSF9JTkNMVURFKSBcCisJZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwkkKFRPUCkvZXh0ZXJuYWwvb3BlbmNvcmUvZXh0ZXJuX2xpYnNfdjIva2hyb25vcy9vcGVubWF4L2luY2x1ZGUKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IGRlYnVnCisKK0xPQ0FMX01PRFVMRTo9IHJ0cF90ZXN0CisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0OTExNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTAsMCArMSw4OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1ZX0hBTkRMRVJfSF8KKworI2RlZmluZSBNWV9IQU5ETEVSX0hfCisKKyNpbmNsdWRlICJBUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVJUUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJBU2Vzc2lvbkRlc2NyaXB0aW9uLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKworLy8gSWYgbm8gYWNjZXNzIHVuaXRzIGFyZSByZWNlaXZlZCB3aXRoaW4gMyBzZWNzLCBhc3N1bWUgdGhhdCB0aGUgcnRwCisvLyBzdHJlYW0gaGFzIGVuZGVkIGFuZCBzaWduYWwgZW5kIG9mIHN0cmVhbS4KK3N0YXRpYyBpbnQ2NF90IGtBY2Nlc3NVbml0VGltZW91dFVzID0gMzAwMDAwMGxsOworCisvLyBJZiBubyBhY2Nlc3MgdW5pdHMgYXJyaXZlIGZvciB0aGUgZmlyc3QgMTAgc2VjcyBhZnRlciBzdGFydGluZyB0aGUKKy8vIHN0cmVhbSwgYXNzdW1lIG5vbmUgZXZlciB3aWxsIGFuZCBzaWduYWwgRU9TIG9yIHN3aXRjaCB0cmFuc3BvcnRzLgorc3RhdGljIGludDY0X3Qga1N0YXJ0dXBUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgeworICAgICAgICAgICAgKytzOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKKworICAgICAgICBzaXplX3QgbGVuID0KKyAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKKworICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKKyAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzID0gY29sb25Qb3MgKyAxOworICAgIH0KK30KKworc3RydWN0IE15SGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgTXlIYW5kbGVyKGNvbnN0IGNoYXIgKnVybCwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKyAgICAgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCisgICAgICAgICAgbUNvbm4obmV3IEFSVFNQQ29ubmVjdGlvbiksCisgICAgICAgICAgbVJUUENvbm4obmV3IEFSVFBDb25uZWN0aW9uKSwKKyAgICAgICAgICBtU2Vzc2lvblVSTCh1cmwpLAorICAgICAgICAgIG1TZXR1cFRyYWNrc1N1Y2Nlc3NmdWwoZmFsc2UpLAorICAgICAgICAgIG1TZWVrUGVuZGluZyhmYWxzZSksCisgICAgICAgICAgbUZpcnN0QWNjZXNzVW5pdCh0cnVlKSwKKyAgICAgICAgICBtRmlyc3RBY2Nlc3NVbml0TlRQKDApLAorICAgICAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkKDApLAorICAgICAgICAgIG1DaGVja1BlbmRpbmcoZmFsc2UpLAorICAgICAgICAgIG1UcnlUQ1BJbnRlcmxlYXZpbmcoZmFsc2UpLAorICAgICAgICAgIG1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldChmYWxzZSkgeworICAgICAgICBtTmV0TG9vcGVyLT5zZXROYW1lKCJydHNwIG5ldCIpOworICAgICAgICBtTmV0TG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGNhbkNhbGxKYXZhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ISUdIRVNUKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZkb25lTXNnKSB7CisgICAgICAgIG1Eb25lTXNnID0gZG9uZU1zZzsKKworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29ubik7CisgICAgICAgICgxID8gbU5ldExvb3BlciA6IG1Mb29wZXIpLT5yZWdpc3RlckhhbmRsZXIobVJUUENvbm4pOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2JpbnknLCBpZCgpKTsKKyAgICAgICAgbUNvbm4tPm9ic2VydmVCaW5hcnlEYXRhKG5vdGlmeSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgIG1Db25uLT5jb25uZWN0KG1TZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZkb25lTXNnKSB7CisgICAgICAgIG1Eb25lTXNnID0gZG9uZU1zZzsKKworICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgfQorCisgICAgdm9pZCBzZWVrKGludDY0X3QgdGltZVVzKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3NlZWsnLCBpZCgpKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZSIsIHRpbWVVcyk7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKworICAgIGludDY0X3QgZ2V0Tm9ybWFsUGxheVRpbWVVcygpIHsKKyAgICAgICAgaW50NjRfdCBtYXhUaW1lVXMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gbVRyYWNrcy5lZGl0SXRlbUF0KGkpLm1QYWNrZXRTb3VyY2UKKyAgICAgICAgICAgICAgICAtPmdldE5vcm1hbFBsYXlUaW1lVXMoKTsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCB8fCB0aW1lVXMgPiBtYXhUaW1lVXMpIHsKKyAgICAgICAgICAgICAgICBtYXhUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWF4VGltZVVzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICBjYXNlICdjb25uJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJjb25uZWN0aW9uIHJlcXVlc3QgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gIkRFU0NSSUJFICI7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkFjY2VwdDogYXBwbGljYXRpb24vc2RwXHJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGVzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnZGlzYyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZWNvbm5lY3Q7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWNvbm5lY3QiLCAmcmVjb25uZWN0KSAmJiByZWNvbm5lY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5jb25uZWN0KG1TZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdkZXNjJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJERVNDUklCRSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDMwMikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImxvY2F0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwgPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9ICJERVNDUklCRSAiOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25VUkwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcFxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGVzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uRGVzYyA9IG5ldyBBU2Vzc2lvbkRlc2NyaXB0aW9uOworCisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkRlc2MtPnNldFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+bUNvbnRlbnQtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPm1Db250ZW50LT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtU2Vzc2lvbkRlc2MtPmlzVmFsaWQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJjb250ZW50LWJhc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmFzZVVSTCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoImNvbnRlbnQtbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXNlVVJMID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhc2VVUkwgPSBtU2Vzc2lvblVSTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dUKG1TZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKSwgMXUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBUcmFjaygxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3NldHUnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJpbmRleCIsICZpbmRleCkpOworCisgICAgICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFNpemUoInRyYWNrLWluZGV4IiwgJnRyYWNrSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJTRVRVUCgiIDw8IGluZGV4IDw8ICIpIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrICE9IE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInNlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKGksIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklEID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gbVNlc3Npb25JRC5maW5kKCI7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9wdGlvbnMsIGkuZS4gIjt0aW1lb3V0PTkwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSUQuZXJhc2UoaSwgbVNlc3Npb25JRC5zaXplKCkgLSBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYWNjdScsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFjay1pbmRleCIsIHRyYWNrSW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtUlRQQ29ubi0+YWRkU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJUUFNvY2tldCwgdHJhY2stPm1SVENQU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkRlc2MsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnksIHRyYWNrLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR1cFRyYWNrc1N1Y2Nlc3NmdWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhY2stPm1Vc2luZ0ludGVybGVhdmVkVENQKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICsraW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbVNlc3Npb25EZXNjLT5jb3VudFRyYWNrcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwVHJhY2soaW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNldHVwVHJhY2tzU3VjY2Vzc2Z1bCkgeworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3QgPSAiUExBWSAiOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvblVSTCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGxheScsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3BsYXknOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBMQVkgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEocmVzcG9uc2UtPm1TdGF0dXNDb2RlLCAyMDB1KTsKKworICAgICAgICAgICAgICAgICAgICBwYXJzZVBsYXlSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+cG9zdChrU3RhcnR1cFRpbWVvdXRVcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KHJlcGx5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnYWJvcic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworCisgICAgICAgICAgICAgICAgICAgIGlmICghaW5mby0+bVVzaW5nSW50ZXJsZWF2ZWRUQ1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SVFBDb25uLT5yZW1vdmVTdHJlYW0oaW5mby0+bVJUUFNvY2tldCwgaW5mby0+bVJUQ1BTb2NrZXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhY2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVNldHVwVHJhY2tzU3VjY2Vzc2Z1bCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TZWVrUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXROVFAgPSAwOworICAgICAgICAgICAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkID0gMDsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZWRGaXJzdFJUQ1BQYWNrZXQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgndGVhcicsIGlkKCkpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCByZWNvbm5lY3Q7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWNvbm5lY3QiLCAmcmVjb25uZWN0KSAmJiByZWNvbm5lY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZWNvbm5lY3QiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdCA9ICJURUFSRE9XTiAiOworCisgICAgICAgICAgICAgICAgLy8gWFhYIHNob3VsZCB1c2UgYWdncmVnYXRlIHVybCBmcm9tIFNEUCBoZXJlLi4uCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25VUkwpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgUlRTUC8xLjBcclxuIik7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVNlc3Npb25JRCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3RlYXInOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlRFQVJET1dOIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25uZWN0OworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgJiYgcmVjb25uZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVjb25uZWN0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdxdWl0JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobURvbmVNc2cgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBtRG9uZU1zZy0+c2V0SW50MzIoInJlc3VsdCIsIFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgICAgICBtRG9uZU1zZy0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBtRG9uZU1zZyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdjaGVrJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobU51bUFjY2Vzc1VuaXRzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInN0cmVhbSBlbmRlZD8gYWJvcnRpbmcuIjsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtTnVtQWNjZXNzVW5pdHNSZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgbXNnLT5wb3N0KGtBY2Nlc3NVbml0VGltZW91dFVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnYWNjdSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBmaXJzdFJUQ1A7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJmaXJzdC1ydGNwIiwgJmZpcnN0UlRDUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlY2VpdmVkRmlyc3RSVENQUGFja2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKyttTnVtQWNjZXNzVW5pdHNSZWNlaXZlZDsKKworICAgICAgICAgICAgICAgIGlmICghbUNoZWNrUGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICBtQ2hlY2tQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGNoZWNrID0gbmV3IEFNZXNzYWdlKCdjaGVrJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrLT5wb3N0KGtBY2Nlc3NVbml0VGltZW91dFVzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJ0cmFjay1pbmRleCIsICZ0cmFja0luZGV4KSk7CisKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tJbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJsYXRlIHBhY2tldHMgaWdub3JlZC4iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZW9zOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW9zIiwgJmVvcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJyZWNlaXZlZCBCWUUgb24gdHJhY2sgaW5kZXggIiA8PCB0cmFja0luZGV4OworI2lmIDAKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRTb3VyY2UtPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiYWNjZXNzLXVuaXQiLCAmb2JqKSk7CisKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gc3RhdGljX2Nhc3Q8QUJ1ZmZlciAqPihvYmouZ2V0KCkpOworCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2VxTnVtID0gKHVpbnQzMl90KWFjY2Vzc1VuaXQtPmludDMyRGF0YSgpOworCisgICAgICAgICAgICAgICAgaWYgKHNlcU51bSA8IHRyYWNrLT5tRmlyc3RTZXFOdW1JblNlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJkcm9wcGluZyBzdGFsZSBhY2Nlc3MtdW5pdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgc2VxTnVtIDw8ICIgPCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0cmFjay0+bUZpcnN0U2VxTnVtSW5TZWdtZW50IDw8ICIpIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWludDY0X3QgbnRwVGltZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnRwLXRpbWUiLCAoaW50NjRfdCAqKSZudHBUaW1lKSk7CisKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bU5ld1NlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1OZXdTZWdtZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJmaXJzdCBzZWdtZW50IHVuaXQgbnRwVGltZT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjB4JTAxNmxseCIsIG50cFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHJ0cFRpbWU9IiA8PCBydHBUaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHNlcT0iIDw8IHNlcU51bTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobUZpcnN0QWNjZXNzVW5pdCkgeworICAgICAgICAgICAgICAgICAgICBtRG9uZU1zZy0+c2V0SW50MzIoInJlc3VsdCIsIE9LKTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2ctPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbURvbmVNc2cgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbUZpcnN0QWNjZXNzVW5pdE5UUCA9IG50cFRpbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG50cFRpbWUgPj0gbUZpcnN0QWNjZXNzVW5pdE5UUCkgeworICAgICAgICAgICAgICAgICAgICBudHBUaW1lIC09IG1GaXJzdEFjY2Vzc1VuaXROVFA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbnRwVGltZSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSAoaW50NjRfdCkobnRwVGltZSAqIDFFNiAvICgxbGwgPDwgMzIpKTsKKworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisKKyNpZiAwCisgICAgICAgICAgICAgICAgaW50MzJfdCBkYW1hZ2VkOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGFtYWdlZCIsICZkYW1hZ2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGFtYWdlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiaWdub3JpbmcgZGFtYWdlZCBBVSI7CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnc2Vlayc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1TZWVrUGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZSIsICZ0aW1lVXMpKTsKKworICAgICAgICAgICAgICAgIG1TZWVrUGVuZGluZyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3QgPSAiUEFVU0UgIjsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvblVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2VlMScsIGlkKCkpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQ2NCgidGltZSIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdzZWUxJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTZXNzaW9uIGlzIHBhdXNlZCBub3cuCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuZWRpdEl0ZW1BdChpKS5tUGFja2V0U291cmNlLT5mbHVzaFF1ZXVlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUiLCAmdGltZVVzKSk7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3QgPSAiUExBWSAiOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uVVJMKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFuZ2U6IG5wdD0lbGxkLVxyXG4iLCB0aW1lVXMgLyAxMDAwMDAwbGwpKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NlZTInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3NlZTInOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENIRUNLKG1TZWVrUGVuZGluZyk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJQTEFZIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBDSEVDS19FUShyZXN1bHQsIChzdGF0dXNfdClPSyk7CisKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKHJlc3BvbnNlLT5tU3RhdHVzQ29kZSwgMjAwdSk7CisKKyAgICAgICAgICAgICAgICBwYXJzZVBsYXlSZXNwb25zZShyZXNwb25zZSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInNlZWsgY29tcGxldGVkLiI7CisgICAgICAgICAgICAgICAgbVNlZWtQZW5kaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2JpbnknOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImJ1ZmZlciIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBzdGF0aWNfY2FzdDxBQnVmZmVyICo+KG9iai5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7CisKKyAgICAgICAgICAgICAgICBtUlRQQ29ubi0+aW5qZWN0UGFja2V0KGluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICd0aW91JzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVRyeVRDUEludGVybGVhdmluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJOZXZlciByZWNlaXZlZCBhbnkgZGF0YSwgZGlzY29ubmVjdGluZy4iOworICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5ldmVyIHJlY2VpdmVkIGFueSBkYXRhLCBzd2l0Y2hpbmcgdHJhbnNwb3J0cy4iOworCisgICAgICAgICAgICAgICAgICAgICAgICBtVHJ5VENQSW50ZXJsZWF2aW5nID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicmVjb25uZWN0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgU3BsaXRTdHJpbmcoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZzLCBjb25zdCBjaGFyICpzZXBhcmF0b3IsIExpc3Q8QVN0cmluZz4gKml0ZW1zKSB7CisgICAgICAgIGl0ZW1zLT5jbGVhcigpOworICAgICAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgICAgICB3aGlsZSAoc3RhcnQgPCBzLnNpemUoKSkgeworICAgICAgICAgICAgc3NpemVfdCBvZmZzZXQgPSBzLmZpbmQoc2VwYXJhdG9yLCBzdGFydCk7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgaXRlbXMtPnB1c2hfYmFjayhBU3RyaW5nKHMsIHN0YXJ0LCBzLnNpemUoKSAtIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0ZW1zLT5wdXNoX2JhY2soQVN0cmluZyhzLCBzdGFydCwgb2Zmc2V0IC0gc3RhcnQpKTsKKyAgICAgICAgICAgIHN0YXJ0ID0gb2Zmc2V0ICsgc3RybGVuKHNlcGFyYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHBhcnNlUGxheVJlc3BvbnNlKGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSkgeworICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgicmFuZ2UiKTsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAvLyBTZXJ2ZXIgZG9lc24ndCBldmVuIHRlbGwgdXNlIHdoYXQgcmFuZ2UgaXQgaXMgZ29pbmcgdG8KKyAgICAgICAgICAgIC8vIHBsYXksIHRoZXJlZm9yZSB3ZSB3b24ndCBzdXBwb3J0IHNlZWtpbmcuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIHJhbmdlID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiUmFuZ2U6ICIgPDwgcmFuZ2U7CisKKyAgICAgICAgQVN0cmluZyB2YWw7CisgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZShyYW5nZS5jX3N0cigpLCAibnB0IiwgJnZhbCkpOworICAgICAgICBmbG9hdCBucHQxLCBucHQyOworCisgICAgICAgIGlmICh2YWwgPT0gIm5vdy0iKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGl2ZSBzdHJlYW0gYW5kIHRoZXJlZm9yZSBub3Qgc2Vla2FibGUuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19FUShzc2NhbmYodmFsLmNfc3RyKCksICIlZi0lZiIsICZucHQxLCAmbnB0MiksIDIpOworICAgICAgICB9CisKKyAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJydHAtaW5mbyIpOworICAgICAgICBDSEVDS19HRShpLCAwKTsKKworICAgICAgICBBU3RyaW5nIHJ0cEluZm8gPSByZXNwb25zZS0+bUhlYWRlcnMudmFsdWVBdChpKTsKKyAgICAgICAgTGlzdDxBU3RyaW5nPiBzdHJlYW1JbmZvczsKKyAgICAgICAgU3BsaXRTdHJpbmcocnRwSW5mbywgIiwiLCAmc3RyZWFtSW5mb3MpOworCisgICAgICAgIGludCBuID0gMTsKKyAgICAgICAgZm9yIChMaXN0PEFTdHJpbmc+OjppdGVyYXRvciBpdCA9IHN0cmVhbUluZm9zLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gc3RyZWFtSW5mb3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICgqaXQpLnRyaW0oKTsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAic3RyZWFtSW5mb1siIDw8IG4gPDwgIl0gPSAiIDw8ICppdDsKKworICAgICAgICAgICAgQ0hFQ0soR2V0QXR0cmlidXRlKCgqaXQpLmNfc3RyKCksICJ1cmwiLCAmdmFsKSk7CisKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cmFja0luZGV4IDwgbVRyYWNrcy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgISh2YWwgPT0gbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpLm1VUkwpKSB7CisgICAgICAgICAgICAgICAgKyt0cmFja0luZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfTFQodHJhY2tJbmRleCwgbVRyYWNrcy5zaXplKCkpOworCisgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUoKCppdCkuY19zdHIoKSwgInNlcSIsICZ2YWwpKTsKKworICAgICAgICAgICAgY2hhciAqZW5kOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzZXEgPSBzdHJ0b3VsKHZhbC5jX3N0cigpLCAmZW5kLCAxMCk7CisKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7CisgICAgICAgICAgICBpbmZvLT5tRmlyc3RTZXFOdW1JblNlZ21lbnQgPSBzZXE7CisgICAgICAgICAgICBpbmZvLT5tTmV3U2VnbWVudCA9IHRydWU7CisKKyAgICAgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZSgoKml0KS5jX3N0cigpLCAicnRwdGltZSIsICZ2YWwpKTsKKworICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZSA9IHN0cnRvdWwodmFsLmNfc3RyKCksICZlbmQsIDEwKTsKKworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJ0cmFjayAjIiA8PCBuCisgICAgICAgICAgICAgICAgICAgICAgPDwgIjogcnRwVGltZT0iIDw8IHJ0cFRpbWUgPDwgIiA8PT4gbnB0PSIgPDwgbnB0MTsKKworICAgICAgICAgICAgaW5mby0+bVBhY2tldFNvdXJjZS0+c2V0Tm9ybWFsUGxheVRpbWVNYXBwaW5nKAorICAgICAgICAgICAgICAgICAgICBydHBUaW1lLCAoaW50NjRfdCkobnB0MSAqIDFFNikpOworCisgICAgICAgICAgICArK247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxBUGFja2V0U291cmNlPiBnZXRQYWNrZXRTb3VyY2Uoc2l6ZV90IGluZGV4KSB7CisgICAgICAgIENIRUNLX0dFKGluZGV4LCAwdSk7CisgICAgICAgIENIRUNLX0xUKGluZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICAgICAgcmV0dXJuIG1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCkubVBhY2tldFNvdXJjZTsKKyAgICB9CisKKyAgICBzaXplX3QgY291bnRUcmFja3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKyAgICBzcDxBTG9vcGVyPiBtTmV0TG9vcGVyOworICAgIHNwPEFSVFNQQ29ubmVjdGlvbj4gbUNvbm47CisgICAgc3A8QVJUUENvbm5lY3Rpb24+IG1SVFBDb25uOworICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IG1TZXNzaW9uRGVzYzsKKyAgICBBU3RyaW5nIG1TZXNzaW9uVVJMOworICAgIEFTdHJpbmcgbUJhc2VVUkw7CisgICAgQVN0cmluZyBtU2Vzc2lvbklEOworICAgIGJvb2wgbVNldHVwVHJhY2tzU3VjY2Vzc2Z1bDsKKyAgICBib29sIG1TZWVrUGVuZGluZzsKKyAgICBib29sIG1GaXJzdEFjY2Vzc1VuaXQ7CisgICAgdWludDY0X3QgbUZpcnN0QWNjZXNzVW5pdE5UUDsKKyAgICBpbnQ2NF90IG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkOworICAgIGJvb2wgbUNoZWNrUGVuZGluZzsKKyAgICBib29sIG1UcnlUQ1BJbnRlcmxlYXZpbmc7CisgICAgYm9vbCBtUmVjZWl2ZWRGaXJzdFJUQ1BQYWNrZXQ7CisKKyAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgQVN0cmluZyBtVVJMOworICAgICAgICBpbnQgbVJUUFNvY2tldDsKKyAgICAgICAgaW50IG1SVENQU29ja2V0OworICAgICAgICBib29sIG1Vc2luZ0ludGVybGVhdmVkVENQOworICAgICAgICB1aW50MzJfdCBtRmlyc3RTZXFOdW1JblNlZ21lbnQ7CisgICAgICAgIGJvb2wgbU5ld1NlZ21lbnQ7CisKKyAgICAgICAgc3A8QVBhY2tldFNvdXJjZT4gbVBhY2tldFNvdXJjZTsKKyAgICB9OworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisKKyAgICBzcDxBTWVzc2FnZT4gbURvbmVNc2c7CisKKyAgICB2b2lkIHNldHVwVHJhY2soc2l6ZV90IGluZGV4KSB7CisgICAgICAgIHNwPEFQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgICAgICBuZXcgQVBhY2tldFNvdXJjZShtU2Vzc2lvbkRlc2MsIGluZGV4KTsKKworICAgICAgICBpZiAoc291cmNlLT5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBmb3JtYXQuIElnbm9yaW5nIHRyYWNrICMiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZXggPDwgIi4iOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCBpZCgpKTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigicmVzdWx0IiwgRVJST1JfVU5TVVBQT1JURUQpOworICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFTdHJpbmcgdXJsOworICAgICAgICBDSEVDSyhtU2Vzc2lvbkRlc2MtPmZpbmRBdHRyaWJ1dGUoaW5kZXgsICJhPWNvbnRyb2wiLCAmdXJsKSk7CisKKyAgICAgICAgQVN0cmluZyB0cmFja1VSTDsKKyAgICAgICAgQ0hFQ0soTWFrZVVSTChtQmFzZVVSTC5jX3N0cigpLCB1cmwuY19zdHIoKSwgJnRyYWNrVVJMKSk7CisKKyAgICAgICAgbVRyYWNrcy5wdXNoKFRyYWNrSW5mbygpKTsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChtVHJhY2tzLnNpemUoKSAtIDEpOworICAgICAgICBpbmZvLT5tVVJMID0gdHJhY2tVUkw7CisgICAgICAgIGluZm8tPm1QYWNrZXRTb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIGluZm8tPm1Vc2luZ0ludGVybGVhdmVkVENQID0gZmFsc2U7CisgICAgICAgIGluZm8tPm1GaXJzdFNlcU51bUluU2VnbWVudCA9IDA7CisgICAgICAgIGluZm8tPm1OZXdTZWdtZW50ID0gdHJ1ZTsKKworICAgICAgICBMT0coVkVSQk9TRSkgPDwgInRyYWNrICMiIDw8IG1UcmFja3Muc2l6ZSgpIDw8ICIgVVJMPSIgPDwgdHJhY2tVUkw7CisKKyAgICAgICAgQVN0cmluZyByZXF1ZXN0ID0gIlNFVFVQICI7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKHRyYWNrVVJMKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICBpZiAobVRyeVRDUEludGVybGVhdmluZykgeworICAgICAgICAgICAgc2l6ZV90IGludGVybGVhdmVJbmRleCA9IDIgKiAobVRyYWNrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGluZm8tPm1Vc2luZ0ludGVybGVhdmVkVENQID0gdHJ1ZTsKKyAgICAgICAgICAgIGluZm8tPm1SVFBTb2NrZXQgPSBpbnRlcmxlYXZlSW5kZXg7CisgICAgICAgICAgICBpbmZvLT5tUlRDUFNvY2tldCA9IGludGVybGVhdmVJbmRleCArIDE7CisKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlAvVENQO2ludGVybGVhdmVkPSIpOworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoaW50ZXJsZWF2ZUluZGV4KTsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCItIik7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChpbnRlcmxlYXZlSW5kZXggKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHJ0cFBvcnQ7CisgICAgICAgICAgICBBUlRQQ29ubmVjdGlvbjo6TWFrZVBvcnRQYWlyKAorICAgICAgICAgICAgICAgICAgICAmaW5mby0+bVJUUFNvY2tldCwgJmluZm8tPm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CisKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0KTsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCItIik7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0ICsgMSk7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIGlmIChpbmRleCA+IDEpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgIHJlcGx5LT5zZXRTaXplKCJpbmRleCIsIGluZGV4KTsKKyAgICAgICAgcmVwbHktPnNldFNpemUoInRyYWNrLWluZGV4IiwgbVRyYWNrcy5zaXplKCkgLSAxKTsKKyAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIE1ha2VVUkwoY29uc3QgY2hhciAqYmFzZVVSTCwgY29uc3QgY2hhciAqdXJsLCBBU3RyaW5nICpvdXQpIHsKKyAgICAgICAgb3V0LT5jbGVhcigpOworCisgICAgICAgIGlmIChzdHJuY2FzZWNtcCgicnRzcDovLyIsIGJhc2VVUkwsIDcpKSB7CisgICAgICAgICAgICAvLyBCYXNlIFVSTCBtdXN0IGJlIGFic29sdXRlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJydHNwOi8vIiwgdXJsLCA3KSkgeworICAgICAgICAgICAgLy8gInVybCIgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwsIGlnbm9yZSBiYXNlIFVSTC4KKyAgICAgICAgICAgIG91dC0+c2V0VG8odXJsKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG4gPSBzdHJsZW4oYmFzZVVSTCk7CisgICAgICAgIGlmIChiYXNlVVJMW24gLSAxXSA9PSAnLycpIHsKKyAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7CisgICAgICAgICAgICBvdXQtPmFwcGVuZCh1cmwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqc2xhc2hQb3MgPSBzdHJyY2hyKGJhc2VVUkwsICcvJyk7CisKKyAgICAgICAgICAgIGlmIChzbGFzaFBvcyA+ICZiYXNlVVJMWzZdKSB7CisgICAgICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMLCBzbGFzaFBvcyAtIGJhc2VVUkwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQtPmFwcGVuZCgiLyIpOworICAgICAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE15SGFuZGxlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1ZX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5YTNiMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlUcmFuc21pdHRlci5oCkBAIC0wLDAgKzEsOTgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNWV9UUkFOU01JVFRFUl9IXworCisjZGVmaW5lIE1ZX1RSQU5TTUlUVEVSX0hfCisKKyNpbmNsdWRlICJBUlRQQ29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2lmZGVmIEFORFJPSUQKKyNpbmNsdWRlICJWaWRlb1NvdXJjZS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgVFJBQ0tfU1VGRklYICAgICJ0cmFja2lkPTEiCisjZGVmaW5lIFBUICAgICAgICAgICAgICA5NgorI2RlZmluZSBQVF9TVFIgICAgICAgICAgIjk2IgorCisjZGVmaW5lIFVTRVJOQU1FICAgICAgICAiYmNhc3QiCisjZGVmaW5lIFBBU1NXT1JEICAgICAgICAidGVzdCIKKworc3RhdGljIGludCB1bmlmb3JtUmFuZChpbnQgbGltaXQpIHsKKyAgICByZXR1cm4gKChkb3VibGUpcmFuZCgpICogbGltaXQpIC8gUkFORF9NQVg7Cit9CisKK3N0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CisgICAgdmFsdWUtPmNsZWFyKCk7CisKKyAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmNvbG9uUG9zID0gc3RyY2hyKHMsICc7Jyk7CisKKyAgICAgICAgc2l6ZV90IGxlbiA9CisgICAgICAgICAgICAoY29sb25Qb3MgPT0gTlVMTCkgPyBzdHJsZW4ocykgOiBjb2xvblBvcyAtIHM7CisKKyAgICAgICAgaWYgKGxlbiA+PSBrZXlMZW4gKyAxICYmIHNba2V5TGVuXSA9PSAnPScgJiYgIXN0cm5jbXAocywga2V5LCBrZXlMZW4pKSB7CisgICAgICAgICAgICB2YWx1ZS0+c2V0VG8oJnNba2V5TGVuICsgMV0sIGxlbiAtIGtleUxlbiAtIDEpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29sb25Qb3MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcyA9IGNvbG9uUG9zICsgMTsKKyAgICB9Cit9CisKK3N0cnVjdCBNeVRyYW5zbWl0dGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBNeVRyYW5zbWl0dGVyKGNvbnN0IGNoYXIgKnVybCwgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlcikKKyAgICAgICAgOiBtU2VydmVyVVJMKHVybCksCisgICAgICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgICAgIG1Db25uKG5ldyBBUlRTUENvbm5lY3Rpb24pLAorICAgICAgICAgIG1Db25uZWN0ZWQoZmFsc2UpLAorICAgICAgICAgIG1BdXRoVHlwZShOT05FKSwKKyAgICAgICAgICBtUlRQU29ja2V0KC0xKSwKKyAgICAgICAgICBtUlRDUFNvY2tldCgtMSksCisgICAgICAgICAgbVNvdXJjZUlEKHJhbmQoKSksCisgICAgICAgICAgbVNlcU5vKHVuaWZvcm1SYW5kKDY1NTM2KSksCisgICAgICAgICAgbVJUUFRpbWVCYXNlKHJhbmQoKSksCisgICAgICAgICAgbU51bVNhbXBsZXNTZW50KDApLAorICAgICAgICAgIG1OdW1SVFBTZW50KDApLAorICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50KDApLAorICAgICAgICAgIG1MYXN0UlRQVGltZSgwKSwKKyAgICAgICAgICBtTGFzdE5UUFRpbWUoMCkgeworICAgICAgICBtU3RyZWFtVVJMID0gbVNlcnZlclVSTDsKKyAgICAgICAgbVN0cmVhbVVSTC5hcHBlbmQoIi9iYXpvbmcuc2RwIik7CisKKyAgICAgICAgbVRyYWNrVVJMID0gbVN0cmVhbVVSTDsKKyAgICAgICAgbVRyYWNrVVJMLmFwcGVuZCgiLyIpOworICAgICAgICBtVHJhY2tVUkwuYXBwZW5kKFRSQUNLX1NVRkZJWCk7CisKKyAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUNvbm4pOworCisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICBtQ29ubi0+Y29ubmVjdChtU2VydmVyVVJMLmNfc3RyKCksIHJlcGx5KTsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgaW50IHdpZHRoID0gNjQwOworICAgICAgICBpbnQgaGVpZ2h0ID0gNDgwOworCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBzb3VyY2UgPSBuZXcgVmlkZW9Tb3VyY2Uod2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgc3A8TWV0YURhdGE+IGVuY01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIGVuY01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICBlbmNNZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKKyAgICAgICAgZW5jTWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKworICAgICAgICBPTVhDbGllbnQgY2xpZW50OworICAgICAgICBjbGllbnQuY29ubmVjdCgpOworCisgICAgICAgIG1FbmNvZGVyID0gT01YQ29kZWM6OkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksIGVuY01ldGEsCisgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjcmVhdGVFbmNvZGVyICovLCBzb3VyY2UpOworCisgICAgICAgIG1FbmNvZGVyLT5zdGFydCgpOworCisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIENIRUNLX0VRKG1FbmNvZGVyLT5yZWFkKCZidWZmZXIpLCAoc3RhdHVzX3QpT0spOworICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKKyAgICAgICAgbWFrZUgyNjRTUHJvcFBhcmFtU2V0cyhidWZmZXIpOworCisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBidWZmZXIgPSBOVUxMOworI2VuZGlmCisgICAgfQorCisgICAgdWludDY0X3QgbnRwVGltZSgpIHsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisgICAgICAgIHVpbnQ2NF90IG5vd1VzID0gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfdXNlYzsKKworICAgICAgICBub3dVcyArPSAoKDcwbGwgKiAzNjUgKyAxNykgKiAyNCkgKiA2MCAqIDYwICogMTAwMDAwMGxsOworCisgICAgICAgIHVpbnQ2NF90IGhpID0gbm93VXMgLyAxMDAwMDAwbGw7CisgICAgICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7CisKKyAgICAgICAgcmV0dXJuIChoaSA8PCAzMikgfCBsbzsKKyAgICB9CisKKyAgICB2b2lkIGlzc3VlQW5ub3VuY2UoKSB7CisgICAgICAgIEFTdHJpbmcgc2RwOworICAgICAgICBzZHAgPSAidj0wXHJcbiI7CisKKyAgICAgICAgc2RwLmFwcGVuZCgibz0tICIpOworCisgICAgICAgIHVpbnQ2NF90IG50cCA9IG50cFRpbWUoKTsKKyAgICAgICAgc2RwLmFwcGVuZChudHApOworICAgICAgICBzZHAuYXBwZW5kKCIgIik7CisgICAgICAgIHNkcC5hcHBlbmQobnRwKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiIElOIElQNCAxMjcuMC4wLjBcclxuIik7CisKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgInM9U2FtcGxlXHJcbiIKKyAgICAgICAgICAgICAgImk9UGxheWluZyBhcm91bmQgd2l0aCBBTk5PVU5DRVxyXG4iCisgICAgICAgICAgICAgICJjPUlOIElQNCAiKTsKKworICAgICAgICBzdHJ1Y3QgaW5fYWRkciBhZGRyOworICAgICAgICBhZGRyLnNfYWRkciA9IGh0b25sKG1TZXJ2ZXJJUCk7CisKKyAgICAgICAgc2RwLmFwcGVuZChpbmV0X250b2EoYWRkcikpOworCisgICAgICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAgICAgICAiYT1yYW5nZTpucHQ9bm93LVxyXG4iKTsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRW5jb2Rlci0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CisKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgIm09dmlkZW8gMCBSVFAvQVZQICIgUFRfU1RSICJcclxuIgorICAgICAgICAgICAgICAiYj1BUyAzMjAwMDBcclxuIgorICAgICAgICAgICAgICAiYT1ydHBtYXA6IiBQVF9TVFIgIiBIMjY0LzkwMDAwXHJcbiIpOworCisgICAgICAgIHNkcC5hcHBlbmQoImE9Y2xpcHJlY3QgMCwwLCIpOworICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7CisgICAgICAgIHNkcC5hcHBlbmQoIiwiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICBzZHAuYXBwZW5kKAorICAgICAgICAgICAgICAiYT1mcmFtZXNpemU6IiBQVF9TVFIgIiAiKTsKKyAgICAgICAgc2RwLmFwcGVuZCh3aWR0aCk7CisgICAgICAgIHNkcC5hcHBlbmQoIi0iKTsKKyAgICAgICAgc2RwLmFwcGVuZChoZWlnaHQpOworICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgc2RwLmFwcGVuZCgKKyAgICAgICAgICAgICAgImE9Zm10cDoiIFBUX1NUUiAiIHByb2ZpbGUtbGV2ZWwtaWQ9NDJDMDE1O3Nwcm9wLXBhcmFtZXRlci1zZXRzPSIpOworCisgICAgICAgIHNkcC5hcHBlbmQobVNlcVBhcmFtU2V0KTsKKyAgICAgICAgc2RwLmFwcGVuZCgiLCIpOworICAgICAgICBzZHAuYXBwZW5kKG1QaWNQYXJhbVNldCk7CisgICAgICAgIHNkcC5hcHBlbmQoIjtwYWNrZXRpemF0aW9uLW1vZGU9MVxyXG4iKTsKKyNlbHNlCisgICAgICAgIHNkcC5hcHBlbmQoCisgICAgICAgICAgICAgICAgIm09YXVkaW8gMCBSVFAvQVZQICIgUFRfU1RSICJcclxuIgorICAgICAgICAgICAgICAgICJhPXJ0cG1hcDoiIFBUX1NUUiAiIEw4LzgwMDAvMVxyXG4iKTsKKyNlbmRpZgorCisgICAgICAgIHNkcC5hcHBlbmQoImE9Y29udHJvbDoiIFRSQUNLX1NVRkZJWCAiXHJcbiIpOworCisgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkFOTk9VTkNFICIpOworICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIkFOTk9VTkNFIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKKworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zZHBcclxuIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJDb250ZW50LUxlbmd0aDogIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcC5zaXplKCkpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcCk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdhbm5vJywgaWQoKSk7CisgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICB9CisKKyAgICB2b2lkIEgoY29uc3QgQVN0cmluZyAmcywgQVN0cmluZyAqb3V0KSB7CisgICAgICAgIG91dC0+Y2xlYXIoKTsKKworICAgICAgICBNRDVfQ1RYIG07CisgICAgICAgIE1ENV9Jbml0KCZtKTsKKyAgICAgICAgTUQ1X1VwZGF0ZSgmbSwgcy5jX3N0cigpLCBzLnNpemUoKSk7CisKKyAgICAgICAgdWludDhfdCBrZXlbMTZdOworICAgICAgICBNRDVfRmluYWwoa2V5LCAmbSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICAgICAgICBjaGFyIG5pYmJsZSA9IGtleVtpXSA+PiA0OworICAgICAgICAgICAgaWYgKG5pYmJsZSA8PSA5KSB7CisgICAgICAgICAgICAgICAgbmliYmxlICs9ICcwJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmliYmxlICs9ICdhJyAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LT5hcHBlbmQoJm5pYmJsZSwgMSk7CisKKyAgICAgICAgICAgIG5pYmJsZSA9IGtleVtpXSAmIDB4MGY7CisgICAgICAgICAgICBpZiAobmliYmxlIDw9IDkpIHsKKyAgICAgICAgICAgICAgICBuaWJibGUgKz0gJzAnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuaWJibGUgKz0gJ2EnIC0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQtPmFwcGVuZCgmbmliYmxlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXV0aGVudGljYXRlKGNvbnN0IHNwPEFSVFNQUmVzcG9uc2U+ICZyZXNwb25zZSkgeworICAgICAgICBzc2l6ZV90IGkgPSByZXNwb25zZS0+bUhlYWRlcnMuaW5kZXhPZktleSgid3d3LWF1dGhlbnRpY2F0ZSIpOworICAgICAgICBDSEVDS19HRShpLCAwKTsKKworICAgICAgICBBU3RyaW5nIHZhbHVlID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisKKyAgICAgICAgaWYgKCFzdHJuY21wKHZhbHVlLmNfc3RyKCksICJCYXNpYyIsIDUpKSB7CisgICAgICAgICAgICBtQXV0aFR5cGUgPSBCQVNJQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKCFzdHJuY21wKHZhbHVlLmNfc3RyKCksICJEaWdlc3QiLCA2KSk7CisgICAgICAgICAgICBtQXV0aFR5cGUgPSBESUdFU1Q7CisKKyAgICAgICAgICAgIGkgPSB2YWx1ZS5maW5kKCJub25jZT0iKTsKKyAgICAgICAgICAgIENIRUNLX0dFKGksIDApOworICAgICAgICAgICAgQ0hFQ0tfRVEodmFsdWUuY19zdHIoKVtpICsgNl0sICdcIicpOworICAgICAgICAgICAgc3NpemVfdCBqID0gdmFsdWUuZmluZCgiXCIiLCBpICsgNyk7CisgICAgICAgICAgICBDSEVDS19HRShqLCAwKTsKKworICAgICAgICAgICAgbU5vbmNlLnNldFRvKHZhbHVlLCBpICsgNywgaiAtIGkgLSA3KTsKKyAgICAgICAgfQorCisgICAgICAgIGlzc3VlQW5ub3VuY2UoKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEF1dGhlbnRpY2F0aW9uKAorICAgICAgICAgICAgQVN0cmluZyAqcmVxdWVzdCwgY29uc3QgY2hhciAqbWV0aG9kLCBjb25zdCBjaGFyICp1cmwpIHsKKyAgICAgICAgaWYgKG1BdXRoVHlwZSA9PSBOT05FKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF1dGhUeXBlID09IEJBU0lDKSB7CisgICAgICAgICAgICByZXF1ZXN0LT5hcHBlbmQoIkF1dGhvcml6YXRpb246IEJhc2ljIFltTmhjM1E2ZEdWemRBbz1cclxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDSEVDS19FUSgoaW50KW1BdXRoVHlwZSwgKGludClESUdFU1QpOworCisgICAgICAgIEFTdHJpbmcgQTE7CisgICAgICAgIEExLmFwcGVuZChVU0VSTkFNRSk7CisgICAgICAgIEExLmFwcGVuZCgiOiIpOworICAgICAgICBBMS5hcHBlbmQoIlN0cmVhbWluZyBTZXJ2ZXIiKTsKKyAgICAgICAgQTEuYXBwZW5kKCI6Iik7CisgICAgICAgIEExLmFwcGVuZChQQVNTV09SRCk7CisKKyAgICAgICAgQVN0cmluZyBBMjsKKyAgICAgICAgQTIuYXBwZW5kKG1ldGhvZCk7CisgICAgICAgIEEyLmFwcGVuZCgiOiIpOworICAgICAgICBBMi5hcHBlbmQodXJsKTsKKworICAgICAgICBBU3RyaW5nIEhBMSwgSEEyOworICAgICAgICBIKEExLCAmSEExKTsKKyAgICAgICAgSChBMiwgJkhBMik7CisKKyAgICAgICAgQVN0cmluZyB0bXA7CisgICAgICAgIHRtcC5hcHBlbmQoSEExKTsKKyAgICAgICAgdG1wLmFwcGVuZCgiOiIpOworICAgICAgICB0bXAuYXBwZW5kKG1Ob25jZSk7CisgICAgICAgIHRtcC5hcHBlbmQoIjoiKTsKKyAgICAgICAgdG1wLmFwcGVuZChIQTIpOworCisgICAgICAgIEFTdHJpbmcgZGlnZXN0OworICAgICAgICBIKHRtcCwgJmRpZ2VzdCk7CisKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJBdXRob3JpemF0aW9uOiBEaWdlc3QgIik7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgibm9uY2U9XCIiKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKG1Ob25jZSk7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIsICIpOworICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInVzZXJuYW1lPVwiIiBVU0VSTkFNRSAiXCIsICIpOworICAgICAgICByZXF1ZXN0LT5hcHBlbmQoInVyaT1cIiIpOworICAgICAgICByZXF1ZXN0LT5hcHBlbmQodXJsKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcIiwgIik7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgicmVzcG9uc2U9XCIiKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKGRpZ2VzdCk7CisgICAgICAgIHJlcXVlc3QtPmFwcGVuZCgiXCIiKTsKKyAgICAgICAgcmVxdWVzdC0+YXBwZW5kKCJcclxuIik7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgIGNhc2UgJ2Nvbm4nOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImNvbm5lY3Rpb24gcmVxdWVzdCBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlcnZlci1pcCIsIChpbnQzMl90ICopJm1TZXJ2ZXJJUCkpOworCisgICAgICAgICAgICAgICAgaXNzdWVBbm5vdW5jZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdhbm5vJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJBTk5PVU5DRSBjb21wbGV0ZWQgd2l0aCByZXN1bHQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0IDw8ICIgKCIgPDwgc3RyZXJyb3IoLXJlc3VsdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVzcG9uc2UiLCAmb2JqKSk7CisgICAgICAgICAgICAgICAgc3A8QVJUU1BSZXNwb25zZT4gcmVzcG9uc2U7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc3RhdGljX2Nhc3Q8QVJUU1BSZXNwb25zZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhyZXNwb25zZSAhPSBOVUxMKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UtPm1TdGF0dXNDb2RlID09IDQwMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdXRoVHlwZSAhPSBOT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGQUlMRUQgdG8gYXV0aGVudGljYXRlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZShyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0sgfHwgcmVzcG9uc2UtPm1TdGF0dXNDb2RlICE9IDIwMCkgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJ0cFBvcnQ7CisgICAgICAgICAgICAgICAgQVJUUENvbm5lY3Rpb246Ok1ha2VQb3J0UGFpcigmbVJUUFNvY2tldCwgJm1SVENQU29ja2V0LCAmcnRwUG9ydCk7CisKKyAgICAgICAgICAgICAgICAvLyAobmV3IEFNZXNzYWdlKCdwb2xsJywgaWQoKSkpLT5wb3N0KCk7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNFVFVQICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1UcmFja1VSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiU0VUVVAiLCBtVHJhY2tVUkwuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVHJhbnNwb3J0OiBSVFAvQVZQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQocnRwUG9ydCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIi0iKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChydHBQb3J0ICsgMSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIjttb2RlPXJlY29yZFxyXG4iKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZXR1JywgaWQoKSk7CisgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisjaWYgMAorICAgICAgICAgICAgY2FzZSAncG9sbCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmRfc2V0IHJzOworICAgICAgICAgICAgICAgIEZEX1pFUk8oJnJzKTsKKyAgICAgICAgICAgICAgICBGRF9TRVQobVJUQ1BTb2NrZXQsICZycyk7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICAgICAgICAgICAgICB0di50dl9zZWMgPSAwOworICAgICAgICAgICAgICAgIHR2LnR2X3VzZWMgPSAwOworCisgICAgICAgICAgICAgICAgaW50IHJlcyA9IHNlbGVjdChtUlRDUFNvY2tldCArIDEsICZycywgTlVMTCwgTlVMTCwgJnR2KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHJlY3YobVJUQ1BTb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicmVjdiByZXR1cm5lZCAiIDw8IG47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgInJlY3YgcmV0dXJuZWQgIiA8PCBuIDw8ICIgYnl0ZXMgb2YgZGF0YS4iOworCisgICAgICAgICAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgY2FzZSAnc2V0dSc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiU0VUVVAgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3NpemVfdCBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInNlc3Npb24iKTsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklEID0gcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaSA9IG1TZXNzaW9uSUQuZmluZCgiOyIpOworICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG9wdGlvbnMsIGkuZS4gIjt0aW1lb3V0PTkwIgorICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklELmVyYXNlKGksIG1TZXNzaW9uSUQuc2l6ZSgpIC0gaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaSA9IHJlc3BvbnNlLT5tSGVhZGVycy5pbmRleE9mS2V5KCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICBDSEVDS19HRShpLCAwKTsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRyYW5zcG9ydCA9IHJlc3BvbnNlLT5tSGVhZGVycy52YWx1ZUF0KGkpOworCisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJ0cmFuc3BvcnQgPSAnIiA8PCB0cmFuc3BvcnQgPDwgIiciOworCisgICAgICAgICAgICAgICAgQVN0cmluZyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUodHJhbnNwb3J0LmNfc3RyKCksICJzZXJ2ZXJfcG9ydCIsICZ2YWx1ZSkpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgcnRwUG9ydCwgcnRjcFBvcnQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoc3NjYW5mKHZhbHVlLmNfc3RyKCksICIldS0ldSIsICZydHBQb3J0LCAmcnRjcFBvcnQpLCAyKTsKKworICAgICAgICAgICAgICAgIENIRUNLKEdldEF0dHJpYnV0ZSh0cmFuc3BvcnQuY19zdHIoKSwgInNvdXJjZSIsICZ2YWx1ZSkpOworCisgICAgICAgICAgICAgICAgbWVtc2V0KG1SZW1vdGVBZGRyLnNpbl96ZXJvLCAwLCBzaXplb2YobVJlbW90ZUFkZHIuc2luX3plcm8pKTsKKyAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgICAgICAgICBtUmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIodmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbVJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhydHBQb3J0KTsKKworICAgICAgICAgICAgICAgIG1SZW1vdGVSVENQQWRkciA9IG1SZW1vdGVBZGRyOworICAgICAgICAgICAgICAgIG1SZW1vdGVSVENQQWRkci5zaW5fcG9ydCA9IGh0b25zKHJ0cFBvcnQgKyAxKTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKDAsIGNvbm5lY3QobVJUUFNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmbVJlbW90ZUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobVJlbW90ZUFkZHIpKSk7CisKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwLCBjb25uZWN0KG1SVENQU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZtUmVtb3RlUlRDUEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobVJlbW90ZVJUQ1BBZGRyKSkpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgeCA9IG50b2hsKG1SZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJzZW5kaW5nIGRhdGEgdG8gIgorICAgICAgICAgICAgICAgICAgICAgPDwgKHggPj4gMjQpCisgICAgICAgICAgICAgICAgICAgICA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICgoeCA+PiAxNikgJiAweGZmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAoKHggPj4gOCkgJiAweGZmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgICA8PCAoeCAmIDB4ZmYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiOiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJ0cFBvcnQ7CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlJFQ09SRCAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiIFJUU1AvMS4wXHJcbiIpOworCisgICAgICAgICAgICAgICAgYWRkQXV0aGVudGljYXRpb24oJnJlcXVlc3QsICJSRUNPUkQiLCBtU3RyZWFtVVJMLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncmVjbycsIGlkKCkpOworICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAncmVjbyc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiUkVDT1JEIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzdGF0aWNfY2FzdDxBUlRTUFJlc3BvbnNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKHJlc3BvbnNlICE9IE5VTEwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdtb3JlJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnc3IgICcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKSktPnBvc3QoMzAwMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ2FsaXYnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIk9QVElPTlMgIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiUkVDT1JEIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJTZXNzaW9uOiAiKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU2Vzc2lvbklEKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ29wdHMnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ29wdHMnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIk9QVElPTlMgY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIGlmICghbUNvbm5lY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgaWQoKSkpLT5wb3N0KDMwMDAwMDAwbGwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdtb3JlJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgICAgICAgICBkYXRhWzFdID0gKDEgPDwgNykgfCBQVDsgIC8vIE0tYml0CisgICAgICAgICAgICAgICAgZGF0YVsyXSA9IChtU2VxTm8gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOworICAgICAgICAgICAgICAgIGRhdGFbOF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgICAgICAgICAgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKKworI2lmZGVmIEFORFJPSUQKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUVuY29kZXItPnJlYWQoJm1lZGlhQnVmKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwbGwpOworCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOworCisgICAgICAgICAgICAgICAgQ0hFQ0soIW1lbWNtcCgiXHgwMFx4MDBceDAwXHgwMSIsIG1lZGlhRGF0YSwgNCkpOworCisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCArIDEyLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTJdLAorICAgICAgICAgICAgICAgICAgICAgICBtZWRpYURhdGEgKyA0LCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA0KTsKKworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gNCArIDEyKTsKKworICAgICAgICAgICAgICAgIG1lZGlhQnVmLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbWVkaWFCdWYgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgbU51bVJUUFNlbnQgKiAxMjg7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZkYXRhWzEyXSwgMCwgMTI4KTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDEyICsgMTI4KTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgZGF0YVs0XSA9IHJ0cFRpbWUgPj4gMjQ7CisgICAgICAgICAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZGF0YVs2XSA9IChydHBUaW1lID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkYXRhWzddID0gcnRwVGltZSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJUUFNvY2tldCwgZGF0YSwgYnVmZmVyLT5zaXplKCksIDApOworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZW5kIGZhaWxlZCAoIiA8PCBzdHJlcnJvcihlcnJubykgPDwgIikiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICArK21TZXFObzsKKworICAgICAgICAgICAgICAgICsrbU51bVJUUFNlbnQ7CisgICAgICAgICAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAxMjsKKworICAgICAgICAgICAgICAgIG1MYXN0UlRQVGltZSA9IHJ0cFRpbWU7CisgICAgICAgICAgICAgICAgbUxhc3ROVFBUaW1lID0gbnRwVGltZSgpOworCisjaWZkZWYgQU5EUk9JRAorICAgICAgICAgICAgICAgIGlmIChtTnVtUlRQU2VudCA8IDYwICogMjUpIHsgIC8vIDYwIHNlY3Mgd29ydGgKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDQwMDAwKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKG1OdW1SVFBPY3RldHNTZW50IDwgODAwMCAqIDYwKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwgKiAxMjggLyA4MDAwKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVGhhdCdzIGVub3VnaCwgcGF1c2luZy4iOworCisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlBBVVNFICIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChtU3RyZWFtVVJMKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgICAgICBhZGRBdXRoZW50aWNhdGlvbigmcmVxdWVzdCwgIlBBVVNFIiwgbVN0cmVhbVVSTC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU2Vzc2lvbjogIik7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1cycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdzciAgJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1Db25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAgICAgICAgICAgICBhZGRTUihidWZmZXIpOworICAgICAgICAgICAgICAgIGFkZFNERVMoYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgbVJUQ1BTb2NrZXQsIGRhdGEsIGJ1ZmZlci0+c2l6ZSgpLCAwKTsKKyAgICAgICAgICAgICAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3BhdXMnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludDMyX3QgcmVzdWx0OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlBBVVNFIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCByZXN1bHQgPDwgIiAoIiA8PCBzdHJlcnJvcigtcmVzdWx0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJyZXNwb25zZSIsICZvYmopKTsKKyAgICAgICAgICAgICAgICBzcDxBUlRTUFJlc3BvbnNlPiByZXNwb25zZTsKKworICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVEVBUkRPV04gIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQobVN0cmVhbVVSTCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIiBSVFNQLzEuMFxyXG4iKTsKKworICAgICAgICAgICAgICAgIGFkZEF1dGhlbnRpY2F0aW9uKCZyZXF1ZXN0LCAiVEVBUkRPV04iLCBtU3RyZWFtVVJMLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlNlc3Npb246ICIpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKG1TZXNzaW9uSUQpOworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgndGVhcicsIGlkKCkpOworICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAndGVhcic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKKworICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVEVBUkRPV04gY29tcGxldGVkIHdpdGggcmVzdWx0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInJlc3BvbnNlIiwgJm9iaikpOworICAgICAgICAgICAgICAgIHNwPEFSVFNQUmVzcG9uc2U+IHJlc3BvbnNlOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHN0YXRpY19jYXN0PEFSVFNQUmVzcG9uc2UgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdkaXNjJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImRpc2Nvbm5lY3QgY29tcGxldGVkIjsKKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgJ3F1aXQnOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1SVFBTb2NrZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZShtUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbVJUUFNvY2tldCA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtUlRDUFNvY2tldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKG1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbVJUQ1BTb2NrZXQgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBBTkRST0lECisgICAgICAgICAgICAgICAgbUVuY29kZXItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci5jbGVhcigpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBtTG9vcGVyLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk15VHJhbnNtaXR0ZXIoKSB7CisgICAgfQorCitwcml2YXRlOgorICAgIGVudW0gQXV0aFR5cGUgeworICAgICAgICBOT05FLAorICAgICAgICBCQVNJQywKKyAgICAgICAgRElHRVNUCisgICAgfTsKKworICAgIEFTdHJpbmcgbVNlcnZlclVSTDsKKyAgICBBU3RyaW5nIG1UcmFja1VSTDsKKyAgICBBU3RyaW5nIG1TdHJlYW1VUkw7CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEFSVFNQQ29ubmVjdGlvbj4gbUNvbm47CisgICAgYm9vbCBtQ29ubmVjdGVkOworICAgIHVpbnQzMl90IG1TZXJ2ZXJJUDsKKyAgICBBdXRoVHlwZSBtQXV0aFR5cGU7CisgICAgQVN0cmluZyBtTm9uY2U7CisgICAgQVN0cmluZyBtU2Vzc2lvbklEOworICAgIGludCBtUlRQU29ja2V0LCBtUlRDUFNvY2tldDsKKyAgICB1aW50MzJfdCBtU291cmNlSUQ7CisgICAgdWludDMyX3QgbVNlcU5vOworICAgIHVpbnQzMl90IG1SVFBUaW1lQmFzZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZUFkZHI7CisgICAgc3RydWN0IHNvY2thZGRyX2luIG1SZW1vdGVSVENQQWRkcjsKKyAgICBzaXplX3QgbU51bVNhbXBsZXNTZW50OworICAgIHVpbnQzMl90IG1OdW1SVFBTZW50OworICAgIHVpbnQzMl90IG1OdW1SVFBPY3RldHNTZW50OworICAgIHVpbnQzMl90IG1MYXN0UlRQVGltZTsKKyAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7CisKKyNpZmRlZiBBTkRST0lECisgICAgc3A8TWVkaWFTb3VyY2U+IG1FbmNvZGVyOworICAgIEFTdHJpbmcgbVNlcVBhcmFtU2V0OworICAgIEFTdHJpbmcgbVBpY1BhcmFtU2V0OworCisgICAgdm9pZCBtYWtlSDI2NFNQcm9wUGFyYW1TZXRzKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1N0YXJ0Q29kZVtdID0gIlx4MDBceDAwXHgwMFx4MDEiOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgICAgICBDSEVDS19HRShzaXplLCAwdSk7CisgICAgICAgIENIRUNLKCFtZW1jbXAoa1N0YXJ0Q29kZSwgZGF0YSwgNCkpOworCisgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgc2l6ZSAtPSA0OworCisgICAgICAgIHNpemVfdCBzdGFydENvZGVQb3MgPSAwOworICAgICAgICB3aGlsZSAoc3RhcnRDb2RlUG9zICsgMyA8IHNpemUKKyAgICAgICAgICAgICAgICAmJiBtZW1jbXAoa1N0YXJ0Q29kZSwgJmRhdGFbc3RhcnRDb2RlUG9zXSwgNCkpIHsKKyAgICAgICAgICAgICsrc3RhcnRDb2RlUG9zOworICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0tfTFQoc3RhcnRDb2RlUG9zICsgMywgc2l6ZSk7CisKKyAgICAgICAgZW5jb2RlQmFzZTY0KGRhdGEsIHN0YXJ0Q29kZVBvcywgJm1TZXFQYXJhbVNldCk7CisKKyAgICAgICAgZW5jb2RlQmFzZTY0KCZkYXRhW3N0YXJ0Q29kZVBvcyArIDRdLCBzaXplIC0gc3RhcnRDb2RlUG9zIC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICZtUGljUGFyYW1TZXQpOworICAgIH0KKyNlbmRpZgorCisgICAgdm9pZCBhZGRTUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMDsKKyAgICAgICAgZGF0YVsxXSA9IDIwMDsgIC8vIFNSCisgICAgICAgIGRhdGFbMl0gPSAwOworICAgICAgICBkYXRhWzNdID0gNjsKKyAgICAgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBkYXRhWzhdID0gbUxhc3ROVFBUaW1lID4+ICg2NCAtIDgpOworICAgICAgICBkYXRhWzldID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAxNikpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMF0gPSAobUxhc3ROVFBUaW1lID4+ICg2NCAtIDI0KSkgJiAweGZmOworICAgICAgICBkYXRhWzExXSA9IChtTGFzdE5UUFRpbWUgPj4gMzIpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMl0gPSAobUxhc3ROVFBUaW1lID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTNdID0gKG1MYXN0TlRQVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzE0XSA9IChtTGFzdE5UUFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzE1XSA9IG1MYXN0TlRQVGltZSAmIDB4ZmY7CisKKyAgICAgICAgZGF0YVsxNl0gPSAobUxhc3RSVFBUaW1lID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMTddID0gKG1MYXN0UlRQVGltZSA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzE4XSA9IChtTGFzdFJUUFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzE5XSA9IG1MYXN0UlRQVGltZSAmIDB4ZmY7CisKKyAgICAgICAgZGF0YVsyMF0gPSBtTnVtUlRQU2VudCA+PiAyNDsKKyAgICAgICAgZGF0YVsyMV0gPSAobU51bVJUUFNlbnQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVsyMl0gPSAobU51bVJUUFNlbnQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzIzXSA9IG1OdW1SVFBTZW50ICYgMHhmZjsKKworICAgICAgICBkYXRhWzI0XSA9IG1OdW1SVFBPY3RldHNTZW50ID4+IDI0OworICAgICAgICBkYXRhWzI1XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiAxNikgJiAweGZmOworICAgICAgICBkYXRhWzI2XSA9IChtTnVtUlRQT2N0ZXRzU2VudCA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbMjddID0gbU51bVJUUE9jdGV0c1NlbnQgJiAweGZmOworCisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAyOCk7CisgICAgfQorCisgICAgdm9pZCBhZGRTREVTKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CisgICAgICAgIGRhdGFbMF0gPSAweDgwIHwgMTsKKyAgICAgICAgZGF0YVsxXSA9IDIwMjsgIC8vIFNERVMKKyAgICAgICAgZGF0YVs0XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVs2XSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICBkYXRhWzddID0gbVNvdXJjZUlEICYgMHhmZjsKKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gODsKKworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDE7ICAvLyBDTkFNRQorCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICprQ05BTUUgPSAiYW5kaWhAbGFwdG9wIjsKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSBzdHJsZW4oa0NOQU1FKTsKKworICAgICAgICBtZW1jcHkoJmRhdGFbb2Zmc2V0XSwga0NOQU1FLCBzdHJsZW4oa0NOQU1FKSk7CisgICAgICAgIG9mZnNldCArPSBzdHJsZW4oa0NOQU1FKTsKKworICAgICAgICBkYXRhW29mZnNldCsrXSA9IDc7ICAvLyBOT1RFCisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtOT1RFID0gIkhlbGwncyBmcm96ZW4gb3Zlci4iOworICAgICAgICBkYXRhW29mZnNldCsrXSA9IHN0cmxlbihrTk9URSk7CisKKyAgICAgICAgbWVtY3B5KCZkYXRhW29mZnNldF0sIGtOT1RFLCBzdHJsZW4oa05PVEUpKTsKKyAgICAgICAgb2Zmc2V0ICs9IHN0cmxlbihrTk9URSk7CisKKyAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworCisgICAgICAgIGlmICgob2Zmc2V0ICUgNCkgPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSA0IC0gKG9mZnNldCAlIDQpOworICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgeworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG51bVdvcmRzID0gKG9mZnNldCAvIDQpIC0gMTsKKyAgICAgICAgZGF0YVsyXSA9IG51bVdvcmRzID4+IDg7CisgICAgICAgIGRhdGFbM10gPSBudW1Xb3JkcyAmIDB4ZmY7CisKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIG9mZnNldCk7CisgICAgfQorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXlUcmFuc21pdHRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1ZX1RSQU5TTUlUVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhMzQzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJVRFBQdXNoZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPHV0aWxzL0J5dGVPcmRlci5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1VEUFB1c2hlcjo6VURQUHVzaGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBwb3J0KQorICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJyYiIpKSwKKyAgICAgIG1GaXJzdFRpbWVNcygwKSwKKyAgICAgIG1GaXJzdFRpbWVVcygwKSB7CisgICAgQ0hFQ0sobUZpbGUgIT0gTlVMTCk7CisKKyAgICBtU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgbWVtc2V0KGFkZHIuc2luX3plcm8sIDAsIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7CisgICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgYWRkci5zaW5fcG9ydCA9IDA7CisKKyAgICBDSEVDS19FUSgwLCBiaW5kKG1Tb2NrZXQsIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKSk7CisKKyAgICBtZW1zZXQobVJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihtUmVtb3RlQWRkci5zaW5femVybykpOworICAgIG1SZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgIG1SZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgbVJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKK30KKworVURQUHVzaGVyOjp+VURQUHVzaGVyKCkgeworICAgIGNsb3NlKG1Tb2NrZXQpOworICAgIG1Tb2NrZXQgPSAtMTsKKworICAgIGZjbG9zZShtRmlsZSk7CisgICAgbUZpbGUgPSBOVUxMOworfQorCit2b2lkIFVEUFB1c2hlcjo6c3RhcnQoKSB7CisgICAgdWludDMyX3QgdGltZU1zOworICAgIENIRUNLX0VRKGZyZWFkKCZ0aW1lTXMsIDEsIHNpemVvZih0aW1lTXMpLCBtRmlsZSksIHNpemVvZih0aW1lTXMpKTsKKyAgICBtRmlyc3RUaW1lTXMgPSBmcm9tbGVsKHRpbWVNcyk7CisgICAgbUZpcnN0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCBpZCgpKSktPnBvc3QoKTsKK30KKworYm9vbCBVRFBQdXNoZXI6Om9uUHVzaCgpIHsKKyAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgaWYgKGZyZWFkKCZsZW5ndGgsIDEsIHNpemVvZihsZW5ndGgpLCBtRmlsZSkgPCBzaXplb2YobGVuZ3RoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIk5vIG1vcmUgZGF0YSB0byBwdXNoLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBsZW5ndGggPSBmcm9tbGVsKGxlbmd0aCk7CisKKyAgICBDSEVDS19HVChsZW5ndGgsIDB1KTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGxlbmd0aCk7CisgICAgaWYgKGZyZWFkKGJ1ZmZlci0+ZGF0YSgpLCAxLCBsZW5ndGgsIG1GaWxlKSA8IGxlbmd0aCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlIHRydW5jYXRlZD8uIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgbiA9IHNlbmR0bygKKyAgICAgICAgICAgIG1Tb2NrZXQsIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSwgMCwKKyAgICAgICAgICAgIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikmbVJlbW90ZUFkZHIsIHNpemVvZihtUmVtb3RlQWRkcikpOworCisgICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOworCisgICAgdWludDMyX3QgdGltZU1zOworICAgIGlmIChmcmVhZCgmdGltZU1zLCAxLCBzaXplb2YodGltZU1zKSwgbUZpbGUpIDwgc2l6ZW9mKHRpbWVNcykpIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJObyBtb3JlIGRhdGEgdG8gcHVzaC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGltZU1zID0gZnJvbWxlbCh0aW1lTXMpOworICAgIENIRUNLX0dFKHRpbWVNcywgbUZpcnN0VGltZU1zKTsKKworICAgIHRpbWVNcyAtPSBtRmlyc3RUaW1lTXM7CisgICAgaW50NjRfdCB3aGVuVXMgPSBtRmlyc3RUaW1lVXMgKyB0aW1lTXMgKiAxMDAwbGw7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFB1c2gsIGlkKCkpKS0+cG9zdCh3aGVuVXMgLSBub3dVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBVRFBQdXNoZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFvblB1c2goKSAmJiAhKG50b2hzKG1SZW1vdGVBZGRyLnNpbl9wb3J0KSAmIDEpKSB7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJlbXVsYXRpbmcgQllFIHBhY2tldCI7CisKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig4KTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9ICgyIDw8IDYpIHwgMTsKKyAgICAgICAgICAgICAgICAqZGF0YSsrID0gMjAzOworICAgICAgICAgICAgICAgICpkYXRhKysgPSAwOworICAgICAgICAgICAgICAgICpkYXRhKysgPSAxOworICAgICAgICAgICAgICAgICpkYXRhKysgPSAweDhmOworICAgICAgICAgICAgICAgICpkYXRhKysgPSAweDQ5OworICAgICAgICAgICAgICAgICpkYXRhKysgPSAweGMwOworICAgICAgICAgICAgICAgICpkYXRhKysgPSAweGQwOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgOCk7CisKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gdG1wID0gbVJlbW90ZUFkZHI7CisgICAgICAgICAgICAgICAgdG1wLnNpbl9wb3J0ID0gaHRvbnMobnRvaHMobVJlbW90ZUFkZHIuc2luX3BvcnQpIHwgMSk7CisKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG4gPSBzZW5kdG8oCisgICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bXApKTsKKworICAgICAgICAgICAgICAgIENIRUNLX0VRKG4sIChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZGU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFVEUF9QVVNIRVJfSF8KKworI2RlZmluZSBVRFBfUFVTSEVSX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBVRFBQdXNoZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIFVEUFB1c2hlcihjb25zdCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgcG9ydCk7CisKKyAgICB2b2lkIHN0YXJ0KCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5VRFBQdXNoZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFB1c2ggPSAncHVzaCcKKyAgICB9OworCisgICAgRklMRSAqbUZpbGU7CisgICAgaW50IG1Tb2NrZXQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luIG1SZW1vdGVBZGRyOworCisgICAgdWludDMyX3QgbUZpcnN0VGltZU1zOworICAgIGludDY0X3QgbUZpcnN0VGltZVVzOworCisgICAgYm9vbCBvblB1c2goKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFVEUFB1c2hlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFVEUF9QVVNIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVmlkZW9Tb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVmlkZW9Tb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTBjODViCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9WaWRlb1NvdXJjZS5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZJREVPX1NPVVJDRV9IXworCisjZGVmaW5lIFZJREVPX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBWaWRlb1NvdXJjZSA6IHB1YmxpYyBNZWRpYVNvdXJjZSB7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZyYW1lcmF0ZSA9IDI0OyAgLy8gZnBzCisKK3B1YmxpYzoKKyAgICBWaWRlb1NvdXJjZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgICAgIDogbVdpZHRoKHdpZHRoKSwKKyAgICAgICAgICBtSGVpZ2h0KGhlaWdodCksCisgICAgICAgICAgbVNpemUoKHdpZHRoICogaGVpZ2h0ICogMykgLyAyKSB7CisgICAgICAgIG1Hcm91cC5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtU2l6ZSkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdCgpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgbVdpZHRoKTsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgbUhlaWdodCk7CisgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19SQVcpOworCisgICAgICAgIHJldHVybiBtZXRhOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcykgeworICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICAgICAgaWYgKG1OdW1GcmFtZXNPdXRwdXQgPT0ga0ZyYW1lcmF0ZSAqIDEwMCkgeworICAgICAgICAgICAgLy8gU3RvcCByZXR1cm5pbmcgZGF0YSBhZnRlciAxMCBzZWNzLgorICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmludGYoIlZpZGVvU291cmNlOjpyZWFkXG4iKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLmFjcXVpcmVfYnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIHggPSAoY2hhcikoKGRvdWJsZSlyYW5kKCkgLyBSQU5EX01BWCAqIDI1NSk7CisgICAgICAgIG1lbXNldCgoKmJ1ZmZlciktPmRhdGEoKSwgeCwgbVNpemUpOworICAgICAgICAoKmJ1ZmZlciktPnNldF9yYW5nZSgwLCBtU2l6ZSk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPmNsZWFyKCk7CisgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCktPnNldEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDApIC8ga0ZyYW1lcmF0ZSk7CisgICAgICAgICsrbU51bUZyYW1lc091dHB1dDsKKworICAgICAgICAvLyBwcmludGYoIlZpZGVvU291cmNlOjpyZWFkIC0gcmV0dXJuaW5nIGJ1ZmZlclxuIik7CisgICAgICAgIC8vIExPRyhJTkZPKSgiVmlkZW9Tb3VyY2U6OnJlYWQgLSByZXR1cm5pbmcgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5WaWRlb1NvdXJjZSgpIHt9CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJHcm91cCBtR3JvdXA7CisgICAgaW50IG1XaWR0aCwgbUhlaWdodDsKKyAgICBzaXplX3QgbVNpemU7CisgICAgaW50NjRfdCBtTnVtRnJhbWVzT3V0cHV0OzsKKworICAgIFZpZGVvU291cmNlKGNvbnN0IFZpZGVvU291cmNlICYpOworICAgIFZpZGVvU291cmNlICZvcGVyYXRvcj0oY29uc3QgVmlkZW9Tb3VyY2UgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL3J0cF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM2YzBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9ydHBfdGVzdC5jcHAKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisKKyNpbmNsdWRlICJBUlRQU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJVRFBQdXNoZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7CisKKyAgICBjb25zdCBjaGFyICpydHBGaWxlbmFtZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqcnRjcEZpbGVuYW1lID0gTlVMTDsKKworICAgIGlmIChhcmdjID09IDMpIHsKKyAgICAgICAgcnRwRmlsZW5hbWUgPSBhcmd2WzFdOworICAgICAgICBydGNwRmlsZW5hbWUgPSBhcmd2WzJdOworICAgIH0gZWxzZSBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFsgcnRwRmlsZW5hbWUgcnRjcEZpbGVuYW1lIF1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyNpZiAwCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1NQU1tdID0geworICAgICAgICAweDY3LCAweDQyLCAweDgwLCAweDBhLCAweGU5LCAweDAyLCAweDgzLCAweGU0LCAweDIwLCAweDAwLCAweDAwLCAweDdkLCAweDAwLCAweDAwLCAweDBlLCAweGE2LCAweDAwLCAweDgwCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrUFBTW10gPSB7CisgICAgICAgIDB4NjgsIDB4Y2UsIDB4M2MsIDB4ODAKKyAgICB9OworICAgIEFTdHJpbmcgb3V0MSwgb3V0MjsKKyAgICBlbmNvZGVCYXNlNjQoa1NQUywgc2l6ZW9mKGtTUFMpLCAmb3V0MSk7CisgICAgZW5jb2RlQmFzZTY0KGtQUFMsIHNpemVvZihrUFBTKSwgJm91dDIpOworICAgIHByaW50ZigicGFyYW1zPSVzLCVzXG4iLCBvdXQxLmNfc3RyKCksIG91dDIuY19zdHIoKSk7CisjZW5kaWYKKworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworCisgICAgc3A8VURQUHVzaGVyPiBydHBfcHVzaGVyOworICAgIHNwPFVEUFB1c2hlcj4gcnRjcF9wdXNoZXI7CisKKyAgICBpZiAocnRwRmlsZW5hbWUgIT0gTlVMTCkgeworICAgICAgICBydHBfcHVzaGVyID0gbmV3IFVEUFB1c2hlcihydHBGaWxlbmFtZSwgNTQzNCk7CisgICAgICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHJ0cF9wdXNoZXIpOworCisgICAgICAgIHJ0Y3BfcHVzaGVyID0gbmV3IFVEUFB1c2hlcihydGNwRmlsZW5hbWUsIDU0MzUpOworICAgICAgICBsb29wZXItPnJlZ2lzdGVySGFuZGxlcihydGNwX3B1c2hlcik7CisgICAgfQorCisgICAgc3A8QVJUUFNlc3Npb24+IHNlc3Npb24gPSBuZXcgQVJUUFNlc3Npb247CisgICAgbG9vcGVyLT5yZWdpc3RlckhhbmRsZXIoc2Vzc2lvbik7CisKKyNpZiAwCisgICAgLy8gTXkgSDI2NCBTRFAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcmF3ID0KKyAgICAgICAgInY9MFxyXG4iCisgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAicz1RdWlja1RpbWVcclxuIgorICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAiYT1yYW5nZTpucHQ9MC0zMTVcclxuIgorICAgICAgICAiYT1pc21hLWNvbXBsaWFuY2U6MiwyLjAsMlxyXG4iCisgICAgICAgICJtPXZpZGVvIDU0MzQgUlRQL0FWUCA5N1xyXG4iCisgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAiYj1BUzozMFxyXG4iCisgICAgICAgICJhPXJ0cG1hcDo5NyBIMjY0LzkwMDAwXHJcbiIKKyAgICAgICAgImE9Zm10cDo5NyBwYWNrZXRpemF0aW9uLW1vZGU9MTtwcm9maWxlLWxldmVsLWlkPTQyMDAwQzsiCisgICAgICAgICAgInNwcm9wLXBhcmFtZXRlci1zZXRzPVowSUFESlpVQ2crSSxhTTQ0Z0E9PVxyXG4iCisgICAgICAgICJhPW1wZWc0LWVzaWQ6MjAxXHJcbiIKKyAgICAgICAgImE9Y2xpcHJlY3Q6MCwwLDI0MCwzMjBcclxuIgorICAgICAgICAiYT1mcmFtZXNpemU6OTcgMzIwLTI0MFxyXG4iOworI2VsaWYgMAorICAgIC8vIE15IEgyNjMgU0RQCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnJhdyA9CisgICAgICAgICJ2PTBcclxuIgorICAgICAgICAibz0tIDY0IDIzMzU3Mjk0NCBJTiBJUDQgMTI3LjAuMC4wXHJcbiIKKyAgICAgICAgInM9UXVpY2tUaW1lXHJcbiIKKyAgICAgICAgInQ9MCAwXHJcbiIKKyAgICAgICAgImE9cmFuZ2U6bnB0PTAtMzE1XHJcbiIKKyAgICAgICAgImE9aXNtYS1jb21wbGlhbmNlOjIsMi4wLDJcclxuIgorICAgICAgICAibT12aWRlbyA1NDM0IFJUUC9BVlAgOTdcclxuIgorICAgICAgICAiYz1JTiBJUDQgMTI3LjAuMC4xXHJcbiIKKyAgICAgICAgImI9QVM6MzBcclxuIgorICAgICAgICAiYT1ydHBtYXA6OTcgSDI2My0xOTk4LzkwMDAwXHJcbiIKKyAgICAgICAgImE9Y2xpcHJlY3Q6MCwwLDI0MCwzMjBcclxuIgorICAgICAgICAiYT1mcmFtZXNpemU6OTcgMzIwLTI0MFxyXG4iOworI2VsaWYgMAorICAgIC8vIE15IEFNUiBTRFAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcmF3ID0KKyAgICAgICAgInY9MFxyXG4iCisgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAicz1RdWlja1RpbWVcclxuIgorICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAiYT1yYW5nZTpucHQ9MC0zMTVcclxuIgorICAgICAgICAiYT1pc21hLWNvbXBsaWFuY2U6MiwyLjAsMlxyXG4iCisgICAgICAgICJtPWF1ZGlvIDU0MzQgUlRQL0FWUCA5N1xyXG4iCisgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAiYj1BUzozMFxyXG4iCisgICAgICAgICJhPXJ0cG1hcDo5NyBBTVIvODAwMC8xXHJcbiIKKyAgICAgICAgImE9Zm10cDo5NyBvY3RldC1hbGlnblxyXG4iOworI2VsaWYgMQorICAgIC8vIEdUYWxrJ3MgSDI2NCBTRFAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcmF3ID0KKyAgICAgICAgInY9MFxyXG4iCisgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAicz1RdWlja1RpbWVcclxuIgorICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAiYT1yYW5nZTpucHQ9bm93LVxyXG4iCisgICAgICAgICJtPXZpZGVvIDU0MzQgUlRQL0FWUCA5NlxyXG4iCisgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAiYj1BUzozMjAwMDBcclxuIgorICAgICAgICAiYT1ydHBtYXA6OTYgSDI2NC85MDAwMFxyXG4iCisgICAgICAgICJhPWZtdHA6OTYgcGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MjAwMUU7IgorICAgICAgICAgICJzcHJvcC1wYXJhbWV0ZXItc2V0cz1aMElBSHBaVUJhSG9nQT09LGFNNDRnQT09XHJcbiIKKyAgICAgICAgImE9Y2xpcHJlY3Q6MCwwLDQ4MCwyNzBcclxuIgorICAgICAgICAiYT1mcmFtZXNpemU6OTYgNzIwLTQ4MFxyXG4iOworI2Vsc2UKKyAgICAvLyBzaG9sZXMgSDI2NCBTRFAKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqcmF3ID0KKyAgICAgICAgInY9MFxyXG4iCisgICAgICAgICJvPS0gNjQgMjMzNTcyOTQ0IElOIElQNCAxMjcuMC4wLjBcclxuIgorICAgICAgICAicz1RdWlja1RpbWVcclxuIgorICAgICAgICAidD0wIDBcclxuIgorICAgICAgICAiYT1yYW5nZTpucHQ9bm93LVxyXG4iCisgICAgICAgICJtPXZpZGVvIDU0MzQgUlRQL0FWUCA5NlxyXG4iCisgICAgICAgICJjPUlOIElQNCAxMjcuMC4wLjFcclxuIgorICAgICAgICAiYj1BUzozMjAwMDBcclxuIgorICAgICAgICAiYT1ydHBtYXA6OTYgSDI2NC85MDAwMFxyXG4iCisgICAgICAgICJhPWZtdHA6OTYgcGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MjAwMUU7IgorICAgICAgICAgICJzcHJvcC1wYXJhbWV0ZXItc2V0cz1aMEtBQ3VrQ2crUWdBQUI5QUFBT3BnQ0EsYU00OGdBPT1cclxuIgorICAgICAgICAiYT1jbGlwcmVjdDowLDAsMjQwLDMyMFxyXG4iCisgICAgICAgICJhPWZyYW1lc2l6ZTo5NiAzMjAtMjQwXHJcbiI7CisjZW5kaWYKKworICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IGRlc2MgPSBuZXcgQVNlc3Npb25EZXNjcmlwdGlvbjsKKyAgICBDSEVDSyhkZXNjLT5zZXRUbyhyYXcsIHN0cmxlbihyYXcpKSk7CisKKyAgICBDSEVDS19FUShzZXNzaW9uLT5zZXR1cChkZXNjKSwgKHN0YXR1c190KU9LKTsKKworICAgIGlmIChydHBfcHVzaGVyICE9IE5VTEwpIHsKKyAgICAgICAgcnRwX3B1c2hlci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBpZiAocnRjcF9wdXNoZXIgIT0gTlVMTCkgeworICAgICAgICBydGNwX3B1c2hlci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBsb29wZXItPnN0YXJ0KGZhbHNlIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLyk7CisKKyAgICBDSEVDS19FUShzZXNzaW9uLT5jb3VudFRyYWNrcygpLCAxdSk7CisgICAgc3A8TWVkaWFTb3VyY2U+IHNvdXJjZSA9IHNlc3Npb24tPnRyYWNrQXQoMCk7CisKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIENIRUNLX0VRKGNsaWVudC5jb25uZWN0KCksIChzdGF0dXNfdClPSyk7CisKKyAgICBzcDxNZWRpYVNvdXJjZT4gZGVjb2RlciA9IE9NWENvZGVjOjpDcmVhdGUoCisgICAgICAgICAgICBjbGllbnQuaW50ZXJmYWNlKCksCisgICAgICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLCBmYWxzZSAvKiBjcmVhdGVFbmNvZGVyICovLAorICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgIDApOyAgLy8gT01YQ29kZWM6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcyk7CisgICAgQ0hFQ0soZGVjb2RlciAhPSBOVUxMKTsKKworICAgIENIRUNLX0VRKGRlY29kZXItPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXI7CisgICAgICAgIHN0YXR1c190IGVyciA9IGRlY29kZXItPnJlYWQoJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgICAgIENIRUNLKGRlY29kZXItPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhkZWNvZGVyLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIklORk9fRk9STUFUX0NIQU5HRUQgJWQgeCAlZFxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjB4JTA4eCIsIGVycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWYgMQorICAgICAgICBpZiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworCisgICAgICAgICAgICBwcmludGYoImRlY29kZXIgcmV0dXJuZWQgZnJhbWUgb2Ygc2l6ZSAlZCBhdCB0aW1lICUuMmYgc2Vjc1xuIiwKKyAgICAgICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCB0aW1lVXMgLyAxRTYpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBDSEVDS19FUShkZWNvZGVyLT5zdG9wKCksIChzdGF0dXNfdClPSyk7CisKKyAgICBsb29wZXItPnN0b3AoKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA4NzBjMGI4Li4yMmVjYzU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtODcsNyArODcsOCBAQAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYm1lZGlhIFwKLSAgICBsaWJoYXJkd2FyZV9sZWdhY3kKKyAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAorICAgIGxpYmVmZmVjdHMKIAogaWZlcSAoJChzdHJpcCAkKEJPQVJEX1VTRVNfR0VORVJJQ19BVURJTykpLHRydWUpCiAgIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliYXVkaW9pbnRlcmZhY2UgbGliYXVkaW9wb2xpY3liYXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwCmluZGV4IGEwMThiNGMuLjZjMTExMTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuY3BwCkBAIC0zMiw3ICszMiw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRHVtcEludGVyZmFjZTo6QXVkaW9EdW1wSW50ZXJmYWNlKEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UqIGh3KQotICAgIDogbUZpcnN0SHdPdXRwdXQodHJ1ZSksIG1Qb2xpY3lDb21tYW5kcyhTdHJpbmc4KCIiKSksIG1GaWxlTmFtZShTdHJpbmc4KCIiKSkKKyAgICA6IG1Qb2xpY3lDb21tYW5kcyhTdHJpbmc4KCIiKSksIG1GaWxlTmFtZShTdHJpbmc4KCIiKSkKIHsKICAgICBpZihodyA9PSAwKSB7CiAgICAgICAgIExPR0UoIkR1bXAgY29uc3RydWN0IGh3ID0gMCIpOwpAQCAtNDcsNiArNDcsMTEgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNsb3NlT3V0cHV0U3RyZWFtKChBdWRpb1N0cmVhbU91dCAqKW1PdXRwdXRzW2ldKTsKICAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2xvc2VJbnB1dFN0cmVhbSgoQXVkaW9TdHJlYW1JbiAqKW1JbnB1dHNbaV0pOworICAgIH0KKwogICAgIGlmKG1GaW5hbEludGVyZmFjZSkgZGVsZXRlIG1GaW5hbEludGVyZmFjZTsKIH0KIApAQCAtNjAsMzEgKzY1LDMyIEBACiAgICAgdWludDMyX3QgbFJhdGUgPSA0NDEwMDsKIAogCi0gICAgaWYgKEF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZXMpIHx8IG1GaXJzdEh3T3V0cHV0KSB7Ci0gICAgICAgIG91dEZpbmFsID0gbUZpbmFsSW50ZXJmYWNlLT5vcGVuT3V0cHV0U3RyZWFtKGRldmljZXMsIGZvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGUsIHN0YXR1cyk7Ci0gICAgICAgIGlmIChvdXRGaW5hbCAhPSAwKSB7Ci0gICAgICAgICAgICBsRm9ybWF0ID0gb3V0RmluYWwtPmZvcm1hdCgpOwotICAgICAgICAgICAgbENoYW5uZWxzID0gb3V0RmluYWwtPmNoYW5uZWxzKCk7Ci0gICAgICAgICAgICBsUmF0ZSA9IG91dEZpbmFsLT5zYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICBpZiAoIUF1ZGlvU3lzdGVtOjppc0EyZHBEZXZpY2UoKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzKWRldmljZXMpKSB7Ci0gICAgICAgICAgICAgICAgbUZpcnN0SHdPdXRwdXQgPSBmYWxzZTsKKyAgICBvdXRGaW5hbCA9IG1GaW5hbEludGVyZmFjZS0+b3Blbk91dHB1dFN0cmVhbShkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzdGF0dXMpOworICAgIGlmIChvdXRGaW5hbCAhPSAwKSB7CisgICAgICAgIGxGb3JtYXQgPSBvdXRGaW5hbC0+Zm9ybWF0KCk7CisgICAgICAgIGxDaGFubmVscyA9IG91dEZpbmFsLT5jaGFubmVscygpOworICAgICAgICBsUmF0ZSA9IG91dEZpbmFsLT5zYW1wbGVSYXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKmZvcm1hdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbEZvcm1hdCA9ICpmb3JtYXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBsRm9ybWF0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGZvcm1hdCAhPSAwICYmICpmb3JtYXQgIT0gMCkgewotICAgICAgICAgICAgbEZvcm1hdCA9ICpmb3JtYXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsRm9ybWF0ID0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQ7CisgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKmNoYW5uZWxzICE9IDApIHsKKyAgICAgICAgICAgICAgICBsQ2hhbm5lbHMgPSAqY2hhbm5lbHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpjaGFubmVscyA9IGxDaGFubmVsczsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCAmJiAqY2hhbm5lbHMgIT0gMCkgewotICAgICAgICAgICAgbENoYW5uZWxzID0gKmNoYW5uZWxzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbENoYW5uZWxzID0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfT1VUX1NURVJFTzsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSAwICYmICpzYW1wbGVSYXRlICE9IDApIHsKLSAgICAgICAgICAgIGxSYXRlID0gKnNhbXBsZVJhdGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsUmF0ZSA9IDQ0MTAwOworICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKnNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGxSYXRlID0gKnNhbXBsZVJhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gbFJhdGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cykgKnN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KQEAgLTExMSw3ICsxMTcsNiBAQAogICAgIGR1bXBPdXQtPnN0YW5kYnkoKTsKICAgICBpZiAoZHVtcE91dC0+ZmluYWxTdHJlYW0oKSAhPSBOVUxMKSB7CiAgICAgICAgIG1GaW5hbEludGVyZmFjZS0+Y2xvc2VPdXRwdXRTdHJlYW0oZHVtcE91dC0+ZmluYWxTdHJlYW0oKSk7Ci0gICAgICAgIG1GaXJzdEh3T3V0cHV0ID0gdHJ1ZTsKICAgICB9CiAKICAgICBtT3V0cHV0cy5yZW1vdmUoZHVtcE91dCk7CkBAIC0xMjYsMTggKzEzMSwzMyBAQAogICAgIHVpbnQzMl90IGxDaGFubmVscyA9IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk87CiAgICAgdWludDMyX3QgbFJhdGUgPSA4MDAwOwogCi0KLSAgICBpZiAobUlucHV0cy5zaXplKCkgPT0gMCkgewotICAgICAgICBpbkZpbmFsID0gbUZpbmFsSW50ZXJmYWNlLT5vcGVuSW5wdXRTdHJlYW0oZGV2aWNlcywgZm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZSwgc3RhdHVzLCBhY291c3RpY3MpOwotICAgICAgICBpZiAoaW5GaW5hbCA9PSAwKSByZXR1cm4gMDsKLQorICAgIGluRmluYWwgPSBtRmluYWxJbnRlcmZhY2UtPm9wZW5JbnB1dFN0cmVhbShkZXZpY2VzLCBmb3JtYXQsIGNoYW5uZWxzLCBzYW1wbGVSYXRlLCBzdGF0dXMsIGFjb3VzdGljcyk7CisgICAgaWYgKGluRmluYWwgIT0gMCkgewogICAgICAgICBsRm9ybWF0ID0gaW5GaW5hbC0+Zm9ybWF0KCk7CiAgICAgICAgIGxDaGFubmVscyA9IGluRmluYWwtPmNoYW5uZWxzKCk7CiAgICAgICAgIGxSYXRlID0gaW5GaW5hbC0+c2FtcGxlUmF0ZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmb3JtYXQgIT0gMCAmJiAqZm9ybWF0ICE9IDApIGxGb3JtYXQgPSAqZm9ybWF0OwotICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCAmJiAqY2hhbm5lbHMgIT0gMCkgbENoYW5uZWxzID0gKmNoYW5uZWxzOwotICAgICAgICBpZiAoc2FtcGxlUmF0ZSAhPSAwICYmICpzYW1wbGVSYXRlICE9IDApIGxSYXRlID0gKnNhbXBsZVJhdGU7CisgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgaWYgKCpmb3JtYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGxGb3JtYXQgPSAqZm9ybWF0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZm9ybWF0ID0gbEZvcm1hdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbm5lbHMgIT0gMCkgeworICAgICAgICAgICAgaWYgKCpjaGFubmVscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbENoYW5uZWxzID0gKmNoYW5uZWxzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqY2hhbm5lbHMgPSBsQ2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICAgICAgaWYgKCpzYW1wbGVSYXRlICE9IDApIHsKKyAgICAgICAgICAgICAgICBsUmF0ZSA9ICpzYW1wbGVSYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IGxSYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0dXMpICpzdGF0dXMgPSBOT19FUlJPUjsKICAgICB9CiAgICAgTE9HVigib3BlbklucHV0U3RyZWFtKCksIGluRmluYWwgJXAiLCBpbkZpbmFsKTsKQEAgLTIyMyw2ICsyNDMsMTUgQEAKICAgICByZXR1cm4ga2V5VmFsdWVQYWlyczsKIH0KIAorc3RhdHVzX3QgQXVkaW9EdW1wSW50ZXJmYWNlOjpzZXRNb2RlKGludCBtb2RlKQoreworICAgIHJldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldE1vZGUobW9kZSk7Cit9CisKK3NpemVfdCBBdWRpb0R1bXBJbnRlcmZhY2U6OmdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50KQoreworICAgIHJldHVybiBtRmluYWxJbnRlcmZhY2UtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCk7Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjM1LDcgKzI2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSkKICAgICA6IG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwgbUlkKGlkKSwKICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtRm9ybWF0KGZvcm1hdCksIG1DaGFubmVscyhjaGFubmVscyksIG1MYXRlbmN5KDApLCBtRGV2aWNlKGRldmljZXMpLAotICAgICAgbUJ1ZmZlclNpemUoMTAyNCksIG1GaW5hbFN0cmVhbShmaW5hbFN0cmVhbSksIG1PdXRGaWxlKDApLCBtRmlsZUNvdW50KDApCisgICAgICBtQnVmZmVyU2l6ZSgxMDI0KSwgbUZpbmFsU3RyZWFtKGZpbmFsU3RyZWFtKSwgbUZpbGUoMCksIG1GaWxlQ291bnQoMCkKIHsKICAgICBMT0dWKCJBdWRpb1N0cmVhbU91dER1bXAgQ29uc3RydWN0b3IgJXAsIG1JbnRlcmZhY2UgJXAsIG1GaW5hbFN0cmVhbSAlcCIsIHRoaXMsIG1JbnRlcmZhY2UsIG1GaW5hbFN0cmVhbSk7CiB9CkBAIC0yNTQsMjYgKzI4MywyNiBAQAogICAgIGlmIChtRmluYWxTdHJlYW0pIHsKICAgICAgICAgcmV0ID0gbUZpbmFsU3RyZWFtLT53cml0ZShidWZmZXIsIGJ5dGVzKTsKICAgICB9IGVsc2UgewotICAgICAgICB1c2xlZXAoKGJ5dGVzICogMTAwMDAwMCkgLyBmcmFtZVNpemUoKSAvIHNhbXBsZVJhdGUoKSk7CisgICAgICAgIHVzbGVlcCgoKChieXRlcyAqIDEwMDApIC8gZnJhbWVTaXplKCkpIC8gc2FtcGxlUmF0ZSgpKSAqIDEwMDApOwogICAgICAgICByZXQgPSBieXRlczsKICAgICB9Ci0gICAgaWYoIW1PdXRGaWxlKSB7CisgICAgaWYoIW1GaWxlKSB7CiAgICAgICAgIGlmIChtSW50ZXJmYWNlLT5maWxlTmFtZSgpICE9ICIiKSB7CiAgICAgICAgICAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICAgICAgICAgIHNwcmludGYobmFtZSwgIiVzXyVkXyVkLnBjbSIsIG1JbnRlcmZhY2UtPmZpbGVOYW1lKCkuc3RyaW5nKCksIG1JZCwgKyttRmlsZUNvdW50KTsKLSAgICAgICAgICAgIG1PdXRGaWxlID0gZm9wZW4obmFtZSwgIndiIik7Ci0gICAgICAgICAgICBMT0dWKCJPcGVuaW5nIGR1bXAgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtT3V0RmlsZSk7CisgICAgICAgICAgICBzcHJpbnRmKG5hbWUsICIlc19vdXRfJWRfJWQucGNtIiwgbUludGVyZmFjZS0+ZmlsZU5hbWUoKS5zdHJpbmcoKSwgbUlkLCArK21GaWxlQ291bnQpOworICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAid2IiKTsKKyAgICAgICAgICAgIExPR1YoIk9wZW5pbmcgZHVtcCBmaWxlICVzLCBmaCAlcCIsIG5hbWUsIG1GaWxlKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAobU91dEZpbGUpIHsKLSAgICAgICAgZndyaXRlKGJ1ZmZlciwgYnl0ZXMsIDEsIG1PdXRGaWxlKTsKKyAgICBpZiAobUZpbGUpIHsKKyAgICAgICAgZndyaXRlKGJ1ZmZlciwgYnl0ZXMsIDEsIG1GaWxlKTsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXREdW1wOjpzdGFuZGJ5KCkKIHsKLSAgICBMT0dWKCJBdWRpb1N0cmVhbU91dER1bXAgc3RhbmRieSgpLCBtT3V0RmlsZSAlcCwgbUZpbmFsU3RyZWFtICVwIiwgbU91dEZpbGUsIG1GaW5hbFN0cmVhbSk7CisgICAgTE9HVigiQXVkaW9TdHJlYW1PdXREdW1wIHN0YW5kYnkoKSwgbUZpbGUgJXAsIG1GaW5hbFN0cmVhbSAlcCIsIG1GaWxlLCBtRmluYWxTdHJlYW0pOwogCiAgICAgQ2xvc2UoKTsKICAgICBpZiAobUZpbmFsU3RyZWFtICE9IDAgKSByZXR1cm4gbUZpbmFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC0zMzAsNyArMzU5LDcgQEAKICAgICB9CiAKICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoImZvcm1hdCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKG1PdXRGaWxlID09IDApIHsKKyAgICAgICAgaWYgKG1GaWxlID09IDApIHsKICAgICAgICAgICAgIG1Gb3JtYXQgPSB2YWx1ZUludDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzQ1LDcgKzM3NCw3IEBACiAgICAgfQogICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgic2FtcGxpbmdfcmF0ZSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKHZhbHVlSW50ID4gMCAmJiB2YWx1ZUludCA8PSA0ODAwMCkgewotICAgICAgICAgICAgaWYgKG1PdXRGaWxlID09IDApIHsKKyAgICAgICAgICAgIGlmIChtRmlsZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSB2YWx1ZUludDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0zNzMsOSArNDAyLDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbU91dER1bXA6OkNsb3NlKCkKIHsKLSAgICBpZihtT3V0RmlsZSkgewotICAgICAgICBmY2xvc2UobU91dEZpbGUpOwotICAgICAgICBtT3V0RmlsZSA9IDA7CisgICAgaWYobUZpbGUpIHsKKyAgICAgICAgZmNsb3NlKG1GaWxlKTsKKyAgICAgICAgbUZpbGUgPSAwOwogICAgIH0KIH0KIApAQCAtMzk2LDcgKzQyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSkKICAgICA6IG1JbnRlcmZhY2UoaW50ZXJmYWNlKSwgbUlkKGlkKSwKICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLCBtRm9ybWF0KGZvcm1hdCksIG1DaGFubmVscyhjaGFubmVscyksIG1EZXZpY2UoZGV2aWNlcyksCi0gICAgICBtQnVmZmVyU2l6ZSgxMDI0KSwgbUZpbmFsU3RyZWFtKGZpbmFsU3RyZWFtKSwgbUluRmlsZSgwKQorICAgICAgbUJ1ZmZlclNpemUoMTAyNCksIG1GaW5hbFN0cmVhbShmaW5hbFN0cmVhbSksIG1GaWxlKDApLCBtRmlsZUNvdW50KDApCiB7CiAgICAgTE9HVigiQXVkaW9TdHJlYW1JbkR1bXAgQ29uc3RydWN0b3IgJXAsIG1JbnRlcmZhY2UgJXAsIG1GaW5hbFN0cmVhbSAlcCIsIHRoaXMsIG1JbnRlcmZhY2UsIG1GaW5hbFN0cmVhbSk7CiB9CkBAIC00MDksNTUgKzQzOCw2OCBAQAogCiBzc2l6ZV90IEF1ZGlvU3RyZWFtSW5EdW1wOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBieXRlcykKIHsKKyAgICBzc2l6ZV90IHJldDsKKwogICAgIGlmIChtRmluYWxTdHJlYW0pIHsKLSAgICAgICAgcmV0dXJuIG1GaW5hbFN0cmVhbS0+cmVhZChidWZmZXIsIGJ5dGVzKTsKLSAgICB9Ci0KLSAgICB1c2xlZXAoKGJ5dGVzICogMTAwMDAwMCkgLyBmcmFtZVNpemUoKSAvIHNhbXBsZVJhdGUoKSk7Ci0KLSAgICBpZighbUluRmlsZSkgewotICAgICAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICAgICAgc3RyY3B5KG5hbWUsICIvc2RjYXJkL211c2ljL3NpbmU0NDAiKTsKLSAgICAgICAgaWYgKGNoYW5uZWxzKCkgPT0gQXVkaW9TeXN0ZW06OkNIQU5ORUxfSU5fTU9OTykgewotICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfbW8iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiX3N0Iik7CisgICAgICAgIHJldCA9IG1GaW5hbFN0cmVhbS0+cmVhZChidWZmZXIsIGJ5dGVzKTsKKyAgICAgICAgaWYoIW1GaWxlKSB7CisgICAgICAgICAgICBpZiAobUludGVyZmFjZS0+ZmlsZU5hbWUoKSAhPSAiIikgeworICAgICAgICAgICAgICAgIGNoYXIgbmFtZVsyNTVdOworICAgICAgICAgICAgICAgIHNwcmludGYobmFtZSwgIiVzX2luXyVkXyVkLnBjbSIsIG1JbnRlcmZhY2UtPmZpbGVOYW1lKCkuc3RyaW5nKCksIG1JZCwgKyttRmlsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBtRmlsZSA9IGZvcGVuKG5hbWUsICJ3YiIpOworICAgICAgICAgICAgICAgIExPR1YoIk9wZW5pbmcgaW5wdXQgZHVtcCBmaWxlICVzLCBmaCAlcCIsIG5hbWUsIG1GaWxlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZm9ybWF0KCkgPT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzE2YiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfOGIiKTsKKyAgICAgICAgaWYgKG1GaWxlKSB7CisgICAgICAgICAgICBmd3JpdGUoYnVmZmVyLCBieXRlcywgMSwgbUZpbGUpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzYW1wbGVSYXRlKCkgPCAxNjAwMCkgewotICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfOGsiKTsKLSAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCAzMjAwMCkgewotICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfMjJrIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlUmF0ZSgpIDwgNDgwMDApIHsKLSAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzQ0ayIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfNDhrIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXNsZWVwKCgoKGJ5dGVzICogMTAwMCkgLyBmcmFtZVNpemUoKSkgLyBzYW1wbGVSYXRlKCkpICogMTAwMCk7CisgICAgICAgIHJldCA9IGJ5dGVzOworICAgICAgICBpZighbUZpbGUpIHsKKyAgICAgICAgICAgIGNoYXIgbmFtZVsyNTVdOworICAgICAgICAgICAgc3RyY3B5KG5hbWUsICIvc2RjYXJkL211c2ljL3NpbmU0NDAiKTsKKyAgICAgICAgICAgIGlmIChjaGFubmVscygpID09IEF1ZGlvU3lzdGVtOjpDSEFOTkVMX0lOX01PTk8pIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9tbyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl9zdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvcm1hdCgpID09IEF1ZGlvU3lzdGVtOjpQQ01fMTZfQklUKSB7CisgICAgICAgICAgICAgICAgc3RyY2F0KG5hbWUsICJfMTZiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzhiIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSgpIDwgMTYwMDApIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl84ayIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCAzMjAwMCkgeworICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzIyayIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzYW1wbGVSYXRlKCkgPCA0ODAwMCkgeworICAgICAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiXzQ0ayIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJjYXQobmFtZSwgIl80OGsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmNhdChuYW1lLCAiLndhdiIpOworICAgICAgICAgICAgbUZpbGUgPSBmb3BlbihuYW1lLCAicmIiKTsKKyAgICAgICAgICAgIExPR1YoIk9wZW5pbmcgaW5wdXQgcmVhZCBmaWxlICVzLCBmaCAlcCIsIG5hbWUsIG1GaWxlKTsKKyAgICAgICAgICAgIGlmIChtRmlsZSkgeworICAgICAgICAgICAgICAgIGZzZWVrKG1GaWxlLCBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBzdHJjYXQobmFtZSwgIi53YXYiKTsKLSAgICAgICAgbUluRmlsZSA9IGZvcGVuKG5hbWUsICJyYiIpOwotICAgICAgICBMT0dWKCJPcGVuaW5nIGR1bXAgZmlsZSAlcywgZmggJXAiLCBuYW1lLCBtSW5GaWxlKTsKLSAgICAgICAgaWYgKG1JbkZpbGUpIHsKLSAgICAgICAgICAgIGZzZWVrKG1JbkZpbGUsIEFVRElPX0RVTVBfV0FWRV9IRFJfU0laRSwgU0VFS19TRVQpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgaWYgKG1JbkZpbGUpIHsKLSAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBmcmVhZChidWZmZXIsIGJ5dGVzLCAxLCBtSW5GaWxlKTsKLSAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBieXRlcykgewotICAgICAgICAgICAgZnNlZWsobUluRmlsZSwgQVVESU9fRFVNUF9XQVZFX0hEUl9TSVpFLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICBmcmVhZCgodWludDhfdCAqKWJ1ZmZlcitieXRlc1JlYWQsIGJ5dGVzLWJ5dGVzUmVhZCwgMSwgbUluRmlsZSk7CisgICAgICAgIGlmIChtRmlsZSkgeworICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBmcmVhZChidWZmZXIsIGJ5dGVzLCAxLCBtRmlsZSk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID49MCAmJiBieXRlc1JlYWQgPCBieXRlcykgeworICAgICAgICAgICAgICAgIGZzZWVrKG1GaWxlLCBBVURJT19EVU1QX1dBVkVfSERSX1NJWkUsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBmcmVhZCgodWludDhfdCAqKWJ1ZmZlcitieXRlc1JlYWQsIGJ5dGVzLWJ5dGVzUmVhZCwgMSwgbUZpbGUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBieXRlczsKKworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3RyZWFtSW5EdW1wOjpzdGFuZGJ5KCkKIHsKLSAgICBMT0dWKCJBdWRpb1N0cmVhbUluRHVtcCBzdGFuZGJ5KCksIG1JbkZpbGUgJXAsIG1GaW5hbFN0cmVhbSAlcCIsIG1JbkZpbGUsIG1GaW5hbFN0cmVhbSk7CisgICAgTE9HVigiQXVkaW9TdHJlYW1JbkR1bXAgc3RhbmRieSgpLCBtRmlsZSAlcCwgbUZpbmFsU3RyZWFtICVwIiwgbUZpbGUsIG1GaW5hbFN0cmVhbSk7CiAKICAgICBDbG9zZSgpOwogICAgIGlmIChtRmluYWxTdHJlYW0gIT0gMCApIHJldHVybiBtRmluYWxTdHJlYW0tPnN0YW5kYnkoKTsKQEAgLTUyMyw5ICs1NjUsOSBAQAogCiB2b2lkIEF1ZGlvU3RyZWFtSW5EdW1wOjpDbG9zZSgpCiB7Ci0gICAgaWYobUluRmlsZSkgewotICAgICAgICBmY2xvc2UobUluRmlsZSk7Ci0gICAgICAgIG1JbkZpbGUgPSAwOworICAgIGlmKG1GaWxlKSB7CisgICAgICAgIGZjbG9zZShtRmlsZSk7CisgICAgICAgIG1GaWxlID0gMDsKICAgICB9CiB9CiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRHVtcEludGVyZmFjZS5oCmluZGV4IDRjNjJiM2UuLjgxNGNlNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0R1bXBJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9EdW1wSW50ZXJmYWNlLmgKQEAgLTY5LDcgKzY5LDcgQEAKICAgICB1aW50MzJfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KICAgICBzaXplX3QgIG1CdWZmZXJTaXplOwogICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgKm1GaW5hbFN0cmVhbTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICptT3V0RmlsZTsgICAgICAvLyBvdXRwdXQgZmlsZQorICAgIEZJTEUgICAgICAgICAgICAgICAgKm1GaWxlOyAgICAgIC8vIG91dHB1dCBmaWxlCiAgICAgaW50ICAgICAgICAgICAgICAgICBtRmlsZUNvdW50OwogfTsKIApAQCAtMTA5LDcgKzEwOSw4IEBACiAgICAgdWludDMyX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCiAgICAgc2l6ZV90ICBtQnVmZmVyU2l6ZTsKICAgICBBdWRpb1N0cmVhbUluICAgICAgKm1GaW5hbFN0cmVhbTsKLSAgICBGSUxFICAgICAgICAgICAgICAgICptSW5GaWxlOyAgICAgIC8vIG91dHB1dCBmaWxlCisgICAgRklMRSAgICAgICAgICAgICAgICAqbUZpbGU7ICAgICAgLy8gb3V0cHV0IGZpbGUKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1GaWxlQ291bnQ7CiB9OwogCiBjbGFzcyBBdWRpb0R1bXBJbnRlcmZhY2UgOiBwdWJsaWMgQXVkaW9IYXJkd2FyZUJhc2UKQEAgLTEzNCw2ICsxMzUsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIG1GaW5hbEludGVyZmFjZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSk7fQogCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNb2RlKGludCBtb2RlKTsKKwogICAgIC8vIG1pYyBtdXRlCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldHVybiBtRmluYWxJbnRlcmZhY2UtPnNldE1pY011dGUoc3RhdGUpO30KQEAgLTE0Myw2ICsxNDYsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKKyAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbENvdW50KTsKKwogICAgIHZpcnR1YWwgQXVkaW9TdHJlYW1Jbiogb3BlbklucHV0U3RyZWFtKHVpbnQzMl90IGRldmljZXMsIGludCAqZm9ybWF0LCB1aW50MzJfdCAqY2hhbm5lbHMsCiAgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgc3RhdHVzX3QgKnN0YXR1cywgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MpOwogICAgIHZpcnR1YWwgICAgdm9pZCAgICAgICAgY2xvc2VJbnB1dFN0cmVhbShBdWRpb1N0cmVhbUluKiBpbik7CkBAIC0xNTMsOCArMTU4LDcgQEAKIHByb3RlY3RlZDoKIAogICAgIEF1ZGlvSGFyZHdhcmVJbnRlcmZhY2UgICAgICAgICAgKm1GaW5hbEludGVyZmFjZTsKLSAgICBTb3J0ZWRWZWN0b3I8QXVkaW9TdHJlYW1PdXREdW1wICo+ICAgIG1PdXRwdXRzOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0SHdPdXRwdXQ7CisgICAgU29ydGVkVmVjdG9yPEF1ZGlvU3RyZWFtT3V0RHVtcCAqPiAgIG1PdXRwdXRzOwogICAgIFNvcnRlZFZlY3RvcjxBdWRpb1N0cmVhbUluRHVtcCAqPiAgICBtSW5wdXRzOwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5Q29tbWFuZHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDI0MTRlOGQuLjM3NzBiNTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgotCisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCkBAIC01MSw2ICs1MSw5IEBACiAjaW5jbHVkZSAibGlmZXZpYmVzLmgiCiAjZW5kaWYKIAorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvRWZmZWN0VmlzdWFsaXplckFwaS5oPgorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyB0aGUgc2ltIGJ1aWxkIGRvZXNuJ3QgaGF2ZSBnZXR0aWQKIApAQCAtNjAsNiArNjMsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK2V4dGVybiBjb25zdCBjaGFyICogY29uc3QgZ0VmZmVjdExpYlBhdGg7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtEZWFkbG9ja2VkU3RyaW5nID0gIkF1ZGlvRmxpbmdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKQEAgLTY3LDYgKzcyLDcgQEAKIAogLy9zdGF0aWMgY29uc3QgbnNlY3NfdCBrU3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIHN0YXRpYyBjb25zdCBmbG9hdCBNQVhfR0FJTiA9IDQwOTYuMGY7CitzdGF0aWMgY29uc3QgZmxvYXQgTUFYX0dBSU5fSU5UID0gMHgxMDAwOwogCiAvLyByZXRyeSBjb3VudHMgZm9yIGJ1ZmZlciBmaWxsIHRpbWVvdXQKIC8vIDUwICogfjIwbXNlY3MgPSAxIHNlY29uZApAQCAtMTIzLDcgKzEyOSw3IEBACiAKIEF1ZGlvRmxpbmdlcjo6QXVkaW9GbGluZ2VyKCkKICAgICA6IEJuQXVkaW9GbGluZ2VyKCksCi0gICAgICAgIG1BdWRpb0hhcmR3YXJlKDApLCBtTWFzdGVyVm9sdW1lKDEuMGYpLCBtTWFzdGVyTXV0ZShmYWxzZSksIG1OZXh0VGhyZWFkSWQoMCkKKyAgICAgICAgbUF1ZGlvSGFyZHdhcmUoMCksIG1NYXN0ZXJWb2x1bWUoMS4wZiksIG1NYXN0ZXJNdXRlKGZhbHNlKSwgbU5leHRVbmlxdWVJZCgxKQogewogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAKQEAgLTEzMiw4ICsxMzgsOCBAQAogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lOSVQ7CiAgICAgaWYgKG1BdWRpb0hhcmR3YXJlLT5pbml0Q2hlY2soKSA9PSBOT19FUlJPUikgewogICAgICAgICAvLyBvcGVuIDE2LWJpdCBvdXRwdXQgc3RyZWFtIGZvciBzL3cgbWl4ZXIKLQotICAgICAgICBzZXRNb2RlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCk7CisgICAgICAgIG1Nb2RlID0gQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMOworICAgICAgICBzZXRNb2RlKG1Nb2RlKTsKIAogICAgICAgICBzZXRNYXN0ZXJWb2x1bWUoMS4wZik7CiAgICAgICAgIHNldE1hc3Rlck11dGUoZmFsc2UpOwpAQCAtMTQyLDYgKzE0OCw3IEBACiAgICAgfQogI2lmZGVmIExWTVgKICAgICBMaWZlVmliZXM6OmluaXQoKTsKKyAgICBtTGlmZVZpYmVzQ2xpZW50UGlkID0gLTE7CiAjZW5kaWYKIH0KIApAQCAtMjgxLDYgKzI4OCw3IEBACiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrOwpAQCAtMjg4LDYgKzI5Niw3IEBACiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CiAgICAgd3A8Q2xpZW50PiB3Y2xpZW50OwogICAgIHN0YXR1c190IGxTdGF0dXM7CisgICAgaW50IGxTZXNzaW9uSWQ7CiAKICAgICBpZiAoc3RyZWFtVHlwZSA+PSBBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUykgewogICAgICAgICBMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlIik7CkBAIC0yOTgsNiArMzA3LDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2wob3V0cHV0KTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKmVmZmVjdFRocmVhZCA9IE5VTEw7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewogICAgICAgICAgICAgTE9HRSgidW5rbm93biBvdXRwdXQgdGhyZWFkIik7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMzEyLDggKzMyMiw0NCBAQAogICAgICAgICAgICAgY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBwaWQpOwogICAgICAgICAgICAgbUNsaWVudHMuYWRkKHBpZCwgY2xpZW50KTsKICAgICAgICAgfQorCisgICAgICAgIExPR1YoImNyZWF0ZVRyYWNrKCkgc2Vzc2lvbklkOiAlZCIsIChzZXNzaW9uSWQgPT0gTlVMTCkgPyAtMiA6ICpzZXNzaW9uSWQpOworICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVGhyZWFkcy5rZXlBdChpKSAhPSBvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCBzYW1lIGF1ZGlvIHNlc3Npb24gb24gZGlmZmVyZW50IG91dHB1dCB0aHJlYWRzCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25zID0gdC0+aGFzQXVkaW9TZXNzaW9uKCpzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbnMgJiBQbGF5YmFja1RocmVhZDo6VFJBQ0tfU0VTU0lPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBlZmZlY3Qgd2l0aCBzYW1lIHNlc3Npb24gSUQgaXMgd2FpdGluZyBmb3IgYSB0cmFjayB0byBiZSBjcmVhdGVkCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9ucyAmIFBsYXliYWNrVGhyZWFkOjpFRkZFQ1RfU0VTU0lPTikgeworICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0VGhyZWFkID0gdC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSAqc2Vzc2lvbklkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgbm8gYXVkaW8gc2Vzc2lvbiBpZCBpcyBwcm92aWRlZCwgY3JlYXRlIG9uZSBoZXJlCisgICAgICAgICAgICBsU2Vzc2lvbklkID0gbmV4dFVuaXF1ZUlkKCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqc2Vzc2lvbklkID0gbFNlc3Npb25JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMT0dWKCJjcmVhdGVUcmFjaygpIGxTZXNzaW9uSWQ6ICVkIiwgbFNlc3Npb25JZCk7CisKICAgICAgICAgdHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVRyYWNrX2woY2xpZW50LCBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsICZsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlciwgbFNlc3Npb25JZCwgJmxTdGF0dXMpOworCisgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCisgICAgICAgIC8vIGZvciBhIHRyYWNrIHRvIGJlIGNyZWF0ZWQKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IgJiYgZWZmZWN0VGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfZGwodGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKGVmZmVjdFRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgbW92ZUVmZmVjdENoYWluX2wobFNlc3Npb25JZCwgZWZmZWN0VGhyZWFkLCB0aHJlYWQsIHRydWUpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChsU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKQEAgLTQxMCw2ICs0NTYsOCBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1vZGUoaW50IG1vZGUpCiB7CisgICAgc3RhdHVzX3QgcmV0OworCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwogICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtNDE5LDE1ICs0NjcsMjMgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKLSAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19TRVRfTU9ERTsKLSAgICBzdGF0dXNfdCByZXQgPSBtQXVkaW9IYXJkd2FyZS0+c2V0TW9kZShtb2RlKTsKLSNpZmRlZiBMVk1YCi0gICAgaWYgKE5PX0VSUk9SID09IHJldCkgewotICAgICAgICBMaWZlVmliZXM6OnNldE1vZGUobW9kZSk7CisgICAgeyAvLyBzY29wZSBmb3IgdGhlIGxvY2sKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CisgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOworICAgICAgICByZXQgPSBtQXVkaW9IYXJkd2FyZS0+c2V0TW9kZShtb2RlKTsKKyAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICB9CisKKyAgICBpZiAoTk9fRVJST1IgPT0gcmV0KSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIG1Nb2RlID0gbW9kZTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2V0TW9kZShtb2RlKTsKKyNpZmRlZiBMVk1YCisgICAgICAgIExpZmVWaWJlczo6c2V0TW9kZShtb2RlKTsKICNlbmRpZgotICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CisgICAgfQorCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNTk2LDggKzY1MiwxMCBAQAogICAgIGludCBtdXNpY0VuYWJsZWQgPSAtMTsKICAgICBpZiAoTk9fRVJST1IgPT0gcGFyYW0uZ2V0KGtleSwgdmFsdWUpKSB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBMaWZldmliZXNFbmFibGUpIHsKKyAgICAgICAgICAgIG1MaWZlVmliZXNDbGllbnRQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgICAgICBtdXNpY0VuYWJsZWQgPSAxOwogICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IExpZmV2aWJlc0Rpc2FibGUpIHsKKyAgICAgICAgICAgIG1MaWZlVmliZXNDbGllbnRQaWQgPSAtMTsKICAgICAgICAgICAgIG11c2ljRW5hYmxlZCA9IDA7CiAgICAgICAgIH0KICAgICB9CkBAIC02MDksNyArNjY3LDcgQEAKICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fU0VUX1BBUkFNRVRFUjsKICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvSGFyZHdhcmUtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CiAjaWZkZWYgTFZNWAotICAgICAgICBpZiAoKE5PX0VSUk9SID09IHJlc3VsdCkgJiYgKG11c2ljRW5hYmxlZCAhPSAtMSkpIHsKKyAgICAgICAgaWYgKG11c2ljRW5hYmxlZCAhPSAtMSkgewogICAgICAgICAgICAgTGlmZVZpYmVzOjplbmFibGVNdXNpYygoYm9vbCkgbXVzaWNFbmFibGVkKTsKICAgICAgICAgfQogI2VuZGlmCkBAIC03MTMsNTEgKzc3MSw1NyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpCiB7CiAKLSAgICBMT0dWKCJyZWdpc3RlckNsaWVudCgpICVwLCB0aWQgJWQsIGNhbGxpbmcgdGlkICVkIiwgY2xpZW50LmdldCgpLCBnZXR0aWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mKGJpbmRlcikgPCAwKSB7Ci0gICAgICAgIExPR1YoIkFkZGluZyBub3RpZmljYXRpb24gY2xpZW50ICVwIiwgYmluZGVyLmdldCgpKTsKLSAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKGJpbmRlcik7Ci0gICAgfQorICAgIGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkocGlkKSA8IDApIHsKKyAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgIExPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCBwaWQgJWQiLCBub3RpZmljYXRpb25DbGllbnQuZ2V0KCksIHBpZCk7CiAKLSAgICAvLyB0aGUgY29uZmlnIGNoYW5nZSBpcyBhbHdheXMgc2VudCBmcm9tIHBsYXliYWNrIG9yIHJlY29yZCB0aHJlYWRzIHRvIGF2b2lkIGRlYWRsb2NrCi0gICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOwotICAgIH0KKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHBpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+c2VuZENvbmZpZ0V2ZW50KEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQpOwotICAgIH0KLX0KKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY2xpZW50LT5hc0JpbmRlcigpOworICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKKyAgICAgICAgLy8gdGhlIGNvbmZpZyBjaGFuZ2UgaXMgYWx3YXlzIHNlbnQgZnJvbSBwbGF5YmFjayBvciByZWNvcmQgdGhyZWFkcyB0byBhdm9pZCBkZWFkbG9jaworICAgICAgICAvLyB3aXRoIEF1ZGlvU3lzdGVtOjpnTG9jaworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+c2VuZENvbmZpZ0V2ZW50KEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICAgICAgfQogCi0gICAgTE9HVigiYmluZGVyRGllZCgpICVwLCB0aWQgJWQsIGNhbGxpbmcgdGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwgZ2V0dGlkKCksIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIElCaW5kZXIgKmJpbmRlciA9IHdoby51bnNhZmVfZ2V0KCk7Ci0KLSAgICBpZiAoYmluZGVyICE9IE5VTEwpIHsKLSAgICAgICAgaW50IGluZGV4ID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZihiaW5kZXIpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgTE9HVigiUmVtb3Zpbmcgbm90aWZpY2F0aW9uIGNsaWVudCAlcCIsIGJpbmRlcik7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVBdChpbmRleCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRDb25maWdFdmVudChBdWRpb1N5c3RlbTo6SU5QVVRfT1BFTkVEKTsKICAgICAgICAgfQogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIGludCBpbmRleCA9IG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcCA8Tm90aWZpY2F0aW9uQ2xpZW50PiBjbGllbnQgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcihwaWQpOworICAgICAgICBMT0dWKCJyZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSAlcCwgcGlkICVkIiwgY2xpZW50LmdldCgpLCBwaWQpOworI2lmZGVmIExWTVgKKyAgICAgICAgaWYgKHBpZCA9PSBtTGlmZVZpYmVzQ2xpZW50UGlkKSB7CisgICAgICAgICAgICBMT0dWKCJEaXNhYmxpbmcgbGlmZXZpYmVzIik7CisgICAgICAgICAgICBMaWZlVmliZXM6OmVuYWJsZU11c2ljKGZhbHNlKTsKKyAgICAgICAgICAgIG1MaWZlVmliZXNDbGllbnRQaWQgPSAtMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0ocGlkKTsKKyAgICB9Cit9CisKIC8vIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBpbnQgaW9IYW5kbGUsIHZvaWQgKnBhcmFtMikKK3sKICAgICBzaXplX3Qgc2l6ZSA9IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5pdGVtQXQoaSk7Ci0gICAgICAgIExPR1YoImF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgTm90aWZ5aW5nIGNoYW5nZSB0byBjbGllbnQgJXAiLCBiaW5kZXIuZ2V0KCkpOwotICAgICAgICBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9GbGluZ2VyQ2xpZW50PiAoYmluZGVyKTsKLSAgICAgICAgY2xpZW50LT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvSGFuZGxlLCBwYXJhbTIpOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5jbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0hhbmRsZSwgcGFyYW0yKTsKICAgICB9CiB9CiAKQEAgLTc2OCwxMiArODMyLDEzIEBACiAgICAgbUNsaWVudHMucmVtb3ZlSXRlbShwaWQpOwogfQogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgaW50IGlkKQogICAgIDogICBUaHJlYWQoZmFsc2UpLAogICAgICAgICBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksIG1TYW1wbGVSYXRlKDApLCBtRnJhbWVDb3VudCgwKSwgbUNoYW5uZWxDb3VudCgwKSwKLSAgICAgICAgbUZvcm1hdCgwKSwgbUZyYW1lU2l6ZSgxKSwgbVN0YW5kYnkoZmFsc2UpLCBtSWQoaWQpLCBtRXhpdGluZyhmYWxzZSkKKyAgICAgICAgbUZyYW1lU2l6ZSgxKSwgbUZvcm1hdCgwKSwgbVN0YW5kYnkoZmFsc2UpLCBtSWQoaWQpLCBtRXhpdGluZyhmYWxzZSkKIHsKIH0KIApAQCAtODA2LDcgKzg3MSw3IEBACiAKIGludCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmNoYW5uZWxDb3VudCgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1DaGFubmVsQ291bnQ7CisgICAgcmV0dXJuIChpbnQpbUNoYW5uZWxDb3VudDsKIH0KIAogaW50IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Zm9ybWF0KCkgY29uc3QKQEAgLTg2MywxMSArOTI4LDEyIEBACiAgICAgICAgIExPR1YoInByb2Nlc3NDb25maWdFdmVudHMoKSByZW1haW5pbmcgZXZlbnRzICVkIiwgbUNvbmZpZ0V2ZW50cy5zaXplKCkpOwogICAgICAgICBDb25maWdFdmVudCAqY29uZmlnRXZlbnQgPSBtQ29uZmlnRXZlbnRzWzBdOwogICAgICAgICBtQ29uZmlnRXZlbnRzLnJlbW92ZUF0KDApOwotICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlY2F1c2UgYXVkaW9Db25maWdDaGFuZ2VkKCkgd2lsbCBsb2NrIEF1ZGlvRmxpbmdlciBtTG9jawotICAgICAgICAvLyBiZWZvcmUgY2FsbGluZyBBdWRpb2ZsaW5nZXI6OmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgdGh1cyBjcmVhdGluZwotICAgICAgICAvLyBwb3RlbnRpYWwgY3Jvc3MgZGVhZGxvY2sgYmV0d2VlbiBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBtTG9jaworICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSBsb2NraW5nIEF1ZGlvRmxpbmdlciBtTG9jazogbG9jayBvcmRlciBpcyBhbHdheXMKKyAgICAgICAgLy8gQXVkaW9GbGluZ2VyIHRoZW4gVGhyZWFkQmFzZSB0byBhdm9pZCBjcm9zcyBkZWFkbG9jawogICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGNvbmZpZ0V2ZW50LT5tRXZlbnQsIGNvbmZpZ0V2ZW50LT5tUGFyYW0pOworICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay5sb2NrKCk7CisgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGNvbmZpZ0V2ZW50LT5tRXZlbnQsIGNvbmZpZ0V2ZW50LT5tUGFyYW0pOworICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKICAgICAgICAgZGVsZXRlIGNvbmZpZ0V2ZW50OwogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgfQpAQCAtOTI5LDEwICs5OTUsMTEgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQbGF5YmFja1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCkKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBsYXliYWNrVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkLCB1aW50MzJfdCBkZXZpY2UpCiAgICAgOiAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCksCiAgICAgICAgIG1NaXhCdWZmZXIoMCksIG1TdXNwZW5kZWQoMCksIG1CeXRlc1dyaXR0ZW4oMCksIG1PdXRwdXQob3V0cHV0KSwKLSAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSkKKyAgICAgICAgbUxhc3RXcml0ZVRpbWUoMCksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCisgICAgICAgIG1EZXZpY2UoZGV2aWNlKQogewogICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzKCk7CiAKQEAgLTk0Myw4ICsxMDEwLDYgQEAKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gbUF1ZGlvRmxpbmdlci0+c3RyZWFtVm9sdW1lSW50ZXJuYWwoc3RyZWFtKTsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbU11dGUoc3RyZWFtKTsKICAgICB9Ci0gICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgdGhhdCBhIG5ldyBpbnB1dCBoYXMgYmVlbiBvcGVuZWQKLSAgICBzZW5kQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp+UGxheWJhY2tUaHJlYWQoKQpAQCAtOTU2LDYgKzEwMjEsNyBAQAogewogICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwogICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOworICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtOTY3LDcgKzEwMzMsNyBAQAogCiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiT3V0cHV0IHRocmVhZCAlcCB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lIENsaWVuIFR5cCBGbXQgQ2huIEJ1ZiAgUyBNIEYgU1JhdGUgIExlZnRWIFJpZ2hWIFNlcnYgICAgIFVzZXJcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIFNlc3Npb24gQnVmICBTIE0gRiBTUmF0ZSBMZWZ0ViBSaWdoViAgU2VydiAgICAgICBVc2VyICAgICAgIE1haW4gYnVmICAgQXV4IEJ1ZlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmICh0cmFjayAhPSAwKSB7CkBAIC05NzgsNyArMTA0NCw3IEBACiAKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJPdXRwdXQgdGhyZWFkICVwIGFjdGl2ZSB0cmFja3NcbiIsIHRoaXMpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICByZXN1bHQuYXBwZW5kKCIgICBOYW1lIENsaWVuIFR5cCBGbXQgQ2huIEJ1ZiAgUyBNIEYgU1JhdGUgIExlZnRWIFJpZ2hWIFNlcnYgICAgIFVzZXJcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgIE5hbWUgIENsaWVuIFR5cCBGbXQgQ2huIFNlc3Npb24gQnVmICBTIE0gRiBTUmF0ZSBMZWZ0ViBSaWdoViAgU2VydiAgICAgICBVc2VyICAgICAgIE1haW4gYnVmICAgQXV4IEJ1ZlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIHdwPFRyYWNrPiB3VHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICBpZiAod1RyYWNrICE9IDApIHsKQEAgLTk5Myw2ICsxMDU5LDI0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuLSAlZCBFZmZlY3QgQ2hhaW5zOlxuIiwgbUVmZmVjdENoYWlucy5zaXplKCkpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtRWZmZWN0Q2hhaW5zW2ldOworICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgY2hhaW4tPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC0xMDExLDYgKzEwOTUsOCBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJzdXNwZW5kIGNvdW50OiAlZFxuIiwgbVN1c3BlbmRlZCk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1peCBidWZmZXIgOiAlcFxuIiwgbU1peEJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwpAQCAtMTA0OCwxMyArMTEzNCwxNCBAQAogICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKIHsKICAgICBzcDxUcmFjaz4gdHJhY2s7CiAgICAgc3RhdHVzX3QgbFN0YXR1czsKIAogICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbENvdW50ICE9IG1DaGFubmVsQ291bnQpIHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gbVNhbXBsZVJhdGUgfHwgZm9ybWF0ICE9IG1Gb3JtYXQgfHwgY2hhbm5lbENvdW50ICE9IChpbnQpbUNoYW5uZWxDb3VudCkgewogICAgICAgICAgICAgTE9HRSgiY3JlYXRlVHJhY2tfbCgpIEJhZCBwYXJhbWV0ZXI6ICBzYW1wbGVSYXRlICVkIGZvcm1hdCAlZCwgY2hhbm5lbENvdW50ICVkIGZvciBvdXRwdXQgJXAiLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgbU91dHB1dCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwpAQCAtMTA3NywxMyArMTE2NCwzNyBAQAogCiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICAvLyBhbGwgdHJhY2tzIGluIHNhbWUgYXVkaW8gc2Vzc2lvbiBtdXN0IHNoYXJlIHRoZSBzYW1lIHJvdXRpbmcgc3RyYXRlZ3kgb3RoZXJ3aXNlCisgICAgICAgIC8vIGNvbmZsaWN0cyB3aWxsIGhhcHBlbiB3aGVuIHRyYWNrcyBhcmUgbW92ZWQgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIgYnkgYXVkaW8gcG9saWN5CisgICAgICAgIC8vIG1hbmFnZXIKKyAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3kgPQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXN0cmVhbVR5cGUpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IHQtPnNlc3Npb25JZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSAhPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSl0LT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIHNoYXJlZEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCk7CiAgICAgICAgIGlmICh0cmFjay0+Z2V0Q2JsaygpID09IE5VTEwgfHwgdHJhY2stPm5hbWUoKSA8IDApIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgbVRyYWNrcy5hZGQodHJhY2spOworCisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIExPR1YoImNyZWF0ZVRyYWNrX2woKSBzZXR0aW5nIG1haW4gYnVmZmVyICVwIiwgY2hhaW4tPmluQnVmZmVyKCkpOworICAgICAgICAgICAgdHJhY2stPnNldE1haW5CdWZmZXIoY2hhaW4tPmluQnVmZmVyKCkpOworICAgICAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKXRyYWNrLT50eXBlKCkpKTsKKyAgICAgICAgfQogICAgIH0KICAgICBsU3RhdHVzID0gTk9fRVJST1I7CiAKQEAgLTEyMDAsNiArMTMxMSwxNCBAQAogICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19GSUxMSU5HOwogICAgICAgICB0cmFjay0+bVJlc2V0RG9uZSA9IGZhbHNlOwogICAgICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CisgICAgICAgIGlmICh0cmFjay0+bWFpbkJ1ZmZlcigpICE9IG1NaXhCdWZmZXIpIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgTE9HVigiYWRkVHJhY2tfbCgpIHN0YXJ0aW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgY2hhaW4tPnN0YXJ0VHJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIH0KIApAQCAtMTIyNCwxNiArMTM0MywxNyBAQAogICAgIHJldHVybiBtT3V0cHV0LT5nZXRQYXJhbWV0ZXJzKGtleXMpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSkgeworLy8gZGVzdHJveVRyYWNrX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewogICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7CiAgICAgdm9pZCAqcGFyYW0yID0gMDsKIAotICAgIExPR1YoIlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQsIHBhcmFtICVkIiwgdGhpcywgZXZlbnQsIHBhcmFtKTsKKyAgICBMT0dWKCJQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkX2wsIHRocmVhZCAlcCwgZXZlbnQgJWQsIHBhcmFtICVkIiwgdGhpcywgZXZlbnQsIHBhcmFtKTsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEOgogICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgZGVzYy5jaGFubmVscyA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbHM7CiAgICAgICAgIGRlc2Muc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CkBAIC0xMjQ3LDI0ICsxMzY3LDM0IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQXVkaW9GbGluZ2VyLT5tTG9jayk7CiAgICAgbUF1ZGlvRmxpbmdlci0+YXVkaW9Db25maWdDaGFuZ2VkX2woZXZlbnQsIG1JZCwgcGFyYW0yKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVycygpCiB7CiAgICAgbVNhbXBsZVJhdGUgPSBtT3V0cHV0LT5zYW1wbGVSYXRlKCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChtT3V0cHV0LT5jaGFubmVscygpKTsKLQorICAgIG1DaGFubmVscyA9IG1PdXRwdXQtPmNoYW5uZWxzKCk7CisgICAgbUNoYW5uZWxDb3VudCA9ICh1aW50MTZfdClBdWRpb1N5c3RlbTo6cG9wQ291bnQobUNoYW5uZWxzKTsKICAgICBtRm9ybWF0ID0gbU91dHB1dC0+Zm9ybWF0KCk7Ci0gICAgbUZyYW1lU2l6ZSA9IG1PdXRwdXQtPmZyYW1lU2l6ZSgpOworICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpbU91dHB1dC0+ZnJhbWVTaXplKCk7CiAgICAgbUZyYW1lQ291bnQgPSBtT3V0cHV0LT5idWZmZXJTaXplKCkgLyBtRnJhbWVTaXplOwogCiAgICAgLy8gRklYTUUgLSBDdXJyZW50IG1peGVyIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgc3RlcmVvIG91dHB1dDogQWx3YXlzCiAgICAgLy8gQWxsb2NhdGUgYSBzdGVyZW8gYnVmZmVyIGV2ZW4gaWYgSFcgb3V0cHV0IGlzIG1vbm8uCi0gICAgaWYgKG1NaXhCdWZmZXIgIT0gTlVMTCkgZGVsZXRlIG1NaXhCdWZmZXI7CisgICAgaWYgKG1NaXhCdWZmZXIgIT0gTlVMTCkgZGVsZXRlW10gbU1peEJ1ZmZlcjsKICAgICBtTWl4QnVmZmVyID0gbmV3IGludDE2X3RbbUZyYW1lQ291bnQgKiAyXTsKICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKKworICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbworICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50CisgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnMoKSBpcyBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IKKyAgICAvLyBidXQgaW4gdGhpcyBjYXNlIG5vdGhpbmcgaXMgZG9uZSBiZWxvdyBhcyBubyBhdWRpbyBzZXNzaW9ucyBoYXZlIGVmZmVjdCB5ZXQgc28gaXQgZG9lc24ndAorICAgIC8vIG1hdHRlci4KKyAgICAvLyBjcmVhdGUgYSBjb3B5IG9mIG1FZmZlY3RDaGFpbnMgYXMgY2FsbGluZyBtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbiByZW9yZGVyIHNvbWUgZWZmZWN0IGNoYWlucworICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWluczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgbUF1ZGlvRmxpbmdlci0+bW92ZUVmZmVjdENoYWluX2woZWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSwgdGhpcywgdGhpcywgZmFsc2UpOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmhhbEZyYW1lcywgdWludDMyX3QgKmRzcEZyYW1lcykKQEAgLTEyODAsMTAgKzE0MTAsNzYgQEAKICAgICByZXR1cm4gbU91dHB1dC0+Z2V0UmVuZGVyUG9zaXRpb24oZHNwRnJhbWVzKTsKIH0KIAordWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIGlmIChnZXRFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkgIT0gMCkgeworICAgICAgICByZXN1bHQgPSBFRkZFQ1RfU0VTU0lPTjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0cmFjay0+c2Vzc2lvbklkKCkgJiYKKyAgICAgICAgICAgICAgICAhKHRyYWNrLT5tQ2Jsay0+ZmxhZ3MgJiBDQkxLX0lOVkFMSURfTVNLKSkgeworICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGludCBzZXNzaW9uSWQpCit7CisgICAgLy8gc2Vzc2lvbiBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYIGlzIHBsYWNlZCBpbiBzYW1lIHN0cmF0ZWd5IGFzIE1VU0lDIHN0cmVhbSBzbyB0aGF0CisgICAgLy8gaXQgaXMgbW92ZWQgdG8gY29ycmVjdCBvdXRwdXQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgd2hlbiBBMkRQIGlzIGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQKKyAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6TVVTSUMpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0cmFjay0+c2Vzc2lvbklkKCkgJiYKKyAgICAgICAgICAgICAgICAhKHRyYWNrLT5tQ2Jsay0+ZmxhZ3MgJiBDQkxLX0lOVkFMSURfTVNLKSkgeworICAgICAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKSB0cmFjay0+dHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7Cit9CisKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldEVmZmVjdENoYWluKGludCBzZXNzaW9uSWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworfQorCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpnZXRFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uSWQpCit7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOworCisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAobUVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCkgPT0gc2Vzc2lvbklkKSB7CisgICAgICAgICAgICBjaGFpbiA9IG1FZmZlY3RDaGFpbnNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hhaW47Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TW9kZSh1aW50MzJfdCBtb2RlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRNb2RlX2wobW9kZSk7CisgICAgfQorfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6Ok1peGVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkKQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQpLAorQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6TWl4ZXJUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBpbnQgaWQsIHVpbnQzMl90IGRldmljZSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UpLAogICAgICAgICBtQXVkaW9NaXhlcigwKQogewogICAgIG1UeXBlID0gUGxheWJhY2tUaHJlYWQ6Ok1JWEVSOwpAQCAtMTMwMiw3ICsxNDk4LDYgQEAKIAogYm9vbCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wKCkKIHsKLSAgICBpbnQxNl90KiBjdXJCdWYgPSBtTWl4QnVmZmVyOwogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAgICAgdWludDMyX3QgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIG5zZWNzX3Qgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCk7CkBAIC0xMzE1LDYgKzE1MTAsNyBAQAogICAgIHVpbnQzMl90IGFjdGl2ZVNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgdWludDMyX3QgaWRsZVNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWVVcygpOwogICAgIHVpbnQzMl90IHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKICAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCiAgICAgewpAQCAtMTM3MywxMyArMTU2OSwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IHByZXBhcmVUcmFja3NfbChhY3RpdmVUcmFja3MsICZ0cmFja3NUb1JlbW92ZSk7CisKKyAgICAgICAgICAgIC8vIHByZXZlbnQgYW55IGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluIGxpc3QgYW5kIGluIGVhY2ggZWZmZWN0IGNoYWluCisgICAgICAgICAgICAvLyBkdXJpbmcgbWl4aW5nIGFuZCBlZmZlY3QgcHJvY2VzcyBhcyB0aGUgYXVkaW8gYnVmZmVycyBjb3VsZCBiZSBkZWxldGVkCisgICAgICAgICAgICAvLyBvciBtb2RpZmllZCBpZiBhbiBlZmZlY3QgaXMgY3JlYXRlZCBvciBkZWxldGVkCisgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICB9CiAKICAgICAgICAgaWYgKExJS0VMWShtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpKSB7CiAgICAgICAgICAgICAvLyBtaXggYnVmZmVycy4uLgotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MoY3VyQnVmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5wcm9jZXNzKCk7CiAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBrU3RhbmRieVRpbWVJbk5zZWNzOworICAgICAgICAgICAgLy9UT0RPOiBkZWxheSBzdGFuZGJ5IHdoZW4gZWZmZWN0cyBoYXZlIGEgdGFpbAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSWYgbm8gdHJhY2tzIGFyZSByZWFkeSwgc2xlZXAgb25jZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGFuIG91dHB1dAogICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUsIHRoZW4gd3JpdGUgMHMgdG8gdGhlIG91dHB1dApAQCAtMTM5MSwyNyArMTU5MywzNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCAmJiBsb25nU3RhbmRieUV4aXQpKSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0IChjdXJCdWYsIDAsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIG1lbXNldCAobU1peEJ1ZmZlciwgMCwgbWl4QnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgICAgICAgICBMT0dWX0lGKChtQnl0ZXNXcml0dGVuID09IDAgJiYgKG1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEICYmIGxvbmdTdGFuZGJ5RXhpdCkpLCAiYW50aWNpcGF0ZWQgc3RhcnQiKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE8gYWRkIHN0YW5kYnkgdGltZSBleHRlbnNpb24gZmN0IG9mIGVmZmVjdCB0YWlsCiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVN1c3BlbmRlZCkgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgIHNsZWVwVGltZSA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOwogICAgICAgICB9CiAgICAgICAgIC8vIHNsZWVwVGltZSA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7Ci0gICAgICAgICAgICBtTGFzdFdyaXRlVGltZSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgIG1JbldyaXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbWl4QnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCisgICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAjaWZkZWYgTFZNWAogICAgICAgICAgICAgaW50IGF1ZGlvT3V0cHV0VHlwZSA9IExpZmVWaWJlczo6Z2V0TWl4ZXJUeXBlKG1JZCwgbVR5cGUpOwogICAgICAgICAgICAgaWYgKExpZmVWaWJlczo6YXVkaW9PdXRwdXRUeXBlSXNMaWZlVmliZXMoYXVkaW9PdXRwdXRUeXBlKSkgewotICAgICAgICAgICAgICAgTGlmZVZpYmVzOjpwcm9jZXNzKGF1ZGlvT3V0cHV0VHlwZSwgY3VyQnVmLCBtaXhCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgIExpZmVWaWJlczo6cHJvY2VzcyhhdWRpb091dHB1dFR5cGUsIG1NaXhCdWZmZXIsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICBpbnQgYnl0ZXNXcml0dGVuID0gKGludCltT3V0cHV0LT53cml0ZShjdXJCdWYsIG1peEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbUxhc3RXcml0ZVRpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBtSW5Xcml0ZSA9IHRydWU7CisgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IG1peEJ1ZmZlclNpemU7CisKKyAgICAgICAgICAgIGludCBieXRlc1dyaXR0ZW4gPSAoaW50KW1PdXRwdXQtPndyaXRlKG1NaXhCdWZmZXIsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgaWYgKGJ5dGVzV3JpdHRlbiA8IDApIG1CeXRlc1dyaXR0ZW4gLT0gbWl4QnVmZmVyU2l6ZTsKICAgICAgICAgICAgIG1OdW1Xcml0ZXMrKzsKICAgICAgICAgICAgIG1JbldyaXRlID0gZmFsc2U7CkBAIC0xNDMwLDYgKzE2MzksOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKICAgICAgICAgfQogCkBAIC0xNDM3LDYgKzE2NDgsMTAgQEAKICAgICAgICAgLy8gc2luY2Ugd2UgY2FuJ3QgZ3VhcmFudGVlIHRoZSBkZXN0cnVjdG9ycyB3b24ndCBhY3F1aXJlIHRoYXQKICAgICAgICAgLy8gc2FtZSBsb2NrLgogICAgICAgICB0cmFja3NUb1JlbW92ZS5jbGVhcigpOworCisgICAgICAgIC8vIEVmZmVjdCBjaGFpbnMgd2lsbCBiZSBhY3R1YWxseSBkZWxldGVkIGhlcmUgaWYgdGhleSB3ZXJlIHJlbW92ZWQgZnJvbQorICAgICAgICAvLyBtRWZmZWN0Q2hhaW5zIGxpc3QgZHVyaW5nIG1peGluZyBvciBlZmZlY3RzIHByb2Nlc3NpbmcKKyAgICAgICAgZWZmZWN0Q2hhaW5zLmNsZWFyKCk7CiAgICAgfQogCiAgICAgaWYgKCFtU3RhbmRieSkgewpAQCAtMTQ1NCwxMCArMTY2OSwxNSBAQAogICAgIHVpbnQzMl90IG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICAvLyBmaW5kIG91dCB3aGljaCB0cmFja3MgbmVlZCB0byBiZSBwcm9jZXNzZWQKICAgICBzaXplX3QgY291bnQgPSBhY3RpdmVUcmFja3Muc2l6ZSgpOworICAgIHNpemVfdCBtaXhlZFRyYWNrcyA9IDA7CisgICAgc2l6ZV90IHRyYWNrc1dpdGhFZmZlY3QgPSAwOwogCiAgICAgZmxvYXQgbWFzdGVyVm9sdW1lID0gbU1hc3RlclZvbHVtZTsKICAgICBib29sICBtYXN0ZXJNdXRlID0gbU1hc3Rlck11dGU7CiAKKyAgICBpZiAobWFzdGVyTXV0ZSkgeworICAgICAgICBtYXN0ZXJWb2x1bWUgPSAwOworICAgIH0KICNpZmRlZiBMVk1YCiAgICAgYm9vbCB0cmFja3NDb25uZWN0ZWRDaGFuZ2VkID0gZmFsc2U7CiAgICAgYm9vbCBzdGF0ZUNoYW5nZWQgPSBmYWxzZTsKQEAgLTE0NzYsNiArMTY5NiwxNCBAQAogICAgICAgICBMaWZlVmliZXM6OmNvbXB1dGVWb2x1bWVzKGF1ZGlvT3V0cHV0VHlwZSwgYWN0aXZlVHlwZXMsIHRyYWNrc0Nvbm5lY3RlZENoYW5nZWQsIHN0YXRlQ2hhbmdlZCwgbWFzdGVyVm9sdW1lLCBtYXN0ZXJNdXRlKTsKICAgICB9CiAjZW5kaWYKKyAgICAvLyBEZWxlZ2F0ZSBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIG91dHB1dCBtaXggZWZmZWN0IGNoYWluIGlmIG5lZWRlZAorICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCk7CisgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgdWludDMyX3QgdiA9ICh1aW50MzJfdCkobWFzdGVyVm9sdW1lICogKDEgPDwgMjQpKTsKKyAgICAgICAgY2hhaW4tPnNldFZvbHVtZV9sKCZ2LCAmdik7CisgICAgICAgIG1hc3RlclZvbHVtZSA9IChmbG9hdCkoKHYgKyAoMSA8PCAyMykpID4+IDI0KTsKKyAgICAgICAgY2hhaW4uY2xlYXIoKTsKKyAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIHNwPFRyYWNrPiB0ID0gYWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKQEAgLTE0OTIsMTEgKzE3MjAsNDIgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy9MT0dWKCJ0cmFjayAlZCB1PSUwOHgsIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrLT5uYW1lKCksIGNibGstPnVzZXIsIGNibGstPnNlcnZlciwgdGhpcyk7CiAKKyAgICAgICAgICAgIG1peGVkVHJhY2tzKys7CisKKyAgICAgICAgICAgIC8vIHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlciBtZWFucyB0aGVyZSBpcyBhbiBlZmZlY3QgY2hhaW4KKyAgICAgICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgdHJhY2sKKyAgICAgICAgICAgIGNoYWluLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAodHJhY2stPm1haW5CdWZmZXIoKSAhPSBtTWl4QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0cmFja3NXaXRoRWZmZWN0Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICUwOHggYXR0YWNoZWQgdG8gZWZmZWN0IGJ1dCBubyBjaGFpbiBmb3VuZCBvbiBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bmFtZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBpbnQgcGFyYW0gPSBBdWRpb01peGVyOjpWT0xVTUU7CisgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgeworICAgICAgICAgICAgICAgIC8vIG5vIHJhbXAgZm9yIHRoZSBmaXJzdCB2b2x1bWUgc2V0dGluZworICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlJFU1VNSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNibGstPnNlcnZlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRyYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSBmaXJzdCBmcmFtZSB3YXMgbWl4ZWQsCisgICAgICAgICAgICAgICAgLy8gZG8gbm90IGFwcGx5IHJhbXAKKyAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBjb21wdXRlIHZvbHVtZSBmb3IgdGhpcyB0cmFjawotICAgICAgICAgICAgaW50MTZfdCBsZWZ0LCByaWdodDsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNNdXRlZCgpIHx8IG1hc3Rlck11dGUgfHwgdHJhY2stPmlzUGF1c2luZygpIHx8CisgICAgICAgICAgICBpbnQxNl90IGxlZnQsIHJpZ2h0LCBhdXg7CisgICAgICAgICAgICBpZiAodHJhY2stPmlzTXV0ZWQoKSB8fCB0cmFjay0+aXNQYXVzaW5nKCkgfHwKICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZXNbdHJhY2stPnR5cGUoKV0ubXV0ZSkgewotICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodCA9IDA7CisgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gYXV4ID0gMDsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTE1LDMxICsxNzc0LDM2IEBACiAgICAgICAgICAgICAgICAgfQogI2VuZGlmCiAgICAgICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIHR5cGVWb2x1bWU7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdl9jbGFtcGVkID0gdiAqIGNibGstPnZvbHVtZVswXTsKLSAgICAgICAgICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICAgICAgICAgIGxlZnQgPSBpbnQxNl90KHZfY2xhbXBlZCk7Ci0gICAgICAgICAgICAgICAgdl9jbGFtcGVkID0gdiAqIGNibGstPnZvbHVtZVsxXTsKLSAgICAgICAgICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU4pIHZfY2xhbXBlZCA9IE1BWF9HQUlOOwotICAgICAgICAgICAgICAgIHJpZ2h0ID0gaW50MTZfdCh2X2NsYW1wZWQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVpbnQzMl90IHZsID0gKHVpbnQzMl90KSh2ICogY2Jsay0+dm9sdW1lWzBdKSA8PCAxMjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ciA9ICh1aW50MzJfdCkodiAqIGNibGstPnZvbHVtZVsxXSkgPDwgMTI7CiAKLSAgICAgICAgICAgIC8vIFhYWDogdGhlc2UgdGhpbmdzIERPTidUIG5lZWQgdG8gYmUgZG9uZSBlYWNoIHRpbWUKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFjayk7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKEF1ZGlvTWl4ZXI6Ok1JWElORyk7Ci0KLSAgICAgICAgICAgIGludCBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlZPTFVNRTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7Ci0gICAgICAgICAgICAgICAgLy8gbm8gcmFtcCBmb3IgdGhlIGZpcnN0IHZvbHVtZSBzZXR0aW5nCi0gICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgaWYgKGNoYWluICE9IDAgJiYgY2hhaW4tPnNldFZvbHVtZV9sKCZ2bCwgJnZyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmFtcCB2b2x1bWUgaXMgdm9sdW1lIGlzIGNvbnRyb2xsZWQgYnkgZWZmZWN0CisgICAgICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6Vk9MVU1FOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIG5vIHZvbHVtZSByYW1wIHdoZW4gdm9sdW1lIGNvbnRyb2xsZXIgd2FzIGp1c3QgZGlzYWJsZWQgb3IgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIGVmZmVjdCBjaGFpbiB0byBhdm9pZCB2b2x1bWUgc3Bpa2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFzVm9sdW1lQ29udHJvbGxlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpWT0xVTUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1IYXNWb2x1bWVDb250cm9sbGVyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5zZXJ2ZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0cmFjayBpcyBzdG9wcGVkIGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUgd2FzIG1peGVkLAotICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhcHBseSByYW1wCi0gICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKworICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lcyBmcm9tIDguMjQgdG8gNC4xMiBmb3JtYXQKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2X2NsYW1wZWQgPSAodmwgKyAoMSA8PCAxMSkpID4+IDEyOworICAgICAgICAgICAgICAgIGlmICh2X2NsYW1wZWQgPiBNQVhfR0FJTl9JTlQpIHZfY2xhbXBlZCA9IE1BWF9HQUlOX0lOVDsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gaW50MTZfdCh2X2NsYW1wZWQpOworICAgICAgICAgICAgICAgIHZfY2xhbXBlZCA9ICh2ciArICgxIDw8IDExKSkgPj4gMTI7CisgICAgICAgICAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOX0lOVCkgdl9jbGFtcGVkID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gaW50MTZfdCh2X2NsYW1wZWQpOworCisgICAgICAgICAgICAgICAgdl9jbGFtcGVkID0gKHVpbnQzMl90KSh2ICogY2Jsay0+c2VuZExldmVsKTsKKyAgICAgICAgICAgICAgICBpZiAodl9jbGFtcGVkID4gTUFYX0dBSU5fSU5UKSB2X2NsYW1wZWQgPSBNQVhfR0FJTl9JTlQ7CisgICAgICAgICAgICAgICAgYXV4ID0gaW50MTZfdCh2X2NsYW1wZWQpOwogICAgICAgICAgICAgfQorCiAjaWZkZWYgTFZNWAogICAgICAgICAgICAgaWYgKCB0cmFja3NDb25uZWN0ZWRDaGFuZ2VkIHx8IHN0YXRlQ2hhbmdlZCApCiAgICAgICAgICAgICB7CkBAIC0xNTQ3LDE4ICsxODExLDMwIEBACiAgICAgICAgICAgICAgICAgIHBhcmFtID0gQXVkaW9NaXhlcjo6Vk9MVU1FOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCBsZWZ0KTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIocGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsIHJpZ2h0KTsKKworICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKKworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgKHZvaWQgKilsZWZ0KTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIocGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICh2b2lkICopcmlnaHQpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICh2b2lkICopYXV4KTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Rk9STUFULCB0cmFjay0+Zm9ybWF0KCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpDSEFOTkVMX0NPVU5ULCB0cmFjay0+Y2hhbm5lbENvdW50KCkpOworICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfQ09VTlQsICh2b2lkICopdHJhY2stPmNoYW5uZWxDb3VudCgpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCi0gICAgICAgICAgICAgICAgaW50KGNibGstPnNhbXBsZVJhdGUpKTsKKyAgICAgICAgICAgICAgICAodm9pZCAqKShjYmxrLT5zYW1wbGVSYXRlKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpBVVhfQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5hdXhCdWZmZXIoKSk7CiAKICAgICAgICAgICAgIC8vIHJlc2V0IHJldHJ5IGNvdW50CiAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzOwpAQCAtMTU3Miw3ICsxODQ4LDYgQEAKICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGNvbnN1bWVkIGFsbCB0aGUgYnVmZmVycyBvZiB0aGlzIHRyYWNrLgogICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSB0cmFja3MuCiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KQEAgLTE1ODIsOSArMTg1Nyw4IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaXhlclN0YXR1cyAhPSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZShBdWRpb01peGVyOjpNSVhJTkcpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUoQXVkaW9NaXhlcjo6TUlYSU5HKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU5NCw2ICsxODY4LDEzIEBACiAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS0+aXRlbUF0KGkpOwogICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyKCkgIT0gbU1peEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGNoYWluLmdldCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBjaGFpbi0+c3RvcFRyYWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewogICAgICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICAgICAgICAgICAgICBkZWxldGVUcmFja05hbWVfbCh0cmFjay0+bU5hbWUpOwpAQCAtMTYwMSw3MCArMTg4MiwzNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gbWl4IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaWYgYWxsIHRyYWNrcyBhcmUgY29ubmVjdGVkIHRvIGFuCisgICAgLy8gZWZmZWN0IGNoYWluIGFzIGluIHRoaXMgY2FzZSB0aGUgbWl4ZXIgd2lsbCBub3Qgd3JpdGUgdG8KKyAgICAvLyBtaXggYnVmZmVyIGFuZCB0cmFjayBlZmZlY3RzIHdpbGwgYWNjdW11bGF0ZSBpbnRvIGl0CisgICAgaWYgKG1peGVkVHJhY2tzICE9IDAgJiYgbWl4ZWRUcmFja3MgPT0gdHJhY2tzV2l0aEVmZmVjdCkgeworICAgICAgICBtZW1zZXQobU1peEJ1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisKICAgICByZXR1cm4gbWl4ZXJTdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6Z2V0VHJhY2tzKAotICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxUcmFjaz4gPiYgdHJhY2tzLAotICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzLAotICAgICAgICBpbnQgc3RyZWFtVHlwZSkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6aW52YWxpZGF0ZVRyYWNrcyhpbnQgc3RyZWFtVHlwZSkKIHsKLSAgICBMT0dWICgiTWl4ZXJUaHJlYWQ6OmdldFRyYWNrcygpIG1peGVyICVwLCBtVHJhY2tzLnNpemUgJWQsIG1BY3RpdmVUcmFja3Muc2l6ZSAlZCIsIHRoaXMsICBtVHJhY2tzLnNpemUoKSwgbUFjdGl2ZVRyYWNrcy5zaXplKCkpOworICAgIExPR1YgKCJNaXhlclRocmVhZDo6aW52YWxpZGF0ZVRyYWNrcygpIG1peGVyICVwLCBzdHJlYW1UeXBlICVkLCBtVHJhY2tzLnNpemUgJWQiLAorICAgICAgICAgICAgdGhpcywgIHN0cmVhbVR5cGUsIG1UcmFja3Muc2l6ZSgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgc2l6ZV90IHNpemUgPSBtVHJhY2tzLnNpemUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07CiAgICAgICAgIGlmICh0LT50eXBlKCkgPT0gc3RyZWFtVHlwZSkgewotICAgICAgICAgICAgdHJhY2tzLmFkZCh0KTsKLSAgICAgICAgICAgIGludCBqID0gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKHQpOwotICAgICAgICAgICAgaWYgKGogPj0gMCkgewotICAgICAgICAgICAgICAgIHQgPSBtQWN0aXZlVHJhY2tzW2pdLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAodCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2l6ZSA9IGFjdGl2ZVRyYWNrcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2tzW2ldKTsKLSAgICB9Ci0KLSAgICBzaXplID0gdHJhY2tzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBzcDxUcmFjaz4gdCA9IHRyYWNrc1tpXTsKLSAgICAgICAgbVRyYWNrcy5yZW1vdmUodCk7Ci0gICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKHQtPm5hbWUoKSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnB1dFRyYWNrcygKLSAgICAgICAgU29ydGVkVmVjdG9yIDwgc3A8VHJhY2s+ID4mIHRyYWNrcywKLSAgICAgICAgU29ydGVkVmVjdG9yIDwgd3A8VHJhY2s+ID4mIGFjdGl2ZVRyYWNrcykKLXsKLSAgICBMT0dWICgiTWl4ZXJUaHJlYWQ6OnB1dFRyYWNrcygpIG1peGVyICVwLCB0cmFja3Muc2l6ZSAlZCwgYWN0aXZlVHJhY2tzLnNpemUgJWQiLCB0aGlzLCAgdHJhY2tzLnNpemUoKSwgYWN0aXZlVHJhY2tzLnNpemUoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzaXplX3Qgc2l6ZSA9IHRyYWNrcy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplIDsgaSsrKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0ID0gdHJhY2tzW2ldOwotICAgICAgICBpbnQgbmFtZSA9IGdldFRyYWNrTmFtZV9sKCk7Ci0KLSAgICAgICAgaWYgKG5hbWUgPCAwKSByZXR1cm47Ci0KLSAgICAgICAgdC0+bU5hbWUgPSBuYW1lOwotICAgICAgICB0LT5tVGhyZWFkID0gdGhpczsKLSAgICAgICAgbVRyYWNrcy5hZGQodCk7Ci0KLSAgICAgICAgaW50IGogPSBhY3RpdmVUcmFja3MuaW5kZXhPZih0KTsKLSAgICAgICAgaWYgKGogPj0gMCkgewotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodCk7Ci0gICAgICAgICAgICAvLyBmb3JjZSBidWZmZXIgcmVmaWxsaW5nIGFuZCBubyByYW1wIHZvbHVtZSB3aGVuIHRoZSB0cmFjayBpcyBtaXhlZCBmb3IgdGhlIGZpcnN0IHRpbWUKLSAgICAgICAgICAgIHQtPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfRklMTElORzsKKyAgICAgICAgICAgIHQtPm1DYmxrLT5sb2NrLmxvY2soKTsKKyAgICAgICAgICAgIHQtPm1DYmxrLT5mbGFncyB8PSBDQkxLX0lOVkFMSURfT047CisgICAgICAgICAgICB0LT5tQ2Jsay0+Y3Yuc2lnbmFsKCk7CisgICAgICAgICAgICB0LT5tQ2Jsay0+bG9jay51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIH0KIAorCiAvLyBnZXRUcmFja05hbWVfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogaW50IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmdldFRyYWNrTmFtZV9sKCkKIHsKQEAgLTE3MTYsNiArMTk2MiwxNSBAQAogICAgICAgICAgICAgICAgIHJlY29uZmlnID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKKyAgICAgICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KKyAgICAgICAgICAgIG1EZXZpY2UgPSAodWludDMyX3QpdmFsdWU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtRGV2aWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlyKTsKICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CkBAIC0xNzcxLDEzICsyMDI2LDE3IEBACiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpCiB7Ci0gICAgcmV0dXJuICh1aW50MzJfdCkoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwOworICAgIHJldHVybiAodWludDMyX3QpKCgobUZyYW1lQ291bnQgKiAxMDAwKSAvIG1TYW1wbGVSYXRlKSAqIDEwMDApIC8gMjsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6c3VzcGVuZFNsZWVwVGltZVVzKCkKK3sKKyAgICByZXR1cm4gKHVpbnQzMl90KSgoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkKSwKLSAgICBtTGVmdFZvbHVtZSAoMS4wKSwgbVJpZ2h0Vm9sdW1lKDEuMCkKK0F1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBpbnQgaWQsIHVpbnQzMl90IGRldmljZSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UpCiB7CiAgICAgbVR5cGUgPSBQbGF5YmFja1RocmVhZDo6RElSRUNUOwogfQpAQCAtMTc4Nyw2ICsyMDQ2LDEwMiBAQAogfQogCiAKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCitzdGF0aWMgaW5saW5lCitpbnQzMl90IG11bChpbnQxNl90IGluLCBpbnQxNl90IHYpCit7CisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCisgICAgaW50MzJfdCBvdXQ7CisgICAgYXNtKCAic211bGJiICVbb3V0XSwgJVtpbl0sICVbdl0gXG4iCisgICAgICAgICA6IFtvdXRdIj1yIihvdXQpCisgICAgICAgICA6IFtpbl0iJXIiKGluKSwgW3ZdInIiKHYpCisgICAgICAgICA6ICk7CisgICAgcmV0dXJuIG91dDsKKyNlbHNlCisgICAgcmV0dXJuIGluICogaW50MzJfdCh2KTsKKyNlbmRpZgorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjphcHBseVZvbHVtZSh1aW50MTZfdCBsZWZ0Vm9sLCB1aW50MTZfdCByaWdodFZvbCwgYm9vbCByYW1wKQoreworICAgIC8vIERvIG5vdCBhcHBseSB2b2x1bWUgb24gY29tcHJlc3NlZCBhdWRpbworICAgIGlmICghQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb252ZXJ0IHRvIHNpZ25lZCAxNiBiaXQgYmVmb3JlIHZvbHVtZSBjYWxjdWxhdGlvbgorICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpIHsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICB1aW50OF90ICpzcmMgPSAodWludDhfdCAqKW1NaXhCdWZmZXIgKyBjb3VudC0xOworICAgICAgICBpbnQxNl90ICpkc3QgPSBtTWl4QnVmZmVyICsgY291bnQtMTsKKyAgICAgICAgd2hpbGUoY291bnQtLSkgeworICAgICAgICAgICAgKmRzdC0tID0gKGludDE2X3QpKCpzcmMtLV4weDgwKSA8PCA4OworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICBpbnQxNl90ICpvdXQgPSBtTWl4QnVmZmVyOworICAgIGlmIChyYW1wKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZCA9ICgoaW50MzJfdClsZWZ0Vm9sIC0gKGludDMyX3QpbUxlZnRWb2xTaG9ydCkgPDwgMTY7CisgICAgICAgICAgICBpbnQzMl90IHZsSW5jID0gZCAvIChpbnQzMl90KWZyYW1lQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gKChpbnQzMl90KW1MZWZ0Vm9sU2hvcnQgPDwgMTYpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFswXSA9IGNsYW1wMTYobXVsKG91dFswXSwgdmwgPj4gMTYpID4+IDEyKTsKKyAgICAgICAgICAgICAgICBvdXQrKzsKKyAgICAgICAgICAgICAgICB2bCArPSB2bEluYzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDMyX3QgZCA9ICgoaW50MzJfdClsZWZ0Vm9sIC0gKGludDMyX3QpbUxlZnRWb2xTaG9ydCkgPDwgMTY7CisgICAgICAgICAgICBpbnQzMl90IHZsSW5jID0gZCAvIChpbnQzMl90KWZyYW1lQ291bnQ7CisgICAgICAgICAgICBkID0gKChpbnQzMl90KXJpZ2h0Vm9sIC0gKGludDMyX3QpbVJpZ2h0Vm9sU2hvcnQpIDw8IDE2OworICAgICAgICAgICAgaW50MzJfdCB2ckluYyA9IGQgLyAoaW50MzJfdClmcmFtZUNvdW50OworICAgICAgICAgICAgaW50MzJfdCB2bCA9ICgoaW50MzJfdCltTGVmdFZvbFNob3J0IDw8IDE2KTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSAoKGludDMyX3QpbVJpZ2h0Vm9sU2hvcnQgPDwgMTYpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFswXSA9IGNsYW1wMTYobXVsKG91dFswXSwgdmwgPj4gMTYpID4+IDEyKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBjbGFtcDE2KG11bChvdXRbMV0sIHZyID4+IDE2KSA+PiAxMik7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1DaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIG91dFswXSA9IGNsYW1wMTYobXVsKG91dFswXSwgbGVmdFZvbCkgPj4gMTIpOworICAgICAgICAgICAgICAgIG91dCsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSBjbGFtcDE2KG11bChvdXRbMF0sIGxlZnRWb2wpID4+IDEyKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBjbGFtcDE2KG11bChvdXRbMV0sIHJpZ2h0Vm9sKSA+PiAxMik7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY29udmVydCBiYWNrIHRvIHVuc2lnbmVkIDggYml0IGFmdGVyIHZvbHVtZSBjYWxjdWxhdGlvbgorICAgIGlmIChtRm9ybWF0ID09IEF1ZGlvU3lzdGVtOjpQQ01fOF9CSVQpIHsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICBpbnQxNl90ICpzcmMgPSBtTWl4QnVmZmVyOworICAgICAgICB1aW50OF90ICpkc3QgPSAodWludDhfdCAqKW1NaXhCdWZmZXI7CisgICAgICAgIHdoaWxlKGNvdW50LS0pIHsKKyAgICAgICAgICAgICpkc3QrKyA9ICh1aW50OF90KSgoKGludDMyX3QpKnNyYysrICsgKDE8PDcpKSA+PiA4KV4weDgwOworICAgICAgICB9CisgICAgfQorCisgICAgbUxlZnRWb2xTaG9ydCA9IGxlZnRWb2w7CisgICAgbVJpZ2h0Vm9sU2hvcnQgPSByaWdodFZvbDsKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6dGhyZWFkTG9vcCgpCiB7CiAgICAgdWludDMyX3QgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwpAQCAtMTgwMiw5ICsyMTU3LDEzIEBACiAgICAgLy8gaGFyZHdhcmUgcmVzb3VyY2VzIGFzIHNvb24gYXMgcG9zc2libGUKICAgICBuc2Vjc190IHN0YW5kYnlEZWxheSA9IG1pY3Jvc2Vjb25kcyhhY3RpdmVTbGVlcFRpbWUqMik7CiAKLQogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7CisgICAgICAgIGJvb2wgcmFtcFZvbHVtZTsKKyAgICAgICAgdWludDE2X3QgbGVmdFZvbDsKKyAgICAgICAgdWludDE2X3QgcmlnaHRWb2w7CisgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOworCiAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKIAogICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CkBAIC0xODU2LDYgKzIyMTUsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgZWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWluczsKKwogICAgICAgICAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCiAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1swXS5wcm9tb3RlKCk7CkBAIC0xODcxLDYgKzIyMzIsMTkgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vTE9HVigidHJhY2sgJWQgdT0lMDh4LCBzPSUwOHggW09LXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPnVzZXIsIGNibGstPnNlcnZlcik7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSBtUmlnaHRWb2xGbG9hdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbFNob3J0ID0gbVJpZ2h0Vm9sU2hvcnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpSRVNVTUlORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1wVm9sdW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5zZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRyYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSBmaXJzdCBmcmFtZSB3YXMgbWl4ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgYXBwbHkgcmFtcAorICAgICAgICAgICAgICAgICAgICAgICAgcmFtcFZvbHVtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB2b2x1bWUgZm9yIHRoaXMgdHJhY2sKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwgcmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNNdXRlZCgpIHx8IG1NYXN0ZXJNdXRlIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fApAQCAtMTg5MCwxNyArMjI2NCw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSB2X2NsYW1wZWQvTUFYX0dBSU47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPSBtTGVmdFZvbHVtZSB8fCByaWdodCAhPSBtUmlnaHRWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbUxlZnRWb2x1bWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IG1SaWdodFZvbHVtZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPSBtTGVmdFZvbEZsb2F0IHx8IHJpZ2h0ICE9IG1SaWdodFZvbEZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbEZsb2F0ID0gcmlnaHQ7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpBQ1RJVkU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdWRpbyBIQUwgaW1wbGVtZW50cyB2b2x1bWUgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHNvZnR3YXJlIHZvbHVtZSB0byBub21pbmFsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dC0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAxLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMS4wZjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gZmxvYXQgdG8gOC4yNAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmwgPSAodWludDMyX3QpKGxlZnQgKiAoMSA8PCAyNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdnIgPSAodWludDMyX3QpKHJpZ2h0ICogKDEgPDwgMjQpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgdm9sdW1lIGNvbnRyb2wgdG8gZWZmZWN0IGluIHRyYWNrIGVmZmVjdCBjaGFpbiBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgb25lIGVmZmVjdCBjaGFpbiBjYW4gYmUgcHJlc2VudCBvbiBEaXJlY3RPdXRwdXRUaHJlYWQsIHNvIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBvbmUsIHRoZSB0cmFjayBpcyBjb25uZWN0ZWQgdG8gaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWZmZWN0Q2hhaW5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCByYW1wIHZvbHVtZSBpcyB2b2x1bWUgaXMgY29udHJvbGxlZCBieSBlZmZlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlZmZlY3RDaGFpbnNbMF0tPnNldFZvbHVtZV9sKCZ2bCwgJnZyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1wVm9sdW1lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHZvbHVtZXMgZnJvbSA4LjI0IHRvIDQuMTIgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2X2NsYW1wZWQgPSAodmwgKyAoMSA8PCAxMSkpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOX0lOVCkgdl9jbGFtcGVkID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFZvbCA9ICh1aW50MTZfdCl2X2NsYW1wZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2X2NsYW1wZWQgPSAodnIgKyAoMSA8PCAxMSkpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZfY2xhbXBlZCA+IE1BWF9HQUlOX0lOVCkgdl9jbGFtcGVkID0gTUFYX0dBSU5fSU5UOworICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRWb2wgPSAodWludDE2X3Qpdl9jbGFtcGVkOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFZvbCA9IG1MZWZ0Vm9sU2hvcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICByaWdodFZvbCA9IG1SaWdodFZvbFNob3J0OworICAgICAgICAgICAgICAgICAgICAgICAgcmFtcFZvbHVtZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKQEAgLTE5MzIsMTEgKzIzMzEsMTggQEAKICAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgdGhlIHRyYWNrcyB0aGF0IG5lZWQgdG8gYmUuLi4KICAgICAgICAgICAgIGlmIChVTkxJS0VMWSh0cmFja1RvUmVtb3ZlICE9IDApKSB7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2tUb1JlbW92ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFlZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGVmZmVjdENoYWluc1swXS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RvUmVtb3ZlLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1swXS0+c3RvcFRyYWNrKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICh0cmFja1RvUmVtb3ZlLT5pc1Rlcm1pbmF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLnJlbW92ZSh0cmFja1RvUmVtb3ZlKTsKICAgICAgICAgICAgICAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2wodHJhY2tUb1JlbW92ZS0+bU5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CiAgICAgICAgfQogCiAgICAgICAgIGlmIChMSUtFTFkobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgewpAQCAtMTk0NCw3ICsyMzUwLDcgQEAKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICBjdXJCdWYgPSAoaW50OF90ICopbU1peEJ1ZmZlcjsKICAgICAgICAgICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQotICAgICAgICAgICAgd2hpbGUoZnJhbWVDb3VudCkgeworICAgICAgICAgICAgd2hpbGUgKGZyYW1lQ291bnQpIHsKICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgaWYgKFVOTElLRUxZKGJ1ZmZlci5yYXcgPT0gMCkpIHsKQEAgLTE5NzIsMTAgKzIzNzgsMTggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtU3VzcGVuZGVkKSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICAgICAgc2xlZXBUaW1lID0gc3VzcGVuZFNsZWVwVGltZVVzKCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gc2xlZXBUaW1lID09IDAgbWVhbnMgd2UgbXVzdCB3cml0ZSB0byBhdWRpbyBoYXJkd2FyZQogICAgICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICAgICAgICAgIGlmIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICBhcHBseVZvbHVtZShsZWZ0Vm9sLCByaWdodFZvbCwgcmFtcFZvbHVtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CisKICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgbUluV3JpdGUgPSB0cnVlOwogICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSBtaXhCdWZmZXJTaXplOwpAQCAtMTk4NSw2ICsyMzk5LDcgQEAKICAgICAgICAgICAgIG1JbldyaXRlID0gZmFsc2U7CiAgICAgICAgICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKICAgICAgICAgfQogCkBAIC0xOTkzLDYgKzI0MDgsMTAgQEAKICAgICAgICAgLy8gc2FtZSBsb2NrLgogICAgICAgICB0cmFja1RvUmVtb3ZlLmNsZWFyKCk7CiAgICAgICAgIGFjdGl2ZVRyYWNrLmNsZWFyKCk7CisKKyAgICAgICAgLy8gRWZmZWN0IGNoYWlucyB3aWxsIGJlIGFjdHVhbGx5IGRlbGV0ZWQgaGVyZSBpZiB0aGV5IHdlcmUgcmVtb3ZlZCBmcm9tCisgICAgICAgIC8vIG1FZmZlY3RDaGFpbnMgbGlzdCBkdXJpbmcgbWl4aW5nIG9yIGVmZmVjdHMgcHJvY2Vzc2luZworICAgICAgICBlZmZlY3RDaGFpbnMuY2xlYXIoKTsKICAgICB9CiAKICAgICBpZiAoIW1TdGFuZGJ5KSB7CkBAIC0yMDczLDE3ICsyNDkyLDI5IEBACiB7CiAgICAgdWludDMyX3QgdGltZTsKICAgICBpZiAoQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHRpbWUgPSAodWludDMyX3QpKChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUpICogMTAwMDsKKyAgICAgICAgdGltZSA9ICh1aW50MzJfdCkoKChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUpICogMTAwMCkgLyAyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRpbWUgPSAxMDAwMDsKICAgICB9CiAgICAgcmV0dXJuIHRpbWU7CiB9CiAKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzdXNwZW5kU2xlZXBUaW1lVXMoKQoreworICAgIHVpbnQzMl90IHRpbWU7CisgICAgaWYgKEF1ZGlvU3lzdGVtOjppc0xpbmVhclBDTShtRm9ybWF0KSkgeworICAgICAgICB0aW1lID0gKHVpbnQzMl90KSgoKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSkgKiAxMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lID0gMTAwMDA7CisgICAgfQorICAgIHJldHVybiB0aW1lOworfQorCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6RHVwbGljYXRpbmdUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkKiBtYWluVGhyZWFkLCBpbnQgaWQpCi0gICAgOiAgIE1peGVyVGhyZWFkKGF1ZGlvRmxpbmdlciwgbWFpblRocmVhZC0+Z2V0T3V0cHV0KCksIGlkKSwgbVdhaXRUaW1lTXMoVUlOVF9NQVgpCisgICAgOiAgIE1peGVyVGhyZWFkKGF1ZGlvRmxpbmdlciwgbWFpblRocmVhZC0+Z2V0T3V0cHV0KCksIGlkLCBtYWluVGhyZWFkLT5kZXZpY2UoKSksIG1XYWl0VGltZU1zKFVJTlRfTUFYKQogewogICAgIG1UeXBlID0gUGxheWJhY2tUaHJlYWQ6OkRVUExJQ0FUSU5HOwogICAgIGFkZE91dHB1dFRyYWNrKG1haW5UaHJlYWQpOwpAQCAtMjA5OSw3ICsyNTMwLDYgQEAKIAogYm9vbCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wKCkKIHsKLSAgICBpbnQxNl90KiBjdXJCdWYgPSBtTWl4QnVmZmVyOwogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAgICAgdWludDMyX3QgbWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIG5zZWNzX3Qgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCk7CkBAIC0yMTA5LDYgKzI1MzksNyBAQAogICAgIHVpbnQzMl90IGFjdGl2ZVNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgdWludDMyX3QgaWRsZVNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWVVcygpOwogICAgIHVpbnQzMl90IHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKICAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCiAgICAgewpAQCAtMjE2OSwxNCArMjYwMCwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IHByZXBhcmVUcmFja3NfbChhY3RpdmVUcmFja3MsICZ0cmFja3NUb1JlbW92ZSk7CisKKyAgICAgICAgICAgIC8vIHByZXZlbnQgYW55IGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluIGxpc3QgYW5kIGluIGVhY2ggZWZmZWN0IGNoYWluCisgICAgICAgICAgICAvLyBkdXJpbmcgbWl4aW5nIGFuZCBlZmZlY3QgcHJvY2VzcyBhcyB0aGUgYXVkaW8gYnVmZmVycyBjb3VsZCBiZSBkZWxldGVkCisgICAgICAgICAgICAvLyBvciBtb2RpZmllZCBpZiBhbiBlZmZlY3QgaXMgY3JlYXRlZCBvciBkZWxldGVkCisgICAgICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChMSUtFTFkobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgewogICAgICAgICAgICAgLy8gbWl4IGJ1ZmZlcnMuLi4KICAgICAgICAgICAgIGlmIChvdXRwdXRzUmVhZHkob3V0cHV0VHJhY2tzKSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5wcm9jZXNzKGN1ckJ1Zik7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnByb2Nlc3MoKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGN1ckJ1ZiwgMCwgbWl4QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2xlZXBUaW1lID0gMDsKICAgICAgICAgICAgIHdyaXRlRnJhbWVzID0gbUZyYW1lQ291bnQ7CkBAIC0yMTkzLDYgKzI2MjksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhY2tzW2ldLT5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGcmFtZXMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1peEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yMjAwLDE3ICsyNjM3LDI1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobVN1c3BlbmRlZCkgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgIHNsZWVwVGltZSA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOwogICAgICAgICB9CiAgICAgICAgIC8vIHNsZWVwVGltZSA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCisgICAgICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKKwogICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBrU3RhbmRieVRpbWVJbk5zZWNzOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKGN1ckJ1Ziwgd3JpdGVGcmFtZXMpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobU1peEJ1ZmZlciwgd3JpdGVGcmFtZXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbWl4QnVmZmVyU2l6ZTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgorICAgICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKICAgICAgICAgfQogCkBAIC0yMjE5LDYgKzI2NjQsMTAgQEAKICAgICAgICAgLy8gc2FtZSBsb2NrLgogICAgICAgICB0cmFja3NUb1JlbW92ZS5jbGVhcigpOwogICAgICAgICBvdXRwdXRUcmFja3MuY2xlYXIoKTsKKworICAgICAgICAvLyBFZmZlY3QgY2hhaW5zIHdpbGwgYmUgYWN0dWFsbHkgZGVsZXRlZCBoZXJlIGlmIHRoZXkgd2VyZSByZW1vdmVkIGZyb20KKyAgICAgICAgLy8gbUVmZmVjdENoYWlucyBsaXN0IGR1cmluZyBtaXhpbmcgb3IgZWZmZWN0cyBwcm9jZXNzaW5nCisgICAgICAgIGVmZmVjdENoYWlucy5jbGVhcigpOwogICAgIH0KIAogICAgIHJldHVybiBmYWxzZTsKQEAgLTIzMDMsNyArMjc1Miw4IEBACiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIpCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKICAgICA6ICAgUmVmQmFzZSgpLAogICAgICAgICBtVGhyZWFkKHRocmVhZCksCiAgICAgICAgIG1DbGllbnQoY2xpZW50KSwKQEAgLTIzMTIsNyArMjc2Miw4IEBACiAgICAgICAgIG1TdGF0ZShJRExFKSwKICAgICAgICAgbUNsaWVudFRpZCgtMSksCiAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUZsYWdzKGZsYWdzICYgflNZU1RFTV9GTEFHU19NQVNLKQorICAgICAgICBtRmxhZ3MoZmxhZ3MgJiB+U1lTVEVNX0ZMQUdTX01BU0spLAorICAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCkKIHsKICAgICBMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJWQiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwgc2hhcmVkQnVmZmVyLT5zaXplKCkpOwogCkBAIC0yMzMyLDEzICsyNzgzLDEzIEBACiAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYWxsIGJ1ZmZlcnMKICAgICAgICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgIG1DYmxrLT5jaGFubmVscyA9ICh1aW50OF90KWNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OwogICAgICAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwogICAgICAgICAgICAgICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbUNibGstPmZsYWdzID0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjM1NiwxMiArMjgwNywxMiBAQAogICAgICAgICAgICAvLyBjbGVhciBhbGwgYnVmZmVycwogICAgICAgICAgICBtQ2Jsay0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CiAgICAgICAgICAgIG1DYmxrLT5zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgbUNibGstPmNoYW5uZWxzID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OworICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50ID0gKHVpbnQ4X3QpY2hhbm5lbENvdW50OwogICAgICAgICAgICBtQnVmZmVyID0gKGNoYXIqKW1DYmxrICsgc2l6ZW9mKGF1ZGlvX3RyYWNrX2NibGtfdCk7CiAgICAgICAgICAgIG1lbXNldChtQnVmZmVyLCAwLCBmcmFtZUNvdW50KmNoYW5uZWxDb3VudCpzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAvLyBGb3JjZSB1bmRlcnJ1biBjb25kaXRpb24gdG8gYXZvaWQgZmFsc2UgdW5kZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwogICAgICAgICAgICAvLyB3cml0dGVuIHRvIGJ1ZmZlcgotICAgICAgICAgICBtQ2Jsay0+Zmxvd0NvbnRyb2xGbGFnID0gMTsKKyAgICAgICAgICAgbUNibGstPmZsYWdzID0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICAgICAgICAgbUJ1ZmZlckVuZCA9ICh1aW50OF90ICopbUJ1ZmZlciArIGJ1ZmZlclNpemU7CiAgICAgICAgfQogICAgfQpAQCAtMjQyMyw3ICsyODc0LDcgQEAKIH0KIAogaW50IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpjaGFubmVsQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChpbnQpbUNibGstPmNoYW5uZWxzOworICAgIHJldHVybiAoaW50KW1DYmxrLT5jaGFubmVsQ291bnQ7CiB9CiAKIHZvaWQqIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpnZXRCdWZmZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBmcmFtZXMpIGNvbnN0IHsKQEAgLTI0MzUsOSArMjg4Niw5IEBACiAgICAgaWYgKGJ1ZmZlclN0YXJ0IDwgbUJ1ZmZlciB8fCBidWZmZXJTdGFydCA+IGJ1ZmZlckVuZCB8fCBidWZmZXJFbmQgPiBtQnVmZmVyRW5kIHx8CiAgICAgICAgICgodW5zaWduZWQgbG9uZylidWZmZXJTdGFydCAmICh1bnNpZ25lZCBsb25nKShjYmxrLT5mcmFtZVNpemUgLSAxKSkpIHsKICAgICAgICAgTE9HRSgiVHJhY2tCYXNlOjpnZXRCdWZmZXIgYnVmZmVyIG91dCBvZiByYW5nZTpcbiAgICBzdGFydDogJXAsIGVuZCAlcCAsIG1CdWZmZXIgJXAgbUJ1ZmZlckVuZCAlcFxuICAgIFwKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgJWQsIHNlcnZlckJhc2UgJWQsIHVzZXIgJWQsIHVzZXJCYXNlICVkLCBjaGFubmVscyAlZCIsCisgICAgICAgICAgICAgICAgc2VydmVyICVkLCBzZXJ2ZXJCYXNlICVkLCB1c2VyICVkLCB1c2VyQmFzZSAlZCwgY2hhbm5lbENvdW50ICVkIiwKICAgICAgICAgICAgICAgICBidWZmZXJTdGFydCwgYnVmZmVyRW5kLCBtQnVmZmVyLCBtQnVmZmVyRW5kLAotICAgICAgICAgICAgICAgIGNibGstPnNlcnZlciwgY2Jsay0+c2VydmVyQmFzZSwgY2Jsay0+dXNlciwgY2Jsay0+dXNlckJhc2UsIGNibGstPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBjYmxrLT5zZXJ2ZXIsIGNibGstPnNlcnZlckJhc2UsIGNibGstPnVzZXIsIGNibGstPnVzZXJCYXNlLCBjYmxrLT5jaGFubmVsQ291bnQpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI0NTUsMTUgKzI5MDYsMTggQEAKICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKQotICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCAwLCBzaGFyZWRCdWZmZXIpLAotICAgIG1NdXRlKGZhbHNlKSwgbVNoYXJlZEJ1ZmZlcihzaGFyZWRCdWZmZXIpLCBtTmFtZSgtMSkKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICBpbnQgc2Vzc2lvbklkKQorICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCAwLCBzaGFyZWRCdWZmZXIsIHNlc3Npb25JZCksCisgICAgbU11dGUoZmFsc2UpLCBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksIG1OYW1lKC0xKSwgbU1haW5CdWZmZXIoTlVMTCksIG1BdXhCdWZmZXIoTlVMTCksCisgICAgbUF1eEVmZmVjdElkKDApLCBtSGFzVm9sdW1lQ29udHJvbGxlcihmYWxzZSkKIHsKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBzcDxUaHJlYWRCYXNlPiBiYXNlVGhyZWFkID0gdGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKGJhc2VUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopYmFzZVRocmVhZC5nZXQoKTsKICAgICAgICAgICAgIG1OYW1lID0gcGxheWJhY2tUaHJlYWQtPmdldFRyYWNrTmFtZV9sKCk7CisgICAgICAgICAgICBtTWFpbkJ1ZmZlciA9IHBsYXliYWNrVGhyZWFkLT5taXhCdWZmZXIoKTsKICAgICAgICAgfQogICAgICAgICBMT0dWKCJUcmFjayBjb25zdHJ1Y3RvciBuYW1lICVkLCBjYWxsaW5nIHRocmVhZCAlZCIsIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICBpZiAobU5hbWUgPCAwKSB7CkBAIC0yNTA0LDcgKzI5NTgsOSBAQAogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIGlmICghaXNPdXRwdXRUcmFjaygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRocmVhZC0+aWQoKSk7CiAgICAgICAgICAgICB9CkBAIC0yNTE3LDEyICsyOTczLDEzIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICU1ZCAlNWQgJTN1ICUzdSAlM3UgJTA0dSAlMWQgJTFkICUxZCAlNXUgJTV1ICU1dSAgJTA4eCAlMDh4XG4iLAorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIiAgICUwNWQgJTA1ZCAlMDN1ICUwM3UgJTAzdSAlMDV1ICAgJTA0dSAlMWQgJTFkICUxZCAlMDV1ICUwNXUgJTA1dSAgMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAogICAgICAgICAgICAgbU5hbWUgLSBBdWRpb01peGVyOjpUUkFDSzAsCiAgICAgICAgICAgICAobUNsaWVudCA9PSBOVUxMKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbHMsCisgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50LAorICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLAogICAgICAgICAgICAgbU11dGUsCkBAIC0yNTMxLDcgKzI5ODgsOSBAQAogICAgICAgICAgICAgbUNibGstPnZvbHVtZVswXSwKICAgICAgICAgICAgIG1DYmxrLT52b2x1bWVbMV0sCiAgICAgICAgICAgICBtQ2Jsay0+c2VydmVyLAotICAgICAgICAgICAgbUNibGstPnVzZXIpOworICAgICAgICAgICAgbUNibGstPnVzZXIsCisgICAgICAgICAgICAoaW50KW1NYWluQnVmZmVyLAorICAgICAgICAgICAgKGludCltQXV4QnVmZmVyKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCkBAIC0yNTc5LDkgKzMwMzgsOSBAQAogICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzICE9IEZTX0ZJTExJTkcpIHJldHVybiB0cnVlOwogCiAgICAgaWYgKG1DYmxrLT5mcmFtZXNSZWFkeSgpID49IG1DYmxrLT5mcmFtZUNvdW50IHx8Ci0gICAgICAgIG1DYmxrLT5mb3JjZVJlYWR5KSB7CisgICAgICAgICAgICAobUNibGstPmZsYWdzICYgQ0JMS19GT1JDRVJFQURZX01TSykpIHsKICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExFRDsKLSAgICAgICAgbUNibGstPmZvcmNlUmVhZHkgPSAwOworICAgICAgICBtQ2Jsay0+ZmxhZ3MgJj0gfkNCTEtfRk9SQ0VSRUFEWV9NU0s7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNTkwLDcgKzMwNDksOCBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnN0YXJ0KCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgdGhyZWFkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HVigic3RhcnQoJWQpLCBjYWxsaW5nIHRocmVhZCAlZCBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC0yNjA3LDcgKzMwNjcsOSBAQAogCiAgICAgICAgIGlmICghaXNPdXRwdXRUcmFjaygpICYmIHN0YXRlICE9IEFDVElWRSAmJiBzdGF0ZSAhPSBSRVNVTUlORykgewogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dCh0aHJlYWQtPmlkKCksIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUpOworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KHRocmVhZC0+aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOwogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtMjY0MCw3ICszMTAyLDkgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoIWlzT3V0cHV0VHJhY2soKSAmJiAoc3RhdGUgPT0gQUNUSVZFIHx8IHN0YXRlID09IFJFU1VNSU5HKSkgewogICAgICAgICAgICAgdGhyZWFkLT5tTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0aHJlYWQtPmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKW1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLmxvY2soKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI2NTcsNyArMzEyMSw5IEBACiAgICAgICAgICAgICBMT0dWKCJBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgaWYgKCFpc091dHB1dFRyYWNrKCkpIHsKICAgICAgICAgICAgICAgICB0aHJlYWQtPm1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRocmVhZC0+aWQoKSwgKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSltU3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodGhyZWFkLT5pZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdGhyZWFkLT5tTG9jay5sb2NrKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2OTYsOCArMzE2Miw4IEBACiAgICAgICAgIFRyYWNrQmFzZTo6cmVzZXQoKTsKICAgICAgICAgLy8gRm9yY2UgdW5kZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIHVuZGVycnVuIGNhbGxiYWNrIHVudGlsIGZpcnN0IGRhdGEgaXMKICAgICAgICAgLy8gd3JpdHRlbiB0byBidWZmZXIKLSAgICAgICAgbUNibGstPmZsb3dDb250cm9sRmxhZyA9IDE7Ci0gICAgICAgIG1DYmxrLT5mb3JjZVJlYWR5ID0gMDsKKyAgICAgICAgbUNibGstPmZsYWdzIHw9IENCTEtfVU5ERVJSVU5fT047CisgICAgICAgIG1DYmxrLT5mbGFncyAmPSB+Q0JMS19GT1JDRVJFQURZX01TSzsKICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExJTkc7CiAgICAgICAgIG1SZXNldERvbmUgPSB0cnVlOwogICAgIH0KQEAgLTI3MTQsNiArMzE4MCwyMyBAQAogICAgIG1Wb2x1bWVbMV0gPSByaWdodDsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gREVBRF9PQkpFQ1Q7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgIHN0YXR1cyA9IHBsYXliYWNrVGhyZWFkLT5hdHRhY2hBdXhFZmZlY3QodGhpcywgRWZmZWN0SWQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzZXRBdXhCdWZmZXIoaW50IEVmZmVjdElkLCBpbnQzMl90ICpidWZmZXIpCit7CisgICAgbUF1eEVmZmVjdElkID0gRWZmZWN0SWQ7CisgICAgbUF1eEJ1ZmZlciA9IGJ1ZmZlcjsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZApAQCAtMjcyNCw5ICszMjA3LDEwIEBACiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBmbGFncywgMCksCisgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGZsYWdzLCAwLCBzZXNzaW9uSWQpLAogICAgICAgICBtT3ZlcmZsb3coZmFsc2UpCiB7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKQEAgLTI4MDgsMTYgKzMyOTIsMTcgQEAKICAgICAgICAgVHJhY2tCYXNlOjpyZXNldCgpOwogICAgICAgICAvLyBGb3JjZSBvdmVyZXJydW4gY29uZGl0aW9uIHRvIGF2b2lkIGZhbHNlIG92ZXJydW4gY2FsbGJhY2sgdW50aWwgZmlyc3QgZGF0YSBpcwogICAgICAgICAvLyByZWFkIGZyb20gYnVmZmVyCi0gICAgICAgIG1DYmxrLT5mbG93Q29udHJvbEZsYWcgPSAxOworICAgICAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19VTkRFUlJVTl9PTjsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0gICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiICAgJTA1ZCAlMDN1ICUwM3UgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICIgICAlMDVkICUwM3UgJTAzdSAlMDVkICAgJTA0dSAlMDFkICUwNXUgICUwOHggJTA4eFxuIiwKICAgICAgICAgICAgIChtQ2xpZW50ID09IE5VTEwpID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbHMsCisgICAgICAgICAgICBtQ2Jsay0+Y2hhbm5lbENvdW50LAorICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAogICAgICAgICAgICAgbVN0YXRlLAogICAgICAgICAgICAgbUNibGstPnNhbXBsZVJhdGUsCkBAIC0yODM1LDE5ICszMzIwLDE5IEBACiAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGludCBmcmFtZUNvdW50KQotICAgIDogICBUcmFjayh0aHJlYWQsIE5VTEwsIEF1ZGlvU3lzdGVtOjpOVU1fU1RSRUFNX1RZUEVTLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgTlVMTCksCisgICAgOiAgIFRyYWNrKHRocmVhZCwgTlVMTCwgQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVMsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBOVUxMLCAwKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CiAKICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQudW5zYWZlX2dldCgpOwogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYmxrLT5vdXQgPSAxOworICAgICAgICBtQ2Jsay0+ZmxhZ3MgfD0gQ0JMS19ESVJFQ1RJT05fT1VUOwogICAgICAgICBtQ2Jsay0+YnVmZmVycyA9IChjaGFyKiltQ2JsayArIHNpemVvZihhdWRpb190cmFja19jYmxrX3QpOwogICAgICAgICBtQ2Jsay0+dm9sdW1lWzBdID0gbUNibGstPnZvbHVtZVsxXSA9IDB4MTAwMDsKICAgICAgICAgbU91dEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgcGxheWJhY2tUaHJlYWQtPm1UcmFja3MuYWRkKHRoaXMpOwotICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsIG1DYmxrLT5mcmFtZUNvdW50ICVkLCBtQ2Jsay0+c2FtcGxlUmF0ZSAlZCwgbUNibGstPmNoYW5uZWxzICVkIG1CdWZmZXJFbmQgJXAiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLCBtQ2Jsay0+YnVmZmVycywgbUNibGstPmZyYW1lQ291bnQsIG1DYmxrLT5zYW1wbGVSYXRlLCBtQ2Jsay0+Y2hhbm5lbHMsIG1CdWZmZXJFbmQpOworICAgICAgICBMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgbUNibGstPmJ1ZmZlcnMgJXAsIG1DYmxrLT5mcmFtZUNvdW50ICVkLCBtQ2Jsay0+c2FtcGxlUmF0ZSAlZCwgbUNibGstPmNoYW5uZWxDb3VudCAlZCBtQnVmZmVyRW5kICVwIiwKKyAgICAgICAgICAgICAgICBtQ2JsaywgbUJ1ZmZlciwgbUNibGstPmJ1ZmZlcnMsIG1DYmxrLT5mcmFtZUNvdW50LCBtQ2Jsay0+c2FtcGxlUmF0ZSwgbUNibGstPmNoYW5uZWxDb3VudCwgbUJ1ZmZlckVuZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKICAgICB9CkBAIC0yODgyLDcgKzMzNjcsNyBAQAogewogICAgIEJ1ZmZlciAqcEluQnVmZmVyOwogICAgIEJ1ZmZlciBpbkJ1ZmZlcjsKLSAgICB1aW50MzJfdCBjaGFubmVscyA9IG1DYmxrLT5jaGFubmVsczsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtQ2Jsay0+Y2hhbm5lbENvdW50OwogICAgIGJvb2wgb3V0cHV0QnVmZmVyRnVsbCA9IGZhbHNlOwogICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7CiAgICAgaW5CdWZmZXIuaTE2ID0gZGF0YTsKQEAgLTI4OTgsMTAgKzMzODMsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAobUJ1ZmZlclF1ZXVlLnNpemUoKSA8IGtNYXhPdmVyRmxvd0J1ZmZlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRGcmFtZXMgPSAobUNibGstPmZyYW1lQ291bnQgLSBmcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXIgPSBuZXcgQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtzdGFydEZyYW1lcyAqIGNoYW5uZWxzXTsKKyAgICAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5tQnVmZmVyID0gbmV3IGludDE2X3Rbc3RhcnRGcmFtZXMgKiBjaGFubmVsQ291bnRdOwogICAgICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgPSBzdGFydEZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5pMTYgPSBwSW5CdWZmZXItPm1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgc3RhcnRGcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgc3RhcnRGcmFtZXMgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTE9HVyAoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIG5vIG1vcmUgYnVmZmVycyBpbiBxdWV1ZSIsIHRoaXMpOwpAQCAtMjkzOSwxMiArMzQyNCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgdWludDMyX3Qgb3V0RnJhbWVzID0gcEluQnVmZmVyLT5mcmFtZUNvdW50ID4gbU91dEJ1ZmZlci5mcmFtZUNvdW50ID8gbU91dEJ1ZmZlci5mcmFtZUNvdW50IDogcEluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICBtZW1jcHkobU91dEJ1ZmZlci5yYXcsIHBJbkJ1ZmZlci0+cmF3LCBvdXRGcmFtZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIG1lbWNweShtT3V0QnVmZmVyLnJhdywgcEluQnVmZmVyLT5yYXcsIG91dEZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIG1DYmxrLT5zdGVwVXNlcihvdXRGcmFtZXMpOwogICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgLT0gb3V0RnJhbWVzOwotICAgICAgICBwSW5CdWZmZXItPmkxNiArPSBvdXRGcmFtZXMgKiBjaGFubmVsczsKKyAgICAgICAgcEluQnVmZmVyLT5pMTYgKz0gb3V0RnJhbWVzICogY2hhbm5lbENvdW50OwogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgLT0gb3V0RnJhbWVzOwotICAgICAgICBtT3V0QnVmZmVyLmkxNiArPSBvdXRGcmFtZXMgKiBjaGFubmVsczsKKyAgICAgICAgbU91dEJ1ZmZlci5pMTYgKz0gb3V0RnJhbWVzICogY2hhbm5lbENvdW50OwogCiAgICAgICAgIGlmIChwSW5CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkpIHsKQEAgLTI5NjQsMTAgKzM0NDksMTAgQEAKICAgICAgICAgaWYgKHRocmVhZCAhPSAwICYmICF0aHJlYWQtPnN0YW5kYnkoKSkgewogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkgPCBrTWF4T3ZlckZsb3dCdWZmZXJzKSB7CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyID0gbmV3IEJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBwSW5CdWZmZXItPm1CdWZmZXIgPSBuZXcgaW50MTZfdFtpbkJ1ZmZlci5mcmFtZUNvdW50ICogY2hhbm5lbHNdOworICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2luQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOwogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IGluQnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5pMTYgPSBwSW5CdWZmZXItPm1CdWZmZXI7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5hZGQocEluQnVmZmVyKTsKICAgICAgICAgICAgICAgICBMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlZCIsIHRoaXMsIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTgzLDEwICszNDY4LDEwIEBACiAgICAgICAgIGlmIChtQ2Jsay0+dXNlciA8IG1DYmxrLT5mcmFtZUNvdW50KSB7CiAgICAgICAgICAgICBmcmFtZXMgPSBtQ2Jsay0+ZnJhbWVDb3VudCAtIG1DYmxrLT51c2VyOwogICAgICAgICAgICAgcEluQnVmZmVyID0gbmV3IEJ1ZmZlcjsKLSAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2ZyYW1lcyAqIGNoYW5uZWxzXTsKKyAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2ZyYW1lcyAqIGNoYW5uZWxDb3VudF07CiAgICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXM7CiAgICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgZnJhbWVzICogY2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtc2V0KHBJbkJ1ZmZlci0+cmF3LCAwLCBmcmFtZXMgKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwogICAgICAgICB9IGVsc2UgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIHN0b3AoKTsKQEAgLTMwODYsNiArMzU3MSwyOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK0F1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCisgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksIG1QaWQocGlkKSwgbUNsaWVudChjbGllbnQpCit7Cit9CisKK0F1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkKK3sKKyAgICBtQ2xpZW50LmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykKK3sKKyAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CisgICAgeworICAgICAgICBtQXVkaW9GbGluZ2VyLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVBpZCk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OlRyYWNrSGFuZGxlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiYgdHJhY2spCiAgICAgOiBCbkF1ZGlvVHJhY2soKSwKICAgICAgIG1UcmFjayh0cmFjaykKQEAgLTMxMjgsNiArMzYzNSwxMSBAQAogICAgIHJldHVybiBtVHJhY2stPmdldENibGsoKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6YXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCkKK3sKKyAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoRWZmZWN0SWQpOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCiB7CkBAIC0zMTQ0LDYgKzM2NTYsNyBAQAogICAgICAgICBpbnQgY2hhbm5lbENvdW50LAogICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQogewogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwpAQCAtMzE1Myw2ICszNjY2LDcgQEAKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIFJlY29yZFRocmVhZCAqdGhyZWFkOwogICAgIHNpemVfdCBpbkZyYW1lQ291bnQ7CisgICAgaW50IGxTZXNzaW9uSWQ7CiAKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCiAgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKQEAgLTMxNzcsOSArMzY5MSwxOCBAQAogICAgICAgICAgICAgbUNsaWVudHMuYWRkKHBpZCwgY2xpZW50KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIElmIG5vIGF1ZGlvIHNlc3Npb24gaWQgaXMgcHJvdmlkZWQsIGNyZWF0ZSBvbmUgaGVyZQorICAgICAgICBpZiAoc2Vzc2lvbklkICE9IE5VTEwgJiYgKnNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxTZXNzaW9uSWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICpzZXNzaW9uSWQgPSBsU2Vzc2lvbklkOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBuZXcgcmVjb3JkIHRyYWNrLiBUaGUgcmVjb3JkIHRyYWNrIHVzZXMgb25lIHRyYWNrIGluIG1IYXJkd2FyZU1peGVyVGhyZWFkIGJ5IGNvbnZlbnRpb24uCiAgICAgICAgIHJlY29yZFRyYWNrID0gbmV3IFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sodGhyZWFkLCBjbGllbnQsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxDb3VudCwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsQ291bnQsIGZyYW1lQ291bnQsIGZsYWdzLCBsU2Vzc2lvbklkKTsKICAgICB9CiAgICAgaWYgKHJlY29yZFRyYWNrLT5nZXRDYmxrKCkgPT0gTlVMTCkgewogICAgICAgICAvLyByZW1vdmUgbG9jYWwgc3Ryb25nIHJlZmVyZW5jZSB0byBDbGllbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBSZWNvcmRUcmFjayBzbyB0aGF0IHRoZSBDbGllbnQKQEAgLTMyNDIsNyArMzc2NSw2IEBACiAgICAgbVJlcUNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChjaGFubmVscyk7CiAgICAgbVJlcVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwogICAgIHJlYWRJbnB1dFBhcmFtZXRlcnMoKTsKLSAgICBzZW5kQ29uZmlnRXZlbnQoQXVkaW9TeXN0ZW06OklOUFVUX09QRU5FRCk7CiB9CiAKIApAQCAtMzMzOSw3ICszODYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSBmcmFtZXNPdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJbkluZGV4ICs9IGZyYW1lc0luOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCAtPSBmcmFtZXNJbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnQpbUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBmcmFtZXNJbiAqIG1GcmFtZVNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zMzYwLDcgKzM4ODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCAmJiBtRnJhbWVDb3VudCA9PSBtUnNtcEluSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID09IG1GcmFtZUNvdW50ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtQ2hhbm5lbENvdW50ID09IG1SZXFDaGFubmVsQ291bnQgfHwgbUZvcm1hdCAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQpbUNoYW5uZWxDb3VudCA9PSBtUmVxQ2hhbm5lbENvdW50IHx8IG1Gb3JtYXQgIT0gQXVkaW9TeXN0ZW06OlBDTV8xNl9CSVQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlYWQgPSBtSW5wdXQtPnJlYWQoYnVmZmVyLnJhdywgbUlucHV0Qnl0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zNTE4LDcgKzQwNDAsNyBAQAogCiAgICAgaWYgKG1BY3RpdmVUcmFjayAhPSAwKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIkFjdGl2ZSBUcmFjazpcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgICBDbGllbiBGbXQgQ2huIEJ1ZiAgUyBTUmF0ZSAgU2VydiAgICAgVXNlclxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIENsaWVuIEZtdCBDaG4gU2Vzc2lvbiBCdWYgIFMgU1JhdGUgIFNlcnYgICAgIFVzZXJcbiIpOwogICAgICAgICBtQWN0aXZlVHJhY2stPmR1bXAoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogCkBAIC0zNjU3LDE0ICs0MTc5LDE0IEBACiAgICAgcmV0dXJuIG1JbnB1dC0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBwYXJhbSkgewogICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7CiAgICAgdm9pZCAqcGFyYW0yID0gMDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6CiAgICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MuY2hhbm5lbHMgPSBtQ2hhbm5lbENvdW50OworICAgICAgICBkZXNjLmNoYW5uZWxzID0gbUNoYW5uZWxzOwogICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OwpAQCAtMzY3Niw3ICs0MTk4LDYgQEAKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1BdWRpb0ZsaW5nZXItPm1Mb2NrKTsKICAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWRfbChldmVudCwgbUlkLCBwYXJhbTIpOwogfQogCkBAIC0zNjg4LDkgKzQyMDksMTAgQEAKICAgICBtUmVzYW1wbGVyID0gMDsKIAogICAgIG1TYW1wbGVSYXRlID0gbUlucHV0LT5zYW1wbGVSYXRlKCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IEF1ZGlvU3lzdGVtOjpwb3BDb3VudChtSW5wdXQtPmNoYW5uZWxzKCkpOworICAgIG1DaGFubmVscyA9IG1JbnB1dC0+Y2hhbm5lbHMoKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gKHVpbnQxNl90KUF1ZGlvU3lzdGVtOjpwb3BDb3VudChtQ2hhbm5lbHMpOwogICAgIG1Gb3JtYXQgPSBtSW5wdXQtPmZvcm1hdCgpOwotICAgIG1GcmFtZVNpemUgPSBtSW5wdXQtPmZyYW1lU2l6ZSgpOworICAgIG1GcmFtZVNpemUgPSAodWludDE2X3QpbUlucHV0LT5mcmFtZVNpemUoKTsKICAgICBtSW5wdXRCeXRlcyA9IG1JbnB1dC0+YnVmZmVyU2l6ZSgpOwogICAgIG1GcmFtZUNvdW50ID0gbUlucHV0Qnl0ZXMgLyBtRnJhbWVTaXplOwogICAgIG1Sc21wSW5CdWZmZXIgPSBuZXcgaW50MTZfdFttRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnRdOwpAQCAtMzc2NywxNCArNDI4OSwxNSBAQAogCiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKICAgICBpZiAob3V0cHV0ICE9IDApIHsKKyAgICAgICAgaW50IGlkID0gbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIGlmICgoZmxhZ3MgJiBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfRElSRUNUKSB8fAogICAgICAgICAgICAgKGZvcm1hdCAhPSBBdWRpb1N5c3RlbTo6UENNXzE2X0JJVCkgfHwKICAgICAgICAgICAgIChjaGFubmVscyAhPSBBdWRpb1N5c3RlbTo6Q0hBTk5FTF9PVVRfU1RFUkVPKSkgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXQsICsrbU5leHRUaHJlYWRJZCk7Ci0gICAgICAgICAgICBMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBtTmV4dFRocmVhZElkLCB0aHJlYWQpOworICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXQsIGlkLCAqcERldmljZXMpOworICAgICAgICAgICAgTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0LCArK21OZXh0VGhyZWFkSWQpOwotICAgICAgICAgICAgTE9HVigib3Blbk91dHB1dCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCBtTmV4dFRocmVhZElkLCB0aHJlYWQpOworICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dCwgaWQsICpwRGV2aWNlcyk7CisgICAgICAgICAgICBMT0dWKCJvcGVuT3V0cHV0KCkgY3JlYXRlZCBtaXhlciBvdXRwdXQ6IElEICVkIHRocmVhZCAlcCIsIGlkLCB0aHJlYWQpOwogCiAjaWZkZWYgTFZNWAogICAgICAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9CkBAIC0zNzg4LDE0ICs0MzExLDE2IEBACiAjZW5kaWYKIAogICAgICAgICB9Ci0gICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKG1OZXh0VGhyZWFkSWQsIHRocmVhZCk7CisgICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKGlkLCB0aHJlYWQpOwogCiAgICAgICAgIGlmIChwU2FtcGxpbmdSYXRlKSAqcFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKICAgICAgICAgaWYgKHBGb3JtYXQpICpwRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICBpZiAocENoYW5uZWxzKSAqcENoYW5uZWxzID0gY2hhbm5lbHM7CiAgICAgICAgIGlmIChwTGF0ZW5jeU1zKSAqcExhdGVuY3lNcyA9IHRocmVhZC0+bGF0ZW5jeSgpOwogCi0gICAgICAgIHJldHVybiBtTmV4dFRocmVhZElkOworICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IG91dHB1dCBjcmVhdGlvbgorICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICAgICAgcmV0dXJuIGlkOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMzgxMiwxMSArNDMzNywxMyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLQotICAgIER1cGxpY2F0aW5nVGhyZWFkICp0aHJlYWQgPSBuZXcgRHVwbGljYXRpbmdUaHJlYWQodGhpcywgdGhyZWFkMSwgKyttTmV4dFRocmVhZElkKTsKKyAgICBpbnQgaWQgPSBuZXh0VW5pcXVlSWQoKTsKKyAgICBEdXBsaWNhdGluZ1RocmVhZCAqdGhyZWFkID0gbmV3IER1cGxpY2F0aW5nVGhyZWFkKHRoaXMsIHRocmVhZDEsIGlkKTsKICAgICB0aHJlYWQtPmFkZE91dHB1dFRyYWNrKHRocmVhZDIpOwotICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKG1OZXh0VGhyZWFkSWQsIHRocmVhZCk7Ci0gICAgcmV0dXJuIG1OZXh0VGhyZWFkSWQ7CisgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7CisgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KKyAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKKyAgICByZXR1cm4gaWQ7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXQoaW50IG91dHB1dCkKQEAgLTM5MzUsMTcgKzQ0NjIsMjAgQEAKICAgICB9CiAKICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICBpbnQgaWQgPSBuZXh0VW5pcXVlSWQoKTsKICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKLSAgICAgICAgdGhyZWFkID0gbmV3IFJlY29yZFRocmVhZCh0aGlzLCBpbnB1dCwgcmVxU2FtcGxpbmdSYXRlLCByZXFDaGFubmVscywgKyttTmV4dFRocmVhZElkKTsKLSAgICAgICAgbVJlY29yZFRocmVhZHMuYWRkKG1OZXh0VGhyZWFkSWQsIHRocmVhZCk7Ci0gICAgICAgIExPR1YoIm9wZW5JbnB1dCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgbU5leHRUaHJlYWRJZCwgdGhyZWFkKTsKKyAgICAgICAgdGhyZWFkID0gbmV3IFJlY29yZFRocmVhZCh0aGlzLCBpbnB1dCwgcmVxU2FtcGxpbmdSYXRlLCByZXFDaGFubmVscywgaWQpOworICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoaWQsIHRocmVhZCk7CisgICAgICAgIExPR1YoIm9wZW5JbnB1dCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgaWQsIHRocmVhZCk7CiAgICAgICAgIGlmIChwU2FtcGxpbmdSYXRlKSAqcFNhbXBsaW5nUmF0ZSA9IHJlcVNhbXBsaW5nUmF0ZTsKICAgICAgICAgaWYgKHBGb3JtYXQpICpwRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICBpZiAocENoYW5uZWxzKSAqcENoYW5uZWxzID0gcmVxQ2hhbm5lbHM7CiAKICAgICAgICAgaW5wdXQtPnN0YW5kYnkoKTsKIAotICAgICAgICByZXR1cm4gbU5leHRUaHJlYWRJZDsKKyAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBpbnB1dCBjcmVhdGlvbgorICAgICAgICB0aHJlYWQtPmF1ZGlvQ29uZmlnQ2hhbmdlZF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQpOworICAgICAgICByZXR1cm4gaWQ7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0zOTg1LDI2ICs0NTE1LDI2IEBACiAgICAgfQogCiAgICAgTE9HVigic2V0U3RyZWFtT3V0cHV0KCkgc3RyZWFtICVkIHRvIG91dHB1dCAlZCIsIHN0cmVhbSwgb3V0cHV0KTsKKyAgICBhdWRpb0NvbmZpZ0NoYW5nZWRfbChBdWRpb1N5c3RlbTo6U1RSRUFNX0NPTkZJR19DSEFOR0VELCBvdXRwdXQsICZzdHJlYW0pOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSkuZ2V0KCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gZHN0VGhyZWFkICYmCiAgICAgICAgICAgICB0aHJlYWQtPnR5cGUoKSAhPSBQbGF5YmFja1RocmVhZDo6RElSRUNUKSB7CiAgICAgICAgICAgICBNaXhlclRocmVhZCAqc3JjVGhyZWFkID0gKE1peGVyVGhyZWFkICopdGhyZWFkOwotICAgICAgICAgICAgU29ydGVkVmVjdG9yIDwgc3A8TWl4ZXJUaHJlYWQ6OlRyYWNrPiA+IHRyYWNrczsKLSAgICAgICAgICAgIFNvcnRlZFZlY3RvciA8IHdwPE1peGVyVGhyZWFkOjpUcmFjaz4gPiBhY3RpdmVUcmFja3M7Ci0gICAgICAgICAgICBzcmNUaHJlYWQtPmdldFRyYWNrcyh0cmFja3MsIGFjdGl2ZVRyYWNrcywgc3RyZWFtKTsKLSAgICAgICAgICAgIGlmICh0cmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZHN0VGhyZWFkLT5wdXRUcmFja3ModHJhY2tzLCBhY3RpdmVUcmFja3MpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3JjVGhyZWFkLT5pbnZhbGlkYXRlVHJhY2tzKHN0cmVhbSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBkc3RUaHJlYWQtPnNlbmRDb25maWdFdmVudChBdWRpb1N5c3RlbTo6U1RSRUFNX0NPTkZJR19DSEFOR0VELCBzdHJlYW0pOwotCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCisKK2ludCBBdWRpb0ZsaW5nZXI6Om5ld0F1ZGlvU2Vzc2lvbklkKCkKK3sKKyAgICByZXR1cm4gbmV4dFVuaXF1ZUlkKCk7Cit9CisKIC8vIGNoZWNrUGxheWJhY2tUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpBdWRpb0ZsaW5nZXI6OmNoZWNrUGxheWJhY2tUaHJlYWRfbChpbnQgb3V0cHV0KSBjb25zdAogewpAQCAtNDAzNyw2ICs0NTY3LDE4NDUgQEAKICAgICByZXR1cm4gdGhyZWFkOwogfQogCitpbnQgQXVkaW9GbGluZ2VyOjpuZXh0VW5pcXVlSWQoKQoreworICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRWZmZWN0IG1hbmFnZW1lbnQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKQoreworICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgLy8gb25seSBhbGxvdyBsaWJyYXJpZXMgbG9hZGVkIGZyb20gL3N5c3RlbS9saWIvc291bmRmeCBmb3Igbm93CisgICAgaWYgKHN0cm5jbXAoZ0VmZmVjdExpYlBhdGgsIGxpYlBhdGgsIHN0cmxlbihnRWZmZWN0TGliUGF0aCkpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIEVmZmVjdExvYWRMaWJyYXJ5KGxpYlBhdGgsIGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6dW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKQoreworICAgIC8vIGNoZWNrIGNhbGxpbmcgcGVybWlzc2lvbnMKKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBFZmZlY3RVbmxvYWRMaWJyYXJ5KGhhbmRsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyhudW1FZmZlY3RzKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBFZmZlY3RRdWVyeUVmZmVjdChpbmRleCwgZGVzY3JpcHRvcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfdXVpZF90ICpwVXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBFZmZlY3RHZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKK30KKworCisvLyB0aGlzIFVVSUQgbXVzdCBtYXRjaCB0aGUgb25lIGRlZmluZWQgaW4gbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RWaXN1YWxpemVyLmNwcAorc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgVklTVUFMSVpBVElPTl9VVUlEXyA9CisgICAgezB4ZDA2OWQ5ZTAsIDB4ODMyOSwgMHgxMWRmLCAweDkxNjgsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX07CisKK3NwPElFZmZlY3Q+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KHBpZF90IHBpZCwKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCisgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgIGludCBvdXRwdXQsCisgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCisgICAgICAgIGludCAqaWQsCisgICAgICAgIGludCAqZW5hYmxlZCkKK3sKKyAgICBzdGF0dXNfdCBsU3RhdHVzID0gTk9fRVJST1I7CisgICAgc3A8RWZmZWN0SGFuZGxlPiBoYW5kbGU7CisgICAgZWZmZWN0X2ludGVyZmFjZV90IGl0ZmU7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICAgIHNwPENsaWVudD4gY2xpZW50OworICAgIHdwPENsaWVudD4gd2NsaWVudDsKKworICAgIExPR1YoImNyZWF0ZUVmZmVjdCBwaWQgJWQsIGNsaWVudCAlcCwgcHJpb3JpdHkgJWQsIHNlc3Npb25JZCAlZCwgb3V0cHV0ICVkIiwKKyAgICAgICAgICAgIHBpZCwgZWZmZWN0Q2xpZW50LmdldCgpLCBwcmlvcml0eSwgc2Vzc2lvbklkLCBvdXRwdXQpOworCisgICAgaWYgKHBEZXNjID09IE5VTEwpIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICAvLyBjaGVjayByZWNvcmRpbmcgcGVybWlzc2lvbiBmb3IgdmlzdWFsaXplcgorICAgICAgICBpZiAobWVtY21wKCZwRGVzYy0+dHlwZSwgU0xfSUlEX1ZJU1VBTElaQVRJT04sIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCB8fAorICAgICAgICAgICAgbWVtY21wKCZwRGVzYy0+dXVpZCwgJlZJU1VBTElaQVRJT05fVVVJRF8sIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFFZmZlY3RJc051bGxVdWlkKCZwRGVzYy0+dXVpZCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICAgICAgICBsU3RhdHVzID0gRWZmZWN0R2V0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZkZXNjKTsKKyAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIExPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0R2V0RGVzY3JpcHRvciIsIGxTdGF0dXMpOworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAvLyBvZiB0aGUgcmVxdWlyZWQgdHlwZSBpbiBlZmZlY3QgZmFjdG9yeQorICAgICAgICAgICAgaWYgKEVmZmVjdElzTnVsbFV1aWQoJnBEZXNjLT50eXBlKSkgeworICAgICAgICAgICAgICAgIExPR1coImNyZWF0ZUVmZmVjdCgpIG5vIGVmZmVjdCB0eXBlIik7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgICAgICAgICAgbFN0YXR1cyA9IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIsIGxTdGF0dXMpOworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsU3RhdHVzID0gRWZmZWN0UXVlcnlFZmZlY3QoaSwgJmRlc2MpOworICAgICAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5RWZmZWN0IiwgbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKCZkZXNjLnR5cGUsICZwRGVzYy0+dHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4gSWYgdGhlIHNlc3Npb24gaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gMCBhbmQgdGhlIGVmZmVjdCBpcyBub3QgYXV4aWxpYXJ5LCBjb250aW51ZSBlbnVtZXJhdGlvbiBpbiBjYXNlCisgICAgICAgICAgICAgICAgICAgIC8vIGFuIGF1eGlsaWFyeSB2ZXJzaW9uIG9mIHRoaXMgZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZkLCAmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfTUlYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIExPR1coImNyZWF0ZUVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGb3Igc2FtZSBlZmZlY3QgdHlwZSwgY2hvc2UgYXV4aWxpYXJ5IHZlcnNpb24gb3ZlciBpbnNlcnQgdmVyc2lvbiBpZgorICAgICAgICAgICAgLy8gY29ubmVjdCB0byBvdXRwdXQgbWl4IChDb21wbGlhbmNlIHRvIE9wZW5TTCBFUykKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCAmJgorICAgICAgICAgICAgICAgICAgICAoZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmRlc2MsICZkLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3RzIG9uIGEgc2Vzc2lvbiBkaWZmZXJlbnQgZnJvbSAwIChvdXRwdXQgbWl4KQorICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFIGlzIHJlc2VydmVkIGZvciBvdXRwdXQgc3RhZ2UgZWZmZWN0cworICAgICAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgKHJ1bm5pbmcgaW4gc2FtZSBwcm9jZXNzKQorICAgICAgICBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSAmJgorICAgICAgICAgICAgICAgIGdldHBpZCgpICE9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgeworICAgICAgICAgICAgbFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0dXJuIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgICAgIG1lbWNweShwRGVzYywgJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICAgICAgLy8gSWYgb3V0cHV0IGlzIG5vdCBzcGVjaWZpZWQgdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBhdWRpbyBzZXNzaW9uIElEIGluIG9uZSBvZiB0aGUKKyAgICAgICAgLy8gb3V0cHV0IHRocmVhZHMuCisgICAgICAgIC8vIFRPRE86IGFsbG93IGF0dGFjaG1lbnQgb2YgZWZmZWN0IHRvIGlucHV0cworICAgICAgICBpZiAob3V0cHV0ID09IDApIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFKSB7CisgICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KKyAgICAgICAgICAgICAgICAvLyBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UKKyAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KCZkZXNjKTsKKyAgICAgICAgICAgICAgICBMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3Qgb3V0cHV0ICVkIGZvciBlZmZlY3QgJXMiLCBvdXRwdXQsIGRlc2MubmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJZiBubyBvdXRwdXQgdGhyZWFkIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgc2Vzc2lvbiBJRCwgZGVmYXVsdCB0bworICAgICAgICAgICAgICAgIC8vIGZpcnN0IG91dHB1dC4gVGhlIGVmZmVjdCBjaGFpbiB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjb3JyZWN0IG91dHB1dAorICAgICAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0ID09IDAgJiYgbVBsYXliYWNrVGhyZWFkcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gbVBsYXliYWNrVGhyZWFkcy5rZXlBdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChvdXRwdXQpOworICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoImNyZWF0ZUVmZmVjdCgpIHVua25vd24gb3V0cHV0IHRocmVhZCIpOworICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHdjbGllbnQgPSBtQ2xpZW50cy52YWx1ZUZvcihwaWQpOworCisgICAgICAgIGlmICh3Y2xpZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsaWVudCA9IHdjbGllbnQucHJvbW90ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2xpZW50ID0gbmV3IENsaWVudCh0aGlzLCBwaWQpOworICAgICAgICAgICAgbUNsaWVudHMuYWRkKHBpZCwgY2xpZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3Qgb24gc2VsZWN0ZWQgb3V0cHV0IHRyaGVhZAorICAgICAgICBoYW5kbGUgPSB0aHJlYWQtPmNyZWF0ZUVmZmVjdF9sKGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICZkZXNjLCBlbmFibGVkLCAmbFN0YXR1cyk7CisgICAgICAgIGlmIChoYW5kbGUgIT0gMCAmJiBpZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAqaWQgPSBoYW5kbGUtPmlkKCk7CisgICAgICAgIH0KKyAgICB9CisKK0V4aXQ6CisgICAgaWYoc3RhdHVzKSB7CisgICAgICAgICpzdGF0dXMgPSBsU3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om1vdmVFZmZlY3RzKGludCBzZXNzaW9uLCBpbnQgc3JjT3V0cHV0LCBpbnQgZHN0T3V0cHV0KQoreworICAgIExPR1YoIm1vdmVFZmZlY3RzKCkgc2Vzc2lvbiAlZCwgc3JjT3V0cHV0ICVkLCBkc3RPdXRwdXQgJWQiLAorICAgICAgICAgICAgc2Vzc2lvbiwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKHNyY091dHB1dCA9PSBkc3RPdXRwdXQpIHsKKyAgICAgICAgTE9HVygibW92ZUVmZmVjdHMoKSBzYW1lIGRzdCBhbmQgc3JjIG91dHB1dHMgJWQiLCBkc3RPdXRwdXQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIFBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc3JjT3V0cHV0KTsKKyAgICBpZiAoc3JjVGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygibW92ZUVmZmVjdHMoKSBiYWQgc3JjT3V0cHV0ICVkIiwgc3JjT3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgUGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChkc3RPdXRwdXQpOworICAgIGlmIChkc3RUaHJlYWQgPT0gTlVMTCkgeworICAgICAgICBMT0dXKCJtb3ZlRWZmZWN0cygpIGJhZCBkc3RPdXRwdXQgJWQiLCBkc3RPdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfZGwoZHN0VGhyZWFkLT5tTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzcmNUaHJlYWQtPm1Mb2NrKTsKKyAgICBtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uLCBzcmNUaHJlYWQsIGRzdFRocmVhZCwgZmFsc2UpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBtb3ZlRWZmZWN0Q2hhaW5fbCBtdXN0YmUgY2FsbGVkIHdpdGggYm90aCBzcmNUaHJlYWQgYW5kIGRzdFRocmVhZCBtTG9ja3MgaGVsZAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjptb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqc3JjVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpkc3RUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVSZWdpc3RlcikKK3sKKyAgICBMT0dWKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIHNlc3Npb24gJWQgZnJvbSB0aHJlYWQgJXAgdG8gdGhyZWFkICVwIiwKKyAgICAgICAgICAgIHNlc3Npb24sIHNyY1RocmVhZCwgZHN0VGhyZWFkKTsKKworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IHNyY1RocmVhZC0+Z2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uKTsKKyAgICBpZiAoY2hhaW4gPT0gMCkgeworICAgICAgICBMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiAlZCBub3Qgb24gc291cmNlIHRocmVhZCAlcCIsCisgICAgICAgICAgICAgICAgc2Vzc2lvbiwgc3JjVGhyZWFkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIHJlbW92ZSBjaGFpbiBmaXJzdC4gVGhpcyBpcyB1c2VmdWwgb25seSBpZiByZWNvbmZpZ3VyaW5nIGVmZmVjdCBjaGFpbiBvbiBzYW1lIG91dHB1dCB0aHJlYWQsCisgICAgLy8gc28gdGhhdCBhIG5ldyBjaGFpbiBpcyBjcmVhdGVkIHdpdGggY29ycmVjdCBwYXJhbWV0ZXJzIHdoZW4gZmlyc3QgZWZmZWN0IGlzIGFkZGVkLiBUaGlzIGlzCisgICAgLy8gb3RoZXJ3aXNlIHVuZWNlc3NhcnkgYXMgcmVtb3ZlRWZmZWN0X2woKSB3aWxsIHJlbW92ZSB0aGUgY2hhaW4gd2hlbiBsYXN0IGVmZmVjdCBpcworICAgIC8vIHJlbW92ZWQuCisgICAgc3JjVGhyZWFkLT5yZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKKworICAgIC8vIHRyYW5zZmVyIGFsbCBlZmZlY3RzIG9uZSBieSBvbmUgc28gdGhhdCBuZXcgZWZmZWN0IGNoYWluIGlzIGNyZWF0ZWQgb24gbmV3IHRocmVhZCB3aXRoCisgICAgLy8gY29ycmVjdCBidWZmZXIgc2l6ZXMgYW5kIGF1ZGlvIHBhcmFtZXRlcnMgYW5kIGVmZmVjdCBlbmdpbmVzIHJlY29uZmlndXJlZCBhY2NvcmRpbmdseQorICAgIGludCBkc3RPdXRwdXQgPSBkc3RUaHJlYWQtPmlkKCk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGRzdENoYWluOworICAgIHVpbnQzMl90IHN0cmF0ZWd5OworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOworICAgIHdoaWxlIChlZmZlY3QgIT0gMCkgeworICAgICAgICBzcmNUaHJlYWQtPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgIGRzdFRocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKKyAgICAgICAgLy8gaWYgdGhlIG1vdmUgcmVxdWVzdCBpcyBub3QgcmVjZWl2ZWQgZnJvbSBhdWRpbyBwb2xpY3kgbWFuYWdlciwgdGhlIGVmZmVjdCBtdXN0IGJlCisgICAgICAgIC8vIHJlLXJlZ2lzdGVyZWQgd2l0aCB0aGUgbmV3IHN0cmF0ZWd5IGFuZCBvdXRwdXQKKyAgICAgICAgaWYgKGRzdENoYWluID09IDApIHsKKyAgICAgICAgICAgIGRzdENoYWluID0gZWZmZWN0LT5jaGFpbigpLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HVygibW92ZUVmZmVjdENoYWluX2woKSBjYW5ub3QgZ2V0IGNoYWluIGZyb20gZWZmZWN0ICVwIiwgZWZmZWN0LmdldCgpKTsKKyAgICAgICAgICAgICAgICBzcmNUaHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJhdGVneSA9IGRzdENoYWluLT5zdHJhdGVneSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZVJlZ2lzdGVyKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3QtPmlkKCkpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyRWZmZWN0KCZlZmZlY3QtPmRlc2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPmlkKCkpOworICAgICAgICB9CisgICAgICAgIGVmZmVjdCA9IGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbCgwKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8vIFBsYXliYWNrVGhyZWFkOjpjcmVhdGVFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZT4gQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y3JlYXRlRWZmZWN0X2woCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICBpbnQgKmVuYWJsZWQsCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMKKyAgICAgICAgKQoreworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OworICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOworICAgIHN0YXR1c190IGxTdGF0dXM7CisgICAgc3A8VHJhY2s+IHRyYWNrOworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKKyAgICBib29sIGNoYWluQ3JlYXRlZCA9IGZhbHNlOworICAgIGJvb2wgZWZmZWN0Q3JlYXRlZCA9IGZhbHNlOworICAgIGJvb2wgZWZmZWN0UmVnaXN0ZXJlZCA9IGZhbHNlOworCisgICAgaWYgKG1PdXRwdXQgPT0gMCkgeworICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIEF1ZGlvIGRyaXZlciBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIGxTdGF0dXMgPSBOT19JTklUOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3Qgb24gc2Vzc2lvbiBvdGhlciB0aGFuIDAKKyAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSAmJgorICAgICAgICBzZXNzaW9uSWQgIT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgYXV4aWxpYXJ5IGVmZmVjdCAlcyB0byBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBzZXNzaW9uSWQpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IGVmZmVjdHMgd2l0aCBzZXNzaW9uIElEIDAgb24gZGlyZWN0IG91dHB1dCBvciBkdXBsaWNhdGluZyB0aHJlYWRzCisgICAgLy8gVE9ETzogYWRkIHJ1bGUgZm9yIGh3IGFjY2VsZXJhdGVkIGVmZmVjdHMgb24gZGlyZWN0IG91dHB1dHMgd2l0aCBub24gUENNIGZvcm1hdAorICAgIGlmIChzZXNzaW9uSWQgPT0gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCAmJiBtVHlwZSAhPSBNSVhFUikgeworICAgICAgICBMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgYXV4aWxpYXJ5IGVmZmVjdCAlcyB0byBzZXNzaW9uICVkIiwKKyAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBzZXNzaW9uSWQpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgTE9HVigiY3JlYXRlRWZmZWN0X2woKSB0aHJlYWQgJXAgZWZmZWN0ICVzIG9uIHNlc3Npb24gJWQiLCB0aGlzLCBkZXNjLT5uYW1lLCBzZXNzaW9uSWQpOworCisgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgICAgICAvLyBjaGVjayBmb3IgZXhpc3RpbmcgZWZmZWN0IGNoYWluIHdpdGggdGhlIHJlcXVlc3RlZCBhdWRpbyBzZXNzaW9uCisgICAgICAgIGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworICAgICAgICBpZiAoY2hhaW4gPT0gMCkgeworICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGNoYWluIGZvciB0aGlzIHNlc3Npb24KKyAgICAgICAgICAgIExPR1YoImNyZWF0ZUVmZmVjdF9sKCkgbmV3IGVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiAlZCIsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBjaGFpbiA9IG5ldyBFZmZlY3RDaGFpbih0aGlzLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgYWRkRWZmZWN0Q2hhaW5fbChjaGFpbik7CisgICAgICAgICAgICBjaGFpbi0+c2V0U3RyYXRlZ3koZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woc2Vzc2lvbklkKSk7CisgICAgICAgICAgICBjaGFpbkNyZWF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21EZXNjX2woZGVzYyk7CisgICAgICAgIH0KKworICAgICAgICBMT0dWKCJjcmVhdGVFZmZlY3RfbCgpIGdvdCBlZmZlY3QgJXAgb24gY2hhaW4gJXAiLCBlZmZlY3QgPT0gMCA/IDAgOiBlZmZlY3QuZ2V0KCksIGNoYWluLmdldCgpKTsKKworICAgICAgICBpZiAoZWZmZWN0ID09IDApIHsKKyAgICAgICAgICAgIGludCBpZCA9IG1BdWRpb0ZsaW5nZXItPm5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgLy8gQ2hlY2sgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UKKyAgICAgICAgICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoZGVzYywgbUlkLCBjaGFpbi0+c3RyYXRlZ3koKSwgc2Vzc2lvbklkLCBpZCk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdFJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGVmZmVjdCBtb2R1bGUgaWYgbm9uZSBwcmVzZW50IGluIHRoZSBjaGFpbgorICAgICAgICAgICAgZWZmZWN0ID0gbmV3IEVmZmVjdE1vZHVsZSh0aGlzLCBjaGFpbiwgZGVzYywgaWQsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBsU3RhdHVzID0gZWZmZWN0LT5zdGF0dXMoKTsKKyAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbFN0YXR1cyA9IGNoYWluLT5hZGRFZmZlY3RfbChlZmZlY3QpOworICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RDcmVhdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgZWZmZWN0LT5zZXREZXZpY2UobURldmljZSk7CisgICAgICAgICAgICBlZmZlY3QtPnNldE1vZGUobUF1ZGlvRmxpbmdlci0+Z2V0TW9kZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUgZWZmZWN0IGhhbmRsZSBhbmQgY29ubmVjdCBpdCB0byBlZmZlY3QgbW9kdWxlCisgICAgICAgIGhhbmRsZSA9IG5ldyBFZmZlY3RIYW5kbGUoZWZmZWN0LCBjbGllbnQsIGVmZmVjdENsaWVudCwgcHJpb3JpdHkpOworICAgICAgICBsU3RhdHVzID0gZWZmZWN0LT5hZGRIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICplbmFibGVkID0gKGludCllZmZlY3QtPmlzRW5hYmxlZCgpOworICAgICAgICB9CisgICAgfQorCitFeGl0OgorICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIGxTdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKGVmZmVjdENyZWF0ZWQpIHsKKyAgICAgICAgICAgIGNoYWluLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpOworICAgICAgICB9CisgICAgICAgIGlmIChlZmZlY3RSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3QtPmlkKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFpbkNyZWF0ZWQpIHsKKyAgICAgICAgICAgIHJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOworICAgICAgICB9CisgICAgICAgIGhhbmRsZS5jbGVhcigpOworICAgIH0KKworICAgIGlmKHN0YXR1cykgeworICAgICAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworLy8gUGxheWJhY2tUaHJlYWQ6OmFkZEVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZAorLy8gUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZEVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKK3sKKyAgICAvLyBjaGVjayBmb3IgZXhpc3RpbmcgZWZmZWN0IGNoYWluIHdpdGggdGhlIHJlcXVlc3RlZCBhdWRpbyBzZXNzaW9uCisgICAgaW50IHNlc3Npb25JZCA9IGVmZmVjdC0+c2Vzc2lvbklkKCk7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworICAgIGJvb2wgY2hhaW5DcmVhdGVkID0gZmFsc2U7CisKKyAgICBpZiAoY2hhaW4gPT0gMCkgeworICAgICAgICAvLyBjcmVhdGUgYSBuZXcgY2hhaW4gZm9yIHRoaXMgc2Vzc2lvbgorICAgICAgICBMT0dWKCJhZGRFZmZlY3RfbCgpIG5ldyBlZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gJWQiLCBzZXNzaW9uSWQpOworICAgICAgICBjaGFpbiA9IG5ldyBFZmZlY3RDaGFpbih0aGlzLCBzZXNzaW9uSWQpOworICAgICAgICBhZGRFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgY2hhaW4tPnNldFN0cmF0ZWd5KGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKHNlc3Npb25JZCkpOworICAgICAgICBjaGFpbkNyZWF0ZWQgPSB0cnVlOworICAgIH0KKyAgICBMT0dWKCJhZGRFZmZlY3RfbCgpICVwIGNoYWluICVwIGVmZmVjdCAlcCIsIHRoaXMsIGNoYWluLmdldCgpLCBlZmZlY3QuZ2V0KCkpOworCisgICAgaWYgKGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbChlZmZlY3QtPmlkKCkpICE9IDApIHsKKyAgICAgICAgTE9HVygiYWRkRWZmZWN0X2woKSAlcCBlZmZlY3QgJXMgYWxyZWFkeSBwcmVzZW50IGluIGNoYWluICVwIiwKKyAgICAgICAgICAgICAgICB0aGlzLCBlZmZlY3QtPmRlc2MoKS5uYW1lLCBjaGFpbi5nZXQoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2hhaW4tPmFkZEVmZmVjdF9sKGVmZmVjdCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBpZiAoY2hhaW5DcmVhdGVkKSB7CisgICAgICAgICAgICByZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGVmZmVjdC0+c2V0RGV2aWNlKG1EZXZpY2UpOworICAgIGVmZmVjdC0+c2V0TW9kZShtQXVkaW9GbGluZ2VyLT5nZXRNb2RlKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpIHsKKworICAgIExPR1YoInJlbW92ZUVmZmVjdF9sKCkgJXAgZWZmZWN0ICVwIiwgdGhpcywgZWZmZWN0LmdldCgpKTsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3QtPmRlc2MoKTsKKyAgICBpZiAoKGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgIGRldGFjaEF1eEVmZmVjdF9sKGVmZmVjdC0+aWQoKSk7CisgICAgfQorCisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZWZmZWN0LT5jaGFpbigpLnByb21vdGUoKTsKKyAgICBpZiAoY2hhaW4gIT0gMCkgeworICAgICAgICAvLyByZW1vdmUgZWZmZWN0IGNoYWluIGlmIHJlbW92aW5nIGxhc3QgZWZmZWN0CisgICAgICAgIGlmIChjaGFpbi0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KSA9PSAwKSB7CisgICAgICAgICAgICByZW1vdmVFZmZlY3RDaGFpbl9sKGNoYWluKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coInJlbW92ZUVmZmVjdF9sKCkgJXAgY2Fubm90IHByb21vdGUgY2hhaW4gZm9yIGVmZmVjdCAlcCIsIHRoaXMsIGVmZmVjdC5nZXQoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmRpc2Nvbm5lY3RFZmZlY3QoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgTE9HVigiZGlzY29ubmVjdEVmZmVjdCgpICVwIGVmZmVjdCAlcCIsIHRoaXMsIGVmZmVjdC5nZXQoKSk7CisgICAgLy8gZGVsZXRlIHRoZSBlZmZlY3QgbW9kdWxlIGlmIHJlbW92aW5nIGxhc3QgaGFuZGxlIG9uIGl0CisgICAgaWYgKGVmZmVjdC0+cmVtb3ZlSGFuZGxlKGhhbmRsZSkgPT0gMCkgeworICAgICAgICByZW1vdmVFZmZlY3RfbChlZmZlY3QpOworICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3QtPmlkKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKQoreworICAgIGludCBzZXNzaW9uID0gY2hhaW4tPnNlc3Npb25JZCgpOworICAgIGludDE2X3QgKmJ1ZmZlciA9IG1NaXhCdWZmZXI7CisgICAgYm9vbCBvd25zQnVmZmVyID0gZmFsc2U7CisKKyAgICBMT0dWKCJhZGRFZmZlY3RDaGFpbl9sKCkgJXAgb24gdGhyZWFkICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksIHRoaXMsIHNlc3Npb24pOworICAgIGlmIChzZXNzaW9uID4gMCkgeworICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKKyAgICAgICAgLy8gdGhlIG1peCBidWZmZXIgYXMgaW5wdXQKKyAgICAgICAgaWYgKG1UeXBlICE9IERJUkVDVCkgeworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICBidWZmZXIgPSBuZXcgaW50MTZfdFtudW1TYW1wbGVzXTsKKyAgICAgICAgICAgIG1lbXNldChidWZmZXIsIDAsIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpIGNyZWF0aW5nIG5ldyBpbnB1dCBidWZmZXIgJXAgc2Vzc2lvbiAlZCIsIGJ1ZmZlciwgc2Vzc2lvbik7CisgICAgICAgICAgICBvd25zQnVmZmVyID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dGFjaCBhbGwgdHJhY2tzIHdpdGggc2FtZSBzZXNzaW9uIElEIHRvIHRoaXMgY2hhaW4uCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgeworICAgICAgICAgICAgICAgIExPR1YoImFkZEVmZmVjdENoYWluX2woKSB0cmFjay0+c2V0TWFpbkJ1ZmZlciB0cmFjayAlcCBidWZmZXIgJXAiLCB0cmFjay5nZXQoKSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICB0cmFjay0+c2V0TWFpbkJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW5kaWNhdGUgYWxsIGFjdGl2ZSB0cmFja3MgaW4gdGhlIGNoYWluCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1BY3RpdmVUcmFja3Muc2l6ZSgpIDsgKytpKSB7CisgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICh0cmFjayA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgeworICAgICAgICAgICAgICAgIExPR1YoImFkZEVmZmVjdENoYWluX2woKSBhY3RpdmF0aW5nIHRyYWNrICVwIG9uIHNlc3Npb24gJWQiLCB0cmFjay5nZXQoKSwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgY2hhaW4tPnN0YXJ0VHJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNoYWluLT5zZXRJbkJ1ZmZlcihidWZmZXIsIG93bnNCdWZmZXIpOworICAgIGNoYWluLT5zZXRPdXRCdWZmZXIobU1peEJ1ZmZlcik7CisgICAgLy8gRWZmZWN0IGNoYWluIGZvciBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSBpcyBpbnNlcnRlZCBhdCBlbmQgb2YgZWZmZWN0CisgICAgLy8gY2hhaW5zIGxpc3QgaW4gb3JkZXIgdG8gYmUgcHJvY2Vzc2VkIGxhc3QgYXMgaXQgY29udGFpbnMgb3V0cHV0IHN0YWdlIGVmZmVjdHMKKyAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWCBpcyBpbnNlcnRlZCBiZWZvcmUKKyAgICAvLyBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSB0byBiZSBwcm9jZXNzZWQKKyAgICAvLyBhZnRlciB0cmFjayBzcGVjaWZpYyBlZmZlY3RzIGFuZCBiZWZvcmUgb3V0cHV0IHN0YWdlCisgICAgLy8gSXQgaXMgdGhlcmVmb3JlIG1hbmRhdG9yeSB0aGF0IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggPT0gMCBhbmQKKyAgICAvLyB0aGF0IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9TVEFHRSA8IEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgKKyAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIG90aGVyIHNlc3Npb25zIGFyZSBpbnNlcnRlZCBhdCBiZWdpbm5pbmcgb2YgZWZmZWN0CisgICAgLy8gY2hhaW5zIGxpc3QgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBvdXRwdXQgbWl4IGVmZmVjdHMuIFJlbGF0aXZlIG9yZGVyIGJldHdlZW4gb3RoZXIKKyAgICAvLyBzZXNzaW9ucyBpcyBub3QgaW1wb3J0YW50CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAobUVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCkgPCBzZXNzaW9uKSBicmVhazsKKyAgICB9CisgICAgbUVmZmVjdENoYWlucy5pbnNlcnRBdChjaGFpbiwgaSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pCit7CisgICAgaW50IHNlc3Npb24gPSBjaGFpbi0+c2Vzc2lvbklkKCk7CisKKyAgICBMT0dWKCJyZW1vdmVFZmZlY3RDaGFpbl9sKCkgJXAgZnJvbSB0aHJlYWQgJXAgZm9yIHNlc3Npb24gJWQiLCBjaGFpbi5nZXQoKSwgdGhpcywgc2Vzc2lvbik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGNoYWluID09IG1FZmZlY3RDaGFpbnNbaV0pIHsKKyAgICAgICAgICAgIG1FZmZlY3RDaGFpbnMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICAvLyBkZXRhY2ggYWxsIHRyYWNrcyB3aXRoIHNhbWUgc2Vzc2lvbiBJRCBmcm9tIHRoaXMgY2hhaW4KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRNYWluQnVmZmVyKG1NaXhCdWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpsb2NrRWZmZWN0Q2hhaW5zX2woCisgICAgICAgIFZlY3RvcjxzcCA8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKQoreworICAgIGVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPmxvY2soKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dW5sb2NrRWZmZWN0Q2hhaW5zKAorICAgICAgICBWZWN0b3I8c3AgPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+ID4mIGVmZmVjdENoYWlucykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnVubG9jaygpOworICAgIH0KK30KKworCitzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0RWZmZWN0X2woaW50IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKQoreworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0OworCisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgIGVmZmVjdCA9IGNoYWluLT5nZXRFZmZlY3RGcm9tSWRfbChlZmZlY3RJZCk7CisgICAgfQorICAgIHJldHVybiBlZmZlY3Q7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmF0dGFjaEF1eEVmZmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLCBpbnQgRWZmZWN0SWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gYXR0YWNoQXV4RWZmZWN0X2wodHJhY2ssIEVmZmVjdElkKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXR0YWNoQXV4RWZmZWN0X2woCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjaywgaW50IEVmZmVjdElkKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgaWYgKEVmZmVjdElkID09IDApIHsKKyAgICAgICAgdHJhY2stPnNldEF1eEJ1ZmZlcigwLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBdXhpbGlhcnkgZWZmZWN0cyBhcmUgYWx3YXlzIGluIGF1ZGlvIHNlc3Npb24gQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX01JWAorICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IGdldEVmZmVjdF9sKEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVgsIEVmZmVjdElkKTsKKyAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKGVmZmVjdC0+ZGVzYygpLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRBdXhCdWZmZXIoRWZmZWN0SWQsIChpbnQzMl90ICopZWZmZWN0LT5pbkJ1ZmZlcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpCit7CisgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOworICAgICAgICBpZiAodHJhY2stPmF1eEVmZmVjdElkKCkgPT0gZWZmZWN0SWQpIHsKKyAgICAgICAgICAgIGF0dGFjaEF1eEVmZmVjdF9sKHRyYWNrLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVmZmVjdE1vZHVsZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZSIKKworQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OkVmZmVjdE1vZHVsZShjb25zdCB3cDxUaHJlYWRCYXNlPiYgd1RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiYgY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCkKKyAgICA6IG1UaHJlYWQod1RocmVhZCksIG1DaGFpbihjaGFpbiksIG1JZChpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUVmZmVjdEludGVyZmFjZShOVUxMKSwKKyAgICAgIG1TdGF0dXMoTk9fSU5JVCksIG1TdGF0ZShJRExFKQoreworICAgIExPR1YoIkNvbnN0cnVjdG9yICVwIiwgdGhpcyk7CisgICAgaW50IGxTdGF0dXM7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUGxheWJhY2tUaHJlYWQgKnAgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisKKyAgICBtZW1jcHkoJm1EZXNjcmlwdG9yLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgLy8gY3JlYXRlIGVmZmVjdCBlbmdpbmUgZnJvbSBlZmZlY3QgZmFjdG9yeQorICAgIG1TdGF0dXMgPSBFZmZlY3RDcmVhdGUoJmRlc2MtPnV1aWQsIHNlc3Npb25JZCwgcC0+aWQoKSwgJm1FZmZlY3RJbnRlcmZhY2UpOworCisgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsU3RhdHVzID0gaW5pdCgpOworICAgIGlmIChsU3RhdHVzIDwgMCkgeworICAgICAgICBtU3RhdHVzID0gbFN0YXR1czsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBMT0dWKCJDb25zdHJ1Y3RvciBzdWNjZXNzIG5hbWUgJXMsIEludGVyZmFjZSAlcCIsIG1EZXNjcmlwdG9yLm5hbWUsIG1FZmZlY3RJbnRlcmZhY2UpOworICAgIHJldHVybjsKK0Vycm9yOgorICAgIEVmZmVjdFJlbGVhc2UobUVmZmVjdEludGVyZmFjZSk7CisgICAgbUVmZmVjdEludGVyZmFjZSA9IE5VTEw7CisgICAgTE9HVigiQ29uc3RydWN0b3IgRXJyb3IgJWQiLCBtU3RhdHVzKTsKK30KKworQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6On5FZmZlY3RNb2R1bGUoKQoreworICAgIExPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIHJlbGVhc2UgZWZmZWN0IGVuZ2luZQorICAgICAgICBFZmZlY3RSZWxlYXNlKG1FZmZlY3RJbnRlcmZhY2UpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmFkZEhhbmRsZShzcDxFZmZlY3RIYW5kbGU+JiBoYW5kbGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAvLyBGaXJzdCBoYW5kbGUgaW4gbUhhbmRsZXMgaGFzIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIGNvbnRyb2xzIHRoZSBlZmZlY3QgbW9kdWxlCisgICAgaW50IHByaW9yaXR5ID0gaGFuZGxlLT5wcmlvcml0eSgpOworICAgIHNpemVfdCBzaXplID0gbUhhbmRsZXMuc2l6ZSgpOworICAgIHNwPEVmZmVjdEhhbmRsZT4gaDsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGggPSBtSGFuZGxlc1tpXS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChoID09IDApIGNvbnRpbnVlOworICAgICAgICBpZiAoaC0+cHJpb3JpdHkoKSA8PSBwcmlvcml0eSkgYnJlYWs7CisgICAgfQorICAgIC8vIGlmIGluc2VydGVkIGluIGZpcnN0IHBsYWNlLCBtb3ZlIGVmZmVjdCBjb250cm9sIGZyb20gcHJldmlvdXMgb3duZXIgdG8gdGhpcyBoYW5kbGUKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGlmIChoICE9IDApIHsKKyAgICAgICAgICAgIGgtPnNldENvbnRyb2woZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGhhbmRsZS0+c2V0Q29udHJvbCh0cnVlLCBmYWxzZSk7CisgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IEFMUkVBRFlfRVhJU1RTOworICAgIH0KKyAgICBtSGFuZGxlcy5pbnNlcnRBdChoYW5kbGUsIGkpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6cmVtb3ZlSGFuZGxlKGNvbnN0IHdwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBzaXplID0gbUhhbmRsZXMuc2l6ZSgpOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKG1IYW5kbGVzW2ldID09IGhhbmRsZSkgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIG1IYW5kbGVzLnJlbW92ZUF0KGkpOworICAgIHNpemUgPSBtSGFuZGxlcy5zaXplKCk7CisgICAgLy8gaWYgcmVtb3ZlZCBmcm9tIGZpcnN0IHBsYWNlLCBtb3ZlIGVmZmVjdCBjb250cm9sIGZyb20gdGhpcyBoYW5kbGUgdG8gbmV4dCBpbiBsaW5lCisgICAgaWYgKGkgPT0gMCAmJiBzaXplICE9IDApIHsKKyAgICAgICAgc3A8RWZmZWN0SGFuZGxlPiBoID0gbUhhbmRsZXNbMF0ucHJvbW90ZSgpOworICAgICAgICBpZiAoaCAhPSAwKSB7CisgICAgICAgICAgICBoLT5zZXRDb250cm9sKHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmRpc2Nvbm5lY3QoY29uc3Qgd3A8RWZmZWN0SGFuZGxlPiYgaGFuZGxlKQoreworICAgIC8vIGtlZXAgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoaXMgRWZmZWN0TW9kdWxlIHRvIGF2b2lkIGNhbGxpbmcgdGhlCisgICAgLy8gZGVzdHJ1Y3RvciBiZWZvcmUgd2UgZXhpdAorICAgIHNwPEVmZmVjdE1vZHVsZT4ga2VlcCh0aGlzKTsKKyAgICB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0KGtlZXAsIGhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnVwZGF0ZVN0YXRlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgUkVTVEFSVDoKKyAgICAgICAgcmVzZXRfbCgpOworICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RBUlRJTkc6CisgICAgICAgIC8vIGNsZWFyIGF1eGlsaWFyeSBlZmZlY3QgaW5wdXQgYnVmZmVyIGZvciBuZXh0IGFjY3VtdWxhdGlvbgorICAgICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgeworICAgICAgICAgICAgbWVtc2V0KG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKKyAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQqc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgfQorICAgICAgICBzdGFydF9sKCk7CisgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUElORzoKKyAgICAgICAgc3RvcF9sKCk7CisgICAgICAgIG1EaXNhYmxlV2FpdENudCA9IG1NYXhEaXNhYmxlV2FpdENudDsKKyAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAvLyBtRGlzYWJsZVdhaXRDbnQgaXMgZm9yY2VkIHRvIDEgYnkgcHJvY2VzcygpIHdoZW4gdGhlIGVuZ2luZSBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgLy8gdHVybiBvZmYgc2VxdWVuY2UuCisgICAgICAgIGlmICgtLW1EaXNhYmxlV2FpdENudCA9PSAwKSB7CisgICAgICAgICAgICByZXNldF9sKCk7CisgICAgICAgICAgICBtU3RhdGUgPSBJRExFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IC8vSURMRSAsIEFDVElWRQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnByb2Nlc3MoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCB8fAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpKSB7CisgICAgICAgIC8vIGRvIDMyIGJpdCB0byAxNiBiaXQgY29udmVyc2lvbiBmb3IgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIKKyAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OmRpdGhlckFuZENsYW1wKG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5zMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudC8yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBpbiB0aGUgZWZmZWN0IGVuZ2luZQorICAgICAgICBpbnQgcmV0ID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+cHJvY2VzcyhtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZy5pbnB1dENmZy5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLm91dHB1dENmZy5idWZmZXIpOworCisgICAgICAgIC8vIGZvcmNlIHRyYW5zaXRpb24gdG8gSURMRSBzdGF0ZSB3aGVuIGVuZ2luZSBpcyByZWFkeQorICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQRUQgJiYgcmV0ID09IC1FTk9EQVRBKSB7CisgICAgICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYXIgYXV4aWxpYXJ5IGVmZmVjdCBpbnB1dCBidWZmZXIgZm9yIG5leHQgYWNjdW11bGF0aW9uCisgICAgICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCAwLCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KnNpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgJiYKKyAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyl7CisgICAgICAgIC8vIElmIGFuIGluc2VydCBlZmZlY3QgaXMgaWRsZSBhbmQgaW5wdXQgYnVmZmVyIGlzIGRpZmZlcmVudCBmcm9tIG91dHB1dCBidWZmZXIsIGNvcHkgaW5wdXQgdG8KKyAgICAgICAgLy8gb3V0cHV0CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwICYmIGNoYWluLT5hY3RpdmVUcmFja3MoKSAhPSAwKSB7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICBpZiAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBDSEFOTkVMX1NURVJFTykgeworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsIHNpemUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZXNldF9sKCkKK3sKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLCBFRkZFQ1RfQ01EX1JFU0VULCAwLCBOVUxMLCAwLCBOVUxMKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmNvbmZpZ3VyZSgpCit7CisgICAgdWludDMyX3QgY2hhbm5lbHM7CisgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIC8vIFRPRE86IGhhbmRsZSBjb25maWd1cmF0aW9uIG9mIGVmZmVjdHMgcmVwbGFjaW5nIHRyYWNrIHByb2Nlc3MKKyAgICBpZiAodGhyZWFkLT5jaGFubmVsQ291bnQoKSA9PSAxKSB7CisgICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9NT05POworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYW5uZWxzID0gQ0hBTk5FTF9TVEVSRU87CisgICAgfQorCisgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IENIQU5ORUxfTU9OTzsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgfQorICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgbUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBTQU1QTEVfRk9STUFUX1BDTV9TMTU7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gU0FNUExFX0ZPUk1BVF9QQ01fUzE1OworICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CisgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgIC8vIEluc2VydCBlZmZlY3Q6CisgICAgLy8gLSBpbiBzZXNzaW9uIEF1ZGlvU3lzdGVtOjpTRVNTSU9OX09VVFBVVF9NSVggb3IgQXVkaW9TeXN0ZW06OlNFU1NJT05fT1VUUFVUX1NUQUdFLAorICAgIC8vIGFsd2F5cyBvdmVyd3JpdGVzIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciA9PSBvdXRwdXQgYnVmZmVyCisgICAgLy8gLSBpbiBvdGhlciBzZXNzaW9uczoKKyAgICAvLyAgICAgIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiBhY2N1bXVsYXRlcyBpbiBvdXRwdXQgYnVmZmVyOiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgorICAgIC8vICAgICAgb3RoZXIgZWZmZWN0OiBvdmVyd3JpdGVzIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciA9PSBvdXRwdXQgYnVmZmVyCisgICAgLy8gQXV4aWxpYXJ5IGVmZmVjdDoKKyAgICAvLyAgICAgIGFjY3VtdWxhdGVzIGluIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciAhPSBvdXRwdXQgYnVmZmVyCisgICAgLy8gVGhlcmVmb3JlOiBhY2N1bXVsYXRlIDw9PiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgorICAgIGlmIChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdykgeworICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgICAgfQorICAgIG1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIG1Db25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50OworCisgICAgTE9HVigiY29uZmlndXJlKCkgJXAgdGhyZWFkICVwIGJ1ZmZlciAlcCBmcmFtZWNvdW50ICVkIiwKKyAgICAgICAgICAgIHRoaXMsIHRocmVhZC5nZXQoKSwgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKworICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKGludCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9DT05GSUdVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOworICAgIH0KKworICAgIG1NYXhEaXNhYmxlV2FpdENudCA9IChNQVhfRElTQUJMRV9USU1FX01TICogbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKSAvCisgICAgICAgICAgICAoMTAwMCAqIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppbml0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN0YXJ0X2woKQoreworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kU3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gY21kU3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c3RvcF9sKCkKK3sKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCBjbWRTdGF0dXM7CisgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9ESVNBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworLy8gICAgTE9HVigiY29tbWFuZCgpLCBjbWRDb2RlOiAlZCwgbUVmZmVjdEludGVyZmFjZTogJXAiLCBjbWRDb2RlLCBtRWZmZWN0SW50ZXJmYWNlKTsKKworICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhKTsKKyAgICBpZiAoY21kQ29kZSAhPSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAmJiBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IChyZXBseVNpemUgPT0gTlVMTCkgPyAwIDogKnJlcGx5U2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RWZmZWN0SGFuZGxlPiBoID0gbUhhbmRsZXNbaV0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGggIT0gMCkgeworICAgICAgICAgICAgICAgIGgtPmNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgc2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgTE9HVigic2V0RW5hYmxlZCAlcCBlbmFibGVkICVkIiwgdGhpcywgZW5hYmxlZCk7CisKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICAvLyBnb2luZyBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQKKyAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgbVN0YXRlID0gUkVTVEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1BQSU5HOgorICAgICAgICAgICAgbVN0YXRlID0gQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gZ29pbmcgZnJvbSBlbmFibGVkIHRvIGRpc2FibGVkCisgICAgICAgIGNhc2UgUkVTVEFSVDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSVElORzoKKyAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gaCA9IG1IYW5kbGVzW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChoICE9IDApIHsKKyAgICAgICAgICAgICAgICBoLT5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNFbmFibGVkKCkKK3sKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgUkVTVEFSVDoKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgIGNhc2UgQUNUSVZFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIElETEU6CisgICAgY2FzZSBTVE9QUElORzoKKyAgICBjYXNlIFNUT1BQRUQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNQcm9jZXNzRW5hYmxlZCgpCit7CisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFJFU1RBUlQ6CisgICAgY2FzZSBBQ1RJVkU6CisgICAgY2FzZSBTVE9QUElORzoKKyAgICBjYXNlIFNUT1BQRUQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgSURMRToKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRWb2x1bWUodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCwgYm9vbCBjb250cm9sbGVyKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICAvLyBTZW5kIHZvbHVtZSBpbmRpY2F0aW9uIGlmIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgaXMgc2V0IGFuZCByZWFkIGJhY2sgYWx0ZXJlZCB2b2x1bWUKKyAgICAvLyBpZiBjb250cm9sbGVyIGZsYWcgaXMgc2V0IChOb3RlIHRoYXQgY29udHJvbGxlciA9PSBUUlVFID0+IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHNldCkKKyAgICBpZiAoaXNQcm9jZXNzRW5hYmxlZCgpICYmCisgICAgICAgICAgICAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMIHx8CisgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0lORCkpIHsKKyAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOworICAgICAgICB1aW50MzJfdCB2b2x1bWVbMl07CisgICAgICAgIHVpbnQzMl90ICpwVm9sdW1lID0gTlVMTDsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZih2b2x1bWUpOworICAgICAgICB2b2x1bWVbMF0gPSAqbGVmdDsKKyAgICAgICAgdm9sdW1lWzFdID0gKnJpZ2h0OworICAgICAgICBpZiAoY29udHJvbGxlcikgeworICAgICAgICAgICAgcFZvbHVtZSA9IHZvbHVtZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5jb21tYW5kKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfVk9MVU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWb2x1bWUpOworICAgICAgICBpZiAoY29udHJvbGxlciAmJiBzdGF0dXMgPT0gTk9fRVJST1IgJiYgc2l6ZSA9PSBzaXplb2Yodm9sdW1lKSkgeworICAgICAgICAgICAgKmxlZnQgPSB2b2x1bWVbMF07CisgICAgICAgICAgICAqcmlnaHQgPSB2b2x1bWVbMV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldERldmljZSh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0spID09IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpIHsKKyAgICAgICAgLy8gY29udmVydCBkZXZpY2UgYml0IGZpZWxkIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KKyAgICAgICAgZGV2aWNlID0gZGV2aWNlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShkZXZpY2UpOworICAgICAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOworICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKyAgICAgICAgc3RhdHVzID0gKCptRWZmZWN0SW50ZXJmYWNlKS0+Y29tbWFuZChtRWZmZWN0SW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtZFN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0TW9kZSh1aW50MzJfdCBtb2RlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX01PREVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9JTkQpIHsKKyAgICAgICAgLy8gY29udmVydCBhdWRpbyBtb2RlIGZyb20gQXVkaW9TeXN0ZW0gdG8gRWZmZWN0QXBpIGZvcm1hdC4KKyAgICAgICAgaW50IGVmZmVjdE1vZGUgPSBtb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaShtb2RlKTsKKyAgICAgICAgaWYgKGVmZmVjdE1vZGUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGNtZFN0YXR1czsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZihzdGF0dXNfdCk7CisgICAgICAgIHN0YXR1cyA9ICgqbUVmZmVjdEludGVyZmFjZSktPmNvbW1hbmQobUVmZmVjdEludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZmZlY3RNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gdXBkYXRlIHRoaXMgdGFibGUgd2hlbiBBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBvciBhdWRpb19kZXZpY2VfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAorY29uc3QgdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNEZXZpY2VDb252VGFibGVbXSA9IHsKKyAgICBERVZJQ0VfRUFSUElFQ0UsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0VBUlBJRUNFCisgICAgREVWSUNFX1NQRUFLRVIsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX1NQRUFLRVIKKyAgICBERVZJQ0VfV0lSRURfSEVBRFNFVCwgLy8gY2FzZSBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9XSVJFRF9IRUFEU0VUCisgICAgREVWSUNFX1dJUkVEX0hFQURQSE9ORSwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FCisgICAgREVWSUNFX0JMVUVUT09USF9TQ08sIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08KKyAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19IRUFEU0VULCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQKKyAgICBERVZJQ0VfQkxVRVRPT1RIX1NDT19DQVJLSVQsIC8vICBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVAorICAgIERFVklDRV9CTFVFVE9PVEhfQTJEUCwgLy8gIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQCisgICAgREVWSUNFX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsIC8vIEF1ZGlvU3lzdGVtOjpERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMKKyAgICBERVZJQ0VfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiwgLy8gQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUgorICAgIERFVklDRV9BVVhfRElHSVRBTCAvLyBBdWRpb1N5c3RlbTo6REVWSUNFX09VVF9BVVhfRElHSVRBTAorfTsKKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmRldmljZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgZGV2aWNlKQoreworICAgIHVpbnQzMl90IGRldmljZU91dCA9IDA7CisgICAgd2hpbGUgKGRldmljZSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGRldmljZSk7CisgICAgICAgIGRldmljZSAmPSB+KDEgPDwgaSk7CisgICAgICAgIGlmIChpID49IHNpemVvZihzRGV2aWNlQ29udlRhYmxlKS9zaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBMT0dFKCJkZXZpY2UgY29udmVydGlvbiBlcnJvciBmb3IgQXVkaW9TeXN0ZW0gZGV2aWNlIDB4JTA4eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2VPdXQgfD0gKHVpbnQzMl90KXNEZXZpY2VDb252VGFibGVbaV07CisgICAgfQorICAgIHJldHVybiBkZXZpY2VPdXQ7Cit9CisKKy8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX21vZGUgb3IgYXVkaW9fbW9kZV9lIChpbiBFZmZlY3RBcGkuaCkgYXJlIG1vZGlmaWVkCitjb25zdCB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c01vZGVDb252VGFibGVbXSA9IHsKKyAgICBBVURJT19NT0RFX05PUk1BTCwgICAvLyBBdWRpb1N5c3RlbTo6TU9ERV9OT1JNQUwKKyAgICBBVURJT19NT0RFX1JJTkdUT05FLCAvLyBBdWRpb1N5c3RlbTo6TU9ERV9SSU5HVE9ORQorICAgIEFVRElPX01PREVfSU5fQ0FMTCAgIC8vIEF1ZGlvU3lzdGVtOjpNT0RFX0lOX0NBTEwKK307CisKK2ludCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6bW9kZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgbW9kZSkKK3sKKyAgICBpbnQgbW9kZU91dCA9IC0xOworICAgIGlmIChtb2RlIDwgc2l6ZW9mKHNNb2RlQ29udlRhYmxlKSAvIHNpemVvZih1aW50MzJfdCkpIHsKKyAgICAgICAgbW9kZU91dCA9IChpbnQpc01vZGVDb252VGFibGVbbW9kZV07CisgICAgfQorICAgIHJldHVybiBtb2RlT3V0OworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdEVmZmVjdCBJRCAlZDpcbiIsIG1JZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1Mb2NrKTsKKyAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdENvdWxkIG5vdCBsb2NrIEZ4IG11dGV4OlxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFNlc3Npb24gU3RhdHVzIFN0YXRlIEVuZ2luZTpcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQlMDVkICAgJTAzZCAgICAlMDNkICAgMHglMDh4XG4iLAorICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCAodWludDMyX3QpbUVmZmVjdEludGVyZmFjZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdERlc2NyaXB0b3I6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBVVUlEOiAlMDhYLSUwNFgtJTA0WC0lMDRYLSUwMlglMDJYJTAyWCUwMlglMDJYJTAyWFxuIiwKKyAgICAgICAgICAgIG1EZXNjcmlwdG9yLnV1aWQudGltZUxvdywgbURlc2NyaXB0b3IudXVpZC50aW1lTWlkLCBtRGVzY3JpcHRvci51dWlkLnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLmNsb2NrU2VxLCBtRGVzY3JpcHRvci51dWlkLm5vZGVbMF0sIG1EZXNjcmlwdG9yLnV1aWQubm9kZVsxXSxtRGVzY3JpcHRvci51dWlkLm5vZGVbMl0sCisgICAgICAgICAgICBtRGVzY3JpcHRvci51dWlkLm5vZGVbM10sbURlc2NyaXB0b3IudXVpZC5ub2RlWzRdLG1EZXNjcmlwdG9yLnV1aWQubm9kZVs1XSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHQtIFRZUEU6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAorICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUudGltZUxvdywgbURlc2NyaXB0b3IudHlwZS50aW1lTWlkLCBtRGVzY3JpcHRvci50eXBlLnRpbWVIaUFuZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbURlc2NyaXB0b3IudHlwZS5jbG9ja1NlcSwgbURlc2NyaXB0b3IudHlwZS5ub2RlWzBdLCBtRGVzY3JpcHRvci50eXBlLm5vZGVbMV0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzJdLAorICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yLnR5cGUubm9kZVszXSxtRGVzY3JpcHRvci50eXBlLm5vZGVbNF0sbURlc2NyaXB0b3IudHlwZS5ub2RlWzVdKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdC0gYXBpVmVyc2lvbjogJTA0WFxuXHRcdC0gZmxhZ3M6ICUwOFhcbiIsCisgICAgICAgICAgICBtRGVzY3JpcHRvci5hcGlWZXJzaW9uLAorICAgICAgICAgICAgbURlc2NyaXB0b3IuZmxhZ3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBuYW1lOiAlc1xuIiwKKyAgICAgICAgICAgIG1EZXNjcmlwdG9yLm5hbWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0LSBpbXBsZW1lbnRvcjogJXNcbiIsCisgICAgICAgICAgICBtRGVzY3JpcHRvci5pbXBsZW1lbnRvcik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gSW5wdXQgY29uZmlndXJhdGlvbjpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdEJ1ZmZlciAgICAgRnJhbWVzICBTbXAgcmF0ZSBDaGFubmVscyBGb3JtYXRcbiIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlx0XHRcdDB4JTA4eCAlMDVkICAgJTA1ZCAgICAlMDh4ICVkXG4iLAorICAgICAgICAgICAgKHVpbnQzMl90KW1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdywKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMsCisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdC0gT3V0cHV0IGNvbmZpZ3VyYXRpb246XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRCdWZmZXIgICAgIEZyYW1lcyAgU21wIHJhdGUgQ2hhbm5lbHMgRm9ybWF0XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdFx0XHQweCUwOHggJTA1ZCAgICUwNWQgICAgJTA4eCAlZFxuIiwKKyAgICAgICAgICAgICh1aW50MzJfdCltQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3LAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICBtQ29uZmlnLm91dHB1dENmZy5jaGFubmVscywKKyAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXHRcdCVkIENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0XHRQaWQgICBQcmlvcml0eSBDdHJsIExvY2tlZCBjbGllbnQgc2VydmVyXG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1IYW5kbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlID0gbUhhbmRsZXNbaV0ucHJvbW90ZSgpOworICAgICAgICBpZiAoaGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgIGhhbmRsZS0+ZHVtcChidWZmZXIsIFNJWkUpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5sZW5ndGgoKSk7CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVmZmVjdEhhbmRsZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZSIKKworQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OkVmZmVjdEhhbmRsZShjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KQorICAgIDogQm5FZmZlY3QoKSwKKyAgICBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RDbGllbnQoZWZmZWN0Q2xpZW50KSwgbUNsaWVudChjbGllbnQpLCBtUHJpb3JpdHkocHJpb3JpdHkpLCBtSGFzQ29udHJvbChmYWxzZSkKK3sKKyAgICBMT0dWKCJjb25zdHJ1Y3RvciAlcCIsIHRoaXMpOworCisgICAgaW50IGJ1Zk9mZnNldCA9ICgoc2l6ZW9mKGVmZmVjdF9wYXJhbV9jYmxrX3QpIC0gMSkgLyBzaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisgICAgbUNibGtNZW1vcnkgPSBjbGllbnQtPmhlYXAoKS0+YWxsb2NhdGUoRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFICsgYnVmT2Zmc2V0KTsKKyAgICBpZiAobUNibGtNZW1vcnkgIT0gMCkgeworICAgICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSk7CisKKyAgICAgICAgaWYgKG1DYmxrKSB7CisgICAgICAgICAgICBuZXcobUNibGspIGVmZmVjdF9wYXJhbV9jYmxrX3QoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSAodWludDhfdCAqKW1DYmxrICsgYnVmT2Zmc2V0OworICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBFZmZlY3Qgc2l6ZT0ldSIsIEVGRkVDVF9QQVJBTV9CVUZGRVJfU0laRSArIHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK0F1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjp+RWZmZWN0SGFuZGxlKCkKK3sKKyAgICBMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CisgICAgZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKCkKK3sKKyAgICBpZiAoIW1IYXNDb250cm9sKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgcmV0dXJuIG1FZmZlY3QtPnNldEVuYWJsZWQodHJ1ZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNhYmxlKCkKK3sKKyAgICBpZiAoIW1IYXNDb250cm9sKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKG1FZmZlY3QgPT0gTlVMTCkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgcmV0dXJuIG1FZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNjb25uZWN0KCkKK3sKKyAgICBpZiAobUVmZmVjdCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUVmZmVjdC0+ZGlzY29ubmVjdCh0aGlzKTsKKyAgICAvLyByZWxlYXNlIHNwIG9uIG1vZHVsZSA9PiBtb2R1bGUgZGVzdHJ1Y3RvciBjYW4gYmUgY2FsbGVkIG5vdworICAgIG1FZmZlY3QuY2xlYXIoKTsKKyAgICBpZiAobUNibGspIHsKKyAgICAgICAgbUNibGstPn5lZmZlY3RfcGFyYW1fY2Jsa190KCk7ICAgLy8gZGVzdHJveSBvdXIgc2hhcmVkLXN0cnVjdHVyZS4KKyAgICB9CisgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsgICAgICAgICAgICAvLyBhbmQgZnJlZSB0aGUgc2hhcmVkIG1lbW9yeQorICAgIGlmIChtQ2xpZW50ICE9IDApIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpLT5tTG9jayk7CisgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKK3sKKy8vICAgIExPR1YoImNvbW1hbmQoKSwgY21kQ29kZTogJWQsIG1IYXNDb250cm9sOiAlZCwgbUVmZmVjdDogJXAiLAorLy8gICAgICAgICAgICAgIGNtZENvZGUsIG1IYXNDb250cm9sLCAobUVmZmVjdCA9PSAwKSA/IDAgOiBtRWZmZWN0LmdldCgpKTsKKworICAgIC8vIG9ubHkgZ2V0IHBhcmFtZXRlciBjb21tYW5kIGlzIHBlcm1pdHRlZCBmb3IgYXBwbGljYXRpb25zIG5vdCBjb250cm9sbGluZyB0aGUgZWZmZWN0CisgICAgaWYgKCFtSGFzQ29udHJvbCAmJiBjbWRDb2RlICE9IEVGRkVDVF9DTURfR0VUX1BBUkFNKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgLy8gaGFuZGxlIGNvbW1hbmRzIHRoYXQgYXJlIG5vdCBmb3J3YXJkZWQgdHJhbnNwYXJlbnRseSB0byBlZmZlY3QgZW5naW5lCisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUKSB7CisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJ5bG9jaygpIGhlcmUgYXMgdGhpcyBmdW5jdGlvbiBpcyBleGVjdXRlZCBpbiB0aGUgYmluZGVyIHRocmVhZCBzZXJ2aW5nIGEgcGFydGljdWxhciBjbGllbnQgcHJvY2VzczoKKyAgICAgICAgLy8gbm8gcmlzayB0byBibG9jayB0aGUgd2hvbGUgbWVkaWEgc2VydmVyIHByb2Nlc3Mgb3IgbWl4ZXIgdGhyZWFkcyBpcyB3ZSBhcmUgc3R1Y2sgaGVyZQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNibGstPmxvY2spOworICAgICAgICBpZiAobUNibGstPmNsaWVudEluZGV4ID4gRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFIHx8CisgICAgICAgICAgICBtQ2Jsay0+c2VydmVySW5kZXggPiBFRkZFQ1RfUEFSQU1fQlVGRkVSX1NJWkUpIHsKKyAgICAgICAgICAgIG1DYmxrLT5zZXJ2ZXJJbmRleCA9IDA7CisgICAgICAgICAgICBtQ2Jsay0+Y2xpZW50SW5kZXggPSAwOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgd2hpbGUgKG1DYmxrLT5zZXJ2ZXJJbmRleCA8IG1DYmxrLT5jbGllbnRJbmRleCkgeworICAgICAgICAgICAgaW50IHJlcGx5OworICAgICAgICAgICAgdWludDMyX3QgcnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgIGludCAqcCA9IChpbnQgKikobUJ1ZmZlciArIG1DYmxrLT5zZXJ2ZXJJbmRleCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9ICpwKys7CisgICAgICAgICAgICBpZiAoKCh1aW50OF90ICopcCArIHNpemUpID4gbUJ1ZmZlciArIG1DYmxrLT5jbGllbnRJbmRleCkgeworICAgICAgICAgICAgICAgIExPR1coImNvbW1hbmQoKTogaW52YWxpZCBwYXJhbWV0ZXIgYmxvY2sgc2l6ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopcDsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+cHNpemUgPT0gMCB8fCBwYXJhbS0+dnNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR1coImNvbW1hbmQoKTogbnVsbCBwYXJhbWV0ZXIgb3IgdmFsdWUgc2l6ZSIpOworICAgICAgICAgICAgICAgIG1DYmxrLT5zZXJ2ZXJJbmRleCArPSBzaXplOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgcHNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwYXJhbS0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQpICsgMSkgKiBzaXplb2YoaW50KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT52c2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgICAgICAgICAvLyBzdG9wIGF0IGZpcnN0IGVycm9yIGVuY291bnRlcmVkCisgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcmV0OworICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IHJlcGx5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IHJlcGx5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNibGstPnNlcnZlckluZGV4ICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgbUNibGstPnNlcnZlckluZGV4ID0gMDsKKyAgICAgICAgbUNibGstPmNsaWVudEluZGV4ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9FTkFCTEUpIHsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gTk9fRVJST1I7CisgICAgICAgIHJldHVybiBlbmFibGUoKTsKKyAgICB9IGVsc2UgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9ESVNBQkxFKSB7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IE5PX0VSUk9SOworICAgICAgICByZXR1cm4gZGlzYWJsZSgpOworICAgIH0KKworICAgIHJldHVybiBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworfQorCitzcDxJTWVtb3J5PiBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6Z2V0Q2JsaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNibGtNZW1vcnk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OnNldENvbnRyb2woYm9vbCBoYXNDb250cm9sLCBib29sIHNpZ25hbCkKK3sKKyAgICBMT0dWKCJzZXRDb250cm9sICVwIGNvbnRyb2wgJWQiLCB0aGlzLCBoYXNDb250cm9sKTsKKworICAgIG1IYXNDb250cm9sID0gaGFzQ29udHJvbDsKKyAgICBpZiAoc2lnbmFsICYmIG1FZmZlY3RDbGllbnQgIT0gMCkgeworICAgICAgICBtRWZmZWN0Q2xpZW50LT5jb250cm9sU3RhdHVzQ2hhbmdlZChoYXNDb250cm9sKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCit7CisgICAgaWYgKG1FZmZlY3RDbGllbnQgIT0gMCkgeworICAgICAgICBtRWZmZWN0Q2xpZW50LT5jb21tYW5kRXhlY3V0ZWQoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfQorfQorCisKKwordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgaWYgKG1FZmZlY3RDbGllbnQgIT0gMCkgeworICAgICAgICBtRWZmZWN0Q2xpZW50LT5lbmFibGVTdGF0dXNDaGFuZ2VkKGVuYWJsZWQpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gQm5FZmZlY3Q6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKK30KKworCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1DYmxrLT5sb2NrKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCUwNWQgJTA1ZCAgICAlMDF1ICAgICUwMXUgICAgICAlMDV1ICAlMDV1XG4iLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gTlVMTCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgbVByaW9yaXR5LAorICAgICAgICAgICAgbUhhc0NvbnRyb2wsCisgICAgICAgICAgICAhbG9ja2VkLAorICAgICAgICAgICAgbUNibGstPmNsaWVudEluZGV4LAorICAgICAgICAgICAgbUNibGstPnNlcnZlckluZGV4CisgICAgICAgICAgICApOworCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtQ2Jsay0+bG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4iCisKK0F1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENoYWluKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB3VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpCisgICAgOiBtVGhyZWFkKHdUaHJlYWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCksIG1BY3RpdmVUcmFja0NudCgwKSwgbU93bkluQnVmZmVyKGZhbHNlKSwKKyAgICAgICAgICAgIG1Wb2x1bWVDdHJsSWR4KC0xKSwgbUxlZnRWb2x1bWUoVUlOVF9NQVgpLCBtUmlnaHRWb2x1bWUoVUlOVF9NQVgpLAorICAgICAgICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpCit7CisgICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEF1ZGlvU3lzdGVtOjpNVVNJQyk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46On5FZmZlY3RDaGFpbigpCit7CisgICAgaWYgKG1Pd25JbkJ1ZmZlcikgeworICAgICAgICBkZWxldGUgbUluQnVmZmVyOworICAgIH0KKworfQorCisvLyBnZXRFZmZlY3RGcm9tRGVzY19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAorc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmdldEVmZmVjdEZyb21EZXNjX2woZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKK3sKKyAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdDsKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChtZW1jbXAoJm1FZmZlY3RzW2ldLT5kZXNjKCkudXVpZCwgJmRlc2NyaXB0b3ItPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgZWZmZWN0ID0gbUVmZmVjdHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZWZmZWN0OworfQorCisvLyBnZXRFZmZlY3RGcm9tSWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpnZXRFZmZlY3RGcm9tSWRfbChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3Q7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAvLyBieSBjb252ZW50aW9uLCByZXR1cm4gZmlyc3QgZWZmZWN0IGlmIGlkIHByb3ZpZGVkIGlzIDAgKDAgaXMgbmV2ZXIgYSB2YWxpZCBpZCkKKyAgICAgICAgaWYgKGlkID09IDAgfHwgbUVmZmVjdHNbaV0tPmlkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IG1FZmZlY3RzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVmZmVjdDsKK30KKworLy8gTXVzdCBiZSBjYWxsZWQgd2l0aCBFZmZlY3RDaGFpbjo6bUxvY2sgbG9ja2VkCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnByb2Nlc3NfbCgpCit7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnByb2Nlc3MoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnVwZGF0ZVN0YXRlKCk7CisgICAgfQorICAgIC8vIGlmIG5vIHRyYWNrIGlzIGFjdGl2ZSwgaW5wdXQgYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBoZXJlIGFzIHRoZSBtaXhlciBwcm9jZXNzCisgICAgLy8gd2lsbCBub3QgZG8gaXQKKyAgICBpZiAobVNlc3Npb25JZCA+IDAgJiYgYWN0aXZlVHJhY2tzKCkgPT0gMCkgeworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IHRocmVhZC0+ZnJhbWVDb3VudCgpICogdGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKyAgICAgICAgICAgIG1lbXNldChtSW5CdWZmZXIsIDAsIG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBhZGRFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmFkZEVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKK3sKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSBlZmZlY3QtPmRlc2MoKTsKKyAgICB1aW50MzJfdCBpbnNlcnRQcmVmID0gZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBlZmZlY3QtPnNldENoYWluKHRoaXMpOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgZWZmZWN0LT5zZXRUaHJlYWQodGhyZWFkKTsKKworICAgIGlmICgoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgLy8gQXV4aWxpYXJ5IGVmZmVjdHMgYXJlIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgbUVmZmVjdHMgdmVjdG9yIGFzCisgICAgICAgIC8vIHRoZXkgYXJlIHByb2Nlc3NlZCBmaXJzdCBhbmQgYWNjdW11bGF0ZWQgaW4gY2hhaW4gaW5wdXQgYnVmZmVyCisgICAgICAgIG1FZmZlY3RzLmluc2VydEF0KGVmZmVjdCwgMCk7CisKKyAgICAgICAgLy8gdGhlIGlucHV0IGJ1ZmZlciBmb3IgYXV4aWxpYXJ5IGVmZmVjdCBjb250YWlucyBtb25vIHNhbXBsZXMgaW4KKyAgICAgICAgLy8gMzIgYml0IGZvcm1hdC4gVGhpcyBpcyB0byBhdm9pZCBzYXR1cmF0aW9uIGluIEF1ZG9NaXhlcgorICAgICAgICAvLyBhY2N1bXVsYXRpb24gc3RhZ2UuIFNhdHVyYXRpb24gaXMgZG9uZSBpbiBFZmZlY3RNb2R1bGU6OnByb2Nlc3MoKSBiZWZvcmUKKyAgICAgICAgLy8gY2FsbGluZyB0aGUgcHJvY2VzcyBpbiBlZmZlY3QgZW5naW5lCisgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CisgICAgICAgIGludDMyX3QgKmJ1ZmZlciA9IG5ldyBpbnQzMl90W251bVNhbXBsZXNdOworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBudW1TYW1wbGVzICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcigoaW50MTZfdCAqKWJ1ZmZlcik7CisgICAgICAgIC8vIGF1eGlsaWFyeSBlZmZlY3RzIG91dHB1dCBzYW1wbGVzIHRvIGNoYWluIGlucHV0IGJ1ZmZlciBmb3IgZnVydGhlciBwcm9jZXNzaW5nCisgICAgICAgIC8vIGJ5IGluc2VydCBlZmZlY3RzCisgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW5zZXJ0IGVmZmVjdHMgYXJlIGluc2VydGVkIGF0IHRoZSBlbmQgb2YgbUVmZmVjdHMgdmVjdG9yIGFzIHRoZXkgYXJlIHByb2Nlc3NlZAorICAgICAgICAvLyAgYWZ0ZXIgdHJhY2sgYW5kIGF1eGlsaWFyeSBlZmZlY3RzLgorICAgICAgICAvLyBJbnNlcnQgZWZmZWN0IG9yZGVyIGFzIGEgZnVuY3Rpb24gb2YgaW5kaWNhdGVkIHByZWZlcmVuY2U6CisgICAgICAgIC8vICBpZiBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFLCBpbnNlcnQgaW4gZmlyc3QgcG9zaXRpb24gb3IgcmVqZWN0IGlmCisgICAgICAgIC8vICBhbm90aGVyIGVmZmVjdCBpcyBwcmVzZW50CisgICAgICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwgaW5zZXJ0IGluIGZpcnN0IHBvc2l0aW9uIG9yIGFmdGVyIHRoZQorICAgICAgICAvLyAgbGFzdCBlZmZlY3QgY2xhaW1pbmcgZmlyc3QgcG9zaXRpb24KKyAgICAgICAgLy8gIGVsc2UgaWYgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QsIGluc2VydCBpbiBsYXN0IHBvc2l0aW9uIG9yIGJlZm9yZSB0aGUKKyAgICAgICAgLy8gIGZpcnN0IGVmZmVjdCBjbGFpbWluZyBsYXN0IHBvc2l0aW9uCisgICAgICAgIC8vICBlbHNlIGlmIEVGRkVDVF9GTEFHX0lOU0VSVF9BTlkgaW5zZXJ0IGFmdGVyIGZpcnN0IG9yIGJlZm9yZSBsYXN0CisgICAgICAgIC8vIFJlamVjdCBpbnNlcnRpb24gaWYgYW4gZWZmZWN0IHdpdGggRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSBpcworICAgICAgICAvLyBhbHJlYWR5IHByZXNlbnQKKworICAgICAgICBpbnQgc2l6ZSA9IChpbnQpbUVmZmVjdHMuc2l6ZSgpOworICAgICAgICBpbnQgaWR4X2luc2VydCA9IHNpemU7CisgICAgICAgIGludCBpZHhfaW5zZXJ0X2ZpcnN0ID0gLTE7CisgICAgICAgIGludCBpZHhfaW5zZXJ0X2xhc3QgPSAtMTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkID0gbUVmZmVjdHNbaV0tPmRlc2MoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGlNb2RlID0gZC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSzsKKyAgICAgICAgICAgIHVpbnQzMl90IGlQcmVmID0gZC5mbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLOworICAgICAgICAgICAgaWYgKGlNb2RlID09IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW52YWxpZCBlZmZlY3QgY2hhaW5pbmcgY29tYmluYXRpb25zCisgICAgICAgICAgICAgICAgaWYgKGluc2VydFByZWYgPT0gRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRSB8fAorICAgICAgICAgICAgICAgICAgICBpUHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coImFkZEVmZmVjdF9sKCkgY291bGQgbm90IGluc2VydCBlZmZlY3QgJXM6IGV4Y2x1c2l2ZSBjb25mbGljdCB3aXRoICVzIiwgZGVzYy5uYW1lLCBkLm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHBvc2l0aW9uIG9mIGZpcnN0IGluc2VydCBlZmZlY3QgYW5kIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAvLyBzZWxlY3QgdGhpcyBhcyBpbnNlcnQgcG9zaXRpb24gZm9yIG5ldyBlZmZlY3QKKyAgICAgICAgICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBwb3NpdGlvbiBvZiBsYXN0IGluc2VydCBlZmZlY3QgY2xhaW1pbmcKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCBwb3NpdGlvbgorICAgICAgICAgICAgICAgIGlmIChpUHJlZiA9PSBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWR4X2luc2VydF9maXJzdCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHBvc2l0aW9uIG9mIGZpcnN0IGluc2VydCBlZmZlY3QgY2xhaW1pbmcKKyAgICAgICAgICAgICAgICAvLyBsYXN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgaWYgKGlQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUICYmCisgICAgICAgICAgICAgICAgICAgIGlkeF9pbnNlcnRfbGFzdCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZHhfaW5zZXJ0X2xhc3QgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1vZGlmeSBpZHhfaW5zZXJ0IGZyb20gZmlyc3QgcG9zaXRpb24gaWYgbmVlZGVkCisgICAgICAgIGlmIChpbnNlcnRQcmVmID09IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUKSB7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydF9sYXN0ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IGlkeF9pbnNlcnRfbGFzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWR4X2luc2VydCA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydF9maXJzdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlkeF9pbnNlcnQgPSBpZHhfaW5zZXJ0X2ZpcnN0ICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsd2F5cyByZWFkIHNhbXBsZXMgZnJvbSBjaGFpbiBpbnB1dCBidWZmZXIKKyAgICAgICAgZWZmZWN0LT5zZXRJbkJ1ZmZlcihtSW5CdWZmZXIpOworCisgICAgICAgIC8vIGlmIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiwgb3V0cHV0IHNhbXBsZXMgdG8gY2hhaW4KKyAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciwgb3RoZXJ3aXNlIHRvIGNoYWluIGlucHV0IGJ1ZmZlcgorICAgICAgICBpZiAoaWR4X2luc2VydCA9PSBzaXplKSB7CisgICAgICAgICAgICBpZiAoaWR4X2luc2VydCAhPSAwKSB7CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbUVmZmVjdHNbaWR4X2luc2VydC0xXS0+Y29uZmlndXJlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3QtPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVmZmVjdC0+c2V0T3V0QnVmZmVyKG1JbkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgbUVmZmVjdHMuaW5zZXJ0QXQoZWZmZWN0LCBpZHhfaW5zZXJ0KTsKKworICAgICAgICBMT0dWKCJhZGRFZmZlY3RfbCgpIGVmZmVjdCAlcCwgYWRkZWQgaW4gY2hhaW4gJXAgYXQgcmFuayAlZCIsIGVmZmVjdC5nZXQoKSwgdGhpcywgaWR4X2luc2VydCk7CisgICAgfQorICAgIGVmZmVjdC0+Y29uZmlndXJlKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyByZW1vdmVFZmZlY3RfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpyZW1vdmVFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpbnQgc2l6ZSA9IChpbnQpbUVmZmVjdHMuc2l6ZSgpOworICAgIGludCBpOworICAgIHVpbnQzMl90IHR5cGUgPSBlZmZlY3QtPmRlc2MoKS5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSBtRWZmZWN0c1tpXSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBlZmZlY3QtPmluQnVmZmVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpID09IHNpemUgLSAxICYmIGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRWZmZWN0c1tpIC0gMV0tPnNldE91dEJ1ZmZlcihtT3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHNbaSAtIDFdLT5jb25maWd1cmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRWZmZWN0cy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIExPR1YoInJlbW92ZUVmZmVjdF9sKCkgZWZmZWN0ICVwLCByZW1vdmVkIGZyb20gY2hhaW4gJXAgYXQgcmFuayAlZCIsIGVmZmVjdC5nZXQoKSwgdGhpcywgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtRWZmZWN0cy5zaXplKCk7Cit9CisKKy8vIHNldERldmljZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXREZXZpY2VfbCh1aW50MzJfdCBkZXZpY2UpCit7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnNldERldmljZShkZXZpY2UpOworICAgIH0KK30KKworLy8gc2V0TW9kZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXRNb2RlX2wodWludDMyX3QgbW9kZSkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1FZmZlY3RzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBtRWZmZWN0c1tpXS0+c2V0TW9kZShtb2RlKTsKKyAgICB9Cit9CisKKy8vIHNldFZvbHVtZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAorYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzZXRWb2x1bWVfbCh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0KQoreworICAgIHVpbnQzMl90IG5ld0xlZnQgPSAqbGVmdDsKKyAgICB1aW50MzJfdCBuZXdSaWdodCA9ICpyaWdodDsKKyAgICBib29sIGhhc0NvbnRyb2wgPSBmYWxzZTsKKyAgICBpbnQgY3RybElkeCA9IC0xOworICAgIHNpemVfdCBzaXplID0gbUVmZmVjdHMuc2l6ZSgpOworCisgICAgLy8gZmlyc3QgdXBkYXRlIHZvbHVtZSBjb250cm9sbGVyCisgICAgZm9yIChzaXplX3QgaSA9IHNpemU7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgaWYgKG1FZmZlY3RzW2kgLSAxXS0+aXNQcm9jZXNzRW5hYmxlZCgpICYmCisgICAgICAgICAgICAobUVmZmVjdHNbaSAtIDFdLT5kZXNjKCkuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpIHsKKyAgICAgICAgICAgIGN0cmxJZHggPSBpIC0gMTsKKyAgICAgICAgICAgIGhhc0NvbnRyb2wgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3RybElkeCA9PSBtVm9sdW1lQ3RybElkeCAmJiAqbGVmdCA9PSBtTGVmdFZvbHVtZSAmJiAqcmlnaHQgPT0gbVJpZ2h0Vm9sdW1lKSB7CisgICAgICAgIGlmIChoYXNDb250cm9sKSB7CisgICAgICAgICAgICAqbGVmdCA9IG1OZXdMZWZ0Vm9sdW1lOworICAgICAgICAgICAgKnJpZ2h0ID0gbU5ld1JpZ2h0Vm9sdW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNDb250cm9sOworICAgIH0KKworICAgIG1Wb2x1bWVDdHJsSWR4ID0gY3RybElkeDsKKyAgICBtTGVmdFZvbHVtZSA9IG5ld0xlZnQ7CisgICAgbVJpZ2h0Vm9sdW1lID0gbmV3UmlnaHQ7CisKKyAgICAvLyBzZWNvbmQgZ2V0IHZvbHVtZSB1cGRhdGUgZnJvbSB2b2x1bWUgY29udHJvbGxlcgorICAgIGlmIChjdHJsSWR4ID49IDApIHsKKyAgICAgICAgbUVmZmVjdHNbY3RybElkeF0tPnNldFZvbHVtZSgmbmV3TGVmdCwgJm5ld1JpZ2h0LCB0cnVlKTsKKyAgICAgICAgbU5ld0xlZnRWb2x1bWUgPSBuZXdMZWZ0OworICAgICAgICBtTmV3UmlnaHRWb2x1bWUgPSBuZXdSaWdodDsKKyAgICB9CisgICAgLy8gdGhlbiBpbmRpY2F0ZSB2b2x1bWUgdG8gYWxsIG90aGVyIGVmZmVjdHMgaW4gY2hhaW4uCisgICAgLy8gUGFzcyBhbHRlcmVkIHZvbHVtZSB0byBlZmZlY3RzIGJlZm9yZSB2b2x1bWUgY29udHJvbGxlcgorICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlcgorICAgIHVpbnQzMl90IGxWb2wgPSBuZXdMZWZ0OworICAgIHVpbnQzMl90IHJWb2wgPSBuZXdSaWdodDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICgoaW50KWkgPT0gY3RybElkeCkgY29udGludWU7CisgICAgICAgIC8vIHRoaXMgYWxzbyB3b3JrcyBmb3IgY3RybElkeCA9PSAtMSB3aGVuIHRoZXJlIGlzIG5vIHZvbHVtZSBjb250cm9sbGVyCisgICAgICAgIGlmICgoaW50KWkgPiBjdHJsSWR4KSB7CisgICAgICAgICAgICBsVm9sID0gKmxlZnQ7CisgICAgICAgICAgICByVm9sID0gKnJpZ2h0OworICAgICAgICB9CisgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUoJmxWb2wsICZyVm9sLCBmYWxzZSk7CisgICAgfQorICAgICpsZWZ0ID0gbmV3TGVmdDsKKyAgICAqcmlnaHQgPSBuZXdSaWdodDsKKworICAgIHJldHVybiBoYXNDb250cm9sOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkVmZmVjdHMgZm9yIHNlc3Npb24gJWQ6XG4iLCBtU2Vzc2lvbklkKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gQXVkaW9GbGluZ2VyIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJcdENvdWxkIG5vdCBsb2NrIG11dGV4OlxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXHROdW0gZnggSW4gYnVmZmVyICAgT3V0IGJ1ZmZlciAgIEFjdGl2ZSB0cmFja3M6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcdCUwMmQgICAgIDB4JTA4eCAgMHglMDh4ICAgJWRcbiIsCisgICAgICAgICAgICBtRWZmZWN0cy5zaXplKCksCisgICAgICAgICAgICAodWludDMyX3QpbUluQnVmZmVyLAorICAgICAgICAgICAgKHVpbnQzMl90KW1PdXRCdWZmZXIsCisgICAgICAgICAgICBtQWN0aXZlVHJhY2tDbnQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0c1tpXTsKKyAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlciIKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoCkBAIC00MDQ1LDExICs2NDE0LDQgQEAKICAgICByZXR1cm4gQm5BdWRpb0ZsaW5nZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6aW5zdGFudGlhdGUoKSB7Ci0gICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoCi0gICAgICAgICAgICBTdHJpbmcxNigibWVkaWEuYXVkaW9fZmxpbmdlciIpLCBuZXcgQXVkaW9GbGluZ2VyKCkpOwotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDczOWVjMzMuLjU5MTc2MzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTMxLDEwICszMSwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKwogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlICJBdWRpb0J1ZmZlclByb3ZpZGVyLmgiCkBAIC00Miw2ICs0NCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIGF1ZGlvX3RyYWNrX2NibGtfdDsKK2NsYXNzIGVmZmVjdF9wYXJhbV9jYmxrX3Q7CiBjbGFzcyBBdWRpb01peGVyOwogY2xhc3MgQXVkaW9CdWZmZXI7CiBjbGFzcyBBdWRpb1Jlc2FtcGxlcjsKQEAgLTU3LDEwICs2MCwxMyBAQAogCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrU3RhbmRieVRpbWVJbk5zZWNzID0gc2Vjb25kcygzKTsKIAotY2xhc3MgQXVkaW9GbGluZ2VyIDogcHVibGljIEJuQXVkaW9GbGluZ2VyLCBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK2NsYXNzIEF1ZGlvRmxpbmdlciA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8QXVkaW9GbGluZ2VyPiwKKyAgICBwdWJsaWMgQm5BdWRpb0ZsaW5nZXIKIHsKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb0ZsaW5nZXI+OwogcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCk7CisgICAgc3RhdGljIGNoYXIgY29uc3QqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiOyB9CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTc1LDYgKzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoaW50IG91dHB1dCkgY29uc3Q7CkBAIC0xMzksOCArMTQ2LDI5IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsIGludCBvdXRwdXQpOwogCi0gICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworICAgIHZpcnR1YWwgaW50IG5ld0F1ZGlvU2Vzc2lvbklkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxvYWRFZmZlY3RMaWJyYXJ5KGNvbnN0IGNoYXIgKmxpYlBhdGgsIGludCAqaGFuZGxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5sb2FkRWZmZWN0TGlicmFyeShpbnQgaGFuZGxlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpudW1FZmZlY3RzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlFZmZlY3QodWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF91dWlkX3QgKnBVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGludCBzcmNPdXRwdXQsIGludCBkc3RPdXRwdXQpOwogCiAgICAgZW51bSBoYXJkd2FyZV9jYWxsX3N0YXRlIHsKICAgICAgICAgQVVESU9fSFdfSURMRSA9IDAsCkBAIC0xNzAsNiArMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyk7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KApAQCAtMTc4LDYgKzIwNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKIAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldE1vZGUoKSB7IHJldHVybiBtTW9kZTsgfQorCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcigpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5BdWRpb0ZsaW5nZXIoKTsKQEAgLTIwNSw2ICsyMzYsMjcgQEAKICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICBtUGlkOwogICAgIH07CiAKKyAgICAvLyAtLS0gTm90aWZpY2F0aW9uIENsaWVudCAtLS0KKyAgICBjbGFzcyBOb3RpZmljYXRpb25DbGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCk7CisgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOworCisgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4gICAgY2xpZW50KCkgeyByZXR1cm4gbUNsaWVudDsgfQorCisgICAgICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKKyAgICAgICAgICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3QgTm90aWZpY2F0aW9uQ2xpZW50Jik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50JiBvcGVyYXRvciA9IChjb25zdCBOb3RpZmljYXRpb25DbGllbnQmKTsKKworICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+ICAgICAgICBtQXVkaW9GbGluZ2VyOworICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtUGlkOworICAgICAgICBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiBtQ2xpZW50OworICAgIH07CiAKICAgICBjbGFzcyBUcmFja0hhbmRsZTsKICAgICBjbGFzcyBSZWNvcmRIYW5kbGU7CkBAIC0yMTUsNiArMjY3LDkgQEAKICAgICBjbGFzcyBEdXBsaWNhdGluZ1RocmVhZDsKICAgICBjbGFzcyBUcmFjazsKICAgICBjbGFzcyBSZWNvcmRUcmFjazsKKyAgICBjbGFzcyBFZmZlY3RNb2R1bGU7CisgICAgY2xhc3MgRWZmZWN0SGFuZGxlOworICAgIGNsYXNzIEVmZmVjdENoYWluOwogCiAgICAgY2xhc3MgVGhyZWFkQmFzZSA6IHB1YmxpYyBUaHJlYWQgewogICAgIHB1YmxpYzoKQEAgLTI1MCwxMyArMzA1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VHJhY2tCYXNlKCk7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrKCkgY29uc3QgeyByZXR1cm4gbUNibGs7IH0KKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgc2Vzc2lvbklkKCkgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBUaHJlYWRCYXNlOwpAQCAtMzA1LDYgKzM2Miw3IEBACiAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1DbGllbnRUaWQ7CiAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgICAgIG1Gb3JtYXQ7CiAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG1GbGFnczsKKyAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBDb25maWdFdmVudCB7CkBAIC0zMjQsNyArMzgyLDcgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKSA9IDA7CisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCkgPSAwOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kQ29uZmlnRXZlbnQoaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZENvbmZpZ0V2ZW50X2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcHJvY2Vzc0NvbmZpZ0V2ZW50cygpOwpAQCAtMzQ4LDkgKzQwNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+ICAgICAgICBtQXVkaW9GbGluZ2VyOwogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVBhcmFtQ29uZDsKICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICAgICAgICAgbU5ld1BhcmFtZXRlcnM7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1QYXJhbVN0YXR1czsKQEAgLTM4Niw3ICs0NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+VHJhY2soKTsKIAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwpAQCAtNDA1LDYgKzQ2NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSgpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU3RyZWFtVHlwZTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgKmF1eEJ1ZmZlcigpIHsgcmV0dXJuIG1BdXhCdWZmZXI7IH0KKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFpbkJ1ZmZlcihpbnQxNl90ICpidWZmZXIpIHsgbU1haW5CdWZmZXIgPSBidWZmZXI7IH0KKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAgICAgKm1haW5CdWZmZXIoKSB7IHJldHVybiBtTWFpbkJ1ZmZlcjsgfQorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBhdXhFZmZlY3RJZCgpIHsgcmV0dXJuIG1BdXhFZmZlY3RJZDsgfQogCiAKICAgICAgICAgcHJvdGVjdGVkOgpAQCAtNDQ1LDYgKzUxMSwxMCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZTsKICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbU5hbWU7CisgICAgICAgICAgICBpbnQxNl90ICAgICAgICAgICAgICptTWFpbkJ1ZmZlcjsKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgbUhhc1ZvbHVtZUNvbnRyb2xsZXI7CiAgICAgICAgIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCkBAIC00ODYsNyArNTU2LDcgQEAKICAgICAgICAgICAgIER1cGxpY2F0aW5nVGhyZWFkKiAgICAgICAgICBtU291cmNlVGhyZWFkOwogICAgICAgICB9OyAgLy8gZW5kIG9mIE91dHB1dFRyYWNrCiAKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkKTsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkLCB1aW50MzJfdCBkZXZpY2UpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKQEAgLTUxOSw2ICs1ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKTsKIAogICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogZ2V0T3V0cHV0KCkgeyByZXR1cm4gbU91dHB1dDsgfQpAQCAtNTI4LDggKzU5OSw0OSBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZXN0b3JlKCkgeyBpZiAobVN1c3BlbmRlZCkgbVN1c3BlbmRlZC0tOyB9CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU3VzcGVuZGVkKCkgeyByZXR1cm4gKG1TdXNwZW5kZWQgIT0gMCk7IH0KICAgICAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICAgICAqbWl4QnVmZmVyKCkgeyByZXR1cm4gbU1peEJ1ZmZlcjsgfTsKKworICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RIYW5kbGU+IGNyZWF0ZUVmZmVjdF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICB2b2lkIGRpc2Nvbm5lY3RFZmZlY3QoY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlcyBmb3IgaGFzQXVkaW9TZXNzaW9uIChiaXQgZmllbGQpCisgICAgICAgICAgICAgICAgICAgIGVudW0gZWZmZWN0X3N0YXRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9TRVNTSU9OID0gMHgxLCAgIC8vIHRoZSBhdWRpbyBzZXNzaW9uIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWZmZWN0CisgICAgICAgICAgICAgICAgICAgICAgICBUUkFDS19TRVNTSU9OID0gMHgyICAgICAvLyB0aGUgYXVkaW8gc2Vzc2lvbiBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYWNrCisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZ2V0RWZmZWN0Q2hhaW4oaW50IHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRFZmZlY3RDaGFpbl9sKGludCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCBsb2NrRWZmZWN0Q2hhaW5zX2woVmVjdG9yPHNwIDxFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCB1bmxvY2tFZmZlY3RDaGFpbnMoVmVjdG9yPHNwIDxFZmZlY3RDaGFpbj4gPiYgZWZmZWN0Q2hhaW5zKTsKKworICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0X2woaW50IHNlc3Npb25JZCwgaW50IGVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCBkZXRhY2hBdXhFZmZlY3RfbChpbnQgZWZmZWN0SWQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhdHRhY2hBdXhFZmZlY3QoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+IHRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBFZmZlY3RJZCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdF9sKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRWZmZWN0SWQpOworICAgICAgICAgICAgICAgICAgICB2b2lkIHNldE1vZGUodWludDMyX3QgbW9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgYWRkRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlRWZmZWN0X2woY29uc3Qgc3A8IEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woaW50IHNlc3Npb25JZCk7CiAKICAgICAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKICAgICAgICAgICAgIHN0cmVhbV90eXBlX3QoKQpAQCAtNTUzLDYgKzY2NSw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRlbGV0ZVRyYWNrTmFtZV9sKGludCBuYW1lKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgPSAwOwogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgICBpZGxlU2xlZXBUaW1lVXMoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgICAgICAgIHN1c3BlbmRTbGVlcFRpbWVVcygpID0gMDsKIAogICAgIHByaXZhdGU6CiAKQEAgLTU3Miw4ICs2ODUsMTEgQEAKIAogICAgICAgICB2b2lkICAgICAgICByZWFkT3V0cHV0UGFyYW1ldGVycygpOwogCisgICAgICAgIHVpbnQzMl90ICAgIGRldmljZSgpIHsgcmV0dXJuIG1EZXZpY2U7IH0KKwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgc3RhdHVzX3QgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworICAgICAgICBzdGF0dXNfdCAgICBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxUcmFjaz4gPiAgICAgICBtVHJhY2tzOwogICAgICAgICAvLyBtU3RyZWFtVHlwZXNbXSB1c2VzIDEgYWRkaXRpb25uYWwgc3RyZWFtIHR5cGUgaW50ZXJuYWxseSBmb3IgdGhlIE91dHB1dFRyYWNrIHVzZWQgYnkgRHVwbGljYXRpbmdUaHJlYWQKQEAgLTU4NCwzMCArNzAwLDMzIEBACiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVdyaXRlczsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlczsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5Xcml0ZTsKKyAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiAgICAgICBtRWZmZWN0Q2hhaW5zOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2U7CiAgICAgfTsKIAogICAgIGNsYXNzIE1peGVyVGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIE1peGVyVGhyZWFkIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCk7CisgICAgICAgIE1peGVyVGhyZWFkIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCisgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWl4ZXJUaHJlYWQoKTsKIAogICAgICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGdldFRyYWNrcyhTb3J0ZWRWZWN0b3IgPCBzcDxUcmFjaz4gPiYgdHJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHB1dFRyYWNrcyhTb3J0ZWRWZWN0b3IgPCBzcDxUcmFjaz4gPiYgdHJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3IgPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW52YWxpZGF0ZVRyYWNrcyhpbnQgc3RyZWFtVHlwZSk7CiAgICAgICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyc19sKCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHByb3RlY3RlZDoKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgcHJlcGFyZVRyYWNrc19sKGNvbnN0IFNvcnRlZFZlY3Rvcjwgd3A8VHJhY2s+ID4mIGFjdGl2ZVRyYWNrcywgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBwcmVwYXJlVHJhY2tzX2woY29uc3QgU29ydGVkVmVjdG9yPCB3cDxUcmFjaz4gPiYgYWN0aXZlVHJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpOwogICAgICAgICB2aXJ0dWFsICAgICBpbnQgICAgICAgICBnZXRUcmFja05hbWVfbCgpOwogICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBkZWxldGVUcmFja05hbWVfbChpbnQgbmFtZSk7CiAgICAgICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCk7CiAgICAgICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGlkbGVTbGVlcFRpbWVVcygpOworICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzdXNwZW5kU2xlZXBUaW1lVXMoKTsKIAogICAgICAgICBBdWRpb01peGVyKiAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01peGVyOwogICAgIH07CkBAIC02MTUsNyArNzM0LDcgQEAKICAgICBjbGFzcyBEaXJlY3RPdXRwdXRUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewogICAgIHB1YmxpYzoKIAotICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgaW50IGlkKTsKKyAgICAgICAgRGlyZWN0T3V0cHV0VGhyZWFkIChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGludCBpZCwgdWludDMyX3QgZGV2aWNlKTsKICAgICAgICAgfkRpcmVjdE91dHB1dFRocmVhZCgpOwogCiAgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtNjI4LDEwICs3NDcsMTUgQEAKICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGVsZXRlVHJhY2tOYW1lX2woaW50IG5hbWUpOwogICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpOwogICAgICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKTsKKyAgICAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc3VzcGVuZFNsZWVwVGltZVVzKCk7CiAKICAgICBwcml2YXRlOgotICAgICAgICBmbG9hdCBtTGVmdFZvbHVtZTsKLSAgICAgICAgZmxvYXQgbVJpZ2h0Vm9sdW1lOworICAgICAgICB2b2lkIGFwcGx5Vm9sdW1lKHVpbnQxNl90IGxlZnRWb2wsIHVpbnQxNl90IHJpZ2h0Vm9sLCBib29sIHJhbXApOworCisgICAgICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7CisgICAgICAgIGZsb2F0IG1SaWdodFZvbEZsb2F0OworICAgICAgICB1aW50MTZfdCBtTGVmdFZvbFNob3J0OworICAgICAgICB1aW50MTZfdCBtUmlnaHRWb2xTaG9ydDsKICAgICB9OwogCiAgICAgY2xhc3MgRHVwbGljYXRpbmdUaHJlYWQgOiBwdWJsaWMgTWl4ZXJUaHJlYWQgewpAQCAtNjYxLDYgKzc4NSwxMiBAQAogICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVJbnRlcm5hbChpbnQgc3RyZWFtKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZXNbc3RyZWFtXS52b2x1bWU7IH0KICAgICAgICAgICAgICAgdm9pZCBhdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGludCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKTsKIAorICAgICAgICAgICAgICBpbnQgIG5leHRVbmlxdWVJZCgpOworICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqZHN0VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVSZWdpc3Rlcik7CisKICAgICBmcmllbmQgY2xhc3MgQXVkaW9CdWZmZXI7CiAKICAgICBjbGFzcyBUcmFja0hhbmRsZSA6IHB1YmxpYyBhbmRyb2lkOjpCbkF1ZGlvVHJhY2sgewpAQCAtNjc0LDYgKzgwNCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwogICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAogICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CiAgICAgcHJpdmF0ZToKQEAgLTY4NSw2ICs4MTYsNyBAQAogCiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpOwogCiAKICAgICAvLyByZWNvcmQgdGhyZWFkCkBAIC03MDEsNyArODMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UmVjb3JkVHJhY2soKTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydCgpOwpAQCAtNzQ0LDcgKzg3Nyw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAgICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJzX2woKTsKICAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVhZElucHV0UGFyYW1ldGVycygpOwogICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKQEAgLTc3Niw2ICs5MDksMjYwIEBACiAgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IG1SZWNvcmRUcmFjazsKICAgICB9OwogCisgICAgLy8tLS0gQXVkaW8gRWZmZWN0IE1hbmFnZW1lbnQKKworICAgIC8vIEVmZmVjdE1vZHVsZSBhbmQgRWZmZWN0Q2hhaW4gY2xhc3NlcyBib3RoIGhhdmUgdGhlaXIgb3duIG11dGV4IHRvIHByb3RlY3QKKyAgICAvLyBzdGF0ZSBjaGFuZ2VzIG9yIHJlc291cmNlIG1vZGlmaWNhdGlvbnMuIEFsd2F5cyByZXNwZWN0IHRoZSBmb2xsb3dpbmcgb3JkZXIKKyAgICAvLyBpZiBtdWx0aXBsZSBtdXRleGVzIG11c3QgYmUgYWNxdWlyZWQgdG8gYXZvaWQgY3Jvc3MgZGVhZGxvY2s6CisgICAgLy8gQXVkaW9GbGluZ2VyIC0+IFRocmVhZEJhc2UgLT4gRWZmZWN0Q2hhaW4gLT4gRWZmZWN0TW9kdWxlCisKKyAgICAvLyBUaGUgRWZmZWN0TW9kdWxlIGNsYXNzIGlzIGEgd3JhcHBlciBvYmplY3QgY29udHJvbGxpbmcgdGhlIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24KKyAgICAvLyBpbiB0aGUgZWZmZWN0IGxpYnJhcnkuIEl0IHByZXZlbnRzIGNvbmN1cnJlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBjb21tYW5kKCkgZnVuY3Rpb25zCisgICAgLy8gZnJvbSBkaWZmZXJlbnQgY2xpZW50IHRocmVhZHMuIEl0IGtlZXBzIGEgbGlzdCBvZiBFZmZlY3RIYW5kbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nCisgICAgLy8gdG8gYWxsIGNsaWVudCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBlZmZlY3QgYW5kIG5vdGlmaWVzIGFwcGxpY2F0aW9ucyBvZiBlZmZlY3Qgc3RhdGUsCisgICAgLy8gY29udHJvbCBvciBwYXJhbWV0ZXIgY2hhbmdlcy4gSXQgbWFuYWdlcyB0aGUgYWN0aXZhdGlvbiBzdGF0ZSBtYWNoaW5lIHRvIHNlbmQgYXBwcm9wcmlhdGUKKyAgICAvLyByZXNldCwgZW5hYmxlLCBkaXNhYmxlIGNvbW1hbmRzIHRvIGVmZmVjdCBlbmdpbmUgYW5kIHByb3ZpZGUgdm9sdW1lCisgICAgLy8gcmFtcGluZyB3aGVuIGVmZmVjdHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZC4KKyAgICAvLyBXaGVuIGNvbnRyb2xsaW5nIGFuIGF1eGlsaWFyeSBlZmZlY3QsIHRoZSBFZmZlY3RNb2R1bGUgYWxzbyBwcm92aWRlcyBhbiBpbnB1dCBidWZmZXIgdXNlZCBieQorICAgIC8vIHRoZSBhdHRhY2hlZCB0cmFjayhzKSB0byBhY2N1bXVsYXRlIHRoZWlyIGF1eGlsaWFyeSBjaGFubmVsLgorICAgIGNsYXNzIEVmZmVjdE1vZHVsZTogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0TW9kdWxlKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB3VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbj4mIGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQpOworICAgICAgICB+RWZmZWN0TW9kdWxlKCk7CisKKyAgICAgICAgZW51bSBlZmZlY3Rfc3RhdGUgeworICAgICAgICAgICAgSURMRSwKKyAgICAgICAgICAgIFJFU1RBUlQsCisgICAgICAgICAgICBTVEFSVElORywKKyAgICAgICAgICAgIEFDVElWRSwKKyAgICAgICAgICAgIFNUT1BQSU5HLAorICAgICAgICAgICAgU1RPUFBFRAorICAgICAgICB9OworCisgICAgICAgIGludCAgICAgICAgIGlkKCkgeyByZXR1cm4gbUlkOyB9CisgICAgICAgIHZvaWQgcHJvY2VzcygpOworICAgICAgICB2b2lkIHVwZGF0ZVN0YXRlKCk7CisgICAgICAgIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisKKyAgICAgICAgdm9pZCByZXNldF9sKCk7CisgICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZSgpOworICAgICAgICBzdGF0dXNfdCBpbml0KCk7CisgICAgICAgIHVpbnQzMl90IHN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzdGF0dXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2Vzc2lvbklkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworICAgICAgICBib29sIGlzRW5hYmxlZCgpOworICAgICAgICBib29sIGlzUHJvY2Vzc0VuYWJsZWQoKTsKKworICAgICAgICB2b2lkICAgICAgICBzZXRJbkJ1ZmZlcihpbnQxNl90ICpidWZmZXIpIHsgbUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczE2ID0gYnVmZmVyOyB9CisgICAgICAgIGludDE2X3QgICAgICppbkJ1ZmZlcigpIHsgcmV0dXJuIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnMxNjsgfQorICAgICAgICB2b2lkICAgICAgICBzZXRPdXRCdWZmZXIoaW50MTZfdCAqYnVmZmVyKSB7IG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTYgPSBidWZmZXI7IH0KKyAgICAgICAgaW50MTZfdCAgICAgKm91dEJ1ZmZlcigpIHsgcmV0dXJuIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5zMTY7IH0KKyAgICAgICAgdm9pZCAgICAgICAgc2V0Q2hhaW4oY29uc3Qgd3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikgeyBtQ2hhaW4gPSBjaGFpbjsgfQorICAgICAgICB2b2lkICAgICAgICBzZXRUaHJlYWQoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCkgeyBtVGhyZWFkID0gdGhyZWFkOyB9CisKKyAgICAgICAgc3RhdHVzX3QgYWRkSGFuZGxlKHNwPEVmZmVjdEhhbmRsZT4mIGhhbmRsZSk7CisgICAgICAgIHZvaWQgZGlzY29ubmVjdChjb25zdCB3cDxFZmZlY3RIYW5kbGU+JiBoYW5kbGUpOworICAgICAgICBzaXplX3QgcmVtb3ZlSGFuZGxlIChjb25zdCB3cDxFZmZlY3RIYW5kbGU+JiBoYW5kbGUpOworCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QmIGRlc2MoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQorICAgICAgICB3cDxFZmZlY3RDaGFpbj4mICAgICBjaGFpbigpIHsgcmV0dXJuIG1DaGFpbjsgfQorCisgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0RGV2aWNlKHVpbnQzMl90IGRldmljZSk7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0Vm9sdW1lKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgY29udHJvbGxlcik7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgc2V0TW9kZSh1aW50MzJfdCBtb2RlKTsKKworICAgICAgICBzdGF0dXNfdCAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworICAgIHByb3RlY3RlZDoKKworICAgICAgICAvLyBNYXhpbXVtIHRpbWUgYWxsb2NhdGVkIHRvIGVmZmVjdCBlbmdpbmVzIHRvIGNvbXBsZXRlIHRoZSB0dXJuIG9mZiBzZXF1ZW5jZQorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0RJU0FCTEVfVElNRV9NUyA9IDEwMDAwOworCisgICAgICAgIEVmZmVjdE1vZHVsZShjb25zdCBFZmZlY3RNb2R1bGUmKTsKKyAgICAgICAgRWZmZWN0TW9kdWxlJiBvcGVyYXRvciA9IChjb25zdCBFZmZlY3RNb2R1bGUmKTsKKworICAgICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CisgICAgICAgIHN0YXR1c190IHN0b3BfbCgpOworCisgICAgICAgIC8vIHVwZGF0ZSB0aGlzIHRhYmxlIHdoZW4gQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgb3IgYXVkaW9fZGV2aWNlX2UgKGluIEVmZmVjdEFwaS5oKSBhcmUgbW9kaWZpZWQKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IHNEZXZpY2VDb252VGFibGVbXTsKKyAgICAgICAgc3RhdGljIHVpbnQzMl90IGRldmljZUF1ZGlvU3lzdGVtVG9FZmZlY3RBcGkodWludDMyX3QgZGV2aWNlKTsKKworICAgICAgICAvLyB1cGRhdGUgdGhpcyB0YWJsZSB3aGVuIEF1ZGlvU3lzdGVtOjphdWRpb19tb2RlIG9yIGF1ZGlvX21vZGVfZSAoaW4gRWZmZWN0QXBpLmgpIGFyZSBtb2RpZmllZAorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qgc01vZGVDb252VGFibGVbXTsKKyAgICAgICAgc3RhdGljIGludCBtb2RlQXVkaW9TeXN0ZW1Ub0VmZmVjdEFwaSh1aW50MzJfdCBtb2RlKTsKKworICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgIC8vIG11dGV4IGZvciBwcm9jZXNzLCBjb21tYW5kcyBhbmQgaGFuZGxlcyBsaXN0IHByb3RlY3Rpb24KKyAgICAgICAgd3A8VGhyZWFkQmFzZT4gICAgICBtVGhyZWFkOyAgICAvLyBwYXJlbnQgdGhyZWFkCisgICAgICAgIHdwPEVmZmVjdENoYWluPiAgICAgbUNoYWluOyAgICAgLy8gcGFyZW50IGVmZmVjdCBjaGFpbgorICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgIC8vIHRoaXMgaW5zdGFuY2UgdW5pcXVlIElECisgICAgICAgIGludCAgICAgICAgICAgICAgICAgbVNlc3Npb25JZDsgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjcmlwdG9yOy8vIGVmZmVjdCBkZXNjcmlwdG9yIHJlY2VpdmVkIGZyb20gZWZmZWN0IGVuZ2luZQorICAgICAgICBlZmZlY3RfY29uZmlnX3QgICAgIG1Db25maWc7ICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbgorICAgICAgICBlZmZlY3RfaW50ZXJmYWNlX3QgIG1FZmZlY3RJbnRlcmZhY2U7IC8vIEVmZmVjdCBtb2R1bGUgQyBBUEkKKyAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsgICAgICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBzdGF0dXMKKyAgICAgICAgdWludDMyX3QgbVN0YXRlOyAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGFjdGl2YXRpb24gc3RhdGUgKGVmZmVjdF9zdGF0ZSkKKyAgICAgICAgVmVjdG9yPCB3cDxFZmZlY3RIYW5kbGU+ID4gbUhhbmRsZXM7ICAgIC8vIGxpc3Qgb2YgY2xpZW50IGhhbmRsZXMKKyAgICAgICAgdWludDMyX3QgbU1heERpc2FibGVXYWl0Q250OyAgICAvLyBtYXhpbXVtIGdyYWNlIHBlcmlvZCBiZWZvcmUgZm9yY2luZyBhbiBlZmZlY3Qgb2ZmIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZGluZyBkaXNhYmxlIGNvbW1hbmQuCisgICAgICAgIHVpbnQzMl90IG1EaXNhYmxlV2FpdENudDsgICAgICAgLy8gY3VycmVudCBwcm9jZXNzKCkgY2FsbHMgY291bnQgZHVyaW5nIGRpc2FibGUgcGVyaW9kLgorICAgIH07CisKKyAgICAvLyBUaGUgRWZmZWN0SGFuZGxlIGNsYXNzIGltcGxlbWVudHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlLiBJdCBwcm92aWRlcyByZXNvdXJjZXMKKyAgICAvLyB0byByZWNlaXZlIHBhcmFtZXRlciB1cGRhdGVzLCBrZWVwcyB0cmFjayBvZiBlZmZlY3QgY29udHJvbAorICAgIC8vIG93bmVyc2hpcCBhbmQgc3RhdGUgYW5kIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEVmZmVjdE1vZHVsZSBvYmplY3QgaXQgaXMgY29udHJvbGxpbmcuCisgICAgLy8gVGhlcmUgaXMgb25lIEVmZmVjdEhhbmRsZSBvYmplY3QgZm9yIGVhY2ggYXBwbGljYXRpb24gY29udHJvbGxpbmcgKG9yIHVzaW5nKQorICAgIC8vIGFuIGVmZmVjdCBtb2R1bGUuCisgICAgLy8gVGhlIEVmZmVjdEhhbmRsZSBpcyBvYnRhaW5lZCBieSBjYWxsaW5nIEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KCkuCisgICAgY2xhc3MgRWZmZWN0SGFuZGxlOiBwdWJsaWMgYW5kcm9pZDo6Qm5FZmZlY3QgeworICAgIHB1YmxpYzoKKworICAgICAgICBFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSk7CisgICAgICAgIHZpcnR1YWwgfkVmZmVjdEhhbmRsZSgpOworCisgICAgICAgIC8vIElFZmZlY3QKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGUoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNhYmxlKCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpOworICAgICAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworICAgICAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisKKworICAgICAgICAvLyBHaXZlIG9yIHRha2UgY29udHJvbCBvZiBlZmZlY3QgbW9kdWxlCisgICAgICAgIHZvaWQgc2V0Q29udHJvbChib29sIGhhc0NvbnRyb2wsIGJvb2wgc2lnbmFsKTsKKyAgICAgICAgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CisgICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIC8vIEdldHRlcnMKKyAgICAgICAgaW50IGlkKCkgeyByZXR1cm4gbUVmZmVjdC0+aWQoKTsgfQorICAgICAgICBpbnQgcHJpb3JpdHkoKSB7IHJldHVybiBtUHJpb3JpdHk7IH0KKyAgICAgICAgYm9vbCBoYXNDb250cm9sKCkgeyByZXR1cm4gbUhhc0NvbnRyb2w7IH0KKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QoKSB7IHJldHVybiBtRWZmZWN0OyB9CisKKyAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisgICAgcHJvdGVjdGVkOgorCisgICAgICAgIEVmZmVjdEhhbmRsZShjb25zdCBFZmZlY3RIYW5kbGUmKTsKKyAgICAgICAgRWZmZWN0SGFuZGxlJiBvcGVyYXRvciA9KGNvbnN0IEVmZmVjdEhhbmRsZSYpOworCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gbUVmZmVjdDsgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gY29udHJvbGxlZCBFZmZlY3RNb2R1bGUKKyAgICAgICAgc3A8SUVmZmVjdENsaWVudD4gbUVmZmVjdENsaWVudDsgICAgLy8gY2FsbGJhY2sgaW50ZXJmYWNlIGZvciBjbGllbnQgbm90aWZpY2F0aW9ucworICAgICAgICBzcDxDbGllbnQ+ICAgICAgICAgIG1DbGllbnQ7ICAgICAgICAvLyBjbGllbnQgZm9yIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCisgICAgICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqIG1DYmxrOyAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nIHZpYSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHVpbnQ4X3QqICAgICAgICAgICAgbUJ1ZmZlcjsgICAgICAgIC8vIHBvaW50ZXIgdG8gcGFyYW1ldGVyIGFyZWEgaW4gc2hhcmVkIG1lbW9yeQorICAgICAgICBpbnQgbVByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgYXBwbGljYXRpb24gcHJpb3JpdHkgdG8gY29udHJvbCB0aGUgZWZmZWN0CisgICAgICAgIGJvb2wgbUhhc0NvbnRyb2w7ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgdGhpcyBoYW5kbGUgaXMgY29udHJvbGxpbmcgdGhlIGVmZmVjdAorICAgIH07CisKKyAgICAvLyB0aGUgRWZmZWN0Q2hhaW4gY2xhc3MgcmVwcmVzZW50cyBhIGdyb3VwIG9mIGVmZmVjdHMgYXNzb2NpYXRlZCB0byBvbmUgYXVkaW8gc2Vzc2lvbi4KKyAgICAvLyBUaGVyZSBjYW4gYmUgYW55IG51bWJlciBvZiBFZmZlY3RDaGFpbiBvYmplY3RzIHBlciBvdXRwdXQgbWl4ZXIgdGhyZWFkIChQbGF5YmFja1RocmVhZCkuCisgICAgLy8gVGhlIEVmZmVjQ2hhaW4gd2l0aCBzZXNzaW9uIElEIDAgY29udGFpbnMgZ2xvYmFsIGVmZmVjdHMgYXBwbGllZCB0byB0aGUgb3V0cHV0IG1peC4KKyAgICAvLyBFZmZlY3RzIGluIHRoaXMgY2hhaW4gY2FuIGJlIGluc2VydCBvciBhdXhpbGlhcnkuIEVmZmVjdHMgaW4gb3RoZXIgY2hhaW5zIChhdHRhY2hlZCB0byB0cmFja3MpCisgICAgLy8gYXJlIGluc2VydCBvbmx5LiBUaGUgRWZmZWN0Q2hhaW4gbWFpbnRhaW5zIGFuIG9yZGVyZWQgbGlzdCBvZiBlZmZlY3QgbW9kdWxlLCB0aGUgb3JkZXIgY29ycmVzcG9uZGluZworICAgIC8vIGluIHRoZSBlZmZlY3QgcHJvY2VzcyBvcmRlci4gV2hlbiBhdHRhY2hlZCB0byBhIHRyYWNrIChzZXNzaW9uIElEICE9IDApLCBpdCBhbHNvIHByb3ZpZGUgaXQncyBvd24KKyAgICAvLyBpbnB1dCBidWZmZXIgdXNlZCBieSB0aGUgdHJhY2sgYXMgYWNjdW11bGF0aW9uIGJ1ZmZlci4KKyAgICBjbGFzcyBFZmZlY3RDaGFpbjogcHVibGljIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgRWZmZWN0Q2hhaW4oY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHdUaHJlYWQsIGludCBzZXNzaW9uSWQpOworICAgICAgICB+RWZmZWN0Q2hhaW4oKTsKKworICAgICAgICB2b2lkIHByb2Nlc3NfbCgpOworCisgICAgICAgIHZvaWQgbG9jaygpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHVubG9jaygpIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgYWRkRWZmZWN0X2woY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgaGFuZGxlKTsKKyAgICAgICAgc2l6ZV90IHJlbW92ZUVmZmVjdF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGhhbmRsZSk7CisKKyAgICAgICAgaW50IHNlc3Npb25JZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbklkOworICAgICAgICB9CisKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tRGVzY19sKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOworICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21JZF9sKGludCBpZCk7CisgICAgICAgIGJvb2wgc2V0Vm9sdW1lX2wodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCk7CisgICAgICAgIHZvaWQgc2V0RGV2aWNlX2wodWludDMyX3QgZGV2aWNlKTsKKyAgICAgICAgdm9pZCBzZXRNb2RlX2wodWludDMyX3QgbW9kZSk7CisKKyAgICAgICAgdm9pZCBzZXRJbkJ1ZmZlcihpbnQxNl90ICpidWZmZXIsIGJvb2wgb3duc0J1ZmZlciA9IGZhbHNlKSB7CisgICAgICAgICAgICBtSW5CdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICBtT3duSW5CdWZmZXIgPSBvd25zQnVmZmVyOworICAgICAgICB9CisgICAgICAgIGludDE2X3QgKmluQnVmZmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbkJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldE91dEJ1ZmZlcihpbnQxNl90ICpidWZmZXIpIHsKKyAgICAgICAgICAgIG1PdXRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1PdXRCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0VHJhY2soKSB7bUFjdGl2ZVRyYWNrQ250Kys7fQorICAgICAgICB2b2lkIHN0b3BUcmFjaygpIHttQWN0aXZlVHJhY2tDbnQtLTt9CisgICAgICAgIGludCBhY3RpdmVUcmFja3MoKSB7IHJldHVybiBtQWN0aXZlVHJhY2tDbnQ7fQorCisgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5KCkgeyByZXR1cm4gbVN0cmF0ZWd5OyB9CisgICAgICAgIHZvaWQgc2V0U3RyYXRlZ3kodWludDMyX3Qgc3RyYXRlZ3kpCisgICAgICAgICAgICAgICAgIHsgbVN0cmF0ZWd5ID0gc3RyYXRlZ3k7IH0KKworICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICBwcm90ZWN0ZWQ6CisKKyAgICAgICAgRWZmZWN0Q2hhaW4oY29uc3QgRWZmZWN0Q2hhaW4mKTsKKyAgICAgICAgRWZmZWN0Q2hhaW4mIG9wZXJhdG9yID0oY29uc3QgRWZmZWN0Q2hhaW4mKTsKKworICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOyAgICAgLy8gcGFyZW50IG1peGVyIHRocmVhZAorICAgICAgICBNdXRleCBtTG9jazsgICAgICAgICAgICAgICAgLy8gbXV0ZXggcHJvdGVjdGluZyBlZmZlY3QgbGlzdAorICAgICAgICBWZWN0b3I8c3A8RWZmZWN0TW9kdWxlPiA+IG1FZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdCBtb2R1bGVzCisgICAgICAgIGludCBtU2Vzc2lvbklkOyAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgICAgIGludDE2X3QgKm1JbkJ1ZmZlcjsgICAgICAgICAvLyBjaGFpbiBpbnB1dCBidWZmZXIKKyAgICAgICAgaW50MTZfdCAqbU91dEJ1ZmZlcjsgICAgICAgIC8vIGNoYWluIG91dHB1dCBidWZmZXIKKyAgICAgICAgaW50IG1BY3RpdmVUcmFja0NudDsgICAgICAgIC8vIG51bWJlciBvZiBhY3RpdmUgdHJhY2tzIGNvbm5lY3RlZAorICAgICAgICBib29sIG1Pd25JbkJ1ZmZlcjsgICAgICAgICAgLy8gdHJ1ZSBpZiB0aGUgY2hhaW4gb3ducyBpdHMgaW5wdXQgYnVmZmVyCisgICAgICAgIGludCBtVm9sdW1lQ3RybElkeDsgICAgICAgICAvLyBpbmRleCBvZiBpbnNlcnQgZWZmZWN0IGhhdmluZyBjb250cm9sIG92ZXIgdm9sdW1lCisgICAgICAgIHVpbnQzMl90IG1MZWZ0Vm9sdW1lOyAgICAgICAvLyBwcmV2aW91cyB2b2x1bWUgb24gbGVmdCBjaGFubmVsCisgICAgICAgIHVpbnQzMl90IG1SaWdodFZvbHVtZTsgICAgICAvLyBwcmV2aW91cyB2b2x1bWUgb24gcmlnaHQgY2hhbm5lbAorICAgICAgICB1aW50MzJfdCBtTmV3TGVmdFZvbHVtZTsgICAgICAgLy8gbmV3IHZvbHVtZSBvbiBsZWZ0IGNoYW5uZWwKKyAgICAgICAgdWludDMyX3QgbU5ld1JpZ2h0Vm9sdW1lOyAgICAgIC8vIG5ldyB2b2x1bWUgb24gcmlnaHQgY2hhbm5lbAorICAgICAgICB1aW50MzJfdCBtU3RyYXRlZ3k7IC8vIHN0cmF0ZWd5IGZvciB0aGlzIGVmZmVjdCBjaGFpbgorICAgIH07CisKICAgICBmcmllbmQgY2xhc3MgUmVjb3JkVGhyZWFkOwogICAgIGZyaWVuZCBjbGFzcyBQbGF5YmFja1RocmVhZDsKIApAQCAtNzk2LDggKzExODMsMTMgQEAKIAogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgaW50LCBzcDxSZWNvcmRUaHJlYWQ+ID4gICAgbVJlY29yZFRocmVhZHM7CiAKLSAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElCaW5kZXI+ID4gICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFRocmVhZElkOworICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgcGlkX3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTmV4dFVuaXF1ZUlkOworI2lmZGVmIExWTVgKKyAgICAgICAgICAgICAgICBpbnQgbUxpZmVWaWJlc0NsaWVudFBpZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHVpbnQzMl90IG1Nb2RlOworCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKaW5kZXggMTlhNDQyYS4uOGFhYTMyNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcApAQCAtNTYsNiArNTYsOCBAQAogICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOOwogICAgICAgICB0LT52b2x1bWVJbmNbMF0gPSAwOwogICAgICAgICB0LT52b2x1bWVJbmNbMV0gPSAwOworICAgICAgICB0LT5hdXhMZXZlbCA9IDA7CisgICAgICAgIHQtPmF1eEluYyA9IDA7CiAgICAgICAgIHQtPmNoYW5uZWxDb3VudCA9IDI7CiAgICAgICAgIHQtPmVuYWJsZWQgPSAwOwogICAgICAgICB0LT5mb3JtYXQgPSAxNjsKQEAgLTY1LDYgKzY3LDggQEAKICAgICAgICAgdC0+cmVzYW1wbGVyID0gMDsKICAgICAgICAgdC0+c2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICB0LT5pbiA9IDA7CisgICAgICAgIHQtPm1haW5CdWZmZXIgPSBOVUxMOworICAgICAgICB0LT5hdXhCdWZmZXIgPSBOVUxMOwogICAgICAgICB0Kys7CiAgICAgfQogfQpAQCAtMTY5LDI4ICsxNzMsNDggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvTWl4ZXI6OnNldFBhcmFtZXRlcihpbnQgdGFyZ2V0LCBpbnQgbmFtZSwgaW50IHZhbHVlKQorc3RhdHVzX3QgQXVkaW9NaXhlcjo6c2V0UGFyYW1ldGVyKGludCB0YXJnZXQsIGludCBuYW1lLCB2b2lkICp2YWx1ZSkKIHsKKyAgICBpbnQgdmFsdWVJbnQgPSAoaW50KXZhbHVlOworICAgIGludDMyX3QgKnZhbHVlQnVmID0gKGludDMyX3QgKil2YWx1ZTsKKwogICAgIHN3aXRjaCAodGFyZ2V0KSB7CiAgICAgY2FzZSBUUkFDSzoKICAgICAgICAgaWYgKG5hbWUgPT0gQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgaWYgKCh1aW50MzJfdCh2YWx1ZSkgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKHZhbHVlKSkgewotICAgICAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9DT1VOVCwgJWQpIiwgdmFsdWUpOworICAgICAgICAgICAgaWYgKCh1aW50MzJfdCh2YWx1ZUludCkgPD0gTUFYX05VTV9DSEFOTkVMUykgJiYgKHZhbHVlSW50KSkgeworICAgICAgICAgICAgICAgIGlmIChtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXS5jaGFubmVsQ291bnQgIT0gdmFsdWVJbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0uY2hhbm5lbENvdW50ID0gdmFsdWVJbnQ7CisgICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9DT1VOVCwgJWQpIiwgdmFsdWVJbnQpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMTw8bUFjdGl2ZVRyYWNrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChuYW1lID09IE1BSU5fQlVGRkVSKSB7CisgICAgICAgICAgICBpZiAobVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF0ubWFpbkJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKKyAgICAgICAgICAgICAgICBMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1BSU5fQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDE8PG1BY3RpdmVUcmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgPT0gQVVYX0JVRkZFUikgeworICAgICAgICAgICAgaWYgKG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmF1eEJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdLmF1eEJ1ZmZlciA9IHZhbHVlQnVmOworICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQVVYX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxtQWN0aXZlVHJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBSRVNBTVBMRToKICAgICAgICAgaWYgKG5hbWUgPT0gU0FNUExFX1JBVEUpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZUludCA+IDApIHsKICAgICAgICAgICAgICAgICB0cmFja190JiB0cmFjayA9IG1TdGF0ZS50cmFja3NbIG1BY3RpdmVUcmFjayBdOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay5zZXRSZXNhbXBsZXIodWludDMyX3QodmFsdWUpLCBtU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2suc2V0UmVzYW1wbGVyKHVpbnQzMl90KHZhbHVlSW50KSwgbVNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihSRVNBTVBMRSwgU0FNUExFX1JBVEUsICV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCh2YWx1ZUludCkpOwogICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMTw8bUFjdGl2ZVRyYWNrKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMjAxLDE4ICsyMjUsMzkgQEAKICAgICBjYXNlIFZPTFVNRToKICAgICAgICAgaWYgKCh1aW50MzJfdChuYW1lLVZPTFVNRTApIDwgTUFYX05VTV9DSEFOTkVMUykpIHsKICAgICAgICAgICAgIHRyYWNrX3QmIHRyYWNrID0gbVN0YXRlLnRyYWNrc1sgbUFjdGl2ZVRyYWNrIF07Ci0gICAgICAgICAgICBpZiAodHJhY2sudm9sdW1lW25hbWUtVk9MVU1FMF0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay52b2x1bWVbbmFtZS1WT0xVTUUwXSAhPSB2YWx1ZUludCkgeworICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIFZPTFVNRTAvMTogJTA0eCkiLCB2YWx1ZUludCk7CiAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtuYW1lLVZPTFVNRTBdID0gdHJhY2sudm9sdW1lW25hbWUtVk9MVU1FMF0gPDwgMTY7Ci0gICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lW25hbWUtVk9MVU1FMF0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB0cmFjay52b2x1bWVbbmFtZS1WT0xVTUUwXSA9IHZhbHVlSW50OwogICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbbmFtZS1WT0xVTUUwXSA9IHZhbHVlIDw8IDE2OworICAgICAgICAgICAgICAgICAgICB0cmFjay5wcmV2Vm9sdW1lW25hbWUtVk9MVU1FMF0gPSB2YWx1ZUludCA8PCAxNjsKICAgICAgICAgICAgICAgICAgICAgdHJhY2sudm9sdW1lSW5jW25hbWUtVk9MVU1FMF0gPSAwOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZTw8MTYpIC0gdHJhY2sucHJldlZvbHVtZVtuYW1lLVZPTFVNRTBdOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGQgPSAodmFsdWVJbnQ8PDE2KSAtIHRyYWNrLnByZXZWb2x1bWVbbmFtZS1WT0xVTUUwXTsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2b2xJbmMgPSBkIC8gaW50MzJfdChtU3RhdGUuZnJhbWVDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnZvbHVtZUluY1tuYW1lLVZPTFVNRTBdID0gdm9sSW5jOwogICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZWb2x1bWVbbmFtZS1WT0xVTUUwXSA9IHZhbHVlIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sucHJldlZvbHVtZVtuYW1lLVZPTFVNRTBdID0gdmFsdWVJbnQgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVN0YXRlKDE8PG1BY3RpdmVUcmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBBVVhMRVZFTCkgeworICAgICAgICAgICAgdHJhY2tfdCYgdHJhY2sgPSBtU3RhdGUudHJhY2tzWyBtQWN0aXZlVHJhY2sgXTsKKyAgICAgICAgICAgIGlmICh0cmFjay5hdXhMZXZlbCAhPSB2YWx1ZUludCkgeworICAgICAgICAgICAgICAgIExPR1YoInNldFBhcmFtZXRlcihWT0xVTUUsIEFVWExFVkVMOiAlMDR4KSIsIHZhbHVlSW50KTsKKyAgICAgICAgICAgICAgICB0cmFjay5wcmV2QXV4TGV2ZWwgPSB0cmFjay5hdXhMZXZlbCA8PCAxNjsKKyAgICAgICAgICAgICAgICB0cmFjay5hdXhMZXZlbCA9IHZhbHVlSW50OworICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gVk9MVU1FKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OworICAgICAgICAgICAgICAgICAgICB0cmFjay5hdXhJbmMgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZCA9ICh2YWx1ZUludDw8MTYpIC0gdHJhY2sucHJldkF1eExldmVsOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZvbEluYyA9IGQgLyBpbnQzMl90KG1TdGF0ZS5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2suYXV4SW5jID0gdm9sSW5jOworICAgICAgICAgICAgICAgICAgICBpZiAodm9sSW5jID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLnByZXZBdXhMZXZlbCA9IHZhbHVlSW50IDw8IDE2OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludmFsaWRhdGVTdGF0ZSgxPDxtQWN0aXZlVHJhY2spOwpAQCAtMjQ1LDcgKzI5MCw3IEBACiB9CiAKIGlubGluZQotdm9pZCBBdWRpb01peGVyOjp0cmFja190OjphZGp1c3RWb2x1bWVSYW1wKCkKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6YWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCkKIHsKICAgICBmb3IgKGludCBpPTAgOyBpPDIgOyBpKyspIHsKICAgICAgICAgaWYgKCgodm9sdW1lSW5jW2ldPjApICYmICgoKHByZXZWb2x1bWVbaV0rdm9sdW1lSW5jW2ldKT4+MTYpID49IHZvbHVtZVtpXSkpIHx8CkBAIC0yNTQsNiArMjk5LDEzIEBACiAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldPDwxNjsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoYXV4KSB7CisgICAgICAgIGlmICgoKGF1eEluYz4wKSAmJiAoKChwcmV2QXV4TGV2ZWwrYXV4SW5jKT4+MTYpID49IGF1eExldmVsKSkgfHwKKyAgICAgICAgICAgICgoYXV4SW5jPDApICYmICgoKHByZXZBdXhMZXZlbCthdXhJbmMpPj4xNikgPD0gYXV4TGV2ZWwpKSkgeworICAgICAgICAgICAgYXV4SW5jID0gMDsKKyAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsPDwxNjsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC0yNjUsMTMgKzMxNywxMyBAQAogCiAKIAotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzKHZvaWQqIG91dHB1dCkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2VzcygpCiB7Ci0gICAgbVN0YXRlLmhvb2soJm1TdGF0ZSwgb3V0cHV0KTsKKyAgICBtU3RhdGUuaG9vaygmbVN0YXRlKTsKIH0KIAogCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpCit2b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlKQogewogICAgIExPR1dfSUYoIXN0YXRlLT5uZWVkc0NoYW5nZWQsCiAgICAgICAgICJpbiBwcm9jZXNzX192YWxpZGF0ZSgpIGJ1dCBub3RoaW5nJ3MgaW52YWxpZCIpOwpAQCAtMzA4LDcgKzM2MCwxMCBAQAogICAgICAgICBuIHw9IE5FRURTX0NIQU5ORUxfMSArIHQuY2hhbm5lbENvdW50IC0gMTsKICAgICAgICAgbiB8PSBORUVEU19GT1JNQVRfMTY7CiAgICAgICAgIG4gfD0gdC5kb2VzUmVzYW1wbGUoKSA/IE5FRURTX1JFU0FNUExFX0VOQUJMRUQgOiBORUVEU19SRVNBTVBMRV9ESVNBQkxFRDsKLSAgICAgICAKKyAgICAgICAgaWYgKHQuYXV4TGV2ZWwgIT0gMCAmJiB0LmF1eEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBuIHw9IE5FRURTX0FVWF9FTkFCTEVEOworICAgICAgICB9CisKICAgICAgICAgaWYgKHQudm9sdW1lSW5jWzBdfHQudm9sdW1lSW5jWzFdKSB7CiAgICAgICAgICAgICB2b2x1bWVSYW1wID0gMTsKICAgICAgICAgfSBlbHNlIGlmICghdC5kb2VzUmVzYW1wbGUoKSAmJiB0LnZvbHVtZVJMID09IDApIHsKQEAgLTMxOSw2ICszNzQsOSBAQAogICAgICAgICBpZiAoKG4gJiBORUVEU19NVVRFX19NQVNLKSA9PSBORUVEU19NVVRFX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHQuaG9vayA9IHRyYWNrX19ub3A7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgewogICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSAwOwogICAgICAgICAgICAgICAgIHJlc2FtcGxpbmcgPSAxOwpAQCAtMzY5LDcgKzQyNyw3IEBACiAgICAgICAgIGNvdW50QWN0aXZlVHJhY2tzLCBzdGF0ZS0+ZW5hYmxlZFRyYWNrcywKICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSwgcmVzYW1wbGluZywgdm9sdW1lUmFtcCk7CiAKLSAgIHN0YXRlLT5ob29rKHN0YXRlLCBvdXRwdXQpOworICAgc3RhdGUtPmhvb2soc3RhdGUpOwogCiAgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCiAgICAvLyB0cmFjayBob29rcyBmb3Igc3Vic2VxdWVudCBtaXhlciBwcm9jZXNzCkBAIC0zOTAsNyArNDQ4LDcgQEAKICAgICAgICB9CiAgICAgICAgaWYgKGFsbE11dGVkKSB7CiAgICAgICAgICAgIHN0YXRlLT5ob29rID0gcHJvY2Vzc19fbm9wOwotICAgICAgIH0gZWxzZSBpZiAoIXJlc2FtcGxpbmcgJiYgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgeworICAgICAgIH0gZWxzZSBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgewogICAgICAgICAgICBpZiAoY291bnRBY3RpdmVUcmFja3MgPT0gMSkgewogICAgICAgICAgICAgICBzdGF0ZS0+aG9vayA9IHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOwogICAgICAgICAgICB9CkBAIC00ODEsMzAgKzUzOSw0NCBAQAogfQogCiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wKQordm9pZCBBdWRpb01peGVyOjp0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKICAgICB0LT5yZXNhbXBsZXItPnNldFNhbXBsZVJhdGUodC0+c2FtcGxlUmF0ZSk7CiAKICAgICAvLyByYW1wIGdhaW4gLSByZXNhbXBsZSB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwCi0gICAgaWYgVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkgeworICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICAvLyBhbHdheXMgcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHdoZW4gc2VuZGluZyB0byBhdXhpbGlhcnkgYnVmZmVyIHRvIGJlIGFibGUKKyAgICAgICAgLy8gdG8gYXBwbHkgc2VuZCBsZXZlbCBhZnRlciByZXNhbXBsaW5nCisgICAgICAgIC8vIFRPRE86IG1vZGlmeSBlYWNoIHJlc2FtcGxlciB0byBzdXBwb3J0IGF1eCBjaGFubmVsPwogICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOLCBVTklUWV9HQUlOKTsKICAgICAgICAgbWVtc2V0KHRlbXAsIDAsIG91dEZyYW1lQ291bnQgKiBNQVhfTlVNX0NIQU5ORUxTICogc2l6ZW9mKGludDMyX3QpKTsKICAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7Ci0gICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wKTsKLSAgICB9CisgICAgICAgIGlmIFVOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKHQsIG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZVN0ZXJlbyh0LCBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOLCBVTklUWV9HQUlOKTsKKyAgICAgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICAgICB0LT5yZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBTdGVyZW8odCwgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOworICAgICAgICB9CiAKLSAgICAvLyBjb25zdGFudCBnYWluCi0gICAgZWxzZSB7Ci0gICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPnZvbHVtZVswXSwgdC0+dm9sdW1lWzFdKTsKLSAgICAgICAgdC0+cmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIHQtPmJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+c2V0Vm9sdW1lKHQtPnZvbHVtZVswXSwgdC0+dm9sdW1lWzFdKTsKKyAgICAgICAgICAgIHQtPnJlc2FtcGxlci0+cmVzYW1wbGUob3V0LCBvdXRGcmFtZUNvdW50LCB0LT5idWZmZXJQcm92aWRlcik7CisgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wKQordm9pZCBBdWRpb01peGVyOjp0cmFja19fbm9wKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKIH0KIAotdm9pZCBBdWRpb01peGVyOjp2b2x1bWVSYW1wU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXApCit2b2lkIEF1ZGlvTWl4ZXI6OnZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQogewogICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwogICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOwpAQCAtNTE0LDk4ICs1ODYsMjM4IEBACiAgICAgLy9MT0dEKCJbMF0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAogICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKICAgICAvLyAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7Ci0gICAKKwogICAgIC8vIHJhbXAgdm9sdW1lCi0gICAgZG8gewotICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqICgqdGVtcCsrID4+IDEyKTsKLSAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiAoKnRlbXArKyA+PiAxMik7Ci0gICAgICAgIHZsICs9IHZsSW5jOwotICAgICAgICB2ciArPSB2ckluYzsKLSAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotCi0gICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKCk7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wKQotewotICAgIGludDE2X3QgY29uc3QgKmluID0gc3RhdGljX2Nhc3Q8aW50MTZfdCBjb25zdCAqPih0LT5pbik7Ci0KLSAgICAvLyByYW1wIGdhaW4KLSAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7Ci0gICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOwotICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKLQotICAgICAgICAvLyBMT0dEKCJbMV0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB0LT52b2x1bWVbMF0sCi0gICAgICAgIC8vICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisgICAgaWYgVU5MSUtFTFkoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB2YSA9IHQtPnByZXZBdXhMZXZlbDsKKyAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IHQtPmF1eEluYzsKKyAgICAgICAgaW50MzJfdCBsOworICAgICAgICBpbnQzMl90IHI7CiAKICAgICAgICAgZG8gewotICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoaW50MzJfdCkgKmluKys7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIChpbnQzMl90KSAqaW4rKzsKKyAgICAgICAgICAgIGwgPSAoKnRlbXArKyA+PiAxMik7CisgICAgICAgICAgICByID0gKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiByOworICAgICAgICAgICAgKmF1eCsrICs9ICh2YSA+PiAxNykgKiAobCArIHIpOworICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICB2ciArPSB2ckluYzsKKyAgICAgICAgICAgIHZhICs9IHZhSW5jOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqICgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogKCp0ZW1wKysgPj4gMTIpOwogICAgICAgICAgICAgdmwgKz0gdmxJbmM7CiAgICAgICAgICAgICB2ciArPSB2ckluYzsKICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKLSAgICAgICAKLSAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoKTsKICAgICB9CisgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOworICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICB0LT5hZGp1c3RWb2x1bWVSYW1wKChhdXggIT0gTlVMTCkpOworfQogCi0gICAgLy8gY29uc3RhbnQgZ2FpbgotICAgIGVsc2UgewotICAgICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB0LT52b2x1bWVSTDsKK3ZvaWQgQXVkaW9NaXhlcjo6dm9sdW1lU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKK3sKKyAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOworICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07CisKKyAgICBpZiBVTkxJS0VMWShhdXggIT0gTlVMTCkgeworICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpdC0+YXV4TGV2ZWw7CiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOwotICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgIG91dFswXSA9IG11bEFkZFJMKDEsIHJsLCB2cmwsIG91dFswXSk7Ci0gICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGRSTCgwLCBybCwgdnJsLCBvdXRbMV0pOworICAgICAgICAgICAgaW50MTZfdCBsID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgaW50MTZfdCByID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOworICAgICAgICAgICAgaW50MTZfdCBhID0gKGludDE2X3QpKCgoaW50MzJfdClsICsgcikgPj4gMSk7CisgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQociwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgIGF1eFswXSA9IG11bEFkZChhLCB2YSwgYXV4WzBdKTsKKyAgICAgICAgICAgIGF1eCsrOworICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludDE2X3QgbCA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIGludDE2X3QgciA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZChyLCB2ciwgb3V0WzFdKTsKICAgICAgICAgICAgIG91dCArPSAyOwogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogICAgIH0KK30KKwordm9pZCBBdWRpb01peGVyOjp0cmFja19fMTZCaXRzU3RlcmVvKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKK3sKKyAgICBpbnQxNl90IGNvbnN0ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4odC0+aW4pOworCisgICAgaWYgVU5MSUtFTFkoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBsOworICAgICAgICBpbnQzMl90IHI7CisgICAgICAgIC8vIHJhbXAgZ2FpbgorICAgICAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdfHQtPmF1eEluYykgeworICAgICAgICAgICAgaW50MzJfdCB2bCA9IHQtPnByZXZWb2x1bWVbMF07CisgICAgICAgICAgICBpbnQzMl90IHZyID0gdC0+cHJldlZvbHVtZVsxXTsKKyAgICAgICAgICAgIGludDMyX3QgdmEgPSB0LT5wcmV2QXV4TGV2ZWw7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSB0LT5hdXhJbmM7CisgICAgICAgICAgICAvLyBMT0dEKCJbMV0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAorICAgICAgICAgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGwgPSAoaW50MzJfdCkqaW4rKzsKKyAgICAgICAgICAgICAgICByID0gKGludDMyX3QpKmluKys7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogcjsKKyAgICAgICAgICAgICAgICAqYXV4KysgKz0gKHZhID4+IDE3KSAqIChsICsgcik7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICAgICAgdmEgKz0gdmFJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworCisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdGFudCBnYWluCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC0+dm9sdW1lUkw7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpdC0+YXV4TGV2ZWw7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCBjb25zdCAqPihpbik7CisgICAgICAgICAgICAgICAgaW50MTZfdCBhID0gKGludDE2X3QpKCgoaW50MzJfdClpblswXSArIGluWzFdKSA+PiAxKTsKKyAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZFJMKDEsIHJsLCB2cmwsIG91dFswXSk7CisgICAgICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkUkwoMCwgcmwsIHZybCwgb3V0WzFdKTsKKyAgICAgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgICAgICBhdXhbMF0gPSBtdWxBZGQoYSwgdmEsIGF1eFswXSk7CisgICAgICAgICAgICAgICAgYXV4Kys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmFtcCBnYWluCisgICAgICAgIGlmIFVOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSB0LT5wcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdC0+dm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHQtPnZvbHVtZUluY1sxXTsKKworICAgICAgICAgICAgLy8gTE9HRCgiWzFdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHQtPnZvbHVtZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIChpbnQzMl90KSAqaW4rKzsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIChpbnQzMl90KSAqaW4rKzsKKyAgICAgICAgICAgICAgICB2bCArPSB2bEluYzsKKyAgICAgICAgICAgICAgICB2ciArPSB2ckluYzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMF0gPSB2bDsKKyAgICAgICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHQtPnZvbHVtZVJMOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QgY29uc3QgKj4oaW4pOworICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkUkwoMSwgcmwsIHZybCwgb3V0WzBdKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGRSTCgwLCBybCwgdnJsLCBvdXRbMV0pOworICAgICAgICAgICAgICAgIG91dCArPSAyOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0KICAgICB0LT5pbiA9IGluOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXApCit2b2lkIEF1ZGlvTWl4ZXI6OnRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKIHsKICAgICBpbnQxNl90IGNvbnN0ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4odC0+aW4pOwogCi0gICAgLy8gcmFtcCBnYWluCi0gICAgaWYgVU5MSUtFTFkodC0+dm9sdW1lSW5jWzBdfHQtPnZvbHVtZUluY1sxXSkgewotICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKLSAgICAgICAgaW50MzJfdCB2ciA9IHQtPnByZXZWb2x1bWVbMV07Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB0LT52b2x1bWVJbmNbMV07CisgICAgaWYgVU5MSUtFTFkoYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gcmFtcCBnYWluCisgICAgICAgIGlmIFVOTElLRUxZKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV18dC0+YXV4SW5jKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgaW50MzJfdCB2YSA9IHQtPnByZXZBdXhMZXZlbDsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB0LT52b2x1bWVJbmNbMF07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdC0+dm9sdW1lSW5jWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IHQtPmF1eEluYzsKIAotICAgICAgICAvLyBMT0dEKCJbMl0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAotICAgICAgICAvLyAgICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIC8vIExPR0QoIlsyXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCisgICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CiAKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaW50MzJfdCBsID0gKmluKys7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICB2bCArPSB2bEluYzsKLSAgICAgICAgICAgIHZyICs9IHZySW5jOwotICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgICAgIAotICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgICAgIHQtPnByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcCgpOwotICAgIH0KLSAgICAvLyBjb25zdGFudCBnYWluCi0gICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07Ci0gICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOwotICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOwotICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkKGwsIHZyLCBvdXRbMV0pOwotICAgICAgICAgICAgb3V0ICs9IDI7Ci0gICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gKmluKys7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogbDsKKyAgICAgICAgICAgICAgICAqYXV4KysgKz0gKHZhID4+IDE2KSAqIGw7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICAgICAgdmEgKz0gdmFJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworCisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICB0LT5wcmV2QXV4TGV2ZWwgPSB2YTsKKyAgICAgICAgICAgIHQtPmFkanVzdFZvbHVtZVJhbXAodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZyID0gdC0+dm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IChpbnQxNl90KXQtPmF1eExldmVsOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQobCwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgYXV4WzBdID0gbXVsQWRkKGwsIHZhLCBhdXhbMF0pOworICAgICAgICAgICAgICAgIGF1eCsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHJhbXAgZ2FpbgorICAgICAgICBpZiBVTkxJS0VMWSh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gdC0+cHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSB0LT5wcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHQtPnZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB0LT52b2x1bWVJbmNbMV07CisKKyAgICAgICAgICAgIC8vIExPR0QoIlsyXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCisgICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdC0+dm9sdW1lWzBdLAorICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIGw7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgIHZsICs9IHZsSW5jOworICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKworICAgICAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LT52b2x1bWVbMF07CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZyID0gdC0+dm9sdW1lWzFdOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDE2X3QgbCA9ICppbisrOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQobCwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworICAgICAgICB9CiAgICAgfQogICAgIHQtPmluID0gaW47CiB9CkBAIC02MjQsMzcgKzgzNiw1NiBAQAogfQogCiAvLyBuby1vcCBjYXNlCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcChzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19ub3Aoc3RhdGVfdCogc3RhdGUpCiB7Ci0gICAgLy8gdGhpcyBhc3N1bWVzIG91dHB1dCAxNiBiaXRzIHN0ZXJlbywgbm8gcmVzYW1wbGluZwotICAgIG1lbXNldChvdXRwdXQsIDAsIHN0YXRlLT5mcmFtZUNvdW50KjQpOwotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0gICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKLSAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgewotICAgICAgICAgICAgdC5idWZmZXIuZnJhbWVDb3VudCA9IG91dEZyYW1lczsKLSAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgIGlmICghdC5idWZmZXIucmF3KSBicmVhazsKLSAgICAgICAgICAgIG91dEZyYW1lcyAtPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CisgICAgc2l6ZV90IGJ1ZlNpemUgPSBzdGF0ZS0+ZnJhbWVDb3VudCAqIHNpemVvZihpbnQxNl90KSAqIE1BWF9OVU1fQ0hBTk5FTFM7CisgICAgd2hpbGUgKGUwKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCisgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCisgICAgICAgIHVpbnQzMl90IGUxID0gZTAsIGUyID0gZTA7CisgICAgICAgIGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUxKTsKKyAgICAgICAgdHJhY2tfdCYgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICBlMiAmPSB+KDE8PGkpOworICAgICAgICB3aGlsZSAoZTIpIHsKKyAgICAgICAgICAgIGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTIpOworICAgICAgICAgICAgZTIgJj0gfigxPDxpKTsKKyAgICAgICAgICAgIHRyYWNrX3QmIHQyID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgIGlmIFVOTElLRUxZKHQyLm1haW5CdWZmZXIgIT0gdDEubWFpbkJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGUxICY9IH4oMTw8aSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZTAgJj0gfihlMSk7CisKKyAgICAgICAgbWVtc2V0KHQxLm1haW5CdWZmZXIsIDAsIGJ1ZlNpemUpOworCisgICAgICAgIHdoaWxlIChlMSkgeworICAgICAgICAgICAgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CisgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOworICAgICAgICAgICAgdDEgPSBzdGF0ZS0+dHJhY2tzW2ldOworICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OworICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcykgeworICAgICAgICAgICAgICAgIHQxLmJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0RnJhbWVzOworICAgICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0MS5idWZmZXIpOworICAgICAgICAgICAgICAgIGlmICghdDEuYnVmZmVyLnJhdykgYnJlYWs7CisgICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQxLmJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0MS5idWZmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiAvLyBnZW5lcmljIGNvZGUgd2l0aG91dCByZXNhbXBsaW5nCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUsIHZvaWQqIG91dHB1dCkKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKIHsKICAgICBpbnQzMl90IG91dFRlbXBbQkxPQ0tTSVpFICogTUFYX05VTV9DSEFOTkVMU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKIAogICAgIC8vIGFjcXVpcmUgZWFjaCB0cmFjaydzIGJ1ZmZlcgogICAgIHVpbnQzMl90IGVuYWJsZWRUcmFja3MgPSBzdGF0ZS0+ZW5hYmxlZFRyYWNrczsKLSAgICB1aW50MzJfdCBlbiA9IGVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKKyAgICB1aW50MzJfdCBlMCA9IGVuYWJsZWRUcmFja3M7CisgICAgd2hpbGUgKGUwKSB7CisgICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUwKTsKKyAgICAgICAgZTAgJj0gfigxPDxpKTsKICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwpAQCAtNjY2LDExMCArODk3LDE1NiBAQAogICAgICAgICAgICAgZW5hYmxlZFRyYWNrcyAmPSB+KDE8PGkpOwogICAgIH0KIAotICAgIC8vIHRoaXMgYXNzdW1lcyBvdXRwdXQgMTYgYml0cyBzdGVyZW8sIG5vIHJlc2FtcGxpbmcKLSAgICBpbnQzMl90KiBvdXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4ob3V0cHV0KTsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gc3RhdGUtPmZyYW1lQ291bnQ7Ci0gICAgZG8gewotICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKG91dFRlbXApKTsKLQotICAgICAgICBlbiA9IGVuYWJsZWRUcmFja3M7Ci0gICAgICAgIHdoaWxlIChlbikgewotICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgICAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgICAgIHRyYWNrX3QmIHQgPSBzdGF0ZS0+dHJhY2tzW2ldOwotICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IEJMT0NLU0laRTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGluRnJhbWVzID0gKHQuZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQuZnJhbWVDb3VudDsKLSAgICAgICAgICAgICAgICBpZiAoaW5GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXApOwotICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHQuZnJhbWVDb3VudCA9PSAwICYmIG91dEZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSAoQkxPQ0tTSVpFIC0gb3V0RnJhbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgPSB0LmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICB9CisgICAgZTAgPSBlbmFibGVkVHJhY2tzOworICAgIHdoaWxlIChlMCkgeworICAgICAgICAvLyBwcm9jZXNzIGJ5IGdyb3VwIG9mIHRyYWNrcyB3aXRoIHNhbWUgb3V0cHV0IGJ1ZmZlciB0bworICAgICAgICAvLyBvcHRpbWl6ZSBjYWNoZSB1c2UKKyAgICAgICAgdWludDMyX3QgZTEgPSBlMCwgZTIgPSBlMDsKKyAgICAgICAgaW50IGogPSAzMSAtIF9fYnVpbHRpbl9jbHooZTEpOworICAgICAgICB0cmFja190JiB0MSA9IHN0YXRlLT50cmFja3Nbal07CisgICAgICAgIGUyICY9IH4oMTw8aik7CisgICAgICAgIHdoaWxlIChlMikgeworICAgICAgICAgICAgaiA9IDMxIC0gX19idWlsdGluX2NseihlMik7CisgICAgICAgICAgICBlMiAmPSB+KDE8PGopOworICAgICAgICAgICAgdHJhY2tfdCYgdDIgPSBzdGF0ZS0+dHJhY2tzW2pdOworICAgICAgICAgICAgaWYgVU5MSUtFTFkodDIubWFpbkJ1ZmZlciAhPSB0MS5tYWluQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgZTEgJj0gfigxPDxqKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGRpdGhlckFuZENsYW1wKG91dCwgb3V0VGVtcCwgQkxPQ0tTSVpFKTsKLSAgICAgICAgb3V0ICs9IEJMT0NLU0laRTsKLSAgICAgICAgbnVtRnJhbWVzIC09IEJMT0NLU0laRTsKLSAgICB9IHdoaWxlIChudW1GcmFtZXMpOwotCisgICAgICAgIGUwICY9IH4oZTEpOworICAgICAgICAvLyB0aGlzIGFzc3VtZXMgb3V0cHV0IDE2IGJpdHMgc3RlcmVvLCBubyByZXNhbXBsaW5nCisgICAgICAgIGludDMyX3QgKm91dCA9IHQxLm1haW5CdWZmZXI7CisgICAgICAgIHNpemVfdCBudW1GcmFtZXMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKG91dFRlbXApKTsKKyAgICAgICAgICAgIGUyID0gZTE7CisgICAgICAgICAgICB3aGlsZSAoZTIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMik7CisgICAgICAgICAgICAgICAgZTIgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gQkxPQ0tTSVpFOworICAgICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGF1eCA9IHQuYXV4QnVmZmVyICsgbnVtRnJhbWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LmZyYW1lQ291bnQgPiBvdXRGcmFtZXMpP291dEZyYW1lczp0LmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAoQkxPQ0tTSVpFLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgaW5GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBVTkxJS0VMWShhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eCArPSBpbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodC5mcmFtZUNvdW50ID09IDAgJiYgb3V0RnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gKHN0YXRlLT5mcmFtZUNvdW50IC0gbnVtRnJhbWVzKSAtIChCTE9DS1NJWkUgLSBvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkVHJhY2tzICY9IH4oMTw8aSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTEgJj0gfigxPDxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHQuZnJhbWVDb3VudCA9IHQuYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIEJMT0NLU0laRSk7CisgICAgICAgICAgICBvdXQgKz0gQkxPQ0tTSVpFOworICAgICAgICAgICAgbnVtRnJhbWVzICs9IEJMT0NLU0laRTsKKyAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgc3RhdGUtPmZyYW1lQ291bnQpOworICAgIH0KIAogICAgIC8vIHJlbGVhc2UgZWFjaCB0cmFjaydzIGJ1ZmZlcgotICAgIGVuID0gZW5hYmxlZFRyYWNrczsKLSAgICB3aGlsZSAoZW4pIHsKLSAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW4pOwotICAgICAgICBlbiAmPSB+KDE8PGkpOworICAgIGUwID0gZW5hYmxlZFRyYWNrczsKKyAgICB3aGlsZSAoZTApIHsKKyAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZTApOworICAgICAgICBlMCAmPSB+KDE8PGkpOwogICAgICAgICB0cmFja190JiB0ID0gc3RhdGUtPnRyYWNrc1tpXTsKICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOwogICAgIH0KIH0KIAotLy8gZ2VuZXJpYyBjb2RlIHdpdGggcmVzYW1wbGluZwotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQorCisgIC8vIGdlbmVyaWMgY29kZSB3aXRoIHJlc2FtcGxpbmcKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpCiB7CiAgICAgaW50MzJfdCogY29uc3Qgb3V0VGVtcCA9IHN0YXRlLT5vdXRwdXRUZW1wOwogICAgIGNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKGludDMyX3QpICogTUFYX05VTV9DSEFOTkVMUyAqIHN0YXRlLT5mcmFtZUNvdW50OwogICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplKTsKIAotICAgIGludDMyX3QqIG91dCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihvdXRwdXQpOwogICAgIHNpemVfdCBudW1GcmFtZXMgPSBzdGF0ZS0+ZnJhbWVDb3VudDsKIAotICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07Ci0KLSAgICAgICAgLy8gdGhpcyBpcyBhIGxpdHRsZSBnb29meSwgb24gdGhlIHJlc2FtcGxpbmcgY2FzZSB3ZSBkb24ndAotICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKLSAgICAgICAgLy8gdGhlIHJlc2FtcGxlci4KLSAgICAgICAgaWYgKCh0Lm5lZWRzICYgTkVFRFNfUkVTQU1QTEVfX01BU0spID09IE5FRURTX1JFU0FNUExFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgICh0Lmhvb2spKCZ0LCBvdXRUZW1wLCBudW1GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXApOwotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gbnVtRnJhbWVzOwotICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKLSAgICAgICAgICAgICAgICB0LmJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0RnJhbWVzOwotICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB0LmluID0gdC5idWZmZXIucmF3OwotICAgICAgICAgICAgICAgIC8vIHQuaW4gPT0gTlVMTCBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwotICAgICAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgICAgICAgICAgICAgIGlmICh0LmluID09IE5VTEwpIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgKHQuaG9vaykoJnQsIG91dFRlbXAgKyAobnVtRnJhbWVzLW91dEZyYW1lcykqTUFYX05VTV9DSEFOTkVMUywgdC5idWZmZXIuZnJhbWVDb3VudCwgc3RhdGUtPnJlc2FtcGxlVGVtcCk7Ci0gICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQuYnVmZmVyLmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgIHVpbnQzMl90IGUwID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CisgICAgd2hpbGUgKGUwKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyCisgICAgICAgIC8vIHRvIG9wdGltaXplIGNhY2hlIHVzZQorICAgICAgICB1aW50MzJfdCBlMSA9IGUwLCBlMiA9IGUwOworICAgICAgICBpbnQgaiA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CisgICAgICAgIHRyYWNrX3QmIHQxID0gc3RhdGUtPnRyYWNrc1tqXTsKKyAgICAgICAgZTIgJj0gfigxPDxqKTsKKyAgICAgICAgd2hpbGUgKGUyKSB7CisgICAgICAgICAgICBqID0gMzEgLSBfX2J1aWx0aW5fY2x6KGUyKTsKKyAgICAgICAgICAgIGUyICY9IH4oMTw8aik7CisgICAgICAgICAgICB0cmFja190JiB0MiA9IHN0YXRlLT50cmFja3Nbal07CisgICAgICAgICAgICBpZiBVTkxJS0VMWSh0Mi5tYWluQnVmZmVyICE9IHQxLm1haW5CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBlMSAmPSB+KDE8PGopOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQorICAgICAgICBlMCAmPSB+KGUxKTsKKyAgICAgICAgaW50MzJfdCAqb3V0ID0gdDEubWFpbkJ1ZmZlcjsKKyAgICAgICAgd2hpbGUgKGUxKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlMSk7CisgICAgICAgICAgICBlMSAmPSB+KDE8PGkpOworICAgICAgICAgICAgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CisgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOworICAgICAgICAgICAgaWYgVU5MSUtFTFkoKHQubmVlZHMgJiBORUVEU19BVVhfX01BU0spID09IE5FRURTX0FVWF9FTkFCTEVEKSB7CisgICAgICAgICAgICAgICAgYXV4ID0gdC5hdXhCdWZmZXI7CisgICAgICAgICAgICB9CiAKLSAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIG51bUZyYW1lcyk7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGEgbGl0dGxlIGdvb2Z5LCBvbiB0aGUgcmVzYW1wbGluZyBjYXNlIHdlIGRvbid0CisgICAgICAgICAgICAvLyBhY3F1aXJlL3JlbGVhc2UgdGhlIGJ1ZmZlcnMgYmVjYXVzZSBpdCdzIGRvbmUgYnkKKyAgICAgICAgICAgIC8vIHRoZSByZXNhbXBsZXIuCisgICAgICAgICAgICBpZiAoKHQubmVlZHMgJiBORUVEU19SRVNBTVBMRV9fTUFTSykgPT0gTkVFRFNfUkVTQU1QTEVfRU5BQkxFRCkgeworICAgICAgICAgICAgICAgICh0Lmhvb2spKCZ0LCBvdXRUZW1wLCBudW1GcmFtZXMsIHN0YXRlLT5yZXNhbXBsZVRlbXAsIGF1eCk7CisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IDA7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzIDwgbnVtRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyLmZyYW1lQ291bnQgPSBudW1GcmFtZXMgLSBvdXRGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHQuYnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgdC5pbiA9IHQuYnVmZmVyLnJhdzsKKyAgICAgICAgICAgICAgICAgICAgLy8gdC5pbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAodC5pbiA9PSBOVUxMKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBpZiBVTkxJS0VMWShhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAodC5ob29rKSgmdCwgb3V0VGVtcCArIG91dEZyYW1lcypNQVhfTlVNX0NIQU5ORUxTLCB0LmJ1ZmZlci5mcmFtZUNvdW50LCBzdGF0ZS0+cmVzYW1wbGVUZW1wLCBhdXgpOworICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgKz0gdC5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdC5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC5idWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkaXRoZXJBbmRDbGFtcChvdXQsIG91dFRlbXAsIG51bUZyYW1lcyk7CisgICAgfQogfQogCiAvLyBvbmUgdHJhY2ssIDE2IGJpdHMgc3RlcmVvIHdpdGhvdXQgcmVzYW1wbGluZyBpcyB0aGUgbW9zdCBjb21tb24gY2FzZQotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQordm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX19PbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSkKIHsKICAgICBjb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihzdGF0ZS0+ZW5hYmxlZFRyYWNrcyk7CiAgICAgY29uc3QgdHJhY2tfdCYgdCA9IHN0YXRlLT50cmFja3NbaV07CiAKICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC5idWZmZXIpOwotICAgCi0gICAgaW50MzJfdCogb3V0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KG91dHB1dCk7CisKKyAgICBpbnQzMl90KiBvdXQgPSB0Lm1haW5CdWZmZXI7CiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwotICAKKwogICAgIGNvbnN0IGludDE2X3QgdmwgPSB0LnZvbHVtZVswXTsKICAgICBjb25zdCBpbnQxNl90IHZyID0gdC52b2x1bWVbMV07CiAgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC52b2x1bWVSTDsKQEAgLTc4Nyw3ICsxMDY0LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OwotICAgICAgIAorCiAgICAgICAgIGlmIChVTkxJS0VMWSh1aW50MzJfdCh2bCkgPiBVTklUWV9HQUlOIHx8IHVpbnQzMl90KHZyKSA+IFVOSVRZX0dBSU4pKSB7CiAgICAgICAgICAgICAvLyB2b2x1bWUgaXMgYm9vc3RlZCwgc28gd2UgbWlnaHQgbmVlZCB0byBjbGFtcCBldmVuIHRob3VnaAogICAgICAgICAgICAgLy8gd2UgcHJvY2VzcyBvbmx5IG9uZSB0cmFjay4KQEAgLTgxNiw3ICsxMDkzLDkgQEAKIH0KIAogLy8gMiB0cmFja3MgaXMgYWxzbyBhIGNvbW1vbiBjYXNlCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KQorLy8gTkVWRVIgdXNlZCBpbiBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3NfX3ZhbGlkYXRlKCkKKy8vIG9ubHkgdXNlIGlmIHRoZSAyIHRyYWNrcyBoYXZlIHRoZSBzYW1lIG91dHB1dCBidWZmZXIKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fVHdvVHJhY2tzMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKQogewogICAgIGludCBpOwogICAgIHVpbnQzMl90IGVuID0gc3RhdGUtPmVuYWJsZWRUcmFja3M7CkBAIC04MjksMjQgKzExMDgsMjUgQEAKICAgICBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KGVuKTsKICAgICBjb25zdCB0cmFja190JiB0MSA9IHN0YXRlLT50cmFja3NbaV07CiAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyJiBiMSh0MS5idWZmZXIpOwotICAgCisKICAgICBpbnQxNl90IGNvbnN0ICppbjA7CiAgICAgY29uc3QgaW50MTZfdCB2bDAgPSB0MC52b2x1bWVbMF07CiAgICAgY29uc3QgaW50MTZfdCB2cjAgPSB0MC52b2x1bWVbMV07CiAgICAgc2l6ZV90IGZyYW1lQ291bnQwID0gMDsKLSAgCisKICAgICBpbnQxNl90IGNvbnN0ICppbjE7CiAgICAgY29uc3QgaW50MTZfdCB2bDEgPSB0MS52b2x1bWVbMF07CiAgICAgY29uc3QgaW50MTZfdCB2cjEgPSB0MS52b2x1bWVbMV07CiAgICAgc2l6ZV90IGZyYW1lQ291bnQxID0gMDsKLSAgIAotICAgIGludDMyX3QqIG91dCA9IHN0YXRpY19jYXN0PGludDMyX3QqPihvdXRwdXQpOworCisgICAgLy9GSVhNRTogb25seSB3b3JrcyBpZiB0d28gdHJhY2tzIHVzZSBzYW1lIGJ1ZmZlcgorICAgIGludDMyX3QqIG91dCA9IHQwLm1haW5CdWZmZXI7CiAgICAgc2l6ZV90IG51bUZyYW1lcyA9IHN0YXRlLT5mcmFtZUNvdW50OwogICAgIGludDE2X3QgY29uc3QgKmJ1ZmYgPSBOVUxMOwogCi0gIAorCiAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgCisKICAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKICAgICAgICAgICAgIGIwLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CiAgICAgICAgICAgICB0MC5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYjApOwpAQCAtODc1LDEzICsxMTU1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmcmFtZUNvdW50MSA9IGIxLmZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICAgICAKKwogICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gZnJhbWVDb3VudDAgPCBmcmFtZUNvdW50MT9mcmFtZUNvdW50MDpmcmFtZUNvdW50MTsKIAogICAgICAgICBudW1GcmFtZXMgLT0gb3V0RnJhbWVzOwogICAgICAgICBmcmFtZUNvdW50MCAtPSBvdXRGcmFtZXM7CiAgICAgICAgIGZyYW1lQ291bnQxIC09IG91dEZyYW1lczsKLSAgICAgICAKKwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBpbnQzMl90IGwwID0gKmluMCsrOwogICAgICAgICAgICAgaW50MzJfdCByMCA9ICppbjArKzsKQEAgLTg5NiwxNyArMTE3NiwxNyBAQAogICAgICAgICAgICAgciA9IGNsYW1wMTYocik7CiAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwogICAgICAgICB9IHdoaWxlICgtLW91dEZyYW1lcyk7Ci0gICAgICAgCisKICAgICAgICAgaWYgKGZyYW1lQ291bnQwID09IDApIHsKICAgICAgICAgICAgIHQwLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZyYW1lQ291bnQxID09IDApIHsKICAgICAgICAgICAgIHQxLmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiMSk7CiAgICAgICAgIH0KLSAgICB9ICAgCi0gICAgICAgCisgICAgfQorCiAgICAgaWYgKGJ1ZmYgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgW10gYnVmZjsgICAgICAgCisgICAgICAgIGRlbGV0ZSBbXSBidWZmOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggMTU3NjZjZC4uYWVlM2UxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC02MywxMSArNjMsMTQgQEAKICAgICAgICAgLy8gZm9yIHRhcmdldCBUUkFDSwogICAgICAgICBDSEFOTkVMX0NPVU5UICAgPSAweDQwMDAsCiAgICAgICAgIEZPUk1BVCAgICAgICAgICA9IDB4NDAwMSwKKyAgICAgICAgTUFJTl9CVUZGRVIgICAgID0gMHg0MDAyLAorICAgICAgICBBVVhfQlVGRkVSICAgICAgPSAweDQwMDMsCiAgICAgICAgIC8vIGZvciBUQVJHRVQgUkVTQU1QTEUKICAgICAgICAgU0FNUExFX1JBVEUgICAgID0gMHg0MTAwLAogICAgICAgICAvLyBmb3IgVEFSR0VUIFZPTFVNRSAoOCBjaGFubmVscyBtYXgpCiAgICAgICAgIFZPTFVNRTAgICAgICAgICA9IDB4NDIwMCwKICAgICAgICAgVk9MVU1FMSAgICAgICAgID0gMHg0MjAxLAorICAgICAgICBBVVhMRVZFTCAgICAgICAgPSAweDQyMTAsCiAgICAgfTsKIAogCkBAIC03OCwxMCArODEsMTAgQEAKICAgICBzdGF0dXNfdCAgICBkaXNhYmxlKGludCBuYW1lKTsKIAogICAgIHN0YXR1c190ICAgIHNldEFjdGl2ZVRyYWNrKGludCB0cmFjayk7Ci0gICAgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVyKGludCB0YXJnZXQsIGludCBuYW1lLCBpbnQgdmFsdWUpOworICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcihpbnQgdGFyZ2V0LCBpbnQgbmFtZSwgdm9pZCAqdmFsdWUpOwogCiAgICAgc3RhdHVzX3QgICAgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciogYnVmZmVyUHJvdmlkZXIpOwotICAgIHZvaWQgICAgICAgIHByb2Nlc3Modm9pZCogb3V0cHV0KTsKKyAgICB2b2lkICAgICAgICBwcm9jZXNzKCk7CiAKICAgICB1aW50MzJfdCAgICB0cmFja05hbWVzKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrTmFtZXM7IH0KIApAQCAtOTQsNiArOTcsNyBAQAogICAgICAgICBORUVEU19GT1JNQVRfX01BU0sgICAgICAgICAgPSAweDAwMDAwMEYwLAogICAgICAgICBORUVEU19NVVRFX19NQVNLICAgICAgICAgICAgPSAweDAwMDAwMTAwLAogICAgICAgICBORUVEU19SRVNBTVBMRV9fTUFTSyAgICAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBORUVEU19BVVhfX01BU0sgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTEwNyw2ICsxMTEsOSBAQAogCiAgICAgICAgIE5FRURTX1JFU0FNUExFX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCiAgICAgICAgIE5FRURTX1JFU0FNUExFX0VOQUJMRUQgICAgICA9IDB4MDAwMDEwMDAsCisKKyAgICAgICAgTkVFRFNfQVVYX0RJU0FCTEVEICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgIE5FRURTX0FVWF9FTkFCTEVEICAgICAgPSAweDAwMDEwMDAwLAogICAgIH07CiAKICAgICBzdGF0aWMgaW5saW5lIGludDMyX3QgYXBwbHlWb2x1bWUoaW50MzJfdCBpbiwgaW50MzJfdCB2KSB7CkBAIC0xMTUsOSArMTIyLDEwIEBACiAKIAogICAgIHN0cnVjdCBzdGF0ZV90OworICAgIHN0cnVjdCB0cmFja190OwogCi0gICAgdHlwZWRlZiB2b2lkICgqbWl4X3QpKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotCisgICAgdHlwZWRlZiB2b2lkICgqbWl4X3QpKHN0YXRlX3QqIHN0YXRlKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpob29rX3QpKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKICAgICBzdGF0aWMgY29uc3QgaW50IEJMT0NLU0laRSA9IDE2OyAvLyA0IGNhY2hlIGxpbmVzCiAKICAgICBzdHJ1Y3QgdHJhY2tfdCB7CkBAIC0xMzEsNiArMTM5LDkgQEAKICAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVsyXTsKIAogICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbMl07CisgICAgICAgIGludDMyX3QgICAgIGF1eExldmVsOworICAgICAgICBpbnQzMl90ICAgICBhdXhJbmM7CisgICAgICAgIGludDMyX3QgICAgIHByZXZBdXhMZXZlbDsKIAogICAgICAgICB1aW50MTZfdCAgICBmcmFtZUNvdW50OwogCkBAIC0xNDIsMTUgKzE1MywxNyBAQAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgICAgICAgICAgICBidWZmZXJQcm92aWRlcjsKICAgICAgICAgbXV0YWJsZSBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOwogCi0gICAgICAgIHZvaWQgKCpob29rKSh0cmFja190KiB0LCBpbnQzMl90KiBvdXRwdXQsIHNpemVfdCBudW1PdXRGcmFtZXMsIGludDMyX3QqIHRlbXApOworICAgICAgICBob29rX3QgICAgICBob29rOwogICAgICAgICB2b2lkIGNvbnN0KiBpbjsgICAgICAgICAgICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbiBidWZmZXIKIAogICAgICAgICBBdWRpb1Jlc2FtcGxlciogICAgIHJlc2FtcGxlcjsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBzYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90KiAgICAgICAgICAgbWFpbkJ1ZmZlcjsKKyAgICAgICAgaW50MzJfdCogICAgICAgICAgIGF1eEJ1ZmZlcjsKIAogICAgICAgICBib29sICAgICAgICBzZXRSZXNhbXBsZXIodWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CiAgICAgICAgIGJvb2wgICAgICAgIGRvZXNSZXNhbXBsZSgpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKCk7CisgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgpOwogICAgIH07CiAKICAgICAvLyBwYWQgdG8gMzItYnl0ZXMgdG8gZmlsbCBjYWNoZSBsaW5lCkBAIC0xNzMsMTggKzE4NiwxOSBAQAogCiAgICAgdm9pZCBpbnZhbGlkYXRlU3RhdGUodWludDMyX3QgbWFzayk7CiAKLSAgICBzdGF0aWMgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXApOwotICAgIHN0YXRpYyB2b2lkIHZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCk7Ci0gICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXApOwotICAgIHN0YXRpYyB2b2lkIHRyYWNrX18xNkJpdHNNb25vKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZSh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c1N0ZXJlbyh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CisgICAgc3RhdGljIHZvaWQgdHJhY2tfXzE2Qml0c01vbm8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgIHN0YXRpYyB2b2lkIHZvbHVtZVJhbXBTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKyAgICBzdGF0aWMgdm9pZCB2b2x1bWVTdGVyZW8odHJhY2tfdCogdCwgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKIAotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX3ZhbGlkYXRlKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX25vcChzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KTsKLSAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX09uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlLCB2b2lkKiBvdXRwdXQpOwotICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSwgdm9pZCogb3V0cHV0KTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX192YWxpZGF0ZShzdGF0ZV90KiBzdGF0ZSk7CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fbm9wKHN0YXRlX3QqIHN0YXRlKTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljTm9SZXNhbXBsaW5nKHN0YXRlX3QqIHN0YXRlKTsKKyAgICBzdGF0aWMgdm9pZCBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSk7CisgICAgc3RhdGljIHZvaWQgcHJvY2Vzc19fT25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoc3RhdGVfdCogc3RhdGUpOworICAgIHN0YXRpYyB2b2lkIHByb2Nlc3NfX1R3b1RyYWNrczE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZyhzdGF0ZV90KiBzdGF0ZSk7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZS5jcHAKaW5kZXggYzhiM2Y0OC4uNDI1Y2EzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5TWFuYWdlckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeU1hbmFnZXJCYXNlLmNwcApAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgIC8vIHJlcXVlc3Qgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgIHVpbnQzMl90IG5ld0RldmljZSA9IGdldE5ld0RldmljZShtSGFyZHdhcmVPdXRwdXQsIGZhbHNlKTsKICNpZmRlZiBXSVRIX0EyRFAKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKG5ld0RldmljZSk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogICAgICAgICAvLyBBMkRQIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKICAgICAgICAgaWYgKHN0YXRlID09IEF1ZGlvU3lzdGVtOjpERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUgJiYgQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZShkZXZpY2UpKSB7CiAgICAgICAgICAgICBjbG9zZUEyZHBPdXRwdXRzKCk7CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCiAgICAgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwogI2lmZGVmIFdJVEhfQTJEUAotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyhuZXdEZXZpY2UpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWYgYSBTQ08gZGV2aWNlIGlzIHByZXNlbnQuCiAgICAgaWYgKG1BMmRwT3V0cHV0ICE9IDAgJiYgbVNjb0RldmljZUFkZHJlc3MgIT0gIiIpIHsKICAgICAgICAgaWYgKG9sZFN0YXRlID09IEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCkgewpAQCAtMzg2LDEzICszODYsMjggQEAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCiAgICAgdWludDMyX3QgbmV3RGV2aWNlID0gZ2V0TmV3RGV2aWNlKG1IYXJkd2FyZU91dHB1dCwgZmFsc2UpOwogI2lmZGVmIFdJVEhfQTJEUAotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyhuZXdEZXZpY2UpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogI2VuZGlmCiAgICAgdXBkYXRlRGV2aWNlRm9yU3RyYXRlZ3koKTsKICAgICBzZXRPdXRwdXREZXZpY2UobUhhcmR3YXJlT3V0cHV0LCBuZXdEZXZpY2UpOwogICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCkgewogICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMobUhhcmR3YXJlT3V0cHV0LCBuZXdEZXZpY2UpOwogICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICBpZiAoYWN0aXZlSW5wdXQgIT0gMCkgeworICAgICAgICBBdWRpb0lucHV0RGVzY3JpcHRvciAqaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihhY3RpdmVJbnB1dCk7CisgICAgICAgIG5ld0RldmljZSA9IGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKKyAgICAgICAgaWYgKG5ld0RldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHsKKyAgICAgICAgICAgIExPR1YoInNldEZvcmNlVXNlKCkgY2hhbmdpbmcgZGV2aWNlIGZyb20gJXggdG8gJXggZm9yIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBuZXdEZXZpY2UsIGFjdGl2ZUlucHV0KTsKKyAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSA9IG5ld0RldmljZTsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgKGludCluZXdEZXZpY2UpOworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoYWN0aXZlSW5wdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCiB9CiAKIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UpCkBAIC01MzgsOSArNTUzLDExIEBACiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewotICAgIExPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQiLCBvdXRwdXQsIHN0cmVhbSk7CisgICAgTE9HVigic3RhcnRPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKICAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwogICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgTE9HVygic3RhcnRPdXRwdXQoKSB1bmtub3cgb3V0cHV0ICVkIiwgb3V0cHV0KTsKQEAgLTU3NCw5ICs1OTEsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewotICAgIExPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCIsIG91dHB1dCwgc3RyZWFtKTsKKyAgICBMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CiAgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgIExPR1coInN0b3BPdXRwdXQoKSB1bmtub3cgb3V0cHV0ICVkIiwgb3V0cHV0KTsKQEAgLTYwMiw4ICs2MjEsMTIgQEAKICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZ2V0TmV3RGV2aWNlKG91dHB1dCkpOwogCiAjaWZkZWYgV0lUSF9BMkRQCi0gICAgICAgIGlmIChtQTJkcE91dHB1dCAhPSAwICYmICFhMmRwVXNlZEZvclNvbmlmaWNhdGlvbigpICYmIHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCBmYWxzZSwgbUEyZHBPdXRwdXQsIG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCktPm1MYXRlbmN5KjIpOworICAgICAgICBpZiAobUEyZHBPdXRwdXQgIT0gMCAmJiAhYTJkcFVzZWRGb3JTb25pZmljYXRpb24oKSAmJgorICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BMmRwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLnZhbHVlRm9yKG1IYXJkd2FyZU91dHB1dCktPm1MYXRlbmN5KjIpOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgaWYgKG91dHB1dCAhPSBtSGFyZHdhcmVPdXRwdXQpIHsKQEAgLTgyNiw2ICs4NDksODUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldE91dHB1dEZvckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoreworICAgIExPR1YoImdldE91dHB1dEZvckVmZmVjdCgpIik7CisgICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCisgICAgcmV0dXJuIGdldE91dHB1dChBdWRpb1N5c3RlbTo6TVVTSUMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBMT0dXKCJyZWdpc3RlckVmZmVjdCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtVG90YWxFZmZlY3RzQ3B1TG9hZCArIGRlc2MtPmNwdUxvYWQgPiBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpKSB7CisgICAgICAgIExPR1coInJlZ2lzdGVyRWZmZWN0KCkgQ1BVIExvYWQgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBDUFUgJWYgTUlQUyIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgKGZsb2F0KWRlc2MtPmNwdUxvYWQvMTApOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtVG90YWxFZmZlY3RzTWVtb3J5ICsgZGVzYy0+bWVtb3J5VXNhZ2UgPiBnZXRNYXhFZmZlY3RzTWVtb3J5KCkpIHsKKyAgICAgICAgTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAorICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBkZXNjLT5jcHVMb2FkOworICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgKz0gZGVzYy0+bWVtb3J5VXNhZ2U7CisgICAgTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIG91dHB1dCAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBvdXRwdXQsIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisKKyAgICBMT0dWKCJyZWdpc3RlckVmZmVjdCgpIENQVSAlZCwgbWVtb3J5ICVkIiwgZGVzYy0+Y3B1TG9hZCwgZGVzYy0+bWVtb3J5VXNhZ2UpOworICAgIExPR1YoIiAgdG90YWwgQ1BVICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisKKyAgICBFZmZlY3REZXNjcmlwdG9yICpwRGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7CisgICAgbWVtY3B5ICgmcERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIHBEZXNjLT5tT3V0cHV0ID0gb3V0cHV0OworICAgIHBEZXNjLT5tU3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneTsKKyAgICBwRGVzYy0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIG1FZmZlY3RzLmFkZChpZCwgcERlc2MpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbUVmZmVjdHMuaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBFZmZlY3REZXNjcmlwdG9yICpwRGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkIDwgcERlc2MtPm1EZXNjLmNwdUxvYWQpIHsKKyAgICAgICAgTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIENQVSBsb2FkICVkIHRvbyBoaWdoIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgcERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICAgICAgcERlc2MtPm1EZXNjLmNwdUxvYWQgPSBtVG90YWxFZmZlY3RzQ3B1TG9hZDsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQgLT0gcERlc2MtPm1EZXNjLmNwdUxvYWQ7CisgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2UpIHsKKyAgICAgICAgTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKyAgICAgICAgcERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSAtPSBwRGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7CisgICAgTE9HVigidW5yZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgSUQgJWQsIENQVSAlZCwgbWVtb3J5ICVkIiwKKyAgICAgICAgICAgIHBEZXNjLT5tRGVzYy5uYW1lLCBpZCwgcERlc2MtPm1EZXNjLmNwdUxvYWQsIHBEZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSk7CisgICAgTE9HVigiICB0b3RhbCBDUFUgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIG1FZmZlY3RzLnJlbW92ZUl0ZW0oaWQpOworICAgIGRlbGV0ZSBwRGVzYzsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6ZHVtcChpbnQgZmQpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CkBAIC04OTAsNiArOTkyLDE5IEBACiAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKICAgICB9CiAKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0JcbiIsCisgICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBtRWZmZWN0cy5rZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgbUVmZmVjdHMudmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorCisKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTkwMiw3ICsxMDE3LDggQEAKICNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAogICAgIFRocmVhZChmYWxzZSksCiAjZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgIG1QaG9uZVN0YXRlKEF1ZGlvU3lzdGVtOjpNT0RFX05PUk1BTCksIG1SaW5nZXJNb2RlKDApLCBtTXVzaWNTdG9wVGltZSgwKSwgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpCisgICAgbVBob25lU3RhdGUoQXVkaW9TeXN0ZW06Ok1PREVfTk9STUFMKSwgbVJpbmdlck1vZGUoMCksIG1NdXNpY1N0b3BUaW1lKDApLAorICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksIG1Ub3RhbEVmZmVjdHNNZW1vcnkoMCkKIHsKICAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKIApAQCAtOTM4LDYgKzEwNTQsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGFkZE91dHB1dChtSGFyZHdhcmVPdXRwdXQsIG91dHB1dERlc2MpOwogICAgICAgICBzZXRPdXRwdXREZXZpY2UobUhhcmR3YXJlT3V0cHV0LCAodWludDMyX3QpQXVkaW9TeXN0ZW06OkRFVklDRV9PVVRfU1BFQUtFUiwgdHJ1ZSk7CisgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQogICAgIH0KIAogICAgIHVwZGF0ZURldmljZUZvclN0cmF0ZWd5KCk7CkBAIC0xMTUyLDYgKzEyNjksOSBAQAogICAgIGlmIChtQTJkcE91dHB1dCkgewogICAgICAgICAvLyBhZGQgQTJEUCBvdXRwdXQgZGVzY3JpcHRvcgogICAgICAgICBhZGRPdXRwdXQobUEyZHBPdXRwdXQsIG91dHB1dERlc2MpOworCisgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQorCiAgICAgICAgIC8vIHNldCBpbml0aWFsIHN0cmVhbSB2b2x1bWUgZm9yIEEyRFAgZGV2aWNlCiAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhtQTJkcE91dHB1dCwgZGV2aWNlKTsKICAgICAgICAgaWYgKGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkpIHsKQEAgLTEyNDksNiArMTM2OSwxNyBAQAogICAgIExPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNsb3NpbmcgQTJEUCBhbmQgZHVwbGljYXRlZCBvdXRwdXQhIik7CiAKICAgICBpZiAobUR1cGxpY2F0ZWRPdXRwdXQgIT0gMCkgeworICAgICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IgKmR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtRHVwbGljYXRlZE91dHB1dCk7CisgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobUhhcmR3YXJlT3V0cHV0KTsKKyAgICAgICAgLy8gQXMgYWxsIGFjdGl2ZSB0cmFja3Mgb24gZHVwbGljYXRlZCBvdXRwdXQgd2lsbCBiZSBkZWxldGVkLAorICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiBoYXJkd2FyZSBvdXRwdXQsIHRoZSByZWZlcmVuY2UKKyAgICAgICAgLy8gY291bnQgZm9yIHRoZWlyIHN0cmVhbSB0eXBlIG11c3QgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkgb24KKyAgICAgICAgLy8gaGFyZHdhcmUgb3V0cHV0LgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgeworICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2ldOworICAgICAgICAgICAgaHdPdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksLXJlZkNvdW50KTsKKyAgICAgICAgfQorCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtRHVwbGljYXRlZE91dHB1dCk7CiAgICAgICAgIGRlbGV0ZSBtT3V0cHV0cy52YWx1ZUZvcihtRHVwbGljYXRlZE91dHB1dCk7CiAgICAgICAgIG1PdXRwdXRzLnJlbW92ZUl0ZW0obUR1cGxpY2F0ZWRPdXRwdXQpOwpAQCAtMTI1OCw2ICsxMzg5LDcgQEAKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgICAgIHBhcmFtLmFkZChTdHJpbmc4KCJjbG9zaW5nIiksIFN0cmluZzgoInRydWUiKSk7CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1BMmRwT3V0cHV0LCBwYXJhbS50b1N0cmluZygpKTsKKwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobUEyZHBPdXRwdXQpOwogICAgICAgICBkZWxldGUgbU91dHB1dHMudmFsdWVGb3IobUEyZHBPdXRwdXQpOwogICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG1BMmRwT3V0cHV0KTsKQEAgLTEyNjUsNzggKzEzOTcsNjUgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCAmbmV3RGV2aWNlKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCiB7CiAgICAgdWludDMyX3QgcHJldkRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKICAgICB1aW50MzJfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UpOwogICAgIGJvb2wgYTJkcFdhc1VzZWQgPSBBdWRpb1N5c3RlbTo6aXNBMmRwRGV2aWNlKChBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcykocHJldkRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSKSk7CiAgICAgYm9vbCBhMmRwSXNVc2VkID0gQXVkaW9TeXN0ZW06OmlzQTJkcERldmljZSgoQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMpKGN1ckRldmljZSAmIH5BdWRpb1N5c3RlbTo6REVWSUNFX09VVF9TUEVBS0VSKSk7Ci0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yICpod091dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtSGFyZHdhcmVPdXRwdXQpOwotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciAqYTJkcE91dHB1dERlc2M7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSAwOwogCiAgICAgaWYgKGEyZHBXYXNVc2VkICYmICFhMmRwSXNVc2VkKSB7CiAgICAgICAgIGJvb2wgZHVwVXNlZCA9IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcFdhc1VzZWQgJiYgKEF1ZGlvU3lzdGVtOjpwb3BDb3VudChwcmV2RGV2aWNlKSA9PSAyKTsKLQorICAgICAgICBkc3RPdXRwdXQgPSBtSGFyZHdhcmVPdXRwdXQ7CiAgICAgICAgIGlmIChkdXBVc2VkKSB7Ci0gICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIHN0cmF0ZWd5ICVkIHRvIGR1cGxpY2F0ZWQiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1EdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgZnJvbSBkdXBsaWNhdGVkIiwgc3RyYXRlZ3kpOworICAgICAgICAgICAgc3JjT3V0cHV0ID0gbUR1cGxpY2F0ZWRPdXRwdXQ7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIHN0cmF0ZWd5ICVkIHRvIGEyZHAiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1BMmRwT3V0cHV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBdWRpb1N5c3RlbTo6TlVNX1NUUkVBTV9UWVBFUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1PdXRwdXQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLCBtSGFyZHdhcmVPdXRwdXQpOwotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGEyZHBPdXRwdXREZXNjLT5tUmVmQ291bnRbaV07Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgZHVwbGljYXRlZCBvdXRwdXQsIHRoZSByZWYgY291bnQgaXMgZmlyc3QgaW5jcmVtZW50ZWQKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBkZWNyZW1lbnRlZCBvbiBoYXJkd2FyZSBvdXRwdXQgdHVzIGtlZXBpbmcgaXRzIHZhbHVlCi0gICAgICAgICAgICAgICAgaHdPdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksIHJlZkNvdW50KTsKLSAgICAgICAgICAgICAgICBhMmRwT3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLC1yZWZDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZG8gbm90IGNoYW5nZSBuZXdEZXZpY2UgaWYgaXQgd2FzIGFscmVhZHkgc2V0IGJlZm9yZSB0aGlzIGNhbGwgYnkgYSBwcmV2aW91cyBjYWxsIHRvCi0gICAgICAgIC8vIGdldE5ld0RldmljZSgpIG9yIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBmb3IgYSBzdHJhdGVneSB3aXRoIGhpZ2hlciBwcmlvcml0eQotICAgICAgICBpZiAobmV3RGV2aWNlID09IDAgJiYgaHdPdXRwdXREZXNjLT5pc1VzZWRCeVN0cmF0ZWd5KHN0cmF0ZWd5KSkgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlKTsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgZnJvbSBhMmRwIiwgc3RyYXRlZ3kpOworICAgICAgICAgICAgc3JjT3V0cHV0ID0gbUEyZHBPdXRwdXQ7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGEyZHBJc1VzZWQgJiYgIWEyZHBXYXNVc2VkKSB7CiAgICAgICAgIGJvb2wgZHVwVXNlZCA9IGEyZHBVc2VkRm9yU29uaWZpY2F0aW9uKCkgJiYgYTJkcElzVXNlZCAmJiAoQXVkaW9TeXN0ZW06OnBvcENvdW50KGN1ckRldmljZSkgPT0gMik7Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGEyZHBPdXRwdXQ7Ci0KKyAgICAgICAgc3JjT3V0cHV0ID0gbUhhcmR3YXJlT3V0cHV0OwogICAgICAgICBpZiAoZHVwVXNlZCkgewotICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBzdHJhdGVneSAlZCBmcm9tIGR1cGxpY2F0ZWQiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1EdXBsaWNhdGVkT3V0cHV0KTsKLSAgICAgICAgICAgIGEyZHBPdXRwdXQgPSBtRHVwbGljYXRlZE91dHB1dDsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgdG8gZHVwbGljYXRlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIGRzdE91dHB1dCA9IG1EdXBsaWNhdGVkT3V0cHV0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBzdHJhdGVneSAlZCBmcm9tIGEyZHAiLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICBhMmRwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1BMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIGEyZHBPdXRwdXQgPSBtQTJkcE91dHB1dDsKKyAgICAgICAgICAgIExPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBtb3Zpbmcgc3RyYXRlZ3kgJWQgdG8gYTJkcCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIGRzdE91dHB1dCA9IG1BMmRwT3V0cHV0OwogICAgICAgICB9CisgICAgfQogCisgICAgaWYgKHNyY091dHB1dCAhPSAwICYmIGRzdE91dHB1dCAhPSAwKSB7CisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBFZmZlY3REZXNjcmlwdG9yICpkZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tU2Vzc2lvbiAhPSBBdWRpb1N5c3RlbTo6U0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVN0cmF0ZWd5ID09IHN0cmF0ZWd5ICYmCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1PdXRwdXQgPT0gc3JjT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwgbUVmZmVjdHMua2V5QXQoaSksIGRzdE91dHB1dCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKGRlc2MtPm1TZXNzaW9uLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgICAgICAgICAgZGVzYy0+bU91dHB1dCA9IGRzdE91dHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQXVkaW9TeXN0ZW06Ok5VTV9TVFJFQU1fVFlQRVM7IGkrKykgewogICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtT3V0cHV0KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSwgYTJkcE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gaHdPdXRwdXREZXNjLT5tUmVmQ291bnRbaV07Ci0gICAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgZHVwbGljYXRlZCBvdXRwdXQsIHRoZSByZWYgY291bnQgaXMgZmlyc3QgaW5jcmVtZW50ZWQKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBkZWNyZW1lbnRlZCBvbiBoYXJkd2FyZSBvdXRwdXQgdHVzIGtlZXBpbmcgaXRzIHZhbHVlCi0gICAgICAgICAgICAgICAgYTJkcE91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUpaSwgcmVmQ291bnQpOwotICAgICAgICAgICAgICAgIGh3T3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoKEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSlpLC1yZWZDb3VudCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbU91dHB1dCgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlKWksIGRzdE91dHB1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKHVpbnQzMl90ICZuZXdEZXZpY2UpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCiB7Ci0gICAgLy8gQ2hlY2sgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eSBzbyB0aGF0IG9uY2UgbmV3RGV2aWNlIGlzIHNldAotICAgIC8vIGZvciBhIGdpdmVuIHN0cmF0ZWd5IGl0IGlzIG5vdCBtb2RpZmllZCBieSBzdWJzZXF1ZW50IGNhbGxzIHRvCi0gICAgLy8gY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpCi0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgbmV3RGV2aWNlKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgbmV3RGV2aWNlKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBuZXdEZXZpY2UpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgbmV3RGV2aWNlKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKIH0KIAogI2VuZGlmCkBAIC0xMzcwLDggKzE0ODksMTIgQEAKICAgICByZXR1cm4gZGV2aWNlOwogfQogCi1BdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldFN0cmF0ZWd5KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pCi17Cit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7CisgICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOworfQorCitBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlckJhc2U6OmdldFN0cmF0ZWd5KAorICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKSB7CiAgICAgLy8gc3RyZWFtIHRvIHN0cmF0ZWd5IG1hcHBpbmcKICAgICBzd2l0Y2ggKHN0cmVhbSkgewogICAgIGNhc2UgQXVkaW9TeXN0ZW06OlZPSUNFX0NBTEw6CkBAIC0xODM1LDYgKzE5NTgsMTYgQEAKICAgICAgICAgICAoZm9ybWF0ICE9MCAmJiAhQXVkaW9TeXN0ZW06OmlzTGluZWFyUENNKGZvcm1hdCkpKTsKIH0KIAordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKQoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6Z2V0TWF4RWZmZWN0c01lbW9yeSgpCit7CisgICAgcmV0dXJuIE1BWF9FRkZFQ1RTX01FTU9SWTsKK30KKwogLy8gLS0tIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgogCiBBdWRpb1BvbGljeU1hbmFnZXJCYXNlOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpCkBAIC0xOTY4LDUgKzIxMDEsMjcgQEAKICAgICAgICAgICAgIG1DYW5CZU11dGVkKTsKIH0KIAorLy8gLS0tIEVmZmVjdERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyQmFzZTo6RWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgT3V0cHV0OiAlZFxuIiwgbU91dHB1dCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBiYjM5MDVjLi5mMjRlMDhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMTE5LDcgKzExOSw4IEBACiAgICAgaWYgKCFBdWRpb1N5c3RlbTo6aXNPdXRwdXREZXZpY2UoZGV2aWNlKSAmJiAhQXVkaW9TeXN0ZW06OmlzSW5wdXREZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9BVkFJTEFCTEUgJiYgc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgeworICAgIGlmIChzdGF0ZSAhPSBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgc3RhdGUgIT0gQXVkaW9TeXN0ZW06OkRFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMTI4LDggKzEyOSw5IEBACiAgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKIH0KIAotQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCitBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiB7CiAgICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6REVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwpAQCAtMTc1LDcgKzE3Nyw4IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKEF1ZGlvU3lzdGVtOjpmb3JjZV91c2UgdXNhZ2UsIEF1ZGlvU3lzdGVtOjpmb3JjZWRfY29uZmlnIGNvbmZpZykKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoQXVkaW9TeXN0ZW06OmZvcmNlX3VzZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmZvcmNlZF9jb25maWcgY29uZmlnKQogewogICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTIyMywyNCArMjI2LDI4IEBACiAgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0KHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxzLCBmbGFncyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTE9HVigic3RhcnRPdXRwdXQoKSB0aWQgJWQiLCBnZXR0aWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbXBQb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChvdXRwdXQsIHN0cmVhbSk7CisgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uKQogewogICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgTE9HVigic3RvcE91dHB1dCgpIHRpZCAlZCIsIGdldHRpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0pOworICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCkBAIC0zMzksOCArMzQ2LDQ2IEBACiAgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCk7CiB9CiAKK3VpbnQzMl90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKK3sKKyAgICBpZiAobXBQb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisgICAgaWYgKG1wUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtcFBvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckVmZmVjdChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKQoreworICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgb3V0cHV0LCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtcFBvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1wUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKLSAgICBMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIHRpZCAlZCwgY2FsbGluZyB0aWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLCBnZXR0aWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIHRpZCAlZCwgY2FsbGluZyB0aWQgJWQiLCB3aG8udW5zYWZlX2dldCgpLCBnZXR0aWQoKSwKKyAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiB9CiAKIHN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQpAQCAtNDQ3LDEwICs0OTIsMTYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KHBEZXZpY2VzLCBwU2FtcGxpbmdSYXRlLCAodWludDMyX3QgKilwRm9ybWF0LCBwQ2hhbm5lbHMsIHBMYXRlbmN5TXMsIGZsYWdzKTsKKyAgICByZXR1cm4gYWYtPm9wZW5PdXRwdXQocERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKXBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcExhdGVuY3lNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6b3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpCiB7CiAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgewpAQCAtNTE0LDEyICs1NjUsMTYgQEAKICAgICByZXR1cm4gYWYtPmNsb3NlSW5wdXQoaW5wdXQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnZvbHVtZUNvbW1hbmQoKGludClzdHJlYW0sIHZvbHVtZSwgKGludClvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbU91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN0cmVhbU91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogewogICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKQEAgLTUyNyw4ICs1ODIsMTggQEAKICAgICByZXR1cm4gYWYtPnNldFN0cmVhbU91dHB1dChzdHJlYW0sIG91dHB1dCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bW92ZUVmZmVjdHMoaW50IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zKQorICAgIHJldHVybiBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbiwgKGludClzcmNPdXRwdXQsIChpbnQpZHN0T3V0cHV0KTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCiB7CiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+cGFyYW1ldGVyc0NvbW1hbmQoKGludClpb0hhbmRsZSwga2V5VmFsdWVQYWlycywgZGVsYXlNcyk7CiB9CkBAIC01MzksNyArNjA0LDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0VG9uZShUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdG9uZSwgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRUb25lKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0b25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSkKIHsKICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5zdGFydFRvbmVDb21tYW5kKHRvbmUsIHN0cmVhbSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNjIzLDggKzY4OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOwotICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+bVdhaXRTdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdChtTG9jayk7CkBAIC02MzMsNyArNzAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtOwotICAgICAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCBwYXJhbWV0ZXJzIHN0cmluZyAlcywgaW8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1Db25kLnNpZ25hbCgpOwpAQCAtNjQzLDcgKzcxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW07Ci0gICAgICAgICAgICAgICAgICAgIExPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvaWNlIHZvbHVtZSB2b2x1bWUgJWYiLCBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLT5tV2FpdFN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bUNvbmQuc2lnbmFsKCk7CkBAIC03MzQsNyArODA1LDEwIEBACiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGludCBzdHJlYW0sIGZsb2F0IHZvbHVtZSwgaW50IG91dHB1dCwgaW50IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6dm9sdW1lQ29tbWFuZChpbnQgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCkBAIC03NTIsNyArODI2LDggQEAKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpbnNlcnRDb21tYW5kX2woY29tbWFuZCwgZGVsYXlNcyk7Ci0gICAgTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIHN0cmVhbSwgdm9sdW1lLCBvdXRwdXQpOworICAgIExPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgdm9sdW1lIHN0cmVhbSAlZCwgdm9sdW1lICVmLCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CiAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwpAQCAtNzYyLDcgKzgzNyw5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnBhcmFtZXRlcnNDb21tYW5kKGludCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycywgaW50IGRlbGF5TXMpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cGFyYW1ldGVyc0NvbW1hbmQoaW50IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKQEAgLTc3OSw3ICs4NTYsOCBAQAogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGluc2VydENvbW1hbmRfbChjb21tYW5kLCBkZWxheU1zKTsKLSAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsIGtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICBMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHBhcmFtZXRlciBzdHJpbmcgJXMsIGlvICVkICxkZWxheSAlZCIsCisgICAgICAgICAgICBrZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBpb0hhbmRsZSwgZGVsYXlNcyk7CiAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgaWYgKGNvbW1hbmQtPm1XYWl0U3RhdHVzKSB7CiAgICAgICAgIGNvbW1hbmQtPm1Db25kLndhaXQobUxvY2spOwpAQCAtODQwLDcgKzkxOCw4IEBACiAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbTsKICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhMiA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07CiAgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwotICAgICAgICAgICAgTE9HVigiQ29tcGFyaW5nIHBhcmFtZXRlciBjb21tYW5kICVzIHRvIG5ldyBjb21tYW5kICVzIiwgZGF0YTItPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpLCBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgICAgICAgICBMT0dWKCJDb21wYXJpbmcgcGFyYW1ldGVyIGNvbW1hbmQgJXMgdG8gbmV3IGNvbW1hbmQgJXMiLAorICAgICAgICAgICAgICAgICAgICBkYXRhMi0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1LZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGF0YS0+bUtleVZhbHVlUGFpcnMpOwogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0yID0gQXVkaW9QYXJhbWV0ZXIoZGF0YTItPm1LZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGFyYW0uc2l6ZSgpOyBqKyspIHsKQEAgLTg3Miw3ICs5NTEsOCBAQAogICAgICAgICAgICAgVm9sdW1lRGF0YSAqZGF0YTIgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQyLT5tUGFyYW07CiAgICAgICAgICAgICBpZiAoZGF0YS0+bUlPICE9IGRhdGEyLT5tSU8pIGJyZWFrOwogICAgICAgICAgICAgaWYgKGRhdGEtPm1TdHJlYW0gIT0gZGF0YTItPm1TdHJlYW0pIGJyZWFrOwotICAgICAgICAgICAgTE9HVigiRmlsdGVyaW5nIG91dCB2b2x1bWUgY29tbWFuZCBvbiBvdXRwdXQgJWQgZm9yIHN0cmVhbSAlZCIsIGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSk7CisgICAgICAgICAgICBMT0dWKCJGaWx0ZXJpbmcgb3V0IHZvbHVtZSBjb21tYW5kIG9uIG91dHB1dCAlZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtKTsKICAgICAgICAgICAgIHJlbW92ZWRDb21tYW5kcy5hZGQoY29tbWFuZDIpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVJUX1RPTkU6CkBAIC04OTYsNyArOTc2LDggQEAKICAgICByZW1vdmVkQ29tbWFuZHMuY2xlYXIoKTsKIAogICAgIC8vIGluc2VydCBjb21tYW5kIGF0IHRoZSByaWdodCBwbGFjZSBhY2NvcmRpbmcgdG8gaXRzIHRpbWUgc3RhbXAKLSAgICBMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsIGNvbW1hbmQtPm1Db21tYW5kLCAoaW50KWkrMSwgbUF1ZGlvQ29tbWFuZHMuc2l6ZSgpKTsKKyAgICBMT0dWKCJpbnNlcnRpbmcgY29tbWFuZDogJWQgYXQgaW5kZXggJWQsIG51bSBjb21tYW5kcyAlZCIsCisgICAgICAgICAgICBjb21tYW5kLT5tQ29tbWFuZCwgKGludClpKzEsIG1BdWRpb0NvbW1hbmRzLnNpemUoKSk7CiAgICAgbUF1ZGlvQ29tbWFuZHMuaW5zZXJ0QXQoY29tbWFuZCwgaSArIDEpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYTEzZDBiZC4uNTU4ZjQ1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1BvbGljeVNlcnZpY2UuaApAQCAtMjgsNyArMjgsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvUG9saWN5U2VydmljZTogcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLCBwdWJsaWMgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UsIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlOiBwdWJsaWMgQm5BdWRpb1BvbGljeVNlcnZpY2UsIHB1YmxpYyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSwKKyAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKIHsKIAogcHVibGljOgpAQCAtNDMsOCArNDQsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEF1ZGlvU3lzdGVtOjphdWRpb19kZXZpY2VzIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6ZGV2aWNlX2Nvbm5lY3Rpb25fc3RhdGUgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgQXVkaW9TeXN0ZW06OmRldmljZV9jb25uZWN0aW9uX3N0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBdWRpb1N5c3RlbTo6YXVkaW9fZGV2aWNlcyBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKKyAgICB2aXJ0dWFsIEF1ZGlvU3lzdGVtOjpkZXZpY2VfY29ubmVjdGlvbl9zdGF0ZSBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2RldmljZXMgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoaW50IHN0YXRlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJpbmdlck1vZGUodWludDMyX3QgbW9kZSwgdWludDMyX3QgbWFzayk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShBdWRpb1N5c3RlbTo6Zm9yY2VfdXNlIHVzYWdlLCBBdWRpb1N5c3RlbTo6Zm9yY2VkX2NvbmZpZyBjb25maWcpOwpAQCAtNTMsMTUgKzU1LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBdWRpb1N5c3RlbTo6Rk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MgPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0ZMQUdfSU5ESVJFQ1QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6b3V0cHV0X2ZsYWdzIGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpPVVRQVVRfRkxBR19JTkRJUkVDVCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24gPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiA9IDApOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dChpbnQgaW5wdXRTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gQXVkaW9TeXN0ZW06OkZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcyBhY291c3RpY3MgPSAoQXVkaW9TeXN0ZW06OmF1ZGlvX2luX2Fjb3VzdGljcykwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MgYWNvdXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF1ZGlvU3lzdGVtOjphdWRpb19pbl9hY291c3RpY3MpMCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CkBAIC03MSw2ICs3OSwxNiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoQXVkaW9TeXN0ZW06OnN0cmVhbV90eXBlIHN0cmVhbSwgaW50IGluZGV4KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0sIGludCAqaW5kZXgpOwogCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtKTsKKworICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtODksNyArMTA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcExhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpvdXRwdXRfZmxhZ3MgZmxhZ3MpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Mik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwpAQCAtOTksMTMgKzExOCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBDaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjb3VzdGljcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBmbG9hdCB2b2x1bWUsIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZShBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU91dHB1dChBdWRpb1N5c3RlbTo6c3RyZWFtX3R5cGUgc3RyZWFtLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCBpbnQgZGVsYXlNcyA9IDApOworICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFRvbmUoVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIHRvbmUsIEF1ZGlvU3lzdGVtOjpzdHJlYW1fdHlwZSBzdHJlYW0pOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCBkZjVjMTY2Li44Nzk3NWFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTEsMTUgKzEsMTQgQEAKIExPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQogCi0jCi0jIFNldCBVU0VfQ0FNRVJBX1NUVUIgZm9yIG5vbi1lbXVsYXRvciBhbmQgbm9uLXNpbXVsYXRvciBidWlsZHMsIGlmIHlvdSB3YW50Ci0jIHRoZSBjYW1lcmEgc2VydmljZSB0byB1c2UgdGhlIGZha2UgY2FtZXJhLiAgRm9yIGVtdWxhdG9yIG9yIHNpbXVsYXRvciBidWlsZHMsCi0jIHdlIGFsd2F5cyB1c2UgdGhlIGZha2UgY2FtZXJhLgorIyBTZXQgVVNFX0NBTUVSQV9TVFVCIGlmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUgaGFyZHdhcmUgY2FtZXJhLgorCisjIGZvcmNlIHRoZXNlIGJ1aWxkcyB0byB1c2UgY2FtZXJhIHN0dWIgb25seQoraWZuZXEgKCQoZmlsdGVyIHNvb25lciBnZW5lcmljIHNpbSwkKFRBUkdFVF9ERVZJQ0UpKSwpCisgIFVTRV9DQU1FUkFfU1RVQjo9dHJ1ZQorZW5kaWYKIAogaWZlcSAoJChVU0VfQ0FNRVJBX1NUVUIpLCkKLVVTRV9DQU1FUkFfU1RVQjo9ZmFsc2UKLWlmbmVxICgkKGZpbHRlciBzb29uZXIgZ2VuZXJpYyBzaW0sJChUQVJHRVRfREVWSUNFKSksKQotVVNFX0NBTUVSQV9TVFVCOj10cnVlCi1lbmRpZiAjbGliY2FtZXJhc3R1YgorICBVU0VfQ0FNRVJBX1NUVUI6PWZhbHNlCiBlbmRpZgogCiBpZmVxICgkKFVTRV9DQU1FUkFfU1RVQiksdHJ1ZSkKQEAgLTU0LDE4ICs1MywxNCBAQAogCiBMT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmFzZXJ2aWNlCiAKLUxPQ0FMX0NGTEFHUyArPSAtRExPR19UQUc9XCJDYW1lcmFTZXJ2aWNlXCIKLQogaWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQogTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1BST0NFU1MKIGVuZGlmCiAKIGlmZXEgKCQoVVNFX0NBTUVSQV9TVFVCKSwgdHJ1ZSkKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliY2FtZXJhc3R1YgotTE9DQUxfQ0ZMQUdTICs9IC1pbmNsdWRlIENhbWVyYUhhcmR3YXJlU3R1Yi5oCiBlbHNlCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmNhbWVyYSAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5jcHAKaW5kZXggOGI2NjM4OS4uYjNlMGVlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFIYXJkd2FyZVN0dWIuY3BwCkBAIC00NywxNCArNDcsMTQgQEAKIHsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHA7CiAKLSAgICBwLnNldCgicHJldmlldy1zaXplLXZhbHVlcyIsIjMyMHgyNDAiKTsKKyAgICBwLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsICIzMjB4MjQwIik7CiAgICAgcC5zZXRQcmV2aWV3U2l6ZSgzMjAsIDI0MCk7CiAgICAgcC5zZXRQcmV2aWV3RnJhbWVSYXRlKDE1KTsKLSAgICBwLnNldFByZXZpZXdGb3JtYXQoInl1djQyMnNwIik7CisgICAgcC5zZXRQcmV2aWV3Rm9ybWF0KENhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCk7CiAKLSAgICBwLnNldCgicGljdHVyZS1zaXplLXZhbHVlcyIsICIzMjB4MjQwIik7CisgICAgcC5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTLCAiMzIweDI0MCIpOwogICAgIHAuc2V0UGljdHVyZVNpemUoMzIwLCAyNDApOwotICAgIHAuc2V0UGljdHVyZUZvcm1hdCgianBlZyIpOworICAgIHAuc2V0UGljdHVyZUZvcm1hdChDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFRyk7CiAKICAgICBpZiAoc2V0UGFyYW1ldGVycyhwKSAhPSBOT19FUlJPUikgewogICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGRlZmF1bHQgcGFyYW1ldGVycz8hIik7CkBAIC02NiwxNCArNjYsMTQgQEAKICAgICAvLyBDcmVhdGUgcmF3IGhlYXAuCiAgICAgaW50IHBpY3R1cmVfd2lkdGgsIHBpY3R1cmVfaGVpZ2h0OwogICAgIG1QYXJhbWV0ZXJzLmdldFBpY3R1cmVTaXplKCZwaWN0dXJlX3dpZHRoLCAmcGljdHVyZV9oZWlnaHQpOwotICAgIG1SYXdIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHBpY3R1cmVfd2lkdGggKiAyICogcGljdHVyZV9oZWlnaHQpOworICAgIG1SYXdIZWFwID0gbmV3IE1lbW9yeUhlYXBCYXNlKHBpY3R1cmVfd2lkdGggKiBwaWN0dXJlX2hlaWdodCAqIDMgLyAyKTsKIAogICAgIGludCBwcmV2aWV3X3dpZHRoLCBwcmV2aWV3X2hlaWdodDsKICAgICBtUGFyYW1ldGVycy5nZXRQcmV2aWV3U2l6ZSgmcHJldmlld193aWR0aCwgJnByZXZpZXdfaGVpZ2h0KTsKICAgICBMT0dEKCJpbml0SGVhcExvY2tlZDogcHJldmlldyBzaXplPSVkeCVkIiwgcHJldmlld193aWR0aCwgcHJldmlld19oZWlnaHQpOwogCi0gICAgLy8gTm90ZSB0aGF0IHdlIGVuZm9yY2UgeXV2NDIyIGluIHNldFBhcmFtZXRlcnMoKS4KLSAgICBpbnQgaG93X2JpZyA9IHByZXZpZXdfd2lkdGggKiBwcmV2aWV3X2hlaWdodCAqIDI7CisgICAgLy8gTm90ZSB0aGF0IHdlIGVuZm9yY2UgeXV2NDIwc3AgaW4gc2V0UGFyYW1ldGVycygpLgorICAgIGludCBob3dfYmlnID0gcHJldmlld193aWR0aCAqIHByZXZpZXdfaGVpZ2h0ICogMyAvIDI7CiAKICAgICAvLyBJZiB3ZSBhcmUgYmVpbmcgcmVpbml0aWFsaXplZCB0byB0aGUgc2FtZSBzaXplIGFzIGJlZm9yZSwgbm8KICAgICAvLyB3b3JrIG5lZWRzIHRvIGJlIGRvbmUuCkBAIC05OSw3ICs5OSw2IEBACiB7CiAgICAgZGVsZXRlIG1GYWtlQ2FtZXJhOwogICAgIG1GYWtlQ2FtZXJhID0gMDsgLy8gcGFyYW5vaWEKLSAgICBzaW5nbGV0b24uY2xlYXIoKTsKIH0KIAogc3A8SU1lbW9yeUhlYXA+IENhbWVyYUhhcmR3YXJlU3R1Yjo6Z2V0UHJldmlld0hlYXAoKSBjb25zdApAQCAtMTc1LDcgKzE3NCw3IEBACiAKICAgICAgICAgLy8gRmlsbCB0aGUgY3VycmVudCBmcmFtZSB3aXRoIHRoZSBmYWtlIGNhbWVyYS4KICAgICAgICAgdWludDhfdCAqZnJhbWUgPSAoKHVpbnQ4X3QgKiliYXNlKSArIG9mZnNldDsKLSAgICAgICAgZmFrZUNhbWVyYS0+Z2V0TmV4dEZyYW1lQXNZdXY0MjIoZnJhbWUpOworICAgICAgICBmYWtlQ2FtZXJhLT5nZXROZXh0RnJhbWVBc1l1djQyMChmcmFtZSk7CiAKICAgICAgICAgLy9MT0dWKCJwcmV2aWV3VGhyZWFkOiBnZW5lcmF0ZWQgZnJhbWUgdG8gYnVmZmVyICVkIiwgbUN1cnJlbnRQcmV2aWV3RnJhbWUpOwogCkBAIC0yODgsOSArMjg3LDkgQEAKICAgICAgICAgLy8gSW4gdGhlIG1lYW50aW1lIGp1c3QgbWFrZSBhbm90aGVyIGZha2UgY2FtZXJhIHBpY3R1cmUuCiAgICAgICAgIGludCB3LCBoOwogICAgICAgICBtUGFyYW1ldGVycy5nZXRQaWN0dXJlU2l6ZSgmdywgJmgpOwotICAgICAgICBzcDxNZW1vcnlCYXNlPiBtZW0gPSBuZXcgTWVtb3J5QmFzZShtUmF3SGVhcCwgMCwgdyAqIDIgKiBoKTsKKyAgICAgICAgc3A8TWVtb3J5QmFzZT4gbWVtID0gbmV3IE1lbW9yeUJhc2UobVJhd0hlYXAsIDAsIHcgKiBoICogMyAvIDIpOwogICAgICAgICBGYWtlQ2FtZXJhIGNhbSh3LCBoKTsKLSAgICAgICAgY2FtLmdldE5leHRGcmFtZUFzWXV2NDIyKCh1aW50OF90ICopbVJhd0hlYXAtPmJhc2UoKSk7CisgICAgICAgIGNhbS5nZXROZXh0RnJhbWVBc1l1djQyMCgodWludDhfdCAqKW1SYXdIZWFwLT5iYXNlKCkpOwogICAgICAgICBtRGF0YUNiKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBtZW0sIG1DYWxsYmFja0Nvb2tpZSk7CiAgICAgfQogCkBAIC0zMDcsNyArMzA2LDcgQEAKIHsKICAgICBzdG9wUHJldmlldygpOwogICAgIGlmIChjcmVhdGVUaHJlYWQoYmVnaW5QaWN0dXJlVGhyZWFkLCB0aGlzKSA9PSBmYWxzZSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTMzOSwxMiArMzM4LDE0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFhYWCB2ZXJpZnkgcGFyYW1zCiAKLSAgICBpZiAoc3RyY21wKHBhcmFtcy5nZXRQcmV2aWV3Rm9ybWF0KCksICJ5dXY0MjJzcCIpICE9IDApIHsKLSAgICAgICAgTE9HRSgiT25seSB5dXY0MjJzcCBwcmV2aWV3IGlzIHN1cHBvcnRlZCIpOworICAgIGlmIChzdHJjbXAocGFyYW1zLmdldFByZXZpZXdGb3JtYXQoKSwKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQKSAhPSAwKSB7CisgICAgICAgIExPR0UoIk9ubHkgeXV2NDIwc3AgcHJldmlldyBpcyBzdXBwb3J0ZWQiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChzdHJjbXAocGFyYW1zLmdldFBpY3R1cmVGb3JtYXQoKSwgImpwZWciKSAhPSAwKSB7CisgICAgaWYgKHN0cmNtcChwYXJhbXMuZ2V0UGljdHVyZUZvcm1hdCgpLAorICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFRykgIT0gMCkgewogICAgICAgICBMT0dFKCJPbmx5IGpwZWcgc3RpbGwgcGljdHVyZXMgYXJlIHN1cHBvcnRlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMzc5LDIyICszODAsMjkgQEAKIHsKIH0KIAotd3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IENhbWVyYUhhcmR3YXJlU3R1Yjo6c2luZ2xldG9uOwotCiBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gQ2FtZXJhSGFyZHdhcmVTdHViOjpjcmVhdGVJbnN0YW5jZSgpCiB7Ci0gICAgaWYgKHNpbmdsZXRvbiAhPSAwKSB7Ci0gICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBoYXJkd2FyZSA9IHNpbmdsZXRvbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChoYXJkd2FyZSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGhhcmR3YXJlKG5ldyBDYW1lcmFIYXJkd2FyZVN0dWIoKSk7Ci0gICAgc2luZ2xldG9uID0gaGFyZHdhcmU7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOworICAgIHJldHVybiBuZXcgQ2FtZXJhSGFyZHdhcmVTdHViKCk7CiB9CiAKLWV4dGVybiAiQyIgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IG9wZW5DYW1lcmFIYXJkd2FyZSgpCitzdGF0aWMgQ2FtZXJhSW5mbyBzQ2FtZXJhSW5mb1tdID0geworICAgIHsKKyAgICAgICAgQ0FNRVJBX0ZBQ0lOR19CQUNLLAorICAgICAgICA5MCwgIC8qIG9yaWVudGF0aW9uICovCisgICAgfQorfTsKKworZXh0ZXJuICJDIiBpbnQgSEFMX2dldE51bWJlck9mQ2FtZXJhcygpCit7CisgICAgcmV0dXJuIHNpemVvZihzQ2FtZXJhSW5mbykgLyBzaXplb2Yoc0NhbWVyYUluZm9bMF0pOworfQorCitleHRlcm4gIkMiIHZvaWQgSEFMX2dldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLCBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbykKK3sKKyAgICBtZW1jcHkoY2FtZXJhSW5mbywgJnNDYW1lcmFJbmZvW2NhbWVyYUlkXSwgc2l6ZW9mKENhbWVyYUluZm8pKTsKK30KKworZXh0ZXJuICJDIiBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gSEFMX29wZW5DYW1lcmFIYXJkd2FyZShpbnQgY2FtZXJhSWQpCiB7CiAgICAgcmV0dXJuIENhbWVyYUhhcmR3YXJlU3R1Yjo6Y3JlYXRlSW5zdGFuY2UoKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUhhcmR3YXJlU3R1Yi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKaW5kZXggOTU3ODEzYS4uZDM0MjdiYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhSGFyZHdhcmVTdHViLmgKQEAgLTY3LDggKzY3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUhhcmR3YXJlU3R1YigpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgfkNhbWVyYUhhcmR3YXJlU3R1YigpOwogCi0gICAgc3RhdGljIHdwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBzaW5nbGV0b247Ci0KICAgICBzdGF0aWMgY29uc3QgaW50IGtCdWZmZXJDb3VudCA9IDQ7CiAKICAgICBjbGFzcyBQcmV2aWV3VGhyZWFkIDogcHVibGljIFRocmVhZCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDVhNTU3MDQuLmVhMmM1ZDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0xNiwzODMgKzE2LDQzNSBAQAogKi8KIAogI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2aWNlIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8c3VyZmFjZWZsaW5nZXIvSVN1cmZhY2UuaD4KICNpbmNsdWRlIDx1aS9PdmVybGF5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogCi0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWV4dGVybiAiQyIgewotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvZ2dpbmcgc3VwcG9ydCAtLSB0aGlzIGlzIGZvciBkZWJ1Z2dpbmcgb25seQorLy8gVXNlICJhZGIgc2hlbGwgZHVtcHN5cyBtZWRpYS5jYW1lcmEgLXYgMSIgdG8gY2hhbmdlIGl0Lgorc3RhdGljIHZvbGF0aWxlIGludDMyX3QgZ0xvZ0xldmVsID0gMDsKKworI2RlZmluZSBMT0cxKC4uLikgTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOworI2RlZmluZSBMT0cyKC4uLikgTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOworCitzdGF0aWMgdm9pZCBzZXRMb2dMZXZlbChpbnQgbGV2ZWwpIHsKKyAgICBhbmRyb2lkX2F0b21pY193cml0ZShsZXZlbCwgJmdMb2dMZXZlbCk7CiB9CiAKLS8vIFdoZW4geW91IGVuYWJsZSB0aGlzLCBhcyB3ZWxsIGFzIERFQlVHX1JFRlM9MSBhbmQKLS8vIERFQlVHX1JFRlNfRU5BQkxFRF9CWV9ERUZBVUxUPTAgaW4gbGlidXRpbHMvUmVmQmFzZS5jcHAsIHRoaXMgd2lsbCB0cmFjayBhbGwKLS8vIHJlZmVyZW5jZXMgdG8gdGhlIENhbWVyYVNlcnZpY2U6OkNsaWVudCBpbiBvcmRlciB0byBjYXRjaCB0aGUgY2FzZSB3aGVyZSB0aGUKLS8vIGNsaWVudCBpcyBiZWluZyBkZXN0cm95ZWQgd2hpbGUgYSBjYWxsYmFjayBmcm9tIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZQotLy8gaXMgb3V0c3RhbmRpbmcuICBUaGlzIGlzIGEgc2VyaW91cyBidWcgYmVjYXVzZSBpZiB3ZSBtYWtlIGFub3RoZXIgY2FsbCBpbnRvCi0vLyBDYW1lcmFIYXJkd3JlSW50ZXJmYWNlIHRoYXQgaXRzZWxmIHRyaWdnZXJzIGEgY2FsbGJhY2ssIHdlIHdpbGwgZGVhZGxvY2suCi0KLSNkZWZpbmUgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMgMAotCi0jZGVmaW5lIFBJQ1RVUkVfVElNRU9VVCBzZWNvbmRzKDUpCi0KLSNkZWZpbmUgREVCVUdfRFVNUF9QUkVWSUVXX0ZSQU1FX1RPX0ZJTEUgMCAvKiBuLXRoIGZyYW1lIHRvIHdyaXRlICovCi0jZGVmaW5lIERFQlVHX0RVTVBfSlBFR19TTkFQU0hPVF9UT19GSUxFIDAKLSNkZWZpbmUgREVCVUdfRFVNUF9ZVVZfU05BUFNIT1RfVE9fRklMRSAwCi0jZGVmaW5lIERFQlVHX0RVTVBfUE9TVFZJRVdfU05BUFNIT1RfVE9fRklMRSAwCi0KLSNpZiBERUJVR19EVU1QX1BSRVZJRVdfRlJBTUVfVE9fRklMRQotc3RhdGljIGludCBkZWJ1Z19mcmFtZV9jbnQ7Ci0jZW5kaWYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewogICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBDYW1lcmFTZXJ2aWNlOjppbnN0YW50aWF0ZSgpIHsKLSAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+YWRkU2VydmljZSgKLSAgICAgICAgICAgIFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSwgbmV3IENhbWVyYVNlcnZpY2UoKSk7CitzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKSB7CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1DYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkgOgotICAgIEJuQ2FtZXJhU2VydmljZSgpCi17Ci0gICAgTE9HSSgiQ2FtZXJhU2VydmljZSBzdGFydGVkOiBwaWQ9JWQiLCBnZXRwaWQoKSk7Ci0gICAgbVVzZXJzID0gMDsKLX0KKy8vIFRoaXMgaXMgdWdseSBhbmQgb25seSBzYWZlIGlmIHdlIG5ldmVyIHJlLWNyZWF0ZSB0aGUgQ2FtZXJhU2VydmljZSwgYnV0CisvLyBzaG91bGQgYmUgb2sgZm9yIG5vdy4KK3N0YXRpYyBDYW1lcmFTZXJ2aWNlICpnQ2FtZXJhU2VydmljZTsKIAotQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKQorQ2FtZXJhU2VydmljZTo6Q2FtZXJhU2VydmljZSgpCis6bVNvdW5kUmVmKDApCiB7Ci0gICAgaWYgKG1DbGllbnQgIT0gMCkgewotICAgICAgICBMT0dFKCJtQ2xpZW50IHdhcyBzdGlsbCBjb25uZWN0ZWQgaW4gZGVzdHJ1Y3RvciEiKTsKKyAgICBMT0dJKCJDYW1lcmFTZXJ2aWNlIHN0YXJ0ZWQgKHBpZD0lZCkiLCBnZXRwaWQoKSk7CisKKyAgICBtTnVtYmVyT2ZDYW1lcmFzID0gSEFMX2dldE51bWJlck9mQ2FtZXJhcygpOworICAgIGlmIChtTnVtYmVyT2ZDYW1lcmFzID4gTUFYX0NBTUVSQVMpIHsKKyAgICAgICAgTE9HRSgiTnVtYmVyIG9mIGNhbWVyYXMoJWQpID4gTUFYX0NBTUVSQVMoJWQpLiIsCisgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhcywgTUFYX0NBTUVSQVMpOworICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gTUFYX0NBTUVSQVM7CiAgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKKyAgICAgICAgc2V0Q2FtZXJhRnJlZShpKTsKKyAgICB9CisKKyAgICBnQ2FtZXJhU2VydmljZSA9IHRoaXM7CiB9CiAKLXNwPElDYW1lcmE+IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCkKLXsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBMT0dWKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IEUgKHBpZCAlZCwgY2xpZW50ICVwKSIsIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkuZ2V0KCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICBzcDxDbGllbnQ+IGNsaWVudDsKLSAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgIHNwPENsaWVudD4gY3VycmVudENsaWVudCA9IG1DbGllbnQucHJvbW90ZSgpOwotICAgICAgICBpZiAoY3VycmVudENsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjdXJyZW50Q2FtZXJhQ2xpZW50KGN1cnJlbnRDbGllbnQtPmdldENhbWVyYUNsaWVudCgpKTsKLSAgICAgICAgICAgIGlmIChjYW1lcmFDbGllbnQtPmFzQmluZGVyKCkgPT0gY3VycmVudENhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgY2xpZW50IHJlY29ubmVjdGluZy4uLgotICAgICAgICAgICAgICAgIExPR1YoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkLCBzYW1lIGNsaWVudCAlcCkgaXMgcmVjb25uZWN0aW5nLi4uIiwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpLmdldCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudENsaWVudDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBhbm90aGVyIGNsaWVudC4uLiByZWplY3QgaXQKLSAgICAgICAgICAgICAgICBMT0dWKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCwgbmV3IGNsaWVudCAlcCkgcmVqZWN0ZWQuICIKLSAgICAgICAgICAgICAgICAgICAgIihvbGQgcGlkICVkLCBvbGQgY2xpZW50ICVwKSIsCi0gICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENsaWVudC0+bUNsaWVudFBpZCwgY3VycmVudENhbWVyYUNsaWVudC0+YXNCaW5kZXIoKS5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbGwoY3VycmVudENsaWVudC0+bUNsaWVudFBpZCwgMCkgPT0gLTEgJiYgZXJybm8gPT0gRVNSQ0gpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HVigiVGhlIG9sZCBjbGllbnQgaXMgZGVhZCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNhbid0IHByb21vdGUsIHRoZSBwcmV2aW91cyBjbGllbnQgaGFzIGRpZWQuLi4KLSAgICAgICAgICAgIExPR1YoIk5ldyBjbGllbnQgKHBpZCAlZCkgY29ubmVjdGluZywgb2xkIHJlZmVyZW5jZSB3YXMgZGFuZ2xpbmcuLi4iLAotICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKLSAgICAgICAgICAgIG1DbGllbnQuY2xlYXIoKTsKK0NhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bWJlck9mQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGlmIChtQnVzeVtpXSkgeworICAgICAgICAgICAgTE9HRSgiY2FtZXJhICVkIGlzIHN0aWxsIGluIHVzZSBpbiBkZXN0cnVjdG9yISIsIGkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1Vc2VycyA+IDApIHsKLSAgICAgICAgTE9HVigiU3RpbGwgaGF2ZSBjbGllbnQsIHJlamVjdGVkIik7Ci0gICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgZ0NhbWVyYVNlcnZpY2UgPSBOVUxMOworfQorCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKKyAgICByZXR1cm4gbU51bWJlck9mQ2FtZXJhczsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDYW1lcmFJbmZvKiBjYW1lcmFJbmZvKSB7CisgICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgLy8gY3JlYXRlIGEgbmV3IENsaWVudCBvYmplY3QKLSAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwgY2FsbGluZ1BpZCk7Ci0gICAgbUNsaWVudCA9IGNsaWVudDsKLSNpZiBERUJVR19DTElFTlRfUkVGRVJFTkNFUwotICAgIC8vIEVuYWJsZSB0cmFja2luZyBmb3IgdGhpcyBvYmplY3QsIGFuZCB0cmFjayBpbmNyZW1lbnRzIGFuZCBkZWNyZW1lbnRzIG9mCi0gICAgLy8gdGhlIHJlZmNvdW50LgotICAgIGNsaWVudC0+dHJhY2tNZSh0cnVlLCB0cnVlKTsKLSNlbmRpZgotICAgIExPR1YoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCIpOworICAgIEhBTF9nZXRDYW1lcmFJbmZvKGNhbWVyYUlkLCBjYW1lcmFJbmZvKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElDYW1lcmE+IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCkgeworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CisKKyAgICBzcDxDbGllbnQ+IGNsaWVudDsKKyAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYUlkICVkKS4iLAorICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSAwKSB7CisgICAgICAgIGNsaWVudCA9IG1DbGllbnRbY2FtZXJhSWRdLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpID09IGNsaWVudC0+Z2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgKHRoZSBzYW1lIGNsaWVudCkiLAorICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQgKGV4aXN0aW5nIGNsaWVudCkuIiwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudFtjYW1lcmFJZF0uY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUJ1c3lbY2FtZXJhSWRdKSB7CisgICAgICAgIExPR1coIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCIKKyAgICAgICAgICAgICAiIChjYW1lcmEgJWQgaXMgc3RpbGwgYnVzeSkuIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gaGFyZHdhcmUgPSBIQUxfb3BlbkNhbWVyYUhhcmR3YXJlKGNhbWVyYUlkKTsKKyAgICBpZiAoaGFyZHdhcmUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJGYWlsIHRvIG9wZW4gY2FtZXJhIGhhcmR3YXJlIChpZD0lZCkiLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjbGllbnQgPSBuZXcgQ2xpZW50KHRoaXMsIGNhbWVyYUNsaWVudCwgaGFyZHdhcmUsIGNhbWVyYUlkLCBjYWxsaW5nUGlkKTsKKyAgICBtQ2xpZW50W2NhbWVyYUlkXSA9IGNsaWVudDsKKyAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFgiKTsKICAgICByZXR1cm4gY2xpZW50OwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50KQotewordm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVDbGllbnQoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCkgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAKLSAgICAvLyBEZWNsYXJlIHRoaXMgb3V0c2lkZSB0aGUgbG9jayB0byBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUKLSAgICAvLyBkZXN0cnVjdG9yIHdvbid0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQuCi0gICAgc3A8Q2xpZW50PiBjbGllbnQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKKyAgICAgICAgLy8gRGVjbGFyZSB0aGlzIGJlZm9yZSB0aGUgbG9jayB0byBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGUKKyAgICAgICAgLy8gZGVzdHJ1Y3RvciB3b24ndCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkLgorICAgICAgICBzcDxDbGllbnQ+IGNsaWVudDsKIAotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAKLSAgICBpZiAobUNsaWVudCA9PSAwKSB7Ci0gICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQuCi0gICAgICAgIExPR1YoInJlbW92ZUNsaWVudCAocGlkICVkKTogYWxyZWFkeSBkaXNjb25uZWN0ZWQiLCBjYWxsaW5nUGlkKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGFscmVhZHkgZGlzY29ubmVjdGVkIChvciB0aGlzIGlzCisgICAgICAgIC8vIGp1c3QgYW5vdGhlciB1bnVzZWQgY2FtZXJhKS4KKyAgICAgICAgaWYgKG1DbGllbnRbaV0gPT0gMCkgY29udGludWU7CisKKyAgICAgICAgLy8gUHJvbW90ZSBtQ2xpZW50LiBJdCBjYW4gZmFpbCBpZiB3ZSBhcmUgY2FsbGVkIGZyb20gdGhpcyBwYXRoOgorICAgICAgICAvLyBDbGllbnQ6On5DbGllbnQoKSAtPiBkaXNjb25uZWN0KCkgLT4gcmVtb3ZlQ2xpZW50KCkuCisgICAgICAgIGNsaWVudCA9IG1DbGllbnRbaV0ucHJvbW90ZSgpOworCisgICAgICAgIGlmIChjbGllbnQgPT0gMCkgeworICAgICAgICAgICAgbUNsaWVudFtpXS5jbGVhcigpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpID09IGNsaWVudC0+Z2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkpIHsKKyAgICAgICAgICAgIC8vIEZvdW5kIG91ciBjYW1lcmEsIGNsZWFyIGFuZCBsZWF2ZS4KKyAgICAgICAgICAgIExPRzEoInJlbW92ZUNsaWVudDogY2xlYXIgY2FtZXJhICVkIiwgaSk7CisgICAgICAgICAgICBtQ2xpZW50W2ldLmNsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFByb21vdGUgbUNsaWVudC4gSXQgY2FuIGZhaWwgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIHRoaXMgcGF0aDoKLSAgICAvLyBDbGllbnQ6On5DbGllbnQoKSAtPiBkaXNjb25uZWN0KCkgLT4gcmVtb3ZlQ2xpZW50KCkuCi0gICAgY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7Ci0gICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgIExPR1YoInJlbW92ZUNsaWVudCAocGlkICVkKTogbm8gbW9yZSBzdHJvbmcgcmVmZXJlbmNlIiwgY2FsbGluZ1BpZCk7Ci0gICAgICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuOworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudCBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Cit9CisKK3NwPENhbWVyYVNlcnZpY2U6OkNsaWVudD4gQ2FtZXJhU2VydmljZTo6Z2V0Q2xpZW50QnlJZChpbnQgY2FtZXJhSWQpIHsKKyAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHJldHVybiBOVUxMOworICAgIHJldHVybiBtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCk7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgeworICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUOgorICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOworICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmX3BpZCkgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MsIGRvIHRoZSByZWFsIGNoZWNrCisgICAgICAgICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgdXNlIHRoZSBjYW1lcmEgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoY2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpICE9IGNsaWVudC0+Z2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkpIHsKLSAgICAgICAgLy8gdWdoISB0aGF0J3Mgbm90IG91ciBjbGllbnQhIQotICAgICAgICBMT0dXKCJyZW1vdmVDbGllbnQgKHBpZCAlZCk6IG1DbGllbnQgZG9lc24ndCBtYXRjaCEiLCBjYWxsaW5nUGlkKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBva2F5LCBnb29kLCBmb3JnZXQgYWJvdXQgbUNsaWVudAotICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotCi0gICAgTE9HVigicmVtb3ZlQ2xpZW50IChwaWQgJWQpIGRvbmUiLCBjYWxsaW5nUGlkKTsKKyAgICByZXR1cm4gQm5DYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiB9CiAKLS8vIFRoZSByZWFzb24gd2UgbmVlZCB0aGlzIGNvdW50IGlzIGEgbmV3IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoKSByZXF1ZXN0IG1heQotLy8gY29tZSBpbiB3aGlsZSB0aGUgcHJldmlvdXMgQ2xpZW50J3MgZGVzdHJ1Y3RvciBoYXMgbm90IGJlZW4gcnVuIG9yIGlzIHN0aWxsCi0vLyBydW5uaW5nLiBJZiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9mIHRoZSBwcmV2aW91cyBDbGllbnQgaXMgZ29uZSBidXQKLS8vIGRlc3RydWN0b3IgaGFzIG5vdCBiZWVuIHJ1biwgd2Ugc2hvdWxkIG5vdCBhbGxvdyB0aGUgbmV3IENsaWVudCB0byBiZSBjcmVhdGVkCi0vLyBiZWNhdXNlIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHByZXZpb3VzIENsaWVudCB0byB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCi0vLyBmaXJzdC4KLXZvaWQgQ2FtZXJhU2VydmljZTo6aW5jVXNlcnMoKSB7Ci0gICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtVXNlcnMpOworLy8gVGhlIHJlYXNvbiB3ZSBuZWVkIHRoaXMgYnVzeSBiaXQgaXMgYSBuZXcgQ2FtZXJhU2VydmljZTo6Y29ubmVjdCgpIHJlcXVlc3QKKy8vIG1heSBjb21lIGluIHdoaWxlIHRoZSBwcmV2aW91cyBDbGllbnQncyBkZXN0cnVjdG9yIGhhcyBub3QgYmVlbiBydW4gb3IgaXMKKy8vIHN0aWxsIHJ1bm5pbmcuIElmIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb2YgdGhlIHByZXZpb3VzIENsaWVudCBpcyBnb25lCisvLyBidXQgdGhlIGRlc3RydWN0b3IgaGFzIG5vdCBiZWVuIGZpbmlzaGVkLCB3ZSBzaG91bGQgbm90IGFsbG93IHRoZSBuZXcgQ2xpZW50CisvLyB0byBiZSBjcmVhdGVkIGJlY2F1c2Ugd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJldmlvdXMgQ2xpZW50IHRvIHRlYXIgZG93bgorLy8gdGhlIGhhcmR3YXJlIGZpcnN0Lgordm9pZCBDYW1lcmFTZXJ2aWNlOjpzZXRDYW1lcmFCdXN5KGludCBjYW1lcmFJZCkgeworICAgIGFuZHJvaWRfYXRvbWljX3dyaXRlKDEsICZtQnVzeVtjYW1lcmFJZF0pOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OmRlY1VzZXJzKCkgewotICAgIGFuZHJvaWRfYXRvbWljX2RlYygmbVVzZXJzKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6c2V0Q2FtZXJhRnJlZShpbnQgY2FtZXJhSWQpIHsKKyAgICBhbmRyb2lkX2F0b21pY193cml0ZSgwLCAmbUJ1c3lbY2FtZXJhSWRdKTsKIH0KIAotc3RhdGljIHNwPE1lZGlhUGxheWVyPiBuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKQotewotICAgIHNwPE1lZGlhUGxheWVyPiBtcCA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgIGlmIChtcC0+c2V0RGF0YVNvdXJjZShmaWxlLCBOVUxMIC8qIGhlYWRlcnMgKi8pID09IE5PX0VSUk9SKSB7CisvLyBXZSBzaGFyZSB0aGUgbWVkaWEgcGxheWVycyBmb3Igc2h1dHRlciBhbmQgcmVjb3JkaW5nIHNvdW5kIGZvciBhbGwgY2xpZW50cy4KKy8vIEEgcmVmZXJlbmNlIGNvdW50IGlzIGtlcHQgdG8gZGV0ZXJtaW5lIHdoZW4gd2Ugd2lsbCBhY3R1YWxseSByZWxlYXNlIHRoZQorLy8gbWVkaWEgcGxheWVycy4KKworc3RhdGljIE1lZGlhUGxheWVyKiBuZXdNZWRpYVBsYXllcihjb25zdCBjaGFyICpmaWxlKSB7CisgICAgTWVkaWFQbGF5ZXIqIG1wID0gbmV3IE1lZGlhUGxheWVyKCk7CisgICAgaWYgKG1wLT5zZXREYXRhU291cmNlKGZpbGUsIE5VTEwpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIG1wLT5zZXRBdWRpb1N0cmVhbVR5cGUoQXVkaW9TeXN0ZW06OkVORk9SQ0VEX0FVRElCTEUpOwogICAgICAgICBtcC0+cHJlcGFyZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1wLmNsZWFyKCk7Ci0gICAgICAgIExPR0UoIkZhaWxlZCB0byBsb2FkIENhbWVyYVNlcnZpY2Ugc291bmRzLiIpOworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbG9hZCBDYW1lcmFTZXJ2aWNlIHNvdW5kczogJXMiLCBmaWxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBtcDsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2FkU291bmQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNvdW5kTG9jayk7CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6bG9hZFNvdW5kIHJlZj0lZCIsIG1Tb3VuZFJlZik7CisgICAgaWYgKG1Tb3VuZFJlZisrKSByZXR1cm47CisKKyAgICBtU291bmRQbGF5ZXJbU09VTkRfU0hVVFRFUl0gPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9jYW1lcmFfY2xpY2sub2dnIik7CisgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR10gPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpyZWxlYXNlU291bmQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNvdW5kTG9jayk7CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6cmVsZWFzZVNvdW5kIHJlZj0lZCIsIG1Tb3VuZFJlZik7CisgICAgaWYgKC0tbVNvdW5kUmVmKSByZXR1cm47CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TT1VORFM7IGkrKykgeworICAgICAgICBpZiAobVNvdW5kUGxheWVyW2ldICE9IDApIHsKKyAgICAgICAgICAgIG1Tb3VuZFBsYXllcltpXS0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgbVNvdW5kUGxheWVyW2ldLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6cGxheVNvdW5kKHNvdW5kX2tpbmQga2luZCkgeworICAgIExPRzEoInBsYXlTb3VuZCglZCkiLCBraW5kKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU291bmRMb2NrKTsKKyAgICBzcDxNZWRpYVBsYXllcj4gcGxheWVyID0gbVNvdW5kUGxheWVyW2tpbmRdOworICAgIGlmIChwbGF5ZXIgIT0gMCkgeworICAgICAgICAvLyBkbyBub3QgcGxheSB0aGUgc291bmQgaWYgc3RyZWFtIHZvbHVtZSBpcyAwCisgICAgICAgIC8vICh0eXBpY2FsbHkgYmVjYXVzZSByaW5nZXIgbW9kZSBpcyBzaWxlbnQpLgorICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6RU5GT1JDRURfQVVESUJMRSwgJmluZGV4KTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIHBsYXllci0+c2Vla1RvKDApOworICAgICAgICAgICAgcGxheWVyLT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Q2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LCBwaWRfdCBjbGllbnRQaWQpCi17CisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCisgICAgICAgIGNvbnN0IHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiYgaGFyZHdhcmUsCisgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCkgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIExPR1YoIkNsaWVudDo6Q2xpZW50IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKKyAgICBMT0cxKCJDbGllbnQ6OkNsaWVudCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CisKICAgICBtQ2FtZXJhU2VydmljZSA9IGNhbWVyYVNlcnZpY2U7CiAgICAgbUNhbWVyYUNsaWVudCA9IGNhbWVyYUNsaWVudDsKKyAgICBtSGFyZHdhcmUgPSBoYXJkd2FyZTsKKyAgICBtQ2FtZXJhSWQgPSBjYW1lcmFJZDsKICAgICBtQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIG1IYXJkd2FyZSA9IG9wZW5DYW1lcmFIYXJkd2FyZSgpOwogICAgIG1Vc2VPdmVybGF5ID0gbUhhcmR3YXJlLT51c2VPdmVybGF5KCk7CisgICAgbU1zZ0VuYWJsZWQgPSAwOwogCiAgICAgbUhhcmR3YXJlLT5zZXRDYWxsYmFja3Mobm90aWZ5Q2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhU2VydmljZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYW1lcmFJZCk7CiAKICAgICAvLyBFbmFibGUgem9vbSwgZXJyb3IsIGFuZCBmb2N1cyBtZXNzYWdlcyBieSBkZWZhdWx0Ci0gICAgbUhhcmR3YXJlLT5lbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfRVJST1IgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1pPT00gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0ZPQ1VTKTsKLQotICAgIG1NZWRpYVBsYXllckNsaWNrID0gbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOwotICAgIG1NZWRpYVBsYXllckJlZXAgPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciKTsKKyAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfRVJST1IgfAorICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19aT09NIHwKKyAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfRk9DVVMpOwogICAgIG1PdmVybGF5VyA9IDA7CiAgICAgbU92ZXJsYXlIID0gMDsKIAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IEZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSAwOwotICAgIGNhbWVyYVNlcnZpY2UtPmluY1VzZXJzKCk7Ci0gICAgTE9HVigiQ2xpZW50OjpDbGllbnQgWCAocGlkICVkKSIsIGNhbGxpbmdQaWQpOworICAgIGNhbWVyYVNlcnZpY2UtPnNldENhbWVyYUJ1c3koY2FtZXJhSWQpOworICAgIGNhbWVyYVNlcnZpY2UtPmxvYWRTb3VuZCgpOworICAgIExPRzEoIkNsaWVudDo6Q2xpZW50IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpjaGVja1BpZCgpCi17Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaWYgKG1DbGllbnRQaWQgPT0gY2FsbGluZ1BpZCkgcmV0dXJuIE5PX0VSUk9SOwotICAgIExPR1coIkF0dGVtcHQgdG8gdXNlIGxvY2tlZCBjYW1lcmEgKGNsaWVudCAlcCkgZnJvbSBkaWZmZXJlbnQgcHJvY2VzcyAiCi0gICAgICAgICIgKG9sZCBwaWQgJWQsIG5ldyBwaWQgJWQpIiwKLSAgICAgICAgZ2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkuZ2V0KCksIG1DbGllbnRQaWQsIGNhbGxpbmdQaWQpOwotICAgIHJldHVybiAtRUJVU1k7Ci19Ci0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6bG9jaygpCi17Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgTE9HVigibG9jayBmcm9tIHBpZCAlZCAobUNsaWVudFBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2xpZW50UGlkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIGxvY2sgY2FtZXJhIHRvIHRoaXMgY2xpZW50IGlmIHRoZSB0aGUgY2FtZXJhIGlzIHVubG9ja2VkCi0gICAgaWYgKG1DbGllbnRQaWQgPT0gMCkgewotICAgICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICAvLyByZXR1cm5zIE5PX0VSUk9SIGlmIHRoZSBjbGllbnQgYWxyZWFkeSBvd25zIHRoZSBjYW1lcmEsIC1FQlVTWSBvdGhlcndpc2UKLSAgICByZXR1cm4gY2hlY2tQaWQoKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp1bmxvY2soKQotewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIExPR1YoInVubG9jayBmcm9tIHBpZCAlZCAobUNsaWVudFBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2xpZW50UGlkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIGFsbG93IGFueW9uZSB0byB1c2UgY2FtZXJhCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKLSAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSAwOwotICAgICAgICBMT0dWKCJjbGVhciBtQ2FtZXJhQ2xpZW50IChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0gICAgICAgIC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSByZWZlcmVuY2Ugc28gdGhhdCB3aGVuIGFwcCBnb2VzCi0gICAgICAgIC8vIGF3YXksIHRoZSByZWZlcmVuY2UgY291bnQgZ29lcyB0byAwLgotICAgICAgICBtQ2FtZXJhQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KQotewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgLy8gY29ubmVjdCBhIG5ldyBwcm9jZXNzIHRvIHRoZSBjYW1lcmEKLSAgICBMT0dWKCJDbGllbnQ6OmNvbm5lY3QgRSAocGlkICVkLCBjbGllbnQgJXApIiwgY2FsbGluZ1BpZCwgY2xpZW50LT5hc0JpbmRlcigpLmdldCgpKTsKLQotICAgIC8vIEkgaGF0ZSB0aGlzIGhhY2ssIGJ1dCB0aGluZ3MgZ2V0IHJlYWxseSB1Z2x5IHdoZW4gdGhlIG1lZGlhIHJlY29yZGVyCi0gICAgLy8gc2VydmljZSBpcyBoYW5kaW5nIGJhY2sgdGhlIGNhbWVyYSB0byB0aGUgYXBwLiBUaGUgSUNhbWVyYUNsaWVudAotICAgIC8vIGRlc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgZHVyaW5nIHRoZSBzYW1lIElQQywgbWFraW5nIGl0IGxvb2sgbGlrZQotICAgIC8vIHRoZSByZW1vdGUgY2xpZW50IGlzIHRyeWluZyB0byBkaXNjb25uZWN0LiBUaGlzIGhhY2sgdGVtcG9yYXJpbHkKLSAgICAvLyBzZXRzIHRoZSBtQ2xpZW50UGlkIHRvIGFuIGludmFsaWQgcGlkIHRvIHByZXZlbnQgdGhlIGhhcmR3YXJlIGZyb20KLSAgICAvLyBiZWluZyB0b3JuIGRvd24uCi0gICAgewotCi0gICAgICAgIC8vIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBjbGllbnQgb3Igd2Ugd2lsbCBkZWFkbG9jayBpZiB0aGUgY2xpZW50IGlzCi0gICAgICAgIC8vIGluIHRoZSBzYW1lIHByb2Nlc3MgYW5kIHdlIGhvbGQgdGhlIGxvY2sgd2hlbiB3ZSByZW1vdmUgdGhlIHJlZmVyZW5jZQotICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiBvbGRDbGllbnQ7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgICAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIGNoZWNrUGlkKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBMT0dXKCJUcmllZCB0byBjb25uZWN0IHRvIGxvY2tlZCBjYW1lcmEgKG9sZCBwaWQgJWQsIG5ldyBwaWQgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsIGNhbGxpbmdQaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRDbGllbnQgPSBtQ2FtZXJhQ2xpZW50OwotCi0gICAgICAgICAgICAvLyBkaWQgdGhlIGNsaWVudCBhY3R1YWxseSBjaGFuZ2U/Ci0gICAgICAgICAgICBpZiAoKG1DYW1lcmFDbGllbnQgIT0gTlVMTCkgJiYgKGNsaWVudC0+YXNCaW5kZXIoKSA9PSBtQ2FtZXJhQ2xpZW50LT5hc0JpbmRlcigpKSkgewotICAgICAgICAgICAgICAgIExPR1YoIkNvbm5lY3QgdG8gdGhlIHNhbWUgY2xpZW50Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FtZXJhQ2xpZW50ID0gY2xpZW50OwotICAgICAgICAgICAgbUNsaWVudFBpZCA9IC0xOwotICAgICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBGUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7Ci0gICAgICAgICAgICBMT0dWKCJDb25uZWN0IHRvIHRoZSBuZXcgY2xpZW50IChwaWQgJWQsIGNsaWVudCAlcCkiLAotICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIG1DYW1lcmFDbGllbnQtPmFzQmluZGVyKCkuZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gdGhlIG9sZCBjbGllbnQgZGVzdHJ1Y3RvciBpcyBjYWxsZWQgd2hlbiBvbGRDbGllbnQgZ29lcyBvdXQgb2Ygc2NvcGUKLSAgICAvLyBub3cgd2Ugc2V0IHRoZSBuZXcgUElEIHRvIGxvY2sgdGhlIGludGVyZmFjZSBhZ2FpbgotICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0jaWYgSEFWRV9BTkRST0lEX09TCi1zdGF0aWMgdm9pZCAqdW5yZWdpc3Rlcl9zdXJmYWNlKHZvaWQgKmFyZykKLXsKK3N0YXRpYyB2b2lkICp1bnJlZ2lzdGVyX3N1cmZhY2Uodm9pZCAqYXJnKSB7CiAgICAgSVN1cmZhY2UgKnN1cmZhY2UgPSAoSVN1cmZhY2UgKilhcmc7CiAgICAgc3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci0jZW5kaWYKIAotQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojp+Q2xpZW50KCkKLXsKKy8vIHRlYXIgZG93biB0aGUgY2xpZW50CitDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6On5DbGllbnQoKSB7CiAgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgTE9HMSgiQ2xpZW50Ojp+Q2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIAotICAgIC8vIHRlYXIgZG93biBjbGllbnQKLSAgICBMT0dWKCJDbGllbnQ6On5DbGllbnQgRSAocGlkICVkLCBjbGllbnQgJXApIiwKLSAgICAgICAgICAgIGNhbGxpbmdQaWQsIGdldENhbWVyYUNsaWVudCgpLT5hc0JpbmRlcigpLmdldCgpKTsKICAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSNpZiBIQVZFX0FORFJPSURfT1MKICAgICAgICAgcHRocmVhZF90IHRocjsKICAgICAgICAgLy8gV2UgdW5yZWdpc3RlciB0aGUgYnVmZmVycyBpbiBhIGRpZmZlcmVudCB0aHJlYWQgYmVjYXVzZSBiaW5kZXIgZG9lcwogICAgICAgICAvLyBub3QgbGV0IHVzIG1ha2Ugc3ljaHJvbm91cyB0cmFuc2FjdGlvbnMgaW4gYSBiaW5kZXIgZGVzdHJ1Y3RvciAodGhhdAogICAgICAgICAvLyBpcywgdXBvbiBvdXIgcmVhY2hpbmcgYSByZWZjb3VudCBvZiB6ZXJvLikKLSAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRociwgTlVMTCwKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJnRociwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIGF0dHIKICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9zdXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXQoKSk7CiAgICAgICAgIHB0aHJlYWRfam9pbih0aHIsIE5VTEwpOwotI2Vsc2UKLSAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0jZW5kaWYKICAgICB9CiAKLSAgICBpZiAobU1lZGlhUGxheWVyQmVlcC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllckJlZXAtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgbU1lZGlhUGxheWVyQmVlcC5jbGVhcigpOwotICAgIH0KLSAgICBpZiAobU1lZGlhUGxheWVyQ2xpY2suZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFQbGF5ZXJDbGljay0+ZGlzY29ubmVjdCgpOwotICAgICAgICBtTWVkaWFQbGF5ZXJDbGljay5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIG1ha2Ugc3VyZSB3ZSB0ZWFyIGRvd24gdGhlIGhhcmR3YXJlCisgICAgLy8gc2V0IG1DbGllbnRQaWQgdG8gbGV0IGRpc2Nvbm5ldCgpIHRlYXIgZG93biB0aGUgaGFyZHdhcmUKICAgICBtQ2xpZW50UGlkID0gY2FsbGluZ1BpZDsKICAgICBkaXNjb25uZWN0KCk7Ci0gICAgTE9HVigiQ2xpZW50Ojp+Q2xpZW50IFggKHBpZCAlZCkiLCBtQ2xpZW50UGlkKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+cmVsZWFzZVNvdW5kKCk7CisgICAgTE9HMSgiQ2xpZW50Ojp+Q2xpZW50IFggKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKQoteworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNoZWNrUGlkKCkgY29uc3QgewogICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAotICAgIExPR1YoIkNsaWVudDo6ZGlzY29ubmVjdCgpIEUgKHBpZCAlZCBjbGllbnQgJXApIiwKLSAgICAgICAgICAgIGNhbGxpbmdQaWQsIGdldENhbWVyYUNsaWVudCgpLT5hc0JpbmRlcigpLmdldCgpKTsKKyAgICBMT0dXKCJhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgorICAgICAgICAgIiAob2xkIHBpZCAlZCwgbmV3IHBpZCAlZCkiLCBtQ2xpZW50UGlkLCBjYWxsaW5nUGlkKTsKKyAgICByZXR1cm4gRUJVU1k7Cit9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CisgICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7CisgICAgICAgIExPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmxvY2soKSB7CisgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgTE9HMSgibG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUNsaWVudFBpZCA8PSAwKSB7Ci0gICAgICAgIExPR1YoImNhbWVyYSBpcyB1bmxvY2tlZCAobUNsaWVudFBpZCA9ICVkKSwgZG9uJ3QgdGVhciBkb3duIGhhcmR3YXJlIiwgbUNsaWVudFBpZCk7CisKKyAgICAvLyBsb2NrIGNhbWVyYSB0byB0aGlzIGNsaWVudCBpZiB0aGUgdGhlIGNhbWVyYSBpcyB1bmxvY2tlZAorICAgIGlmIChtQ2xpZW50UGlkID09IDApIHsKKyAgICAgICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyByZXR1cm5zIE5PX0VSUk9SIGlmIHRoZSBjbGllbnQgYWxyZWFkeSBvd25zIHRoZSBjYW1lcmEsIEVCVVNZIG90aGVyd2lzZQorICAgIHJldHVybiBjaGVja1BpZCgpOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnVubG9jaygpIHsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBMT0cxKCJ1bmxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICAvLyBhbGxvdyBhbnlvbmUgdG8gdXNlIGNhbWVyYSAoYWZ0ZXIgdGhleSBsb2NrIHRoZSBjYW1lcmEpCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1DbGllbnRQaWQgPSAwOworICAgICAgICBMT0cxKCJjbGVhciBtQ2FtZXJhQ2xpZW50IChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gSUNhbWVyYUNsaWVudCBzbyB0aGF0IHdoZW4gdGhlIGFwcAorICAgICAgICAvLyBnb2VzIGF3YXksIHRoZSByZWZlcmVuY2UgY291bnQgZ29lcyB0byAwLgorICAgICAgICBtQ2FtZXJhQ2xpZW50LmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIGNvbm5lY3QgYSBuZXcgY2xpZW50IHRvIHRoZSBjYW1lcmEKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KSB7CisgICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBjaGVja1BpZCgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR1coIlRyaWVkIHRvIGNvbm5lY3QgdG8gYSBsb2NrZWQgY2FtZXJhIChvbGQgcGlkICVkLCBuZXcgcGlkICVkKSIsCisgICAgICAgICAgICAgICAgbUNsaWVudFBpZCwgY2FsbGluZ1BpZCk7CisgICAgICAgIHJldHVybiBFQlVTWTsKKyAgICB9CisKKyAgICBpZiAobUNhbWVyYUNsaWVudCAhPSAwICYmIChjbGllbnQtPmFzQmluZGVyKCkgPT0gbUNhbWVyYUNsaWVudC0+YXNCaW5kZXIoKSkpIHsKKyAgICAgICAgTE9HMSgiQ29ubmVjdCB0byB0aGUgc2FtZSBjbGllbnQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gRlJBTUVfQ0FMTEJBQ0tfRkxBR19OT09QOworICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOworICAgIG1DYW1lcmFDbGllbnQgPSBjbGllbnQ7CisKKyAgICBMT0cxKCJjb25uZWN0IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCkgeworICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIExPRzEoImRpc2Nvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChjaGVja1BpZCgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR1coImRpZmZlcmVudCBjbGllbnQgLSBkb24ndCBkaXNjb25uZWN0Iik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWYgKGNoZWNrUGlkKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HVigiRGlmZmVyZW50IGNsaWVudCAtIGRvbid0IGRpc2Nvbm5lY3QiKTsKKworICAgIGlmIChtQ2xpZW50UGlkIDw9IDApIHsKKyAgICAgICAgTE9HMSgiY2FtZXJhIGlzIHVubG9ja2VkIChtQ2xpZW50UGlkID0gJWQpLCBkb24ndCB0ZWFyIGRvd24gaGFyZHdhcmUiLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDAwLDgyNiArNDUyLDM2NiBAQAogICAgIC8vIGZyb20gdGhlIHVzZXIgZGlyZWN0bHksIG9yIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KICAgICBpZiAobUhhcmR3YXJlID09IDApIHJldHVybjsKIAotICAgIExPR1YoImhhcmR3YXJlIHRlYXJkb3duIik7CisgICAgTE9HMSgiaGFyZHdhcmUgdGVhcmRvd24iKTsKICAgICAvLyBCZWZvcmUgZGVzdHJveWluZyBtSGFyZHdhcmUsIHdlIG11c3QgbWFrZSBzdXJlIGl0J3MgaW4gdGhlCiAgICAgLy8gaWRsZSBzdGF0ZS4KKyAgICAvLyBUdXJuIG9mZiBhbGwgbWVzc2FnZXMuCisgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19BTExfTVNHUyk7CiAgICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwotICAgIC8vIENhbmNlbCBhbGwgcGljdHVyZSBjYWxsYmFja3MuCi0gICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1NIVVRURVIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpOwogICAgIG1IYXJkd2FyZS0+Y2FuY2VsUGljdHVyZSgpOwotICAgIC8vIFR1cm4gb2ZmIHJlbWFpbmluZyBtZXNzYWdlcy4KLSAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfQUxMX01TR1MpOwogICAgIC8vIFJlbGVhc2UgdGhlIGhhcmR3YXJlIHJlc291cmNlcy4KICAgICBtSGFyZHdhcmUtPnJlbGVhc2UoKTsKICAgICAvLyBSZWxlYXNlIHRoZSBoZWxkIG92ZXJsYXkgcmVzb3VyY2VzLgotICAgIGlmIChtVXNlT3ZlcmxheSkKLSAgICB7CisgICAgaWYgKG1Vc2VPdmVybGF5KSB7CiAgICAgICAgIG1PdmVybGF5UmVmID0gMDsKICAgICB9CiAgICAgbUhhcmR3YXJlLmNsZWFyKCk7CiAKICAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1DYW1lcmFDbGllbnQpOwotICAgIG1DYW1lcmFTZXJ2aWNlLT5kZWNVc2VycygpOworICAgIG1DYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFGcmVlKG1DYW1lcmFJZCk7CiAKLSAgICBMT0dWKCJDbGllbnQ6OmRpc2Nvbm5lY3QoKSBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CisgICAgTE9HMSgiZGlzY29ubmVjdCBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiB9CiAKLS8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElTdXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQcmV2aWV3RGlzcGxheShjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UpCi17Ci0gICAgTE9HVigic2V0UHJldmlld0Rpc3BsYXkoJXApIChwaWQgJWQpIiwKLSAgICAgICAgICgoc3VyZmFjZSA9PSBOVUxMKSA/IE5VTEwgOiBzdXJmYWNlLmdldCgpKSwgZ2V0Q2FsbGluZ1BpZCgpKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gc2V0IHRoZSBJU3VyZmFjZSB0aGF0IHRoZSBwcmV2aWV3IHdpbGwgdXNlCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSkgeworICAgIExPRzEoInNldFByZXZpZXdEaXNwbGF5KCVwKSAocGlkICVkKSIsIHN1cmZhY2UuZ2V0KCksIGdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgc3VyZmFjZUxvY2sobVN1cmZhY2VMb2NrKTsKICAgICByZXN1bHQgPSBOT19FUlJPUjsKKworICAgIC8vIHJldHVybiBpZiBubyBjaGFuZ2UgaW4gc3VyZmFjZS4KICAgICAvLyBhc0JpbmRlcigpIGlzIHNhZmUgb24gTlVMTCAocmV0dXJucyBOVUxMKQotICAgIGlmIChzdXJmYWNlLT5hc0JpbmRlcigpICE9IG1TdXJmYWNlLT5hc0JpbmRlcigpKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICBMT0dWKCJjbGVhcmluZyBvbGQgcHJldmlldyBzdXJmYWNlICVwIiwgbVN1cmZhY2UuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKCAhbVVzZU92ZXJsYXkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIGRlc3RydWN0aW9uIG9mIGFueSBwcmV2aW91cyBvdmVybGF5Ci0gICAgICAgICAgICAgICAgc3A8T3ZlcmxheT4gZHVtbXk7Ci0gICAgICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRPdmVybGF5KCBkdW1teSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKLSAgICAgICAgbU92ZXJsYXlSZWYgPSAwOwotICAgICAgICAvLyBJZiBwcmV2aWV3IGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCwgc2V0IG92ZXJsYXkgb3IgcmVnaXN0ZXIgcHJldmlldwotICAgICAgICAvLyBidWZmZXJzIG5vdy4KLSAgICAgICAgaWYgKG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewotICAgICAgICAgICAgaWYgKG1Vc2VPdmVybGF5KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0T3ZlcmxheSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOwotICAgICAgICAgICAgfQorICAgIGlmIChzdXJmYWNlLT5hc0JpbmRlcigpID09IG1TdXJmYWNlLT5hc0JpbmRlcigpKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKG1TdXJmYWNlICE9IDApIHsKKyAgICAgICAgTE9HMSgiY2xlYXJpbmcgb2xkIHByZXZpZXcgc3VyZmFjZSAlcCIsIG1TdXJmYWNlLmdldCgpKTsKKyAgICAgICAgaWYgKG1Vc2VPdmVybGF5KSB7CisgICAgICAgICAgICAvLyBGb3JjZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgYW55IHByZXZpb3VzIG92ZXJsYXkKKyAgICAgICAgICAgIHNwPE92ZXJsYXk+IGR1bW15OworICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRPdmVybGF5KGR1bW15KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwogICAgICAgICB9CiAgICAgfQorICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKKyAgICBtT3ZlcmxheVJlZiA9IDA7CisgICAgLy8gSWYgcHJldmlldyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQsIHNldCBvdmVybGF5IG9yIHJlZ2lzdGVyIHByZXZpZXcKKyAgICAvLyBidWZmZXJzIG5vdy4KKyAgICBpZiAobUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7CisgICAgICAgIGlmIChtVXNlT3ZlcmxheSkgeworICAgICAgICAgICAgcmVzdWx0ID0gc2V0T3ZlcmxheSgpOworICAgICAgICB9IGVsc2UgaWYgKG1TdXJmYWNlICE9IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCi0vLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGNhbGxiYWNrX2ZsYWcpCi17Ci0gICAgTE9HVigic2V0UHJldmlld0NhbGxiYWNrRmxhZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZCgpICE9IE5PX0VSUk9SKSByZXR1cm47Ci0gICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBjYWxsYmFja19mbGFnOwotCi0gICAgaWYobVVzZU92ZXJsYXkpIHsKLSAgICAgICAgaWYobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKQotICAgICAgICAgICAgbUhhcmR3YXJlLT5lbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1IYXJkd2FyZS0+ZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXJ0IHByZXZpZXcgbW9kZQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdGFydENhbWVyYU1vZGUoY2FtZXJhX21vZGUgbW9kZSkKLXsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKLQotICAgIExPR1YoInN0YXJ0Q2FtZXJhTW9kZSglZCkgKHBpZCAlZCkiLCBtb2RlLCBjYWxsaW5nUGlkKTsKLQotICAgIC8qIHdlIGNhbm5vdCBjYWxsIGludG8gbUhhcmR3YXJlIHdpdGggbUxvY2sgaGVsZCBiZWNhdXNlCi0gICAgICogbUhhcmR3YXJlIGhhcyBjYWxsYmFja3Mgb250byB1cyB3aGljaCBhY3F1aXJlIHRoaXMgbG9jawotICAgICAqLwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKLQotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3dpdGNoKG1vZGUpIHsKLSAgICBjYXNlIENBTUVSQV9SRUNPUkRJTkdfTU9ERToKLSAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKLSAgICAgICAgICAgIExPR0UoInNldFByZXZpZXdEaXNwbGF5IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBzdGFydFJlY29yZGluZ01vZGUuIik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb3JkaW5nTW9kZSgpOwotCi0gICAgZGVmYXVsdDogLy8gQ0FNRVJBX1BSRVZJRVdfTU9ERQotICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgewotICAgICAgICAgICAgTE9HVigibVN1cmZhY2UgaXMgbm90IHNldCB5ZXQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXJ0UHJldmlld01vZGUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRSZWNvcmRpbmdNb2RlKCkKLXsKLSAgICBMT0dWKCJzdGFydFJlY29yZGluZ01vZGUgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgc3RhdHVzX3QgcmV0ID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIC8vIGlmIHByZXZpZXcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IHByZXZpZXcgZmlyc3QKLSAgICBpZiAoIW1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewotICAgICAgICByZXQgPSBzdGFydFByZXZpZXdNb2RlKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpZiByZWNvcmRpbmcgaGFzIGJlZW4gZW5hYmxlZCwgbm90aGluZyBuZWVkcyB0byBiZSBkb25lCi0gICAgaWYgKG1IYXJkd2FyZS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQotICAgIHJldCA9IG1IYXJkd2FyZS0+c3RhcnRSZWNvcmRpbmcoKTsKLSAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoIm1IYXJkd2FyZS0+c3RhcnRSZWNvcmRpbmcoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCByZXQpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnNldE92ZXJsYXkoKQotewotICAgIExPR1YoInNldE92ZXJsYXkiKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpIHsKICAgICBpbnQgdywgaDsKICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3LCAmaCk7CiAKLSAgICBpZiAoIHcgIT0gbU92ZXJsYXlXIHx8IGggIT0gbU92ZXJsYXlIICkKLSAgICB7Ci0gICAgICAgIC8vIEZvcmNlIHRoZSBkZXN0cnVjdGlvbiBvZiBhbnkgcHJldmlvdXMgb3ZlcmxheQotICAgICAgICBzcDxPdmVybGF5PiBkdW1teTsKLSAgICAgICAgbUhhcmR3YXJlLT5zZXRPdmVybGF5KCBkdW1teSApOwotICAgICAgICBtT3ZlcmxheVJlZiA9IDA7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7Ci0gICAgaWYgKG1TdXJmYWNlICE9IDApIHsKLSAgICAgICAgaWYgKG1PdmVybGF5UmVmLmdldCgpID09IE5VTEwpIHsKLQotICAgICAgICAgICAgLy8gRklYTUU6Ci0gICAgICAgICAgICAvLyBTdXJmYWNlZmxpbmdlciBtYXkgaG9sZCBvbnRvIHRoZSBwcmV2aW91cyBvdmVybGF5IHJlZmVyZW5jZSBmb3Igc29tZQotICAgICAgICAgICAgLy8gdGltZSBhZnRlciB3ZSB0cnkgdG8gZGVzdHJveSBpdC4gcmV0cnkgYSBmZXcgdGltZXMuIEluIHRoZSBmdXR1cmUsIHdlCi0gICAgICAgICAgICAvLyBzaG91bGQgbWFrZSB0aGUgZGVzdHJveSBjYWxsIGJsb2NrLCBvciBwb3NzaWJseSBzcGVjaWZ5IHRoYXQgd2UgY2FuCi0gICAgICAgICAgICAvLyB3YWl0IGluIHRoZSBjcmVhdGVPdmVybGF5IGNhbGwgaWYgdGhlIHByZXZpb3VzIG92ZXJsYXkgaXMgaW4gdGhlIAotICAgICAgICAgICAgLy8gcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQuCi0gICAgICAgICAgICBmb3IgKGludCByZXRyeSA9IDA7IHJldHJ5IDwgNTA7ICsrcmV0cnkpIHsKLSAgICAgICAgICAgICAgICBtT3ZlcmxheVJlZiA9IG1TdXJmYWNlLT5jcmVhdGVPdmVybGF5KHcsIGgsIE9WRVJMQVlfRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24pOwotICAgICAgICAgICAgICAgIGlmIChtT3ZlcmxheVJlZiAhPSBOVUxMKSBicmVhazsKLSAgICAgICAgICAgICAgICBMT0dXKCJPdmVybGF5IGNyZWF0ZSBmYWlsZWQgLSByZXRyeWluZyIpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgyMDAwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIG1PdmVybGF5UmVmLmdldCgpID09IE5VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExPR0UoIk92ZXJsYXkgQ3JlYXRpb24gRmFpbGVkISIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gbUhhcmR3YXJlLT5zZXRPdmVybGF5KG5ldyBPdmVybGF5KG1PdmVybGF5UmVmKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBtSGFyZHdhcmUtPnNldE92ZXJsYXkoTlVMTCk7Ci0gICAgfQotICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlLT5zZXRPdmVybGF5KCkgZmFpbGVkIHdpdGggc3RhdHVzICVkXG4iLCByZXQpOwotICAgIH0KLQotICAgIG1PdmVybGF5VyA9IHc7Ci0gICAgbU92ZXJsYXlIID0gaDsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpCi17Ci0gICAgaW50IHcsIGg7Ci0gICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmdywgJmgpOwotCi0gICAgLy8gZG9uJ3QgdXNlIGEgaGFyZGNvZGVkIGZvcm1hdCBoZXJlCisgICAgLy8gRklYTUU6IGRvbid0IHVzZSBhIGhhcmRjb2RlZCBmb3JtYXQgaGVyZS4KICAgICBJU3VyZmFjZTo6QnVmZmVySGVhcCBidWZmZXJzKHcsIGgsIHcsIGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmUtPmdldFByZXZpZXdIZWFwKCkpOwogCi0gICAgc3RhdHVzX3QgcmV0ID0gbVN1cmZhY2UtPnJlZ2lzdGVyQnVmZmVycyhidWZmZXJzKTsKLSAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR0UoInJlZ2lzdGVyQnVmZmVycyBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCByZXQpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdXJmYWNlLT5yZWdpc3RlckJ1ZmZlcnMoYnVmZmVycyk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJyZWdpc3RlckJ1ZmZlcnMgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgcmVzdWx0KTsKICAgICB9Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0YXJ0UHJldmlld01vZGUoKQotewotICAgIExPR1YoInN0YXJ0UHJldmlld01vZGUgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRPdmVybGF5KCkgeworICAgIGludCB3LCBoOworICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKKyAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJncsICZoKTsKKworICAgIGlmICh3ICE9IG1PdmVybGF5VyB8fCBoICE9IG1PdmVybGF5SCkgeworICAgICAgICAvLyBGb3JjZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgYW55IHByZXZpb3VzIG92ZXJsYXkKKyAgICAgICAgc3A8T3ZlcmxheT4gZHVtbXk7CisgICAgICAgIG1IYXJkd2FyZS0+c2V0T3ZlcmxheShkdW1teSk7CisgICAgICAgIG1PdmVybGF5UmVmID0gMDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKKyAgICBpZiAobVN1cmZhY2UgPT0gMCkgeworICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnNldE92ZXJsYXkoTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1PdmVybGF5UmVmID09IDApIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOgorICAgICAgICAgICAgLy8gU3VyZmFjZWZsaW5nZXIgbWF5IGhvbGQgb250byB0aGUgcHJldmlvdXMgb3ZlcmxheSByZWZlcmVuY2UgZm9yIHNvbWUKKyAgICAgICAgICAgIC8vIHRpbWUgYWZ0ZXIgd2UgdHJ5IHRvIGRlc3Ryb3kgaXQuIHJldHJ5IGEgZmV3IHRpbWVzLiBJbiB0aGUgZnV0dXJlLCB3ZQorICAgICAgICAgICAgLy8gc2hvdWxkIG1ha2UgdGhlIGRlc3Ryb3kgY2FsbCBibG9jaywgb3IgcG9zc2libHkgc3BlY2lmeSB0aGF0IHdlIGNhbgorICAgICAgICAgICAgLy8gd2FpdCBpbiB0aGUgY3JlYXRlT3ZlcmxheSBjYWxsIGlmIHRoZSBwcmV2aW91cyBvdmVybGF5IGlzIGluIHRoZQorICAgICAgICAgICAgLy8gcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQuCisgICAgICAgICAgICBmb3IgKGludCByZXRyeSA9IDA7IHJldHJ5IDwgNTA7ICsrcmV0cnkpIHsKKyAgICAgICAgICAgICAgICBtT3ZlcmxheVJlZiA9IG1TdXJmYWNlLT5jcmVhdGVPdmVybGF5KHcsIGgsIE9WRVJMQVlfRk9STUFUX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3JpZW50YXRpb24pOworICAgICAgICAgICAgICAgIGlmIChtT3ZlcmxheVJlZiAhPSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICBMT0dXKCJPdmVybGF5IGNyZWF0ZSBmYWlsZWQgLSByZXRyeWluZyIpOworICAgICAgICAgICAgICAgIHVzbGVlcCgyMDAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobU92ZXJsYXlSZWYgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIk92ZXJsYXkgQ3JlYXRpb24gRmFpbGVkISIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zZXRPdmVybGF5KG5ldyBPdmVybGF5KG1PdmVybGF5UmVmKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJtSGFyZHdhcmUtPnNldE92ZXJsYXkoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWRcbiIsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgbU92ZXJsYXlXID0gdzsKKyAgICBtT3ZlcmxheUggPSBoOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KKy8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgeworICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOworCisgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgPSBjYWxsYmFja19mbGFnOworCisgICAgLy8gSWYgd2UgZG9uJ3QgdXNlIG92ZXJsYXksIHdlIGFsd2F5cyBuZWVkIHRoZSBwcmV2aWV3IGZyYW1lIGZvciBkaXNwbGF5LgorICAgIC8vIElmIHdlIGRvIHVzZSBvdmVybGF5LCB3ZSBvbmx5IG5lZWQgdGhlIHByZXZpZXcgZnJhbWUgaWYgdGhlIHVzZXIKKyAgICAvLyB3YW50cyB0aGUgZGF0YS4KKyAgICBpZiAobVVzZU92ZXJsYXkpIHsKKyAgICAgICAgaWYobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX0VOQUJMRV9NQVNLKSB7CisgICAgICAgICAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBzdGFydCBwcmV2aWV3IG1vZGUKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRQcmV2aWV3KCkgeworICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUFJFVklFV19NT0RFKTsKK30KKworLy8gc3RhcnQgcmVjb3JkaW5nIG1vZGUKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRSZWNvcmRpbmcoKSB7CisgICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1JFQ09SRElOR19NT0RFKTsKK30KKworLy8gc3RhcnQgcHJldmlldyBvciByZWNvcmRpbmcKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RhcnRDYW1lcmFNb2RlKGNhbWVyYV9tb2RlIG1vZGUpIHsKKyAgICBMT0cxKCJzdGFydENhbWVyYU1vZGUoJWQpIiwgbW9kZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OworCisgICAgc3dpdGNoKG1vZGUpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfUFJFVklFV19NT0RFOgorICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0cxKCJtU3VyZmFjZSBpcyBub3Qgc2V0IHlldC4iKTsKKyAgICAgICAgICAgICAgICAvLyBzdGlsbCBhYmxlIHRvIHN0YXJ0IHByZXZpZXcgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UHJldmlld01vZGUoKTsKKyAgICAgICAgY2FzZSBDQU1FUkFfUkVDT1JESU5HX01PREU6CisgICAgICAgICAgICBpZiAobVN1cmZhY2UgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIm1TdXJmYWNlIG11c3QgYmUgc2V0IGJlZm9yZSBzdGFydFJlY29yZGluZ01vZGUuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXJ0UmVjb3JkaW5nTW9kZSgpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0YXJ0UHJldmlld01vZGUoKSB7CisgICAgTE9HMSgic3RhcnRQcmV2aWV3TW9kZSIpOworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwogCiAgICAgLy8gaWYgcHJldmlldyBoYXMgYmVlbiBlbmFibGVkLCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUKICAgICBpZiAobUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICAvLyBzdGFydCBwcmV2aWV3IG1vZGUKLSNpZiBERUJVR19EVU1QX1BSRVZJRVdfRlJBTUVfVE9fRklMRQotICAgIGRlYnVnX2ZyYW1lX2NudCA9IDA7Ci0jZW5kaWYKLSAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKLQogICAgIGlmIChtVXNlT3ZlcmxheSkgewogICAgICAgICAvLyBJZiBwcmV2aWV3IGRpc3BsYXkgaGFzIGJlZW4gc2V0LCBzZXQgb3ZlcmxheSBub3cuCiAgICAgICAgIGlmIChtU3VyZmFjZSAhPSAwKSB7Ci0gICAgICAgICAgICByZXQgPSBzZXRPdmVybGF5KCk7CisgICAgICAgICAgICByZXN1bHQgPSBzZXRPdmVybGF5KCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgcmV0dXJuIHJldDsKLSAgICAgICAgcmV0ID0gbUhhcmR3YXJlLT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zdGFydFByZXZpZXcoKTsKICAgICB9IGVsc2UgewotICAgICAgICBtSGFyZHdhcmUtPmVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKTsKLSAgICAgICAgcmV0ID0gbUhhcmR3YXJlLT5zdGFydFByZXZpZXcoKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgcmV0dXJuIHJldDsKKyAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOworICAgICAgICByZXN1bHQgPSBtSGFyZHdhcmUtPnN0YXJ0UHJldmlldygpOworICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogICAgICAgICAvLyBJZiBwcmV2aWV3IGRpc3BsYXkgaGFzIGJlZW4gc2V0LCByZWdpc3RlciBwcmV2aWV3IGJ1ZmZlcnMgbm93LgogICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGhlcmUgYmVjYXVzZSB0aGUgc3VyZmFjZSByZWdpc3RlcmVkIHdpdGggcmF3IGhlYXAuCisgICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGVyZSBiZWNhdXNlIHRoZSBzdXJmYWNlIG1heSBiZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgLy8gd2l0aCB0aGUgcmF3IChzbmFwc2hvdCkgaGVhcC4KICAgICAgICAgICAgbVN1cmZhY2UtPnVucmVnaXN0ZXJCdWZmZXJzKCk7Ci0gICAgICAgICAgIHJldCA9IHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKKyAgICAgICAgICAgcmVzdWx0ID0gcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdGFydFByZXZpZXcoKQotewotICAgIExPR1YoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nTW9kZSgpIHsKKyAgICBMT0cxKCJzdGFydFJlY29yZGluZ01vZGUiKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKIAotICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1BSRVZJRVdfTU9ERSk7Ci19CisgICAgLy8gaWYgcmVjb3JkaW5nIGhhcyBiZWVuIGVuYWJsZWQsIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQorICAgIGlmIChtSGFyZHdhcmUtPnJlY29yZGluZ0VuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nKCkKLXsKLSAgICBMT0dWKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7Ci0KLSAgICBpZiAobU1lZGlhUGxheWVyQmVlcC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRvIG5vdCBwbGF5IHJlY29yZCBqaW5nbGUgaWYgc3RyZWFtIHZvbHVtZSBpcyAwCi0gICAgICAgIC8vICh0eXBpY2FsbHkgYmVjYXVzZSByaW5nZXIgbW9kZSBpcyBzaWxlbnQpLgotICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N5c3RlbTo6RU5GT1JDRURfQVVESUJMRSwgJmluZGV4KTsKLSAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllckJlZXAtPnNlZWtUbygwKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllckJlZXAtPnN0YXJ0KCk7CisgICAgLy8gaWYgcHJldmlldyBoYXMgbm90IGJlZW4gc3RhcnRlZCwgc3RhcnQgcHJldmlldyBmaXJzdAorICAgIGlmICghbUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7CisgICAgICAgIHJlc3VsdCA9IHN0YXJ0UHJldmlld01vZGUoKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKTsKLQotICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1JFQ09SRElOR19NT0RFKTsKKyAgICAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQorICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSk7CisgICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChTT1VORF9SRUNPUkRJTkcpOworICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRSZWNvcmRpbmcoKTsKKyAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIm1IYXJkd2FyZS0+c3RhcnRSZWNvcmRpbmcoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCByZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnN0b3BQcmV2aWV3KCkKLXsKLSAgICBMT0dWKCJzdG9wUHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c3RvcFByZXZpZXcoKSB7CisgICAgTE9HMSgic3RvcFByZXZpZXcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKLSAgICAvLyBob2xkIG1haW4gbG9jayBkdXJpbmcgc3RhdGUgdHJhbnNpdGlvbgotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICBpZiAoY2hlY2tQaWQoKSAhPSBOT19FUlJPUikgcmV0dXJuOworICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CisgICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwogCi0gICAgICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1IYXJkd2FyZS0+c3RvcFByZXZpZXcoKTsKLSAgICAgICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgICAgICBMT0dWKCJzdG9wUHJldmlldygpLCBoYXJkd2FyZSBzdG9wcGVkIE9LIik7Ci0KLSAgICAgICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKLSAgICAgICAgfQorICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgeworICAgICAgICBtU3VyZmFjZS0+dW5yZWdpc3RlckJ1ZmZlcnMoKTsKICAgICB9CiAKLSAgICAvLyBob2xkIHByZXZpZXcgYnVmZmVyIGxvY2sKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1QcmV2aWV3TG9jayk7Ci0gICAgICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7Ci0gICAgfQorICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7CiB9CiAKIC8vIHN0b3AgcmVjb3JkaW5nIG1vZGUKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdG9wUmVjb3JkaW5nKCkKLXsKLSAgICBMT0dWKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzdG9wUmVjb3JkaW5nKCkgeworICAgIExPRzEoInN0b3BSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKLSAgICAvLyBob2xkIG1haW4gbG9jayBkdXJpbmcgc3RhdGUgdHJhbnNpdGlvbgotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICBpZiAoY2hlY2tQaWQoKSAhPSBOT19FUlJPUikgcmV0dXJuOworICAgIG1DYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoU09VTkRfUkVDT1JESU5HKTsKKyAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKTsKKyAgICBtSGFyZHdhcmUtPnN0b3BSZWNvcmRpbmcoKTsKIAotICAgICAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgICAgIExPR0UoIm1IYXJkd2FyZSBpcyBOVUxMLCByZXR1cm5pbmcuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1lZGlhUGxheWVyQmVlcC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXJCZWVwLT5zZWVrVG8oMCk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXJCZWVwLT5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUhhcmR3YXJlLT5zdG9wUmVjb3JkaW5nKCk7Ci0gICAgICAgIG1IYXJkd2FyZS0+ZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSk7Ci0gICAgICAgIExPR1YoInN0b3BSZWNvcmRpbmcoKSwgaGFyZHdhcmUgc3RvcHBlZCBPSyIpOwotICAgIH0KLQotICAgIC8vIGhvbGQgcHJldmlldyBidWZmZXIgbG9jawotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVByZXZpZXdMb2NrKTsKLSAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKLSAgICB9CisgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKIH0KIAogLy8gcmVsZWFzZSBhIHJlY29yZGluZyBmcmFtZQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotewordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZCgpICE9IE5PX0VSUk9SKSByZXR1cm47Ci0KLSAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQorICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKICAgICBtSGFyZHdhcmUtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShtZW0pOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6cHJldmlld0VuYWJsZWQoKQoteworYm9vbCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnByZXZpZXdFbmFibGVkKCkgeworICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobUhhcmR3YXJlID09IDApIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKTsKIH0KIAotYm9vbCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlY29yZGluZ0VuYWJsZWQoKQoteworYm9vbCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OnJlY29yZGluZ0VuYWJsZWQoKSB7CisgICAgTE9HMSgicmVjb3JkaW5nRW5hYmxlZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwogICAgIHJldHVybiBtSGFyZHdhcmUtPnJlY29yZGluZ0VuYWJsZWQoKTsKIH0KIAotLy8gU2FmZWx5IHJldHJpZXZlcyBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBjbGllbnQgZHVyaW5nIGEgaGFyZHdhcmUgY2FsbGJhY2suCi1zcDxDYW1lcmFTZXJ2aWNlOjpDbGllbnQ+IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Z2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKQotewotICAgIHNwPENsaWVudD4gY2xpZW50ID0gMDsKLSAgICBDYW1lcmFTZXJ2aWNlICpzZXJ2aWNlID0gc3RhdGljX2Nhc3Q8Q2FtZXJhU2VydmljZSo+KHVzZXIpOwotICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIG91ckxvY2soc2VydmljZS0+bVNlcnZpY2VMb2NrKTsKLSAgICAgICAgaWYgKHNlcnZpY2UtPm1DbGllbnQgIT0gMCkgewotICAgICAgICAgICAgY2xpZW50ID0gc2VydmljZS0+bUNsaWVudC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBMT0dFKCJnZXRDbGllbnRGcm9tQ29va2llOiBjbGllbnQgYXBwZWFycyB0byBoYXZlIGRpZWQiKTsKLSAgICAgICAgICAgICAgICBzZXJ2aWNlLT5tQ2xpZW50LmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dFKCJnZXRDbGllbnRGcm9tQ29va2llOiBnb3QgY2FsbGJhY2sgYnV0IGNsaWVudCB3YXMgTlVMTCIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbGllbnQ7Ci19Ci0KLQotI2lmIERFQlVHX0RVTVBfSlBFR19TTkFQU0hPVF9UT19GSUxFIHx8IFwKLSAgICBERUJVR19EVU1QX1lVVl9TTkFQU0hPVF9UT19GSUxFIHx8IFwKLSAgICBERUJVR19EVU1QX1BSRVZJRVdfRlJBTUVfVE9fRklMRQotc3RhdGljIHZvaWQgZHVtcF90b19maWxlKGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKLXsKLSAgICBpbnQgbncsIGNudCA9IDA7Ci0gICAgdWludDMyX3Qgd3JpdHRlbiA9IDA7Ci0KLSAgICBMT0dWKCJvcGVuaW5nIGZpbGUgWyVzXVxuIiwgZm5hbWUpOwotICAgIGludCBmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSBmaWxlIFslc106ICVzIiwgZm5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBMT0dWKCJ3cml0aW5nICVkIGJ5dGVzIHRvIGZpbGUgWyVzXVxuIiwgc2l6ZSwgZm5hbWUpOwotICAgIHdoaWxlICh3cml0dGVuIDwgc2l6ZSkgewotICAgICAgICBudyA9IDo6d3JpdGUoZmQsCi0gICAgICAgICAgICAgICAgICAgICBidWYgKyB3cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtIHdyaXR0ZW4pOwotICAgICAgICBpZiAobncgPCAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gd3JpdGUgdG8gZmlsZSBbJXNdOiAlcyIsCi0gICAgICAgICAgICAgICAgIGZuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdHRlbiArPSBudzsKLSAgICAgICAgY250Kys7Ci0gICAgfQotICAgIExPR1YoImRvbmUgd3JpdGluZyAlZCBieXRlcyB0byBmaWxlIFslc10gaW4gJWQgcGFzc2VzXG4iLAotICAgICAgICAgc2l6ZSwgZm5hbWUsIGNudCk7Ci0gICAgOjpjbG9zZShmZCk7Ci19Ci0jZW5kaWYKLQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjphdXRvRm9jdXMoKQotewotICAgIExPR1YoImF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmF1dG9Gb2N1cygpIHsKKyAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAKLSAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQogICAgIHJldHVybiBtSGFyZHdhcmUtPmF1dG9Gb2N1cygpOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNhbmNlbEF1dG9Gb2N1cygpCi17Ci0gICAgTE9HVigiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6Y2FuY2VsQXV0b0ZvY3VzKCkgeworICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKIAotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+Y2FuY2VsQXV0b0ZvY3VzKCk7CiB9CiAKIC8vIHRha2UgYSBwaWN0dXJlIC0gaW1hZ2UgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2sKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6dGFrZVBpY3R1cmUoKQotewotICAgIExPR1YoInRha2VQaWN0dXJlIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6dGFrZVBpY3R1cmUoKSB7CisgICAgTE9HMSgidGFrZVBpY3R1cmUgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAKLSAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgTE9HRSgibUhhcmR3YXJlIGlzIE5VTEwsIHJldHVybmluZy4iKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1NIVVRURVIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19SQVdfSU1BR0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpOworICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19TSFVUVEVSIHwKKyAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUgfAorICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19SQVdfSU1BR0UgfAorICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKTsKIAogICAgIHJldHVybiBtSGFyZHdhcmUtPnRha2VQaWN0dXJlKCk7CiB9CiAKLS8vIHNuYXBzaG90IHRha2VuCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcigKLSAgICBpbWFnZV9yZWN0X3R5cGUgKnNpemUgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgeXV2IHBpY3R1cmUgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyQnVmZmVyLiBJZiB0aGlzIGlzIE5VTEwsIHVzZSB0aGUgcGljdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGZyb20gcGFyYW1ldGVycy4KLSkKLXsKLSAgICAvLyBQbGF5IHNodXR0ZXIgc291bmQuCi0gICAgaWYgKG1NZWRpYVBsYXllckNsaWNrLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgLy8gZG8gbm90IHBsYXkgc2h1dHRlciBzb3VuZCBpZiBzdHJlYW0gdm9sdW1lIGlzIDAKLSAgICAgICAgLy8gKHR5cGljYWxseSBiZWNhdXNlIHJpbmdlciBtb2RlIGlzIHNpbGVudCkuCi0gICAgICAgIGludCBpbmRleDsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3lzdGVtOjpFTkZPUkNFRF9BVURJQkxFLCAmaW5kZXgpOwotICAgICAgICBpZiAoaW5kZXggIT0gMCkgewotICAgICAgICAgICAgbU1lZGlhUGxheWVyQ2xpY2stPnNlZWtUbygwKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllckNsaWNrLT5zdGFydCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2NyZWVuIGdvZXMgYmxhY2sgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1bnJlZ2lzdGVyZWQuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOwotICAgIH0KLQotICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OwotICAgIGlmIChjICE9IE5VTEwpIHsKLSAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2soQ0FNRVJBX01TR19TSFVUVEVSLCAwLCAwKTsKLSAgICB9Ci0gICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1NIVVRURVIpOwotCi0gICAgLy8gSXQgdGFrZXMgc29tZSB0aW1lIGJlZm9yZSB5dXZQaWN0dXJlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZC4KLSAgICAvLyBSZWdpc3RlciB0aGUgYnVmZmVyIGZvciByYXcgaW1hZ2UgaGVyZSB0byByZWR1Y2UgbGF0ZW5jeS4KLSAgICBpZiAobVN1cmZhY2UgIT0gMCAmJiAhbVVzZU92ZXJsYXkpIHsKLSAgICAgICAgaW50IHcsIGg7Ci0gICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpKTsKLSAgICAgICAgaWYgKHNpemUgPT0gTlVMTCkgewotICAgICAgICAgICAgcGFyYW1zLmdldFBpY3R1cmVTaXplKCZ3LCAmaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3ID0gc2l6ZS0+d2lkdGg7Ci0gICAgICAgICAgICBoID0gc2l6ZS0+aGVpZ2h0OwotICAgICAgICAgICAgdyAmPSB+MTsKLSAgICAgICAgICAgIGggJj0gfjE7Ci0gICAgICAgICAgICBMT0dWKCJTbmFwc2hvdCBpbWFnZSB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgdywgaCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRklYTUU6IGRvbid0IHVzZSBoYXJkY29kZWQgZm9ybWF0IGNvbnN0YW50cyBoZXJlCi0gICAgICAgIElTdXJmYWNlOjpCdWZmZXJIZWFwIGJ1ZmZlcnModywgaCwgdywgaCwKLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQLCBtT3JpZW50YXRpb24sIDAsCi0gICAgICAgICAgICBtSGFyZHdhcmUtPmdldFJhd0hlYXAoKSk7Ci0KLSAgICAgICAgbVN1cmZhY2UtPnJlZ2lzdGVyQnVmZmVycyhidWZmZXJzKTsKLSAgICB9Ci19Ci0KLS8vIHByZXZpZXcgY2FsbGJhY2sgLSBmcmFtZSBidWZmZXIgdXBkYXRlCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlUHJldmlld0RhdGEoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKLXsKLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLQotI2lmIERFQlVHX0hFQVBfTEVBS1MgJiYgMCAvLyBkZWJ1Z2dpbmcKLSAgICBpZiAoZ1dlYWtIZWFwID09IE5VTEwpIHsKLSAgICAgICAgaWYgKGdXZWFrSGVhcCAhPSBoZWFwKSB7Ci0gICAgICAgICAgICBMT0dWKCJTRVRUSU5HIFBSRVZJRVcgSEVBUCIpOwotICAgICAgICAgICAgaGVhcC0+dHJhY2tNZSh0cnVlLCB0cnVlKTsKLSAgICAgICAgICAgIGdXZWFrSGVhcCA9IGhlYXA7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSNpZiBERUJVR19EVU1QX1BSRVZJRVdfRlJBTUVfVE9fRklMRQotICAgIHsKLSAgICAgICAgaWYgKGRlYnVnX2ZyYW1lX2NudCsrID09IERFQlVHX0RVTVBfUFJFVklFV19GUkFNRV9UT19GSUxFKSB7Ci0gICAgICAgICAgICBkdW1wX3RvX2ZpbGUoIi9kYXRhL3ByZXZpZXcueXV2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghbVVzZU92ZXJsYXkpCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgc3VyZmFjZUxvY2sobVN1cmZhY2VMb2NrKTsKLSAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBsb2NhbCBjb3B5IG9mIHRoZSBjYWxsYmFjayBmbGFncwotICAgIGludCBmbGFncyA9IG1QcmV2aWV3Q2FsbGJhY2tGbGFnOwotCi0gICAgLy8gaXMgY2FsbGJhY2sgZW5hYmxlZD8KLSAgICBpZiAoIShmbGFncyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spKSB7Ci0gICAgICAgIC8vIElmIHRoZSBlbmFibGUgYml0IGlzIG9mZiwgdGhlIGNvcHktb3V0IGFuZCBvbmUtc2hvdCBiaXRzIGFyZSBpZ25vcmVkCi0gICAgICAgIExPR1YoImZyYW1lIGNhbGxiYWNrIGlzIGRpYWJsZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGhvbGQgYSBzdHJvbmcgcG9pbnRlciB0byB0aGUgY2xpZW50Ci0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0KLSAgICAvLyBjbGVhciBjYWxsYmFjayBmbGFncyBpZiBubyBjbGllbnQgb3Igb25lLXNob3QgbW9kZQotICAgIGlmICgoYyA9PSBOVUxMKSB8fCAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBGUkFNRV9DQUxMQkFDS19GTEFHX09ORV9TSE9UX01BU0spKSB7Ci0gICAgICAgIExPR1YoIkRpc2FibGUgcHJldmlldyBjYWxsYmFjayIpOwotICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyAmPSB+KEZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOwotICAgICAgICAvLyBUT0RPOiBTaG91bGRuJ3Qgd2UgdXNlIHRoaXMgQVBJIGZvciBub24tb3ZlcmxheSBoYXJkd2FyZSBhcyB3ZWxsPwotICAgICAgICBpZiAobVVzZU92ZXJsYXkpCi0gICAgICAgICAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgfQotCi0gICAgLy8gSXMgdGhlIHJlY2VpdmVkIGZyYW1lIGNvcGllZCBvdXQgb3Igbm90PwotICAgIGlmIChmbGFncyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfQ09QWV9PVVRfTUFTSykgewotICAgICAgICBMT0dWKCJmcmFtZSBpcyBjb3BpZWQiKTsKLSAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKGMsIGhlYXAsIG9mZnNldCwgc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HVigiZnJhbWUgaXMgZm9yd2FyZGVkIik7Ci0gICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUsIG1lbSk7Ci0gICAgfQotfQotCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gcG9zdHZpZXcgaW1hZ2UgcmVhZHkKLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpoYW5kbGVQb3N0dmlldyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotewotI2lmIERFQlVHX0RVTVBfUE9TVFZJRVdfU05BUFNIT1RfVE9fRklMRSAvLyBmb3IgdGVzdGluZyBwdXJzcG9zZXMgb25seQotICAgIHsKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgZHVtcF90b19maWxlKCIvZGF0YS9wb3N0dmlldy55dXYiLAotICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSwgbWVtKTsKLSAgICB9Ci0gICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FKTsKLX0KLQotLy8gcGljdHVyZSBjYWxsYmFjayAtIHJhdyBpbWFnZSByZWFkeQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZVJhd1BpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKLXsKLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSNpZiBERUJVR19IRUFQX0xFQUtTICYmIDAgLy8gZGVidWdnaW5nCi0gICAgZ1dlYWtIZWFwID0gaGVhcDsgLy8gZGVidWdnaW5nCi0jZW5kaWYKLQotICAgIC8vTE9HVigiaGFuZGxlUmF3UGljdHVyZSglZCwgJWQpIiwgb2Zmc2V0LCBzaXplKTsKLSNpZiBERUJVR19EVU1QX1lVVl9TTkFQU0hPVF9UT19GSUxFIC8vIGZvciB0ZXN0aW5nIHB1cnNwb3NlcyBvbmx5Ci0gICAgZHVtcF90b19maWxlKCIvZGF0YS9waG90by55dXYiLAotICAgICAgICAgICAgICAgICAodWludDhfdCAqKWhlYXAtPmJhc2UoKSArIG9mZnNldCwgc2l6ZSk7Ci0jZW5kaWYKLQotICAgIC8vIFB1dCB0aGUgWVVWIHZlcnNpb24gb2YgdGhlIHNuYXBzaG90IGluIHRoZSBwcmV2aWV3IGRpc3BsYXkuCi0gICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7Ci0gICAgICAgIG1TdXJmYWNlLT5wb3N0QnVmZmVyKG9mZnNldCk7Ci0gICAgfQotCi0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19SQVdfSU1BR0UsIG1lbSk7Ci0gICAgfQotICAgIG1IYXJkd2FyZS0+ZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19SQVdfSU1BR0UpOwotfQotCi0vLyBwaWN0dXJlIGNhbGxiYWNrIC0gY29tcHJlc3NlZCBwaWN0dXJlIHJlYWR5Ci12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKLXsKLSNpZiBERUJVR19EVU1QX0pQRUdfU05BUFNIT1RfVE9fRklMRSAvLyBmb3IgdGVzdGluZyBwdXJzcG9zZXMgb25seQotICAgIHsKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgZHVtcF90b19maWxlKCIvZGF0YS9waG90by5qcGciLAotICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiloZWFwLT5iYXNlKCkgKyBvZmZzZXQsIHNpemUpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLCBtZW0pOwotICAgIH0KLSAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSk7Ci19Ci0KLXZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50Ojpub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKQotewotICAgIExPR1YoIm5vdGlmeUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOwotCi0gICAgc3A8Q2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChjbGllbnQgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChtc2dUeXBlKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX01TR19TSFVUVEVSOgotICAgICAgICAgICAgLy8gZXh0MSBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSB5dXYgcGljdHVyZS4KLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlU2h1dHRlcigoaW1hZ2VfcmVjdF90eXBlICopZXh0MSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBjbGllbnQtPm1DYW1lcmFDbGllbnQ7Ci0gICAgICAgICAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2sobXNnVHlwZSwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSNpZiBERUJVR19DTElFTlRfUkVGRVJFTkNFUwotICAgIGlmIChjbGllbnQtPmdldFN0cm9uZ0NvdW50KCkgPT0gMSkgewotICAgICAgICBMT0dFKCIrKysrKysrKysrKysrKysrIChOT1RJRlkgQ0FMTEJBQ0spIFRISVMgV0lMTCBDQVVTRSBBIExPQ0tVUCEiKTsKLSAgICAgICAgY2xpZW50LT5wcmludFJlZnMoKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKQotewotICAgIExPR1YoImRhdGFDYWxsYmFjayglZCkiLCBtc2dUeXBlKTsKLQotICAgIHNwPENsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBjbGllbnQtPm1DYW1lcmFDbGllbnQ7Ci0gICAgaWYgKGRhdGFQdHIgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJOdWxsIGRhdGEgcmV0dXJuZWQgaW4gZGF0YSBjYWxsYmFjayIpOwotICAgICAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKLSAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChtc2dUeXBlKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FOgotICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVQcmV2aWV3RGF0YShkYXRhUHRyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUU6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVBvc3R2aWV3KGRhdGFQdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX01TR19SQVdfSU1BR0U6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVJhd1BpY3R1cmUoZGF0YVB0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0U6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGRhdGFQdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGRhdGFQdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWYgREVCVUdfQ0xJRU5UX1JFRkVSRU5DRVMKLSAgICBpZiAoY2xpZW50LT5nZXRTdHJvbmdDb3VudCgpID09IDEpIHsKLSAgICAgICAgTE9HRSgiKysrKysrKysrKysrKysrKyAoREFUQSBDQUxMQkFDSykgVEhJUyBXSUxMIENBVVNFIEEgTE9DS1VQISIpOwotICAgICAgICBjbGllbnQtPnByaW50UmVmcygpOwotICAgIH0KLSNlbmRpZgotfQotCi12b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKQotewotICAgIExPR1YoImRhdGFDYWxsYmFja1RpbWVzdGFtcCglZCkiLCBtc2dUeXBlKTsKLQotICAgIHNwPENsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gY2xpZW50LT5tQ2FtZXJhQ2xpZW50OwotCi0gICAgaWYgKGRhdGFQdHIgPT0gTlVMTCkgewotICAgICAgICBMT0dFKCJOdWxsIGRhdGEgcmV0dXJuZWQgaW4gZGF0YSB3aXRoIHRpbWVzdGFtcCBjYWxsYmFjayIpOwotICAgICAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKLSAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCgwLCBtc2dUeXBlLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGMgIT0gTlVMTCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICB9Ci0KLSNpZiBERUJVR19DTElFTlRfUkVGRVJFTkNFUwotICAgIGlmIChjbGllbnQtPmdldFN0cm9uZ0NvdW50KCkgPT0gMSkgewotICAgICAgICBMT0dFKCIrKysrKysrKysrKysrKysrIChEQVRBIENBTExCQUNLIFRJTUVTVEFNUCkgVEhJUyBXSUxMIENBVVNFIEEgTE9DS1VQISIpOwotICAgICAgICBjbGllbnQtPnByaW50UmVmcygpOwotICAgIH0KLSNlbmRpZgotfQotCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OkNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpCi17Ci0gICAgTE9HVigic2V0UGFyYW1ldGVycyglcykiLCBwYXJhbXMuc3RyaW5nKCkpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgeworICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwogCi0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIExPR0UoIm1IYXJkd2FyZSBpcyBOVUxMLCByZXR1cm5pbmcuIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KICAgICBDYW1lcmFQYXJhbWV0ZXJzIHAocGFyYW1zKTsKLQogICAgIHJldHVybiBtSGFyZHdhcmUtPnNldFBhcmFtZXRlcnMocCk7CiB9CiAKIC8vIGdldCBwcmV2aWV3L2NhcHR1cmUgcGFyYW1ldGVycyAtIGtleS92YWx1ZSBwYWlycwotU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdAoteworU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIExPR0UoIm1IYXJkd2FyZSBpcyBOVUxMLCByZXR1cm5pbmcuIik7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCk7Ci0gICAgfQorICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwotICAgIExPR1YoImdldFBhcmFtZXRlcnMoJXMpIiwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAgICAgcmV0dXJuIHBhcmFtczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpCi17Ci0gICAgTE9HVigic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpIHsKKyAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkKCk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CiAKICAgICBpZiAoY21kID09IENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04pIHsKQEAgLTEyNDYsNTAgKzgzOCwzNjYgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBMT0dFKCJtSGFyZHdhcmUgaXMgTlVMTCwgcmV0dXJuaW5nLiIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCiAgICAgcmV0dXJuIG1IYXJkd2FyZS0+c2VuZENvbW1hbmQoY21kLCBhcmcxLCBhcmcyKTsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQotewotICAgIExPR1YoImNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZSIpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpIHsKKyAgICBhbmRyb2lkX2F0b21pY19vcihtc2dUeXBlLCAmbU1zZ0VuYWJsZWQpOworICAgIG1IYXJkd2FyZS0+ZW5hYmxlTXNnVHlwZShtc2dUeXBlKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkgeworICAgIGFuZHJvaWRfYXRvbWljX2FuZCh+bXNnVHlwZSwgJm1Nc2dFbmFibGVkKTsKKyAgICBtSGFyZHdhcmUtPmRpc2FibGVNc2dUeXBlKG1zZ1R5cGUpOworfQorCisjZGVmaW5lIENIRUNLX01FU1NBR0VfSU5URVJWQUwgMTAgLy8gMTBtcworYm9vbCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmxvY2tJZk1lc3NhZ2VXYW50ZWQoaW50MzJfdCBtc2dUeXBlKSB7CisgICAgaW50IHNsZWVwQ291bnQgPSAwOworICAgIHdoaWxlIChtTXNnRW5hYmxlZCAmIG1zZ1R5cGUpIHsKKyAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKHNsZWVwQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HMSgibG9ja0lmTWVzc2FnZVdhbnRlZCglZCk6IHdhaXRlZCBmb3IgJWQgbXMiLAorICAgICAgICAgICAgICAgICAgICBtc2dUeXBlLCBzbGVlcENvdW50ICogQ0hFQ0tfTUVTU0FHRV9JTlRFUlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xlZXBDb3VudCsrID09IDApIHsKKyAgICAgICAgICAgIExPRzEoImxvY2tJZk1lc3NhZ2VXYW50ZWQoJWQpOiBlbnRlciBzbGVlcCIsIG1zZ1R5cGUpOworICAgICAgICB9CisgICAgICAgIHVzbGVlcChDSEVDS19NRVNTQUdFX0lOVEVSVkFMICogMTAwMCk7CisgICAgfQorICAgIExPR1coImxvY2tJZk1lc3NhZ2VXYW50ZWQoJWQpOiBkcm9wcGVkIHVud2FudGVkIG1lc3NhZ2UiLCBtc2dUeXBlKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29udmVydHMgZnJvbSBhIHJhdyBwb2ludGVyIHRvIHRoZSBjbGllbnQgdG8gYSBzdHJvbmcgcG9pbnRlciBkdXJpbmcgYQorLy8gaGFyZHdhcmUgY2FsbGJhY2suIFRoaXMgcmVxdWlyZXMgdGhlIGNhbGxiYWNrcyBvbmx5IGhhcHBlbiB3aGVuIHRoZSBjbGllbnQKKy8vIGlzIHN0aWxsIGFsaXZlLgorc3A8Q2FtZXJhU2VydmljZTo6Q2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcikgeworICAgIHNwPENsaWVudD4gY2xpZW50ID0gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudEJ5SWQoKGludCkgdXNlcik7CisKKyAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiB0aGUgQ2xpZW50IGlzIGluIHRoZSBwcm9jZXNzIG9mIHNodXR0aW5nIGRvd24gKHRoZQorICAgIC8vIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBpcyBnb25lLCBidXQgdGhlIGRlc3RydWN0b3IgaGFzbid0IGZpbmlzaGVkCisgICAgLy8gc3RvcHBpbmcgdGhlIGhhcmR3YXJlKS4KKyAgICBpZiAoY2xpZW50ID09IDApIHJldHVybiBOVUxMOworCisgICAgLy8gVGhlIGNoZWNrcyBiZWxvdyBhcmUgbm90IG5lY2Vzc2FyeSBhbmQgYXJlIGZvciBkZWJ1Z2dpbmcgb25seS4KKyAgICBpZiAoY2xpZW50LT5tQ2FtZXJhU2VydmljZS5nZXQoKSAhPSBnQ2FtZXJhU2VydmljZSkgeworICAgICAgICBMT0dFKCJtaXNtYXRjaCBzZXJ2aWNlISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoY2xpZW50LT5tSGFyZHdhcmUgPT0gMCkgeworICAgICAgICBMT0dFKCJtSGFyZHdhcmUgPT0gMDogY2FsbGJhY2sgYWZ0ZXIgZGlzY29ubmVjdCgpPyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY2xpZW50OworfQorCisvLyBDYWxsYmFjayBtZXNzYWdlcyBjYW4gYmUgZGlzcGF0Y2hlZCB0byBpbnRlcm5hbCBoYW5kbGVycyBvciBwYXNzIHRvIG91cgorLy8gY2xpZW50J3MgY2FsbGJhY2sgZnVuY3Rpb25zLCBkZXBlbmRpbmcgb24gdGhlIG1lc3NhZ2UgdHlwZS4KKy8vCisvLyBub3RpZnlDYWxsYmFjazoKKy8vICAgICAgQ0FNRVJBX01TR19TSFVUVEVSICAgICAgICAgICAgICBoYW5kbGVTaHV0dGVyCisvLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+bm90aWZ5Q2FsbGJhY2sKKy8vIGRhdGFDYWxsYmFjazoKKy8vICAgICAgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FICAgICAgICBoYW5kbGVQcmV2aWV3RGF0YQorLy8gICAgICBDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FICAgICAgIGhhbmRsZVBvc3R2aWV3CisvLyAgICAgIENBTUVSQV9NU0dfUkFXX0lNQUdFICAgICAgICAgICAgaGFuZGxlUmF3UGljdHVyZQorLy8gICAgICBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UgICAgIGhhbmRsZUNvbXByZXNzZWRQaWN0dXJlCisvLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrCisvLyBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAKKy8vICAgICAgKG90aGVycykgICAgICAgICAgICAgICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAKKy8vCisvLyBOT1RFOiB0aGUgKkNhbGxiYWNrIGZ1bmN0aW9ucyBncmFiIG1Mb2NrIG9mIHRoZSBjbGllbnQgYmVmb3JlIHBhc3NpbmcKKy8vIGNvbnRyb2wgdG8gaGFuZGxlKiBmdW5jdGlvbnMuIFNvIHRoZSBoYW5kbGUqIGZ1bmN0aW9ucyBtdXN0IHJlbGVhc2UgdGhlCisvLyBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZSBJQ2FtZXJhQ2xpZW50J3MgY2FsbGJhY2tzLCBzbyB0aG9zZSBjYWxsYmFja3MgY2FuCisvLyBpbnZva2UgbWV0aG9kcyBpbiB0aGUgQ2xpZW50IGNsYXNzIGFnYWluIChGb3IgZXhhbXBsZSwgdGhlIHByZXZpZXcgZnJhbWUKKy8vIGNhbGxiYWNrIG1heSB3YW50IHRvIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSkuIFRoZSBoYW5kbGUqIGZ1bmN0aW9ucyBtdXN0CisvLyByZWxlYXNlIHRoZSBsb2NrIGFmdGVyIGFsbCBhY2Nlc3NlcyB0byBtZW1iZXIgdmFyaWFibGVzLCBzbyBpdCBtdXN0IGJlCisvLyBoYW5kbGVkIHZlcnkgY2FyZWZ1bGx5LgorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6bm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsCisgICAgICAgIGludDMyX3QgZXh0Miwgdm9pZCogdXNlcikgeworICAgIExPRzIoIm5vdGlmeUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOworCisgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOworICAgIGlmIChjbGllbnQgPT0gMCkgcmV0dXJuOworICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CisKKyAgICBzd2l0Y2ggKG1zZ1R5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1NIVVRURVI6CisgICAgICAgICAgICAvLyBleHQxIGlzIHRoZSBkaW1lbnNpb24gb2YgdGhlIHl1diBwaWN0dXJlLgorICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVTaHV0dGVyKChpbWFnZV9yZWN0X3R5cGUgKilleHQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljTm90aWZ5KG1zZ1R5cGUsIGV4dDEsIGV4dDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpIHsKKyAgICBMT0cyKCJkYXRhQ2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7CisKKyAgICBzcDxDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudEZyb21Db29raWUodXNlcik7CisgICAgaWYgKGNsaWVudCA9PSAwKSByZXR1cm47CisgICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKKworICAgIGlmIChkYXRhUHRyID09IDApIHsKKyAgICAgICAgTE9HRSgiTnVsbCBkYXRhIHJldHVybmVkIGluIGRhdGEgY2FsbGJhY2siKTsKKyAgICAgICAgY2xpZW50LT5oYW5kbGVHZW5lcmljTm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChtc2dUeXBlKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FOgorICAgICAgICAgICAgY2xpZW50LT5oYW5kbGVQcmV2aWV3RGF0YShkYXRhUHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUU6CisgICAgICAgICAgICBjbGllbnQtPmhhbmRsZVBvc3R2aWV3KGRhdGFQdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX01TR19SQVdfSU1BR0U6CisgICAgICAgICAgICBjbGllbnQtPmhhbmRsZVJhd1BpY3R1cmUoZGF0YVB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0U6CisgICAgICAgICAgICBjbGllbnQtPmhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGRhdGFQdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNEYXRhKG1zZ1R5cGUsIGRhdGFQdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKSB7CisgICAgTE9HMigiZGF0YUNhbGxiYWNrVGltZXN0YW1wKCVkKSIsIG1zZ1R5cGUpOworCisgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOworICAgIGlmIChjbGllbnQgPT0gMCkgcmV0dXJuOworICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CisKKyAgICBpZiAoZGF0YVB0ciA9PSAwKSB7CisgICAgICAgIExPR0UoIk51bGwgZGF0YSByZXR1cm5lZCBpbiBkYXRhIHdpdGggdGltZXN0YW1wIGNhbGxiYWNrIik7CisgICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY05vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY0RhdGFUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyKTsKK30KKworLy8gc25hcHNob3QgdGFrZW4gY2FsbGJhY2sKKy8vICJzaXplIiBpcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB5dXYgcGljdHVyZSBmb3IgcmVnaXN0ZXJCdWZmZXIuCisvLyBJZiBpdCBpcyBOVUxMLCB1c2UgdGhlIHBpY3R1cmUgc2l6ZSBmcm9tIHBhcmFtZXRlcnMuCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpIHsKKyAgICBtQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKFNPVU5EX1NIVVRURVIpOworCisgICAgLy8gU2NyZWVuIGdvZXMgYmxhY2sgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1bnJlZ2lzdGVyZWQuCisgICAgaWYgKG1TdXJmYWNlICE9IDAgJiYgIW1Vc2VPdmVybGF5KSB7CisgICAgICAgIG1TdXJmYWNlLT51bnJlZ2lzdGVyQnVmZmVycygpOworICAgIH0KKworICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfU0hVVFRFUiwgMCwgMCk7CisgICAgICAgIGlmICghbG9ja0lmTWVzc2FnZVdhbnRlZChDQU1FUkFfTVNHX1NIVVRURVIpKSByZXR1cm47CisgICAgfQorICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfU0hVVFRFUik7CisKKyAgICAvLyBJdCB0YWtlcyBzb21lIHRpbWUgYmVmb3JlIHl1dlBpY3R1cmUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkLgorICAgIC8vIFJlZ2lzdGVyIHRoZSBidWZmZXIgZm9yIHJhdyBpbWFnZSBoZXJlIHRvIHJlZHVjZSBsYXRlbmN5LgorICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgeworICAgICAgICBpbnQgdywgaDsKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICBpZiAoc2l6ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBwYXJhbXMuZ2V0UGljdHVyZVNpemUoJncsICZoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHcgPSBzaXplLT53aWR0aDsKKyAgICAgICAgICAgIGggPSBzaXplLT5oZWlnaHQ7CisgICAgICAgICAgICB3ICY9IH4xOworICAgICAgICAgICAgaCAmPSB+MTsKKyAgICAgICAgICAgIExPRzEoIlNuYXBzaG90IGltYWdlIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCB3LCBoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogZG9uJ3QgdXNlIGhhcmRjb2RlZCBmb3JtYXQgY29uc3RhbnRzIGhlcmUKKyAgICAgICAgSVN1cmZhY2U6OkJ1ZmZlckhlYXAgYnVmZmVycyh3LCBoLCB3LCBoLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1AsIG1PcmllbnRhdGlvbiwgMCwKKyAgICAgICAgICAgIG1IYXJkd2FyZS0+Z2V0UmF3SGVhcCgpKTsKKworICAgICAgICBtU3VyZmFjZS0+cmVnaXN0ZXJCdWZmZXJzKGJ1ZmZlcnMpOworICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorCisgICAgbUxvY2sudW5sb2NrKCk7Cit9CisKKy8vIHByZXZpZXcgY2FsbGJhY2sgLSBmcmFtZSBidWZmZXIgdXBkYXRlCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlUHJldmlld0RhdGEoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgeworICAgIHNzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworCisgICAgaWYgKCFtVXNlT3ZlcmxheSkgeworICAgICAgICBpZiAobVN1cmZhY2UgIT0gMCkgeworICAgICAgICAgICAgbVN1cmZhY2UtPnBvc3RCdWZmZXIob2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGxvY2FsIGNvcHkgb2YgdGhlIGNhbGxiYWNrIGZsYWdzCisgICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7CisKKyAgICAvLyBpcyBjYWxsYmFjayBlbmFibGVkPworICAgIGlmICghKGZsYWdzICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSykpIHsKKyAgICAgICAgLy8gSWYgdGhlIGVuYWJsZSBiaXQgaXMgb2ZmLCB0aGUgY29weS1vdXQgYW5kIG9uZS1zaG90IGJpdHMgYXJlIGlnbm9yZWQKKyAgICAgICAgTE9HMigiZnJhbWUgY2FsbGJhY2sgaXMgZGlzYWJsZWQiKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBob2xkIGEgc3Ryb25nIHBvaW50ZXIgdG8gdGhlIGNsaWVudAorICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworCisgICAgLy8gY2xlYXIgY2FsbGJhY2sgZmxhZ3MgaWYgbm8gY2xpZW50IG9yIG9uZS1zaG90IG1vZGUKKyAgICBpZiAoYyA9PSAwIHx8IChtUHJldmlld0NhbGxiYWNrRmxhZyAmIEZSQU1FX0NBTExCQUNLX0ZMQUdfT05FX1NIT1RfTUFTSykpIHsKKyAgICAgICAgTE9HMigiRGlzYWJsZSBwcmV2aWV3IGNhbGxiYWNrIik7CisgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnICY9IH4oRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spOworICAgICAgICBpZiAobVVzZU92ZXJsYXkpIHsKKyAgICAgICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYyAhPSAwKSB7CisgICAgICAgIC8vIElzIHRoZSByZWNlaXZlZCBmcmFtZSBjb3BpZWQgb3V0IG9yIG5vdD8KKyAgICAgICAgaWYgKGZsYWdzICYgRlJBTUVfQ0FMTEJBQ0tfRkxBR19DT1BZX09VVF9NQVNLKSB7CisgICAgICAgICAgICBMT0cyKCJmcmFtZSBpcyBjb3BpZWQiKTsKKyAgICAgICAgICAgIGNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZShjLCBoZWFwLCBvZmZzZXQsIHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HMigiZnJhbWUgaXMgZm9yd2FyZGVkIik7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFjayhDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUsIG1lbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHBpY3R1cmUgY2FsbGJhY2sgLSBwb3N0dmlldyBpbWFnZSByZWFkeQordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZVBvc3R2aWV3KGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKKyAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BPU1RWSUVXX0ZSQU1FKTsKKworICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworICAgIG1Mb2NrLnVubG9jaygpOworICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUsIG1lbSk7CisgICAgfQorfQorCisvLyBwaWN0dXJlIGNhbGxiYWNrIC0gcmF3IGltYWdlIHJlYWR5Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlUmF3UGljdHVyZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKSB7CisgICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19SQVdfSU1BR0UpOworCisgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7CisKKyAgICAvLyBQdXQgdGhlIFlVViB2ZXJzaW9uIG9mIHRoZSBzbmFwc2hvdCBpbiB0aGUgcHJldmlldyBkaXNwbGF5LgorICAgIGlmIChtU3VyZmFjZSAhPSAwICYmICFtVXNlT3ZlcmxheSkgeworICAgICAgICBtU3VyZmFjZS0+cG9zdEJ1ZmZlcihvZmZzZXQpOworICAgIH0KKworICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworICAgIG1Mb2NrLnVubG9jaygpOworICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBtZW0pOworICAgIH0KK30KKworLy8gcGljdHVyZSBjYWxsYmFjayAtIGNvbXByZXNzZWQgcGljdHVyZSByZWFkeQordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKKyAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpOworCisgICAgc3A8SUNhbWVyYUNsaWVudD4gYyA9IG1DYW1lcmFDbGllbnQ7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgaWYgKGMgIT0gMCkgeworICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLCBtZW0pOworICAgIH0KK30KKworCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6aGFuZGxlR2VuZXJpY05vdGlmeShpbnQzMl90IG1zZ1R5cGUsCisgICAgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpIHsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICBpZiAoYyAhPSAwKSB7CisgICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrKG1zZ1R5cGUsIGV4dDEsIGV4dDIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZUdlbmVyaWNEYXRhKGludDMyX3QgbXNnVHlwZSwKKyAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgeworICAgIHNwPElDYW1lcmFDbGllbnQ+IGMgPSBtQ2FtZXJhQ2xpZW50OworICAgIG1Mb2NrLnVubG9jaygpOworICAgIGlmIChjICE9IDApIHsKKyAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKG1zZ1R5cGUsIGRhdGFQdHIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmhhbmRsZUdlbmVyaWNEYXRhVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAorICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpIHsKKyAgICBzcDxJQ2FtZXJhQ2xpZW50PiBjID0gbUNhbWVyYUNsaWVudDsKKyAgICBtTG9jay51bmxvY2soKTsKKyAgICBpZiAoYyAhPSAwKSB7CisgICAgICAgIGMtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ1R5cGUsIGRhdGFQdHIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZSgKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCwgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIExPRzIoImNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZSIpOwogICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBjb3B5IG91dCBvZiBwbWVtIGJlZm9yZSBzZW5kaW5nIHRoaXMgdG8KICAgICAvLyB0aGUgY2FsbGJhY2suIEZvciBlZmZpY2llbmN5LCByZXVzZSB0aGUgc2FtZSBNZW1vcnlIZWFwQmFzZQogICAgIC8vIHByb3ZpZGVkIGl0J3MgYmlnIGVub3VnaC4gRG9uJ3QgYWxsb2NhdGUgdGhlIG1lbW9yeSBvcgogICAgIC8vIHBlcmZvcm0gdGhlIGNvcHkgaWYgdGhlcmUncyBubyBjYWxsYmFjay4KLQogICAgIC8vIGhvbGQgdGhlIHByZXZpZXcgbG9jayB3aGlsZSB3ZSBncmFiIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aWV3IGJ1ZmZlcgogICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBwcmV2aWV3QnVmZmVyOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVByZXZpZXdMb2NrKTsKLSAgICAgICAgaWYgKG1QcmV2aWV3QnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIE5VTEwpOwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiBtUHJldmlld0J1ZmZlci0+dmlydHVhbFNpemUoKSkgewotICAgICAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyID0gbmV3IE1lbW9yeUhlYXBCYXNlKHNpemUsIDAsIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHByZXZpZXcgYnVmZmVyIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJldmlld0J1ZmZlciA9IG1QcmV2aWV3QnVmZmVyOworCisgICAgaWYgKG1QcmV2aWV3QnVmZmVyID09IDApIHsKKyAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7CisgICAgfSBlbHNlIGlmIChzaXplID4gbVByZXZpZXdCdWZmZXItPnZpcnR1YWxTaXplKCkpIHsKKyAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7CiAgICAgfQotICAgIG1lbWNweShwcmV2aWV3QnVmZmVyLT5iYXNlKCksCi0gICAgICAgICAgICh1aW50OF90ICopaGVhcC0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKKyAgICBpZiAobVByZXZpZXdCdWZmZXIgPT0gMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHByZXZpZXcgYnVmZmVyIik7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHByZXZpZXdCdWZmZXIgPSBtUHJldmlld0J1ZmZlcjsKKworICAgIG1lbWNweShwcmV2aWV3QnVmZmVyLT5iYXNlKCksICh1aW50OF90ICopaGVhcC0+YmFzZSgpICsgb2Zmc2V0LCBzaXplKTsKIAogICAgIHNwPE1lbW9yeUJhc2U+IGZyYW1lID0gbmV3IE1lbW9yeUJhc2UocHJldmlld0J1ZmZlciwgMCwgc2l6ZSk7CiAgICAgaWYgKGZyYW1lID09IDApIHsKICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBmcmFtZSBjYWxsYmFjayIpOworICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGNsaWVudC0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSwgZnJhbWUpOwogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOwogCkBAIC0xMzA2LDggKzEyMTQsNyBAQAogICAgIHJldHVybiBsb2NrZWQ7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoteworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0RlYWRsb2NrZWRTdHJpbmcgPSAiQ2FtZXJhU2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwpAQCAtMTMxNyw3ICsxMjI0LDcgQEAKICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6ICIKICAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBDYW1lcmFTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9IGVsc2UgewpAQCAtMTMyOCw4OSArMTIzNSwzOSBAQAogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgICAgICBzcDxDbGllbnQ+IGN1cnJlbnRDbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiQ2xpZW50ICglcCkgUElEOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudENsaWVudC0+Z2V0Q2FtZXJhQ2xpZW50KCktPmFzQmluZGVyKCkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDbGllbnQtPm1DbGllbnRQaWQpOworICAgICAgICBib29sIGhhc0NsaWVudCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBtQ2xpZW50W2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBoYXNDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICJDbGllbnRbJWRdICglcCkgUElEOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRDYW1lcmFDbGllbnQoKS0+YXNCaW5kZXIoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5tQ2xpZW50UGlkKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICAgICAgY3VycmVudENsaWVudC0+bUhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsaWVudC0+bUhhcmR3YXJlLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0NsaWVudCkgewogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiTm8gY2FtZXJhIGNsaWVudCB5ZXQuXG4iKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOworCisgICAgICAgIC8vIGNoYW5nZSBsb2dnaW5nIGxldmVsCisgICAgICAgIGludCBuID0gYXJncy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICsgMSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi12IikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGxldmVsU3RyKGFyZ3NbaSsxXSk7CisgICAgICAgICAgICAgICAgaW50IGxldmVsID0gYXRvaShsZXZlbFN0ci5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICJTZXQgTG9nIExldmVsIHRvICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBzZXRMb2dMZXZlbChsZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyBwZXJtaXNzaW9uIGNoZWNrcy4uLgotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVDoKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHNlbGZfcGlkID0gZ2V0cGlkKCk7Ci0gICAgICAgICAgICBpZiAocGlkICE9IHNlbGZfcGlkKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2UncmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcywgZG8gdGhlIHJlYWwgY2hlY2sKLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQSIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBpcGMtPmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgdXNlIHRoZSBjYW1lcmEgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBCbkNhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLQotI2lmIERFQlVHX0hFQVBfTEVBS1MKLSAgICBMT0dWKCIrKysgb25UcmFuc2FjdCBlcnIgJWQgY29kZSAlZCIsIGVyciwgY29kZSk7Ci0KLSAgICBpZiAoZXJyID09IFVOS05PV05fVFJBTlNBQ1RJT04gfHwgZXJyID09IFBFUk1JU1NJT05fREVOSUVEKSB7Ci0gICAgICAgIC8vIHRoZSAnc2VydmljZScgY29tbWFuZCBpbnRlcnJvZ2F0ZXMgdGhpcyBiaW5kZXIgZm9yIGl0cyBuYW1lLCBhbmQgdGhlbiBzdXBwbGllcyBpdAotICAgICAgICAvLyBldmVuIGZvciB0aGUgZGVidWdnaW5nIGNvbW1hbmRzLiAgdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBpdCBoZXJlLCB1c2luZwotICAgICAgICAvLyBJU3VyZmFjZUNvbXBvc2VyIChzaW5jZSB3ZSBkZWxlZ2F0ZWQgdGhlIElOVEVSRkFDRV9UUkFOU0FDVElPTiBoYW5kbGluZyB0bwotICAgICAgICAvLyBCblN1cmZhY2VDb21wb3NlciBiZWZvcmUgZmFsbGluZyB0aHJvdWdoIHRvIHRoaXMgY29kZSkuCi0KLSAgICAgICAgTE9HVigiKysrIG9uVHJhbnNhY3QgY29kZSAlZCIsIGNvZGUpOwotCi0gICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhU2VydmljZSwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgMTAwMDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdXZWFrSGVhcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGggPSBnV2Vha0hlYXAucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgIElNZW1vcnlIZWFwICpwID0gZ1dlYWtIZWFwLnVuc2FmZV9nZXQoKTsKLSAgICAgICAgICAgICAgICBMT0dWKCJDSEVDS0lORyBXRUFLIFJFRkVSRU5DRSAlcCAoJXApIiwgaC5nZXQoKSwgcCk7Ci0gICAgICAgICAgICAgICAgaWYgKGggIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgaC0+cHJpbnRSZWZzKCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBhdHRlbXB0X3RvX2RlbGV0ZSA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdF90b19kZWxldGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTk9UIFNBRkUhCi0gICAgICAgICAgICAgICAgICAgIExPR1YoIkRFTEVUSU5HIFdFQUsgUkVGRVJFTkNFICVwICglcCkiLCBoLmdldCgpLCBwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHApIGRlbGV0ZSBwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvLyBERUJVR19IRUFQX0xFQUtTCi0KLSAgICByZXR1cm4gZXJyOwotfQotCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDc1ZTk2YzYuLjBkNjk4MzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE4LDIwOSArMTgsMTgyIEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAKKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorCiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgorCisvKiBUaGlzIG5lZWRzIHRvIGJlIGluY3JlYXNlZCBpZiB3ZSBjYW4gaGF2ZSBtb3JlIGNhbWVyYXMgKi8KKyNkZWZpbmUgTUFYX0NBTUVSQVMgMgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1lbW9yeUhlYXBCYXNlOwogY2xhc3MgTWVkaWFQbGF5ZXI7CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQotI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQotCi0vLyBXaGVuIGVuYWJsZWQsIHRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIHNlbmQgYW4gZXZlbnQgdG8gdGhlIENhbWVyYVNlcnZpY2UKLS8vIHNvIHRoYXQgeW91IGNhbiBjYXVzZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUgaGVhcCBvYmplY3QgZ1dlYWtIZWFwLCBkZWZpbmVkCi0vLyBiZWxvdywgdG8gYmUgcHJpbnRlZC4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIHNldCBERUJVR19SRUZTPTEgYW5kCi0vLyBERUJVR19SRUZTX0VOQUJMRURfQllfREVGQVVMVD0wIGluIGxpYnV0aWxzL1JlZkJhc2UuY3BwLiBZb3UganVzdCBoYXZlIHRvCi0vLyBzZXQgZ1dlYWtIZWFwIHRvIHRoZSBhcHByb3ByaWF0ZSBoZWFwIHlvdSB3YW50IHRvIHRyYWNrLgotCi0jZGVmaW5lIERFQlVHX0hFQVBfTEVBS1MgMAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENhbWVyYVNlcnZpY2UgOiBwdWJsaWMgQm5DYW1lcmFTZXJ2aWNlCitjbGFzcyBDYW1lcmFTZXJ2aWNlIDoKKyAgICBwdWJsaWMgQmluZGVyU2VydmljZTxDYW1lcmFTZXJ2aWNlPiwKKyAgICBwdWJsaWMgQm5DYW1lcmFTZXJ2aWNlCiB7CiAgICAgY2xhc3MgQ2xpZW50OwotCisgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8Q2FtZXJhU2VydmljZT47CiBwdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKTsKKyAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuY2FtZXJhIjsgfQogCi0gICAgLy8gSUNhbWVyYVNlcnZpY2UgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzcDxJQ2FtZXJhPiAgICAgY29ubmVjdChjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVNlcnZpY2UoKTsKKyAgICB2aXJ0dWFsICAgICAgICAgICAgIH5DYW1lcmFTZXJ2aWNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgdmlydHVhbCBpbnQzMl90ICAgICBnZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CisgICAgdmlydHVhbCBzcDxJQ2FtZXJhPiBjb25uZWN0KGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsIGludCBjYW1lcmFJZCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICByZW1vdmVDbGllbnQoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCk7CisgICAgdmlydHVhbCBzcDxDbGllbnQ+ICBnZXRDbGllbnRCeUlkKGludCBjYW1lcmFJZCk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICByZW1vdmVDbGllbnQoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKKyAgICBlbnVtIHNvdW5kX2tpbmQgeworICAgICAgICBTT1VORF9TSFVUVEVSID0gMCwKKyAgICAgICAgU09VTkRfUkVDT1JESU5HID0gMSwKKyAgICAgICAgTlVNX1NPVU5EUworICAgIH07CisKKyAgICB2b2lkICAgICAgICAgICAgICAgIGxvYWRTb3VuZCgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgcGxheVNvdW5kKHNvdW5kX2tpbmQga2luZCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICByZWxlYXNlU291bmQoKTsKIAogcHJpdmF0ZToKKyAgICBNdXRleCAgICAgICAgICAgICAgIG1TZXJ2aWNlTG9jazsKKyAgICB3cDxDbGllbnQ+ICAgICAgICAgIG1DbGllbnRbTUFYX0NBTUVSQVNdOyAgLy8gcHJvdGVjdGVkIGJ5IG1TZXJ2aWNlTG9jaworICAgIGludCAgICAgICAgICAgICAgICAgbU51bWJlck9mQ2FtZXJhczsKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIGF0b21pY3MgdG8gcmVjb3JkIHdoZXRoZXIgdGhlIGhhcmR3YXJlIGlzIGFsbG9jYXRlZCB0byBzb21lIGNsaWVudC4KKyAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1CdXN5W01BWF9DQU1FUkFTXTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldENhbWVyYUJ1c3koaW50IGNhbWVyYUlkKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNldENhbWVyYUZyZWUoaW50IGNhbWVyYUlkKTsKIAotICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBCbkNhbWVyYSB7CisgICAgLy8gc291bmRzCisgICAgTXV0ZXggICAgICAgICAgICAgICBtU291bmRMb2NrOworICAgIHNwPE1lZGlhUGxheWVyPiAgICAgbVNvdW5kUGxheWVyW05VTV9TT1VORFNdOworICAgIGludCAgICAgICAgICAgICAgICAgbVNvdW5kUmVmOyAgLy8gcmVmZXJlbmNlIGNvdW50IChyZWxlYXNlIGFsbCBNZWRpYVBsYXllciB3aGVuIDApCiAKKyAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgQm5DYW1lcmEKKyAgICB7CiAgICAgcHVibGljOgorICAgICAgICAvLyBJQ2FtZXJhIGludGVyZmFjZSAoc2VlIElDYW1lcmEgZm9yIGRldGFpbHMpCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAvLyBjb25uZWN0IG5ldyBjbGllbnQgd2l0aCBleGlzdGluZyBjYW1lcmEgcmVtb3RlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNvbm5lY3QoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCk7Ci0KLSAgICAgICAgLy8gcHJldmVudCBvdGhlciBwcm9jZXNzZXMgZnJvbSB1c2luZyB0aGlzIElDYW1lcmEgaW50ZXJmYWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGxvY2soKTsKLQotICAgICAgICAvLyBhbGxvdyBvdGhlciBwcm9jZXNzZXMgdG8gdXNlIHRoaXMgSUNhbWVyYSBpbnRlcmZhY2UKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgdW5sb2NrKCk7Ci0KLSAgICAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSVN1cmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFByZXZpZXdEaXNwbGF5KGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyZmFjZSk7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KLSAgICAgICAgLy8gcHJldmlldyBhcmUgaGFuZGxlZC4KLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZyk7Ci0KLSAgICAgICAgLy8gc3RhcnQgcHJldmlldyBtb2RlLCBtdXN0IGNhbGwgc2V0UHJldmlld0Rpc3BsYXkgZmlyc3QKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgZmxhZyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UHJldmlldygpOwotCi0gICAgICAgIC8vIHN0b3AgcHJldmlldyBtb2RlCiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7Ci0KLSAgICAgICAgLy8gZ2V0IHByZXZpZXcgc3RhdGUKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcHJldmlld0VuYWJsZWQoKTsKLQotICAgICAgICAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydFJlY29yZGluZygpOwotCi0gICAgICAgIC8vIHN0b3AgcmVjb3JkaW5nIG1vZGUKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcFJlY29yZGluZygpOwotCi0gICAgICAgIC8vIGdldCByZWNvcmRpbmcgc3RhdGUKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICAgICAgcmVjb3JkaW5nRW5hYmxlZCgpOwotCi0gICAgICAgIC8vIHJlbGVhc2UgYSByZWNvcmRpbmcgZnJhbWUKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwotCi0gICAgICAgIC8vIGF1dG8gZm9jdXMKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgYXV0b0ZvY3VzKCk7Ci0KLSAgICAgICAgLy8gY2FuY2VsIGF1dG8gZm9jdXMKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgY2FuY2VsQXV0b0ZvY3VzKCk7Ci0KLSAgICAgICAgLy8gdGFrZSBhIHBpY3R1cmUgLSByZXR1cm5zIGFuIElNZW1vcnkgKHJlZi1jb3VudGVkIG1tYXApCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHRha2VQaWN0dXJlKCk7Ci0KLSAgICAgICAgLy8gc2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKTsKLQotICAgICAgICAvLyBnZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKICAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICAgICAgZ2V0UGFyYW1ldGVycygpIGNvbnN0OwotCi0gICAgICAgIC8vIHNlbmQgY29tbWFuZCB0byBjYW1lcmEgZHJpdmVyCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMik7Ci0KLSAgICAgICAgLy8gb3VyIGNsaWVudC4uLgotICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgICAgZ2V0Q2FtZXJhQ2xpZW50KCkgY29uc3QgeyByZXR1cm4gbUNhbWVyYUNsaWVudDsgfQotCiAgICAgcHJpdmF0ZToKICAgICAgICAgZnJpZW5kIGNsYXNzIENhbWVyYVNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCgpOwotICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+Q2xpZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+JiBoYXJkd2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+Q2xpZW50KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgY2hlY2tQaWQoKTsKKyAgICAgICAgLy8gcmV0dXJuIG91ciBjYW1lcmEgY2xpZW50CisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiAgICBnZXRDYW1lcmFDbGllbnQoKSB7IHJldHVybiBtQ2FtZXJhQ2xpZW50OyB9CiAKLSAgICAgICAgc3RhdGljICAgICAgdm9pZCAgICAgICAgbm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Miwgdm9pZCogdXNlcik7Ci0gICAgICAgIHN0YXRpYyAgICAgIHZvaWQgICAgICAgIGRhdGFDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKTsKLSAgICAgICAgc3RhdGljICAgICAgdm9pZCAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcik7CisgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgdGhlIGNhbGxpbmcgcHJvY2VzcyBtYXRjaGVzIG1DbGllbnRQaWQuCisgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIGNoZWNrUGlkKCkgY29uc3Q7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdDsgIC8vIGFsc28gY2hlY2sgbUhhcmR3YXJlICE9IDAKIAotICAgICAgICBzdGF0aWMgICAgICBzcDxDbGllbnQ+ICBnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVByZXZpZXdEYXRhKGNvbnN0IHNwPElNZW1vcnk+Jik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVNodXR0ZXIoaW1hZ2VfcmVjdF90eXBlICppbWFnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVBvc3R2aWV3KGNvbnN0IHNwPElNZW1vcnk+Jik7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVJhd1BpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlQ29tcHJlc3NlZFBpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mKTsKLQotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5RnJhbWVBbmRQb3N0Q29waWVkRnJhbWUoY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworICAgICAgICAvLyB0aGVzZSBhcmUgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gc2V0IHVwIHByZXZpZXcgYnVmZmVycworICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICByZWdpc3RlclByZXZpZXdCdWZmZXJzKCk7CisgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldE92ZXJsYXkoKTsKIAogICAgICAgICAvLyBjYW1lcmEgb3BlcmF0aW9uIG1vZGUKICAgICAgICAgZW51bSBjYW1lcmFfbW9kZSB7CiAgICAgICAgICAgICBDQU1FUkFfUFJFVklFV19NT0RFICAgPSAwLCAgLy8gZnJhbWUgYXV0b21hdGljYWxseSByZWxlYXNlZAogICAgICAgICAgICAgQ0FNRVJBX1JFQ09SRElOR19NT0RFID0gMSwgIC8vIGZyYW1lIGhhcyB0byBiZSBleHBsaWNpdGx5IHJlbGVhc2VkIGJ5IHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpCiAgICAgICAgIH07CisgICAgICAgIC8vIHRoZXNlIGFyZSBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCBmb3IgcHJldmlldy9yZWNvcmRpbmcKICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRDYW1lcmFNb2RlKGNhbWVyYV9tb2RlIG1vZGUpOwogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydFByZXZpZXdNb2RlKCk7CiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHN0YXJ0UmVjb3JkaW5nTW9kZSgpOwotICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRPdmVybGF5KCk7Ci0gICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJldmlld0J1ZmZlcnMoKTsKKworICAgICAgICAvLyB0aGVzZSBhcmUgc3RhdGljIGNhbGxiYWNrIGZ1bmN0aW9ucworICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKTsKKyAgICAgICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgZGF0YUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpOworICAgICAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIHZvaWQqIHVzZXIpOworICAgICAgICAvLyBjb252ZXJ0IGNsaWVudCBmcm9tIGNvb2tpZQorICAgICAgICBzdGF0aWMgc3A8Q2xpZW50PiAgICAgICBnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpOworICAgICAgICAvLyBoYW5kbGVycyBmb3IgbWVzc2FnZXMKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcihpbWFnZV9yZWN0X3R5cGUgKnNpemUpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVQcmV2aWV3RGF0YShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlUG9zdHZpZXcoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJhd1BpY3R1cmUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljTm90aWZ5KGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVHZW5lcmljRGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyKTsKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlR2VuZXJpY0RhdGFUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOworCisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICAgICAgLy8gdGhlc2UgYXJlIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgc3A8Q2FtZXJhU2VydmljZT4gICAgICAgICAgICAgICBtQ2FtZXJhU2VydmljZTsgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgorICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiAgICAgICAgICAgICAgIG1DYW1lcmFDbGllbnQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkOyAgICAgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOworICAgICAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gICAgIG1IYXJkd2FyZTsgICAgICAgLy8gY2xlYXJlZCBhZnRlciBkaXNjb25uZWN0KCkKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXNlT3ZlcmxheTsgICAgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgorICAgICAgICBzcDxPdmVybGF5UmVmPiAgICAgICAgICAgICAgICAgIG1PdmVybGF5UmVmOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdmVybGF5VzsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcmxheUg7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWc7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uOwogCiAgICAgICAgIC8vIEVuc3VyZXMgYXRvbWljaXR5IGFtb25nIHRoZSBwdWJsaWMgbWV0aG9kcwotICAgICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAKLSAgICAgICAgLy8gbVN1cmZhY2VMb2NrIHN5bmNocm9uaXplcyBhY2Nlc3MgdG8gbVN1cmZhY2UgYmV0d2VlbgotICAgICAgICAvLyBzZXRQcmV2aWV3U3VyZmFjZSgpIGFuZCBwb3N0UHJldmlld0ZyYW1lKCkuICBOb3RlIHRoYXQgYW1vbmcKLSAgICAgICAgLy8gdGhlIHB1YmxpYyBtZXRob2RzLCBhbGwgYWNjZXNzZXMgdG8gbVN1cmZhY2UgYXJlCi0gICAgICAgIC8vIHN5bmNyaG9uaXplZCBieSBtTG9jay4gIEhvd2V2ZXIsIHBvc3RQcmV2aWV3RnJhbWUoKSBpcyBjYWxsZWQKLSAgICAgICAgLy8gYnkgdGhlIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIGNhbGxiYWNrLCBhbmQgbmVlZHMgdG8KLSAgICAgICAgLy8gYWNjZXNzIG1TdXJmYWNlLiAgSXQgY2Fubm90IGhvbGQgbUxvY2ssIGhvd2V2ZXIsIGJlY2F1c2UKLSAgICAgICAgLy8gc3RvcFByZXZpZXcoKSBtYXkgYmUgaG9sZGluZyB0aGF0IGxvY2sgd2hpbGUgYXR0ZW1wdGluZwotICAgICAgICAvLyB0byBzdG9wIHByZXZpZXcsIGFuZCBzdG9wUHJldmlldyBpdHNlbGYgd2lsbCBibG9jayB3YWl0aW5nCi0gICAgICAgIC8vIGZvciBhIGNhbGxiYWNrIGZyb20gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuICBJZiB0aGlzCi0gICAgICAgIC8vIGhhcHBlbnMsIGl0IHdpbGwgY2F1c2UgYSBkZWFkbG9jay4KLSAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlTG9jazsKLSAgICAgICAgbXV0YWJsZSAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgIG1SZWFkeTsKLSAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZT4gICAgICAgICAgIG1DYW1lcmFTZXJ2aWNlOwotICAgICAgICAgICAgICAgICAgICBzcDxJU3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlld0NhbGxiYWNrRmxhZzsKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsKKyAgICAgICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCisgICAgICAgIC8vIG9mIHRoZSBvcmlnaW5hbCBvbmUpLCB3ZSBhbGxvY2F0ZSBtUHJldmlld0J1ZmZlciBhbmQgcmV1c2UgaXQgaWYgcG9zc2libGUuCisgICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiAgICAgICAgICAgICAgbVByZXZpZXdCdWZmZXI7CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXI+ICAgICAgICAgICAgIG1NZWRpYVBsYXllckNsaWNrOwotICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllcj4gICAgICAgICAgICAgbU1lZGlhUGxheWVyQmVlcDsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBhdm9pZCB0aGUgZGVhZGxvY2sgd2hlbiB0aGUgaW5jb21pbmcgY29tbWFuZCB0aHJlYWQgYW5kCisgICAgICAgIC8vIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSBjYWxsYmFjayB0aHJlYWQgYm90aCB3YW50IHRvIGdyYWIgbUxvY2suCisgICAgICAgIC8vIEFuIGV4dHJhIGZsYWcgaXMgdXNlZCB0byB0ZWxsIHRoZSBjYWxsYmFjayB0aHJlYWQgdGhhdCBpdCBzaG91bGQgc3RvcAorICAgICAgICAvLyB0cnlpbmcgdG8gZGVsaXZlciB0aGUgY2FsbGJhY2sgbWVzc2FnZXMgaWYgdGhlIGNsaWVudCBpcyBub3QKKyAgICAgICAgLy8gaW50ZXJlc3RlZCBpbiBpdCBhbnltb3JlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNsaWVudCBpcyBjYWxsaW5nCisgICAgICAgIC8vIHN0b3BQcmV2aWV3KCksIHRoZSBwcmV2aWV3IGZyYW1lIG1lc3NhZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIGRlbGl2ZXJlZAorICAgICAgICAvLyBhbnltb3JlLgogCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBpbW11dGFibGUgb25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBwcm90ZWN0ZWQgYnkgYSBsb2NrCi0gICAgICAgICAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+ICAgICAgICAgICBtQ2FtZXJhQ2xpZW50OwotICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gbUhhcmR3YXJlOwotICAgICAgICAgICAgICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Vc2VPdmVybGF5OworICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzYW1lIHBhcmFtZXRlciBhcyB0aGUgZW5hYmxlTXNnVHlwZSgpIGFuZAorICAgICAgICAvLyBkaXNhYmxlTXNnVHlwZSgpIGZ1bmN0aW9ucyBpbiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS4KKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkaXNhYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOworICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICBtTXNnRW5hYmxlZDsKIAotICAgICAgICAgICAgICAgICAgICBzcDxPdmVybGF5UmVmPiAgICAgICAgICAgICAgbU92ZXJsYXlSZWY7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcmxheVc7Ci0gICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtT3ZlcmxheUg7Ci0KLSAgICAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3TG9jazsKLSAgICAgICAgICAgICAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+ICAgICAgICAgIG1QcmV2aWV3QnVmZmVyOworICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyeWluZyB0byBncmFiIG1Mb2NrLCBvciBnaXZlIHVwIGlmIHRoZSBtZXNzYWdlCisgICAgICAgIC8vIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkLiBJdCByZXR1cm5zIHRydWUgaWYgbUxvY2sgaXMgZ3JhYmJlZC4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbG9ja0lmTWVzc2FnZVdhbnRlZChpbnQzMl90IG1zZ1R5cGUpOwogICAgIH07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYVNlcnZpY2UoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+Q2FtZXJhU2VydmljZSgpOwotCi0gICAgLy8gV2UgdXNlIGEgY291bnQgZm9yIG51bWJlciBvZiBjbGllbnRzIChzaG91bGUgb25seSBiZSAwIG9yIDEpLgotICAgIHZvbGF0aWxlICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtVXNlcnM7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGluY1VzZXJzKCk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgIGRlY1VzZXJzKCk7Ci0KLSAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOwotICAgICAgICAgICAgICAgIHdwPENsaWVudD4gICAgICAgICAgICAgICAgICBtQ2xpZW50OwotCi0jaWYgREVCVUdfSEVBUF9MRUFLUwotICAgICAgICAgICAgICAgIHdwPElNZW1vcnlIZWFwPiAgICAgICAgICAgICBnV2Vha0hlYXA7Ci0jZW5kaWYKIH07CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9GYWtlQ2FtZXJhLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuY3BwCmluZGV4IDY3NDk4OTkuLmYzYTZhNjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuY3BwCkBAIC0xOTgsMTAgKzE5OCwxMSBAQAogc3RhdGljIGNvbnN0IGludCAgREVMVEEgID0ga1liKigxIDw8IFNISUZUMik7CiBzdGF0aWMgY29uc3QgaW50ICBHQU1NQSAgPSBrWXIqKDEgPDwgU0hJRlQyKTsKIAotaW50MzJfdCBjY3JnYjE2dG95dXZfd29fY29sb3JrZXkodWludDhfdCAqcmdiMTYsdWludDhfdCAqeXV2NDIyLHVpbnQzMl90ICpwYXJhbSx1aW50OF90ICp0YWJsZVtdKQoraW50MzJfdCBjY3JnYjE2dG95dXZfd29fY29sb3JrZXkodWludDhfdCAqcmdiMTYsIHVpbnQ4X3QgKnl1djQyMCwKKyAgICAgICAgdWludDMyX3QgKnBhcmFtLCB1aW50OF90ICp0YWJsZVtdKQogewogICAgIHVpbnQxNl90ICppbnB1dFJHQiA9ICh1aW50MTZfdCopcmdiMTY7Ci0gICAgdWludDhfdCAqb3V0WVVWID0gIHl1djQyMjsKKyAgICB1aW50OF90ICpvdXRZVVYgPSB5dXY0MjA7CiAgICAgaW50MzJfdCB3aWR0aF9kc3QgPSBwYXJhbVswXTsKICAgICBpbnQzMl90IGhlaWdodF9kc3QgPSBwYXJhbVsxXTsKICAgICBpbnQzMl90IHBpdGNoX2RzdCA9IHBhcmFtWzJdOwpAQCAtMjYwLDEyICsyNjEsMTQgQEAKIAogICAgICAgICAgICAgdGVtcFlbMF0gPSB5MDsKICAgICAgICAgICAgIHRlbXBZWzFdID0geTE7Ci0gICAgICAgICAgICB0ZW1wVVswXSA9IHU7Ci0gICAgICAgICAgICB0ZW1wVlswXSA9IHY7Ci0KICAgICAgICAgICAgIHRlbXBZICs9IDI7Ci0gICAgICAgICAgICB0ZW1wVSArPSAyOwotICAgICAgICAgICAgdGVtcFYgKz0gMjsKKworICAgICAgICAgICAgaWYgKChqJjEpID09IDApIHsKKyAgICAgICAgICAgICAgICB0ZW1wVVswXSA9IHU7CisgICAgICAgICAgICAgICAgdGVtcFZbMF0gPSB2OworICAgICAgICAgICAgICAgIHRlbXBVICs9IDI7CisgICAgICAgICAgICAgICAgdGVtcFYgKz0gMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlucHV0UkdCICs9IHBpdGNoX3NyYzsKQEAgLTI3Nyw3ICsyODAsNyBAQAogI2RlZmluZSBtaW4oYSxiKSAoKGEpPChiKT8oYSk6KGIpKQogI2RlZmluZSBtYXgoYSxiKSAoKGEpPihiKT8oYSk6KGIpKQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjE2X3RvX3l1djQyMih1aW50OF90ICpyZ2IsIHVpbnQ4X3QgKnl1diwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorc3RhdGljIHZvaWQgY29udmVydF9yZ2IxNl90b195dXY0MjAodWludDhfdCAqcmdiLCB1aW50OF90ICp5dXYsIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBpZiAoIXRhYmxlc19pbml0aWFsaXplZCkgewogICAgICAgICBpbml0WXRhYigpOwpAQCAtMzI2LDcgKzMyOSw3IEBACiAgICAgbUNoZWNrWSA9IDA7CiAKICAgICAvLyBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gYmUgcmVhbGxvY2F0ZWQgb24gdGhlIG5leHQgY2FsbAotICAgIC8vIHRvIGdldE5leHRGcmFtZUFzWXV2NDIyKCkuCisgICAgLy8gdG8gZ2V0TmV4dEZyYW1lQXNZdXY0MjAoKS4KICAgICBkZWxldGVbXSBtVG1wUmdiMTZCdWZmZXI7CiAgICAgbVRtcFJnYjE2QnVmZmVyID0gMDsKIH0KQEAgLTM0NywxMyArMzUwLDEzIEBACiAgICAgbUNvdW50ZXIrKzsKIH0KIAotdm9pZCBGYWtlQ2FtZXJhOjpnZXROZXh0RnJhbWVBc1l1djQyMih1aW50OF90ICpidWZmZXIpCit2b2lkIEZha2VDYW1lcmE6OmdldE5leHRGcmFtZUFzWXV2NDIwKHVpbnQ4X3QgKmJ1ZmZlcikKIHsKICAgICBpZiAobVRtcFJnYjE2QnVmZmVyID09IDApCiAgICAgICAgIG1UbXBSZ2IxNkJ1ZmZlciA9IG5ldyB1aW50MTZfdFttV2lkdGggKiBtSGVpZ2h0XTsKIAogICAgIGdldE5leHRGcmFtZUFzUmdiNTY1KG1UbXBSZ2IxNkJ1ZmZlcik7Ci0gICAgY29udmVydF9yZ2IxNl90b195dXY0MjIoKHVpbnQ4X3QqKW1UbXBSZ2IxNkJ1ZmZlciwgYnVmZmVyLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIGNvbnZlcnRfcmdiMTZfdG9feXV2NDIwKCh1aW50OF90KiltVG1wUmdiMTZCdWZmZXIsIGJ1ZmZlciwgbVdpZHRoLCBtSGVpZ2h0KTsKIH0KIAogdm9pZCBGYWtlQ2FtZXJhOjpkcmF3U3F1YXJlKHVpbnQxNl90ICpkc3QsIGludCB4LCBpbnQgeSwgaW50IHNpemUsIGludCBjb2xvciwgaW50IHNoYWRvdykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0Zha2VDYW1lcmEuaAppbmRleCBmN2Y4ODAzLi43MjRkZTIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9GYWtlQ2FtZXJhLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvRmFrZUNhbWVyYS5oCkBAIC00MCw3ICs0MCw3IEBACiAgICAgfkZha2VDYW1lcmEoKTsKIAogICAgIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgIHZvaWQgZ2V0TmV4dEZyYW1lQXNZdXY0MjIodWludDhfdCAqYnVmZmVyKTsKKyAgICB2b2lkIGdldE5leHRGcmFtZUFzWXV2NDIwKHVpbnQ4X3QgKmJ1ZmZlcik7CiAgICAgLy8gV3JpdGUgdG8gdGhlIGZkIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzdGF0ZS4KICAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5tawppbmRleCA5YmIxOTBhLi5jZjRlNDJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQW5kcm9pZC5tawpAQCAtMjEsNCArMjEsNiBAQAogICAgICAgICAgICAgICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgICAgICAgICAgICAgIGxpYnN1cmZhY2VmbGluZ2VyX2NsaWVudAogCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKyMgRGlzYWJsZSBpdCBiZWNhdXNlIHRoZSBJU3VyZmFjZSBpbnRlcmZhY2UgbWF5IGNoYW5nZSwgYW5kIGJlZm9yZSB3ZSBoYXZlIGEKKyMgY2hhbmNlIHRvIGZpeCB0aGlzIHRlc3QsIHdlIGRvbid0IHdhbnQgdG8gYnJlYWsgbm9ybWFsIGJ1aWxkcy4KKyNpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9DYW1lcmFTZXJ2aWNlVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvdGVzdHMvQ2FtZXJhU2VydmljZVRlc3QvQ2FtZXJhU2VydmljZVRlc3QuY3BwCmluZGV4IDlmYzc5NWIuLjNjOGQ1NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS90ZXN0cy9DYW1lcmFTZXJ2aWNlVGVzdC9DYW1lcmFTZXJ2aWNlVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL3Rlc3RzL0NhbWVyYVNlcnZpY2VUZXN0L0NhbWVyYVNlcnZpY2VUZXN0LmNwcApAQCAtMzgsNyArMzgsNyBAQAogICAgIElORk8oImFzc2VydGlvbiBmYWlsZWQgYXQgZmlsZSAlcywgbGluZSAlZCwgZnVuY3Rpb24gJXM6IiwKICAgICAgICAgICAgIGZpbGUsIGxpbmUsIGZ1bmMpOwogICAgIElORk8oIiVzIiwgZXhwcik7Ci0gICAgZXhpdCgxKTsKKyAgICBhYm9ydCgpOwogfQogCiB2b2lkIGFzc2VydF9lcV9mYWlsKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jLApAQCAtNDYsNyArNDYsNyBAQAogICAgIElORk8oImFzc2VydGlvbiBmYWlsZWQgYXQgZmlsZSAlcywgbGluZSAlZCwgZnVuY3Rpb24gJXM6IiwKICAgICAgICAgICAgIGZpbGUsIGxpbmUsIGZ1bmMpOwogICAgIElORk8oIihleHBlY3RlZCkgJXMgIT0gKGFjdHVhbCkgJWQiLCBleHByLCBhY3R1YWwpOwotICAgIGV4aXQoMSk7CisgICAgYWJvcnQoKTsKIH0KIAogI2RlZmluZSBBU1NFUlQoZSkgXApAQCAtMTU1LDcgKzE1NSw3IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpOwogICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSk7CiAgICAgdmlydHVhbCB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGEpIHt9CisgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhKTsKIAogICAgIC8vIG5ldyBmdW5jdGlvbnMKICAgICB2b2lkIGNsZWFyU3RhdCgpOwpAQCAtMTc2LDYgKzE3Niw3IEBACiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGludDMyX3QsIGludD4gbURhdGFDb3VudDsKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8aW50MzJfdCwgaW50PiBtRGF0YVNpemU7CiAgICAgYm9vbCB0ZXN0KE9QIG9wLCBpbnQgdjEsIGludCB2Mik7CisgICAgdm9pZCBhc3NlcnRUZXN0KE9QIG9wLCBpbnQgdjEsIGludCB2Mik7CiAKICAgICBJQ2FtZXJhICptUmVsZWFzZXI7CiB9OwpAQCAtMTk5LDI2ICsyMDAsMzMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgTUNhbWVyYUNsaWVudDo6YXNzZXJ0VGVzdChPUCBvcCwgaW50IHYxLCBpbnQgdjIpIHsKKyAgICBpZiAoIXRlc3Qob3AsIHYxLCB2MikpIHsKKyAgICAgICAgTE9HRSgiYXNzZXJ0VGVzdCBmYWlsZWQ6IG9wPSVkLCB2MT0lZCwgdjI9JWQiLCBvcCwgdjEsIHYyKTsKKyAgICAgICAgQVNTRVJUKDApOworICAgIH0KK30KKwogdm9pZCBNQ2FtZXJhQ2xpZW50Ojphc3NlcnROb3RpZnkoaW50MzJfdCBtc2dUeXBlLCBPUCBvcCwgaW50IGNvdW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpbnQgdiA9IG1Ob3RpZnlDb3VudC52YWx1ZUZvcihtc2dUeXBlKTsKLSAgICBBU1NFUlQodGVzdChvcCwgdiwgY291bnQpKTsKKyAgICBhc3NlcnRUZXN0KG9wLCB2LCBjb3VudCk7CiB9CiAKIHZvaWQgTUNhbWVyYUNsaWVudDo6YXNzZXJ0RGF0YShpbnQzMl90IG1zZ1R5cGUsIE9QIG9wLCBpbnQgY291bnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGludCB2ID0gbURhdGFDb3VudC52YWx1ZUZvcihtc2dUeXBlKTsKLSAgICBBU1NFUlQodGVzdChvcCwgdiwgY291bnQpKTsKKyAgICBhc3NlcnRUZXN0KG9wLCB2LCBjb3VudCk7CiB9CiAKIHZvaWQgTUNhbWVyYUNsaWVudDo6YXNzZXJ0RGF0YVNpemUoaW50MzJfdCBtc2dUeXBlLCBPUCBvcCwgaW50IGRhdGFTaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpbnQgdiA9IG1EYXRhU2l6ZS52YWx1ZUZvcihtc2dUeXBlKTsKLSAgICBBU1NFUlQodGVzdChvcCwgdiwgZGF0YVNpemUpKTsKKyAgICBhc3NlcnRUZXN0KG9wLCB2LCBkYXRhU2l6ZSk7CiB9CiAKIHZvaWQgTUNhbWVyYUNsaWVudDo6bm90aWZ5Q2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3NpemVfdCBpID0gbU5vdGlmeUNvdW50LmluZGV4T2ZLZXkobXNnVHlwZSk7CiAgICAgaWYgKGkgPCAwKSB7CkBAIC0yMzAsNyArMjM4LDcgQEAKIH0KIAogdm9pZCBNQ2FtZXJhQ2xpZW50OjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSkgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIGludCBkYXRhU2l6ZSA9IGRhdGEtPnNpemUoKTsKICAgICBJTkZPKCJkYXRhIHR5cGUgPSAlZCwgc2l6ZSA9ICVkIiwgbXNnVHlwZSwgZGF0YVNpemUpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yNTAsNiArMjU4LDExIEBACiAgICAgfQogfQogCit2b2lkIE1DYW1lcmFDbGllbnQ6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YSkgeworICAgIGRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhKTsKK30KKwogdm9pZCBNQ2FtZXJhQ2xpZW50Ojp3YWl0Tm90aWZ5KGludDMyX3QgbXNnVHlwZSwgT1Agb3AsIGludCBjb3VudCkgewogICAgIElORk8oIndhaXROb3RpZnk6ICVkLCAlZCwgJWQiLCBtc2dUeXBlLCBvcCwgY291bnQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yODUsNiArMjk4LDcgQEAKICAgICB2aXJ0dWFsIHNwPE92ZXJsYXlSZWY+IGNyZWF0ZU92ZXJsYXkoCiAgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCwgaW50MzJfdCBvcmllbnRhdGlvbik7CiAgICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiByZXF1ZXN0QnVmZmVyKGludCBidWZmZXJJZHgsIGludCB1c2FnZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpOwogCiAgICAgLy8gbmV3IGZ1bmN0aW9ucwogICAgIHZvaWQgY2xlYXJTdGF0KCk7CkBAIC0zMDAsNyArMzE0LDcgQEAKIH07CiAKIHN0YXR1c190IE1TdXJmYWNlOjpyZWdpc3RlckJ1ZmZlcnMoY29uc3QgQnVmZmVySGVhcCYgYnVmZmVycykgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgKytyZWdpc3RlckJ1ZmZlcnNDb3VudDsKICAgICBtQ29uZC5zaWduYWwoKTsKQEAgLTMwOCwyMSArMzIyLDI2IEBACiB9CiAKIHZvaWQgTVN1cmZhY2U6OnBvc3RCdWZmZXIoc3NpemVfdCBvZmZzZXQpIHsKLSAgICAvLyBJTkZPKF9fZnVuY19fKTsKKyAgICAvLyBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICsrcG9zdEJ1ZmZlckNvdW50OwogICAgIG1Db25kLnNpZ25hbCgpOwogfQogCiB2b2lkIE1TdXJmYWNlOjp1bnJlZ2lzdGVyQnVmZmVycygpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICsrdW5yZWdpc3RlckJ1ZmZlcnNDb3VudDsKICAgICBtQ29uZC5zaWduYWwoKTsKIH0KIAogc3A8R3JhcGhpY0J1ZmZlcj4gTVN1cmZhY2U6OnJlcXVlc3RCdWZmZXIoaW50IGJ1ZmZlcklkeCwgaW50IHVzYWdlKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXR1c190IE1TdXJmYWNlOjpzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpIHsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzQ4LDEwICszNjcsOSBAQAogCiBzcDxPdmVybGF5UmVmPiBNU3VyZmFjZTo6Y3JlYXRlT3ZlcmxheSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBpbnQzMl90IGZvcm1hdCwKICAgICAgICAgaW50MzJfdCBvcmllbnRhdGlvbikgewotICAgIC8vIFdlIGRvbid0IGV4cGVjdCB0aGlzIHRvIGJlIGNhbGxlZCBpbiBjdXJyZW50IGhhcmR3YXJlLgorICAgIC8vIE5vdCBpbXBsZW1lbnRlZC4KICAgICBBU1NFUlQoMCk7Ci0gICAgc3A8T3ZlcmxheVJlZj4gZHVtbXk7Ci0gICAgcmV0dXJuIGR1bW15OworICAgIHJldHVybiBOVUxMOwogfQogCiAvLwpAQCAtMzY4LDE3ICszODYsMTcgQEAKIH0KIAogdm9pZCBwdXRUZW1wT2JqZWN0KHNwPElCaW5kZXI+IG9iaikgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIGdldEhvbGRlcigpLT5wdXQob2JqKTsKIH0KIAogc3A8SUJpbmRlcj4gZ2V0VGVtcE9iamVjdCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gZ2V0SG9sZGVyKCktPmdldCgpOwogfQogCiB2b2lkIGNsZWFyVGVtcE9iamVjdCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBnZXRIb2xkZXIoKS0+Y2xlYXIoKTsKIH0KIApAQCAtMzk1LDY0ICs0MTMsNzEgQEAKICAgICByZXR1cm4gY3M7CiB9CiAKK2ludCBnZXROdW1iZXJPZkNhbWVyYXMoKSB7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIHJldHVybiBjcy0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7Cit9CisKIC8vCiAvLyBWYXJpb3VzIENvbm5lY3QgVGVzdHMKIC8vCi12b2lkIHRlc3RDb25uZWN0KCkgewotICAgIElORk8oX19mdW5jX18pOwordm9pZCB0ZXN0Q29ubmVjdChpbnQgY2FtZXJhSWQpIHsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgYy0+ZGlzY29ubmVjdCgpOwogfQogCi12b2lkIHRlc3RBbGxvd0Nvbm5lY3RPbmNlT25seSgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKK3ZvaWQgdGVzdEFsbG93Q29ubmVjdE9uY2VPbmx5KGludCBjYW1lcmFJZCkgeworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKICAgICAvLyBDb25uZWN0IHRoZSBmaXJzdCBjbGllbnQuCiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgLy8gU2FtZSBjbGllbnQgLS0gb2suCi0gICAgQVNTRVJUKGNzLT5jb25uZWN0KGNjKSAhPSAwKTsKKyAgICBBU1NFUlQoY3MtPmNvbm5lY3QoY2MsIGNhbWVyYUlkKSAhPSAwKTsKICAgICAvLyBEaWZmZXJlbnQgY2xpZW50IC0tIG5vdCBvay4KICAgICBzcDxNQ2FtZXJhQ2xpZW50PiBjYzIgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIEFTU0VSVChjcy0+Y29ubmVjdChjYzIpID09IDApOworICAgIEFTU0VSVChjcy0+Y29ubmVjdChjYzIsIGNhbWVyYUlkKSA9PSAwKTsKICAgICBjLT5kaXNjb25uZWN0KCk7CiB9CiAKIHZvaWQgdGVzdFJlY29ubmVjdEZhaWxlZCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhPiBjID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4oZ2V0VGVtcE9iamVjdCgpKTsKLSAgICBzcDxNQ2FtZXJhQ2xpZW50PiBjYzIgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIEFTU0VSVChjLT5jb25uZWN0KGNjMikgIT0gTk9fRVJST1IpOworICAgIHNwPE1DYW1lcmFDbGllbnQ+IGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKKyAgICBBU1NFUlQoYy0+Y29ubmVjdChjYykgIT0gTk9fRVJST1IpOwogfQogCiB2b2lkIHRlc3RSZWNvbm5lY3RTdWNjZXNzKCkgewotICAgIElORk8oX19mdW5jX18pOworICAgIElORk8oIiVzIiwgX19mdW5jX18pOwogICAgIHNwPElDYW1lcmE+IGMgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhPihnZXRUZW1wT2JqZWN0KCkpOwogICAgIHNwPE1DYW1lcmFDbGllbnQ+IGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKICAgICBBU1NFUlQoYy0+Y29ubmVjdChjYykgPT0gTk9fRVJST1IpOworICAgIGMtPmRpc2Nvbm5lY3QoKTsKIH0KIAogdm9pZCB0ZXN0TG9ja0ZhaWxlZCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhPiBjID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYT4oZ2V0VGVtcE9iamVjdCgpKTsKICAgICBBU1NFUlQoYy0+bG9jaygpICE9IE5PX0VSUk9SKTsKIH0KIAogdm9pZCB0ZXN0TG9ja1VubG9ja1N1Y2Nlc3MoKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CiAgICAgc3A8SUNhbWVyYT4gYyA9IGludGVyZmFjZV9jYXN0PElDYW1lcmE+KGdldFRlbXBPYmplY3QoKSk7CiAgICAgQVNTRVJUKGMtPmxvY2soKSA9PSBOT19FUlJPUik7CiAgICAgQVNTRVJUKGMtPnVubG9jaygpID09IE5PX0VSUk9SKTsKIH0KIAogdm9pZCB0ZXN0TG9ja1N1Y2Nlc3MoKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CiAgICAgc3A8SUNhbWVyYT4gYyA9IGludGVyZmFjZV9jYXN0PElDYW1lcmE+KGdldFRlbXBPYmplY3QoKSk7CiAgICAgQVNTRVJUKGMtPmxvY2soKSA9PSBOT19FUlJPUik7CisgICAgYy0+ZGlzY29ubmVjdCgpOwogfQogCiAvLwpAQCAtNDk5LDExICs1MjQsMTEgQEAKICAgICB9CiB9CiAKLXZvaWQgdGVzdFJlY29ubmVjdCgpIHsKLSAgICBJTkZPKF9fZnVuY19fKTsKK3ZvaWQgdGVzdFJlY29ubmVjdChpbnQgY2FtZXJhSWQpIHsKKyAgICBJTkZPKCIlcyIsIF9fZnVuY19fKTsKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgLy8gUmVjb25uZWN0IHRvIHRoZSBzYW1lIGNsaWVudCAtLSBvay4KICAgICBBU1NFUlQoYy0+Y29ubmVjdChjYykgPT0gTk9fRVJST1IpOwpAQCAtNTE0LDEwICs1MzksMTAgQEAKICAgICBjYy0+YXNzZXJ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIE1DYW1lcmFDbGllbnQ6OkVRLCAwKTsKIH0KIAotdm9pZCB0ZXN0TG9ja1VubG9jaygpIHsKK3ZvaWQgdGVzdExvY2tVbmxvY2soaW50IGNhbWVyYUlkKSB7CiAgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIHNwPE1DYW1lcmFDbGllbnQ+IGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKLSAgICBzcDxJQ2FtZXJhPiBjID0gY3MtPmNvbm5lY3QoY2MpOworICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYywgY2FtZXJhSWQpOwogICAgIEFTU0VSVChjICE9IDApOwogICAgIC8vIFdlIGNhbiBsb2NrIGFzIG1hbnkgdGltZXMgYXMgd2Ugd2FudC4KICAgICBBU1NFUlQoYy0+bG9jaygpID09IE5PX0VSUk9SKTsKQEAgLTUzMCwxNiArNTU1LDE1IEBACiAgICAgcnVuSW5Bbm90aGVyUHJvY2VzcygidGVzdExvY2tVbmxvY2tTdWNjZXNzIik7CiAgICAgLy8gVW5sb2NrIHRoZW4gbG9jayBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MgLS0gb2suCiAgICAgcnVuSW5Bbm90aGVyUHJvY2VzcygidGVzdExvY2tTdWNjZXNzIik7Ci0gICAgYy0+ZGlzY29ubmVjdCgpOwogICAgIGNsZWFyVGVtcE9iamVjdCgpOwogfQogCi12b2lkIHRlc3RSZWNvbm5lY3RGcm9tQW5vdGhlclByb2Nlc3MoKSB7Ci0gICAgSU5GTyhfX2Z1bmNfXyk7Cit2b2lkIHRlc3RSZWNvbm5lY3RGcm9tQW5vdGhlclByb2Nlc3MoaW50IGNhbWVyYUlkKSB7CisgICAgSU5GTygiJXMiLCBfX2Z1bmNfXyk7CiAKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2MgPSBuZXcgTUNhbWVyYUNsaWVudCgpOwotICAgIHNwPElDYW1lcmE+IGMgPSBjcy0+Y29ubmVjdChjYyk7CisgICAgc3A8SUNhbWVyYT4gYyA9IGNzLT5jb25uZWN0KGNjLCBjYW1lcmFJZCk7CiAgICAgQVNTRVJUKGMgIT0gMCk7CiAgICAgLy8gUmVjb25uZWN0IGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyAtLSBub3Qgb2suCiAgICAgcHV0VGVtcE9iamVjdChjLT5hc0JpbmRlcigpKTsKQEAgLTU0Nyw3ICs1NzEsNiBAQAogICAgIC8vIFVubG9jayB0aGVuIHJlY29ubmVjdCBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MgLS0gb2suCiAgICAgQVNTRVJUKGMtPnVubG9jaygpID09IE5PX0VSUk9SKTsKICAgICBydW5JbkFub3RoZXJQcm9jZXNzKCJ0ZXN0UmVjb25uZWN0U3VjY2VzcyIpOwotICAgIGMtPmRpc2Nvbm5lY3QoKTsKICAgICBjbGVhclRlbXBPYmplY3QoKTsKIH0KIApAQCAtNTYwLDEwICs1ODMsMTEgQEAKIH0KIAogLy8gUnVuIGEgdGVzdCBjYXNlCi0jZGVmaW5lIFJVTihjbGFzc19uYW1lKSBkbyB7IFwKKyNkZWZpbmUgUlVOKGNsYXNzX25hbWUsIGNhbWVyYUlkKSBkbyB7IFwKICAgICB7IFwKICAgICAgICAgSU5GTygjY2xhc3NfbmFtZSk7IFwKICAgICAgICAgY2xhc3NfbmFtZSBpbnN0YW5jZTsgXAorICAgICAgICBpbnN0YW5jZS5pbml0KGNhbWVyYUlkKTsgXAogICAgICAgICBpbnN0YW5jZS5ydW4oKTsgXAogICAgIH0gXAogICAgIGZsdXNoQ29tbWFuZHMoKTsgXApAQCAtNTcxLDE5ICs1OTUsMjEgQEAKIAogLy8gQmFzZSB0ZXN0IGNhc2UgYWZ0ZXIgdGhlIHRoZSBjYW1lcmEgaXMgY29ubmVjdGVkLgogY2xhc3MgQWZ0ZXJDb25uZWN0IHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoaW50IGNhbWVyYUlkKSB7CisgICAgICAgIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgICAgICBjYyA9IG5ldyBNQ2FtZXJhQ2xpZW50KCk7CisgICAgICAgIGMgPSBjcy0+Y29ubmVjdChjYywgY2FtZXJhSWQpOworICAgICAgICBBU1NFUlQoYyAhPSAwKTsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3M7CiAgICAgc3A8TUNhbWVyYUNsaWVudD4gY2M7CiAgICAgc3A8SUNhbWVyYT4gYzsKIAotICAgIEFmdGVyQ29ubmVjdCgpIHsKLSAgICAgICAgY3MgPSBnZXRDYW1lcmFTZXJ2aWNlKCk7Ci0gICAgICAgIGNjID0gbmV3IE1DYW1lcmFDbGllbnQoKTsKLSAgICAgICAgYyA9IGNzLT5jb25uZWN0KGNjKTsKLSAgICAgICAgQVNTRVJUKGMgIT0gMCk7Ci0gICAgfQotCiAgICAgfkFmdGVyQ29ubmVjdCgpIHsKKyAgICAgICAgYy0+ZGlzY29ubmVjdCgpOwogICAgICAgICBjLmNsZWFyKCk7CiAgICAgICAgIGNjLmNsZWFyKCk7CiAgICAgICAgIGNzLmNsZWFyKCk7CkBAIC02MTIsMTkgKzYzOCwxNiBAQAogICAgICAgICBzdXJmYWNlLT53YWl0VW50aWwoMSwgMTAsIDApOyAvLyBuZWVkcyAxIHJlZ2lzdGVyQnVmZmVycyBhbmQgMTAgcG9zdEJ1ZmZlcgogICAgICAgICBzdXJmYWNlLT5jbGVhclN0YXQoKTsKIAotICAgICAgICBjLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIC8vIFRPRE86IENhbWVyYVNlcnZpY2UgY3Jhc2hlcyBmb3IgdGhpcy4gRml4IGl0LgotI2lmIDAKICAgICAgICAgc3A8TVN1cmZhY2U+IGFub3RoZXJfc3VyZmFjZSA9IG5ldyBNU3VyZmFjZSgpOwogICAgICAgICBjLT5zZXRQcmV2aWV3RGlzcGxheShhbm90aGVyX3N1cmZhY2UpOyAgLy8ganVzdCB0byBtYWtlIHN1cmUgdW5yZWdpc3RlckJ1ZmZlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGNhbGxlZC4KICAgICAgICAgc3VyZmFjZS0+d2FpdFVudGlsKDAsIDAsIDEpOyAgLy8gbmVlZHMgdW5yZWdpc3RlckJ1ZmZlcnMKLSNlbmRpZgorCiAgICAgICAgIGNjLT5hc3NlcnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwgTUNhbWVyYUNsaWVudDo6RVEsIDApOwogICAgIH0KIH07CiAKLWNsYXNzIFRlc3RTdGFydFByZXZpZXdXaXRob3V0RGlzcGxheSA6IEFmdGVyQ29ubmVjdCB7CitjbGFzcyBUZXN0U3RhcnRQcmV2aWV3V2l0aG91dERpc3BsYXkgOiBwdWJsaWMgQWZ0ZXJDb25uZWN0IHsKIHB1YmxpYzoKICAgICB2b2lkIHJ1bigpIHsKICAgICAgICAgQVNTRVJUKGMtPnN0YXJ0UHJldmlldygpID09IE5PX0VSUk9SKTsKQEAgLTYzNiwxNSArNjU5LDE3IEBACiAKIC8vIEJhc2UgdGVzdCBjYXNlIGFmdGVyIHRoZSB0aGUgY2FtZXJhIGlzIGNvbm5lY3RlZCBhbmQgdGhlIHByZXZpZXcgaXMgc3RhcnRlZC4KIGNsYXNzIEFmdGVyU3RhcnRQcmV2aWV3IDogcHVibGljIEFmdGVyQ29ubmVjdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgc3A8TVN1cmZhY2U+IHN1cmZhY2U7Ci0KLSAgICBBZnRlclN0YXJ0UHJldmlldygpIHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoaW50IGNhbWVyYUlkKSB7CisgICAgICAgIEFmdGVyQ29ubmVjdDo6aW5pdChjYW1lcmFJZCk7CiAgICAgICAgIHN1cmZhY2UgPSBuZXcgTVN1cmZhY2UoKTsKICAgICAgICAgQVNTRVJUKGMtPnNldFByZXZpZXdEaXNwbGF5KHN1cmZhY2UpID09IE5PX0VSUk9SKTsKICAgICAgICAgQVNTRVJUKGMtPnN0YXJ0UHJldmlldygpID09IE5PX0VSUk9SKTsKICAgICB9CiAKK3Byb3RlY3RlZDoKKyAgICBzcDxNU3VyZmFjZT4gc3VyZmFjZTsKKwogICAgIH5BZnRlclN0YXJ0UHJldmlldygpIHsKICAgICAgICAgc3VyZmFjZS5jbGVhcigpOwogICAgIH0KQEAgLTY4MCw5ICs3MDUsNiBAQAogICAgICAgICBjYy0+d2FpdERhdGEoQ0FNRVJBX01TR19SQVdfSU1BR0UsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKICAgICAgICAgY2MtPndhaXREYXRhKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwogICAgICAgICBjLT5zdG9wUHJldmlldygpOwotI2lmIDEgIC8vIFRPRE86IEl0IGNyYXNoZXMgaWYgd2UgZG9uJ3QgaGF2ZSB0aGlzLiBGaXggaXQuCi0gICAgICAgIHVzbGVlcCgxMDAwMDApOwotI2VuZGlmCiAgICAgICAgIGMtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgY2MtPmFzc2VydE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBNQ2FtZXJhQ2xpZW50OjpFUSwgMCk7CiAgICAgfQpAQCAtNjk3LDcgKzcxOSw2IEBACiAgICAgICAgICAgICBjYy0+d2FpdE5vdGlmeShDQU1FUkFfTVNHX1NIVVRURVIsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKICAgICAgICAgICAgIGNjLT53YWl0RGF0YShDQU1FUkFfTVNHX1JBV19JTUFHRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwogICAgICAgICAgICAgY2MtPndhaXREYXRhKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6RVEsIDEpOwotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7ICAvLyAxMDBtcwogICAgICAgICB9CiAgICAgICAgIGMtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgY2MtPmFzc2VydE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBNQ2FtZXJhQ2xpZW50OjpFUSwgMCk7CkBAIC03MDgsMzYgKzcyOSw3MSBAQAogcHVibGljOgogICAgIHZvaWQgcnVuKCkgewogICAgICAgICBTdHJpbmc4IHBhcmFtX3N0ciA9IGMtPmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgSU5GTyhwYXJhbV9zdHIpOworICAgICAgICBJTkZPKCIlcyIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihwYXJhbV9zdHIpKTsKICAgICB9CiB9OwogCitzdGF0aWMgYm9vbCBnZXROZXh0U2l6ZShjb25zdCBjaGFyICoqcHRyUywgaW50ICp3LCBpbnQgKmgpIHsKKyAgICBjb25zdCBjaGFyICpzID0gKnB0clM7CisKKyAgICAvLyBza2lwIG92ZXIgJywnCisgICAgaWYgKCpzID09ICcsJykgcysrOworCisgICAgLy8gcmVtZW1iZXIgc3RhcnQgcG9zaXRpb24gaW4gcAorICAgIGNvbnN0IGNoYXIgKnAgPSBzOworICAgIHdoaWxlICgqcyAhPSAnXDAnICYmICpzICE9ICd4JykgeworICAgICAgICBzKys7CisgICAgfQorICAgIGlmICgqcyA9PSAnXDAnKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBnZXQgdGhlIHdpZHRoCisgICAgKncgPSBhdG9pKHApOworCisgICAgLy8gc2tpcCBvdmVyICd4JworICAgIEFTU0VSVCgqcyA9PSAneCcpOworICAgIHAgPSBzICsgMTsKKyAgICB3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAnLCcpIHsKKyAgICAgICAgcysrOworICAgIH0KKworICAgIC8vIGdldCB0aGUgaGVpZ2h0CisgICAgKmggPSBhdG9pKHApOworICAgICpwdHJTID0gczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogY2xhc3MgVGVzdFBpY3R1cmVTaXplIDogcHVibGljIEFmdGVyU3RhcnRQcmV2aWV3IHsKIHB1YmxpYzoKICAgICB2b2lkIGNoZWNrT25lUGljdHVyZShpbnQgdywgaW50IGgpIHsKLSAgICAgICAgY29uc3QgZmxvYXQgcmF0ZSA9IDAuNTsgIC8vIGJ5dGUgcGVyIHBpeGVsIGxpbWl0CisgICAgICAgIGNvbnN0IGZsb2F0IHJhdGUgPSAwLjk7ICAvLyBieXRlIHBlciBwaXhlbCBsaW1pdAogICAgICAgICBpbnQgcGl4ZWxzID0gdyAqIGg7CiAKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwYXJhbShjLT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgICAgICBwYXJhbS5zZXRQaWN0dXJlU2l6ZSh3LCBoKTsKKyAgICAgICAgLy8gZGlzYWJsZSB0aHVtYm5haWwgdG8gZ2V0IG1vcmUgYWNjdXJhdGUgc2l6ZS4KKyAgICAgICAgcGFyYW0uc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9KUEVHX1RIVU1CTkFJTF9XSURUSCwgMCk7CisgICAgICAgIHBhcmFtLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfSlBFR19USFVNQk5BSUxfSEVJR0hULCAwKTsKICAgICAgICAgYy0+c2V0UGFyYW1ldGVycyhwYXJhbS5mbGF0dGVuKCkpOwogCiAgICAgICAgIGNjLT5jbGVhclN0YXQoKTsKICAgICAgICAgQVNTRVJUKGMtPnRha2VQaWN0dXJlKCkgPT0gTk9fRVJST1IpOwogICAgICAgICBjYy0+d2FpdERhdGEoQ0FNRVJBX01TR19SQVdfSU1BR0UsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKLSAgICAgICAgY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBNQ2FtZXJhQ2xpZW50OjpFUSwgcGl4ZWxzKjMvMik7CisgICAgICAgIC8vY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBNQ2FtZXJhQ2xpZW50OjpFUSwgcGl4ZWxzKjMvMik7CiAgICAgICAgIGNjLT53YWl0RGF0YShDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsIE1DYW1lcmFDbGllbnQ6OkVRLCAxKTsKICAgICAgICAgY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6TFQsCiAgICAgICAgICAgICAgICAgaW50KHBpeGVscyAqIHJhdGUpKTsKICAgICAgICAgY2MtPmFzc2VydERhdGFTaXplKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwgTUNhbWVyYUNsaWVudDo6R1QsIDApOwogICAgICAgICBjYy0+YXNzZXJ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIE1DYW1lcmFDbGllbnQ6OkVRLCAwKTsKLSAgICAgICAgdXNsZWVwKDEwMDAwMCk7ICAvLyAxMDBtcwogICAgIH0KIAogICAgIHZvaWQgcnVuKCkgewotICAgICAgICBjaGVja09uZVBpY3R1cmUoMjA0OCwgMTUzNik7Ci0gICAgICAgIGNoZWNrT25lUGljdHVyZSgxNjAwLCAxMjAwKTsKLSAgICAgICAgY2hlY2tPbmVQaWN0dXJlKDEwMjQsIDc2OCk7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW0oYy0+Z2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgaW50IHcsIGg7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBwYXJhbS5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTKTsKKyAgICAgICAgd2hpbGUgKGdldE5leHRTaXplKCZzLCAmdywgJmgpKSB7CisgICAgICAgICAgICBMT0dEKCJjaGVja2luZyBwaWN0dXJlIHNpemUgJWR4JWQiLCB3LCBoKTsKKyAgICAgICAgICAgIGNoZWNrT25lUGljdHVyZSh3LCBoKTsKKyAgICAgICAgfQogICAgIH0KIH07CiAKQEAgLTc0OSw2ICs4MDUsOCBAQAogCiAgICAgICAgIC8vIFRyeSBhbGwgZmxhZyBjb21iaW5hdGlvbnMuCiAgICAgICAgIGZvciAoaW50IHYgPSAwOyB2IDwgODsgdisrKSB7CisgICAgICAgICAgICBMT0dEKCJUZXN0UHJldmlld0NhbGxiYWNrRmxhZzogZmxhZz0lZCIsIHYpOworICAgICAgICAgICAgdXNsZWVwKDEwMDAwMCk7IC8vIHNsZWVwIGEgd2hpbGUgdG8gY2xlYXIgdGhlIGluLWZsaWdodCBjYWxsYmFja3MuCiAgICAgICAgICAgICBjYy0+Y2xlYXJTdGF0KCk7CiAgICAgICAgICAgICBjLT5zZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKHYpOwogICAgICAgICAgICAgQVNTRVJUKGMtPnByZXZpZXdFbmFibGVkKCkgPT0gZmFsc2UpOwpAQCAtNzgxLDYgKzgzOSw3IEBACiAgICAgICAgIEFTU0VSVChjLT5yZWNvcmRpbmdFbmFibGVkKCkgPT0gdHJ1ZSk7CiAgICAgICAgIHNsZWVwKDIpOwogICAgICAgICBjLT5zdG9wUmVjb3JkaW5nKCk7CisgICAgICAgIHVzbGVlcCgxMDAwMDApOyAvLyBzbGVlcCBhIHdoaWxlIHRvIGNsZWFyIHRoZSBpbi1mbGlnaHQgY2FsbGJhY2tzLgogICAgICAgICBjYy0+c2V0UmVsZWFzZXIoTlVMTCk7CiAgICAgICAgIGNjLT5hc3NlcnREYXRhKENBTUVSQV9NU0dfVklERU9fRlJBTUUsIE1DYW1lcmFDbGllbnQ6OkdFLCAxMCk7CiAgICAgfQpAQCAtODA2LDkgKzg2NSwxMyBAQAogICAgIH0KIAogICAgIHZvaWQgcnVuKCkgewotICAgICAgICBjaGVja09uZVBpY3R1cmUoNDgwLCAzMjApOwotICAgICAgICBjaGVja09uZVBpY3R1cmUoMzUyLCAyODgpOwotICAgICAgICBjaGVja09uZVBpY3R1cmUoMTc2LCAxNDQpOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtKGMtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgIGludCB3LCBoOworICAgICAgICBjb25zdCBjaGFyICpzID0gcGFyYW0uZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUFJFVklFV19TSVpFUyk7CisgICAgICAgIHdoaWxlIChnZXROZXh0U2l6ZSgmcywgJncsICZoKSkgeworICAgICAgICAgICAgTE9HRCgiY2hlY2tpbmcgcHJldmlldyBzaXplICVkeCVkIiwgdywgaCk7CisgICAgICAgICAgICBjaGVja09uZVBpY3R1cmUodywgaCk7CisgICAgICAgIH0KICAgICB9CiB9OwogCkBAIC04MjcsMjMgKzg5MCwzMCBAQAogICAgIElORk8oIkNhbWVyYVNlcnZpY2VUZXN0IHN0YXJ0Iik7CiAgICAgZ0V4ZWN1dGFibGUgPSBhcmd2WzBdOwogICAgIHJ1bkhvbGRlclNlcnZpY2UoKTsKKyAgICBpbnQgbiA9IGdldE51bWJlck9mQ2FtZXJhcygpOworICAgIElORk8oIiVkIENhbWVyYXMgYXZhaWxhYmxlIiwgbik7CiAKLSAgICB0ZXN0Q29ubmVjdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0QWxsb3dDb25uZWN0T25jZU9ubHkoKTsgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0UmVjb25uZWN0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0TG9ja1VubG9jaygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKLSAgICB0ZXN0UmVjb25uZWN0RnJvbUFub3RoZXJQcm9jZXNzKCk7ICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICBmb3IgKGludCBpZCA9IDA7IGlkIDwgbjsgaWQrKykgeworICAgICAgICBJTkZPKCJUZXN0aW5nIGNhbWVyYSAlZCIsIGlkKTsKKyAgICAgICAgdGVzdENvbm5lY3QoaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdEFsbG93Q29ubmVjdE9uY2VPbmx5KGlkKTsgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdFJlY29ubmVjdChpZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdExvY2tVbmxvY2soaWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKKyAgICAgICAgdGVzdFJlY29ubmVjdEZyb21Bbm90aGVyUHJvY2VzcyhpZCk7ICAgICAgICAgIGZsdXNoQ29tbWFuZHMoKTsKIAotICAgIFJVTihUZXN0U2V0UHJldmlld0Rpc3BsYXkpOwotICAgIFJVTihUZXN0U3RhcnRQcmV2aWV3KTsKLSAgICBSVU4oVGVzdFN0YXJ0UHJldmlld1dpdGhvdXREaXNwbGF5KTsKLSAgICBSVU4oVGVzdEF1dG9Gb2N1cyk7Ci0gICAgUlVOKFRlc3RTdG9wUHJldmlldyk7Ci0gICAgUlVOKFRlc3RUYWtlUGljdHVyZSk7Ci0gICAgUlVOKFRlc3RUYWtlTXVsdGlwbGVQaWN0dXJlcyk7Ci0gICAgUlVOKFRlc3RHZXRQYXJhbWV0ZXJzKTsKLSAgICBSVU4oVGVzdFBpY3R1cmVTaXplKTsKLSAgICBSVU4oVGVzdFByZXZpZXdDYWxsYmFja0ZsYWcpOwotICAgIFJVTihUZXN0UmVjb3JkaW5nKTsKLSAgICBSVU4oVGVzdFByZXZpZXdTaXplKTsKKyAgICAgICAgUlVOKFRlc3RTZXRQcmV2aWV3RGlzcGxheSwgaWQpOworICAgICAgICBSVU4oVGVzdFN0YXJ0UHJldmlldywgaWQpOworICAgICAgICBSVU4oVGVzdFN0YXJ0UHJldmlld1dpdGhvdXREaXNwbGF5LCBpZCk7CisgICAgICAgIFJVTihUZXN0QXV0b0ZvY3VzLCBpZCk7CisgICAgICAgIFJVTihUZXN0U3RvcFByZXZpZXcsIGlkKTsKKyAgICAgICAgUlVOKFRlc3RUYWtlUGljdHVyZSwgaWQpOworICAgICAgICBSVU4oVGVzdFRha2VNdWx0aXBsZVBpY3R1cmVzLCBpZCk7CisgICAgICAgIFJVTihUZXN0R2V0UGFyYW1ldGVycywgaWQpOworICAgICAgICBSVU4oVGVzdFBpY3R1cmVTaXplLCBpZCk7CisgICAgICAgIFJVTihUZXN0UHJldmlld0NhbGxiYWNrRmxhZywgaWQpOworICAgICAgICBSVU4oVGVzdFJlY29yZGluZywgaWQpOworICAgICAgICBSVU4oVGVzdFByZXZpZXdTaXplLCBpZCk7CisgICAgfQorCisgICAgSU5GTygiQ2FtZXJhU2VydmljZVRlc3QgZmluaXNoZWQiKTsKIH0K